{"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/input/dataset-aware-form/src/dataset-aware-form.component.ts","../../../../../projects/components/widgets/input/dataset-aware-form/src/index.ts"],"sourcesContent":["import {Attribute, Inject, Injectable, Injector, OnDestroy, OnInit, Optional} from '@angular/core';\nimport {Subject} from 'rxjs';\nimport {$appDigest, AppDefaults, debounce, isDefined, isEqualWithFields, noop, toBoolean} from '@wm/core';\nimport { ALLFIELDS, convertDataToObject, DataSetItem, extractDataAsArray, getOrderedDataset, getUniqObjsByDataField, handleHeaderClick, toggleAllHeaders, transformFormData, transformDataWithKeys, groupData, ToDatePipe, IWidgetConfig, WidgetConfig } from '@wm/components/base';\nimport { BaseFormCustomComponent } from '@wm/components/input/base-form-custom';\nimport {debounce as _debounce, find, isArray, isEmpty, isEqual, isNull, isObject, toString} from \"lodash-es\";\n\n@Injectable()\nexport abstract class DatasetAwareFormComponent extends BaseFormCustomComponent implements OnInit, OnDestroy {\n    public dataset: any;\n    public datafield: string;\n    public displayfield: string;\n    public displaylabel: string;\n    public displayimagesrc: string;\n    public displayexpression: string;\n    public usekeys: boolean;\n    public orderby: string;\n    public multiple: boolean;\n    public readonly: boolean;\n    public content: string;\n    public collapsible: boolean;\n    public datePipe;\n\n    public handleHeaderClick: ($event) => void;\n    private toggleAllHeaders: void;\n    public appDefaults;\n\n    public binddisplayexpression: string;\n    public binddisplayimagesrc: string;\n    public binddisplaylabel: string;\n\n    public displayValue: Array<string> | string;\n\n    public datasetItems: DataSetItem[] = [];\n    public acceptsArray = false; // set to true if proxyModel on widget accepts array type.\n    protected dataset$ = new Subject();\n    protected datavalue$ = new Subject();\n\n    protected match: string;\n    protected dateformat: string;\n    public groupedData: any[];\n\n    protected _modelByKey: any;\n    public _modelByValue: any;\n    public _defaultQueryInvoked: boolean; // for search/chips if datavalue is obtained from the default n/w call then set to true and do not update the modelByKeys.\n\n    // this field contains the initial datavalue which needs to be processed once the dataset is available\n    public toBeProcessedDatavalue: any;\n    private readonly _debouncedInitDatasetItems: Function | null = null;\n    protected allowempty = true;\n    public compareby: any;\n\n    private cancelLocaleChangeSubscription;\n\n    public get modelByKey() {\n        return this._modelByKey;\n    }\n\n    // triggers on ngModel change. This function extracts the datavalue value.\n    public set modelByKey(val: any) {\n        this.selectByKey(val);\n\n        // invoke on datavalue change.\n        this.invokeOnChange(this._modelByValue);\n    }\n\n    // @ts-ignore\n    public get datavalue() {\n        return this._modelByValue;\n    }\n\n    // triggers on setting the datavalue. This function extracts the model value.\n    // @ts-ignore\n    public set datavalue(val: any) {\n        if (this.multiple) {\n            val = extractDataAsArray(val);\n        }\n        this._modelByValue = val;\n\n        this.selectByValue(val);\n\n        // changes on the datavalue can be subscribed using listenToDatavalue\n        this.datavalue$.next(val);\n\n        // invoke on datavalue change.\n        this.invokeOnChange(val, undefined, true);\n    }\n\n    protected constructor(inj: Injector,  @Inject(WidgetConfig) config: IWidgetConfig,\n                          @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any,\n                          @Attribute('groupby') public groupby?: string, initPromise?: Promise<any>) {\n        super(inj, config, explicitContext, initPromise);\n        this.datePipe = this.inj.get(ToDatePipe);\n        this.appDefaults = this.inj.get(AppDefaults);\n        this.binddisplayexpression = this.nativeElement.getAttribute('displayexpression.bind');\n        this.binddisplayimagesrc = this.nativeElement.getAttribute('displayimagesrc.bind');\n        this.binddisplaylabel = this.nativeElement.getAttribute('displaylabel.bind');\n\n        this._debouncedInitDatasetItems = debounce(() => {\n            this.initDatasetItems();\n            $appDigest();\n        }, 150);\n        this.handleHeaderClick = noop;\n\n        this.cancelLocaleChangeSubscription = this.getAppInstance().subscribe(\"locale-changed\", () => {\n            if (this._debouncedInitDatasetItems) {\n                this._debouncedInitDatasetItems();\n            }\n        });\n    }\n\n    /**\n     * This function sets the _datavalue value from the model and sets the selected flag when item is found.\n     * Here model is the value obtained from ngModel.\n     * @param keys represent the model.\n     */\n    protected selectByKey(keys) {\n        this.resetDatasetItems();\n\n        if (!this.datasetItems.length) {\n            return;\n        }\n\n        if (this.multiple && !isArray(keys)) {\n            keys = [keys];\n        }\n\n        // Set the _modelByKey to the modified keys.\n        this._modelByKey = keys;\n\n        if (this.multiple) {\n            this._modelByValue = [];\n            keys.forEach(key => {\n                const itemByKey = find(this.datasetItems, item => {\n                    // not triple equal, as the instance type can be different.\n                    // only value comparison should be done.\n                    return toString(item.key) === toString(key);\n                });\n                if (itemByKey) {\n                    itemByKey.selected = true;\n                    this._modelByValue = [...this._modelByValue, itemByKey.value];\n                }\n            });\n        } else {\n            this._modelByValue = '';\n            const itemByKey = find(this.datasetItems, item => {\n                // not triple equal, as the instance type can be different.\n                // only value comparison should be done.\n                return toString(item.key) === toString(keys);\n            });\n            if (itemByKey) {\n                itemByKey.selected = true;\n                this._modelByValue = itemByKey.value;\n            }\n        }\n        this.initDisplayValues();\n    }\n\n    /**\n     * This function sets the _model value from the datavalue (selectedvalues) and sets the selected flag when item is found.\n     * datavalue is the default value or a value representing the displayField (for suppose: object in case of ALLFIELDS).\n     * If acceptsArray is true, the model always accepts an array.\n     * For example, select always accepts model as array whether multiple select is true or false.\n     * @param values represent the datavalue.\n     */\n    protected selectByValue(values: Array<any> | any) {\n        this.resetDatasetItems();\n\n        // if datavalue is not defined or empty then set the model as undefined.\n        if (!isDefined(values) || values === '' || isNull(values) || (values instanceof Array && !values.length)) {\n            this._modelByKey = undefined;\n            // do not return when allowempty is set to true.\n            if (!this.allowempty || !isDefined(values)) {\n                return;\n            }\n        }\n\n        if (this.acceptsArray && !isArray(values)) {\n            values = this.allowempty ? [values] : extractDataAsArray(values);\n        }\n\n        // preserve the datavalue if datasetItems are empty.\n        if (!this.datasetItems.length && isDefined(values)) {\n            this.toBeProcessedDatavalue = values;\n            return;\n        }\n\n        const filterField = this.datafield === ALLFIELDS ? 'dataObject' : 'key';\n\n        if (isArray(values)) {\n            this._modelByKey = [];\n            values.forEach(val => {\n                const itemByValue = find(this.datasetItems, item => {\n                    if (filterField === 'dataObject') {\n                        if (this.compareby && this.compareby.length) {\n                            return isEqualWithFields(item[filterField], val, this.compareby);\n                        }\n                    }\n                    return (isObject(item.value) ? isEqual(item.value, val) : (toString(item.value)).toLowerCase() === (toString(val)).toLowerCase());\n                });\n                if (itemByValue) {\n                    itemByValue.selected = true;\n                    this._modelByKey.push(itemByValue.key);\n                }\n            });\n        } else {\n            this._modelByKey = undefined;\n            const itemByValue = find(this.datasetItems, item => {\n                if (filterField === 'dataObject') {\n                    if (this.compareby && this.compareby.length) {\n                        return isEqualWithFields(item[filterField], values, this.compareby);\n                    }\n                }\n                return (isObject(item.value) ? isEqual(item.value, values) : (toString(item.value)).toLowerCase() === (toString(values)).toLowerCase());\n            });\n            if (itemByValue) {\n                itemByValue.selected = true;\n                this._modelByKey = itemByValue.key;\n            }\n        }\n        // delaying the datavalue update as the widgets in liveform are having datavalue as undefined and not the default provided value\n        // because datavalue is updated later when new dataset is available.\n        this._debounceDatavalueUpdation(values);\n    }\n\n    protected readonly _debounceDatavalueUpdation = _debounce((values) => {\n        // if no item is found in datasetItems, wait untill the dataset updates by preserving the datavalue in toBeProcessedDatavalue.\n        if (!isDefined(this._modelByKey) || (isArray(this._modelByKey) && !this._modelByKey.length)) {\n            this.toBeProcessedDatavalue = values;\n            this._modelByValue = '';\n        } else if (isDefined(this.toBeProcessedDatavalue)) {\n            // obtain the first array value when multiple is set to false.\n            // set the modelByValue only when undefined.\n            if (!isDefined(this._modelByValue)) {\n                this._modelByValue = (!this.multiple && isArray(this.toBeProcessedDatavalue)) ? this.toBeProcessedDatavalue[0] : this.toBeProcessedDatavalue;\n            }\n            this.toBeProcessedDatavalue = undefined;\n        }\n\n        this.initDisplayValues();\n    }, 150);\n\n    // Updates the displayValue property.\n    protected initDisplayValues() {\n        const displayValues = [];\n        this.datasetItems.forEach(item => {\n            if (item.selected) {\n                displayValues.push(item.label);\n            }\n        });\n\n        this.displayValue = this.multiple ? displayValues : displayValues[0] || '';\n        if(this.viewParent.containerWidget && this.viewParent.containerWidget._isCustom)\n            this.viewParent.containerWidget.displayValue = this.displayValue.length ? this.displayValue : '';\n    }\n\n    // This function parses the dataset and extracts the displayOptions from parsed dataset.\n    protected initDatasetItems() {\n        if (!this.dataset || isEmpty(this.dataset)) {\n            this.datasetItems = [];\n            // notify the dataset listeners\n            this.dataset$.next(this.datasetItems);\n            return;\n        }\n\n        // convert any dataset to the object format.\n        const orderedDataset = getOrderedDataset(convertDataToObject(this.dataset), this.orderby);\n\n        if (this.usekeys) {\n            this.datasetItems = transformDataWithKeys(orderedDataset);\n        } else {\n            const displayOptions = transformFormData(this.viewParent, orderedDataset, this.datafield, {\n                displayField: this.displayfield || this.displaylabel,\n                displayExpr: this.displayexpression,\n                bindDisplayExpr: this.binddisplayexpression || this.binddisplaylabel,\n                bindDisplayImgSrc: this.binddisplayimagesrc,\n                displayImgSrc: this.displayimagesrc\n            });\n            // get the unique objects out of the extracted data. Notify change in datasetItems using [...datasetItems] notation\n            this.datasetItems = [...getUniqObjsByDataField(displayOptions, this.datafield, this.displayfield || this.displaylabel, toBoolean(this.allowempty))];\n        }\n\n        this.postDatasetItemsInit();\n    }\n\n    // Once the datasetItems are ready, set the proxyModel by using datavalue.\n    protected postDatasetItemsInit() {\n        if (this.datasetItems.length && !this._defaultQueryInvoked) {\n            // use the latest of toBeProcessedDatavalue, datavalue\n            const _datavalue = isEmpty(this.toBeProcessedDatavalue) ? this.datavalue : this.toBeProcessedDatavalue;\n            this.selectByValue(_datavalue);\n        }\n        // notify the dataset listeners\n        this.dataset$.next(this.datasetItems);\n    }\n\n    // Reset the selected flag on datasetItems to false.\n    protected resetDatasetItems() {\n        this.datasetItems.forEach(item => item.selected = false);\n    }\n\n    protected setTemplate(partialName) {\n        this.content = partialName;\n        if (this.viewParent && this.viewParent.prefabName) {\n            this['prefabName'] = this.viewParent.prefabName;\n        }\n    }\n\n\n    private getGroupedData() {\n        return this.datasetItems.length ? groupData(this, convertDataToObject(this.datasetItems), this.groupby, this.match, this.orderby, this.dateformat, this.datePipe, 'dataObject', this.appDefaults) : [];\n    }\n\n    private datasetSubscription() {\n        const datasetSubscription = this.dataset$.subscribe(() => {\n            this.groupedData = this.getGroupedData();\n        });\n        this.registerDestroyListener(() => datasetSubscription.unsubscribe());\n    }\n\n    protected setGroupData() {\n        this.datasetSubscription();\n        // If groupby is set, get the groupedData from the datasetItems.\n        this.groupedData = this.getGroupedData();\n    }\n\n\n    onPropertyChange(key: string, nv: any, ov?: any) {\n        super.onPropertyChange(key, nv, ov);\n        switch (key) {\n            case 'dataset':\n            case 'datafield':\n            case 'displayfield':\n            case 'displaylabel':\n            case 'displayexpression':\n            case 'orderby':\n            case 'usekeys':\n                if (this._debouncedInitDatasetItems) {\n                    this._debouncedInitDatasetItems();\n                }\n                break;\n            case 'required':\n            case 'datavalue':\n                this._onChange(this.datavalue);\n                break;\n            case 'groupby':\n            case 'match':\n                if (this.widgetType !== 'wm-search' && this.widgetType !== 'wm-chips') {\n                    this.setGroupData();\n                }\n            break;\n        }\n    }\n\n    ngOnInit() {\n        super.ngOnInit();\n        if (this.groupby && (this.widgetType !== 'wm-search' && this.widgetType !== 'wm-chips')) {\n            this.setGroupData();\n        }\n        // adding the handler for header click and toggle headers.\n        if (this.groupby && this.collapsible) {\n            this.handleHeaderClick = handleHeaderClick;\n            this.toggleAllHeaders = toggleAllHeaders.bind(undefined, this);\n        }\n    }\n\n    ngOnDestroy() {\n        if(this.cancelLocaleChangeSubscription) {\n            this.cancelLocaleChangeSubscription();\n        }\n\n        // MEMORY LEAK FIX: Complete and clear Subject observables\n        if (this.dataset$) {\n            this.dataset$.complete();\n        }\n        if (this.datavalue$) {\n            this.datavalue$.complete();\n        }\n\n        // MEMORY LEAK FIX: Clear datasetItems array\n        this.datasetItems = [];\n\n        // MEMORY LEAK FIX: Clear grouped data\n        if (this.groupedData) {\n            this.groupedData = [];\n        }\n\n        // MEMORY LEAK FIX: Clear model references\n        this._modelByKey = null;\n        this._modelByValue = null;\n        this.toBeProcessedDatavalue = null;\n\n        // Call parent ngOnDestroy\n        super.ngOnDestroy();\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["_debounce","debounce"],"mappings":"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"}