{"version":3,"file":"c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-BxfCjbYY.mjs","sources":["../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-config.component.ts","../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-config.component.html"],"sourcesContent":["import {\n  Component,\n  inject,\n  Input,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  OnDestroy\n} from '@angular/core';\nimport {\n  ControlContainer,\n  FormBuilder,\n  NgForm,\n  ReactiveFormsModule,\n  Validators\n} from '@angular/forms';\nimport { IManagedObject } from '@c8y/client';\nimport { C8yTranslatePipe, CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  FieldbusCoil,\n  FieldbusDeviceType,\n  FieldbusItemStatusConfig,\n  FieldbusRegister,\n  RESULT_TYPES\n} from './fieldbus-item-status.model';\nimport { FieldbusService } from './fieldbus.service';\nimport { Observable } from 'rxjs';\n\ntype FieldbusItemsGroup = {\n  type: 'c8y_Coil' | 'c8y_Register';\n  label: string;\n  items: (FieldbusCoil | FieldbusRegister)[];\n};\n\n@Component({\n  selector: 'c8y-fieldbus-item-status-config',\n  templateUrl: './fieldbus-item-status-config.component.html',\n  imports: [CoreModule, CommonModule, C8yTranslatePipe, ReactiveFormsModule],\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class FieldbusItemStatusConfigComponent implements OnInit, OnChanges, OnDestroy {\n  @Input() config?: FieldbusItemStatusConfig;\n  @Input() asset?: IManagedObject;\n\n  resultTypes = RESULT_TYPES;\n  formGroup: ReturnType<FieldbusItemStatusConfigComponent['createForm']>;\n  groupedItems: FieldbusItemsGroup[] = [];\n  private deviceType: FieldbusDeviceType;\n\n  private fieldbusService = inject(FieldbusService);\n  private formBuilder = inject(FormBuilder);\n  private form = inject(NgForm);\n\n  ngOnInit() {\n    this.initForm();\n  }\n\n  async ngOnChanges(changes: SimpleChanges) {\n    if (changes['asset'] && this.asset) {\n      try {\n        this.deviceType = await this.fieldbusService.getDeviceTypeOf(this.asset);\n        this.buildGroupedItemsFromDeviceType();\n        this.patchFormFromConfig();\n      } catch (err) {\n        this.deviceType = null;\n        this.groupedItems = [];\n        this.formGroup.reset();\n      }\n    }\n\n    if (changes['config'] && this.config) {\n      this.patchFormFromConfig();\n    }\n  }\n\n  ngOnDestroy() {\n    this.form.form.removeControl('config');\n  }\n\n  onBeforeSave(\n    config?: FieldbusItemStatusConfig\n  ): boolean | Promise<boolean> | Observable<boolean> {\n    if (this.formGroup.valid) {\n      Object.assign(config, this.formToConfig());\n      return true;\n    }\n    return false;\n  }\n\n  private initForm(): void {\n    this.formGroup = this.createForm();\n    this.form.form.addControl('config', this.formGroup);\n    this.formGroup.patchValue({ item: null, resultType: RESULT_TYPES.RAW_VALUE.value });\n    this.patchFormFromConfig();\n  }\n\n  private createForm() {\n    return this.formBuilder.group({\n      item: [null, [Validators.required]],\n      resultType: ['', [Validators.required]]\n    });\n  }\n\n  private formToConfig(): FieldbusItemStatusConfig {\n    const formValue = this.formGroup.value;\n    if (!formValue.item) return null;\n    const item = formValue.item as FieldbusCoil | FieldbusRegister;\n    const itemName = item.name;\n    const itemType = this.groupedItems.find(g => g.items.includes(item))?.type;\n    const resultType = formValue.resultType as keyof typeof RESULT_TYPES;\n    return { itemName, itemType, resultType };\n  }\n\n  private patchFormFromConfig(): void {\n    if (!this.config || !this.groupedItems.length || !this.formGroup) return;\n    const { itemType, itemName, resultType } = this.config;\n    let foundItem = null;\n    for (const group of this.groupedItems) {\n      foundItem = group.items.find(item => group.type === itemType && item.name === itemName);\n      if (foundItem) break;\n    }\n    if (foundItem) {\n      this.formGroup.patchValue({ item: foundItem, resultType });\n    } else {\n      this.formGroup.patchValue({ item: null, resultType: RESULT_TYPES.RAW_VALUE.value });\n    }\n  }\n\n  private buildGroupedItemsFromDeviceType() {\n    this.groupedItems = [];\n    if (!this.deviceType) return;\n    if (this.deviceType.c8y_Coils?.length) {\n      this.groupedItems.push({\n        type: 'c8y_Coil',\n        label: gettext('Coils'),\n        items: this.deviceType.c8y_Coils\n      });\n    }\n    if (this.deviceType.c8y_Registers?.length) {\n      this.groupedItems.push({\n        type: 'c8y_Register',\n        label: gettext('Registers'),\n        items: this.deviceType.c8y_Registers\n      });\n    }\n  }\n}\n","<form [formGroup]=\"formGroup\">\n  <div class=\"d-flex-md row\">\n    <div class=\"col-md-6\">\n      <c8y-form-group style=\"padding-top: var(--c8y-font-size-base)\">\n        <label for=\"fieldbusItem\">{{ 'Fieldbus item' | translate }}</label>\n        <div class=\"c8y-select-wrapper\">\n          <select\n            class=\"form-control\"\n            id=\"fieldbusItem\"\n            formControlName=\"item\"\n          >\n            @for (group of groupedItems; track group.label) {\n              <optgroup [label]=\"group.label | translate\">\n                @for (item of group.items; track item.name) {\n                  <option [ngValue]=\"item\">\n                    {{ item.name }}\n                  </option>\n                }\n              </optgroup>\n            }\n          </select>\n        </div>\n        <c8y-messages\n          [show]=\"formGroup.controls?.item?.touched ? formGroup?.controls?.item?.errors : {}\"\n        ></c8y-messages>\n      </c8y-form-group>\n    </div>\n    <div class=\"col-md-6\">\n      <c8y-form-group style=\"padding-top: var(--c8y-font-size-base)\">\n        <label for=\"resultType\">{{ 'Result type' | translate }}</label>\n        <div class=\"c8y-select-wrapper\">\n          <select\n            class=\"form-control\"\n            id=\"resultType\"\n            formControlName=\"resultType\"\n          >\n            @for (resultType of resultTypes | keyvalue; track resultType.key) {\n              <option [ngValue]=\"resultType.value.value\">\n                {{ resultType.value.label | translate }}\n              </option>\n            }\n          </select>\n        </div>\n      </c8y-form-group>\n    </div>\n  </div>\n</form>\n"],"names":["i1","i2","i3"],"mappings":"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"}