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)
[![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)
[![Crowdin](https://badges.crowdin.net/fab-manager/localized.svg)](https://crowdin.com/project/fab-manager)
##### Table of Contents
1. [Software stack](#software-stack)

View File

@ -85,8 +85,8 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
resolve: {
object () {
return {
title: _t('admin_calendar.confirmation_required'),
msg: _t('admin_calendar.do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION'
title: _t('app.admin.calendar.confirmation_required'),
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 })
};
}
@ -105,10 +105,10 @@ Application.Controllers.controller('AdminCalendarController', ['$scope', '$state
}
}
// 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
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) {
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 {
// open a confirmation dialog
return dialogs.confirm({
resolve: {
object () {
return {
title: _t('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 }) + ' ' +
_t('admin_calendar.this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing') + ' ' +
_t('admin_calendar.beware_this_cannot_be_reverted')
title: _t('app.admin.calendar.confirmation_required'),
msg: _t('app.admin.calendar.do_you_really_want_to_remove_MACHINE_from_this_slot', { GENDER: getGender($scope.currentUser), MACHINE: machine.name }) + ' ' +
_t('app.admin.calendar.this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing') + '<br><strong>' +
_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;
uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');
// 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
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) {
Export.status({ category: 'availabilities', type }).then(function (res) {
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: {
object () {
return {
title: _t('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')
title: _t('app.admin.calendar.confirmation_required'),
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 },
function (data) { // success
$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');
},
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);
}
);
}
);
} 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
const today = new Date();
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');
}
@ -483,7 +483,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
if ($scope.selectedMachines.length > 0) {
$scope.availability.machine_ids = $scope.selectedMachines.map(function (m) { return m.id; });
} 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;
}
} else if ($scope.availability.available_type === 'training') {
@ -597,7 +597,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
const validateSelection = function () {
if ($scope.availability.available_type === 'machines') {
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++;
@ -609,13 +609,13 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
const validateRecurrence = function () {
if ($scope.availability.is_recurrent) {
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) {
return growl.error(_t('admin_calendar.select_nb_period'));
return growl.error(_t('app.admin.calendar.select_nb_period'));
}
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
@ -663,7 +663,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
$scope.reservableName = `<strong>${$scope.selectedSpace.name}</strong>`;
break;
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) {
return $scope.availability.tag_ids.indexOf(t.id) > -1;
@ -672,7 +672,7 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
}
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>`); });
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
if (res.deleted > 1) {
growl.success(_t(
'admin_calendar.slots_deleted',
'app.admin.calendar.slots_deleted',
{START: moment(start_at).format('LL LT'), COUNT: res.deleted - 1}
));
} else {
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')}
));
}
@ -728,12 +728,12 @@ Application.Controllers.controller('DeleteRecurrentAvailabilityController', ['$s
const { data } = res;
if (data.total > 1) {
growl.warning(_t(
'admin_calendar.slots_not_deleted',
'app.admin.calendar.slots_not_deleted',
{TOTAL: data.total, COUNT: data.total - data.deleted}
));
} else {
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')}
));
}
@ -787,7 +787,7 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
$scope.newCalendar.text_hidden = false;
}, function (error) {
// failed
growl.error(_t('icalendar.create_error'));
growl.error(_t('app.admin.icalendar.create_error'));
console.error(error);
})
}
@ -815,8 +815,8 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
resolve: {
object () {
return {
title: _t('icalendar.confirmation_required'),
msg: _t('icalendar.confirm_delete_import')
title: _t('app.admin.icalendar.confirmation_required'),
msg: _t('app.admin.icalendar.confirm_delete_import')
};
}
}
@ -828,10 +828,10 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
// success
const idx = $scope.calendars.indexOf(calendar);
$scope.calendars.splice(idx, 1);
growl.info(_t('icalendar.delete_success'));
growl.info(_t('app.admin.icalendar.delete_success'));
}, function (error) {
// failed
growl.error(_t('icalendar.delete_failed'));
growl.error(_t('app.admin.icalendar.delete_failed'));
console.error(error);
}
);
@ -848,10 +848,10 @@ Application.Controllers.controller('AdminICalendarController', ['$scope', 'iCale
{ id: calendar.id },
function () {
// success
growl.info(_t('icalendar.refresh'));
growl.info(_t('app.admin.icalendar.refresh'));
}, function (error) {
// failed
growl.error(_t('icalendar.sync_failed'));
growl.error(_t('app.admin.icalendar.sync_failed'));
console.error(error);
}
)

View File

@ -196,7 +196,7 @@ Application.Controllers.controller('TrainingsAdminController', ['$scope', '$stat
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); });
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); });

View File

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

View File

@ -133,16 +133,16 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
if ($scope.currentUser.role !== 'admin') {
$rootScope.currentUser = user;
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 {
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) {
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 {
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);
});
@ -318,10 +318,10 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
// Button label
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 {
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 {
$scope.validButtonName = _t('confirm');
}
@ -345,7 +345,7 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
}
, function (data, status) { // failed
$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;
}
);

View File

@ -191,8 +191,8 @@ Application.Controllers.controller('ShowSpaceController', ['$scope', '$state', '
resolve: {
object () {
return {
title: _t('space_show.confirmation_required'),
msg: _t('space_show.do_you_really_want_to_delete_this_space')
title: _t('app.public.space_show.confirmation_required'),
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');
},
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);
}
);

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';
/**
@ -36,9 +25,9 @@ Application.Directives.directive('selectMember', [ 'Diacritics', 'Member', funct
q['subscription'] = attributes.subscription;
}
return Member.search(q, function (users) {
Member.search(q, function (users) {
scope.matchingMembers = users;
return scope.isLoadingMembers = false;
scope.isLoadingMembers = false;
}
, function (error) { console.error(error); });
};

View File

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

View File

@ -7,7 +7,7 @@
</div>
<div class="col-xs-10 b-l b-r-md">
<section class="heading-title">
<h1 translate>{{ 'admin_calendar.calendar_management' }}</h1>
<h1 translate>{{ 'app.admin.calendar.calendar_management' }}</h1>
</section>
</div>
@ -28,12 +28,12 @@
<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 class="calendar-legend-block">
<h4 translate>{{ 'admin_calendar.legend' }}</h4>
<h4 translate>{{ 'app.admin.calendar.legend' }}</h4>
<div class="legends">
<span class="calendar-legend text-sm border-formation" translate>{{ '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-space" ng-hide="fablabWithoutSpaces" translate>{{ '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-formation" translate>{{ 'app.admin.calendar.trainings' }}</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>{{ 'app.admin.calendar.spaces' }}</span>
<span class="calendar-legend text-sm border-event" ng-show="eventsInCalendar" translate>{{ 'app.admin.calendar.events' }}</span>
</div>
</div>
</div>
@ -44,17 +44,17 @@
ng-href="api/availabilities/export_index.xlsx"
target="export-frame"
ng-click="alertExport('index')"
uib-popover="{{ 'admin_calendar.availabilities_notice' | translate}}"
uib-popover="{{ 'app.admin.calendar.availabilities_notice' | translate}}"
popover-trigger="mouseenter"
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>
<iframe name="export-frame" height="0" width="0" class="none"></iframe>
</div>
<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">
<h3 translate>{{ 'admin_calendar.ongoing_reservations' }}</h3>
<h3 translate>{{ 'app.admin.calendar.ongoing_reservations' }}</h3>
</div>
<div class="widget-content no-bg auto wrapper" ng-class="{'reservations-locked': availability.lock}">
<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>
</li>
</ul>
<div ng-show="reservations.length == 0" translate>{{ '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 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>{{ 'app.admin.calendar.reservations_locked' }}</span></div>
</div>
</div>
<div class="widget panel b-a m m-t-lg" ng-if="availability.machine_ids.length > 0">
<div class="panel-heading b-b small">
<h3 translate>{{ 'admin_calendar.machines' }}</h3>
<h3 translate>{{ 'app.admin.calendar.machines' }}</h3>
</div>
<div class="widget-content no-bg auto wrapper">
<ul class="list-unstyled">
@ -86,23 +86,23 @@
<div class="widget panel b-a m m-t-lg" ng-if="availability" >
<div class="panel-heading b-b small">
<h3 translate>{{ 'admin_calendar.actions' }}</h3>
<h3 translate>{{ 'app.admin.calendar.actions' }}</h3>
</div>
<div class="widget-content no-bg auto wrapper" ng-hide="availability.available_type == 'event'">
<button class="btn btn-default" ng-click="toggleLockReservations()">
<span ng-hide="availability.lock">
<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 ng-show="availability.lock">
<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>
</button>
<button class="btn btn-default m-t" ng-click="removeSlot()">
<span>
<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>
</button>
</div>
@ -110,13 +110,13 @@
<a class="btn btn-default pointer" ui-sref="app.admin.events_edit({id: availability.event_id})">
<span>
<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>
</a>
<a class="btn btn-default m-t pointer" ui-sref="app.admin.event_reservations({id: availability.event_id})">
<span>
<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>
</a>
</div>

View File

@ -1,22 +1,22 @@
<div class="modal-header">
<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 class="modal-body">
<p ng-hide="isRecurrent" translate>{{ 'admin_calendar.do_you_really_want_to_delete_this_slot' }}</p>
<p ng-show="isRecurrent" translate>{{ 'admin_calendar.delete_recurring_slot' }}</p>
<p ng-hide="isRecurrent" translate>{{ 'app.admin.calendar.do_you_really_want_to_delete_this_slot' }}</p>
<p ng-show="isRecurrent" translate>{{ 'app.admin.calendar.delete_recurring_slot' }}</p>
<div ng-show="isRecurrent" class="form-group">
<label class="checkbox">
<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 class="checkbox">
<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 class="checkbox">
<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>
</div>
</div>

View File

@ -1,27 +1,27 @@
<div class="modal-header">
<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>
</div>
<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="radio">
<label>
<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>
</div>
<div class="radio">
<label>
<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>
</div>
<div class="radio" ng-hide="fablabWithoutSpaces">
<label>
<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>
</div>
</div>
@ -29,7 +29,7 @@
<div class="modal-body" ng-show="step === 2">
<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">
<label class="checkbox" ng-repeat="machine in machines">
@ -43,7 +43,7 @@
</select>
<div class="row m-t">
<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">
<input type="number" id="nb_places_training" class="form-control" ng-model="availability.nb_total_places">
</div>
@ -56,7 +56,7 @@
</select>
<div class="row m-t">
<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">
<input type="number" id="nb_places_space" class="form-control" ng-model="availability.nb_total_places">
</div>
@ -66,19 +66,19 @@
</div>
<div class="modal-body" ng-show="step === 3">
<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="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>
</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">
<uib-timepicker ng-model="end" hour-step="timepickers.end.hstep" readonly-input="true" minute-step="timepickers.end.mstep" show-meridian="false"></uib-timepicker>
</fieldset>
</div>
</div>
<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="col-sm-12">
<ui-select multiple ng-model="availability.tag_ids" class="form-control">
@ -95,17 +95,17 @@
</div>
<div class="modal-body m-h" ng-show="step === 4">
<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="form-group">
<label for="is_recurrent" translate>{{ 'admin_calendar.enabled' }}</label>
<label for="is_recurrent" translate>{{ 'app.admin.calendar.enabled' }}</label>
<input bs-switch
ng-model="availability.is_recurrent"
id="is_recurrent"
type="checkbox"
class="form-control"
switch-on-text="{{ 'yes' | translate }}"
switch-off-text="{{ 'no' | translate }}"
switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true"/>
<input type="hidden" name="availability[is_recurrent]" value="{{availability.is_recurrent}}"/>
</div>
@ -113,21 +113,21 @@
</div>
<div class="row">
<div class="form-group">
<label for="period">{{ 'admin_calendar.period' | translate }}</label>
<label for="period">{{ 'app.admin.calendar.period' | translate }}</label>
<select id="period"
name="period"
class="form-control"
ng-model="availability.period"
ng-required="availability.is_recurrent"
ng-disabled="!availability.is_recurrent">
<option value="week" ng-selected="availability.period == 'week'" translate>{{ 'admin_calendar.week' }}</option>
<option value="month" ng-selected="availability.period == 'month'" translate>{{ 'admin_calendar.month' }}</option>
<option value="week" ng-selected="availability.period == 'week'" translate>{{ 'app.admin.calendar.week' }}</option>
<option value="month" ng-selected="availability.period == 'month'" translate>{{ 'app.admin.calendar.month' }}</option>
</select>
</div>
</div>
<div class="row">
<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"
name="nb_periods"
class="form-control"
@ -139,7 +139,7 @@
</div>
<div class="row">
<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"
name="end_date"
class="form-control"
@ -152,30 +152,30 @@
</div>
<div class="modal-body m-h" ng-show="step === 5">
<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">
<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>
<li ng-repeat="slot in occurrences">{{slot.start_at | amDateFormat:'L LT'}} - {{slot.end_at | amDateFormat:'LT'}}</li>
</ul>
<div>
<span class="underline" translate>{{ 'admin_calendar.reservable' }}</span>
<span class="underline" translate>{{ 'app.admin.calendar.reservable' }}</span>
<span ng-bind-html="reservableName"></span>
</div>
<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>
</div>
</div>
</div>
</div>
<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="next()" translate>{{ 'admin_calendar.next' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</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>{{ 'app.admin.calendar.next' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
<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-default" ng-click="cancel()" translate>{{ 'cancel' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -7,7 +7,7 @@
</div>
<div class="col-md-8 b-l b-r-md">
<section class="heading-title">
<h1 translate>{{ 'icalendar.icalendar_import' }}</h1>
<h1 translate>{{ 'app.admin.icalendar.icalendar_import' }}</h1>
</section>
</div>
@ -24,15 +24,15 @@
<div class="col-sm-12 col-md-12 col-lg-9">
<div class="alert alert-info m-lg" translate>
{{ 'icalendar.intro' }}
{{ 'app.admin.icalendar.intro' }}
</div>
<div class="wrapper-lg">
<table class="table" ng-show="calendars.length > 0">
<thead>
<tr>
<th style="width: 35%;" translate>{{ 'icalendar.name' }}</th>
<th style="width: 35%;" translate>{{ 'icalendar.url' }}</th>
<th translate>{{ 'icalendar.display' }}</th>
<th style="width: 35%;" translate>{{ 'app.admin.icalendar.name' }}</th>
<th style="width: 35%;" translate>{{ 'app.admin.icalendar.url' }}</th>
<th translate>{{ 'app.admin.icalendar.display' }}</th>
<th style="width: 20%;"></th>
</tr>
</thead>
@ -40,7 +40,7 @@
<tr ng-repeat="calendar in calendars">
<td class="calendar-name">{{calendar.name}}</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">
<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>
@ -49,45 +49,45 @@
</tbody>
</table>
<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-addon">
<i class="fa fa-font"></i>
</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 class="input-group">
<div class="input-group-addon">
<i class="fa fa-link"></i>
</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 class="input-group">
<div class="input-group-addon">
<i class="fa fa-paint-brush"></i>
</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 class="input-group">
<div class="input-group-addon">
<i class="fa fa-paint-brush"></i>
</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 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
ng-model="newCalendar.text_hidden"
id="hideText"
type="checkbox"
class="form-control"
switch-on-text="{{ 'icalendar.hidden' | translate }}"
switch-off-text="{{ 'icalendar.shown' | translate }}"
switch-on-text="{{ 'app.admin.icalendar.hidden' | translate }}"
switch-off-text="{{ 'app.admin.icalendar.shown' | translate }}"
switch-animate="true"/>
</div>
<div class="m-t text-right">
<button role="button" class="btn btn-warning" ng-click="save()" ng-disabled="newImportForm.$invalid" translate>
{{ 'confirm' }}
{{ 'app.shared.buttons.confirm' }}
</button>
</div>
</form>

View File

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

View File

@ -2,21 +2,21 @@
<div class="form-group">
<div class="input-group">
<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 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">
<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 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 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>
<iframe name="export-frame" height="0" width="0" class="none"></iframe>
</div>
@ -25,12 +25,12 @@
<table class="table">
<thead>
<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('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%" 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: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: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: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%"><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')">{{ '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')">{{ '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')">{{ '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')">{{ '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')">{{ '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>
</tr>
</thead>
@ -50,13 +50,13 @@
<button class="btn btn-danger" ng-click="deleteMember(m.id)">
<i class="fa fa-trash"></i>
</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>
</td>
</tr>
</tbody>
</table>
<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>

View File

@ -15,21 +15,21 @@
<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}">
<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">
<input name="training[name]"
ng-model="training.name"
type="text"
class="form-control"
id="training_name"
placeholder="{{'trainings_form.name' | translate}}"
placeholder="{{'app.shared.trainings.name' | translate}}"
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 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="fileinput" data-provides="fileinput" ng-class="fileinputClass(training.training_image)">
<div class="fileinput-new thumbnail" style="width: 334px; height: 250px;">
@ -40,8 +40,8 @@
</div>
<div>
<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-exists" translate>{{ 'change' }}</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>{{ 'app.shared.buttons.change' }}</span>
<input type="file"
ng-model="training.training_image"
name="training[training_image_attributes][attachment]"
@ -49,7 +49,7 @@
required
bs-jasny-fileinput>
</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>
@ -57,16 +57,16 @@
<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">
<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>
<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 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">
<ui-select multiple ng-model="training.machine_ids" class="form-control" id="training_machines">
<ui-select-match>
@ -84,7 +84,7 @@
</div>
<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">
<input ng-model="training.nb_total_places"
type="number"
@ -98,7 +98,7 @@
<div class="form-group">
<label for="training[public_page]" class="control-label col-sm-2" translate>
{{ 'trainings_form.public_page' }}
{{ 'app.shared.trainings.public_page' }}
</label>
<div class="col-sm-10">
<input bs-switch
@ -106,8 +106,8 @@
name="training[public_page]"
type="checkbox"
class="form-control"
switch-on-text="{{ 'yes' | translate }}"
switch-off-text="{{ 'no' | translate }}"
switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-active="{{!training.disabled}}"
switch-animate="true"/>
<input type="hidden" name="training[public_page]" value="{{training.public_page}}">
@ -116,7 +116,7 @@
<div class="form-group">
<label for="training[disabled]" class="control-label col-sm-2" translate>
{{ 'trainings_form.disable_training' }}
{{ 'app.shared.trainings.disable_training' }}
</label>
<div class="col-sm-10">
<input bs-switch
@ -124,8 +124,8 @@
name="training[disabled]"
type="checkbox"
class="form-control"
switch-on-text="{{ 'yes' | translate }}"
switch-off-text="{{ 'no' | translate }}"
switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
ng-change="onDisableToggled()"
switch-animate="true"/>
<input type="hidden" name="training[disabled]" value="{{training.disabled}}">
@ -136,7 +136,7 @@
<div class="panel-footer no-padder">
<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"
ng-disabled="trainingForm.$invalid"/>
</div>

View File

@ -13,7 +13,7 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<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>
</div>
</div>
@ -22,6 +22,6 @@
<div class="row no-gutter">
<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>

View File

@ -7,7 +7,7 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title">
<h1 translate>{{ 'trainings_monitoring' }}</h1>
<h1 translate>{{ 'app.admin.trainings.trainings_monitoring' }}</h1>
</section>
</div>
@ -20,17 +20,17 @@
<div class="col-md-12">
<uib-tabset justified="true">
<uib-tab heading="{{ 'trainings' | translate }}">
<uib-tab heading="{{ 'app.admin.trainings.trainings' | translate }}">
<div class="m-t m-b">
<button type="button" class="btn btn-warning" ui-sref="app.admin.trainings_new">
<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>
<div class="form-group pull-right">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-filter"></i></span>
<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>
</div>
</div>
@ -39,9 +39,9 @@
<table class="table">
<thead>
<tr>
<th style="width:20%" translate>{{ 'name' }}</th>
<th style="width:40%" translate>{{ 'associated_machines' }}</th>
<th style="width:20%" translate>{{ 'number_of_tickets' }}</th>
<th style="width:20%" translate>{{ 'app.admin.trainings.name' }}</th>
<th style="width:40%" translate>{{ 'app.admin.trainings.associated_machines' }}</th>
<th style="width:20%" translate>{{ 'app.admin.trainings.number_of_tickets' }}</th>
<th style="width:20%"></th>
</tr>
</thead>
@ -53,7 +53,7 @@
<td>
<div class="buttons">
<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 class="btn btn-danger" ng-click="removeTraining($index, training)">
<i class="fa fa-trash-o"></i>
@ -65,9 +65,9 @@
</table>
</uib-tab>
<uib-tab heading="{{ 'trainings_monitoring' | translate }}">
<uib-tab heading="{{ 'app.admin.trainings.trainings_monitoring' | translate }}">
<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>
</div>
@ -75,8 +75,8 @@
<table class="table">
<thead>
<tr>
<th style="width:35%" translate>{{ 'training' }}</th>
<th style="width:65%" translate>{{ 'date' }}</th>
<th style="width:35%" translate>{{ 'app.admin.trainings.training' }}</th>
<th style="width:65%" translate>{{ 'app.admin.trainings.date' }}</th>
</tr>
</thead>
<tbody>
@ -84,16 +84,18 @@
<td>{{training_name}}</td>
<td>
<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-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-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">
<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>
</ul>
</uib-accordion-group>

View File

@ -1,19 +1,21 @@
<div class="modal-header">
<h1 translate>{{ 'training_validation' }}</h1>
<h1 translate>{{ 'app.admin.trainings.training_validation' }}</h1>
</div>
<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>
{{ 'you_can_validate_the_training_of_the_following_members' | translate }}</p>
<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">
<li ng-repeat="user in availability.reservation_users">
<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}}" />
</li>
</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 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-default" ng-click="cancel()" translate>{{ 'cancel' }}</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>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -7,14 +7,14 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md hide-b-r-lg">
<section class="heading-title">
<h1 translate>{{ 'calendar.calendar' }}</h1>
<h1 translate>{{ 'app.public.calendar.calendar' }}</h1>
</section>
</div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md hidden-lg">
<div class="heading-actions wrapper">
<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>
</div>
</div>
@ -38,7 +38,7 @@
<div class="col-lg-3 hidden-md hidden-sm hidden-xs">
<div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b small">
<h3 translate>{{ 'calendar.filter_calendar' }}</h3>
<h3 translate>{{ 'app.public.calendar.filter_calendar' }}</h3>
</div>
<div class="widget-content no-bg auto wrapper calendar-filter">
<ng-include src="'<%= asset_path "calendar/filter.html" %>'"></ng-include>
@ -53,7 +53,7 @@
<div class="widget">
<div class="modal-header">
<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 class="modal-body widget-content calendar-filter calendar-filter-aside">
<ng-include src="'<%= asset_path "calendar/filter.html" %>'"></ng-include>

View File

@ -2,7 +2,7 @@
<section class="heading">
<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>
</section>
@ -13,7 +13,7 @@
<div class="col-md-6">
<div class="widget panel b-a m m-t-lg">
<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 class="widget-content bg-light wrapper r-b">
<ul class="list-unstyled" ng-if="user.events_reservations.length > 0">
@ -24,25 +24,25 @@
<br/>
<span translate
translate-values="{NUMBER: r.nb_reserve_places}">
{{ 'NUMBER_normal_places_reserved' }}
{{ 'app.logged.dashboard.events.NUMBER_normal_places_reserved' }}
</span>
<span ng-repeat="ticket in r.tickets">
<br/>
<span translate
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>
</li>
</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 class="col-md-6">
<div class="widget panel b-a m m-t-lg">
<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 class="widget-content bg-light auto wrapper r-b">
<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>
</li>
</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>

View File

@ -2,7 +2,7 @@
<section class="heading">
<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>
</section>
@ -15,9 +15,9 @@
<table class="table" ng-if="user.invoices.length > 0">
<thead>
<tr>
<th style="width:21%" translate>{{ 'reference_number' }}</th>
<th style="width:21%" translate>{{ 'date' }}</th>
<th style="width:21%" translate>{{ 'price' }}</th>
<th style="width:21%" translate>{{ 'app.logged.dashboard.invoices.reference_number' }}</th>
<th style="width:21%" translate>{{ 'app.logged.dashboard.invoices.date' }}</th>
<th style="width:21%" translate>{{ 'app.logged.dashboard.invoices.price' }}</th>
<th style="width:20%"></th>
</tr>
</thead>
@ -30,17 +30,17 @@
<td>
<div class="buttons">
<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 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>
</div>
</td>
</tr>
</tbody>
</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>

View File

@ -8,15 +8,15 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-10 b-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">
<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.settings" translate>{{ '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.trainings" translate>{{ '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" ng-hide="fablabWithoutInvoices"><a class="text-black" href="#" ui-sref="app.logged.dashboard.invoices" translate>{{ '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.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>{{ 'app.public.common.my_settings' }}</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>{{ 'app.public.common.my_trainings' }}</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>{{ 'app.public.common.my_invoices' }}</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>
</section>
</div>

View File

@ -2,7 +2,7 @@
<section class="heading">
<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>
</section>
@ -10,7 +10,7 @@
<div class="row no-gutter">
<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>

View File

@ -2,7 +2,7 @@
<section class="heading">
<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>
</section>
@ -10,17 +10,17 @@
<div class="row no-gutter">
<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 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="panel-heading b-b clearfix">
<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="badge" ng-if="project.state == 'draft'" translate>{{ 'rough_draft' }}</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>{{ 'app.logged.dashboard.projects.rough_draft' }}</span>
<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 class="widget-content bg-light clearfix">
@ -28,7 +28,7 @@
<div class="col-sm-12 col-md-4 col-lg-4">
<div class="widget panel b-a r-n m-t-md">
<div class="panel-heading b-b small">
<h3 translate>{{ 'description' }}</h3>
<h3 translate>{{ 'app.logged.dashboard.projects.description' }}</h3>
</div>
<div class="widget-content no-bg wrapper text-black-light">
<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="widget panel b-a r-n m-t-md">
<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 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">
<li ng-repeat="m in project.machines">{{m.name}}</li>
</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">
<li ng-repeat="c in project.components">{{c.name}}</li>
</ul>
@ -57,7 +57,7 @@
<div class="col-sm-12 col-md-4 col-lg-4">
<div class="widget panel b-a r-n m-t-md">
<div class="panel-heading b-b small">
<h3 translate>{{ 'collaborators' }}</h3>
<h3 translate>{{ 'app.logged.dashboard.projects.collaborators' }}</h3>
</div>
<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">

View File

@ -1,6 +1,6 @@
<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>
<div class="font-sbold m-t-sm">{{user.name}}</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 class="widget-content no-bg b-b auto wrapper">
<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">
<uib-alert type="warning">
<span class="text-black font-sbold">{{getUserGroup().name}}</span>
@ -26,7 +26,7 @@
ng-click="group.change = !group.change"
ng-hide="user.subscribed_plan.name || user.role === 'admin'"
translate>
{{ 'edit_profile.i_want_to_change_group' }}
{{ 'app.logged.dashboard.settings.i_want_to_change_group' }}
</button>
</div>
<div ng-show="group.change">
@ -35,57 +35,57 @@
</div>
</div>
<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">
<uib-alert type="warning">
<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>
</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 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">
<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 ng-repeat="t in user.trainings">
{{t.name}} - {{ 'edit_profile.approved' | translate }}
{{t.name}} - {{ 'app.logged.dashboard.settings.approved' | translate }}
</li>
</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 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">
<li ng-repeat="p in user.all_projects">
{{p.name}}
</li>
</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 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 class='label label-success text-white'>{{t.name}}</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 class="widget-content no-bg b-b auto wrapper">
<h3 class="text-u-c" translate>{{ 'edit_profile.cookies' }}</h3>
<div ng-show="cookiesStatus === 'accept'" translate>{{ 'edit_profile.cookies_accepted' }}</div>
<div ng-show="cookiesStatus === 'decline'" translate>{{ 'edit_profile.cookies_declined' }}</div>
<div ng-hide="cookiesStatus" translate>{{ 'edit_profile.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>
<h3 class="text-u-c" translate>{{ 'app.logged.dashboard.settings.cookies' }}</h3>
<div ng-show="cookiesStatus === 'accept'" translate>{{ 'app.logged.dashboard.settings.cookies_accepted' }}</div>
<div ng-show="cookiesStatus === 'decline'" translate>{{ 'app.logged.dashboard.settings.cookies_declined' }}</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>{{ 'app.logged.dashboard.settings.reset_cookies' }}</button>
</div>
<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>
@ -94,7 +94,7 @@
<div class="col-sm-12 col-md-12 col-lg-9">
<div class="widget panel b-a m m-t-lg">
<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>
<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">
@ -108,25 +108,25 @@
<div class="panel-body row">
<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">
<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>
<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 class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<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>
</div>
</div>
</section>
<section class="panel panel-default bg-light m">
<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 -->
</section>
</div>
<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>
</form>
</div>

View File

@ -2,7 +2,7 @@
<section class="heading">
<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>
</section>
@ -13,7 +13,7 @@
<div class="col-md-4">
<div class="widget panel b-a m m-t-lg">
<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 class="widget-content bg-light wrapper r-b">
<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>
</li>
</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 class="col-md-4">
<div class="widget panel b-a m m-t-lg">
<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 class="widget-content bg-light auto wrapper r-b">
<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>
</li>
</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 class="col-md-4">
<div class="widget panel b-a m m-t-lg">
<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 class="widget-content bg-light auto wrapper r-b">
<ul class="list-unstyled" ng-if="user.trainings.length > 0">
@ -51,7 +51,7 @@
<span class="font-sbold">{{t.name}}</span>
</li>
</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>

View File

@ -2,7 +2,7 @@
<section class="heading">
<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>
</section>
@ -10,11 +10,11 @@
<div class="row no-gutter">
<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 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>

View File

@ -7,13 +7,13 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title">
<h1 translate>{{ 'the_fablab_s_events' }}</h1>
<h1 translate>{{ 'app.public.events_list.the_fablab_s_events' }}</h1>
</section>
</div>
<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">
<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>
</div>
</div>
@ -23,19 +23,19 @@
<div class="row m-b-md">
<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">
<option value="" translate>{{ 'all_categories' }}</option>
<option value="" translate>{{ 'app.public.events_list.all_categories' }}</option>
</select>
</div>
<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">
<option value="" translate>{{ 'all_themes' }}</option>
<option value="" translate>{{ 'app.public.events_list.all_themes' }}</option>
</select>
</div>
<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">
<option value="" translate>{{ 'for_all' }}</option>
<option value="" translate>{{ 'app.public.events_list.for_all' }}</option>
</select>
</div>
</div>
@ -53,10 +53,10 @@
<h5 class="text-xs">{{event.category.name}}</h5>
<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-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">{{ '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" translate>{{ 'app.public.events_list.free_admission' }}</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>
<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>
<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_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 == -1" translate>{{ '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_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>{{ 'app.public.events_list.sold_out' }}</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>{{ 'app.public.events_list.free_entry' }}</span>
</div>
</div>
@ -86,7 +86,7 @@
<div class="row">
<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>

View File

@ -5,7 +5,7 @@
<div class="row wrapper">
<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-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">
<div class="panel-heading b-b small">
<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">
<i class="fa fa-circle fa-stack-2x text-yellow"></i>
<i class="fa fa-twitter fa-stack-1x fa-inverse text-white"></i>
</span>
</a>
</div>
<h2 translate>{{ 'latest_tweets' }}</h2>
<h2 translate>{{ 'app.public.home.latest_tweets' }}</h2>
</div>
<ul class="widget-content list-group list-group-lg no-bg auto">
@ -44,7 +44,7 @@
<section class="widget panel b-a" >
<div class="panel-heading small b-b">
<!-- <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 class="row m-n">
@ -64,11 +64,11 @@
</div>
<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 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>
@ -80,7 +80,7 @@
</div>
<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)">
@ -106,14 +106,14 @@
<div class="row">
<div class="col-sm-6 row m-b-sm">
<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-show="isOneDayEvent(event)">{{ 'on_the_date' | translate:{DATE:(event.start_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)">{{ 'app.public.home.on_the_date' | translate:{DATE:(event.start_date | amDateFormat:'L')} }}</h6>
</div>
<div class="col-sm-6 row m-b-sm">
<i class="fa fa-clock-o red col-xs-3 padder-icon"></i>
<h6 class="m-n col-xs-9">
<span ng-if="event.all_day == 'true'" translate>{{ '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 == 'true'" translate>{{ 'app.public.home.all_day' }}</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>
</div>
</div>
@ -122,22 +122,22 @@
<div class="col-sm-6 row m-b-sm">
<i class="fa fa-user red col-xs-3 padder-icon"></i>
<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_total_places" translate>{{ '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_free_places > 0">{{ 'app.public.home.still_available' | translate }} {{event.nb_free_places}}</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>{{ 'app.public.home.event_full' }}</span>
</h6>
</div>
<div class="col-sm-6 row m-b-sm">
<i class="fa fa-bookmark red col-xs-3 padder-icon"></i>
<h6 class="m-n col-xs-9">
<span ng-if="event.amount == 0" translate>{{ 'free_admission' }}</span>
<span ng-if="event.amount > 0">{{ 'full_price' | translate }} {{event.amount | currency}}</span>
<span ng-if="event.amount == 0" translate>{{ 'app.public.home.free_admission' }}</span>
<span ng-if="event.amount > 0">{{ 'app.public.home.full_price' | translate }} {{event.amount | currency}}</span>
</h6>
</div>
</div>
<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>

View File

@ -7,13 +7,13 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<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>
</div>
<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">
<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>
</div>
</div>
@ -26,7 +26,7 @@
<div class="input-group col-md-3 m-l-lg m-b">
<span class="input-group-addon"><i class="fa fa-filter"></i></span>
<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>
</div>
</div>
@ -48,13 +48,13 @@
<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">
<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 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)">
<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>

View File

@ -19,9 +19,9 @@
class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs"
ng-if="!isAuthorized('admin')"
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>
</section>
@ -48,7 +48,7 @@
<div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b small">
<h3 translate>{{ 'technical_specifications' }}</h3>
<h3 translate>{{ 'app.public.machines_show.technical_specifications' }}</h3>
</div>
<div class="widget-content no-bg wrapper">
<h3></h3>
@ -59,7 +59,7 @@
<section class="widget panel b-a m" ng-if="machine.machine_files_attributes">
<div class="panel-heading b-b">
<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>
<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">
<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>
<ul class="widget-content list-group list-group-lg no-bg auto">

View File

@ -7,7 +7,7 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title">
<h1 translate>{{ 'the_fablab_members' }}</h1>
<h1 translate>{{ 'app.logged.members.the_fablab_members' }}</h1>
</section>
</div>
@ -21,10 +21,10 @@
<table class="table">
<thead>
<tr>
<th style="width:15%" translate>{{ 'avatar' }}</th>
<th style="width:15%" translate>{{ 'user' }}</th>
<th style="width:15%" translate>{{ 'pseudonym' }}</th>
<th style="width:15%" translate>{{ 'email_address' }}</th>
<th style="width:15%" translate>{{ 'app.logged.members.avatar' }}</th>
<th style="width:15%" translate>{{ 'app.logged.members.user' }}</th>
<th style="width:15%" translate>{{ 'app.logged.members.pseudonym' }}</th>
<th style="width:15%" translate>{{ 'app.logged.members.email_address' }}</th>
<th style="width:10%"></th>
</tr>
</thead>
@ -41,7 +41,7 @@
<td>
<div class="buttons">
<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>
</div>
</td>
@ -49,9 +49,9 @@
</tbody>
</table>
<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>
<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>
</section>

View File

@ -15,11 +15,11 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<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>
</div>
</div>
</section>
<ng-include src="'<%= asset_path 'shared/publicProfile.html' %>'"></ng-include>
<ng-include src="'<%= asset_path "shared/publicProfile.html" %>'"></ng-include>
</div>

View File

@ -7,7 +7,7 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title">
<h1 translate>{{ 'notifications_center' }}</h1>
<h1 translate>{{ 'app.logged.notifications.notifications_center' }}</h1>
</section>
</div>
@ -19,14 +19,14 @@
<div class="row">
<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">
<thead>
<tr>
<th style="width:10%"></th>
<th style="width:20%" translate>{{ 'date' }}</th>
<th style="width:70%" translate>{{ 'notif_title' }}</th>
<th style="width:20%" translate>{{ 'app.logged.notifications.date' }}</th>
<th style="width:70%" translate>{{ 'app.logged.notifications.notif_title' }}</th>
</tr>
</thead>
@ -42,13 +42,13 @@
</tr>
<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>
</tbody>
</table>
<div ng-hide="notificationsRead.length == 0 && notificationsUnread.length < total">
<h5 translate>{{ 'archives' }}</h5>
<h5 translate>{{ 'app.logged.notifications.archives' }}</h5>
<table class="table">
<thead>
@ -73,7 +73,7 @@
<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>
@ -81,7 +81,7 @@
</table>
</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>

View File

@ -7,7 +7,7 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l ">
<section class="heading-title">
<h1 translate>{{ 'subcriptions' }}</h1>
<h1 translate>{{ 'app.public.plans.subcriptions' }}</h1>
</section>
</div>
</div>
@ -44,24 +44,24 @@
<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 }">
<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 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 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">
<span translate>{{ 'i_choose_that_plan' }}</span>
<span translate>{{ 'app.public.plans.i_choose_that_plan' }}</span>
</button>
</div>
<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>
@ -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)">
<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>
</div>
@ -87,8 +87,8 @@
<section class="widget panel b-a m m-t-lg" ng-show="ctrl.member">
<div class="panel-heading b-b">
<h3 ng-show="currentUser.role != 'admin'" translate>{{ '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>{{ 'app.public.plans.my_group' }}</h3>
<h3 ng-show="currentUser.role === 'admin'" translate translate-values="{GENDER:getGender(currentUser)}">{{ 'app.public.plans.his_group' }}</h3>
</div>
<div class="widget-content no-bg auto wrapper">
<div ng-show="!group.change">
@ -99,70 +99,70 @@
ng-click="group.change = !group.change"
ng-show="(!selectedPlan && ctrl.member && !ctrl.member.subscribed_plan && ctrl.member.subscription) || (!paid.plan)"
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 ng-show="group.change">
<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"
ng-click="selectGroup()"
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>
</section>
<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">
<h3 translate>{{ 'summary' }}</h3>
<h3 translate>{{ 'app.public.plans.summary' }}</h3>
</div>
<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">
<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>
</section>
<section class="widget panel b-a m m-t-lg" ng-if="selectedPlan && ctrl.member">
<div class="panel-heading b-b">
<h3 translate>{{ 'summary' }}</h3>
<h3 translate>{{ 'app.public.plans.summary' }}</h3>
</div>
<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">
<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>
<coupon show="!ctrl.member.subscribed_plan" coupon="coupon.applied" total="selectedPlan.amount" user-id="{{ctrl.member.id}}"></coupon>
</div>
<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>
</section>
<section class="widget panel b-a m m-t-lg" ng-if="paid.plan">
<div class="panel-heading b-b">
<h3 translate>{{ 'summary' }}</h3>
<h3 translate>{{ 'app.public.plans.summary' }}</h3>
</div>
<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">
<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 class="alert alert-success">{{ '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>
<div class="alert alert-success">{{ 'app.public.plans.thank_you_your_subscription_is_successful' | translate }}<br>
<a ui-sref="app.logged.dashboard.invoices" translate>{{ 'app.public.plans.your_invoice_will_be_available_soon_from_your_dashboard' }}</a></div>
</div>
</section>

View File

@ -1,15 +1,15 @@
<div class="modal-header">
<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 class="modal-body">
<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>
</div>
<div class="modal-footer">
<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>

View File

@ -7,13 +7,13 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title">
<h1 translate>{{ 'projects_list.the_fablab_projects' }}</h1>
<h1 translate>{{ 'app.public.projects_list.the_fablab_projects' }}</h1>
</section>
</div>
<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">
<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>
</div>
</div>
@ -23,16 +23,16 @@
<section class="m-lg">
<div class="row m-b-md">
<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">
<label for="searchOverWholeNetwork" class="control-label m-r text-sm" translate>{{ 'projects_list.search_over_the_whole_network' }}</label>
<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>{{ 'app.public.projects_list.search_over_the_whole_network' }}</label>
<input bs-switch
ng-model="openlab.searchOverWholeNetwork"
type="checkbox"
class="form-control"
switch-on-text="{{ 'yes' | translate }}"
switch-off-text="{{ 'no' | translate }}"
switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true"
ng-change="searchOverWholeNetworkChanged()"
/>
@ -44,7 +44,7 @@
<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"/>
<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>
@ -53,27 +53,27 @@
<span ng-if="!openlab.searchOverWholeNetwork">
<div class="col-md-3 m-b" ng-show="isAuthenticated()">
<select ng-model="search.from" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control">
<option value="" translate>{{ 'projects_list.all_projects' }}</option>
<option value="mine" translate>{{ 'projects_list.my_projects' }}</option>
<option value="collaboration" translate>{{ 'projects_list.projects_to_whom_i_take_part_in' }}</option>
<option value="" translate>{{ 'app.public.projects_list.all_projects' }}</option>
<option value="mine" translate>{{ 'app.public.projects_list.my_projects' }}</option>
<option value="collaboration" translate>{{ 'app.public.projects_list.projects_to_whom_i_take_part_in' }}</option>
</select>
</div>
<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">
<option value="" translate>{{ 'projects_list.all_machines' }}</option>
<option value="" translate>{{ 'app.public.projects_list.all_machines' }}</option>
</select>
</div>
<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">
<option value="" translate>{{ 'projects_list.all_themes' }}</option>
<option value="" translate>{{ 'app.public.projects_list.all_themes' }}</option>
</select>
</div>
<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">
<option value="" translate>{{ 'projects_list.all_materials' }}</option>
<option value="" translate>{{ 'app.public.projects_list.all_materials' }}</option>
</select>
</div>
</span>
@ -81,7 +81,7 @@
<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="card card-project">
@ -99,7 +99,7 @@
</div>
<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 class="card-overlay">
@ -119,7 +119,7 @@
<div class="row">
<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>
</section>

View File

@ -21,8 +21,8 @@
<span class="btn btn-default btn-file"
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">
<span class="fileinput-new" translate>{{ 'add_an_avatar' }}</span>
<span class="fileinput-exists" translate>{{ 'change' }}</span>
<span class="fileinput-new" translate>{{ 'app.shared.user.add_an_avatar' }}</span>
<span class="fileinput-exists" translate>{{ 'app.shared.buttons.change' }}</span>
<input type="file" name="user[profile_attributes][user_avatar_attributes][attachment]">
</span>
@ -47,7 +47,7 @@
value="true"
ng-disabled="preventField['profile.gender'] && user.statistic_profile.gender && !userForm['user[statistic_profile_attributes][gender]'].$dirty"
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 class="checkbox-inline btn btn-default">
<input type="radio"
@ -55,81 +55,81 @@
ng-model="user.statistic_profile.gender"
value="false"
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>
<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 class="form-group" ng-class="{'has-error': userForm['user[username]'].$dirty && userForm['user[username]'].$invalid}">
<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>
<input type="text"
name="user[username]"
ng-model="user.username"
class="form-control"
id="user_username"
placeholder="{{ 'pseudonym' | translate }}"
placeholder="{{ 'app.shared.user.pseudonym' | translate }}"
ng-disabled="preventField['user.username'] && user.username && !userForm['user[username]'].$dirty"
required/>
</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 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">
<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"
name="user[profile_attributes][last_name]"
ng-model="user.profile.last_name"
class="form-control"
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"
required/>
</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 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">
<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"
name="user[profile_attributes][first_name]"
ng-model="user.profile.first_name"
class="form-control"
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"
required/>
</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 class="form-group" ng-class="{'has-error': userForm['user[email]'].$dirty && userForm['user[email]'].$invalid}">
<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"
name="user[email]"
ng-model="user.email"
class="form-control"
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"
required/>
</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 class="form-group" ng-hide="preventPassword">
<button class="btn btn-warning btn-block"
ng-click="password.change = !password.change; $event.stopPropagation(); $event.preventDefault()"
translate>{{ 'change_password' }}</button>
translate>{{ 'app.shared.user.change_password' }}</button>
</div>
@ -141,12 +141,12 @@
ng-model="user.password"
class="form-control"
id="user_password"
placeholder="{{ 'new_password' | translate }}"
placeholder="{{ 'app.shared.user.new_password' | translate }}"
ng-minlength="8"
required/>
</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.minlength" translate>{{ 'password_is_too_short' }}</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>{{ 'app.shared.user.password_is_too_short' }}</span>
</div>
<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"
class="form-control"
id="user_password_confirmation"
placeholder="{{ 'confirmation_of_new_password' | translate }}"
placeholder="{{ 'app.shared.user.confirmation_of_new_password' | translate }}"
ng-minlength="8"
required
match="user.password"/>
</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.minlength" translate>{{ '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]'].$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>{{ 'app.shared.user.confirmation_of_password_is_too_short' }}</span>
<span class="help-block" ng-show="userForm['user[password_confirmation]'].$error.match" translate>{{ 'app.shared.user.confirmation_mismatch_with_password' }}</span>
</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="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"
name="user[invoicing_profile_attributes][organization_attributes][id]"
ng-value="user.invoicing_profile.organization.id" />
@ -177,16 +177,16 @@
name="user[invoicing_profile_attributes][organization_attributes][name]"
ng-model="user.invoicing_profile.organization.name"
class="form-control"
placeholder="{{ 'organization_name' | translate }}"
placeholder="{{ 'app.shared.user.organization_name' | translate }}"
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">
</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 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">
<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"
name="user[invoicing_profile_attributes][organization_attributes][address_attributes][id]"
ng-value="user.invoicing_profile.organization.address.id" />
@ -194,16 +194,16 @@
name="user[invoicing_profile_attributes][organization_attributes][address_attributes][address]"
ng-model="user.invoicing_profile.organization.address.address"
class="form-control"
placeholder="{{ 'organization_address' | translate }}"
placeholder="{{ 'app.shared.user.organization_address' | translate }}"
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">
</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 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">
<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"
id="user_birthday"
class="form-control"
@ -211,7 +211,7 @@
uib-datepicker-popup="{{datePicker.format}}"
datepicker-options="datePicker.options"
is-open="datePicker.opened"
placeholder="{{ 'date_of_birth' | translate }}"
placeholder="{{ 'app.shared.user.date_of_birth' | translate }}"
ng-click="openDatePicker($event)"
ng-disabled="preventField['profile.birthday'] && user.statistic_profile.birthday && !userForm['user[statistic_profile_attributes][birthday]'].$dirty"
required/>
@ -219,12 +219,12 @@
name="user[statistic_profile_attributes][birthday]"
value="{{user.statistic_profile.birthday | toIsoDate}}" />
</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 class="form-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"
name="user[invoicing_profile_attributes][address_attributes][id]"
ng-value="user.invoicing_profile.address.id" />
@ -234,35 +234,35 @@
class="form-control"
id="user_address"
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 class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][phone]'].$dirty && userForm['user[profile_attributes][phone]'].$invalid}">
<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"
name="user[profile_attributes][phone]"
ng-model="user.profile.phone"
class="form-control"
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-required="phoneRequired"/>
</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 class="form-group" ng-class="{'has-error': userForm['user[profile_attributes][website]'].$dirty && userForm['user[profile_attributes][website]'].$invalid}">
<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"
name="user[profile_attributes][website]"
ng-model="user.profile.website"
class="form-control"
id="user_website"
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"/>
</div>
</div>
@ -275,13 +275,13 @@
ng-model="user.profile.job"
class="form-control"
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"/>
</div>
</div>
<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]"
ng-model="user.profile.interest"
rows="5"
@ -292,7 +292,7 @@
</div>
<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]"
ng-model="user.profile.software_mastered"
rows="5"
@ -304,28 +304,28 @@
<!-- allow contact-->
<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
ng-model="user.is_allow_contact"
id="allowContact"
type="checkbox"
class="form-control"
switch-on-text="{{ 'yes' | translate }}"
switch-off-text="{{ 'no' | translate }}"
switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true"/>
<input type="hidden" name="user[is_allow_contact]" value="{{user.is_allow_contact}}"/>
</div>
<!-- allow receive newsletter -->
<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
ng-model="user.is_allow_newsletter"
id="allowNewsletter"
type="checkbox"
class="form-control"
switch-on-text="{{ 'yes' | translate }}"
switch-off-text="{{ 'no' | translate }}"
switch-on-text="{{ 'app.shared.buttons.yes' | translate }}"
switch-off-text="{{ 'app.shared.buttons.no' | translate }}"
switch-animate="true" />
<input type="hidden" name="user[is_allow_newsletter]" value="{{user.is_allow_newsletter}}"/>
</div>
@ -333,7 +333,7 @@
<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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][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="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"
name="user[profile_attributes][flickr]"
ng-model="user.profile.flickr"

View File

@ -1,10 +1,10 @@
<div class="widget panel b-a m">
<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 class="widget-content no-bg auto wrapper">
<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>
</ui-select-match>
<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>
</div>
<div class="modal-footer">
<button class="btn btn-info" ng-click="ok()" translate>{{ 'confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button>
<button class="btn btn-info" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -10,12 +10,11 @@
<li>
<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>
{{ 'about_the_fablab' | translate:{ GENDER: nameGenre, NAME: fablabName } }}
{{ 'app.public.common.about_the_fablab' | translate:{ GENDER: nameGenre, NAME: fablabName } }}
</a>
<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>
{{ 'return' | translate }}
</div>
{{ 'app.public.common.return' | translate }}
</a>
</li>
</ul>
@ -34,20 +33,20 @@
</span>
</a>
<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.settings" translate>{{ 'my_settings' }}</a></li>
<li><a ui-sref="app.logged.dashboard.projects" translate>{{ 'my_projects' }}</a></li>
<li><a ui-sref="app.logged.dashboard.trainings" translate>{{ 'my_trainings' }}</a></li>
<li><a ui-sref="app.logged.dashboard.events" translate>{{ '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.wallet" translate>{{ 'my_wallet' }}</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>{{ 'app.public.common.my_settings' }}</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>{{ 'app.public.common.my_trainings' }}</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>{{ 'app.public.common.my_invoices' }}</a></li>
<li><a ui-sref="app.logged.dashboard.wallet" translate>{{ 'app.public.common.my_wallet' }}</a></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>
</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()">
<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>
</ul>

View File

@ -28,11 +28,12 @@
<div class="col-lg-7 profile-top-infos">
<div class="text-xl font-ebold upper">{{user.username}}</div>
<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">
<small translate>{{ 'last_activity_' }}</small>
<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>{{ 'email_address' }}</small>
<div ng-show="user.last_sign_in_at">
<small translate translate-values="{DATE:(user.last_sign_in_at | amDateFormat: 'LL')}">{{ 'app.shared.public_profile.last_activity_html' }}</small>
</div>
<small translate>{{ 'app.shared.public_profile.email_address' }}</small>
<div class="text-lt font-bold break-word">{{user.email}}</div>
</div>
</div>
@ -52,11 +53,11 @@
<div class="wrapper m-t-xl m-b">
<div class="row m-b">
<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>
<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>
</div>
@ -70,23 +71,23 @@
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="widget panel b-a m ">
<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> -->
<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'">
{{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 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>
</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 class="widget panel b-a m ">
<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">
<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">
@ -104,13 +105,13 @@
<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="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 class="card-overlay">
<div class="btn-group">
<div class="btn btn-default" ng-click="showProject(project)">
{{ 'consult' | translate }}
{{ 'app.shared.buttons.consult' | translate }}
</div>
<div class="btn btn-default" ui-sref="app.logged.projects_edit({id:project.id})" ng-if="isAuthorized('admin')">
<i class="fa fa-edit"></i>
@ -122,7 +123,7 @@
</a>
</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>

View File

@ -7,13 +7,13 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title">
<h1 translate>{{ 'spaces_list.the_spaces' }}</h1>
<h1 translate>{{ 'app.public.spaces_list.the_spaces' }}</h1>
</section>
</div>
<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">
<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>
</div>
</div>
@ -26,7 +26,7 @@
<div class="input-group col-md-3 m-l-lg m-b">
<span class="input-group-addon"><i class="fa fa-filter"></i></span>
<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>
</div>
</div>
@ -49,13 +49,13 @@
<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">
<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 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)">
<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>

View File

@ -15,9 +15,9 @@
<div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md">
<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>
</section>
@ -44,7 +44,7 @@
<div class="widget panel b-a m m-t-lg">
<div class="panel-heading b-b small">
<h3 translate>{{ 'space_show.characteristics' }}</h3>
<h3 translate>{{ 'app.public.space_show.characteristics' }}</h3>
</div>
<div class="widget-content no-bg wrapper">
<h3></h3>
@ -55,7 +55,7 @@
<section class="widget panel b-a m" ng-if="space.space_files_attributes">
<div class="panel-heading b-b">
<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>
<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">
<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>
<ul class="widget-content list-group list-group-lg no-bg auto">

View File

@ -7,7 +7,7 @@
</div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title">
<h1 translate>{{ 'the_trainings' }}</h1>
<h1 translate>{{ 'app.public.trainings_list.the_trainings' }}</h1>
</section>
</div>
@ -36,12 +36,12 @@
<div class="text-center clearfix">
<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)">
<i class="fa fa-bookmark"></i> {{ 'book' | translate }}
<i class="fa fa-bookmark"></i> {{ 'app.public.trainings_list.book' | translate }}
</div>
</div>
<div class="col-sm-6 no-padder">
<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>

View File

@ -15,9 +15,9 @@
<div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md">
<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>
</section>
</div>

View File

@ -1,6 +1,6 @@
<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'">{{'wallet_amount'}}</h4>
<h4 translate ng-if="view !== 'member_edit'">{{'app.shared.wallet.your_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">{{wallet.amount | currency}}</div>
</div>

View File

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

View File

@ -6,11 +6,13 @@ class API::TranslationsController < API::ApiController
def show
@translations = I18n.t params[:state]
if @translations.class.name == String.name && @translations.start_with?('translation missing')
render json: { error: @translations }, status: :unprocessable_entity
translations = I18n.t params[:state]
if translations.class.name == String.name && translations.start_with?('translation missing')
render json: { error: translations }, status: :unprocessable_entity
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

View File

@ -13,7 +13,6 @@ fr:
calendar:
# gestion des créneaux machines et formations
admin_calendar:
calendar_management: "Gestion du calendrier"
trainings: "Formations"
machines: "Machines"
@ -88,7 +87,6 @@ fr:
view_reservations: "Voir les réservations"
legend: "Légende"
icalendar:
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."
@ -122,16 +120,21 @@ fr:
trainings:
# suivre et surveiller les formations
training: "Formation"
trainings_monitoring: "Suivi formations"
trainings: "Formations"
add_a_new_training: "Ajouter une nouvelle formation"
name: "Nom"
associated_machines: "Machines associées"
number_of_tickets: "Nombre de places"
select_a_training: "Sélectionnez une formation"
training: "Formation"
date: "Date"
year_NUMBER: "Année {NUMBER}"
month_of_NAME: "Mois de {NAME}"
NUMBER_reservation: "{NUMBER} {NUMBER, plural, =0{réservation} one{réservation} other{réservations}}"
none: "Aucune"
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 :"
deleted_user: "Utilisateur supprimé"
no_reservation: "Aucune réservation"
@ -558,12 +561,16 @@ fr:
# gestion des utilisateurs, des groupes, des étiquettes, etc.
users_management: "Gestion des utilisateurs"
members: "Membres"
subscriptions: "Abonnements"
search_for_an_user: "Recherchez un utilisateur"
add_a_new_member: "Ajouter un nouveau membre"
reservations: "Réservations"
surname: "Nom"
first_name: "Prénom"
email: "Courriel"
phone: "Tel."
user_type: "Type utilisateur"
subscription: "Abonnement"
display_more_users: "Afficher plus d'utilisateurs ..."
administrators: "Administrateurs"
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é."
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."
tags: "Étiquettes"
add_a_tag: "Ajouter une étiquette"
tag_name: "Nom de l'étiquette"
new_tag_successfully_saved: "La nouvelle étiquette a bien été enregistrée."

View File

@ -32,9 +32,8 @@ fr:
profile:
empty: ''
settings:
edit_profile:
# 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 !"
your_subscription_expires_on_: "Votre abonnement expire le"
no_subscriptions: "Aucun abonnement"
@ -82,23 +81,37 @@ fr:
projects:
# tableau de bord : mes projets
you_dont_have_any_projects: "Vous n'avez aucun projet."
add_a_project: "Ajouter un projet"
author: "Auteur"
collaborator: "Collaborateur"
rough_draft: "Brouillon"
description: "Description"
machines_and_materials: "Machines et matériaux"
machines: "Machines"
materials: "Matériaux"
collaborators: "Les collaborateurs"
trainings:
# tableau de bord : mes formations
your_next_trainings: "Vos prochaines formations"
your_previous_trainings: "Vos formations passées"
your_approved_trainings: "Vos formations validées"
no_trainings: "Aucune formation"
events:
# tableau de bord : mes évènements
your_next_events: "Vos prochains évènements"
no_events_to_come: "Aucun évènement à venir"
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_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{place {NAME} réservée} other{places {NAME} réservées}}"
invoices:
# tableau de bord : mes factures
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:
# profil public d'un membre
@ -110,6 +123,9 @@ fr:
display_more_members: "Afficher plus de membres ..."
no_members_for_now: "Pas de membres pour le moment"
avatar: "Avatar"
user: "Utilisateur"
pseudonym: "Pseudonyme"
email_address: "Adresse électronique"
projects_new:
# ajouter un nouveau projet
@ -154,6 +170,7 @@ fr:
notifications:
notifications_center: "Centre de notifications"
mark_all_as_read: "Tout marquer comme lu"
date: "Date"
notif_title: "Intitulé"
no_new_notifications: "Aucune nouvelle notification."
archives: "Archives"

View File

@ -45,7 +45,6 @@ fr:
# menu de gauche (partie admin)
trainings_monitoring: "Suivi formations"
select_a_training: "Sélectionnez une formation"
manage_the_calendar: "Gérer le calendrier"
manage_the_users: "Gérer les utilisateurs"
manage_the_invoices: "Gérer les factures"
@ -161,7 +160,6 @@ fr:
projects_list:
# galerie des projets
projects_list:
the_fablab_projects: "Les projets du FabLab"
add_a_project: "Ajouter un projet"
search_over_the_whole_network: "Chercher sur tout le réseau Fab Manager"
@ -204,7 +202,6 @@ fr:
machines_list:
# liste des machines
machines_list:
the_fablab_s_machines: "Les machines du FabLab"
add_a_machine: "Ajouter une machine"
book: "Réserver"
@ -216,6 +213,7 @@ fr:
machines_show:
# détail d'une machine
book_this_machine: "Réserver cette machine"
technical_specifications: "Caractéristiques techniques"
files_to_download: "Fichiers à télécharger"
projects_using_the_machine: "Projets utilisant la machine"
_or_the_: " ou la "
@ -225,6 +223,7 @@ fr:
trainings_list:
# liste des formations
book: "Réserver"
the_trainings: "Les formations"
training_show:
@ -246,9 +245,14 @@ fr:
his_group: "Son 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"
summary: "Résumé"
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 !"
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é."
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."
@ -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."
subscription_confirmation: "Validation de l'abonnement"
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:
# liste des évènements du fablab
@ -267,6 +272,10 @@ fr:
free_admission: "Gratuit"
still_available: "place(s) disponible(s)"
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:
# détails d'un événement et réservation
@ -301,7 +310,6 @@ fr:
calendar:
# calendrier publique
calendar:
calendar: "Calendrier"
show_unavailables: "Afficher les créneaux non disponibles"
filter_calendar: "Filtrer le calendrier"
@ -313,7 +321,6 @@ fr:
spaces_list:
# liste des espaces
spaces_list:
the_spaces: "Les espaces"
add_a_space: "Ajouter un espace"
status_enabled: "Activés"
@ -323,7 +330,6 @@ fr:
space_show:
# affichage des détails d'un espace
space_show:
book_this_space: "Réserver cet espace"
unauthorized_operation: "Opération non autorisée"
confirmation_required: "Confirmation requise"

View File

@ -22,19 +22,8 @@ fr:
elements:
# traductions variées utilisées à plusieurs reprises dans l'application
group: "Groupe"
subscription: "Abonnement"
trainings: "Formations"
no_trainings: "Aucune formation"
confirmation_required: "Confirmation requise"
description: "Description"
machines: "Machines"
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"
user: "Utilisateur"
pseudonym: "Pseudonyme"
@ -42,41 +31,20 @@ fr:
reservation_was_successfully_cancelled: "La réservation a bien été annulée."
title: "Titre"
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"
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"
step_N: "Étape {INDEX}"
themes: "Thématiques"
tags: "Étiquettes"
technical_specifications: "Caractéristiques techniques"
online_payment: "Paiement en ligne"
type: "Type"
partner: "Partenaire"
standard: "Standard"
year: "Année"
month: "Mois"
subscription_price: "Coût de l'abonnement"
model: "Modèle"
from_date: "Du" # context: date. eg: "from 01/01 to 01/05"
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"
or: "ou"
and: "et"
@ -86,15 +54,12 @@ fr:
_click_on_the_synchronization_button_opposite_: "cliquez sur le bouton de synchronisation ci-contre"
_disconnect_then_reconnect_: "déconnectez-vous puis re-connectez vous"
_for_your_changes_to_take_effect: "pour que les modifications soient prises en compte."
add_a_project: "Ajouter un projet"
illustration: "Visuel"
add_an_illustration: "Ajouter un visuel"
book: "Réserver"
description_is_required: "La description est requise."
name_is_required: "Le nom est requis."
all_themes: "Toutes les thématiques"
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."
share_on_facebook: "Partager sur Facebook"
share_on_twitter: "Partager sur Twitter"
@ -110,11 +75,21 @@ fr:
user:
# formulaire d'édition du profil utilisateur
man: "Homme"
woman: "Femme"
add_an_avatar: "Ajouter un avatar"
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."
change_password: "Changer de 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_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)."
@ -125,6 +100,19 @@ fr:
date_of_birth_is_required: "La date de naissance est requise."
website: "Site web"
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:
# formulaire d'étition d'un projet
@ -170,8 +158,7 @@ fr:
member_select:
# admin : choisir un membre avec lequel interagir
select_a_member: "Sélectionnez un membre"
start_typing: "Commencez à taper ..."
please_select_a_member_first: "Veuillez tout d'abord sélectionner un membre"
start_typing: "Commencez à écrire ..."
stripe:
# fenêtre de paiement stripe
@ -247,7 +234,6 @@ fr:
trainings:
# formulaire d'édition d'une formation
trainings_form:
name: "Nom"
name_is_required: "Le nom est requis."
illustration: "Visuel"
@ -325,8 +311,7 @@ fr:
public_profile:
# profil publique d'un utilisateur
last_activity_: "Dernière activité"
_on_: "le"
last_activity_html: "Dernière activité <br><strong>le {DATE}</strong>"
to_come: "à venir"
approved: "validée"
projects: "Projets"
@ -334,6 +319,11 @@ fr:
author: "Auteur"
collaborator: "Collaborateur"
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:
# porte-monnaie
@ -341,6 +331,7 @@ fr:
your_wallet_amount: 'Votre montant disponible'
wallet_amount: 'Montant disponible'
no_transactions_for_now: 'Aucune transaction pour le moment'
date: "Date"
operation: 'Opération'
operator: 'Opérateur'
amount: 'Montant'