{"version":3,"sources":["hicomExternalFilter.ts"],"names":["HicomExternalFilter","DATE_ONLY_FORMAT_STRING","DATETIME_FORMAT_STRING","TIME_ONLY_FORMAT_STRING","NUMBER_DECIMALS_PREFIX_FORMAT_STRING","SYSTEM_MULTISELECT_MAX_DISPLAY_ITEMS","SYSTEM_MULTISELECT_TEXT_DELIMITER","String","fromCharCode","BLANK_FILTER_FIELD","EXTERNAL_FILTER_OPERATORS","singleselectdropdown","eq","neq","isnullorempty","isnotnullorempty","multiselectdropdown","contains","doesnotcontain","string","startswith","endswith","boolean","number","gt","gte","lt","lte","datetime","date","time","_AdvancedFilterExternalId","_$AdvancedFilterExternal","_Operators","_Fields","_advancedFilterExternal","_AdvancedFilterPreviewFieldName","_AdvancedFilterExpressionFieldName","_AdvancedFilterDirtyTrackerFieldName","_AdvancedFilterSortFieldName","_AdvancedFilterGroupFieldName","_AdvancedFilterFilterFieldName","_AdvancedFilterMainLogic","constructor","advancedFilterExternalId","operators","fields","previewFieldName","expressionFieldName","dirtyTrackerFieldName","sortFieldName","groupFieldName","filterFieldName","mainLogic","this","$","kendoFilter","expressionPreview","data","SetStoredExpression","storedExpression","_updateDateTimeParametersFiltersForLoad","setOptions","expression","_serializeObject","form","o","a","serializeArray","each","undefined","name","push","value","SingleSelectLookupDropDownEditor","container","options","let","field","lookupKey","getOptions","find","f","lookupName","dataSource","kendo","DataSource","serverFiltering","transport","read","type","url","hicomPage","BaseUrl","sqlParams","appendTo","kendoDropDownList","dataTextField","dataValueField","valuePrimitive","filter","autobind","SingleSelectListDropDownEditor","lookupValues","map","Text","item","Value","length","unshift","MultiSelectLookupDropDownEditor","kendoMultiSelect","tagMode","autoClose","dataBound","e","emptyEntry","sender","remove","change","selectedValues","currentTagMode","newTagMode","MultiSelectListDropDownEditor","DateOnlyEditor","kendoDatePicker","DateTimeEditor","kendoDateTimePicker","TimeOnlyEditor","kendoTimePicker","NumberEditor","numberPrecision","kendoNumericTextBox","decimals","format","UpdateExternalFilterForDisplay","_updateDateTimeParametersFiltersForSave","_previewContainer","text","val","JSON","stringify","element","html","trigger","UpdateExternalFilterForSave","ajaxDataSource","serverPaging","dataSourceRequestParameters","_updateMultiSelectParametersFiltersForSave","parameterMap","filterModel","toJSON","sort","group","advancedFilter","that","filters","forEach","_updateDateTimeParameterFilterForLoad","fieldData","luxon","DateTime","fromFormat","toJSDate","_updateDateTimeParameterFilterForSave","fromJSDate","toFormat","_updateMultiSelectParameterFilterForSave","join","GetExternalFilterKendoDataSource","formId","fieldDataCopy","parse","filterModelCopy","filterJson","_convertParametersForPreview","_validateAdvancedFilterSelections","$ValidationSummary","filterArray","hide","isValid","errorList","addClass","removeClass","i","append","index","fieldName","logic","uid","outerText","indexOf","split","operator","show","ValidateAdvancedFilterSelections","fieldModel","_convertParameterForPreview","fromISO"],"mappings":"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","file":"hicomExternalFilter.js","sourcesContent":["/// \r\n/// \r\n\r\n/** \r\n* Hicom External Filter that wraps Kendo Filter\r\n*/\r\nclass HicomExternalFilter implements IHicomExternalFilter {\r\n\r\n // Persist format for dateonly as ISO\r\n public static DATE_ONLY_FORMAT_STRING: string = 'yyyy-MM-dd';\r\n\r\n // Persist format for datetime as ISO\r\n public static DATETIME_FORMAT_STRING: string = 'yyyy-MM-dd HH:mm';\r\n\r\n // Persist format for timeonly as ISO\r\n public static TIME_ONLY_FORMAT_STRING: string = 'HH:mm';\r\n\r\n // UI format for integers\r\n public static NUMBER_DECIMALS_PREFIX_FORMAT_STRING: string = 'n';\r\n\r\n // Max. number items to display in multi-select before collapsing to summary\r\n public static SYSTEM_MULTISELECT_MAX_DISPLAY_ITEMS = 5;\r\n\r\n public static SYSTEM_MULTISELECT_TEXT_DELIMITER: string = String.fromCharCode(31); // ASCII Unit Separator (US)\r\n\r\n public static BLANK_FILTER_FIELD = '_';\r\n\r\n /*\r\n - Is equal to\r\n - Is not equal to\r\n - Is after or equal to\r\n - Is after\r\n - Is before or equal to\r\n - Is before\r\n - Is Null\r\n - Is not Null\r\n */\r\n /**\r\n * Default supported operators per external column type - note while we can specify new 'types' without changing the core Kendo UI code, we can't do the same for operator types\r\n * So these currently WONT BE GLOBALISED\r\n */\r\n public static EXTERNAL_FILTER_OPERATORS: kendo.ui.FilterOperators = {\r\n singleselectdropdown: {\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n multiselectdropdown: {\r\n contains: 'Has any of',\r\n doesnotcontain: 'Has none of',\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n string: {\r\n contains: 'Contains',\r\n startswith: 'Starts with',\r\n endswith: 'Ends with',\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n boolean: {\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n // @ts-ignore\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n number: {\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n gt: 'Is greater than',\r\n gte: 'Is greater than or equal to',\r\n lt: 'Is less than',\r\n lte: 'Is less than or equal to',\r\n // @ts-ignore\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n datetime: {\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n gt: 'Is after',\r\n gte: 'Is after or equal to',\r\n lt: 'Is before',\r\n lte: 'Is before or equal to',\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n date: {\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n gt: 'Is after',\r\n gte: 'Is after or equal to',\r\n lt: 'Is before',\r\n lte: 'Is before or equal to',\r\n // @ts-ignore\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n },\r\n time: {\r\n eq: 'Is equal to',\r\n neq: 'Is not equal to',\r\n gt: 'Is after',\r\n gte: 'Is after or equal to',\r\n lt: 'Is before',\r\n lte: 'Is before or equal to',\r\n isnullorempty: \"Is null\",\r\n isnotnullorempty: \"Is not null\"\r\n\r\n }\r\n \r\n };\r\n\r\n /**\r\n * Id of the Kendo Filter\r\n */\r\n public _AdvancedFilterExternalId: string;\r\n\r\n /**\r\n * Kendo Filter \r\n */\r\n public _$AdvancedFilterExternal: JQuery;\r\n\r\n /**\r\n * Operator configuration - supplied externally\r\n */\r\n public _Operators: kendo.ui.FilterOperators;\r\n\r\n /**\r\n * Field configuration - supplied externally\r\n */\r\n public _Fields: kendo.ui.FilterField[];\r\n\r\n /**\r\n * Instance of the Kendo Filter itself\r\n */\r\n public _advancedFilterExternal: kendo.ui.Filter;\r\n\r\n /**\r\n * Name of the persisted field in the DM that contains the preview text\r\n */\r\n public _AdvancedFilterPreviewFieldName: string;\r\n\r\n /**\r\n * Name of the persisted field in the DM that contains the expression text\r\n */\r\n public _AdvancedFilterExpressionFieldName: string;\r\n\r\n /**\r\n * Name of the persisted field in the DM that acts as a 'dirty' tracker\r\n */\r\n public _AdvancedFilterDirtyTrackerFieldName: string;\r\n\r\n /**\r\n * Name of the persisted field that carries the 'sort' parameters\r\n */\r\n public _AdvancedFilterSortFieldName: string;\r\n\r\n /**\r\n * Name of the persisted field that carries the 'group' parameters\r\n */\r\n public _AdvancedFilterGroupFieldName: string;\r\n\r\n /**\r\n * Name of the persisted field that carries the 'filter' parameters\r\n */\r\n _AdvancedFilterFilterFieldName: string;\r\n\r\n _AdvancedFilterMainLogic: string;\r\n\r\n /**\r\n * Ctor\r\n * @param advancedFilterExternalId\r\n * @param operators\r\n * @param fields\r\n * @param previewFieldName\r\n * @param expressionFieldName\r\n * @param dirtyTrackerFieldName\r\n * @param sortFieldName - Kendo DataSourceRequest internal serialization parameter - leave as default of 'sort' unless you sub-class the Kendo class in the controller\r\n * @param groupFieldName - Kendo DataSourceRequest internal serialization parameter - leave as default of 'group' unless you sub-class the Kendo class in the controller\r\n * @param filterFieldName - Kendo DataSourceRequest internal serialization parameter - leave as default of 'filter' unless you sub-class the Kendo class in the controller\r\n * @param mainLogic - default is 'and'\r\n */\r\n constructor(advancedFilterExternalId: string, operators: kendo.ui.FilterOperators, fields: kendo.ui.FilterField[], previewFieldName: string, expressionFieldName: string, dirtyTrackerFieldName: string, sortFieldName: string = 'sort', groupFieldName: string = 'group', filterFieldName: string = 'filter', mainLogic: string = 'and') {\r\n this._AdvancedFilterExternalId = advancedFilterExternalId;\r\n this._$AdvancedFilterExternal = $(`#${this._AdvancedFilterExternalId}`);\r\n\r\n this._AdvancedFilterPreviewFieldName = previewFieldName;\r\n this._AdvancedFilterExpressionFieldName = expressionFieldName;\r\n this._AdvancedFilterDirtyTrackerFieldName = dirtyTrackerFieldName;\r\n this._AdvancedFilterSortFieldName = sortFieldName;\r\n this._AdvancedFilterGroupFieldName = groupFieldName;\r\n this._AdvancedFilterFilterFieldName = filterFieldName;\r\n this._AdvancedFilterMainLogic = mainLogic;\r\n\r\n this._Operators = operators;\r\n this._Fields = fields;\r\n\r\n this._advancedFilterExternal = this._$AdvancedFilterExternal.kendoFilter({\r\n mainLogic: this._AdvancedFilterMainLogic,\r\n expressionPreview: true,\r\n fields: this._Fields,\r\n operators: this._Operators,\r\n }).data('kendoFilter');\r\n }\r\n\r\n /**\r\n * Set the DM stored expression\r\n * @param storedExpression\r\n */\r\n public SetStoredExpression(storedExpression: object) {\r\n // @ts-ignore\r\n this._updateDateTimeParametersFiltersForLoad(this._advancedFilterExternal, storedExpression);\r\n\r\n // @ts-ignore\r\n this._advancedFilterExternal.setOptions({ expression: storedExpression });\r\n }\r\n\r\n /**\r\n * Convert the form to object\r\n * @param form\r\n */\r\n private _serializeObject(form) {\r\n var o = {};\r\n var a = form.serializeArray();\r\n $.each(a, function () {\r\n if (o[this.name] !== undefined) {\r\n if (!o[this.name].push) {\r\n o[this.name] = [o[this.name]];\r\n }\r\n o[this.name].push(this.value || '');\r\n } else {\r\n o[this.name] = this.value || '';\r\n }\r\n });\r\n return o;\r\n }\r\n\r\n /**\r\n * \r\n * @param container\r\n * @param options\r\n */\r\n public SingleSelectLookupDropDownEditor(container: JQuery, options: object):void {\r\n // @ts-ignore\r\n let field = options.field;\r\n // @ts-ignore\r\n let lookupKey = this._advancedFilterExternal.getOptions().fields.find(f => f.name == options.field).lookupName;\r\n\r\n let dataSource = new kendo.data.DataSource({\r\n serverFiltering: false,\r\n transport: {\r\n read: {\r\n type: 'POST',\r\n // @ts-ignore\r\n url: `${hicomPage.BaseUrl}/WebApi/LookupData/DataGet`,\r\n data: {\r\n lookupKey: lookupKey,\r\n sqlParams: '{}'\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Kendo single select drop down with 'contains' filter itself\r\n $(``)\r\n .appendTo(container)\r\n .kendoDropDownList({\r\n dataTextField: 'Text',\r\n dataValueField: 'Text',\r\n valuePrimitive: true,\r\n dataSource: dataSource,\r\n filter: 'contains',\r\n // @ts-ignore\r\n autobind: true\r\n });\r\n }\r\n\r\n /**\r\n * Single select drop down with custom list itmes\r\n * @param container\r\n * @param options\r\n */\r\n public SingleSelectListDropDownEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n // @ts-ignore\r\n let data = this._advancedFilterExternal.getOptions().fields.find(f => f.name == options.field).lookupValues.map((item) => ({ Text: item, Value: item }));\r\n\r\n // Add blank entry if one doesn't exist already\r\n if (data.length > 0) {\r\n if (data[0].Value != \"\") {\r\n data.unshift({ Text: \"\", Value: \"\" });\r\n }\r\n }\r\n\r\n let dataSource = new kendo.data.DataSource({ data: data });\r\n\r\n $(``)\r\n .appendTo(container)\r\n .kendoDropDownList({\r\n dataTextField: 'Text',\r\n dataValueField: 'Text',\r\n valuePrimitive: true,\r\n dataSource: dataSource,\r\n filter: 'contains',\r\n // @ts-ignore\r\n autobind: true\r\n });\r\n }\r\n\r\n /**\r\n * \r\n * @param container\r\n * @param options\r\n */\r\n public MultiSelectLookupDropDownEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n // @ts-ignore\r\n let lookupKey = this._advancedFilterExternal.getOptions().fields.find(f => f.name == options.field).lookupName;\r\n\r\n let dataSource = new kendo.data.DataSource({\r\n serverFiltering: false,\r\n transport: {\r\n read: {\r\n type: 'POST',\r\n // @ts-ignore\r\n url: `${hicomPage.BaseUrl}/WebApi/LookupData/DataGet`,\r\n data: {\r\n lookupKey: lookupKey,\r\n sqlParams: '{}'\r\n }\r\n }\r\n }\r\n });\r\n\r\n let kendoMultiSelect = $(``)\r\n .appendTo(container)\r\n .kendoMultiSelect({\r\n dataTextField: 'Text',\r\n dataValueField: 'Text',\r\n filter: 'contains',\r\n tagMode: 'multiple',\r\n valuePrimitive: true,\r\n dataSource: dataSource,\r\n // @ts-ignore\r\n autobind: true,\r\n autoClose: false,\r\n dataBound: function (e) {\r\n // @ts-ignore\r\n let emptyEntry = e.sender.dataSource.data().find(a => a.Text === \"\");\r\n\r\n if (typeof emptyEntry !== 'undefined') {\r\n e.sender.dataSource.remove(emptyEntry);\r\n }\r\n },\r\n change: function(e) {\r\n var selectedValues = this.value();\r\n var currentTagMode = this.options.tagMode;\r\n var newTagMode = currentTagMode;\r\n if (selectedValues.length <= HicomExternalFilter.SYSTEM_MULTISELECT_MAX_DISPLAY_ITEMS) {\r\n newTagMode = 'multiple';\r\n } else {\r\n newTagMode = 'single'\r\n }\r\n if (newTagMode != currentTagMode) {\r\n this.value([])\r\n this.setOptions({\r\n tagMode: newTagMode\r\n });\r\n this.value(selectedValues);\r\n }\r\n }\r\n }).data('kendoMultiSelect');\r\n }\r\n\r\n /**\r\n * \r\n * @param container\r\n * @param options\r\n */\r\n public MultiSelectListDropDownEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n // @ts-ignore\r\n let data = this._advancedFilterExternal.getOptions().fields.find(f => f.name == options.field).lookupValues.map((item) => ({ Text: item, Value: item }));\r\n\r\n let dataSource = new kendo.data.DataSource({ data: data });\r\n\r\n let kendoMultiSelect = $(``)\r\n .appendTo(container)\r\n .kendoMultiSelect({\r\n dataTextField: 'Text',\r\n dataValueField: 'Text',\r\n filter: 'contains',\r\n tagMode: 'multiple',\r\n valuePrimitive: true,\r\n dataSource: dataSource,\r\n // @ts-ignore\r\n autobind: true,\r\n autoClose: false,\r\n change: function(e) {\r\n var selectedValues = this.value();\r\n var currentTagMode = this.options.tagMode;\r\n var newTagMode = currentTagMode;\r\n if (selectedValues.length <= HicomExternalFilter.SYSTEM_MULTISELECT_MAX_DISPLAY_ITEMS) {\r\n newTagMode = 'multiple';\r\n } else {\r\n newTagMode = 'single'\r\n }\r\n if (newTagMode != currentTagMode) {\r\n this.value([])\r\n this.setOptions({\r\n tagMode: newTagMode\r\n });\r\n this.value(selectedValues);\r\n }\r\n }\r\n }).data('kendoMultiSelect');\r\n }\r\n\r\n /**\r\n * Date only editor\r\n * @param container\r\n * @param options\r\n */\r\n public DateOnlyEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n\r\n let kendoDatePicker = $(``)\r\n .appendTo(container)\r\n .kendoDatePicker().data('kendoDatePicker');\r\n }\r\n\r\n /**\r\n * Date & time editor\r\n * @param container\r\n * @param options\r\n */\r\n public DateTimeEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n\r\n let kendoDateTimePicker = $(``)\r\n .appendTo(container)\r\n .kendoDateTimePicker().data('kendoDateTimePicker');\r\n }\r\n\r\n /**\r\n * TimeOnly editor\r\n * @param container\r\n * @param options\r\n */\r\n public TimeOnlyEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n\r\n let kendoTimePicker = $(``)\r\n .appendTo(container)\r\n .kendoTimePicker().data('kendoTimePicker');\r\n }\r\n\r\n /**\r\n * \r\n * @param container\r\n * @param options\r\n */\r\n public NumberEditor(container: JQuery, options: object): void {\r\n // @ts-ignore\r\n let field = options.field;\r\n // @ts-ignore\r\n let numberPrecision = this._advancedFilterExternal.getOptions().fields.find(f => f.name == options.field).numberPrecision ?? 0;\r\n\r\n let kendoNumericTextBox = $(``)\r\n .appendTo(container)\r\n .kendoNumericTextBox({\r\n decimals: numberPrecision,\r\n format: `${HicomExternalFilter.NUMBER_DECIMALS_PREFIX_FORMAT_STRING}${numberPrecision}`\r\n }).data('kendoNumericTextBox');\r\n }\r\n\r\n /**\r\n * When the filter changes, ensure that the persistable fields are kept up-to-date and that the pseudo dirty tracker is also changed\r\n * @param e\r\n */\r\n public UpdateExternalFilterForDisplay(e: kendo.ui.FilterChangeEvent): void {\r\n\r\n // Recursively convert any DateOnly and / or TimeOnly to their string representations - use the loaded field data as this contains metadata so we know it's business 'type'\r\n // @ts-ignore\r\n this._updateDateTimeParametersFiltersForSave(this._advancedFilterExternal);\r\n // @ts-ignore\r\n let thisPreview = e.sender._previewContainer.text();\r\n\r\n // Update form elements with LIVE filter values\r\n // Added fix to avoid _AdvancedFilterPreviewFieldName being set to '\"\"' when empty\r\n if (thisPreview.length > 0) {\r\n // @ts-ignore\r\n $(`input[name=${this._AdvancedFilterPreviewFieldName}]`).val(JSON.stringify(e.sender._previewContainer.text()));\r\n } else {\r\n $(`input[name=${this._AdvancedFilterPreviewFieldName}]`).val('');\r\n }\r\n\r\n // @ts-ignore\r\n $(`input[name=${this._AdvancedFilterExpressionFieldName}]`).val(JSON.stringify(e.sender.getOptions().expression));\r\n\r\n // Copy the raw expression hash to a hidden field so that the dirty forms tracking can be privy to any changes even of the overall filter model doesn't change\r\n $(`input[name=${this._AdvancedFilterDirtyTrackerFieldName}]`).val(e.sender.element.find('.k-filter-preview').html()).trigger('change');\r\n\r\n }\r\n\r\n /**\r\n * IMPORTANT: Deep copy the filter values so we can use the DataSource request for whatever we need it for - NOTE we appear to be DRY violating - but we need to do things in a slightly different order\r\n */\r\n public UpdateExternalFilterForSave(): void {\r\n // Ajax dataSource needed to allow easy interoperability with MVC controllers and [DataSourceRequest]\r\n let ajaxDataSource = new kendo.data.DataSource({\r\n type: \"aspnetmvc-ajax\",\r\n transport: {\r\n read: {\r\n },\r\n },\r\n serverPaging: true\r\n });\r\n\r\n // Recursively convert any DateOnly and / or TimeOnly to their string representations - use the loaded field data as this contains metadata so we know it's business 'type'\r\n // @ts-ignore\r\n this._updateDateTimeParametersFiltersForSave(this._advancedFilterExternal);\r\n\r\n // Update form elements with LIVE filter values(now we changed various formats such as DateOnly and TimeOnly into strings)\r\n // @ts-ignore\r\n $(`input[name=${this._AdvancedFilterPreviewFieldName}]`).val(JSON.stringify(this._advancedFilterExternal._previewContainer.text()));\r\n // @ts-ignore\r\n $(`input[name=${this._AdvancedFilterExpressionFieldName}]`).val(JSON.stringify(this._advancedFilterExternal.getOptions().expression));\r\n\r\n // Recursively convert any muliselect values to ASCII record delimited format - use the loaded field data as this contains metadata so we know it's business 'type' - so ['One', 'Two'] would become OneX\\0fTwo etc. DO THIS AFTER WE'VE UPDATED THE PREVIEW ETC. '\r\n // @ts-ignore\r\n this._updateMultiSelectParametersFiltersForSave(this._advancedFilterExternal);\r\n\r\n // Convert the entire filter to a '[DataSourceRequest] DataSourceRequest filter' parameter - turns the filter into the 'field~operator~value' format\r\n // @ts-ignore\r\n let dataSourceRequestParameters = ajaxDataSource.transport.parameterMap({\r\n // @ts-ignore\r\n filter: this._advancedFilterExternal.filterModel.toJSON()\r\n });\r\n\r\n // Update POSTed model properties - these technically are NOT part of the DM but are required for the Kendo DataSourceRequest\r\n $(`input[name=${this._AdvancedFilterSortFieldName}]`).val(dataSourceRequestParameters.sort);\r\n $(`input[name=${this._AdvancedFilterGroupFieldName}]`).val(dataSourceRequestParameters.group);\r\n $(`input[name=${this._AdvancedFilterFilterFieldName}]`).val(dataSourceRequestParameters.filter);\r\n }\r\n\r\n /**\r\n * Convert the DateOnly, DateTime and TimeOnly field types into a format suitable for loading (convert ISO date to native date)\r\n * @param advancedFilter\r\n * @param storedExpression\r\n */\r\n private _updateDateTimeParametersFiltersForLoad(advancedFilter: kendo.ui.Filter, storedExpression: object) {\r\n let that = this;\r\n // @ts-ignore\r\n if (typeof storedExpression.filters !== 'undefined') {\r\n // @ts-ignore\r\n storedExpression.filters.forEach(function (f) {\r\n that._updateDateTimeParameterFilterForLoad(advancedFilter, f);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Recusive call the DateOnly, DateTime and TimeOnly field types conversion when loading (ISO -> native date)\r\n * @param advancedFilter\r\n * @param filter\r\n */\r\n private _updateDateTimeParameterFilterForLoad(advancedFilter: kendo.ui.Filter, filter: any) {\r\n let that = this;\r\n if (typeof filter.filters !== 'undefined') {\r\n filter.filters.forEach(function (f) {\r\n that._updateDateTimeParameterFilterForLoad(advancedFilter, f);\r\n });\r\n }\r\n else if (typeof filter.field !== 'undefined') {\r\n // @ts-ignore\r\n let fieldData = advancedFilter.getOptions().fields.find(f => f.name === filter.field);\r\n if (fieldData) {\r\n switch (fieldData.type) {\r\n case 'date':\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromFormat(filter.value, HicomExternalFilter.DATE_ONLY_FORMAT_STRING).toJSDate();\r\n break;\r\n case 'datetime':\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromFormat(filter.value, HicomExternalFilter.DATETIME_FORMAT_STRING).toJSDate();\r\n break;\r\n case 'time':\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromFormat(filter.value, HicomExternalFilter.TIME_ONLY_FORMAT_STRING).toJSDate();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert the DateOnly, DateTime and TimeOnly field types into a format suitable for saving (convert native date to ISO date)\r\n * @param advancedFilter\r\n */\r\n private _updateDateTimeParametersFiltersForSave(advancedFilter: kendo.ui.Filter) {\r\n let that = this;\r\n // @ts-ignore\r\n if (typeof advancedFilter.filterModel !== 'undefined' && typeof advancedFilter.filterModel.filters !== 'undefined') {\r\n // @ts-ignore\r\n advancedFilter.filterModel.filters.forEach(function (f) {\r\n that._updateDateTimeParameterFilterForSave(advancedFilter, f);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Recusive call the DateOnly, DateTime and TimeOnly field types conversion - internally filter needs to operate in the native date captured (also used in the preview)\r\n * @param advancedFilter\r\n * @param filter\r\n */\r\n private _updateDateTimeParameterFilterForSave(advancedFilter: kendo.ui.Filter, filter: any) {\r\n let that = this;\r\n if (typeof filter.filters !== 'undefined') {\r\n filter.filters.forEach(function (f) {\r\n that._updateDateTimeParameterFilterForSave(advancedFilter, f);\r\n });\r\n }\r\n else if (typeof filter.field !== 'undefined') {\r\n // @ts-ignore\r\n let fieldData = advancedFilter.getOptions().fields.find(f => f.name === filter.field);\r\n if (fieldData) {\r\n switch (fieldData.type) {\r\n case 'date':\r\n if (typeof filter.value === 'object') {\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromJSDate(filter.value).toFormat(HicomExternalFilter.DATE_ONLY_FORMAT_STRING);\r\n }\r\n break;\r\n case 'datetime':\r\n if (typeof filter.value === 'object') {\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromJSDate(filter.value).toFormat(HicomExternalFilter.DATETIME_FORMAT_STRING);\r\n }\r\n break;\r\n case 'time':\r\n if (typeof filter.value === 'object') {\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromJSDate(filter.value).toFormat(HicomExternalFilter.TIME_ONLY_FORMAT_STRING);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert the MultiSelect field type into a formformat suitable for persisting\r\n * @param advancedFilter\r\n */\r\n private _updateMultiSelectParametersFiltersForSave(advancedFilter: kendo.ui.Filter) {\r\n let that = this;\r\n // @ts-ignore\r\n if (typeof advancedFilter.filterModel !== 'undefined') {\r\n // @ts-ignore\r\n advancedFilter.filterModel.filters.forEach(function (f) {\r\n that._updateMultiSelectParameterFilterForSave(advancedFilter, f);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Recusive call the MultiSelect field type conversion\r\n * @param advancedFilter\r\n * @oaram filter\r\n */\r\n private _updateMultiSelectParameterFilterForSave(advancedFilter: kendo.ui.Filter, filter: any) {\r\n let that = this;\r\n if (typeof filter.filters !== 'undefined') {\r\n filter.filters.forEach(function (f) {\r\n that._updateMultiSelectParameterFilterForSave(advancedFilter, f);\r\n });\r\n }\r\n else if (typeof filter.field !== 'undefined') {\r\n // @ts-ignore\r\n let fieldData = advancedFilter.getOptions().fields.find(f => f.name === filter.field);\r\n if (fieldData) {\r\n switch (fieldData.type) {\r\n case 'multiselectdropdown':\r\n if (typeof filter.value === 'object') {\r\n filter.value = filter.value.join(HicomExternalFilter.SYSTEM_MULTISELECT_TEXT_DELIMITER);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get Kendo DataSource payload for calling POST controller methods with the [DataSourceRequest] parameter\r\n */\r\n public GetExternalFilterKendoDataSource(formId: string): object {\r\n\r\n // Ajax dataSource needed to allow easy interoperability with MVC controllers and [DataSourceRequest]\r\n let ajaxDataSource = new kendo.data.DataSource({\r\n type: \"aspnetmvc-ajax\",\r\n transport: {\r\n read: {\r\n },\r\n },\r\n serverPaging: true\r\n });\r\n\r\n // @ts-ignore\r\n let fieldDataCopy = JSON.parse(JSON.stringify(this._advancedFilterExternal.getOptions().fields));\r\n // @ts-ignore\r\n let filterModelCopy = JSON.parse(JSON.stringify(this._advancedFilterExternal.filterModel));;\r\n\r\n // Convert any multiselect filter values to ASCII record delimited string - use the loaded field data as this contains metadata so we know it's business 'type' - so ['One', 'Two'] would become OneX\\0fTwo etc. \r\n this._convertParametersForPreview(fieldDataCopy, filterModelCopy);\r\n\r\n // Convert the entire filter to a '[DataSourceRequest] DataSourceRequest filter' parameter - turns the filter into the 'field~operator~value' format\r\n let filterJson = JSON.parse(JSON.stringify(filterModelCopy));\r\n // @ts-ignore\r\n let dataSourceRequestParameters = ajaxDataSource.transport.parameterMap({\r\n filter: filterJson\r\n });\r\n\r\n // Combined the Ajax DataSourceRequest fields with the DM fields so they are transmitable as one unit\r\n let formFields = this._serializeObject($(`#${formId}`));\r\n formFields = { ...formFields, ...dataSourceRequestParameters };\r\n\r\n return formFields;\r\n }\r\n\r\n /* Simple validation called on the filters */\r\n private _validateAdvancedFilterSelections($ValidationSummary: object, filterArray: Array): boolean {\r\n\r\n // @ts-ignore\r\n //let filterArray = this._advancedFilterExternal.filterModel.filters;\r\n // @ts-ignore\r\n $ValidationSummary.hide();\r\n let isValid = true;\r\n let that = this;\r\n\r\n if (filterArray == undefined || filterArray.length == 0) { return isValid; }\r\n\r\n // @ts-ignore\r\n let errorList = $ValidationSummary.find('ul');\r\n errorList.find('li').remove();\r\n // @ts-ignore\r\n $ValidationSummary.addClass('validation-summary-valid').removeClass('validation-summary-errors');\r\n\r\n //loop from 0 index until we have an error\r\n for (var i = 0; i < filterArray.length; i++) {\r\n\r\n if (filterArray[i].field == HicomExternalFilter.BLANK_FILTER_FIELD) {\r\n errorList.append(\"
All defined filters must have a valid field selected.
\");\r\n isValid = false;\r\n break;\r\n }\r\n\r\n }\r\n\r\n filterArray.forEach(function (filter, index) {\r\n\r\n // If we are a logic field then call ValidateFilterSelections\r\n if (filter.logic !== undefined && filterArray[2].filters) {\r\n isValid = that._validateAdvancedFilterSelections($ValidationSummary, filter.filters)\r\n }\r\n else {\r\n // If a field is selected validate value\r\n if ($('#' + filter.uid + '')[0].outerText.indexOf('\\n') > -1) {\r\n\r\n let fieldName = $('#' + filter.uid + '')[0].outerText.split('\\n')[0]\r\n\r\n if ((filter.operator !== \"isnotnullorempty\" && filter.operator !== \"isnullorempty\") && (filter.value === undefined || filter.value === null)) {\r\n errorList.append(\"
\" + fieldName + \" must have a value.
\");\r\n isValid = false;\r\n }\r\n }\r\n }\r\n\r\n \r\n });\r\n\r\n if (!isValid) {\r\n // @ts-ignore\r\n $ValidationSummary.addClass('validation-summary-errors').show();\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n public ValidateAdvancedFilterSelections($ValidationSummary: object, filterArray: Array): boolean {\r\n\r\n let that = this;\r\n return that._validateAdvancedFilterSelections($ValidationSummary, filterArray);\r\n }\r\n\r\n /**\r\n * Convert the filter model into form suitable for previewing\r\n * @param fieldModel\r\n * @param filterModel\r\n */\r\n private _convertParametersForPreview(fieldModel: any, filterModel: any) {\r\n let that = this;\r\n // @ts-ignore\r\n if (typeof filterModel.filters !== 'undefined') {\r\n // @ts-ignore\r\n filterModel.filters.forEach(function (f) {\r\n that._convertParameterForPreview(fieldModel, f);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Convert the DateOnly, DateTime, TimeOnly and MultiSelect field types into a format suitable for previewing\r\n * @param fieldModel\r\n * @param filter\r\n */\r\n private _convertParameterForPreview(fieldModel: any, filter: any) {\r\n let that = this;\r\n if (typeof filter.filters !== 'undefined') {\r\n filter.filters.forEach(function (f) {\r\n that._convertParameterForPreview(fieldModel, f);\r\n });\r\n }\r\n else if(typeof filter.field !== 'undefined') {\r\n let fieldData = fieldModel.find(f => f.name === filter.field);\r\n if (fieldData) {\r\n switch (fieldData.type) {\r\n case 'date':\r\n // @ts-ignore\r\n if (typeof filter.value === 'string') {\r\n // @ts-ignore\r\n if (luxon.DateTime.fromISO(filter.value).isValid) {\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromISO(filter.value).toFormat(HicomExternalFilter.DATE_ONLY_FORMAT_STRING);\r\n }\r\n }\r\n break;\r\n case 'datetime':\r\n // @ts-ignore\r\n if (typeof filter.value === 'string') {\r\n // @ts-ignore\r\n if (luxon.DateTime.fromISO(filter.value).isValid) {\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromISO(filter.value).toFormat(HicomExternalFilter.DATETIME_FORMAT_STRING);\r\n }\r\n }\r\n break;\r\n case 'time':\r\n // @ts-ignore\r\n if (typeof filter.value === 'string') {\r\n // @ts-ignore\r\n if (luxon.DateTime.fromISO(filter.value).isValid) {\r\n // @ts-ignore\r\n filter.value = luxon.DateTime.fromISO(filter.value).toFormat(HicomExternalFilter.TIME_ONLY_FORMAT_STRING);\r\n }\r\n }\r\n break;\r\n case 'multiselectdropdown':\r\n if (typeof filter.value === 'object') {\r\n filter.value = filter.value.join(HicomExternalFilter.SYSTEM_MULTISELECT_TEXT_DELIMITER);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}"]}