mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-01-17 06:52:27 +01:00
Merge branch 'dev' into master for release 4.5.5
This commit is contained in:
commit
9ed3a9de78
@ -1,5 +1,11 @@
|
||||
# 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
|
||||
|
||||
- Display an asterisk on the phone input field, in the admin creation form, if the phone is configured as required
|
||||
|
@ -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:
|
||||
- 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
|
||||
- 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.**
|
||||
|
||||
|
@ -306,13 +306,16 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
|
||||
// list of components / used for filtering
|
||||
$scope.components = componentsPromise;
|
||||
|
||||
/**
|
||||
* Callback triggered when the button "search from the whole network" is toggled
|
||||
*/
|
||||
$scope.searchOverWholeNetworkChanged = function () {
|
||||
setTimeout(
|
||||
function () { $scope.resetFiltersAndTriggerSearch(); },
|
||||
150
|
||||
);
|
||||
$scope.resetFiltersAndTriggerSearch();
|
||||
};
|
||||
|
||||
/**
|
||||
* Callback to load the next projects of the result set, for the current search
|
||||
*/
|
||||
$scope.loadMore = function () {
|
||||
if ($scope.openlab.searchOverWholeNetwork === true) {
|
||||
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.search.q = '';
|
||||
$scope.search.from = undefined;
|
||||
@ -331,13 +337,17 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
|
||||
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 () {
|
||||
const currentPage = parseInt($location.$$search.page) || 1;
|
||||
if ($scope.openlab.searchOverWholeNetwork === true) {
|
||||
updateUrlParam('whole_network', 't');
|
||||
$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) {
|
||||
if (projectsPromise.errors != null) {
|
||||
if (projectsPromise.errors) {
|
||||
growl.error(_t('app.public.projects_list.openlab_search_not_available_at_the_moment'));
|
||||
$scope.openlab.searchOverWholeNetwork = false;
|
||||
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
|
||||
*/
|
||||
$scope.showProject = function (project) {
|
||||
@ -402,17 +412,25 @@ Application.Controllers.controller('ProjectsController', ['$scope', '$state', 'P
|
||||
const updateUrlParam = function (name, value) {
|
||||
$state.current.reloadOnSearch = false;
|
||||
$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) {
|
||||
$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) {
|
||||
$scope.projects = $scope.projects.concat(normalizeProjectsAttrs(projectsPromise.projects));
|
||||
return updateUrlParam('page', $scope.projectsPagination.currentPage);
|
||||
updateUrlParam('page', $scope.projectsPagination.currentPage);
|
||||
};
|
||||
|
||||
const normalizeProjectsAttrs = function (projects) {
|
||||
|
@ -1418,7 +1418,7 @@ en:
|
||||
content: "Fully personalize this page to present your activity."
|
||||
privacy:
|
||||
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:
|
||||
title: "Draft"
|
||||
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."
|
||||
|
@ -1418,7 +1418,7 @@ es:
|
||||
content: "Fully personalize this page to present your activity."
|
||||
privacy:
|
||||
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:
|
||||
title: "Draft"
|
||||
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."
|
||||
|
@ -1418,7 +1418,7 @@ pt:
|
||||
content: "Fully personalize this page to present your activity."
|
||||
privacy:
|
||||
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:
|
||||
title: "Draft"
|
||||
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."
|
||||
|
@ -1418,7 +1418,7 @@ zu:
|
||||
content: "crwdns20116:0crwdne20116:0"
|
||||
privacy:
|
||||
title: "crwdns20118:0crwdne20118:0"
|
||||
content: "crwdns20120:0crwdne20120:0"
|
||||
content: "crwdns20890:0crwdne20890:0"
|
||||
draft:
|
||||
title: "crwdns20122:0crwdne20122:0"
|
||||
content: "crwdns20124:0crwdne20124:0"
|
||||
|
@ -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}"
|
||||
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ê."
|
||||
or: "or"
|
||||
or: "ou"
|
||||
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"
|
||||
then_click_on_: "Em seguida, clique em"
|
||||
@ -16,7 +16,7 @@ pt:
|
||||
your_email_: "Seu email"
|
||||
_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}."
|
||||
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."
|
||||
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"
|
||||
@ -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."
|
||||
send_code_again: "Enviar código novamente"
|
||||
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"
|
||||
code_successfully_sent_again: "Código enviado novamente com sucesso"
|
||||
used_for_statistics: "This data will be used for statistical purposes"
|
||||
your_user_s_profile: "Your user's profile"
|
||||
user_s_profile_is_required: "User's profile is required."
|
||||
i_ve_read_and_i_accept_: "I've read and I accept"
|
||||
_the_fablab_policy: "the FabLab policy"
|
||||
change_my_data: "Change my data"
|
||||
sync_my_profile: "Sync my profile"
|
||||
used_for_statistics: "Estes dados serão utilizados para fins estatísticos"
|
||||
your_user_s_profile: "Seu perfil de usuário"
|
||||
user_s_profile_is_required: "Seu perfil de usuário é obrigatório."
|
||||
i_ve_read_and_i_accept_: "Eu li e aceito"
|
||||
_the_fablab_policy: "a política do FabLab"
|
||||
change_my_data: "Alterar meus dados"
|
||||
sync_my_profile: "Sincronizar meu perfil"
|
||||
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"
|
||||
_disconnect_then_reconnect_: "disconnect then reconnect"
|
||||
|
@ -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>"
|
||||
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:
|
||||
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>"
|
||||
|
@ -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>"
|
||||
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:
|
||||
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>"
|
||||
|
@ -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>"
|
||||
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:
|
||||
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>"
|
||||
|
@ -371,7 +371,7 @@ zu:
|
||||
content: "crwdns19660:0crwdne19660:0"
|
||||
trainings:
|
||||
title: "crwdns19662:0crwdne19662:0"
|
||||
content: "crwdns19664:0crwdne19664:0"
|
||||
content: "crwdns20892:0crwdne20892:0"
|
||||
spaces:
|
||||
title: "crwdns19666:0crwdne19666:0"
|
||||
content: "crwdns19668:0crwdne19668:0"
|
||||
|
@ -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('openlab_default', true) unless Setting.find_by(name: 'openlab_default').try(:value)
|
||||
|
||||
unless Setting.find_by(name: 'allowed_cad_extensions').try(:value)
|
||||
Setting.set(
|
||||
'allowed_cad_extensions',
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"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.",
|
||||
"keywords": [
|
||||
"fablab",
|
||||
|
Loading…
x
Reference in New Issue
Block a user