mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-12 03:50:22 +00:00
Adding schedules to Order Cycles interface
This commit is contained in:
@@ -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) ->
|
||||
|
||||
@@ -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()
|
||||
@@ -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')
|
||||
@@ -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'
|
||||
})
|
||||
@@ -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?
|
||||
@@ -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?
|
||||
|
||||
Reference in New Issue
Block a user