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 @@
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'
}
];