From cd86c62b94f4a5dee140bac50e3878c592bfcf10 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Fri, 27 Mar 2020 18:56:07 +0000 Subject: [PATCH] Relation Manager Customisation Improvements (#4444) This change allows for easy customisation of the relation manager titles and toolbar buttons. For buttons - define your custom strings directly in the standard `toolbarButtons` syntax... ``` toolbarButtons: create: acme.blog::lang.subcategory.CreateButtonText delete: # omit the string to fall back to the default button text ``` ...and the old syntax still works... ``` toolbarButtons: create|delete ``` For titles - define different strings for each mode (form, list or pivot)... ``` title: form: acme.blog::lang.subcategory.FormTitle list: acme.blog::lang.subcategory.ListTitle ``` This feature provides developer convenience, for example in this situation where I have a relation manager that is used to assign user permissions to a project: Before ![Screenshot 2019-07-10 at 09 28 22](https://user-images.githubusercontent.com/41773797/60953626-6bc0de80-a2f5-11e9-8001-04e816ad6967.png) After ![Screenshot 2019-07-10 at 09 32 51](https://user-images.githubusercontent.com/41773797/60953773-b9d5e200-a2f5-11e9-93a9-69238ea696aa.png) This PR contains no breaking changes. --- .../backend/behaviors/RelationController.php | 117 +++++++++++++----- .../partials/_button_add.htm | 2 +- .../partials/_button_create.htm | 2 +- .../partials/_button_delete.htm | 6 +- .../partials/_button_link.htm | 2 +- .../partials/_button_remove.htm | 6 +- .../partials/_button_unlink.htm | 2 +- .../partials/_button_update.htm | 2 +- .../relationcontroller/partials/_toolbar.htm | 11 +- 9 files changed, 103 insertions(+), 47 deletions(-) diff --git a/modules/backend/behaviors/RelationController.php b/modules/backend/behaviors/RelationController.php index 20b55decc..25d6d3dc2 100644 --- a/modules/backend/behaviors/RelationController.php +++ b/modules/backend/behaviors/RelationController.php @@ -1477,39 +1477,79 @@ class RelationController extends ControllerBehavior /** * Determine the default buttons based on the model relationship type. - * @return string + * @return array|null */ protected function evalToolbarButtons() { $buttons = $this->getConfig('view[toolbarButtons]'); - if ($buttons === false) { - return null; - } - elseif (is_string($buttons)) { - return array_map('trim', explode('|', $buttons)); - } - elseif (is_array($buttons)) { - return $buttons; + if (!is_array($buttons)) { + if ($buttons === false) { + return null; + } elseif (is_string($buttons)) { + $buttons = array_map('trim', explode('|', $buttons)); + } elseif ($this->manageMode === 'pivot') { + $buttons = ['add', 'remove']; + } else { + switch ($this->relationType) { + case 'hasMany': + case 'morphMany': + case 'morphToMany': + case 'morphedByMany': + case 'belongsToMany': + return ['create', 'add', 'delete', 'remove']; + + case 'hasOne': + case 'morphOne': + case 'belongsTo': + return ['create', 'update', 'link', 'delete', 'unlink']; + } + } } - if ($this->manageMode == 'pivot') { - return ['add', 'remove']; + $buttonText = []; + + foreach ($buttons as $type => $text) { + if (is_numeric($type) || !$text) { + if (is_numeric($type) && $text) { + $type = $text; + } + + switch ($type) { + case 'create': + $text = 'backend::lang.relation.create_name'; + break; + + case 'update': + $text = 'backend::lang.relation.update_name'; + break; + + case 'delete': + $text = 'backend::lang.relation.delete'; + break; + + case 'add': + $text = 'backend::lang.relation.add_name'; + break; + + case 'remove': + $text = 'backend::lang.relation.remove'; + break; + + case 'link': + $text = 'backend::lang.relation.link_name'; + break; + + case 'unlink': + $text = 'backend::lang.relation.unlink'; + break; + } + } + + $buttonText[$type] = $text; } - switch ($this->relationType) { - case 'hasMany': - case 'morphMany': - case 'morphToMany': - case 'morphedByMany': - case 'belongsToMany': - return ['create', 'add', 'delete', 'remove']; - - case 'hasOne': - case 'morphOne': - case 'belongsTo': - return ['create', 'update', 'link', 'delete', 'unlink']; - } + return $buttonText; } /** @@ -1543,28 +1583,41 @@ class RelationController extends ControllerBehavior */ protected function evalManageTitle() { - if ($customTitle = $this->getConfig('manage[title]')) { + $customTitle = $this->getConfig('manage[title]'); + + if (is_string($customTitle)) { return $customTitle; } + $customTitles = is_array($customTitle) ? $customTitle : []; + switch ($this->manageMode) { case 'pivot': + if (array_key_exists('pivot', $customTitles)) { + return $customTitles['pivot']; + } elseif ($this->eventTarget === 'button-link') { + return 'backend::lang.relation.link_a_new'; + } + + return 'backend::lang.relation.add_a_new'; case 'list': - if ($this->eventTarget == 'button-link') { + if (array_key_exists('list', $customTitles)) { + return $customTitles['list']; + } elseif ($this->eventTarget === 'button-link') { return 'backend::lang.relation.link_a_new'; } return 'backend::lang.relation.add_a_new'; case 'form': - if ($this->readOnly) { + if (array_key_exists('form', $customTitles)) { + return $customTitles['form']; + } elseif ($this->readOnly) { return 'backend::lang.relation.preview_name'; - } - elseif ($this->manageId) { + } elseif ($this->manageId) { return 'backend::lang.relation.update_name'; } - else { - return 'backend::lang.relation.create_name'; - } + + return 'backend::lang.relation.create_name'; } } diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_add.htm b/modules/backend/behaviors/relationcontroller/partials/_button_add.htm index 68e80a401..6939b3bc3 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_add.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_add.htm @@ -4,5 +4,5 @@ data-handler="onRelationButtonAdd" href="javascript:;" class="btn btn-sm btn-secondary oc-icon-plus"> - trans($relationLabel)])) ?> + trans($relationLabel)])) ?> diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_create.htm b/modules/backend/behaviors/relationcontroller/partials/_button_create.htm index aa9b9ee19..d7d3569df 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_create.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_create.htm @@ -4,5 +4,5 @@ data-handler="onRelationButtonCreate" href="javascript:;" class="btn btn-sm btn-secondary oc-icon-file"> - trans($relationLabel)])) ?> + trans($relationLabel)])) ?> diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_delete.htm b/modules/backend/behaviors/relationcontroller/partials/_button_delete.htm index 5e1e76268..d8fd4ff6b 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_delete.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_delete.htm @@ -5,7 +5,7 @@ data-request-confirm="" data-request-success="$.oc.relationBehavior.changed('vars['relationField']) ?>', 'deleted')" data-stripe-load-indicator> - + - \ No newline at end of file + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_link.htm b/modules/backend/behaviors/relationcontroller/partials/_button_link.htm index ff765a7d6..b4ad47073 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_link.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_link.htm @@ -4,5 +4,5 @@ data-handler="onRelationButtonLink" href="javascript:;" class="btn btn-sm btn-secondary oc-icon-link"> - trans($relationLabel)])) ?> + trans($relationLabel)])) ?> diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_remove.htm b/modules/backend/behaviors/relationcontroller/partials/_button_remove.htm index b4f647641..c288bdec6 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_remove.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_remove.htm @@ -4,7 +4,7 @@ data-request="onRelationButtonRemove" data-request-success="$.oc.relationBehavior.changed('vars['relationField']) ?>', 'removed')" data-stripe-load-indicator> - + - \ No newline at end of file + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_unlink.htm b/modules/backend/behaviors/relationcontroller/partials/_button_unlink.htm index cfbec72fb..30851eea6 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_unlink.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_unlink.htm @@ -5,5 +5,5 @@ data-request-success="$.oc.relationBehavior.changed('vars['relationField']) ?>', 'removed')" data-request-confirm="" data-stripe-load-indicator> - + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_update.htm b/modules/backend/behaviors/relationcontroller/partials/_button_update.htm index f1cf08a48..3f267e4c9 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_button_update.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_button_update.htm @@ -5,5 +5,5 @@ data-request-data="manage_id: ''" href="javascript:;" class="btn btn-sm btn-secondary oc-icon-pencil"> - trans($relationLabel)])) ?> + trans($relationLabel)])) ?> diff --git a/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm b/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm index 3b23bd498..d7f85f55e 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm @@ -1,13 +1,16 @@
- + $text): ?> - + relationMakePartial('button_update', [ - 'relationManageId' => $relationViewModel->getKey() + 'relationManageId' => $relationViewModel->getKey(), + 'text' => $text ]) ?> - relationMakePartial('button_'.$button) ?> + relationMakePartial('button_' . $type, [ + 'text' => $text + ]) ?>