1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-11-28 09:24:24 +01:00

[ongoing] refactoring i18n keys

This commit is contained in:
Sylvain 2019-12-16 16:54:40 +01:00
parent be9f6988e6
commit d21f616283
54 changed files with 874 additions and 963 deletions

View File

@ -5,6 +5,7 @@ FabManager is the Fab Lab management solution. It provides a comprehensive, web-
[![Coverage Status](https://coveralls.io/repos/github/sleede/fab-manager/badge.svg)](https://coveralls.io/github/sleede/fab-manager) [![Coverage Status](https://coveralls.io/repos/github/sleede/fab-manager/badge.svg)](https://coveralls.io/github/sleede/fab-manager)
[![Docker pulls](https://img.shields.io/docker/pulls/sleede/fab-manager.svg)](https://hub.docker.com/r/sleede/fab-manager/) [![Docker pulls](https://img.shields.io/docker/pulls/sleede/fab-manager.svg)](https://hub.docker.com/r/sleede/fab-manager/)
[![Docker Build Status](https://img.shields.io/docker/build/sleede/fab-manager.svg)](https://hub.docker.com/r/sleede/fab-manager/builds) [![Docker Build Status](https://img.shields.io/docker/build/sleede/fab-manager.svg)](https://hub.docker.com/r/sleede/fab-manager/builds)
[![Crowdin](https://badges.crowdin.net/fab-manager/localized.svg)](https://crowdin.com/project/fab-manager)
##### Table of Contents ##### Table of Contents
1. [Software stack](#software-stack) 1. [Software stack](#software-stack)

View File

@ -85,8 +85,8 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
resolve: { resolve: {
object () { object () {
return { return {
title: _t('admin_calendar.confirmation_required'), title: _t('app.admin.calendar.confirmation_required'),
msg: _t('admin_calendar.do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION' msg: _t('app.admin.calendar.do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION'
, { GENDER: getGender($scope.currentUser), USER: slot.user.name, DATE: moment(slot.start_at).format('L'), TIME: moment(slot.start_at).format('LT'), RESERVATION: slot.reservable.name }) , { GENDER: getGender($scope.currentUser), USER: slot.user.name, DATE: moment(slot.start_at).format('L'), TIME: moment(slot.start_at).format('LT'), RESERVATION: slot.reservable.name })
}; };
} }
@ -105,10 +105,10 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
} }
} }
// notify the admin // notify the admin
return growl.success(_t('admin_calendar.reservation_was_successfully_cancelled')); return growl.success(_t('app.admin.calendar.reservation_was_successfully_cancelled'));
}, },
function (data, status) { // failed function (data, status) { // failed
growl.error(_t('admin_calendar.reservation_cancellation_failed')); growl.error(_t('app.admin.calendar.reservation_cancellation_failed'));
} }
); );
} }
@ -122,17 +122,17 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
*/ */
$scope.removeMachine = function (machine) { $scope.removeMachine = function (machine) {
if ($scope.availability.machine_ids.length === 1) { if ($scope.availability.machine_ids.length === 1) {
return growl.error(_t('admin_calendar.unable_to_remove_the_last_machine_of_the_slot_delete_the_slot_rather')); return growl.error(_t('app.admin.calendar.unable_to_remove_the_last_machine_of_the_slot_delete_the_slot_rather'));
} else { } else {
// open a confirmation dialog // open a confirmation dialog
return dialogs.confirm({ return dialogs.confirm({
resolve: { resolve: {
object () { object () {
return { return {
title: _t('admin_calendar.confirmation_required'), title: _t('app.admin.calendar.confirmation_required'),
msg: _t('admin_calendar.do_you_really_want_to_remove_MACHINE_from_this_slot', { GENDER: getGender($scope.currentUser), MACHINE: machine.name }) + ' ' + msg: _t('app.admin.calendar.do_you_really_want_to_remove_MACHINE_from_this_slot', { GENDER: getGender($scope.currentUser), MACHINE: machine.name }) + ' ' +
_t('admin_calendar.this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing') + ' ' + _t('app.admin.calendar.this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing') + '<br><strong>' +
_t('admin_calendar.beware_this_cannot_be_reverted') _t('app.admin.calendar.beware_this_cannot_be_reverted') + '</strong>'
}; };
} }
} }
@ -154,10 +154,10 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
$scope.availability.title = data.title; $scope.availability.title = data.title;
uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents'); uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');
// notify the admin // notify the admin
return growl.success(_t('admin_calendar.the_machine_was_successfully_removed_from_the_slot')); return growl.success(_t('app.admin.calendar.the_machine_was_successfully_removed_from_the_slot'));
} }
, function (data, status) { // failed , function (data, status) { // failed
growl.error(_t('admin_calendar.deletion_failed')); growl.error(_t('app.admin.calendar.deletion_failed'));
} }
); );
}); });
@ -171,7 +171,7 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
$scope.alertExport = function (type) { $scope.alertExport = function (type) {
Export.status({ category: 'availabilities', type }).then(function (res) { Export.status({ category: 'availabilities', type }).then(function (res) {
if (!res.data.exists) { if (!res.data.exists) {
return growl.success(_t('admin_calendar.export_is_running_you_ll_be_notified_when_its_ready')); return growl.success(_t('app.admin.calendar.export_is_running_you_ll_be_notified_when_its_ready'));
} }
}); });
}; };
@ -199,8 +199,8 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
resolve: { resolve: {
object () { object () {
return { return {
title: _t('admin_calendar.confirmation_required'), title: _t('app.admin.calendar.confirmation_required'),
msg: locked ? _t('admin_calendar.do_you_really_want_to_allow_reservations') : _t('admin_calendar.do_you_really_want_to_block_this_slot') msg: locked ? _t('app.admin.calendar.do_you_really_want_to_allow_reservations') : _t('app.admin.calendar.do_you_really_want_to_block_this_slot')
}; };
} }
} }
@ -212,18 +212,18 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
{ lock: !locked }, { lock: !locked },
function (data) { // success function (data) { // success
$scope.availability = data; $scope.availability = data;
growl.success(locked ? _t('admin_calendar.unlocking_success') : _t('admin_calendar.locking_success')); growl.success(locked ? _t('app.admin.calendar.unlocking_success') : _t('app.admin.calendar.locking_success'));
uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents'); uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');
}, },
function (error) { // failed function (error) { // failed
growl.error(locked ? _t('admin_calendar.unlocking_failed') : _t('admin_calendar.locking_failed')); growl.error(locked ? _t('app.admin.calendar.unlocking_failed') : _t('app.admin.calendar.locking_failed'));
console.error(error); console.error(error);
} }
); );
} }
); );
} else { } else {
return growl.error(_t('admin_calendar.unlockable_because_reservations')); return growl.error(_t('app.admin.calendar.unlockable_because_reservations'));
} }
}; };
@ -275,7 +275,7 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
// check if slot is not in the past // check if slot is not in the past
const today = new Date(); const today = new Date();
if (Math.trunc((start.valueOf() - today) / (60 * 1000)) < 0) { if (Math.trunc((start.valueOf() - today) / (60 * 1000)) < 0) {
growl.warning(_t('admin_calendar.event_in_the_past')); growl.warning(_t('app.admin.calendar.event_in_the_past'));
return uiCalendarConfig.calendars.calendar.fullCalendar('unselect'); return uiCalendarConfig.calendars.calendar.fullCalendar('unselect');
} }
@ -483,7 +483,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
if ($scope.selectedMachines.length > 0) { if ($scope.selectedMachines.length > 0) {
$scope.availability.machine_ids = $scope.selectedMachines.map(function (m) { return m.id; }); $scope.availability.machine_ids = $scope.selectedMachines.map(function (m) { return m.id; });
} else { } else {
growl.error(_t('admin_calendar.you_should_select_at_least_a_machine')); growl.error(_t('app.admin.calendar.you_should_select_at_least_a_machine'));
return; return;
} }
} else if ($scope.availability.available_type === 'training') { } else if ($scope.availability.available_type === 'training') {
@ -597,7 +597,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
const validateSelection = function () { const validateSelection = function () {
if ($scope.availability.available_type === 'machines') { if ($scope.availability.available_type === 'machines') {
if ($scope.selectedMachines.length === 0) { if ($scope.selectedMachines.length === 0) {
return growl.error(_t('admin_calendar.you_should_select_at_least_a_machine')); return growl.error(_t('app.admin.calendar.you_should_select_at_least_a_machine'));
} }
} }
$scope.step++; $scope.step++;
@ -609,13 +609,13 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
const validateRecurrence = function () { const validateRecurrence = function () {
if ($scope.availability.is_recurrent) { if ($scope.availability.is_recurrent) {
if (!$scope.availability.period) { if (!$scope.availability.period) {
return growl.error(_t('admin_calendar.select_period')); return growl.error(_t('app.admin.calendar.select_period'));
} }
if (!$scope.availability.nb_periods) { if (!$scope.availability.nb_periods) {
return growl.error(_t('admin_calendar.select_nb_period')); return growl.error(_t('app.admin.calendar.select_nb_period'));
} }
if (!$scope.availability.end_date) { if (!$scope.availability.end_date) {
return growl.error(_t('admin_calendar.select_end_date')); return growl.error(_t('app.admin.calendar.select_end_date'));
} }
} }
// settings are ok // settings are ok
@ -663,7 +663,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
$scope.reservableName = `<strong>${$scope.selectedSpace.name}</strong>`; $scope.reservableName = `<strong>${$scope.selectedSpace.name}</strong>`;
break; break;
default: default:
$scope.reservableName = `<span class="warning">${_t("admin_calendar.none")}</span>`; $scope.reservableName = `<span class="warning">${_t("app.admin.calendar.none")}</span>`;
} }
const tags = $scope.tags.filter(function (t) { const tags = $scope.tags.filter(function (t) {
return $scope.availability.tag_ids.indexOf(t.id) > -1; return $scope.availability.tag_ids.indexOf(t.id) > -1;
@ -672,7 +672,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
} }
const localizedList = function (items) { const localizedList = function (items) {
if (items.length === 0) return `<span class="text-gray text-italic">${_t("admin_calendar.none")}</span>`; if (items.length === 0) return `<span class="text-gray text-italic">${_t("app.admin.calendar.none")}</span>`;
const names = items.map(function (i) { return $sce.trustAsHtml(`<strong>${i.name}</strong>`); }); const names = items.map(function (i) { return $sce.trustAsHtml(`<strong>${i.name}</strong>`); });
if (items.length > 1) return names.slice(0, -1).join(', ') + ` ${_t('and')} ` + names[names.length - 1]; if (items.length > 1) return names.slice(0, -1).join(', ') + ` ${_t('and')} ` + names[names.length - 1];
@ -709,12 +709,12 @@ Application.Controllers.controller('DeleteRecurrentAvailabilityController', ['$s
// delete success // delete success
if (res.deleted > 1) { if (res.deleted > 1) {
growl.success(_t( growl.success(_t(
'admin_calendar.slots_deleted', 'app.admin.calendar.slots_deleted',
{START: moment(start_at).format('LL LT'), COUNT: res.deleted - 1} {START: moment(start_at).format('LL LT'), COUNT: res.deleted - 1}
)); ));
} else { } else {
growl.success(_t( growl.success(_t(
'admin_calendar.slot_successfully_deleted', 'app.admin.calendar.slot_successfully_deleted',
{START: moment(start_at).format('LL LT'), END: moment(end_at).format('LT')} {START: moment(start_at).format('LL LT'), END: moment(end_at).format('LT')}
)); ));
} }
@ -728,12 +728,12 @@ Application.Controllers.controller('DeleteRecurrentAvailabilityController', ['$s
const { data } = res; const { data } = res;
if (data.total > 1) { if (data.total > 1) {
growl.warning(_t( growl.warning(_t(
'admin_calendar.slots_not_deleted', 'app.admin.calendar.slots_not_deleted',
{TOTAL: data.total, COUNT: data.total - data.deleted} {TOTAL: data.total, COUNT: data.total - data.deleted}
)); ));
} else { } else {
growl.error(_t( growl.error(_t(
'admin_calendar.unable_to_delete_the_slot', 'app.admin.calendar.unable_to_delete_the_slot',
{START: moment(start_at).format('LL LT'), END: moment(end_at).format('LT')} {START: moment(start_at).format('LL LT'), END: moment(end_at).format('LT')}
)); ));
} }
@ -787,7 +787,7 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
$scope.newCalendar.text_hidden = false; $scope.newCalendar.text_hidden = false;
}, function (error) { }, function (error) {
// failed // failed
growl.error(_t('icalendar.create_error')); growl.error(_t('app.admin.icalendar.create_error'));
console.error(error); console.error(error);
}) })
} }
@ -815,8 +815,8 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
resolve: { resolve: {
object () { object () {
return { return {
title: _t('icalendar.confirmation_required'), title: _t('app.admin.icalendar.confirmation_required'),
msg: _t('icalendar.confirm_delete_import') msg: _t('app.admin.icalendar.confirm_delete_import')
}; };
} }
} }
@ -828,10 +828,10 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
// success // success
const idx = $scope.calendars.indexOf(calendar); const idx = $scope.calendars.indexOf(calendar);
$scope.calendars.splice(idx, 1); $scope.calendars.splice(idx, 1);
growl.info(_t('icalendar.delete_success')); growl.info(_t('app.admin.icalendar.delete_success'));
}, function (error) { }, function (error) {
// failed // failed
growl.error(_t('icalendar.delete_failed')); growl.error(_t('app.admin.icalendar.delete_failed'));
console.error(error); console.error(error);
} }
); );
@ -848,10 +848,10 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
{ id: calendar.id }, { id: calendar.id },
function () { function () {
// success // success
growl.info(_t('icalendar.refresh')); growl.info(_t('app.admin.icalendar.refresh'));
}, function (error) { }, function (error) {
// failed // failed
growl.error(_t('icalendar.sync_failed')); growl.error(_t('app.admin.icalendar.sync_failed'));
console.error(error); console.error(error);
} }
) )

View File

