add inactive filter and plan description ui changes
This commit is contained in:
parent
3bbe71d218
commit
e97de92b3a
|
@ -108,8 +108,7 @@ public class QueryUtilsServiceImpl implements QueryUtilsService {
|
||||||
.keyPathFunc((subQueryRoot) -> subQueryRoot.get(PlanUserEntity._planId))
|
.keyPathFunc((subQueryRoot) -> subQueryRoot.get(PlanUserEntity._planId))
|
||||||
.filterFunc((subQueryRoot, cb) ->
|
.filterFunc((subQueryRoot, cb) ->
|
||||||
userId != null ? cb.and(
|
userId != null ? cb.and(
|
||||||
cb.equal(subQueryRoot.get(PlanUserEntity._userId), userId),
|
cb.equal(subQueryRoot.get(PlanUserEntity._userId), userId)
|
||||||
cb.equal(subQueryRoot.get(PlanUserEntity._isActive), IsActive.Active)
|
|
||||||
) : cb.or() //Creates a false query
|
) : cb.or() //Creates a false query
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
|
|
|
@ -1298,6 +1298,7 @@ public class PlanServiceImpl implements PlanService {
|
||||||
PlanEntity data = this.entityManager.find(PlanEntity.class, model.getPlanId(), true);
|
PlanEntity data = this.entityManager.find(PlanEntity.class, model.getPlanId(), true);
|
||||||
if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Plan.class.getSimpleName()}, LocaleContextHolder.getLocale()));
|
if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Plan.class.getSimpleName()}, LocaleContextHolder.getLocale()));
|
||||||
|
|
||||||
|
if (data.getIsActive().equals(IsActive.Inactive)) throw new MyApplicationException("Plan is not Active");
|
||||||
List<PlanUserEntity> existingUsers = this.queryFactory.query(PlanUserQuery.class)
|
List<PlanUserEntity> existingUsers = this.queryFactory.query(PlanUserQuery.class)
|
||||||
.planIds(model.getPlanId()).ids(model.getId()).userRoles(model.getRole())
|
.planIds(model.getPlanId()).ids(model.getId()).userRoles(model.getRole())
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -1668,7 +1669,7 @@ public class PlanServiceImpl implements PlanService {
|
||||||
} else if (currentStatusEntity != null && currentStatusEntity.getInternalStatus()!= null && !currentStatusEntity.getInternalStatus().equals(DescriptionStatus.Finalized)) {
|
} else if (currentStatusEntity != null && currentStatusEntity.getInternalStatus()!= null && !currentStatusEntity.getInternalStatus().equals(DescriptionStatus.Finalized)) {
|
||||||
// description to be canceled
|
// description to be canceled
|
||||||
description.setStatusId(canceledStatusEntity.getId());
|
description.setStatusId(canceledStatusEntity.getId());
|
||||||
this.deleterFactory.deleter(DescriptionDeleter.class).delete(List.of(description), true);
|
this.deleterFactory.deleter(DescriptionDeleter.class).delete(List.of(description), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -276,11 +276,15 @@ export class PlanService {
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
getCurrentUserRolesInPlan(planUsers: PlanUser[]): PlanUserRole[] {
|
getCurrentUserRolesInPlan(planUsers: PlanUser[], isDeletedPlan: boolean = false): PlanUserRole[] {
|
||||||
const principalId: Guid = this.authService.userId();
|
const principalId: Guid = this.authService.userId();
|
||||||
let planUserRoles: PlanUserRole[] = null;
|
let planUserRoles: PlanUserRole[] = null;
|
||||||
if (principalId) {
|
if (principalId) {
|
||||||
planUserRoles = planUsers.filter(element => element.isActive == IsActive.Active && element?.user?.id === principalId).map(x => x.role);
|
if (isDeletedPlan) {
|
||||||
|
planUserRoles = planUsers.filter(element => element?.user?.id === principalId).map(x => x.role);
|
||||||
|
} else {
|
||||||
|
planUserRoles = planUsers.filter(element => element.isActive == IsActive.Active && element?.user?.id === principalId).map(x => x.role);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return planUserRoles;
|
return planUserRoles;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<div class="row h-100">
|
<div *ngIf="!isDeleted" class="row h-100">
|
||||||
|
|
||||||
<div class="col-auto d-flex align-items-center">
|
<div class="col-auto d-flex align-items-center">
|
||||||
<button *ngIf="formGroup.get('id').value && canExport" [disabled]="isDirty()" [matTooltipDisabled]="!isDirty()" mat-button class="rounded-btn neutral" type="button" [matMenuTriggerFor]="exportMenu" (click)="$event.stopPropagation();" [matTooltip]="'DESCRIPTION-EDITOR.ACTIONS.EXPORT.CAN-NOT-EXPORT' | translate">
|
<button *ngIf="formGroup.get('id').value && canExport" [disabled]="isDirty()" [matTooltipDisabled]="!isDirty()" mat-button class="rounded-btn neutral" type="button" [matMenuTriggerFor]="exportMenu" (click)="$event.stopPropagation();" [matTooltip]="'DESCRIPTION-EDITOR.ACTIONS.EXPORT.CAN-NOT-EXPORT' | translate">
|
||||||
|
|
|
@ -100,7 +100,7 @@ export class DescriptionListingComponent extends BaseListingComponent<BaseDescri
|
||||||
return (this.lookup.like != null && this.lookup.like != '') || this.lookup.statusIds != null ||
|
return (this.lookup.like != null && this.lookup.like != '') || this.lookup.statusIds != null ||
|
||||||
this.lookup.planSubQuery != null || this.lookup.descriptionTemplateSubQuery != null ||
|
this.lookup.planSubQuery != null || this.lookup.descriptionTemplateSubQuery != null ||
|
||||||
this.lookup.descriptionTagSubQuery != null || this.lookup.descriptionReferenceSubQuery != null ||
|
this.lookup.descriptionTagSubQuery != null || this.lookup.descriptionReferenceSubQuery != null ||
|
||||||
this.lookup.tenantSubQuery != null;
|
this.lookup.tenantSubQuery != null || this.lookup.isActive != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
@ -416,6 +416,7 @@ export class DescriptionListingComponent extends BaseListingComponent<BaseDescri
|
||||||
|
|
||||||
_patchLookupFromFilters(filters: DescriptionListingFilters): DescriptionLookup {
|
_patchLookupFromFilters(filters: DescriptionListingFilters): DescriptionLookup {
|
||||||
this.lookup.statusIds = filters?.statusId != null ? [filters?.statusId] : null;
|
this.lookup.statusIds = filters?.statusId != null ? [filters?.statusId] : null;
|
||||||
|
this.lookup.isActive = filters?.isActive ? [IsActive.Active] : [IsActive.Inactive];
|
||||||
|
|
||||||
// Tenants
|
// Tenants
|
||||||
let viewOnlyTenant = filters?.viewOnlyTenant ?? false;
|
let viewOnlyTenant = filters?.viewOnlyTenant ?? false;
|
||||||
|
@ -475,6 +476,7 @@ export class DescriptionListingComponent extends BaseListingComponent<BaseDescri
|
||||||
let count = 0;
|
let count = 0;
|
||||||
|
|
||||||
if (lookup.statusIds) count += lookup.statusIds.length;
|
if (lookup.statusIds) count += lookup.statusIds.length;
|
||||||
|
if (lookup.isActive[0] == IsActive.Inactive) count += lookup.isActive.length;
|
||||||
if (lookup.tenantSubQuery) count += 1;
|
if (lookup.tenantSubQuery) count += 1;
|
||||||
if (lookup.descriptionTemplateSubQuery) count += lookup.descriptionTemplateSubQuery.ids?.length;
|
if (lookup.descriptionTemplateSubQuery) count += lookup.descriptionTemplateSubQuery.ids?.length;
|
||||||
if (lookup.descriptionTagSubQuery) count += lookup.descriptionTagSubQuery.tagIds?.length;
|
if (lookup.descriptionTagSubQuery) count += lookup.descriptionTagSubQuery.tagIds?.length;
|
||||||
|
@ -492,6 +494,7 @@ export class DescriptionListingComponent extends BaseListingComponent<BaseDescri
|
||||||
nameof<Description>(x => x.id),
|
nameof<Description>(x => x.id),
|
||||||
nameof<Description>(x => x.tenantId),
|
nameof<Description>(x => x.tenantId),
|
||||||
nameof<Description>(x => x.label),
|
nameof<Description>(x => x.label),
|
||||||
|
nameof<Description>(x => x.isActive),
|
||||||
[nameof<Description>(x => x.status), nameof<DescriptionStatus>(x => x.id)].join('.'),
|
[nameof<Description>(x => x.status), nameof<DescriptionStatus>(x => x.id)].join('.'),
|
||||||
[nameof<Description>(x => x.status), nameof<DescriptionStatus>(x => x.name)].join('.'),
|
[nameof<Description>(x => x.status), nameof<DescriptionStatus>(x => x.name)].join('.'),
|
||||||
[nameof<Description>(x => x.status), nameof<DescriptionStatus>(x => x.internalStatus)].join('.'),
|
[nameof<Description>(x => x.status), nameof<DescriptionStatus>(x => x.internalStatus)].join('.'),
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||||
import { AnalyticsService } from '@app/core/services/matomo/analytics-service';
|
import { AnalyticsService } from '@app/core/services/matomo/analytics-service';
|
||||||
import { DescriptionFilterComponent, DescriptionListingFilters } from '../description-filter.component';
|
import { DescriptionFilterComponent, DescriptionListingFilters } from '../description-filter.component';
|
||||||
import { DescriptionLookup, ReferencesWithType } from '@app/core/query/description.lookup';
|
import { DescriptionLookup, ReferencesWithType } from '@app/core/query/description.lookup';
|
||||||
|
import { IsActive } from '@app/core/common/enum/is-active.enum';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'description-filter-dialog-component',
|
selector: 'description-filter-dialog-component',
|
||||||
|
@ -48,6 +49,7 @@ export class DescriptionFilterDialogComponent implements OnInit {
|
||||||
private _buildDescriptionFilters(lookup: DescriptionLookup, references: ReferencesWithType[]): DescriptionListingFilters {
|
private _buildDescriptionFilters(lookup: DescriptionLookup, references: ReferencesWithType[]): DescriptionListingFilters {
|
||||||
return {
|
return {
|
||||||
statusId: lookup.statusIds?.[0] ?? null,
|
statusId: lookup.statusIds?.[0] ?? null,
|
||||||
|
isActive: lookup.isActive?.[0] == IsActive.Active ?? false,
|
||||||
viewOnlyTenant: lookup.tenantSubQuery?.codes?.length > 0,
|
viewOnlyTenant: lookup.tenantSubQuery?.codes?.length > 0,
|
||||||
role: lookup.planSubQuery?.planUserSubQuery?.userRoles?.[0] ?? null,
|
role: lookup.planSubQuery?.planUserSubQuery?.userRoles?.[0] ?? null,
|
||||||
descriptionTemplates: lookup.descriptionTemplateSubQuery?.ids ?? [],
|
descriptionTemplates: lookup.descriptionTemplateSubQuery?.ids ?? [],
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
</div>
|
</div>
|
||||||
<!-- End of Status Filter-->
|
<!-- End of Status Filter-->
|
||||||
|
|
||||||
|
<!-- IsActive Filter -->
|
||||||
|
<div class="col-10">
|
||||||
|
<mat-slide-toggle [formControl]="formGroup.get('isActive')">{{ 'DESCRIPTION-LISTING.FILTERS.IS-ACTIVE' | translate }}</mat-slide-toggle>
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Tenant Filter -->
|
<!-- Tenant Filter -->
|
||||||
<div *ngIf="!isPublic && hasSelectedTenant" class="col-10">
|
<div *ngIf="!isPublic && hasSelectedTenant" class="col-10">
|
||||||
<h6 class="category-title">{{ 'DESCRIPTION-LISTING.FILTERS.RELATED-TENANT.NAME' | translate}}</h6>
|
<h6 class="category-title">{{ 'DESCRIPTION-LISTING.FILTERS.RELATED-TENANT.NAME' | translate}}</h6>
|
||||||
|
|
|
@ -81,6 +81,7 @@ export class DescriptionFilterComponent extends BaseCriteriaComponent<Descriptio
|
||||||
buildForm(filters: DescriptionListingFilters) {
|
buildForm(filters: DescriptionListingFilters) {
|
||||||
this.formGroup = new FormGroup<DescriptionListingFilterForm>({
|
this.formGroup = new FormGroup<DescriptionListingFilterForm>({
|
||||||
statusId: new FormControl(filters?.statusId),
|
statusId: new FormControl(filters?.statusId),
|
||||||
|
isActive: new FormControl(filters?.isActive),
|
||||||
viewOnlyTenant: new FormControl(filters.viewOnlyTenant),
|
viewOnlyTenant: new FormControl(filters.viewOnlyTenant),
|
||||||
role: new FormControl(filters.role),
|
role: new FormControl(filters.role),
|
||||||
descriptionTemplates: new FormControl(filters.descriptionTemplates),
|
descriptionTemplates: new FormControl(filters.descriptionTemplates),
|
||||||
|
@ -114,6 +115,7 @@ export class DescriptionFilterComponent extends BaseCriteriaComponent<Descriptio
|
||||||
this.formGroup.reset();
|
this.formGroup.reset();
|
||||||
this.formGroup.patchValue({
|
this.formGroup.patchValue({
|
||||||
statusId: null,
|
statusId: null,
|
||||||
|
isActive: true,
|
||||||
viewOnlyTenant: null,
|
viewOnlyTenant: null,
|
||||||
role: null,
|
role: null,
|
||||||
descriptionTemplates: null,
|
descriptionTemplates: null,
|
||||||
|
@ -213,6 +215,7 @@ export class DescriptionFilterComponent extends BaseCriteriaComponent<Descriptio
|
||||||
|
|
||||||
export interface DescriptionListingFilters {
|
export interface DescriptionListingFilters {
|
||||||
statusId: Guid,
|
statusId: Guid,
|
||||||
|
isActive: boolean,
|
||||||
viewOnlyTenant: boolean,
|
viewOnlyTenant: boolean,
|
||||||
role: Guid,
|
role: Guid,
|
||||||
descriptionTemplates: Guid[],
|
descriptionTemplates: Guid[],
|
||||||
|
@ -223,6 +226,7 @@ export interface DescriptionListingFilters {
|
||||||
|
|
||||||
interface DescriptionListingFilterForm {
|
interface DescriptionListingFilterForm {
|
||||||
statusId: FormControl<Guid>,
|
statusId: FormControl<Guid>,
|
||||||
|
isActive: FormControl<boolean>,
|
||||||
viewOnlyTenant: FormControl<boolean>,
|
viewOnlyTenant: FormControl<boolean>,
|
||||||
role: FormControl<Guid>,
|
role: FormControl<Guid>,
|
||||||
descriptionTemplates: FormControl<Guid[]>,
|
descriptionTemplates: FormControl<Guid[]>,
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<div *ngIf="description.status?.internalStatus === descriptionStatusEnum.Canceled" class="col-auto description-title-draft">{{description.label}}</div>
|
<div *ngIf="description.status?.internalStatus === descriptionStatusEnum.Canceled" class="col-auto description-title-draft">{{description.label}}</div>
|
||||||
<div *ngIf="description.status?.internalStatus === null" class="col-auto description-title-draft">{{description.label}}</div>
|
<div *ngIf="description.status?.internalStatus === null" class="col-auto description-title-draft">{{description.label}}</div>
|
||||||
<div class="description-subtitle">
|
<div class="description-subtitle">
|
||||||
<span *ngIf="isUserPlanRelated()" class="col-auto">{{ enumUtils.toPlanUserRolesString(planService.getCurrentUserRolesInPlan(description?.plan?.planUsers)) }}</span>
|
<span *ngIf="isUserPlanRelated()" class="col-auto">{{ enumUtils.toPlanUserRolesString(planService.getCurrentUserRolesInPlan(description?.plan?.planUsers, isDeleted)) }}</span>
|
||||||
<span *ngIf="isUserPlanRelated()">.</span>
|
<span *ngIf="isUserPlanRelated()">.</span>
|
||||||
<span class="col-auto" *ngIf="description.status?.internalStatus === descriptionStatusEnum.Finalized && description.plan.accessType === planAccessTypeEnum.Public"><span class="material-icons icon-align">public</span>{{'DESCRIPTION-LISTING.STATES.PUBLIC' | translate}}</span>
|
<span class="col-auto" *ngIf="description.status?.internalStatus === descriptionStatusEnum.Finalized && description.plan.accessType === planAccessTypeEnum.Public"><span class="material-icons icon-align">public</span>{{'DESCRIPTION-LISTING.STATES.PUBLIC' | translate}}</span>
|
||||||
<span *ngIf="description.status?.internalStatus === descriptionStatusEnum.Finalized && description.plan.accessType != planAccessTypeEnum.Public; else draft" class="col-auto"><span class="material-icons icon-align">done</span>{{ description.status.name }}</span>
|
<span *ngIf="description.status?.internalStatus === descriptionStatusEnum.Finalized && description.plan.accessType != planAccessTypeEnum.Public; else draft" class="col-auto"><span class="material-icons icon-align">done</span>{{ description.status.name }}</span>
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
<div class="description-card-actions">
|
<div class="description-card-actions">
|
||||||
<a class="col-auto border-right pointer" *ngIf="canExport && fileTransformerService.availableFormatsFor(fileTransformerEntityTypeEnum.Description) && fileTransformerService.availableFormatsFor(fileTransformerEntityTypeEnum.Description).length > 0" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DESCRIPTION-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
<a class="col-auto border-right pointer" *ngIf="canExport && fileTransformerService.availableFormatsFor(fileTransformerEntityTypeEnum.Description) && fileTransformerService.availableFormatsFor(fileTransformerEntityTypeEnum.Description).length > 0" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DESCRIPTION-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
||||||
<a class="col-auto border-right pointer" *ngIf="canInvitePlanUsers" (click)="openShareDialog()"><span class="material-icons icon-align pr-2">group_add</span>{{'DESCRIPTION-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
<a class="col-auto border-right pointer" *ngIf="canInvitePlanUsers" (click)="openShareDialog()"><span class="material-icons icon-align pr-2">group_add</span>{{'DESCRIPTION-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="copyToPlan(description)"><span class="material-icons icon-align pr-2">file_copy</span>{{'DESCRIPTION-LISTING.ACTIONS.COPY-DESCRIPTION' | translate}}</a>
|
<a class="col-auto border-right pointer" *ngIf="isAuthenticated() && !isDeleted" (click)="copyToPlan(description)"><span class="material-icons icon-align pr-2">file_copy</span>{{'DESCRIPTION-LISTING.ACTIONS.COPY-DESCRIPTION' | translate}}</a>
|
||||||
<a class="col-auto border-right pointer" *ngIf="canDelete" (click)="deleteClicked(description.id)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DESCRIPTION-LISTING.ACTIONS.DELETE' | translate }}</a>
|
<a class="col-auto border-right pointer" *ngIf="canDelete" (click)="deleteClicked(description.id)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DESCRIPTION-LISTING.ACTIONS.DELETE' | translate }}</a>
|
||||||
</div>
|
</div>
|
||||||
<mat-menu #actionsMenu="matMenu">
|
<mat-menu #actionsMenu="matMenu">
|
||||||
|
|
|
@ -93,15 +93,15 @@ export class DescriptionListingItemComponent extends BaseComponent implements On
|
||||||
}
|
}
|
||||||
|
|
||||||
this.canDelete = !this.isPublic && (this.authService.hasPermission(AppPermission.DeleteDescription) ||
|
this.canDelete = !this.isPublic && (this.authService.hasPermission(AppPermission.DeleteDescription) ||
|
||||||
this.description.authorizationFlags?.some(x => x === AppPermission.DeleteDescription)) && this.description.belongsToCurrentTenant != false;
|
this.description.authorizationFlags?.some(x => x === AppPermission.DeleteDescription)) && !this.isDeleted &&this.description.belongsToCurrentTenant != false;
|
||||||
|
|
||||||
this.canEdit = !this.isPublic && (this.authService.hasPermission(AppPermission.EditDescription) ||
|
this.canEdit = !this.isPublic && (this.authService.hasPermission(AppPermission.EditDescription) ||
|
||||||
this.description.authorizationFlags?.some(x => x === AppPermission.EditDescription)) && this.description.belongsToCurrentTenant != false;
|
this.description.authorizationFlags?.some(x => x === AppPermission.EditDescription)) && this.description.belongsToCurrentTenant != false;
|
||||||
|
|
||||||
this.canInvitePlanUsers = !this.isPublic && (this.authService.hasPermission(AppPermission.InvitePlanUsers) ||
|
this.canInvitePlanUsers = !this.isPublic && (this.authService.hasPermission(AppPermission.InvitePlanUsers) ||
|
||||||
this.description.authorizationFlags?.some(x => x === AppPermission.InvitePlanUsers)) && this.description.belongsToCurrentTenant != false;
|
this.description.authorizationFlags?.some(x => x === AppPermission.InvitePlanUsers)) && !this.isDeleted && this.description.belongsToCurrentTenant != false;
|
||||||
|
|
||||||
this.canExport = this.description.authorizationFlags?.some(x => x === AppPermission.ExportDescription) || this.authentication.hasPermission(AppPermission.ExportDescription) &&
|
this.canExport = this.description.authorizationFlags?.some(x => x === AppPermission.ExportDescription) || this.authentication.hasPermission(AppPermission.ExportDescription) && !this.isDeleted &&
|
||||||
this.description.status?.definition?.availableActions?.filter(x => x === DescriptionStatusAvailableActionType.Export).length > 0;
|
this.description.status?.definition?.availableActions?.filter(x => x === DescriptionStatusAvailableActionType.Export).length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ export class DescriptionListingItemComponent extends BaseComponent implements On
|
||||||
|
|
||||||
isUserPlanRelated() {
|
isUserPlanRelated() {
|
||||||
const principalId: Guid = this.authService.userId();
|
const principalId: Guid = this.authService.userId();
|
||||||
return this.description.plan.planUsers?.some(x => (x.user.id === principalId));
|
return this.description.plan?.planUsers?.some(x => (x.user.id === principalId));
|
||||||
}
|
}
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
public isAuthenticated(): boolean {
|
||||||
|
|
|
@ -130,7 +130,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-lg-4">
|
<div class="col-12 col-lg-4">
|
||||||
<ng-container *ngIf="isAuthenticated()">
|
<ng-container *ngIf="isAuthenticated() && isActive">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="frame mb-3 pt-4 pl-4 pr-5 pb-3">
|
<div class="frame mb-3 pt-4 pl-4 pr-5 pb-3">
|
||||||
|
|
|
@ -78,10 +78,10 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni
|
||||||
canAnnotate = false;
|
canAnnotate = false;
|
||||||
canInvitePlanUsers = false;
|
canInvitePlanUsers = false;
|
||||||
availableStatusesTransitions: DescriptionStatus[];
|
availableStatusesTransitions: DescriptionStatus[];
|
||||||
canAssignPlanUsers(): boolean {
|
get canAssignPlanUsers(): boolean {
|
||||||
const authorizationFlags = !this.isPublicView ? (this.description?.plan as Plan)?.authorizationFlags : [];
|
const authorizationFlags = !this.isPublicView ? (this.description?.plan as Plan)?.authorizationFlags : [];
|
||||||
return (authorizationFlags?.some(x => x === AppPermission.AssignPlanUsers) || this.authentication.hasPermission(AppPermission.AssignPlanUsers)) &&
|
return (authorizationFlags?.some(x => x === AppPermission.InvitePlanUsers) || this.authentication.hasPermission(AppPermission.InvitePlanUsers)) &&
|
||||||
!this.isPublicView && this.description?.belongsToCurrentTenant && this.description?.plan?.status?.internalStatus != PlanStatusEnum.Finalized;
|
!this.isPublicView && this.description?.belongsToCurrentTenant && this.isActive && (this.description?.plan?.status?.internalStatus == null || this.description?.plan?.status?.internalStatus != PlanStatusEnum.Finalized);
|
||||||
}
|
}
|
||||||
|
|
||||||
authorFocus: string;
|
authorFocus: string;
|
||||||
|
@ -142,7 +142,7 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni
|
||||||
|
|
||||||
this.description = data;
|
this.description = data;
|
||||||
this.getAvailableStatuses(this.description.id);
|
this.getAvailableStatuses(this.description.id);
|
||||||
this.description.plan.planUsers = this.isActive ? data.plan.planUsers.filter(x => x.isActive === IsActive.Active) : data.plan.planUsers;
|
this.description.plan.planUsers = this.isActive || this.description.plan.isActive === IsActive.Active ? data.plan.planUsers.filter(x => x.isActive === IsActive.Active) : data.plan.planUsers;
|
||||||
this.researchers = this.referenceService.getReferencesForTypes(this.description?.plan?.planReferences, [this.referenceTypeService.getResearcherReferenceType()]);
|
this.researchers = this.referenceService.getReferencesForTypes(this.description?.plan?.planReferences, [this.referenceTypeService.getResearcherReferenceType()]);
|
||||||
this.checkLockStatus(this.description.id);
|
this.checkLockStatus(this.description.id);
|
||||||
this.canDelete = this.isActive && (this.authService.hasPermission(AppPermission.DeleteDescription) ||
|
this.canDelete = this.isActive && (this.authService.hasPermission(AppPermission.DeleteDescription) ||
|
||||||
|
@ -587,6 +587,7 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni
|
||||||
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.id)].join('.'),
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.id)].join('.'),
|
||||||
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.label)].join('.'),
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.label)].join('.'),
|
||||||
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.accessType)].join('.'),
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.accessType)].join('.'),
|
||||||
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.isActive)].join('.'),
|
||||||
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.id)].join('.'),
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.id)].join('.'),
|
||||||
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.name)].join('.'),
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.name)].join('.'),
|
||||||
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.internalStatus)].join('.'),
|
[nameof<Description>(x => x.plan), nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.internalStatus)].join('.'),
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { AnalyticsService } from '@app/core/services/matomo/analytics-service';
|
||||||
import { PlanFilterComponent, PlanListingFilters } from '../plan-filter.component';
|
import { PlanFilterComponent, PlanListingFilters } from '../plan-filter.component';
|
||||||
import { ReferencesWithType } from '@app/core/query/description.lookup';
|
import { ReferencesWithType } from '@app/core/query/description.lookup';
|
||||||
import { PlanLookup } from '@app/core/query/plan.lookup';
|
import { PlanLookup } from '@app/core/query/plan.lookup';
|
||||||
|
import { IsActive } from '@notification-service/core/enum/is-active.enum';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'plan-filter-dialog-component',
|
selector: 'plan-filter-dialog-component',
|
||||||
|
@ -36,6 +37,7 @@ export class PlanFilterDialogComponent implements OnInit {
|
||||||
private _buildPlanFilters(lookup: PlanLookup, references: ReferencesWithType[]): PlanListingFilters {
|
private _buildPlanFilters(lookup: PlanLookup, references: ReferencesWithType[]): PlanListingFilters {
|
||||||
return {
|
return {
|
||||||
statusId: lookup.statusIds?.[0] ?? null,
|
statusId: lookup.statusIds?.[0] ?? null,
|
||||||
|
isActive: lookup.isActive?.[0] == IsActive.Active ?? false,
|
||||||
viewOnlyTenant: lookup.tenantSubQuery?.codes?.length > 0,
|
viewOnlyTenant: lookup.tenantSubQuery?.codes?.length > 0,
|
||||||
descriptionTemplates: lookup.planDescriptionTemplateSubQuery?.descriptionTemplateGroupIds ? lookup.planDescriptionTemplateSubQuery?.descriptionTemplateGroupIds : [],
|
descriptionTemplates: lookup.planDescriptionTemplateSubQuery?.descriptionTemplateGroupIds ? lookup.planDescriptionTemplateSubQuery?.descriptionTemplateGroupIds : [],
|
||||||
planBlueprints: lookup.planBlueprintSubQuery?.ids ?? [],
|
planBlueprints: lookup.planBlueprintSubQuery?.ids ?? [],
|
||||||
|
|
|
@ -17,6 +17,12 @@
|
||||||
</div>
|
</div>
|
||||||
<!-- End of Visibility Filter-->
|
<!-- End of Visibility Filter-->
|
||||||
|
|
||||||
|
<!-- IsActive Filter -->
|
||||||
|
<div class="col-10">
|
||||||
|
<mat-slide-toggle [formControl]="formGroup.get('isActive')">{{ 'PLAN-LISTING.FILTERS.IS-ACTIVE' | translate }}</mat-slide-toggle>
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Tenant Filter -->
|
<!-- Tenant Filter -->
|
||||||
<div *ngIf="!isPublic && hasSelectedTenant" class="col-10">
|
<div *ngIf="!isPublic && hasSelectedTenant" class="col-10">
|
||||||
<h6 class="category-title">{{ 'PLAN-LISTING.FILTERS.RELATED-TENANT.NAME' | translate}}</h6>
|
<h6 class="category-title">{{ 'PLAN-LISTING.FILTERS.RELATED-TENANT.NAME' | translate}}</h6>
|
||||||
|
|
|
@ -79,6 +79,7 @@ export class PlanFilterComponent extends BaseCriteriaComponent<PlanListingFilter
|
||||||
buildForm(filters: PlanListingFilters){
|
buildForm(filters: PlanListingFilters){
|
||||||
this.formGroup = new FormGroup<PlanListingFilterForm>({
|
this.formGroup = new FormGroup<PlanListingFilterForm>({
|
||||||
statusId: new FormControl(filters?.statusId),
|
statusId: new FormControl(filters?.statusId),
|
||||||
|
isActive: new FormControl(filters?.isActive),
|
||||||
descriptionTemplates: new FormControl(filters?.descriptionTemplates),
|
descriptionTemplates: new FormControl(filters?.descriptionTemplates),
|
||||||
planBlueprints: new FormControl(filters?.planBlueprints),
|
planBlueprints: new FormControl(filters?.planBlueprints),
|
||||||
role: new FormControl(filters?.role),
|
role: new FormControl(filters?.role),
|
||||||
|
@ -110,6 +111,7 @@ export class PlanFilterComponent extends BaseCriteriaComponent<PlanListingFilter
|
||||||
this.formGroup.reset();
|
this.formGroup.reset();
|
||||||
this.formGroup.patchValue({
|
this.formGroup.patchValue({
|
||||||
descriptionTemplates: null,
|
descriptionTemplates: null,
|
||||||
|
isActive: true,
|
||||||
planBlueprints: null,
|
planBlueprints: null,
|
||||||
references: null,
|
references: null,
|
||||||
role: null,
|
role: null,
|
||||||
|
@ -212,6 +214,7 @@ export class PlanFilterComponent extends BaseCriteriaComponent<PlanListingFilter
|
||||||
|
|
||||||
export interface PlanListingFilters {
|
export interface PlanListingFilters {
|
||||||
statusId: Guid,
|
statusId: Guid,
|
||||||
|
isActive: boolean,
|
||||||
viewOnlyTenant: boolean,
|
viewOnlyTenant: boolean,
|
||||||
descriptionTemplates: Guid[],
|
descriptionTemplates: Guid[],
|
||||||
planBlueprints: Guid[],
|
planBlueprints: Guid[],
|
||||||
|
@ -221,6 +224,7 @@ export interface PlanListingFilters {
|
||||||
|
|
||||||
interface PlanListingFilterForm {
|
interface PlanListingFilterForm {
|
||||||
statusId: FormControl<Guid>,
|
statusId: FormControl<Guid>,
|
||||||
|
isActive: FormControl<boolean>,
|
||||||
viewOnlyTenant: FormControl<boolean>,
|
viewOnlyTenant: FormControl<boolean>,
|
||||||
descriptionTemplates: FormControl<Guid[]>,
|
descriptionTemplates: FormControl<Guid[]>,
|
||||||
planBlueprints: FormControl<Guid[]>,
|
planBlueprints: FormControl<Guid[]>,
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto" [ngClass]="{'plan-title': !isDraft, 'plan-title-draft': isDraft}">{{plan.label}}</div>
|
<div class="col-auto" [ngClass]="{'plan-title': !isDraft, 'plan-title-draft': isDraft}">{{plan.label}}</div>
|
||||||
<div class="plan-subtitle">
|
<div class="plan-subtitle">
|
||||||
<span *ngIf="isUserPlanRelated()" class="col-auto">{{ enumUtils.toPlanUserRolesString(planService.getCurrentUserRolesInPlan(plan?.planUsers)) }}</span>
|
<span *ngIf="isUserPlanRelated()" class="col-auto">{{ enumUtils.toPlanUserRolesString(planService.getCurrentUserRolesInPlan(plan?.planUsers, isDeleted)) }}</span>
|
||||||
<span *ngIf="isUserPlanRelated()">.</span>
|
<span *ngIf="isUserPlanRelated()">.</span>
|
||||||
<span class="col-auto" *ngIf="plan.status.internalStatus === planStatusEnum.Finalized && isPublic"><span class="material-icons icon-align">public</span>{{'TYPES.PLAN-VISIBILITY.PUBLIC' | translate}}</span>
|
<span class="col-auto" *ngIf="plan.status.internalStatus === planStatusEnum.Finalized && isPublic"><span class="material-icons icon-align">public</span>{{'TYPES.PLAN-VISIBILITY.PUBLIC' | translate}}</span>
|
||||||
<span *ngIf="plan.status.internalStatus === planStatusEnum.Finalized && !isPublic; else draft" class="col-auto"><span class="material-icons icon-align">done</span>{{ plan.status.name }}</span>
|
<span *ngIf="plan.status.internalStatus === planStatusEnum.Finalized && !isPublic; else draft" class="col-auto"><span class="material-icons icon-align">done</span>{{ plan.status.name }}</span>
|
||||||
|
|
|
@ -30,6 +30,7 @@ import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/
|
||||||
import { RouterUtilsService } from '@app/core/services/router/router-utils.service';
|
import { RouterUtilsService } from '@app/core/services/router/router-utils.service';
|
||||||
import { Tenant } from '@app/core/model/tenant/tenant';
|
import { Tenant } from '@app/core/model/tenant/tenant';
|
||||||
import { PlanStatusAvailableActionType } from '@app/core/common/enum/plan-status-available-action-type';
|
import { PlanStatusAvailableActionType } from '@app/core/common/enum/plan-status-available-action-type';
|
||||||
|
import { IsActive } from '@notification-service/core/enum/is-active.enum';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-plan-listing-item-component',
|
selector: 'app-plan-listing-item-component',
|
||||||
|
@ -45,6 +46,7 @@ export class PlanListingItemComponent extends BaseComponent implements OnInit {
|
||||||
@Input() tenants: Tenant[] = [];
|
@Input() tenants: Tenant[] = [];
|
||||||
@Output() onClick: EventEmitter<Plan> = new EventEmitter();
|
@Output() onClick: EventEmitter<Plan> = new EventEmitter();
|
||||||
|
|
||||||
|
isDeleted: boolean;
|
||||||
isDraft: boolean;
|
isDraft: boolean;
|
||||||
isFinalized: boolean;
|
isFinalized: boolean;
|
||||||
isPublished: boolean;
|
isPublished: boolean;
|
||||||
|
@ -52,15 +54,15 @@ export class PlanListingItemComponent extends BaseComponent implements OnInit {
|
||||||
fileTransformerEntityTypeEnum = FileTransformerEntityType;
|
fileTransformerEntityTypeEnum = FileTransformerEntityType;
|
||||||
|
|
||||||
get canEditPlan(): boolean {
|
get canEditPlan(): boolean {
|
||||||
return (this.isDraft) && (this.plan.authorizationFlags?.some(x => x === AppPermission.EditPlan) || this.authentication.hasPermission(AppPermission.EditPlan)) && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
return (this.isDraft) && (this.plan.authorizationFlags?.some(x => x === AppPermission.EditPlan) || this.authentication.hasPermission(AppPermission.EditPlan)) && !this.isDeleted && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
||||||
}
|
}
|
||||||
|
|
||||||
get canCreateNewVersion(): boolean {
|
get canCreateNewVersion(): boolean {
|
||||||
return (this.plan.authorizationFlags?.some(x => x === AppPermission.CreateNewVersionPlan) || this.authentication.hasPermission(AppPermission.CreateNewVersionPlan)) && this.plan.versionStatus === PlanVersionStatus.Current && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
return (this.plan.authorizationFlags?.some(x => x === AppPermission.CreateNewVersionPlan) || this.authentication.hasPermission(AppPermission.CreateNewVersionPlan)) && !this.isDeleted && this.plan.versionStatus === PlanVersionStatus.Current && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
||||||
}
|
}
|
||||||
|
|
||||||
get canDeletePlan(): boolean {
|
get canDeletePlan(): boolean {
|
||||||
return (this.plan.authorizationFlags?.some(x => x === AppPermission.DeletePlan) || this.authentication.hasPermission(AppPermission.DeletePlan)) && !this.isPublic && this.plan.belongsToCurrentTenant != false && this.isDraftPlan;
|
return (this.plan.authorizationFlags?.some(x => x === AppPermission.DeletePlan) || this.authentication.hasPermission(AppPermission.DeletePlan)) && !this.isPublic && !this.isDeleted &&this.plan.belongsToCurrentTenant != false && this.isNotFinalizedPlan;
|
||||||
}
|
}
|
||||||
|
|
||||||
get canClonePlan(): boolean {
|
get canClonePlan(): boolean {
|
||||||
|
@ -68,28 +70,28 @@ export class PlanListingItemComponent extends BaseComponent implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
get canFinalizePlan(): boolean {
|
get canFinalizePlan(): boolean {
|
||||||
return (this.plan.authorizationFlags?.some(x => x === AppPermission.FinalizePlan) || this.authentication.hasPermission(AppPermission.FinalizePlan)) && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
return (this.plan.authorizationFlags?.some(x => x === AppPermission.FinalizePlan) || this.authentication.hasPermission(AppPermission.FinalizePlan)) && !this.isDeleted && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
||||||
}
|
}
|
||||||
|
|
||||||
get canExportPlan(): boolean {
|
get canExportPlan(): boolean {
|
||||||
return this.plan.authorizationFlags?.some(x => x === AppPermission.ExportPlan) || this.authentication.hasPermission(AppPermission.ExportPlan) &&
|
return (this.plan.authorizationFlags?.some(x => x === AppPermission.ExportPlan) || this.authentication.hasPermission(AppPermission.ExportPlan)) && this.isPublic &&
|
||||||
this.plan.status?.definition?.availableActions?.filter(x => x === PlanStatusAvailableActionType.Export).length > 0;;
|
this.plan.status?.definition?.availableActions?.filter(x => x === PlanStatusAvailableActionType.Export).length > 0;;
|
||||||
}
|
}
|
||||||
|
|
||||||
get canInvitePlanUsers(): boolean {
|
get canInvitePlanUsers(): boolean {
|
||||||
return (this.plan.authorizationFlags?.some(x => x === AppPermission.InvitePlanUsers) || this.authentication.hasPermission(AppPermission.InvitePlanUsers)) && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
return (this.plan.authorizationFlags?.some(x => x === AppPermission.InvitePlanUsers) || this.authentication.hasPermission(AppPermission.InvitePlanUsers)) && !this.isDeleted && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
||||||
}
|
}
|
||||||
|
|
||||||
get canAssignPlanUsers(): boolean {
|
get canAssignPlanUsers(): boolean {
|
||||||
return (this.plan.authorizationFlags?.some(x => x === AppPermission.AssignPlanUsers) || this.authentication.hasPermission(AppPermission.AssignPlanUsers)) && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
return (this.plan.authorizationFlags?.some(x => x === AppPermission.AssignPlanUsers) || this.authentication.hasPermission(AppPermission.AssignPlanUsers)) && !this.isDeleted && !this.isPublic && this.plan.belongsToCurrentTenant != false;
|
||||||
}
|
}
|
||||||
|
|
||||||
get showActionsMenu(): boolean {
|
get showActionsMenu(): boolean {
|
||||||
return this.isAuthenticated() && (this.canCreateNewVersion || this.showAllVersionsAction || this.canDeletePlan)
|
return this.isAuthenticated() && (this.canCreateNewVersion || this.showAllVersionsAction || this.canDeletePlan) && !this.isDeleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
get isDraftPlan(): boolean {
|
get isNotFinalizedPlan(): boolean {
|
||||||
return this.plan.status?.internalStatus == PlanStatusEnum.Draft;
|
return this.plan.status?.internalStatus == null || this.plan.status?.internalStatus != PlanStatusEnum.Finalized;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
@ -125,6 +127,9 @@ export class PlanListingItemComponent extends BaseComponent implements OnInit {
|
||||||
this.isPublished = false;
|
this.isPublished = false;
|
||||||
if (this.plan.status.internalStatus === PlanStatusEnum.Finalized && this.plan.accessType === PlanAccessType.Public) { this.isPublished = true }
|
if (this.plan.status.internalStatus === PlanStatusEnum.Finalized && this.plan.accessType === PlanAccessType.Public) { this.isPublished = true }
|
||||||
}
|
}
|
||||||
|
if (this.plan.isActive != IsActive.Active) {
|
||||||
|
this.isDeleted = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
public isAuthenticated(): boolean {
|
||||||
|
|
|
@ -219,7 +219,12 @@ export class PlanListingComponent extends BaseListingComponent<BasePlan, PlanLoo
|
||||||
if (!result) { return []; }
|
if (!result) { return []; }
|
||||||
this.totalCount = result.count;
|
this.totalCount = result.count;
|
||||||
if (this.lookup?.page?.offset === 0) this.listingItems = [];
|
if (this.lookup?.page?.offset === 0) this.listingItems = [];
|
||||||
const plans = this._filterPlan([...result.items]);
|
let plans: any[];
|
||||||
|
if (this.lookup?.isActive[0] == IsActive.Inactive) {
|
||||||
|
plans = result.items;
|
||||||
|
} else {
|
||||||
|
plans = this._filterPlan([...result.items]);
|
||||||
|
}
|
||||||
this.listingItems.push(...plans);
|
this.listingItems.push(...plans);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -417,6 +422,8 @@ export class PlanListingComponent extends BaseListingComponent<BasePlan, PlanLoo
|
||||||
|
|
||||||
this.lookup.statusIds = filters?.statusId != null ? [filters.statusId] : null;
|
this.lookup.statusIds = filters?.statusId != null ? [filters.statusId] : null;
|
||||||
|
|
||||||
|
this.lookup.isActive = filters?.isActive ? [IsActive.Active] : [IsActive.Inactive];
|
||||||
|
|
||||||
// Tenants
|
// Tenants
|
||||||
let viewOnlyTenant = filters?.viewOnlyTenant ?? false;
|
let viewOnlyTenant = filters?.viewOnlyTenant ?? false;
|
||||||
if (viewOnlyTenant) {
|
if (viewOnlyTenant) {
|
||||||
|
@ -473,6 +480,7 @@ export class PlanListingComponent extends BaseListingComponent<BasePlan, PlanLoo
|
||||||
let count = 0;
|
let count = 0;
|
||||||
|
|
||||||
if (lookup.statusIds) count += lookup.statusIds.length;
|
if (lookup.statusIds) count += lookup.statusIds.length;
|
||||||
|
if (lookup.isActive[0] == IsActive.Inactive) count += lookup.isActive.length;
|
||||||
if (lookup.tenantSubQuery) count += 1;
|
if (lookup.tenantSubQuery) count += 1;
|
||||||
if (lookup.planDescriptionTemplateSubQuery) count += lookup.planDescriptionTemplateSubQuery.descriptionTemplateGroupIds?.length;
|
if (lookup.planDescriptionTemplateSubQuery) count += lookup.planDescriptionTemplateSubQuery.descriptionTemplateGroupIds?.length;
|
||||||
if (lookup.planBlueprintSubQuery) count += lookup.planBlueprintSubQuery.ids?.length;
|
if (lookup.planBlueprintSubQuery) count += lookup.planBlueprintSubQuery.ids?.length;
|
||||||
|
@ -494,6 +502,7 @@ export class PlanListingComponent extends BaseListingComponent<BasePlan, PlanLoo
|
||||||
nameof<Plan>(x => x.id),
|
nameof<Plan>(x => x.id),
|
||||||
nameof<Plan>(x => x.label),
|
nameof<Plan>(x => x.label),
|
||||||
nameof<Plan>(x => x.description),
|
nameof<Plan>(x => x.description),
|
||||||
|
nameof<Plan>(x => x.isActive),
|
||||||
|
|
||||||
[nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.id)].join('.'),
|
[nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.id)].join('.'),
|
||||||
[nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.name)].join('.'),
|
[nameof<Plan>(x => x.status), nameof<PlanStatus>(x => x.name)].join('.'),
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
<div class="col-auto pr-0 d-flex"><span class="plan-label">{{ plan.label }}</span></div>
|
<div class="col-auto pr-0 d-flex"><span class="plan-label">{{ plan.label }}</span></div>
|
||||||
<div class="col-auto pr-0 mb-1"><span style="font-weight: 700;">.</span></div>
|
<div class="col-auto pr-0 mb-1"><span style="font-weight: 700;">.</span></div>
|
||||||
<div class="col-auto d-flex">
|
<div class="col-auto d-flex">
|
||||||
<button mat-button [disabled]="!otherPlanVersions?.length" [matMenuTriggerFor]="versionsMenu" style="color: #000 !important; border-radius: 100px; background-color: #eaeaea;">
|
<button mat-button [disabled]="!otherPlanVersions?.length || !isActive" [matMenuTriggerFor]="versionsMenu" style="color: #000 !important; border-radius: 100px; background-color: #eaeaea;">
|
||||||
<div class="pl-2 pr-1 d-flex align-items-center">{{'PLAN-OVERVIEW.VERSION' | translate}} {{selectedPlanVersion}}
|
<div class="pl-2 pr-1 d-flex align-items-center">{{'PLAN-OVERVIEW.VERSION' | translate}} {{selectedPlanVersion}}
|
||||||
@if(otherPlanVersions?.length){
|
@if(otherPlanVersions?.length){
|
||||||
<mat-icon class="ml-1">arrow_drop_down</mat-icon>
|
<mat-icon class="ml-1">arrow_drop_down</mat-icon>
|
||||||
|
@ -177,7 +177,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="isAuthenticated()">
|
<ng-container *ngIf="isAuthenticated() && isActive">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="frame mb-3 pt-4 pl-4 pr-5 pb-3">
|
<div class="frame mb-3 pt-4 pl-4 pr-5 pb-3">
|
||||||
|
@ -247,7 +247,7 @@
|
||||||
<app-plan-authors
|
<app-plan-authors
|
||||||
[planUsers]="plan.planUsers"
|
[planUsers]="plan.planUsers"
|
||||||
[username]="userName"
|
[username]="userName"
|
||||||
[removeUser]="canAssignPlanUsers(plan) && (plan.status.internalStatus == null || plan.status.internalStatus === planStatusEnum.Finalized)"
|
[removeUser]="canAssignPlanUsers(plan)"
|
||||||
(deleteAuthor)="removeUserFromPlan($event)"
|
(deleteAuthor)="removeUserFromPlan($event)"
|
||||||
/>
|
/>
|
||||||
<div *ngIf="canInvitePlanUsers()" class="col-12 d-flex align-items-center justify-content-center mt-2">
|
<div *ngIf="canInvitePlanUsers()" class="col-12 d-flex align-items-center justify-content-center mt-2">
|
||||||
|
|
|
@ -139,7 +139,7 @@ export class PlanOverviewComponent extends BaseComponent implements OnInit {
|
||||||
this.getAvailableStatuses(this.plan.id);
|
this.getAvailableStatuses(this.plan.id);
|
||||||
this.plan.planUsers = this.isActive ? data?.planUsers?.filter((x) => x.isActive === IsActive.Active) : data?.planUsers;
|
this.plan.planUsers = this.isActive ? data?.planUsers?.filter((x) => x.isActive === IsActive.Active) : data?.planUsers;
|
||||||
this.plan.otherPlanVersions = data.otherPlanVersions?.filter(x => x.isActive === IsActive.Active) || null;
|
this.plan.otherPlanVersions = data.otherPlanVersions?.filter(x => x.isActive === IsActive.Active) || null;
|
||||||
if (this.plan.descriptions) {
|
if (this.plan.descriptions && this.isActive) {
|
||||||
if (this.plan.status?.internalStatus == PlanStatusEnum.Finalized) {
|
if (this.plan.status?.internalStatus == PlanStatusEnum.Finalized) {
|
||||||
this.plan.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status?.internalStatus === DescriptionStatusEnum.Finalized);
|
this.plan.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status?.internalStatus === DescriptionStatusEnum.Finalized);
|
||||||
} else {
|
} else {
|
||||||
|
@ -327,7 +327,8 @@ export class PlanOverviewComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
canAssignPlanUsers(): boolean {
|
canAssignPlanUsers(): boolean {
|
||||||
const authorizationFlags = !this.isPublicView ? (this.plan as Plan).authorizationFlags : [];
|
const authorizationFlags = !this.isPublicView ? (this.plan as Plan).authorizationFlags : [];
|
||||||
return (authorizationFlags?.some(x => x === AppPermission.AssignPlanUsers) || this.authentication.hasPermission(AppPermission.AssignPlanUsers)) && this.isPublicView == false && this.plan.belongsToCurrentTenant != false;
|
return (authorizationFlags?.some(x => x === AppPermission.AssignPlanUsers) || this.authentication.hasPermission(AppPermission.AssignPlanUsers)) && this.isPublicView == false && this.plan.belongsToCurrentTenant != false &&
|
||||||
|
(this.plan.status.internalStatus == null || this.plan.status.internalStatus != PlanStatusEnum.Finalized);
|
||||||
}
|
}
|
||||||
|
|
||||||
canDepositPlan(): boolean {
|
canDepositPlan(): boolean {
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<div class="title">{{(canEdit ? 'PLAN-EDITOR.TITLE-EDIT' : 'PLAN-EDITOR.TITLE-PREVIEW') | translate}}</div>
|
<div class="title">{{(canEdit ? 'PLAN-EDITOR.TITLE-EDIT' : 'PLAN-EDITOR.TITLE-PREVIEW') | translate}}</div>
|
||||||
<div class="subtitle">{{ formGroup.get('label').value }} <span *ngIf="isDirty()" class="changes">({{'PLAN-EDITOR.UNSAVED-CHANGES' | translate}})</span></div>
|
<div class="subtitle">{{ formGroup.get('label').value }} <span *ngIf="isDirty()" class="changes">({{'PLAN-EDITOR.UNSAVED-CHANGES' | translate}})</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="step > 0" class="ml-auto d-flex flex-row">
|
<div *ngIf="step > 0 && !isDeleted" class="ml-auto d-flex flex-row">
|
||||||
|
|
||||||
<div *ngIf="formGroup.get('id').value && canExport" class="col-auto d-flex align-items-center">
|
<div *ngIf="formGroup.get('id').value && canExport" class="col-auto d-flex align-items-center">
|
||||||
<button [disabled]="isDirty()" [matTooltipDisabled]="!isDirty()" mat-button class="rounded-btn primary-inverted" type="button" [matMenuTriggerFor]="exportMenu" (click)="$event.stopPropagation();" [matTooltip]="'PLAN-EDITOR.ACTIONS.EXPORT.CAN-NOT-EXPORT' | translate">
|
<button [disabled]="isDirty()" [matTooltipDisabled]="!isDirty()" mat-button class="rounded-btn primary-inverted" type="button" [matMenuTriggerFor]="exportMenu" (click)="$event.stopPropagation();" [matTooltip]="'PLAN-EDITOR.ACTIONS.EXPORT.CAN-NOT-EXPORT' | translate">
|
||||||
|
|
|
@ -272,16 +272,17 @@ export class PlanEditorComponent extends BaseEditor<PlanEditorModel, Plan> imple
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.editorModel = data ? new PlanEditorModel().fromModel(data) : new PlanEditorModel();
|
this.editorModel = data ? new PlanEditorModel().fromModel(data) : new PlanEditorModel();
|
||||||
|
this.isDeleted = data ? data.isActive === IsActive.Inactive : false;
|
||||||
if (data) {
|
if (data) {
|
||||||
if (data.id) this.getAvailableStatuses(data.id);
|
if (data.id) this.getAvailableStatuses(data.id);
|
||||||
if (data.descriptions) {
|
if (data.descriptions && !this.isDeleted) {
|
||||||
if (data.status?.internalStatus == PlanStatusEnum.Finalized) {
|
if (data.status?.internalStatus == PlanStatusEnum.Finalized) {
|
||||||
data.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status.internalStatus === DescriptionStatusEnum.Finalized);
|
data.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status.internalStatus === DescriptionStatusEnum.Finalized);
|
||||||
} else {
|
} else {
|
||||||
data.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status.internalStatus !== DescriptionStatusEnum.Canceled);
|
data.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status.internalStatus !== DescriptionStatusEnum.Canceled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (data.planDescriptionTemplates) {
|
if (data.planDescriptionTemplates && !this.isDeleted) {
|
||||||
data.planDescriptionTemplates = data.planDescriptionTemplates.filter(x => x.isActive === IsActive.Active);
|
data.planDescriptionTemplates = data.planDescriptionTemplates.filter(x => x.isActive === IsActive.Active);
|
||||||
}
|
}
|
||||||
if (data.entityDois && data.entityDois.length > 0) data.entityDois = data.entityDois.filter(x => x.isActive === IsActive.Active);
|
if (data.entityDois && data.entityDois.length > 0) data.entityDois = data.entityDois.filter(x => x.isActive === IsActive.Active);
|
||||||
|
@ -290,7 +291,6 @@ export class PlanEditorComponent extends BaseEditor<PlanEditorModel, Plan> imple
|
||||||
this.item = data;
|
this.item = data;
|
||||||
|
|
||||||
this.selectedBlueprint = data?.blueprint;
|
this.selectedBlueprint = data?.blueprint;
|
||||||
this.isDeleted = data ? data.isActive === IsActive.Inactive : false;
|
|
||||||
|
|
||||||
if (data && data.id) {
|
if (data && data.id) {
|
||||||
const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = {
|
const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = {
|
||||||
|
@ -715,6 +715,9 @@ export class PlanEditorComponent extends BaseEditor<PlanEditorModel, Plan> imple
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
public descriptionsInSection(sectionId: Guid) {
|
public descriptionsInSection(sectionId: Guid) {
|
||||||
|
if (this.isDeleted) {
|
||||||
|
return this.item?.descriptions?.filter(x => x?.planDescriptionTemplate?.sectionId === sectionId) || [];
|
||||||
|
}
|
||||||
return this.item?.descriptions?.filter(x => x.isActive == IsActive.Active && x?.planDescriptionTemplate?.sectionId === sectionId && x.planDescriptionTemplate.isActive == IsActive.Active) || [];
|
return this.item?.descriptions?.filter(x => x.isActive == IsActive.Active && x?.planDescriptionTemplate?.sectionId === sectionId && x.planDescriptionTemplate.isActive == IsActive.Active) || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,12 @@ export class PlanEditorModel extends BaseEditorModel implements PlanPersist {
|
||||||
item?.blueprint?.definition?.sections?.forEach(section => {
|
item?.blueprint?.definition?.sections?.forEach(section => {
|
||||||
if (section.hasTemplates) {
|
if (section.hasTemplates) {
|
||||||
const isNew = (item.id == null);
|
const isNew = (item.id == null);
|
||||||
const sectionTemplatesFromPlan = item.planDescriptionTemplates?.filter(x => x.sectionId == section.id && x.isActive == IsActive.Active) || [];
|
let sectionTemplatesFromPlan: PlanDescriptionTemplate[];
|
||||||
|
if (item.isActive != IsActive.Active) {
|
||||||
|
sectionTemplatesFromPlan = item.planDescriptionTemplates?.filter(x => x.sectionId == section.id) || [];
|
||||||
|
} else {
|
||||||
|
sectionTemplatesFromPlan = item.planDescriptionTemplates?.filter(x => x.sectionId == section.id && x.isActive == IsActive.Active) || [];
|
||||||
|
}
|
||||||
|
|
||||||
if (sectionTemplatesFromPlan.length > 0) {
|
if (sectionTemplatesFromPlan.length > 0) {
|
||||||
sectionTemplatesFromPlan?.filter(x => x.sectionId == section.id).forEach(planDescriptionTemplate => {
|
sectionTemplatesFromPlan?.filter(x => x.sectionId == section.id).forEach(planDescriptionTemplate => {
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -776,6 +776,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1074,6 +1075,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
|
@ -778,6 +778,7 @@
|
||||||
"DRAFT": "Draft"
|
"DRAFT": "Draft"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
@ -1076,6 +1077,7 @@
|
||||||
"CANCELED": "Canceled"
|
"CANCELED": "Canceled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"IS-ACTIVE": "Active Filter",
|
||||||
"RELATED-TENANT": {
|
"RELATED-TENANT": {
|
||||||
"NAME": "Related Tenant",
|
"NAME": "Related Tenant",
|
||||||
"FILTER-BY-TENANT": "Filter by tenant"
|
"FILTER-BY-TENANT": "Filter by tenant"
|
||||||
|
|
Loading…
Reference in New Issue