diff --git a/application/Espo/Core/Duplicate/Finder.php b/application/Espo/Core/Duplicate/Finder.php index 9de7d22ac7..28499a0a04 100644 --- a/application/Espo/Core/Duplicate/Finder.php +++ b/application/Espo/Core/Duplicate/Finder.php @@ -29,47 +29,30 @@ namespace Espo\Core\Duplicate; -use Espo\Core\{ - Select\SelectBuilderFactory, -}; +use Espo\Core\Exceptions\BadRequest; +use Espo\Core\Exceptions\Error; +use Espo\Core\Exceptions\Forbidden; +use Espo\Core\Select\SelectBuilderFactory; -use Espo\ORM\{ - EntityManager, - Entity, - Collection, - Query\Part\WhereItem, - Query\Part\Condition as Cond, -}; +use Espo\ORM\Collection; +use Espo\ORM\Entity; +use Espo\ORM\EntityManager; +use Espo\ORM\Query\Part\Condition as Cond; +use Espo\ORM\Query\Part\WhereItem; +use RuntimeException; class Finder { - protected const LIMIT = 10; + private const LIMIT = 10; - /** - * @var string[] - */ - protected $selectAttributeList = ['id', 'name']; - - private EntityManager $entityManager; - - private SelectBuilderFactory $selectBuilderFactory; - - private WhereBuilderFactory $whereBuilderFactory; - - /** - * @var array> - */ - private $whereBuilderMap = []; + /** @var array> */ + private array $whereBuilderMap = []; public function __construct( - EntityManager $entityManager, - SelectBuilderFactory $selectBuilderFactory, - WhereBuilderFactory $whereBuilderFactory - ) { - $this->entityManager = $entityManager; - $this->selectBuilderFactory = $selectBuilderFactory; - $this->whereBuilderFactory = $whereBuilderFactory; - } + private EntityManager $entityManager, + private SelectBuilderFactory $selectBuilderFactory, + private WhereBuilderFactory $whereBuilderFactory + ) {} /** * Check whether an entity has a duplicate. @@ -146,15 +129,20 @@ class Finder ); } - $query = $this->selectBuilderFactory - ->create() - ->from($entityType) - ->withStrictAccessControl() - ->buildQueryBuilder() - ->where($where) - ->select($this->getSelect($entity)) - ->limit(0, self::LIMIT) - ->build(); + try { + $query = $this->selectBuilderFactory + ->create() + ->from($entityType) + ->withStrictAccessControl() + ->buildQueryBuilder() + ->where($where) + ->select(['id']) + ->limit(0, self::LIMIT) + ->build(); + } + catch (Error|Forbidden|BadRequest $e) { + throw new RuntimeException($e->getMessage(), 0, $e); + } $builder = $this->entityManager ->getRDBRepository($entityType) @@ -164,23 +152,7 @@ class Finder return null; } - return $builder->find(); - } - - /** - * @return string[] - */ - private function getSelect(Entity $entity): array - { - $select = $this->selectAttributeList; - - foreach ($select as $item) { - if (!$entity->hasAttribute($item)) { - unset($select[$item]); - } - } - - return array_values($select); + return $builder->select(['*'])->find(); } private function getWhere(Entity $entity): ?WhereItem @@ -193,11 +165,7 @@ class Finder $builder = $this->whereBuilderMap[$entityType]; - if (!$builder) { - return null; - } - - return $builder->build($entity); + return $builder?->build($entity); } /** diff --git a/client/res/templates/modals/duplicate.tpl b/client/res/templates/modals/duplicate.tpl index ae99cee7f3..7a8563242c 100644 --- a/client/res/templates/modals/duplicate.tpl +++ b/client/res/templates/modals/duplicate.tpl @@ -1,8 +1,11 @@

{{translate 'duplicate' category="messages"}}

-
+{{#if scope}} +
{{{record}}}
+{{else}} +
- {{#each duplicates}} + {{#each duplicates}} - {{/each}} + {{/each}}
+ {{/if}}
diff --git a/client/src/views/modals/duplicate.js b/client/src/views/modals/duplicate.js index 6ca438b99e..640126a203 100644 --- a/client/src/views/modals/duplicate.js +++ b/client/src/views/modals/duplicate.js @@ -42,7 +42,7 @@ define('views/modals/duplicate', ['views/modal'], function (Dep) { }, setup: function () { - var saveLabel = 'Save'; + let saveLabel = 'Save'; if (this.model && this.model.isNew()) { saveLabel = 'Create'; @@ -53,10 +53,10 @@ define('views/modals/duplicate', ['views/modal'], function (Dep) { name: 'save', label: saveLabel, style: 'danger', - onClick: function (dialog) { + onClick: dialog => { this.trigger('save'); dialog.close(); - }.bind(this), + }, }, { name: 'cancel', @@ -65,7 +65,37 @@ define('views/modals/duplicate', ['views/modal'], function (Dep) { ]; this.scope = this.options.scope; this.duplicates = this.options.duplicates; + + if (this.scope) { + this.setupRecord(); + } }, + setupRecord: function () { + let promise = new Promise(resolve => { + this.getHelper().layoutManager.get(this.scope, 'listSmall', layout => { + layout = Espo.Utils.cloneDeep(layout); + layout.forEach(item => item.notSortable = true); + + this.getCollectionFactory().create(this.scope) + .then(collection => { + collection.add(this.duplicates); + + this.createView('record', 'views/record/list', { + selector: '.list-container', + collection: collection, + listLayout: layout, + buttonsDisabled: true, + massActionsDisabled: true, + rowActionsDisabled: true, + }); + + resolve(); + }); + }); + }) + + this.wait(promise); + }, }); });