@ -196,7 +196,7 @@ Application.Controllers.controller('TrainingsAdminController', ['$scope', '$stat
return selected.push(m.name); return selected.push(m.name);
} }
}); });
if (selected.length) { return selected.join(', '); } else { return _t('none'); } if (selected.length) { return selected.join(', '); } else { return _t('app.admin.trainings.none'); }
}; };
/** /**

View File

@ -325,7 +325,7 @@ Application.Controllers.controller('ApplicationController', ['$rootScope', '$sco
angular.forEach(notifications.notifications, function (n) { toDisplay.push(n); }); angular.forEach(notifications.notifications, function (n) { toDisplay.push(n); });
if (toDisplay.length < notifications.totals.unread) { if (toDisplay.length < notifications.totals.unread) {
toDisplay.push({ message: { description: _t('and_NUMBER_other_notifications', { NUMBER: notifications.totals.unread - toDisplay.length }) } }); toDisplay.push({ message: { description: _t('app.public.common.and_NUMBER_other_notifications', { NUMBER: notifications.totals.unread - toDisplay.length }) } });
} }
angular.forEach(toDisplay, function (notification) { growl.info(notification.message.description); }); angular.forEach(toDisplay, function (notification) { growl.info(notification.message.description); });

View File

@ -18,33 +18,33 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
$scope.navLinks = [ $scope.navLinks = [
{ {
state: 'app.public.home', state: 'app.public.home',
linkText: 'home', linkText: 'app.public.common.home',
linkIcon: 'home' linkIcon: 'home'
}, },
{ {
state: 'app.public.machines_list', state: 'app.public.machines_list',
linkText: 'reserve_a_machine', linkText: 'app.public.common.reserve_a_machine',
linkIcon: 'cogs' linkIcon: 'cogs'
}, },
{ {
state: 'app.public.trainings_list', state: 'app.public.trainings_list',
linkText: 'trainings_registrations', linkText: 'app.public.common.trainings_registrations',
linkIcon: 'graduation-cap' linkIcon: 'graduation-cap'
}, },
{ {
state: 'app.public.events_list', state: 'app.public.events_list',
linkText: 'events_registrations', linkText: 'app.public.common.events_registrations',
linkIcon: 'tags' linkIcon: 'tags'
}, },
{ {
state: 'app.public.calendar', state: 'app.public.calendar',
linkText: 'public_calendar', linkText: 'app.public.common.public_calendar',
linkIcon: 'calendar' linkIcon: 'calendar'
}, },
{ {
state: 'app.public.projects_list', state: 'app.public.projects_list',
linkText: 'projects_gallery', linkText: 'app.public.common.projects_gallery',
linkIcon: 'th' linkIcon: 'th'
} }
@ -53,7 +53,7 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
if (!Fablab.withoutPlans) { if (!Fablab.withoutPlans) {
$scope.navLinks.push({ $scope.navLinks.push({
state: 'app.public.plans', state: 'app.public.plans',
linkText: 'subscriptions', linkText: 'app.public.common.subscriptions',
linkIcon: 'credit-card' linkIcon: 'credit-card'
}); });
} }
@ -61,7 +61,7 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
if (!Fablab.withoutSpaces) { if (!Fablab.withoutSpaces) {
$scope.navLinks.splice(3, 0, { $scope.navLinks.splice(3, 0, {
state: 'app.public.spaces_list', state: 'app.public.spaces_list',
linkText: 'reserve_a_space', linkText: 'app.public.common.reserve_a_space',
linkIcon: 'rocket' linkIcon: 'rocket'
}); });
} }
@ -70,57 +70,57 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
const adminNavLinks = [ const adminNavLinks = [
{ {
state: 'app.admin.trainings', state: 'app.admin.trainings',
linkText: 'trainings_monitoring', linkText: 'app.public.common.trainings_monitoring',
linkIcon: 'graduation-cap' linkIcon: 'graduation-cap'
}, },
{ {
state: 'app.admin.calendar', state: 'app.admin.calendar',
linkText: 'manage_the_calendar', linkText: 'app.public.common.manage_the_calendar',
linkIcon: 'calendar' linkIcon: 'calendar'
}, },
{ {
state: 'app.admin.members', state: 'app.admin.members',
linkText: 'manage_the_users', linkText: 'app.public.common.manage_the_users',
linkIcon: 'users' linkIcon: 'users'
}, },
{ {
state: 'app.admin.invoices', state: 'app.admin.invoices',
linkText: 'manage_the_invoices', linkText: 'app.public.common.manage_the_invoices',
linkIcon: 'file-pdf-o' linkIcon: 'file-pdf-o'
}, },
{ {
state: 'app.admin.pricing', state: 'app.admin.pricing',
linkText: 'subscriptions_and_prices', linkText: 'app.public.common.subscriptions_and_prices',
linkIcon: 'money' linkIcon: 'money'
}, },
{ {
state: 'app.admin.events', state: 'app.admin.events',
linkText: 'manage_the_events', linkText: 'app.public.common.manage_the_events',
linkIcon: 'tags' linkIcon: 'tags'
}, },
{ {
state: 'app.public.machines_list', state: 'app.public.machines_list',
linkText: 'manage_the_machines', linkText: 'app.public.common.manage_the_machines',
linkIcon: 'cogs' linkIcon: 'cogs'
}, },
{ {
state: 'app.admin.project_elements', state: 'app.admin.project_elements',
linkText: 'manage_the_projects_elements', linkText: 'app.public.common.manage_the_projects_elements',
linkIcon: 'tasks' linkIcon: 'tasks'
}, },
{ {
state: 'app.admin.statistics', state: 'app.admin.statistics',
linkText: 'statistics', linkText: 'app.public.common.statistics',
linkIcon: 'bar-chart-o' linkIcon: 'bar-chart-o'
}, },
{ {
state: 'app.admin.settings', state: 'app.admin.settings',
linkText: 'customization', linkText: 'app.public.common.customization',
linkIcon: 'gear' linkIcon: 'gear'
}, },
{ {
state: 'app.admin.open_api_clients', state: 'app.admin.open_api_clients',
linkText: 'open_api_clients', linkText: 'app.public.common.open_api_clients',
linkIcon: 'cloud' linkIcon: 'cloud'
} }
].concat(Fablab.adminNavLinks); ].concat(Fablab.adminNavLinks);
@ -130,7 +130,7 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
if (!Fablab.withoutSpaces) { if (!Fablab.withoutSpaces) {
return $scope.adminNavLinks.splice(7, 0, { return $scope.adminNavLinks.splice(7, 0, {
state: 'app.public.spaces_list', state: 'app.public.spaces_list',
linkText: 'manage_the_spaces', linkText: 'app.public.common.manage_the_spaces',
linkIcon: 'rocket' linkIcon: 'rocket'
}); });
} }

View File

@ -133,16 +133,16 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
if ($scope.currentUser.role !== 'admin') { if ($scope.currentUser.role !== 'admin') {
$rootScope.currentUser = user; $rootScope.currentUser = user;
Auth._currentUser.group_id = user.group_id; Auth._currentUser.group_id = user.group_id;
growl.success(_t('your_group_was_successfully_changed')); growl.success(_t('app.public.plans.your_group_was_successfully_changed'));
} else { } else {
growl.success(_t('the_user_s_group_was_successfully_changed')); growl.success(_t('app.public.plans.the_user_s_group_was_successfully_changed'));
} }
} }
, function (err) { , function (err) {
if ($scope.currentUser.role !== 'admin') { if ($scope.currentUser.role !== 'admin') {
growl.error(_t('an_error_prevented_your_group_from_being_changed')); growl.error(_t('app.public.plans.an_error_prevented_your_group_from_being_changed'));
} else { } else {
growl.error(_t('an_error_prevented_to_change_the_user_s_group')); growl.error(_t('app.public.plans.an_error_prevented_to_change_the_user_s_group'));
} }
console.error(err); console.error(err);
}); });
@ -318,10 +318,10 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
// Button label // Button label
if ($scope.amount > 0) { if ($scope.amount > 0) {
$scope.validButtonName = _t('confirm_payment_of_html', { ROLE: $scope.currentUser.role, AMOUNT: $filter('currency')($scope.amount) }); $scope.validButtonName = _t('app.public.plans.confirm_payment_of_html', { ROLE: $scope.currentUser.role, AMOUNT: $filter('currency')($scope.amount) });
} else { } else {
if ((price.price > 0) && ($scope.walletAmount === 0)) { if ((price.price > 0) && ($scope.walletAmount === 0)) {
$scope.validButtonName = _t('confirm_payment_of_html', { ROLE: $scope.currentUser.role, AMOUNT: $filter('currency')(price.price) }); $scope.validButtonName = _t('app.public.plans.confirm_payment_of_html', { ROLE: $scope.currentUser.role, AMOUNT: $filter('currency')(price.price) });
} else { } else {
$scope.validButtonName = _t('confirm'); $scope.validButtonName = _t('confirm');
} }
@ -345,7 +345,7 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
} }
, function (data, status) { // failed , function (data, status) { // failed
$scope.alerts = []; $scope.alerts = [];
$scope.alerts.push({ msg: _t('an_error_occured_during_the_payment_process_please_try_again_later'), type: 'danger' }); $scope.alerts.push({ msg: _t('app.public.plans.an_error_occured_during_the_payment_process_please_try_again_later'), type: 'danger' });
$scope.attempting = false; $scope.attempting = false;
} }
); );

View File

@ -191,8 +191,8 @@ Application.Controllers.controller('ShowSpaceController', ['$scope', '$state', '
resolve: { resolve: {
object () { object () {
return { return {
title: _t('space_show.confirmation_required'), title: _t('app.public.space_show.confirmation_required'),
msg: _t('space_show.do_you_really_want_to_delete_this_space') msg: _t('app.public.space_show.do_you_really_want_to_delete_this_space')
}; };
} }
} }
@ -204,7 +204,7 @@ Application.Controllers.controller('ShowSpaceController', ['$scope', '$state', '
$state.go('app.public.spaces_list'); $state.go('app.public.spaces_list');
}, },
function (error) { function (error) {
growl.warning(_t('space_show.the_space_cant_be_deleted_because_it_is_already_reserved_by_some_users')); growl.warning(_t('app.public.space_show.the_space_cant_be_deleted_because_it_is_already_reserved_by_some_users'));
console.error(error); console.error(error);
} }
); );

View File

@ -1,14 +1,3 @@
/* eslint-disable
no-return-assign,
no-undef,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
'use strict'; 'use strict';
/** /**
@ -36,9 +25,9 @@ Application.Directives.directive('selectMember', [ 'Diacritics', 'Member', funct
q['subscription'] = attributes.subscription; q['subscription'] = attributes.subscription;
} }
return Member.search(q, function (users) { Member.search(q, function (users) {
scope.matchingMembers = users; scope.matchingMembers = users;
return scope.isLoadingMembers = false; scope.isLoadingMembers = false;
} }
, function (error) { console.error(error); }); , function (error) { console.error(error); });
}; };

View File

@ -36,7 +36,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
logoFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-file' }).$promise; }], logoFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-file' }).$promise; }],
logoBlackFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-black-file' }).$promise; }], logoBlackFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-black-file' }).$promise; }],
commonTranslations: ['Translations', function (Translations) { return Translations.query(['app.public.common', 'app.shared.buttons', 'app.shared.elements']).$promise; }] sharedTranslations: ['Translations', function (Translations) { return Translations.query(['app.shared', 'app.public.common']).$promise; }]
}, },
onEnter: ['$rootScope', 'logoFile', 'logoBlackFile', 'CSRF', function ($rootScope, logoFile, logoBlackFile, CSRF) { onEnter: ['$rootScope', 'logoFile', 'logoBlackFile', 'CSRF', function ($rootScope, logoFile, logoBlackFile, CSRF) {
// Retrieve Anti-CSRF tokens from cookies // Retrieve Anti-CSRF tokens from cookies
@ -47,7 +47,10 @@ angular.module('application.router', ['ui.router'])
}] }]
}) })
.state('app.public', { .state('app.public', {
abstract: true abstract: true,
resolve: {
publicTranslations: ['Translations', function (Translations) { return Translations.query(['app.public']).$promise; }]
}
}) })
.state('app.logged', { .state('app.logged', {
abstract: true, abstract: true,
@ -55,7 +58,8 @@ angular.module('application.router', ['ui.router'])
authorizedRoles: ['member', 'admin'] authorizedRoles: ['member', 'admin']
}, },
resolve: { resolve: {
currentUser: ['Auth', function (Auth) { return Auth.currentUser(); }] currentUser: ['Auth', function (Auth) { return Auth.currentUser(); }],
loggedTranslations: ['Translations', function (Translations) { return Translations.query(['app.logged']).$promise; }]
}, },
onEnter: ['$state', '$timeout', 'currentUser', '$rootScope', function ($state, $timeout, currentUser, $rootScope) { onEnter: ['$state', '$timeout', 'currentUser', '$rootScope', function ($state, $timeout, currentUser, $rootScope) {
$rootScope.currentUser = currentUser; $rootScope.currentUser = currentUser;
@ -67,7 +71,8 @@ angular.module('application.router', ['ui.router'])
authorizedRoles: ['admin'] authorizedRoles: ['admin']
}, },
resolve: { resolve: {
currentUser: ['Auth', function (Auth) { return Auth.currentUser(); }] currentUser: ['Auth', function (Auth) { return Auth.currentUser(); }],
adminTranslations: ['Translations', function (Translations) { return Translations.query(['app.admin']).$promise; }]
}, },
onEnter: ['$state', '$timeout', 'currentUser', '$rootScope', function ($state, $timeout, currentUser, $rootScope) { onEnter: ['$state', '$timeout', 'currentUser', '$rootScope', function ($state, $timeout, currentUser, $rootScope) {
$rootScope.currentUser = currentUser; $rootScope.currentUser = currentUser;
@ -82,9 +87,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "shared/about.html" %>', templateUrl: '<%= asset_path "shared/about.html" %>',
controller: 'AboutController' controller: 'AboutController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.public.about').$promise; }]
} }
}) })
.state('app.public.home', { .state('app.public.home', {
@ -101,7 +103,6 @@ angular.module('application.router', ['ui.router'])
upcomingEventsPromise: ['Event', function (Event) { return Event.upcoming({ limit: 3 }).$promise; }], upcomingEventsPromise: ['Event', function (Event) { return Event.upcoming({ limit: 3 }).$promise; }],
homeBlogpostPromise: ['Setting', function (Setting) { return Setting.get({ name: 'home_blogpost' }).$promise; }], homeBlogpostPromise: ['Setting', function (Setting) { return Setting.get({ name: 'home_blogpost' }).$promise; }],
twitterNamePromise: ['Setting', function (Setting) { return Setting.get({ name: 'twitter_name' }).$promise; }], twitterNamePromise: ['Setting', function (Setting) { return Setting.get({ name: 'twitter_name' }).$promise; }],
translations: ['Translations', function (Translations) { return Translations.query('app.public.home').$promise; }]
} }
}) })
.state('app.public.privacy', { .state('app.public.privacy', {
@ -111,9 +112,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "shared/privacy.html" %>', templateUrl: '<%= asset_path "shared/privacy.html" %>',
controller: 'PrivacyController' controller: 'PrivacyController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.public.privacy').$promise; }]
} }
}) })
@ -132,7 +130,6 @@ angular.module('application.router', ['ui.router'])
groupsPromise: ['Group', function (Group) { return Group.query().$promise; }], groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],
cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }], cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }],
memberPromise: ['Member', 'currentUser', function (Member, currentUser) { return Member.get({ id: currentUser.id }).$promise; }], memberPromise: ['Member', 'currentUser', function (Member, currentUser) { return Member.get({ id: currentUser.id }).$promise; }],
translations: ['Translations', function (Translations) { return Translations.query(['app.logged.profileCompletion', 'app.shared.user']).$promise; }]
} }
}) })
@ -151,9 +148,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "dashboard/profile.html" %>', templateUrl: '<%= asset_path "dashboard/profile.html" %>',
controller: 'DashboardController' controller: 'DashboardController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.logged.dashboard.profile', 'app.shared.public_profile']).$promise; }]
} }
}) })
.state('app.logged.dashboard.settings', { .state('app.logged.dashboard.settings', {
@ -167,7 +161,6 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
groups: ['Group', function (Group) { return Group.query().$promise; }], groups: ['Group', function (Group) { return Group.query().$promise; }],
activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }], activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }],
translations: ['Translations', function (Translations) { return Translations.query(['app.logged.dashboard.settings', 'app.shared.user']).$promise; }]
} }
}) })
.state('app.logged.dashboard.projects', { .state('app.logged.dashboard.projects', {
@ -177,9 +170,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "dashboard/projects.html" %>', templateUrl: '<%= asset_path "dashboard/projects.html" %>',
controller: 'DashboardController' controller: 'DashboardController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.logged.dashboard.projects').$promise; }]
} }
}) })
.state('app.logged.dashboard.trainings', { .state('app.logged.dashboard.trainings', {
@ -189,9 +179,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "dashboard/trainings.html" %>', templateUrl: '<%= asset_path "dashboard/trainings.html" %>',
controller: 'DashboardController' controller: 'DashboardController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.logged.dashboard.trainings').$promise; }]
} }
}) })
.state('app.logged.dashboard.events', { .state('app.logged.dashboard.events', {
@ -201,9 +188,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "dashboard/events.html" %>', templateUrl: '<%= asset_path "dashboard/events.html" %>',
controller: 'DashboardController' controller: 'DashboardController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.logged.dashboard.events').$promise; }]
} }
}) })
.state('app.logged.dashboard.invoices', { .state('app.logged.dashboard.invoices', {
@ -213,9 +197,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "dashboard/invoices.html" %>', templateUrl: '<%= asset_path "dashboard/invoices.html" %>',
controller: 'DashboardController' controller: 'DashboardController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.logged.dashboard.invoices').$promise; }]
} }
}) })
.state('app.logged.dashboard.wallet', { .state('app.logged.dashboard.wallet', {
@ -228,8 +209,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
walletPromise: ['Wallet', 'currentUser', function (Wallet, currentUser) { return Wallet.getWalletByUser({ user_id: currentUser.id }).$promise; }], walletPromise: ['Wallet', 'currentUser', function (Wallet, currentUser) { return Wallet.getWalletByUser({ user_id: currentUser.id }).$promise; }],
transactionsPromise: ['Wallet', 'walletPromise', function (Wallet, walletPromise) { return Wallet.transactions({ id: walletPromise.id }).$promise; }], transactionsPromise: ['Wallet', 'walletPromise', function (Wallet, walletPromise) { return Wallet.transactions({ id: walletPromise.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.shared.wallet']).$promise; }]
} }
}) })
@ -243,8 +223,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
memberPromise: ['$stateParams', 'Member', function ($stateParams, Member) { return Member.get({ id: $stateParams.id }).$promise; }], memberPromise: ['$stateParams', 'Member', function ($stateParams, Member) { return Member.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.logged.members_show', 'app.shared.public_profile']).$promise; }]
} }
}) })
.state('app.logged.members', { .state('app.logged.members', {
@ -256,8 +235,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
membersPromise: ['Member', function (Member) { return Member.query({ requested_attributes: '[profile]', page: 1, size: 10 }).$promise; }], membersPromise: ['Member', function (Member) { return Member.query({ requested_attributes: '[profile]', page: 1, size: 10 }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.logged.members').$promise; }]
} }
}) })
@ -273,8 +251,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }], themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }],
componentsPromise: ['Component', function (Component) { return Component.query().$promise; }], componentsPromise: ['Component', function (Component) { return Component.query().$promise; }],
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.public.projects_list').$promise; }]
} }
}) })
.state('app.logged.projects_new', { .state('app.logged.projects_new', {
@ -286,8 +263,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
allowedExtensions: ['Project', function (Project) { return Project.allowedExtensions().$promise; }], allowedExtensions: ['Project', function (Project) { return Project.allowedExtensions().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.logged.projects_new', 'app.shared.project']).$promise; }]
} }
}) })
.state('app.public.projects_show', { .state('app.public.projects_show', {
@ -299,8 +275,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
projectPromise: ['$stateParams', 'Project', function ($stateParams, Project) { return Project.get({ id: $stateParams.id }).$promise; }], projectPromise: ['$stateParams', 'Project', function ($stateParams, Project) { return Project.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.public.projects_show').$promise; }]
} }
}) })
.state('app.logged.projects_edit', { .state('app.logged.projects_edit', {
@ -313,8 +288,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
projectPromise: ['$stateParams', 'Project', function ($stateParams, Project) { return Project.get({ id: $stateParams.id }).$promise; }], projectPromise: ['$stateParams', 'Project', function ($stateParams, Project) { return Project.get({ id: $stateParams.id }).$promise; }],
allowedExtensions: ['Project', function (Project) { return Project.allowedExtensions().$promise; }], allowedExtensions: ['Project', function (Project) { return Project.allowedExtensions().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.logged.projects_edit', 'app.shared.project']).$promise; }]
} }
}) })
@ -328,8 +302,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.machines_list', 'app.shared.training_reservation_modal', 'app.shared.request_training_modal']).$promise; }]
} }
}) })
.state('app.admin.machines_new', { .state('app.admin.machines_new', {
@ -339,9 +312,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "machines/new.html" %>', templateUrl: '<%= asset_path "machines/new.html" %>',
controller: 'NewMachineController' controller: 'NewMachineController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.machines_new', 'app.shared.machine']).$promise; }]
} }
}) })
.state('app.public.machines_show', { .state('app.public.machines_show', {
@ -353,8 +323,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }], machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.machines_show', 'app.shared.training_reservation_modal', 'app.shared.request_training_modal']).$promise; }]
} }
}) })
.state('app.logged.machines_reserve', { .state('app.logged.machines_reserve', {
@ -380,11 +349,6 @@ angular.module('application.router', ['ui.router'])
'booking_cancel_delay', \ 'booking_cancel_delay', \
'subscription_explications_alert']` 'subscription_explications_alert']`
}).$promise; }).$promise;
}],
translations: ['Translations', function (Translations) {
return Translations.query(['app.logged.machines_reserve', 'app.shared.plan_subscribe', 'app.shared.member_select',
'app.shared.stripe', 'app.shared.valid_reservation_modal', 'app.shared.confirm_modify_slot_modal',
'app.shared.wallet', 'app.shared.coupon_input', 'app.shared.cart']).$promise;
}] }]
} }
}) })
@ -397,8 +361,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }], machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.machines_edit', 'app.shared.machine']).$promise; }]
} }
}) })
@ -413,8 +376,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
spacesPromise: ['Space', function (Space) { return Space.query().$promise; }], spacesPromise: ['Space', function (Space) { return Space.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.spaces_list']).$promise; }]
} }
}) })
.state('app.admin.space_new', { .state('app.admin.space_new', {
@ -425,9 +387,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "spaces/new.html" %>', templateUrl: '<%= asset_path "spaces/new.html" %>',
controller: 'NewSpaceController' controller: 'NewSpaceController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.space_new', 'app.shared.space']).$promise; }]
} }
}) })
.state('app.public.space_show', { .state('app.public.space_show', {
@ -440,8 +399,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }], spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.space_show']).$promise; }]
} }
}) })
.state('app.admin.space_edit', { .state('app.admin.space_edit', {
@ -454,8 +412,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }], spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.space_edit', 'app.shared.space']).$promise; }]
} }
}) })
.state('app.logged.space_reserve', { .state('app.logged.space_reserve', {
@ -482,11 +439,6 @@ angular.module('application.router', ['ui.router'])
'booking_cancel_delay', \ 'booking_cancel_delay', \
'subscription_explications_alert', \ 'subscription_explications_alert', \
'space_explications_alert']` }).$promise; 'space_explications_alert']` }).$promise;
}],
translations: ['Translations', function (Translations) {
return Translations.query(['app.logged.space_reserve', 'app.shared.plan_subscribe', 'app.shared.member_select',
'app.shared.stripe', 'app.shared.valid_reservation_modal', 'app.shared.confirm_modify_slot_modal',
'app.shared.wallet', 'app.shared.coupon_input', 'app.shared.cart']).$promise;
}] }]
} }
}) })
@ -501,8 +453,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
trainingsPromise: ['Training', function (Training) { return Training.query({ public_page: true }).$promise; }], trainingsPromise: ['Training', function (Training) { return Training.query({ public_page: true }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.trainings_list']).$promise; }]
} }
}) })
.state('app.public.training_show', { .state('app.public.training_show', {
@ -514,8 +465,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) { return Training.get({ id: $stateParams.id }).$promise; }], trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) { return Training.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.training_show']).$promise; }]
} }
}) })
.state('app.logged.trainings_reserve', { .state('app.logged.trainings_reserve', {
@ -545,11 +495,6 @@ angular.module('application.router', ['ui.router'])
'subscription_explications_alert', \ 'subscription_explications_alert', \
'training_explications_alert', \ 'training_explications_alert', \
'training_information_message']` }).$promise; 'training_information_message']` }).$promise;
}],
translations: ['Translations', function (Translations) {
return Translations.query(['app.logged.trainings_reserve', 'app.shared.plan_subscribe', 'app.shared.member_select',
'app.shared.stripe', 'app.shared.valid_reservation_modal', 'app.shared.confirm_modify_slot_modal',
'app.shared.wallet', 'app.shared.coupon_input', 'app.shared.cart']).$promise;
}] }]
} }
}) })
@ -561,9 +506,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "notifications/index.html.erb" %>', templateUrl: '<%= asset_path "notifications/index.html.erb" %>',
controller: 'NotificationsController' controller: 'NotificationsController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.logged.notifications').$promise; }]
} }
}) })
@ -580,11 +522,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
subscriptionExplicationsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'subscription_explications_alert' }).$promise; }], subscriptionExplicationsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'subscription_explications_alert' }).$promise; }],
plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }], plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],
groupsPromise: ['Group', function (Group) { return Group.query().$promise; }], groupsPromise: ['Group', function (Group) { return Group.query().$promise; }]
translations: ['Translations', function (Translations) {
return Translations.query(['app.public.plans', 'app.shared.member_select', 'app.shared.stripe', 'app.shared.wallet',
'app.shared.coupon_input']).$promise;
}]
} }
}) })
@ -600,8 +538,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }], categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],
themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }], themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],
ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }], ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.public.events_list').$promise; }]
} }
}) })
.state('app.public.events_show', { .state('app.public.events_show', {
@ -615,11 +552,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }], eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }],
priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }], priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }],
settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['booking_move_enable', 'booking_move_delay', 'booking_cancel_enable', 'booking_cancel_delay', 'event_explications_alert']" }).$promise; }], settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['booking_move_enable', 'booking_move_delay', 'booking_cancel_enable', 'booking_cancel_delay', 'event_explications_alert']" }).$promise; }]
translations: ['Translations', function (Translations) {
return Translations.query(['app.public.events_show', 'app.shared.member_select', 'app.shared.stripe',
'app.shared.valid_reservation_modal', 'app.shared.wallet', 'app.shared.coupon_input']).$promise;
}]
} }
}) })
@ -638,8 +571,7 @@ angular.module('application.router', ['ui.router'])
trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }], trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],
spacesPromise: ['Space', function (Space) { return Space.query().$promise; }], spacesPromise: ['Space', function (Space) { return Space.query().$promise; }],
iCalendarPromise: ['ICalendar', function (ICalendar) { return ICalendar.query().$promise; }], iCalendarPromise: ['ICalendar', function (ICalendar) { return ICalendar.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.public.calendar']).$promise; }]
} }
}) })
@ -656,8 +588,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
bookingWindowStart: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_start' }).$promise; }], bookingWindowStart: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_start' }).$promise; }],
bookingWindowEnd: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_end' }).$promise; }], bookingWindowEnd: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_end' }).$promise; }],
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.calendar').$promise; }]
} }
}) })
.state('app.admin.calendar.icalendar', { .state('app.admin.calendar.icalendar', {
@ -669,8 +600,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
iCalendars: ['ICalendar', function (ICalendar) { return ICalendar.query().$promise; }], iCalendars: ['ICalendar', function (ICalendar) { return ICalendar.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.icalendar').$promise; }]
} }
}) })
@ -686,8 +616,7 @@ angular.module('application.router', ['ui.router'])
resolve: { resolve: {
componentsPromise: ['Component', function (Component) { return Component.query().$promise; }], componentsPromise: ['Component', function (Component) { return Component.query().$promise; }],
licencesPromise: ['Licence', function (Licence) { return Licence.query().$promise; }], licencesPromise: ['Licence', function (Licence) { return Licence.query().$promise; }],
themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }], themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.project_elements').$promise; }]
} }
}) })
.state('app.admin.manage_abuses', { .state('app.admin.manage_abuses', {
@ -699,8 +628,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
abusesPromise: ['Abuse', function(Abuse) { return Abuse.query().$promise; }], abusesPromise: ['Abuse', function(Abuse) { return Abuse.query().$promise; }]
translations: ['Translations', function(Translations) { return Translations.query('app.admin.manage_abuses').$promise; }]
} }
}) })
@ -715,8 +643,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }], trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.trainings', 'app.shared.trainings']).$promise; }]
} }
}) })
.state('app.admin.trainings_new', { .state('app.admin.trainings_new', {
@ -728,8 +655,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.trainings_new', 'app.shared.trainings']).$promise; }]
} }
}) })
.state('app.admin.trainings_edit', { .state('app.admin.trainings_edit', {
@ -742,8 +668,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) { return Training.get({ id: $stateParams.id }).$promise; }], trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) { return Training.get({ id: $stateParams.id }).$promise; }],
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.shared.trainings').$promise; }]
} }
}) })
// events // events
@ -760,8 +685,7 @@ angular.module('application.router', ['ui.router'])
categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }], categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],
themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }], themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],
ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }], ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],
priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }], priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.events').$promise; }]
} }
}) })
.state('app.admin.events_new', { .state('app.admin.events_new', {
@ -776,8 +700,7 @@ angular.module('application.router', ['ui.router'])
categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }], categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],
themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }], themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],
ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }], ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],
priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }], priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.events_new', 'app.shared.event']).$promise; }]
} }
}) })
.state('app.admin.events_edit', { .state('app.admin.events_edit', {
@ -793,8 +716,7 @@ angular.module('application.router', ['ui.router'])
categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }], categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],
themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }], themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],
ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }], ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],
priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }], priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.events_edit', 'app.shared.event']).$promise; }]
} }
}) })
.state('app.admin.event_reservations', { .state('app.admin.event_reservations', {
@ -807,8 +729,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }], eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }],
reservationsPromise: ['Reservation', '$stateParams', function (Reservation, $stateParams) { return Reservation.query({ reservable_id: $stateParams.id, reservable_type: 'Event' }).$promise; }], reservationsPromise: ['Reservation', '$stateParams', function (Reservation, $stateParams) { return Reservation.query({ reservable_id: $stateParams.id, reservable_type: 'Event' }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.event_reservations').$promise; }]
} }
}) })
@ -826,7 +747,6 @@ angular.module('application.router', ['ui.router'])
groups: ['Group', function (Group) { return Group.query().$promise; }], groups: ['Group', function (Group) { return Group.query().$promise; }],
machinesPricesPromise: ['Price', function (Price) { return Price.query({ priceable_type: 'Machine', plan_id: 'null' }).$promise; }], machinesPricesPromise: ['Price', function (Price) { return Price.query({ priceable_type: 'Machine', plan_id: 'null' }).$promise; }],
trainingsPricingsPromise: ['TrainingsPricing', function (TrainingsPricing) { return TrainingsPricing.query().$promise; }], trainingsPricingsPromise: ['TrainingsPricing', function (TrainingsPricing) { return TrainingsPricing.query().$promise; }],
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.pricing', 'app.shared.member_select', 'app.shared.coupon']).$promise; }],
trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }], trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],
machineCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Machine' }).$promise; }], machineCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Machine' }).$promise; }],
machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }], machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],
@ -854,9 +774,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "admin/plans/new.html" %>', templateUrl: '<%= asset_path "admin/plans/new.html" %>',
controller: 'NewPlanController' controller: 'NewPlanController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.plans.new', 'app.shared.plan']).$promise; }]
} }
}) })
.state('app.admin.plans.edit', { .state('app.admin.plans.edit', {
@ -871,8 +788,7 @@ angular.module('application.router', ['ui.router'])
spaces: ['Space', function (Space) { return Space.query().$promise; }], spaces: ['Space', function (Space) { return Space.query().$promise; }],
machines: ['Machine', function (Machine) { return Machine.query().$promise; }], machines: ['Machine', function (Machine) { return Machine.query().$promise; }],
plans: ['Plan', function (Plan) { return Plan.query().$promise; }], plans: ['Plan', function (Plan) { return Plan.query().$promise; }],
planPromise: ['Plan', '$stateParams', function (Plan, $stateParams) { return Plan.get({ id: $stateParams.id }).$promise; }], planPromise: ['Plan', '$stateParams', function (Plan, $stateParams) { return Plan.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.plans.edit', 'app.shared.plan']).$promise; }]
} }
}) })
@ -884,9 +800,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "admin/coupons/new.html" %>', templateUrl: '<%= asset_path "admin/coupons/new.html" %>',
controller: 'NewCouponController' controller: 'NewCouponController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.coupons_new', 'app.shared.coupon']).$promise; }]
} }
}) })
.state('app.admin.coupons_edit', { .state('app.admin.coupons_edit', {
@ -898,8 +811,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
couponPromise: ['Coupon', '$stateParams', function (Coupon, $stateParams) { return Coupon.get({ id: $stateParams.id }).$promise; }], couponPromise: ['Coupon', '$stateParams', function (Coupon, $stateParams) { return Coupon.get({ id: $stateParams.id }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.coupons_edit', 'app.shared.coupon']).$promise; }]
} }
}) })
@ -928,8 +840,7 @@ angular.module('application.router', ['ui.router'])
query: { number: '', customer: '', date: null, order_by: '-reference', page: 1, size: 20 } query: { number: '', customer: '', date: null, order_by: '-reference', page: 1, size: 20 }
}).$promise; }).$promise;
}], }],
closedPeriods: [ 'AccountingPeriod', function(AccountingPeriod) { return AccountingPeriod.query().$promise; }], closedPeriods: [ 'AccountingPeriod', function(AccountingPeriod) { return AccountingPeriod.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.invoices').$promise; }]
} }
}) })
@ -959,8 +870,7 @@ angular.module('application.router', ['ui.router'])
adminsPromise: ['Admin', function (Admin) { return Admin.query().$promise; }], adminsPromise: ['Admin', function (Admin) { return Admin.query().$promise; }],
groupsPromise: ['Group', function (Group) { return Group.query().$promise; }], groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],
tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }], tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }],
authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }], authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.members').$promise; }]
} }
}) })
.state('app.admin.members_new', { .state('app.admin.members_new', {
@ -970,9 +880,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "admin/members/new.html" %>', templateUrl: '<%= asset_path "admin/members/new.html" %>',
controller: 'NewMemberController' controller: 'NewMemberController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.members_new', 'app.shared.user', 'app.shared.user_admin']).$promise; }]
} }
}) })
.state('app.admin.members_import', { .state('app.admin.members_import', {
@ -984,7 +891,6 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.members_import', 'app.shared.user', 'app.shared.user_admin']).$promise; }],
tags: ['Tag', function(Tag) { return Tag.query().$promise }] tags: ['Tag', function(Tag) { return Tag.query().$promise }]
} }
}) })
@ -997,7 +903,6 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.members_import_result', 'app.shared.user', 'app.shared.user_admin']).$promise; }],
importItem: ['Import', '$stateParams', function(Import, $stateParams) { return Import.get({ id: $stateParams.id }).$promise }] importItem: ['Import', '$stateParams', function(Import, $stateParams) { return Import.get({ id: $stateParams.id }).$promise }]
} }
}) })
@ -1014,8 +919,7 @@ angular.module('application.router', ['ui.router'])
activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }], activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }],
walletPromise: ['Wallet', '$stateParams', function (Wallet, $stateParams) { return Wallet.getWalletByUser({ user_id: $stateParams.id }).$promise; }], walletPromise: ['Wallet', '$stateParams', function (Wallet, $stateParams) { return Wallet.getWalletByUser({ user_id: $stateParams.id }).$promise; }],
transactionsPromise: ['Wallet', 'walletPromise', function (Wallet, walletPromise) { return Wallet.transactions({ id: walletPromise.id }).$promise; }], transactionsPromise: ['Wallet', 'walletPromise', function (Wallet, walletPromise) { return Wallet.transactions({ id: walletPromise.id }).$promise; }],
tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }], tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.members_edit', 'app.shared.user', 'app.shared.user_admin', 'app.shared.wallet']).$promise; }]
} }
}) })
.state('app.admin.admins_new', { .state('app.admin.admins_new', {
@ -1025,9 +929,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "admin/admins/new.html" %>', templateUrl: '<%= asset_path "admin/admins/new.html" %>',
controller: 'NewAdminController' controller: 'NewAdminController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.admin.admins_new').$promise; }]
} }
}) })
@ -1042,8 +943,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
mappingFieldsPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.mapping_fields().$promise; }], mappingFieldsPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.mapping_fields().$promise; }],
authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }], authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.authentication_new', 'app.shared.authentication', 'app.shared.oauth2']).$promise; }]
} }
}) })
.state('app.admin.authentication_edit', { .state('app.admin.authentication_edit', {
@ -1056,8 +956,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
providerPromise: ['AuthProvider', '$stateParams', function (AuthProvider, $stateParams) { return AuthProvider.get({ id: $stateParams.id }).$promise; }], providerPromise: ['AuthProvider', '$stateParams', function (AuthProvider, $stateParams) { return AuthProvider.get({ id: $stateParams.id }).$promise; }],
mappingFieldsPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.mapping_fields().$promise; }], mappingFieldsPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.mapping_fields().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query(['app.admin.authentication_edit', 'app.shared.authentication', 'app.shared.oauth2']).$promise; }]
} }
}) })
@ -1072,8 +971,7 @@ angular.module('application.router', ['ui.router'])
}, },
resolve: { resolve: {
membersPromise: ['Member', function (Member) { return Member.mapping().$promise; }], membersPromise: ['Member', function (Member) { return Member.mapping().$promise; }],
statisticsPromise: ['Statistics', function (Statistics) { return Statistics.query().$promise; }], statisticsPromise: ['Statistics', function (Statistics) { return Statistics.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.statistics').$promise; }]
} }
}) })
.state('app.admin.stats_graphs', { .state('app.admin.stats_graphs', {
@ -1083,9 +981,6 @@ angular.module('application.router', ['ui.router'])
templateUrl: '<%= asset_path "admin/statistics/graphs.html" %>', templateUrl: '<%= asset_path "admin/statistics/graphs.html" %>',
controller: 'GraphsController' controller: 'GraphsController'
} }
},
resolve: {
translations: ['Translations', function (Translations) { return Translations.query('app.admin.stats_graphs').$promise; }]
} }
}) })
@ -1135,8 +1030,7 @@ angular.module('application.router', ['ui.router'])
cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }], cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }],
cgvFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgv-file' }).$promise; }], cgvFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgv-file' }).$promise; }],
faviconFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'favicon-file' }).$promise; }], faviconFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'favicon-file' }).$promise; }],
profileImageFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'profile-image-file' }).$promise; }], profileImageFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'profile-image-file' }).$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.settings').$promise; }]
} }
}) })
@ -1150,8 +1044,7 @@ angular.module('application.router', ['ui.router'])
} }
}, },
resolve: { resolve: {
clientsPromise: ['OpenAPIClient', function (OpenAPIClient) { return OpenAPIClient.query().$promise; }], clientsPromise: ['OpenAPIClient', function (OpenAPIClient) { return OpenAPIClient.query().$promise; }]
translations: ['Translations', function (Translations) { return Translations.query('app.admin.open_api_clients').$promise; }]
} }
}); });
} }

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-10 b-l b-r-md"> <div class="col-xs-10 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'admin_calendar.calendar_management' }}</h1> <h1 translate>{{ 'app.admin.calendar.calendar_management' }}</h1>
</section> </section>
</div> </div>
@ -28,12 +28,12 @@
<div class="col-sm-12 col-md-12 col-lg-9"> <div class="col-sm-12 col-md-12 col-lg-9">
<div ui-calendar="calendarConfig" ng-model="eventSources" calendar="calendar" class="wrapper-lg"></div> <div ui-calendar="calendarConfig" ng-model="eventSources" calendar="calendar" class="wrapper-lg"></div>
<div class="calendar-legend-block"> <div class="calendar-legend-block">
<h4 translate>{{ 'admin_calendar.legend' }}</h4> <h4 translate>{{ 'app.admin.calendar.legend' }}</h4>
<div class="legends"> <div class="legends">
<span class="calendar-legend text-sm border-formation" translate>{{ 'admin_calendar.trainings' }}</span><br> <span class="calendar-legend text-sm border-formation" translate>{{ 'app.admin.calendar.trainings' }}</span><br>
<span class="calendar-legend text-sm border-machine" translate>{{ 'admin_calendar.machines' }}</span><br> <span class="calendar-legend text-sm border-machine" translate>{{ 'app.admin.calendar.machines' }}</span><br>
<span class="calendar-legend text-sm border-space" ng-hide="fablabWithoutSpaces" translate>{{ 'admin_calendar.spaces' }}</span> <span class="calendar-legend text-sm border-space" ng-hide="fablabWithoutSpaces" translate>{{ 'app.admin.calendar.spaces' }}</span>
<span class="calendar-legend text-sm border-event" ng-show="eventsInCalendar" translate>{{ 'admin_calendar.events' }}</span> <span class="calendar-legend text-sm border-event" ng-show="eventsInCalendar" translate>{{ 'app.admin.calendar.events' }}</span>
</div> </div>
</div> </div>
</div> </div>
@ -44,17 +44,17 @@
ng-href="api/availabilities/export_index.xlsx" ng-href="api/availabilities/export_index.xlsx"
target="export-frame" target="export-frame"
ng-click="alertExport('index')" ng-click="alertExport('index')"
uib-popover="{{ 'admin_calendar.availabilities_notice' | translate}}" uib-popover="{{ 'app.admin.calendar.availabilities_notice' | translate}}"
popover-trigger="mouseenter" popover-trigger="mouseenter"
popover-placement="bottom"> popover-placement="bottom">
<i class="fa fa-file-excel-o"></i> {{ 'admin_calendar.availabilities' | translate }} <i class="fa fa-file-excel-o"></i> {{ 'app.admin.calendar.availabilities' | translate }}
</a> </a>
<iframe name="export-frame" height="0" width="0" class="none"></iframe> <iframe name="export-frame" height="0" width="0" class="none"></iframe>
</div> </div>
<div class="widget panel b-a m m-t-lg" ng-if="availability" ng-hide="availability.available_type == 'event'"> <div class="widget panel b-a m m-t-lg" ng-if="availability" ng-hide="availability.available_type == 'event'">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'admin_calendar.ongoing_reservations' }}</h3> <h3 translate>{{ 'app.admin.calendar.ongoing_reservations' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper" ng-class="{'reservations-locked': availability.lock}"> <div class="widget-content no-bg auto wrapper" ng-class="{'reservations-locked': availability.lock}">
<ul class="list-unstyled" ng-if="reservations.length > 0"> <ul class="list-unstyled" ng-if="reservations.length > 0">
@ -65,14 +65,14 @@
<span class="btn btn-warning btn-xs" ng-click="cancelBooking(r)" ng-if="!r.canceled_at"><i class="fa fa-times red"></i></span> <span class="btn btn-warning btn-xs" ng-click="cancelBooking(r)" ng-if="!r.canceled_at"><i class="fa fa-times red"></i></span>
</li> </li>
</ul> </ul>
<div ng-show="reservations.length == 0" translate>{{ 'admin_calendar.no_reservations' }}</div> <div ng-show="reservations.length == 0" translate>{{ 'app.admin.calendar.no_reservations' }}</div>
<div class="m-t" ng-show="availability.lock"><i class="fa fa-ban"></i> <span class="m-l-xs" translate>{{ 'admin_calendar.reservations_locked' }}</span></div> <div class="m-t" ng-show="availability.lock"><i class="fa fa-ban"></i> <span class="m-l-xs" translate>{{ 'app.admin.calendar.reservations_locked' }}</span></div>
</div> </div>
</div> </div>
<div class="widget panel b-a m m-t-lg" ng-if="availability.machine_ids.length > 0"> <div class="widget panel b-a m m-t-lg" ng-if="availability.machine_ids.length > 0">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'admin_calendar.machines' }}</h3> <h3 translate>{{ 'app.admin.calendar.machines' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper"> <div class="widget-content no-bg auto wrapper">
<ul class="list-unstyled"> <ul class="list-unstyled">
@ -86,23 +86,23 @@
<div class="widget panel b-a m m-t-lg" ng-if="availability" > <div class="widget panel b-a m m-t-lg" ng-if="availability" >
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'admin_calendar.actions' }}</h3> <h3 translate>{{ 'app.admin.calendar.actions' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper" ng-hide="availability.available_type == 'event'"> <div class="widget-content no-bg auto wrapper" ng-hide="availability.available_type == 'event'">
<button class="btn btn-default" ng-click="toggleLockReservations()"> <button class="btn btn-default" ng-click="toggleLockReservations()">
<span ng-hide="availability.lock"> <span ng-hide="availability.lock">
<i class="fa fa-stop"></i> <i class="fa fa-stop"></i>
<span class="m-l-xs" translate>{{ 'admin_calendar.block_reservations' }}</span> <span class="m-l-xs" translate>{{ 'app.admin.calendar.block_reservations' }}</span>
</span> </span>
<span ng-show="availability.lock"> <span ng-show="availability.lock">
<i class="fa fa-play"></i> <i class="fa fa-play"></i>
<span class="m-l-xs" translate>{{ 'admin_calendar.allow_reservations' }}</span> <span class="m-l-xs" translate>{{ 'app.admin.calendar.allow_reservations' }}</span>
</span> </span>
</button> </button>
<button class="btn btn-default m-t" ng-click="removeSlot()"> <button class="btn btn-default m-t" ng-click="removeSlot()">
<span> <span>
<i class="fa fa-trash"></i> <i class="fa fa-trash"></i>
<span class="m-l-xs" translate>{{ 'admin_calendar.delete_slot' }}</span> <span class="m-l-xs" translate>{{ 'app.admin.calendar.delete_slot' }}</span>
</span> </span>
</button> </button>
</div> </div>
@ -110,13 +110,13 @@
<a class="btn btn-default pointer" ui-sref="app.admin.events_edit({id: availability.event_id})"> <a class="btn btn-default pointer" ui-sref="app.admin.events_edit({id: availability.event_id})">
<span> <span>
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>
<span class="m-l-xs" translate>{{ 'admin_calendar.edit_event' }}</span> <span class="m-l-xs" translate>{{ 'app.admin.calendar.edit_event' }}</span>
</span> </span>
</a> </a>
<a class="btn btn-default m-t pointer" ui-sref="app.admin.event_reservations({id: availability.event_id})"> <a class="btn btn-default m-t pointer" ui-sref="app.admin.event_reservations({id: availability.event_id})">
<span> <span>
<i class="fa fa-bookmark"></i> <i class="fa fa-bookmark"></i>
<span class="m-l-xs" translate>{{ 'admin_calendar.view_reservations' }}</span> <span class="m-l-xs" translate>{{ 'app.admin.calendar.view_reservations' }}</span>
</span> </span>
</a> </a>
</div> </div>

View File

@ -1,22 +1,22 @@
<div class="modal-header"> <div class="modal-header">
<img ng-src="{{logoBlack.custom_asset_file_attributes.attachment_url}}" alt="{{logo.custom_asset_file_attributes.attachment}}" class="modal-logo"/> <img ng-src="{{logoBlack.custom_asset_file_attributes.attachment_url}}" alt="{{logo.custom_asset_file_attributes.attachment}}" class="modal-logo"/>
<h1 translate>{{ 'admin_calendar.confirmation_required' }}</h1> <h1 translate>{{ 'app.admin.calendar.confirmation_required' }}</h1>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p ng-hide="isRecurrent" translate>{{ 'admin_calendar.do_you_really_want_to_delete_this_slot' }}</p> <p ng-hide="isRecurrent" translate>{{ 'app.admin.calendar.do_you_really_want_to_delete_this_slot' }}</p>
<p ng-show="isRecurrent" translate>{{ 'admin_calendar.delete_recurring_slot' }}</p> <p ng-show="isRecurrent" translate>{{ 'app.admin.calendar.delete_recurring_slot' }}</p>
<div ng-show="isRecurrent" class="form-group"> <div ng-show="isRecurrent" class="form-group">
<label class="checkbox"> <label class="checkbox">
<input type="radio" name="delete_mode" ng-model="deleteMode" value="single" required/> <input type="radio" name="delete_mode" ng-model="deleteMode" value="single" required/>
<span translate>{{ 'admin_calendar.delete_this_slot' }}</span> <span translate>{{ 'app.admin.calendar.delete_this_slot' }}</span>
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input type="radio" name="delete_mode" ng-model="deleteMode" value="next" required/> <input type="radio" name="delete_mode" ng-model="deleteMode" value="next" required/>
<span translate>{{ 'admin_calendar.delete_this_and_next' }}</span> <span translate>{{ 'app.admin.calendar.delete_this_and_next' }}</span>
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input type="radio" name="delete_mode" ng-model="deleteMode" value="all" required/> <input type="radio" name="delete_mode" ng-model="deleteMode" value="all" required/>
<span translate>{{ 'admin_calendar.delete_all' }}</span> <span translate>{{ 'app.admin.calendar.delete_all' }}</span>
</label> </label>
</div> </div>
</div> </div>

View File

@ -1,27 +1,27 @@
<div class="modal-header"> <div class="modal-header">
<h3 class="text-center red"> <h3 class="text-center red">
{{ 'admin_calendar.DATE_slot' | translate:{DATE:(start | amDateFormat: 'LL')} }} {{start | amDateFormat:'LT'}} - {{end | amDateFormat:'LT'}} {{ 'app.admin.calendar.DATE_slot' | translate:{DATE:(start | amDateFormat: 'LL')} }} {{start | amDateFormat:'LT'}} - {{end | amDateFormat:'LT'}}
</h3> </h3>
</div> </div>
<div class="modal-body" ng-show="step === 1"> <div class="modal-body" ng-show="step === 1">
<label class="m-t-sm" translate>{{ 'admin_calendar.what_kind_of_slot_do_you_want_to_create' }}</label> <label class="m-t-sm" translate>{{ 'app.admin.calendar.what_kind_of_slot_do_you_want_to_create' }}</label>
<div class="form-group"> <div class="form-group">
<div class="radio"> <div class="radio">
<label> <label>
<input type="radio" id="training" name="available_type" value="training" ng-model="availability.available_type"> <input type="radio" id="training" name="available_type" value="training" ng-model="availability.available_type">
<span translate>{{ 'admin_calendar.training' }}</span> <span translate>{{ 'app.admin.calendar.training' }}</span>
</label> </label>
</div> </div>
<div class="radio"> <div class="radio">
<label> <label>
<input type="radio" id="machine" name="available_type" value="machines" ng-model="availability.available_type"> <input type="radio" id="machine" name="available_type" value="machines" ng-model="availability.available_type">
<span translate>{{ 'admin_calendar.machine' }}</span> <span translate>{{ 'app.admin.calendar.machine' }}</span>
</label> </label>
</div> </div>
<div class="radio" ng-hide="fablabWithoutSpaces"> <div class="radio" ng-hide="fablabWithoutSpaces">
<label> <label>
<input type="radio" id="space" name="available_type" value="space" ng-model="availability.available_type" ng-disabled="spaces.length === 0"> <input type="radio" id="space" name="available_type" value="space" ng-model="availability.available_type" ng-disabled="spaces.length === 0">
<span translate>{{ 'admin_calendar.space' }}</span> <span translate>{{ 'app.admin.calendar.space' }}</span>
</label> </label>
</div> </div>
</div> </div>
@ -29,7 +29,7 @@
<div class="modal-body" ng-show="step === 2"> <div class="modal-body" ng-show="step === 2">
<div ng-show="availability.available_type == 'machines'"> <div ng-show="availability.available_type == 'machines'">
<p class="text-center font-sbold m-t-sm">{{ 'admin_calendar.select_some_machines' | translate }}</p> <p class="text-center font-sbold m-t-sm">{{ 'app.admin.calendar.select_some_machines' | translate }}</p>
<div class="form-group m-l-xl"> <div class="form-group m-l-xl">
<label class="checkbox" ng-repeat="machine in machines"> <label class="checkbox" ng-repeat="machine in machines">
@ -43,7 +43,7 @@
</select> </select>
<div class="row m-t"> <div class="row m-t">
<div class="form-group"> <div class="form-group">
<label class="col-sm-6 control-label" for="nb_places_training" translate>{{ 'admin_calendar.number_of_tickets' }}</label> <label class="col-sm-6 control-label" for="nb_places_training" translate>{{ 'app.admin.calendar.number_of_tickets' }}</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="number" id="nb_places_training" class="form-control" ng-model="availability.nb_total_places"> <input type="number" id="nb_places_training" class="form-control" ng-model="availability.nb_total_places">
</div> </div>
@ -56,7 +56,7 @@
</select> </select>
<div class="row m-t"> <div class="row m-t">
<div class="form-group"> <div class="form-group">
<label class="col-sm-6 control-label" for="nb_places_space" translate>{{ 'admin_calendar.number_of_tickets' }}</label> <label class="col-sm-6 control-label" for="nb_places_space" translate>{{ 'app.admin.calendar.number_of_tickets' }}</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="number" id="nb_places_space" class="form-control" ng-model="availability.nb_total_places"> <input type="number" id="nb_places_space" class="form-control" ng-model="availability.nb_total_places">
</div> </div>
@ -66,19 +66,19 @@
</div> </div>
<div class="modal-body" ng-show="step === 3"> <div class="modal-body" ng-show="step === 3">
<div id="timeAdjust" class="m-t-sm"> <div id="timeAdjust" class="m-t-sm">
<p class="text-center font-sbold" translate>{{ 'admin_calendar.adjust_the_opening_hours' }}</p> <p class="text-center font-sbold" translate>{{ 'app.admin.calendar.adjust_the_opening_hours' }}</p>
<div class="row"> <div class="row">
<div class="col-md-3 col-md-offset-2"> <div class="col-md-3 col-md-offset-2">
<uib-timepicker ng-model="start" hour-step="timepickers.start.hstep" readonly-input="true" minute-step="timepickers.start.mstep" show-meridian="false"></uib-timepicker> <uib-timepicker ng-model="start" hour-step="timepickers.start.hstep" readonly-input="true" minute-step="timepickers.start.mstep" show-meridian="false"></uib-timepicker>
</div> </div>
<span class="col-md-1 m-t-xl m-l" translate>{{ 'admin_calendar.to_time' }}</span> <span class="col-md-1 m-t-xl m-l" translate>{{ 'app.admin.calendar.to_time' }}</span>
<fieldset ng-disabled="endDateReadOnly" class="col-md-5"> <fieldset ng-disabled="endDateReadOnly" class="col-md-5">
<uib-timepicker ng-model="end" hour-step="timepickers.end.hstep" readonly-input="true" minute-step="timepickers.end.mstep" show-meridian="false"></uib-timepicker> <uib-timepicker ng-model="end" hour-step="timepickers.end.hstep" readonly-input="true" minute-step="timepickers.end.mstep" show-meridian="false"></uib-timepicker>
</fieldset> </fieldset>
</div> </div>
</div> </div>
<div id="tagAssociate" class="m-t-lg"> <div id="tagAssociate" class="m-t-lg">
<p class="text-center font-sbold" translate>{{ 'admin_calendar.restrict_this_slot_with_labels_optional' }}</p> <p class="text-center font-sbold" translate>{{ 'app.admin.calendar.restrict_this_slot_with_labels_optional' }}</p>
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<ui-select multiple ng-model="availability.tag_ids" class="form-control"> <ui-select multiple ng-model="availability.tag_ids" class="form-control">
@ -95,17 +95,17 @@
</div> </div>
<div class="modal-body m-h" ng-show="step === 4"> <div class="modal-body m-h" ng-show="step === 4">
<div class="m-t-sm"> <div class="m-t-sm">
<p class="text-center font-sbold" translate>{{ 'admin_calendar.recurrence' }}</p> <p class="text-center font-sbold" translate>{{ 'app.admin.calendar.recurrence' }}</p>
<div class="row"> <div class="row">
<div class="form-group"> <div class="form-group">
<label for="is_recurrent" translate>{{ 'admin_calendar.enabled' }}</label> <label for="is_recurrent" translate>{{ 'app.admin.calendar.enabled' }}</label>
<input bs-switch <input bs-switch
ng-model="availability.is_recurrent" ng-model="availability.is_recurrent"
id="is_recurrent" id="is_recurrent"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'yes' | translate }}" switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'no' | translate }}" switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true"/> switch-animate="true"/>
<input type="hidden" name="availability[is_recurrent]" value="{{availability.is_recurrent}}"/> <input type="hidden" name="availability[is_recurrent]" value="{{availability.is_recurrent}}"/>
</div> </div>
@ -113,21 +113,21 @@
</div> </div>
<div class="row"> <div class="row">
<div class="form-group"> <div class="form-group">
<label for="period">{{ 'admin_calendar.period' | translate }}</label> <label for="period">{{ 'app.admin.calendar.period' | translate }}</label>
<select id="period" <select id="period"
name="period" name="period"
class="form-control" class="form-control"
ng-model="availability.period" ng-model="availability.period"
ng-required="availability.is_recurrent" ng-required="availability.is_recurrent"
ng-disabled="!availability.is_recurrent"> ng-disabled="!availability.is_recurrent">
<option value="week" ng-selected="availability.period == 'week'" translate>{{ 'admin_calendar.week' }}</option> <option value="week" ng-selected="availability.period == 'week'" translate>{{ 'app.admin.calendar.week' }}</option>
<option value="month" ng-selected="availability.period == 'month'" translate>{{ 'admin_calendar.month' }}</option> <option value="month" ng-selected="availability.period == 'month'" translate>{{ 'app.admin.calendar.month' }}</option>
</select> </select>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="form-group"> <div class="form-group">
<label for="nb_periods">{{ 'admin_calendar.number_of_periods' | translate }}</label> <label for="nb_periods">{{ 'app.admin.calendar.number_of_periods' | translate }}</label>
<input id="nb_periods" <input id="nb_periods"
name="nb_periods" name="nb_periods"
class="form-control" class="form-control"
@ -139,7 +139,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="form-group"> <div class="form-group">
<label for="end_date">{{ 'admin_calendar.end_date' | translate }}</label> <label for="end_date">{{ 'app.admin.calendar.end_date' | translate }}</label>
<input id="end_date" <input id="end_date"
name="end_date" name="end_date"
class="form-control" class="form-control"
@ -152,30 +152,30 @@
</div> </div>
<div class="modal-body m-h" ng-show="step === 5"> <div class="modal-body m-h" ng-show="step === 5">
<div class="m-t-sm"> <div class="m-t-sm">
<p class="text-center font-sbold" translate>{{ 'admin_calendar.summary' }}</p> <p class="text-center font-sbold" translate>{{ 'app.admin.calendar.summary' }}</p>
<div class="row"> <div class="row">
<span>{{ 'admin_calendar.about_to_create' | translate:{NUMBER:occurrences.length,TYPE:availability.available_type}}}</span> <span>{{ 'app.admin.calendar.about_to_create' | translate:{NUMBER:occurrences.length,TYPE:availability.available_type} }}</span>
<ul> <ul>
<li ng-repeat="slot in occurrences">{{slot.start_at | amDateFormat:'L LT'}} - {{slot.end_at | amDateFormat:'LT'}}</li> <li ng-repeat="slot in occurrences">{{slot.start_at | amDateFormat:'L LT'}} - {{slot.end_at | amDateFormat:'LT'}}</li>
</ul> </ul>
<div> <div>
<span class="underline" translate>{{ 'admin_calendar.reservable' }}</span> <span class="underline" translate>{{ 'app.admin.calendar.reservable' }}</span>
<span ng-bind-html="reservableName"></span> <span ng-bind-html="reservableName"></span>
</div> </div>
<div class="m-t"> <div class="m-t">
<span class="underline" translate>{{ 'admin_calendar.labels' }}</span> <span class="underline" translate>{{ 'app.admin.calendar.labels' }}</span>
<span ng-bind-html="tagsName"></span> <span ng-bind-html="tagsName"></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="modal-footer" ng-show="step < 5"> <div class="modal-footer" ng-show="step < 5">
<button class="btn btn-info" ng-click="previous()" ng-disabled="step === 1" translate>{{ 'admin_calendar.previous' }}</button> <button class="btn btn-info" ng-click="previous()" ng-disabled="step === 1" translate>{{ 'app.admin.calendar.previous' }}</button>
<button class="btn btn-info" ng-click="next()" translate>{{ 'admin_calendar.next' }}</button> <button class="btn btn-info" ng-click="next()" translate>{{ 'app.admin.calendar.next' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button> <button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div> </div>
<div class="modal-footer" ng-show="step === 5"> <div class="modal-footer" ng-show="step === 5">
<button class="btn btn-info" ng-click="previous()" translate>{{ 'admin_calendar.previous' }}</button> <button class="btn btn-info" ng-click="previous()" translate>{{ 'app.admin.calendar.previous' }}</button>
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'confirm' }}</button> <button class="btn btn-warning" ng-click="ok()" translate>{{ 'confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button> <button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div> </div>

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-md-8 b-l b-r-md"> <div class="col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'icalendar.icalendar_import' }}</h1> <h1 translate>{{ 'app.admin.icalendar.icalendar_import' }}</h1>
</section> </section>
</div> </div>
@ -24,15 +24,15 @@
<div class="col-sm-12 col-md-12 col-lg-9"> <div class="col-sm-12 col-md-12 col-lg-9">
<div class="alert alert-info m-lg" translate> <div class="alert alert-info m-lg" translate>
{{ 'icalendar.intro' }} {{ 'app.admin.icalendar.intro' }}
</div> </div>
<div class="wrapper-lg"> <div class="wrapper-lg">
<table class="table" ng-show="calendars.length > 0"> <table class="table" ng-show="calendars.length > 0">
<thead> <thead>
<tr> <tr>
<th style="width: 35%;" translate>{{ 'icalendar.name' }}</th> <th style="width: 35%;" translate>{{ 'app.admin.icalendar.name' }}</th>
<th style="width: 35%;" translate>{{ 'icalendar.url' }}</th> <th style="width: 35%;" translate>{{ 'app.admin.icalendar.url' }}</th>
<th translate>{{ 'icalendar.display' }}</th> <th translate>{{ 'app.admin.icalendar.display' }}</th>
<th style="width: 20%;"></th> <th style="width: 20%;"></th>
</tr> </tr>
</thead> </thead>
@ -40,7 +40,7 @@
<tr ng-repeat="calendar in calendars"> <tr ng-repeat="calendar in calendars">
<td class="calendar-name">{{calendar.name}}</td> <td class="calendar-name">{{calendar.name}}</td>
<td class="calendar-url"><a href="{{calendar.url}}" target="_blank">{{calendar.url}}</a></td> <td class="calendar-url"><a href="{{calendar.url}}" target="_blank">{{calendar.url}}</a></td>
<td class="calendar-legend-block text-left"><span class="calendar-legend" ng-style="calendarStyle(calendar)" translate> {{ calendar.text_hidden ? '' : 'icalendar.example' }}</span> <td class="calendar-legend-block text-left"><span class="calendar-legend" ng-style="calendarStyle(calendar)" translate> {{ calendar.text_hidden ? '' : 'app.admin.icalendar.example' }}</span>
<td class="calendar-actions"> <td class="calendar-actions">
<button class="btn btn-info" ng-click="sync(calendar)"><i class="fa fa-refresh"></i></button> <button class="btn btn-info" ng-click="sync(calendar)"><i class="fa fa-refresh"></i></button>
<button class="btn btn-danger" ng-click="delete(calendar)"><i class="fa fa-trash"></i></button> <button class="btn btn-danger" ng-click="delete(calendar)"><i class="fa fa-trash"></i></button>
@ -49,45 +49,45 @@
</tbody> </tbody>
</table> </table>
<form class="calendar-form" name="newImportForm"> <form class="calendar-form" name="newImportForm">
<h4 translate>{{ 'icalendar.new_import' }}</h4> <h4 translate>{{ 'app.admin.icalendar.new_import' }}</h4>
<div class="input-group"> <div class="input-group">
<div class="input-group-addon"> <div class="input-group-addon">
<i class="fa fa-font"></i> <i class="fa fa-font"></i>
</div> </div>
<input type="text" ng-model="newCalendar.name" class="form-control" placeholder="{{ 'icalendar.name' | translate }}" required> <input type="text" ng-model="newCalendar.name" class="form-control" placeholder="{{ 'app.admin.icalendar.name' | translate }}" required>
</div> </div>
<div class="input-group"> <div class="input-group">
<div class="input-group-addon"> <div class="input-group-addon">
<i class="fa fa-link"></i> <i class="fa fa-link"></i>
</div> </div>
<input type="url" ng-model="newCalendar.url" class="form-control" placeholder="{{ 'icalendar.url' | translate }}" required> <input type="url" ng-model="newCalendar.url" class="form-control" placeholder="{{ 'app.admin.icalendar.url' | translate }}" required>
</div> </div>
<div class="input-group"> <div class="input-group">
<div class="input-group-addon"> <div class="input-group-addon">
<i class="fa fa-paint-brush"></i> <i class="fa fa-paint-brush"></i>
</div> </div>
<input type="text" minicolors ng-model="newCalendar.color" class="form-control" placeholder="{{ 'icalendar.color' | translate}}" required/> <input type="text" minicolors ng-model="newCalendar.color" class="form-control" placeholder="{{ 'app.admin.icalendar.color' | translate}}" required/>
</div> </div>
<div class="input-group"> <div class="input-group">
<div class="input-group-addon"> <div class="input-group-addon">
<i class="fa fa-paint-brush"></i> <i class="fa fa-paint-brush"></i>
</div> </div>
<input type="text" minicolors ng-model="newCalendar.text_color" class="form-control" placeholder="{{ 'icalendar.text_color' | translate}}" ng-required="!newCalendar.text_hidden"/> <input type="text" minicolors ng-model="newCalendar.text_color" class="form-control" placeholder="{{ 'app.admin.icalendar.text_color' | translate}}" ng-required="!newCalendar.text_hidden"/>
</div> </div>
<div class="input-group"> <div class="input-group">
<label for="hideText" class="control-label m-r" translate>{{ 'icalendar.hide_text' }}</label> <label for="hideText" class="control-label m-r" translate>{{ 'app.admin.icalendar.hide_text' }}</label>
<input bs-switch <input bs-switch
ng-model="newCalendar.text_hidden" ng-model="newCalendar.text_hidden"
id="hideText" id="hideText"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'icalendar.hidden' | translate }}" switch-on-text="{{ 'app.admin.icalendar.hidden' | translate }}"
switch-off-text="{{ 'icalendar.shown' | translate }}" switch-off-text="{{ 'app.admin.icalendar.shown' | translate }}"
switch-animate="true"/> switch-animate="true"/>
</div> </div>
<div class="m-t text-right"> <div class="m-t text-right">
<button role="button" class="btn btn-warning" ng-click="save()" ng-disabled="newImportForm.$invalid" translate> <button role="button" class="btn btn-warning" ng-click="save()" ng-disabled="newImportForm.$invalid" translate>
{{ 'confirm' }} {{ 'app.shared.buttons.confirm' }}
</button> </button>
</div> </div>
</form> </form>

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-8 col-sm-8 col-md-8 b-l"> <div class="col-xs-8 col-sm-8 col-md-8 b-l">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'users_management' }}</h1> <h1 translate>{{ 'app.admin.members.users_management' }}</h1>
</section> </section>
</div> </div>
<div class="col-xs-1 col-xs-offset-1 col-md-offset-2 b-l"> <div class="col-xs-1 col-xs-offset-1 col-md-offset-2 b-l">
@ -26,23 +26,23 @@
<div class="col-md-12"> <div class="col-md-12">
<uib-tabset justified="true"> <uib-tabset justified="true">
<uib-tab heading="{{ 'members' | translate }}"> <uib-tab heading="{{ 'app.admin.members.members' | translate }}">
<ng-include src="'<%= asset_path 'admin/members/members.html' %>'"></ng-include> <ng-include src="'<%= asset_path "admin/members/members.html" %>'"></ng-include>
</uib-tab> </uib-tab>
<uib-tab heading="{{ 'administrators' | translate }}"> <uib-tab heading="{{ 'app.admin.members.administrators' | translate }}">
<ng-include src="'<%= asset_path 'admin/members/administrators.html' %>'"></ng-include> <ng-include src="'<%= asset_path "admin/members/administrators.html" %>'"></ng-include>
</uib-tab> </uib-tab>
<uib-tab heading="{{ 'groups' | translate }}"> <uib-tab heading="{{ 'app.admin.members.groups' | translate }}">
<div ui-view="groups"></div> <div ui-view="groups"></div>
</uib-tab> </uib-tab>
<uib-tab heading="{{ 'tags' | translate }}"> <uib-tab heading="{{ 'app.admin.members.tags' | translate }}">
<div ui-view="tags"></div> <div ui-view="tags"></div>
</uib-tab> </uib-tab>
<uib-tab heading="{{ 'authentication' | translate }}"> <uib-tab heading="{{ 'app.admin.members.authentication' | translate }}">
<div ui-view="authentification"></div> <div ui-view="authentification"></div>
</uib-tab> </uib-tab>
</uib-tabset> </uib-tabset>

View File

@ -2,21 +2,21 @@
<div class="form-group"> <div class="form-group">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon"><i class="fa fa-filter"></i></span> <span class="input-group-addon"><i class="fa fa-filter"></i></span>
<input type="text" ng-model="member.searchText" class="form-control" placeholder="{{ 'search_for_an_user' | translate }}" ng-change="updateTextSearch()"> <input type="text" ng-model="member.searchText" class="form-control" placeholder="{{ 'app.admin.members.search_for_an_user' | translate }}" ng-change="updateTextSearch()">
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
<button type="button" class="btn btn-warning m-t m-b" ui-sref="app.admin.members_new" translate>{{ 'add_a_new_member' }}</button> <button type="button" class="btn btn-warning m-t m-b" ui-sref="app.admin.members_new" translate>{{ 'app.admin.members.add_a_new_member' }}</button>
<div class="pull-right"> <div class="pull-right">
<a class="btn btn-default" ng-href="api/members/export_members.xlsx" target="export-frame" ng-click="alertExport('members')"> <a class="btn btn-default" ng-href="api/members/export_members.xlsx" target="export-frame" ng-click="alertExport('members')">
<i class="fa fa-file-excel-o"></i> {{ 'members' | translate }} <i class="fa fa-file-excel-o"></i> {{ 'app.admin.members.members' | translate }}
</a> </a>
<a class="btn btn-default" ng-href="api/members/export_subscriptions.xlsx" target="export-frame" ng-if="!fablabWithoutPlans" ng-click="alertExport('subscriptions')"> <a class="btn btn-default" ng-href="api/members/export_subscriptions.xlsx" target="export-frame" ng-if="!fablabWithoutPlans" ng-click="alertExport('subscriptions')">
<i class="fa fa-file-excel-o"></i> {{ 'subscriptions' | translate }} <i class="fa fa-file-excel-o"></i> {{ 'app.admin.members.subscriptions' | translate }}
</a> </a>
<a class="btn btn-default" ng-href="api/members/export_reservations.xlsx" target="export-frame" ng-click="alertExport('reservations')"> <a class="btn btn-default" ng-href="api/members/export_reservations.xlsx" target="export-frame" ng-click="alertExport('reservations')">
<i class="fa fa-file-excel-o"></i> {{ 'reservations' | translate }} <i class="fa fa-file-excel-o"></i> {{ 'app.admin.members.reservations' | translate }}
</a> </a>
<iframe name="export-frame" height="0" width="0" class="none"></iframe> <iframe name="export-frame" height="0" width="0" class="none"></iframe>
</div> </div>
@ -25,12 +25,12 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th style="width:15%"><a href="" ng-click="setOrderMember('last_name')">{{ 'surname' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='last_name', 'fa fa-sort-alpha-desc': member.order=='-last_name', 'fa fa-arrows-v': member.order }"></i></a></th> <th style="width:15%"><a href="" ng-click="setOrderMember('last_name')">{{ 'app.admin.members.surname' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='last_name', 'fa fa-sort-alpha-desc': member.order=='-last_name', 'fa fa-arrows-v': member.order }"></i></a></th>
<th style="width:15%"><a href="" ng-click="setOrderMember('first_name')">{{ 'first_name' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='first_name', 'fa fa-sort-alpha-desc': member.order=='-first_name', 'fa fa-arrows-v': member.order }"></i></a></th> <th style="width:15%"><a href="" ng-click="setOrderMember('first_name')">{{ 'app.admin.members.first_name' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='first_name', 'fa fa-sort-alpha-desc': member.order=='-first_name', 'fa fa-arrows-v': member.order }"></i></a></th>
<th style="width:15%" class="hidden-xs"><a href="" ng-click="setOrderMember('email')">{{ 'email' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='email', 'fa fa-sort-alpha-desc': member.order=='-email', 'fa fa-arrows-v': member.order }"></i></a></th> <th style="width:15%" class="hidden-xs"><a href="" ng-click="setOrderMember('email')">{{ 'app.admin.members.email' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='email', 'fa fa-sort-alpha-desc': member.order=='-email', 'fa fa-arrows-v': member.order }"></i></a></th>
<th style="width:10%" class="hidden-xs hidden-sm hidden-md"><a href="" ng-click="setOrderMember('phone')">{{ 'phone' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': member.order=='phone', 'fa fa-sort-numeric-desc': member.order=='-phone', 'fa fa-arrows-v': member.order }"></i></a></th> <th style="width:10%" class="hidden-xs hidden-sm hidden-md"><a href="" ng-click="setOrderMember('phone')">{{ 'app.admin.members.phone' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': member.order=='phone', 'fa fa-sort-numeric-desc': member.order=='-phone', 'fa fa-arrows-v': member.order }"></i></a></th>
<th style="width:20%" class="hidden-xs hidden-sm"><a href="" ng-click="setOrderMember('group')">{{ 'user_type' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='group', 'fa fa-sort-alpha-desc': member.order=='-group', 'fa fa-arrows-v': member.order }"></i></a></th> <th style="width:20%" class="hidden-xs hidden-sm"><a href="" ng-click="setOrderMember('group')">{{ 'app.admin.members.user_type' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='group', 'fa fa-sort-alpha-desc': member.order=='-group', 'fa fa-arrows-v': member.order }"></i></a></th>
<th style="width:15%" class="hidden-xs hidden-sm hidden-md"><a href="" ng-click="setOrderMember('plan')">{{ 'subscription' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='plan', 'fa fa-sort-alpha-desc': member.order=='-plan', 'fa fa-arrows-v': member.order }"></i></a></th> <th style="width:15%" class="hidden-xs hidden-sm hidden-md"><a href="" ng-click="setOrderMember('plan')">{{ 'app.admin.members.subscription' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='plan', 'fa fa-sort-alpha-desc': member.order=='-plan', 'fa fa-arrows-v': member.order }"></i></a></th>
<th style="width:10%"></th> <th style="width:10%"></th>
</tr> </tr>
</thead> </thead>
@ -50,13 +50,13 @@
<button class="btn btn-danger" ng-click="deleteMember(m.id)"> <button class="btn btn-danger" ng-click="deleteMember(m.id)">
<i class="fa fa-trash"></i> <i class="fa fa-trash"></i>
</button> </button>
<span class="label label-danger text-white" ng-show="m.need_completion" translate>{{ 'incomplete_profile' }}</span> <span class="label label-danger text-white" ng-show="m.need_completion" translate>{{ 'app.admin.members.incomplete_profile' }}</span>
</div> </div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="text-center"> <div class="text-center">
<button class="btn btn-warning" ng-click="showNextMembers()" ng-hide="member.noMore"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'display_more_users' | translate }}</button> <button class="btn btn-warning" ng-click="showNextMembers()" ng-hide="member.noMore"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.members.display_more_users' | translate }}</button>
</div> </div>
</div> </div>

View File

@ -15,21 +15,21 @@
<uib-alert ng-repeat="alert in alerts" type="{{alert.type}}" close="closeAlert($index)">{{alert.msg}}</uib-alert> <uib-alert ng-repeat="alert in alerts" type="{{alert.type}}" close="closeAlert($index)">{{alert.msg}}</uib-alert>
<div class="form-group m-b-lg" ng-class="{'has-error': trainingForm['training[name]'].$dirty && trainingForm['training[name]'].$invalid}"> <div class="form-group m-b-lg" ng-class="{'has-error': trainingForm['training[name]'].$dirty && trainingForm['training[name]'].$invalid}">
<label for="name" class="col-sm-2 control-label">{{ 'trainings_form.name' | translate }} *</label> <label for="name" class="col-sm-2 control-label">{{ 'app.shared.trainings.name' | translate }} *</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input name="training[name]" <input name="training[name]"
ng-model="training.name" ng-model="training.name"
type="text" type="text"
class="form-control" class="form-control"
id="training_name" id="training_name"
placeholder="{{'trainings_form.name' | translate}}" placeholder="{{'app.shared.trainings.name' | translate}}"
required/> required/>
<span class="help-block" ng-show="trainingForm['training[name]'].$dirty && trainingForm['training[name]'].$error.required" translate>{{ 'trainings_form.name_is_required' }}</span> <span class="help-block" ng-show="trainingForm['training[name]'].$dirty && trainingForm['training[name]'].$error.required" translate>{{ 'app.shared.trainings.name_is_required' }}</span>
</div> </div>
</div> </div>
<div class="form-group m-b-lg"> <div class="form-group m-b-lg">
<label for="training_image" class="col-sm-2 control-label">{{ 'trainings_form.illustration' | translate }} *</label> <label for="training_image" class="col-sm-2 control-label">{{ 'app.shared.trainings.illustration' | translate }} *</label>
<div class="col-sm-10"> <div class="col-sm-10">
<div class="fileinput" data-provides="fileinput" ng-class="fileinputClass(training.training_image)"> <div class="fileinput" data-provides="fileinput" ng-class="fileinputClass(training.training_image)">
<div class="fileinput-new thumbnail" style="width: 334px; height: 250px;"> <div class="fileinput-new thumbnail" style="width: 334px; height: 250px;">
@ -40,8 +40,8 @@
</div> </div>
<div> <div>
<span class="btn btn-default btn-file"> <span class="btn btn-default btn-file">
<span class="fileinput-new">{{ 'trainings_form.add_an_illustration' | translate }} <i class="fa fa-upload fa-fw"></i></span> <span class="fileinput-new">{{ 'app.shared.trainings.add_an_illustration' | translate }} <i class="fa fa-upload fa-fw"></i></span>
<span class="fileinput-exists" translate>{{ 'change' }}</span> <span class="fileinput-exists" translate>{{ 'app.shared.buttons.change' }}</span>
<input type="file" <input type="file"
ng-model="training.training_image" ng-model="training.training_image"
name="training[training_image_attributes][attachment]" name="training[training_image_attributes][attachment]"
@ -49,7 +49,7 @@
required required
bs-jasny-fileinput> bs-jasny-fileinput>
</span> </span>
<a class="btn btn-danger fileinput-exists" data-dismiss="fileinput" translate>{{ 'delete' }}</a> <a class="btn btn-danger fileinput-exists" data-dismiss="fileinput" translate>{{ 'app.shared.buttons.delete' }}</a>
</div> </div>
</div> </div>
</div> </div>
@ -57,16 +57,16 @@
<div class="form-group m-b-xl" ng-class="{'has-error': trainingForm['training[description]'].$dirty && trainingForm['training[description]'].$invalid}"> <div class="form-group m-b-xl" ng-class="{'has-error': trainingForm['training[description]'].$dirty && trainingForm['training[description]'].$invalid}">
<label for="training_description" class="col-sm-2 control-label">{{ 'trainings_form.description' | translate }} *</label> <label for="training_description" class="col-sm-2 control-label">{{ 'app.shared.trainings.description' | translate }} *</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input type="hidden" name="training[description]" ng-value="training.description" /> <input type="hidden" name="training[description]" ng-value="training.description" />
<summernote ng-model="training.description" id="training_description" placeholder="" config="summernoteOpts" name="training[description]" required></summernote> <summernote ng-model="training.description" id="training_description" placeholder="" config="summernoteOpts" name="training[description]" required></summernote>
<span class="help-block" ng-show="trainingForm['training[description]'].$dirty && trainingForm['training[description]'].$error.required" translate>{{ 'trainings_form.description_is_required' }}</span> <span class="help-block" ng-show="trainingForm['training[description]'].$dirty && trainingForm['training[description]'].$error.required" translate>{{ 'app.shared.trainings.description_is_required' }}</span>
</div> </div>
</div> </div>
<div class="form-group m-b-lg" ng-class="{'has-error': trainingForm['training[machine_ids]'].$dirty && trainingForm['training[machine_ids]'].$invalid}"> <div class="form-group m-b-lg" ng-class="{'has-error': trainingForm['training[machine_ids]'].$dirty && trainingForm['training[machine_ids]'].$invalid}">
<label for="training_machines" class="col-sm-2 control-label">{{ 'trainings_form.associated_machines' | translate }}</label> <label for="training_machines" class="col-sm-2 control-label">{{ 'app.shared.trainings.associated_machines' | translate }}</label>
<div class="col-sm-4"> <div class="col-sm-4">
<ui-select multiple ng-model="training.machine_ids" class="form-control" id="training_machines"> <ui-select multiple ng-model="training.machine_ids" class="form-control" id="training_machines">
<ui-select-match> <ui-select-match>
@ -84,7 +84,7 @@
</div> </div>
<div class="form-group m-b-lg" ng-class="{'has-error': trainingForm['training[nb_total_places]'].$dirty && trainingForm['training[nb_total_places]'].$invalid}"> <div class="form-group m-b-lg" ng-class="{'has-error': trainingForm['training[nb_total_places]'].$dirty && trainingForm['training[nb_total_places]'].$invalid}">
<label for="training_nb_total_places" class="col-sm-2 control-label">{{ 'trainings_form.number_of_tickets' | translate }}</label> <label for="training_nb_total_places" class="col-sm-2 control-label">{{ 'app.shared.trainings.number_of_tickets' | translate }}</label>
<div class="col-sm-4"> <div class="col-sm-4">
<input ng-model="training.nb_total_places" <input ng-model="training.nb_total_places"
type="number" type="number"
@ -98,7 +98,7 @@
<div class="form-group"> <div class="form-group">
<label for="training[public_page]" class="control-label col-sm-2" translate> <label for="training[public_page]" class="control-label col-sm-2" translate>
{{ 'trainings_form.public_page' }} {{ 'app.shared.trainings.public_page' }}
</label> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input bs-switch <input bs-switch
@ -106,8 +106,8 @@
name="training[public_page]" name="training[public_page]"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'yes' | translate }}" switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'no' | translate }}" switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-active="{{!training.disabled}}" switch-active="{{!training.disabled}}"
switch-animate="true"/> switch-animate="true"/>
<input type="hidden" name="training[public_page]" value="{{training.public_page}}"> <input type="hidden" name="training[public_page]" value="{{training.public_page}}">
@ -116,7 +116,7 @@
<div class="form-group"> <div class="form-group">
<label for="training[disabled]" class="control-label col-sm-2" translate> <label for="training[disabled]" class="control-label col-sm-2" translate>
{{ 'trainings_form.disable_training' }} {{ 'app.shared.trainings.disable_training' }}
</label> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input bs-switch <input bs-switch
@ -124,8 +124,8 @@
name="training[disabled]" name="training[disabled]"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'yes' | translate }}" switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'no' | translate }}" switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
ng-change="onDisableToggled()" ng-change="onDisableToggled()"
switch-animate="true"/> switch-animate="true"/>
<input type="hidden" name="training[disabled]" value="{{training.disabled}}"> <input type="hidden" name="training[disabled]" value="{{training.disabled}}">
@ -136,7 +136,7 @@
<div class="panel-footer no-padder"> <div class="panel-footer no-padder">
<input type="submit" <input type="submit"
value="{{ 'trainings_form.validate_your_training' | translate }}" value="{{ 'app.shared.trainings.validate_your_training' | translate }}"
class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c"
ng-disabled="trainingForm.$invalid"/> ng-disabled="trainingForm.$invalid"/>
</div> </div>

View File

@ -13,7 +13,7 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<div class="btn btn-lg btn-block btn-default rounded m-t-xs" ng-click="cancel()" translate>{{ 'cancel' }}</div> <div class="btn btn-lg btn-block btn-default rounded m-t-xs" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</div>
</section> </section>
</div> </div>
</div> </div>
@ -22,6 +22,6 @@
<div class="row no-gutter"> <div class="row no-gutter">
<div class="col-sm-12 col-md-12 col-lg-9 b-r-lg nopadding"> <div class="col-sm-12 col-md-12 col-lg-9 b-r-lg nopadding">
<ng-include src="'<%= asset_path 'admin/trainings/_form.html' %>'"></ng-include> <ng-include src="'<%= asset_path "admin/trainings/_form.html" %>'"></ng-include>
</div> </div>
</div> </div>

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l"> <div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'trainings_monitoring' }}</h1> <h1 translate>{{ 'app.admin.trainings.trainings_monitoring' }}</h1>
</section> </section>
</div> </div>
@ -20,17 +20,17 @@
<div class="col-md-12"> <div class="col-md-12">
<uib-tabset justified="true"> <uib-tabset justified="true">
<uib-tab heading="{{ 'trainings' | translate }}"> <uib-tab heading="{{ 'app.admin.trainings.trainings' | translate }}">
<div class="m-t m-b"> <div class="m-t m-b">
<button type="button" class="btn btn-warning" ui-sref="app.admin.trainings_new"> <button type="button" class="btn btn-warning" ui-sref="app.admin.trainings_new">
<i class="fa fa-plus m-r"></i> <i class="fa fa-plus m-r"></i>
<span translate>{{ 'add_a_new_training' }}</span> <span translate>{{ 'app.admin.trainings.add_a_new_training' }}</span>
</button> </button>
<div class="form-group pull-right"> <div class="form-group pull-right">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon"><i class="fa fa-filter"></i></span> <span class="input-group-addon"><i class="fa fa-filter"></i></span>
<select ng-model="trainingFiltering" class="form-control"> <select ng-model="trainingFiltering" class="form-control">
<option ng-repeat="status in filterDisabled" value="{{status}}" translate>{{ 'status_'+status }}</option> <option ng-repeat="status in filterDisabled" value="{{status}}" translate>{{ 'app.admin.trainings.status_'+status }}</option>
</select> </select>
</div> </div>
</div> </div>
@ -39,9 +39,9 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th style="width:20%" translate>{{ 'name' }}</th> <th style="width:20%" translate>{{ 'app.admin.trainings.name' }}</th>
<th style="width:40%" translate>{{ 'associated_machines' }}</th> <th style="width:40%" translate>{{ 'app.admin.trainings.associated_machines' }}</th>
<th style="width:20%" translate>{{ 'number_of_tickets' }}</th> <th style="width:20%" translate>{{ 'app.admin.trainings.number_of_tickets' }}</th>
<th style="width:20%"></th> <th style="width:20%"></th>
</tr> </tr>
</thead> </thead>
@ -53,7 +53,7 @@
<td> <td>
<div class="buttons"> <div class="buttons">
<button class="btn btn-default" ui-sref="app.admin.trainings_edit({id:training.id})"> <button class="btn btn-default" ui-sref="app.admin.trainings_edit({id:training.id})">
<i class="fa fa-edit"></i> {{ 'edit' | translate }} <i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}
</button> </button>
<button class="btn btn-danger" ng-click="removeTraining($index, training)"> <button class="btn btn-danger" ng-click="removeTraining($index, training)">
<i class="fa fa-trash-o"></i> <i class="fa fa-trash-o"></i>
@ -65,9 +65,9 @@
</table> </table>
</uib-tab> </uib-tab>
<uib-tab heading="{{ 'trainings_monitoring' | translate }}"> <uib-tab heading="{{ 'app.admin.trainings.trainings_monitoring' | translate }}">
<div class="m-lg"> <div class="m-lg">
<label for="training_select" translate>{{ 'select_a_training' }}</label> <label for="training_select" translate>{{ 'app.admin.trainings.select_a_training' }}</label>
<select ng-options="training as training.name for training in trainings" ng-model="monitoring.training" class="form-control" ng-change="selectTrainingToMonitor()" name="training_select"> <select ng-options="training as training.name for training in trainings" ng-model="monitoring.training" class="form-control" ng-change="selectTrainingToMonitor()" name="training_select">
</select> </select>
</div> </div>
@ -75,8 +75,8 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th style="width:35%" translate>{{ 'training' }}</th> <th style="width:35%" translate>{{ 'app.admin.trainings.training' }}</th>
<th style="width:65%" translate>{{ 'date' }}</th> <th style="width:65%" translate>{{ 'app.admin.trainings.date' }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -84,16 +84,18 @@
<td>{{training_name}}</td> <td>{{training_name}}</td>
<td> <td>
<uib-accordion close-others="true"> <uib-accordion close-others="true">
<uib-accordion-group ng-repeat="months in years | toArray | orderBy:'$key':true" heading="{{ 'year_NUMBER' | translate:{NUMBER:months.$key} }}" is-open="accordions[training_name][months.$key].isOpenFirst" ng-if="!months.name" class="light-accordion"> <uib-accordion-group ng-repeat="months in years | toArray | orderBy:'$key':true" heading="{{ 'app.admin.trainings.year_NUMBER' | translate:{NUMBER:months.$key} }}" is-open="accordions[training_name][months.$key].isOpenFirst" ng-if="!months.name" class="light-accordion">
<uib-accordion close-others="true"> <uib-accordion close-others="true">
<uib-accordion-group ng-repeat="days in months | toArray | orderBy:'$key':true" heading="{{ 'month_of_NAME' | translate:{NAME:formatMonth(days.$key)} }}" is-open="accordions[training_name][months.$key][days.$key].isOpenFirst" ng-if="days.$key" class="light-accordion"> <uib-accordion-group ng-repeat="days in months | toArray | orderBy:'$key':true" heading="{{ 'app.admin.trainings.month_of_NAME' | translate:{NAME:formatMonth(days.$key)} }}" is-open="accordions[training_name][months.$key][days.$key].isOpenFirst" ng-if="days.$key" class="light-accordion">
<uib-accordion close-others="true"> <uib-accordion close-others="true">
<uib-accordion-group ng-repeat="(day, availabilities) in days" heading="{{formatDay(day, days.$key, months.$key)}}" is-open="accordions[training_name][months.$key][days.$key][day].isOpenFirst" class="light-accordion"> <uib-accordion-group ng-repeat="(day, availabilities) in days" heading="{{formatDay(day, days.$key, months.$key)}}" is-open="accordions[training_name][months.$key][days.$key][day].isOpenFirst" class="light-accordion">
<ul class="list-unstyled"> <ul class="list-unstyled">
<li ng-repeat="a in availabilities"> <li ng-repeat="a in availabilities">
<a ng-click="showReservations(years.training, a)" class="btn btn-default">{{ a.start_at | amDateFormat:'LLL' }} - {{ a.end_at | amDateFormat:'LT' }}</a> <span class="label label-success" translate translate-values="{NUMBER:a.reservation_users.length}"> {{ 'NUMBER_reservation' }}</span> <a ng-click="showReservations(years.training, a)" class="btn btn-default">{{ a.start_at | amDateFormat:'LLL'
}} - {{ a.end_at | amDateFormat:'LT' }}</a>
<span class="label label-success" translate translate-values="{NUMBER:a.reservation_users.length}"> {{ 'app.admin.trainings.NUMBER_reservation' }}</span>
</li> </li>
</ul> </ul>
</uib-accordion-group> </uib-accordion-group>

View File

@ -1,19 +1,21 @@
<div class="modal-header"> <div class="modal-header">
<h1 translate>{{ 'training_validation' }}</h1> <h1 translate>{{ 'app.admin.trainings.training_validation' }}</h1>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>{{ 'training_of_the_' | translate }}<span class="font-sbold">{{ availability.start_at | amDateFormat:'LLL' }} - {{ availability.end_at | amDateFormat:'LT' }}</span> <br> <p>
{{ 'you_can_validate_the_training_of_the_following_members' | translate }}</p> <span translate translate-values="{DATE:(availability.start_at | amDateFormat:'LLL'), TIME:(availability.end_at | amDateFormat:'LT')}">{{ 'app.admin.trainings.training_of_the_DATE_TIME_html' }}</span>
<br>
<span translate>{{ 'app.admin.trainings.you_can_validate_the_training_of_the_following_members' }}</span></p>
<ul class="list-unstyled" ng-if="availability.reservation_users.length > 0"> <ul class="list-unstyled" ng-if="availability.reservation_users.length > 0">
<li ng-repeat="user in availability.reservation_users"> <li ng-repeat="user in availability.reservation_users">
<label for="{{user.id}}" ng-show="user.id">{{user.full_name}}</label> <label for="{{user.id}}" ng-show="user.id">{{user.full_name}}</label>
<span class="text-gray text-italic" ng-hide="user.id" translate>{{ 'deleted_user' }}</span> <span class="text-gray text-italic" ng-hide="user.id" translate>{{ 'app.admin.trainings.deleted_user' }}</span>
<input type="checkbox" ng-checked="user.is_valid" ng-disabled="user.is_valid || !user.id" ng-click="toggleSelection(user)" id="{{user.id}}" /> <input type="checkbox" ng-checked="user.is_valid" ng-disabled="user.is_valid || !user.id" ng-click="toggleSelection(user)" id="{{user.id}}" />
</li> </li>
</ul> </ul>
<p ng-if="availability.reservation_users.length == 0" translate>{{ 'no_reservation' }}</p> <p ng-if="availability.reservation_users.length == 0" translate>{{ 'app.admin.trainings.no_reservation' }}</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="usersToValid.length == 0" translate>{{ 'validate_the_trainings' }}</button> <button class="btn btn-warning" ng-click="ok()" ng-disabled="usersToValid.length == 0" translate>{{ 'app.admin.trainings.validate_the_trainings' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button> <button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div> </div>

View File

@ -7,14 +7,14 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md hide-b-r-lg"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md hide-b-r-lg">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'calendar.calendar' }}</h1> <h1 translate>{{ 'app.public.calendar.calendar' }}</h1>
</section> </section>
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md hidden-lg"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md hidden-lg">
<div class="heading-actions wrapper"> <div class="heading-actions wrapper">
<button type="button" class="btn btn-default m-t m-b" ng-click="openFilterAside()"> <button type="button" class="btn btn-default m-t m-b" ng-click="openFilterAside()">
<span class="fa fa-filter"></span> {{ 'calendar.filter_calendar' | translate }} <span class="fa fa-filter"></span> {{ 'app.public.calendar.filter_calendar' | translate }}
</button> </button>
</div> </div>
</div> </div>
@ -38,7 +38,7 @@
<div class="col-lg-3 hidden-md hidden-sm hidden-xs"> <div class="col-lg-3 hidden-md hidden-sm hidden-xs">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'calendar.filter_calendar' }}</h3> <h3 translate>{{ 'app.public.calendar.filter_calendar' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper calendar-filter"> <div class="widget-content no-bg auto wrapper calendar-filter">
<ng-include src="'<%= asset_path "calendar/filter.html" %>'"></ng-include> <ng-include src="'<%= asset_path "calendar/filter.html" %>'"></ng-include>
@ -53,7 +53,7 @@
<div class="widget"> <div class="widget">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" ng-click="close($event)"><span>&times;</span></button> <button type="button" class="close" ng-click="close($event)"><span>&times;</span></button>
<h1 class="modal-title" translate>{{ 'calendar.filter_calendar' }}</h1> <h1 class="modal-title" translate>{{ 'app.public.calendar.filter_calendar' }}</h1>
</div> </div>
<div class="modal-body widget-content calendar-filter calendar-filter-aside"> <div class="modal-body widget-content calendar-filter calendar-filter-aside">
<ng-include src="'<%= asset_path "calendar/filter.html" %>'"></ng-include> <ng-include src="'<%= asset_path "calendar/filter.html" %>'"></ng-include>

View File

@ -2,7 +2,7 @@
<section class="heading"> <section class="heading">
<div class="row no-gutter"> <div class="row no-gutter">
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
</div> </div>
</section> </section>
@ -13,7 +13,7 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'your_next_events' | translate }}</h4> <h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'app.logged.dashboard.events.your_next_events' | translate }}</h4>
</div> </div>
<div class="widget-content bg-light wrapper r-b"> <div class="widget-content bg-light wrapper r-b">
<ul class="list-unstyled" ng-if="user.events_reservations.length > 0"> <ul class="list-unstyled" ng-if="user.events_reservations.length > 0">
@ -24,25 +24,25 @@
<br/> <br/>
<span translate <span translate
translate-values="{NUMBER: r.nb_reserve_places}"> translate-values="{NUMBER: r.nb_reserve_places}">
{{ 'NUMBER_normal_places_reserved' }} {{ 'app.logged.dashboard.events.NUMBER_normal_places_reserved' }}
</span> </span>
<span ng-repeat="ticket in r.tickets"> <span ng-repeat="ticket in r.tickets">
<br/> <br/>
<span translate <span translate
translate-values="{NUMBER: ticket.booked, NAME: ticket.price_category.name}"> translate-values="{NUMBER: ticket.booked, NAME: ticket.price_category.name}">
{{ 'NUMBER_of_NAME_places_reserved' }} {{ 'app.logged.dashboard.events.NUMBER_of_NAME_places_reserved' }}
</span> </span>
</span> </span>
</li> </li>
</ul> </ul>
<div ng-if="(user.events_reservations | eventsReservationsFilter:'future').length == 0" translate>{{ 'no_events_to_come' }}</div> <div ng-if="(user.events_reservations | eventsReservationsFilter:'future').length == 0" translate>{{ 'app.logged.dashboard.events.no_events_to_come' }}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'your_previous_events' | translate }}</h4> <h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'app.logged.dashboard.events.your_previous_events' | translate }}</h4>
</div> </div>
<div class="widget-content bg-light auto wrapper r-b"> <div class="widget-content bg-light auto wrapper r-b">
<ul class="list-unstyled" ng-if="user.events_reservations.length > 0"> <ul class="list-unstyled" ng-if="user.events_reservations.length > 0">
@ -50,7 +50,7 @@
<span class="font-sbold">{{r.reservable.title}}</span> - <span class="label label-info text-white wrapper-sm">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span> <span class="font-sbold">{{r.reservable.title}}</span> - <span class="label label-info text-white wrapper-sm">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span>
</li> </li>
</ul> </ul>
<div ng-if="(user.events_reservations | eventsReservationsFilter:'passed').length == 0" translate>{{ 'no_passed_events' }}</div> <div ng-if="(user.events_reservations | eventsReservationsFilter:'passed').length == 0" translate>{{ 'app.logged.dashboard.events.no_passed_events' }}</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<section class="heading"> <section class="heading">
<div class="row no-gutter"> <div class="row no-gutter">
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
</div> </div>
</section> </section>
@ -15,9 +15,9 @@
<table class="table" ng-if="user.invoices.length > 0"> <table class="table" ng-if="user.invoices.length > 0">
<thead> <thead>
<tr> <tr>
<th style="width:21%" translate>{{ 'reference_number' }}</th> <th style="width:21%" translate>{{ 'app.logged.dashboard.invoices.reference_number' }}</th>
<th style="width:21%" translate>{{ 'date' }}</th> <th style="width:21%" translate>{{ 'app.logged.dashboard.invoices.date' }}</th>
<th style="width:21%" translate>{{ 'price' }}</th> <th style="width:21%" translate>{{ 'app.logged.dashboard.invoices.price' }}</th>
<th style="width:20%"></th> <th style="width:20%"></th>
</tr> </tr>
</thead> </thead>
@ -30,17 +30,17 @@
<td> <td>
<div class="buttons"> <div class="buttons">
<a class="btn btn-default" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="!invoice.is_avoir"> <a class="btn btn-default" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="!invoice.is_avoir">
<i class="fa fa-file-pdf-o"></i> {{ 'download_the_invoice' | translate }} <i class="fa fa-file-pdf-o"></i> {{ 'app.logged.dashboard.invoices.download_the_invoice' | translate }}
</a> </a>
<a class="btn btn-default" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="invoice.is_avoir"> <a class="btn btn-default" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="invoice.is_avoir">
<i class="fa fa-file-pdf-o"></i> {{ 'download_the_credit_note' | translate }} <i class="fa fa-file-pdf-o"></i> {{ 'app.logged.dashboard.invoices.download_the_credit_note' | translate }}
</a> </a>
</div> </div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p ng-if="user.invoices.length == 0" translate>{{ 'no_invoices_for_now' }}</p> <p ng-if="user.invoices.length == 0" translate>{{ 'app.logged.dashboard.invoices.no_invoices_for_now' }}</p>
</div> </div>
</div> </div>

View File

@ -8,15 +8,15 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-10 b-l"> <div class="col-xs-10 col-sm-10 col-md-10 b-l">
<section class="heading-title m-l"> <section class="heading-title m-l">
<h4 class="m-l text-sm" translate>{{ 'dashboard' }}</h4> <h4 class="m-l text-sm" translate>{{ 'app.public.common.dashboard' }}</h4>
<ul class="nav-page nav nav-pills text-u-c text-sm"> <ul class="nav-page nav nav-pills text-u-c text-sm">
<li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.profile" translate>{{ 'my_profile' }}</a></li> <li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.profile" translate>{{ 'app.public.common.my_profile' }}</a></li>
<li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.settings" translate>{{ 'my_settings' }}</a></li> <li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.settings" translate>{{ 'app.public.common.my_settings' }}</a></li>
<li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.projects" translate>{{ 'my_projects' }}</a></li> <li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.projects" translate>{{ 'app.public.common.my_projects' }}</a></li>
<li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.trainings" translate>{{ 'my_trainings' }}</a></li> <li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.trainings" translate>{{ 'app.public.common.my_trainings' }}</a></li>
<li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.events" translate>{{ 'my_events' }}</a></li> <li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.events" translate>{{ 'app.public.common.my_events' }}</a></li>
<li ui-sref-active="active" ng-hide="fablabWithoutInvoices"><a class="text-black" href="#" ui-sref="app.logged.dashboard.invoices" translate>{{ 'my_invoices' }}</a></li> <li ui-sref-active="active" ng-hide="fablabWithoutInvoices"><a class="text-black" href="#" ui-sref="app.logged.dashboard.invoices" translate>{{ 'app.public.common.my_invoices' }}</a></li>
<li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.wallet" translate>{{ 'my_wallet' }}</a></li> <li ui-sref-active="active"><a class="text-black" href="#" ui-sref="app.logged.dashboard.wallet" translate>{{ 'app.public.common.my_wallet' }}</a></li>
</ul> </ul>
</section> </section>
</div> </div>

View File

@ -2,7 +2,7 @@
<section class="heading"> <section class="heading">
<div class="row no-gutter"> <div class="row no-gutter">
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
</div> </div>
</section> </section>
@ -10,7 +10,7 @@
<div class="row no-gutter"> <div class="row no-gutter">
<div class="col-md-12 m m-t-lg"> <div class="col-md-12 m m-t-lg">
<ng-include src="'<%= asset_path 'shared/publicProfile.html' %>'"></ng-include> <ng-include src="'<%= asset_path "shared/publicProfile.html" %>'"></ng-include>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<section class="heading"> <section class="heading">
<div class="row no-gutter"> <div class="row no-gutter">
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
</div> </div>
</section> </section>
@ -10,17 +10,17 @@
<div class="row no-gutter"> <div class="row no-gutter">
<div class="row m-t-md"> <div class="row m-t-md">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm col-lg-offset-10" ui-sref="app.logged.projects_new" role="button" translate>{{ 'add_a_project' }}</a> <a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm col-lg-offset-10" ui-sref="app.logged.projects_new" role="button" translate>{{ 'app.logged.dashboard.projects.add_a_project' }}</a>
</div> </div>
<div class="wrapper" ng-if="user.all_projects.length == 0" translate>{{ 'you_dont_have_any_projects' }}</div> <div class="wrapper" ng-if="user.all_projects.length == 0" translate>{{ 'app.logged.dashboard.projects.you_dont_have_any_projects' }}</div>
<div class="widget panel b-a m m-t-lg" ng-repeat="project in user.all_projects"> <div class="widget panel b-a m m-t-lg" ng-repeat="project in user.all_projects">
<div class="panel-heading b-b clearfix"> <div class="panel-heading b-b clearfix">
<h4 class="text-u-c font-sbold pull-left">{{project.name}}</h4> <h4 class="text-u-c font-sbold pull-left">{{project.name}}</h4>
<span class="m-l-sm label label-success text-white">{{project.author_id == currentUser.id ? 'author' : 'collaborator' | translate}}</span> <span class="m-l-sm label label-success text-white">{{project.author_id == currentUser.id ? 'app.logged.dashboard.projects.author' : 'app.logged.dashboard.projects.collaborator' | translate}}</span>
<span class="badge" ng-if="project.state == 'draft'" translate>{{ 'rough_draft' }}</span> <span class="badge" ng-if="project.state == 'draft'" translate>{{ 'app.logged.dashboard.projects.rough_draft' }}</span>
<div class="pull-right"> <div class="pull-right">
<a class="btn btn-warning bg-white b-2x rounded upper text-sm text-black" ui-sref="app.public.projects_show({id:project.slug})" role="button" translate>{{ 'consult' }}</a> <a class="btn btn-warning bg-white b-2x rounded upper text-sm text-black" ui-sref="app.public.projects_show({id:project.slug})" role="button" translate>{{ 'app.shared.buttons.consult' }}</a>
</div> </div>
</div> </div>
<div class="widget-content bg-light clearfix"> <div class="widget-content bg-light clearfix">
@ -28,7 +28,7 @@
<div class="col-sm-12 col-md-4 col-lg-4"> <div class="col-sm-12 col-md-4 col-lg-4">
<div class="widget panel b-a r-n m-t-md"> <div class="widget panel b-a r-n m-t-md">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'description' }}</h3> <h3 translate>{{ 'app.logged.dashboard.projects.description' }}</h3>
</div> </div>
<div class="widget-content no-bg wrapper text-black-light"> <div class="widget-content no-bg wrapper text-black-light">
<div ng-bind-html="project.description | humanize : 180 | toTrusted"></div> <div ng-bind-html="project.description | humanize : 180 | toTrusted"></div>
@ -39,14 +39,14 @@
<div class="col-sm-12 col-md-4 col-lg-4"> <div class="col-sm-12 col-md-4 col-lg-4">
<div class="widget panel b-a r-n m-t-md"> <div class="widget panel b-a r-n m-t-md">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'machines_and_materials' }}</h3> <h3 translate>{{ 'app.logged.dashboard.projects.machines_and_materials' }}</h3>
</div> </div>
<div class="widget-content no-bg wrapper"> <div class="widget-content no-bg wrapper">
<h3 class="text-black-light font-sbold"><i class="fa fa-rocket red"></i> {{ 'machines' | translate }} :</h3> <h3 class="text-black-light font-sbold"><i class="fa fa-rocket red"></i> {{ 'app.logged.dashboard.projects.machines' | translate }} :</h3>
<ul class="list-unstyled m-l-md text-black-light"> <ul class="list-unstyled m-l-md text-black-light">
<li ng-repeat="m in project.machines">{{m.name}}</li> <li ng-repeat="m in project.machines">{{m.name}}</li>
</ul> </ul>
<h3 class="text-black-light font-sbold"><i class="fa fa-cog red"></i> {{ 'materials' | translate }} :</h3> <h3 class="text-black-light font-sbold"><i class="fa fa-cog red"></i> {{ 'app.logged.dashboard.projects.materials' | translate }} :</h3>
<ul class="list-unstyled m-l-md text-black-light"> <ul class="list-unstyled m-l-md text-black-light">
<li ng-repeat="c in project.components">{{c.name}}</li> <li ng-repeat="c in project.components">{{c.name}}</li>
</ul> </ul>
@ -57,7 +57,7 @@
<div class="col-sm-12 col-md-4 col-lg-4"> <div class="col-sm-12 col-md-4 col-lg-4">
<div class="widget panel b-a r-n m-t-md"> <div class="widget panel b-a r-n m-t-md">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'collaborators' }}</h3> <h3 translate>{{ 'app.logged.dashboard.projects.collaborators' }}</h3>
</div> </div>
<div class="widget-content list-group-lg no-bg auto wrapper"> <div class="widget-content list-group-lg no-bg auto wrapper">
<li class="list-group-item no-b clearfix" ng-repeat="collaborator in project.project_users"> <li class="list-group-item no-b clearfix" ng-repeat="collaborator in project.project_users">

View File

@ -1,6 +1,6 @@
<div> <div>
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
@ -13,11 +13,11 @@
</span> </span>
<div class="font-sbold m-t-sm">{{user.name}}</div> <div class="font-sbold m-t-sm">{{user.name}}</div>
<div>{{user.email}}</div> <div>{{user.email}}</div>
<div class="text-xs" ng-if="user.last_sign_in_at"><i>{{ 'edit_profile.last_activity_on_' | translate }} {{user.last_sign_in_at | amDateFormat: 'LL'}}</i></div> <div class="text-xs" ng-show="user.last_sign_in_at"><i>{{ 'app.logged.dashboard.settings.last_activity_on_' | translate:{DATE:(user.last_sign_in_at | amDateFormat: 'LL')} }}</i></div>
</div> </div>
<div class="widget-content no-bg b-b auto wrapper"> <div class="widget-content no-bg b-b auto wrapper">
<div class="m-b-md"> <div class="m-b-md">
<h3 class="text-u-c" translate>{{ 'edit_profile.group' }}</h3> <h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.group' }}</h3>
<div ng-show="!group.change"> <div ng-show="!group.change">
<uib-alert type="warning"> <uib-alert type="warning">
<span class="text-black font-sbold">{{getUserGroup().name}}</span> <span class="text-black font-sbold">{{getUserGroup().name}}</span>
@ -26,7 +26,7 @@
ng-click="group.change = !group.change" ng-click="group.change = !group.change"
ng-hide="user.subscribed_plan.name || user.role === 'admin'" ng-hide="user.subscribed_plan.name || user.role === 'admin'"
translate> translate>
{{ 'edit_profile.i_want_to_change_group' }} {{ 'app.logged.dashboard.settings.i_want_to_change_group' }}
</button> </button>
</div> </div>
<div ng-show="group.change"> <div ng-show="group.change">
@ -35,57 +35,57 @@
</div> </div>
</div> </div>
<div ng-hide="fablabWithoutPlans"> <div ng-hide="fablabWithoutPlans">
<h3 class="text-u-c" translate>{{ 'edit_profile.subscription' }}</h3> <h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.subscription' }}</h3>
<div ng-show="user.subscribed_plan"> <div ng-show="user.subscribed_plan">
<uib-alert type="warning"> <uib-alert type="warning">
<span class="text-black font-sbold">{{ user.subscribed_plan | humanReadablePlanName }}</span> <span class="text-black font-sbold">{{ user.subscribed_plan | humanReadablePlanName }}</span>
<div class="font-sbold" ng-if="user.subscription">{{ 'edit_profile.your_subscription_expires_on_' | translate }} {{user.subscription.expired_at | amDateFormat: 'LL'}}</div> <div class="font-sbold" ng-if="user.subscription">{{ 'app.logged.dashboard.settings.your_subscription_expires_on_' | translate }} {{user.subscription.expired_at | amDateFormat: 'LL'}}</div>
</uib-alert> </uib-alert>
</div> </div>
<div ng-show="!user.subscribed_plan.name">{{ 'edit_profile.no_subscriptions' | translate }} <br><a class="btn text-black btn-warning-full btn-sm m-t-xs" ui-sref="app.public.plans" translate>{{ 'edit_profile.i_want_to_subscribe' }}</a></div> <div ng-show="!user.subscribed_plan.name">{{ 'app.logged.dashboard.settings.no_subscriptions' | translate }} <br><a class="btn text-black btn-warning-full btn-sm m-t-xs" ui-sref="app.public.plans" translate>{{ 'app.logged.dashboard.settings.i_want_to_subscribe' }}</a></div>
</div> </div>
<div class="m-t"> <div class="m-t">
<h3 class="text-u-c" translate>{{ 'edit_profile.trainings' }}</h3> <h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.trainings' }}</h3>
<ul class="list-unstyled" ng-if="user.training_reservations.length > 0 || user.trainings.length > 0"> <ul class="list-unstyled" ng-if="user.training_reservations.length > 0 || user.trainings.length > 0">
<li ng-repeat="r in user.training_reservations | trainingReservationsFilter:'future'"> <li ng-repeat="r in user.training_reservations | trainingReservationsFilter:'future'">
{{r.reservable.name}} - {{ 'edit_profile.to_come' | translate }} {{r.reservable.name}} - {{ 'app.logged.dashboard.settings.to_come' | translate }}
</li> </li>
<li ng-repeat="t in user.trainings"> <li ng-repeat="t in user.trainings">
{{t.name}} - {{ 'edit_profile.approved' | translate }} {{t.name}} - {{ 'app.logged.dashboard.settings.approved' | translate }}
</li> </li>
</ul> </ul>
<div ng-if="user.training_reservations.length == 0 && user.trainings.length == 0" translate>{{ 'edit_profile.no_trainings' }}</div> <div ng-if="user.training_reservations.length == 0 && user.trainings.length == 0" translate>{{ 'app.logged.dashboard.settings.no_trainings' }}</div>
</div> </div>
<div class="m-t"> <div class="m-t">
<h3 class="text-u-c" translate>{{ 'edit_profile.projects' }}</h3> <h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.projects' }}</h3>
<ul class="list-unstyled" ng-if="user.all_projects.length > 0"> <ul class="list-unstyled" ng-if="user.all_projects.length > 0">
<li ng-repeat="p in user.all_projects"> <li ng-repeat="p in user.all_projects">
{{p.name}} {{p.name}}
</li> </li>
</ul> </ul>
<div ng-if="user.all_projects.length == 0" translate>{{ 'edit_profile.no_projects' }}</div> <div ng-if="user.all_projects.length == 0" translate>{{ 'app.logged.dashboard.settings.no_projects' }}</div>
</div> </div>
<div class="m-t"> <div class="m-t">
<h3 class="text-u-c" translate>{{ 'edit_profile.labels' }}</h3> <h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.labels' }}</h3>
<span ng-if="user.tags.length > 0" ng-repeat="t in user.tags"> <span ng-if="user.tags.length > 0" ng-repeat="t in user.tags">
<span class='label label-success text-white'>{{t.name}}</span> <span class='label label-success text-white'>{{t.name}}</span>
</span> </span>
<div ng-if="user.tags.length == 0" translate>{{ 'edit_profile.no_labels' }}</div> <div ng-if="user.tags.length == 0" translate>{{ 'app.logged.dashboard.settings.no_labels' }}</div>
</div> </div>
</div> </div>
<div class="widget-content no-bg b-b auto wrapper"> <div class="widget-content no-bg b-b auto wrapper">
<h3 class="text-u-c" translate>{{ 'edit_profile.cookies' }}</h3> <h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.cookies' }}</h3>
<div ng-show="cookiesStatus === 'accept'" translate>{{ 'edit_profile.cookies_accepted' }}</div> <div ng-show="cookiesStatus === 'accept'" translate>{{ 'app.logged.dashboard.settings.cookies_accepted' }}</div>
<div ng-show="cookiesStatus === 'decline'" translate>{{ 'edit_profile.cookies_declined' }}</div> <div ng-show="cookiesStatus === 'decline'" translate>{{ 'app.logged.dashboard.settings.cookies_declined' }}</div>
<div ng-hide="cookiesStatus" translate>{{ 'edit_profile.cookies_unset' }}</div> <div ng-hide="cookiesStatus" translate>{{ 'app.logged.dashboard.settings.cookies_unset' }}</div>
<button ng-click="resetCookies()" ng-show="cookiesStatus" class="btn text-black btn-warning-full btn-sm m-t-xs" translate>{{ 'edit_profile.reset_cookies' }}</button> <button ng-click="resetCookies()" ng-show="cookiesStatus" class="btn text-black btn-warning-full btn-sm m-t-xs" translate>{{ 'app.logged.dashboard.settings.reset_cookies' }}</button>
</div> </div>
<div class="widget-content no-bg text-center auto wrapper" ng-hide="isSuperAdmin"> <div class="widget-content no-bg text-center auto wrapper" ng-hide="isSuperAdmin">
<button class="btn text-white btn-danger btn-sm" ng-click="deleteUser(user)"><i class="fa fa-warning m-r-xs"></i> {{ 'edit_profile.delete_my_account' | translate }}</button> <button class="btn text-white btn-danger btn-sm" ng-click="deleteUser(user)"><i class="fa fa-warning m-r-xs"></i> {{ 'app.logged.dashboard.settings.delete_my_account' | translate }}</button>
</div> </div>
</div> </div>
@ -94,7 +94,7 @@
<div class="col-sm-12 col-md-12 col-lg-9"> <div class="col-sm-12 col-md-12 col-lg-9">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h1 class="red text-u-c" translate>{{ 'edit_profile.edit_my_profile' }}</h1> <h1 class="red text-u-c" translate>{{ 'app.logged.dashboard.settings.edit_my_profile' }}</h1>
</div> </div>
<form role="form" name="userForm" class="form-horizontal" novalidate action="{{ actionUrl }}" ng-upload="submited(content)" upload-options-enable-rails-csrf="true"> <form role="form" name="userForm" class="form-horizontal" novalidate action="{{ actionUrl }}" ng-upload="submited(content)" upload-options-enable-rails-csrf="true">
<div class="widget-content no-bg auto"> <div class="widget-content no-bg auto">
@ -108,25 +108,25 @@
<div class="panel-body row"> <div class="panel-body row">
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12"> <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<a class="btn btn-default" ng-href="{{activeProvider.link_to_sso_profile}}" target="_blank"> <a class="btn btn-default" ng-href="{{activeProvider.link_to_sso_profile}}" target="_blank">
<i class="fa fa-edit"></i> {{ 'edit_profile.change_my_data' | translate }} <i class="fa fa-edit"></i> {{ 'app.logged.dashboard.settings.change_my_data' | translate }}
</a> </a>
<p>{{ 'edit_profile.once_your_data_are_up_to_date_' | translate }} <strong translate>{{ 'edit_profile._click_on_the_synchronization_button_opposite_' }}</strong> {{ 'edit_profile.or' | translate}} <strong translate>{{ 'edit_profile._disconnect_then_reconnect_' }}</strong> {{ 'edit_profile._for_your_changes_to_take_effect' | translate }}</p> <p>{{ 'app.logged.dashboard.settings.once_your_data_are_up_to_date_' | translate }} <strong translate>{{ 'app.logged.dashboard.settings._click_on_the_synchronization_button_opposite_' }}</strong> {{ 'app.logged.dashboard.settings.or' | translate}} <strong translate>{{ 'app.logged.dashboard.settings._disconnect_then_reconnect_' }}</strong> {{ 'app.logged.dashboard.settings._for_your_changes_to_take_effect' | translate }}</p>
</div> </div>
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12"> <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<a class="btn btn-default" ng-click="syncProfile()"> <a class="btn btn-default" ng-click="syncProfile()">
<i class="fa fa-refresh"></i> {{ 'edit_profile.sync_my_profile' | translate }} <i class="fa fa-refresh"></i> {{ 'app.logged.dashboard.settings.sync_my_profile' | translate }}
</a> </a>
</div> </div>
</div> </div>
</section> </section>
<section class="panel panel-default bg-light m"> <section class="panel panel-default bg-light m">
<div class="panel-body m-r"> <div class="panel-body m-r">
<ng-include src="'<%= asset_path 'shared/_member_form.html' %>'"></ng-include> <ng-include src="'<%= asset_path "shared/_member_form.html" %>'"></ng-include>
</div> <!-- ./panel-body --> </div> <!-- ./panel-body -->
</section> </section>
</div> </div>
<div class="panel-footer no-padder"> <div class="panel-footer no-padder">
<input type="submit" value="{{ 'edit_profile.confirm_changes' | translate }}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="userForm.$invalid"/> <input type="submit" value="{{ 'app.logged.dashboard.settings.confirm_changes' | translate }}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="userForm.$invalid"/>
</div> </div>
</form> </form>
</div> </div>

View File

@ -2,7 +2,7 @@
<section class="heading"> <section class="heading">
<div class="row no-gutter"> <div class="row no-gutter">
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
</div> </div>
</section> </section>
@ -13,7 +13,7 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'your_next_trainings' | translate }}</h4> <h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'app.logged.dashboard.trainings.your_next_trainings' | translate }}</h4>
</div> </div>
<div class="widget-content bg-light wrapper r-b"> <div class="widget-content bg-light wrapper r-b">
<ul class="list-unstyled" ng-if="user.training_reservations.length > 0"> <ul class="list-unstyled" ng-if="user.training_reservations.length > 0">
@ -21,14 +21,14 @@
<span class="font-sbold">{{r.reservable.name}}</span> - <span class="label label-warning wrapper-sm">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span> <span class="font-sbold">{{r.reservable.name}}</span> - <span class="label label-warning wrapper-sm">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span>
</li> </li>
</ul> </ul>
<div ng-if="user.training_reservations.length == 0" translate>{{ 'no_trainings' }}</div> <div ng-if="user.training_reservations.length == 0" translate>{{ 'app.logged.dashboard.trainings.no_trainings' }}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'your_previous_trainings' | translate }}</h4> <h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'app.logged.dashboard.trainings.your_previous_trainings' | translate }}</h4>
</div> </div>
<div class="widget-content bg-light auto wrapper r-b"> <div class="widget-content bg-light auto wrapper r-b">
<ul class="list-unstyled" ng-if="user.training_reservations.length > 0"> <ul class="list-unstyled" ng-if="user.training_reservations.length > 0">
@ -36,14 +36,14 @@
<span class="font-sbold">{{r.reservable.name}}</span> - <span class="label label-info text-white wrapper-sm">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span> <span class="font-sbold">{{r.reservable.name}}</span> - <span class="label label-info text-white wrapper-sm">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span>
</li> </li>
</ul> </ul>
<div ng-if="user.training_reservations.length == 0" translate>{{ 'no_trainings' }}</div> <div ng-if="user.training_reservations.length == 0" translate>{{ 'app.logged.dashboard.trainings.no_trainings' }}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'your_approved_trainings' | translate }}</h4> <h4 class="text-u-c"><i class="fa fa-tag m-r-xs"></i> {{ 'app.logged.dashboard.trainings.your_approved_trainings' | translate }}</h4>
</div> </div>
<div class="widget-content bg-light auto wrapper r-b"> <div class="widget-content bg-light auto wrapper r-b">
<ul class="list-unstyled" ng-if="user.trainings.length > 0"> <ul class="list-unstyled" ng-if="user.trainings.length > 0">
@ -51,7 +51,7 @@
<span class="font-sbold">{{t.name}}</span> <span class="font-sbold">{{t.name}}</span>
</li> </li>
</ul> </ul>
<div ng-if="user.trainings.length == 0" translate>{{ 'no_trainings' }}</div> <div ng-if="user.trainings.length == 0" translate>{{ 'app.logged.dashboard.trainings.no_trainings' }}</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<section class="heading"> <section class="heading">
<div class="row no-gutter"> <div class="row no-gutter">
<ng-include src="'<%= asset_path 'dashboard/nav.html' %>'"></ng-include> <ng-include src="'<%= asset_path "dashboard/nav.html" %>'"></ng-include>
</div> </div>
</section> </section>
@ -10,11 +10,11 @@
<div class="row no-gutter"> <div class="row no-gutter">
<div class="col-md-12 m m-t-lg"> <div class="col-md-12 m m-t-lg">
<ng-include src="'<%= asset_path 'wallet/show.html' %>'"></ng-include> <ng-include src="'<%= asset_path "wallet/show.html" %>'"></ng-include>
</div> </div>
<div class="col-md-12 m m-t-lg"> <div class="col-md-12 m m-t-lg">
<ng-include src="'<%= asset_path 'wallet/transactions.html' %>'"></ng-include> <ng-include src="'<%= asset_path "wallet/transactions.html" %>'"></ng-include>
</div> </div>
</div> </div>
</div> </div>

View File

@ -7,13 +7,13 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'the_fablab_s_events' }}</h1> <h1 translate>{{ 'app.public.events_list.the_fablab_s_events' }}</h1>
</section> </section>
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin'])"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin'])">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.admin.events_new" role="button" translate>{{ 'add_an_event' }}</a> <a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.admin.events_new" role="button" translate>{{ 'app.public.events_list.add_an_event' }}</a>
</section> </section>
</div> </div>
</div> </div>
@ -23,19 +23,19 @@
<div class="row m-b-md"> <div class="row m-b-md">
<div class="col-md-3 m-b" ng-show="categories.length > 0"> <div class="col-md-3 m-b" ng-show="categories.length > 0">
<select ng-model="filters.category_id" ng-change="filterEvents()" class="form-control" ng-options="c.id as c.name for c in categories"> <select ng-model="filters.category_id" ng-change="filterEvents()" class="form-control" ng-options="c.id as c.name for c in categories">
<option value="" translate>{{ 'all_categories' }}</option> <option value="" translate>{{ 'app.public.events_list.all_categories' }}</option>
</select> </select>
</div> </div>
<div class="col-md-3 m-b" ng-show="themes.length > 0"> <div class="col-md-3 m-b" ng-show="themes.length > 0">
<select ng-model="filters.theme_id" ng-change="filterEvents()" class="form-control" ng-options="t.id as t.name for t in themes"> <select ng-model="filters.theme_id" ng-change="filterEvents()" class="form-control" ng-options="t.id as t.name for t in themes">
<option value="" translate>{{ 'all_themes' }}</option> <option value="" translate>{{ 'app.public.events_list.all_themes' }}</option>
</select> </select>
</div> </div>
<div class="col-md-3 m-b" ng-show="ageRanges.length > 0"> <div class="col-md-3 m-b" ng-show="ageRanges.length > 0">
<select ng-model="filters.age_range_id" ng-change="filterEvents()" class="form-control" ng-options="a.id as a.name for a in ageRanges"> <select ng-model="filters.age_range_id" ng-change="filterEvents()" class="form-control" ng-options="a.id as a.name for a in ageRanges">
<option value="" translate>{{ 'for_all' }}</option> <option value="" translate>{{ 'app.public.events_list.for_all' }}</option>
</select> </select>
</div> </div>
</div> </div>
@ -53,10 +53,10 @@
<h5 class="text-xs">{{event.category.name}}</h5> <h5 class="text-xs">{{event.category.name}}</h5>
<h4 class="m-n text-sm clear l-n">{{event.title}}</h4> <h4 class="m-n text-sm clear l-n">{{event.title}}</h4>
<h3 class="m-n" ng-show="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}}</h3> <h3 class="m-n" ng-show="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}}</h3>
<h3 class="m-n" ng-hide="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}} <span class="text-sm font-thin" translate> {{ 'to_date' }} </span> {{event.end_date | amDateFormat:'L'}}</h3> <h3 class="m-n" ng-hide="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}} <span class="text-sm font-thin" translate> {{ 'app.public.events_list.to_date' }} </span> {{event.end_date | amDateFormat:'L'}}</h3>
<h6 class="m-n" ng-if="!event.amount" translate>{{ 'free_admission' }}</h6> <h6 class="m-n" ng-if="!event.amount" translate>{{ 'app.public.events_list.free_admission' }}</h6>
<h6 class="m-n" ng-if="event.amount">{{ 'full_price_' | translate }} {{event.amount | currency}} <span ng-repeat="price in event.prices">/ {{ price.category.name }} {{price.amount | currency}}</span></h6> <h6 class="m-n" ng-if="event.amount">{{ 'app.public.events_list.full_price_' | translate }} {{event.amount | currency}} <span ng-repeat="price in event.prices">/ {{ price.category.name }} {{price.amount | currency}}</span></h6>
<div> <div>
<span class="text-black-light text-xs" ng-if="event.event_themes[0]"><i class="fa fa-tags" aria-hidden="true"></i> {{event.event_themes[0].name}}</span> <span class="text-black-light text-xs" ng-if="event.event_themes[0]"><i class="fa fa-tags" aria-hidden="true"></i> {{event.event_themes[0].name}}</span>
@ -64,10 +64,10 @@
</div> </div>
<div> <div>
<span class="text-black-light text-xs" ng-if="event.nb_free_places > 0">{{event.nb_free_places}} {{ 'still_available' | translate }}</span> <span class="text-black-light text-xs" ng-if="event.nb_free_places > 0">{{event.nb_free_places}} {{ 'app.public.events_list.still_available' | translate }}</span>
<span class="text-black-light text-xs" ng-if="event.nb_total_places > 0 && event.nb_free_places <= 0" translate>{{ 'sold_out' }}</span> <span class="text-black-light text-xs" ng-if="event.nb_total_places > 0 && event.nb_free_places <= 0" translate>{{ 'app.public.events_list.sold_out' }}</span>
<span class="text-black-light text-xs" ng-if="event.nb_total_places == -1" translate>{{ 'cancelled' }}</span> <span class="text-black-light text-xs" ng-if="event.nb_total_places == -1" translate>{{ 'app.public.events_list.cancelled' }}</span>
<span class="text-black-light text-xs" ng-if="!event.nb_total_places" translate>{{ 'free_entry' }}</span> <span class="text-black-light text-xs" ng-if="!event.nb_total_places" translate>{{ 'app.public.events_list.free_entry' }}</span>
</div> </div>
</div> </div>
@ -86,7 +86,7 @@
<div class="row"> <div class="row">
<div class="col-lg-12 text-center m-t-md"> <div class="col-lg-12 text-center m-t-md">
<a class="btn btn-warning" ng-click="loadMoreEvents()" ng-hide="noMoreResults" translate>{{ 'load_the_next_events' }}</a> <a class="btn btn-warning" ng-click="loadMoreEvents()" ng-hide="noMoreResults" translate>{{ 'app.public.events_list.load_the_next_events' }}</a>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@
<div class="row wrapper"> <div class="row wrapper">
<div class="col-lg-8"> <div class="col-lg-8">
<h4 class="text-sm m-t-sm" translate>{{ 'latest_documented_projects' }}</h4> <h4 class="text-sm m-t-sm" translate>{{ 'app.public.home.latest_documented_projects' }}</h4>
<uib-carousel interval="5000" disable-animation="true"> <uib-carousel interval="5000" disable-animation="true">
<uib-slide class="h480 cover r" ng-repeat="p in lastProjects" active="p.active" style="background-image:url({{p.project_image}});"> <uib-slide class="h480 cover r" ng-repeat="p in lastProjects" active="p.active" style="background-image:url({{p.project_image}});">
@ -24,14 +24,14 @@
<section class="widget panel b-a m-t-sm" ng-if="lastTweets.length > 0"> <section class="widget panel b-a m-t-sm" ng-if="lastTweets.length > 0">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<div class="pull-right text-xs align"> <div class="pull-right text-xs align">
<a href="https://twitter.com/{{ twitterName }}" ng-show="twitterName" target="_blank">{{ 'follow_us' | translate }} <a href="https://twitter.com/{{ twitterName }}" ng-show="twitterName" target="_blank">{{ 'app.public.home.follow_us' | translate }}
<span class="fa-stack fa-lg"> <span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x text-yellow"></i> <i class="fa fa-circle fa-stack-2x text-yellow"></i>
<i class="fa fa-twitter fa-stack-1x fa-inverse text-white"></i> <i class="fa fa-twitter fa-stack-1x fa-inverse text-white"></i>
</span> </span>
</a> </a>
</div> </div>
<h2 translate>{{ 'latest_tweets' }}</h2> <h2 translate>{{ 'app.public.home.latest_tweets' }}</h2>
</div> </div>
<ul class="widget-content list-group list-group-lg no-bg auto"> <ul class="widget-content list-group list-group-lg no-bg auto">
@ -44,7 +44,7 @@
<section class="widget panel b-a" > <section class="widget panel b-a" >
<div class="panel-heading small b-b"> <div class="panel-heading small b-b">
<!-- <span class="badge inverse pull-right">110</span> --> <!-- <span class="badge inverse pull-right">110</span> -->
<h2 translate>{{ 'latest_registered_members' }}</h2> <h2 translate>{{ 'app.public.home.latest_registered_members' }}</h2>
</div> </div>
<div class="row m-n"> <div class="row m-n">
@ -64,11 +64,11 @@
</div> </div>
<div class="m-t-sm m-b-sm text-center" ng-if="!isAuthenticated()"> <div class="m-t-sm m-b-sm text-center" ng-if="!isAuthenticated()">
<button href="#" ng-click="signup($event)" class="btn btn-warning-full width-70 font-sbold rounded text-sm" translate>{{ 'create_an_account' }}</button> <button href="#" ng-click="signup($event)" class="btn btn-warning-full width-70 font-sbold rounded text-sm" translate>{{ 'app.public.home.create_an_account' }}</button>
</div> </div>
<div class="m-t-sm m-b-sm text-center" ng-if="isAuthenticated()"> <div class="m-t-sm m-b-sm text-center" ng-if="isAuthenticated()">
<button href="#" ui-sref="app.logged.members" class="btn btn-warning-full width-70 font-sbold rounded text-sm" translate>{{ 'discover_members' }}</button> <button href="#" ui-sref="app.logged.members" class="btn btn-warning-full width-70 font-sbold rounded text-sm" translate>{{ 'app.public.home.discover_members' }}</button>
</div> </div>
@ -80,7 +80,7 @@
</div> </div>
<section class="home-events col-lg-12 wrapper"> <section class="home-events col-lg-12 wrapper">
<h4 class="text-sm m-t-sm">{{ 'fablab_s_next_events' | translate }} <a ui-sref="app.public.events_list" class="pull-right"><i class="fa fa-tags"></i> {{ 'every_events' | translate }}</a></h4> <h4 class="text-sm m-t-sm">{{ 'app.public.home.fablab_s_next_events' | translate }} <a ui-sref="app.public.events_list" class="pull-right"><i class="fa fa-tags"></i> {{ 'app.public.home.every_events' | translate }}</a></h4>
<div class="row" ng-repeat="event in (upcomingEvents.length/3 | array)"> <div class="row" ng-repeat="event in (upcomingEvents.length/3 | array)">
@ -106,14 +106,14 @@
<div class="row"> <div class="row">
<div class="col-sm-6 row m-b-sm"> <div class="col-sm-6 row m-b-sm">
<i class="fa fa-calendar red col-xs-3 padder-icon"></i> <i class="fa fa-calendar red col-xs-3 padder-icon"></i>
<h6 class="m-n col-xs-9 " ng-hide="isOneDayEvent(event)">{{ 'from_date_to_date' | translate:{START:(event.start_date | amDateFormat:'L'), END:(event.end_date | amDateFormat:'L')} }}</h6> <h6 class="m-n col-xs-9 " ng-hide="isOneDayEvent(event)">{{ 'app.public.home.from_date_to_date' | translate:{START:(event.start_date | amDateFormat:'L'), END:(event.end_date | amDateFormat:'L')} }}</h6>
<h6 class="m-n col-xs-9 " ng-show="isOneDayEvent(event)">{{ 'on_the_date' | translate:{DATE:(event.start_date | amDateFormat:'L')} }}</h6> <h6 class="m-n col-xs-9 " ng-show="isOneDayEvent(event)">{{ 'app.public.home.on_the_date' | translate:{DATE:(event.start_date | amDateFormat:'L')} }}</h6>
</div> </div>
<div class="col-sm-6 row m-b-sm"> <div class="col-sm-6 row m-b-sm">
<i class="fa fa-clock-o red col-xs-3 padder-icon"></i> <i class="fa fa-clock-o red col-xs-3 padder-icon"></i>
<h6 class="m-n col-xs-9"> <h6 class="m-n col-xs-9">
<span ng-if="event.all_day == 'true'" translate>{{ 'all_day' }}</span> <span ng-if="event.all_day == 'true'" translate>{{ 'app.public.home.all_day' }}</span>
<span ng-if="event.all_day == 'false'">{{ 'from_time_to_time' | translate:{START:(event.start_date | amDateFormat:'LT'), END:(event.end_date | amDateFormat:'LT')} }}</span> <span ng-if="event.all_day == 'false'">{{ 'app.public.home.from_time_to_time' | translate:{START:(event.start_date | amDateFormat:'LT'), END:(event.end_date | amDateFormat:'LT')} }}</span>
</h6> </h6>
</div> </div>
</div> </div>
@ -122,22 +122,22 @@
<div class="col-sm-6 row m-b-sm"> <div class="col-sm-6 row m-b-sm">
<i class="fa fa-user red col-xs-3 padder-icon"></i> <i class="fa fa-user red col-xs-3 padder-icon"></i>
<h6 class="m-n col-xs-9 "> <h6 class="m-n col-xs-9 ">
<span ng-if="event.nb_free_places > 0">{{ 'still_available' | translate }} {{event.nb_free_places}}</span> <span ng-if="event.nb_free_places > 0">{{ 'app.public.home.still_available' | translate }} {{event.nb_free_places}}</span>
<span ng-if="!event.nb_total_places" translate>{{ 'free_entry' }}</span> <span ng-if="!event.nb_total_places" translate>{{ 'app.public.home.free_entry' }}</span>
<span ng-if="event.nb_total_places > 0 && event.nb_free_places <= 0" translate>{{ 'event_full' }}</span> <span ng-if="event.nb_total_places > 0 && event.nb_free_places <= 0" translate>{{ 'app.public.home.event_full' }}</span>
</h6> </h6>
</div> </div>
<div class="col-sm-6 row m-b-sm"> <div class="col-sm-6 row m-b-sm">
<i class="fa fa-bookmark red col-xs-3 padder-icon"></i> <i class="fa fa-bookmark red col-xs-3 padder-icon"></i>
<h6 class="m-n col-xs-9"> <h6 class="m-n col-xs-9">
<span ng-if="event.amount == 0" translate>{{ 'free_admission' }}</span> <span ng-if="event.amount == 0" translate>{{ 'app.public.home.free_admission' }}</span>
<span ng-if="event.amount > 0">{{ 'full_price' | translate }} {{event.amount | currency}}</span> <span ng-if="event.amount > 0">{{ 'app.public.home.full_price' | translate }} {{event.amount | currency}}</span>
</h6> </h6>
</div> </div>
</div> </div>
<div class="text-center clearfix "> <div class="text-center clearfix ">
<div class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm m-b-sm upper text-sm width-70" ui-sref="app.public.events_show({id: event.id})" ><span translate>{{ 'consult' }}</span></div> <div class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm m-b-sm upper text-sm width-70" ui-sref="app.public.events_show({id: event.id})" ><span translate>{{ 'app.shared.buttons.consult' }}</span></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -7,13 +7,13 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'machines_list.the_fablab_s_machines' }}</h1> <h1 translate>{{ 'app.public.machines_list.the_fablab_s_machines' }}</h1>
</section> </section>
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized('admin')"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized('admin')">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ui-sref="app.admin.machines_new" role="button" translate>{{ 'machines_list.add_a_machine' }}</a> <a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ui-sref="app.admin.machines_new" role="button" translate>{{ 'app.public.machines_list.add_a_machine' }}</a>
</section> </section>
</div> </div>
</div> </div>
@ -26,7 +26,7 @@
<div class="input-group col-md-3 m-l-lg m-b"> <div class="input-group col-md-3 m-l-lg m-b">
<span class="input-group-addon"><i class="fa fa-filter"></i></span> <span class="input-group-addon"><i class="fa fa-filter"></i></span>
<select ng-model="machineFiltering" class="form-control"> <select ng-model="machineFiltering" class="form-control">
<option ng-repeat="status in filterDisabled" value="{{status}}" translate>{{ 'machines_list.status_'+status }}</option> <option ng-repeat="status in filterDisabled" value="{{status}}" translate>{{ 'app.public.machines_list.status_'+status }}</option>
</select> </select>
</div> </div>
</div> </div>
@ -48,13 +48,13 @@
<div class="col-sm-6 b-r no-padder"> <div class="col-sm-6 b-r no-padder">
<div class="btn btn-default btn-block no-b padder-v red" ng-click="reserveMachine(machine, $event)" ng-hide="machine.disabled"> <div class="btn btn-default btn-block no-b padder-v red" ng-click="reserveMachine(machine, $event)" ng-hide="machine.disabled">
<i class="fa fa-bookmark m-r-xs"></i> <i class="fa fa-bookmark m-r-xs"></i>
<span class="hidden-sm" translate>{{ 'machines_list.book' }}</span> <span class="hidden-sm" translate>{{ 'app.public.machines_list.book' }}</span>
</div> </div>
</div> </div>
<div class="no-padder" ng-class="{'col-sm-6': !machine.disabled}"> <div class="no-padder" ng-class="{'col-sm-6': !machine.disabled}">
<div class="btn btn-default btn-block padder-v no-b red" ng-click="showMachine(machine)"> <div class="btn btn-default btn-block padder-v no-b red" ng-click="showMachine(machine)">
<i class="fa fa-eye m-r-xs"></i> <i class="fa fa-eye m-r-xs"></i>
<span class="hidden-sm" translate>{{ 'consult' }}</span> <span class="hidden-sm" translate>{{ 'app.shared.buttons.consult' }}</span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -19,9 +19,9 @@
class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"
ng-if="!isAuthorized('admin')" ng-if="!isAuthorized('admin')"
ng-hide="machine.disabled" ng-hide="machine.disabled"
translate>{{ 'book_this_machine' }}</a> translate>{{ 'app.public.machines_show.book_this_machine' }}</a>
<a ui-sref="app.admin.machines_edit({id: machine.id})" ng-if="isAuthorized('admin')" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"><i class="fa fa-edit"></i> {{ 'edit' | translate }}</a> <a ui-sref="app.admin.machines_edit({id: machine.id})" ng-if="isAuthorized('admin')" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"><i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}</a>
<a ng-click="delete(machine)" ng-if="isAuthorized('admin')" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a> <a ng-click="delete(machine)" ng-if="isAuthorized('admin')" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a>
</section> </section>
@ -48,7 +48,7 @@
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'technical_specifications' }}</h3> <h3 translate>{{ 'app.public.machines_show.technical_specifications' }}</h3>
</div> </div>
<div class="widget-content no-bg wrapper"> <div class="widget-content no-bg wrapper">
<h3></h3> <h3></h3>
@ -59,7 +59,7 @@
<section class="widget panel b-a m" ng-if="machine.machine_files_attributes"> <section class="widget panel b-a m" ng-if="machine.machine_files_attributes">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<span class="badge bg-warning pull-right">{{machine.machine_files_attributes.length}}</span> <span class="badge bg-warning pull-right">{{machine.machine_files_attributes.length}}</span>
<h3 translate>{{ 'files_to_download' }}</h3> <h3 translate>{{ 'app.public.machines_show.files_to_download' }}</h3>
</div> </div>
<ul class="widget-content list-group list-group-lg no-bg auto"> <ul class="widget-content list-group list-group-lg no-bg auto">
@ -71,7 +71,7 @@
<section class="widget panel b-a m" ng-if="machine.machine_projects"> <section class="widget panel b-a m" ng-if="machine.machine_projects">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h3 translate>{{ 'projects_using_the_machine' }}</h3> <h3 translate>{{ 'app.public.machines_show.projects_using_the_machine' }}</h3>
</div> </div>
<ul class="widget-content list-group list-group-lg no-bg auto"> <ul class="widget-content list-group list-group-lg no-bg auto">

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l"> <div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'the_fablab_members' }}</h1> <h1 translate>{{ 'app.logged.members.the_fablab_members' }}</h1>
</section> </section>
</div> </div>
@ -21,10 +21,10 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th style="width:15%" translate>{{ 'avatar' }}</th> <th style="width:15%" translate>{{ 'app.logged.members.avatar' }}</th>
<th style="width:15%" translate>{{ 'user' }}</th> <th style="width:15%" translate>{{ 'app.logged.members.user' }}</th>
<th style="width:15%" translate>{{ 'pseudonym' }}</th> <th style="width:15%" translate>{{ 'app.logged.members.pseudonym' }}</th>
<th style="width:15%" translate>{{ 'email_address' }}</th> <th style="width:15%" translate>{{ 'app.logged.members.email_address' }}</th>
<th style="width:10%"></th> <th style="width:10%"></th>
</tr> </tr>
</thead> </thead>
@ -41,7 +41,7 @@
<td> <td>
<div class="buttons"> <div class="buttons">
<button class="btn btn-default" ui-sref="app.logged.members_show({id: member.slug})"> <button class="btn btn-default" ui-sref="app.logged.members_show({id: member.slug})">
<i class="fa fa-eye"></i> {{ 'consult' | translate }} <i class="fa fa-eye"></i> {{ 'app.shared.buttons.consult' | translate }}
</button> </button>
</div> </div>
</td> </td>
@ -49,9 +49,9 @@
</tbody> </tbody>
</table> </table>
<div class="text-center"> <div class="text-center">
<button class="btn btn-warning" ng-click="showNextMembers()" ng-hide="noMoreResults"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'display_more_members' | translate }}</button> <button class="btn btn-warning" ng-click="showNextMembers()" ng-hide="noMoreResults"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.logged.members.display_more_members' | translate }}</button>
</div> </div>
<p ng-if="members.length == 0" translate>{{ 'no_members_for_now' }}</p> <p ng-if="members.length == 0" translate>{{ 'app.logged.members.no_members_for_now' }}</p>
</div> </div>
</div> </div>
</section> </section>

View File

@ -15,11 +15,11 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a ui-sref="app.logged.members" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" translate>{{ 'members_list' }}</a> <a ui-sref="app.logged.members" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" translate>{{ 'app.logged.members_show.members_list' }}</a>
</section> </section>
</div> </div>
</div> </div>
</section> </section>
<ng-include src="'<%= asset_path 'shared/publicProfile.html' %>'"></ng-include> <ng-include src="'<%= asset_path "shared/publicProfile.html" %>'"></ng-include>
</div> </div>

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l"> <div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'notifications_center' }}</h1> <h1 translate>{{ 'app.logged.notifications.notifications_center' }}</h1>
</section> </section>
</div> </div>
@ -19,14 +19,14 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<button type="button" class="btn btn-warning m-t-sm m-b" ng-click="markAllAsRead()" ng-disabled="totalUnread == 0">{{ 'mark_all_as_read' | translate }} ({{totalUnread}})</button> <button type="button" class="btn btn-warning m-t-sm m-b" ng-click="markAllAsRead()" ng-disabled="totalUnread == 0">{{ 'app.logged.notifications.mark_all_as_read' | translate }} ({{totalUnread}})</button>
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th style="width:10%"></th> <th style="width:10%"></th>
<th style="width:20%" translate>{{ 'date' }}</th> <th style="width:20%" translate>{{ 'app.logged.notifications.date' }}</th>
<th style="width:70%" translate>{{ 'notif_title' }}</th> <th style="width:70%" translate>{{ 'app.logged.notifications.notif_title' }}</th>
</tr> </tr>
</thead> </thead>
@ -42,13 +42,13 @@
</tr> </tr>
<tr ng-if="notificationsUnread.length == 0"> <tr ng-if="notificationsUnread.length == 0">
<td colspan="3" translate>{{ 'no_new_notifications' }}</td> <td colspan="3" translate>{{ 'app.logged.notifications.no_new_notifications' }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div ng-hide="notificationsRead.length == 0 && notificationsUnread.length < total"> <div ng-hide="notificationsRead.length == 0 && notificationsUnread.length < total">
<h5 translate>{{ 'archives' }}</h5> <h5 translate>{{ 'app.logged.notifications.archives' }}</h5>
<table class="table"> <table class="table">
<thead> <thead>
@ -73,7 +73,7 @@
<tr ng-if="notificationsRead.length == 0"> <tr ng-if="notificationsRead.length == 0">
<td colspan="3" translate>{{ 'no_archived_notifications' }}</td> <td colspan="3" translate>{{ 'app.logged.notifications.no_archived_notifications' }}</td>
</tr> </tr>
@ -81,7 +81,7 @@
</table> </table>
</div> </div>
<a class="btn btn-default" ng-click="addMoreNotifications()" ng-if="paginateActive" translate>{{ 'load_the_next_notifications' }}</a> <a class="btn btn-default" ng-click="addMoreNotifications()" ng-if="paginateActive" translate>{{ 'app.logged.notifications.load_the_next_notifications' }}</a>
</div> </div>

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l "> <div class="col-xs-10 col-sm-10 col-md-8 b-l ">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'subcriptions' }}</h1> <h1 translate>{{ 'app.public.plans.subcriptions' }}</h1>
</section> </section>
</div> </div>
</div> </div>
@ -44,24 +44,24 @@
<div class="cta-button" ng-if="!currentUser || currentUser.role == 'member'"> <div class="cta-button" ng-if="!currentUser || currentUser.role == 'member'">
<button class="btn btn-default rounded" ng-click="selectPlan(plan)" ng-if="currentUser.subscribed_plan.id != plan.id" ng-disabled="currentUser.subscribed_plan" ng-class="{ 'bg-yellow': selectedPlan==plan }"> <button class="btn btn-default rounded" ng-click="selectPlan(plan)" ng-if="currentUser.subscribed_plan.id != plan.id" ng-disabled="currentUser.subscribed_plan" ng-class="{ 'bg-yellow': selectedPlan==plan }">
<span ng-if="currentUser" translate>{{ 'i_choose_that_plan' }}</span> <span ng-if="currentUser" translate>{{ 'app.public.plans.i_choose_that_plan' }}</span>
<span ng-if="!currentUser" translate>{{ 'i_subscribe_online' }}</span> <span ng-if="!currentUser" translate>{{ 'app.public.plans.i_subscribe_online' }}</span>
</button> </button>
<button class="btn btn-warning bg-yellow rounded" ng-if="currentUser.subscribed_plan.id == plan.id" ng-disabled="currentUser.subscribed_plan.id == plan.id" translate>{{ 'i_already_subscribed' }}</button> <button class="btn btn-warning bg-yellow rounded" ng-if="currentUser.subscribed_plan.id == plan.id" ng-disabled="currentUser.subscribed_plan.id == plan.id" translate>{{ 'app.public.plans.i_already_subscribed' }}</button>
</div> </div>
<div class="cta-button" ng-if="currentUser.role == 'admin'"> <div class="cta-button" ng-if="currentUser.role == 'admin'">
<button class="btn btn-default rounded" ng-click="selectPlan(plan)" ng-class="{ 'bg-yellow': selectedPlan==plan }" ng-disabled="!ctrl.member"> <button class="btn btn-default rounded" ng-click="selectPlan(plan)" ng-class="{ 'bg-yellow': selectedPlan==plan }" ng-disabled="!ctrl.member">
<span translate>{{ 'i_choose_that_plan' }}</span> <span translate>{{ 'app.public.plans.i_choose_that_plan' }}</span>
</button> </button>
</div> </div>
<br ng-show="!plan.plan_file_url"> <!-- TODO Refacto with CSS --> <br ng-show="!plan.plan_file_url"> <!-- TODO Refacto with CSS -->
<a ng-href="{{ plan.plan_file_url }}" ng-show="plan.plan_file_url" target="_blank" translate>{{ 'more_information' }}</a> <a ng-href="{{ plan.plan_file_url }}" ng-show="plan.plan_file_url" target="_blank" translate>{{ 'app.public.plans.more_information' }}</a>
</div> </div>
</div> </div>
@ -69,7 +69,7 @@
<div class="col-xs-12 col-md-12 col-lg-10 col-centered no-gutter" ng-if="currentUser.subscription && isInPast(currentUser.subscription.expired_at)"> <div class="col-xs-12 col-md-12 col-lg-10 col-centered no-gutter" ng-if="currentUser.subscription && isInPast(currentUser.subscription.expired_at)">
<uib-alert type="info"> <uib-alert type="info">
{{ 'your_subscription_expires_on_the_DATE' | translate:{DATE:(currentUser.subscription.expired_at | amDateFormat:'L' )} }} {{ 'app.public.plans.your_subscription_expires_on_the_DATE' | translate:{DATE:(currentUser.subscription.expired_at | amDateFormat:'L' )} }}
</uib-alert> </uib-alert>
</div> </div>
@ -87,8 +87,8 @@
<section class="widget panel b-a m m-t-lg" ng-show="ctrl.member"> <section class="widget panel b-a m m-t-lg" ng-show="ctrl.member">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h3 ng-show="currentUser.role != 'admin'" translate>{{ 'my_group' }}</h3> <h3 ng-show="currentUser.role != 'admin'" translate>{{ 'app.public.plans.my_group' }}</h3>
<h3 ng-show="currentUser.role === 'admin'" translate translate-values="{GENDER:getGender(currentUser)}">{{ 'his_group' }}</h3> <h3 ng-show="currentUser.role === 'admin'" translate translate-values="{GENDER:getGender(currentUser)}">{{ 'app.public.plans.his_group' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper"> <div class="widget-content no-bg auto wrapper">
<div ng-show="!group.change"> <div ng-show="!group.change">
@ -99,70 +99,70 @@
ng-click="group.change = !group.change" ng-click="group.change = !group.change"
ng-show="(!selectedPlan && ctrl.member && !ctrl.member.subscribed_plan && ctrl.member.subscription) || (!paid.plan)" ng-show="(!selectedPlan && ctrl.member && !ctrl.member.subscribed_plan && ctrl.member.subscription) || (!paid.plan)"
translate translate
translate-values="{ROLE:currentUser.role}">{{ 'he_wants_to_change_group' }}</button> translate-values="{ROLE:currentUser.role}">{{ 'app.public.plans.he_wants_to_change_group' }}</button>
</div> </div>
<div ng-show="group.change"> <div ng-show="group.change">
<select class="form-control" ng-options="g.id as g.name for g in groups" ng-model="group.id"></select> <select class="form-control" ng-options="g.id as g.name for g in groups" ng-model="group.id"></select>
<button class="btn btn-success m-t" <button class="btn btn-success m-t"
ng-click="selectGroup()" ng-click="selectGroup()"
translate translate
translate-values="{ROLE:currentUser.role, GENDER:getGender(currentUser)}">{{ 'change_my_group' }}</button> translate-values="{ROLE:currentUser.role, GENDER:getGender(currentUser)}">{{ 'app.public.plans.change_my_group' }}</button>
</div> </div>
</div> </div>
</section> </section>
<section class="widget panel b-a m m-t-lg" ng-if="!selectedPlan && ctrl.member && !ctrl.member.subscribed_plan && ctrl.member.subscription"> <section class="widget panel b-a m m-t-lg" ng-if="!selectedPlan && ctrl.member && !ctrl.member.subscribed_plan && ctrl.member.subscription">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h3 translate>{{ 'summary' }}</h3> <h3 translate>{{ 'app.public.plans.summary' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper"> <div class="widget-content no-bg auto wrapper">
<strong>{{ 'your_subscription_has_expired_on_the_DATE' | translate:{DATE:(ctrl.member.subscription.expired_at | amDateFormat:'LL')} }}</strong> <strong>{{ 'app.public.plans.your_subscription_has_expired_on_the_DATE' | translate:{DATE:(ctrl.member.subscription.expired_at | amDateFormat:'LL')} }}</strong>
<div class="well well-warning m-t-sm"> <div class="well well-warning m-t-sm">
<i class="font-sbold">{{ctrl.member.subscription.plan | humanReadablePlanName }}</i> <i class="font-sbold">{{ctrl.member.subscription.plan | humanReadablePlanName }}</i>
<div class="font-sbold">{{ 'subscription_price' | translate }} {{ctrl.member.subscription.plan.amount | currency}}</div> <div class="font-sbold">{{ 'app.public.plans.subscription_price' | translate }} {{ctrl.member.subscription.plan.amount | currency}}</div>
</div> </div>
</div> </div>
</section> </section>
<section class="widget panel b-a m m-t-lg" ng-if="selectedPlan && ctrl.member"> <section class="widget panel b-a m m-t-lg" ng-if="selectedPlan && ctrl.member">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h3 translate>{{ 'summary' }}</h3> <h3 translate>{{ 'app.public.plans.summary' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper"> <div class="widget-content no-bg auto wrapper">
{{ 'you_ve_just_selected_a_' | translate }} <strong translate>{{ '_subscription' }}</strong> : <span translate>{{ 'app.public.plans.you_ve_just_selected_a_subscription_html' }}</span>
<div class="well well-warning m-t-sm"> <div class="well well-warning m-t-sm">
<i class="font-sbold">{{ selectedPlan | humanReadablePlanName }}</i> <i class="font-sbold">{{ selectedPlan | humanReadablePlanName }}</i>
<div class="font-sbold">{{ 'subscription_price' | translate }} {{selectedPlan.amount | currency}}</div> <div class="font-sbold">{{ 'app.public.plans.subscription_price' | translate }} {{selectedPlan.amount | currency}}</div>
</div> </div>
<coupon show="!ctrl.member.subscribed_plan" coupon="coupon.applied" total="selectedPlan.amount" user-id="{{ctrl.member.id}}"></coupon> <coupon show="!ctrl.member.subscribed_plan" coupon="coupon.applied" total="selectedPlan.amount" user-id="{{ctrl.member.id}}"></coupon>
</div> </div>
<div class="widget-footer"> <div class="widget-footer">
<button class="btn btn-valid btn-info btn-block p-l text-u-c r-b" ng-click="openSubscribePlanModal()" ng-if="!ctrl.member.subscribed_plan">{{ 'confirm_and_pay' | translate }} {{cart.total | currency}}</button> <button class="btn btn-valid btn-info btn-block p-l text-u-c r-b" ng-click="openSubscribePlanModal()" ng-if="!ctrl.member.subscribed_plan">{{ 'app.public.plans.confirm_and_pay' | translate }} {{cart.total | currency}}</button>
</div> </div>
</section> </section>
<section class="widget panel b-a m m-t-lg" ng-if="paid.plan"> <section class="widget panel b-a m m-t-lg" ng-if="paid.plan">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h3 translate>{{ 'summary' }}</h3> <h3 translate>{{ 'app.public.plans.summary' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper"> <div class="widget-content no-bg auto wrapper">
{{ 'you_ve_just_payed_the_' | translate }} <strong translate>{{ '_subscription' }}</strong> : <span translate>{{ 'app.public.plans.you_ve_just_payed_the_subscription_html' }}</span>
<div class="well well-warning m-t-sm"> <div class="well well-warning m-t-sm">
<i class="font-sbold">{{ paid.plan | humanReadablePlanName }}</i> <i class="font-sbold">{{ paid.plan | humanReadablePlanName }}</i>
<div class="font-sbold">{{ 'subscription_price' | translate }} {{paid.plan.amount | currency}}</div> <div class="font-sbold">{{ 'app.public.plans.subscription_price' | translate }} {{paid.plan.amount | currency}}</div>
</div> </div>
<div class="alert alert-success">{{ 'thank_you_your_subscription_is_successful' | translate }}<br> <div class="alert alert-success">{{ 'app.public.plans.thank_you_your_subscription_is_successful' | translate }}<br>
{{ 'your_invoice_will_be_available_soon_from_your_' | translate }} <a ui-sref="app.logged.dashboard.invoices" translate>{{ 'dashboard' }}</a></div> <a ui-sref="app.logged.dashboard.invoices" translate>{{ 'app.public.plans.your_invoice_will_be_available_soon_from_your_dashboard' }}</a></div>
</div> </div>
</section> </section>

View File

@ -1,15 +1,15 @@
<div class="modal-header"> <div class="modal-header">
<img ng-src="{{logoBlack.custom_asset_file_attributes.attachment_url}}" alt="{{logo.custom_asset_file_attributes.attachment}}" class="modal-logo"/> <img ng-src="{{logoBlack.custom_asset_file_attributes.attachment_url}}" alt="{{logo.custom_asset_file_attributes.attachment}}" class="modal-logo"/>
<h1 translate>{{ 'subscription_confirmation' }}</h1> <h1 translate>{{ 'app.public.plans.subscription_confirmation' }}</h1>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<uib-alert ng-repeat="alert in alerts" type="{{alert.type}}" close="closeAlert($index)">{{alert.msg}}</uib-alert> <uib-alert ng-repeat="alert in alerts" type="{{alert.type}}" close="closeAlert($index)">{{alert.msg}}</uib-alert>
<ng-include src="'<%= asset_path 'shared/_wallet_amount_info.html' %>'"></ng-include> <ng-include src="'<%= asset_path "shared/_wallet_amount_info.html" %>'"></ng-include>
<p>{{ 'here_is_the_NAME_subscription_summary' | translate:{NAME:member.name} }}</p> <p>{{ 'app.public.plans.here_is_the_NAME_subscription_summary' | translate:{NAME:member.name} }}</p>
<p>{{ plan | humanReadablePlanName }}</p> <p>{{ plan | humanReadablePlanName }}</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-info" ng-click="ok()" ng-disabled="attempting" ng-bind-html="validButtonName"></button> <button class="btn btn-info" ng-click="ok()" ng-disabled="attempting" ng-bind-html="validButtonName"></button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button> <button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div> </div>

View File

@ -7,13 +7,13 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'projects_list.the_fablab_projects' }}</h1> <h1 translate>{{ 'app.public.projects_list.the_fablab_projects' }}</h1>
</section> </section>
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin','member'])"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin','member'])">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.logged.projects_new" role="button" translate>{{ 'projects_list.add_a_project' }}</a> <a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.logged.projects_new" role="button" translate>{{ 'app.public.projects_list.add_a_project' }}</a>
</section> </section>
</div> </div>
</div> </div>
@ -23,16 +23,16 @@
<section class="m-lg"> <section class="m-lg">
<div class="row m-b-md"> <div class="row m-b-md">
<div class="col-md-12 m-b"> <div class="col-md-12 m-b">
<a href="javascript:void(0);" class="text-sm pull-right" name="button" ng-click="resetFiltersAndTriggerSearch()" ng-show="!openlab.searchOverWholeNetwork"><i class="fa fa-refresh"></i> {{ 'projects_list.reset_all_filters' | translate }}</a> <a href="javascript:void(0);" class="text-sm pull-right" name="button" ng-click="resetFiltersAndTriggerSearch()" ng-show="!openlab.searchOverWholeNetwork"><i class="fa fa-refresh"></i> {{ 'app.public.projects_list.reset_all_filters' | translate }}</a>
<span ng-if="openlab.projectsActive" uib-tooltip="{{ 'projects_list.tooltip_openlab_projects_switch' | translate }}" tooltip-trigger="mouseenter"> <span ng-if="openlab.projectsActive" uib-tooltip="{{ 'app.public.projects_list.tooltip_openlab_projects_switch' | translate }}" tooltip-trigger="mouseenter">
<label for="searchOverWholeNetwork" class="control-label m-r text-sm" translate>{{ 'projects_list.search_over_the_whole_network' }}</label> <label for="searchOverWholeNetwork" class="control-label m-r text-sm" translate>{{ 'app.public.projects_list.search_over_the_whole_network' }}</label>
<input bs-switch <input bs-switch
ng-model="openlab.searchOverWholeNetwork" ng-model="openlab.searchOverWholeNetwork"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'yes' | translate }}" switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'no' | translate }}" switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true" switch-animate="true"
ng-change="searchOverWholeNetworkChanged()" ng-change="searchOverWholeNetworkChanged()"
/> />
@ -44,7 +44,7 @@
<div class="input-group-addon"><i class="fa fa-search"></i></div> <div class="input-group-addon"><i class="fa fa-search"></i></div>
<input type="search" class="form-control" placeholder="Mots-clés" ng-model="search.q"/> <input type="search" class="form-control" placeholder="Mots-clés" ng-model="search.q"/>
<div class="input-group-btn"> <div class="input-group-btn">
<button type="submit" class="btn btn-warning" translate>{{ 'projects_list.search' }}</button> <button type="submit" class="btn btn-warning" translate>{{ 'app.public.projects_list.search' }}</button>
</div> </div>
</div> </div>
</div> </div>
@ -53,27 +53,27 @@
<span ng-if="!openlab.searchOverWholeNetwork"> <span ng-if="!openlab.searchOverWholeNetwork">
<div class="col-md-3 m-b" ng-show="isAuthenticated()"> <div class="col-md-3 m-b" ng-show="isAuthenticated()">
<select ng-model="search.from" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control"> <select ng-model="search.from" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control">
<option value="" translate>{{ 'projects_list.all_projects' }}</option> <option value="" translate>{{ 'app.public.projects_list.all_projects' }}</option>
<option value="mine" translate>{{ 'projects_list.my_projects' }}</option> <option value="mine" translate>{{ 'app.public.projects_list.my_projects' }}</option>
<option value="collaboration" translate>{{ 'projects_list.projects_to_whom_i_take_part_in' }}</option> <option value="collaboration" translate>{{ 'app.public.projects_list.projects_to_whom_i_take_part_in' }}</option>
</select> </select>
</div> </div>
<div class="col-md-3 m-b"> <div class="col-md-3 m-b">
<select ng-model="search.machine_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="m.id as m.name for m in machines"> <select ng-model="search.machine_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="m.id as m.name for m in machines">
<option value="" translate>{{ 'projects_list.all_machines' }}</option> <option value="" translate>{{ 'app.public.projects_list.all_machines' }}</option>
</select> </select>
</div> </div>
<div class="col-md-3 m-b"> <div class="col-md-3 m-b">
<select ng-model="search.theme_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="t.id as t.name for t in themes"> <select ng-model="search.theme_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="t.id as t.name for t in themes">
<option value="" translate>{{ 'projects_list.all_themes' }}</option> <option value="" translate>{{ 'app.public.projects_list.all_themes' }}</option>
</select> </select>
</div> </div>
<div class="col-md-3 m-b"> <div class="col-md-3 m-b">
<select ng-model="search.component_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="t.id as t.name for t in components"> <select ng-model="search.component_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="t.id as t.name for t in components">
<option value="" translate>{{ 'projects_list.all_materials' }}</option> <option value="" translate>{{ 'app.public.projects_list.all_materials' }}</option>
</select> </select>
</div> </div>
</span> </span>
@ -81,7 +81,7 @@
<div class="row"> <div class="row">
<span class="col-md-12" ng-show="projects && (projects.length == 0)"> {{ 'projects_list.project_search_result_is_empty' | translate }} </span> <span class="col-md-12" ng-show="projects && (projects.length == 0)"> {{ 'app.public.projects_list.project_search_result_is_empty' | translate }} </span>
<div class="col-xs-12 col-sm-6 col-md-3" ng-repeat="project in projects" ng-click="showProject(project)"> <div class="col-xs-12 col-sm-6 col-md-3" ng-repeat="project in projects" ng-click="showProject(project)">
<div class="card card-project"> <div class="card card-project">
@ -99,7 +99,7 @@
</div> </div>
<div class="text-center"> <div class="text-center">
<span class="badge" ng-if="project.state == 'draft'" translate>{{ 'projects_list.rough_draft' }}</span> <span class="badge" ng-if="project.state == 'draft'" translate>{{ 'app.public.projects_list.rough_draft' }}</span>
</div> </div>
<div class="card-overlay"> <div class="card-overlay">
@ -119,7 +119,7 @@
<div class="row"> <div class="row">
<div class="col-lg-12 text-center"> <div class="col-lg-12 text-center">
<a class="btn btn-warning" ng-click="loadMore()" ng-if="projectsPagination.hasNextPage()" translate>{{ 'projects_list.load_next_projects' }}</a> <a class="btn btn-warning" ng-click="loadMore()" ng-if="projectsPagination.hasNextPage()" translate>{{ 'app.public.projects_list.load_next_projects' }}</a>
</div> </div>
</div> </div>
</section> </section>

View File

@ -21,8 +21,8 @@
<span class="btn btn-default btn-file" <span class="btn btn-default btn-file"
ng-click="user.profile.user_avatar._destory = false" ng-click="user.profile.user_avatar._destory = false"
ng-hide="preventField['profile.avatar'] && user.profile.user_avatar.attachment_url && !userForm['user[profile_attributes][user_avatar_attributes]'].$dirty"> ng-hide="preventField['profile.avatar'] && user.profile.user_avatar.attachment_url && !userForm['user[profile_attributes][user_avatar_attributes]'].$dirty">
<span class="fileinput-new" translate>{{ 'add_an_avatar' }}</span> <span class="fileinput-new" translate>{{ 'app.shared.user.add_an_avatar' }}</span>
<span class="fileinput-exists" translate>{{ 'change' }}</span> <span class="fileinput-exists" translate>{{ 'app.shared.buttons.change' }}</span>
<input type="file" name="user[profile_attributes][user_avatar_attributes][attachment]"> <input type="file" name="user[profile_attributes][user_avatar_attributes][attachment]">
</span> </span>
@ -47,7 +47,7 @@
value="true" value="true"
ng-disabled="preventField['profile.gender'] && user.statistic_profile.gender && !userForm['user[statistic_profile_attributes][gender]'].$dirty" ng-disabled="preventField['profile.gender'] && user.statistic_profile.gender && !userForm['user[statistic_profile_attributes][gender]'].$dirty"
required/> required/>
<i class="fa fa-male m-l-sm"></i> {{ 'man' | translate }} <i class="fa fa-male m-l-sm"></i> {{ 'app.shared.user.man' | translate }}
</label> </label>
<label class="checkbox-inline btn btn-default"> <label class="checkbox-inline btn btn-default">
<input type="radio" <input type="radio"
@ -55,81 +55,81 @@
ng-model="user.statistic_profile.gender" ng-model="user.statistic_profile.gender"
value="false" value="false"
ng-disabled="preventField['profile.gender'] && user.statistic_profile.gender && !userForm['user[statistic_profile_attributes][gender]'].$dirty"/> ng-disabled="preventField['profile.gender'] && user.statistic_profile.gender && !userForm['user[statistic_profile_attributes][gender]'].$dirty"/>
<i class="fa fa-female m-l-sm"></i> {{ 'woman' | translate }} <i class="fa fa-female m-l-sm"></i> {{ 'app.shared.user.woman' | translate }}
</label> </label>
<span class="exponent m-l-xs help-cursor" title="{{ 'used_for_statistics' | translate }}"><i class="fa fa-asterisk" aria-hidden="true"></i></span> <span class="exponent m-l-xs help-cursor" title="{{ 'app.shared.user.used_for_statistics' | translate }}"><i class="fa fa-asterisk" aria-hidden="true"></i></span>
<span class="help-block" ng-show="userForm['user[statistic_profile_attributes][gender]'].$dirty && userForm['user[statistic_profile_attributes][gender]'].$error.required" translate>{{ 'gender_is_required' }}</span> <span class="help-block" ng-show="userForm['user[statistic_profile_attributes][gender]'].$dirty && userForm['user[statistic_profile_attributes][gender]'].$error.required" translate>{{ 'app.shared.user.gender_is_required' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[username]'].$dirty && userForm['user[username]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[username]'].$dirty && userForm['user[username]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-user"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-user"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span>
</span> </span>
<input type="text" <input type="text"
name="user[username]" name="user[username]"
ng-model="user.username" ng-model="user.username"
class="form-control" class="form-control"
id="user_username" id="user_username"
placeholder="{{ 'pseudonym' | translate }}" placeholder="{{ 'app.shared.user.pseudonym' | translate }}"
ng-disabled="preventField['user.username'] && user.username && !userForm['user[username]'].$dirty" ng-disabled="preventField['user.username'] && user.username && !userForm['user[username]'].$dirty"
required/> required/>
</div> </div>
<span class="help-block" ng-show="userForm['user[username]'].$dirty && userForm['user[username]'].$error.required" translate>{{ 'pseudonym_is_required' }}</span> <span class="help-block" ng-show="userForm['user[username]'].$dirty && userForm['user[username]'].$error.required" translate>{{ 'app.shared.user.pseudonym_is_required' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][last_name]'].$dirty && userForm['user[profile_attributes][last_name]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][last_name]'].$dirty && userForm['user[profile_attributes][last_name]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_invoicing' | translate }}"><i class="fa fa-user"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_invoicing' | translate }}"><i class="fa fa-user"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="text" <input type="text"
name="user[profile_attributes][last_name]" name="user[profile_attributes][last_name]"
ng-model="user.profile.last_name" ng-model="user.profile.last_name"
class="form-control" class="form-control"
id="user_last_name" id="user_last_name"
placeholder="{{ 'surname' | translate }}" placeholder="{{ 'app.shared.user.surname' | translate }}"
ng-disabled="preventField['profile.last_name'] && user.profile.last_name && !userForm['user[profile_attributes][last_name]'].$dirty" ng-disabled="preventField['profile.last_name'] && user.profile.last_name && !userForm['user[profile_attributes][last_name]'].$dirty"
required/> required/>
</div> </div>
<span class="help-block" ng-show="userForm['user[profile_attributes][last_name]'].$dirty && userForm['user[profile_attributes][last_name]'].$error.required" translate>{{ 'surname_is_required' }}</span> <span class="help-block" ng-show="userForm['user[profile_attributes][last_name]'].$dirty && userForm['user[profile_attributes][last_name]'].$error.required" translate>{{ 'app.shared.user.surname_is_required' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][first_name]'].$dirty && userForm['user[profile_attributes][first_name]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][first_name]'].$dirty && userForm['user[profile_attributes][first_name]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_invoicing' | translate }}"><i class="fa fa-user"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_invoicing' | translate }}"><i class="fa fa-user"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="text" <input type="text"
name="user[profile_attributes][first_name]" name="user[profile_attributes][first_name]"
ng-model="user.profile.first_name" ng-model="user.profile.first_name"
class="form-control" class="form-control"
id="user_first_name" id="user_first_name"
placeholder="{{ 'first_name' | translate }}" placeholder="{{ 'app.shared.user.first_name' | translate }}"
ng-disabled="preventField['profile.first_name'] && user.profile.first_name && !userForm['user[profile_attributes][first_name]'].$dirty" ng-disabled="preventField['profile.first_name'] && user.profile.first_name && !userForm['user[profile_attributes][first_name]'].$dirty"
required/> required/>
</div> </div>
<span class="help-block" ng-show="userForm['user[profile_attributes][first_name]'].$dirty && userForm['user[profile_attributes][first_name]'].$error.required" translate>{{ 'first_name_is_required' }}</span> <span class="help-block" ng-show="userForm['user[profile_attributes][first_name]'].$dirty && userForm['user[profile_attributes][first_name]'].$error.required" translate>{{ 'app.shared.user.first_name_is_required' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[email]'].$dirty && userForm['user[email]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[email]'].$dirty && userForm['user[email]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_invoicing' | translate }}"><i class="fa fa-envelope"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_invoicing' | translate }}"><i class="fa fa-envelope"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="email" <input type="email"
name="user[email]" name="user[email]"
ng-model="user.email" ng-model="user.email"
class="form-control" class="form-control"
id="user_email" id="user_email"
placeholder="{{ 'email_address' | translate }}" placeholder="{{ 'app.shared.user.email_address' | translate }}"
ng-disabled="preventField['user.email'] && user.email && !userForm['user[email]'].$dirty" ng-disabled="preventField['user.email'] && user.email && !userForm['user[email]'].$dirty"
required/> required/>
</div> </div>
<span class="help-block" ng-show="userForm['user[email]'].$dirty && userForm['user[email]'].$error.required" translate>{{ 'email_address_is_required' }}</span> <span class="help-block" ng-show="userForm['user[email]'].$dirty && userForm['user[email]'].$error.required" translate>{{ 'app.shared.user.email_address_is_required' }}</span>
</div> </div>
<div class="form-group" ng-hide="preventPassword"> <div class="form-group" ng-hide="preventPassword">
<button class="btn btn-warning btn-block" <button class="btn btn-warning btn-block"
ng-click="password.change = !password.change; $event.stopPropagation(); $event.preventDefault()" ng-click="password.change = !password.change; $event.stopPropagation(); $event.preventDefault()"
translate>{{ 'change_password' }}</button> translate>{{ 'app.shared.user.change_password' }}</button>
</div> </div>
@ -141,12 +141,12 @@
ng-model="user.password" ng-model="user.password"
class="form-control" class="form-control"
id="user_password" id="user_password"
placeholder="{{ 'new_password' | translate }}" placeholder="{{ 'app.shared.user.new_password' | translate }}"
ng-minlength="8" ng-minlength="8"
required/> required/>
</div> </div>
<span class="help-block" ng-show="userForm['user[password]'].$dirty && userForm['user[password]'].$error.required" translate>{{ 'password_is_required' }}</span> <span class="help-block" ng-show="userForm['user[password]'].$dirty && userForm['user[password]'].$error.required" translate>{{ 'app.shared.user.password_is_required' }}</span>
<span class="help-block" ng-show="userForm['user[password]'].$dirty && userForm['user[password]'].$error.minlength" translate>{{ 'password_is_too_short' }}</span> <span class="help-block" ng-show="userForm['user[password]'].$dirty && userForm['user[password]'].$error.minlength" translate>{{ 'app.shared.user.password_is_too_short' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[password_confirmation]'].$dirty && userForm['user[password_confirmation]'].$invalid}" ng-if="password.change"> <div class="form-group" ng-class="{'has-error': userForm['user[password_confirmation]'].$dirty && userForm['user[password_confirmation]'].$invalid}" ng-if="password.change">
@ -157,19 +157,19 @@
ng-model="user.password_confirmation" ng-model="user.password_confirmation"
class="form-control" class="form-control"
id="user_password_confirmation" id="user_password_confirmation"
placeholder="{{ 'confirmation_of_new_password' | translate }}" placeholder="{{ 'app.shared.user.confirmation_of_new_password' | translate }}"
ng-minlength="8" ng-minlength="8"
required required
match="user.password"/> match="user.password"/>
</div> </div>
<span class="help-block" ng-show="userForm['user[password_confirmation]'].$dirty && userForm['user[password_confirmation]'].$error.required" translate>{{ 'confirmation_of_password_is_required' }}</span> <span class="help-block" ng-show="userForm['user[password_confirmation]'].$dirty && userForm['user[password_confirmation]'].$error.required" translate>{{ 'app.shared.user.confirmation_of_password_is_required' }}</span>
<span class="help-block" ng-show="userForm['user[password_confirmation]'].$dirty && userForm['user[password_confirmation]'].$error.minlength" translate>{{ 'confirmation_of_password_is_too_short' }}</span> <span class="help-block" ng-show="userForm['user[password_confirmation]'].$dirty && userForm['user[password_confirmation]'].$error.minlength" translate>{{ 'app.shared.user.confirmation_of_password_is_too_short' }}</span>
<span class="help-block" ng-show="userForm['user[password_confirmation]'].$error.match" translate>{{ 'confirmation_mismatch_with_password' }}</span> <span class="help-block" ng-show="userForm['user[password_confirmation]'].$error.match" translate>{{ 'app.shared.user.confirmation_mismatch_with_password' }}</span>
</div> </div>
<div class="form-group" ng-if="user.invoicing_profile.organization" ng-class="{'has-error': userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$invalid}"> <div class="form-group" ng-if="user.invoicing_profile.organization" ng-class="{'has-error': userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_invoicing' | translate }}"><i class="fa fa-building-o"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_invoicing' | translate }}"><i class="fa fa-building-o"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="hidden" <input type="hidden"
name="user[invoicing_profile_attributes][organization_attributes][id]" name="user[invoicing_profile_attributes][organization_attributes][id]"
ng-value="user.invoicing_profile.organization.id" /> ng-value="user.invoicing_profile.organization.id" />
@ -177,16 +177,16 @@
name="user[invoicing_profile_attributes][organization_attributes][name]" name="user[invoicing_profile_attributes][organization_attributes][name]"
ng-model="user.invoicing_profile.organization.name" ng-model="user.invoicing_profile.organization.name"
class="form-control" class="form-control"
placeholder="{{ 'organization_name' | translate }}" placeholder="{{ 'app.shared.user.organization_name' | translate }}"
ng-required="user.invoicing_profile.organization" ng-required="user.invoicing_profile.organization"
ng-disabled="preventField['profile.organization_name'] && user.invoicing_profile.organization.name && !userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$dirty"> ng-disabled="preventField['profile.organization_name'] && user.invoicing_profile.organization.name && !userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$dirty">
</div> </div>
<span class="help-block" ng-show="userForm['user[invoicing_][organization_attributes][name]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$error.required" translate>{{ 'organization_name_is_required' }}</span> <span class="help-block" ng-show="userForm['user[invoicing_][organization_attributes][name]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][name]'].$error.required" translate>{{ 'app.shared.user.organization_name_is_required' }}</span>
</div> </div>
<div class="form-group" ng-if="user.invoicing_profile.organization" ng-class="{'has-error': userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$invalid}"> <div class="form-group" ng-if="user.invoicing_profile.organization" ng-class="{'has-error': userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_invoicing' | translate }}"><i class="fa fa-map-marker"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_invoicing' | translate }}"><i class="fa fa-map-marker"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="hidden" <input type="hidden"
name="user[invoicing_profile_attributes][organization_attributes][address_attributes][id]" name="user[invoicing_profile_attributes][organization_attributes][address_attributes][id]"
ng-value="user.invoicing_profile.organization.address.id" /> ng-value="user.invoicing_profile.organization.address.id" />
@ -194,16 +194,16 @@
name="user[invoicing_profile_attributes][organization_attributes][address_attributes][address]" name="user[invoicing_profile_attributes][organization_attributes][address_attributes][address]"
ng-model="user.invoicing_profile.organization.address.address" ng-model="user.invoicing_profile.organization.address.address"
class="form-control" class="form-control"
placeholder="{{ 'organization_address' | translate }}" placeholder="{{ 'app.shared.user.organization_address' | translate }}"
ng-required="user.invoicing_profile.organization" ng-required="user.invoicing_profile.organization"
ng-disabled="preventField['profile.organization_address'] && user.invoicing_profile.organization.address.address && !userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$dirty"> ng-disabled="preventField['profile.organization_address'] && user.invoicing_profile.organization.address.address && !userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$dirty">
</div> </div>
<span class="help-block" ng-show="userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$error.required" translate>{{ 'organization_address_is_required' }}</span> <span class="help-block" ng-show="userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$dirty && userForm['user[invoicing_profile_attributes][organization_attributes][address_attributes][address]'].$error.required" translate>{{ 'app.shared.user.organization_address_is_required' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[statistic_profile_attributes][birthday]'].$dirty && userForm['user[statistic_profile_attributes][birthday]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[statistic_profile_attributes][birthday]'].$dirty && userForm['user[statistic_profile_attributes][birthday]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_statistics' | translate }}"><i class="fa fa-calendar-o"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_statistics' | translate }}"><i class="fa fa-calendar-o"></i> <span class="exponent"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="text" <input type="text"
id="user_birthday" id="user_birthday"
class="form-control" class="form-control"
@ -211,7 +211,7 @@
uib-datepicker-popup="{{datePicker.format}}" uib-datepicker-popup="{{datePicker.format}}"
datepicker-options="datePicker.options" datepicker-options="datePicker.options"
is-open="datePicker.opened" is-open="datePicker.opened"
placeholder="{{ 'date_of_birth' | translate }}" placeholder="{{ 'app.shared.user.date_of_birth' | translate }}"
ng-click="openDatePicker($event)" ng-click="openDatePicker($event)"
ng-disabled="preventField['profile.birthday'] && user.statistic_profile.birthday && !userForm['user[statistic_profile_attributes][birthday]'].$dirty" ng-disabled="preventField['profile.birthday'] && user.statistic_profile.birthday && !userForm['user[statistic_profile_attributes][birthday]'].$dirty"
required/> required/>
@ -219,12 +219,12 @@
name="user[statistic_profile_attributes][birthday]" name="user[statistic_profile_attributes][birthday]"
value="{{user.statistic_profile.birthday | toIsoDate}}" /> value="{{user.statistic_profile.birthday | toIsoDate}}" />
</div> </div>
<span class="help-block" ng-show="userForm['user[statistic_profile_attributes][birthday]'].$dirty && userForm['user[statistic_profile_attributes][birthday]'].$error.required" translate>{{ 'date_of_birth_is_required' }}</span> <span class="help-block" ng-show="userForm['user[statistic_profile_attributes][birthday]'].$dirty && userForm['user[statistic_profile_attributes][birthday]'].$error.required" translate>{{ 'app.shared.user.date_of_birth_is_required' }}</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_invoicing' | translate }}"><i class="fa fa-map-marker"></i> </span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_invoicing' | translate }}"><i class="fa fa-map-marker"></i> </span>
<input type="hidden" <input type="hidden"
name="user[invoicing_profile_attributes][address_attributes][id]" name="user[invoicing_profile_attributes][address_attributes][id]"
ng-value="user.invoicing_profile.address.id" /> ng-value="user.invoicing_profile.address.id" />
@ -234,35 +234,35 @@
class="form-control" class="form-control"
id="user_address" id="user_address"
ng-disabled="preventField['profile.address'] && user.invoicing_profile.address.address && !userForm['user[invoicing_profile_attributes][address_attributes][address]'].$dirty" ng-disabled="preventField['profile.address'] && user.invoicing_profile.address.address && !userForm['user[invoicing_profile_attributes][address_attributes][address]'].$dirty"
placeholder="{{ 'address' | translate }}"/> placeholder="{{ 'app.shared.user.address' | translate }}"/>
</div> </div>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][phone]'].$dirty && userForm['user[profile_attributes][phone]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][phone]'].$dirty && userForm['user[profile_attributes][phone]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_reservation' | translate }}"><i class="fa fa-phone"></i> <span class="exponent" ng-show="phoneRequired"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_reservation' | translate }}"><i class="fa fa-phone"></i> <span class="exponent" ng-show="phoneRequired"><i class="fa fa-asterisk" aria-hidden="true"></i></span></span>
<input type="text" <input type="text"
name="user[profile_attributes][phone]" name="user[profile_attributes][phone]"
ng-model="user.profile.phone" ng-model="user.profile.phone"
class="form-control" class="form-control"
id="user_phone" id="user_phone"
placeholder="{{ 'phone_number' | translate }}" placeholder="{{ 'app.shared.user.phone_number' | translate }}"
ng-disabled="preventField['profile.phone'] && user.profile.phone && !userForm['user[profile_attributes][phone]'].$dirty" ng-disabled="preventField['profile.phone'] && user.profile.phone && !userForm['user[profile_attributes][phone]'].$dirty"
ng-required="phoneRequired"/> ng-required="phoneRequired"/>
</div> </div>
<span class="help-block" ng-show="userForm['user[profile_attributes][phone]'].$dirty && userForm['user[profile_attributes][phone]'].$error.required" translate>{{ 'phone_number_is_required' }}</span> <span class="help-block" ng-show="userForm['user[profile_attributes][phone]'].$dirty && userForm['user[profile_attributes][phone]'].$error.required" translate>{{ 'app.shared.user.phone_number_is_required' }}</span>
</div> </div>
<div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][website]'].$dirty && userForm['user[profile_attributes][website]'].$invalid}"> <div class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][website]'].$dirty && userForm['user[profile_attributes][website]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-globe"></i> </span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-globe"></i> </span>
<input type="url" <input type="url"
name="user[profile_attributes][website]" name="user[profile_attributes][website]"
ng-model="user.profile.website" ng-model="user.profile.website"
class="form-control" class="form-control"
id="user_website" id="user_website"
ng-pattern="/^https?:\/\//" ng-pattern="/^https?:\/\//"
placeholder="{{ 'website' | translate }} (http://...)" placeholder="{{ 'app.shared.user.website' | translate }} (http://...)"
ng-disabled="preventField['profile.website'] && user.profile.website && !userForm['user[profile_attributes][website]'].$dirty"/> ng-disabled="preventField['profile.website'] && user.profile.website && !userForm['user[profile_attributes][website]'].$dirty"/>
</div> </div>
</div> </div>
@ -275,13 +275,13 @@
ng-model="user.profile.job" ng-model="user.profile.job"
class="form-control" class="form-control"
id="user_job" id="user_job"
placeholder="{{ 'job' | translate }}" placeholder="{{ 'app.shared.user.job' | translate }}"
ng-disabled="preventField['profile.job'] && user.profile.job && !userForm['user[profile_attributes][job]'].$dirty"/> ng-disabled="preventField['profile.job'] && user.profile.job && !userForm['user[profile_attributes][job]'].$dirty"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="user_interest" class="help-cursor" title="{{ 'used_for_profile' | translate }}" translate>{{ 'interests' }}</label> <label for="user_interest" class="help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}" translate>{{ 'app.shared.user.interests' }}</label>
<textarea name="user[profile_attributes][interest]" <textarea name="user[profile_attributes][interest]"
ng-model="user.profile.interest" ng-model="user.profile.interest"
rows="5" rows="5"
@ -292,7 +292,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="user_software_mastered" class="help-cursor" title="{{ 'used_for_profile' | translate }}" translate>{{ 'CAD_softwares_mastered' }}</label> <label for="user_software_mastered" class="help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}" translate>{{ 'app.shared.user.CAD_softwares_mastered' }}</label>
<textarea name="user[profile_attributes][software_mastered]" <textarea name="user[profile_attributes][software_mastered]"
ng-model="user.profile.software_mastered" ng-model="user.profile.software_mastered"
rows="5" rows="5"
@ -304,28 +304,28 @@
<!-- allow contact--> <!-- allow contact-->
<div class="form-group"> <div class="form-group">
<label for="allowContact" class="help-cursor" title="{{ 'public_profile' | translate }}" translate>{{ 'i_authorize_Fablab_users_registered_on_the_site_to_contact_me' }}</label> <label for="allowContact" class="help-cursor" title="{{ 'app.shared.user.public_profile' | translate }}" translate>{{ 'app.shared.user.i_authorize_Fablab_users_registered_on_the_site_to_contact_me' }}</label>
<input bs-switch <input bs-switch
ng-model="user.is_allow_contact" ng-model="user.is_allow_contact"
id="allowContact" id="allowContact"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'yes' | translate }}" switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'no' | translate }}" switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true"/> switch-animate="true"/>
<input type="hidden" name="user[is_allow_contact]" value="{{user.is_allow_contact}}"/> <input type="hidden" name="user[is_allow_contact]" value="{{user.is_allow_contact}}"/>
</div> </div>
<!-- allow receive newsletter --> <!-- allow receive newsletter -->
<div class="form-group"> <div class="form-group">
<label for="allowNewsletter" translate>{{ 'i_accept_to_receive_information_from_the_fablab' }}</label> <label for="allowNewsletter" translate>{{ 'app.shared.user.i_accept_to_receive_information_from_the_fablab' }}</label>
<input bs-switch <input bs-switch
ng-model="user.is_allow_newsletter" ng-model="user.is_allow_newsletter"
id="allowNewsletter" id="allowNewsletter"
type="checkbox" type="checkbox"
class="form-control" class="form-control"
switch-on-text="{{ 'yes' | translate }}" switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'no' | translate }}" switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true" /> switch-animate="true" />
<input type="hidden" name="user[is_allow_newsletter]" value="{{user.is_allow_newsletter}}"/> <input type="hidden" name="user[is_allow_newsletter]" value="{{user.is_allow_newsletter}}"/>
</div> </div>
@ -333,7 +333,7 @@
<div id="social" ng-init="social={}"> <div id="social" ng-init="social={}">
<div class="form-group" ng-show="social.facebook || user.profile.facebook" ng-class="{'has-error': userForm['user[profile_attributes][facebook]'].$dirty && userForm['user[profile_attributes][facebook]'].$invalid}"> <div class="form-group" ng-show="social.facebook || user.profile.facebook" ng-class="{'has-error': userForm['user[profile_attributes][facebook]'].$dirty && userForm['user[profile_attributes][facebook]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-facebook"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-facebook"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][facebook]" name="user[profile_attributes][facebook]"
ng-model="user.profile.facebook" ng-model="user.profile.facebook"
@ -348,7 +348,7 @@
<div class="form-group" ng-show="social.twitter || user.profile.twitter" ng-class="{'has-error': userForm['user[profile_attributes][twitter]'].$dirty && userForm['user[profile_attributes][twitter]'].$invalid}"> <div class="form-group" ng-show="social.twitter || user.profile.twitter" ng-class="{'has-error': userForm['user[profile_attributes][twitter]'].$dirty && userForm['user[profile_attributes][twitter]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-twitter"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-twitter"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][twitter]" name="user[profile_attributes][twitter]"
ng-model="user.profile.twitter" ng-model="user.profile.twitter"
@ -363,7 +363,7 @@
<div class="form-group" ng-show="social.google_plus || user.profile.google_plus" ng-class="{'has-error': userForm['user[profile_attributes][google_plus]'].$dirty && userForm['user[profile_attributes][google_plus]'].$invalid}"> <div class="form-group" ng-show="social.google_plus || user.profile.google_plus" ng-class="{'has-error': userForm['user[profile_attributes][google_plus]'].$dirty && userForm['user[profile_attributes][google_plus]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-google-plus"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-google-plus"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][google_plus]" name="user[profile_attributes][google_plus]"
ng-model="user.profile.google_plus" ng-model="user.profile.google_plus"
@ -378,7 +378,7 @@
<div class="form-group" ng-show="social.viadeo || user.profile.viadeo" ng-class="{'has-error': userForm['user[profile_attributes][viadeo]'].$dirty && userForm['user[profile_attributes][viadeo]'].$invalid}"> <div class="form-group" ng-show="social.viadeo || user.profile.viadeo" ng-class="{'has-error': userForm['user[profile_attributes][viadeo]'].$dirty && userForm['user[profile_attributes][viadeo]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-viadeo"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-viadeo"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][viadeo]" name="user[profile_attributes][viadeo]"
ng-model="user.profile.viadeo" ng-model="user.profile.viadeo"
@ -393,7 +393,7 @@
<div class="form-group" ng-show="social.linkedin || user.profile.linkedin" ng-class="{'has-error': userForm['user[profile_attributes][linkedin]'].$dirty && userForm['user[profile_attributes][linkedin]'].$invalid}"> <div class="form-group" ng-show="social.linkedin || user.profile.linkedin" ng-class="{'has-error': userForm['user[profile_attributes][linkedin]'].$dirty && userForm['user[profile_attributes][linkedin]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-linkedin"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-linkedin"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][linkedin]" name="user[profile_attributes][linkedin]"
ng-model="user.profile.linkedin" ng-model="user.profile.linkedin"
@ -408,7 +408,7 @@
<div class="form-group" ng-show="social.instagram || user.profile.instragram" ng-class="{'has-error': userForm['user[profile_attributes][instagram]'].$dirty && userForm['user[profile_attributes][instagram]'].$invalid}"> <div class="form-group" ng-show="social.instagram || user.profile.instragram" ng-class="{'has-error': userForm['user[profile_attributes][instagram]'].$dirty && userForm['user[profile_attributes][instagram]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-instagram"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-instagram"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][instagram]" name="user[profile_attributes][instagram]"
ng-model="user.profile.instagram" ng-model="user.profile.instagram"
@ -423,7 +423,7 @@
<div class="form-group" ng-show="social.youtube || user.profile.youtube" ng-class="{'has-error': userForm['user[profile_attributes][youtube]'].$dirty && userForm['user[profile_attributes][youtube]'].$invalid}"> <div class="form-group" ng-show="social.youtube || user.profile.youtube" ng-class="{'has-error': userForm['user[profile_attributes][youtube]'].$dirty && userForm['user[profile_attributes][youtube]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-youtube"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-youtube"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][youtube]" name="user[profile_attributes][youtube]"
ng-model="user.profile.youtube" ng-model="user.profile.youtube"
@ -438,7 +438,7 @@
<div class="form-group" ng-show="social.vimeo || user.profile.vimeo" ng-class="{'has-error': userForm['user[profile_attributes][vimeo]'].$dirty && userForm['user[profile_attributes][vimeo]'].$invalid}"> <div class="form-group" ng-show="social.vimeo || user.profile.vimeo" ng-class="{'has-error': userForm['user[profile_attributes][vimeo]'].$dirty && userForm['user[profile_attributes][vimeo]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-vimeo"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-vimeo"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][vimeo]" name="user[profile_attributes][vimeo]"
ng-model="user.profile.vimeo" ng-model="user.profile.vimeo"
@ -453,7 +453,7 @@
<div class="form-group" ng-show="social.dailymotion || user.profile.dailymotion" ng-class="{'has-error': userForm['user[profile_attributes][dailymotion]'].$dirty && userForm['user[profile_attributes][dailymotion]'].$invalid}"> <div class="form-group" ng-show="social.dailymotion || user.profile.dailymotion" ng-class="{'has-error': userForm['user[profile_attributes][dailymotion]'].$dirty && userForm['user[profile_attributes][dailymotion]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><img src="<%= asset_path('social/dailymotion.png') %>" alt="d" class="fa-img"/></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><img src="<%= asset_path('social/dailymotion.png') %>" alt="d" class="fa-img"/></span>
<input type="text" <input type="text"
name="user[profile_attributes][dailymotion]" name="user[profile_attributes][dailymotion]"
ng-model="user.profile.dailymotion" ng-model="user.profile.dailymotion"
@ -469,7 +469,7 @@
<div class="form-group" ng-show="social.github || user.profile.github" ng-class="{'has-error': userForm['user[profile_attributes][github]'].$dirty && userForm['user[profile_attributes][github]'].$invalid}"> <div class="form-group" ng-show="social.github || user.profile.github" ng-class="{'has-error': userForm['user[profile_attributes][github]'].$dirty && userForm['user[profile_attributes][github]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-github"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-github"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][github]" name="user[profile_attributes][github]"
ng-model="user.profile.github" ng-model="user.profile.github"
@ -484,7 +484,7 @@
<div class="form-group" ng-show="social.echosciences || user.profile.echosciences" ng-class="{'has-error': userForm['user[profile_attributes][echosciences]'].$dirty && userForm['user[profile_attributes][echosciences]'].$invalid}"> <div class="form-group" ng-show="social.echosciences || user.profile.echosciences" ng-class="{'has-error': userForm['user[profile_attributes][echosciences]'].$dirty && userForm['user[profile_attributes][echosciences]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><img src="<%= asset_path('social/echosciences.png') %>" alt="d" class="fa-img"/></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><img src="<%= asset_path('social/echosciences.png') %>" alt="d" class="fa-img"/></span>
<input type="text" <input type="text"
name="user[profile_attributes][echosciences]" name="user[profile_attributes][echosciences]"
ng-model="user.profile.echosciences" ng-model="user.profile.echosciences"
@ -499,7 +499,7 @@
<div class="form-group" ng-show="social.pinterest || user.profile.pinterest" ng-class="{'has-error': userForm['user[profile_attributes][pinterest]'].$dirty && userForm['user[profile_attributes][pinterest]'].$invalid}"> <div class="form-group" ng-show="social.pinterest || user.profile.pinterest" ng-class="{'has-error': userForm['user[profile_attributes][pinterest]'].$dirty && userForm['user[profile_attributes][pinterest]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-pinterest"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-pinterest"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][pinterest]" name="user[profile_attributes][pinterest]"
ng-model="user.profile.pinterest" ng-model="user.profile.pinterest"
@ -514,7 +514,7 @@
<div class="form-group" ng-show="social.lastfm || user.profile.lastfm" ng-class="{'has-error': userForm['user[profile_attributes][lastfm]'].$dirty && userForm['user[profile_attributes][lastfm]'].$invalid}"> <div class="form-group" ng-show="social.lastfm || user.profile.lastfm" ng-class="{'has-error': userForm['user[profile_attributes][lastfm]'].$dirty && userForm['user[profile_attributes][lastfm]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-lastfm"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-lastfm"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][lastfm]" name="user[profile_attributes][lastfm]"
ng-model="user.profile.lastfm" ng-model="user.profile.lastfm"
@ -529,7 +529,7 @@
<div class="form-group" ng-show="social.flickr || user.profile.flickr" ng-class="{'has-error': userForm['user[profile_attributes][flickr]'].$dirty && userForm['user[profile_attributes][flickr]'].$invalid}"> <div class="form-group" ng-show="social.flickr || user.profile.flickr" ng-class="{'has-error': userForm['user[profile_attributes][flickr]'].$dirty && userForm['user[profile_attributes][flickr]'].$invalid}">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon help-cursor" title="{{ 'used_for_profile' | translate }}"><i class="fa fa-flickr"></i></span> <span class="input-group-addon help-cursor" title="{{ 'app.shared.user.used_for_profile' | translate }}"><i class="fa fa-flickr"></i></span>
<input type="text" <input type="text"
name="user[profile_attributes][flickr]" name="user[profile_attributes][flickr]"
ng-model="user.profile.flickr" ng-model="user.profile.flickr"

View File

@ -1,10 +1,10 @@
<div class="widget panel b-a m"> <div class="widget panel b-a m">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 class="panel-title" translate>{{ 'select_a_member' }}</h3> <h3 class="panel-title" translate>{{ 'app.shared.member_select.select_a_member' }}</h3>
</div> </div>
<div class="widget-content no-bg auto wrapper"> <div class="widget-content no-bg auto wrapper">
<ui-select ng-model="ctrl.member" on-select="updateMember()"> <ui-select ng-model="ctrl.member" on-select="updateMember()">
<ui-select-match placeholder="{{ 'start_typing' | translate }}"> <ui-select-match placeholder="{{ 'app.shared.member_select.start_typing' | translate }}">
<span ng-bind="$select.selected.name"></span> <span ng-bind="$select.selected.name"></span>
</ui-select-match> </ui-select-match>
<ui-select-choices repeat="m in matchingMembers" refresh="autoCompleteName($select.search)" refresh-delay="300"> <ui-select-choices repeat="m in matchingMembers" refresh="autoCompleteName($select.search)" refresh-delay="300">

View File

@ -6,6 +6,6 @@
<p ng-bind-html="object.msg"></p> <p ng-bind-html="object.msg"></p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-info" ng-click="ok()" translate>{{ 'confirm' }}</button> <button class="btn btn-info" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button> <button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div> </div>

View File

@ -10,12 +10,11 @@
<li> <li>
<a href class="about-link font-sbold text-sm" ng-click="goabout = !goabout" ui-sref="app.public.about" ng-show="!goabout"> <a href class="about-link font-sbold text-sm" ng-click="goabout = !goabout" ui-sref="app.public.about" ng-show="!goabout">
<span class="label label-theme rounded text-lg text-white m-r-sm font-ebold">?</span> <span class="label label-theme rounded text-lg text-white m-r-sm font-ebold">?</span>
{{ 'about_the_fablab' | translate:{ GENDER: nameGenre, NAME: fablabName } }} {{ 'app.public.common.about_the_fablab' | translate:{ GENDER: nameGenre, NAME: fablabName } }}
</a> </a>
<a href class="about-link font-sbold text-sm" ng-click="goabout = !goabout" ui-sref="app.public.home" ng-show="goabout"> <a href class="about-link font-sbold text-sm" ng-click="goabout = !goabout" ui-sref="app.public.home" ng-show="goabout">
<span class="label label-theme label-icon rounded text-lg text-white m-r-sm font-ebold"><i class="fa fa-caret-up" ng-show="goabout"></i></span> <span class="label label-theme label-icon rounded text-lg text-white m-r-sm font-ebold"><i class="fa fa-caret-up" ng-show="goabout"></i></span>
{{ 'return' | translate }} {{ 'app.public.common.return' | translate }}
</div>
</a> </a>
</li> </li>
</ul> </ul>
@ -34,20 +33,20 @@
</span> </span>
</a> </a>
<ul class="uib-dropdown-menu animated fadeInRight"> <ul class="uib-dropdown-menu animated fadeInRight">
<li><a ui-sref="app.logged.dashboard.profile" translate>{{ 'my_profile' }}</a></li> <li><a ui-sref="app.logged.dashboard.profile" translate>{{ 'app.public.common.my_profile' }}</a></li>
<li><a ui-sref="app.logged.dashboard.settings" translate>{{ 'my_settings' }}</a></li> <li><a ui-sref="app.logged.dashboard.settings" translate>{{ 'app.public.common.my_settings' }}</a></li>
<li><a ui-sref="app.logged.dashboard.projects" translate>{{ 'my_projects' }}</a></li> <li><a ui-sref="app.logged.dashboard.projects" translate>{{ 'app.public.common.my_projects' }}</a></li>
<li><a ui-sref="app.logged.dashboard.trainings" translate>{{ 'my_trainings' }}</a></li> <li><a ui-sref="app.logged.dashboard.trainings" translate>{{ 'app.public.common.my_trainings' }}</a></li>
<li><a ui-sref="app.logged.dashboard.events" translate>{{ 'my_events' }}</a></li> <li><a ui-sref="app.logged.dashboard.events" translate>{{ 'app.public.common.my_events' }}</a></li>
<li><a ui-sref="app.logged.dashboard.invoices" ng-hide="fablabWithoutInvoices" translate>{{ 'my_invoices' }}</a></li> <li><a ui-sref="app.logged.dashboard.invoices" ng-hide="fablabWithoutInvoices" translate>{{ 'app.public.common.my_invoices' }}</a></li>
<li><a ui-sref="app.logged.dashboard.wallet" translate>{{ 'my_wallet' }}</a></li> <li><a ui-sref="app.logged.dashboard.wallet" translate>{{ 'app.public.common.my_wallet' }}</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a class="text-black pointer" ng-click="logout($event)"><i class="fa fa-power-off"></i> {{ 'sign_out' | translate }}</a></li> <li><a class="text-black pointer" ng-click="logout($event)"><i class="fa fa-power-off"></i> {{ 'app.public.common.sign_out' | translate }}</a></li>
</ul> </ul>
</li> </li>
<li ng-if="!isAuthenticated()"><a class="font-sbold label text-md pointer" ng-click="signup($event)"><i class="fa fa-rocket"></i> {{ 'sign_up' | translate }}</a></li> <li ng-if="!isAuthenticated()"><a class="font-sbold label text-md pointer" ng-click="signup($event)"><i class="fa fa-rocket"></i> {{ 'app.public.common.sign_up' | translate }}</a></li>
<li ng-if="!isAuthenticated()"> <li ng-if="!isAuthenticated()">
<a class="font-sbold label text-md pointer" ng-click="login($event)"><i class="fa fa-sign-in"></i> {{ 'sign_in' | translate }}</a> <a class="font-sbold label text-md pointer" ng-click="login($event)"><i class="fa fa-sign-in"></i> {{ 'app.public.common.sign_in' | translate }}</a>
</li> </li>
</ul> </ul>

View File

@ -28,11 +28,12 @@
<div class="col-lg-7 profile-top-infos"> <div class="col-lg-7 profile-top-infos">
<div class="text-xl font-ebold upper">{{user.username}}</div> <div class="text-xl font-ebold upper">{{user.username}}</div>
<small class="font-bold">{{user.name}}</small> <small class="font-bold">{{user.name}}</small>
<small class="text-xs upper font-thin private-profile" ng-show="!user.is_allow_contact"><i class="fa fa-lock" aria-hidden="true"></i> {{ 'private_profile' | translate }}</small> <small class="text-xs upper font-thin private-profile" ng-show="!user.is_allow_contact"><i class="fa fa-lock" aria-hidden="true"></i> {{ 'app.shared.public_profile.private_profile' | translate }}</small>
<div class="m-t"> <div class="m-t">
<small translate>{{ 'last_activity_' }}</small> <div ng-show="user.last_sign_in_at">
<div class="text-lt font-bold" ng-if="user.last_sign_in_at">{{ '_on_' | translate }} {{user.last_sign_in_at | amDateFormat: 'LL'}}</div> <small translate translate-values="{DATE:(user.last_sign_in_at | amDateFormat: 'LL')}">{{ 'app.shared.public_profile.last_activity_html' }}</small>
<small translate>{{ 'email_address' }}</small> </div>
<small translate>{{ 'app.shared.public_profile.email_address' }}</small>
<div class="text-lt font-bold break-word">{{user.email}}</div> <div class="text-lt font-bold break-word">{{user.email}}</div>
</div> </div>
</div> </div>
@ -52,11 +53,11 @@
<div class="wrapper m-t-xl m-b"> <div class="wrapper m-t-xl m-b">
<div class="row m-b"> <div class="row m-b">
<div class="col-xs-5 text-right"> <div class="col-xs-5 text-right">
<span class="font-bold bio-title" translate>{{ 'interests' }}</span> <span class="font-bold bio-title" translate>{{ 'app.shared.public_profile.interests' }}</span>
<div class="m-b m-t-sm">{{user.profile.interest}}</div> <div class="m-b m-t-sm">{{user.profile.interest}}</div>
</div> </div>
<div class="col-xs-offset-2 col-xs-5"> <div class="col-xs-offset-2 col-xs-5">
<span class="font-bold bio-title" translate>{{ 'CAD_softwares_mastered' }}</span> <span class="font-bold bio-title" translate>{{ 'app.shared.public_profile.CAD_softwares_mastered' }}</span>
<div class="m-t-sm">{{user.profile.software_mastered}}</div> <div class="m-t-sm">{{user.profile.software_mastered}}</div>
</div> </div>
</div> </div>
@ -70,23 +71,23 @@
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="widget panel b-a m "> <div class="widget panel b-a m ">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h1 class="red text-u-c" translate>{{ 'trainings' }}</h1> <h1 class="red text-u-c" translate>{{ 'app.shared.public_profile.trainings' }}</h1>
<!-- <h3 class="text-u-c">Formations</h3> --> <!-- <h3 class="text-u-c">Formations</h3> -->
<ul class="list-unstyled" ng-if="user.training_reservations.length > 0 || user.trainings.length > 0"> <ul class="list-unstyled" ng-if="user.training_reservations.length > 0 || user.trainings.length > 0">
<li ng-repeat="r in user.training_reservations | trainingReservationsFilter:'future'"> <li ng-repeat="r in user.training_reservations | trainingReservationsFilter:'future'">
{{r.reservable.name}} - <span class="label label-info text-white" translate>{{ 'to_come' }}</span> {{r.reservable.name}} - <span class="label label-info text-white" translate>{{ 'app.shared.public_profile.to_come' }}</span>
</li> </li>
<li ng-repeat="t in user.trainings"> <li ng-repeat="t in user.trainings">
{{t.name}} - <span class="label label-success text-white" translate>{{ 'approved' }}</span> {{t.name}} - <span class="label label-success text-white" translate>{{ 'app.shared.public_profile.approved' }}</span>
</li> </li>
</ul> </ul>
<div ng-if="user.training_reservations.length == 0 && user.trainings.length == 0" translate>{{ 'no_trainings' }}</div> <div ng-if="user.training_reservations.length == 0 && user.trainings.length == 0" translate>{{ 'app.shared.public_profile.no_trainings' }}</div>
</div> </div>
</div> </div>
<div class="widget panel b-a m "> <div class="widget panel b-a m ">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h1 class="red text-u-c m-b" translate>{{ 'projects' }}</h1> <h1 class="red text-u-c m-b" translate>{{ 'app.shared.public_profile.projects' }}</h1>
<div ng-if="user.all_projects.length > 0" class="row m-t"> <div ng-if="user.all_projects.length > 0" class="row m-t">
<a class="col-xs-12 col-sm-6 col-md-6 col-lg-6" ng-repeat="project in user.all_projects" ui-sref="app.public.projects_show({id:project.slug})" style="display: block;"> <a class="col-xs-12 col-sm-6 col-md-6 col-lg-6" ng-repeat="project in user.all_projects" ui-sref="app.public.projects_show({id:project.slug})" style="display: block;">
<div class="card card-project"> <div class="card card-project">
@ -104,13 +105,13 @@
<div class="text-center"> <div class="text-center">
<span class="m-l-sm label label-success text-white">{{project.author_id == user.id ? 'author' : 'collaborator' | translate}}</span> <span class="m-l-sm label label-success text-white">{{project.author_id == user.id ? 'author' : 'collaborator' | translate}}</span>
<span class="badge" ng-if="project.state == 'draft'" translate>{{ 'rough_draft' }}</span> <span class="badge" ng-if="project.state == 'draft'" translate>{{ 'app.shared.public_profile.rough_draft' }}</span>
</div> </div>
<div class="card-overlay"> <div class="card-overlay">
<div class="btn-group"> <div class="btn-group">
<div class="btn btn-default" ng-click="showProject(project)"> <div class="btn btn-default" ng-click="showProject(project)">
{{ 'consult' | translate }} {{ 'app.shared.buttons.consult' | translate }}
</div> </div>
<div class="btn btn-default" ui-sref="app.logged.projects_edit({id:project.id})" ng-if="isAuthorized('admin')"> <div class="btn btn-default" ui-sref="app.logged.projects_edit({id:project.id})" ng-if="isAuthorized('admin')">
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>
@ -122,7 +123,7 @@
</a> </a>
</div> </div>
<div ng-if="user.all_projects.length == 0" translate>{{ 'no_projects' }}</div> <div ng-if="user.all_projects.length == 0" translate>{{ 'app.shared.public_profile.no_projects' }}</div>
</div> </div>
</div> </div>

View File

@ -7,13 +7,13 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'spaces_list.the_spaces' }}</h1> <h1 translate>{{ 'app.public.spaces_list.the_spaces' }}</h1>
</section> </section>
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized('admin')"> <div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized('admin')">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ui-sref="app.admin.space_new" role="button" translate>{{ 'spaces_list.add_a_space' }}</a> <a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ui-sref="app.admin.space_new" role="button" translate>{{ 'app.public.spaces_list.add_a_space' }}</a>
</section> </section>
</div> </div>
</div> </div>
@ -26,7 +26,7 @@
<div class="input-group col-md-3 m-l-lg m-b"> <div class="input-group col-md-3 m-l-lg m-b">
<span class="input-group-addon"><i class="fa fa-filter"></i></span> <span class="input-group-addon"><i class="fa fa-filter"></i></span>
<select ng-model="spaceFiltering" class="form-control"> <select ng-model="spaceFiltering" class="form-control">
<option ng-repeat="status in filterDisabled" value="{{status}}" translate>{{ 'spaces_list.status_'+status }}</option> <option ng-repeat="status in filterDisabled" value="{{status}}" translate>{{ 'app.public.spaces_list.status_'+status }}</option>
</select> </select>
</div> </div>
</div> </div>
@ -49,13 +49,13 @@
<div class="col-sm-6 b-r no-padder"> <div class="col-sm-6 b-r no-padder">
<div class="btn btn-default btn-block no-b padder-v red" ng-click="reserveSpace(space, $event)" ng-hide="space.disabled"> <div class="btn btn-default btn-block no-b padder-v red" ng-click="reserveSpace(space, $event)" ng-hide="space.disabled">
<i class="fa fa-bookmark m-r-xs"></i> <i class="fa fa-bookmark m-r-xs"></i>
<span class="hidden-sm" translate>{{ 'spaces_list.book' }}</span> <span class="hidden-sm" translate>{{ 'app.public.spaces_list.book' }}</span>
</div> </div>
</div> </div>
<div class="no-padder" ng-class="{'col-sm-6': !space.disabled}"> <div class="no-padder" ng-class="{'col-sm-6': !space.disabled}">
<div class="btn btn-default btn-block padder-v no-b red" ng-click="showSpace(space)"> <div class="btn btn-default btn-block padder-v no-b red" ng-click="showSpace(space)">
<i class="fa fa-eye m-r-xs"></i> <i class="fa fa-eye m-r-xs"></i>
<span class="hidden-sm" translate>{{ 'consult' }}</span> <span class="hidden-sm" translate>{{ 'app.shared.buttons.consult' }}</span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -15,9 +15,9 @@
<div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md"> <div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a ng-click="reserveSpace($event)" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ng-if="!isAuthorized('admin')" translate>{{ 'space_show.book_this_space' }}</a> <a ng-click="reserveSpace($event)" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ng-if="!isAuthorized('admin')" translate>{{ 'app.public.space_show.book_this_space' }}</a>
<a ui-sref="app.admin.space_edit({id:space.slug})" ng-if="isAuthorized('admin')" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"><i class="fa fa-edit"></i> {{ 'edit' | translate }}</a> <a ui-sref="app.admin.space_edit({id:space.slug})" ng-if="isAuthorized('admin')" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"><i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}</a>
<a ng-click="deleteSpace($event)" ng-if="isAuthorized('admin')" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a> <a ng-click="deleteSpace($event)" ng-if="isAuthorized('admin')" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a>
</section> </section>
@ -44,7 +44,7 @@
<div class="widget panel b-a m m-t-lg"> <div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b small"> <div class="panel-heading b-b small">
<h3 translate>{{ 'space_show.characteristics' }}</h3> <h3 translate>{{ 'app.public.space_show.characteristics' }}</h3>
</div> </div>
<div class="widget-content no-bg wrapper"> <div class="widget-content no-bg wrapper">
<h3></h3> <h3></h3>
@ -55,7 +55,7 @@
<section class="widget panel b-a m" ng-if="space.space_files_attributes"> <section class="widget panel b-a m" ng-if="space.space_files_attributes">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<span class="badge bg-warning pull-right">{{space.space_files_attributes.length}}</span> <span class="badge bg-warning pull-right">{{space.space_files_attributes.length}}</span>
<h3 translate>{{ 'space_show.files_to_download' }}</h3> <h3 translate>{{ 'app.public.space_show.files_to_download' }}</h3>
</div> </div>
<ul class="widget-content list-group list-group-lg no-bg auto"> <ul class="widget-content list-group list-group-lg no-bg auto">
@ -67,7 +67,7 @@
<section class="widget panel b-a m" ng-if="space.space_projects"> <section class="widget panel b-a m" ng-if="space.space_projects">
<div class="panel-heading b-b"> <div class="panel-heading b-b">
<h3 translate>{{ 'space_show.projects_using_the_space' }}</h3> <h3 translate>{{ 'app.public.space_show.projects_using_the_space' }}</h3>
</div> </div>
<ul class="widget-content list-group list-group-lg no-bg auto"> <ul class="widget-content list-group list-group-lg no-bg auto">

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1 translate>{{ 'the_trainings' }}</h1> <h1 translate>{{ 'app.public.trainings_list.the_trainings' }}</h1>
</section> </section>
</div> </div>
@ -36,12 +36,12 @@
<div class="text-center clearfix"> <div class="text-center clearfix">
<div class="col-sm-6 b-r no-padder"> <div class="col-sm-6 b-r no-padder">
<div class="btn btn-default btn-block no-b padder-v red" ng-click="reserveTraining(training, $event)"> <div class="btn btn-default btn-block no-b padder-v red" ng-click="reserveTraining(training, $event)">
<i class="fa fa-bookmark"></i> {{ 'book' | translate }} <i class="fa fa-bookmark"></i> {{ 'app.public.trainings_list.book' | translate }}
</div> </div>
</div> </div>
<div class="col-sm-6 no-padder"> <div class="col-sm-6 no-padder">
<div class="btn btn-default btn-block padder-v no-b red" ng-click="showTraining(training)"> <div class="btn btn-default btn-block padder-v no-b red" ng-click="showTraining(training)">
<i class="fa fa-eye"></i> {{ 'consult' | translate }} <i class="fa fa-eye"></i> {{ 'app.shared.buttons.consult' | translate }}
</div> </div>
</div> </div>
</div> </div>

View File

@ -15,9 +15,9 @@
<div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md"> <div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md">
<section class="heading-actions wrapper"> <section class="heading-actions wrapper">
<a ng-click="reserveTraining(training, $event)" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ng-if="!isAuthorized('admin')" translate>{{ 'book_this_training' }}</a> <a ng-click="reserveTraining(training, $event)" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs" ng-if="!isAuthorized('admin')" translate>{{ 'app.public.training_show.book_this_training' }}</a>
<a ui-sref="app.admin.trainings_edit({id: training.id})" ng-if="isAuthorized('admin')" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"><i class="fa fa-edit"></i> {{ 'edit' | translate }}</a> <a ui-sref="app.admin.trainings_edit({id: training.id})" ng-if="isAuthorized('admin')" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"><i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}</a>
<a ng-click="delete(training)" ng-if="isAuthorized('admin')" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a> <a ng-click="delete(training)" ng-if="isAuthorized('admin')" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a>
</section> </section>
</div> </div>

View File

@ -1,6 +1,6 @@
<div class="col-sm-4 text-center"> <div class="col-sm-4 text-center">
<h4 translate ng-if="view !== 'member_edit'">{{'your_wallet_amount'}}</h4> <h4 translate ng-if="view !== 'member_edit'">{{'app.shared.wallet.your_wallet_amount'}}</h4>
<h4 translate ng-if="view === 'member_edit'">{{'wallet_amount'}}</h4> <h4 translate ng-if="view === 'member_edit'">{{'app.shared.wallet.wallet_amount'}}</h4>
<div class="wallet-amount-container"> <div class="wallet-amount-container">
<div class="wallet-amount">{{wallet.amount | currency}}</div> <div class="wallet-amount">{{wallet.amount | currency}}</div>
</div> </div>

View File

@ -2,18 +2,18 @@
<table class="table" ng-if="transactions.length > 0"> <table class="table" ng-if="transactions.length > 0">
<thead> <thead>
<tr> <tr>
<th style="width:25%" translate>{{ 'date' }}</th> <th style="width:25%" translate>{{ 'app.shared.wallet.date' }}</th>
<th style="width:25%" translate>{{ 'operation' }}</th> <th style="width:25%" translate>{{ 'app.shared.wallet.operation' }}</th>
<th style="width:25%" translate>{{ 'operator' }}</th> <th style="width:25%" translate>{{ 'app.shared.wallet.operator' }}</th>
<th style="width:25%" translate>{{ 'amount' }}</th> <th style="width:25%" translate>{{ 'app.shared.wallet.amount' }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="t in transactions"> <tr ng-repeat="t in transactions">
<td>{{ ::t.created_at | amDateFormat:'L' }}</td> <td>{{ ::t.created_at | amDateFormat:'L' }}</td>
<td> <td>
<span ng-if="t.transaction_type == 'credit'" translate>{{ 'credit' }}</span> <span ng-if="t.transaction_type == 'credit'" translate>{{ 'app.shared.wallet.credit' }}</span>
<span ng-if="t.transaction_type == 'debit'" translate>{{ 'debit' }}</span> <span ng-if="t.transaction_type == 'debit'" translate>{{ 'app.shared.wallet.debit' }}</span>
<a ng-href="api/invoices/{{t.invoice.id}}/download" target="_blank" ng-if="t.invoice.id"> <a ng-href="api/invoices/{{t.invoice.id}}/download" target="_blank" ng-if="t.invoice.id">
{{::t.invoice.reference}} {{::t.invoice.reference}}
</a> </a>
@ -27,5 +27,5 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p ng-if="transactions.length == 0" translate>{{ 'no_transactions_for_now' }}</p> <p ng-if="transactions.length == 0" translate>{{ 'app.shared.wallet.no_transactions_for_now' }}</p>
</div> </div>

View File

@ -6,11 +6,13 @@ class API::TranslationsController < API::ApiController
def show def show
@translations = I18n.t params[:state] translations = I18n.t params[:state]
if @translations.class.name == String.name && @translations.start_with?('translation missing') if translations.class.name == String.name && translations.start_with?('translation missing')
render json: { error: @translations }, status: :unprocessable_entity render json: { error: translations }, status: :unprocessable_entity
else else
render json: @translations, status: :ok path = params[:state]
res = path.split('.').reverse.reduce(translations) { |r, e| { e.to_sym => r } }
render json: res, status: :ok
end end
end end

View File

@ -13,7 +13,6 @@ fr:
calendar: calendar:
# gestion des créneaux machines et formations # gestion des créneaux machines et formations
admin_calendar:
calendar_management: "Gestion du calendrier" calendar_management: "Gestion du calendrier"
trainings: "Formations" trainings: "Formations"
machines: "Machines" machines: "Machines"
@ -88,7 +87,6 @@ fr:
view_reservations: "Voir les réservations" view_reservations: "Voir les réservations"
legend: "Légende" legend: "Légende"
icalendar:
icalendar: icalendar:
icalendar_import: "Import iCalendar" icalendar_import: "Import iCalendar"
intro: "Fab-manager vous permet d'importer automatiquement des évènements de calendrier, au format iCalendar RFC 5545, depuis des URL externes. Ces URL seront synchronisée toutes les nuits et les évènements seront affichés dans le calendrier publique." intro: "Fab-manager vous permet d'importer automatiquement des évènements de calendrier, au format iCalendar RFC 5545, depuis des URL externes. Ces URL seront synchronisée toutes les nuits et les évènements seront affichés dans le calendrier publique."
@ -122,16 +120,21 @@ fr:
trainings: trainings:
# suivre et surveiller les formations # suivre et surveiller les formations
training: "Formation" trainings_monitoring: "Suivi formations"
trainings: "Formations"
add_a_new_training: "Ajouter une nouvelle formation" add_a_new_training: "Ajouter une nouvelle formation"
name: "Nom"
associated_machines: "Machines associées" associated_machines: "Machines associées"
number_of_tickets: "Nombre de places" number_of_tickets: "Nombre de places"
select_a_training: "Sélectionnez une formation"
training: "Formation"
date: "Date"
year_NUMBER: "Année {NUMBER}" year_NUMBER: "Année {NUMBER}"
month_of_NAME: "Mois de {NAME}" month_of_NAME: "Mois de {NAME}"
NUMBER_reservation: "{NUMBER} {NUMBER, plural, =0{réservation} one{réservation} other{réservations}}" NUMBER_reservation: "{NUMBER} {NUMBER, plural, =0{réservation} one{réservation} other{réservations}}"
none: "Aucune" none: "Aucune"
training_validation: "Validation formation" training_validation: "Validation formation"
training_of_the_ : "Formation du " # context: date. eg. "training of the september 1st 2012" training_of_the_DATE_TIME_html : "Formation du <strong>{DATE} - {TIME}</strong>"
you_can_validate_the_training_of_the_following_members: "Vous pouvez valider la formation des membres suivants :" you_can_validate_the_training_of_the_following_members: "Vous pouvez valider la formation des membres suivants :"
deleted_user: "Utilisateur supprimé" deleted_user: "Utilisateur supprimé"
no_reservation: "Aucune réservation" no_reservation: "Aucune réservation"
@ -558,12 +561,16 @@ fr:
# gestion des utilisateurs, des groupes, des étiquettes, etc. # gestion des utilisateurs, des groupes, des étiquettes, etc.
users_management: "Gestion des utilisateurs" users_management: "Gestion des utilisateurs"
members: "Membres" members: "Membres"
subscriptions: "Abonnements"
search_for_an_user: "Recherchez un utilisateur" search_for_an_user: "Recherchez un utilisateur"
add_a_new_member: "Ajouter un nouveau membre" add_a_new_member: "Ajouter un nouveau membre"
reservations: "Réservations" reservations: "Réservations"
surname: "Nom"
first_name: "Prénom"
email: "Courriel" email: "Courriel"
phone: "Tel." phone: "Tel."
user_type: "Type utilisateur" user_type: "Type utilisateur"
subscription: "Abonnement"
display_more_users: "Afficher plus d'utilisateurs ..." display_more_users: "Afficher plus d'utilisateurs ..."
administrators: "Administrateurs" administrators: "Administrateurs"
search_for_an_administrator: "Recherchez un administrateur" search_for_an_administrator: "Recherchez un administrateur"
@ -579,6 +586,7 @@ fr:
unable_to_delete_the_administrator: "L'administrateur n'a pas pu être supprimé." unable_to_delete_the_administrator: "L'administrateur n'a pas pu être supprimé."
changes_successfully_saved: "Les modifications ont bien été enregistrées." changes_successfully_saved: "Les modifications ont bien été enregistrées."
an_error_occurred_while_saving_changes: "Une erreur est survenue lors de l'enregistrement des modifications." an_error_occurred_while_saving_changes: "Une erreur est survenue lors de l'enregistrement des modifications."
tags: "Étiquettes"
add_a_tag: "Ajouter une étiquette" add_a_tag: "Ajouter une étiquette"
tag_name: "Nom de l'étiquette" tag_name: "Nom de l'étiquette"
new_tag_successfully_saved: "La nouvelle étiquette a bien été enregistrée." new_tag_successfully_saved: "La nouvelle étiquette a bien été enregistrée."

View File

@ -32,9 +32,8 @@ fr:
profile: profile:
empty: '' empty: ''
settings: settings:
edit_profile:
# tableau de bord : éditer mon profil # tableau de bord : éditer mon profil
last_activity_on_: "Dernière activité le" last_activity_on_: "Dernière activité le {DATE}"
i_want_to_change_group: "Je veux changer de groupe !" i_want_to_change_group: "Je veux changer de groupe !"
your_subscription_expires_on_: "Votre abonnement expire le" your_subscription_expires_on_: "Votre abonnement expire le"
no_subscriptions: "Aucun abonnement" no_subscriptions: "Aucun abonnement"
@ -82,23 +81,37 @@ fr:
projects: projects:
# tableau de bord : mes projets # tableau de bord : mes projets
you_dont_have_any_projects: "Vous n'avez aucun projet." you_dont_have_any_projects: "Vous n'avez aucun projet."
add_a_project: "Ajouter un projet"
author: "Auteur" author: "Auteur"
collaborator: "Collaborateur" collaborator: "Collaborateur"
rough_draft: "Brouillon"
description: "Description"
machines_and_materials: "Machines et matériaux"
machines: "Machines"
materials: "Matériaux"
collaborators: "Les collaborateurs"
trainings: trainings:
# tableau de bord : mes formations # tableau de bord : mes formations
your_next_trainings: "Vos prochaines formations" your_next_trainings: "Vos prochaines formations"
your_previous_trainings: "Vos formations passées" your_previous_trainings: "Vos formations passées"
your_approved_trainings: "Vos formations validées" your_approved_trainings: "Vos formations validées"
no_trainings: "Aucune formation"
events: events:
# tableau de bord : mes évènements # tableau de bord : mes évènements
your_next_events: "Vos prochains évènements" your_next_events: "Vos prochains évènements"
no_events_to_come: "Aucun évènement à venir" no_events_to_come: "Aucun évènement à venir"
your_previous_events: "Vos évènements passés" your_previous_events: "Vos évènements passés"
no_passed_events: "Aucun évènement passé"
NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{place normale réservée} other{places normales réservées}}" NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{place normale réservée} other{places normales réservées}}"
NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{place {NAME} réservée} other{places {NAME} réservées}}" NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{place {NAME} réservée} other{places {NAME} réservées}}"
invoices: invoices:
# tableau de bord : mes factures # tableau de bord : mes factures
reference_number: "Référence" reference_number: "Référence"
date: "Date"
price: "Prix"
download_the_invoice: "Télécharger la facture"
download_the_credit_note: "Télécharger l'avoir"
no_invoices_for_now: "Aucune facture pour le moment."
members_show: members_show:
# profil public d'un membre # profil public d'un membre
@ -110,6 +123,9 @@ fr:
display_more_members: "Afficher plus de membres ..." display_more_members: "Afficher plus de membres ..."
no_members_for_now: "Pas de membres pour le moment" no_members_for_now: "Pas de membres pour le moment"
avatar: "Avatar" avatar: "Avatar"
user: "Utilisateur"
pseudonym: "Pseudonyme"
email_address: "Adresse électronique"
projects_new: projects_new:
# ajouter un nouveau projet # ajouter un nouveau projet
@ -154,6 +170,7 @@ fr:
notifications: notifications:
notifications_center: "Centre de notifications" notifications_center: "Centre de notifications"
mark_all_as_read: "Tout marquer comme lu" mark_all_as_read: "Tout marquer comme lu"
date: "Date"
notif_title: "Intitulé" notif_title: "Intitulé"
no_new_notifications: "Aucune nouvelle notification." no_new_notifications: "Aucune nouvelle notification."
archives: "Archives" archives: "Archives"

View File

@ -45,7 +45,6 @@ fr:
# menu de gauche (partie admin) # menu de gauche (partie admin)
trainings_monitoring: "Suivi formations" trainings_monitoring: "Suivi formations"
select_a_training: "Sélectionnez une formation"
manage_the_calendar: "Gérer le calendrier" manage_the_calendar: "Gérer le calendrier"
manage_the_users: "Gérer les utilisateurs" manage_the_users: "Gérer les utilisateurs"
manage_the_invoices: "Gérer les factures" manage_the_invoices: "Gérer les factures"
@ -161,7 +160,6 @@ fr:
projects_list: projects_list:
# galerie des projets # galerie des projets
projects_list:
the_fablab_projects: "Les projets du FabLab" the_fablab_projects: "Les projets du FabLab"
add_a_project: "Ajouter un projet" add_a_project: "Ajouter un projet"
search_over_the_whole_network: "Chercher sur tout le réseau Fab Manager" search_over_the_whole_network: "Chercher sur tout le réseau Fab Manager"
@ -204,7 +202,6 @@ fr:
machines_list: machines_list:
# liste des machines # liste des machines
machines_list:
the_fablab_s_machines: "Les machines du FabLab" the_fablab_s_machines: "Les machines du FabLab"
add_a_machine: "Ajouter une machine" add_a_machine: "Ajouter une machine"
book: "Réserver" book: "Réserver"
@ -216,6 +213,7 @@ fr:
machines_show: machines_show:
# détail d'une machine # détail d'une machine
book_this_machine: "Réserver cette machine" book_this_machine: "Réserver cette machine"
technical_specifications: "Caractéristiques techniques"
files_to_download: "Fichiers à télécharger" files_to_download: "Fichiers à télécharger"
projects_using_the_machine: "Projets utilisant la machine" projects_using_the_machine: "Projets utilisant la machine"
_or_the_: " ou la " _or_the_: " ou la "
@ -225,6 +223,7 @@ fr:
trainings_list: trainings_list:
# liste des formations # liste des formations
book: "Réserver"
the_trainings: "Les formations" the_trainings: "Les formations"
training_show: training_show:
@ -246,9 +245,14 @@ fr:
his_group: "Son groupe" his_group: "Son groupe"
he_wants_to_change_group: "{ROLE, select, admin{L'utilisateur veut} other{Je veux}} changer de groupe" he_wants_to_change_group: "{ROLE, select, admin{L'utilisateur veut} other{Je veux}} changer de groupe"
change_my_group: "Changer {ROLE, select, admin{son} other{mon}} groupe" change_my_group: "Changer {ROLE, select, admin{son} other{mon}} groupe"
summary: "Résumé"
your_subscription_has_expired_on_the_DATE: "Votre abonnement a expiré au {DATE}" your_subscription_has_expired_on_the_DATE: "Votre abonnement a expiré au {DATE}"
you_ve_just_payed_the_: "Vous venez de régler l'" subscription_price: "Coût de l'abonnement"
you_ve_just_selected_a_subscription_html: "Vous venez de sélectionner un <strong>abonnement</strong> :"
confirm_and_pay: "Valider et payer"
you_ve_just_payed_the_subscription_html: "Vous venez de régler <strong>l'abonnement</strong> :"
thank_you_your_subscription_is_successful: "Merci. Votre abonnement a bien été pris en compte !" thank_you_your_subscription_is_successful: "Merci. Votre abonnement a bien été pris en compte !"
your_invoice_will_be_available_soon_from_your_dashboard: "Votre facture sera bientôt disponible depuis votre tableau de bord"
your_group_was_successfully_changed: "Votre groupe a bien été changé." your_group_was_successfully_changed: "Votre groupe a bien été changé."
the_user_s_group_was_successfully_changed: "Le groupe de l'utilisateur a bien été changé." the_user_s_group_was_successfully_changed: "Le groupe de l'utilisateur a bien été changé."
an_error_prevented_your_group_from_being_changed: "Une erreur a empêché votre changement de groupe." an_error_prevented_your_group_from_being_changed: "Une erreur a empêché votre changement de groupe."
@ -256,6 +260,7 @@ fr:
an_error_occured_during_the_payment_process_please_try_again_later: "Il y a eu un problème lors de la procédure de paiement. Veuillez réessayer plus tard." an_error_occured_during_the_payment_process_please_try_again_later: "Il y a eu un problème lors de la procédure de paiement. Veuillez réessayer plus tard."
subscription_confirmation: "Validation de l'abonnement" subscription_confirmation: "Validation de l'abonnement"
here_is_the_NAME_subscription_summary: "Voici le récapitulatif de l'abonnement de {NAME} :" here_is_the_NAME_subscription_summary: "Voici le récapitulatif de l'abonnement de {NAME} :"
confirm_payment_of_html: "{ROLE, select, admin{Encaisser} other{Payer}} : {AMOUNT}" # (contexte : valider un paiement de 20,00 €)
events_list: events_list:
# liste des évènements du fablab # liste des évènements du fablab
@ -267,6 +272,10 @@ fr:
free_admission: "Gratuit" free_admission: "Gratuit"
still_available: "place(s) disponible(s)" still_available: "place(s) disponible(s)"
free_entry: "Accès libre" free_entry: "Accès libre"
add_an_event: "Ajouter un évènement"
load_the_next_events: "Charger les évènements suivants ..."
full_price_: "Plein tarif :"
to_date: "au" # context: date. eg: "from 01/01 to 01/05"
events_show: events_show:
# détails d'un événement et réservation # détails d'un événement et réservation
@ -301,7 +310,6 @@ fr:
calendar: calendar:
# calendrier publique # calendrier publique
calendar:
calendar: "Calendrier" calendar: "Calendrier"
show_unavailables: "Afficher les créneaux non disponibles" show_unavailables: "Afficher les créneaux non disponibles"
filter_calendar: "Filtrer le calendrier" filter_calendar: "Filtrer le calendrier"
@ -313,7 +321,6 @@ fr:
spaces_list: spaces_list:
# liste des espaces # liste des espaces
spaces_list:
the_spaces: "Les espaces" the_spaces: "Les espaces"
add_a_space: "Ajouter un espace" add_a_space: "Ajouter un espace"
status_enabled: "Activés" status_enabled: "Activés"
@ -323,7 +330,6 @@ fr:
space_show: space_show:
# affichage des détails d'un espace # affichage des détails d'un espace
space_show:
book_this_space: "Réserver cet espace" book_this_space: "Réserver cet espace"
unauthorized_operation: "Opération non autorisée" unauthorized_operation: "Opération non autorisée"
confirmation_required: "Confirmation requise" confirmation_required: "Confirmation requise"

View File

@ -22,19 +22,8 @@ fr:
elements: elements:
# traductions variées utilisées à plusieurs reprises dans l'application # traductions variées utilisées à plusieurs reprises dans l'application
group: "Groupe" group: "Groupe"
subscription: "Abonnement"
trainings: "Formations"
no_trainings: "Aucune formation"
confirmation_required: "Confirmation requise" confirmation_required: "Confirmation requise"
description: "Description"
machines: "Machines"
events: "Évènements" events: "Évènements"
materials: "Matériaux"
date: "Date"
price: "Prix"
download_the_invoice: "Télécharger la facture"
download_the_credit_note: "Télécharger l'avoir"
no_invoices_for_now: "Aucune facture pour le moment."
email_address: "Adresse de courriel" email_address: "Adresse de courriel"
user: "Utilisateur" user: "Utilisateur"
pseudonym: "Pseudonyme" pseudonym: "Pseudonyme"
@ -42,41 +31,20 @@ fr:
reservation_was_successfully_cancelled: "La réservation a bien été annulée." reservation_was_successfully_cancelled: "La réservation a bien été annulée."
title: "Titre" title: "Titre"
total_: "TOTAL :" total_: "TOTAL :"
full_price_: "Plein tarif :"
rough_draft: "Brouillon"
machines_and_materials: "Machines et matériaux"
collaborators: "Les collaborateurs"
summary: "Résumé"
you_ve_just_selected_a_: "Vous venez de sélectionner un" # you_ve_just_selected_a_ + _subscription
_subscription: "abonnement"
confirm_and_pay: "Valider et payer"
your_invoice_will_be_available_soon_from_your_: "Votre facture sera bientôt disponible depuis votre"
add_an_event: "Ajouter un évènement"
load_the_next_events: "Charger les évènements suivants ..."
no_passed_events: "Aucun évènement passé"
dates: "Dates" dates: "Dates"
thank_you_your_payment_has_been_successfully_registered: "Merci. Votre paiement a bien été pris en compte !" thank_you_your_payment_has_been_successfully_registered: "Merci. Votre paiement a bien été pris en compte !"
surname: "Nom"
first_name: "Prénom"
address: "Adresse"
interests: "Centres d'intérêts"
CAD_softwares_mastered: "Logiciels de conception maîtrisés"
name: "Nom" name: "Nom"
step_N: "Étape {INDEX}" step_N: "Étape {INDEX}"
themes: "Thématiques" themes: "Thématiques"
tags: "Étiquettes"
technical_specifications: "Caractéristiques techniques"
online_payment: "Paiement en ligne" online_payment: "Paiement en ligne"
type: "Type" type: "Type"
partner: "Partenaire" partner: "Partenaire"
standard: "Standard" standard: "Standard"
year: "Année" year: "Année"
month: "Mois" month: "Mois"
subscription_price: "Coût de l'abonnement"
model: "Modèle" model: "Modèle"
from_date: "Du" # context: date. eg: "from 01/01 to 01/05" from_date: "Du" # context: date. eg: "from 01/01 to 01/05"
from_time: "De" # context: time. eg. "from 18:00 to 21:00" from_time: "De" # context: time. eg. "from 18:00 to 21:00"
to_date: "au" # context: date. eg: "from 01/01 to 01/05"
to_time: "à" # context: time. eg. "from 18:00 to 21:00" to_time: "à" # context: time. eg. "from 18:00 to 21:00"
or: "ou" or: "ou"
and: "et" and: "et"
@ -86,15 +54,12 @@ fr:
_click_on_the_synchronization_button_opposite_: "cliquez sur le bouton de synchronisation ci-contre" _click_on_the_synchronization_button_opposite_: "cliquez sur le bouton de synchronisation ci-contre"
_disconnect_then_reconnect_: "déconnectez-vous puis re-connectez vous" _disconnect_then_reconnect_: "déconnectez-vous puis re-connectez vous"
_for_your_changes_to_take_effect: "pour que les modifications soient prises en compte." _for_your_changes_to_take_effect: "pour que les modifications soient prises en compte."
add_a_project: "Ajouter un projet"
illustration: "Visuel" illustration: "Visuel"
add_an_illustration: "Ajouter un visuel" add_an_illustration: "Ajouter un visuel"
book: "Réserver"
description_is_required: "La description est requise." description_is_required: "La description est requise."
name_is_required: "Le nom est requis." name_is_required: "Le nom est requis."
all_themes: "Toutes les thématiques" all_themes: "Toutes les thématiques"
filter: 'Filtre' filter: 'Filtre'
confirm_payment_of_html: "{ROLE, select, admin{Paiement sur place} other{Payer}} : {AMOUNT}" # (contexte : valider mon paiement de 20,00 €)
export_is_running_you_ll_be_notified_when_its_ready: "L'export est en cours. Vous serez notifié lorsqu'il sera prêt." export_is_running_you_ll_be_notified_when_its_ready: "L'export est en cours. Vous serez notifié lorsqu'il sera prêt."
share_on_facebook: "Partager sur Facebook" share_on_facebook: "Partager sur Facebook"
share_on_twitter: "Partager sur Twitter" share_on_twitter: "Partager sur Twitter"
@ -110,11 +75,21 @@ fr:
user: user:
# formulaire d'édition du profil utilisateur # formulaire d'édition du profil utilisateur
man: "Homme"
woman: "Femme"
add_an_avatar: "Ajouter un avatar" add_an_avatar: "Ajouter un avatar"
pseudonym: "Pseudonyme" pseudonym: "Pseudonyme"
pseudonym_is_required: "Le pseudonyme est requis."
first_name: "Votre prénom"
first_name_is_required: "Le prénom est requis."
surname: "Votre nom"
surname_is_required: "Le nom est requis."
email_address: "Votre adresse de courriel"
email_address_is_required: "L'adresse de courriel est requise." email_address_is_required: "L'adresse de courriel est requise."
change_password: "Changer de mot de passe" change_password: "Changer de mot de passe"
new_password: "Nouveau mot de passe" new_password: "Nouveau mot de passe"
password_is_required: "Le mot de passe est requis."
password_is_too_short: "Le mot de passe est trop court (au moins 8 caractères)"
confirmation_of_new_password: "Confirmation du nouveau mot de passe" confirmation_of_new_password: "Confirmation du nouveau mot de passe"
confirmation_of_password_is_required: "La confirmation du mot de passe est requise." confirmation_of_password_is_required: "La confirmation du mot de passe est requise."
confirmation_of_password_is_too_short: "La confirmation du mot de passe est trop courte (au moins 8 caractères)." confirmation_of_password_is_too_short: "La confirmation du mot de passe est trop courte (au moins 8 caractères)."
@ -125,6 +100,19 @@ fr:
date_of_birth_is_required: "La date de naissance est requise." date_of_birth_is_required: "La date de naissance est requise."
website: "Site web" website: "Site web"
job: "Profession" job: "Profession"
interests: "Centres d'intérêts"
CAD_softwares_mastered: "Logiciels de conception maîtrisés"
birthday: "Date de naissance"
birthday_is_required: "La date de naissance est requise."
address: "Adresse"
phone_number: "Numéro de téléphone"
phone_number_is_required: "Le numéro de téléphone est requis."
i_authorize_Fablab_users_registered_on_the_site_to_contact_me: "J'autorise les utilisateurs du Fab Lab inscrits sur le site à me contacter"
i_accept_to_receive_information_from_the_fablab: "J'accepte de recevoir des informations du Fab Lab"
used_for_statistics: "Cette donnée sera utilisée à des fins statistiques"
used_for_invoicing: "Cette donnée sera utilisée à des fins de facturation"
used_for_reservation: "Cette donnée sera utilisée en cas de changement sur une de vos réservations"
used_for_profile: "Cette donnée sera seulement affichée sur votre profil"
project: project:
# formulaire d'étition d'un projet # formulaire d'étition d'un projet
@ -170,8 +158,7 @@ fr:
member_select: member_select:
# admin : choisir un membre avec lequel interagir # admin : choisir un membre avec lequel interagir
select_a_member: "Sélectionnez un membre" select_a_member: "Sélectionnez un membre"
start_typing: "Commencez à taper ..." start_typing: "Commencez à écrire ..."
please_select_a_member_first: "Veuillez tout d'abord sélectionner un membre"
stripe: stripe:
# fenêtre de paiement stripe # fenêtre de paiement stripe
@ -247,7 +234,6 @@ fr:
trainings: trainings:
# formulaire d'édition d'une formation # formulaire d'édition d'une formation
trainings_form:
name: "Nom" name: "Nom"
name_is_required: "Le nom est requis." name_is_required: "Le nom est requis."
illustration: "Visuel" illustration: "Visuel"
@ -325,8 +311,7 @@ fr:
public_profile: public_profile:
# profil publique d'un utilisateur # profil publique d'un utilisateur
last_activity_: "Dernière activité" last_activity_html: "Dernière activité <br><strong>le {DATE}</strong>"
_on_: "le"
to_come: "à venir" to_come: "à venir"
approved: "validée" approved: "validée"
projects: "Projets" projects: "Projets"
@ -334,6 +319,11 @@ fr:
author: "Auteur" author: "Auteur"
collaborator: "Collaborateur" collaborator: "Collaborateur"
private_profile: "Profil privé" private_profile: "Profil privé"
interests: "Centres d'intérêts"
CAD_softwares_mastered: "Logiciels de conception maîtrisés"
email_address: "Adresse électronique"
trainings: "Formations"
no_trainings: "Aucune formation"
wallet: wallet:
# porte-monnaie # porte-monnaie
@ -341,6 +331,7 @@ fr:
your_wallet_amount: 'Votre montant disponible' your_wallet_amount: 'Votre montant disponible'
wallet_amount: 'Montant disponible' wallet_amount: 'Montant disponible'
no_transactions_for_now: 'Aucune transaction pour le moment' no_transactions_for_now: 'Aucune transaction pour le moment'
date: "Date"
operation: 'Opération' operation: 'Opération'
operator: 'Opérateur' operator: 'Opérateur'
amount: 'Montant' amount: 'Montant'