starred in list

This commit is contained in:
Yuri Kuznetsov
2024-09-12 12:45:47 +03:00
parent 210cf03bcd
commit ab581a4fae
7 changed files with 104 additions and 10 deletions
@@ -0,0 +1,39 @@
<?php
/**LICENSE**/
namespace Espo\Core\Select\Applier\AdditionalAppliers;
use Espo\Core\Select\Applier\AdditionalApplier;
use Espo\Core\Select\SearchParams;
use Espo\Core\Utils\Metadata;
use Espo\Entities\StarSubscription;
use Espo\Entities\User;
use Espo\ORM\Query\Part\Expression as Expr;
use Espo\ORM\Query\SelectBuilder;
/**
* @noinspection PhpUnused
*/
class IsStarred implements AdditionalApplier
{
public function __construct(
private string $entityType,
private User $user,
private Metadata $metadata,
) {}
public function apply(SelectBuilder $queryBuilder, SearchParams $searchParams): void
{
if (!$this->metadata->get("scopes.$this->entityType.stars")) {
return;
}
$queryBuilder
->select(Expr::isNotNull(Expr::column('starSubscription.id')), 'isStarred')
->leftJoin(StarSubscription::ENTITY_TYPE, 'starSubscription', [
'userId' => $this->user->getId(),
'entityType' => $this->entityType,
'entityId:' => 'id',
]);
}
}
@@ -0,0 +1,5 @@
{
"selectApplierClassNameList": [
"Espo\\Core\\Select\\Applier\\AdditionalAppliers\\IsStarred"
]
}
@@ -51,10 +51,11 @@
<div class="list list-expanded">
<ul class="list-group">
{{#each rowList}}
<li data-id="{{./this}}" class="list-group-item list-row">
{{{var this ../this}}}
</li>
{{#each rowDataList}}
<li
data-id="{{id}}"
class="list-group-item list-row"
>{{{var id ../this}}}</li>
{{/each}}
</ul>
+5 -4
View File
@@ -211,10 +211,11 @@
</thead>
{{/if}}
<tbody>
{{#each rowList}}
<tr data-id="{{./this}}" class="list-row">
{{{var this ../this}}}
</tr>
{{#each rowDataList}}
<tr
data-id="{{id}}"
class="list-row{{#if isStarred}} starred{{/if}}"
>{{{var id ../this}}}</tr>
{{/each}}
</tbody>
</table>
+1 -1
View File
@@ -84,7 +84,7 @@ class ListTreeRecordView extends ListRecordView {
data.showRootMenu = false;
}
data.noData = data.createDisabled && !data.rowList.length && !data.showRoot;
data.noData = data.createDisabled && !data.rowDataList.length && !data.showRoot;
return data;
}
+23 -1
View File
@@ -1000,6 +1000,16 @@ class ListRecordView extends View {
const noDataDisabled = this.noDataDisabled || this._renderEmpty;
const rowDataList = this.rowList ?
this.rowList.map(id => {
return {
id: id,
isStarred: this.hasStars && this.collection.get(id) ?
this.collection.get(id).attributes.isStarred :
false,
};
}) : [];
return {
scope: this.scope,
collectionLength: this.collection.models.length,
@@ -1013,7 +1023,8 @@ class ListRecordView extends View {
moreCount: moreCount,
checkboxes: this.checkboxes,
massActionDataList: this.getMassActionDataList(),
rowList: this.rowList,
rowList: this.rowList, // For bc.
rowDataList: rowDataList,
topBar: topBar,
checkAllResultDisabled: checkAllResultDisabled,
buttonList: this.buttonList,
@@ -2019,6 +2030,12 @@ class ListRecordView extends View {
this.checkboxes = false;
}
/**
* @private
* @type {boolean}
*/
this.hasStars = this.getMetadata().get(`scopes.${this.entityType}.stars`) || false;
if (
this.getUser().isPortal() &&
!this.portalLayoutDisabled &&
@@ -2951,6 +2968,11 @@ class ListRecordView extends View {
buildRows(callback) {
this.checkedList = [];
/**
* @internal
* @type {string[]}
* @private
*/
this.rowList = [];
if (this.collection.length <= 0) {
+26
View File
@@ -1247,6 +1247,32 @@ section {
}
}
.list > {
table > tbody {
> tr.list-row.starred {
td {
//background-color: var(--warning-bg);
}
.cell[data-name="name"] {
&:has(> a.link) {
&::before {
font-family: 'Font Awesome 5 Free';
font-weight: 900;
content: "\f005";
font-size: 10px;
padding-right: 4px;
top: 3px;
position: relative;
color: var(--state-warning-text);
float: left;
}
}
}
}
}
}
.panel.dashlet > .panel-body > .list-container > .list > .list-group {
> li.list-group-item:last-child {
border-bottom-width: 1px;