Files
ember-panda/app/components/workflow-action-definition/modals/edit-workflow-action-definition.coffee
T

345 lines
20 KiB
CoffeeScript

import ModalBase from 'ember-cli-dunlop/mixins/modal-base'
import lookupValidator from 'ember-changeset-validations'
import Changeset from 'ember-changeset'
import ModelValidations from 'ember-panda/validations/workflow-action-definition'
import add_business_day_computations from 'ember-panda/utils/business-day-computations'
import { value_type_options } from 'ember-panda/models/panda/workflow-action-definition'
ESC_KEY = 27
Component =
_initEscListener: ->
closeOnEscapeKey = (ev) =>
@send 'rollback_and_close' if ev.keyCode is ESC_KEY
Ember.$('body').on('keyup.modal-dialog', closeOnEscapeKey)
value_type_options: value_type_options
constraint_types: Ember.A(['warn', 'restrict'])
lastSelectedWorkflowGroup: null
lastSelectedWorkflowActionDefinition: null
selectedConstraintType: 'warn'
possible_organizations: []
connection_types: ['info', 'constraint'] # could be warning in future as well
new_workflow_action_constraint_warning: ''
new_workflow_action_offset_warning: ''
#new_workflow_action_offset_offset_value: 0
#new_workflow_action_offset_offset_unit: 'day'
#new_workflow_action_offset_offset_business_days: (-> [ 1, 2, 3, 4, 5 ]).property()
#new_workflow_action_offset_batch_element_threshold_value: 0
#new_workflow_action_offset_batch_element_threshold_unit: 'businessday'
#new_workflow_action_offset_batch_element_threshold_business_days: (-> [ 1, 2, 3, 4, 5 ]).property()
#select_action_offset_base_alert: ''
attached_to_workflow_action: null
attached_to_workflow_action_workflow_group: null
possible_attached_to_workflow_action_workflow_action_definitions: []
attached_to_connection_conditional_base_value: ''
attached_to_connection_warning: ''
working_workflow_action_offsets: Ember.A()
non_deleted_working_workflow_action_offsets: Ember.computed 'working_workflow_action_offsets.@each.isDeleted', -> @get('working_workflow_action_offsets').rejectBy('isDeleted')
working_pointing_workflow_action_connections: Ember.A()
non_deleted_working_pointing_workflow_action_connections: Ember.computed 'working_pointing_workflow_action_connections.@each.isDeleted', -> @get('working_pointing_workflow_action_connections').rejectBy('isDeleted')
#working_workflow_action_constraints: Ember.A()
#used_workflow_action_definitions_for_offset: Ember.computed 'working_workflow_action_offsets.@each.isDeleted', ->
# @get('working_workflow_action_offsets').rejectBy('isDeleted').mapBy('base_workflow_action_definition.id')
#used_workflow_action_definitions_for_constraint: Ember.computed 'working_workflow_action_constraints.@each.isDeleted', ->
# @get('working_workflow_action_constraints').rejectBy('isDeleted').mapBy('constraint_workflow_action_definition.id')
offset_type_none: Ember.computed.equal 'model.changeset.offset_type', 'none'
offset_type_attached: Ember.computed.equal 'model.changeset.offset_type', 'attached'
offset_type_configured: Ember.computed.equal 'model.changeset.offset_type', 'configured'
willOpenModal: ->
@_initEscListener()
@get('model.workflow_group').then (workflow_group) =>
@set 'lastSelectedWorkflowGroup', workflow_group
@set 'possible_organizations', @store.peekAll('panda/organization')
# CONNECTION SETUP
if workflow_action_connection = @get('model.workflow_action_connections').findBy('connection_type', 'attached')
@set 'attached_to_workflow_action', workflow_action_connection.get('base_workflow_action_definition.content')
@set 'attached_to_workflow_action_workflow_group', @get('attached_to_workflow_action.workflow_group.content')
@set 'attached_to_connection_conditional_base_value', workflow_action_connection.get('conditional_base_value')
else # same group of configuring action
@set 'attached_to_workflow_action_workflow_group', @get('model.workflow_group.content')
unless @get('attached_to_workflow_action_workflow_group') # fallback to first available group
@set 'attached_to_workflow_action_workflow_group', @get('model.project.workflow_groups.firstObject')
if connection_group = @get('attached_to_workflow_action_workflow_group')
@set 'possible_attached_to_workflow_action_workflow_action_definitions', connection_group.get('sorted_workflow_action_definitions').rejectBy('id', @get('model.id'))
changeset = new Changeset(@get('model'), lookupValidator(ModelValidations), ModelValidations)
add_business_day_computations changeset, 'offset'
add_business_day_computations changeset, 'batch_element_threshold'
@set 'model.changeset', changeset
model_id = @get('model.id')
@get('model.workflow_action_offsets').then (workflow_action_offsets) =>
@set('working_workflow_action_offsets', workflow_action_offsets.toArray())
workflow_action_offsets.forEach (workflow_action_offset) ->
if selector_workflow_group = workflow_action_offset.get('base_workflow_action_definition.workflow_group.content')
workflow_action_offset.set 'selector_workflow_group', selector_workflow_group
workflow_action_offset.set 'filtered_workflow_action_definitions', selector_workflow_group.get('sorted_workflow_action_definitions').rejectBy('id', model_id)
base_action = workflow_action_offset.get('base_workflow_action_definition.content')
workflow_action_offset.set 'x_based', !base_action
workflow_action_offset.set 'original_base_workflow_action_definition', base_action
@get('model.pointing_workflow_action_connections').then (pointing_workflow_action_connections) =>
@set('working_pointing_workflow_action_connections', pointing_workflow_action_connections.toArray())
pointing_workflow_action_connections.forEach (pointing_workflow_action_connection) ->
if selector_workflow_group = pointing_workflow_action_connection.get('workflow_action_definition.workflow_group.content')
pointing_workflow_action_connection.set 'selector_workflow_group', selector_workflow_group
pointing_workflow_action_connection.set 'filtered_workflow_action_definitions', selector_workflow_group.get('sorted_workflow_action_definitions').rejectBy('id', model_id)
original_action = pointing_workflow_action_connection.get('workflow_action_definition.content')
pointing_workflow_action_connection.set 'original_workflow_action_definition', original_action
#@get('model.workflow_action_constraints').then => @set('working_workflow_action_constraints', arguments[0].toArray())
actions:
#newWorkflowActionConstraint: (constraint_workflow_action_definition, event) ->
# @set 'new_workflow_action_constraint_warning', ''
# return unless constraint_workflow_action_definition
# $(event.target).val('')
# if @get('used_workflow_action_definitions_for_constraint').includes(constraint_workflow_action_definition.get('id'))
# @set 'new_workflow_action_constraint_warning',
# t('workflow_action_definition.edit_workflow_action_definition.workflow_action_definition_already_used', constraint_workflow_action_definition.toJSON?())
# return
# constraint = @store.createRecord 'panda/workflow-action-constraint',
# type: @get('selectedConstraintType')
# workflow_action_definition: @get('model')
# constraint_workflow_action_definition: constraint_workflow_action_definition
# @get('working_workflow_action_constraints').addObject constraint
#newWorkflowActionOffset: (base_workflow_action_definition, event) ->
# base_workflow_action_definition = @get('attached_to_workflow_action')
# offset_value = parseInt(@get('new_workflow_action_offset_offset_value')) || 0
# if @get('offset_type_workflow_action_definition') and not base_workflow_action_definition
# @set 'new_workflow_action_offset_warning',
# t('workflow_action_definition.edit_workflow_action_definition.no_action_offset_base_given_alert')
# return
# if @get('used_workflow_action_definitions_for_offset').includes(base_workflow_action_definition.get('id'))
# @set 'new_workflow_action_offset_warning',
# t('workflow_action_definition.edit_workflow_action_definition.workflow_action_definition_already_used', base_workflow_action_definition.toJSON?())
# @set 'attached_to_workflow_action', null
# return
# @set 'new_workflow_action_offset_warning', ''
# offset = @store.createRecord 'workflow-action-offset',
# offset_value: offset_value
# offset_unit: @get('new_workflow_action_offset_offset_unit')
# offset_business_days: @get('new_workflow_action_offset_offset_business_days')
# batch_element_threshold_value: @get('new_workflow_action_offset_batch_element_threshold_value')
# batch_element_threshold_unit: @get('new_workflow_action_offset_batch_element_threshold_unit')
# batch_element_threshold_business_days: @get('new_workflow_action_offset_batch_element_threshold_business_days')
# workflow_action_definition: @get('model')
# base_workflow_action_definition: base_workflow_action_definition
# @get('working_workflow_action_offsets').addObject offset
# @set 'attached_to_workflow_action', null # required for empty validation
add_workflow_action_offset: ->
@set 'new_workflow_action_offset_warning', ''
workflow_action_offset = @store.createRecord 'panda/workflow-action-offset',
workflow_action_definition: @get('model')
x_based: true
@actions.set_selector_workflow_group.bind(@) workflow_action_offset, @get('model.workflow_group'), force_refresh: true
@get('working_workflow_action_offsets').pushObject workflow_action_offset
set_base_workflow_action_definition: (workflow_action_offset, workflow_action_definition) ->
workflow_action_offset.set 'base_workflow_action_definition_warning', ''
workflow_action_offset.set 'base_workflow_action_definition', workflow_action_definition
set_connection_workflow_action_definition: (connection, workflow_action_definition) ->
connection.set 'workflow_action_definition_warning', ''
connection.set 'workflow_action_definition', workflow_action_definition
add_workflow_action_connection: ->
connection = @store.createRecord 'panda/workflow-action-connection',
base_workflow_action_definition: @get('model')
connection_type: @get('connection_types.firstObject')
@actions.set_connection_selector_workflow_group.bind(@) connection, @get('model.workflow_group'), force_refresh: true
@get('working_pointing_workflow_action_connections').pushObject connection
workflow_group_change: (workflow_group) ->
@set 'lastSelectedWorkflowGroup', workflow_group
@set 'lastSelectedWorkflowActionDefinition', null
#destroyWorkflowActionConstraint: (workflow_action_constraint) ->
# if workflow_action_constraint.get('isNew')
# workflow_action_constraint.rollbackAttributes()
# @get('working_workflow_action_constraints').removeObject workflow_action_constraint
# else
# workflow_action_constraint.deleteRecord()
# @set 'new_workflow_action_constraint_warning', ''
destroy_workflow_action_definition: ->
project = @get('model.project')
@modal 'confirm',
title_path: @get('modal_options.destroy_text_path') || 'general.destroy.are_you_sure'
model: @get('model')
ok: ->
model = @get("model")
model = model.get("_content") if model.__changeset__
model.destroyRecord().then -> project.incrementProperty('update_revision')
@send 'closeModal' unless @preventClose
destroyWorkflowActionOffset: (workflow_action_offset) ->
if workflow_action_offset.get('isNew')
@get('working_workflow_action_offsets').removeObject workflow_action_offset
workflow_action_offset.rollbackAttributes()
else
workflow_action_offset.deleteRecord()
#@set 'new_workflow_action_offset_warning', ''
destroyWorkflowActionConnection: (connection) ->
if connection.get('isNew')
@get('working_pointing_workflow_action_connections').removeObject connection
connection.rollbackAttributes()
else
connection.deleteRecord()
selectOrganization: (organization) -> @set('model.organization', organization)
selectProjectScenario: (project_scenario) -> @set('model.project_scenario', project_scenario)
saveRecord: ->
changeset = @get('model.changeset')
changeset.validate()
if @get('offset_type_configured')
##if action_offset_base = @get('attached_to_workflow_action')
## @set 'model.action_offset_base', action_offset_base
##else
## @set 'select_action_offset_base_alert', t('workflow_action_definition.edit_workflow_action_definition.no_action_offset_base_given_alert')
## return
#if action_offset_base = @get('attached_to_workflow_action')
# @set 'new_workflow_action_offset_warning', t('workflow_action_definition.edit_workflow_action_definition.chosen_but_non_added_offset_workflow_action_definition')
# return
unless @get('non_deleted_working_workflow_action_offsets.length')
@set 'new_workflow_action_offset_warning', t('workflow_action_definition.edit_workflow_action_definition.offset_type_configured_but_no_offsets')
return
all_workflow_action_definitions_valid = true
@get('non_deleted_working_workflow_action_offsets').forEach (workflow_action_offset) ->
workflow_action_offset.set 'base_workflow_action_definition_warning', ''
if !workflow_action_offset.get('x_based') and !workflow_action_offset.get('base_workflow_action_definition.id')
workflow_action_offset.set 'base_workflow_action_definition_warning', t('workflow_action_definition.edit_workflow_action_definition.base_workflow_action_definition_not_present')
all_workflow_action_definitions_valid = false
return unless all_workflow_action_definitions_valid
else
@get('model.workflow_action_offsets').invoke 'rollbackAttributes' # only offsets if offset_type is 'configured'
#@set 'model.action_offset_base', null
#@set 'select_action_offset_base_alert', ''
if @get('offset_type_attached')
unless @get('attached_to_workflow_action')
@set 'attached_to_connection_warning', t('workflow_action_definition.edit_workflow_action_definition.offset_type_attached_but_no_connection')
return
else
@set 'attached_to_connection_warning', ''
@set 'attached_to_workflow_action', null
all_connections_valid = true
@get('working_pointing_workflow_action_connections').forEach (pointing_connection) ->
pointing_connection.set 'workflow_action_definition_warning', ''
unless pointing_connection.get('workflow_action_definition.content')
pointing_connection.set 'workflow_action_definition_warning', t('workflow_action_definition.edit_workflow_action_definition.workflow_action_definition_not_present')
all_connections_valid = false
return unless all_connections_valid
# This was validation phase, now perform persisting in proper order
return unless changeset.get('isValid')
changeset.save().then (workflow_action_definition) =>
if @get('offset_type_configured')
@get('working_workflow_action_offsets').invoke 'save'
else
@get('working_workflow_action_offsets').invoke 'destroyRecord'
@get('working_pointing_workflow_action_connections').invoke 'save'
existing_attached_connection = @get('model.workflow_action_connections').findBy('connection_type', 'attached')
if @get('offset_type_attached')
if existing_attached_connection
existing_attached_connection.setProperties
base_workflow_action_definition: @get('attached_to_workflow_action')
conditional_base_value: @get('attached_to_connection_conditional_base_value')
existing_attached_connection.save()
else
new_attached_connection = @store.createRecord 'panda/workflow-action-connection',
workflow_action_definition: @get('model')
base_workflow_action_definition: @get('attached_to_workflow_action')
conditional_base_value: @get('attached_to_connection_conditional_base_value')
connection_type: 'attached'
new_attached_connection.save()
else if existing_attached_connection # cleanup
if existing_attached_connection.get('isNew')
existing_attached_connection.rollbackAttributes()
else
existing_attached_connection.destroyRecord()
#@get('working_workflow_action_constraints').invoke 'save'
@incrementProperty 'model.project.update_revision'
@send 'close'
rollback_and_close: ->
#@set 'select_action_offset_base_alert', ''
@get('working_workflow_action_offsets').invoke 'rollbackAttributes'
@get('working_pointing_workflow_action_connections').invoke 'rollbackAttributes'
#@get('working_workflow_action_constraints').invoke 'rollbackAttributes'
@_super arguments...
close: ->
Ember.$('body').off('keyup.modal-dialog')
@_super arguments...
set_batch_element_threshold_unit: (unit) -> @set 'model.changeset.batch_element_threshold_unit', unit
positionInProject: ->
@modal 'project/position-workflow-action-definition-in-project',
model: @get('model')
set_offset_type_none: ->
@set 'model.changeset.offset_type', 'none'
set_offset_type_attached: ->
@set 'model.changeset.offset_type', 'attached'
set_offset_type_configured: ->
@set 'model.changeset.offset_type', 'configured'
# Add an initial offset if activated and none are present yet
@send 'add_workflow_action_offset' unless @get('model.workflow_action_offsets.length')
set_attached_to_workflow_action_workflow_group: (workflow_group) ->
@set 'attached_to_workflow_action_workflow_group', workflow_group
@set 'attached_to_workflow_action', null
@set 'possible_attached_to_workflow_action_workflow_action_definitions', workflow_group.get('sorted_workflow_action_definitions').rejectBy('id', @get('model.id'))
false
set_connection_selector_workflow_group: (workflow_action_offset, workflow_group, options = {}) ->
if workflow_action_offset.get('connection_type') is 'attached'
return if workflow_action_offset.get('base_workflow_action_definition.workflow_group.id') is workflow_group.get('id') and not options.force_refresh # do not clear unchanged select trigger
workflow_action_offset.set 'base_workflow_action_definition', null
else
return if workflow_action_offset.get('workflow_action_definition.workflow_group.id') is workflow_group.get('id') and not options.force_refresh # do not clear unchanged select trigger
workflow_action_offset.set 'workflow_action_definition', null
workflow_action_offset.set 'selector_workflow_group', workflow_group
workflow_action_offset.set 'filtered_workflow_action_definitions', workflow_group.get('sorted_workflow_action_definitions').rejectBy('id', @get('model.id'))
set_selector_workflow_group: (workflow_action_offset, workflow_group, options = {}) ->
return if workflow_action_offset.get('base_workflow_action_definition.workflow_group.id') is workflow_group.get('id') and not options.force_refresh # do not clear unchanged select trigger
workflow_action_offset.set 'base_workflow_action_definition', null
workflow_action_offset.set 'selector_workflow_group', workflow_group
workflow_action_offset.set 'filtered_workflow_action_definitions', workflow_group.get('sorted_workflow_action_definitions').rejectBy('id', @get('model.id'))
toggle_offset_x_based: (offset, x_based) ->
if x_based
offset.set 'base_workflow_action_definition', null
else
# do not loose original on back and forth toggle
offset.set 'base_workflow_action_definition', offset.get('original_base_workflow_action_definition')
offset.set 'x_based', x_based
false
set_attached_to_workflow_action: (workflow_action_definition) ->
@set 'attached_to_workflow_action', workflow_action_definition
@set 'attached_to_connection_conditional_base_value', ''
false
#toggle_week_day_presence: (target, week_day, selected) ->
# #target = target.get('batch_element_threshold_business_days') unless Ember.isArray(target)
# if selected
# target.addObject week_day.index
# else
# target.removeObject week_day.index
add_business_day_computations Component, 'new_workflow_action_offset_batch_element_threshold'
export default ModalBase.extend(Component)