duplicates use list view
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user