1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-02 13:24:20 +01:00

Merge branch 'dev' for release 5.0.4

This commit is contained in:
Sylvain 2021-06-15 12:28:35 +02:00
commit 8484268226
32 changed files with 212 additions and 143 deletions

View File

@ -1,5 +1,16 @@
# Changelog Fab-manager
## v5.0.4 2021 June 15
- Ability to disable the public agenda
- Display the category in the plans list
- Do not display the type in the plans list
- Updated medium-editor to v5 and angular-medium-editor accordingly
- Fix a bug: a message tells that creating a new plan fails, but it worked
- Fix a bug: unable to select no category in plan creation/edition after a category selection
- Fix a bug: the training validation modal shows cancelled trainings
- [TODO DEPLOY] `rails db:seed`
## v5.0.3 2021 June 14
- Updated user's manual for v5

View File

@ -1,4 +1,4 @@
#web: bundle exec rails server puma -p $PORT
web: bundle exec rails server puma -p $PORT
worker: bundle exec sidekiq -C ./config/sidekiq.yml
wp-client: bin/webpack-dev-server
wp-server: SERVER_BUNDLE_ONLY=yes bin/webpack --watch

View File

@ -26,11 +26,11 @@ class API::PlansController < API::ApiController
type = plan_params[:type]
partner = params[:plan][:partner_id].empty? ? nil : User.find(params[:plan][:partner_id])
res = PlansService.create(type, partner, plan_params)
if res.errors
render json: res.errors, status: :unprocessable_entity
plan = PlansService.create(type, partner, plan_params)
if plan.errors.keys.count.positive?
render json: plan.errors, status: :unprocessable_entity
else
render json: res, status: :created
render json: plan, status: :created
end
end

View File

@ -60,7 +60,8 @@ class API::TrainingsController < API::ApiController
@training = Training.find(params[:id])
@availabilities = @training.availabilities
.includes(slots: { reservations: { statistic_profile: [:trainings, user: [:profile]] } })
.order('start_at DESC')
.where('slots.canceled_at': nil)
.order('availabilities.start_at DESC')
end
private

View File

