{"version":3,"file":"c8y-ngx-components-widgets-implementations-asset-notes.mjs","sources":["../../widgets/implementations/asset-notes/asset-notes-widget.component.ts","../../widgets/implementations/asset-notes/asset-notes-widget.component.html","../../widgets/implementations/asset-notes/c8y-ngx-components-widgets-implementations-asset-notes.ts"],"sourcesContent":["import { CommonModule as NgCommonModule } from '@angular/common';\nimport { Component, computed, inject, input, InputSignal, OnInit, signal } from '@angular/core';\nimport { FormsModule as NgFormsModule } from '@angular/forms';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  AppStateService,\n  CommonModule,\n  CoreModule,\n  DatePipe,\n  FormsModule\n} from '@c8y/ngx-components';\n\ninterface AssetNotes {\n  user: string;\n  lastUpdated: string;\n  htmlContent: string;\n}\n\nexport type AssetNotesConfig = { device: Partial<IManagedObject> };\n\n@Component({\n  selector: 'c8y-asset-notes',\n  templateUrl: './asset-notes-widget.component.html',\n  standalone: true,\n  imports: [CommonModule, NgCommonModule, CoreModule, NgFormsModule, FormsModule, DatePipe]\n})\nexport class AssetNotesWidgetComponent implements OnInit {\n  private inventory = inject(InventoryService);\n  private appState = inject(AppStateService);\n  private alertService = inject(AlertService);\n  private datePipe = inject(DatePipe);\n\n  config: InputSignal<AssetNotesConfig> = input();\n\n  notes = signal<AssetNotes | null>(null);\n  editable = signal(false);\n  isLoading = computed(() => this.notes()?.htmlContent === undefined);\n\n  private readonly FRAGMENT = 'c8y_ComponentConfig!assetNotes';\n  ngNonBindableTranslate = computed(() => ({\n    lastUpdated: this.datePipe.transform(this.notes()?.lastUpdated),\n    user: this.notes()?.user\n  }));\n\n  async ngOnInit() {\n    await this.loadNotes();\n  }\n\n  toggleEdit() {\n    this.editable.set(!this.editable());\n  }\n\n  async save() {\n    try {\n      const updatedNotes = {\n        ...this.notes(),\n        user: this.appState.currentUser.value.id,\n        lastUpdated: new Date().toISOString()\n      };\n\n      await this.inventory.update({\n        id: this.config().device.id,\n        [this.FRAGMENT]: updatedNotes\n      });\n\n      this.notes.set(updatedNotes);\n      this.editable.set(false);\n      this.alertService.success(gettext('Notes saved.'));\n    } catch (error) {\n      this.alertService.addServerFailure(error);\n    }\n  }\n\n  private async loadNotes() {\n    try {\n      const device = await this.inventory.detail(this.config().device.id);\n      this.notes.set(device.data[this.FRAGMENT] || { htmlContent: '' });\n    } catch (error) {\n      this.alertService.addServerFailure(error);\n    }\n  }\n}\n","<div class=\"fit-h d-flex flex-wrap a-i-stretch\">\n  <i\n    class=\"c8y-icon c8y-icon-duocolor asset-notes-icon\"\n    [c8yIcon]=\"'c8y-notification'\"\n  ></i>\n\n  @if (!editable()) {\n    <div class=\"asset-notes-content\">\n      <c8y-loading *ngIf=\"isLoading()\"></c8y-loading>\n      <div class=\"text-break-word asset-notes-body\">\n        @if (notes()?.htmlContent && !isLoading()) {\n          <span\n            class=\"markdown-content d-inline-block\"\n            [innerHTML]=\"notes()?.htmlContent | markdownToHtml | async\"\n          ></span>\n        } @else if (!notes()?.htmlContent) {\n          <span>\n            {{ 'No notes yet.' | translate }}\n          </span>\n        }\n\n        <button\n          class=\"btn btn-link btn-sm\"\n          title=\"{{ 'Edit' | translate }}\"\n          type=\"button\"\n          (click)=\"toggleEdit()\"\n        >\n          <i c8yIcon=\"pencil\"></i>\n          {{ 'Edit' | translate }}\n        </button>\n      </div>\n    </div>\n    <div class=\"asset-notes-footer m-t-8\">\n      <small class=\"text-muted\">\n        <em\n          *ngIf=\"notes()?.lastUpdated\"\n          ngNonBindable\n          translate\n          [translateParams]=\"ngNonBindableTranslate()\"\n        >\n          {{ lastUpdated }} by {{ user }}\n        </em>\n      </small>\n    </div>\n  } @else {\n    <div class=\"fit-h flex-grow\">\n      <div class=\"d-flex a-i-stretch fit-h\">\n        <textarea\n          class=\"form-control fit-h text-monospace\"\n          [attr.aria-label]=\"'Notes' | translate\"\n          rows=\"5\"\n          [(ngModel)]=\"notes().htmlContent\"\n          c8y-code-editor\n        ></textarea>\n        <div class=\"input-group-btn a-s-center\">\n          <button\n            class=\"btn btn-dot\"\n            title=\"{{ 'Save' | translate }}\"\n            type=\"button\"\n            (click)=\"save()\"\n          >\n            <i c8yIcon=\"check\"></i>\n          </button>\n        </div>\n        <div class=\"input-group-btn a-s-center\">\n          <button\n            class=\"btn btn-dot\"\n            title=\"{{ 'Cancel' | translate }}\"\n            type=\"button\"\n            (click)=\"toggleEdit()\"\n          >\n            <i c8yIcon=\"times\"></i>\n          </button>\n        </div>\n      </div>\n    </div>\n  }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","NgFormsModule","FormsModule"],"mappings":"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"}