{"version":3,"file":"campusPicker.obs.js","sources":["../../../Framework/Controls/campusPicker.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n    <BaseAsyncPicker v-if=\"isPickerVisible\"\r\n                     v-model=\"internalValue\"\r\n                     v-bind=\"standardProps\"\r\n                     :displayStyle=\"displayStyle\"\r\n                     :items=\"actualItems\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n    import { Guid } from \"@Obsidian/Types\";\r\n    import { PickerDisplayStyle } from \"@Obsidian/Enums/Controls/pickerDisplayStyle\";\r\n    import { standardAsyncPickerProps, useStandardAsyncPickerProps, useVModelPassthrough } from \"@Obsidian/Utility/component\";\r\n    import { areEqual } from \"@Obsidian/Utility/guid\";\r\n    import { useHttp } from \"@Obsidian/Utility/http\";\r\n    import { useSuspense } from \"@Obsidian/Utility/suspense\";\r\n    import { containsRequiredRule } from \"@Obsidian/ValidationRules\";\r\n    import { CampusPickerItemBag } from \"@Obsidian/ViewModels/Controls/campusPickerItemBag\";\r\n    import { CampusPickerGetCampusesOptionsBag } from \"@Obsidian/ViewModels/Rest/Controls/campusPickerGetCampusesOptionsBag\";\r\n    import { ListItemBag } from \"@Obsidian/ViewModels/Utility/listItemBag\";\r\n    import { PropType, computed, ref } from \"vue\";\r\n    import BaseAsyncPicker from \"./baseAsyncPicker\";\r\n\r\n    const props = defineProps({\r\n        /** The currently selected campus value(s). */\r\n        modelValue: {\r\n            type: Object as PropType<ListItemBag | ListItemBag[] | null>,\r\n            required: false\r\n        },\r\n\r\n        /** Forces the picker to be displayed even if only one campus can be selected. */\r\n        forceVisible: {\r\n            type: Boolean as PropType<boolean>,\r\n            default: false\r\n        },\r\n\r\n        /** If true then inactive campuses will be included in the list of options. */\r\n        includeInactive: {\r\n            type: Boolean as PropType<boolean>,\r\n            default: false\r\n        },\r\n\r\n        /** Campus type defined value guids that limit which campuses are included in the list of options. */\r\n        campusTypeFilter: {\r\n            type: [String, Array] as PropType<Guid | Guid[]>,\r\n            required: false\r\n        },\r\n\r\n        /** Campus status defined value guids that limit which campuses are included in the list of options. */\r\n        campusStatusFilter: {\r\n            type: [String, Array] as PropType<Guid | Guid[]>,\r\n            required: false\r\n        },\r\n\r\n        ...standardAsyncPickerProps\r\n    });\r\n\r\n    const emit = defineEmits<{\r\n        (e: \"update:modelValue\", value: ListItemBag | ListItemBag[] | null): void\r\n    }>();\r\n\r\n    // #region Values\r\n\r\n    const internalValue = useVModelPassthrough(props, \"modelValue\", emit);\r\n    const standardProps = useStandardAsyncPickerProps(props);\r\n    const http = useHttp();\r\n    const loadedItems = ref<CampusPickerItemBag[] | null>(null);\r\n\r\n    // #endregion\r\n\r\n    // #region Computed Values\r\n\r\n    /**\r\n     * The actual items to make available to the picker. This allows us to do any\r\n     * post-processing, such as adding additional items, and still be lazy loaded as well.\r\n     */\r\n    const actualItems = computed((): ListItemBag[] | (() => Promise<ListItemBag[]>) => {\r\n        if (loadedItems.value) {\r\n            return filterAndConvertItems(loadedItems.value);\r\n        }\r\n\r\n        return loadOptions;\r\n    });\r\n\r\n    const displayStyle = computed((): PickerDisplayStyle => {\r\n        if (standardProps.displayStyle !== PickerDisplayStyle.Auto) {\r\n            return standardProps.displayStyle;\r\n        }\r\n\r\n        return standardProps.multiple  ? PickerDisplayStyle.List : PickerDisplayStyle.Auto;\r\n    });\r\n\r\n    const isPickerVisible = computed((): boolean => {\r\n        if (props.forceVisible || calculatedStatusFilters.value.length > 0 || calculatedTypeFilters.value.length > 0) {\r\n            return true;\r\n        }\r\n\r\n        if (!loadedItems.value) {\r\n            return false;\r\n        }\r\n\r\n        return filterAndConvertItems(loadedItems.value).length > 1;\r\n    });\r\n\r\n    const calculatedStatusFilters = computed((): Guid[] => {\r\n        if (!props.campusStatusFilter) {\r\n            return [];\r\n        }\r\n        else if (Array.isArray(props.campusStatusFilter)) {\r\n            return [...props.campusStatusFilter];\r\n        }\r\n        else {\r\n            return [props.campusStatusFilter];\r\n        }\r\n    });\r\n\r\n    const calculatedTypeFilters = computed((): Guid[] => {\r\n        if (!props.campusTypeFilter) {\r\n            return [];\r\n        }\r\n        else if (Array.isArray(props.campusTypeFilter)) {\r\n            return [...props.campusTypeFilter];\r\n        }\r\n        else {\r\n            return [props.campusTypeFilter];\r\n        }\r\n    });\r\n\r\n    // #endregion\r\n\r\n    // #region Functions\r\n\r\n    /**\r\n     * Loads the items from the server.\r\n     */\r\n    async function loadOptions(): Promise<ListItemBag[]> {\r\n        const options: Partial<CampusPickerGetCampusesOptionsBag> = {\r\n        };\r\n        const result = await http.post<CampusPickerItemBag[]>(\"/api/v2/Controls/CampusPickerGetCampuses\", undefined, options);\r\n\r\n        if (result.isSuccess && result.data) {\r\n            loadedItems.value = result.data;\r\n\r\n            const items = filterAndConvertItems(result.data);\r\n\r\n            const noSelection = !internalValue.value\r\n                || (Array.isArray(internalValue.value) && !internalValue.value.length)\r\n                || (!Array.isArray(internalValue.value) && !internalValue.value.value);\r\n\r\n            // If no selection and there is only one value and we are required, select it.\r\n            if (noSelection && containsRequiredRule(props.rules) && items.length === 1) {\r\n                internalValue.value = items[0];\r\n            }\r\n\r\n            return items;\r\n        }\r\n        else {\r\n            console.error(result.errorMessage ?? \"Unknown error while loading data.\");\r\n            loadedItems.value = [];\r\n            return [];\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Filters the campuses based on property settings and then converts them\r\n     * to plain ListItemBag objects.\r\n     *\r\n     * @param campuses The collection of campuses to be filtered.\r\n     *\r\n     * @returns The filtered campuses as ListItemBag objects.\r\n     */\r\n    function filterAndConvertItems(campuses: CampusPickerItemBag[]): ListItemBag[] {\r\n        return campuses.filter(isCampusIncluded).map(c => ({\r\n            value: c.value,\r\n            text: c.text\r\n        }));\r\n    }\r\n\r\n    /**\r\n     * Check is the campus should be included in the list based on the\r\n     * current settings provided.\r\n     *\r\n     * @param campus The campus to be filtered.\r\n     *\r\n     * @returns True if the campus should be included; otherwise false.\r\n     */\r\n    function isCampusIncluded(campus: CampusPickerItemBag): boolean {\r\n        let isIncluded = true;\r\n        const currentValues = !internalValue.value ? [] : (Array.isArray(internalValue.value) ? internalValue.value.map(c => c.value) : [internalValue.value.value]);\r\n\r\n        // No early bailout otherwise the computed() call will not track\r\n        // dependencies properly.\r\n\r\n        if (!props.includeInactive && !campus.isActive) {\r\n            isIncluded = false;\r\n        }\r\n\r\n        if (calculatedStatusFilters.value.length > 0) {\r\n            if (!calculatedStatusFilters.value.some(g => areEqual(g, campus.campusStatus))) {\r\n                isIncluded = false;\r\n            }\r\n        }\r\n\r\n        if (calculatedTypeFilters.value.length > 0) {\r\n            if (!calculatedTypeFilters.value.some(g => areEqual(g, campus.campusType))) {\r\n                isIncluded = false;\r\n            }\r\n        }\r\n\r\n        // If the campus is currently selected, then keep it in the list even if\r\n        // it would otherwise be filtered out.\r\n        if (currentValues.some(g => areEqual(g, campus.value))) {\r\n            isIncluded = true;\r\n        }\r\n\r\n        return isIncluded;\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // If we do not have an option set that would force us to always be\r\n    // visible then perform some custom logic.\r\n    if (!props.forceVisible && calculatedStatusFilters.value.length === 0 || calculatedTypeFilters.value.length === 0) {\r\n        // At this point the base picker will be not be instantiated yet.\r\n        // Start loading the options so we can determine if we should\r\n        // be visible or not.\r\n        const suspense = useSuspense();\r\n\r\n        if (suspense) {\r\n            suspense.addOperation(loadOptions());\r\n        }\r\n        else {\r\n            loadOptions();\r\n        }\r\n    }\r\n</script>\r\n"],"names":["internalValue","useVModelPassthrough","props","emit","standardProps","useStandardAsyncPickerProps","http","useHttp","loadedItems","ref","actualItems","computed","value","filterAndConvertItems","loadOptions","displayStyle","PickerDisplayStyle","Auto","multiple","List","isPickerVisible","forceVisible","calculatedStatusFilters","length","calculatedTypeFilters","campusStatusFilter","Array","isArray","campusTypeFilter","_loadOptions","apply","arguments","_asyncToGenerator","options","result","post","undefined","isSuccess","data","items","noSelection","containsRequiredRule","rules","_result$errorMessage","console","error","errorMessage","campuses","filter","isCampusIncluded","map","c","text","campus","isIncluded","currentValues","includeInactive","isActive","some","g","areEqual","campusStatus","campusType","suspense","useSuspense","addOperation"],"mappings":"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"}