@ -87,6 +87,8 @@ Application.Controllers.controller('NewPlanController', ['$scope', '$uibModal',
// list of all plan categories
$scope.planCategories = planCategories;
// we add an empty element to let the user select 'no category'
$scope.planCategories.unshift({ id: null, name: '' });
// prices bindings
$scope.prices = {
@ -239,6 +241,8 @@ Application.Controllers.controller('EditPlanController', ['$scope', 'groups', 'p
// list of all plan categories
$scope.planCategories = planCategories;
// we add an empty element to let the user select 'no category'
$scope.planCategories.unshift({ id: null, name: '' });
// current form is used for edition mode
$scope.mode = 'edition';

View File

@ -18,8 +18,8 @@
/**
* Controller used in the prices edition page
*/
Application.Controllers.controller('EditPricingController', ['$scope', '$state', '$uibModal', '$filter', 'TrainingsPricing', 'Credit', 'Pricing', 'Plan', 'Coupon', 'plans', 'groups', 'growl', 'machinesPricesPromise', 'Price', 'dialogs', 'trainingsPricingsPromise', 'trainingsPromise', 'machineCreditsPromise', 'machinesPromise', 'trainingCreditsPromise', 'couponsPromise', 'spacesPromise', 'spacesPricesPromise', 'spacesCreditsPromise', 'settingsPromise', '_t', 'Member', 'uiTourService',
function ($scope, $state, $uibModal, $filter, TrainingsPricing, Credit, Pricing, Plan, Coupon, plans, groups, growl, machinesPricesPromise, Price, dialogs, trainingsPricingsPromise, trainingsPromise, machineCreditsPromise, machinesPromise, trainingCreditsPromise, couponsPromise, spacesPromise, spacesPricesPromise, spacesCreditsPromise, settingsPromise, _t, Member, uiTourService) {
Application.Controllers.controller('EditPricingController', ['$scope', '$state', '$uibModal', '$filter', 'TrainingsPricing', 'Credit', 'Pricing', 'Plan', 'Coupon', 'plans', 'groups', 'growl', 'machinesPricesPromise', 'Price', 'dialogs', 'trainingsPricingsPromise', 'trainingsPromise', 'machineCreditsPromise', 'machinesPromise', 'trainingCreditsPromise', 'couponsPromise', 'spacesPromise', 'spacesPricesPromise', 'spacesCreditsPromise', 'settingsPromise', '_t', 'Member', 'uiTourService', 'planCategories',
function ($scope, $state, $uibModal, $filter, TrainingsPricing, Credit, Pricing, Plan, Coupon, plans, groups, growl, machinesPricesPromise, Price, dialogs, trainingsPricingsPromise, trainingsPromise, machineCreditsPromise, machinesPromise, trainingCreditsPromise, couponsPromise, spacesPromise, spacesPricesPromise, spacesCreditsPromise, settingsPromise, _t, Member, uiTourService, planCategories) {
/* PUBLIC SCOPE */
// List of machines prices (not considering any plan)
@ -36,6 +36,9 @@ Application.Controllers.controller('EditPricingController', ['$scope', '$state',
$scope.groups = groups.filter(function (g) { return g.slug !== 'admins'; });
$scope.enabledGroups = groups.filter(function (g) { return (g.slug !== 'admins') && !g.disabled; });
// List of all plan-categories
$scope.planCategories = planCategories;
// Associate free machine hours with subscriptions
$scope.machineCredits = machineCreditsPromise;
@ -433,14 +436,15 @@ Application.Controllers.controller('EditPricingController', ['$scope', '$state',
};
/**
* If the plan does not have a type, return a default value for display purposes
* @param type {string|undefined|null} plan's type (eg. 'partner')
* @returns {string}
* Return the name of the plan-category, from its ID
* @param id {number|undefined} plan-category's id
* @returns {string} the name
*/
$scope.getPlanType = function (type) {
if (type === 'PartnerPlan') {
return _t('app.admin.pricing.partner');
} else { return _t('app.admin.pricing.standard'); }
$scope.getPlanCategory = function (id) {
const cat = $scope.planCategories.find(c => c.id === id);
if (cat) {
return cat.name;
}
};
/**

View File

@ -23,12 +23,6 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
class: 'home-link'
},
{ class: 'menu-spacer' },
{
state: 'app.public.calendar',
linkText: 'app.public.common.public_calendar',
linkIcon: 'calendar',
class: 'public-calendar-link'
},
{
state: 'app.public.machines_list',
linkText: 'app.public.common.reserve_a_machine',
@ -79,6 +73,15 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
});
}
if ($scope.$root.modules.publicAgenda) {
$scope.navLinks.splice(2, 0, {
state: 'app.public.calendar',
linkText: 'app.public.common.public_calendar',
linkIcon: 'calendar',
class: 'public-calendar-link'
});
}
Fablab.adminNavLinks = Fablab.adminNavLinks || [];
const adminNavLinks = [
{

View File

@ -107,7 +107,8 @@ export enum SettingName {
PayZenEndpoint = 'payzen_endpoint',
PayZenPublicKey = 'payzen_public_key',
PayZenHmacKey = 'payzen_hmac',
PayZenCurrency = 'payzen_currency'
PayZenCurrency = 'payzen_currency',
PublicAgendaModule = 'public_agenda_module'
}
export interface Setting {

View File

@ -38,7 +38,7 @@ angular.module('application.router', ['ui.router'])
logoFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-file' }).$promise; }],
logoBlackFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-black-file' }).$promise; }],
sharedTranslations: ['Translations', function (Translations) { return Translations.query(['app.shared', 'app.public.common']).$promise; }],
modulesPromise: ['Setting', function (Setting) { return Setting.query({ names: "['spaces_module', 'plans_module', 'invoicing_module', 'wallet_module', 'statistics_module', 'trainings_module']" }).$promise; }]
modulesPromise: ['Setting', function (Setting) { return Setting.query({ names: "['spaces_module', 'plans_module', 'invoicing_module', 'wallet_module', 'statistics_module', 'trainings_module', 'public_agenda_module']" }).$promise; }]
},
onEnter: ['$rootScope', 'logoFile', 'logoBlackFile', 'modulesPromise', 'CSRF', function ($rootScope, logoFile, logoBlackFile, modulesPromise, CSRF) {
// Retrieve Anti-CSRF tokens from cookies
@ -52,6 +52,7 @@ angular.module('application.router', ['ui.router'])
trainings: (modulesPromise.trainings_module === 'true'),
invoicing: (modulesPromise.invoicing_module === 'true'),
wallet: (modulesPromise.wallet_module === 'true'),
publicAgenda: (modulesPromise.public_agenda_module === 'true'),
statistics: (modulesPromise.statistics_module === 'true')
};
}]
@ -570,6 +571,7 @@ angular.module('application.router', ['ui.router'])
// global calendar (trainings, machines and events)
.state('app.public.calendar', {
url: '/calendar',
abstract: !Fablab.publicAgendaModule,
views: {
'main@': {
templateUrl: '/calendar/calendar.html',
@ -780,7 +782,8 @@ angular.module('application.router', ['ui.router'])
spacesPromise: ['Space', function (Space) { return Space.query().$promise; }],
spacesPricesPromise: ['Price', function (Price) { return Price.query({ priceable_type: 'Space', plan_id: 'null' }).$promise; }],
spacesCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Space' }).$promise; }],
settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['feature_tour_display', 'slot_duration']" }).$promise; }]
settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['feature_tour_display', 'slot_duration']" }).$promise; }],
planCategories: ['PlanCategory', function (PlanCategory) { return PlanCategory.query().$promise; }]
}
})
@ -1077,7 +1080,7 @@ angular.module('application.router', ['ui.router'])
"'fablab_name', 'name_genre', 'reminder_enable', 'plans_module', 'confirmation_required', " +
"'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', " +
"'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', " +
"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown']"
"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module']"
}).$promise;
}],
privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],

View File

@ -23,10 +23,10 @@
<table class="table">
<thead>
<tr>
<th><a href="" ng-click="setOrderPlans('type')">{{ 'app.admin.pricing.type' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': orderPlans=='type', 'fa fa-sort-alpha-desc': orderPlans=='-type', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th><a href="" ng-click="setOrderPlans('name')">{{ 'app.admin.pricing.name' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': orderPlans=='name', 'fa fa-sort-alpha-desc': orderPlans=='-name', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th><a href="" ng-click="setOrderPlans('interval')">{{ 'app.admin.pricing.duration' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-amount-asc': orderPlans=='interval', 'fa fa-sort-amount-desc': orderPlans=='-interval', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th><a href="" ng-click="setOrderPlans('group_id')">{{ 'app.admin.pricing.group' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': orderPlans=='group_id', 'fa fa-sort-alpha-desc': orderPlans=='-group_id', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th><a href="" ng-click="setOrderPlans('plan_category_id')">{{ 'app.admin.pricing.category' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': orderPlans=='plan_category_id', 'fa fa-sort-alpha-desc': orderPlans=='-plan_category_id', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th class="hidden-xs"><a href="" ng-click="setOrderPlans('app.admin.pricing.ui_weight')">{{ 'app.admin.pricing.prominence' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderPlans=='ui_weight', 'fa fa-sort-numeric-desc': orderPlans=='-ui_weight', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th><a href="" ng-click="setOrderPlans('amount')">{{ 'app.admin.pricing.price' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderPlans=='amount', 'fa fa-sort-numeric-desc': orderPlans=='-amount', 'fa fa-arrows-v': orderPlans }"></i></a></th>
<th></th>
@ -36,10 +36,10 @@
<tr ng-repeat="plan in plans | filterDisabled:planFiltering | orderBy:orderPlans"
ng-class="{'disabled-line' : plan.disabled && planFiltering === 'all'}"
ng-init="group = getGroupFromId(groups, plan.group_id)">
<td>{{getPlanType(plan.type)}}</td>
<td>{{plan.base_name}}</td>
<td>{{ plan.interval | planIntervalFilter:plan.interval_count }}</td>
<td>{{group.name}}</td>
<td>{{getPlanCategory(plan.plan_category_id)}}</td>
<td class="hidden-xs">{{plan.ui_weight}}</td>
<td>{{plan.amount | currency}}</td>
<td><button type="button" class="btn btn-default" ui-sref="app.admin.plans.edit({id:plan.id})"><i class="fa fa-pencil-square-o"></i></button> <button type="button" class="btn btn-danger" ng-click="deletePlan(plans, plan.id)"><i class="fa fa-trash"></i></button></td>

View File

@ -517,6 +517,14 @@
label="app.admin.settings.general.enable_wallet"
classes="m-l"></boolean-setting>
</div>
<div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.general.public_agenda' }}</h3>
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.general.public_agenda_info_html' | translate"></p>
<boolean-setting name="public_agenda_module"
settings="allSettings"
label="app.admin.settings.general.enable_public_agenda"
classes="m-l"></boolean-setting>
</div>
<div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.general.statistics' }}</h3>
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.general.statistics_info_html' | translate"></p>

View File

@ -117,7 +117,8 @@ class Setting < ApplicationRecord
payzen_endpoint
payzen_public_key
payzen_hmac
payzen_currency] }
payzen_currency
public_agenda_module] }
# WARNING: when adding a new key, you may also want to add it in app/policies/setting_policy.rb#public_whitelist
def value

View File

@ -39,7 +39,7 @@ class SettingPolicy < ApplicationPolicy
tracking_id book_overlapping_slots slot_duration events_in_calendar spaces_module plans_module invoicing_module
recaptcha_site_key feature_tour_display disqus_shortname allowed_cad_extensions openlab_app_id openlab_default
online_payment_module stripe_public_key confirmation_required wallet_module trainings_module address_required
payment_gateway payzen_endpoint payzen_public_key]
payment_gateway payzen_endpoint payzen_public_key public_agenda_module]
end
##

View File

@ -14,11 +14,8 @@ class PlansService
plan = type.constantize.new(params)
if plan.save
partner&.add_role :partner, plan
plan
else
puts plan.errors
{ errors: plan.errors }
end
plan
end
rescue PaymentGatewayError => e
{ errors: e.message }

View File

@ -36,6 +36,7 @@
Fablab.spacesModule = ('<%= Setting.get('spaces_module') %>' === 'true');
Fablab.trainingsModule = ('<%= Setting.get('trainings_module') %>' === 'true');
Fablab.walletModule = ('<%= Setting.get('wallet_module') %>' === 'true');
Fablab.publicAgendaModule = ('<%= Setting.get('public_agenda_module') %>' === 'true');
Fablab.statisticsModule = ('<%= Setting.get('statistics_module') %>' === 'true');
Fablab.defaultHost = "<%= Rails.application.secrets.default_host %>";
Fablab.trackingId = "<%= Setting.get('tracking_id') %>";

View File

@ -300,12 +300,10 @@ de:
list_of_the_subscription_plans: "Liste der Abonnement-Pläne"
disabled_plans_info_html: "<p><strong>Warnung:</strong> die Abonnements sind in dieser Anwendung deaktiviert.</p><p>Sie können Abonnements erstellen, aber sie werden erst mit der Aktivierung des Planungsmoduls im Abschnitt « Anpassen » verfügbar.</p>"
add_a_new_subscription_plan: "Neues Abonnement hinzufügen"
type: "Typ"
partner: "Partner"
standard: "Standard"
name: "Name"
duration: "Dauer"
group: "Gruppe"
category: "Kategorie"
prominence: "Hervorhebung"
price: "Preis"
machine_hours: "Maschinen-Slots"
@ -1169,6 +1167,7 @@ de:
confirmation_required_info: "Optional können Sie die Bestätigung der E-Mail-Adresse für Benutzer obligatorisch machen, bevor Sie Zugriff auf Fab-Manager bekommen."
confirmation_is_required: "Bestätigung erforderlich"
wallet_module: "Guthabenkonto-Modul"
public_agenda_module: "public agenda module"
statistics_module: "Statistik-Modul"
upcoming_events_shown: "Anzeigelimit für anstehende Termine"
general:
@ -1207,6 +1206,9 @@ de:
wallet: "Guthabenkonto"
wallet_info_html: "<p>Mit dem Guthabenkonto können Sie Benutzern eine Geldsumme zuweisen. Diese können es nach Belieben im Fab-Manager ausgeben.</p><p>Mitglieder können ihr Guthabenkonto nicht selbst aufladen, das können nur Manager und Administratoren.</p>"
enable_wallet: "Guthabenkonto aktivieren"
public_agenda: "Public agenda"
public_agenda_info_html: "<p>The public agenda offers to members and visitors a general overview of the Fablab's planning.</p><p>Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.</p>"
enable_public_agenda: "Enable public agenda"
statistics: "Statistiken"
statistics_info_html: "<p>Aktivieren oder deaktivieren Sie das Statistik-Modul.</p><p>Wenn aktiviert, konsolidiert das Modul die Tagesdaten in der Datenbank einer leistungsstarken Analyse-Engine. Administratoren können im entsprechenden Abschnitt die erstellten Diagramme und Tabellen durchsuchen.</p>"
enable_statistics: "Statistik-Modul aktivieren"

View File

@ -300,12 +300,10 @@ en:
list_of_the_subscription_plans: "List of the subscription plans"
disabled_plans_info_html: "<p><strong>Warning:</strong> the subscriptions are disabled on this application.</p><p>You can still create some, but they won't be available until the activation of the plans module, from the « Customization » section.</p>"
add_a_new_subscription_plan: "Add a new subscription plan"
type: "Type"
partner: "Partner"
standard: "Standard"
name: "Name"
duration: "Duration"
group: "Group"
category: "Category"
prominence: "Prominence"
price: "Price"
machine_hours: "Machine slots"
@ -1169,6 +1167,7 @@ en:
confirmation_required_info: "Optionally, you can force the users to confirm their email address before being able to access Fab-manager."
confirmation_is_required: "Confirmation required"
wallet_module: "wallet module"
public_agenda_module: "public agenda module"
statistics_module: "statistics module"
upcoming_events_shown: "display limit for upcoming events"
general:
@ -1207,6 +1206,9 @@ en:
wallet: "Wallet"
wallet_info_html: "<p>The virtual wallet allows you to allocate a sum of money to users. Then, can spend this money as they wish, in Fab-manager.</p><p>Members cannot credit their wallet themselves, it's a privilege of managers and administrators.</p>"
enable_wallet: "Enable wallet"
public_agenda: "Public agenda"
public_agenda_info_html: "<p>The public agenda offers to members and visitors a general overview of the Fablab's planning.</p><p>Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.</p>"
enable_public_agenda: "Enable public agenda"
statistics: "Statistics"
statistics_info_html: "<p>Enable or disable the statistics module.</p><p>If enabled, every nights, the data of the day just passed will be consolidated in the database of a powerful analysis engine. Then, every administrators will be able to browse statistical charts and tables in the corresponding section.</p>"
enable_statistics: "Enable statistics"

View File

@ -300,12 +300,10 @@ es:
list_of_the_subscription_plans: "Lista de los planes de suscripción"
disabled_plans_info_html: "<p><strong>Warning:</strong> the subscriptions are disabled on this application.</p><p>You can still create some, but they won't be available until the activation of the plans module, from the « Customization » section.</p>"
add_a_new_subscription_plan: "Agregar un nuevo plan de suscripción"
type: "Tipo"
partner: "Socio"
standard: "Estándar"
name: "Nombre"
duration: "Duración"
group: "Grupo"
category: "Categoría"
prominence: "Prominencia"
price: "Precio"
machine_hours: "Machine slots"
@ -1169,6 +1167,7 @@ es:
confirmation_required_info: "Optionally, you can force the users to confirm their email address before being able to access Fab-manager."
confirmation_is_required: "Confirmation required"
wallet_module: "wallet module"
public_agenda_module: "public agenda module"
statistics_module: "statistics module"
upcoming_events_shown: "display limit for upcoming events"
general:
@ -1207,6 +1206,9 @@ es:
wallet: "Wallet"
wallet_info_html: "<p>The virtual wallet allows you to allocate a sum of money to users. Then, can spend this money as they wish, in Fab-manager.</p><p>Members cannot credit their wallet themselves, it's a privilege of managers and administrators.</p>"
enable_wallet: "Enable wallet"
public_agenda: "Public agenda"
public_agenda_info_html: "<p>The public agenda offers to members and visitors a general overview of the Fablab's planning.</p><p>Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.</p>"
enable_public_agenda: "Enable public agenda"
statistics: "Statistics"
statistics_info_html: "<p>Enable or disable the statistics module.</p><p>If enabled, every nights, the data of the day just passed will be consolidated in the database of a powerful analysis engine. Then, every administrators will be able to browse statistical charts and tables in the corresponding section.</p>"
enable_statistics: "Enable statistics"
@ -1298,8 +1300,8 @@ es:
name: "Name"
significance: "Significance"
create_plan_category:
new_category: "New category"
name: "Name"
new_category: "Nueva categoría"
name: "Nombre"
significance: "Significance"
significance_info: "Categories will be shown ordered by signifiance. The higher you set the significance, the first the category will be shown."
confirm_create: "Create the category"
@ -1307,15 +1309,15 @@ es:
unable_to_create: "Unable to create the category: "
edit_plan_category:
edit_category: "Edit the category"
name: "Name"
name: "Nombre"
significance: "Significance"
confirm_edition: "Validate"
confirm_edition: "Validar"
category_updated: "The category was successfully updated"
unable_to_update: "Unable to update the category: "
significance_info: "Categories will be shown ordered by signifiance. The higher you set the significance, the first the category will be shown."
delete_plan_category:
delete_category: "Delete a category"
confirm_delete: "Delete"
confirm_delete: "Borrar"
delete_confirmation: "Are you sure you want to delete this category? If you do, the plans associated with this category won't be sorted anymore."
category_deleted: "The category was successfully deleted"
unable_to_delete: "Unable to delete the category: "

View File

@ -300,12 +300,10 @@ fr:
list_of_the_subscription_plans: "Liste des formules d'abonnements"
disabled_plans_info_html: "<p><strong>Attention :</strong> les abonnements sont désactivés sur cette application.</p><p>Vous pouvez tout de même en créer mais ils ne seront disponibles qu'après l'activation du module abonnements depuis la section « Personnalisation ».</p>"
add_a_new_subscription_plan: "Ajouter une nouvelle formule d'abonnement"
type: "Type"
partner: "Partenaire"
standard: "Standard"
name: "Nom"
duration: "Durée"
group: "Groupe"
category: "Catégorie"
prominence: "Importance"
price: "Prix"
machine_hours: "Créneaux machines"
@ -1169,6 +1167,7 @@ fr:
confirmation_required_info: "De manière optionnelle, vous pouvez forcer les utilisateurs à confirmer leur adresse électronique avant de pouvoir accéder à Fab-manager."
confirmation_is_required: "Confirmation requise"
wallet_module: "module porte-monnaie"
public_agenda_module: "module d'agenda public"
statistics_module: "module de statistiques"
upcoming_events_shown: "la limite d'affichage des événements à venir"
general:
@ -1207,6 +1206,9 @@ fr:
wallet: "Porte-monnaie"
wallet_info_html: "<p>Le porte-monnaie virtuel vous permet d'allouer une certaine somme d'argent aux utilisateurs. Ils peuvent ensuite dépenser cet argent comment bon leur semble, dans Fab-manager.</p><p>Les membres ne peuvent pas créditer leur porte-monnaie eux-même, c'est un privilège des gestionnaires et des administrateurs.</p>"
enable_wallet: "Activer le porte-monnaie"
public_agenda: "Agenda public"
public_agenda_info_html: "<p>L'agenda public offre aux membres et aux visiteurs une vue générale du planning du FabLab.</p><p>Veuillez noter que, même connectés, les utilisateurs ne pourront ni réserver ni modifier quoi que ce soit depuis cet agenda : il s'agit d'une page en lecture seule.</p>"
enable_public_agenda: "Activer l'agenda public"
statistics: "Statistiques"
statistics_info_html: "<p>Activer ou désactiver le module de statistiques.</p><p>Si activé, chaque nuit, les données de la journée qui vient de s'écouler seront consolidées dans la base de données d'un puissant moteur d'analyse. Ensuite, chaque administrateur pourra parcourir les tableaux et graphiques statistiques dans la section correspondante.</p>"
enable_statistics: "Activer les statistiques"

View File

@ -300,12 +300,10 @@ pt:
list_of_the_subscription_plans: "Lista dos planos de assinatura"
disabled_plans_info_html: "<p><strong>Aviso:</strong> as assinaturas estão desativadas nesta aplicação.</p><p>Você ainda pode criar algumas, mas eles não estarão disponíveis até a ativação dos módulos de planos, na seção « Personalização».</p>"
add_a_new_subscription_plan: "Adicionar novo plano de assinatura"
type: "Tipo"
partner: "Parceiro"
standard: "Padrão"
name: "Nome"
duration: "Duração"
group: "Grupo"
category: "Categoria"
prominence: "Relevância"
price: "Preço"
machine_hours: "Slots de máquina"
@ -1169,6 +1167,7 @@ pt:
confirmation_required_info: "Opcionalmente, você pode forçar os usuários a confirmar o endereço de e-mail deles antes de poder acessar o Fab-manager."
confirmation_is_required: "Confirmação obrigatória"
wallet_module: "módulo de carteira"
public_agenda_module: "public agenda module"
statistics_module: "módulo de estatísticas"
upcoming_events_shown: "exibir limite para eventos futuros"
general:
@ -1207,6 +1206,9 @@ pt:
wallet: "Carteira"
wallet_info_html: "<p>A carteira virtual permite alocar uma soma de dinheiro aos usuários. Em seguida, pode gastar esse dinheiro como quiserem, no Fab-manager.</p><p>Membros não podem creditar suas carteiras, é um privilégio de gerentes e administradores.</p>"
enable_wallet: "Habilitar Carteira"
public_agenda: "Public agenda"
public_agenda_info_html: "<p>The public agenda offers to members and visitors a general overview of the Fablab's planning.</p><p>Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.</p>"
enable_public_agenda: "Enable public agenda"
statistics: "Estatísticas"
statistics_info_html: "<p>Ativar ou desativar módulo de estatísticas.</p><p>Se ativado, todas as noites, os dados do dia que acabou de ser passado serão consolidados na base de dados de um poderoso motor de análise. Então, todos os administradores poderão navegar em gráficos estatísticos e tabelas na seção correspondente.</p>"
enable_statistics: "Habilitar estatísticas"

View File

@ -300,12 +300,10 @@ zu:
list_of_the_subscription_plans: "crwdns7121:0crwdne7121:0"
disabled_plans_info_html: "crwdns20566:0crwdne20566:0"
add_a_new_subscription_plan: "crwdns7129:0crwdne7129:0"
type: "crwdns7131:0crwdne7131:0"
partner: "crwdns7133:0crwdne7133:0"
standard: "crwdns7135:0crwdne7135:0"
name: "crwdns7137:0crwdne7137:0"
duration: "crwdns7139:0crwdne7139:0"
group: "crwdns7141:0crwdne7141:0"
category: "crwdns21864:0crwdne21864:0"
prominence: "crwdns7143:0crwdne7143:0"
price: "crwdns7145:0crwdne7145:0"
machine_hours: "crwdns7147:0crwdne7147:0"
@ -1169,6 +1167,7 @@ zu:
confirmation_required_info: "crwdns20720:0crwdne20720:0"
confirmation_is_required: "crwdns20722:0crwdne20722:0"
wallet_module: "crwdns20724:0crwdne20724:0"
public_agenda_module: "crwdns21866:0crwdne21866:0"
statistics_module: "crwdns20864:0crwdne20864:0"
upcoming_events_shown: "crwdns20898:0crwdne20898:0"
general:
@ -1207,6 +1206,9 @@ zu:
wallet: "crwdns20786:0crwdne20786:0"
wallet_info_html: "crwdns20788:0crwdne20788:0"
enable_wallet: "crwdns20790:0crwdne20790:0"
public_agenda: "crwdns21868:0crwdne21868:0"
public_agenda_info_html: "crwdns21870:0crwdne21870:0"
enable_public_agenda: "crwdns21872:0crwdne21872:0"
statistics: "crwdns20866:0crwdne20866:0"
statistics_info_html: "crwdns20868:0crwdne20868:0"
enable_statistics: "crwdns20870:0crwdne20870:0"

View File

@ -525,3 +525,4 @@ de:
payzen_public_key: "PayZen client public key"
payzen_hmac: "PayZen HMAC-SHA-256 key"
payzen_currency: "PayZen currency"
public_agenda_module: "Public agenda module"

View File

@ -525,3 +525,4 @@ en:
payzen_public_key: "PayZen client public key"
payzen_hmac: "PayZen HMAC-SHA-256 key"
payzen_currency: "PayZen currency"
public_agenda_module: "Public agenda module"

View File

@ -525,3 +525,4 @@ es:
payzen_public_key: "PayZen client public key"
payzen_hmac: "PayZen HMAC-SHA-256 key"
payzen_currency: "PayZen currency"
public_agenda_module: "Public agenda module"

View File

@ -525,3 +525,4 @@ fr:
payzen_public_key: "Clé publique du client PayZen"
payzen_hmac: "Clef HMAC-SHA-256 PayZen"
payzen_currency: "Devise PayZen"
public_agenda_module: "Public agenda module"

View File

@ -525,3 +525,4 @@ pt:
payzen_public_key: "PayZen client public key"
payzen_hmac: "PayZen HMAC-SHA-256 key"
payzen_currency: "PayZen currency"
public_agenda_module: "Public agenda module"

View File

@ -525,3 +525,4 @@ zu:
payzen_public_key: "crwdns21846:0crwdne21846:0"
payzen_hmac: "crwdns21848:0crwdne21848:0"
payzen_currency: "crwdns21850:0crwdne21850:0"
public_agenda_module: "crwdns21874:0crwdne21874:0"

View File

@ -895,6 +895,8 @@ Setting.set('upcoming_events_shown', 'until_start') unless Setting.find_by(name:
Setting.set('trainings_module', true) unless Setting.find_by(name: 'trainings_module').try(:value)
Setting.set('public_agenda_module', true) unless Setting.find_by(name: 'public_agenda_module').try(:value)
if StatisticCustomAggregation.count.zero?
# available reservations hours for machines
machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2)

View File

@ -1,6 +1,6 @@
{
"name": "fab-manager",
"version": "5.0.3",
"version": "5.0.4",
"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",
@ -59,7 +59,7 @@
"angular-growl-v2": "https://github.com/JanStevens/angular-growl-2.git#0.7.9",
"angular-i18n": "1.7",
"angular-loading-bar": "^0.9.0",
"angular-medium-editor": "https://github.com/thijsw/angular-medium-editor.git#0.1.1",
"angular-medium-editor": "^1.2.1",
"angular-minicolors": "https://github.com/kaihenzler/angular-minicolors.git#0.0.5",
"angular-moment": "1.3",
"angular-recaptcha": "^4.2.0",
@ -93,7 +93,7 @@
"jasny-bootstrap": "3.1",
"jquery": ">=3.5.0",
"jquery-ujs": "^1.2.2",
"medium-editor": "4.4.0",
"medium-editor": "^5.23.3",
"moment": "2.22",
"moment-timezone": "0.5",
"ng-caps-lock": "https://github.com/FabioMR/ng-caps-lock.git#1.0.3",

File diff suppressed because one or more lines are too long

View File

@ -497,3 +497,8 @@ setting_84:
created_at: 2020-04-15 14:38:40.000421500 Z
updated_at: 2020-04-15 14:38:40.000421500 Z
setting_85:
id: 85
name: public_agenda_module
created_at: 2020-04-15 14:38:40.000421500 Z
updated_at: 2020-04-15 14:38:40.000421500 Z

View File

@ -1488,9 +1488,10 @@ angular-loading-bar@^0.9.0:
resolved "https://registry.yarnpkg.com/angular-loading-bar/-/angular-loading-bar-0.9.0.tgz#37ef52c25f102c216e7b3cdfd2fc5a5df9628e45"
integrity sha1-N+9Swl8QLCFuezzf0vxaXflijkU=
"angular-medium-editor@https://github.com/thijsw/angular-medium-editor.git#0.1.1":
version "0.1.1"
resolved "https://github.com/thijsw/angular-medium-editor.git#1683d0f4ada6e4e0011c4372335c702df9680fde"
angular-medium-editor@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/angular-medium-editor/-/angular-medium-editor-1.2.1.tgz#3f336d0fffb26f0948e49b6cf50682f8b90d68fa"
integrity sha1-PzNtD/+ybwlI5Jts9QaC+LkNaPo=
"angular-minicolors@https://github.com/kaihenzler/angular-minicolors.git#0.0.5":
version "0.0.0"
@ -5240,10 +5241,10 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
medium-editor@4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/medium-editor/-/medium-editor-4.4.0.tgz#ef188cc9cc5cba87177da8cb657a885dfbbe5760"
integrity sha1-7xiMycxcuocXfajLZXqIXfu+V2A=
medium-editor@^5.23.3:
version "5.23.3"
resolved "https://registry.yarnpkg.com/medium-editor/-/medium-editor-5.23.3.tgz#6fb638759ae2fc76c423feb056f346d9c518d3b7"
integrity sha512-he9/TdjX8f8MGdXGfCs8AllrYnqXJJvjNkDKmPg3aPW/uoIrlRqtkFthrwvmd+u4QyzEiadhCCM0EwTiRdUCJw==
memoize-one@^5.0.0:
version "5.2.1"