Skip to content

Commit 1b40aef

Browse files
committed
introduce name write guard manager
1 parent 646b915 commit 1b40aef

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed

src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-header-name-editable/workspace-header-name-editable.element.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ export class UmbWorkspaceHeaderNameEditableElement extends UmbLitElement {
3131
@state()
3232
private _name = '';
3333

34+
@state()
35+
private _isWritableName = true;
36+
3437
#workspaceContext?: typeof UMB_NAMABLE_WORKSPACE_CONTEXT.TYPE;
3538

3639
constructor() {
@@ -39,9 +42,20 @@ export class UmbWorkspaceHeaderNameEditableElement extends UmbLitElement {
3942
this.consumeContext(UMB_NAMABLE_WORKSPACE_CONTEXT, (workspaceContext) => {
4043
this.#workspaceContext = workspaceContext;
4144
this.#observeName();
45+
this.#observeNameWriteGuardRules();
4246
});
4347
}
4448

49+
#observeNameWriteGuardRules() {
50+
this.observe(
51+
this.#workspaceContext?.nameWriteGuard.isPermittedForName(),
52+
(isPermitted) => {
53+
this._isWritableName = isPermitted ?? true;
54+
},
55+
'umbObserveWorkspaceNameWriteGuardRules',
56+
);
57+
}
58+
4559
#observeName() {
4660
if (!this.#workspaceContext) return;
4761
this.observe(
@@ -73,7 +87,7 @@ export class UmbWorkspaceHeaderNameEditableElement extends UmbLitElement {
7387
@input="${this.#onNameInput}"
7488
label=${this.label ?? this.localize.term('placeholders_entername')}
7589
placeholder=${this.placeholder ?? this.localize.term('placeholders_entername')}
76-
?readonly=${this.readonly}
90+
?readonly=${this.readonly || !this._isWritableName}
7791
required
7892
${umbBindToValidation(this, `$.name`, this._name)}
7993
${umbFocus()}></uui-input>`;

src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-named-detail-workspace-base.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import type { UmbNamableWorkspaceContext } from '../types.js';
2+
import { UmbNameWriteGuardManager } from '../namable/index.js';
23
import { UmbEntityDetailWorkspaceContextBase } from './entity-detail-workspace-base.js';
3-
import type { UmbEntityDetailWorkspaceContextCreateArgs } from './types.js';
4+
import type { UmbEntityDetailWorkspaceContextArgs, UmbEntityDetailWorkspaceContextCreateArgs } from './types.js';
45
import type { UmbNamedEntityModel } from '@umbraco-cms/backoffice/entity';
56
import type { UmbDetailRepository } from '@umbraco-cms/backoffice/repository';
7+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
68

79
export abstract class UmbEntityNamedDetailWorkspaceContextBase<
810
NamedDetailModelType extends UmbNamedEntityModel = UmbNamedEntityModel,
@@ -17,7 +19,14 @@ export abstract class UmbEntityNamedDetailWorkspaceContextBase<
1719
// Just for context token safety:
1820
public readonly IS_ENTITY_NAMED_DETAIL_WORKSPACE_CONTEXT = true;
1921

20-
readonly name = this._data.createObservablePartOfCurrent((data) => data?.name);
22+
public readonly name = this._data.createObservablePartOfCurrent((data) => data?.name);
23+
24+
public readonly nameWriteGuard = new UmbNameWriteGuardManager(this);
25+
26+
constructor(host: UmbControllerHost, args: UmbEntityDetailWorkspaceContextArgs) {
27+
super(host, args);
28+
this.nameWriteGuard.fallbackToPermitted();
29+
}
2130

2231
getName() {
2332
return this._data.getCurrent()?.name;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './namable-workspace.context-token.js';
2+
export * from './name-write-guard.manager.js';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import type { UmbWorkspaceContext } from '../workspace-context.interface.js';
2+
import type { UmbNameWriteGuardManager } from './name-write-guard.manager.js';
23
import type { Observable } from '@umbraco-cms/backoffice/external/rxjs';
34

45
export interface UmbNamableWorkspaceContext extends UmbWorkspaceContext {
56
name: Observable<string | undefined>;
67
getName(): string | undefined;
78
setName(name: string): void;
9+
nameWriteGuard: UmbNameWriteGuardManager;
810
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { Observable } from '@umbraco-cms/backoffice/external/rxjs';
2+
import { UmbGuardManagerBase, type UmbGuardRule } from '@umbraco-cms/backoffice/utils';
3+
4+
export class UmbNameWriteGuardManager extends UmbGuardManagerBase {
5+
public isPermittedForName(): Observable<boolean> {
6+
return this._rules.asObservablePart((rules) => this.#resolvePermission(rules));
7+
}
8+
9+
#resolvePermission(rules: Array<UmbGuardRule>): boolean {
10+
if (rules.some((rule) => rule.permitted === false)) {
11+
return false;
12+
}
13+
14+
if (rules.some((rule) => rule.permitted === true)) {
15+
return true;
16+
}
17+
18+
return this._fallback;
19+
}
20+
}

0 commit comments

Comments
 (0)