From 105f9a27d28fe2a196513e033d9ca23d81cbc267 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 18 May 2023 22:50:46 +0530 Subject: [PATCH] feat: more CSAT filters (#7038) * refactor: use grid instead of flex * refactor: let the parent layout decide the spacing * feat: add a separate date-range component * refactor: use new date-range component * fix: destructure all options * refactor: separate group by component * refactor: better handle group by data * fix: defaul group by * refactor: variable naming * refactor: use DATE_RANGE_OPTIONS directly * chore: update platform in gemfile.lock * refactor: trigger fetch on filter change * refactor: remove redundant method * refactor: simplify methods and emitting * refactor: simplify filter logic * refactor: simplify fetching * refactor: imports * refactor: prop name * refactor: CSAT response to use new APIs * refactor: use common filter event * refactor: use computed value for validGroupBy * refactor: better function names * refactor: rename prop * refactor: remove redundant props * refactor: separate agents filter component * feat: add labels filter * feat: add inboxes filter * fix: event * refactor: send label and inbox along with request payload * feat: add inbox filter * feat: add inbox to download * refactor: use request payload from computed property * refactor: params * feat: add team to csat filters * feat: add team to csat filters * feat: add filter for rating * feat: reverse options * feat: add labels for ratings and translations * feat: update translation * fix: margin and spacing * fix: trailing whitespace * feat: add tests for filters * chore: move files * feat: add try catch with alerts * feat: update import * fix: imports * Updates broken imports --------- Co-authored-by: Muhsin Keloth Co-authored-by: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> --- Gemfile.lock | 1 + .../csat_survey_responses_controller.rb | 9 +- app/javascript/dashboard/api/csatReports.js | 15 +- .../dashboard/assets/scss/_date-picker.scss | 16 +- .../assets/scss/plugins/_multiselect.scss | 4 +- .../dashboard/i18n/locale/en/csatMgmt.json | 9 +- .../dashboard/i18n/locale/en/report.json | 17 + .../settings/reports/CsatResponses.vue | 105 ++++--- .../dashboard/settings/reports/Index.vue | 95 ++---- .../reports/components/FilterSelector.vue | 296 ++++++++++-------- .../reports/components/Filters/Agents.vue | 45 +++ .../components/Filters/DateGroupBy.vue | 67 ++++ .../reports/components/Filters/DateRange.vue | 46 +++ .../reports/components/Filters/Inboxes.vue | 40 +++ .../reports/components/Filters/Labels.vue | 71 +++++ .../reports/components/Filters/Ratings.vue | 39 +++ .../reports/components/Filters/Teams.vue | 40 +++ .../specs/Filters/FiltersAgents.spec.js | 59 ++++ .../specs/Filters/FiltersDateGroupBy.spec.js | 45 +++ .../specs/Filters/FiltersDateRange.spec.js | 42 +++ .../specs/Filters/FiltersInboxes.spec.js | 66 ++++ .../specs/Filters/FiltersLabels.spec.js | 66 ++++ .../specs/Filters/FiltersRatings.spec.js | 45 +++ .../specs/Filters/FiltersTeams.spec.js | 62 ++++ .../dashboard/settings/reports/constants.js | 79 +++++ .../dashboard/store/modules/csat.js | 11 +- app/javascript/shared/constants/messages.js | 5 + app/javascript/shared/helpers/DateHelper.js | 7 + app/models/csat_survey_response.rb | 4 + 29 files changed, 1150 insertions(+), 256 deletions(-) create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Agents.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateGroupBy.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/DateRange.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Inboxes.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Labels.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Ratings.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Filters/Teams.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersAgents.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersDateGroupBy.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersDateRange.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersInboxes.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersLabels.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersRatings.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/specs/Filters/FiltersTeams.spec.js diff --git a/Gemfile.lock b/Gemfile.lock index 3723a738c..bec62cc75 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -784,6 +784,7 @@ GEM PLATFORMS arm64-darwin-20 + arm64-darwin-22 arm64-darwin-21 ruby x86_64-darwin-18 diff --git a/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb index 9495bbfa8..f5bed6c34 100644 --- a/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb +++ b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb @@ -34,9 +34,12 @@ class Api::V1::Accounts::CsatSurveyResponsesController < Api::V1::Accounts::Base end def set_csat_survey_responses - @csat_survey_responses = filtrate( - Current.account.csat_survey_responses.includes([:conversation, :assigned_agent, :contact]) - ).filter_by_created_at(range).filter_by_assigned_agent_id(params[:user_ids]) + base_query = Current.account.csat_survey_responses.includes([:conversation, :assigned_agent, :contact]) + @csat_survey_responses = filtrate(base_query).filter_by_created_at(range) + .filter_by_assigned_agent_id(params[:user_ids]) + .filter_by_inbox_id(params[:inbox_id]) + .filter_by_team_id(params[:team_id]) + .filter_by_rating(params[:rating]) end def set_current_page_surveys diff --git a/app/javascript/dashboard/api/csatReports.js b/app/javascript/dashboard/api/csatReports.js index 4decc8de3..46d5decd4 100644 --- a/app/javascript/dashboard/api/csatReports.js +++ b/app/javascript/dashboard/api/csatReports.js @@ -6,7 +6,7 @@ class CSATReportsAPI extends ApiClient { super('csat_survey_responses', { accountScoped: true }); } - get({ page, from, to, user_ids } = {}) { + get({ page, from, to, user_ids, inbox_id, team_id, rating } = {}) { return axios.get(this.url, { params: { page, @@ -14,24 +14,31 @@ class CSATReportsAPI extends ApiClient { until: to, sort: '-created_at', user_ids, + inbox_id, + team_id, + rating, }, }); } - download({ from, to, user_ids } = {}) { + download({ from, to, user_ids, inbox_id, team_id, rating } = {}) { return axios.get(`${this.url}/download`, { params: { since: from, until: to, sort: '-created_at', user_ids, + inbox_id, + team_id, + rating, }, }); } - getMetrics({ from, to, user_ids } = {}) { + getMetrics({ from, to, user_ids, inbox_id, team_id } = {}) { + // no ratings for metrics return axios.get(`${this.url}/metrics`, { - params: { since: from, until: to, user_ids }, + params: { since: from, until: to, user_ids, inbox_id, team_id }, }); } } diff --git a/app/javascript/dashboard/assets/scss/_date-picker.scss b/app/javascript/dashboard/assets/scss/_date-picker.scss index ece12c999..4377480c9 100644 --- a/app/javascript/dashboard/assets/scss/_date-picker.scss +++ b/app/javascript/dashboard/assets/scss/_date-picker.scss @@ -5,12 +5,20 @@ } .date-picker { - .mx-datepicker { - width: 100%; + &.no-margin { + .mx-input { + margin-bottom: 0; + } } - .mx-datepicker-range { - width: 320px; + &:not(.auto-width) { + .mx-datepicker-range { + width: 320px; + } + } + + .mx-datepicker { + width: 100%; } .mx-input { diff --git a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss index 3167b2085..f111a414f 100644 --- a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss +++ b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss @@ -13,7 +13,9 @@ } .multiselect { - margin-bottom: var(--space-normal); + &:not(.no-margin) { + margin-bottom: var(--space-normal); + } &.multiselect--disabled { opacity: 0.8; diff --git a/app/javascript/dashboard/i18n/locale/en/csatMgmt.json b/app/javascript/dashboard/i18n/locale/en/csatMgmt.json index d7d2efc2a..9e16dc2b3 100644 --- a/app/javascript/dashboard/i18n/locale/en/csatMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/csatMgmt.json @@ -1,6 +1,13 @@ { "CSAT": { "TITLE": "Rate your conversation", - "PLACEHOLDER": "Tell us more..." + "PLACEHOLDER": "Tell us more...", + "RATINGS": { + "POOR": "😞 Poor", + "FAIR": "😑 Fair", + "AVERAGE": "😐 Average", + "GOOD": "😀 Good", + "EXCELLENT": "😍 Excellent" + } } } diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json index 6ff093260..5858605a0 100644 --- a/app/javascript/dashboard/i18n/locale/en/report.json +++ b/app/javascript/dashboard/i18n/locale/en/report.json @@ -4,6 +4,8 @@ "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", + "DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.", + "SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.", "METRICS": { "CONVERSATIONS": { "NAME": "Conversations", @@ -34,6 +36,14 @@ "DESC": "( Total )" } }, + "DATE_RANGE_OPTIONS": { + "LAST_7_DAYS": "Last 7 days", + "LAST_30_DAYS": "Last 30 days", + "LAST_3_MONTHS": "Last 3 months", + "LAST_6_MONTHS": "Last 6 months", + "LAST_YEAR": "Last year", + "CUSTOM_DATE_RANGE": "Custom date range" + }, "DATE_RANGE": [ { "id": 0, @@ -66,6 +76,12 @@ }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", "DURATION_FILTER_LABEL": "Duration", + "GROUPING_OPTIONS": { + "DAY": "Day", + "WEEK": "Week", + "MONTH": "Month", + "YEAR": "Year" + }, "GROUP_BY_DAY_OPTIONS": [{ "id": 1, "groupBy": "Day" }], "GROUP_BY_WEEK_OPTIONS": [ { "id": 1, "groupBy": "Day" }, @@ -356,6 +372,7 @@ "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", "DOWNLOAD": "Download CSAT Reports", + "DOWNLOAD_FAILED": "Failed to download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue index f72ad8bad..501dc5a7c 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/CsatResponses.vue @@ -1,11 +1,12 @@