From bc284e7813a78d4699fc9d2348676d7ce89d33b3 Mon Sep 17 00:00:00 2001 From: Nicolas Florentin Date: Mon, 3 Jul 2023 11:42:29 +0200 Subject: [PATCH] filter projects by date --- .../src/javascript/controllers/projects.js | 20 +++++++++++-- app/frontend/src/javascript/models/setting.ts | 3 +- app/frontend/src/javascript/router.js | 2 +- .../templates/admin/projects/settings.html | 7 +++++ app/frontend/templates/projects/index.html | 28 ++++++++++++++++++- app/helpers/settings_helper.rb | 1 + app/policies/setting_policy.rb | 2 +- app/services/project_service.rb | 6 ++++ app/views/application/index.html.erb | 3 -- config/locales/app.admin.en.yml | 1 + config/locales/app.admin.fr.yml | 1 + config/locales/app.public.en.yml | 3 ++ config/locales/app.public.fr.yml | 3 ++ config/locales/en.yml | 1 + config/locales/fr.yml | 1 + db/seeds/settings.rb | 1 + test/fixtures/history_values.yml | 8 ++++++ test/fixtures/settings.yml | 6 ++++ test/frontend/__fixtures__/settings.ts | 6 ++++ 19 files changed, 94 insertions(+), 9 deletions(-) diff --git a/app/frontend/src/javascript/controllers/projects.js b/app/frontend/src/javascript/controllers/projects.js index f09615e07..da3e1eb7c 100644 --- a/app/frontend/src/javascript/controllers/projects.js +++ b/app/frontend/src/javascript/controllers/projects.js @@ -294,7 +294,9 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P // Fab-manager's instance ID in the openLab network $scope.openlabAppId = settingsPromise.openlab_app_id; + // settings of optional filters $scope.memberFilterPresence = settingsPromise.projects_list_member_filter_presence !== 'false'; + $scope.dateFiltersPresence = settingsPromise.projects_list_date_filters_presence !== 'false'; // Is openLab enabled on the instance? $scope.openlab = { @@ -306,6 +308,9 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P $location.$$search.member_id = ''; } + fromDate = $location.$$search.from_date ? new Date($location.$$search.from_date) : undefined; + toDate = $location.$$search.to_date ? new Date($location.$$search.to_date) : undefined; + // default search parameters $scope.search = { q: ($location.$$search.q || ''), @@ -314,7 +319,9 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P component_id: (parseInt($location.$$search.component_id) || undefined), theme_id: (parseInt($location.$$search.theme_id) || undefined), status_id: (parseInt($location.$$search.status_id) || undefined), - member_id: (parseInt($location.$$search.member_id) || undefined) + member_id: (parseInt($location.$$search.member_id) || undefined), + from_date: fromDate, + to_date: toDate }; $scope.autoCompleteMemberName = function (nameLookup) { @@ -385,6 +392,8 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P $scope.search.theme_id = undefined; $scope.search.status_id = undefined; $scope.search.member_id = undefined; + $scope.search.from_date = undefined; + $scope.search.to_date = undefined; $scope.$apply(); $scope.setUrlQueryParams($scope.search); $scope.triggerSearch(); @@ -413,7 +422,10 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P } else { updateUrlParam('whole_network', 'f'); $scope.projectsPagination = new paginationService.Instance(Project, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreCallback, 'search'); - Project.search({ search: $scope.search, page: currentPage, per_page: PROJECTS_PER_PAGE }, function (projectsPromise) { + const fromDate = $scope.search.from_date ? $scope.search.from_date.toLocaleDateString() : undefined; + const toDate = $scope.search.to_date ? $scope.search.to_date.toLocaleDateString() : undefined; + const searchParams = Object.assign({}, $scope.search, { from_date: fromDate, to_date: toDate }); + Project.search({ search: searchParams, page: currentPage, per_page: PROJECTS_PER_PAGE }, function (projectsPromise) { $scope.projectsPagination.totalCount = projectsPromise.meta.total; $scope.projects = projectsPromise.projects; }); @@ -445,6 +457,10 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P updateUrlParam('machine_id', search.machine_id); updateUrlParam('status_id', search.status_id); updateUrlParam('member_id', search.member_id); + const fromDate = search.from_date ? search.from_date.toDateString() : undefined; + updateUrlParam('from_date', fromDate); + const toDate = search.to_date ? search.to_date.toDateString() : undefined; + updateUrlParam('to_date', toDate); return true; }; diff --git a/app/frontend/src/javascript/models/setting.ts b/app/frontend/src/javascript/models/setting.ts index 37ffd2fdb..72a2afae1 100644 --- a/app/frontend/src/javascript/models/setting.ts +++ b/app/frontend/src/javascript/models/setting.ts @@ -199,7 +199,8 @@ export const projectsSettings = [ 'allowed_cad_extensions', 'allowed_cad_mime_types', 'disqus_shortname', - 'projects_list_member_filter_presence' + 'projects_list_member_filter_presence', + 'projects_list_date_filters_presence' ] as const; export const prepaidPacksSettings = [ diff --git a/app/frontend/src/javascript/router.js b/app/frontend/src/javascript/router.js index a400a3323..eb06912d8 100644 --- a/app/frontend/src/javascript/router.js +++ b/app/frontend/src/javascript/router.js @@ -301,7 +301,7 @@ angular.module('application.router', ['ui.router']) themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }], componentsPromise: ['Component', function (Component) { return Component.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], - settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['openlab_app_id', 'openlab_default', 'projects_list_member_filter_presence']" }).$promise; }], + settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['openlab_app_id', 'openlab_default', 'projects_list_member_filter_presence', 'projects_list_date_filters_presence']" }).$promise; }], openLabActive: ['Setting', function (Setting) { return Setting.isPresent({ name: 'openlab_app_secret' }).$promise; }] } }) diff --git a/app/frontend/templates/admin/projects/settings.html b/app/frontend/templates/admin/projects/settings.html index e7757928f..df37133fc 100644 --- a/app/frontend/templates/admin/projects/settings.html +++ b/app/frontend/templates/admin/projects/settings.html @@ -108,5 +108,12 @@ on-error="onError" class-name="'m-l'"> +
+ +
diff --git a/app/frontend/templates/projects/index.html b/app/frontend/templates/projects/index.html index 1ee31bddf..e58a6eb22 100644 --- a/app/frontend/templates/projects/index.html +++ b/app/frontend/templates/projects/index.html @@ -22,7 +22,7 @@
-

