initial github commit
This commit is contained in:
@@ -0,0 +1,20 @@
|
|||||||
|
# EditorConfig helps developers define and maintain consistent
|
||||||
|
# coding styles between different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.hbs]
|
||||||
|
insert_final_newline = false
|
||||||
|
|
||||||
|
[*.{diff,md}]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
/**
|
||||||
|
Ember CLI sends analytics information by default. The data is completely
|
||||||
|
anonymous, but there are times when you might want to disable this behavior.
|
||||||
|
|
||||||
|
Setting `disableAnalytics` to true will prevent any data from being sent.
|
||||||
|
*/
|
||||||
|
"disableAnalytics": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 2017,
|
||||||
|
sourceType: 'module'
|
||||||
|
},
|
||||||
|
extends: 'eslint:recommended',
|
||||||
|
env: {
|
||||||
|
browser: true
|
||||||
|
},
|
||||||
|
globals: {
|
||||||
|
moment: true,
|
||||||
|
t: true,
|
||||||
|
is_translation_path: true
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
'no-cond-assign': 0
|
||||||
|
}
|
||||||
|
};
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
# See https://help.github.com/ignore-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# compiled output
|
||||||
|
/dist
|
||||||
|
/tmp
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
/bower_components
|
||||||
|
|
||||||
|
# misc
|
||||||
|
/.sass-cache
|
||||||
|
/connect.lock
|
||||||
|
/coverage/*
|
||||||
|
/libpeerconnection.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-error.log
|
||||||
|
testem.log
|
||||||
|
|
||||||
|
# ember-try
|
||||||
|
.node_modules.ember-try/
|
||||||
|
bower.json.ember-try
|
||||||
|
package.json.ember-try
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
/bower_components
|
||||||
|
/config/ember-try.js
|
||||||
|
/dist
|
||||||
|
/tests
|
||||||
|
/tmp
|
||||||
|
**/.gitkeep
|
||||||
|
.bowerrc
|
||||||
|
.editorconfig
|
||||||
|
.ember-cli
|
||||||
|
.gitignore
|
||||||
|
.eslintrc.js
|
||||||
|
.watchmanconfig
|
||||||
|
.travis.yml
|
||||||
|
bower.json
|
||||||
|
ember-cli-build.js
|
||||||
|
testem.js
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
# we recommend testing addons with the same minimum supported node version as Ember CLI
|
||||||
|
# so that your addon works for all apps
|
||||||
|
- "4"
|
||||||
|
|
||||||
|
sudo: false
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
|
addons:
|
||||||
|
chrome: stable
|
||||||
|
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- $HOME/.npm
|
||||||
|
|
||||||
|
env:
|
||||||
|
# we recommend new addons test the current and previous LTS
|
||||||
|
# as well as latest stable release (bonus points to beta/canary)
|
||||||
|
- EMBER_TRY_SCENARIO=ember-lts-2.8
|
||||||
|
- EMBER_TRY_SCENARIO=ember-lts-2.12
|
||||||
|
- EMBER_TRY_SCENARIO=ember-release
|
||||||
|
- EMBER_TRY_SCENARIO=ember-beta
|
||||||
|
- EMBER_TRY_SCENARIO=ember-canary
|
||||||
|
- EMBER_TRY_SCENARIO=ember-default
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
allow_failures:
|
||||||
|
- env: EMBER_TRY_SCENARIO=ember-canary
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- npm config set spin false
|
||||||
|
- npm install -g npm@4
|
||||||
|
- npm --version
|
||||||
|
|
||||||
|
script:
|
||||||
|
# Usually, it's ok to finish the test scenario without reverting
|
||||||
|
# to the addon's original dependency state, skipping "cleanup".
|
||||||
|
- node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"ignore_dirs": ["tmp", "dist"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# ember-panda
|
||||||
|
|
||||||
|
This README outlines the details of collaborating on this Ember addon.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
* `git clone <repository-url>` this repository
|
||||||
|
* `cd ember-panda`
|
||||||
|
* `npm install`
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
* `ember serve`
|
||||||
|
* Visit your app at [http://localhost:4200](http://localhost:4200).
|
||||||
|
|
||||||
|
## Running Tests
|
||||||
|
|
||||||
|
* `npm test` (Runs `ember try:each` to test your addon against multiple Ember versions)
|
||||||
|
* `ember test`
|
||||||
|
* `ember test --server`
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
* `ember build`
|
||||||
|
|
||||||
|
For more information on using ember-cli, visit [https://ember-cli.com/](https://ember-cli.com/).
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
tagName: 'span'
|
||||||
|
organizations: []
|
||||||
|
actions:
|
||||||
|
apply_filters: ->
|
||||||
|
@get('apply_filters')?()
|
||||||
|
set_scope_organization: (organization) ->
|
||||||
|
if organization?
|
||||||
|
#organization.reload().then =>
|
||||||
|
organization_id = organization?.get('id') || ''
|
||||||
|
@set 'scope_organization', organization
|
||||||
|
@set 'filters.workflow_action_definition_organization_id', organization_id
|
||||||
|
@$('.select-organization .dropdown.button').addClass('orange')
|
||||||
|
@send 'apply_filters'
|
||||||
|
else
|
||||||
|
@setProperties
|
||||||
|
scope_organization: null
|
||||||
|
scope_scenario: null
|
||||||
|
'filters.workflow_action_definition_organization_id': ''
|
||||||
|
@$('.select-organization .dropdown.button').removeClass('orange')
|
||||||
|
@send 'apply_filters'
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
tagName: 'span',
|
||||||
|
organizations: [],
|
||||||
|
actions: {
|
||||||
|
apply_filters: function() {
|
||||||
|
var base;
|
||||||
|
return typeof (base = this.get('apply_filters')) === "function" ? base() : void 0;
|
||||||
|
},
|
||||||
|
set_scope_organization: function(organization) {
|
||||||
|
var organization_id;
|
||||||
|
if (organization != null) {
|
||||||
|
organization_id = (organization != null ? organization.get('id') : void 0) || '';
|
||||||
|
this.set('scope_organization', organization);
|
||||||
|
this.set('filters.workflow_action_definition_organization_id', organization_id);
|
||||||
|
this.$('.select-organization .dropdown.button').addClass('orange');
|
||||||
|
return this.send('apply_filters');
|
||||||
|
} else {
|
||||||
|
this.setProperties({
|
||||||
|
scope_organization: null,
|
||||||
|
scope_scenario: null,
|
||||||
|
'filters.workflow_action_definition_organization_id': ''
|
||||||
|
}, this.$('.select-organization .dropdown.button').removeClass('orange'));
|
||||||
|
return this.send('apply_filters');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
{get} = Ember
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
tagName: 'span'
|
||||||
|
scope_project: null
|
||||||
|
scope_scenario: null
|
||||||
|
projects: []
|
||||||
|
actions:
|
||||||
|
apply_filters: ->
|
||||||
|
@get('apply_filters')?()
|
||||||
|
|
||||||
|
edit_project_instance_action: (project_instance_action) ->
|
||||||
|
@modal 'project/edit-instance-action', model: project_instance_action
|
||||||
|
set_scope_project: (project) ->
|
||||||
|
if project?
|
||||||
|
project.reload().then =>
|
||||||
|
project_id = project?.get('id') || ''
|
||||||
|
@set 'scope_project', project
|
||||||
|
@set 'filters.workflow_action_definition_title_cont', ''
|
||||||
|
@set 'filters.project_id', project_id
|
||||||
|
@$('.select-project .dropdown.button').addClass('orange')
|
||||||
|
@send 'apply_filters'
|
||||||
|
else
|
||||||
|
@setProperties
|
||||||
|
scope_project: null
|
||||||
|
scope_scenario: null
|
||||||
|
'filters.project_id': ''
|
||||||
|
'filters.project_instance_project_scenario_id': ''
|
||||||
|
@$('.select-project .dropdown.button').removeClass('orange')
|
||||||
|
@send 'apply_filters'
|
||||||
|
|
||||||
|
set_scope_scenario: (project_scenario) ->
|
||||||
|
if project_scenario
|
||||||
|
scenario_id = get(project_scenario, 'id')
|
||||||
|
@$('.select-project-scenario .dropdown.button').addClass('orange')
|
||||||
|
else
|
||||||
|
@$('.select-project-scenario .dropdown.button').removeClass('orange')
|
||||||
|
scenario_id = ''
|
||||||
|
@set 'filters.project_instance_project_scenario_id', scenario_id
|
||||||
|
@set 'scope_scenario', project_scenario
|
||||||
|
@send 'apply_filters'
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var get;
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
get = Ember.get;
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
tagName: 'span',
|
||||||
|
scope_project: null,
|
||||||
|
scope_scenario: null,
|
||||||
|
projects: [],
|
||||||
|
actions: {
|
||||||
|
apply_filters: function() {
|
||||||
|
var base;
|
||||||
|
return typeof (base = this.get('apply_filters')) === "function" ? base() : void 0;
|
||||||
|
},
|
||||||
|
edit_project_instance_action: function(project_instance_action) {
|
||||||
|
return this.modal('project/edit-instance-action', {
|
||||||
|
model: project_instance_action
|
||||||
|
});
|
||||||
|
},
|
||||||
|
set_scope_project: function(project) {
|
||||||
|
if (project != null) {
|
||||||
|
return project.reload().then((function(_this) {
|
||||||
|
return function() {
|
||||||
|
var project_id;
|
||||||
|
project_id = (project != null ? project.get('id') : void 0) || '';
|
||||||
|
_this.set('scope_project', project);
|
||||||
|
_this.set('filters.workflow_action_definition_title_cont', '');
|
||||||
|
_this.set('filters.project_id', project_id);
|
||||||
|
_this.$('.select-project .dropdown.button').addClass('orange');
|
||||||
|
return _this.send('apply_filters');
|
||||||
|
};
|
||||||
|
})(this));
|
||||||
|
} else {
|
||||||
|
this.setProperties({
|
||||||
|
scope_project: null,
|
||||||
|
scope_scenario: null,
|
||||||
|
'filters.project_id': '',
|
||||||
|
'filters.project_instance_project_scenario_id': ''
|
||||||
|
}, this.$('.select-project .dropdown.button').removeClass('orange'));
|
||||||
|
return this.send('apply_filters');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set_scope_scenario: function(project_scenario) {
|
||||||
|
var scenario_id;
|
||||||
|
if (project_scenario) {
|
||||||
|
scenario_id = get(project_scenario, 'id');
|
||||||
|
this.$('.select-project-scenario .dropdown.button').addClass('orange');
|
||||||
|
} else {
|
||||||
|
this.$('.select-project-scenario .dropdown.button').removeClass('orange');
|
||||||
|
scenario_id = '';
|
||||||
|
}
|
||||||
|
this.set('filters.project_instance_project_scenario_id', scenario_id);
|
||||||
|
this.set('scope_scenario', project_scenario);
|
||||||
|
return this.send('apply_filters');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import config from 'ember-get-config'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
tagName: 'img'
|
||||||
|
init: ->
|
||||||
|
src = if config.environment is 'development' or config.environment is 'test'
|
||||||
|
"#{config.rootURL}ember-panda/assets/#{@get('path')}"
|
||||||
|
else
|
||||||
|
"#{config.rootURL}assets/#{@get('path')}"
|
||||||
|
@set 'full_src', src
|
||||||
|
@_super arguments...
|
||||||
|
attributeBindings: ['full_src:src']
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
import config from 'ember-get-config';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
tagName: 'img',
|
||||||
|
init: function() {
|
||||||
|
var src;
|
||||||
|
src = config.environment === 'development' || config.environment === 'test' ? config.rootURL + "ember-panda/assets/" + (this.get('path')) : config.rootURL + "assets/" + (this.get('path'));
|
||||||
|
this.set('full_src', src);
|
||||||
|
return this._super.apply(this, arguments);
|
||||||
|
},
|
||||||
|
attributeBindings: ['full_src:src']
|
||||||
|
});
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
classNames: ['ui', 'small', 'buttons', 'active-project-scenario-selector-component']
|
||||||
|
project: null
|
||||||
|
active_project_scenario: null
|
||||||
|
|
||||||
|
actions:
|
||||||
|
show_project_scenarios_grid: (project) ->
|
||||||
|
@modal 'project/project-scenarios-show-grid',
|
||||||
|
model: project
|
||||||
|
edit_selected_project_scenario: ->
|
||||||
|
return unless project_scenario = @get('active_project_scenario')
|
||||||
|
@modal 'project/edit-project-scenario',
|
||||||
|
model: project_scenario
|
||||||
|
closeOnOverlay: false
|
||||||
|
destroy_callback: =>
|
||||||
|
@set 'active_project_scenario', null
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
classNames: ['ui', 'small', 'buttons', 'active-project-scenario-selector-component'],
|
||||||
|
project: null,
|
||||||
|
active_project_scenario: null,
|
||||||
|
actions: {
|
||||||
|
show_project_scenarios_grid: function(project) {
|
||||||
|
return this.modal('project/project-scenarios-show-grid', {
|
||||||
|
model: project
|
||||||
|
});
|
||||||
|
},
|
||||||
|
edit_selected_project_scenario: function() {
|
||||||
|
var project_scenario;
|
||||||
|
if (!(project_scenario = this.get('active_project_scenario'))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return this.modal('project/edit-project-scenario', {
|
||||||
|
model: project_scenario,
|
||||||
|
closeOnOverlay: false,
|
||||||
|
destroy_callback: (function(_this) {
|
||||||
|
return function() {
|
||||||
|
return _this.set('active_project_scenario', null);
|
||||||
|
};
|
||||||
|
})(this)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
classNames: ['project-instance-action-value-display']
|
||||||
|
eventIO: null
|
||||||
|
project_instance_action: null
|
||||||
|
value_type: Ember.computed.alias 'project_instance_action.workflow_action_definition.value_type'
|
||||||
|
save: ->
|
||||||
|
|
||||||
|
# https://stackoverflow.com/questions/26967855/handling-click-and-doubleclick-on-same-view-in-emberjs
|
||||||
|
doubleClick: ->
|
||||||
|
eventIO = @get 'eventIO'
|
||||||
|
if eventIO?
|
||||||
|
Ember.run.cancel eventIO
|
||||||
|
@set 'eventIO', null
|
||||||
|
|
||||||
|
if @get('value_type') is 'boolean'
|
||||||
|
#@toggleProperty 'project_instance_action.boolean_value'
|
||||||
|
#@get('project_instance_action').save()
|
||||||
|
|
||||||
|
# always modal, otherwise implement authorizations overhere
|
||||||
|
@modal 'project/edit-instance-action',
|
||||||
|
model: @get('project_instance_action')
|
||||||
|
save: @save
|
||||||
|
close: @save
|
||||||
|
else
|
||||||
|
# fallback to single click behaviour
|
||||||
|
@modal 'project/edit-instance-action',
|
||||||
|
model: @get('project_instance_action')
|
||||||
|
save: @save
|
||||||
|
close: @save
|
||||||
|
|
||||||
|
|
||||||
|
click: ->
|
||||||
|
if @get('eventIO') is null
|
||||||
|
eventIO = Ember.run.later @, ->
|
||||||
|
@modal 'project/edit-instance-action',
|
||||||
|
model: @get('project_instance_action')
|
||||||
|
save: @save
|
||||||
|
close: @save
|
||||||
|
if @get('eventIO') isnt null
|
||||||
|
Ember.run.cancel @get('eventIO')
|
||||||
|
@set 'eventIO', null
|
||||||
|
, 500
|
||||||
|
@set 'eventIO', eventIO
|
||||||
|
|
||||||
|
actions:
|
||||||
|
right_click: ->
|
||||||
|
debugger
|
||||||
|
false
|
||||||
|
#edit_record: ->
|
||||||
|
# @modal 'project/edit-instance-action', model: @get('project_instance_action')
|
||||||
|
# false
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
classNames: ['project-instance-action-value-display'],
|
||||||
|
eventIO: null,
|
||||||
|
project_instance_action: null,
|
||||||
|
value_type: Ember.computed.alias('project_instance_action.workflow_action_definition.value_type'),
|
||||||
|
save: function() {},
|
||||||
|
doubleClick: function() {
|
||||||
|
var eventIO;
|
||||||
|
eventIO = this.get('eventIO');
|
||||||
|
if (eventIO != null) {
|
||||||
|
Ember.run.cancel(eventIO);
|
||||||
|
this.set('eventIO', null);
|
||||||
|
}
|
||||||
|
if (this.get('value_type') === 'boolean') {
|
||||||
|
return this.modal('project/edit-instance-action', {
|
||||||
|
model: this.get('project_instance_action'),
|
||||||
|
save: this.save,
|
||||||
|
close: this.save
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return this.modal('project/edit-instance-action', {
|
||||||
|
model: this.get('project_instance_action'),
|
||||||
|
save: this.save,
|
||||||
|
close: this.save
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
click: function() {
|
||||||
|
var eventIO;
|
||||||
|
if (this.get('eventIO') === null) {
|
||||||
|
eventIO = Ember.run.later(this, function() {
|
||||||
|
this.modal('project/edit-instance-action', {
|
||||||
|
model: this.get('project_instance_action'),
|
||||||
|
save: this.save,
|
||||||
|
close: this.save
|
||||||
|
});
|
||||||
|
if (this.get('eventIO') !== null) {
|
||||||
|
Ember.run.cancel(this.get('eventIO'));
|
||||||
|
return this.set('eventIO', null);
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
return this.set('eventIO', eventIO);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
right_click: function() {
|
||||||
|
debugger;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
Component = Ember.Component.extend
|
||||||
|
tagName: 'span'
|
||||||
|
classNames: ['ui', 'label', 'state-badge']
|
||||||
|
classNameBindings: ['ui_class', 'having_action:with-action', 'basic:basic']
|
||||||
|
action: null
|
||||||
|
state: '…'
|
||||||
|
human_state: Ember.computed 'state', ->
|
||||||
|
return '-' unless state = @get('state')
|
||||||
|
t("attributes.state.#{state}", default: state)
|
||||||
|
having_action: Ember.computed.bool 'action'
|
||||||
|
click: ->
|
||||||
|
@action?()
|
||||||
|
ui_class: Ember.computed 'state', ->
|
||||||
|
switch @get('state')
|
||||||
|
when 'overdue' then 'yellow'
|
||||||
|
when 'completed', 'all_completed' then 'green'
|
||||||
|
when 'rejected', 'any_rejected' then 'red'
|
||||||
|
when 'active', 'processing' then 'blue'
|
||||||
|
when 'inquiry' then 'pink'
|
||||||
|
else 'grey'
|
||||||
|
|
||||||
|
Component.reopenClass
|
||||||
|
positionalParams: ['state']
|
||||||
|
|
||||||
|
export default Component
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var Component;
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
Component = Ember.Component.extend({
|
||||||
|
tagName: 'span',
|
||||||
|
classNames: ['ui', 'label', 'state-badge'],
|
||||||
|
classNameBindings: ['ui_class', 'having_action:with-action', 'basic:basic'],
|
||||||
|
action: null,
|
||||||
|
state: '…',
|
||||||
|
human_state: Ember.computed('state', function() {
|
||||||
|
var state;
|
||||||
|
if (!(state = this.get('state'))) {
|
||||||
|
return '-';
|
||||||
|
}
|
||||||
|
return t("attributes.state." + state, {
|
||||||
|
"default": state
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
having_action: Ember.computed.bool('action'),
|
||||||
|
click: function() {
|
||||||
|
return typeof this.action === "function" ? this.action() : void 0;
|
||||||
|
},
|
||||||
|
ui_class: Ember.computed('state', function() {
|
||||||
|
switch (this.get('state')) {
|
||||||
|
case 'overdue':
|
||||||
|
return 'yellow';
|
||||||
|
case 'completed':
|
||||||
|
case 'all_completed':
|
||||||
|
return 'green';
|
||||||
|
case 'rejected':
|
||||||
|
case 'any_rejected':
|
||||||
|
return 'red';
|
||||||
|
case 'active':
|
||||||
|
case 'processing':
|
||||||
|
return 'blue';
|
||||||
|
case 'inquiry':
|
||||||
|
return 'pink';
|
||||||
|
default:
|
||||||
|
return 'grey';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
Component.reopenClass({
|
||||||
|
positionalParams: ['state']
|
||||||
|
});
|
||||||
|
|
||||||
|
export default Component;
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
classNames: ['ui-multi-select-container']
|
||||||
|
labelProperty: 'name'
|
||||||
|
placeholder: 'Select' # can be a text or translation string: organization.select_users.placeholder => # 'Select ${models.plural.user} (%{count})'
|
||||||
|
options: []
|
||||||
|
selected: []
|
||||||
|
placeholder_text: Ember.computed 'placeholder', ->
|
||||||
|
placeholder = @get('placeholder')
|
||||||
|
placeholder = t(placeholder, count: @get('options.length')) if is_translation_path(placeholder)
|
||||||
|
placeholder.htmlSafe()
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
classNames: ['ui-multi-select-container'],
|
||||||
|
labelProperty: 'name',
|
||||||
|
placeholder: 'Select',
|
||||||
|
options: [],
|
||||||
|
selected: [],
|
||||||
|
placeholder_text: Ember.computed('placeholder', function() {
|
||||||
|
var placeholder;
|
||||||
|
placeholder = this.get('placeholder');
|
||||||
|
if (is_translation_path(placeholder)) {
|
||||||
|
placeholder = t(placeholder, {
|
||||||
|
count: this.get('options.length')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return placeholder.htmlSafe();
|
||||||
|
})
|
||||||
|
});
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
tagName: 'span'
|
||||||
|
type: null
|
||||||
|
classNames: ['value-type-display']
|
||||||
|
classNameBindings: ['typeClass']
|
||||||
|
typeClass: Ember.computed 'type', -> @get('type') || 'no-typ'
|
||||||
|
iconClass: Ember.computed 'type', ->
|
||||||
|
switch @get('type')
|
||||||
|
when 'boolean' then 'checkmark box'
|
||||||
|
when 'date' then 'calendar'
|
||||||
|
when 'select' then 'list'
|
||||||
|
when 'string' then 'terminal'
|
||||||
|
when 'text' then 'sticky note outline'
|
||||||
|
when 'number' then 'hashtag'
|
||||||
|
when 'timestamp' then 'wait'
|
||||||
|
else 'red warning circle'
|
||||||
|
# &.date
|
||||||
|
# @extend .fa-calendar
|
||||||
|
# &.number
|
||||||
|
# @extend .fa-hashtag
|
||||||
|
# &.select
|
||||||
|
# @extend .fa-list-ul
|
||||||
|
# &.string
|
||||||
|
# @extend .fa-terminal
|
||||||
|
# &.text
|
||||||
|
# @extend .fa-sticky-note-o
|
||||||
|
# &.window_from
|
||||||
|
# @extend .fa-clock-o
|
||||||
|
# &.window_to
|
||||||
|
# @extend .fa-clock-o
|
||||||
|
# &.timestamp
|
||||||
|
# @extend .fa-clock-o
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
tagName: 'span',
|
||||||
|
type: null,
|
||||||
|
classNames: ['value-type-display'],
|
||||||
|
classNameBindings: ['typeClass'],
|
||||||
|
typeClass: Ember.computed('type', function() {
|
||||||
|
return this.get('type') || 'no-typ';
|
||||||
|
}),
|
||||||
|
iconClass: Ember.computed('type', function() {
|
||||||
|
switch (this.get('type')) {
|
||||||
|
case 'boolean':
|
||||||
|
return 'checkmark box';
|
||||||
|
case 'date':
|
||||||
|
return 'calendar';
|
||||||
|
case 'select':
|
||||||
|
return 'list';
|
||||||
|
case 'string':
|
||||||
|
return 'terminal';
|
||||||
|
case 'text':
|
||||||
|
return 'sticky note outline';
|
||||||
|
case 'number':
|
||||||
|
return 'hashtag';
|
||||||
|
case 'timestamp':
|
||||||
|
return 'wait';
|
||||||
|
default:
|
||||||
|
return 'red warning circle';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import config from 'ember-get-config'
|
||||||
|
|
||||||
|
export default Ember.Controller.extend
|
||||||
|
session: Ember.inject.service('session')
|
||||||
|
filters: {}
|
||||||
|
scope_project: null
|
||||||
|
scope_scenario: null
|
||||||
|
scope_organization: null
|
||||||
|
filter_query: Ember.computed 'filters.filter_calls', ->
|
||||||
|
@get('filters')?.toProperties() || {}
|
||||||
|
export_human_url: Ember.computed 'filters.filter_calls', ->
|
||||||
|
model_name = 'panda/project-instance-action'
|
||||||
|
base_url = @store.adapterFor(model_name).buildURL(model_name)
|
||||||
|
filter_addition = $.param q: @get('filter_query')
|
||||||
|
"#{base_url}/export_human.csv?#{filter_addition}"
|
||||||
|
export_technical_url: Ember.computed 'filters.filter_calls', ->
|
||||||
|
model_name = 'panda/project-instance-action'
|
||||||
|
base_url = @store.adapterFor(model_name).buildURL(model_name)
|
||||||
|
filter_addition = $.param q: @get('filter_query')
|
||||||
|
"#{base_url}/export_technical.csv?#{filter_addition}"
|
||||||
|
apply_filters: ->
|
||||||
|
@incrementProperty 'filters.filter_calls'
|
||||||
|
@set 'model.project_instance_actions.page', 1
|
||||||
|
@set 'model.project_instance_actions.lastPage', null
|
||||||
|
@get('model.project_instance_actions').setOtherParam('q', @get('filter_query'))
|
||||||
|
false
|
||||||
|
actions:
|
||||||
|
refresh_list: -> @apply_filters()
|
||||||
|
edit_project_instance_action: (project_instance_action) ->
|
||||||
|
@modal 'project/edit-instance-action', model: project_instance_action
|
||||||
|
|
||||||
|
toggle_filter: (key, value, checked) ->
|
||||||
|
new_value = []
|
||||||
|
if checked
|
||||||
|
new_value = new_value.concat(@get("filters.#{key}")).concat(value)
|
||||||
|
else
|
||||||
|
@get("filters.#{key}").forEach (present_in_filter) ->
|
||||||
|
new_value.push present_in_filter unless present_in_filter is value
|
||||||
|
@set "filters.#{key}", new_value
|
||||||
|
@apply_filters()
|
||||||
|
clear_filter: (keys...) ->
|
||||||
|
keys.forEach (key) =>
|
||||||
|
if Ember.isArray(@get("filters.#{key}"))
|
||||||
|
@set "filters.#{key}", []
|
||||||
|
else
|
||||||
|
@set "filters.#{key}", null
|
||||||
|
@apply_filters()
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var slice = [].slice;
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
import config from 'ember-get-config';
|
||||||
|
|
||||||
|
export default Ember.Controller.extend({
|
||||||
|
session: Ember.inject.service('session'),
|
||||||
|
filters: {},
|
||||||
|
scope_project: null,
|
||||||
|
scope_scenario: null,
|
||||||
|
scope_organization: null,
|
||||||
|
filter_query: Ember.computed('filters.filter_calls', function() {
|
||||||
|
var ref;
|
||||||
|
return ((ref = this.get('filters')) != null ? ref.toProperties() : void 0) || {};
|
||||||
|
}),
|
||||||
|
export_human_url: Ember.computed('filters.filter_calls', function() {
|
||||||
|
var base_url, filter_addition, model_name;
|
||||||
|
model_name = 'panda/project-instance-action';
|
||||||
|
base_url = this.store.adapterFor(model_name).buildURL(model_name);
|
||||||
|
filter_addition = $.param({
|
||||||
|
q: this.get('filter_query')
|
||||||
|
});
|
||||||
|
return base_url + "/export_human.csv?" + filter_addition;
|
||||||
|
}),
|
||||||
|
export_technical_url: Ember.computed('filters.filter_calls', function() {
|
||||||
|
var base_url, filter_addition, model_name;
|
||||||
|
model_name = 'panda/project-instance-action';
|
||||||
|
base_url = this.store.adapterFor(model_name).buildURL(model_name);
|
||||||
|
filter_addition = $.param({
|
||||||
|
q: this.get('filter_query')
|
||||||
|
});
|
||||||
|
return base_url + "/export_technical.csv?" + filter_addition;
|
||||||
|
}),
|
||||||
|
apply_filters: function() {
|
||||||
|
this.incrementProperty('filters.filter_calls');
|
||||||
|
this.set('model.project_instance_actions.page', 1);
|
||||||
|
this.set('model.project_instance_actions.lastPage', null);
|
||||||
|
this.get('model.project_instance_actions').setOtherParam('q', this.get('filter_query'));
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
refresh_list: function() {
|
||||||
|
return this.apply_filters();
|
||||||
|
},
|
||||||
|
edit_project_instance_action: function(project_instance_action) {
|
||||||
|
return this.modal('project/edit-instance-action', {
|
||||||
|
model: project_instance_action
|
||||||
|
});
|
||||||
|
},
|
||||||
|
toggle_filter: function(key, value, checked) {
|
||||||
|
var new_value;
|
||||||
|
new_value = [];
|
||||||
|
if (checked) {
|
||||||
|
new_value = new_value.concat(this.get("filters." + key)).concat(value);
|
||||||
|
} else {
|
||||||
|
this.get("filters." + key).forEach(function(present_in_filter) {
|
||||||
|
if (present_in_filter !== value) {
|
||||||
|
return new_value.push(present_in_filter);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.set("filters." + key, new_value);
|
||||||
|
return this.apply_filters();
|
||||||
|
},
|
||||||
|
clear_filter: function() {
|
||||||
|
var keys;
|
||||||
|
keys = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
||||||
|
keys.forEach((function(_this) {
|
||||||
|
return function(key) {
|
||||||
|
if (Ember.isArray(_this.get("filters." + key))) {
|
||||||
|
return _this.set("filters." + key, []);
|
||||||
|
} else {
|
||||||
|
return _this.set("filters." + key, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(this));
|
||||||
|
return this.apply_filters();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Mixin.create
|
||||||
|
selected_project_scenarios: [] # null
|
||||||
|
selected_project_scenarios_set_operation: 'union' # union or intersection
|
||||||
|
active_workflow_action_definitions: []
|
||||||
|
active_workflow_action_definition_ids: []
|
||||||
|
|
||||||
|
set_active_workflow_action_definitions: ->
|
||||||
|
# initialize unused working workflow-action-definitions
|
||||||
|
if @get('selected_project_scenarios.length')
|
||||||
|
if @get('selected_project_scenarios_set_operation') is 'intersection'
|
||||||
|
@set_active_workflow_action_definitions_using_intersection()
|
||||||
|
else
|
||||||
|
@set_active_workflow_action_definitions_using_union()
|
||||||
|
else
|
||||||
|
@set 'active_workflow_action_definitions', @get('project.workflow_action_definitions') || []
|
||||||
|
@set 'active_workflow_action_definition_ids', @get('active_workflow_action_definitions').mapBy('id').toArray()
|
||||||
|
|
||||||
|
set_active_workflow_action_definitions_using_union: ->
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = []
|
||||||
|
working_workflow_action_definitions = []
|
||||||
|
@get('selected_project_scenarios').forEach (selected_project_scenario) ->
|
||||||
|
selected_project_scenario.get('workflow_action_definitions').forEach (workflow_action_definition) ->
|
||||||
|
if selected_project_scenario_workflow_action_definition_ids.indexOf(workflow_action_definition.get('id')) < 0
|
||||||
|
selected_project_scenario_workflow_action_definition_ids.push workflow_action_definition.get('id')
|
||||||
|
working_workflow_action_definitions.push workflow_action_definition
|
||||||
|
@set 'active_workflow_action_definitions', working_workflow_action_definitions
|
||||||
|
@set 'active_workflow_action_definition_ids', selected_project_scenario_workflow_action_definition_ids
|
||||||
|
|
||||||
|
set_active_workflow_action_definitions_using_intersection: ->
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = []
|
||||||
|
first_run = true
|
||||||
|
@get('selected_project_scenarios').forEach (selected_project_scenario) ->
|
||||||
|
current_workflow_action_definition_ids = selected_project_scenario.get('workflow_action_definitions').mapBy('id').toArray()
|
||||||
|
if first_run
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = current_workflow_action_definition_ids
|
||||||
|
first_run = false
|
||||||
|
return
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = selected_project_scenario_workflow_action_definition_ids.filter (id) -> id in current_workflow_action_definition_ids
|
||||||
|
|
||||||
|
@set 'active_workflow_action_definition_ids', selected_project_scenario_workflow_action_definition_ids
|
||||||
|
@set 'active_workflow_action_definitions', @get('project.workflow_action_definitions').filter((r) -> r.get('id') in selected_project_scenario_workflow_action_definition_ids)
|
||||||
|
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Mixin.create({
|
||||||
|
selected_project_scenarios: [],
|
||||||
|
selected_project_scenarios_set_operation: 'union',
|
||||||
|
active_workflow_action_definitions: [],
|
||||||
|
active_workflow_action_definition_ids: [],
|
||||||
|
set_active_workflow_action_definitions: function() {
|
||||||
|
if (this.get('selected_project_scenarios.length')) {
|
||||||
|
if (this.get('selected_project_scenarios_set_operation') === 'intersection') {
|
||||||
|
return this.set_active_workflow_action_definitions_using_intersection();
|
||||||
|
} else {
|
||||||
|
return this.set_active_workflow_action_definitions_using_union();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.set('active_workflow_action_definitions', this.get('project.workflow_action_definitions') || []);
|
||||||
|
return this.set('active_workflow_action_definition_ids', this.get('active_workflow_action_definitions').mapBy('id').toArray());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set_active_workflow_action_definitions_using_union: function() {
|
||||||
|
var selected_project_scenario_workflow_action_definition_ids, working_workflow_action_definitions;
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = [];
|
||||||
|
working_workflow_action_definitions = [];
|
||||||
|
this.get('selected_project_scenarios').forEach(function(selected_project_scenario) {
|
||||||
|
return selected_project_scenario.get('workflow_action_definitions').forEach(function(workflow_action_definition) {
|
||||||
|
if (selected_project_scenario_workflow_action_definition_ids.indexOf(workflow_action_definition.get('id')) < 0) {
|
||||||
|
selected_project_scenario_workflow_action_definition_ids.push(workflow_action_definition.get('id'));
|
||||||
|
return working_workflow_action_definitions.push(workflow_action_definition);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.set('active_workflow_action_definitions', working_workflow_action_definitions);
|
||||||
|
return this.set('active_workflow_action_definition_ids', selected_project_scenario_workflow_action_definition_ids);
|
||||||
|
},
|
||||||
|
set_active_workflow_action_definitions_using_intersection: function() {
|
||||||
|
var first_run, selected_project_scenario_workflow_action_definition_ids;
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = [];
|
||||||
|
first_run = true;
|
||||||
|
this.get('selected_project_scenarios').forEach(function(selected_project_scenario) {
|
||||||
|
var current_workflow_action_definition_ids;
|
||||||
|
current_workflow_action_definition_ids = selected_project_scenario.get('workflow_action_definitions').mapBy('id').toArray();
|
||||||
|
if (first_run) {
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = current_workflow_action_definition_ids;
|
||||||
|
first_run = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return selected_project_scenario_workflow_action_definition_ids = selected_project_scenario_workflow_action_definition_ids.filter(function(id) {
|
||||||
|
return indexOf.call(current_workflow_action_definition_ids, id) >= 0;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.set('active_workflow_action_definition_ids', selected_project_scenario_workflow_action_definition_ids);
|
||||||
|
return this.set('active_workflow_action_definitions', this.get('project.workflow_action_definitions').filter(function(r) {
|
||||||
|
var ref;
|
||||||
|
return ref = r.get('id'), indexOf.call(selected_project_scenario_workflow_action_definition_ids, ref) >= 0;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
export default Ember.Mixin.create
|
||||||
|
get_active_workflow_groups: (workflow_groups, project_scenarios, set_operation = 'union')->
|
||||||
|
project_scenarios = Ember.makeArray(project_scenarios)
|
||||||
|
workflow_groups = workflow_groups.toArray()
|
||||||
|
# initialize unused working workflow-groups
|
||||||
|
if project_scenarios.length
|
||||||
|
if set_operation is 'intersection'
|
||||||
|
@get_active_workflow_groups_using_intersection(workflow_groups, project_scenarios)
|
||||||
|
else
|
||||||
|
@get_active_workflow_groups_using_union(project_scenarios)
|
||||||
|
else
|
||||||
|
workflow_groups
|
||||||
|
|
||||||
|
#@set 'active_workflow_groups', workflow_groups || []
|
||||||
|
#@set 'active_workflow_group_ids', @get('active_workflow_groups').mapBy('id').toArray()
|
||||||
|
|
||||||
|
get_active_workflow_groups_using_union: (project_scenarios) ->
|
||||||
|
selected_project_scenario_workflow_group_ids = []
|
||||||
|
working_workflow_groups = []
|
||||||
|
project_scenarios.forEach (selected_project_scenario) ->
|
||||||
|
selected_project_scenario.get('workflow_groups').forEach (workflow_group) ->
|
||||||
|
if selected_project_scenario_workflow_group_ids.indexOf(workflow_group.get('id')) < 0
|
||||||
|
selected_project_scenario_workflow_group_ids.push workflow_group.get('id')
|
||||||
|
working_workflow_groups.push workflow_group
|
||||||
|
#working_workflow_groups = working_workflow_groups
|
||||||
|
#@set 'active_workflow_groups', working_workflow_groups
|
||||||
|
#@set 'active_workflow_group_ids', selected_project_scenario_workflow_group_ids
|
||||||
|
working_workflow_groups
|
||||||
|
|
||||||
|
get_active_workflow_groups_using_intersection: (workflow_groups, project_scenarios) ->
|
||||||
|
selected_project_scenario_workflow_group_ids = []
|
||||||
|
first_run = true
|
||||||
|
project_scenarios.forEach (selected_project_scenario) ->
|
||||||
|
current_workflow_group_ids = selected_project_scenario.get('workflow_groups').mapBy('id').toArray()
|
||||||
|
if first_run
|
||||||
|
selected_project_scenario_workflow_group_ids = current_workflow_group_ids
|
||||||
|
first_run = false
|
||||||
|
return
|
||||||
|
selected_project_scenario_workflow_group_ids = selected_project_scenario_workflow_group_ids.filter (id) -> id in current_workflow_group_ids
|
||||||
|
|
||||||
|
#@set 'active_workflow_group_ids', selected_project_scenario_workflow_group_ids
|
||||||
|
#@set 'active_workflow_groups', workflow_groups.filter((r) -> r.get('id') in selected_project_scenario_workflow_group_ids)
|
||||||
|
workflow_groups.filter((r) -> r.get('id') in selected_project_scenario_workflow_group_ids)
|
||||||
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Mixin.create({
|
||||||
|
get_active_workflow_groups: function(workflow_groups, project_scenarios, set_operation) {
|
||||||
|
if (set_operation == null) {
|
||||||
|
set_operation = 'union';
|
||||||
|
}
|
||||||
|
project_scenarios = Ember.makeArray(project_scenarios);
|
||||||
|
workflow_groups = workflow_groups.toArray();
|
||||||
|
if (project_scenarios.length) {
|
||||||
|
if (set_operation === 'intersection') {
|
||||||
|
return this.get_active_workflow_groups_using_intersection(workflow_groups, project_scenarios);
|
||||||
|
} else {
|
||||||
|
return this.get_active_workflow_groups_using_union(project_scenarios);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return workflow_groups;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
get_active_workflow_groups_using_union: function(project_scenarios) {
|
||||||
|
var selected_project_scenario_workflow_group_ids, working_workflow_groups;
|
||||||
|
selected_project_scenario_workflow_group_ids = [];
|
||||||
|
working_workflow_groups = [];
|
||||||
|
project_scenarios.forEach(function(selected_project_scenario) {
|
||||||
|
return selected_project_scenario.get('workflow_groups').forEach(function(workflow_group) {
|
||||||
|
if (selected_project_scenario_workflow_group_ids.indexOf(workflow_group.get('id')) < 0) {
|
||||||
|
selected_project_scenario_workflow_group_ids.push(workflow_group.get('id'));
|
||||||
|
return working_workflow_groups.push(workflow_group);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return working_workflow_groups;
|
||||||
|
},
|
||||||
|
get_active_workflow_groups_using_intersection: function(workflow_groups, project_scenarios) {
|
||||||
|
var first_run, selected_project_scenario_workflow_group_ids;
|
||||||
|
selected_project_scenario_workflow_group_ids = [];
|
||||||
|
first_run = true;
|
||||||
|
project_scenarios.forEach(function(selected_project_scenario) {
|
||||||
|
var current_workflow_group_ids;
|
||||||
|
current_workflow_group_ids = selected_project_scenario.get('workflow_groups').mapBy('id').toArray();
|
||||||
|
if (first_run) {
|
||||||
|
selected_project_scenario_workflow_group_ids = current_workflow_group_ids;
|
||||||
|
first_run = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return selected_project_scenario_workflow_group_ids = selected_project_scenario_workflow_group_ids.filter(function(id) {
|
||||||
|
return indexOf.call(current_workflow_group_ids, id) >= 0;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return workflow_groups.filter(function(r) {
|
||||||
|
var ref;
|
||||||
|
return ref = r.get('id'), indexOf.call(selected_project_scenario_workflow_group_ids, ref) >= 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import DS from 'ember-data'
|
||||||
|
|
||||||
|
export default DS.Model.extend
|
||||||
|
client_identifier: DS.attr('string')
|
||||||
|
identifier: DS.attr('string')
|
||||||
|
event_key: DS.attr('string')
|
||||||
|
event_value: DS.attr('string')
|
||||||
|
event_timestamp: DS.attr('moment')
|
||||||
|
source: DS.attr('string')
|
||||||
|
|
||||||
|
project_instance_action: DS.belongsTo('panda/project-instance-action', inverse: 'events')
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import DS from 'ember-data';
|
||||||
|
|
||||||
|
export default DS.Model.extend({
|
||||||
|
client_identifier: DS.attr('string'),
|
||||||
|
identifier: DS.attr('string'),
|
||||||
|
event_key: DS.attr('string'),
|
||||||
|
event_value: DS.attr('string'),
|
||||||
|
event_timestamp: DS.attr('moment'),
|
||||||
|
source: DS.attr('string'),
|
||||||
|
project_instance_action: DS.belongsTo('panda/project-instance-action', {
|
||||||
|
inverse: 'events'
|
||||||
|
})
|
||||||
|
});
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import DS from 'ember-data'
|
||||||
|
|
||||||
|
export default DS.Model.extend
|
||||||
|
project_instance_action: DS.belongsTo('panda/project-instance-action')
|
||||||
|
base_project_instance_action: DS.belongsTo('panda/project-instance-action', inverse: 'pointing_project_instance_action_connections')
|
||||||
|
conditional_base_value: DS.attr('string')
|
||||||
|
connection_type: DS.attr('string')
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import DS from 'ember-data';
|
||||||
|
|
||||||
|
export default DS.Model.extend({
|
||||||
|
project_instance_action: DS.belongsTo('panda/project-instance-action'),
|
||||||
|
base_project_instance_action: DS.belongsTo('panda/project-instance-action', {
|
||||||
|
inverse: 'pointing_project_instance_action_connections'
|
||||||
|
}),
|
||||||
|
conditional_base_value: DS.attr('string'),
|
||||||
|
connection_type: DS.attr('string')
|
||||||
|
});
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import DS from 'ember-data'
|
||||||
|
|
||||||
|
export default DS.Model.extend
|
||||||
|
conditional_base_value: DS.attr('string', defaultValue: '')
|
||||||
|
connection_type: DS.attr('string') # attached, constraint, info
|
||||||
|
|
||||||
|
workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', inverse: 'workflow_action_connections')
|
||||||
|
base_workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', inverse: 'pointing_workflow_action_connections')
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import DS from 'ember-data';
|
||||||
|
|
||||||
|
export default DS.Model.extend({
|
||||||
|
conditional_base_value: DS.attr('string', {
|
||||||
|
defaultValue: ''
|
||||||
|
}),
|
||||||
|
connection_type: DS.attr('string'),
|
||||||
|
workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', {
|
||||||
|
inverse: 'workflow_action_connections'
|
||||||
|
}),
|
||||||
|
base_workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', {
|
||||||
|
inverse: 'pointing_workflow_action_connections'
|
||||||
|
})
|
||||||
|
});
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import DS from 'ember-data'
|
||||||
|
import add_business_day_computations from 'ember-panda/utils/business-day-computations'
|
||||||
|
|
||||||
|
export value_type_options = ['boolean', 'date', 'number', 'select', 'string', 'text', 'timestamp']
|
||||||
|
Model =
|
||||||
|
identifier: DS.attr('string')
|
||||||
|
title: DS.attr('string')
|
||||||
|
name: Ember.computed.alias 'title'
|
||||||
|
description: DS.attr('string')
|
||||||
|
isEditing: DS.attr('boolean', defaultValue: false) #TODO: remove, is from PMBC
|
||||||
|
done: DS.attr('boolean', defaultValue: false) #TODO: remove, is from PMBC
|
||||||
|
position: DS.attr('number', defaultValue: 0)
|
||||||
|
value_type: DS.attr('string', defaultValue: 'boolean') # means checkbox progress type
|
||||||
|
value_type_select_options: DS.attr(defaultValue: -> [])
|
||||||
|
extra_info: DS.attr('string')
|
||||||
|
offset_type: DS.attr('string', defaultValue: 'none') # none, attached, configured
|
||||||
|
overdue_coulance: DS.attr('number', defaultValue: 0)
|
||||||
|
completes_group: DS.attr('boolean', defaultValue: false)
|
||||||
|
|
||||||
|
# Offset tree
|
||||||
|
#action_offset_base: DS.belongsTo('workflow-action-definition', inverse: 'action_offset_dependents')
|
||||||
|
#action_offset_dependents: DS.hasMany('workflow-action-definition', inverse: null) # do not give with api, will clear inverse if not given
|
||||||
|
|
||||||
|
workflow_group: DS.belongsTo('panda/workflow-group')
|
||||||
|
project: DS.belongsTo('panda/project', inverse: 'workflow_action_definitions')
|
||||||
|
organization: DS.belongsTo('panda/organization', inverse: 'workflow_action_definitions')
|
||||||
|
workflow_action_constraints: DS.hasMany('panda/workflow-action-constraint', inverse: 'workflow_action_definition')
|
||||||
|
workflow_action_offsets: DS.hasMany('panda/workflow-action-offset', inverse: 'workflow_action_definition')
|
||||||
|
dependent_workflow_action_offsets: DS.hasMany('panda/workflow-action-offset', inverse: 'base_workflow_action_definition')
|
||||||
|
#project_scenarios: DS.hasMany('panda/project-scenario', inverse: 'workflow_action_definitions')
|
||||||
|
project_scenarios: DS.hasMany('panda/project-scenario', inverse: null)
|
||||||
|
project_instance_actions: DS.hasMany('panda/project-instance-action', inverse: 'workflow_action_definition')
|
||||||
|
confirms_workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', inverse: 'confirmed_by_workflow_action_definition')
|
||||||
|
confirmed_by_workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', inverse: 'confirms_workflow_action_definition')
|
||||||
|
|
||||||
|
workflow_action_connections: DS.hasMany('panda/workflow-action-connection', inverse: 'workflow_action_definition')
|
||||||
|
pointing_workflow_action_connections: DS.hasMany('panda/workflow-action-connection', inverse: 'base_workflow_action_definition')
|
||||||
|
|
||||||
|
absolute_position: Ember.computed 'workflow_group.position', 'position', ->
|
||||||
|
(@get('workflow_group.position') || 99) * 100 + (@get('position') || 99 )
|
||||||
|
|
||||||
|
#drag_identifier: Ember.computed 'id', 'workflow_group.id', 'position', ->
|
||||||
|
# "#{@get('id')}-#{@get('workflow_group.id')}-#{@get('position')}"
|
||||||
|
#smart_position: Ember.computed 'done', 'position', ->
|
||||||
|
# num = @get('position')
|
||||||
|
# if @get('done') then num + 1000 else num
|
||||||
|
add_business_day_computations Model, 'offset', add_attributes: true
|
||||||
|
add_business_day_computations Model, 'batch_element_threshold', add_attributes: true #, default_unit: 'businessday'
|
||||||
|
export default DS.Model.extend(Model)
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var Model;
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
import DS from 'ember-data';
|
||||||
|
|
||||||
|
import add_business_day_computations from 'ember-panda/utils/business-day-computations';
|
||||||
|
|
||||||
|
export var value_type_options = ['boolean', 'date', 'number', 'select', 'string', 'text', 'timestamp'];
|
||||||
|
|
||||||
|
Model = {
|
||||||
|
identifier: DS.attr('string'),
|
||||||
|
title: DS.attr('string'),
|
||||||
|
name: Ember.computed.alias('title'),
|
||||||
|
description: DS.attr('string'),
|
||||||
|
isEditing: DS.attr('boolean', {
|
||||||
|
defaultValue: false
|
||||||
|
}),
|
||||||
|
done: DS.attr('boolean', {
|
||||||
|
defaultValue: false
|
||||||
|
}),
|
||||||
|
position: DS.attr('number', {
|
||||||
|
defaultValue: 0
|
||||||
|
}),
|
||||||
|
value_type: DS.attr('string', {
|
||||||
|
defaultValue: 'boolean'
|
||||||
|
}),
|
||||||
|
value_type_select_options: DS.attr({
|
||||||
|
defaultValue: function() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
extra_info: DS.attr('string'),
|
||||||
|
offset_type: DS.attr('string', {
|
||||||
|
defaultValue: 'none'
|
||||||
|
}),
|
||||||
|
overdue_coulance: DS.attr('number', {
|
||||||
|
defaultValue: 0
|
||||||
|
}),
|
||||||
|
completes_group: DS.attr('boolean', {
|
||||||
|
defaultValue: false
|
||||||
|
}),
|
||||||
|
workflow_group: DS.belongsTo('panda/workflow-group'),
|
||||||
|
project: DS.belongsTo('panda/project', {
|
||||||
|
inverse: 'workflow_action_definitions'
|
||||||
|
}),
|
||||||
|
organization: DS.belongsTo('panda/organization', {
|
||||||
|
inverse: 'workflow_action_definitions'
|
||||||
|
}),
|
||||||
|
workflow_action_constraints: DS.hasMany('panda/workflow-action-constraint', {
|
||||||
|
inverse: 'workflow_action_definition'
|
||||||
|
}),
|
||||||
|
workflow_action_offsets: DS.hasMany('panda/workflow-action-offset', {
|
||||||
|
inverse: 'workflow_action_definition'
|
||||||
|
}),
|
||||||
|
dependent_workflow_action_offsets: DS.hasMany('panda/workflow-action-offset', {
|
||||||
|
inverse: 'base_workflow_action_definition'
|
||||||
|
}),
|
||||||
|
project_scenarios: DS.hasMany('panda/project-scenario', {
|
||||||
|
inverse: null
|
||||||
|
}),
|
||||||
|
project_instance_actions: DS.hasMany('panda/project-instance-action', {
|
||||||
|
inverse: 'workflow_action_definition'
|
||||||
|
}),
|
||||||
|
confirms_workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', {
|
||||||
|
inverse: 'confirmed_by_workflow_action_definition'
|
||||||
|
}),
|
||||||
|
confirmed_by_workflow_action_definition: DS.belongsTo('panda/workflow-action-definition', {
|
||||||
|
inverse: 'confirms_workflow_action_definition'
|
||||||
|
}),
|
||||||
|
workflow_action_connections: DS.hasMany('panda/workflow-action-connection', {
|
||||||
|
inverse: 'workflow_action_definition'
|
||||||
|
}),
|
||||||
|
pointing_workflow_action_connections: DS.hasMany('panda/workflow-action-connection', {
|
||||||
|
inverse: 'base_workflow_action_definition'
|
||||||
|
}),
|
||||||
|
absolute_position: Ember.computed('workflow_group.position', 'position', function() {
|
||||||
|
return (this.get('workflow_group.position') || 99) * 100 + (this.get('position') || 99);
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
add_business_day_computations(Model, 'offset', {
|
||||||
|
add_attributes: true
|
||||||
|
});
|
||||||
|
|
||||||
|
add_business_day_computations(Model, 'batch_element_threshold', {
|
||||||
|
add_attributes: true
|
||||||
|
});
|
||||||
|
|
||||||
|
export default DS.Model.extend(Model);
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import PagedRemoteArray from 'ember-cli-pagination/remote/paged-remote-array'
|
||||||
|
export default_filter = Ember.Object.create
|
||||||
|
filter_calls: 0
|
||||||
|
workflow_action_definition_id_in: []
|
||||||
|
project_instance_group_workflow_group_id: ''
|
||||||
|
project_id: ''
|
||||||
|
project_instance_project_scenario_id: ''
|
||||||
|
workflow_action_definition_organization_id: ''
|
||||||
|
offset_type_not_eq: 'attached'
|
||||||
|
state_in: []
|
||||||
|
target_date_gteq: null
|
||||||
|
target_date_lteq: null
|
||||||
|
s: 'target_date asc'
|
||||||
|
|
||||||
|
export default Ember.Route.extend
|
||||||
|
queryParams:
|
||||||
|
q:
|
||||||
|
refreshModel: true
|
||||||
|
setupController: (controller, model) ->
|
||||||
|
controller.set 'filters', default_filter
|
||||||
|
@_super arguments...
|
||||||
|
|
||||||
|
model: (params) ->
|
||||||
|
#@store.findAll('epots/migration-window-planning')
|
||||||
|
otherParams = {q: default_filter.toProperties()}
|
||||||
|
includes = [
|
||||||
|
'workflow_action_definition.~workflow_action_connections'
|
||||||
|
'workflow_action_definition.~pointing_workflow_action_connections'
|
||||||
|
'workflow_action_definition.~organization'
|
||||||
|
'workflow_action_definition.~workflow_action_offsets'
|
||||||
|
'project_instance_group.~project'
|
||||||
|
'project_instance_group.~project_instance'
|
||||||
|
'project_instance_group.~project_instance_actions'
|
||||||
|
'project_instance_group.workflow_group'
|
||||||
|
'project_instance.~project'
|
||||||
|
'project_instance.project_scenario.~project'
|
||||||
|
'project_instance.project_scenario.~workflow_groups'
|
||||||
|
'project_instance.project_scenario.~workflow_action_definitions'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.~project'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.~project_instance'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.~project_instance_group'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.~pointing_project_instance_action_connections'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~workflow_action_connections'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~pointing_workflow_action_connections'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~organization'
|
||||||
|
'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~workflow_action_offsets'
|
||||||
|
].join(',')
|
||||||
|
#includes += ','
|
||||||
|
#includes += [
|
||||||
|
# 'project.users'
|
||||||
|
#].join(',')
|
||||||
|
includes = 'action-list'
|
||||||
|
otherParams.include = includes
|
||||||
|
Ember.RSVP.hash
|
||||||
|
projects: @store.findAll('panda/project')
|
||||||
|
organizations: @store.findAll('panda/organization')
|
||||||
|
project_instance_actions:
|
||||||
|
PagedRemoteArray.create
|
||||||
|
modelName: 'panda/project-instance-action'
|
||||||
|
store: @store
|
||||||
|
page: params.page || 1
|
||||||
|
perPage: params.perPage || 30
|
||||||
|
otherParams: otherParams
|
||||||
|
paramMapping:
|
||||||
|
total_pages: 'total-pages'
|
||||||
|
total_count: 'total-count'
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
import PagedRemoteArray from 'ember-cli-pagination/remote/paged-remote-array';
|
||||||
|
|
||||||
|
export var default_filter = Ember.Object.create({
|
||||||
|
filter_calls: 0,
|
||||||
|
workflow_action_definition_id_in: [],
|
||||||
|
project_instance_group_workflow_group_id: '',
|
||||||
|
project_id: '',
|
||||||
|
project_instance_project_scenario_id: '',
|
||||||
|
workflow_action_definition_organization_id: '',
|
||||||
|
offset_type_not_eq: 'attached',
|
||||||
|
state_in: [],
|
||||||
|
target_date_gteq: null,
|
||||||
|
target_date_lteq: null,
|
||||||
|
s: 'target_date asc'
|
||||||
|
});
|
||||||
|
|
||||||
|
export default Ember.Route.extend({
|
||||||
|
queryParams: {
|
||||||
|
q: {
|
||||||
|
refreshModel: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setupController: function(controller, model) {
|
||||||
|
controller.set('filters', default_filter);
|
||||||
|
return this._super.apply(this, arguments);
|
||||||
|
},
|
||||||
|
model: function(params) {
|
||||||
|
var includes, otherParams;
|
||||||
|
otherParams = {
|
||||||
|
q: default_filter.toProperties()
|
||||||
|
};
|
||||||
|
includes = ['workflow_action_definition.~workflow_action_connections', 'workflow_action_definition.~pointing_workflow_action_connections', 'workflow_action_definition.~organization', 'workflow_action_definition.~workflow_action_offsets', 'project_instance_group.~project', 'project_instance_group.~project_instance', 'project_instance_group.~project_instance_actions', 'project_instance_group.workflow_group', 'project_instance.~project', 'project_instance.project_scenario.~project', 'project_instance.project_scenario.~workflow_groups', 'project_instance.project_scenario.~workflow_action_definitions', 'pointing_project_instance_action_connections.project_instance_action.~project', 'pointing_project_instance_action_connections.project_instance_action.~project_instance', 'pointing_project_instance_action_connections.project_instance_action.~project_instance_group', 'pointing_project_instance_action_connections.project_instance_action.~pointing_project_instance_action_connections', 'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~workflow_action_connections', 'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~pointing_workflow_action_connections', 'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~organization', 'pointing_project_instance_action_connections.project_instance_action.workflow_action_definition.~workflow_action_offsets'].join(',');
|
||||||
|
includes = 'action-list';
|
||||||
|
otherParams.include = includes;
|
||||||
|
return Ember.RSVP.hash({
|
||||||
|
projects: this.store.findAll('panda/project'),
|
||||||
|
organizations: this.store.findAll('panda/organization'),
|
||||||
|
project_instance_actions: PagedRemoteArray.create({
|
||||||
|
modelName: 'panda/project-instance-action',
|
||||||
|
store: this.store,
|
||||||
|
page: params.page || 1,
|
||||||
|
perPage: params.perPage || 30,
|
||||||
|
otherParams: otherParams,
|
||||||
|
paramMapping: {
|
||||||
|
total_pages: 'total-pages',
|
||||||
|
total_count: 'total-count'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
$sort-background-color: #566573;
|
||||||
|
|
||||||
|
$button-tny: 2px;
|
||||||
|
$primary-color: blue;
|
||||||
|
$success-color: green;
|
||||||
|
$warning-color: yellow;
|
||||||
|
$alert-color: red;
|
||||||
|
$secondary-color: grey;
|
||||||
|
$info-color: lightblue;
|
||||||
|
$non-default-attention-color: #f2711c;
|
||||||
|
|
||||||
|
@import './semantic-ui-additions';
|
||||||
|
|
||||||
|
//@import './mixins/animations';
|
||||||
|
//@import './mixins/buttons';
|
||||||
|
|
||||||
|
@import './components/buttons';
|
||||||
|
@import './components/format-json';
|
||||||
|
@import './components/forms';
|
||||||
|
//@import './components/flash-message';
|
||||||
|
//@import './components/modal';
|
||||||
|
@import './components/multiselect';
|
||||||
|
@import './components/project-instance-action-value-display';
|
||||||
|
//@import './components/page-title';
|
||||||
|
@import './components/resources';
|
||||||
|
@import './components/sortable';
|
||||||
|
@import './components/select-duration';
|
||||||
|
@import './components/state-badge';
|
||||||
|
@import './components/tables';
|
||||||
|
@import './components/title-box';
|
||||||
|
|
||||||
|
//@import './resources/login-form';
|
||||||
|
@import './resources/businessdays';
|
||||||
|
@import './resources/projects';
|
||||||
|
@import './resources/project-instance';
|
||||||
|
@import './resources/tracker-subject';
|
||||||
|
@import './resources/workflow-action-definition';
|
||||||
|
@import './resources/workflow-groups';
|
||||||
|
@import './resources/workflow-group-constraints';
|
||||||
|
@import './resources/manual';
|
||||||
|
|
||||||
|
// DIAGRAMS ARE SVGs
|
||||||
|
@import './diagrams/project/workflow-action-offsets-graph';
|
||||||
|
@import './diagrams/project/workflow-group-offset-diagram';
|
||||||
|
@import './diagrams/project/action-execution-offset-diagram';
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
//=push-action-button($color: $primary-color)
|
||||||
|
// +button($bg: $color, $padding: $button-tny)
|
||||||
|
// margin-bottom: 0
|
||||||
|
// &.right
|
||||||
|
// margin-left: 8px
|
||||||
|
|
||||||
|
//.push-action
|
||||||
|
// $push-action-padding: $button-tny
|
||||||
|
// +push-action-button
|
||||||
|
// .icon
|
||||||
|
// @extend .fa
|
||||||
|
// &.new
|
||||||
|
// +push-action-button($primary-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-plus
|
||||||
|
// &.edit
|
||||||
|
// +push-action-button($warning-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-pencil
|
||||||
|
// &.destroy
|
||||||
|
// +push-action-button($alert-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-trash
|
||||||
|
// &.save
|
||||||
|
// +push-action-button($success-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-save
|
||||||
|
// &.rollback
|
||||||
|
// +push-action-button($secondary-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-undo
|
||||||
|
// &.show
|
||||||
|
// +push-action-button($info-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-eye
|
||||||
|
// &.sort
|
||||||
|
// +push-action-button($sort-background-color)
|
||||||
|
// .icon
|
||||||
|
// @extend .fa-sort
|
||||||
|
|
||||||
|
// &.new, &.edit, &.save, &.rollback, &.destroy, &.show, &.info
|
||||||
|
// margin-right: rem-calc(20)
|
||||||
|
// &:last-of-type
|
||||||
|
// margin-right: 0
|
||||||
|
// .push-action-content
|
||||||
|
// padding-left: rem-calc(10)
|
||||||
|
|
||||||
|
.workflow-instance-workflow-group-title, .workflow-action-definition-item, .project-header
|
||||||
|
.push-action
|
||||||
|
margin: 0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
.format-json-container
|
||||||
|
max-height: 500px
|
||||||
|
overflow: scroll
|
||||||
|
.json-formatter-top-node-name
|
||||||
|
cursor: pointer
|
||||||
|
.json-formatter-constructor-name
|
||||||
|
// Do not show the names Object and Array
|
||||||
|
display: none
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
.ui.input
|
||||||
|
input[type=number]
|
||||||
|
text-align: right
|
||||||
|
//.form-row
|
||||||
|
// +grid-row
|
||||||
|
// .form-label
|
||||||
|
// @media #{$small-only}
|
||||||
|
// +grid-column($columns:10, $center:true)
|
||||||
|
// @media #{$medium-only}
|
||||||
|
// +grid-column($columns:4, $offset:1)
|
||||||
|
// @media #{$large-up}
|
||||||
|
// +grid-column(3)
|
||||||
|
// &.half
|
||||||
|
// +grid-column(6)
|
||||||
|
// .form-field
|
||||||
|
// @media #{$small-only}
|
||||||
|
// +grid-column($columns:10, $center:true, $last-column:true)
|
||||||
|
// @media #{$medium-only}
|
||||||
|
// +grid-column($columns:4, $last-column:false)
|
||||||
|
// @media #{$large-up}
|
||||||
|
// +grid-column($columns: 4, $last-column:false)
|
||||||
|
// &.full
|
||||||
|
// @media #{$small-only}
|
||||||
|
// +grid-column($columns:10, $center:true, $last-column:true)
|
||||||
|
// @media #{$medium-only}
|
||||||
|
// +grid-column($columns:7, $last-column:true)
|
||||||
|
// @media #{$large-up}
|
||||||
|
// +grid-column($columns: 9, $last-column:true)
|
||||||
|
// &.half
|
||||||
|
// +grid-column(6)
|
||||||
|
// .error
|
||||||
|
// color: $alert-color
|
||||||
|
// .form-info
|
||||||
|
// @media #{$small-only}
|
||||||
|
// +grid-column($columns:10, $center:true)
|
||||||
|
// @media #{$medium-only}
|
||||||
|
// +grid-column($columns:4, $offset:1)
|
||||||
|
// @media #{$large-up}
|
||||||
|
// +grid-column(3)
|
||||||
|
// .error-message
|
||||||
|
// color: $alert-color
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
.multiselect-checkboxes
|
||||||
|
list-style: none
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.project-instance-action-value-display
|
||||||
|
.value-missing
|
||||||
|
color: #aaa
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
.resource-row
|
||||||
|
margin-bottom: rem-calc(10)
|
||||||
|
h2, .content
|
||||||
|
.resource-descriptor
|
||||||
|
padding-right: 8px
|
||||||
|
&:after
|
||||||
|
content: ':'
|
||||||
|
.resource-name
|
||||||
|
text-decoration: underline
|
||||||
|
.resource-suffix
|
||||||
|
font-weight: normal
|
||||||
|
padding-left: 8px
|
||||||
|
font-size: 0.8em
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
.select-duration
|
||||||
|
.ui.input
|
||||||
|
&.left.labeled
|
||||||
|
color: green
|
||||||
|
&+ .dropdown
|
||||||
|
margin-left: 51px
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
.sortable-list
|
||||||
|
list-style: none
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.state-badge
|
||||||
|
&.with-action
|
||||||
|
cursor: pointer
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
tr.pointing-record
|
||||||
|
+ .record-with-pointing-records
|
||||||
|
td
|
||||||
|
border-top: 3px solid #aaa
|
||||||
|
td
|
||||||
|
&:first-child
|
||||||
|
border-left: 8px solid #aaa
|
||||||
|
&:last-child
|
||||||
|
border-right: 8px solid #aaa
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/* Based on the bootstrap 3+ panel, of course under a different name.
|
||||||
|
The conversion is done based on:
|
||||||
|
http://stackoverflow.com/questions/19220027/can-you-use-panels-in-bootstrap-2-3
|
||||||
|
.title-box
|
||||||
|
padding: 15px
|
||||||
|
margin-bottom: 20px
|
||||||
|
background-color: #ffffff
|
||||||
|
border: 1px solid #dddddd
|
||||||
|
border-radius: 4px
|
||||||
|
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05)
|
||||||
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05)
|
||||||
|
|
||||||
|
.title-box-heading
|
||||||
|
padding: 10px 15px
|
||||||
|
margin: -15px -15px 15px
|
||||||
|
font-size: 17.5px
|
||||||
|
font-weight: 500
|
||||||
|
background-color: #f5f5f5
|
||||||
|
border-bottom: 1px solid #dddddd
|
||||||
|
border-top-right-radius: 3px
|
||||||
|
border-top-left-radius: 3px
|
||||||
|
|
||||||
|
.title-box-footer
|
||||||
|
padding: 10px 15px
|
||||||
|
margin: 15px -15px -15px
|
||||||
|
background-color: #f5f5f5
|
||||||
|
border-top: 1px solid #dddddd
|
||||||
|
border-bottom-right-radius: 3px
|
||||||
|
border-bottom-left-radius: 3px
|
||||||
|
|
||||||
|
.title-box-primary
|
||||||
|
border-color: #428bca
|
||||||
|
.title-box-heading
|
||||||
|
color: #ffffff
|
||||||
|
background-color: #428bca
|
||||||
|
border-color: #428bca
|
||||||
|
|
||||||
|
.title-box-success
|
||||||
|
border-color: #d6e9c6
|
||||||
|
|
||||||
|
.title-box-heading
|
||||||
|
color: #468847
|
||||||
|
background-color: #dff0d8
|
||||||
|
border-color: #d6e9c6
|
||||||
|
|
||||||
|
.title-box-warning
|
||||||
|
border-color: #fbeed5
|
||||||
|
|
||||||
|
.title-box-heading
|
||||||
|
color: #c09853
|
||||||
|
background-color: #fcf8e3
|
||||||
|
border-color: #fbeed5
|
||||||
|
|
||||||
|
.title-box-danger
|
||||||
|
border-color: #eed3d7
|
||||||
|
|
||||||
|
.title-box-heading
|
||||||
|
color: #b94a48
|
||||||
|
background-color: #f2dede
|
||||||
|
border-color: #eed3d7
|
||||||
|
|
||||||
|
.title-box-info
|
||||||
|
border-color: #bce8f1
|
||||||
|
|
||||||
|
.title-box-heading
|
||||||
|
color: #3a87ad
|
||||||
|
background-color: #d9edf7
|
||||||
|
border-color: #bce8f1
|
||||||
|
|
||||||
|
//State specific additions
|
||||||
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
.action-execution-offset-diagram-component, .action-execution-offset-diagram-component-old2
|
||||||
|
.noUi-tooltip
|
||||||
|
white-space: nowrap
|
||||||
|
.range-slider-container
|
||||||
|
padding: 18px 30px
|
||||||
|
.action-execution-offset-diagram-container
|
||||||
|
.offset-line
|
||||||
|
stroke: #adadad
|
||||||
|
stroke-width: 1px
|
||||||
|
.base-line
|
||||||
|
stroke: #2185d0
|
||||||
|
stroke-width: 3px
|
||||||
|
.action-descriptions
|
||||||
|
.action-description-text
|
||||||
|
text-anchor: start
|
||||||
|
// within .tooltipstered
|
||||||
|
.tooltipster-base
|
||||||
|
.edit-workflow-action-definition
|
||||||
|
margin: -3px 0 5px 10px !important
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.workflow-action-offsets-graph-component
|
||||||
|
.range-slider-container
|
||||||
|
padding: 18px 30px
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
.workflow-group-offset-diagram-component
|
||||||
|
.noUi-tooltip
|
||||||
|
white-space: nowrap
|
||||||
|
.range-slider-container
|
||||||
|
padding: 18px 30px
|
||||||
|
|
||||||
|
// SVG
|
||||||
|
.workflow-group-offset-diagram-container
|
||||||
|
.groups-crossing-left-axis
|
||||||
|
text
|
||||||
|
fill: black
|
||||||
|
font-weight: bold
|
||||||
|
.groups-crossing-right-axis
|
||||||
|
text
|
||||||
|
fill: black
|
||||||
|
font-weight: bold
|
||||||
|
text-anchor: end
|
||||||
|
.bar
|
||||||
|
fill: #5f89ad
|
||||||
|
&.lead-time-none
|
||||||
|
fill: #f2711c
|
||||||
|
&.extra-duration
|
||||||
|
fill: #fff
|
||||||
|
fill-opacity: 0.2
|
||||||
|
.offset-line
|
||||||
|
stroke: #adadad
|
||||||
|
stroke-width: 1px
|
||||||
|
.base-line
|
||||||
|
stroke: #2185d0
|
||||||
|
stroke-width: 3px
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
.default-business-days
|
||||||
|
.non-default-business-days
|
||||||
|
.select-businessdays-in-week
|
||||||
|
color: $non-default-attention-color
|
||||||
|
.ui.header
|
||||||
|
color: $non-default-attention-color
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.login-form
|
||||||
|
&.ui.grid
|
||||||
|
margin-top: 20px
|
||||||
|
.column
|
||||||
|
max-width: 450px
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
.ui.grid.manual
|
||||||
|
.nav-column
|
||||||
|
padding-top: 2rem
|
||||||
|
padding-left: 2rem
|
||||||
|
.ui.sticky.fixed.top
|
||||||
|
// allow space for top navigation
|
||||||
|
padding-top: 50px
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
.project-instance-list-tab-container
|
||||||
|
.project-instance-list-workflow-group-container
|
||||||
|
display: table
|
||||||
|
border-bottom: 1px solid #aaa
|
||||||
|
width: 100%
|
||||||
|
&:first-child
|
||||||
|
border-top: 1px solid #aaa
|
||||||
|
.project-instance-list-workflow-group-row
|
||||||
|
display: table-row
|
||||||
|
font-size: 1.2em
|
||||||
|
font-weight: bold
|
||||||
|
background-color: #ddd
|
||||||
|
.project-instance-list-workflow-action-definition-row
|
||||||
|
display: table-row
|
||||||
|
.project-instance-list-workflow-group, .project-instance-list-workflow-action-definition
|
||||||
|
display: table-cell
|
||||||
|
width: 33%
|
||||||
|
padding: 7px
|
||||||
|
.project-instance-list-workflow-step-context, .project-instance-list-workflow-action-context
|
||||||
|
display: table-cell
|
||||||
|
padding: 7px
|
||||||
|
//.project-instance-list-workflow-group
|
||||||
|
//font-size: 1.2em
|
||||||
|
//font-weight: bold
|
||||||
|
//background-color: #ddd
|
||||||
|
//.project-instance-list-workflow-step-context
|
||||||
|
//line-height: 1.2em
|
||||||
|
//padding: 7px
|
||||||
|
//background-color: #dff
|
||||||
|
//border-top: 1px solid #bbb
|
||||||
|
//&:last-child
|
||||||
|
//border-bottom: 1px solid #bbb
|
||||||
|
//.project-instance-list-workflow-action-definition
|
||||||
|
//border-bottom: 1px solid #bbb
|
||||||
|
//&:first-child
|
||||||
|
//border-top: 1px solid #bbb
|
||||||
|
//.project-instance-list-workflow-action-context
|
||||||
|
//border-top: 1px solid #bbb
|
||||||
|
//&:last-child
|
||||||
|
//border-bottom: 1px solid #bbb
|
||||||
|
table.ui.definition.table
|
||||||
|
tr.pointing-action
|
||||||
|
&.constraint
|
||||||
|
&.uncompleted
|
||||||
|
td
|
||||||
|
font-weight: bold
|
||||||
|
color: #700
|
||||||
|
i
|
||||||
|
font-size: 1.5em
|
||||||
|
color: #700
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
ul.project-user-select
|
||||||
|
workflow_group-style: none
|
||||||
|
.ui.header
|
||||||
|
.project-scenarios-dropdown-container
|
||||||
|
float: right
|
||||||
|
margin-top: -3px // visual
|
||||||
|
font-size: 0.7em
|
||||||
|
|
||||||
|
.project-scenarios-dropdown-container
|
||||||
|
.ui.multiple.dropdown
|
||||||
|
i.dropdown.icon
|
||||||
|
margin-right: -20px
|
||||||
|
margin-top: 5px
|
||||||
|
.ui.button.logical-icon-button
|
||||||
|
padding: 2px 7px 0px
|
||||||
|
.logical-icon-image
|
||||||
|
height: 26px
|
||||||
|
.active-project-scenario-selector-component.ui.buttons
|
||||||
|
margin-left: 8px
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
.tracker-subject-tracker-groups-container
|
||||||
|
display: flex
|
||||||
|
flex-direction: row
|
||||||
|
flex-wrap: wrap
|
||||||
|
align-items: flex-start
|
||||||
|
justify-content: space-around
|
||||||
|
|
||||||
|
.tracker-subject-tracker-group-container
|
||||||
|
@extend .title-box
|
||||||
|
//float: left
|
||||||
|
width: 412px
|
||||||
|
.tracker-subject-tracker-group-title
|
||||||
|
@extend .title-box-heading
|
||||||
|
.tracker-subject-tracker-group-body
|
||||||
|
.display-row
|
||||||
|
&.attribute-notes
|
||||||
|
display: none
|
||||||
|
.display-label
|
||||||
|
width: 65%
|
||||||
|
.display-field
|
||||||
|
width: 35%
|
||||||
|
.page-actions
|
||||||
|
//display: none
|
||||||
|
text-align: center
|
||||||
|
.collection-edit
|
||||||
|
margin: 0
|
||||||
|
padding: 5px 12px
|
||||||
|
&.processing
|
||||||
|
@extend .title-box-primary
|
||||||
|
&.rejected
|
||||||
|
@extend .title-box-danger
|
||||||
|
&.completed
|
||||||
|
@extend .title-box-success
|
||||||
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
.workflow-action-definition-item
|
||||||
|
color: #222
|
||||||
|
&.is-editing
|
||||||
|
background-color: #FEF9E7
|
||||||
|
&.done
|
||||||
|
text-decoration: line-through
|
||||||
|
color: #aaa
|
||||||
|
&:hover
|
||||||
|
color: white
|
||||||
|
.title
|
||||||
|
text-decoration: line-through
|
||||||
|
input
|
||||||
|
margin: 0
|
||||||
|
//.workflow-action-definition-value-type-display
|
||||||
|
// @extend .fa, .fa-lg
|
||||||
|
// &.boolean
|
||||||
|
// @extend .checker
|
||||||
|
// &.date
|
||||||
|
// @extend .fa-calendar
|
||||||
|
// &.number
|
||||||
|
// @extend .fa-hashtag
|
||||||
|
// &.select
|
||||||
|
// @extend .fa-list-ul
|
||||||
|
// &.string
|
||||||
|
// @extend .fa-terminal
|
||||||
|
// &.text
|
||||||
|
// @extend .fa-sticky-note-o
|
||||||
|
// &.window_from
|
||||||
|
// @extend .fa-clock-o
|
||||||
|
// &.window_to
|
||||||
|
// @extend .fa-clock-o
|
||||||
|
// &.timestamp
|
||||||
|
// @extend .fa-clock-o
|
||||||
|
.ui.dropdown
|
||||||
|
.workflow-action-definition-value-type-display
|
||||||
|
padding: 0
|
||||||
|
margin-right: 6px
|
||||||
|
margin-left: -10px
|
||||||
|
.ui.grid.workflow-action-definition-row
|
||||||
|
> .column
|
||||||
|
padding-top: 0.3rem
|
||||||
|
padding-bottom: 0.3rem
|
||||||
|
.right.floated.icon.buttons
|
||||||
|
// normal setting is margin-top: -0.5rem
|
||||||
|
margin-top: -0.2rem
|
||||||
|
.workflow-action-definition-workflow-action-offset-container
|
||||||
|
// below divider, pull a bit up
|
||||||
|
margin-top: -10px
|
||||||
|
.number-input
|
||||||
|
width: 82px
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
.workflow-group-constraints-count
|
||||||
|
.count
|
||||||
|
display: inline-block
|
||||||
|
margin-right: 8px
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
.new-workflow_action_definition-button
|
||||||
|
display: inline-block
|
||||||
|
margin-left: 12px
|
||||||
|
.icon
|
||||||
|
margin-right: 12px
|
||||||
|
|
||||||
|
.workflow_group-name
|
||||||
|
padding-right: rem-calc(10)
|
||||||
|
|
||||||
|
.workflow-instance-workflow-groups-container
|
||||||
|
display: flex
|
||||||
|
flex-direction: row
|
||||||
|
flex-wrap: wrap
|
||||||
|
align-items: flex-start
|
||||||
|
justify-content: space-around
|
||||||
|
|
||||||
|
.workflow-instance-workflow-group-container
|
||||||
|
@extend .title-box
|
||||||
|
//float: left
|
||||||
|
width: 412px
|
||||||
|
padding-bottom: 0
|
||||||
|
.workflow-instance-workflow-group-title
|
||||||
|
@extend .title-box-heading
|
||||||
|
margin-bottom: 0
|
||||||
|
.right.floated.buttons
|
||||||
|
margin-right: -12px
|
||||||
|
|
||||||
|
.workflow-instance-workflow-group-body
|
||||||
|
.display-row
|
||||||
|
&.attribute-notes
|
||||||
|
display: none
|
||||||
|
.display-label
|
||||||
|
width: 65%
|
||||||
|
.display-field
|
||||||
|
width: 35%
|
||||||
|
.page-actions
|
||||||
|
//display: none
|
||||||
|
text-align: center
|
||||||
|
.collection-edit
|
||||||
|
margin: 0
|
||||||
|
padding: 5px 12px
|
||||||
|
.workflow-action-container
|
||||||
|
border-bottom: 1px solid #eee
|
||||||
|
margin-left: -15px
|
||||||
|
margin-right: -15px
|
||||||
|
&:last-child
|
||||||
|
border-width: 0
|
||||||
|
.ui.grid
|
||||||
|
margin: 0
|
||||||
|
&.planned
|
||||||
|
background-color: #ddd
|
||||||
|
&.overdue
|
||||||
|
background-color: #f7da00
|
||||||
|
&.processing
|
||||||
|
background-color: #cef
|
||||||
|
&.rejected
|
||||||
|
background-color: #ff4848
|
||||||
|
&.completed
|
||||||
|
background-color: #f2ffdd
|
||||||
|
&.processing
|
||||||
|
@extend .title-box-primary
|
||||||
|
&.rejected
|
||||||
|
@extend .title-box-danger
|
||||||
|
&.completed
|
||||||
|
@extend .title-box-success
|
||||||
|
&.overdue
|
||||||
|
@extend .title-box-warning
|
||||||
|
|
||||||
|
.modal
|
||||||
|
.workflow-instance-workflow-group-container
|
||||||
|
width: 242px
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
//.ui.container
|
||||||
|
// width: 98%
|
||||||
|
|
||||||
|
.ui.main
|
||||||
|
padding-top: 40px
|
||||||
|
|
||||||
|
.hide
|
||||||
|
display: none
|
||||||
|
|
||||||
|
|
||||||
|
.right.floated.buttons
|
||||||
|
margin-top: -0.5rem
|
||||||
|
|
||||||
|
.menu.fixed
|
||||||
|
.header.item
|
||||||
|
padding: 0 1rem
|
||||||
|
background-color: #444 !important
|
||||||
|
.grid
|
||||||
|
margin-top: -1rem
|
||||||
|
//margin-left: 0 # active in epots adapter
|
||||||
|
|
||||||
|
.ui.header
|
||||||
|
.push-action.icon
|
||||||
|
padding: 0.6rem
|
||||||
|
margin-right: 0
|
||||||
|
|
||||||
|
.ui.segment.title-box
|
||||||
|
padding-top: 3rem
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
= yield
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import DS from 'ember-data'
|
||||||
|
businessDayComputations = (target, prefix, options = {}) ->
|
||||||
|
if options.add_attributes
|
||||||
|
Ember.defineProperty target, "#{prefix}_value", DS.attr('number', defaultValue: 0)
|
||||||
|
Ember.defineProperty target, "#{prefix}_unit", DS.attr('string', defaultValue: options.default_unit || 'day')
|
||||||
|
Ember.defineProperty target, "#{prefix}_business_days", DS.attr(defaultValue: -> [ 1, 2, 3, 4, 5 ])
|
||||||
|
#Ember.defineProperty target, "#{prefix}_business_days_index_sum", Ember.computed.sum "#{prefix}_business_days"
|
||||||
|
#Ember.defineProperty target, "has_default_#{prefix}_business_days", Ember.computed "#{prefix}_business_days.length", "#{prefix}_business_days_index_sum", ->
|
||||||
|
# @get("#{prefix}_business_days.length") is 5 and @get("#{prefix}_business_days_index_sum") is 15
|
||||||
|
#Ember.defineProperty target, "#{prefix}_unit_businessday", Ember.computed.equal "#{prefix}_unit", 'businessday'
|
||||||
|
true
|
||||||
|
|
||||||
|
export default businessDayComputations
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var businessDayComputations;
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
import DS from 'ember-data';
|
||||||
|
|
||||||
|
businessDayComputations = function(target, prefix, options) {
|
||||||
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
|
if (options.add_attributes) {
|
||||||
|
Ember.defineProperty(target, prefix + "_value", DS.attr('number', {
|
||||||
|
defaultValue: 0
|
||||||
|
}));
|
||||||
|
Ember.defineProperty(target, prefix + "_unit", DS.attr('string', {
|
||||||
|
defaultValue: options.default_unit || 'day'
|
||||||
|
}));
|
||||||
|
Ember.defineProperty(target, prefix + "_business_days", DS.attr({
|
||||||
|
defaultValue: function() {
|
||||||
|
return [1, 2, 3, 4, 5];
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default businessDayComputations;
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
'use strict'
|
||||||
|
# taken from https://github.com/kalmecak/moment-business-days
|
||||||
|
#if (typeof require === 'function') {
|
||||||
|
# var moment = require('moment');
|
||||||
|
#}
|
||||||
|
|
||||||
|
moment.fn.isHoliday = ->
|
||||||
|
locale = @localeData()
|
||||||
|
if locale._holidays
|
||||||
|
if locale._holidays.indexOf(@format(locale._holidayFormat)) >= 0
|
||||||
|
return true
|
||||||
|
if locale.holiday
|
||||||
|
if locale.holiday(this)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
false
|
||||||
|
|
||||||
|
moment.fn.isBusinessDay = (options) ->
|
||||||
|
locale = @localeData()
|
||||||
|
defaultWorkingWeekdays = [ 1, 2, 3, 4, 5 ]
|
||||||
|
workingWeekdays = options.business_days or locale._workingWeekdays or defaultWorkingWeekdays
|
||||||
|
if @isHoliday()
|
||||||
|
return false
|
||||||
|
if workingWeekdays.indexOf(@day()) >= 0
|
||||||
|
return true
|
||||||
|
false
|
||||||
|
|
||||||
|
moment.fn.businessDaysIntoMonth = ->
|
||||||
|
businessDay = if @isBusinessDay() then this else @prevBusinessDay()
|
||||||
|
monthBusinessDays = businessDay.monthBusinessDays()
|
||||||
|
businessDaysIntoMonth = undefined
|
||||||
|
monthBusinessDays.map (day, index) ->
|
||||||
|
if day.format('M/DD/YY') == businessDay.format('M/DD/YY')
|
||||||
|
businessDaysIntoMonth = index + 1
|
||||||
|
return
|
||||||
|
businessDaysIntoMonth
|
||||||
|
|
||||||
|
moment.fn.businessDiff = (param) ->
|
||||||
|
d1 = @clone()
|
||||||
|
d2 = param.clone()
|
||||||
|
start = if d1 < d2 then d1 else d2
|
||||||
|
end = if d2 > d1 then d2 else d1
|
||||||
|
daysBetween = 0
|
||||||
|
if start == end
|
||||||
|
return daysBetween
|
||||||
|
while start < end
|
||||||
|
if start.isBusinessDay()
|
||||||
|
daysBetween++
|
||||||
|
start.add 1, 'd'
|
||||||
|
daysBetween
|
||||||
|
|
||||||
|
moment.fn.businessAdd = (number, options = {}) ->
|
||||||
|
options.period ||= 'days'
|
||||||
|
day = @clone()
|
||||||
|
signal = if number < 0 then -1 else 1
|
||||||
|
remaining = Math.abs(number)
|
||||||
|
while remaining
|
||||||
|
day.add signal, options.period
|
||||||
|
if day.isBusinessDay(options)
|
||||||
|
remaining--
|
||||||
|
day
|
||||||
|
|
||||||
|
moment.fn.businessSubtract = (number, options = {}) ->
|
||||||
|
@businessAdd -number, options
|
||||||
|
|
||||||
|
moment.fn.nextBusinessDay = ->
|
||||||
|
iterator = 1
|
||||||
|
limit = 7
|
||||||
|
while iterator < limit
|
||||||
|
if @add(1, 'd').isBusinessDay()
|
||||||
|
break
|
||||||
|
iterator++
|
||||||
|
this
|
||||||
|
|
||||||
|
moment.fn.prevBusinessDay = ->
|
||||||
|
iterator = 1
|
||||||
|
limit = 7
|
||||||
|
while iterator < limit
|
||||||
|
if @subtract(1, 'd').isBusinessDay()
|
||||||
|
break
|
||||||
|
iterator++
|
||||||
|
this
|
||||||
|
|
||||||
|
moment.fn.monthBusinessDays = (partialEndDate) ->
|
||||||
|
me = @clone()
|
||||||
|
day = me.clone().startOf('month')
|
||||||
|
end = if partialEndDate then partialEndDate else me.clone().endOf('month')
|
||||||
|
daysArr = []
|
||||||
|
done = false
|
||||||
|
while !done
|
||||||
|
if day.isBusinessDay()
|
||||||
|
daysArr.push day.clone()
|
||||||
|
if end.diff(day.add(1, 'd')) < 0
|
||||||
|
done = true
|
||||||
|
daysArr
|
||||||
|
|
||||||
|
moment.fn.monthNaturalDays = (fromToday) ->
|
||||||
|
me = @clone()
|
||||||
|
day = if fromToday then me.clone() else me.clone().startOf('month')
|
||||||
|
end = me.clone().endOf('month')
|
||||||
|
daysArr = []
|
||||||
|
done = false
|
||||||
|
while !done
|
||||||
|
daysArr.push day.clone()
|
||||||
|
if end.diff(day.add(1, 'd')) < 0
|
||||||
|
done = true
|
||||||
|
daysArr
|
||||||
|
|
||||||
|
moment.fn.monthBusinessWeeks = (fromToday) ->
|
||||||
|
me = @clone()
|
||||||
|
day = if fromToday then me.clone() else me.clone().startOf('month')
|
||||||
|
end = me.clone().endOf('month')
|
||||||
|
weeksArr = []
|
||||||
|
daysArr = []
|
||||||
|
done = false
|
||||||
|
while !done
|
||||||
|
if day.day() >= 1 and day.day() < 6
|
||||||
|
daysArr.push day.clone()
|
||||||
|
if day.day() == 5
|
||||||
|
weeksArr.push daysArr
|
||||||
|
daysArr = []
|
||||||
|
if end.diff(day.add(1, 'd')) < 0
|
||||||
|
if daysArr.length < 5
|
||||||
|
weeksArr.push daysArr
|
||||||
|
done = true
|
||||||
|
weeksArr
|
||||||
|
|
||||||
|
moment.fn.monthNaturalWeeks = (fromToday) ->
|
||||||
|
me = @clone()
|
||||||
|
day = if fromToday then me.clone() else me.clone().startOf('month')
|
||||||
|
end = me.clone().endOf('month')
|
||||||
|
weeksArr = []
|
||||||
|
daysArr = []
|
||||||
|
done = false
|
||||||
|
while !done
|
||||||
|
daysArr.push day.clone()
|
||||||
|
if day.day() == 6
|
||||||
|
weeksArr.push daysArr
|
||||||
|
daysArr = []
|
||||||
|
if end.diff(day.add(1, 'd')) < 0
|
||||||
|
if daysArr.length < 7
|
||||||
|
weeksArr.push daysArr
|
||||||
|
done = true
|
||||||
|
weeksArr
|
||||||
|
|
||||||
|
if typeof module isnt 'undefined' and module.exports
|
||||||
|
module.exports = moment
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
'use strict';
|
||||||
|
moment.fn.isHoliday = function() {
|
||||||
|
var locale;
|
||||||
|
locale = this.localeData();
|
||||||
|
if (locale._holidays) {
|
||||||
|
if (locale._holidays.indexOf(this.format(locale._holidayFormat)) >= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (locale.holiday) {
|
||||||
|
if (locale.holiday(this)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.isBusinessDay = function(options) {
|
||||||
|
var defaultWorkingWeekdays, locale, workingWeekdays;
|
||||||
|
locale = this.localeData();
|
||||||
|
defaultWorkingWeekdays = [1, 2, 3, 4, 5];
|
||||||
|
workingWeekdays = options.business_days || locale._workingWeekdays || defaultWorkingWeekdays;
|
||||||
|
if (this.isHoliday()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (workingWeekdays.indexOf(this.day()) >= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.businessDaysIntoMonth = function() {
|
||||||
|
var businessDay, businessDaysIntoMonth, monthBusinessDays;
|
||||||
|
businessDay = this.isBusinessDay() ? this : this.prevBusinessDay();
|
||||||
|
monthBusinessDays = businessDay.monthBusinessDays();
|
||||||
|
businessDaysIntoMonth = void 0;
|
||||||
|
monthBusinessDays.map(function(day, index) {
|
||||||
|
if (day.format('M/DD/YY') === businessDay.format('M/DD/YY')) {
|
||||||
|
businessDaysIntoMonth = index + 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return businessDaysIntoMonth;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.businessDiff = function(param) {
|
||||||
|
var d1, d2, daysBetween, end, start;
|
||||||
|
d1 = this.clone();
|
||||||
|
d2 = param.clone();
|
||||||
|
start = d1 < d2 ? d1 : d2;
|
||||||
|
end = d2 > d1 ? d2 : d1;
|
||||||
|
daysBetween = 0;
|
||||||
|
if (start === end) {
|
||||||
|
return daysBetween;
|
||||||
|
}
|
||||||
|
while (start < end) {
|
||||||
|
if (start.isBusinessDay()) {
|
||||||
|
daysBetween++;
|
||||||
|
}
|
||||||
|
start.add(1, 'd');
|
||||||
|
}
|
||||||
|
return daysBetween;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.businessAdd = function(number, options) {
|
||||||
|
var day, remaining, signal;
|
||||||
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
|
options.period || (options.period = 'days');
|
||||||
|
day = this.clone();
|
||||||
|
signal = number < 0 ? -1 : 1;
|
||||||
|
remaining = Math.abs(number);
|
||||||
|
while (remaining) {
|
||||||
|
day.add(signal, options.period);
|
||||||
|
if (day.isBusinessDay(options)) {
|
||||||
|
remaining--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return day;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.businessSubtract = function(number, options) {
|
||||||
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
|
return this.businessAdd(-number, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.nextBusinessDay = function() {
|
||||||
|
var iterator, limit;
|
||||||
|
iterator = 1;
|
||||||
|
limit = 7;
|
||||||
|
while (iterator < limit) {
|
||||||
|
if (this.add(1, 'd').isBusinessDay()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iterator++;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.prevBusinessDay = function() {
|
||||||
|
var iterator, limit;
|
||||||
|
iterator = 1;
|
||||||
|
limit = 7;
|
||||||
|
while (iterator < limit) {
|
||||||
|
if (this.subtract(1, 'd').isBusinessDay()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iterator++;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.monthBusinessDays = function(partialEndDate) {
|
||||||
|
var day, daysArr, done, end, me;
|
||||||
|
me = this.clone();
|
||||||
|
day = me.clone().startOf('month');
|
||||||
|
end = partialEndDate ? partialEndDate : me.clone().endOf('month');
|
||||||
|
daysArr = [];
|
||||||
|
done = false;
|
||||||
|
while (!done) {
|
||||||
|
if (day.isBusinessDay()) {
|
||||||
|
daysArr.push(day.clone());
|
||||||
|
}
|
||||||
|
if (end.diff(day.add(1, 'd')) < 0) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return daysArr;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.monthNaturalDays = function(fromToday) {
|
||||||
|
var day, daysArr, done, end, me;
|
||||||
|
me = this.clone();
|
||||||
|
day = fromToday ? me.clone() : me.clone().startOf('month');
|
||||||
|
end = me.clone().endOf('month');
|
||||||
|
daysArr = [];
|
||||||
|
done = false;
|
||||||
|
while (!done) {
|
||||||
|
daysArr.push(day.clone());
|
||||||
|
if (end.diff(day.add(1, 'd')) < 0) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return daysArr;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.monthBusinessWeeks = function(fromToday) {
|
||||||
|
var day, daysArr, done, end, me, weeksArr;
|
||||||
|
me = this.clone();
|
||||||
|
day = fromToday ? me.clone() : me.clone().startOf('month');
|
||||||
|
end = me.clone().endOf('month');
|
||||||
|
weeksArr = [];
|
||||||
|
daysArr = [];
|
||||||
|
done = false;
|
||||||
|
while (!done) {
|
||||||
|
if (day.day() >= 1 && day.day() < 6) {
|
||||||
|
daysArr.push(day.clone());
|
||||||
|
}
|
||||||
|
if (day.day() === 5) {
|
||||||
|
weeksArr.push(daysArr);
|
||||||
|
daysArr = [];
|
||||||
|
}
|
||||||
|
if (end.diff(day.add(1, 'd')) < 0) {
|
||||||
|
if (daysArr.length < 5) {
|
||||||
|
weeksArr.push(daysArr);
|
||||||
|
}
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return weeksArr;
|
||||||
|
};
|
||||||
|
|
||||||
|
moment.fn.monthNaturalWeeks = function(fromToday) {
|
||||||
|
var day, daysArr, done, end, me, weeksArr;
|
||||||
|
me = this.clone();
|
||||||
|
day = fromToday ? me.clone() : me.clone().startOf('month');
|
||||||
|
end = me.clone().endOf('month');
|
||||||
|
weeksArr = [];
|
||||||
|
daysArr = [];
|
||||||
|
done = false;
|
||||||
|
while (!done) {
|
||||||
|
daysArr.push(day.clone());
|
||||||
|
if (day.day() === 6) {
|
||||||
|
weeksArr.push(daysArr);
|
||||||
|
daysArr = [];
|
||||||
|
}
|
||||||
|
if (end.diff(day.add(1, 'd')) < 0) {
|
||||||
|
if (daysArr.length < 7) {
|
||||||
|
weeksArr.push(daysArr);
|
||||||
|
}
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return weeksArr;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== 'undefined' && module.exports) {
|
||||||
|
module.exports = moment;
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
export default pandaRouteSetup = (context) ->
|
||||||
|
context.route 'project', ->
|
||||||
|
@route 'show', path: ':project_id', ->
|
||||||
|
@route 'dunlop'
|
||||||
|
@route 'tracker-subjects'
|
||||||
|
@route 'tracker-subject', path: 'tracker-subject/:tracker_subject_id'
|
||||||
|
@route 'add-progress'
|
||||||
|
#@route 'tracker-subject', ->
|
||||||
|
# @route 'show'
|
||||||
|
@route 'dunlop-generator'
|
||||||
|
@route 'analysis'
|
||||||
|
@route 'project-instance', ->
|
||||||
|
@route 'show', path: ':project_instance_id', ->
|
||||||
|
@route 'groups'
|
||||||
|
@route 'list'
|
||||||
|
@route 'actions'
|
||||||
|
@route 'graphs'
|
||||||
|
@route 'project-instance-group', ->
|
||||||
|
@route 'show', path: ':project_instance_group_id'
|
||||||
|
@route 'project-instance-action', ->
|
||||||
|
@route 'show', path: ':project_instance_action_id'
|
||||||
|
#@route 'project/views', path: 'views'
|
||||||
|
context.route 'login'
|
||||||
|
#@route 'organization', path: 'organizations/:organization_id'
|
||||||
|
context.route 'action-list'
|
||||||
|
|
||||||
|
context.route 'organization', ->
|
||||||
|
@route 'show', path: ':organization_id', ->
|
||||||
|
@route 'project-actions'
|
||||||
|
|
||||||
|
context.route 'user', ->
|
||||||
|
@route 'profile'
|
||||||
|
@route 'show', path: ':user_id'
|
||||||
|
|
||||||
|
|
||||||
|
context.route 'tracker-subject', ->
|
||||||
|
@route 'show', path: ':tracker_subject_id', ->
|
||||||
|
@route 'tracking-connections'
|
||||||
|
@route 'tracker-group', path: 'tracker-groups/:tracker_group_id'
|
||||||
|
@route 'project', path: 'projects/:project_id'
|
||||||
|
#@route 'tracker-subject/tracker-group', path: 'tracker-subjects/:tracker_subject_id/tracker-groups/:tracker_group_id'
|
||||||
|
context.route 'event'
|
||||||
|
|
||||||
|
context.route 'meeting-reports'
|
||||||
|
|
||||||
|
context.route 'manual', ->
|
||||||
|
@route 'project', ->
|
||||||
|
@route 'dunlop'
|
||||||
|
@route 'tracker', ->
|
||||||
|
@route 'tricks' # dummy/empty now, to genate the index
|
||||||
|
true
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var pandaRouteSetup;
|
||||||
|
|
||||||
|
export default pandaRouteSetup = function(context) {
|
||||||
|
context.route('project', function() {
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':project_id'
|
||||||
|
}, function() {
|
||||||
|
this.route('dunlop');
|
||||||
|
this.route('tracker-subjects');
|
||||||
|
this.route('tracker-subject', {
|
||||||
|
path: 'tracker-subject/:tracker_subject_id'
|
||||||
|
});
|
||||||
|
this.route('add-progress');
|
||||||
|
this.route('dunlop-generator');
|
||||||
|
this.route('analysis');
|
||||||
|
this.route('project-instance', function() {
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':project_instance_id'
|
||||||
|
}, function() {
|
||||||
|
this.route('groups');
|
||||||
|
this.route('list');
|
||||||
|
this.route('actions');
|
||||||
|
return this.route('graphs');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.route('project-instance-group', function() {
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':project_instance_group_id'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return this.route('project-instance-action', function() {
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':project_instance_action_id'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context.route('login');
|
||||||
|
context.route('action-list');
|
||||||
|
context.route('organization', function() {
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':organization_id'
|
||||||
|
}, function() {
|
||||||
|
return this.route('project-actions');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context.route('user', function() {
|
||||||
|
this.route('profile');
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':user_id'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context.route('tracker-subject', function() {
|
||||||
|
return this.route('show', {
|
||||||
|
path: ':tracker_subject_id'
|
||||||
|
}, function() {
|
||||||
|
this.route('tracking-connections');
|
||||||
|
this.route('tracker-group', {
|
||||||
|
path: 'tracker-groups/:tracker_group_id'
|
||||||
|
});
|
||||||
|
return this.route('project', {
|
||||||
|
path: 'projects/:project_id'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context.route('event');
|
||||||
|
context.route('meeting-reports');
|
||||||
|
context.route('manual', function() {
|
||||||
|
this.route('project', function() {
|
||||||
|
return this.route('dunlop');
|
||||||
|
});
|
||||||
|
return this.route('tracker', function() {
|
||||||
|
return this.route('tricks');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
};
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
# get_active_workflow_action_definitions(workflow_action_definitions, project_scenarios, set_operation = 'union or intersection')
|
||||||
|
# this util takes as first arguments the workflow_action_definitions scope
|
||||||
|
# and tries to apply filtering based on the given project_scenarios and set_operation
|
||||||
|
|
||||||
|
get_active_workflow_action_definitions_using_union = (project_scenarios) ->
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = []
|
||||||
|
working_workflow_action_definitions = []
|
||||||
|
project_scenarios.forEach (selected_project_scenario) ->
|
||||||
|
selected_project_scenario.get('workflow_action_definitions').forEach (workflow_action_definition) ->
|
||||||
|
if selected_project_scenario_workflow_action_definition_ids.indexOf(workflow_action_definition.get('id')) < 0
|
||||||
|
selected_project_scenario_workflow_action_definition_ids.push workflow_action_definition.get('id')
|
||||||
|
working_workflow_action_definitions.push workflow_action_definition
|
||||||
|
working_workflow_action_definitions
|
||||||
|
|
||||||
|
get_active_workflow_action_definitions_using_intersection = (workflow_action_definitions, project_scenarios) ->
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = []
|
||||||
|
first_run = true
|
||||||
|
project_scenarios.forEach (selected_project_scenario) ->
|
||||||
|
current_workflow_action_definition_ids = selected_project_scenario.get('workflow_action_definitions').mapBy('id').toArray()
|
||||||
|
if first_run
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = current_workflow_action_definition_ids
|
||||||
|
first_run = false
|
||||||
|
return
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = selected_project_scenario_workflow_action_definition_ids.filter (id) -> id in current_workflow_action_definition_ids
|
||||||
|
workflow_action_definitions.filter((r) -> r.get('id') in selected_project_scenario_workflow_action_definition_ids)
|
||||||
|
|
||||||
|
get_active_workflow_action_definitions = (workflow_action_definitions, project_scenarios, set_operation = 'union') ->
|
||||||
|
project_scenarios = Ember.makeArray(project_scenarios)
|
||||||
|
workflow_action_definitions = workflow_action_definitions.toArray()
|
||||||
|
# initialize unused working workflow-action-definitions
|
||||||
|
if project_scenarios.length
|
||||||
|
if set_operation is 'intersection'
|
||||||
|
get_active_workflow_action_definitions_using_intersection(workflow_action_definitions, project_scenarios)
|
||||||
|
else
|
||||||
|
get_active_workflow_action_definitions_using_union(project_scenarios)
|
||||||
|
else
|
||||||
|
# no filtering can be allplied, return all
|
||||||
|
workflow_action_definitions
|
||||||
|
|
||||||
|
export { get_active_workflow_action_definitions_using_union }
|
||||||
|
export { get_active_workflow_action_definitions_using_intersection }
|
||||||
|
export { get_active_workflow_action_definitions }
|
||||||
|
|
||||||
|
export default get_active_workflow_action_definitions
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var get_active_workflow_action_definitions, get_active_workflow_action_definitions_using_intersection, get_active_workflow_action_definitions_using_union,
|
||||||
|
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
get_active_workflow_action_definitions_using_union = function(project_scenarios) {
|
||||||
|
var selected_project_scenario_workflow_action_definition_ids, working_workflow_action_definitions;
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = [];
|
||||||
|
working_workflow_action_definitions = [];
|
||||||
|
project_scenarios.forEach(function(selected_project_scenario) {
|
||||||
|
return selected_project_scenario.get('workflow_action_definitions').forEach(function(workflow_action_definition) {
|
||||||
|
if (selected_project_scenario_workflow_action_definition_ids.indexOf(workflow_action_definition.get('id')) < 0) {
|
||||||
|
selected_project_scenario_workflow_action_definition_ids.push(workflow_action_definition.get('id'));
|
||||||
|
return working_workflow_action_definitions.push(workflow_action_definition);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return working_workflow_action_definitions;
|
||||||
|
};
|
||||||
|
|
||||||
|
get_active_workflow_action_definitions_using_intersection = function(workflow_action_definitions, project_scenarios) {
|
||||||
|
var first_run, selected_project_scenario_workflow_action_definition_ids;
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = [];
|
||||||
|
first_run = true;
|
||||||
|
project_scenarios.forEach(function(selected_project_scenario) {
|
||||||
|
var current_workflow_action_definition_ids;
|
||||||
|
current_workflow_action_definition_ids = selected_project_scenario.get('workflow_action_definitions').mapBy('id').toArray();
|
||||||
|
if (first_run) {
|
||||||
|
selected_project_scenario_workflow_action_definition_ids = current_workflow_action_definition_ids;
|
||||||
|
first_run = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return selected_project_scenario_workflow_action_definition_ids = selected_project_scenario_workflow_action_definition_ids.filter(function(id) {
|
||||||
|
return indexOf.call(current_workflow_action_definition_ids, id) >= 0;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return workflow_action_definitions.filter(function(r) {
|
||||||
|
var ref;
|
||||||
|
return ref = r.get('id'), indexOf.call(selected_project_scenario_workflow_action_definition_ids, ref) >= 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
get_active_workflow_action_definitions = function(workflow_action_definitions, project_scenarios, set_operation) {
|
||||||
|
if (set_operation == null) {
|
||||||
|
set_operation = 'union';
|
||||||
|
}
|
||||||
|
project_scenarios = Ember.makeArray(project_scenarios);
|
||||||
|
workflow_action_definitions = workflow_action_definitions.toArray();
|
||||||
|
if (project_scenarios.length) {
|
||||||
|
if (set_operation === 'intersection') {
|
||||||
|
return get_active_workflow_action_definitions_using_intersection(workflow_action_definitions, project_scenarios);
|
||||||
|
} else {
|
||||||
|
return get_active_workflow_action_definitions_using_union(project_scenarios);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return workflow_action_definitions;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
get_active_workflow_action_definitions_using_union
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
get_active_workflow_action_definitions_using_intersection
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
get_active_workflow_action_definitions
|
||||||
|
};
|
||||||
|
|
||||||
|
export default get_active_workflow_action_definitions;
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
# get_active_workflow_groups(workflow_groups, project_scenarios, set_operation = 'union or intersection')
|
||||||
|
# this util takes as first arguments the workflow_groups scope
|
||||||
|
# and tries to apply filtering based on the given project_scenarios and set_operation
|
||||||
|
|
||||||
|
get_active_workflow_groups_using_union = (project_scenarios) ->
|
||||||
|
selected_project_scenario_workflow_group_ids = []
|
||||||
|
working_workflow_groups = []
|
||||||
|
project_scenarios.forEach (selected_project_scenario) ->
|
||||||
|
selected_project_scenario.get('workflow_groups').forEach (workflow_group) ->
|
||||||
|
if selected_project_scenario_workflow_group_ids.indexOf(workflow_group.get('id')) < 0
|
||||||
|
selected_project_scenario_workflow_group_ids.push workflow_group.get('id')
|
||||||
|
working_workflow_groups.push workflow_group
|
||||||
|
working_workflow_groups
|
||||||
|
|
||||||
|
get_active_workflow_groups_using_intersection = (workflow_groups, project_scenarios) ->
|
||||||
|
selected_project_scenario_workflow_group_ids = []
|
||||||
|
first_run = true
|
||||||
|
project_scenarios.forEach (selected_project_scenario) ->
|
||||||
|
current_workflow_group_ids = selected_project_scenario.get('workflow_groups').mapBy('id').toArray()
|
||||||
|
if first_run
|
||||||
|
selected_project_scenario_workflow_group_ids = current_workflow_group_ids
|
||||||
|
first_run = false
|
||||||
|
return
|
||||||
|
selected_project_scenario_workflow_group_ids = selected_project_scenario_workflow_group_ids.filter (id) -> id in current_workflow_group_ids
|
||||||
|
workflow_groups.filter((r) -> r.get('id') in selected_project_scenario_workflow_group_ids)
|
||||||
|
|
||||||
|
get_active_workflow_groups = (workflow_groups, project_scenarios, set_operation = 'union') ->
|
||||||
|
project_scenarios = Ember.makeArray(project_scenarios)
|
||||||
|
workflow_groups = workflow_groups.toArray()
|
||||||
|
# initialize unused working workflow-groups
|
||||||
|
if project_scenarios.length
|
||||||
|
if set_operation is 'intersection'
|
||||||
|
get_active_workflow_groups_using_intersection(workflow_groups, project_scenarios)
|
||||||
|
else
|
||||||
|
get_active_workflow_groups_using_union(project_scenarios)
|
||||||
|
else
|
||||||
|
# no filtering can be allplied, return all
|
||||||
|
workflow_groups
|
||||||
|
|
||||||
|
export { get_active_workflow_groups_using_union }
|
||||||
|
export { get_active_workflow_groups_using_intersection }
|
||||||
|
export { get_active_workflow_groups }
|
||||||
|
|
||||||
|
export default get_active_workflow_groups
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var get_active_workflow_groups, get_active_workflow_groups_using_intersection, get_active_workflow_groups_using_union,
|
||||||
|
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
get_active_workflow_groups_using_union = function(project_scenarios) {
|
||||||
|
var selected_project_scenario_workflow_group_ids, working_workflow_groups;
|
||||||
|
selected_project_scenario_workflow_group_ids = [];
|
||||||
|
working_workflow_groups = [];
|
||||||
|
project_scenarios.forEach(function(selected_project_scenario) {
|
||||||
|
return selected_project_scenario.get('workflow_groups').forEach(function(workflow_group) {
|
||||||
|
if (selected_project_scenario_workflow_group_ids.indexOf(workflow_group.get('id')) < 0) {
|
||||||
|
selected_project_scenario_workflow_group_ids.push(workflow_group.get('id'));
|
||||||
|
return working_workflow_groups.push(workflow_group);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return working_workflow_groups;
|
||||||
|
};
|
||||||
|
|
||||||
|
get_active_workflow_groups_using_intersection = function(workflow_groups, project_scenarios) {
|
||||||
|
var first_run, selected_project_scenario_workflow_group_ids;
|
||||||
|
selected_project_scenario_workflow_group_ids = [];
|
||||||
|
first_run = true;
|
||||||
|
project_scenarios.forEach(function(selected_project_scenario) {
|
||||||
|
var current_workflow_group_ids;
|
||||||
|
current_workflow_group_ids = selected_project_scenario.get('workflow_groups').mapBy('id').toArray();
|
||||||
|
if (first_run) {
|
||||||
|
selected_project_scenario_workflow_group_ids = current_workflow_group_ids;
|
||||||
|
first_run = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return selected_project_scenario_workflow_group_ids = selected_project_scenario_workflow_group_ids.filter(function(id) {
|
||||||
|
return indexOf.call(current_workflow_group_ids, id) >= 0;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return workflow_groups.filter(function(r) {
|
||||||
|
var ref;
|
||||||
|
return ref = r.get('id'), indexOf.call(selected_project_scenario_workflow_group_ids, ref) >= 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
get_active_workflow_groups = function(workflow_groups, project_scenarios, set_operation) {
|
||||||
|
if (set_operation == null) {
|
||||||
|
set_operation = 'union';
|
||||||
|
}
|
||||||
|
project_scenarios = Ember.makeArray(project_scenarios);
|
||||||
|
workflow_groups = workflow_groups.toArray();
|
||||||
|
if (project_scenarios.length) {
|
||||||
|
if (set_operation === 'intersection') {
|
||||||
|
return get_active_workflow_groups_using_intersection(workflow_groups, project_scenarios);
|
||||||
|
} else {
|
||||||
|
return get_active_workflow_groups_using_union(project_scenarios);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return workflow_groups;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
get_active_workflow_groups_using_union
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
get_active_workflow_groups_using_intersection
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
get_active_workflow_groups
|
||||||
|
};
|
||||||
|
|
||||||
|
export default get_active_workflow_groups;
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
projectContract = () ->
|
||||||
|
true
|
||||||
|
|
||||||
|
export default projectContract
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var projectContract;
|
||||||
|
|
||||||
|
projectContract = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default projectContract;
|
||||||
@@ -0,0 +1,295 @@
|
|||||||
|
#projectGetWorkflowActionDefinitionOffsets = () ->
|
||||||
|
# true
|
||||||
|
#export default projectGetWorkflowActionDefinitionOffsets
|
||||||
|
import Ember from 'ember'
|
||||||
|
|
||||||
|
RecordNode = Ember.Object.extend
|
||||||
|
resolved: false
|
||||||
|
title: Ember.computed 'record.title', 'value_shift', ->
|
||||||
|
title = @get('record.title')
|
||||||
|
title = " #{title} (#{value_shift}d)" if value_shift = @get('value_shift')
|
||||||
|
title
|
||||||
|
|
||||||
|
OffsetNode = Ember.Object.extend
|
||||||
|
record: null
|
||||||
|
total_offset: 0
|
||||||
|
value_shift: 0
|
||||||
|
resulting_absolute_value: 0
|
||||||
|
|
||||||
|
WorkflowActionDefinitionOffsetNodes = Ember.Object.extend
|
||||||
|
iteration_context_counter: 0
|
||||||
|
workflow_action_definitions: []
|
||||||
|
reference_date: null
|
||||||
|
batch_size: 0
|
||||||
|
active_project_scenario: null
|
||||||
|
|
||||||
|
forEach: ->
|
||||||
|
@get('processed_workflow_action_definitions').forEach(arguments...)
|
||||||
|
|
||||||
|
filterBy: ->
|
||||||
|
@get('processed_workflow_action_definitions').filterBy(arguments...)
|
||||||
|
|
||||||
|
get_resolved: ->
|
||||||
|
@get('processed_workflow_action_definitions').filterBy('resolved')
|
||||||
|
|
||||||
|
init: ->
|
||||||
|
@set 'scope_workflow_action_definition_ids', @get('workflow_action_definitions').mapBy('id').toArray()
|
||||||
|
@set 'processed_workflow_action_definitions', []
|
||||||
|
@set 'working_workflow_action_definitions', []
|
||||||
|
@get_workflow_action_definition_offsets()
|
||||||
|
|
||||||
|
get_workflow_action_definition_offsets: ->
|
||||||
|
base = @
|
||||||
|
active_scenario_identifier = @get('active_project_scenario.identifier')
|
||||||
|
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
|
||||||
|
first_loop_actions = []
|
||||||
|
working_workflow_action_definitions = []
|
||||||
|
@get('workflow_action_definitions').forEach (workflow_action_definition) ->
|
||||||
|
action_added = false
|
||||||
|
if workflow_action_definition.get('offset_type') is 'configured'
|
||||||
|
workflow_action_definition.get('workflow_action_offsets').forEach (workflow_action_offset) ->
|
||||||
|
return if action_added
|
||||||
|
return if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
|
||||||
|
if not workflow_action_offset.get('base_workflow_action_definition.content') # x_based
|
||||||
|
[offset_date, offset_value] = base.get_offset_for_target(workflow_action_offset, 0)
|
||||||
|
[date, value_shift] = base.get_dynamic_offset_for_target(workflow_action_offset, offset_value)
|
||||||
|
absolute_value = offset_value + value_shift
|
||||||
|
record_wrapper = RecordNode.create
|
||||||
|
record: workflow_action_definition
|
||||||
|
record_id: workflow_action_definition.get('id')
|
||||||
|
offset_wrappers: [
|
||||||
|
OffsetNode.create(total_offset: absolute_value, value_shift: value_shift)
|
||||||
|
]
|
||||||
|
absolute_value: absolute_value
|
||||||
|
value_shift: value_shift
|
||||||
|
date: date
|
||||||
|
resolve_type: 'x'
|
||||||
|
resolved: true
|
||||||
|
resolve_level: 0
|
||||||
|
first_loop_actions.push record_wrapper
|
||||||
|
action_added = true
|
||||||
|
working_workflow_action_definitions.push workflow_action_definition unless action_added
|
||||||
|
|
||||||
|
@set 'processed_workflow_action_definitions', first_loop_actions
|
||||||
|
@set 'working_workflow_action_definitions', working_workflow_action_definitions
|
||||||
|
|
||||||
|
@incrementProperty 'iteration_context_counter'
|
||||||
|
#@set 'working_workflow_action_definitions', @get('workflow_action_definitions').filterBy('offset_type', 'configured')
|
||||||
|
@run_critical_path_resolve_loop()
|
||||||
|
resolve_level = @get('iteration_context_counter')
|
||||||
|
@get('working_workflow_action_definitions').forEach (unresolved_workflow_action_definition) => # add unresolved records
|
||||||
|
offset_wrappers = []
|
||||||
|
unresolved_workflow_action_definition.get('workflow_action_offsets').forEach (action_offset) ->
|
||||||
|
return unless action_offset.get('base_workflow_action_definition.id') in scope_workflow_action_definition_ids # do not add offsets from other scenarios
|
||||||
|
offset_wrappers.push OffsetNode.create
|
||||||
|
total_offset: action_offset.get('offset_value')
|
||||||
|
record: action_offset
|
||||||
|
@get('processed_workflow_action_definitions').push RecordNode.create
|
||||||
|
record: unresolved_workflow_action_definition
|
||||||
|
record_id: unresolved_workflow_action_definition.get('id')
|
||||||
|
offset_wrappers: offset_wrappers
|
||||||
|
resolved: false
|
||||||
|
resolve_level: resolve_level
|
||||||
|
resolve_type: 'unresolved'
|
||||||
|
|
||||||
|
get_dynamic_offset_for_target: (target, absolute_value) ->
|
||||||
|
base_date = @get('reference_date').clone().add(absolute_value, 'day')
|
||||||
|
empty = [base_date, 0]
|
||||||
|
return empty unless batch_size = @get('batch_size')
|
||||||
|
return empty unless threshold = target.get('batch_element_threshold_value')
|
||||||
|
return empty unless threshold_exceedance = Math.floor(batch_size / (0.1 + parseInt(threshold))) # + 0.1 (delta) to exclude exact match of batch_size and threshold. First day is action day
|
||||||
|
|
||||||
|
period_unit = target.get('batch_element_threshold_unit')
|
||||||
|
offset_value = target.get('offset_value')
|
||||||
|
operation = if offset_value < 0 then 'subtract' else 'add'
|
||||||
|
if period_unit is 'businessday'
|
||||||
|
operation = "business#{operation.capitalize()}"
|
||||||
|
shifted_date = base_date.clone()[operation](threshold_exceedance, business_days: target.get('batch_element_threshold_business_days'))
|
||||||
|
else
|
||||||
|
shifted_date = base_date.clone()[operation](threshold_exceedance, period_unit)
|
||||||
|
value_shift = shifted_date.diff(base_date, 'day')
|
||||||
|
[shifted_date, value_shift]
|
||||||
|
|
||||||
|
get_offset_for_target: (target, absolute_value) ->
|
||||||
|
base_date = @get('reference_date').clone().add(absolute_value, 'day')
|
||||||
|
empty = [base_date, 0]
|
||||||
|
return empty unless offset_value = target.get('offset_value')
|
||||||
|
period_unit = target.get('offset_unit')
|
||||||
|
operation = if offset_value < 0 then 'subtract' else 'add'
|
||||||
|
if period_unit is 'businessday'
|
||||||
|
operation = "business#{operation.capitalize()}"
|
||||||
|
shifted_date = base_date.clone()[operation](Math.abs(offset_value), business_days: target.get('offset_business_days'))
|
||||||
|
else
|
||||||
|
shifted_date = base_date.clone()[operation](Math.abs(offset_value), period_unit)
|
||||||
|
value_shift = shifted_date.diff(base_date, 'day')
|
||||||
|
#debugger if target.get('workflow_action_definition.title') is 'Initial check done'
|
||||||
|
[shifted_date, value_shift]
|
||||||
|
|
||||||
|
run_critical_path_resolve_loop: ->
|
||||||
|
working_indices_to_be_removed = []
|
||||||
|
active_scenario_identifier = @get('active_project_scenario.identifier')
|
||||||
|
processed_workflow_action_definitions = @get('processed_workflow_action_definitions')
|
||||||
|
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
|
||||||
|
get_dynamic_offset_for_target = @get('get_dynamic_offset_for_target').bind(@)
|
||||||
|
get_offset_for_target = @get('get_offset_for_target').bind(@)
|
||||||
|
resolve_level = @get('iteration_context_counter')
|
||||||
|
@get('working_workflow_action_definitions').forEach (working_workflow_action_definition, working_index) ->
|
||||||
|
return unless working_workflow_action_definition.get('offset_type') is 'configured'
|
||||||
|
farthest_absolute_value = 0
|
||||||
|
farthest_absolute_value_value_shift = 0
|
||||||
|
farthest_result_total_offset = 0
|
||||||
|
date = null # scoping
|
||||||
|
resolved_offset_wrappers = []
|
||||||
|
all_offsets_resolved = working_workflow_action_definition.get('workflow_action_offsets').every (workflow_action_offset) ->
|
||||||
|
return true if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
|
||||||
|
unless processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy 'record_id', workflow_action_offset.get('base_workflow_action_definition.id')
|
||||||
|
if workflow_action_offset.get('base_workflow_action_definition.id') not in scope_workflow_action_definition_ids # base is not present in this scenario, do not pursue this connection
|
||||||
|
return true
|
||||||
|
return false
|
||||||
|
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value')
|
||||||
|
[offset_date, working_offset_value] = get_offset_for_target(workflow_action_offset, processed_absolute_value)
|
||||||
|
[date, current_connection_value_shift] = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value)
|
||||||
|
current_connection_total_offset_value = current_connection_value_shift + working_offset_value
|
||||||
|
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value
|
||||||
|
#debugger if processed_base_workflow_action_definition_wrapper.get('record.title') is 'Initial check done'
|
||||||
|
#debugger if working_workflow_action_definition.get('title') is 'Initial check done'
|
||||||
|
if Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)
|
||||||
|
farthest_absolute_value = current_connection_absolute_value
|
||||||
|
farthest_absolute_value_value_shift = current_connection_value_shift
|
||||||
|
farthest_result_total_offset = current_connection_total_offset_value
|
||||||
|
resolved_offset_wrappers.push OffsetNode.create
|
||||||
|
record: workflow_action_offset
|
||||||
|
value_shift: current_connection_value_shift
|
||||||
|
total_offset: current_connection_total_offset_value
|
||||||
|
resulting_absolute_value: current_connection_absolute_value
|
||||||
|
true # indicate processed_base_workflow_action_definition_wrapper found for all_offsets_resolved value
|
||||||
|
|
||||||
|
if all_offsets_resolved and resolved_offset_wrappers.length
|
||||||
|
record_wrapper = RecordNode.create
|
||||||
|
record: working_workflow_action_definition
|
||||||
|
record_id: working_workflow_action_definition.get('id')
|
||||||
|
offset_wrappers: resolved_offset_wrappers
|
||||||
|
value_shift: farthest_absolute_value_value_shift
|
||||||
|
absolute_value: farthest_absolute_value
|
||||||
|
date: date
|
||||||
|
resolved: true
|
||||||
|
resolve_level: resolve_level
|
||||||
|
resolve_type: 'critical-path'
|
||||||
|
processed_workflow_action_definitions.push record_wrapper
|
||||||
|
working_indices_to_be_removed.push working_index
|
||||||
|
if working_indices_to_be_removed.length
|
||||||
|
@get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1) while working_indices_to_be_removed.length
|
||||||
|
@run_critical_path_resolve_loop()
|
||||||
|
else
|
||||||
|
@incrementProperty 'iteration_context_counter'
|
||||||
|
@run_unresolved_tree_resolve_loop()
|
||||||
|
|
||||||
|
run_unresolved_tree_resolve_loop: ->
|
||||||
|
working_indices_to_be_removed = []
|
||||||
|
active_scenario_identifier = @get('active_project_scenario.identifier')
|
||||||
|
processed_workflow_action_definitions = @get('processed_workflow_action_definitions')
|
||||||
|
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
|
||||||
|
get_offset_for_target = @get('get_offset_for_target').bind(@)
|
||||||
|
get_dynamic_offset_for_target = @get('get_dynamic_offset_for_target').bind(@)
|
||||||
|
resolve_level = @get('iteration_context_counter')
|
||||||
|
@get('working_workflow_action_definitions').forEach (working_workflow_action_definition, working_index) ->
|
||||||
|
return unless working_workflow_action_definition.get('offset_type') is 'configured'
|
||||||
|
farthest_absolute_value = 0
|
||||||
|
farthest_absolute_value_value_shift = 0
|
||||||
|
farthest_result_total_offset = 0
|
||||||
|
date = null # scoping
|
||||||
|
resolved_offset_wrappers = []
|
||||||
|
working_workflow_action_definition.get('workflow_action_offsets').forEach (workflow_action_offset) ->
|
||||||
|
return if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
|
||||||
|
return unless workflow_action_offset.get('base_workflow_action_definition.id') in scope_workflow_action_definition_ids
|
||||||
|
return unless processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy 'record_id', workflow_action_offset.get('base_workflow_action_definition.id')
|
||||||
|
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value')
|
||||||
|
[offset_date, working_offset_value] = get_offset_for_target(workflow_action_offset, processed_absolute_value)
|
||||||
|
[date, current_connection_value_shift] = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value)
|
||||||
|
current_connection_total_offset_value = current_connection_value_shift + working_offset_value
|
||||||
|
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value
|
||||||
|
#debugger if processed_base_workflow_action_definition_wrapper.get('record.title') is 'Initial check done'
|
||||||
|
#debugger if working_workflow_action_definition.get('title') is 'Initial check done'
|
||||||
|
if Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)
|
||||||
|
farthest_absolute_value = current_connection_absolute_value
|
||||||
|
farthest_absolute_value_value_shift = current_connection_value_shift
|
||||||
|
farthest_result_total_offset = current_connection_total_offset_value
|
||||||
|
resolved_offset_wrappers.push OffsetNode.create
|
||||||
|
record: workflow_action_offset
|
||||||
|
value_shift: current_connection_value_shift
|
||||||
|
total_offset: current_connection_total_offset_value
|
||||||
|
resulting_absolute_value: current_connection_absolute_value
|
||||||
|
if resolved_offset_wrappers.length
|
||||||
|
record_wrapper = RecordNode.create
|
||||||
|
record: working_workflow_action_definition
|
||||||
|
record_id: working_workflow_action_definition.get('id')
|
||||||
|
offset_wrappers: resolved_offset_wrappers # .clone()?
|
||||||
|
value_shift: farthest_absolute_value_value_shift
|
||||||
|
absolute_value: farthest_absolute_value
|
||||||
|
date: date
|
||||||
|
resolved: true
|
||||||
|
resolve_level: resolve_level
|
||||||
|
resolve_type: 'with-non-rooted-offsets'
|
||||||
|
processed_workflow_action_definitions.push record_wrapper
|
||||||
|
working_indices_to_be_removed.push working_index
|
||||||
|
|
||||||
|
if working_indices_to_be_removed.length
|
||||||
|
@get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1) while working_indices_to_be_removed.length
|
||||||
|
@run_critical_path_resolve_loop()
|
||||||
|
else
|
||||||
|
@run_offset_forwarding_loop()
|
||||||
|
|
||||||
|
run_offset_forwarding_loop: ->
|
||||||
|
working_indices_to_be_removed = []
|
||||||
|
active_scenario_identifier = @get('active_project_scenario.identifier')
|
||||||
|
processed_workflow_action_definitions = @get('processed_workflow_action_definitions')
|
||||||
|
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
|
||||||
|
get_offset_for_target = @get('get_offset_for_target').bind(@)
|
||||||
|
get_dynamic_offset_for_target = @get('get_dynamic_offset_for_target').bind(@)
|
||||||
|
resolve_level = @get('iteration_context_counter')
|
||||||
|
@get('working_workflow_action_definitions').forEach (working_workflow_action_definition, working_index) ->
|
||||||
|
farthest_absolute_value = 0
|
||||||
|
farthest_absolute_value_value_shift = 0
|
||||||
|
farthest_result_total_offset = 0
|
||||||
|
date = null # scoping
|
||||||
|
resolved_offset_wrappers = []
|
||||||
|
working_workflow_action_definition.get('dependent_workflow_action_offsets').forEach (workflow_action_offset) ->
|
||||||
|
return if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
|
||||||
|
return unless workflow_action_offset.get('workflow_action_definition.id') in scope_workflow_action_definition_ids
|
||||||
|
return unless processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy 'record_id', workflow_action_offset.get('workflow_action_definition.id')
|
||||||
|
#return if workflow_action_offset.get('workflow_action_definition.offset_type') is 'none' # do not resolve on none offset typed nodes
|
||||||
|
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value')
|
||||||
|
[offset_date, working_offset_value] = get_offset_for_target(workflow_action_offset, processed_absolute_value)
|
||||||
|
[date, current_connection_value_shift] = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value)
|
||||||
|
current_connection_total_offset_value = current_connection_value_shift + working_offset_value
|
||||||
|
#NOTE MINUS!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
current_connection_absolute_value = processed_absolute_value - current_connection_total_offset_value
|
||||||
|
#debugger if processed_base_workflow_action_definition_wrapper.get('record.title') is 'Initial check done'
|
||||||
|
#debugger if working_workflow_action_definition.get('title') is 'Initial check done'
|
||||||
|
if Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)
|
||||||
|
farthest_absolute_value = current_connection_absolute_value
|
||||||
|
farthest_absolute_value_value_shift = current_connection_value_shift
|
||||||
|
farthest_result_total_offset = current_connection_total_offset_value
|
||||||
|
resolved_offset_wrappers.push OffsetNode.create
|
||||||
|
record: workflow_action_offset
|
||||||
|
value_shift: current_connection_value_shift
|
||||||
|
total_offset: current_connection_total_offset_value
|
||||||
|
resulting_absolute_value: current_connection_absolute_value
|
||||||
|
if resolved_offset_wrappers.length
|
||||||
|
record_wrapper = RecordNode.create
|
||||||
|
record: working_workflow_action_definition
|
||||||
|
record_id: working_workflow_action_definition.get('id')
|
||||||
|
offset_wrappers: resolved_offset_wrappers # .clone()?
|
||||||
|
value_shift: farthest_absolute_value_value_shift
|
||||||
|
absolute_value: farthest_absolute_value
|
||||||
|
date: date
|
||||||
|
resolved: true
|
||||||
|
resolve_level: resolve_level
|
||||||
|
resolve_type: 'offset-lookup-inversion'
|
||||||
|
processed_workflow_action_definitions.push record_wrapper
|
||||||
|
working_indices_to_be_removed.push working_index
|
||||||
|
|
||||||
|
if working_indices_to_be_removed.length
|
||||||
|
@get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1) while working_indices_to_be_removed.length
|
||||||
|
@run_critical_path_resolve_loop()
|
||||||
|
export default WorkflowActionDefinitionOffsetNodes
|
||||||
@@ -0,0 +1,389 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var OffsetNode, RecordNode, WorkflowActionDefinitionOffsetNodes,
|
||||||
|
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
|
|
||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
RecordNode = Ember.Object.extend({
|
||||||
|
resolved: false,
|
||||||
|
title: Ember.computed('record.title', 'value_shift', function() {
|
||||||
|
var title, value_shift;
|
||||||
|
title = this.get('record.title');
|
||||||
|
if (value_shift = this.get('value_shift')) {
|
||||||
|
title = " " + title + " (" + value_shift + "d)";
|
||||||
|
}
|
||||||
|
return title;
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
OffsetNode = Ember.Object.extend({
|
||||||
|
record: null,
|
||||||
|
total_offset: 0,
|
||||||
|
value_shift: 0,
|
||||||
|
resulting_absolute_value: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
WorkflowActionDefinitionOffsetNodes = Ember.Object.extend({
|
||||||
|
iteration_context_counter: 0,
|
||||||
|
workflow_action_definitions: [],
|
||||||
|
reference_date: null,
|
||||||
|
batch_size: 0,
|
||||||
|
active_project_scenario: null,
|
||||||
|
forEach: function() {
|
||||||
|
var ref;
|
||||||
|
return (ref = this.get('processed_workflow_action_definitions')).forEach.apply(ref, arguments);
|
||||||
|
},
|
||||||
|
filterBy: function() {
|
||||||
|
var ref;
|
||||||
|
return (ref = this.get('processed_workflow_action_definitions')).filterBy.apply(ref, arguments);
|
||||||
|
},
|
||||||
|
get_resolved: function() {
|
||||||
|
return this.get('processed_workflow_action_definitions').filterBy('resolved');
|
||||||
|
},
|
||||||
|
init: function() {
|
||||||
|
this.set('scope_workflow_action_definition_ids', this.get('workflow_action_definitions').mapBy('id').toArray());
|
||||||
|
this.set('processed_workflow_action_definitions', []);
|
||||||
|
this.set('working_workflow_action_definitions', []);
|
||||||
|
return this.get_workflow_action_definition_offsets();
|
||||||
|
},
|
||||||
|
get_workflow_action_definition_offsets: function() {
|
||||||
|
var active_scenario_identifier, base, first_loop_actions, resolve_level, scope_workflow_action_definition_ids, working_workflow_action_definitions;
|
||||||
|
base = this;
|
||||||
|
active_scenario_identifier = this.get('active_project_scenario.identifier');
|
||||||
|
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
|
||||||
|
first_loop_actions = [];
|
||||||
|
working_workflow_action_definitions = [];
|
||||||
|
this.get('workflow_action_definitions').forEach(function(workflow_action_definition) {
|
||||||
|
var action_added;
|
||||||
|
action_added = false;
|
||||||
|
if (workflow_action_definition.get('offset_type') === 'configured') {
|
||||||
|
workflow_action_definition.get('workflow_action_offsets').forEach(function(workflow_action_offset) {
|
||||||
|
var absolute_value, date, offset_date, offset_value, record_wrapper, ref, ref1, value_shift;
|
||||||
|
if (action_added) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!workflow_action_offset.get('base_workflow_action_definition.content')) {
|
||||||
|
ref = base.get_offset_for_target(workflow_action_offset, 0), offset_date = ref[0], offset_value = ref[1];
|
||||||
|
ref1 = base.get_dynamic_offset_for_target(workflow_action_offset, offset_value), date = ref1[0], value_shift = ref1[1];
|
||||||
|
absolute_value = offset_value + value_shift;
|
||||||
|
record_wrapper = RecordNode.create({
|
||||||
|
record: workflow_action_definition,
|
||||||
|
record_id: workflow_action_definition.get('id'),
|
||||||
|
offset_wrappers: [
|
||||||
|
OffsetNode.create({
|
||||||
|
total_offset: absolute_value,
|
||||||
|
value_shift: value_shift
|
||||||
|
})
|
||||||
|
],
|
||||||
|
absolute_value: absolute_value,
|
||||||
|
value_shift: value_shift,
|
||||||
|
date: date,
|
||||||
|
resolve_type: 'x',
|
||||||
|
resolved: true,
|
||||||
|
resolve_level: 0
|
||||||
|
});
|
||||||
|
first_loop_actions.push(record_wrapper);
|
||||||
|
return action_added = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!action_added) {
|
||||||
|
return working_workflow_action_definitions.push(workflow_action_definition);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.set('processed_workflow_action_definitions', first_loop_actions);
|
||||||
|
this.set('working_workflow_action_definitions', working_workflow_action_definitions);
|
||||||
|
this.incrementProperty('iteration_context_counter');
|
||||||
|
this.run_critical_path_resolve_loop();
|
||||||
|
resolve_level = this.get('iteration_context_counter');
|
||||||
|
return this.get('working_workflow_action_definitions').forEach((function(_this) {
|
||||||
|
return function(unresolved_workflow_action_definition) {
|
||||||
|
var offset_wrappers;
|
||||||
|
offset_wrappers = [];
|
||||||
|
unresolved_workflow_action_definition.get('workflow_action_offsets').forEach(function(action_offset) {
|
||||||
|
var ref;
|
||||||
|
if (ref = action_offset.get('base_workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return offset_wrappers.push(OffsetNode.create({
|
||||||
|
total_offset: action_offset.get('offset_value'),
|
||||||
|
record: action_offset
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
return _this.get('processed_workflow_action_definitions').push(RecordNode.create({
|
||||||
|
record: unresolved_workflow_action_definition,
|
||||||
|
record_id: unresolved_workflow_action_definition.get('id'),
|
||||||
|
offset_wrappers: offset_wrappers,
|
||||||
|
resolved: false,
|
||||||
|
resolve_level: resolve_level,
|
||||||
|
resolve_type: 'unresolved'
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
})(this));
|
||||||
|
},
|
||||||
|
get_dynamic_offset_for_target: function(target, absolute_value) {
|
||||||
|
var base_date, batch_size, empty, offset_value, operation, period_unit, shifted_date, threshold, threshold_exceedance, value_shift;
|
||||||
|
base_date = this.get('reference_date').clone().add(absolute_value, 'day');
|
||||||
|
empty = [base_date, 0];
|
||||||
|
if (!(batch_size = this.get('batch_size'))) {
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
if (!(threshold = target.get('batch_element_threshold_value'))) {
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
if (!(threshold_exceedance = Math.floor(batch_size / (0.1 + parseInt(threshold))))) {
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
period_unit = target.get('batch_element_threshold_unit');
|
||||||
|
offset_value = target.get('offset_value');
|
||||||
|
operation = offset_value < 0 ? 'subtract' : 'add';
|
||||||
|
if (period_unit === 'businessday') {
|
||||||
|
operation = "business" + (operation.capitalize());
|
||||||
|
shifted_date = base_date.clone()[operation](threshold_exceedance, {
|
||||||
|
business_days: target.get('batch_element_threshold_business_days')
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
shifted_date = base_date.clone()[operation](threshold_exceedance, period_unit);
|
||||||
|
}
|
||||||
|
value_shift = shifted_date.diff(base_date, 'day');
|
||||||
|
return [shifted_date, value_shift];
|
||||||
|
},
|
||||||
|
get_offset_for_target: function(target, absolute_value) {
|
||||||
|
var base_date, empty, offset_value, operation, period_unit, shifted_date, value_shift;
|
||||||
|
base_date = this.get('reference_date').clone().add(absolute_value, 'day');
|
||||||
|
empty = [base_date, 0];
|
||||||
|
if (!(offset_value = target.get('offset_value'))) {
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
period_unit = target.get('offset_unit');
|
||||||
|
operation = offset_value < 0 ? 'subtract' : 'add';
|
||||||
|
if (period_unit === 'businessday') {
|
||||||
|
operation = "business" + (operation.capitalize());
|
||||||
|
shifted_date = base_date.clone()[operation](Math.abs(offset_value), {
|
||||||
|
business_days: target.get('offset_business_days')
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
shifted_date = base_date.clone()[operation](Math.abs(offset_value), period_unit);
|
||||||
|
}
|
||||||
|
value_shift = shifted_date.diff(base_date, 'day');
|
||||||
|
return [shifted_date, value_shift];
|
||||||
|
},
|
||||||
|
run_critical_path_resolve_loop: function() {
|
||||||
|
var active_scenario_identifier, get_dynamic_offset_for_target, get_offset_for_target, processed_workflow_action_definitions, resolve_level, scope_workflow_action_definition_ids, working_indices_to_be_removed;
|
||||||
|
working_indices_to_be_removed = [];
|
||||||
|
active_scenario_identifier = this.get('active_project_scenario.identifier');
|
||||||
|
processed_workflow_action_definitions = this.get('processed_workflow_action_definitions');
|
||||||
|
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
|
||||||
|
get_dynamic_offset_for_target = this.get('get_dynamic_offset_for_target').bind(this);
|
||||||
|
get_offset_for_target = this.get('get_offset_for_target').bind(this);
|
||||||
|
resolve_level = this.get('iteration_context_counter');
|
||||||
|
this.get('working_workflow_action_definitions').forEach(function(working_workflow_action_definition, working_index) {
|
||||||
|
var all_offsets_resolved, date, farthest_absolute_value, farthest_absolute_value_value_shift, farthest_result_total_offset, record_wrapper, resolved_offset_wrappers;
|
||||||
|
if (working_workflow_action_definition.get('offset_type') !== 'configured') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
farthest_absolute_value = 0;
|
||||||
|
farthest_absolute_value_value_shift = 0;
|
||||||
|
farthest_result_total_offset = 0;
|
||||||
|
date = null;
|
||||||
|
resolved_offset_wrappers = [];
|
||||||
|
all_offsets_resolved = working_workflow_action_definition.get('workflow_action_offsets').every(function(workflow_action_offset) {
|
||||||
|
var current_connection_absolute_value, current_connection_total_offset_value, current_connection_value_shift, offset_date, processed_absolute_value, processed_base_workflow_action_definition_wrapper, ref, ref1, ref2, working_offset_value;
|
||||||
|
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy('record_id', workflow_action_offset.get('base_workflow_action_definition.id')))) {
|
||||||
|
if (ref = workflow_action_offset.get('base_workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value');
|
||||||
|
ref1 = get_offset_for_target(workflow_action_offset, processed_absolute_value), offset_date = ref1[0], working_offset_value = ref1[1];
|
||||||
|
ref2 = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value), date = ref2[0], current_connection_value_shift = ref2[1];
|
||||||
|
current_connection_total_offset_value = current_connection_value_shift + working_offset_value;
|
||||||
|
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value;
|
||||||
|
if (Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)) {
|
||||||
|
farthest_absolute_value = current_connection_absolute_value;
|
||||||
|
farthest_absolute_value_value_shift = current_connection_value_shift;
|
||||||
|
farthest_result_total_offset = current_connection_total_offset_value;
|
||||||
|
}
|
||||||
|
resolved_offset_wrappers.push(OffsetNode.create({
|
||||||
|
record: workflow_action_offset,
|
||||||
|
value_shift: current_connection_value_shift,
|
||||||
|
total_offset: current_connection_total_offset_value,
|
||||||
|
resulting_absolute_value: current_connection_absolute_value
|
||||||
|
}));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
if (all_offsets_resolved && resolved_offset_wrappers.length) {
|
||||||
|
record_wrapper = RecordNode.create({
|
||||||
|
record: working_workflow_action_definition,
|
||||||
|
record_id: working_workflow_action_definition.get('id'),
|
||||||
|
offset_wrappers: resolved_offset_wrappers,
|
||||||
|
value_shift: farthest_absolute_value_value_shift,
|
||||||
|
absolute_value: farthest_absolute_value,
|
||||||
|
date: date,
|
||||||
|
resolved: true,
|
||||||
|
resolve_level: resolve_level,
|
||||||
|
resolve_type: 'critical-path'
|
||||||
|
});
|
||||||
|
processed_workflow_action_definitions.push(record_wrapper);
|
||||||
|
return working_indices_to_be_removed.push(working_index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (working_indices_to_be_removed.length) {
|
||||||
|
while (working_indices_to_be_removed.length) {
|
||||||
|
this.get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1);
|
||||||
|
}
|
||||||
|
return this.run_critical_path_resolve_loop();
|
||||||
|
} else {
|
||||||
|
this.incrementProperty('iteration_context_counter');
|
||||||
|
return this.run_unresolved_tree_resolve_loop();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
run_unresolved_tree_resolve_loop: function() {
|
||||||
|
var active_scenario_identifier, get_dynamic_offset_for_target, get_offset_for_target, processed_workflow_action_definitions, resolve_level, scope_workflow_action_definition_ids, working_indices_to_be_removed;
|
||||||
|
working_indices_to_be_removed = [];
|
||||||
|
active_scenario_identifier = this.get('active_project_scenario.identifier');
|
||||||
|
processed_workflow_action_definitions = this.get('processed_workflow_action_definitions');
|
||||||
|
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
|
||||||
|
get_offset_for_target = this.get('get_offset_for_target').bind(this);
|
||||||
|
get_dynamic_offset_for_target = this.get('get_dynamic_offset_for_target').bind(this);
|
||||||
|
resolve_level = this.get('iteration_context_counter');
|
||||||
|
this.get('working_workflow_action_definitions').forEach(function(working_workflow_action_definition, working_index) {
|
||||||
|
var date, farthest_absolute_value, farthest_absolute_value_value_shift, farthest_result_total_offset, record_wrapper, resolved_offset_wrappers;
|
||||||
|
if (working_workflow_action_definition.get('offset_type') !== 'configured') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
farthest_absolute_value = 0;
|
||||||
|
farthest_absolute_value_value_shift = 0;
|
||||||
|
farthest_result_total_offset = 0;
|
||||||
|
date = null;
|
||||||
|
resolved_offset_wrappers = [];
|
||||||
|
working_workflow_action_definition.get('workflow_action_offsets').forEach(function(workflow_action_offset) {
|
||||||
|
var current_connection_absolute_value, current_connection_total_offset_value, current_connection_value_shift, offset_date, processed_absolute_value, processed_base_workflow_action_definition_wrapper, ref, ref1, ref2, working_offset_value;
|
||||||
|
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ref = workflow_action_offset.get('base_workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy('record_id', workflow_action_offset.get('base_workflow_action_definition.id')))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value');
|
||||||
|
ref1 = get_offset_for_target(workflow_action_offset, processed_absolute_value), offset_date = ref1[0], working_offset_value = ref1[1];
|
||||||
|
ref2 = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value), date = ref2[0], current_connection_value_shift = ref2[1];
|
||||||
|
current_connection_total_offset_value = current_connection_value_shift + working_offset_value;
|
||||||
|
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value;
|
||||||
|
if (Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)) {
|
||||||
|
farthest_absolute_value = current_connection_absolute_value;
|
||||||
|
farthest_absolute_value_value_shift = current_connection_value_shift;
|
||||||
|
farthest_result_total_offset = current_connection_total_offset_value;
|
||||||
|
}
|
||||||
|
return resolved_offset_wrappers.push(OffsetNode.create({
|
||||||
|
record: workflow_action_offset,
|
||||||
|
value_shift: current_connection_value_shift,
|
||||||
|
total_offset: current_connection_total_offset_value,
|
||||||
|
resulting_absolute_value: current_connection_absolute_value
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
if (resolved_offset_wrappers.length) {
|
||||||
|
record_wrapper = RecordNode.create({
|
||||||
|
record: working_workflow_action_definition,
|
||||||
|
record_id: working_workflow_action_definition.get('id'),
|
||||||
|
offset_wrappers: resolved_offset_wrappers,
|
||||||
|
value_shift: farthest_absolute_value_value_shift,
|
||||||
|
absolute_value: farthest_absolute_value,
|
||||||
|
date: date,
|
||||||
|
resolved: true,
|
||||||
|
resolve_level: resolve_level,
|
||||||
|
resolve_type: 'with-non-rooted-offsets'
|
||||||
|
});
|
||||||
|
processed_workflow_action_definitions.push(record_wrapper);
|
||||||
|
return working_indices_to_be_removed.push(working_index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (working_indices_to_be_removed.length) {
|
||||||
|
while (working_indices_to_be_removed.length) {
|
||||||
|
this.get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1);
|
||||||
|
}
|
||||||
|
return this.run_critical_path_resolve_loop();
|
||||||
|
} else {
|
||||||
|
return this.run_offset_forwarding_loop();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
run_offset_forwarding_loop: function() {
|
||||||
|
var active_scenario_identifier, get_dynamic_offset_for_target, get_offset_for_target, processed_workflow_action_definitions, resolve_level, scope_workflow_action_definition_ids, working_indices_to_be_removed;
|
||||||
|
working_indices_to_be_removed = [];
|
||||||
|
active_scenario_identifier = this.get('active_project_scenario.identifier');
|
||||||
|
processed_workflow_action_definitions = this.get('processed_workflow_action_definitions');
|
||||||
|
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
|
||||||
|
get_offset_for_target = this.get('get_offset_for_target').bind(this);
|
||||||
|
get_dynamic_offset_for_target = this.get('get_dynamic_offset_for_target').bind(this);
|
||||||
|
resolve_level = this.get('iteration_context_counter');
|
||||||
|
this.get('working_workflow_action_definitions').forEach(function(working_workflow_action_definition, working_index) {
|
||||||
|
var date, farthest_absolute_value, farthest_absolute_value_value_shift, farthest_result_total_offset, record_wrapper, resolved_offset_wrappers;
|
||||||
|
farthest_absolute_value = 0;
|
||||||
|
farthest_absolute_value_value_shift = 0;
|
||||||
|
farthest_result_total_offset = 0;
|
||||||
|
date = null;
|
||||||
|
resolved_offset_wrappers = [];
|
||||||
|
working_workflow_action_definition.get('dependent_workflow_action_offsets').forEach(function(workflow_action_offset) {
|
||||||
|
var current_connection_absolute_value, current_connection_total_offset_value, current_connection_value_shift, offset_date, processed_absolute_value, processed_base_workflow_action_definition_wrapper, ref, ref1, ref2, working_offset_value;
|
||||||
|
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ref = workflow_action_offset.get('workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy('record_id', workflow_action_offset.get('workflow_action_definition.id')))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value');
|
||||||
|
ref1 = get_offset_for_target(workflow_action_offset, processed_absolute_value), offset_date = ref1[0], working_offset_value = ref1[1];
|
||||||
|
ref2 = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value), date = ref2[0], current_connection_value_shift = ref2[1];
|
||||||
|
current_connection_total_offset_value = current_connection_value_shift + working_offset_value;
|
||||||
|
current_connection_absolute_value = processed_absolute_value - current_connection_total_offset_value;
|
||||||
|
if (Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)) {
|
||||||
|
farthest_absolute_value = current_connection_absolute_value;
|
||||||
|
farthest_absolute_value_value_shift = current_connection_value_shift;
|
||||||
|
farthest_result_total_offset = current_connection_total_offset_value;
|
||||||
|
}
|
||||||
|
return resolved_offset_wrappers.push(OffsetNode.create({
|
||||||
|
record: workflow_action_offset,
|
||||||
|
value_shift: current_connection_value_shift,
|
||||||
|
total_offset: current_connection_total_offset_value,
|
||||||
|
resulting_absolute_value: current_connection_absolute_value
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
if (resolved_offset_wrappers.length) {
|
||||||
|
record_wrapper = RecordNode.create({
|
||||||
|
record: working_workflow_action_definition,
|
||||||
|
record_id: working_workflow_action_definition.get('id'),
|
||||||
|
offset_wrappers: resolved_offset_wrappers,
|
||||||
|
value_shift: farthest_absolute_value_value_shift,
|
||||||
|
absolute_value: farthest_absolute_value,
|
||||||
|
date: date,
|
||||||
|
resolved: true,
|
||||||
|
resolve_level: resolve_level,
|
||||||
|
resolve_type: 'offset-lookup-inversion'
|
||||||
|
});
|
||||||
|
processed_workflow_action_definitions.push(record_wrapper);
|
||||||
|
return working_indices_to_be_removed.push(working_index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (working_indices_to_be_removed.length) {
|
||||||
|
while (working_indices_to_be_removed.length) {
|
||||||
|
this.get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1);
|
||||||
|
}
|
||||||
|
return this.run_critical_path_resolve_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default WorkflowActionDefinitionOffsetNodes;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators'
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors'
|
||||||
|
|
||||||
|
validations =
|
||||||
|
name: validatePresence presence: true, message: (key, type) ->
|
||||||
|
buildMessage t("attributes.workflow_action_definition.#{key}"), type: type
|
||||||
|
export default validations
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var validations;
|
||||||
|
|
||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators';
|
||||||
|
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors';
|
||||||
|
|
||||||
|
validations = {
|
||||||
|
name: validatePresence({
|
||||||
|
presence: true,
|
||||||
|
message: function(key, type) {
|
||||||
|
return buildMessage(t("attributes.workflow_action_definition." + key), {
|
||||||
|
type: type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default validations;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators'
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors'
|
||||||
|
|
||||||
|
validations =
|
||||||
|
client_identifier: validatePresence presence: true, message: (key, type) ->
|
||||||
|
buildMessage t("attributes.project_instance.#{key}"), type: type
|
||||||
|
export default validations
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var validations;
|
||||||
|
|
||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators';
|
||||||
|
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors';
|
||||||
|
|
||||||
|
validations = {
|
||||||
|
client_identifier: validatePresence({
|
||||||
|
presence: true,
|
||||||
|
message: function(key, type) {
|
||||||
|
return buildMessage(t("attributes.project_instance." + key), {
|
||||||
|
type: type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default validations;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators'
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors'
|
||||||
|
|
||||||
|
validations =
|
||||||
|
name: validatePresence presence: true, message: (key, type) ->
|
||||||
|
buildMessage t("attributes.workflow_action_definition.#{key}"), type: type
|
||||||
|
export default validations
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var validations;
|
||||||
|
|
||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators';
|
||||||
|
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors';
|
||||||
|
|
||||||
|
validations = {
|
||||||
|
name: validatePresence({
|
||||||
|
presence: true,
|
||||||
|
message: function(key, type) {
|
||||||
|
return buildMessage(t("attributes.workflow_action_definition." + key), {
|
||||||
|
type: type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default validations;
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import {
|
||||||
|
validatePresence,
|
||||||
|
validateFormat
|
||||||
|
} from 'ember-changeset-validations/validators'
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors'
|
||||||
|
|
||||||
|
validations =
|
||||||
|
nickname: validatePresence presence: true, message: (key, type) ->
|
||||||
|
buildMessage t("attributes.user.#{key}"), type: type
|
||||||
|
email: validateFormat type: 'email', message: (key, type) ->
|
||||||
|
buildMessage t("attributes.user.#{key}"), type: type
|
||||||
|
|
||||||
|
export default validations
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var validations;
|
||||||
|
|
||||||
|
import {
|
||||||
|
validatePresence,
|
||||||
|
validateFormat
|
||||||
|
} from 'ember-changeset-validations/validators';
|
||||||
|
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors';
|
||||||
|
|
||||||
|
validations = {
|
||||||
|
nickname: validatePresence({
|
||||||
|
presence: true,
|
||||||
|
message: function(key, type) {
|
||||||
|
return buildMessage(t("attributes.user." + key), {
|
||||||
|
type: type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
email: validateFormat({
|
||||||
|
type: 'email',
|
||||||
|
message: function(key, type) {
|
||||||
|
return buildMessage(t("attributes.user." + key), {
|
||||||
|
type: type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default validations;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators'
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors'
|
||||||
|
|
||||||
|
validations =
|
||||||
|
title: validatePresence presence: true, message: (key, type) ->
|
||||||
|
buildMessage t("attributes.workflow_action_definition.#{key}"), type: type
|
||||||
|
export default validations
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// Generated by CoffeeScript 1.12.5
|
||||||
|
var validations;
|
||||||
|
|
||||||
|
import {
|
||||||
|
validatePresence
|
||||||
|
} from 'ember-changeset-validations/validators';
|
||||||
|
|
||||||
|
import buildMessage from 'ember-changeset-validations/utils/validation-errors';
|
||||||
|
|
||||||
|
validations = {
|
||||||
|
title: validatePresence({
|
||||||
|
presence: true,
|
||||||
|
message: function(key, type) {
|
||||||
|
return buildMessage(t("attributes.workflow_action_definition." + key), {
|
||||||
|
type: type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default validations;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { default } from 'ember-panda/components/action-list/organization-filter';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { default } from 'ember-panda/components/action-list/project-filter';
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import JSONFormatter from 'npm:json-formatter-js'
|
||||||
|
|
||||||
|
export default Ember.Component.extend
|
||||||
|
classNames: ['ui', 'secondary', 'segment', 'format-json-container']
|
||||||
|
value: {}
|
||||||
|
nesting_level: Infinity
|
||||||
|
top_title: 'JSON'
|
||||||
|
didInsertElement: ->
|
||||||
|
formatter = new JSONFormatter.default(@get('value'), @get('nesting_level'))
|
||||||
|
v = formatter.render()
|
||||||
|
tree = $(v)
|
||||||
|
tree.find('.json-formatter-constructor-name:first').removeClass('json-formatter-constructor-name').addClass('json-formatter-top-node-name').text(@get('top_title'))
|
||||||
|
@$().append(v)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
});
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
export default Ember.Controller.extend
|
||||||
|
alert_message: ""
|
||||||
|
modal_options: {}
|
||||||
|
layoutName: 'modals/layout'
|
||||||
|
willOpenModal: -> # can be implemented, is fired after loading attributes, before rendering
|
||||||
|
title: (->
|
||||||
|
# return title if directly set by options
|
||||||
|
return @get('modal_options.title') if @get('modal_options.title')
|
||||||
|
# return translated title_path if directly set by controller
|
||||||
|
translation_params = {}
|
||||||
|
if title_params = @get('modal_options.title_params')
|
||||||
|
translation_params = title_params
|
||||||
|
else if model = @get('model')
|
||||||
|
translation_params = model.toJSON() if model.toJSON
|
||||||
|
|
||||||
|
# return translated title_path if directly set by options
|
||||||
|
# return translated title_path if directly set by controller
|
||||||
|
if title_path = @get('modal_options.title_path') || @get('title_path')
|
||||||
|
return tspan(title_path, translation_params).htmlSafe()
|
||||||
|
# return translated title_path if directly set by options
|
||||||
|
#return tspan(@get('modal_options.title_path'), translation_params).htmlSafe() if @get('modal_options.title_path')
|
||||||
|
# return translated title_path if directly set by controller
|
||||||
|
#return tspan(@title_path, translation_params).htmlSafe() if @title_path
|
||||||
|
# infer title path based on controller name App.modals.AddSectionController => add_section
|
||||||
|
#underscored = `this.constructor.toString().substr(11).replace(/Controller$/, '').underscore()`
|
||||||
|
underscored = @constructor.toString().replace(/.*controller:/, '').replace(/\W+$/, '').underscore().replace('/', '.')
|
||||||
|
#underscored = @constructor.toString().replace(/[a-zA-Z_-]+\@controller:modals\//, '').replace(/:$/, '').underscore() # ember cli
|
||||||
|
# find translated title or humanize the controller name
|
||||||
|
if convention_translation = ttry("#{underscored}.title", translation_params)
|
||||||
|
tspan("#{underscored}.title", translation_params).htmlSafe()
|
||||||
|
else
|
||||||
|
underscored.replace(/.*\./,'').capitalize().replace(/_/, ' ')
|
||||||
|
).property('model.id', 'modal_options.title_path')
|
||||||
|
body: (->
|
||||||
|
@get('modal_options.body')
|
||||||
|
).property('modal_options.body')
|
||||||
|
save_error: (error)->
|
||||||
|
switch error.status
|
||||||
|
when 403
|
||||||
|
@set 'alert_message', 'Unauthorized action'
|
||||||
|
else
|
||||||
|
@set 'alert_message', 'Something went wrong'
|
||||||
|
save_success: ->
|
||||||
|
if save_callback = @get('modal_options.save')
|
||||||
|
save_callback.apply(@)
|
||||||
|
@set 'alert_message', ''
|
||||||
|
@send 'closeModal'
|
||||||
|
|
||||||
|
actions:
|
||||||
|
close: ->
|
||||||
|
if close = @get('modal_options.close')
|
||||||
|
close.apply(@)
|
||||||
|
unless @preventClose
|
||||||
|
@set 'alert_message', ''
|
||||||
|
@send 'closeModal'
|
||||||
|
closeOnOverlay: ->
|
||||||
|
@send('close') if @get('modal_options.closeOnOverlay')
|
||||||
|
false
|
||||||
|
modalClick: ->
|
||||||
|
@send('close') if @get('modal_options.closeOnModalClick')
|
||||||
|
false
|
||||||
|
ok: ->
|
||||||
|
if ok = @get('modal_options.ok')
|
||||||
|
ok.apply(@)
|
||||||
|
@set 'alert_message', ''
|
||||||
|
@send 'closeModal' unless @preventClose
|
||||||
|
confirm: -> @send('ok')
|
||||||
|
saveRecord: ->
|
||||||
|
if @get('model.isValid')
|
||||||
|
@get('model').save().then @save_success.bind(@), @save_error.bind(@)
|
||||||
|
#@send 'closeModal' unless @preventClose
|
||||||
|
rollback_and_close: ->
|
||||||
|
@get('model').rollbackAttributes()
|
||||||
|
@send 'close'
|
||||||
|
destroyRecord: ->
|
||||||
|
my_scope = @
|
||||||
|
destroy_callback = @get('modal_options.destroy_callback')
|
||||||
|
@modal 'confirm',
|
||||||
|
title_path: @get('modal_options.destroy_text_path') || 'general.destroy.are_you_sure'
|
||||||
|
model: @get('model')
|
||||||
|
ok: ->
|
||||||
|
@get('model').destroyRecord()
|
||||||
|
destroy_callback.call(my_scope) if destroy_callback
|
||||||
|
@send 'closeModal' unless @preventClose
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import ModalBase from 'ember-cli-dunlop/mixins/modal-base'
|
||||||
|
export default ModalBase.extend
|
||||||
|
showAll: true
|
||||||
|
workflow_groups: Ember.computed.alias "model"
|
||||||
|
showTitles: Ember.computed "model.length", "title", ->
|
||||||
|
return false if @get("model.length") is 1 and @get('model.firstObject.name') is @get('title')
|
||||||
|
true
|
||||||
|
#workflow_action_definitions: Ember.computed 'model.[]', 'showAll', ->
|
||||||
|
# workflow_action_definitions = @get('model')
|
||||||
|
# unless @get('showAll')
|
||||||
|
# workflow_action_definitions = workflow_action_definitions.rejectBy('done')
|
||||||
|
# workflow_action_definitions.sortBy('workflow_group.name', 'smart_position')
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import Ember from 'ember'
|
||||||
|
import BaseController from './base'
|
||||||
|
export default BaseController.extend
|
||||||
|
a: 3
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user