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:
commit
8484268226
11
CHANGELOG.md
11
CHANGELOG.md
@ -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
|
||||
|
2
Procfile
2
Procfile
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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';
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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 = [
|
||||
{
|
||||
|
@ -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 {
|
||||
|
@ -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; }],
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
##
|
||||
|
@ -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 }
|
||||
|
@ -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') %>";
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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: "
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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",
|
||||
|
163
test/fixtures/history_values.yml
vendored
163
test/fixtures/history_values.yml
vendored
File diff suppressed because one or more lines are too long
5
test/fixtures/settings.yml
vendored
5
test/fixtures/settings.yml
vendored
@ -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
|
||||
|
15
yarn.lock
15
yarn.lock
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user