kanban view in entity manager

This commit is contained in:
yuri
2018-04-23 11:56:46 +03:00
parent fbc1e936db
commit c361a940eb
7 changed files with 204 additions and 86 deletions
@@ -87,6 +87,11 @@ class EntityManager extends \Espo\Core\Controllers\Base
$params['color'] = $data['color'];
}
$params['kanbanViewMode'] = !empty($data['kanbanViewMode']);
if (!empty($data['kanbanStatusIgnoreList'])) {
$params['kanbanStatusIgnoreList'] = $data['kanbanStatusIgnoreList'];
}
$result = $this->getContainer()->get('entityManagerUtil')->create($name, $type, $params);
if ($result) {
@@ -283,6 +283,10 @@ class EntityManager
$scopesData['isNotRemovable'] = true;
}
if (!empty($params['kanbanStatusIgnoreList'])) {
$scopesData['kanbanStatusIgnoreList'] = $params['kanbanStatusIgnoreList'];
}
$this->getMetadata()->set('scopes', $name, $scopesData);
$filePath = $templatePath . "/Metadata/{$type}/entityDefs.json";
@@ -306,6 +310,10 @@ class EntityManager
if (array_key_exists('color', $params)) {
$clientDefsData['color'] = $params['color'];
};
if (!empty($params['kanbanViewMode'])) {
$clientDefsData['kanbanViewMode'] = true;
}
$this->getMetadata()->set('clientDefs', $name, $clientDefsData);
$this->getBaseLanguage()->set('Global', 'scopeNames', $name, $labelSingular);
@@ -391,6 +399,18 @@ class EntityManager
$this->getMetadata()->set('entityDefs', $name, $entityDefsData);
}
if (array_key_exists('kanbanStatusIgnoreList', $data)) {
$scopeData['kanbanStatusIgnoreList'] = $data['kanbanStatusIgnoreList'];
$this->getMetadata()->set('scopes', $name, $scopeData);
}
if (array_key_exists('kanbanViewMode', $data)) {
$clientDefsData = [
'kanbanViewMode' => $data['kanbanViewMode']
];
$this->getMetadata()->set('clientDefs', $name, $clientDefsData);
}
if (array_key_exists('color', $data)) {
$clientDefsData = [
'color' => $data['color']
@@ -29,7 +29,9 @@
"auditedForeign": "Foreign Audited",
"statusField": "Status Field",
"beforeSaveCustomScript": "Before Save Custom Script",
"color": "Color"
"color": "Color",
"kanbanViewMode": "Kanban View",
"kanbanStatusIgnoreList": "Ignored groups in Kanban view"
},
"options": {
"type": {
@@ -69,14 +69,27 @@
{{{textFilterFields}}}
</div>
</div>
{{#if stream}}
<div class="cell form-group col-md-6" data-name="statusField">
<label class="control-label" data-name="statusField">{{translate 'statusField' category='fields' scope='EntityManager'}}</label>
<div class="field" data-name="statusField">
{{{statusField}}}
</div>
</div>
{{/if}}
</div>
<div class="row">
<div class="cell form-group col-md-6" data-name="kanbanViewMode">
<label class="control-label" data-name="kanbanViewMode">{{translate 'kanbanViewMode' category='fields' scope='EntityManager'}}</label>
<div class="field" data-name="kanbanViewMode">
{{{kanbanViewMode}}}
</div>
</div>
<div class="cell form-group col-md-6" data-name="kanbanStatusIgnoreList">
<label class="control-label" data-name="kanbanStatusIgnoreList">{{translate 'kanbanStatusIgnoreList' category='fields' scope='EntityManager'}}</label>
<div class="field" data-name="kanbanStatusIgnoreList">
{{{kanbanStatusIgnoreList}}}
</div>
</div>
</div>
{{/unless}}
@@ -91,6 +91,9 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo
this.model.set('statusField', this.getMetadata().get('scopes.' + scope + '.statusField') || null);
this.model.set('color', this.getMetadata().get(['clientDefs', scope, 'color']) || null);
this.model.set('kanbanViewMode', this.getMetadata().get(['clientDefs', scope, 'kanbanViewMode']) || false);
this.model.set('kanbanStatusIgnoreList', this.getMetadata().get(['scopes', scope, 'kanbanStatusIgnoreList']) || []);
}
this.createView('type', 'views/fields/enum', {
@@ -222,6 +225,15 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo
}
});
this.createView('kanbanViewMode', 'views/fields/bool', {
model: model,
mode: 'edit',
el: this.options.el + ' .field[data-name="kanbanViewMode"]',
defs: {
name: 'kanbanViewMode'
}
});
var optionList = Object.keys(fieldDefs).filter(function (item) {
if (!~['varchar', 'text', 'phone', 'email', 'personName', 'number'].indexOf(this.getMetadata().get(['entityDefs', scope, 'fields', item, 'type']))) {
return false;
@@ -253,39 +265,53 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo
});
if (this.hasStreamField) {
var enumFieldList = Object.keys(fieldDefs).filter(function (item) {
if (fieldDefs[item].disabled) return;
if (fieldDefs[item].type == 'enum') {
return true;
var enumFieldList = Object.keys(fieldDefs).filter(function (item) {
if (fieldDefs[item].disabled) return;
if (fieldDefs[item].type == 'enum') {
return true;
}
return;
}, this).sort(function (v1, v2) {
return this.translate(v1, 'fields', scope).localeCompare(this.translate(v2, 'fields', scope));
}.bind(this));
var translatedStatusFields = {};
enumFieldList.forEach(function (item) {
translatedStatusFields[item] = this.translate(item, 'fields', scope);
}, this);
enumFieldList.unshift('');
translatedStatusFields[''] = '-' + this.translate('None') + '-';
this.createView('statusField', 'views/fields/enum', {
model: model,
mode: 'edit',
el: this.options.el + ' .field[data-name="statusField"]',
defs: {
name: 'statusField',
params: {
options: enumFieldList
}
return;
}, this).sort(function (v1, v2) {
return this.translate(v1, 'fields', scope).localeCompare(this.translate(v2, 'fields', scope));
}.bind(this));
},
tooltip: true,
tooltipText: this.translate('statusField', 'tooltips', 'EntityManager'),
translatedOptions: translatedStatusFields
});
var translatedStatusFields = {};
enumFieldList.forEach(function (item) {
translatedStatusFields[item] = this.translate(item, 'fields', scope);
}, this);
enumFieldList.unshift('');
translatedStatusFields[''] = '-' + this.translate('None') + '-';
var statusOptionList = [];
var translatedStatusOptions = {};
this.createView('statusField', 'views/fields/enum', {
model: model,
mode: 'edit',
el: this.options.el + ' .field[data-name="statusField"]',
defs: {
name: 'statusField',
params: {
options: enumFieldList
}
},
tooltip: true,
tooltipText: this.translate('statusField', 'tooltips', 'EntityManager'),
translatedOptions: translatedStatusFields
});
}
this.createView('kanbanStatusIgnoreList', 'views/fields/multi-enum', {
model: model,
mode: 'edit',
el: this.options.el + ' .field[data-name="kanbanStatusIgnoreList"]',
defs: {
name: 'kanbanStatusIgnoreList',
params: {
options: statusOptionList
}
},
translatedOptions: translatedStatusOptions
});
}
this.model.fetchedAttributes = this.model.getClonedAttributes();
},
@@ -325,22 +351,62 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo
this.model.set('name', name);
}, this);
this.manageStreamField();
this.listenTo(this.model, 'change:stream', function () {
this.manageStreamField();
}, this);
if (!this.isNew) {
this.manageKanbanFields({});
this.listenTo(this.model, 'change:statusField', function (m, value, o) {
this.manageKanbanFields(o);
}, this);
this.manageKanbanViewModeField();
this.listenTo(this.model, 'change:kanbanViewMode', function () {
this.manageKanbanViewModeField();
}, this);
}
if (this.isNew) {
this.hideField('disabled');
}
},
manageStreamField: function () {
if (this.model.get('stream')) {
this.showField('statusField');
} else {
this.hideField('statusField');
manageKanbanFields: function (o) {
if (o.ui) {
this.model.set('kanbanStatusIgnoreList', []);
}
if (this.model.get('statusField')) {
this.setKanbanStatusIgnoreListOptions();
this.showField('kanbanViewMode');
if (this.model.get('kanbanViewMode')) {
this.showField('kanbanStatusIgnoreList');
} else {
this.hideField('kanbanStatusIgnoreList');
}
} else {
this.hideField('kanbanViewMode');
this.hideField('kanbanStatusIgnoreList');
}
},
manageKanbanViewModeField: function () {
if (this.model.get('kanbanViewMode')) {
this.showField('kanbanStatusIgnoreList');
} else {
this.hideField('kanbanStatusIgnoreList');
}
},
setKanbanStatusIgnoreListOptions: function () {
var statusField = this.model.get('statusField');
var fieldView = this.getView('kanbanStatusIgnoreList');
var optionList = this.getMetadata().get(['entityDefs', this.scope, 'fields', statusField, 'options']) || [];
var translation = this.getMetadata().get(['entityDefs', this.scope, 'fields', statusField, 'translation']) || this.scope + '.options.' + statusField;
fieldView.params.options = optionList;
fieldView.params.translation = translation;
fieldView.setupTranslation();
fieldView.setOptionList(optionList);
},
actionSave: function () {
@@ -357,6 +423,8 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo
if (this.scope) {
arr.push('sortBy');
arr.push('sortDirection');
arr.push('kanbanViewMode');
arr.push('kanbanStatusIgnoreList');
}
var notValid = false;
@@ -405,6 +473,8 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo
if (this.scope) {
data.sortBy = this.model.get('sortBy');
data.sortDirection = this.model.get('sortDirection');
data.kanbanViewMode = this.model.get('kanbanViewMode');
data.kanbanStatusIgnoreList = this.model.get('kanbanStatusIgnoreList');
}
if (!this.isNew) {
+30 -26
View File
@@ -105,32 +105,7 @@ Espo.define('views/fields/array', ['views/fields/base', 'lib!Selectize'], functi
}
if (!this.translatedOptions) {
var t = {};
if (this.params.translation) {
var data = this.getLanguage().data;
var arr = this.params.translation.split('.');
var pointer = this.getLanguage().data;
arr.forEach(function (key) {
if (key in pointer) {
pointer = pointer[key];
t = pointer;
}
}, this);
} else {
t = this.translate(this.name, 'options', this.model.name);
}
this.translatedOptions = null;
var translatedOptions = {};
if (this.params.options) {
this.params.options.forEach(function (o) {
if (typeof t === 'object' && o in t) {
translatedOptions[o] = t[o];
} else {
translatedOptions[o] = o;
}
}.bind(this));
this.translatedOptions = translatedOptions;
}
this.setupTranslation();
}
if (this.options.customOptionList) {
@@ -138,6 +113,35 @@ Espo.define('views/fields/array', ['views/fields/base', 'lib!Selectize'], functi
}
},
setupTranslation: function () {
var t = {};
if (this.params.translation) {
var data = this.getLanguage().data;
var arr = this.params.translation.split('.');
var pointer = this.getLanguage().data;
arr.forEach(function (key) {
if (key in pointer) {
pointer = pointer[key];
t = pointer;
}
}, this);
} else {
t = this.translate(this.name, 'options', this.model.name);
}
this.translatedOptions = null;
var translatedOptions = {};
if (this.params.options) {
this.params.options.forEach(function (o) {
if (typeof t === 'object' && o in t) {
translatedOptions[o] = t[o];
} else {
translatedOptions[o] = o;
}
}.bind(this));
this.translatedOptions = translatedOptions;
}
},
setupOptions: function () {
},
+22 -18
View File
@@ -80,6 +80,28 @@ Espo.define('views/fields/enum', ['views/fields/base', 'lib!Selectize'], functio
this.translatedOptions = this.params.translatedOptions;
}
this.setupTranslation();
if (this.translatedOptions === null) {
this.translatedOptions = this.getLanguage().translate(this.name, 'options', this.model.name) || {};
if (this.translatedOptions === this.name) {
this.translatedOptions = null;
}
}
if (this.params.isSorted && this.translatedOptions) {
this.params.options = Espo.Utils.clone(this.params.options);
this.params.options = this.params.options.sort(function (v1, v2) {
return (this.translatedOptions[v1] || v1).localeCompare(this.translatedOptions[v2] || v2);
}.bind(this));
}
if (this.options.customOptionList) {
this.setOptionList(this.options.customOptionList);
}
},
setupTranslation: function () {
if (this.params.translation) {
var translationObj;
var data = this.getLanguage().data;
@@ -111,24 +133,6 @@ Espo.define('views/fields/enum', ['views/fields/base', 'lib!Selectize'], functio
this.translatedOptions = translatedOptions;
}
}
if (this.translatedOptions === null) {
this.translatedOptions = this.getLanguage().translate(this.name, 'options', this.model.name) || {};
if (this.translatedOptions === this.name) {
this.translatedOptions = null;
}
}
if (this.params.isSorted && this.translatedOptions) {
this.params.options = Espo.Utils.clone(this.params.options);
this.params.options = this.params.options.sort(function (v1, v2) {
return (this.translatedOptions[v1] || v1).localeCompare(this.translatedOptions[v2] || v2);
}.bind(this));
}
if (this.options.customOptionList) {
this.setOptionList(this.options.customOptionList);
}
},
setupOptions: function () {