Merge branch 'fix/3969-lw2m2m-resource-read-only' of github.com:maxunbearable/thingsboard into fix/3969-lw2m2m-resource-read-only

This commit is contained in:
Vladyslav_Prykhodko 2024-09-12 09:28:16 +03:00
commit c81d05e39d
3 changed files with 25 additions and 23 deletions

View File

@ -22,7 +22,7 @@ import {
EntityTableConfig EntityTableConfig
} from '@home/models/entity/entities-table-config.models'; } from '@home/models/entity/entities-table-config.models';
import { Resolve, Router } from '@angular/router'; import { Resolve, Router } from '@angular/router';
import { Resource, ResourceInfo, ResourceTypeTranslationMap } from '@shared/models/resource.models'; import { Resource, ResourceInfo, ResourceType, ResourceTypeTranslationMap } from '@shared/models/resource.models';
import { EntityType, entityTypeResources, entityTypeTranslations } from '@shared/models/entity-type.models'; import { EntityType, entityTypeResources, entityTypeTranslations } from '@shared/models/entity-type.models';
import { NULL_UUID } from '@shared/models/id/has-uuid'; import { NULL_UUID } from '@shared/models/id/has-uuid';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
@ -118,7 +118,7 @@ export class ResourcesLibraryTableConfigResolver implements Resolve<EntityTableC
const authUser = getCurrentAuthUser(this.store); const authUser = getCurrentAuthUser(this.store);
this.config.deleteEnabled = (resource) => this.isResourceEditable(resource, authUser.authority); this.config.deleteEnabled = (resource) => this.isResourceEditable(resource, authUser.authority);
this.config.entitySelectionEnabled = (resource) => this.isResourceEditable(resource, authUser.authority); this.config.entitySelectionEnabled = (resource) => this.isResourceEditable(resource, authUser.authority);
this.config.detailsReadonly = (resource) => !this.isResourceEditable(resource, authUser.authority); this.config.detailsReadonly = (resource) => !this.isResourceEditable(resource, authUser.authority, true);
return this.config; return this.config;
} }
@ -149,7 +149,10 @@ export class ResourcesLibraryTableConfigResolver implements Resolve<EntityTableC
return false; return false;
} }
private isResourceEditable(resource: ResourceInfo, authority: Authority): boolean { private isResourceEditable(resource: ResourceInfo, authority: Authority, isDetails = false): boolean {
if (isDetails && resource && resource.resourceType === ResourceType.LWM2M_MODEL) {
return false;
}
if (authority === Authority.TENANT_ADMIN) { if (authority === Authority.TENANT_ADMIN) {
return resource && resource.tenantId && resource.tenantId.id !== NULL_UUID; return resource && resource.tenantId && resource.tenantId.id !== NULL_UUID;
} else { } else {

View File

@ -58,7 +58,7 @@
</mat-form-field> </mat-form-field>
<mat-form-field class="mat-block" *ngIf="entityForm.get('resourceType').value !== resourceType.LWM2M_MODEL || !isAdd"> <mat-form-field class="mat-block" *ngIf="entityForm.get('resourceType').value !== resourceType.LWM2M_MODEL || !isAdd">
<mat-label translate>resource.title</mat-label> <mat-label translate>resource.title</mat-label>
<input matInput formControlName="title" required [readonly]="entityForm.get('resourceType').value === resourceType.LWM2M_MODEL"> <input matInput formControlName="title" required>
<mat-error *ngIf="entityForm.get('title').hasError('required')"> <mat-error *ngIf="entityForm.get('title').hasError('required')">
{{ 'resource.title-required' | translate }} {{ 'resource.title-required' | translate }}
</mat-error> </mat-error>

View File

@ -43,8 +43,7 @@ export class ResourcesLibraryComponent extends EntityComponent<Resource> impleme
readonly resourceType = ResourceType; readonly resourceType = ResourceType;
readonly resourceTypes: ResourceType[] = Object.values(this.resourceType); readonly resourceTypes: ResourceType[] = Object.values(this.resourceType);
readonly resourceTypesTranslationMap = ResourceTypeTranslationMap; readonly resourceTypesTranslationMap = ResourceTypeTranslationMap;
readonly maxResourceSize = getCurrentAuthState(this.store).maxResourceSize;
maxResourceSize = getCurrentAuthState(this.store).maxResourceSize;
private destroy$ = new Subject<void>(); private destroy$ = new Subject<void>();
@ -57,20 +56,20 @@ export class ResourcesLibraryComponent extends EntityComponent<Resource> impleme
super(store, fb, entityValue, entitiesTableConfigValue, cd); super(store, fb, entityValue, entitiesTableConfigValue, cd);
} }
ngOnInit() { ngOnInit(): void {
super.ngOnInit(); super.ngOnInit();
if (this.isAdd) { if (this.isAdd) {
this.observeResourceTypeChange(); this.observeResourceTypeChange();
} }
} }
ngOnDestroy() { ngOnDestroy(): void {
super.ngOnDestroy(); super.ngOnDestroy();
this.destroy$.next(); this.destroy$.next();
this.destroy$.complete(); this.destroy$.complete();
} }
hideDelete() { hideDelete(): boolean {
if (this.entitiesTableConfig) { if (this.entitiesTableConfig) {
return !this.entitiesTableConfig.deleteEnabled(this.entity); return !this.entitiesTableConfig.deleteEnabled(this.entity);
} else { } else {
@ -87,19 +86,19 @@ export class ResourcesLibraryComponent extends EntityComponent<Resource> impleme
}); });
} }
updateForm(entity: Resource) { updateForm(entity: Resource): void {
if (this.isEdit) { const { resourceType, fileName, title, data } = entity;
this.entityForm.get('resourceType').disable({emitEvent: false}); this.entityForm.patchValue({ resourceType, fileName, title, data });
if (entity.resourceType !== ResourceType.JS_MODULE) { }
this.entityForm.get('fileName').disable({emitEvent: false});
override updateFormState(): void {
super.updateFormState();
if (this.isEdit && this.entityForm) {
this.entityForm.get('resourceType').disable({ emitEvent: false });
if (this.entityForm.get('resourceType').value !== ResourceType.JS_MODULE) {
this.entityForm.get('fileName').disable({ emitEvent: false });
} }
} }
this.entityForm.patchValue({
resourceType: entity.resourceType,
fileName: entity.fileName,
title: entity.title,
data: entity.data
});
} }
prepareFormValue(formValue: Resource): Resource { prepareFormValue(formValue: Resource): Resource {
@ -109,7 +108,7 @@ export class ResourcesLibraryComponent extends EntityComponent<Resource> impleme
return super.prepareFormValue(formValue); return super.prepareFormValue(formValue);
} }
getAllowedExtensions() { getAllowedExtensions(): string {
try { try {
return ResourceTypeExtension.get(this.entityForm.get('resourceType').value); return ResourceTypeExtension.get(this.entityForm.get('resourceType').value);
} catch (e) { } catch (e) {
@ -117,7 +116,7 @@ export class ResourcesLibraryComponent extends EntityComponent<Resource> impleme
} }
} }
getAcceptType() { getAcceptType(): string {
try { try {
return ResourceTypeMIMETypes.get(this.entityForm.get('resourceType').value); return ResourceTypeMIMETypes.get(this.entityForm.get('resourceType').value);
} catch (e) { } catch (e) {
@ -129,7 +128,7 @@ export class ResourcesLibraryComponent extends EntityComponent<Resource> impleme
return window.btoa(data); return window.btoa(data);
} }
onResourceIdCopied() { onResourceIdCopied(): void {
this.store.dispatch(new ActionNotificationShow( this.store.dispatch(new ActionNotificationShow(
{ {
message: this.translate.instant('resource.idCopiedMessage'), message: this.translate.instant('resource.idCopiedMessage'),