Adding schedules to Order Cycles interface

This commit is contained in:
Rob Harrington
2016-07-08 14:34:03 +10:00
parent a25f2141a5
commit 920f52e112
22 changed files with 266 additions and 17 deletions

View File

@@ -1,21 +1,25 @@
angular.module("admin.orderCycles").controller "OrderCyclesCtrl", ($scope, $q, Columns, StatusMessage, RequestMonitor, OrderCycles, Enterprises) ->
angular.module("admin.orderCycles").controller "OrderCyclesCtrl", ($scope, $q, Columns, StatusMessage, RequestMonitor, OrderCycles, Enterprises, Schedules) ->
$scope.RequestMonitor = RequestMonitor
$scope.columns = Columns.columns
$scope.saveAll = -> OrderCycles.saveChanges($scope.order_cycles_form)
$scope.ordersCloseAtLimit = -31 # days
$scope.involvingFilter = 0
compileDataFor = (orderCycles) ->
for orderCycle in orderCycles
compileData = ->
for schedule in $scope.schedules
Schedules.linkToOrderCycles(schedule)
for orderCycle in $scope.orderCycles
OrderCycles.linkToEnterprises(orderCycle)
OrderCycles.linkToSchedules(orderCycle)
orderCycle.involvedEnterpriseIDs = [orderCycle.coordinator.id]
orderCycle.producerNames = orderCycle.producers.map((producer) -> orderCycle.involvedEnterpriseIDs.push(producer.id); producer.name).join(", ")
orderCycle.shopNames = orderCycle.shops.map((shop) -> orderCycle.involvedEnterpriseIDs.push(shop.id); shop.name).join(", ")
# NOTE: this is using the Enterprises service from the admin.enterprises module
RequestMonitor.load ($scope.enterprises = Enterprises.index(action: "visible", ams_prefix: "basic")).$promise
$scope.schedules = Schedules.index()
RequestMonitor.load ($scope.orderCycles = OrderCycles.index(ams_prefix: "index", "q[orders_close_at_gt]": "#{daysFromToday($scope.ordersCloseAtLimit)}")).$promise
RequestMonitor.load $q.all([$scope.enterprises.$promise, $scope.orderCycles.$promise]).then -> compileDataFor($scope.orderCycles)
RequestMonitor.load $q.all([$scope.enterprises.$promise, $scope.schedules.$promise, $scope.orderCycles.$promise]).then -> compileData()
$scope.$watch 'order_cycles_form.$dirty', (newVal, oldVal) ->
StatusMessage.display 'notice', "You have unsaved changes" if newVal
@@ -25,7 +29,7 @@ angular.module("admin.orderCycles").controller "OrderCyclesCtrl", ($scope, $q, C
existingIDs = Object.keys(OrderCycles.orderCyclesByID)
RequestMonitor.load (orderCycles = OrderCycles.index(ams_prefix: "index", "q[orders_close_at_gt]": "#{daysFromToday($scope.ordersCloseAtLimit)}", "q[id_not_in][]": existingIDs)).$promise
orderCycles.$promise.then ->
compileDataFor(orderCycles)
compileData()
$scope.orderCycles.push(orderCycle) for orderCycle in orderCycles
daysFromToday = (days) ->

View File

@@ -0,0 +1,22 @@
angular.module("admin.orderCycles").directive 'orderCyclesSelector', (OrderCycles, Schedules) ->
restrict: 'C'
templateUrl: 'admin/order_cycles_selector.html'
link: (scope, element, attr) ->
if scope.scheduleID?
scope.selectedOrderCycles = Schedules.byID[scope.scheduleID].orderCycles
scope.orderCycleIDs = scope.selectedOrderCycles.map (i, orderCycle) -> orderCycle.id
else
scope.selectedOrderCycles = []
scope.availableOrderCycles = (orderCycle for id, orderCycle of OrderCycles.orderCyclesByID when orderCycle not in scope.selectedOrderCycles)
element.find('#available-order-cycles .order-cycles').sortable
connectWith: '#selected-order-cycles .order-cycles'
element.find('#selected-order-cycles .order-cycles').sortable
connectWith: '#available-order-cycles .order-cycles'
receive: (event, ui) ->
scope.orderCycleIDs = $('#selected-order-cycles .order-cycles').children('.order-cycle').map((i, element) -> $(element).scope().orderCycle.id).get()
remove: (event, ui) ->
scope.orderCycleIDs = $('#selected-order-cycles .order-cycles').children('.order-cycle').map((i, element) -> $(element).scope().orderCycle.id).get()

View File

@@ -0,0 +1,40 @@
angular.module("admin.orderCycles").directive 'scheduleDialog', ($compile, $injector, $templateCache, DialogDefaults, Schedules) ->
restrict: 'A'
scope:
scheduleID: '@'
link: (scope, element, attr) ->
scope.submitted = false
scope.name = ""
scope.orderCycleIDs = []
scope.errors = []
scope.close = ->
scope.template.dialog('close')
return
scope.addSchedule = ->
scope.schedule_form.$setPristine()
scope.submitted = true
scope.errors = []
if scope.schedule_form.$valid
Schedules.add({name: scope.name, order_cycle_ids: scope.orderCycleIDs}).$promise.then (data) ->
if data.id
scope.name = ""
scope.orderCycleIDs = ""
scope.submitted = false
template.dialog('close')
, (response) ->
if response.data.errors
scope.errors.push(error) for error in response.data.errors
else
scope.errors.push("Sorry! Could not create '#{scope.name}'")
return
# Link opening of dialog to click event on element
element.bind 'click', (e) ->
# Compile modal template
scope.template = $compile($templateCache.get('admin/schedule_dialog.html'))(scope)
# Set Dialog options
scope.template.dialog(DialogDefaults)
scope.template.dialog(close: -> scope.template.remove())
scope.template.dialog('open')

View File

@@ -0,0 +1,10 @@
angular.module("admin.orderCycles").factory 'ScheduleResource', ($resource) ->
$resource('/admin/schedules/:id/:action.json', {}, {
'index':
method: 'GET'
isArray: true
'create':
method: 'POST'
'update':
method: 'PUT'
})

View File

@@ -0,0 +1,33 @@
angular.module("admin.orderCycles").factory "Schedules", ($q, RequestMonitor, ScheduleResource) ->
new class Schedules
byID: {}
# all: []
add: (params) ->
ScheduleResource.create params, (schedule) =>
@byID[schedule.id] = schedule if schedule.id
# remove: (schedule) ->
# params = id: schedule.id
# ScheduleResource.destroy params, =>
# i = @schedules.indexOf schedule
# @schedules.splice i, 1 unless i < 0
# , (response) =>
# errors = response.data.errors
# if errors?
# InfoDialog.open 'error', errors[0]
# else
# InfoDialog.open 'error', "Could not delete schedule: #{schedule.email}"
index: ->
request = ScheduleResource.index (data) =>
@byID[schedule.id] = schedule for schedule in data
data
# @all = data
RequestMonitor.load(request.$promise)
request
linkToOrderCycles: (schedule) ->
for orderCycle, i in schedule.orderCycles
orderCycle = OrderCycles.orderCyclesByID[orderCycle.id]
schedule.orderCycles[i] = orderCycle if orderCycle?

View File

@@ -80,3 +80,8 @@ angular.module("admin.resources").factory 'OrderCycles', ($q, $injector, OrderCy
for shop, i in orderCycle.shops
shop = Enterprises.enterprisesByID[shop.id]
orderCycle.shops[i] = shop if shop?
linkToSchedules: (orderCycle) ->
for schedule, i in orderCycle.schedules
schedule = Schedules.byID[schedule.id]
orderCycle.schedules[i] = schedule if schedule?