ngx-t-forms 2.0.30 → 2.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-t-forms-auto-complete-input-element.component-CaXs4561.mjs +104 -0
- package/fesm2022/ngx-t-forms-auto-complete-input-element.component-CaXs4561.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-basic-input-input-element.component-Dotyd-Qs.mjs +85 -0
- package/fesm2022/ngx-t-forms-basic-input-input-element.component-Dotyd-Qs.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-calculated-field-rules.component-BhxT6tRq.mjs +643 -0
- package/fesm2022/ngx-t-forms-calculated-field-rules.component-BhxT6tRq.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-d4QeVhsp.mjs +97 -0
- package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-d4QeVhsp.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-Gn8exJ9a.mjs +195 -0
- package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-Gn8exJ9a.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-data-source-picker.component-Ebf_if9j.mjs +261 -0
- package/fesm2022/ngx-t-forms-data-source-picker.component-Ebf_if9j.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-date-picker-input-element.component-kdinBGRA.mjs +85 -0
- package/fesm2022/ngx-t-forms-date-picker-input-element.component-kdinBGRA.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-4W6uvrDU.mjs +156 -0
- package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-4W6uvrDU.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CR6EvgJO.mjs +368 -0
- package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CR6EvgJO.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-document-picker.component-BThdRFec.mjs +704 -0
- package/fesm2022/ngx-t-forms-document-picker.component-BThdRFec.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-editor-input-element.component-1X6uAPeZ.mjs +294 -0
- package/fesm2022/ngx-t-forms-editor-input-element.component-1X6uAPeZ.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-editor-js-input.component-5MD8wRj0.mjs +240 -0
- package/fesm2022/ngx-t-forms-editor-js-input.component-5MD8wRj0.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-file-upload-input-element.component-BAtuymMY.mjs +205 -0
- package/fesm2022/ngx-t-forms-file-upload-input-element.component-BAtuymMY.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-form-input-selector.component-B42xP3jh.mjs +86 -0
- package/fesm2022/ngx-t-forms-form-input-selector.component-B42xP3jh.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-form-json-view.component-DnnLXqR0.mjs +22 -0
- package/fesm2022/ngx-t-forms-form-json-view.component-DnnLXqR0.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-form-payload-projection.component-Ip9ewB18.mjs +179 -0
- package/fesm2022/ngx-t-forms-form-payload-projection.component-Ip9ewB18.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-form-section-stepper.component-BPgPfZSy.mjs +319 -0
- package/fesm2022/ngx-t-forms-form-section-stepper.component-BPgPfZSy.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-forms-builder-menu.component-Dv0Dfw79.mjs +379 -0
- package/fesm2022/ngx-t-forms-forms-builder-menu.component-Dv0Dfw79.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-geo-location.component-Bmd84Gcb.mjs +124 -0
- package/fesm2022/ngx-t-forms-geo-location.component-Bmd84Gcb.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs +31 -0
- package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-image-capture-input-element.component-CUd04Ghl.mjs +180 -0
- package/fesm2022/ngx-t-forms-image-capture-input-element.component-CUd04Ghl.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-index-BcrQ01DQ.mjs +2 -0
- package/fesm2022/ngx-t-forms-index-BcrQ01DQ.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-input-custom.component-Cn-KH0Lb.mjs +105 -0
- package/fesm2022/ngx-t-forms-input-custom.component-Cn-KH0Lb.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-input-editor.component-DLru1Ezu.mjs +193 -0
- package/fesm2022/ngx-t-forms-input-editor.component-DLru1Ezu.mjs.map +1 -0
- package/fesm2022/{ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs → ngx-t-forms-map-mat-options-keys-CVlPdrCO.mjs} +12 -14
- package/fesm2022/ngx-t-forms-map-mat-options-keys-CVlPdrCO.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-BWisS3Em.mjs +66 -0
- package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-BWisS3Em.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs +211 -0
- package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs +165 -0
- package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-missing-form-configs.component-DxdynZY6.mjs +38 -0
- package/fesm2022/ngx-t-forms-missing-form-configs.component-DxdynZY6.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D4Xa_Yi0.mjs +38 -0
- package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D4Xa_Yi0.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs +126 -0
- package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mscoa-segment-config.component-Bo0aDEMy.mjs +447 -0
- package/fesm2022/ngx-t-forms-mscoa-segment-config.component-Bo0aDEMy.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs +74 -0
- package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C8JP3D6r.mjs +905 -0
- package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C8JP3D6r.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-ngx-t-forms-C2G8_WQk.mjs +20310 -0
- package/fesm2022/ngx-t-forms-ngx-t-forms-C2G8_WQk.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-paginated-selection-table-0OI1ikWW.mjs +555 -0
- package/fesm2022/ngx-t-forms-paginated-selection-table-0OI1ikWW.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-pipeline-generator.component-CZ21sd77.mjs +748 -0
- package/fesm2022/ngx-t-forms-pipeline-generator.component-CZ21sd77.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-record-list-manager.component-CykBq_nW.mjs +358 -0
- package/fesm2022/ngx-t-forms-record-list-manager.component-CykBq_nW.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-required-inputs.component-ONbhxVSH.mjs +272 -0
- package/fesm2022/ngx-t-forms-required-inputs.component-ONbhxVSH.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-rest-api-call-setup.component-WPUxtY7Q.mjs +398 -0
- package/fesm2022/ngx-t-forms-rest-api-call-setup.component-WPUxtY7Q.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs +38 -0
- package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-section-report.component-C1w16LYm.mjs +98 -0
- package/fesm2022/ngx-t-forms-section-report.component-C1w16LYm.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-select-input-element.component-CWcywuS6.mjs +150 -0
- package/fesm2022/ngx-t-forms-select-input-element.component-CWcywuS6.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-selection-options-editor.component-KjbZhc2u.mjs +169 -0
- package/fesm2022/ngx-t-forms-selection-options-editor.component-KjbZhc2u.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-t-workflow-picker.component-CtavFAUq.mjs +204 -0
- package/fesm2022/ngx-t-forms-t-workflow-picker.component-CtavFAUq.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-textarea-input-element.component-DkJkBQif.mjs +95 -0
- package/fesm2022/ngx-t-forms-textarea-input-element.component-DkJkBQif.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-toggle-input-element.component-Dr7MNli8.mjs +82 -0
- package/fesm2022/ngx-t-forms-toggle-input-element.component-Dr7MNli8.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-validators-config.component-BknyAmV_.mjs +574 -0
- package/fesm2022/ngx-t-forms-validators-config.component-BknyAmV_.mjs.map +1 -0
- package/fesm2022/ngx-t-forms-workflow-adjudication.component-CPvwm7f4.mjs +1303 -0
- package/fesm2022/ngx-t-forms-workflow-adjudication.component-CPvwm7f4.mjs.map +1 -0
- package/fesm2022/ngx-t-forms.mjs +2 -1
- package/fesm2022/ngx-t-forms.mjs.map +1 -1
- package/package.json +20 -18
- package/styles/_editor-mixins.scss +62 -0
- package/styles/_json-editor-syntax.scss +26 -0
- package/styles/_signature-pad.scss +26 -0
- package/styles/_tokens.scss +148 -0
- package/types/ngx-t-forms.d.ts +1921 -733
- package/fesm2022/ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs +0 -313
- package/fesm2022/ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs +0 -191
- package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs +0 -207
- package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-data-source-picker.component-Badna1Rl.mjs +0 -204
- package/fesm2022/ngx-t-forms-data-source-picker.component-Badna1Rl.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs +0 -289
- package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs +0 -134
- package/fesm2022/ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-form-json-view.component-B8seYzMQ.mjs +0 -22
- package/fesm2022/ngx-t-forms-form-json-view.component-B8seYzMQ.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs +0 -281
- package/fesm2022/ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs +0 -345
- package/fesm2022/ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-input-editor.component-B_kkOoEO.mjs +0 -147
- package/fesm2022/ngx-t-forms-input-editor.component-B_kkOoEO.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs +0 -105
- package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs +0 -109
- package/fesm2022/ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs +0 -155
- package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs +0 -28
- package/fesm2022/ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs +0 -43
- package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs +0 -116
- package/fesm2022/ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs +0 -296
- package/fesm2022/ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs +0 -83
- package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-ngx-t-forms-DP2koSL5.mjs +0 -17401
- package/fesm2022/ngx-t-forms-ngx-t-forms-DP2koSL5.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs +0 -613
- package/fesm2022/ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs +0 -269
- package/fesm2022/ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-required-inputs.component-CLyq9dIR.mjs +0 -190
- package/fesm2022/ngx-t-forms-required-inputs.component-CLyq9dIR.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs +0 -291
- package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-section-report.component-BtaF39WD.mjs +0 -156
- package/fesm2022/ngx-t-forms-section-report.component-BtaF39WD.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs +0 -186
- package/fesm2022/ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs +0 -187
- package/fesm2022/ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs.map +0 -1
- package/fesm2022/ngx-t-forms-validators-config.component-Cq07Er-G.mjs +0 -215
- package/fesm2022/ngx-t-forms-validators-config.component-Cq07Er-G.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-t-forms-mscoa-segment-config.component-Bo0aDEMy.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-segment-config/mscoa-segment-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-segment-config/mscoa-segment-config.component.html"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ViewEncapsulation,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Observable, catchError, of, take, tap } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { MatSlideToggleChange, MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport type {\r\n FormColumnInputs,\r\n IGetTreeResponse,\r\n IIncludedSegmentConfig,\r\n IScoaInput,\r\n ScoaInnerInput,\r\n} from 'ngx-t-forms-types';\r\nimport { ElementTypes } from 'ngx-t-forms-types';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { _isEqual } from '../../../../shared/functions/isEqual';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/** Discriminated edit-panel state: idle, adding a new segment, or editing an existing one. */\r\ntype EditState =\r\n | { readonly mode: 'idle' }\r\n | { readonly mode: 'add' }\r\n | { readonly mode: 'edit'; readonly index: number };\r\n\r\nconst IDLE: EditState = { mode: 'idle' };\r\n\r\n/**\r\n * Internal editor element for configuring an MSCOA input's included account\r\n * segments. Child of `t-dynamic-data-edit`, which supplies the field label,\r\n * hint, and validation errors - so this component owns only the segment chip\r\n * row and the add/edit panel.\r\n *\r\n * The segment list is seeded from the MSCOA tree (`getMscoaTree`); each segment\r\n * carries flags such as single-select, read-only, VAT-selection and\r\n * inherit-from-accrual. In cash-segment mode (`isCashSegmentConfig`) every\r\n * non-`item` segment defaults to inherit-from-accrual + read-only.\r\n */\r\n@Component({\r\n selector: 'lib-mscoa-segment-config',\r\n templateUrl: './mscoa-segment-config.component.html',\r\n styleUrl: './mscoa-segment-config.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n 'class': 'lib-mscoa-segment-config',\r\n '[attr.id]': 'hostId',\r\n },\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSlideToggleModule,\r\n MatTooltipModule,\r\n EmptyStateComponent,\r\n ],\r\n})\r\nexport class MscoaSegmentConfigComponent {\r\n /**\r\n * Validation errors passed down by the parent editor. Retained on the contract\r\n * but not rendered here - `t-dynamic-data-edit` owns error display.\r\n */\r\n readonly errors = input<IConfigElementError[] | undefined>([]);\r\n\r\n /** The full MSCOA input config; supplies the extension-account options. */\r\n readonly dataValue = input<IScoaInput | undefined>(undefined);\r\n\r\n /** Disable user interaction. */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /** Cash-segment mode: non-`item` segments default to inherit + read-only. */\r\n readonly isCashSegmentConfig = input<boolean>(false);\r\n\r\n /** Currently configured segments. */\r\n readonly value = input<IIncludedSegmentConfig[] | undefined>(undefined);\r\n\r\n /** When true, render every tree segment read-only (no add/remove). */\r\n readonly showAllSegments = input<boolean>(false);\r\n\r\n /**\r\n * Stream that resolves the MSCOA account tree. Heterogeneous wrapper binding -\r\n * the parent feeds whatever the editor config holds; narrowing here would force\r\n * wrapper changes.\r\n */\r\n readonly getMscoaTree = input<Observable<IGetTreeResponse | undefined> | undefined>(undefined);\r\n\r\n /**\r\n * Creates or updates an account-level custom input (a peer of the segments) from\r\n * the quick editor. Threaded through `t-dynamic-data-edit`; absent outside the\r\n * builder, which hides the affordance.\r\n */\r\n readonly saveCustomInput = input<((sectionId: string, scoaInputId: string, config: Pick<ScoaInnerInput, 'element' | 'label' | 'formControlName' | 'singleSelect' | 'readonly'> & { id?: string }) => void) | undefined>(undefined);\r\n\r\n /** Opens a custom input in the form-builder's input editor for advanced configuration. */\r\n readonly editSegmentInput = input<((input: FormColumnInputs) => void) | undefined>(undefined);\r\n\r\n /** Removes a custom input from the MSCOA config. */\r\n readonly deleteSegmentInput = input<((input: FormColumnInputs) => void) | undefined>(undefined);\r\n\r\n /** Emits the mutated segment list whenever the user adds, edits, or removes one. */\r\n readonly valueChanged = output<IIncludedSegmentConfig[]>();\r\n\r\n /** Host id attribute - stable, unique per instance. */\r\n readonly hostId = `app-mscoa-segment-config-${nextUniqueId++}`;\r\n\r\n readonly #fb = inject(FormBuilder);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n /** Tree-derived segment templates (drives the segment `mat-select`). */\r\n readonly #treeSegments = signal<readonly IIncludedSegmentConfig[]>([]);\r\n\r\n /** Error raised while fetching the tree (`null` until/unless the fetch fails). */\r\n readonly #fetchError = signal<string | null>(null);\r\n\r\n /** True while the tree stream is in flight. */\r\n protected readonly loading = signal<boolean>(false);\r\n\r\n /** Add/edit panel state. */\r\n readonly #editState = signal<EditState>(IDLE);\r\n\r\n /** Reactive form for the segment currently being added/edited. */\r\n protected segmentForm: FormGroup = this.#createSegmentForm();\r\n\r\n /** Add/edit panel state for account-level custom inputs. */\r\n readonly #customInputState = signal<{ mode: 'idle' } | { mode: 'add' } | { mode: 'edit'; id: string }>({ mode: 'idle' });\r\n\r\n /** Reactive form for the custom input currently being added/edited. */\r\n protected customInputForm: FormGroup = this.#createCustomInputForm();\r\n\r\n /** Curated input-type options for the custom-input quick editor. */\r\n protected readonly customInputTypes: ReadonlyArray<{ value: ElementTypes; label: string }> = [\r\n { value: ElementTypes.Input, label: 'Text / number' },\r\n { value: ElementTypes.Select, label: 'Select' },\r\n { value: ElementTypes.DatePicker, label: 'Date' },\r\n { value: ElementTypes.Toggle, label: 'Toggle' },\r\n ];\r\n\r\n /** Guards single-shot tree load (mirrors the original take(1) one-time fetch). */\r\n #treeRequested = false;\r\n\r\n /**\r\n * The configured segments, always a real array. The editor descriptor seeds\r\n * an unconfigured segments value as `false` (its `defaultValue`), so guard\r\n * against any non-array input — `?? []` alone would let `false`/objects\r\n * through and break `.some` / `.map` / `@for` downstream.\r\n */\r\n protected readonly resolvedValue = computed<readonly IIncludedSegmentConfig[]>(\r\n () => {\r\n const value = this.value();\r\n return Array.isArray(value) ? value : [];\r\n },\r\n );\r\n\r\n /** Tree-derived segment templates for the picker. */\r\n protected readonly treeSegments = this.#treeSegments.asReadonly();\r\n\r\n /**\r\n * Loader/tree error message; `null` when none. A fetch error takes priority,\r\n * otherwise a missing loader surfaces the \"No loader provided\" notice.\r\n */\r\n protected readonly treeError = computed<string | null>(() => {\r\n const fetchError = this.#fetchError();\r\n if (fetchError) {\r\n return fetchError;\r\n }\r\n return this.getMscoaTree() ? null : 'No loader provided';\r\n });\r\n\r\n /** Whether the add/edit panel is open. */\r\n protected readonly isEditing = computed<boolean>(() => this.#editState().mode !== 'idle');\r\n\r\n /** Whether the open panel is adding a brand-new segment. */\r\n protected readonly isAddingNew = computed<boolean>(() => this.#editState().mode === 'add');\r\n\r\n /** Whether the \"Add new segment\" toolbar button should show. */\r\n protected readonly canAddNew = computed<boolean>(\r\n () => !this.isEditing() && !this.showAllSegments(),\r\n );\r\n\r\n constructor() {\r\n // One-time tree load. Mirrors the original `take(1)` fetch. The signal\r\n // writes happen off the reactive tick (microtask) so the effect itself\r\n // performs no synchronous signal mutation.\r\n effect(() => {\r\n const tree$ = this.getMscoaTree();\r\n if (!tree$ || this.#treeRequested) {\r\n return;\r\n }\r\n this.#treeRequested = true;\r\n queueMicrotask(() => this.#loadMscoa(tree$));\r\n });\r\n\r\n // Reflect the full tree as read-only segments when `showAllSegments` is on.\r\n effect(() => {\r\n if (this.showAllSegments()) {\r\n this.#syncAllSegments();\r\n }\r\n });\r\n }\r\n\r\n /** Fetch the tree once, build the segment templates, surface any error. */\r\n #loadMscoa(tree$: Observable<IGetTreeResponse | undefined>): void {\r\n this.#fetchError.set(null);\r\n this.loading.set(true);\r\n tree$\r\n .pipe(\r\n take(1),\r\n tap((response) => {\r\n this.#treeSegments.set(this.#buildTreeSegments(response));\r\n this.loading.set(false);\r\n }),\r\n catchError(() => {\r\n this.#fetchError.set('Failed to fetch mscoa tree');\r\n this.loading.set(false);\r\n return of(undefined);\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n )\r\n .subscribe();\r\n }\r\n\r\n /** Map the tree account keys into seedable segment templates. */\r\n #buildTreeSegments(response: IGetTreeResponse | undefined): readonly IIncludedSegmentConfig[] {\r\n const isCash = this.isCashSegmentConfig();\r\n const current = this.resolvedValue();\r\n return (response?.accountTreeKeys ?? []).map((treeKey) => {\r\n const isItem = treeKey.toLocaleLowerCase() === 'item';\r\n return {\r\n id: uuidv4(),\r\n segment: treeKey,\r\n singleSelect: true,\r\n additionalAccounts: [],\r\n inheritValueFromAccrual: isCash ? !isItem : undefined,\r\n vatSelectonActive: isCash ? false : isItem,\r\n segmentExtension: false,\r\n label: this.#toTitleCase(treeKey),\r\n readOnly:\r\n current.find((v) => v.segment === treeKey)?.readOnly ||\r\n (isCash && !isItem) ||\r\n false,\r\n };\r\n });\r\n }\r\n\r\n /** Build the per-segment reactive form. */\r\n #createSegmentForm(\r\n segment: IIncludedSegmentConfig = {\r\n segment: '',\r\n label: '',\r\n id: uuidv4(),\r\n singleSelect: true,\r\n segmentExtension: false,\r\n additionalAccounts: [],\r\n readOnly: false,\r\n },\r\n ): FormGroup {\r\n const isItem = segment.segment?.toLocaleLowerCase() === 'item';\r\n return this.#fb.group({\r\n id: [segment.id],\r\n segment: [segment.segment, Validators.required],\r\n segmentExtension: [segment.segmentExtension, Validators.required],\r\n readOnly: [segment.readOnly, Validators.required],\r\n // Default to a concrete `false` in cash mode: `Validators.required` rejects\r\n // `undefined` (but accepts `false`), so a brand-new segment whose toggle was\r\n // never touched would otherwise keep the form invalid and the Save button\r\n // permanently disabled. Existing values (true/false) pass through unchanged.\r\n inheritValueFromAccrual: this.isCashSegmentConfig()\r\n ? [segment.inheritValueFromAccrual ?? false, Validators.required]\r\n : [segment.inheritValueFromAccrual],\r\n vatSelectonActive: isItem\r\n ? [Boolean(segment.vatSelectonActive), Validators.required]\r\n : [Boolean(segment.vatSelectonActive)],\r\n additionalAccounts: [segment.additionalAccounts ?? []],\r\n label: [segment.label, Validators.required],\r\n singleSelect: [segment.singleSelect, Validators.required],\r\n });\r\n }\r\n\r\n protected startAddNew(): void {\r\n this.segmentForm = this.#createSegmentForm();\r\n this.#editState.set({ mode: 'add' });\r\n }\r\n\r\n protected startEdit(index: number): void {\r\n const segment = this.resolvedValue().at(index);\r\n if (!segment) {\r\n return;\r\n }\r\n this.segmentForm = this.#createSegmentForm(segment);\r\n this.#editState.set({ mode: 'edit', index });\r\n }\r\n\r\n protected cancelEdit(): void {\r\n this.segmentForm.reset();\r\n this.#editState.set(IDLE);\r\n }\r\n\r\n protected saveSegment(): void {\r\n if (!this.segmentForm.valid) {\r\n return;\r\n }\r\n const raw = this.segmentForm.getRawValue();\r\n const label = this.#toTitleCase(String(raw.label ?? ''));\r\n const newSegment: IIncludedSegmentConfig = {\r\n id: typeof raw.id === 'string' && raw.id ? raw.id : uuidv4(),\r\n segment: raw.segment,\r\n // Multi-level segments derive their key from the (upper-cased) label.\r\n customSegment: raw.segmentExtension ? label.toLocaleUpperCase() : undefined,\r\n segmentExtension: Boolean(raw.segmentExtension),\r\n inheritValueFromAccrual: Boolean(raw.inheritValueFromAccrual),\r\n vatSelectonActive: Boolean(raw.vatSelectonActive),\r\n additionalAccounts: Array.isArray(raw.additionalAccounts) ? raw.additionalAccounts : [],\r\n label,\r\n singleSelect: Boolean(raw.singleSelect),\r\n readOnly: Boolean(raw.readOnly),\r\n };\r\n\r\n const state = this.#editState();\r\n const updated = [...this.resolvedValue()];\r\n if (state.mode === 'add') {\r\n updated.push(newSegment);\r\n } else if (state.mode === 'edit') {\r\n updated[state.index] = newSegment;\r\n } else {\r\n return;\r\n }\r\n\r\n this.valueChanged.emit(updated);\r\n this.cancelEdit();\r\n }\r\n\r\n protected readOnlyChanged(event: MatSlideToggleChange): void {\r\n this.segmentForm.patchValue({ readOnly: event.checked });\r\n }\r\n\r\n protected singleSelectChange(event: MatSlideToggleChange): void {\r\n this.segmentForm.patchValue({ singleSelect: event.checked });\r\n }\r\n\r\n protected setVatSelectionActive(event: MatSlideToggleChange): void {\r\n this.segmentForm.patchValue({ vatSelectonActive: event.checked });\r\n }\r\n\r\n /** Inherit-from-accrual implies read-only (quirk: toggling on forces read-only). */\r\n protected setInheritFromAccrual(event: MatSlideToggleChange): void {\r\n this.segmentForm.patchValue({ inheritValueFromAccrual: event.checked });\r\n if (event.checked) {\r\n this.segmentForm.patchValue({ readOnly: true });\r\n }\r\n }\r\n\r\n protected multiLevelSelectChange(event: MatSlideToggleChange): void {\r\n this.segmentForm.patchValue({ segmentExtension: event.checked });\r\n }\r\n\r\n /** Pick a segment; auto-fill the label from it unless this is a multi-level extension. */\r\n protected selectSegment(event: MatSelectChange): void {\r\n this.segmentForm.patchValue({ segment: event.value });\r\n if (!this.segmentForm.value.segmentExtension) {\r\n this.segmentForm.patchValue({ label: this.#toTitleCase(String(event.value ?? '')) });\r\n }\r\n }\r\n\r\n protected additionalAccountsChanged(event: MatSelectChange): void {\r\n this.segmentForm.patchValue(\r\n { additionalAccounts: [...event.value] },\r\n { emitEvent: true },\r\n );\r\n }\r\n\r\n protected removeSegment(index: number): void {\r\n const updated = this.resolvedValue().filter((_, i) => i !== index);\r\n this.valueChanged.emit(updated);\r\n }\r\n\r\n /** All account-level custom inputs (peers of the segments — not segment-linked). */\r\n protected customInputs(): ScoaInnerInput[] {\r\n return (this.dataValue()?.mscoaConfig?.inputs ?? []).filter((input) => !input.linkedSegmentId);\r\n }\r\n\r\n /** Whether custom inputs can be managed (builder callbacks present). */\r\n protected get canManageInputs(): boolean {\r\n return !!this.saveCustomInput() && !!this.dataValue()?.id;\r\n }\r\n\r\n /** Whether the custom-input add/edit panel is open. */\r\n protected readonly isCustomInputPanelOpen = computed<boolean>(\r\n () => this.#customInputState().mode !== 'idle',\r\n );\r\n\r\n /** Open the panel to add a new custom input. */\r\n protected startAddCustomInput(): void {\r\n this.cancelEdit();\r\n this.customInputForm = this.#createCustomInputForm();\r\n this.#customInputState.set({ mode: 'add' });\r\n }\r\n\r\n /** Open the panel to edit an existing custom input's basics. */\r\n protected startEditCustomInput(input: ScoaInnerInput): void {\r\n this.cancelEdit();\r\n this.customInputForm = this.#createCustomInputForm(input);\r\n this.#customInputState.set({ mode: 'edit', id: input.id });\r\n }\r\n\r\n /** Close the custom-input panel without saving. */\r\n protected cancelCustomInput(): void {\r\n this.customInputForm.reset();\r\n this.#customInputState.set({ mode: 'idle' });\r\n }\r\n\r\n /** Persist the custom-input panel through the builder save callback. */\r\n protected saveCustomInputPanel(): void {\r\n const data = this.dataValue();\r\n if (!this.customInputForm.valid || !data?.id) {\r\n return;\r\n }\r\n const raw = this.customInputForm.getRawValue();\r\n const label = String(raw.label ?? '').trim();\r\n this.saveCustomInput()?.(data.sectionId, data.id, {\r\n id: typeof raw.id === 'string' && raw.id ? raw.id : undefined,\r\n element: raw.element,\r\n label,\r\n formControlName: this.#toControlName(label),\r\n singleSelect: Boolean(raw.singleSelect),\r\n readonly: Boolean(raw.readonly),\r\n });\r\n this.cancelCustomInput();\r\n }\r\n\r\n /** Open a custom input in the builder's input editor for advanced configuration. */\r\n protected onEditAdvanced(input: ScoaInnerInput): void {\r\n this.editSegmentInput()?.(input);\r\n }\r\n\r\n /** Remove a custom input from the MSCOA config. */\r\n protected onDeleteInput(input: ScoaInnerInput): void {\r\n this.deleteSegmentInput()?.(input);\r\n }\r\n\r\n /** Build the per-custom-input reactive form (type, label, single-value-selection, read-only). */\r\n #createCustomInputForm(input?: ScoaInnerInput): FormGroup {\r\n return this.#fb.group({\r\n id: [input?.id ?? null],\r\n element: [input?.element ?? ElementTypes.Input, Validators.required],\r\n label: [input?.label ?? '', Validators.required],\r\n singleSelect: [input?.singleSelect ?? true],\r\n readonly: [input?.readonly ?? false],\r\n });\r\n }\r\n\r\n /** camelCase control name derived from a label (e.g. \"Budget Value\" -> \"budgetValue\"). */\r\n #toControlName(label: string): string {\r\n const words = label.match(/[a-z0-9]+/gi) ?? [];\r\n return words\r\n .map((word, index) =>\r\n index === 0\r\n ? word.toLowerCase()\r\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),\r\n )\r\n .join('');\r\n }\r\n\r\n /**\r\n * A tree template is \"already used\" (and so disabled in the picker) when a\r\n * segment with the same key is already configured - except for multi-level\r\n * extensions, which may reuse a key.\r\n */\r\n protected alreadyExists(segment: IIncludedSegmentConfig): boolean {\r\n if (this.segmentForm.value.segmentExtension) {\r\n return false;\r\n }\r\n return this.resolvedValue().some((v) => v.segment === segment.segment);\r\n }\r\n\r\n /** Extension-account options drawn from the MSCOA config. */\r\n protected get extensionAccountsForSegments(): string[] {\r\n return this.dataValue()?.mscoaConfig?.extensionAccountsForSegments ?? [];\r\n }\r\n\r\n /**\r\n * When `showAllSegments` is on, reconcile the configured value against the full\r\n * tree. Preserves the deliberate double-emit sync: emit a reset sentinel first,\r\n * then the merged list on the next microtask so the parent re-renders cleanly.\r\n */\r\n #syncAllSegments(): void {\r\n const templates = this.#treeSegments();\r\n if (!this.#treeRequested || templates.length === 0) {\r\n return;\r\n }\r\n const current = this.resolvedValue();\r\n const merged = templates.map((segment) => ({\r\n ...segment,\r\n ...(current.find((v) => v.segment === segment.segment) ?? {}),\r\n }));\r\n\r\n if (!_isEqual(merged, current)) {\r\n // Reset sentinel, then the real value, to force downstream re-binding.\r\n this.valueChanged.emit([{} as IIncludedSegmentConfig]);\r\n queueMicrotask(() => this.valueChanged.emit(merged));\r\n }\r\n }\r\n\r\n #toTitleCase(str: string): string {\r\n return str.replace(\r\n /\\w\\S*/g,\r\n (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase(),\r\n );\r\n }\r\n}\r\n","@if (loading()) {\n <div class=\"mscoa-segment-config__notice\">\n <mat-icon class=\"mscoa-segment-config__notice-icon\">hourglass_top</mat-icon>\n <span>Loading account segments…</span>\n </div>\n}\n\n@if (treeError(); as error) {\n <div class=\"mscoa-segment-config__notice mscoa-segment-config__notice--error\">\n <mat-icon class=\"mscoa-segment-config__notice-icon\">error_outline</mat-icon>\n <span>{{ error }}</span>\n </div>\n}\n\n@if (resolvedValue().length > 0) {\n <div class=\"mscoa-segment-config__section\">\n <p class=\"mscoa-segment-config__section-label\">Configured segments</p>\n <mat-chip-listbox [disabled]=\"disabled()\" aria-label=\"Configured account segments\">\n @for (segment of resolvedValue(); track segment.id; let i = $index) {\n <mat-chip-option\n (removed)=\"removeSegment(i)\"\n (click)=\"startEdit(i)\"\n [value]=\"segment.segment\"\n [selected]=\"isEditing() && !isAddingNew()\">\n <span class=\"mscoa-segment-config__chip-content\">\n <span class=\"mscoa-segment-config__chip-label\">{{ segment.label }}</span>\n <mat-icon class=\"mscoa-segment-config__chip-icon\">\n {{ segment.singleSelect ? 'done' : 'done_all' }}\n </mat-icon>\n <mat-icon class=\"mscoa-segment-config__chip-icon\">\n {{ segment.readOnly ? 'edit_off' : 'edit' }}\n </mat-icon>\n </span>\n\n @if (showAllSegments() === false) {\n <button matChipRemove aria-label=\"Remove segment\" [disabled]=\"disabled()\">\n <mat-icon>cancel</mat-icon>\n </button>\n }\n </mat-chip-option>\n }\n </mat-chip-listbox>\n </div>\n} @else if (!loading()) {\n <lib-empty-state\n icon=\"account_tree\"\n message=\"No segments configured yet. Add one to begin shaping this MSCOA input.\">\n @if (canAddNew()) {\n <button mat-stroked-button [disabled]=\"disabled()\" (click)=\"startAddNew()\">\n <mat-icon>add</mat-icon>\n Add segment\n </button>\n }\n </lib-empty-state>\n}\n\n@if (canAddNew() && resolvedValue().length > 0) {\n <button\n class=\"mscoa-segment-config__add\"\n mat-stroked-button\n [disabled]=\"disabled()\"\n (click)=\"startAddNew()\">\n <mat-icon>add</mat-icon>\n Add new segment\n </button>\n}\n\n@if (canManageInputs) {\n <!-- Account-level custom inputs (peers of the segments): list + consolidated add/edit panel. -->\n <div class=\"mscoa-segment-config__section\">\n <p class=\"mscoa-segment-config__section-label\">Custom inputs</p>\n <p class=\"mscoa-segment-config__hint\">\n Account-level inputs that sit alongside the segments (e.g. budget value,\n department). Each is a full form input entered per leg; single value\n selection applies one value across debit and credit.\n </p>\n\n @for (input of customInputs(); track input.id) {\n <div class=\"mscoa-segment-config__custom-input-row\">\n <mat-icon class=\"mscoa-segment-config__input-icon\">tune</mat-icon>\n <span class=\"mscoa-segment-config__input-label\">\n {{ input.label || input.formControlName || 'Untitled input' }}\n </span>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"disabled()\"\n matTooltip=\"Edit\"\n aria-label=\"Edit input\"\n (click)=\"startEditCustomInput(input)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"disabled()\"\n matTooltip=\"Advanced settings (validators, calculations, API)\"\n aria-label=\"Advanced settings\"\n (click)=\"onEditAdvanced(input)\">\n <mat-icon>tune</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"disabled()\"\n matTooltip=\"Remove\"\n aria-label=\"Remove input\"\n (click)=\"onDeleteInput(input)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n } @empty {\n <p class=\"mscoa-segment-config__hint mscoa-segment-config__hint--muted\">\n No custom inputs yet.\n </p>\n }\n\n @if (!isCustomInputPanelOpen()) {\n <button\n class=\"mscoa-segment-config__add-input\"\n mat-stroked-button\n type=\"button\"\n [disabled]=\"disabled()\"\n (click)=\"startAddCustomInput()\">\n <mat-icon>add</mat-icon>\n Add custom input\n </button>\n }\n\n @if (isCustomInputPanelOpen()) {\n <mat-card class=\"mscoa-segment-config__panel\" appearance=\"outlined\">\n <mat-card-header>\n <mat-card-subtitle>\n {{ customInputForm.value.id ? 'Update' : 'Add a' }} custom input\n </mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <form [formGroup]=\"customInputForm\" (ngSubmit)=\"saveCustomInputPanel()\">\n <div class=\"mscoa-segment-config__group\">\n <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\n <mat-label>Input type</mat-label>\n <mat-select formControlName=\"element\" placeholder=\"Select input type\">\n @for (type of customInputTypes; track type.value) {\n <mat-option [value]=\"type.value\">{{ type.label }}</mat-option>\n }\n </mat-select>\n <mat-hint>Use Advanced settings for validators, calculations and API.</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"mscoa-segment-config__group\">\n <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input matInput formControlName=\"label\" placeholder=\"Enter label\" />\n <mat-hint>A descriptive name (e.g. 'Budget value', 'Department').</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle formControlName=\"singleSelect\">Single value selection</mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n When enabled, one value applies across debit and credit; when disabled, a value is\n entered per leg.\n </p>\n </div>\n\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle formControlName=\"readonly\">Read only</mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n Prevents users from changing the value after initial setup.\n </p>\n </div>\n\n <mat-card-actions class=\"mscoa-segment-config__actions\">\n <button mat-button type=\"button\" (click)=\"cancelCustomInput()\">Cancel</button>\n <button mat-flat-button color=\"primary\" type=\"submit\" [disabled]=\"!customInputForm.valid\">\n Save\n </button>\n </mat-card-actions>\n </form>\n </mat-card-content>\n </mat-card>\n }\n </div>\n}\n\n@if (isEditing()) {\n <mat-card class=\"mscoa-segment-config__panel\" appearance=\"outlined\">\n <mat-card-header>\n <mat-card-subtitle>\n {{ isAddingNew() ? 'Add a new' : 'Update' }} segment\n </mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <form [formGroup]=\"segmentForm\" (ngSubmit)=\"saveSegment()\">\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle\n (change)=\"multiLevelSelectChange($event)\"\n [checked]=\"segmentForm.value.segmentExtension\">\n Enable multi-level segmentation\n </mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n Allows sub-classifications within this segment for more detailed accounting hierarchies.\n </p>\n\n <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\n <mat-label>Segment</mat-label>\n <mat-select\n (selectionChange)=\"selectSegment($event)\"\n formControlName=\"segment\"\n placeholder=\"Select segment\">\n @for (segment of treeSegments(); track segment.id) {\n <mat-option [disabled]=\"alreadyExists(segment)\" [value]=\"segment.segment\">\n {{ segment.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>Select an account segment type from your chart of accounts.</mat-hint>\n </mat-form-field>\n </div>\n\n @if (isCashSegmentConfig()) {\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle\n (change)=\"setInheritFromAccrual($event)\"\n [checked]=\"segmentForm.value.inheritValueFromAccrual\">\n Inherit from accrual\n </mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n When enabled, changes to the accrual value reflect here automatically.\n </p>\n </div>\n }\n\n <div class=\"mscoa-segment-config__group\">\n <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input\n matInput\n formControlName=\"label\"\n [readonly]=\"!segmentForm.value.segmentExtension\"\n placeholder=\"Enter label\" />\n <mat-hint>\n A descriptive name for this segment (e.g. 'Department', 'Project', 'Cost Center').\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle\n (change)=\"singleSelectChange($event)\"\n [checked]=\"segmentForm.value.singleSelect\">\n Single value selection\n </mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n When enabled, transactions are assigned to one value within this segment; when disabled,\n they can be split across multiple values.\n </p>\n </div>\n\n @if (segmentForm.value.segment?.toLocaleLowerCase() === 'item') {\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle\n (change)=\"setVatSelectionActive($event)\"\n [checked]=\"segmentForm.value.vatSelectonActive\">\n Require VAT account selection\n </mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n When active, users must specify a VAT account for taxable items.\n </p>\n </div>\n }\n\n <div class=\"mscoa-segment-config__group\">\n <div class=\"mscoa-segment-config__toggle\">\n <mat-slide-toggle\n (change)=\"readOnlyChanged($event)\"\n [checked]=\"segmentForm.value.readOnly\">\n Read-only segment\n </mat-slide-toggle>\n </div>\n <p class=\"mscoa-segment-config__hint\">\n Prevents users from modifying segment values after initial setup. Use for regulatory or\n policy-controlled segments.\n </p>\n </div>\n\n <div class=\"mscoa-segment-config__group\">\n <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\n <mat-label>Additional accounts</mat-label>\n <mat-select\n (selectionChange)=\"additionalAccountsChanged($event)\"\n formControlName=\"additionalAccounts\"\n multiple\n placeholder=\"Select counter accounts\">\n @for (ext of extensionAccountsForSegments; track ext) {\n <mat-option [value]=\"ext\">{{ ext }}</mat-option>\n }\n </mat-select>\n <mat-hint>\n Add supporting accounts for this segment (e.g. VAT or tax accounts).\n </mat-hint>\n </mat-form-field>\n </div>\n\n <mat-card-actions class=\"mscoa-segment-config__actions\">\n <button mat-button type=\"button\" (click)=\"cancelEdit()\">Cancel</button>\n <button mat-flat-button color=\"primary\" type=\"submit\" [disabled]=\"!segmentForm.valid\">\n Save\n </button>\n </mat-card-actions>\n </form>\n </mat-card-content>\n </mat-card>\n}\n"],"names":["uuidv4","i2","i5","i6","i7","i9","i10"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, signal, inject, DestroyRef, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import * as i1 from '@angular/material/button';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import * as i3 from '@angular/material/icon';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import { Subject, timer } from 'rxjs';
|
|
9
|
+
import { takeUntil } from 'rxjs/operators';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Displays a transient hint message inside the MSCOA chart UI.
|
|
13
|
+
* Auto-hides after the configured duration; can be dismissed manually.
|
|
14
|
+
*/
|
|
15
|
+
class MscoaTemporaryHintComponent {
|
|
16
|
+
#destroyRef;
|
|
17
|
+
#hideTimer$;
|
|
18
|
+
#previousMessage;
|
|
19
|
+
constructor() {
|
|
20
|
+
/** Message text to display. */
|
|
21
|
+
this.message = input('', ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
|
|
22
|
+
/** Auto-hide duration in milliseconds. */
|
|
23
|
+
this.duration = input(5000, ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
|
|
24
|
+
/** Whether to show the dismiss button. */
|
|
25
|
+
this.showDismiss = input(true, ...(ngDevMode ? [{ debugName: "showDismiss" }] : /* istanbul ignore next */ []));
|
|
26
|
+
/** Visual variant. */
|
|
27
|
+
this.type = input('info', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
|
|
28
|
+
this.visible = signal(false, ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
|
|
29
|
+
this.#destroyRef = inject(DestroyRef);
|
|
30
|
+
this.#hideTimer$ = new Subject();
|
|
31
|
+
this.#previousMessage = '';
|
|
32
|
+
// React to message changes (replaces ngOnInit + ngOnChanges).
|
|
33
|
+
effect(() => {
|
|
34
|
+
const current = this.message();
|
|
35
|
+
const previous = this.#previousMessage;
|
|
36
|
+
this.#previousMessage = current;
|
|
37
|
+
if (current && current !== previous) {
|
|
38
|
+
this.show();
|
|
39
|
+
}
|
|
40
|
+
else if (!current && previous) {
|
|
41
|
+
this.hide();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
this.#destroyRef.onDestroy(() => {
|
|
45
|
+
this.#hideTimer$.next();
|
|
46
|
+
this.#hideTimer$.complete();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
show() {
|
|
50
|
+
// Cancel any existing timer.
|
|
51
|
+
this.#hideTimer$.next();
|
|
52
|
+
this.visible.set(true);
|
|
53
|
+
// Auto-hide after duration.
|
|
54
|
+
timer(this.duration())
|
|
55
|
+
.pipe(takeUntil(this.#hideTimer$), takeUntilDestroyed(this.#destroyRef))
|
|
56
|
+
.subscribe(() => this.hide());
|
|
57
|
+
}
|
|
58
|
+
hide() {
|
|
59
|
+
this.#hideTimer$.next();
|
|
60
|
+
this.visible.set(false);
|
|
61
|
+
}
|
|
62
|
+
dismiss() {
|
|
63
|
+
this.hide();
|
|
64
|
+
}
|
|
65
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MscoaTemporaryHintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
66
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: MscoaTemporaryHintComponent, isStandalone: true, selector: "lib-mscoa-temporary-hint", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, showDismiss: { classPropertyName: "showDismiss", publicName: "showDismiss", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (visible() && message()) {\r\n <div\r\n class=\"temporary-hint\"\r\n [class.temporary-hint--info]=\"type() === 'info'\"\r\n [class.temporary-hint--guidance]=\"type() === 'guidance'\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n [attr.aria-label]=\"'Hint: ' + message()\">\r\n\r\n <mat-icon class=\"temporary-hint__icon\" aria-hidden=\"true\">info</mat-icon>\r\n\r\n <div class=\"temporary-hint__content\">\r\n <p class=\"temporary-hint__message\">{{ message() }}</p>\r\n </div>\r\n\r\n @if (showDismiss()) {\r\n <button\r\n class=\"temporary-hint__dismiss\"\r\n (click)=\"dismiss()\"\r\n [attr.aria-label]=\"'Dismiss hint'\"\r\n mat-icon-button\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n}\r\n", styles: [".temporary-hint{display:flex;align-items:flex-start;gap:var(--mscoa-chart-spacing-sm, 8px);padding:var(--mscoa-chart-spacing-sm, 8px) var(--mscoa-chart-spacing-md, 16px);margin-top:var(--mscoa-chart-spacing-sm, 8px);border-radius:var(--mscoa-chart-border-radius, 4px);font-size:13px;line-height:1.5;animation:slideInFade var(--mscoa-chart-transition, .2s ease);transition:opacity var(--lib-forms-duration-hover) var(--lib-forms-easing)}.temporary-hint--info{background-color:var(--sem-info-surface);color:var(--sem-info);border-left:3px solid var(--sem-info)}.temporary-hint--guidance{background-color:var(--sem-warning-surface);color:var(--lib-forms-on-surface);border-left:3px solid var(--sem-warning)}.temporary-hint__icon{flex-shrink:0;width:18px;height:18px;font-size:18px;margin-top:2px;color:var(--sem-info)}.temporary-hint--guidance .temporary-hint__icon{color:var(--sem-warning)}.temporary-hint__content{flex:1;min-width:0}.temporary-hint__message{margin:0;font-weight:400}.temporary-hint__dismiss{flex-shrink:0;width:24px;height:24px;opacity:.7;transition:opacity var(--lib-forms-duration-hover) var(--lib-forms-easing)}.temporary-hint__dismiss:hover{opacity:1}.temporary-hint__dismiss mat-icon{font-size:18px;width:18px;height:18px}@keyframes slideInFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.temporary-hint.ng-leave{animation:slideOutFade var(--mscoa-chart-transition, .2s ease)}@keyframes slideOutFade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MscoaTemporaryHintComponent, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{ selector: 'lib-mscoa-temporary-hint', imports: [MatButtonModule, MatIconModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "@if (visible() && message()) {\r\n <div\r\n class=\"temporary-hint\"\r\n [class.temporary-hint--info]=\"type() === 'info'\"\r\n [class.temporary-hint--guidance]=\"type() === 'guidance'\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n [attr.aria-label]=\"'Hint: ' + message()\">\r\n\r\n <mat-icon class=\"temporary-hint__icon\" aria-hidden=\"true\">info</mat-icon>\r\n\r\n <div class=\"temporary-hint__content\">\r\n <p class=\"temporary-hint__message\">{{ message() }}</p>\r\n </div>\r\n\r\n @if (showDismiss()) {\r\n <button\r\n class=\"temporary-hint__dismiss\"\r\n (click)=\"dismiss()\"\r\n [attr.aria-label]=\"'Dismiss hint'\"\r\n mat-icon-button\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n}\r\n", styles: [".temporary-hint{display:flex;align-items:flex-start;gap:var(--mscoa-chart-spacing-sm, 8px);padding:var(--mscoa-chart-spacing-sm, 8px) var(--mscoa-chart-spacing-md, 16px);margin-top:var(--mscoa-chart-spacing-sm, 8px);border-radius:var(--mscoa-chart-border-radius, 4px);font-size:13px;line-height:1.5;animation:slideInFade var(--mscoa-chart-transition, .2s ease);transition:opacity var(--lib-forms-duration-hover) var(--lib-forms-easing)}.temporary-hint--info{background-color:var(--sem-info-surface);color:var(--sem-info);border-left:3px solid var(--sem-info)}.temporary-hint--guidance{background-color:var(--sem-warning-surface);color:var(--lib-forms-on-surface);border-left:3px solid var(--sem-warning)}.temporary-hint__icon{flex-shrink:0;width:18px;height:18px;font-size:18px;margin-top:2px;color:var(--sem-info)}.temporary-hint--guidance .temporary-hint__icon{color:var(--sem-warning)}.temporary-hint__content{flex:1;min-width:0}.temporary-hint__message{margin:0;font-weight:400}.temporary-hint__dismiss{flex-shrink:0;width:24px;height:24px;opacity:.7;transition:opacity var(--lib-forms-duration-hover) var(--lib-forms-easing)}.temporary-hint__dismiss:hover{opacity:1}.temporary-hint__dismiss mat-icon{font-size:18px;width:18px;height:18px}@keyframes slideInFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.temporary-hint.ng-leave{animation:slideOutFade var(--mscoa-chart-transition, .2s ease)}@keyframes slideOutFade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}\n"] }]
|
|
71
|
+
}], ctorParameters: () => [], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], duration: [{ type: i0.Input, args: [{ isSignal: true, alias: "duration", required: false }] }], showDismiss: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDismiss", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }] } });
|
|
72
|
+
|
|
73
|
+
export { MscoaTemporaryHintComponent };
|
|
74
|
+
//# sourceMappingURL=ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-temporary-hint/mscoa-temporary-hint.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-temporary-hint/mscoa-temporary-hint.component.html"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ViewEncapsulation,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Subject, timer } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n/**\r\n * Displays a transient hint message inside the MSCOA chart UI.\r\n * Auto-hides after the configured duration; can be dismissed manually.\r\n */\r\n@Component({\r\n selector: 'lib-mscoa-temporary-hint',\r\n imports: [MatButtonModule, MatIconModule],\r\n templateUrl: './mscoa-temporary-hint.component.html',\r\n styleUrls: ['./mscoa-temporary-hint.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class MscoaTemporaryHintComponent {\r\n /** Message text to display. */\r\n readonly message = input<string>('');\r\n /** Auto-hide duration in milliseconds. */\r\n readonly duration = input<number>(5000);\r\n /** Whether to show the dismiss button. */\r\n readonly showDismiss = input<boolean>(true);\r\n /** Visual variant. */\r\n readonly type = input<'info' | 'guidance'>('info');\r\n\r\n protected readonly visible = signal<boolean>(false);\r\n\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #hideTimer$ = new Subject<void>();\r\n #previousMessage = '';\r\n\r\n constructor() {\r\n // React to message changes (replaces ngOnInit + ngOnChanges).\r\n effect(() => {\r\n const current = this.message();\r\n const previous = this.#previousMessage;\r\n this.#previousMessage = current;\r\n\r\n if (current && current !== previous) {\r\n this.show();\r\n } else if (!current && previous) {\r\n this.hide();\r\n }\r\n });\r\n\r\n this.#destroyRef.onDestroy(() => {\r\n this.#hideTimer$.next();\r\n this.#hideTimer$.complete();\r\n });\r\n }\r\n\r\n show(): void {\r\n // Cancel any existing timer.\r\n this.#hideTimer$.next();\r\n\r\n this.visible.set(true);\r\n\r\n // Auto-hide after duration.\r\n timer(this.duration())\r\n .pipe(takeUntil(this.#hideTimer$), takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(() => this.hide());\r\n }\r\n\r\n hide(): void {\r\n this.#hideTimer$.next();\r\n this.visible.set(false);\r\n }\r\n\r\n dismiss(): void {\r\n this.hide();\r\n }\r\n}\r\n","@if (visible() && message()) {\r\n <div\r\n class=\"temporary-hint\"\r\n [class.temporary-hint--info]=\"type() === 'info'\"\r\n [class.temporary-hint--guidance]=\"type() === 'guidance'\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n [attr.aria-label]=\"'Hint: ' + message()\">\r\n\r\n <mat-icon class=\"temporary-hint__icon\" aria-hidden=\"true\">info</mat-icon>\r\n\r\n <div class=\"temporary-hint__content\">\r\n <p class=\"temporary-hint__message\">{{ message() }}</p>\r\n </div>\r\n\r\n @if (showDismiss()) {\r\n <button\r\n class=\"temporary-hint__dismiss\"\r\n (click)=\"dismiss()\"\r\n [attr.aria-label]=\"'Dismiss hint'\"\r\n mat-icon-button\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n}\r\n"],"names":["i2"],"mappings":"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"}
|