From 9e15565227180d134d6a4333a162f129047850aa Mon Sep 17 00:00:00 2001 From: yuri Date: Wed, 11 Nov 2015 15:21:18 +0200 Subject: [PATCH] linkMultiple in Entity Manager --- .../Espo/Controllers/EntityManager.php | 28 ++++- application/Espo/Core/Utils/EntityManager.php | 84 ++++++++++++--- .../Resources/i18n/en_US/EntityManager.json | 4 +- .../admin/link-manager/modals/edit.tpl | 15 +++ .../views/admin/link-manager/modals/edit.js | 102 +++++++++++++++--- 5 files changed, 198 insertions(+), 35 deletions(-) diff --git a/application/Espo/Controllers/EntityManager.php b/application/Espo/Controllers/EntityManager.php index 66e5b23576..1a2f7fac38 100644 --- a/application/Espo/Controllers/EntityManager.php +++ b/application/Espo/Controllers/EntityManager.php @@ -166,7 +166,7 @@ class EntityManager extends \Espo\Core\Controllers\Base ]; $additionalParamList = [ - 'relationName' + 'relationName', ]; $params = array(); @@ -182,6 +182,13 @@ class EntityManager extends \Espo\Core\Controllers\Base $params[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING); } + if (array_key_exists('linkMultipleField', $data)) { + $params['linkMultipleField'] = $data['linkMultipleField']; + } + if (array_key_exists('linkMultipleFieldForeign', $data)) { + $params['linkMultipleFieldForeign'] = $data['linkMultipleFieldForeign']; + } + $result = $this->getContainer()->get('entityManagerUtil')->createLink($params); if ($result) { @@ -208,12 +215,25 @@ class EntityManager extends \Espo\Core\Controllers\Base 'labelForeign' ]; - $d = array(); + $additionalParamList = []; + + $params = array(); foreach ($paramList as $item) { - $d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING); + $params[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING); } - $result = $this->getContainer()->get('entityManagerUtil')->updateLink($d); + foreach ($additionalParamList as $item) { + $params[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING); + } + + if (array_key_exists('linkMultipleField', $data)) { + $params['linkMultipleField'] = $data['linkMultipleField']; + } + if (array_key_exists('linkMultipleFieldForeign', $data)) { + $params['linkMultipleFieldForeign'] = $data['linkMultipleFieldForeign']; + } + + $result = $this->getContainer()->get('entityManagerUtil')->updateLink($params); if ($result) { $this->getContainer()->get('dataManager')->clearCache(); diff --git a/application/Espo/Core/Utils/EntityManager.php b/application/Espo/Core/Utils/EntityManager.php index 3c7788ee37..bbd897d872 100644 --- a/application/Espo/Core/Utils/EntityManager.php +++ b/application/Espo/Core/Utils/EntityManager.php @@ -276,6 +276,16 @@ class EntityManager } } + $linkMultipleField = false; + if (!empty($params['linkMultipleField'])) { + $linkMultipleField = true; + } + + $linkMultipleFieldForeign = false; + if (!empty($params['linkMultipleFieldForeign'])) { + $linkMultipleFieldForeign = true; + } + if (empty($linkType)) { throw new Error(); } @@ -308,11 +318,11 @@ class EntityManager 'fields' => array( $link => array( "type" => "linkMultiple", - "layoutDetailDisabled" => true, + "layoutDetailDisabled" => !$linkMultipleField, "layoutListDisabled" => true, - "layoutMassUpdateDisabled" => true, - "noLoad" => true, - "importDisabled" => true, + "layoutMassUpdateDisabled" => !$linkMultipleField, + "noLoad" => !$linkMultipleField, + "importDisabled" => !$linkMultipleField, 'isCustom' => true ) ), @@ -364,11 +374,11 @@ class EntityManager 'fields' => array( $linkForeign => array( "type" => "linkMultiple", - "layoutDetailDisabled" => true, + "layoutDetailDisabled" => !$linkMultipleFieldForeign, "layoutListDisabled" => true, - "layoutMassUpdateDisabled" => true, - "noLoad" => true, - "importDisabled" => true, + "layoutMassUpdateDisabled" => !$linkMultipleFieldForeign, + "noLoad" => !$linkMultipleFieldForeign, + "importDisabled" => !$linkMultipleFieldForeign, 'isCustom' => true ) ), @@ -387,11 +397,11 @@ class EntityManager 'fields' => array( $link => array( "type" => "linkMultiple", - "layoutDetailDisabled" => true, + "layoutDetailDisabled" => !$linkMultipleField, "layoutListDisabled" => true, - "layoutMassUpdateDisabled" => true, - "importDisabled" => true, - "noLoad" => true, + "layoutMassUpdateDisabled" => !$linkMultipleField, + "importDisabled" => !$linkMultipleField, + "noLoad" => !$linkMultipleField, 'isCustom' => true ) ), @@ -409,11 +419,11 @@ class EntityManager 'fields' => array( $linkForeign => array( "type" => "linkMultiple", - "layoutDetailDisabled" => true, + "layoutDetailDisabled" => !$linkMultipleFieldForeign, "layoutListDisabled" => true, - "layoutMassUpdateDisabled" => true, - "importDisabled" => true, - "noLoad" => true, + "layoutMassUpdateDisabled" => !$linkMultipleFieldForeign, + "importDisabled" => !$linkMultipleFieldForeign, + "noLoad" => !$linkMultipleFieldForeign, 'isCustom' => true ) ), @@ -465,6 +475,48 @@ class EntityManager throw new Error(); } + if ($this->getMetadata()->get("entityDefs.{$entity}.links.{$link}.type") == 'hasMany') { + if (array_key_exists('linkMultipleField', $params)) { + $linkMultipleField = $params['linkMultipleField']; + $dataLeft = array( + 'fields' => array( + $link => array( + "type" => "linkMultiple", + "layoutDetailDisabled" => !$linkMultipleField, + "layoutListDisabled" => true, + "layoutMassUpdateDisabled" => !$linkMultipleField, + "noLoad" => !$linkMultipleField, + "importDisabled" => !$linkMultipleField, + 'isCustom' => true + ) + ) + ); + $this->getMetadata()->set('entityDefs', $entity, $dataLeft); + $this->getMetadata()->save(); + } + } + + if ($this->getMetadata()->get("entityDefs.{$entityForeign}.links.{$linkForeign}.type") == 'hasMany') { + if (array_key_exists('linkMultipleFieldForeign', $params)) { + $linkMultipleFieldForeign = $params['linkMultipleFieldForeign']; + $dataRight = array( + 'fields' => array( + $linkForeign => array( + "type" => "linkMultiple", + "layoutDetailDisabled" => !$linkMultipleFieldForeign, + "layoutListDisabled" => true, + "layoutMassUpdateDisabled" => !$linkMultipleFieldForeign, + "noLoad" => !$linkMultipleFieldForeign, + "importDisabled" => !$linkMultipleFieldForeign, + 'isCustom' => true + ) + ) + ); + $this->getMetadata()->set('entityDefs', $entityForeign, $dataRight); + $this->getMetadata()->save(); + } + } + $this->getLanguage()->set($entity, 'fields', $link, $label); $this->getLanguage()->set($entity, 'links', $link, $label); $this->getLanguage()->set($entityForeign, 'fields', $linkForeign, $labelForeign); diff --git a/application/Espo/Resources/i18n/en_US/EntityManager.json b/application/Espo/Resources/i18n/en_US/EntityManager.json index 26201afb1a..75a3cfeec1 100644 --- a/application/Espo/Resources/i18n/en_US/EntityManager.json +++ b/application/Espo/Resources/i18n/en_US/EntityManager.json @@ -17,7 +17,9 @@ "labelForeign": "Foreign Label", "sortBy": "Default Order (field)", "sortDirection": "Default Order (direction)", - "relationName": "Middle Table Name" + "relationName": "Middle Table Name", + "linkMultipleField": "Link Multiple Field", + "linkMultipleFieldForeign": "Foreign Link Multiple Field" }, "options": { "type": { diff --git a/frontend/client/res/templates/admin/link-manager/modals/edit.tpl b/frontend/client/res/templates/admin/link-manager/modals/edit.tpl index e570c4fb03..58840cb3f3 100644 --- a/frontend/client/res/templates/admin/link-manager/modals/edit.tpl +++ b/frontend/client/res/templates/admin/link-manager/modals/edit.tpl @@ -51,4 +51,19 @@ +
+
+ +
+ {{{linkMultipleFieldForeign}}} +
+
+
+
+ +
+ {{{linkMultipleField}}} +
+
+
diff --git a/frontend/client/src/views/admin/link-manager/modals/edit.js b/frontend/client/src/views/admin/link-manager/modals/edit.js index 3fb3a7d7cf..331f9ae9e9 100644 --- a/frontend/client/src/views/admin/link-manager/modals/edit.js +++ b/frontend/client/src/views/admin/link-manager/modals/edit.js @@ -73,6 +73,8 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin this.model.set('entity', scope); + var isCustom = true; + if (!isNew) { var entityForeign = this.getMetadata().get('entityDefs.' + scope + '.links.' + link + '.entity'); var linkForeign = this.getMetadata().get('entityDefs.' + scope + '.links.' + link + '.foreign'); @@ -91,10 +93,28 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin this.model.set('label', label); this.model.set('labelForeign', labelForeign); + var linkMultipleField = false; + if (this.getMetadata().get('entityDefs.' + scope + '.fields.' + link + '.type') == 'linkMultiple') { + if (!this.getMetadata().get('entityDefs.' + scope + '.fields.' + link + '.noLoad')) { + linkMultipleField = true; + } + } + this.model.set('linkMultipleField', linkMultipleField); + + var linkMultipleFieldForeign = false; + if (this.getMetadata().get('entityDefs.' + entityForeign + '.fields.' + linkForeign + '.type') == 'linkMultiple') { + if (!this.getMetadata().get('entityDefs.' + entityForeign + '.fields.' + linkForeign + '.noLoad')) { + linkMultipleFieldForeign = true; + } + } + this.model.set('linkMultipleFieldForeign', linkMultipleFieldForeign); + if (linkType == 'manyToMany') { var relationName = this.getMetadata().get('entityDefs.' + entity + '.links.' + link + '.relationName'); this.model.set('relationName', relationName); } + + isCustom = this.getMetadata().get('entityDefs.' + entity + '.links.' + link + '.isCustom'); } @@ -110,7 +130,6 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin entityList.unshift(''); - this.createView('entity', 'views/fields/varchar', { model: model, mode: 'edit', @@ -210,6 +229,25 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin }); } + this.createView('linkMultipleField', 'views/fields/bool', { + model: model, + mode: 'edit', + el: this.options.el + ' .field-linkMultipleField', + defs: { + name: 'linkMultipleField' + }, + readOnly: !isCustom + }); + + this.createView('linkMultipleFieldForeign', 'views/fields/bool', { + model: model, + mode: 'edit', + el: this.options.el + ' .field-linkMultipleFieldForeign', + defs: { + name: 'linkMultipleFieldForeign' + }, + readOnly: !isCustom + }); }, toPlural: function (string) { @@ -295,20 +333,43 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin this.model.set(field, value); }, + hideField: function (name) { + var view = this.getView(name); + if (view) { + view.enabled = false; + } + this.$el.find('.cell-' + name).css('visibility', 'hidden'); + }, + + showField: function (name) { + var view = this.getView(name); + if (view) { + view.enabled = true; + } + this.$el.find('.cell-' + name).css('visibility', 'visible'); + }, + handleLinkTypeChange: function () { var linkType = this.model.get('linkType'); - if (linkType == 'manyToMany') { + if (linkType === 'manyToMany') { var relationNameView = this.getView('relationName'); - if (relationNameView) { - relationNameView.enabled = true; - } - this.$el.find('.cell-relationName').css('visibility', 'visible'); + this.showField('relationName'); + this.showField('relationName'); + + this.showField('linkMultipleField'); + this.showField('linkMultipleFieldForeign'); } else { - var relationNameView = this.getView('relationName'); - if (relationNameView) { - relationNameView.enabled = false; + this.hideField('relationName'); + if (linkType === 'oneToMany') { + this.showField('linkMultipleField'); + this.hideField('linkMultipleFieldForeign'); + } else if (linkType === 'manyToOne') { + this.hideField('linkMultipleField'); + this.showField('linkMultipleFieldForeign'); + } else { + this.hideField('linkMultipleField'); + this.hideField('linkMultipleFieldForeign'); } - this.$el.find('.cell-relationName').css('visibility', 'hidden'); } }, @@ -338,7 +399,10 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin 'label', 'labelForeign', 'linkType', - 'entityForeign' + 'entityForeign', + 'relationName', + 'linkMultipleField', + 'linkMultipleFieldForeign' ]; var notValid = false; @@ -351,8 +415,11 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin arr.forEach(function (item) { if (!this.hasView(item)) return; - if (this.getView(item).mode != 'edit') return; - notValid = this.getView(item).validate() || notValid; + var view = this.getView(item); + if (view.mode != 'edit') return; + if (view.enabled) { + notValid = view.validate() || notValid; + } }, this); if (notValid) { @@ -372,6 +439,10 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin var linkForeign = this.model.get('linkForeign'); var label = this.model.get('label'); var labelForeign = this.model.get('labelForeign'); + var relationName = this.model.get('relationName'); + + var linkMultipleField = this.model.get('linkMultipleField'); + var linkMultipleFieldForeign = this.model.get('linkMultipleFieldForeign'); $.ajax({ url: url, @@ -383,7 +454,10 @@ Espo.define('views/admin/link-manager/modals/edit', ['views/modal', 'views/admin linkForeign: linkForeign, label: label, labelForeign: labelForeign, - linkType: this.model.get('linkType') + linkType: this.model.get('linkType'), + relationName: relationName, + linkMultipleField: linkMultipleField, + linkMultipleFieldForeign: linkMultipleFieldForeign }), error: function (x) { if (x.status == 409) {