1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-10 21:24:20 +01:00
fab-manager/app/assets/javascripts/controllers/admin/trainings.coffee.erb
Sylvain 08244d53dc improve trainings load times
- do not eager load trainings availabilities in INDEX action if not requsted
- in trainings monitoring (font), do not load all availabilities for all traninings by default, by select a training first to load its availabilities
2016-06-15 12:01:09 +02:00

233 lines
7.3 KiB
Plaintext

'use strict'
Application.Controllers.controller "TrainingsController", ["$scope", "$state", "$uibModal", 'Training', 'trainingsPromise', 'machinesPromise', '_t', 'growl'
, ($scope, $state, $uibModal, Training, trainingsPromise, machinesPromise, _t, growl) ->
### PUBLIC SCOPE ###
## list of trainings
$scope.trainings = trainingsPromise
## simplified list of machines
$scope.machines = machinesPromise
## Training to monitor, binded with drop-down selection
$scope.monitoring =
training: null
## list of training availabilies, grouped by date
$scope.groupedAvailabilities = {}
## default: accordions are not open
$scope.accordions = {}
## Binding for the parseInt function
$scope.parseInt = parseInt
##
# In the trainings listing tab, return the stringified list of machines associated with the provided training
# @param training {Object} Training object, inherited from $resource
# @returns {string}
##
$scope.showMachines = (training) ->
selected = []
angular.forEach $scope.machines, (m) ->
if (training.machine_ids.indexOf(m.id) >= 0)
selected.push(m.name)
return if selected.length then selected.join(', ') else _t('none')
##
# Create a new empty training object and append it to the $scope.trainings list
##
$scope.addTraining = ->
$scope.inserted =
name: ''
machine_ids: []
$scope.trainings.push($scope.inserted)
##
# Saves a new training / Update an existing training to the server (form validation callback)
# @param data {Object} training name, associated machine(s) and default places number
# @param id {number} training id, in case of update
##
$scope.saveTraining = (data, id) ->
if id?
Training.update {id: id},
training: data
else
Training.save
training: data
, (resp) ->
$scope.trainings[$scope.trainings.length-1] = resp
console.log(resp)
##
# Removes the newly inserted but not saved training / Cancel the current training modification
# @param rowform {Object} see http://vitalets.github.io/angular-xeditable/
# @param index {number} training index in the $scope.trainings array
##
$scope.cancelTraining = (rowform, index) ->
if $scope.trainings[index].id?
rowform.$cancel()
else
$scope.trainings.splice(index, 1)
##
# In the trainings monitoring tab, callback to open a modal window displaying the current bookings for the
# provided training slot. The admin will be then able to validate the training for the users that followed
# the training.
# @param training {Object} Training object, inherited from $resource
# @param availability {Object} time slot when the training occurs
##
$scope.showReservations = (training, availability) ->
$uibModal.open
templateUrl: '<%= asset_path "admin/trainings/validTrainingModal.html" %>'
controller: ['$scope', '$uibModalInstance', ($scope, $uibModalInstance) ->
$scope.availability = availability
$scope.usersToValid = []
##
# Mark/unmark the provided user for training validation
# @param user {Object} from the availability.reservation_users list
##
$scope.toggleSelection = (user) ->
index = $scope.usersToValid.indexOf(user)
if index > -1
$scope.usersToValid.splice(index, 1)
else
$scope.usersToValid.push user
##
# Validates the modifications (training validations) and save them to the server
##
$scope.ok = ->
users = $scope.usersToValid.map (u) ->
u.id
Training.update {id: training.id},
training:
users: users
, -> # success
angular.forEach $scope.usersToValid, (u) ->
u.is_valid = true
$scope.usersToValid = []
$uibModalInstance.close(training)
##
# Cancel the modifications and close the modal window
##
$scope.cancel = ->
$uibModalInstance.dismiss('cancel')
]
##
# Delete the provided training and, in case of sucess, remove it from the trainings list afterwards
# @param index {number} index of the provided training in $scope.trainings
# @param training {Object} training to delete
##
$scope.removeTraining = (index, training)->
training.$delete ->
$scope.trainings.splice(index, 1)
growl.info(_t('training_successfully_deleted'))
, (error)->
growl.warning(_t('unable_to_delete_the_training_because_some_users_alredy_booked_it'))
##
# Open the modal to edit description of the training
# @param training {Object} Training to edit description
##
$scope.openModalToSetDescription = (training)->
$uibModal.open(
templateUrl: "<%= asset_path 'admin/trainings/modal_edit.html' %>"
controller: ['$scope', '$uibModalInstance', 'Training', 'growl', ($scope, $uibModalInstance, Training, growl)->
$scope.training = training
$scope.save = ->
Training.update id: training.id, { training: { description: $scope.training.description } }, (training)->
$uibModalInstance.close()
growl.success(_t('description_was_successfully_saved'))
return
]
)
##
# Takes a month number and return its localized literal name
# @param {Number} from 0 to 11
# @returns {String} eg. 'janvier'
##
$scope.formatMonth = (number) ->
number = parseInt(number)
moment().month(number).format('MMMM')
##
# Given a day, month and year, return a localized literal name for the day
# @param day {Number} from 1 to 31
# @param month {Number} from 0 to 11
# @param year {Number} Gregorian's year number
# @returns {String} eg. 'mercredi 12'
##
$scope.formatDay = (day, month, year) ->
day = parseInt(day)
month = parseInt(month)
year = parseInt(year)
moment({year: year, month:month, day:day}).format('dddd D')
##
# Callback when the drop-down selection is changed.
# The selected training details will be loaded from the API and rendered into the accordions.
##
$scope.selectTrainingToMonitor = ->
Training.get {id: $scope.monitoring.training.id}, (training) ->
$scope.groupedAvailabilities = groupAvailabilities([training])
### PRIVATE SCOPE ###
##
# Group the trainings availabilites by trainings and by dates and return the resulting tree
# @param trainings {Array} $scope.trainings is expected here
# @returns {Object} Tree constructed as /training_name/year/month/day/[availabilities]
##
groupAvailabilities = (trainings) ->
tree = {}
for training in trainings
tree[training.name] = {}
tree[training.name].training = training
for availability in training.availabilities
start = moment(availability.start_at)
# init the tree structure
if typeof tree[training.name][start.year()] == 'undefined'
tree[training.name][start.year()] = {}
if typeof tree[training.name][start.year()][start.month()] == 'undefined'
tree[training.name][start.year()][start.month()] = {}
if typeof tree[training.name][start.year()][start.month()][start.date()] == 'undefined'
tree[training.name][start.year()][start.month()][start.date()] = []
# add the availability at its right place
tree[training.name][start.year()][start.month()][start.date()].push( availability )
tree
]