151 lines
7.2 KiB
CoffeeScript
151 lines
7.2 KiB
CoffeeScript
import ModalBase from 'ember-cli-dunlop/mixins/modal-base'
|
|
ESC_KEY = 27
|
|
export default ModalBase.extend
|
|
title: Ember.computed 'model.workflow_action_definition.title', ->
|
|
t 'project.edit_instance_action.title', title: @get('model.workflow_action_definition.title')
|
|
value_type: Ember.computed.alias 'model.workflow_action_definition.value_type'
|
|
string_value: ''
|
|
number_value: null
|
|
text_value: ''
|
|
new_note_content: ''
|
|
new_note_content_is_blank: Ember.computed.not 'new_note_content.length'
|
|
has_uncompleted_constraints: false
|
|
#attached_instance_action_connections: []
|
|
attached_conditions_not_met_warning: ''
|
|
|
|
can_edit_action: Ember.computed 'model.workflow_action_definition.organization.users.[]', ->
|
|
return true if @get('globals.current_user.admin')
|
|
return true if @get('model.workflow_action_definition.offset_type') is 'attached'
|
|
role_names = @get('globals.current_user.role_names') || []
|
|
return true if 'manage-app-panda' in role_names
|
|
return true if 'manage-model-panda/project-instance' in role_names
|
|
organization_user_ids = @get('model.workflow_action_definition.organization.users')?.mapBy('id') || []
|
|
return true if @get('globals.current_user.id') in organization_user_ids
|
|
false
|
|
|
|
_initEscListener: ->
|
|
closeOnEscapeKey = (ev) =>
|
|
@send 'rollback_and_close' if ev.keyCode is ESC_KEY
|
|
Ember.$('body').on('keyup.modal-dialog', closeOnEscapeKey)
|
|
false
|
|
|
|
note_events: Ember.computed 'model.events.@each.event_value', ->
|
|
@get('model.events').filterBy('event_key', 'note')
|
|
|
|
misc_events: Ember.computed 'model.events.length', ->
|
|
@get('model.events').rejectBy('event_key', 'note')
|
|
|
|
|
|
|
|
willOpenModal: ->
|
|
@_initEscListener()
|
|
@get('model.events').reload()
|
|
@set 'string_value', @get('model.string_value')
|
|
@set 'number_value', @get('model.number_value')
|
|
@set 'text_value', @get('model.text_value')
|
|
@set 'timestamp_value', @get('model.timestamp_value')
|
|
#@set 'attached_instance_action_connections', []
|
|
# set this action here to be able to propagate the save callback. This makes double nested attached actions work smoothly
|
|
@set 'actions.open_current_modal', -> @modal 'project/edit-instance-action', model: @get('model'), save: @get('modal_options.save')
|
|
|
|
# constraints setup
|
|
#@set 'attached_conditions_not_met_warning', 'validating attached actions...' # important te reset since attached actions can be completed on re-open of parent
|
|
@set 'attached_conditions_not_met_warning', ''
|
|
@set 'has_uncompleted_constraints', false
|
|
base = @
|
|
@get('model.pointing_project_instance_action_connections').then (pointing_connections) =>
|
|
pointing_connections.forEach (pointing_connection) ->
|
|
return if base.get('has_uncompleted_constraints') # already found, no need to search further
|
|
pointing_connection.get('project_instance_action').then (pointing_project_instance_action) ->
|
|
return if pointing_project_instance_action.get('completed')
|
|
if pointing_connection.get('connection_type') is 'constraint'
|
|
return base.set 'has_uncompleted_constraints', true
|
|
if pointing_connection.get('connection_type') is 'attached'
|
|
if conditional_value = pointing_connection.get('conditional_base_value')
|
|
if base.get('model.workflow_action_definition.value_type') isnt 'select' or conditional_value is base.get('model.string_comparison_value')
|
|
pointing_project_instance_action.get('workflow_action_definition').then (pointing_workflow_action_definition) ->
|
|
base.set 'attached_conditions_not_met_warning', "#{pointing_workflow_action_definition.get('title')} not completed"
|
|
|
|
select_class_names: Ember.computed 'model.string_value', ->
|
|
return ['green']
|
|
if @get('model.string_value') then 'green button' else 'button'
|
|
|
|
|
|
has_changed_timestamp_value: Ember.computed 'timestamp_value', 'model.timestamp_value', ->
|
|
current_timestamp = @get('timestamp_value')
|
|
model_timestamp = @get('model.timestamp_value')
|
|
return false unless current_timestamp or model_timestamp # both false, nothing changed
|
|
return true unless current_timestamp and model_timestamp
|
|
# now we have two timestamps, lets compare
|
|
current_timestamp.toISOString() isnt model_timestamp.toISOString()
|
|
|
|
actions:
|
|
set_value: (attribute, value) ->
|
|
#@set attribute, value # internal setting for validation
|
|
@set 'action_value', value
|
|
@set "model.#{attribute}", value
|
|
@send 'validate_and_progress'
|
|
|
|
set_string_value: ->
|
|
@send 'set_value', 'string_value', @get('string_value')
|
|
|
|
set_text_value: ->
|
|
@send 'set_value', 'text_value', @get('text_value')
|
|
|
|
set_number_value: ->
|
|
@send 'set_value', 'number_value', @get('number_value')
|
|
|
|
set_timestamp_value: ->
|
|
@send 'set_value', 'timestamp_value', @get('timestamp_value')
|
|
|
|
close: ->
|
|
Ember.$('body').off('keyup.modal-dialog')
|
|
@_super arguments...
|
|
|
|
continue_from_inquiry: ->
|
|
record = @get('model')
|
|
#state = 'active'
|
|
#state = 'overdue' if @get('model.target_date')?.clone().add(record.get('workflow_action_definition.overdue_coulance') ,'day').format('YYYY-MM-DD') < moment().format('YYYY-MM-DD')
|
|
#record.set 'state', state
|
|
#record.save().then ->
|
|
# record.get('events').reload()
|
|
record.triggerEvent(event_key: 'state', event_value: 'active').then -> record.get('events').reload()
|
|
|
|
add_new_note: ->
|
|
return unless content = @get('new_note_content')
|
|
now = moment()
|
|
new_note_event = @store.createRecord 'panda/action-event',
|
|
client_identifier: @get('model.project_instance.client_identifier')
|
|
identifier: @get('model.workflow_action_definition.identifier')
|
|
event_key: 'note'
|
|
event_value: content
|
|
event_timestamp: now
|
|
new_note_event.save().then =>
|
|
@get('model.events').pushObject new_note_event
|
|
@set 'new_note_content', ''
|
|
#@send 'close'
|
|
|
|
start_inquiry: ->
|
|
record = @get('model')
|
|
#record.set 'state', 'inquiry'
|
|
#record.save().then => @send 'add_new_note'
|
|
record.triggerEvent(event_key: 'state', event_value: 'inquiry', note: @get('new_note_content')).then =>
|
|
record.get('events').reload()
|
|
@set 'new_note_content', ''
|
|
|
|
#record.save().then ->
|
|
# record.get('events').reload()
|
|
|
|
validate_and_progress: ->
|
|
# these validations are only needed for select value_type actions, since all the others have no dynamic values that will limit the progress
|
|
all_attached_actions_are_valid = true
|
|
@set 'attached_conditions_not_met_warning', ''
|
|
@get('model.pointing_project_instance_action_connections').forEach (pointing_connection) =>
|
|
if pointing_connection.get('connection_type') is 'attached'
|
|
if conditional_value = pointing_connection.get('conditional_base_value')
|
|
if conditional_value is @get('model.string_comparison_value') and not pointing_connection.get('project_instance_action.completed')
|
|
@set 'attached_conditions_not_met_warning', "#{pointing_connection.get('project_instance_action.workflow_action_definition.title')} not completed"
|
|
all_attached_actions_are_valid = false
|
|
#alert 'Attached not completed'
|
|
@send('saveRecord') if all_attached_actions_are_valid
|