From 0d3b59fd9cb05fb19efd5222e22d01bad095d310 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 6 Feb 2026 18:22:30 +0530 Subject: [PATCH] feat: Refactor reports filters (#13443) --- .../components/ui/DatePicker/DatePicker.vue | 302 ++++++-- .../DatePicker/components/CalendarAction.vue | 8 +- .../components/CalendarDateRange.vue | 29 +- .../DatePicker/components/CalendarFooter.vue | 1 - .../DatePicker/components/CalendarMonth.vue | 2 +- .../ui/DatePicker/components/CalendarYear.vue | 2 +- .../components/DatePickerButton.vue | 89 ++- .../ui/DatePicker/helpers/DatePickerHelper.js | 73 +- .../components/ui/Dropdown/DropdownSearch.vue | 4 +- .../dashboard/i18n/locale/en/datePicker.json | 5 + .../dashboard/i18n/locale/en/report.json | 27 +- .../dashboard/settings/reports/BotReports.vue | 12 +- .../settings/reports/CsatResponses.vue | 3 + .../dashboard/settings/reports/Index.vue | 12 +- .../settings/reports/ReportContainer.vue | 2 +- .../reports/components/Csat/CsatFilters.vue | 65 +- .../reports/components/FilterSelector.vue | 228 ------ .../reports/components/Filters/Agents.vue | 47 -- .../components/Filters/DateGroupBy.vue | 66 -- .../reports/components/Filters/DateRange.vue | 51 -- .../reports/components/Filters/Inboxes.vue | 42 -- .../reports/components/Filters/Labels.vue | 66 -- .../reports/components/Filters/Ratings.vue | 40 - .../reports/components/Filters/Teams.vue | 42 -- .../Filters/v3/ActiveFilterChip.vue | 10 +- .../components/OverviewReportFilters.vue | 102 +++ .../reports/components/ReportFilters.vue | 689 +++++++++--------- .../reports/components/SLA/SLAFilter.vue | 324 ++++---- .../components/SLA/SLAReportFilters.vue | 147 ++-- .../reports/components/SummaryReports.vue | 4 +- .../reports/components/WootReports.vue | 115 +-- .../specs/Filters/FiltersAgents.spec.js | 57 -- .../specs/Filters/FiltersDateGroupBy.spec.js | 47 -- .../specs/Filters/FiltersDateRange.spec.js | 41 -- .../specs/Filters/FiltersInboxes.spec.js | 65 -- .../specs/Filters/FiltersLabels.spec.js | 67 -- .../specs/Filters/FiltersRatings.spec.js | 43 -- .../specs/Filters/FiltersTeams.spec.js | 65 -- .../reports/helpers/reportFilterHelper.js | 69 ++ .../helpers/reportFilterHelper.spec.js | 350 +++++++++ .../dashboard/store/modules/labels.js | 2 +- 41 files changed, 1678 insertions(+), 1737 deletions(-) delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/FilterSelector.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Agents.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateGroupBy.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateRange.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Inboxes.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Labels.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Ratings.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Teams.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/OverviewReportFilters.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersAgents.spec.js delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersDateGroupBy.spec.js delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersDateRange.spec.js delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersInboxes.spec.js delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersLabels.spec.js delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersRatings.spec.js delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersTeams.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/helpers/reportFilterHelper.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/helpers/reportFilterHelper.spec.js diff --git a/app/javascript/dashboard/components/ui/DatePicker/DatePicker.vue b/app/javascript/dashboard/components/ui/DatePicker/DatePicker.vue index 886bc30a0..58a31fba8 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/DatePicker.vue +++ b/app/javascript/dashboard/components/ui/DatePicker/DatePicker.vue @@ -1,11 +1,14 @@ diff --git a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarDateRange.vue b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarDateRange.vue index 1aea65cfa..3b1e0d1e2 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarDateRange.vue +++ b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarDateRange.vue @@ -18,24 +18,25 @@ const setDateRange = range => { diff --git a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarFooter.vue b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarFooter.vue index 830f17ead..5aa45342f 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarFooter.vue +++ b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarFooter.vue @@ -23,7 +23,6 @@ const onClickApply = () => { /> diff --git a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarMonth.vue b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarMonth.vue index c3ddb5bfd..500cefbdc 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarMonth.vue +++ b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarMonth.vue @@ -78,7 +78,7 @@ const selectMonth = index => { 'hover:bg-n-alpha-2 dark:hover:bg-n-solid-3': index !== activeMonthIndex, }" - @click="selectMonth(index)" + @click.stop="selectMonth(index)" > {{ month }} diff --git a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarYear.vue b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarYear.vue index 13a786e27..c90a2ab45 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/components/CalendarYear.vue +++ b/app/javascript/dashboard/components/ui/DatePicker/components/CalendarYear.vue @@ -77,7 +77,7 @@ const selectYear = year => { 'bg-n-brand text-white hover:bg-n-blue-10': year === activeYear, 'hover:bg-n-alpha-2 dark:hover:bg-n-solid-3': year !== activeYear, }" - @click="selectYear(year)" + @click.stop="selectYear(year)" > {{ year }} diff --git a/app/javascript/dashboard/components/ui/DatePicker/components/DatePickerButton.vue b/app/javascript/dashboard/components/ui/DatePicker/components/DatePickerButton.vue index 950a9f020..5885fb47b 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/components/DatePickerButton.vue +++ b/app/javascript/dashboard/components/ui/DatePicker/components/DatePickerButton.vue @@ -2,6 +2,8 @@ import { computed } from 'vue'; import { dateRanges } from '../helpers/DatePickerHelper'; import { format, isSameYear, isValid } from 'date-fns'; +import Icon from 'dashboard/components-next/icon/Icon.vue'; +import NextButton from 'dashboard/components-next/button/Button.vue'; const props = defineProps({ selectedStartDate: Date, @@ -10,9 +12,21 @@ const props = defineProps({ type: String, default: '', }, + showMonthNavigation: { + type: Boolean, + default: false, + }, + canNavigateNext: { + type: Boolean, + default: false, + }, + navigationLabel: { + type: String, + default: null, + }, }); -const emit = defineEmits(['open']); +const emit = defineEmits(['open', 'navigateMonth']); const formatDateRange = computed(() => { const startDate = props.selectedStartDate; @@ -22,19 +36,15 @@ const formatDateRange = computed(() => { return 'Select a date range'; } - const formatString = isSameYear(startDate, endDate) - ? 'MMM d' // Same year: "Apr 1" - : 'MMM d yyyy'; // Different years: "Apr 1 2025" + const crossesYears = !isSameYear(startDate, endDate); - if (isSameYear(startDate, new Date()) && isSameYear(endDate, new Date())) { - // Both dates are in the current year - return `${format(startDate, 'MMM d')} - ${format(endDate, 'MMM d')}`; + // Always show years when crossing year boundaries + if (crossesYears) { + return `${format(startDate, 'MMM d, yyyy')} - ${format(endDate, 'MMM d, yyyy')}`; } - // At least one date is not in the current year - return `${format(startDate, formatString)} - ${format( - endDate, - formatString - )}`; + + // For same year, always show the year for clarity + return `${format(startDate, 'MMM d')} - ${format(endDate, 'MMM d, yyyy')}`; }); const activeDateRange = computed( @@ -47,17 +57,46 @@ const openDatePicker = () => { diff --git a/app/javascript/dashboard/components/ui/DatePicker/helpers/DatePickerHelper.js b/app/javascript/dashboard/components/ui/DatePicker/helpers/DatePickerHelper.js index 85e41603f..e0e9276ee 100644 --- a/app/javascript/dashboard/components/ui/DatePicker/helpers/DatePickerHelper.js +++ b/app/javascript/dashboard/components/ui/DatePicker/helpers/DatePickerHelper.js @@ -10,6 +10,8 @@ import { isSameMonth, format, startOfWeek, + endOfWeek, + addWeeks, addDays, eachDayOfInterval, endOfMonth, @@ -34,13 +36,27 @@ export const dateRanges = [ { label: 'DATE_PICKER.DATE_RANGE_OPTIONS.LAST_3_MONTHS', value: 'last3months', + separator: true, }, { label: 'DATE_PICKER.DATE_RANGE_OPTIONS.LAST_6_MONTHS', value: 'last6months', }, { label: 'DATE_PICKER.DATE_RANGE_OPTIONS.LAST_YEAR', value: 'lastYear' }, - { label: 'DATE_PICKER.DATE_RANGE_OPTIONS.CUSTOM_RANGE', value: 'custom' }, + { + label: 'DATE_PICKER.DATE_RANGE_OPTIONS.THIS_WEEK', + value: 'thisWeek', + separator: true, + }, + { + label: 'DATE_PICKER.DATE_RANGE_OPTIONS.MONTH_TO_DATE', + value: 'monthToDate', + }, + { + label: 'DATE_PICKER.DATE_RANGE_OPTIONS.CUSTOM_RANGE', + value: 'custom', + separator: true, + }, ]; export const DATE_RANGE_TYPES = { @@ -49,6 +65,8 @@ export const DATE_RANGE_TYPES = { LAST_3_MONTHS: 'last3months', LAST_6_MONTHS: 'last6months', LAST_YEAR: 'lastYear', + THIS_WEEK: 'thisWeek', + MONTH_TO_DATE: 'monthToDate', CUSTOM_RANGE: 'custom', }; @@ -210,6 +228,14 @@ export const getActiveDateRange = (range, currentDate) => { start: startOfDay(subMonths(currentDate, 12)), end: endOfDay(currentDate), }), + thisWeek: () => ({ + start: startOfDay(startOfWeek(currentDate, { weekStartsOn: 1 })), + end: endOfDay(currentDate), + }), + monthToDate: () => ({ + start: startOfDay(startOfMonth(currentDate)), + end: endOfDay(currentDate), + }), custom: () => ({ start: currentDate, end: currentDate }), }; @@ -217,3 +243,48 @@ export const getActiveDateRange = (range, currentDate) => { ranges[range] || (() => ({ start: currentDate, end: currentDate })) )(); }; + +export const isNavigableRange = rangeType => + rangeType === DATE_RANGE_TYPES.MONTH_TO_DATE || + rangeType === DATE_RANGE_TYPES.THIS_WEEK; + +const WEEK_START = 1; // Monday + +const getWeekRangeAtOffset = (offset, currentDate) => { + if (offset === 0) { + return { + start: startOfDay(startOfWeek(currentDate, { weekStartsOn: WEEK_START })), + end: endOfDay(currentDate), + }; + } + const targetWeek = addWeeks(currentDate, offset); + return { + start: startOfDay(startOfWeek(targetWeek, { weekStartsOn: WEEK_START })), + end: endOfDay(endOfWeek(targetWeek, { weekStartsOn: WEEK_START })), + }; +}; + +const getMonthRangeAtOffset = (offset, currentDate) => { + if (offset === 0) { + return { + start: startOfDay(startOfMonth(currentDate)), + end: endOfDay(currentDate), + }; + } + const targetMonth = addMonths(currentDate, offset); + return { + start: startOfDay(startOfMonth(targetMonth)), + end: endOfDay(endOfMonth(targetMonth)), + }; +}; + +export const getRangeAtOffset = ( + rangeType, + offset, + currentDate = new Date() +) => { + if (rangeType === DATE_RANGE_TYPES.THIS_WEEK) { + return getWeekRangeAtOffset(offset, currentDate); + } + return getMonthRangeAtOffset(offset, currentDate); +}; diff --git a/app/javascript/dashboard/components/ui/Dropdown/DropdownSearch.vue b/app/javascript/dashboard/components/ui/Dropdown/DropdownSearch.vue index 7e5bf569e..6be49b99e 100644 --- a/app/javascript/dashboard/components/ui/Dropdown/DropdownSearch.vue +++ b/app/javascript/dashboard/components/ui/Dropdown/DropdownSearch.vue @@ -34,8 +34,8 @@ const value = defineModel({ diff --git a/app/javascript/dashboard/i18n/locale/en/datePicker.json b/app/javascript/dashboard/i18n/locale/en/datePicker.json index c7ef06880..95d304cc6 100644 --- a/app/javascript/dashboard/i18n/locale/en/datePicker.json +++ b/app/javascript/dashboard/i18n/locale/en/datePicker.json @@ -1,5 +1,8 @@ { "DATE_PICKER": { + "PREVIOUS_PERIOD": "Previous period", + "NEXT_PERIOD": "Next period", + "WEEK_NUMBER": "Week #{weekNumber}", "APPLY_BUTTON": "Apply", "CLEAR_BUTTON": "Clear", "DATE_RANGE_INPUT": { @@ -13,6 +16,8 @@ "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", + "THIS_WEEK": "This week", + "MONTH_TO_DATE": "This month", "CUSTOM_RANGE": "Custom date range" } } diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json index 504caff0f..2ffa0ef11 100644 --- a/app/javascript/dashboard/i18n/locale/en/report.json +++ b/app/javascript/dashboard/i18n/locale/en/report.json @@ -128,11 +128,16 @@ }, "AGENT_REPORTS": { "HEADER": "Agents Overview", - "DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent’s name to learn more.", + "DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", "FILTER_DROPDOWN_LABEL": "Select Agent", + "FILTERS": { + "INPUT_PLACEHOLDER": { + "AGENTS": "Search agents" + } + }, "METRICS": { "CONVERSATIONS": { "NAME": "Conversations", @@ -201,6 +206,11 @@ "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_LABEL_REPORTS": "Download label reports", "FILTER_DROPDOWN_LABEL": "Select Label", + "FILTERS": { + "INPUT_PLACEHOLDER": { + "LABELS": "Search labels" + } + }, "METRICS": { "CONVERSATIONS": { "NAME": "Conversations", @@ -271,6 +281,11 @@ "FILTER_DROPDOWN_LABEL": "Select Inbox", "ALL_INBOXES": "All Inboxes", "SEARCH_INBOX": "Search Inbox", + "FILTERS": { + "INPUT_PLACEHOLDER": { + "INBOXES": "Search inboxes" + } + }, "METRICS": { "CONVERSATIONS": { "NAME": "Conversations", @@ -334,11 +349,19 @@ }, "TEAM_REPORTS": { "HEADER": "Team Overview", - "DESCRIPTION": "Get a snapshot of your team’s performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.", + "DESCRIPTION": "Get a snapshot of your team's performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_TEAM_REPORTS": "Download team reports", "FILTER_DROPDOWN_LABEL": "Select Team", + "FILTERS": { + "ADD_FILTER": "Add filter", + "CLEAR_ALL": "Clear all", + "NO_FILTER": "No filters available", + "INPUT_PLACEHOLDER": { + "TEAMS": "Search teams" + } + }, "METRICS": { "CONVERSATIONS": { "NAME": "Conversations", diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/BotReports.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/BotReports.vue index 11800a029..03b7290d6 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/BotReports.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/BotReports.vue @@ -1,7 +1,7 @@ - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Agents.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Agents.vue deleted file mode 100644 index 353c09bb8..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Agents.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateGroupBy.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateGroupBy.vue deleted file mode 100644 index 37139865f..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateGroupBy.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateRange.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateRange.vue deleted file mode 100644 index 9caab26dd..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateRange.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Inboxes.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Inboxes.vue deleted file mode 100644 index 476c7a0a3..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Inboxes.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Labels.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Labels.vue deleted file mode 100644 index ede9e020c..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Labels.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Ratings.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Ratings.vue deleted file mode 100644 index 207de214f..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Ratings.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Teams.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Teams.vue deleted file mode 100644 index 606cdb2af..000000000 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Teams.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/v3/ActiveFilterChip.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/v3/ActiveFilterChip.vue index bd0a80984..e37a3bc2b 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/v3/ActiveFilterChip.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/v3/ActiveFilterChip.vue @@ -8,8 +8,8 @@ const props = defineProps({ required: true, }, id: { - type: Number, - required: true, + type: [Number, null], + default: null, }, type: { type: String, @@ -35,6 +35,10 @@ const props = defineProps({ type: Boolean, default: false, }, + showClearFilter: { + type: Boolean, + default: true, + }, }); const emit = defineEmits([ @@ -60,7 +64,7 @@ const closeDropdown = () => emit('closeDropdown'); +import { ref, onMounted } from 'vue'; +import { useRoute, useRouter } from 'vue-router'; +import { getUnixStartOfDay, getUnixEndOfDay } from 'helpers/DateHelper'; +import subDays from 'date-fns/subDays'; +import WootDatePicker from 'dashboard/components/ui/DatePicker/DatePicker.vue'; +import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue'; +import { + generateReportURLParams, + parseReportURLParams, +} from '../helpers/reportFilterHelper'; +import { DATE_RANGE_TYPES } from 'dashboard/components/ui/DatePicker/helpers/DatePickerHelper'; + +const emit = defineEmits(['filterChange']); + +const route = useRoute(); +const router = useRouter(); + +const customDateRange = ref([subDays(new Date(), 6), new Date()]); +const selectedDateRange = ref(DATE_RANGE_TYPES.LAST_7_DAYS); +const businessHoursSelected = ref(false); + +const updateURLParams = () => { + const params = generateReportURLParams({ + from: getUnixStartOfDay(customDateRange.value[0]), + to: getUnixEndOfDay(customDateRange.value[1]), + businessHours: businessHoursSelected.value, + range: selectedDateRange.value, + }); + + router.replace({ query: { ...params } }); +}; + +const emitChange = () => { + updateURLParams(); + emit('filterChange', { + from: getUnixStartOfDay(customDateRange.value[0]), + to: getUnixEndOfDay(customDateRange.value[1]), + businessHours: businessHoursSelected.value, + }); +}; + +const onDateRangeChange = value => { + const [startDate, endDate, rangeType] = value; + customDateRange.value = [startDate, endDate]; + selectedDateRange.value = rangeType || DATE_RANGE_TYPES.CUSTOM_RANGE; + emitChange(); +}; + +const onBusinessHoursToggle = () => { + emitChange(); +}; + +const initializeFromURL = () => { + const urlParams = parseReportURLParams(route.query); + + // Set the range type first + if (urlParams.range) { + selectedDateRange.value = urlParams.range; + } + + // Restore dates from URL if available + if (urlParams.from && urlParams.to) { + customDateRange.value = [ + new Date(urlParams.from * 1000), + new Date(urlParams.to * 1000), + ]; + } + + if (urlParams.businessHours) { + businessHoursSelected.value = urlParams.businessHours; + } +}; + +onMounted(() => { + initializeFromURL(); + emitChange(); +}); + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/ReportFilters.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/ReportFilters.vue index 02b286d07..4b86aefba 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/ReportFilters.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/ReportFilters.vue @@ -1,349 +1,382 @@ - diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAFilter.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAFilter.vue index abe5674eb..599c7ca5c 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAFilter.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAFilter.vue @@ -1,155 +1,201 @@ -