UI: Add entity versions text search support. Minor improvements and fixes.
This commit is contained in:
parent
80456b9b7d
commit
65dc70c51b
@ -135,6 +135,8 @@ public class ControllerConstants {
|
|||||||
protected static final String EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Assignment works in async way - first, notification event pushed to edge service queue on platform. ";
|
protected static final String EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Assignment works in async way - first, notification event pushed to edge service queue on platform. ";
|
||||||
protected static final String EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform). ";
|
protected static final String EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform). ";
|
||||||
|
|
||||||
|
protected static final String ENTITY_VERSION_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'substring' filter based on the entity version name.";
|
||||||
|
|
||||||
protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n";
|
protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n";
|
||||||
protected static final String MARKDOWN_CODE_BLOCK_END = "\n```";
|
protected static final String MARKDOWN_CODE_BLOCK_END = "\n```";
|
||||||
protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START +
|
protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START +
|
||||||
|
|||||||
@ -53,7 +53,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static org.thingsboard.server.controller.ControllerConstants.*;
|
import static org.thingsboard.server.controller.ControllerConstants.NEW_LINE;
|
||||||
|
import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
|
||||||
|
import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
|
||||||
|
import static org.thingsboard.server.controller.ControllerConstants.ENTITY_VERSION_TEXT_SEARCH_DESCRIPTION;
|
||||||
|
import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
|
||||||
|
import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
|
||||||
import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
|
import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@ -131,13 +136,15 @@ public class EntitiesVersionControlController extends BaseController {
|
|||||||
@RequestParam int pageSize,
|
@RequestParam int pageSize,
|
||||||
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
|
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
|
||||||
@RequestParam int page,
|
@RequestParam int page,
|
||||||
|
@ApiParam(value = ENTITY_VERSION_TEXT_SEARCH_DESCRIPTION)
|
||||||
|
@RequestParam(required = false) String textSearch,
|
||||||
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
|
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
|
||||||
@RequestParam(required = false) String sortProperty,
|
@RequestParam(required = false) String sortProperty,
|
||||||
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
|
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
|
||||||
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
EntityId externalEntityId = EntityIdFactory.getByTypeAndUuid(entityType, externalEntityUuid);
|
EntityId externalEntityId = EntityIdFactory.getByTypeAndUuid(entityType, externalEntityUuid);
|
||||||
PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
|
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
||||||
return wrapFuture(versionControlService.listEntityVersions(getTenantId(), branch, externalEntityId, pageLink));
|
return wrapFuture(versionControlService.listEntityVersions(getTenantId(), branch, externalEntityId, pageLink));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw handleException(e);
|
throw handleException(e);
|
||||||
@ -158,12 +165,14 @@ public class EntitiesVersionControlController extends BaseController {
|
|||||||
@RequestParam int pageSize,
|
@RequestParam int pageSize,
|
||||||
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
|
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
|
||||||
@RequestParam int page,
|
@RequestParam int page,
|
||||||
|
@ApiParam(value = ENTITY_VERSION_TEXT_SEARCH_DESCRIPTION)
|
||||||
|
@RequestParam(required = false) String textSearch,
|
||||||
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
|
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
|
||||||
@RequestParam(required = false) String sortProperty,
|
@RequestParam(required = false) String sortProperty,
|
||||||
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
|
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
|
||||||
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
|
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
||||||
return wrapFuture(versionControlService.listEntityTypeVersions(getTenantId(), branch, entityType, pageLink));
|
return wrapFuture(versionControlService.listEntityTypeVersions(getTenantId(), branch, entityType, pageLink));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw handleException(e);
|
throw handleException(e);
|
||||||
@ -191,12 +200,14 @@ public class EntitiesVersionControlController extends BaseController {
|
|||||||
@RequestParam int pageSize,
|
@RequestParam int pageSize,
|
||||||
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
|
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
|
||||||
@RequestParam int page,
|
@RequestParam int page,
|
||||||
|
@ApiParam(value = ENTITY_VERSION_TEXT_SEARCH_DESCRIPTION)
|
||||||
|
@RequestParam(required = false) String textSearch,
|
||||||
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
|
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
|
||||||
@RequestParam(required = false) String sortProperty,
|
@RequestParam(required = false) String sortProperty,
|
||||||
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
|
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
|
||||||
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
|
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
||||||
return wrapFuture(versionControlService.listVersions(getTenantId(), branch, pageLink));
|
return wrapFuture(versionControlService.listVersions(getTenantId(), branch, pageLink));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw handleException(e);
|
throw handleException(e);
|
||||||
|
|||||||
@ -146,41 +146,54 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, PageLink pageLink) {
|
public ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, PageLink pageLink) {
|
||||||
return listVersions(tenantId, ListVersionsRequestMsg.newBuilder()
|
|
||||||
.setBranchName(branch)
|
return listVersions(tenantId,
|
||||||
.setPageSize(pageLink.getPageSize())
|
applyPageLinkParameters(
|
||||||
.setPage(pageLink.getPage())
|
ListVersionsRequestMsg.newBuilder()
|
||||||
.setSortProperty(pageLink.getSortOrder() != null ? pageLink.getSortOrder().getProperty() : null)
|
.setBranchName(branch),
|
||||||
.setSortDirection(pageLink.getSortOrder() != null && pageLink.getSortOrder().getDirection() != null
|
pageLink
|
||||||
? pageLink.getSortOrder().getDirection().name() : null)
|
).build());
|
||||||
.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, EntityType entityType, PageLink pageLink) {
|
public ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, EntityType entityType, PageLink pageLink) {
|
||||||
return listVersions(tenantId, ListVersionsRequestMsg.newBuilder()
|
return listVersions(tenantId,
|
||||||
.setBranchName(branch).setEntityType(entityType.name())
|
applyPageLinkParameters(
|
||||||
.setPageSize(pageLink.getPageSize())
|
ListVersionsRequestMsg.newBuilder()
|
||||||
.setPage(pageLink.getPage())
|
.setBranchName(branch)
|
||||||
.setSortProperty(pageLink.getSortOrder() != null ? pageLink.getSortOrder().getProperty() : null)
|
.setEntityType(entityType.name()),
|
||||||
.setSortDirection(pageLink.getSortOrder() != null && pageLink.getSortOrder().getDirection() != null
|
pageLink
|
||||||
? pageLink.getSortOrder().getDirection().name() : null)
|
).build());
|
||||||
.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, EntityId entityId, PageLink pageLink) {
|
public ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, EntityId entityId, PageLink pageLink) {
|
||||||
return listVersions(tenantId, ListVersionsRequestMsg.newBuilder()
|
return listVersions(tenantId,
|
||||||
.setBranchName(branch)
|
applyPageLinkParameters(
|
||||||
.setEntityType(entityId.getEntityType().name())
|
ListVersionsRequestMsg.newBuilder()
|
||||||
.setEntityIdMSB(entityId.getId().getMostSignificantBits())
|
.setBranchName(branch)
|
||||||
.setEntityIdLSB(entityId.getId().getLeastSignificantBits())
|
.setEntityType(entityId.getEntityType().name())
|
||||||
.setPageSize(pageLink.getPageSize())
|
.setEntityIdMSB(entityId.getId().getMostSignificantBits())
|
||||||
.setPage(pageLink.getPage())
|
.setEntityIdLSB(entityId.getId().getLeastSignificantBits()),
|
||||||
.setSortProperty(pageLink.getSortOrder() != null ? pageLink.getSortOrder().getProperty() : null)
|
pageLink
|
||||||
.setSortDirection(pageLink.getSortOrder() != null && pageLink.getSortOrder().getDirection() != null
|
).build());
|
||||||
? pageLink.getSortOrder().getDirection().name() : null)
|
}
|
||||||
.build());
|
|
||||||
|
private ListVersionsRequestMsg.Builder applyPageLinkParameters(ListVersionsRequestMsg.Builder builder, PageLink pageLink) {
|
||||||
|
builder.setPageSize(pageLink.getPageSize())
|
||||||
|
.setPage(pageLink.getPage());
|
||||||
|
if (pageLink.getTextSearch() != null) {
|
||||||
|
builder.setTextSearch(pageLink.getTextSearch());
|
||||||
|
}
|
||||||
|
if (pageLink.getSortOrder() != null) {
|
||||||
|
if (pageLink.getSortOrder().getProperty() != null) {
|
||||||
|
builder.setSortProperty(pageLink.getSortOrder().getProperty());
|
||||||
|
}
|
||||||
|
if (pageLink.getSortOrder().getDirection() != null) {
|
||||||
|
builder.setSortDirection(pageLink.getSortOrder().getDirection().name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, ListVersionsRequestMsg requestMsg) {
|
private ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, ListVersionsRequestMsg requestMsg) {
|
||||||
|
|||||||
@ -54,7 +54,7 @@ public class DefaultTbVersionControlSettingsService implements TbVersionControlS
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntitiesVersionControlSettings get(TenantId tenantId) {
|
public EntitiesVersionControlSettings get(TenantId tenantId) {
|
||||||
return cache.getAndPutInTransaction(tenantId, () -> {
|
EntitiesVersionControlSettings settings = cache.getAndPutInTransaction(tenantId, () -> {
|
||||||
AdminSettings adminSettings = adminSettingsService.findAdminSettingsByKey(tenantId, SETTINGS_KEY);
|
AdminSettings adminSettings = adminSettingsService.findAdminSettingsByKey(tenantId, SETTINGS_KEY);
|
||||||
if (adminSettings != null) {
|
if (adminSettings != null) {
|
||||||
try {
|
try {
|
||||||
@ -65,6 +65,10 @@ public class DefaultTbVersionControlSettingsService implements TbVersionControlS
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}, true);
|
}, true);
|
||||||
|
if (settings != null) {
|
||||||
|
settings = new EntitiesVersionControlSettings(settings);
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -724,8 +724,9 @@ message ListVersionsRequestMsg {
|
|||||||
int64 entityIdLSB = 4;
|
int64 entityIdLSB = 4;
|
||||||
int32 pageSize = 5;
|
int32 pageSize = 5;
|
||||||
int32 page = 6;
|
int32 page = 6;
|
||||||
string sortProperty = 7;
|
string textSearch = 7;
|
||||||
string sortDirection = 8;
|
string sortProperty = 8;
|
||||||
|
string sortDirection = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
message EntityVersionProto {
|
message EntityVersionProto {
|
||||||
|
|||||||
@ -31,4 +31,17 @@ public class EntitiesVersionControlSettings implements Serializable {
|
|||||||
private String privateKey;
|
private String privateKey;
|
||||||
private String privateKeyPassword;
|
private String privateKeyPassword;
|
||||||
private String defaultBranch;
|
private String defaultBranch;
|
||||||
|
|
||||||
|
public EntitiesVersionControlSettings() {}
|
||||||
|
|
||||||
|
public EntitiesVersionControlSettings(EntitiesVersionControlSettings settings) {
|
||||||
|
this.repositoryUri = settings.getRepositoryUri();
|
||||||
|
this.authMethod = settings.getAuthMethod();
|
||||||
|
this.username = settings.getUsername();
|
||||||
|
this.password = settings.getPassword();
|
||||||
|
this.privateKeyFileName = settings.getPrivateKeyFileName();
|
||||||
|
this.privateKey = settings.getPrivateKey();
|
||||||
|
this.privateKeyPassword = settings.getPrivateKeyPassword();
|
||||||
|
this.defaultBranch = settings.getDefaultBranch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -300,7 +300,8 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe
|
|||||||
}
|
}
|
||||||
sortOrder = new SortOrder(request.getSortProperty(), direction);
|
sortOrder = new SortOrder(request.getSortProperty(), direction);
|
||||||
}
|
}
|
||||||
var data = vcService.listVersions(ctx.getTenantId(), request.getBranchName(), path, new PageLink(request.getPageSize(), request.getPage(), null, sortOrder));
|
var data = vcService.listVersions(ctx.getTenantId(), request.getBranchName(), path,
|
||||||
|
new PageLink(request.getPageSize(), request.getPage(), request.getTextSearch(), sortOrder));
|
||||||
reply(ctx, Optional.empty(), builder ->
|
reply(ctx, Optional.empty(), builder ->
|
||||||
builder.setListVersionsResponse(ListVersionsResponseMsg.newBuilder()
|
builder.setListVersionsResponse(ListVersionsResponseMsg.newBuilder()
|
||||||
.setTotalPages(data.getTotalPages())
|
.setTotalPages(data.getTotalPages())
|
||||||
|
|||||||
@ -36,6 +36,7 @@ import org.eclipse.jgit.lib.ObjectId;
|
|||||||
import org.eclipse.jgit.lib.ObjectLoader;
|
import org.eclipse.jgit.lib.ObjectLoader;
|
||||||
import org.eclipse.jgit.lib.ObjectReader;
|
import org.eclipse.jgit.lib.ObjectReader;
|
||||||
import org.eclipse.jgit.revwalk.RevCommit;
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
import org.eclipse.jgit.revwalk.RevWalk;
|
||||||
import org.eclipse.jgit.revwalk.filter.RevFilter;
|
import org.eclipse.jgit.revwalk.filter.RevFilter;
|
||||||
import org.eclipse.jgit.transport.CredentialsProvider;
|
import org.eclipse.jgit.transport.CredentialsProvider;
|
||||||
import org.eclipse.jgit.transport.RefSpec;
|
import org.eclipse.jgit.transport.RefSpec;
|
||||||
@ -173,11 +174,18 @@ public class GitRepository {
|
|||||||
return new PageData<>();
|
return new PageData<>();
|
||||||
}
|
}
|
||||||
LogCommand command = git.log()
|
LogCommand command = git.log()
|
||||||
.add(branchId)
|
.add(branchId);
|
||||||
.setRevFilter(RevFilter.NO_MERGES);
|
|
||||||
|
if (StringUtils.isNotEmpty(pageLink.getTextSearch())) {
|
||||||
|
command.setRevFilter(new NoMergesAndCommitMessageFilter(pageLink.getTextSearch()));
|
||||||
|
} else {
|
||||||
|
command.setRevFilter(RevFilter.NO_MERGES);
|
||||||
|
}
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(path)) {
|
if (StringUtils.isNotEmpty(path)) {
|
||||||
command.addPath(path);
|
command.addPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
Iterable<RevCommit> commits = execute(command);
|
Iterable<RevCommit> commits = execute(command);
|
||||||
return iterableToPageData(commits, this::toCommit, pageLink, revCommitComparatorFunction);
|
return iterableToPageData(commits, this::toCommit, pageLink, revCommitComparatorFunction);
|
||||||
}
|
}
|
||||||
@ -391,6 +399,35 @@ public class GitRepository {
|
|||||||
return keyPairs;
|
return keyPairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class NoMergesAndCommitMessageFilter extends RevFilter {
|
||||||
|
|
||||||
|
private final String textSearch;
|
||||||
|
|
||||||
|
NoMergesAndCommitMessageFilter(String textSearch) {
|
||||||
|
this.textSearch = textSearch.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean include(RevWalk walker, RevCommit c) {
|
||||||
|
return c.getParentCount() < 2 && c.getFullMessage().toLowerCase().contains(this.textSearch);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RevFilter clone() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean requiresCommitBody() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "NO_MERGES_AND_COMMIT_MESSAGE";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class Commit {
|
public static class Commit {
|
||||||
private final long timestamp;
|
private final long timestamp;
|
||||||
|
|||||||
@ -285,6 +285,7 @@ export class AttributeTableComponent extends PageComponent implements AfterViewI
|
|||||||
this.attributeScopeSelectionReadonly = true;
|
this.attributeScopeSelectionReadonly = true;
|
||||||
}
|
}
|
||||||
this.mode = 'default';
|
this.mode = 'default';
|
||||||
|
this.textSearchMode = false;
|
||||||
this.selectedWidgetsBundleAlias = null;
|
this.selectedWidgetsBundleAlias = null;
|
||||||
this.attributeScope = this.defaultAttributeScope;
|
this.attributeScope = this.defaultAttributeScope;
|
||||||
this.pageLink.textSearch = null;
|
this.pageLink.textSearch = null;
|
||||||
|
|||||||
@ -547,6 +547,7 @@ export class EntitiesTableComponent extends PageComponent implements IEntitiesTa
|
|||||||
}
|
}
|
||||||
|
|
||||||
resetSortAndFilter(update: boolean = true, preserveTimewindow: boolean = false) {
|
resetSortAndFilter(update: boolean = true, preserveTimewindow: boolean = false) {
|
||||||
|
this.textSearchMode = false;
|
||||||
this.pageLink.textSearch = null;
|
this.pageLink.textSearch = null;
|
||||||
if (this.entitiesTableConfig.useTimePageLink && !preserveTimewindow) {
|
if (this.entitiesTableConfig.useTimePageLink && !preserveTimewindow) {
|
||||||
this.timewindow = this.entitiesTableConfig.defaultTimewindowInterval;
|
this.timewindow = this.entitiesTableConfig.defaultTimewindowInterval;
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
-->
|
-->
|
||||||
<div class="mat-padding tb-entity-table tb-absolute-fill">
|
<div class="mat-padding tb-entity-table tb-absolute-fill">
|
||||||
<div fxFlex fxLayout="column" class="mat-elevation-z1 tb-entity-table-content">
|
<div fxFlex fxLayout="column" class="mat-elevation-z1 tb-entity-table-content">
|
||||||
<mat-toolbar class="mat-table-toolbar">
|
<mat-toolbar class="mat-table-toolbar" [fxShow]="!textSearchMode">
|
||||||
<div class="mat-toolbar-tools">
|
<div class="mat-toolbar-tools">
|
||||||
<div fxLayout="row" fxLayoutAlign="start center" fxLayout.xs="column" fxLayoutAlign.xs="center start" class="title-container">
|
<div fxLayout="row" fxLayoutAlign="start center" fxLayout.xs="column" fxLayoutAlign.xs="center start" class="title-container">
|
||||||
<span class="tb-entity-table-title">{{(singleEntityMode ? 'version-control.entity-versions' : 'version-control.versions') | translate}}</span>
|
<span class="tb-entity-table-title">{{(singleEntityMode ? 'version-control.entity-versions' : 'version-control.versions') | translate}}</span>
|
||||||
@ -38,6 +38,33 @@
|
|||||||
<mat-icon>update</mat-icon>
|
<mat-icon>update</mat-icon>
|
||||||
{{'version-control.create-version' | translate }}
|
{{'version-control.create-version' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
<button mat-icon-button
|
||||||
|
[disabled]="isLoading$ | async"
|
||||||
|
(click)="enterFilterMode()"
|
||||||
|
matTooltip="{{ 'action.search' | translate }}"
|
||||||
|
matTooltipPosition="above">
|
||||||
|
<mat-icon>search</mat-icon>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</mat-toolbar>
|
||||||
|
<mat-toolbar class="mat-table-toolbar" [fxShow]="textSearchMode">
|
||||||
|
<div class="mat-toolbar-tools">
|
||||||
|
<button mat-icon-button
|
||||||
|
matTooltip="{{ 'action.search' | translate }}"
|
||||||
|
matTooltipPosition="above">
|
||||||
|
<mat-icon>search</mat-icon>
|
||||||
|
</button>
|
||||||
|
<mat-form-field fxFlex>
|
||||||
|
<mat-label> </mat-label>
|
||||||
|
<input #searchInput matInput
|
||||||
|
[(ngModel)]="pageLink.textSearch"
|
||||||
|
placeholder="{{ 'common.enter-search' | translate }}"/>
|
||||||
|
</mat-form-field>
|
||||||
|
<button mat-icon-button (click)="exitFilterMode()"
|
||||||
|
matTooltip="{{ 'action.close' | translate }}"
|
||||||
|
matTooltipPosition="above">
|
||||||
|
<mat-icon>close</mat-icon>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-toolbar>
|
</mat-toolbar>
|
||||||
<div fxFlex class="table-container">
|
<div fxFlex class="table-container">
|
||||||
|
|||||||
@ -29,10 +29,10 @@ import { Store } from '@ngrx/store';
|
|||||||
import { AppState } from '@core/core.state';
|
import { AppState } from '@core/core.state';
|
||||||
import { EntityId } from '@shared/models/id/entity-id';
|
import { EntityId } from '@shared/models/id/entity-id';
|
||||||
import { CollectionViewer, DataSource } from '@angular/cdk/collections';
|
import { CollectionViewer, DataSource } from '@angular/cdk/collections';
|
||||||
import { BehaviorSubject, merge, Observable, of, ReplaySubject } from 'rxjs';
|
import { BehaviorSubject, fromEvent, merge, Observable, of, ReplaySubject } from 'rxjs';
|
||||||
import { emptyPageData, PageData } from '@shared/models/page/page-data';
|
import { emptyPageData, PageData } from '@shared/models/page/page-data';
|
||||||
import { PageLink } from '@shared/models/page/page-link';
|
import { PageLink } from '@shared/models/page/page-link';
|
||||||
import { catchError, map, tap } from 'rxjs/operators';
|
import { catchError, debounceTime, distinctUntilChanged, map, tap } from 'rxjs/operators';
|
||||||
import { EntityVersion, VersionCreationResult } from '@shared/models/vc.models';
|
import { EntityVersion, VersionCreationResult } from '@shared/models/vc.models';
|
||||||
import { EntitiesVersionControlService } from '@core/http/entities-version-control.service';
|
import { EntitiesVersionControlService } from '@core/http/entities-version-control.service';
|
||||||
import { MatPaginator } from '@angular/material/paginator';
|
import { MatPaginator } from '@angular/material/paginator';
|
||||||
@ -61,6 +61,7 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
|
|||||||
|
|
||||||
displayedColumns = ['timestamp', 'id', 'name'];
|
displayedColumns = ['timestamp', 'id', 'name'];
|
||||||
pageLink: PageLink;
|
pageLink: PageLink;
|
||||||
|
textSearchMode = false;
|
||||||
dataSource: EntityVersionsDatasource;
|
dataSource: EntityVersionsDatasource;
|
||||||
hidePageSize = false;
|
hidePageSize = false;
|
||||||
|
|
||||||
@ -103,6 +104,8 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
|
|||||||
@Input()
|
@Input()
|
||||||
entityId: EntityId;
|
entityId: EntityId;
|
||||||
|
|
||||||
|
@ViewChild('searchInput') searchInputField: ElementRef;
|
||||||
|
|
||||||
@ViewChild(MatPaginator) paginator: MatPaginator;
|
@ViewChild(MatPaginator) paginator: MatPaginator;
|
||||||
@ViewChild(MatSort) sort: MatSort;
|
@ViewChild(MatSort) sort: MatSort;
|
||||||
|
|
||||||
@ -148,6 +151,17 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
|
fromEvent(this.searchInputField.nativeElement, 'keyup')
|
||||||
|
.pipe(
|
||||||
|
debounceTime(400),
|
||||||
|
distinctUntilChanged(),
|
||||||
|
tap(() => {
|
||||||
|
this.paginator.pageIndex = 0;
|
||||||
|
this.updateData();
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.subscribe();
|
||||||
|
|
||||||
this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
|
this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
|
||||||
merge(this.sort.sortChange, this.paginator.page)
|
merge(this.sort.sortChange, this.paginator.page)
|
||||||
.pipe(
|
.pipe(
|
||||||
@ -155,7 +169,7 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
|
|||||||
)
|
)
|
||||||
.subscribe();
|
.subscribe();
|
||||||
this.viewsInited = true;
|
this.viewsInited = true;
|
||||||
if (!this.singleEntityMode) {
|
if (!this.singleEntityMode || (this.activeValue && this.externalEntityIdValue)) {
|
||||||
this.initFromDefaultBranch();
|
this.initFromDefaultBranch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -200,6 +214,22 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
|
|||||||
return versionId;
|
return versionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enterFilterMode() {
|
||||||
|
this.textSearchMode = true;
|
||||||
|
this.pageLink.textSearch = '';
|
||||||
|
setTimeout(() => {
|
||||||
|
this.searchInputField.nativeElement.focus();
|
||||||
|
this.searchInputField.nativeElement.setSelectionRange(0, 0);
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
exitFilterMode() {
|
||||||
|
this.textSearchMode = false;
|
||||||
|
this.pageLink.textSearch = null;
|
||||||
|
this.paginator.pageIndex = 0;
|
||||||
|
this.updateData();
|
||||||
|
}
|
||||||
|
|
||||||
private initFromDefaultBranch() {
|
private initFromDefaultBranch() {
|
||||||
if (this.branchAutocompleteComponent.isDefaultBranchSelected()) {
|
if (this.branchAutocompleteComponent.isDefaultBranchSelected()) {
|
||||||
this.paginator.pageIndex = 0;
|
this.paginator.pageIndex = 0;
|
||||||
@ -220,6 +250,7 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
|
|||||||
}
|
}
|
||||||
|
|
||||||
private resetSortAndFilter(update: boolean) {
|
private resetSortAndFilter(update: boolean) {
|
||||||
|
this.textSearchMode = false;
|
||||||
this.pageLink.textSearch = null;
|
this.pageLink.textSearch = null;
|
||||||
if (this.viewsInited) {
|
if (this.viewsInited) {
|
||||||
this.paginator.pageIndex = 0;
|
this.paginator.pageIndex = 0;
|
||||||
|
|||||||
@ -33,7 +33,7 @@ import { DialogService } from '@core/services/dialog.service';
|
|||||||
import { ActionSettingsChangeLanguage } from '@core/settings/settings.actions';
|
import { ActionSettingsChangeLanguage } from '@core/settings/settings.actions';
|
||||||
import { ActionAuthUpdateHasVersionControl } from '@core/auth/auth.actions';
|
import { ActionAuthUpdateHasVersionControl } from '@core/auth/auth.actions';
|
||||||
import { selectHasVersionControl } from '@core/auth/auth.selectors';
|
import { selectHasVersionControl } from '@core/auth/auth.selectors';
|
||||||
import { catchError, mergeMap } from 'rxjs/operators';
|
import { catchError, mergeMap, take } from 'rxjs/operators';
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -87,6 +87,7 @@ export class VersionControlSettingsComponent extends PageComponent implements On
|
|||||||
});
|
});
|
||||||
this.store.pipe(
|
this.store.pipe(
|
||||||
select(selectHasVersionControl),
|
select(selectHasVersionControl),
|
||||||
|
take(1),
|
||||||
mergeMap((hasVersionControl) => {
|
mergeMap((hasVersionControl) => {
|
||||||
if (hasVersionControl) {
|
if (hasVersionControl) {
|
||||||
return this.adminService.getEntitiesVersionControlSettings({ignoreErrors: true}).pipe(
|
return this.adminService.getEntitiesVersionControlSettings({ignoreErrors: true}).pipe(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user