mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-30 11:24:21 +01:00
270 lines
7.5 KiB
Plaintext
270 lines
7.5 KiB
Plaintext
'use strict'
|
|
|
|
### COMMON CODE ###
|
|
|
|
|
|
|
|
class PlanController
|
|
|
|
constructor: ($scope, groups, prices, partners, CSRF) ->
|
|
# protection against request forgery
|
|
CSRF.setMetaTags()
|
|
|
|
|
|
|
|
## groups list
|
|
$scope.groups = groups.filter (g) -> g.slug != 'admins' && !g.disabled
|
|
|
|
## users with role 'partner', notifiables for a partner plan
|
|
$scope.partners = partners.users
|
|
|
|
## Subscriptions prices, machines prices and training prices, per groups
|
|
$scope.group_pricing = prices
|
|
|
|
##
|
|
# For use with 'ng-class', returns the CSS class name for the uploads previews.
|
|
# The preview may show a placeholder or the content of the file depending on the upload state.
|
|
# @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)
|
|
##
|
|
$scope.fileinputClass = (v)->
|
|
if v
|
|
'fileinput-exists'
|
|
else
|
|
'fileinput-new'
|
|
|
|
##
|
|
# Mark the provided file for deletion
|
|
# @param file {Object}
|
|
##
|
|
$scope.deleteFile = (file) ->
|
|
if file? and file.id?
|
|
file._destroy = true
|
|
|
|
|
|
|
|
##
|
|
# Controller used in the plan creation form
|
|
##
|
|
Application.Controllers.controller 'NewPlanController', ['$scope', '$uibModal', 'groups', 'prices', 'partners', 'CSRF', '$state', 'growl', '_t'
|
|
, ($scope, $uibModal, groups, prices, partners, CSRF, $state, growl, _t) ->
|
|
|
|
|
|
|
|
### PRIVATE STATIC CONSTANTS ###
|
|
|
|
## when creating a new contact for a partner plan, this ID will be sent to the server
|
|
NEW_PARTNER_ID: null
|
|
|
|
|
|
|
|
### PUBLIC SCOPE ###
|
|
|
|
## current form is used to create a new plan
|
|
$scope.mode = 'creation'
|
|
|
|
## prices bindings
|
|
$scope.prices =
|
|
training: {}
|
|
machine: {}
|
|
|
|
## form inputs bindings
|
|
$scope.plan =
|
|
type: null
|
|
group_id: null
|
|
interval: null
|
|
intervalCount: 0
|
|
amount: null
|
|
is_rolling: false
|
|
partnerId: null
|
|
partnerContact: null
|
|
ui_weight: 0
|
|
|
|
## API URL where the form will be posted
|
|
$scope.actionUrl = "/api/plans/"
|
|
|
|
## HTTP method for the rest API
|
|
$scope.method = 'POST'
|
|
|
|
|
|
|
|
##
|
|
# Checks if the partner contact is a valid data. Used in the form validation process
|
|
# @returns {boolean}
|
|
##
|
|
$scope.partnerIsValid = ->
|
|
($scope.plan.type == "Plan") or ($scope.plan.partnerId or ($scope.plan.partnerContact and $scope.plan.partnerContact.email))
|
|
|
|
|
|
|
|
##
|
|
# Open a modal dialog allowing the admin to create a new partner user
|
|
##
|
|
$scope.openPartnerNewModal = (subscription)->
|
|
modalInstance = $uibModal.open
|
|
animation: true,
|
|
templateUrl: '<%= asset_path "shared/_partner_new_modal.html" %>'
|
|
size: 'lg',
|
|
controller: ['$scope', '$uibModalInstance', 'User', ($scope, $uibModalInstance, User) ->
|
|
$scope.partner = {}
|
|
|
|
$scope.ok = ->
|
|
User.save {}, { user: $scope.partner }, (user)->
|
|
$scope.partner.id = user.id
|
|
$scope.partner.name = "#{user.first_name} #{user.last_name}"
|
|
$uibModalInstance.close($scope.partner)
|
|
, (error)->
|
|
growl.error(_t('new_plan.unable_to_save_this_user_check_that_there_isnt_an_already_a_user_with_the_same_name'))
|
|
$scope.cancel = ->
|
|
$uibModalInstance.dismiss('cancel')
|
|
]
|
|
# once the form was validated succesfully ...
|
|
modalInstance.result.then (partner) ->
|
|
$scope.partners.push(partner)
|
|
$scope.plan.partnerId = partner.id
|
|
|
|
|
|
|
|
##
|
|
# Display some messages and redirect the user, once the form was submitted, depending on the result status
|
|
# (failed/succeeded).
|
|
# @param content {Object}
|
|
##
|
|
$scope.afterSubmit = (content) ->
|
|
if !content.id? and !content.plan_ids?
|
|
growl.error(_t('new_plan.unable_to_create_the_subscription_please_try_again'))
|
|
else
|
|
growl.success(_t('new_plan.successfully_created_subscription(s)_dont_forget_to_redefine_prices'))
|
|
if content.plan_ids?
|
|
$state.go('app.admin.pricing')
|
|
else
|
|
if content.id?
|
|
$state.go('app.admin.plans.edit', {id: content.id})
|
|
|
|
|
|
|
|
new PlanController($scope, groups, prices, partners, CSRF)
|
|
]
|
|
|
|
|
|
|
|
##
|
|
# Controller used in the plan edition form
|
|
##
|
|
Application.Controllers.controller 'EditPlanController', ['$scope', 'groups', 'plans', 'planPromise', 'machines', 'spaces', 'prices', 'partners', 'CSRF', '$state', '$stateParams', 'growl', '$filter', '_t', 'Plan'
|
|
, ($scope, groups, plans, planPromise, machines, spaces, prices, partners, CSRF, $state, $stateParams, growl, $filter, _t, Plan) ->
|
|
|
|
|
|
|
|
### PUBLIC SCOPE ###
|
|
|
|
## List of spaces
|
|
$scope.spaces = spaces
|
|
|
|
## List of plans
|
|
$scope.plans = plans
|
|
|
|
## List of machines
|
|
$scope.machines = machines
|
|
|
|
## List of groups
|
|
$scope.groups = groups
|
|
|
|
## current form is used for edition mode
|
|
$scope.mode = 'edition'
|
|
|
|
## edited plan data
|
|
$scope.plan = planPromise
|
|
$scope.plan.type = "Plan" if $scope.plan.type == null
|
|
$scope.plan.disabled = 'true' if $scope.plan.disabled
|
|
|
|
## API URL where the form will be posted
|
|
$scope.actionUrl = "/api/plans/" + $stateParams.id
|
|
|
|
## HTTP method for the rest API
|
|
$scope.method = 'PATCH'
|
|
|
|
|
|
|
|
##
|
|
# If a parent plan was set ($scope.plan.parent), the prices will be copied from this parent plan into
|
|
# the current plan prices list. Otherwise, the current plan prices will be erased.
|
|
##
|
|
$scope.copyPricesFromPlan = ->
|
|
if $scope.plan.parent
|
|
Plan.get {id: $scope.plan.parent}, (parentPlan) ->
|
|
for parentPrice in parentPlan.prices
|
|
for childKey, childPrice of $scope.plan.prices
|
|
if childPrice.priceable_type == parentPrice.priceable_type and childPrice.priceable_id == parentPrice.priceable_id
|
|
$scope.plan.prices[childKey].amount = parentPrice.amount
|
|
break
|
|
|
|
# if no plan were selected, unset every prices
|
|
else
|
|
for key, price of $scope.plan.prices
|
|
$scope.plan.prices[key].amount = 0
|
|
|
|
|
|
|
|
##
|
|
# Display some messages once the form was submitted, depending on the result status (failed/succeeded)
|
|
# @param content {Object}
|
|
##
|
|
$scope.afterSubmit = (content) ->
|
|
if !content.id? and !content.plan_ids?
|
|
growl.error(_t('edit_plan.unable_to_save_subscription_changes_please_try_again'))
|
|
else
|
|
growl.success(_t('edit_plan.subscription_successfully_changed'))
|
|
$state.go('app.admin.pricing')
|
|
|
|
|
|
|
|
##
|
|
# Generate a string identifying the given plan by literal humain-readable name
|
|
# @param plan {Object} Plan object, as recovered from GET /api/plan/:id
|
|
# @param groups {Array} List of Groups objects, as recovered from GET /api/groups
|
|
# @param short {boolean} If true, the generated name will contains the group slug, otherwise the group full name
|
|
# will be included.
|
|
# @returns {String}
|
|
##
|
|
$scope.humanReadablePlanName = (plan, groups, short)->
|
|
"#{$filter('humanReadablePlanName')(plan, groups, short)}"
|
|
|
|
|
|
|
|
##
|
|
# Retrieve the name of a machine from its ID
|
|
# @param machine_id {number} machine identifier
|
|
# @returns {string} Machine's name
|
|
##
|
|
$scope.getMachineName = (machine_id) ->
|
|
for machine in $scope.machines
|
|
if machine.id == machine_id
|
|
return machine.name
|
|
|
|
|
|
|
|
##
|
|
# Retrieve the name of a space from its ID
|
|
# @param space_id {number} space identifier
|
|
# @returns {string} Space's name
|
|
##
|
|
$scope.getSpaceName = (space_id) ->
|
|
for space in $scope.spaces
|
|
if space.id == space_id
|
|
return space.name
|
|
|
|
|
|
|
|
### PRIVATE SCOPE ###
|
|
|
|
##
|
|
# Kind of constructor: these actions will be realized first when the controller is loaded
|
|
##
|
|
initialize = ->
|
|
# Using the PlansController
|
|
new PlanController($scope, groups, prices, partners, CSRF)
|
|
|
|
## !!! MUST BE CALLED AT THE END of the controller
|
|
initialize()
|
|
]
|