duplicates use list view

This commit is contained in:
Yuri Kuznetsov
2023-05-02 14:34:56 +03:00
parent 0c6ddb725b
commit 6ec70d7792
3 changed files with 73 additions and 71 deletions
+33 -65
View File
@@ -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<string,?WhereBuilder<Entity>>
*/
private $whereBuilderMap = [];
/** @var array<string, ?WhereBuilder<Entity>> */
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);
}
/**
+7 -3
View File
@@ -1,8 +1,11 @@
<h4>{{translate 'duplicate' category="messages"}}</h4>
<div style="margin-top: 20px;">
{{#if scope}}
<div class="list-container margin-top-2x">{{{record}}}</div>
{{else}}
<div class="margin-top-2x">
<table class="table table-panel">
{{#each duplicates}}
{{#each duplicates}}
<tr>
<td>
<a
@@ -12,6 +15,7 @@
{{#if _entityType}}({{translate _entityType category='scopeNames'}}){{/if}}
</td>
</tr>
{{/each}}
{{/each}}
</table>
{{/if}}
</div>
+33 -3
View File
@@ -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);
},
});
});