1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-18 07:52:23 +01:00

Merge branch 'dev' into master for release 4.5.5

This commit is contained in:
Sylvain 2020-08-26 10:16:11 +02:00
commit 9ed3a9de78
14 changed files with 55 additions and 29 deletions

View File

@ -1,5 +1,11 @@
# Changelog Fab-manager # Changelog Fab-manager
## v4.5.5 2020 August 26
- Improved portuguese translations
- Fix a bug: unable to search for projects on OpenLab
- Fix a bug: erroneous translations in english (#226)
## v4.5.4 2020 July 29 ## v4.5.4 2020 July 29
- Display an asterisk on the phone input field, in the admin creation form, if the phone is configured as required - Display an asterisk on the phone input field, in the admin creation form, if the phone is configured as required

View File

@ -73,7 +73,7 @@ If you want to try it, you can visit [this Fab-manager](https://fablab.lacasemat
To start using this awesome feature, there are a few steps: To start using this awesome feature, there are a few steps:
- send a mail to **contact@fab-manager.com** asking for your Open Projects client's credentials and giving them the name and the URL of your Fab-manager, they will give you an `App ID` and a `secret` - send a mail to **contact@fab-manager.com** asking for your Open Projects client's credentials and giving them the name and the URL of your Fab-manager, they will give you an `App ID` and a `secret`
- fill in the value of the keys in Admin > Projects > Settings > Projects sharing - fill in the value of the keys in Admin > Projects > Settings > Projects sharing
- export your projects to open-projects (if you already have projects created on your Fab-manager, unless you can skip that part) executing this command: `bundle exec rake fablab:openlab:bulk_export` - export your projects to open-projects (if you already have projects created on your Fab-manager, unless you can skip that part) executing this command: `bundle exec rails fablab:openlab:bulk_export`
**IMPORTANT: please run your server in production mode.** **IMPORTANT: please run your server in production mode.**

View File

@ -306,13 +306,16 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
// list of components / used for filtering // list of components / used for filtering
$scope.components = componentsPromise; $scope.components = componentsPromise;
/**
* Callback triggered when the button "search from the whole network" is toggled
*/
$scope.searchOverWholeNetworkChanged = function () { $scope.searchOverWholeNetworkChanged = function () {
setTimeout( $scope.resetFiltersAndTriggerSearch();
function () { $scope.resetFiltersAndTriggerSearch(); },
150
);
}; };
/**
* Callback to load the next projects of the result set, for the current search
*/
$scope.loadMore = function () { $scope.loadMore = function () {
if ($scope.openlab.searchOverWholeNetwork === true) { if ($scope.openlab.searchOverWholeNetwork === true) {
return $scope.projectsPagination.loadMore({ q: $scope.search.q }); return $scope.projectsPagination.loadMore({ q: $scope.search.q });
@ -321,6 +324,9 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
} }
}; };
/**
* Reinitialize the search filters (used by the projects from the instance DB) and trigger a new search query
*/
$scope.resetFiltersAndTriggerSearch = function () { $scope.resetFiltersAndTriggerSearch = function () {
$scope.search.q = ''; $scope.search.q = '';
$scope.search.from = undefined; $scope.search.from = undefined;
@ -331,13 +337,17 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
return $scope.triggerSearch(); return $scope.triggerSearch();
}; };
/**
* Query the list of projects. Depending on $scope.openlab.searchOverWholeNetwork, the resulting list
* will be fetched from OpenLab or from the instance DB
*/
$scope.triggerSearch = function () { $scope.triggerSearch = function () {
const currentPage = parseInt($location.$$search.page) || 1; const currentPage = parseInt($location.$$search.page) || 1;
if ($scope.openlab.searchOverWholeNetwork === true) { if ($scope.openlab.searchOverWholeNetwork === true) {
updateUrlParam('whole_network', 't'); updateUrlParam('whole_network', 't');
$scope.projectsPagination = new paginationService.Instance(OpenlabProject, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreOpenlabCallback); $scope.projectsPagination = new paginationService.Instance(OpenlabProject, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreOpenlabCallback);
return OpenlabProject.query({ q: $scope.search.q, page: currentPage, per_page: PROJECTS_PER_PAGE }, function (projectsPromise) { return OpenlabProject.query({ q: $scope.search.q, page: currentPage, per_page: PROJECTS_PER_PAGE }, function (projectsPromise) {
if (projectsPromise.errors != null) { if (projectsPromise.errors) {
growl.error(_t('app.public.projects_list.openlab_search_not_available_at_the_moment')); growl.error(_t('app.public.projects_list.openlab_search_not_available_at_the_moment'));
$scope.openlab.searchOverWholeNetwork = false; $scope.openlab.searchOverWholeNetwork = false;
return $scope.triggerSearch(); return $scope.triggerSearch();
@ -357,7 +367,7 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
}; };
/** /**
* Callback to switch the user's view to the detailled project page * Callback to switch the user's view to the detailed project page
* @param project {{slug:string}} The project to display * @param project {{slug:string}} The project to display
*/ */
$scope.showProject = function (project) { $scope.showProject = function (project) {
@ -402,17 +412,25 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
const updateUrlParam = function (name, value) { const updateUrlParam = function (name, value) {
$state.current.reloadOnSearch = false; $state.current.reloadOnSearch = false;
$location.search(name, value); $location.search(name, value);
return $timeout(function () { $state.current.reloadOnSearch = undefined; }); $timeout(function () { $state.current.reloadOnSearch = undefined; });
}; };
/**
* Callback triggered when the next projects were loaded from the result set (from the instance DB)
* @param projectsPromise {{projects: []}}
*/
const loadMoreCallback = function (projectsPromise) { const loadMoreCallback = function (projectsPromise) {
$scope.projects = $scope.projects.concat(projectsPromise.projects); $scope.projects = $scope.projects.concat(projectsPromise.projects);
return updateUrlParam('page', $scope.projectsPagination.currentPage); updateUrlParam('page', $scope.projectsPagination.currentPage);
}; };
/**
* Callback triggered when the next projects were loaded from the result set (from OpenLab)
* @param projectsPromise {{projects: []}}
*/
const loadMoreOpenlabCallback = function (projectsPromise) { const loadMoreOpenlabCallback = function (projectsPromise) {
$scope.projects = $scope.projects.concat(normalizeProjectsAttrs(projectsPromise.projects)); $scope.projects = $scope.projects.concat(normalizeProjectsAttrs(projectsPromise.projects));
return updateUrlParam('page', $scope.projectsPagination.currentPage); updateUrlParam('page', $scope.projectsPagination.currentPage);
}; };
const normalizeProjectsAttrs = function (projects) { const normalizeProjectsAttrs = function (projects) {

View File

@ -1418,7 +1418,7 @@ en:
content: "Fully personalize this page to present your activity." content: "Fully personalize this page to present your activity."
privacy: privacy:
title: "Privacy policy" title: "Privacy policy"
content: "<p>EExplain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>" content: "<p>Explain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>"
draft: draft:
title: "Draft" title: "Draft"
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete." content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."

View File

@ -1418,7 +1418,7 @@ es:
content: "Fully personalize this page to present your activity." content: "Fully personalize this page to present your activity."
privacy: privacy:
title: "Política de privacidad" title: "Política de privacidad"
content: "<p>EExplain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>" content: "<p>Explain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>"
draft: draft:
title: "Draft" title: "Draft"
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete." content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."

View File

@ -1418,7 +1418,7 @@ pt:
content: "Fully personalize this page to present your activity." content: "Fully personalize this page to present your activity."
privacy: privacy:
title: "Política de privacidade" title: "Política de privacidade"
content: "<p>EExplain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>" content: "<p>Explain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>"
draft: draft:
title: "Draft" title: "Draft"
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete." content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."

View File

@ -1418,7 +1418,7 @@ zu:
content: "crwdns20116:0crwdne20116:0" content: "crwdns20116:0crwdne20116:0"
privacy: privacy:
title: "crwdns20118:0crwdne20118:0" title: "crwdns20118:0crwdne20118:0"
content: "crwdns20120:0crwdne20120:0" content: "crwdns20890:0crwdne20890:0"
draft: draft:
title: "crwdns20122:0crwdne20122:0" title: "crwdns20122:0crwdne20122:0"
content: "crwdns20124:0crwdne20124:0" content: "crwdns20124:0crwdne20124:0"

View File

@ -7,7 +7,7 @@ pt:
you_ve_just_created_a_new_account_on_the_fablab_by_logging_from: "Você acabou de criar uma nova conta como {GENDER, select, male{o} female{a} neutral{} other{do}} {NAME}" you_ve_just_created_a_new_account_on_the_fablab_by_logging_from: "Você acabou de criar uma nova conta como {GENDER, select, male{o} female{a} neutral{} other{do}} {NAME}"
we_need_some_more_details: "Para finalizar a configuração da plataforma, precisamos de mais detalhes" we_need_some_more_details: "Para finalizar a configuração da plataforma, precisamos de mais detalhes"
your_email_is_already_used_by_another_account_on_the_platform: "Parece que seu endereço de e-mail já é usado por outro usuário. Verifique seu endereço de e-mail e insira abaixo o código enviado para você." your_email_is_already_used_by_another_account_on_the_platform: "Parece que seu endereço de e-mail já é usado por outro usuário. Verifique seu endereço de e-mail e insira abaixo o código enviado para você."
or: "or" or: "ou"
please_fill_the_following_form: "Preencha o seguinte formulário" please_fill_the_following_form: "Preencha o seguinte formulário"
some_data_may_have_already_been_provided_by_provider_and_cannot_be_modified: "Alguns dados podem já ter sido fornecidos por {NAME} e não podem ser modificados" some_data_may_have_already_been_provided_by_provider_and_cannot_be_modified: "Alguns dados podem já ter sido fornecidos por {NAME} e não podem ser modificados"
then_click_on_: "Em seguida, clique em" then_click_on_: "Em seguida, clique em"
@ -16,7 +16,7 @@ pt:
your_email_: "Seu email" your_email_: "Seu email"
_is_currently_associated_with_another_account_on_this_platform: "Está atualmente associado a outra conta nesta plataforma." _is_currently_associated_with_another_account_on_this_platform: "Está atualmente associado a outra conta nesta plataforma."
please_click_to_change_email_associated_with_your_PROVIDER_account: "Se não for seu, clique no botão a seguir para alterar o e-mail associado à sua conta do {PROVIDER}." please_click_to_change_email_associated_with_your_PROVIDER_account: "Se não for seu, clique no botão a seguir para alterar o e-mail associado à sua conta do {PROVIDER}."
do_you_already_have_an_account: "Do you already have an account?" do_you_already_have_an_account: "Já tem uma conta?"
do_not_fill_the_form_beside_but_specify_here_the_code_you_ve_received_by_email_to_recover_your_access: "Não preencha o formulário ao lado, mas especifique aqui o código que recebeu por e-mail, para recuperar o seu acesso." do_not_fill_the_form_beside_but_specify_here_the_code_you_ve_received_by_email_to_recover_your_access: "Não preencha o formulário ao lado, mas especifique aqui o código que recebeu por e-mail, para recuperar o seu acesso."
just_specify_code_here_to_recover_access: "Basta especificar aqui o código que recebeu por e-mail para recuperar o seu acesso." just_specify_code_here_to_recover_access: "Basta especificar aqui o código que recebeu por e-mail para recuperar o seu acesso."
i_did_not_receive_the_code: "Eu não recebi o código" i_did_not_receive_the_code: "Eu não recebi o código"
@ -25,16 +25,16 @@ pt:
an_unexpected_error_occurred_check_your_authentication_code: "Um erro inexperado ocorreu, por favor cheque seu código de autenticação." an_unexpected_error_occurred_check_your_authentication_code: "Um erro inexperado ocorreu, por favor cheque seu código de autenticação."
send_code_again: "Enviar código novamente" send_code_again: "Enviar código novamente"
email_address_associated_with_your_account: "Email associado com sua conta" email_address_associated_with_your_account: "Email associado com sua conta"
email_is_required: "Email address is required" email_is_required: "Email é obrigatório"
email_format_is_incorrect: "Formato de email incorreto" email_format_is_incorrect: "Formato de email incorreto"
code_successfully_sent_again: "Código enviado novamente com sucesso" code_successfully_sent_again: "Código enviado novamente com sucesso"
used_for_statistics: "This data will be used for statistical purposes" used_for_statistics: "Estes dados serão utilizados para fins estatísticos"
your_user_s_profile: "Your user's profile" your_user_s_profile: "Seu perfil de usuário"
user_s_profile_is_required: "User's profile is required." user_s_profile_is_required: "Seu perfil de usuário é obrigatório."
i_ve_read_and_i_accept_: "I've read and I accept" i_ve_read_and_i_accept_: "Eu li e aceito"
_the_fablab_policy: "the FabLab policy" _the_fablab_policy: "a política do FabLab"
change_my_data: "Change my data" change_my_data: "Alterar meus dados"
sync_my_profile: "Sync my profile" sync_my_profile: "Sincronizar meu perfil"
once_your_data_are_up_to_date_: "Once your data are up to date," once_your_data_are_up_to_date_: "Once your data are up to date,"
_click_on_the_synchronization_button_opposite_: "click on the synchronization button opposite" _click_on_the_synchronization_button_opposite_: "click on the synchronization button opposite"
_disconnect_then_reconnect_: "disconnect then reconnect" _disconnect_then_reconnect_: "disconnect then reconnect"

View File

@ -371,7 +371,7 @@ en:
content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"
trainings: trainings:
title: "Trainings" title: "Trainings"
content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Certaines formations peuvent être un préalable à la réservation de certaines machines.</p><p>Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Trainings can be set as prerequisites before allowing reservation of certain machines.</p><p>Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"
spaces: spaces:
title: "Spaces" title: "Spaces"
content: "<p>This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"

View File

@ -371,7 +371,7 @@ es:
content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"
trainings: trainings:
title: "Trainings" title: "Trainings"
content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Certaines formations peuvent être un préalable à la réservation de certaines machines.</p><p>Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Trainings can be set as prerequisites before allowing reservation of certain machines.</p><p>Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"
spaces: spaces:
title: "Spaces" title: "Spaces"
content: "<p>This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"

View File

@ -371,7 +371,7 @@ pt:
content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"
trainings: trainings:
title: "Trainings" title: "Trainings"
content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Certaines formations peuvent être un préalable à la réservation de certaines machines.</p><p>Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Trainings can be set as prerequisites before allowing reservation of certain machines.</p><p>Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"
spaces: spaces:
title: "Spaces" title: "Spaces"
content: "<p>This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>" content: "<p>This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.</p>"

View File

@ -371,7 +371,7 @@ zu:
content: "crwdns19660:0crwdne19660:0" content: "crwdns19660:0crwdne19660:0"
trainings: trainings:
title: "crwdns19662:0crwdne19662:0" title: "crwdns19662:0crwdne19662:0"
content: "crwdns19664:0crwdne19664:0" content: "crwdns20892:0crwdne20892:0"
spaces: spaces:
title: "crwdns19666:0crwdne19666:0" title: "crwdns19666:0crwdne19666:0"
content: "crwdns19668:0crwdne19668:0" content: "crwdns19668:0crwdne19668:0"

View File

@ -861,6 +861,8 @@ Setting.set('email_from', 'noreply@fab-manager.com') unless Setting.find_by(name
Setting.set('online_payment_module', false) unless Setting.find_by(name: 'online_payment_module').try(:value) Setting.set('online_payment_module', false) unless Setting.find_by(name: 'online_payment_module').try(:value)
Setting.set('openlab_default', true) unless Setting.find_by(name: 'openlab_default').try(:value)
unless Setting.find_by(name: 'allowed_cad_extensions').try(:value) unless Setting.find_by(name: 'allowed_cad_extensions').try(:value)
Setting.set( Setting.set(
'allowed_cad_extensions', 'allowed_cad_extensions',

View File

@ -1,6 +1,6 @@
{ {
"name": "fab-manager", "name": "fab-manager",
"version": "4.5.4", "version": "4.5.5",
"description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.", "description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.",
"keywords": [ "keywords": [
"fablab", "fablab",