1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-17 06:52:27 +01:00

machines tour

This commit is contained in:
Sylvain 2020-02-24 16:51:03 +01:00
parent c13ba85230
commit 76c1b69b7a
4 changed files with 178 additions and 75 deletions

View File

@ -82,8 +82,8 @@ Application.Controllers.controller('HomeController', ['$scope', '$stateParams',
selector: 'body',
stepId: 'welcome',
order: 0,
title: _t('app.public.tour.welcome.title'),
content: _t('app.public.tour.welcome.content'),
title: _t('app.public.tour.welcome.welcome.title'),
content: _t('app.public.tour.welcome.welcome.content'),
placement: 'bottom',
orphan: true
});
@ -91,24 +91,24 @@ Application.Controllers.controller('HomeController', ['$scope', '$stateParams',
selector: '.nav-primary li.home-link',
stepId: 'home',
order: 1,
title: _t('app.public.tour.home.title'),
content: _t('app.public.tour.home.content'),
title: _t('app.public.tour.welcome.home.title'),
content: _t('app.public.tour.welcome.home.content'),
placement: 'right'
});
uitour.createStep({
selector: '.nav-primary li.reserve-machine-link',
stepId: 'machines',
order: 2,
title: _t('app.public.tour.machines.title'),
content: _t('app.public.tour.machines.content'),
title: _t('app.public.tour.welcome.machines.title'),
content: _t('app.public.tour.welcome.machines.content'),
placement: 'right'
});
uitour.createStep({
selector: '.nav-primary li.reserve-training-link',
stepId: 'trainings',
order: 3,
title: _t('app.public.tour.trainings.title'),
content: _t('app.public.tour.trainings.content'),
title: _t('app.public.tour.welcome.trainings.title'),
content: _t('app.public.tour.welcome.trainings.content'),
placement: 'right'
});
if (!Fablab.withoutSpaces) {
@ -116,8 +116,8 @@ Application.Controllers.controller('HomeController', ['$scope', '$stateParams',
selector: '.nav-primary li.reserve-space-link',
stepId: 'spaces',
order: 4,
title: _t('app.public.tour.spaces.title'),
content: _t('app.public.tour.spaces.content'),
title: _t('app.public.tour.welcome.spaces.title'),
content: _t('app.public.tour.welcome.spaces.content'),
placement: 'right'
});
}
@ -125,72 +125,72 @@ Application.Controllers.controller('HomeController', ['$scope', '$stateParams',
selector: '.nav-primary li.reserve-event-link',
stepId: 'events',
order: 5,
title: _t('app.public.tour.events.title'),
content: _t('app.public.tour.events.content'),
title: _t('app.public.tour.welcome.events.title'),
content: _t('app.public.tour.welcome.events.content'),
placement: 'right'
});
uitour.createStep({
selector: '.nav-primary li.public-calendar-link',
stepId: 'calendar',
order: 6,
title: _t('app.public.tour.calendar.title'),
content: _t('app.public.tour.calendar.content'),
title: _t('app.public.tour.welcome.calendar.title'),
content: _t('app.public.tour.welcome.calendar.content'),
placement: 'right'
});
uitour.createStep({
selector: '.nav-primary li.projects-gallery-link',
stepId: 'projects',
order: 7,
title: _t('app.public.tour.projects.title'),
content: _t('app.public.tour.projects.content'),
title: _t('app.public.tour.welcome.projects.title'),
content: _t('app.public.tour.welcome.projects.content'),
placement: 'right'
});
uitour.createStep({
selector: '.nav-primary li.plans-link',
stepId: 'plans',
order: 8,
title: _t('app.public.tour.plans.title'),
content: _t('app.public.tour.plans.content'),
title: _t('app.public.tour.welcome.plans.title'),
content: _t('app.public.tour.welcome.plans.content'),
placement: 'right'
});
uitour.createStep({
selector: '.nav-primary .admin-section',
stepId: 'admin',
order: 9,
title: _t('app.public.tour.admin.title'),
content: _t('app.public.tour.admin.content'),
title: _t('app.public.tour.welcome.admin.title'),
content: _t('app.public.tour.welcome.admin.content'),
placement: 'right'
});
uitour.createStep({
selector: '.navbar.header li.about-page-link',
stepId: 'about',
order: 10,
title: _t('app.public.tour.about.title'),
content: _t('app.public.tour.about.content'),
title: _t('app.public.tour.welcome.about.title'),
content: _t('app.public.tour.welcome.about.content'),
placement: 'bottom'
});
uitour.createStep({
selector: '.navbar.header li.notification-center-link',
stepId: 'notifications',
order: 11,
title: _t('app.public.tour.notifications.title'),
content: _t('app.public.tour.notifications.content'),
title: _t('app.public.tour.welcome.notifications.title'),
content: _t('app.public.tour.welcome.notifications.content'),
placement: 'bottom'
});
uitour.createStep({
selector: '.navbar.header li.user-menu-dropdown',
stepId: 'profile',
order: 12,
title: _t('app.public.tour.profile.title'),
content: _t('app.public.tour.profile.content'),
title: _t('app.public.tour.welcome.profile.title'),
content: _t('app.public.tour.welcome.profile.content'),
placement: 'bottom'
});
uitour.createStep({
selector: '.app-generator .app-version',
stepId: 'version',
order: 13,
title: _t('app.public.tour.version.title'),
content: _t('app.public.tour.version.content'),
title: _t('app.public.tour.welcome.version.title'),
content: _t('app.public.tour.welcome.version.content'),
placement: 'top'
});
uitour.createStep({

View File

@ -180,8 +180,8 @@ const _reserveMachine = function (machine, e) {
/**
* Controller used in the public listing page, allowing everyone to see the list of machines
*/
Application.Controllers.controller('MachinesController', ['$scope', '$state', '_t', 'Machine', '$uibModal', 'machinesPromise',
function ($scope, $state, _t, Machine, $uibModal, machinesPromise) {
Application.Controllers.controller('MachinesController', ['$scope', '$state', '_t', 'Machine', '$uibModal', 'machinesPromise', 'Member', 'uiTourService',
function ($scope, $state, _t, Machine, $uibModal, machinesPromise, Member, uiTourService) {
// Retrieve the list of machines
$scope.machines = machinesPromise;
@ -205,11 +205,93 @@ Application.Controllers.controller('MachinesController', ['$scope', '$state', '_
$scope.machineFiltering = 'enabled';
// Available options for filtering machines by status
return $scope.filterDisabled = [
$scope.filterDisabled = [
'enabled',
'disabled',
'all'
];
/**
* Setup the feature-tour for the machines page. (admins only)
* This is intended as a contextual help (when pressing F1)
*/
$scope.setupMachinesTour = function () {
// setup the tour for admins only
if ($scope.currentUser && $scope.currentUser.role === 'admin') {
// get the tour defined by the ui-tour directive
const uitour = uiTourService.getTourByName('machines');
// TODO add the steps
uitour.createStep({
selector: 'body',
stepId: 'welcome',
order: 0,
title: _t('app.public.tour.machines.welcome.title'),
content: _t('app.public.tour.machines.welcome.content'),
placement: 'bottom',
orphan: true
});
if ($scope.machines.length > 0) {
uitour.createStep({
selector: '.machines-list .show-button',
stepId: 'machines',
order: 1,
title: _t('app.public.tour.machines.view.title'),
content: _t('app.public.tour.machines.view.content'),
placement: 'top'
});
}
uitour.createStep({
selector: 'body',
stepId: 'conclusion',
order: 2,
title: _t('app.public.tour.conclusion.title'),
content: _t('app.public.tour.conclusion.content'),
placement: 'bottom',
orphan: true
});
// on tour end, save the status in database
uitour.on('ended', function () {
if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('machines') < 0) {
Member.completeTour({ id: $scope.currentUser.id }, { tour: 'machines' }, function (res) {
$scope.currentUser.profile.tours = res.tours;
});
}
});
// if the user has never seen the tour, show him now
if ($scope.currentUser.profile.tours.indexOf('machines') < 0) {
uitour.start();
}
// start this tour when an user press F1 - this is contextual help
window.addEventListener('keydown', handleF1);
}
}
/* PRIVATE SCOPE */
/**
* Kind of constructor: these actions will be realized first when the controller is loaded
*/
const initialize = function () {
// listen the $destroy event of the controller to remove the F1 key binding
$scope.$on('$destroy', function () {
window.removeEventListener('keydown', handleF1);
});
}
/**
* Callback used to trigger the feature tour when the user press the F1 key.
* @param e {KeyboardEvent}
*/
const handleF1 = function (e) {
if (e.key === 'F1') {
e.preventDefault();
const tour = uiTourService.getTourByName('machines');
if (tour) { tour.start(); }
}
};
// !!! MUST BE CALLED AT THE END of the controller
return initialize();
}
]);

View File

@ -20,7 +20,12 @@
</section>
<section class="m-lg">
<section class="m-lg machines-list"
ui-tour="machines"
ui-tour-backdrop="true"
ui-tour-template-url="'<%= asset_path "shared/tour-step-template.html" %>'"
ui-tour-use-hotkeys="true"
post-render="setupMachinesTour">
<div class="form-group row">
<div class="input-group col-md-3 m-l-lg m-b">
@ -52,7 +57,7 @@
</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)">
<div class="btn btn-default btn-block padder-v no-b red show-button" ng-click="showMachine(machine)">
<i class="fa fa-eye m-r-xs"></i>
<span class="hidden-sm" translate>{{ 'app.shared.buttons.consult' }}</span>
</div>

View File

@ -380,6 +380,10 @@ fr:
projects_using_the_space: "Projets utilisant l'espace"
tour:
conclusion:
title: "Merci de votre attention"
content: "Affichez de l'aide en appuyant sur <strong>F1</strong> à n'importe quel moment.<br> Bonne continuation avec Fab-Manager."
welcome:
welcome:
title: "Bienvenue dans Fab-Manager"
content: "Afin de vous aider à bien prendre en main l'application, nous allons procéder à une rapide visite guidée des fonctionnalités."
@ -422,7 +426,19 @@ fr:
version:
title: "Version de l'application"
content: "Passez votre curseur sur cette icône pour connaître la version de Fab-Manager. Si vous n'êtes pas à jour, cela vous sera signalé ici et vous pourrez alors obtenir des détails en cliquant dessus."
conclusion:
title: "Merci de votre attention"
content: "Affichez de l'aide en appuyant sur <strong>F1</strong> à n'importe quel moment.<br> Bonne continuation avec Fab-Manager."
machines:
welcome:
title: "Gérer les machines"
content: "<p>Les machines sont les outils que vous mettez à disposition de vos utilisateurs. Vous devez créer ici les machines qui pourront ensuite être réservées par les membres.</p><p>Vous pouvez également créer des entrées pour des machines non réservables ou en libre accès, il vous suffira ensuite de ne pas associer de créneaux de disponibilités à celles-ci.</p>"
view:
title: "Consulter"
content: "Pour modifier ou supprimer une machine, cliquez tout d'abord ici. Vous ne pourrez par supprimer une machine qui a déjà été associée à des créneaux de disponibilité, mais vous pourrez la désactiver."
spaces:
welcome:
title: "Gérer les espaces"
content: "<p>Les espaces sont des lieux que vous mettez à disposition de vos utilisateurs. Par exemple, une salle de réunion ou un atelier bois. Vous devez créer ici les espaces qui pourront ensuite être réservées par les membres.</p><p>La spécificité des espaces est qu'ils peuvent être réservés par plusieurs utilisateurs en même temps.</p>"
view:
title: "Consulter"
content: "Pour modifier ou supprimer un espace, cliquez tout d'abord ici. Vous ne pourrez par supprimer un espace qui a déjà été associée à des créneaux de disponibilité, mais vous pourrez le désactiver."