{"version":3,"file":"utils.js","sources":["../../../Framework/FieldTypes/utils.ts"],"sourcesContent":["// <copyright>\r\n// Copyright by the Spark Development Network\r\n//\r\n// Licensed under the Rock Community License (the \"License\");\r\n// you may not use this file except in compliance with the License.\r\n// You may obtain a copy of the License at\r\n//\r\n// http://www.rockrms.com/license\r\n//\r\n// Unless required by applicable law or agreed to in writing, software\r\n// distributed under the License is distributed on an \"AS IS\" BASIS,\r\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n// See the License for the specific language governing permissions and\r\n// limitations under the License.\r\n// </copyright>\r\n//\r\n\r\nimport { Component, computed, defineComponent, PropType, ref, watch } from \"vue\";\r\nimport { binaryComparisonTypes, containsComparisonTypes, isCompareVisibleForComparisonFilter, isSingleComparisonType, stringComparisonTypes } from \"@Obsidian/Core/Reporting/comparisonType\";\r\nimport { getFilteredComparisonTypeOptions } from \"@Obsidian/Core/Reporting/comparisonTypeOptions\";\r\nimport { ComparisonValue } from \"@Obsidian/Types/Reporting/comparisonValue\";\r\nimport { ComparisonType } from \"@Obsidian/Enums/Reporting/comparisonType\";\r\nimport { FilterMode } from \"@Obsidian/Core/Reporting/filterMode\";\r\nimport DropDownList from \"@Obsidian/Controls/dropDownList.obs\";\r\nimport FieldFilterContainer from \"@Obsidian/Controls/fieldFilterContainer.obs\";\r\nimport { toNumberOrNull } from \"@Obsidian/Utility/numberUtils\";\r\nimport { DataEntryMode } from \"@Obsidian/Utility/fieldTypes\";\r\nimport { ListItemBag } from \"@Obsidian/ViewModels/Utility/listItemBag\";\r\n\r\nexport type ConfigurationValues = Record<string, string>;\r\n\r\n/**\r\n * The basic properties that all field editor components must support.\r\n */\r\ntype FieldEditorBaseProps = {\r\n    modelValue: {\r\n        type: PropType<string>,\r\n        required: true\r\n    };\r\n\r\n    configurationValues: {\r\n        type: PropType<ConfigurationValues>;\r\n        default: () => ConfigurationValues;\r\n    };\r\n\r\n    /**\r\n     * This is used internally by the fieldTypeEditor to allow controls to make adjustments based\r\n     * on how it's being used (e.g. to define a default value vs to edit a value)\r\n     */\r\n    dataEntryMode: {\r\n        type: PropType<DataEntryMode>;\r\n    };\r\n};\r\n\r\n/**\r\n * The basic properties that all field configuration components must support.\r\n */\r\ntype FieldConfigurationBaseProps = {\r\n    modelValue: {\r\n        type: PropType<Record<string, string>>,\r\n        required: true\r\n    };\r\n\r\n    configurationProperties: {\r\n        type: PropType<Record<string, string>>,\r\n        required: true\r\n    };\r\n};\r\n\r\n/**\r\n * Get the standard properties that all field editor components must support.\r\n */\r\nexport function getFieldEditorProps(): FieldEditorBaseProps {\r\n    return {\r\n        modelValue: {\r\n            type: String as PropType<string>,\r\n            required: true\r\n        },\r\n\r\n        configurationValues: {\r\n            type: Object as PropType<ConfigurationValues>,\r\n            default: () => ({})\r\n        },\r\n\r\n        dataEntryMode: {\r\n            type: String as PropType<DataEntryMode>\r\n        }\r\n    };\r\n}\r\n\r\n/**\r\n * The properties that all field filter components must support.\r\n */\r\ntype FieldFilterProps = {\r\n    modelValue: {\r\n        type: PropType<ComparisonValue>,\r\n        required: true\r\n    },\r\n\r\n    configurationValues: {\r\n        type: PropType<ConfigurationValues>,\r\n        required: true\r\n    },\r\n\r\n    filterMode: {\r\n        type: PropType<FilterMode>,\r\n        required: true\r\n    },\r\n\r\n    required: {\r\n        type: PropType<boolean>,\r\n        required: true\r\n    }\r\n};\r\n\r\n/**\r\n * The properties that all field filter components must support.\r\n */\r\nexport const fieldFilterProps: FieldFilterProps = {\r\n    modelValue: {\r\n        type: Object as PropType<ComparisonValue>,\r\n        required: true\r\n    },\r\n\r\n    configurationValues: {\r\n        type: Object as PropType<ConfigurationValues>,\r\n        required: true\r\n    },\r\n\r\n    filterMode: {\r\n        type: Number as PropType<FilterMode>,\r\n        required: true\r\n    },\r\n\r\n    required: {\r\n        type: Boolean as PropType<boolean>,\r\n        required: true\r\n    }\r\n};\r\n\r\n/**\r\n * Gets the standard field configuration properties that all field configuration\r\n * components must support.\r\n */\r\nexport function getFieldConfigurationProps(): FieldConfigurationBaseProps {\r\n    return {\r\n        modelValue: {\r\n            type: Object as PropType<Record<string, string>>,\r\n            required: true\r\n        },\r\n        configurationProperties: {\r\n            type: Object as PropType<Record<string, string>>,\r\n            required: true\r\n        }\r\n    };\r\n}\r\n\r\n/**\r\n * Allows callers to modify the names of the comparison type options. The values\r\n * and the array itself should not be modified.\r\n */\r\nexport type UpdateComparisonTypeNamesCallback = (comparisonTypeOptions: ListItemBag[]) => void;\r\n\r\n/**\r\n * Options that can be passed to the getStandardFilterComponent method which\r\n * will alter it's default behavior.\r\n */\r\nexport type StandardFilterComponentOptions = {\r\n    updateComparisonTypeNames?: UpdateComparisonTypeNamesCallback;\r\n};\r\n\r\n/**\r\n * Gets a standard filter component that uses a constant string in place of the\r\n * comparison type picker. This component will always emit a ComparisonValue\r\n * with a null type.\r\n *\r\n * @param compareLabel The string to display in place of a comparison picker.\r\n * @param valueComponent The component that will handle editing the value.\r\n *\r\n * @returns A component that will handle editing a filter value.\r\n */\r\nexport function getStandardFilterComponent(compareLabel: string, valueComponent: Component, options?: StandardFilterComponentOptions): Component;\r\n\r\n/**\r\n * Gets a standard filter component that uses a picker to let the individual\r\n * select the comparison type to perform. If a single comparison type bit is\r\n * set then the picker will be hidden. If null is used for the comparison types\r\n * then no picker component will be shown and null will be emitted for the\r\n * type property.\r\n *\r\n * @param comparisonTypes One or more comparison types the user can select from.\r\n * @param valueComponent The component that will handle editing the value.\r\n *\r\n * @returns A component that will handle editing a filter value.\r\n */\r\nexport function getStandardFilterComponent(comparisonTypes: ComparisonType | null, valueComponent: Component, options?: StandardFilterComponentOptions): Component;\r\n\r\n/**\r\n * Gets a standard filter component that can be used by field types to generate\r\n * their filter component without having to write one from scratch.\r\n *\r\n * @param comparisonLabelOrTypes The comparison label or the comparison types that will be shown.\r\n * @param valueComponent The component that will handle value entry from the individual.\r\n *\r\n * @returns A component that will handle editing a filter value.\r\n */\r\nexport function getStandardFilterComponent(comparisonLabelOrTypes: ComparisonType | string | null, valueComponent: Component, options?: StandardFilterComponentOptions): Component {\r\n    const comparisonTypes: ComparisonType | null = typeof comparisonLabelOrTypes === \"number\" ? comparisonLabelOrTypes : null;\r\n    const compareLabel: string = typeof comparisonLabelOrTypes === \"string\" ? comparisonLabelOrTypes : \"\";\r\n\r\n    let comparisonTypeOptions = comparisonTypes !== null ? getFilteredComparisonTypeOptions(comparisonTypes) : [];\r\n\r\n    if (options?.updateComparisonTypeNames) {\r\n        // Create a new array with new objects so we don't modify the core\r\n        // set for every component on the page.\r\n        comparisonTypeOptions = comparisonTypeOptions.map(o => {\r\n            return {\r\n                value: o.value,\r\n                text: o.text\r\n            };\r\n        });\r\n\r\n        options.updateComparisonTypeNames(comparisonTypeOptions);\r\n    }\r\n\r\n    return defineComponent({\r\n        name: \"StandardFilterComponent\",\r\n\r\n        components: {\r\n            DropDownList,\r\n            FieldFilterContainer,\r\n            ValueComponent: valueComponent\r\n        },\r\n\r\n        props: fieldFilterProps,\r\n\r\n        emits: [\r\n            \"update:modelValue\"\r\n        ],\r\n\r\n        setup(props, { emit }) {\r\n            /** The comparison type currently selected in the UI. */\r\n            const internalComparisonType = ref(props.modelValue.comparisonType?.toString() ?? \"\");\r\n            const comparisonType = ref(props.modelValue.comparisonType ?? null);\r\n\r\n            /** The comparison value currently entered in the UI. */\r\n            const internalComparisonValue = ref(props.modelValue.value);\r\n\r\n            /** True if the compare component should be visible. */\r\n            const hasCompareComponent = computed(() => {\r\n                return comparisonTypes !== null\r\n                    && props.filterMode !== FilterMode.Simple\r\n                    && !isSingleComparisonType(comparisonTypes)\r\n                    && isCompareVisibleForComparisonFilter(comparisonTypes, props.filterMode);\r\n            });\r\n\r\n            /** True if the value component should be visible. */\r\n            const hasValueComponent = computed((): boolean => {\r\n                return internalComparisonType.value !== ComparisonType.IsBlank.toString()\r\n                    && internalComparisonType.value !== ComparisonType.IsNotBlank.toString();\r\n            });\r\n\r\n            /** True if the comparison type is optional. */\r\n            const isTypeOptional = computed(() => !props.required);\r\n\r\n            /**\r\n             * Constructs the new value and emits it if it has changed from\r\n             * the current modelValue.\r\n             */\r\n            const emitValueIfChanged = (): void => {\r\n                let type: ComparisonType | null | undefined;\r\n\r\n                // Determine the comparison type.\r\n                if (compareLabel || comparisonTypes === null) {\r\n                    // No comparison type to be selected.\r\n                    type = null;\r\n                }\r\n                else if (isSingleComparisonType(comparisonTypes)) {\r\n                    // Only a single comparison type, so it is forced.\r\n                    type = comparisonTypes;\r\n                }\r\n                else {\r\n                    // If the filter mode is simple, then the comparison type is\r\n                    // not shown so we come up with a sane default.\r\n                    if (props.filterMode === FilterMode.Simple) {\r\n                        if (comparisonTypes === binaryComparisonTypes) {\r\n                            type = ComparisonType.EqualTo;\r\n                        }\r\n                        else if (comparisonTypes === stringComparisonTypes || comparisonTypes === containsComparisonTypes) {\r\n                            type = ComparisonType.Contains;\r\n                        }\r\n                        else {\r\n                            type = null;\r\n                        }\r\n                    }\r\n                    else {\r\n                        // Get the comparison type selected by the user if we are\r\n                        // in advanced mode.\r\n                        type = toNumberOrNull(internalComparisonType.value);\r\n                    }\r\n                }\r\n\r\n                comparisonType.value = type;\r\n\r\n                // Construct the new value to be emitted.\r\n                const newValue: ComparisonValue = {\r\n                    comparisonType: type,\r\n                    value: internalComparisonValue.value\r\n                };\r\n\r\n                // Check if it has changed from the original value.\r\n                if (newValue.comparisonType !== props.modelValue.comparisonType || newValue.value !== props.modelValue.value) {\r\n                    emit(\"update:modelValue\", newValue);\r\n                }\r\n            };\r\n\r\n            // Watch for changes in our modelValue and update our internal\r\n            // values to match.\r\n            watch(() => props.modelValue, () => {\r\n                internalComparisonType.value = props.modelValue.comparisonType?.toString() ?? \"\";\r\n                comparisonType.value = props.modelValue.comparisonType ?? null;\r\n                internalComparisonValue.value = props.modelValue.value;\r\n            });\r\n\r\n            // Watch for changes in our internal values and update the modelValue.\r\n            watch([internalComparisonType, internalComparisonValue], () => {\r\n                emitValueIfChanged();\r\n            });\r\n\r\n            // This is primarily here to sync up state with default values.\r\n            emitValueIfChanged();\r\n\r\n            return {\r\n                compareLabel,\r\n                comparisonType,\r\n                comparisonTypeOptions,\r\n                hasCompareComponent,\r\n                hasValueComponent,\r\n                internalComparisonType,\r\n                internalComparisonValue,\r\n                isTypeOptional\r\n            };\r\n        },\r\n\r\n        template: `\r\n<FieldFilterContainer :compareLabel=\"compareLabel\">\r\n    <template v-if=\"hasCompareComponent\" #compare>\r\n        <DropDownList v-model=\"internalComparisonType\" :items=\"comparisonTypeOptions\" :showBlankItem=\"isTypeOptional\" />\r\n    </template>\r\n\r\n    <ValueComponent v-if=\"hasValueComponent\" v-model=\"internalComparisonValue\" :configurationValues=\"configurationValues\" :comparisonType=\"comparisonType\" />\r\n</FieldFilterContainer>\r\n`\r\n    });\r\n}\r\n\r\n"],"names":["getFieldEditorProps","modelValue","type","String","required","configurationValues","Object","default","dataEntryMode","fieldFilterProps","filterMode","Number","Boolean","getFieldConfigurationProps","configurationProperties","getStandardFilterComponent","comparisonLabelOrTypes","valueComponent","options","comparisonTypes","compareLabel","comparisonTypeOptions","getFilteredComparisonTypeOptions","updateComparisonTypeNames","map","o","value","text","defineComponent","name","components","DropDownList","FieldFilterContainer","ValueComponent","props","emits","setup","_ref","_props$modelValue$com","_props$modelValue$com2","_props$modelValue$com3","emit","internalComparisonType","ref","comparisonType","toString","internalComparisonValue","hasCompareComponent","computed","FilterMode","Simple","isSingleComparisonType","isCompareVisibleForComparisonFilter","hasValueComponent","ComparisonType","IsBlank","IsNotBlank","isTypeOptional","emitValueIfChanged","binaryComparisonTypes","EqualTo","stringComparisonTypes","containsComparisonTypes","Contains","toNumberOrNull","newValue","watch","_props$modelValue$com4","_props$modelValue$com5","_props$modelValue$com6","template"],"mappings":"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"}