{"version":3,"file":"signUpFinder.obs.js","sources":["../../../src/Engagement/SignUp/SignUpFinder/signUpFilterType.partial.ts","../../../src/Engagement/SignUp/SignUpFinder/signUpFilter.partial.obs","../../../src/Engagement/SignUp/signUpFinder.obs"],"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\n/**\r\n * Options for sign-up filters.\r\n */\r\nexport const SignUpFilterType = {\r\n    Checkboxes: \"Checkboxes\",\r\n    MultiSelectDropDown: \"MultiSelectDropDown\"\r\n} as const;\r\n\r\n/**\r\n * Options for sign-up filters.\r\n */\r\nexport type SignUpFilterType = typeof SignUpFilterType[keyof typeof SignUpFilterType];","<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n    <CheckBoxList v-if=\"!displayAsDropDown\"\r\n        v-model=\"props.modelValue\"\r\n        :label=\"props.label\"\r\n        :items=\"props.items\"\r\n        :horizontal=\"true\"\r\n        :repeatColumns=\"4\" />\r\n    <DropLownList v-if=\"displayAsDropDown\"\r\n        v-model=\"props.modelValue\"\r\n        :label=\"props.label ?? ''\"\r\n        :items=\"props.items\"\r\n        :multiple=\"true\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n    import { computed, PropType } from \"vue\";\r\n    import { SignUpFilterType } from \"./signUpFilterType.partial\";\r\n    import CheckBoxList from \"@Obsidian/Controls/checkBoxList\";\r\n    import DropLownList from \"@Obsidian/Controls/dropDownList\";\r\n    import { useVModelPassthrough } from \"@Obsidian/Utility/component\";\r\n    import { ListItemBag } from \"@Obsidian/ViewModels/Utility/listItemBag\";\r\n\r\n    const props = defineProps({\r\n        modelValue: {\r\n            type: Object as PropType<string[]>,\r\n            required: true\r\n        },\r\n\r\n        items: {\r\n            type: Array as PropType<ListItemBag[]>,\r\n            required: true\r\n        },\r\n\r\n        label: {\r\n            type: String as PropType<string | null | undefined>,\r\n            required: true\r\n        },\r\n\r\n        displayAs: {\r\n            type: String as PropType<SignUpFilterType>,\r\n            default: SignUpFilterType.Checkboxes\r\n        }\r\n    });\r\n\r\n    const emit = defineEmits<{\r\n        (e: \"update:modelValue\", value: string[]): void\r\n    }>();\r\n\r\n    useVModelPassthrough(props, \"modelValue\", emit);\r\n\r\n    // #region Computed Values\r\n\r\n    const displayAsDropDown = computed((): boolean => {\r\n        return props.displayAs === SignUpFilterType.MultiSelectDropDown;\r\n    });\r\n\r\n    // #endregion\r\n</script>","<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n    <NotificationBox v-if=\"blockErrorMessage\" alertType=\"warning\">\r\n        {{ blockErrorMessage }}\r\n    </NotificationBox>\r\n\r\n    <NotificationBox v-if=\"errorMessage\" alertType=\"warning\">\r\n        {{ errorMessage }}\r\n    </NotificationBox>\r\n\r\n    <div v-if=\"!blockErrorMessage\">\r\n        <RockForm @submit=\"onSearch\">\r\n            <div class=\"row d-flex flex-wrap\">\r\n                <div v-if=\"projectTypes.length\" :class=\"columnClass\">\r\n                    <SignUpFilter v-model=\"selectedProjectTypes\"\r\n                                  :label=\"config.projectTypeFilterLabel\"\r\n                                  :items=\"projectTypes\"\r\n                                  :displayAs=\"displayAs\"\r\n                                  @update:modelValue=\"onProjectTypesUpdated\" />\r\n                </div>\r\n                <div v-if=\"campuses.length\" :class=\"columnClass\">\r\n                    <SignUpFilter v-model=\"selectedCampuses\"\r\n                                  label=\"Campus\"\r\n                                  :items=\"campuses\"\r\n                                  :displayAs=\"displayAs\" />\r\n                </div>\r\n                <div v-if=\"namedSchedules.length\" :class=\"columnClass\">\r\n                    <SignUpFilter v-model=\"selectedNamedSchedules\"\r\n                                  :label=\"config.namedScheduleFilterLabel\"\r\n                                  :items=\"namedSchedules\"\r\n                                  :displayAs=\"displayAs\" />\r\n                </div>\r\n                <div v-for=\"a in attributeFilters\" :key=\"a.key\" :class=\"columnClass\">\r\n                    <div class=\"form-group\">\r\n                        <RockLabel>{{ a.attribute.name }}</RockLabel>\r\n                        <RockAttributeFilter v-model=\"comparisonValuesByAttributeGuid[a.key]\"\r\n                                             :attribute=\"a.attribute\" />\r\n                    </div>\r\n                </div>\r\n                <div v-if=\"config.displayDateRange\" :class=\"columnClass\">\r\n                    <DateRangePicker v-model=\"selectedDateRange\"\r\n                                     label=\"Date Range\"\r\n                                     :disallowPastDateSelection=\"true\" />\r\n                </div>\r\n                <div v-if=\"config.displayLocationSort\" :class=\"columnClass\">\r\n                    <TextBox v-model=\"selectedLocationSort\" :label=\"config.locationSortLabel\" class=\"input-max-w-xl\" />\r\n                </div>\r\n                <div v-if=\"config.displayLocationRangeFilter\" :class=\"columnClass\">\r\n                    <NumberBox v-model=\"selectedLocationRange\" label=\"Within\" formGroupClasses=\"input-max-w-md\">\r\n                        <template #inputGroupAppend>\r\n                            <span class=\"input-group-addon\">Miles</span>\r\n                        </template>\r\n                    </NumberBox>\r\n                </div>\r\n                <div v-if=\"config.displaySlotsAvailableFilter\" :class=\"columnClass\">\r\n                    <NumberBox v-model=\"selectedSlotsAvailable\" class=\"input-max-w-md\" label=\"Spots Available\">\r\n                        <template #inputGroupPrepend>\r\n                            <InputGroupDropDown :items=\"slotsAvailableComparisonTypes\" v-model=\"selectedSlotsAvailableComparisonType\" />\r\n                        </template>\r\n                    </NumberBox>\r\n                </div>\r\n            </div>\r\n            <div class=\"actions\">\r\n                <RockButton type=\"submit\" :btnType=\"BtnType.Primary\" :disabled=\"isSearching\">Search</RockButton>\r\n                <RockButton type=\"button\" :btnType=\"BtnType.Link\" :disabled=\"isSearching\" @click=\"onClearBtnClick\">Clear</RockButton>\r\n            </div>\r\n        </RockForm>\r\n\r\n        <Loading :isLoading=\"isSearching\">\r\n            <div ref=\"resultsHeaderElement\"></div>\r\n            <div ref=\"resultsElement\"></div>\r\n        </Loading>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n    import { computed, nextTick, ref } from \"vue\";\r\n    import SignUpFilter from \"./SignUpFinder/signUpFilter.partial.obs\";\r\n    import { SignUpFilterType } from \"./SignUpFinder/signUpFilterType.partial\";\r\n    import NotificationBox from \"@Obsidian/Controls/notificationBox.obs\";\r\n    import DateRangePicker from \"@Obsidian/Controls/dateRangePicker\";\r\n    import { DateRangeParts } from \"@Obsidian/Controls/dateRangePicker\";\r\n    import InputGroupDropDown from \"@Obsidian/Controls/inputGroupDropDown.obs\";\r\n    import Loading from \"@Obsidian/Controls/loading\";\r\n    import NumberBox from \"@Obsidian/Controls/numberBox\";\r\n    import RockAttributeFilter from \"@Obsidian/Controls/rockAttributeFilter\";\r\n    import RockButton from \"@Obsidian/Controls/rockButton\";\r\n    import RockLabel from \"@Obsidian/Controls/rockLabel\";\r\n    import RockForm from \"@Obsidian/Controls/rockForm\";\r\n    import TextBox from \"@Obsidian/Controls/textBox\";\r\n    import { BtnType } from \"@Obsidian/Enums/Controls/btnType\";\r\n    import { ComparisonValue } from \"@Obsidian/Types/Reporting/comparisonValue\";\r\n    import { onConfigurationValuesChanged, useConfigurationValues, useInvokeBlockAction, useReloadBlock } from \"@Obsidian/Utility/block\";\r\n    import { SignUpFinderInitializationBox } from \"@Obsidian/ViewModels/Blocks/Engagement/SignUp/SignUpFinder/signUpFinderInitializationBox\";\r\n    import { SignUpFinderResultsBag } from \"@Obsidian/ViewModels/Blocks/Engagement/SignUp/SignUpFinder/signUpFinderResultsBag\";\r\n    import { SignUpFinderSelectedFiltersBag } from \"@Obsidian/ViewModels/Blocks/Engagement/SignUp/SignUpFinder/signUpFinderSelectedFiltersBag\";\r\n    import { ListItemBag } from \"@Obsidian/ViewModels/Utility/listItemBag\";\r\n    import { PublicAttributeBag } from \"@Obsidian/ViewModels/Utility/publicAttributeBag\";\r\n    import { PublicComparisonValueBag } from \"@Obsidian/ViewModels/Utility/publicComparisonValueBag\";\r\n\r\n    const config = useConfigurationValues<SignUpFinderInitializationBox>();\r\n    const invokeBlockAction = useInvokeBlockAction();\r\n    const reloadBlock = useReloadBlock();\r\n\r\n    type SlotsAvailableComparisonType = \"AtLeast\" | \"NoMoreThan\";\r\n\r\n    // The items that can be picked from the \"Spots Available\" comparison type list.\r\n    const slotsAvailableComparisonTypes: ListItemBag[] = [\r\n        {\r\n            value: \"AtLeast\",\r\n            text: \"At Least\"\r\n        },\r\n        {\r\n            value: \"NoMoreThan\",\r\n            text: \"No More Than\"\r\n        }\r\n    ];\r\n\r\n    // #region Values\r\n\r\n    const errorMessage = ref(\"\");\r\n    const isSearching = ref(config.loadResultsOnInitialPageLoad);\r\n\r\n    const projectTypes = ref<ListItemBag[]>(config.projectTypes ?? []);\r\n    const campuses = ref<ListItemBag[]>(config.campuses ?? []);\r\n    const namedSchedules = ref<ListItemBag[]>(config.namedSchedules ?? []);\r\n    const attributesByProjectType = ref<Record<string, Record<string, PublicAttributeBag>>>(config.attributesByProjectType ?? {});\r\n\r\n    const attributeGuidsByProjectType: Record<string, string[]> = {};\r\n    const comparisonValuesByAttributeGuid: Record<string, ComparisonValue> = {};\r\n\r\n    const selectedProjectTypes = ref<string[]>([]);\r\n    const selectedCampuses = ref<string[]>(config.pageCampusContext?.value ? [...config.pageCampusContext.value] : []);\r\n    const selectedNamedSchedules = ref<string[]>([]);\r\n    const selectedDateRange = ref<DateRangeParts>({});\r\n    const selectedLocationSort = ref<string>(\"\");\r\n    const selectedLocationRange = ref<number | null>(null);\r\n    const selectedSlotsAvailableComparisonType = ref<SlotsAvailableComparisonType>(\"AtLeast\");\r\n    const selectedSlotsAvailable = ref<number | null>(null);\r\n\r\n    const resultsHeaderElement = ref<HTMLElement | null>(null);\r\n    const resultsElement = ref<HTMLElement | null>(null);\r\n\r\n    // #endregion\r\n\r\n    // #region Computed Values\r\n\r\n    const blockErrorMessage = computed((): string | undefined | null => {\r\n        return config.errorMessage;\r\n    });\r\n\r\n    const columnClass = computed((): string => {\r\n        let colWidth: number;\r\n        switch (config.filterColumns) {\r\n            case 4:\r\n                colWidth = 3;\r\n                break;\r\n            case 3:\r\n                colWidth = 4;\r\n                break;\r\n            case 2:\r\n                colWidth = 6;\r\n                break;\r\n            default:\r\n                colWidth = 12;\r\n        }\r\n\r\n        return `col-xs-12 col-md-${colWidth}`;\r\n    });\r\n\r\n    const displayAs = computed((): SignUpFilterType => {\r\n        return config.displayProjectFiltersAs === SignUpFilterType.MultiSelectDropDown\r\n            ? SignUpFilterType.MultiSelectDropDown\r\n            : SignUpFilterType.Checkboxes;\r\n    });\r\n\r\n    /**\r\n     * Build a single, combined array of attribute filters to display to the individual, while also keeping track of which\r\n     * attribute guids belong to each group type, and maintaining a local cache of selected comparison values.\r\n     */\r\n    const attributeFilters = computed((): ({ key: string, attribute: PublicAttributeBag, comparisonValue: ComparisonValue }[]) => {\r\n        const filters: { key: string, attribute: PublicAttributeBag, comparisonValue: ComparisonValue }[] = [];\r\n\r\n        Object.keys(attributesByProjectType.value).forEach((projectTypeGuid: string) => {\r\n            const attributes: Record<string, PublicAttributeBag> = attributesByProjectType.value[projectTypeGuid];\r\n            if (!attributes) {\r\n                return; // Continue to the next iteration if for some reason this dictionary is not defined.\r\n            }\r\n\r\n            var projectTypeAttributeGuids: string[] = attributeGuidsByProjectType[projectTypeGuid];\r\n            if (!projectTypeAttributeGuids) {\r\n                projectTypeAttributeGuids = [];\r\n                attributeGuidsByProjectType[projectTypeGuid] = projectTypeAttributeGuids;\r\n            }\r\n\r\n            Object.keys(attributes).forEach((attributeKey: string) => {\r\n                const attribute: PublicAttributeBag = attributes[attributeKey];\r\n                const attributeGuid = attribute?.attributeGuid;\r\n                if (!attributeGuid) {\r\n                    return; // We need to work against an attribute guid, so continue to the next iteration if we don't have one.\r\n                }\r\n\r\n                if (!projectTypeAttributeGuids.includes(attributeGuid)) {\r\n                    projectTypeAttributeGuids.push(attributeGuid);\r\n                }\r\n\r\n                let comparisonValue: ComparisonValue = comparisonValuesByAttributeGuid[attributeGuid];\r\n                if (!comparisonValue) {\r\n                    comparisonValue = { value: \"\" };\r\n                    comparisonValuesByAttributeGuid[attributeGuid] = comparisonValue;\r\n                }\r\n\r\n                filters.push({\r\n                    key: attributeGuid,\r\n                    attribute,\r\n                    comparisonValue\r\n                });\r\n            });\r\n        });\r\n\r\n        return filters;\r\n    });\r\n\r\n    // #endregion\r\n\r\n    // #region Functions\r\n\r\n    /**\r\n     * If specified by block settings, load the (unfiltered) results on initial page load.\r\n     */\r\n    async function tryLoadResultsOnInitialPageLoad(): Promise<void> {\r\n        if (config.loadResultsOnInitialPageLoad) {\r\n            await onSearch();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Gets the attribute filters, grouped by the currently-selected project types (or all if no project types are selected).\r\n     */\r\n    function getActiveAttributeFiltersByProjectType(): Record<string, Record<string, PublicComparisonValueBag>> {\r\n        var active: Record<string, Record<string, PublicComparisonValueBag>> = {};\r\n\r\n        Object.keys(attributeGuidsByProjectType).forEach((projectTypeGuid: string) => {\r\n            if (selectedProjectTypes.value.length && !selectedProjectTypes.value.includes(projectTypeGuid)) {\r\n                return;\r\n            }\r\n\r\n            const comparisonValues: Record<string, ComparisonValue> = {};\r\n            attributeGuidsByProjectType[projectTypeGuid].forEach((attributeGuid: string) => {\r\n                comparisonValues[attributeGuid] = comparisonValuesByAttributeGuid[attributeGuid];\r\n            });\r\n\r\n            active[projectTypeGuid] = comparisonValues;\r\n        });\r\n\r\n        return active;\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Event Handlers\r\n\r\n    /**\r\n     * Gets the updated, available display attribute filters, based on the currently-selected project type(s).\r\n     */\r\n    async function onProjectTypesUpdated(): Promise<void> {\r\n        errorMessage.value = \"\";\r\n\r\n        const selectedProjectTypeGuidStrings = selectedProjectTypes.value;\r\n        const result = await invokeBlockAction<Record<string, Record<string, PublicAttributeBag>>>(\"GetUpdatedAttributes\", { selectedProjectTypeGuidStrings });\r\n\r\n        if (!result.isSuccess) {\r\n            errorMessage.value = result.errorMessage || \"Unknown error when trying to load updated filters.\";\r\n            return;\r\n        }\r\n\r\n        // Update the available attribute filters.\r\n        attributesByProjectType.value = result.data ?? {};\r\n    }\r\n\r\n    /**\r\n     * Gets the available projects, according to the currently-selected filters.\r\n     */\r\n    async function onSearch(): Promise<void> {\r\n        isSearching.value = true;\r\n        errorMessage.value = \"\";\r\n\r\n        const bag: SignUpFinderSelectedFiltersBag = {\r\n            projectTypes: selectedProjectTypes.value,\r\n            campuses: selectedCampuses.value,\r\n            namedSchedules: selectedNamedSchedules.value,\r\n            attributeFiltersByProjectType: getActiveAttributeFiltersByProjectType(),\r\n            startDate: selectedDateRange.value.lowerValue,\r\n            endDate: selectedDateRange.value.upperValue,\r\n            locationSort: selectedLocationSort.value,\r\n            locationRange: selectedLocationRange.value,\r\n            slotsAvailableComparisonType: selectedSlotsAvailableComparisonType.value,\r\n            slotsAvailable: selectedSlotsAvailable.value\r\n        };\r\n\r\n        const result = await invokeBlockAction<SignUpFinderResultsBag>(\"GetFilteredProjects\", { bag });\r\n        isSearching.value = false;\r\n\r\n        if (!result.isSuccess) {\r\n            errorMessage.value = result.errorMessage || \"Unknown error while trying to load projects.\";\r\n            return;\r\n        }\r\n\r\n        nextTick(() => {\r\n            if (resultsHeaderElement.value && result.data?.resultsHeaderHtml) {\r\n                resultsHeaderElement.value.innerHTML = result.data.resultsHeaderHtml;\r\n            }\r\n\r\n            if (resultsElement.value && result.data?.resultsHtml) {\r\n                resultsElement.value.innerHTML = result.data.resultsHtml;\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Clears the filters.\r\n     */\r\n    function onClearBtnClick(): void {\r\n        selectedProjectTypes.value = [];\r\n        selectedCampuses.value = [];\r\n        selectedNamedSchedules.value = [];\r\n        selectedDateRange.value = {};\r\n        selectedLocationSort.value = \"\";\r\n        selectedLocationRange.value = null;\r\n        selectedSlotsAvailableComparisonType.value = \"AtLeast\";\r\n        selectedSlotsAvailable.value = null;\r\n\r\n        Object.keys(comparisonValuesByAttributeGuid).forEach((key: string) => {\r\n            comparisonValuesByAttributeGuid[key] = { value: \"\" };\r\n        });\r\n\r\n        onSearch();\r\n    }\r\n\r\n    // #endregion\r\n\r\n    onConfigurationValuesChanged(reloadBlock);\r\n\r\n    tryLoadResultsOnInitialPageLoad();\r\n</script>\r\n"],"names":["SignUpFilterType","Checkboxes","MultiSelectDropDown","useVModelPassthrough","props","emit","displayAsDropDown","computed","displayAs","config","useConfigurationValues","invokeBlockAction","useInvokeBlockAction","reloadBlock","useReloadBlock","slotsAvailableComparisonTypes","value","text","errorMessage","ref","isSearching","loadResultsOnInitialPageLoad","projectTypes","_config$projectTypes","campuses","_config$campuses","namedSchedules","_config$namedSchedule","attributesByProjectType","_config$attributesByP","attributeGuidsByProjectType","comparisonValuesByAttributeGuid","selectedProjectTypes","selectedCampuses","_config$pageCampusCon","pageCampusContext","selectedNamedSchedules","selectedDateRange","selectedLocationSort","selectedLocationRange","selectedSlotsAvailableComparisonType","selectedSlotsAvailable","resultsHeaderElement","resultsElement","blockErrorMessage","columnClass","colWidth","filterColumns","concat","displayProjectFiltersAs","attributeFilters","filters","Object","keys","forEach","projectTypeGuid","attributes","projectTypeAttributeGuids","attributeKey","attribute","attributeGuid","includes","push","comparisonValue","key","tryLoadResultsOnInitialPageLoad","_tryLoadResultsOnInitialPageLoad","apply","arguments","_asyncToGenerator","onSearch","getActiveAttributeFiltersByProjectType","active","length","comparisonValues","onProjectTypesUpdated","_onProjectTypesUpdated","_result$data","selectedProjectTypeGuidStrings","result","isSuccess","data","_onSearch","bag","attributeFiltersByProjectType","startDate","lowerValue","endDate","upperValue","locationSort","locationRange","slotsAvailableComparisonType","slotsAvailable","nextTick","_result$data2","_result$data3","resultsHeaderHtml","innerHTML","resultsHtml","onClearBtnClick","onConfigurationValuesChanged"],"mappings":"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"}