diff --git a/addon/routes/action-list.coffee b/addon/routes/action-list.coffee index e8ebaac..d8fc5ed 100644 --- a/addon/routes/action-list.coffee +++ b/addon/routes/action-list.coffee @@ -7,7 +7,7 @@ export default_filter = Ember.Object.create project_id: '' project_instance_project_scenario_id: '' workflow_action_definition_organization_id: '' - offset_type_not_eq: 'attached' + workflow_action_definition_offset_type_not_eq: 'attached' state_in: [] target_date_gteq: null target_date_lteq: null diff --git a/addon/routes/action-list.js b/addon/routes/action-list.js index aec9bf6..e136a99 100644 --- a/addon/routes/action-list.js +++ b/addon/routes/action-list.js @@ -10,7 +10,7 @@ export var default_filter = Ember.Object.create({ project_id: '', project_instance_project_scenario_id: '', workflow_action_definition_organization_id: '', - offset_type_not_eq: 'attached', + workflow_action_definition_offset_type_not_eq: 'attached', state_in: [], target_date_gteq: null, target_date_lteq: null, diff --git a/app/components/project/modals/edit-instance-action.coffee b/app/components/project/modals/edit-instance-action.coffee index 682aac1..fc4c1ac 100644 --- a/app/components/project/modals/edit-instance-action.coffee +++ b/app/components/project/modals/edit-instance-action.coffee @@ -10,6 +10,8 @@ export default ModalBase.extend 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') @@ -42,9 +44,22 @@ export default ModalBase.extend @set 'number_value', @get('model.number_value') @set 'text_value', @get('model.text_value') @set 'timestamp_value', @get('model.timestamp_value') - @get('model.pointing_project_instance_action_connections').filterBy('connection_type', 'constraint').some (pointing_connection) => - return @set 'has_uncompleted_constraints', true unless pointing_connection.get('project_instance_action.completed') - false + @set 'attached_instance_action_connections', [] + @set 'attached_conditions_not_met_warning', '' # important te reset since attached actions can be completed on re-open of parent + @get('model.pointing_project_instance_action_connections').forEach (pointing_connection) => + if pointing_connection.get('connection_type') is 'constraint' and not @get('has_uncompleted_constraints') + @set 'has_uncompleted_constraints', true unless pointing_connection.get('project_instance_action.completed') + if pointing_connection.get('connection_type') is 'attached' + if conditional_value = pointing_connection.get('conditional_base_value') + switch @get('model.workflow_action_definition.value_type') + when 'boolean' + 3 + when 'select' + @get('attached_instance_action_connections').pushObject pointing_connection if conditional_value is @get('string_value') + + else + # always display non conditional attached actions + @get('attached_instance_action_connections').pushObject pointing_connection #@get('pointing_project_instance_action_connections').forEach (pointing_connection) -> select_class_names: Ember.computed 'model.string_value', -> @@ -62,6 +77,8 @@ export default ModalBase.extend actions: set_value: (attribute, value) -> + #@set attribute, value # internal setting for validation + @set 'action_value', value @set "model.#{attribute}", value @send 'saveRecord' @@ -73,6 +90,7 @@ export default ModalBase.extend set_number_value: -> @send 'set_value', 'number_value', @get('number_value') + set_timestamp_value: -> @send 'set_value', 'timestamp_value', @get('timestamp_value') @@ -110,3 +128,14 @@ export default ModalBase.extend #record.save().then -> # record.get('events').reload() + saveRecord: -> + 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' + @_super arguments... if all_attached_actions_are_valid diff --git a/app/models/panda/project-instance-action.coffee b/app/models/panda/project-instance-action.coffee index 0c8358c..b6f6583 100644 --- a/app/models/panda/project-instance-action.coffee +++ b/app/models/panda/project-instance-action.coffee @@ -38,6 +38,22 @@ export default DS.Model.extend cls = if @get('boolean_value') then 'checkmark box' else 'square outline' "".htmlSafe() + string_comparison_value: Ember.computed 'workflow_action_definition.value_type', '{string_value,number_value,text_value,date_value,timestamp_value,boolean_value}', -> + return '' unless value_type = @get('workflow_action_definition.value_type') + switch value_type + when 'string', 'select' + @get('string_value') + when 'number' + if number = @get('number_value') then String(number) else '' + when 'text' + @get('text_value') + when 'date' + if date = @get('date_value') then date.format('YYYY-MM-DD') else '' + when 'timestamp' + if timestamp = @get('timestamp_value') then timestamp.format('YYYY-MM-DDThh:mm:ss') else '' + when 'boolean' + String(@get('boolean_value')) + project: DS.belongsTo('panda/project', inverse: 'project_instance_actions') workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', inverse: 'project_instance_actions') project_instance_group: DS.belongsTo('panda/project-instance-group', inverse: 'project_instance_actions') diff --git a/app/templates/action-list.emblem b/app/templates/action-list.emblem index a11dbf2..1fa09ab 100644 --- a/app/templates/action-list.emblem +++ b/app/templates/action-list.emblem @@ -88,7 +88,7 @@ table.ui.attached.stiped.table = ui-markdown-popup tagName='i' class='info circle icon' markdown=project_instance_action.workflow_action_definition.extra_info td= format-date project_instance_action.target_date td= project/instance-action-value-display project_instance_action=project_instance_action - each project_instance_action.pointing_project_instance_action_connections as |project_instance_action_connection| + /each project_instance_action.pointing_project_instance_action_connections as |project_instance_action_connection| if (eq project_instance_action_connection.connection_type 'attached') tr.pointing-record unless scope_project diff --git a/app/templates/project/-edit-instance-action.emblem b/app/templates/project/-edit-instance-action.emblem index af93eaf..a6f2ec8 100644 --- a/app/templates/project/-edit-instance-action.emblem +++ b/app/templates/project/-edit-instance-action.emblem @@ -52,6 +52,10 @@ table.ui.top.attached.compact.definition.table if (eq value_type 'text') .ui.bottom.attached.segment = textarea value=text_value +each attached_instance_action_connections as |attached_instance_action_connection| + .ui.horizontal.divider + span Attached action + = attached_instance_action_connection.project_instance_action.workflow_action_definition.title /minimal space for calendar at bottom right if misc_events.length .ui.horizontal.divider events @@ -90,36 +94,51 @@ table.ui.top.attached.compact.definition.table button.ui.pink.button.pull-right{action 'continue_from_inquiry'} Continue… else if (eq value_type 'boolean') - if model.boolean_value - button.ui.yellow.button.pull-right{action 'set_value' 'boolean_value' false}= t 'project_instance_action.revoke' + if attached_conditions_not_met_warning + .ui.visible.warning.message.pull-right= attached_conditions_not_met_warning else - button.ui.primary.button.pull-right{action 'set_value' 'boolean_value' true}= t 'project_instance_action.done' + if model.boolean_value + button.ui.yellow.button.pull-right{action 'set_value' 'boolean_value' false}= t 'project_instance_action.revoke' + else + button.ui.primary.button.pull-right{action 'set_value' 'boolean_value' true}= t 'project_instance_action.done' else if (eq value_type 'date') - .pull-right: .ui.revoke.action.input - = ui-calendar-moment type='date' momentValue=model.date_value onChange=(action 'set_value' 'date_value') placeholder="Select date" popupOptions=(hash position='top right' maxSearchDepth=0) - if model.date_value - button.ui.yellow.button.pull-right{action 'set_value' 'date_value' null}= t 'project_instance_action.revoke' + if attached_conditions_not_met_warning + .ui.visible.warning.message.pull-right= attached_conditions_not_met_warning + else + .pull-right: .ui.revoke.action.input + = ui-calendar-moment type='date' momentValue=model.date_value onChange=(action 'set_value' 'date_value') placeholder="Select date" popupOptions=(hash position='top right' maxSearchDepth=0) + if model.date_value + button.ui.yellow.button.pull-right{action 'set_value' 'date_value' null}= t 'project_instance_action.revoke' else if (eq value_type 'timestamp') - if has_changed_timestamp_value - button.ui.primary.icon.button.pull-right{action 'set_timestamp_value'}: i.save.icon - if model.timestamp_value - button.ui.yellow.button.pull-right{action 'set_value' 'timestamp_value' null}= t 'project_instance_action.revoke' - .pull-right: .ui.revoke.action.input - = ui-calendar-moment type='datetime' ampm=false momentValue=timestamp_value onChange=(action (mut timestamp_value)) placeholder="Select timestamp" popupOptions=(hash position='top right' maxSearchDepth=0) + if attached_conditions_not_met_warning + .ui.visible.warning.message.pull-right= attached_conditions_not_met_warning + else + if has_changed_timestamp_value + button.ui.primary.icon.button.pull-right{action 'set_timestamp_value'}: i.save.icon + if model.timestamp_value + button.ui.yellow.button.pull-right{action 'set_value' 'timestamp_value' null}= t 'project_instance_action.revoke' + .pull-right: .ui.revoke.action.input + = ui-calendar-moment type='datetime' ampm=false momentValue=timestamp_value onChange=(action (mut timestamp_value)) placeholder="Select timestamp" popupOptions=(hash position='top right' maxSearchDepth=0) else if (eq value_type 'string') - .pull-right: .ui.revoke.action.input - = input value=string_value enter='set_string_value' - if (not-eq string_value model.string_value) - button.ui.primary.icon.button{action 'set_string_value'}: i.save.icon - if model.string_value - button.ui.yellow.button{action 'set_value' 'string_value' ''}= t 'project_instance_action.revoke' + if attached_conditions_not_met_warning + .ui.visible.warning.message.pull-right= attached_conditions_not_met_warning + else + .pull-right: .ui.revoke.action.input + = input value=string_value enter='set_string_value' + if (not-eq string_value model.string_value) + button.ui.primary.icon.button{action 'set_string_value'}: i.save.icon + if model.string_value + button.ui.yellow.button{action 'set_value' 'string_value' ''}= t 'project_instance_action.revoke' else if (eq value_type 'number') - .pull-right: .ui.revoke.action.input - = number-input numericValue=number_value step=1 enter='set_number_value' - if (not-eq number_value model.number_value) - button.ui.primary.icon.button{action 'set_number_value'}: i.save.icon - if model.number_value - button.ui.yellow.button.pull-right{action 'set_value' 'number_value' ''}= t 'project_instance_action.revoke' + if attached_conditions_not_met_warning + .ui.visible.warning.message.pull-right= attached_conditions_not_met_warning + else + .pull-right: .ui.revoke.action.input + = number-input numericValue=number_value step=1 enter='set_number_value' + if (not-eq number_value model.number_value) + button.ui.primary.icon.button{action 'set_number_value'}: i.save.icon + if model.number_value + button.ui.yellow.button.pull-right{action 'set_value' 'number_value' ''}= t 'project_instance_action.revoke' else if (eq value_type 'select') if model.workflow_action_definition.value_type_select_options.length .ui.buttons.pull-right @@ -130,18 +149,31 @@ table.ui.top.attached.compact.definition.table each model.workflow_action_definition.value_type_select_options as |option| .item= option if model.string_value + if attached_conditions_not_met_warning + button.ui.negative.icon.button + = ui-popup tagName='i' class='close icon' content=attached_conditions_not_met_warning + else + button.ui.primary.icon.button{action 'set_string_value'}: i.save.icon button.ui.yellow.button{action 'set_value' 'string_value' ''}= t 'project_instance_action.revoke' else .pull-right: .ui.revoke.action.input = input value=string_value enter='set_string_value' if model.string_value + if attached_conditions_not_met_warning + button.ui.negative.icon.button + = ui-popup tagName='i' class='close icon' content=attached_conditions_not_met_warning + else + button.ui.primary.icon.button{action 'set_string_value'}: i.save.icon button.ui.yellow.button{action 'set_value' 'string_value' ''}= t 'project_instance_action.revoke' else if (eq value_type 'text') - .ui.buttons.pull-right - if (not-eq text_value model.text_value) - button.ui.primary.button{action 'set_text_value'}= t 'project_instance_action.done' - if model.text_value - button.ui.yellow.button{action 'set_value' 'text_value' ''}= t 'project_instance_action.revoke' + if attached_conditions_not_met_warning + .ui.visible.warning.message.pull-right= attached_conditions_not_met_warning + else + .ui.buttons.pull-right + if (not-eq text_value model.text_value) + button.ui.primary.button{action 'set_text_value'}= t 'project_instance_action.done' + if model.text_value + button.ui.yellow.button{action 'set_value' 'text_value' ''}= t 'project_instance_action.revoke' button.ui.basic.button.modal-rollback{action "close"}= t 'general.close' diff --git a/tests/dummy/app/i18n/translations/attributes.coffee b/tests/dummy/app/i18n/translations/attributes.coffee index a69e6a6..78ed739 100644 --- a/tests/dummy/app/i18n/translations/attributes.coffee +++ b/tests/dummy/app/i18n/translations/attributes.coffee @@ -5,6 +5,7 @@ translations = attributes: uncategorized: 'uncategorized' unplanned: 'unplanned' planned: 'planned' + active: 'active' overdue: 'overdue' rejected: 'rejected' completed: 'completed' @@ -70,5 +71,5 @@ translations = attributes: workflow_action_offset: base_workflow_action_definition: 'Base ${models.workflow_action_definition}' workflow_action_connection: - conditional_base_value: 'Visible if ${models.workflow_action_definition} is' + conditional_base_value: 'Required if ${models.workflow_action_definition} is' export default translations