{"version":3,"file":"ng-forge-dynamic-forms-primeng-lazy-multi-checkbox.mjs","mappings":";;;;;;;;;;AAgEc;;;;AAIH;;AAEC;AAEN;;AAEF;IAKiB;;;;;AAKjB;;;;AAIA;;;AAGI;AACE;AACA;;;AAEF;;AAEJ;;AAGF;AACE;AACE;AACA;AACE;;AAEJ;AAEA;AACE;AACA;;;AAIE;;AAEJ;;;AApDiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AArDT","names":[],"ignoreList":[],"sources":["../../../../packages/dynamic-forms-primeng/src/lib/fields/multi-checkbox/prime-multi-checkbox.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, linkedSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Checkbox, CheckboxChangeEvent } from 'primeng/checkbox';\nimport { FieldOption, ValueType } from '@ng-forge/dynamic-forms';\nimport { DynamicTextPipe } from '@ng-forge/dynamic-forms/integration';\nimport { injectNgForgeField, NgForgeFieldHost, isEqual, NgForgeControl } from '@ng-forge/dynamic-forms/integration';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { PrimeMultiCheckboxProps } from './prime-multi-checkbox.type';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'df-prime-multi-checkbox',\n  imports: [Checkbox, FormsModule, DynamicTextPipe, AsyncPipe, NgForgeControl],\n  styleUrl: '../../styles/_form-field.scss',\n  hostDirectives: [NgForgeFieldHost],\n  template: `\n    @let f = ngf.field();\n    @let checked = checkedValuesMap();\n    @let isInvalid = ngf.errorsToDisplay().length > 0;\n    @if (ngf.label(); as label) {\n      <div class=\"checkbox-group-label\">{{ label | dynamicText | async }}</div>\n    }\n\n    <div class=\"checkbox-group\" [class]=\"props()?.styleClass\" [attr.aria-describedby]=\"ngf.ariaDescribedBy()\">\n      @for (option of options(); track option.value) {\n        <div class=\"checkbox-option\">\n          <p-checkbox\n            ngForgeControl=\"input[type='checkbox']\"\n            [inputId]=\"ngf.key() + '-' + option.value\"\n            [binary]=\"true\"\n            [ngModel]=\"checked['' + option.value] || false\"\n            (onChange)=\"onCheckboxChange(option, $event)\"\n            [disabled]=\"f().disabled() || option.disabled || false\"\n            [invalid]=\"isInvalid\"\n          />\n          <label [for]=\"ngf.key() + '-' + option.value\" class=\"ml-2\">{{ option.label | dynamicText | async }}</label>\n        </div>\n      }\n    </div>\n    @if (ngf.errorsToDisplay()[0]; as error) {\n      <small class=\"p-error\" [id]=\"ngf.errorId()\" role=\"alert\">{{ error.message }}</small>\n    } @else if (props()?.hint; as hint) {\n      <small class=\"p-hint\" [id]=\"ngf.hintId()\">{{ hint | dynamicText | async }}</small>\n    }\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n\n      .checkbox-option {\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n      }\n    `,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class PrimeMultiCheckboxFieldComponent {\n  protected readonly ngf = injectNgForgeField<ValueType[]>();\n\n  readonly options = input<FieldOption<ValueType>[]>([]);\n  readonly props = input<PrimeMultiCheckboxProps>();\n\n  protected valueViewModel = linkedSignal<FieldOption<ValueType>[]>(\n    () => {\n      const currentValues = this.ngf.field()().value();\n      return this.options().filter((option) => currentValues.includes(option.value));\n    },\n    { equal: isEqual },\n  );\n\n  /** Computed map of checked option values for O(1) lookup in template */\n  protected readonly checkedValuesMap = computed(() => {\n    const map: Record<string, boolean> = {};\n    for (const opt of this.valueViewModel()) {\n      map[String(opt.value)] = true;\n    }\n    return map;\n  });\n\n  protected onCheckboxChange(option: FieldOption<ValueType>, event: CheckboxChangeEvent): void {\n    const checked = event.checked;\n    this.valueViewModel.update((currentOptions: FieldOption<ValueType>[]) => {\n      if (checked) {\n        return currentOptions.some((opt: FieldOption<ValueType>) => opt.value === option.value)\n          ? currentOptions\n          : [...currentOptions, option];\n      } else {\n        return currentOptions.filter((opt: FieldOption<ValueType>) => opt.value !== option.value);\n      }\n    });\n  }\n\n  constructor() {\n    explicitEffect([this.valueViewModel], ([selectedOptions]: [FieldOption<ValueType>[]]) => {\n      const selectedValues = selectedOptions.map((option: FieldOption<ValueType>) => option.value);\n      if (!isEqual(selectedValues, this.ngf.field()().value())) {\n        this.ngf.field()().value.set(selectedValues);\n      }\n    });\n\n    explicitEffect([this.options], ([options]) => {\n      const values = options.map((option) => option.value);\n      const uniqueValues = new Set(values);\n\n      if (values.length !== uniqueValues.size) {\n        const duplicates = values.filter((value, index) => values.indexOf(value) !== index);\n        throw new Error(`Duplicate option values detected in prime-multi-checkbox: ${duplicates.join(', ')}`);\n      }\n    });\n  }\n}\n"]}