Filter

+

{{ 'app.public.projects_list.filter' }}

{{ 'app.public.projects_list.reset_all_filters' | translate }}
@@ -74,6 +74,32 @@ + + + +
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 5dc8cea10..42e922522 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -197,6 +197,7 @@ module SettingsHelper events_banner_cta_label events_banner_cta_url projects_list_member_filter_presence + projects_list_date_filters_presence ].freeze end # rubocop:enable Metrics/ModuleLength diff --git a/app/policies/setting_policy.rb b/app/policies/setting_policy.rb index 1e11dfe90..d5763f70e 100644 --- a/app/policies/setting_policy.rb +++ b/app/policies/setting_policy.rb @@ -46,7 +46,7 @@ class SettingPolicy < ApplicationPolicy external_id machines_banner_active machines_banner_text machines_banner_cta_active machines_banner_cta_label machines_banner_cta_url trainings_banner_active trainings_banner_text trainings_banner_cta_active trainings_banner_cta_label trainings_banner_cta_url events_banner_active events_banner_text events_banner_cta_active events_banner_cta_label - events_banner_cta_url projects_list_member_filter_presence] + events_banner_cta_url projects_list_member_filter_presence projects_list_date_filters_presence] end ## diff --git a/app/services/project_service.rb b/app/services/project_service.rb index 3e01d5c16..7acf89a86 100644 --- a/app/services/project_service.rb +++ b/app/services/project_service.rb @@ -31,6 +31,12 @@ class ProjectService end end + created_from = Time.zone.parse(query_params['from_date']).beginning_of_day if query_params['from_date'].present? + created_to = Time.zone.parse(query_params['to_date']).end_of_day if query_params['to_date'].present? + if created_from || created_to + records = records.where(created_at: created_from..created_to) + end + records = if query_params['q'].present? records.search(query_params['q']) else diff --git a/app/views/application/index.html.erb b/app/views/application/index.html.erb index 87396cdcf..159ec0737 100644 --- a/app/views/application/index.html.erb +++ b/app/views/application/index.html.erb @@ -61,9 +61,6 @@ buttons: <%= I18n.t('app.shared.buttons').to_json.html_safe %>, messages: <%= I18n.t('app.shared.messages').to_json.html_safe %> } - }, - date: { - month_names: <%= I18n.t('date.month_names').to_json.html_safe %> } }; Fablab.weekStartingDay = <%= Date.parse(Rails.application.secrets.week_starting_day).strftime('%w') %>; diff --git a/config/locales/app.admin.en.yml b/config/locales/app.admin.en.yml index 8d211c2b0..558a9c6d5 100644 --- a/config/locales/app.admin.en.yml +++ b/config/locales/app.admin.en.yml @@ -1775,6 +1775,7 @@ en: public_registrations: "Public registrations" show_username_in_admin_list: "Show the username in the list" projects_list_member_filter_presence: "Presence of member filter on projects list" + projects_list_date_filters_presence: "Presence of date filters on projects list" overlapping_options: training_reservations: "Trainings" machine_reservations: "Machines" diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 003ab199c..4713e50ea 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -1775,6 +1775,7 @@ fr: public_registrations: "Inscriptions publiques" show_username_in_admin_list: "Afficher le nom d'utilisateur dans la liste" projects_list_member_filter_presence: "Présence du filtre par membre dans la vue liste des projets" + projects_list_date_filters_presence: "Présence des filtres par date dans la vue liste des projets" overlapping_options: training_reservations: "Formations" machine_reservations: "Machines" diff --git a/config/locales/app.public.en.yml b/config/locales/app.public.en.yml index 389775687..4afd8a93c 100644 --- a/config/locales/app.public.en.yml +++ b/config/locales/app.public.en.yml @@ -167,6 +167,7 @@ en: full_price: "Full price: " #projects gallery projects_list: + filter: Filter the_fablab_projects: "The projects" add_a_project: "Add a project" network_search: "Fab-manager network" @@ -184,6 +185,8 @@ en: load_next_projects: "Load next projects" rough_draft: "Rough draft" filter_by_member: "Filter by member" + created_from: Created from + created_to: Created to status_filter: all_statuses: "All statuses" select_status: "Select a status" diff --git a/config/locales/app.public.fr.yml b/config/locales/app.public.fr.yml index 82a6b7f15..9fe6efb2e 100644 --- a/config/locales/app.public.fr.yml +++ b/config/locales/app.public.fr.yml @@ -167,6 +167,7 @@ fr: full_price: "Plein tarif : " #projects gallery projects_list: + filter: Filtrer the_fablab_projects: "Les projets" add_a_project: "Ajouter un projet" network_search: "Réseau Fab-Manager" @@ -184,6 +185,8 @@ fr: load_next_projects: "Charger les projets suivants" rough_draft: "Brouillon" filter_by_member: "Filter par membre" + created_from: Créés à partir du + created_to: Créés jusqu'au status_filter: all_statuses: "Tous les statuts" select_status: "Sélectionnez un statut" diff --git a/config/locales/en.yml b/config/locales/en.yml index 7c3443d36..0bb5308ae 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -698,6 +698,7 @@ en: trainings_invalidation_rule: "Trainings automatic invalidation" trainings_invalidation_rule_period: "Grace period before invalidating a training" projects_list_member_filter_presence: "Presence of member filter on projects list" + projects_list_date_filters_presence: "Presence of dates filter on projects list" #statuses of projects statuses: new: "New" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index af049d102..8a7830d3f 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -698,6 +698,7 @@ fr: trainings_invalidation_rule: "Invalidation automatique des formations" trainings_invalidation_rule_period: "Période de grâce avant d'invalider une formation" projects_list_member_filter_presence: "Présence du filtre par membre dans la vue liste des projets" + projects_list_date_filters_presence: "Présence des filtres par date dans la vue liste des projets" #statuses of projects statuses: new: "Nouveau" diff --git a/db/seeds/settings.rb b/db/seeds/settings.rb index 28beafcda..2f770b440 100644 --- a/db/seeds/settings.rb +++ b/db/seeds/settings.rb @@ -730,3 +730,4 @@ Setting.set('accounting_Error_label', 'Erroneous invoices to refund') unless Set Setting.set('external_id', false) unless Setting.find_by(name: 'external_id').try(:value) Setting.set('projects_list_member_filter_presence', false) unless Setting.find_by(name: 'projects_list_member_filter_presence') +Setting.set('projects_list_date_filters_presence', false) unless Setting.find_by(name: 'projects_list_date_filters_presence') diff --git a/test/fixtures/history_values.yml b/test/fixtures/history_values.yml index 0ba0f4645..867a6f606 100644 --- a/test/fixtures/history_values.yml +++ b/test/fixtures/history_values.yml @@ -858,4 +858,12 @@ history_value_103: value: 'false' created_at: 2023-04-05 09:16:08.000511500 Z updated_at: 2023-04-05 09:16:08.000511500 Z + invoicing_profile_id: 1 + +history_value_104: + id: 104 + setting_id: 103 + value: 'false' + created_at: 2023-04-05 09:16:08.000511500 Z + updated_at: 2023-04-05 09:16:08.000511500 Z invoicing_profile_id: 1 \ No newline at end of file diff --git a/test/fixtures/settings.yml b/test/fixtures/settings.yml index 7b26448ac..0897fa5b3 100644 --- a/test/fixtures/settings.yml +++ b/test/fixtures/settings.yml @@ -592,3 +592,9 @@ setting_102: name: projects_list_member_filter_presence created_at: 2023-04-05 09:16:08.000511500 Z updated_at: 2023-04-05 09:16:08.000511500 Z + +setting_103: + id: 103 + name: projects_list_date_filters_presence + created_at: 2023-04-05 09:16:08.000511500 Z + updated_at: 2023-04-05 09:16:08.000511500 Z diff --git a/test/frontend/__fixtures__/settings.ts b/test/frontend/__fixtures__/settings.ts index 246191ea4..dbe7b7786 100644 --- a/test/frontend/__fixtures__/settings.ts +++ b/test/frontend/__fixtures__/settings.ts @@ -831,6 +831,12 @@ export const settings: Array = [ value: 'false', last_update: '2022-12-23T14:39:12+0100', localized: 'Projects list member filter presence' + }, + { + name: 'projects_list_date_filters_presence', + value: 'false', + last_update: '2022-12-23T14:39:12+0100', + localized: 'Projects list date filters presence' } ];