WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 11befe1

Browse files
committed
Rewritten several binding handlers into behaviors.
1 parent 126de45 commit 11befe1

File tree

5 files changed

+59
-35
lines changed

5 files changed

+59
-35
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import * as ko from "knockout";
2+
3+
export function registerKnockoutBehavior(behaviorName: string, BehaviorClass) {
4+
ko.bindingHandlers[behaviorName] = {
5+
init: (element, valueAccessor, allBindings, viewModel, context) => {
6+
const params = ko.toJSON(valueAccessor());
7+
// Ensure params are converted to a plain object if needed
8+
const behavior = new BehaviorClass(element, params, context);
9+
10+
// store instance using Knockout's DOM data utils
11+
ko.utils.domData.set(element, behaviorName, behavior);
12+
13+
ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
14+
behavior.dispose();
15+
ko.utils.domData.set(element, behaviorName, null);
16+
});
17+
18+
behavior.init();
19+
},
20+
update: (element, valueAccessor) => {
21+
const behavior = ko.utils.domData.get(element, behaviorName);
22+
if (behavior.update) {
23+
behavior.update(ko.unwrap(valueAccessor()));
24+
}
25+
}
26+
};
27+
}

src/ko/bindingHandlers/bindingHandlers.gridCell.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import * as ko from "knockout";
2-
import { GridCellModel } from "../../grid-cell";
3-
import { GridCellViewModel } from "../../grid-cell/ko";
42
import { GridHelper } from "@paperbits/common/editing";
53

64

src/ko/bindingHandlers/bindingHandlers.hyperlink.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import * as ko from "knockout";
22
import { HyperlinkModel } from "@paperbits/common/permalinks";
33
import { HyperlinkBehavior } from "@paperbits/common/behaviors/behavior.hyperlink";
4+
import { BehaviorHandle } from "@paperbits/common/behaviors";
45

56
ko.bindingHandlers["hyperlink"] = {
67
update(element: HTMLElement, valueAccessor: () => HyperlinkModel): void {
78
const hyperlink: HyperlinkModel = valueAccessor();
8-
let behaviorHandle: any;
9+
let behaviorHandle: BehaviorHandle;
910

1011
if (ko.isObservable(hyperlink)) {
1112
hyperlink.subscribe(newValue => {

src/ko/bindingHandlers/bindingHandlers.markdown.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as ko from "knockout";
2-
import { MarkdownBehavior } from "@paperbits/common/behaviors/behavior.markdown"; // Corrected path
2+
import { MarkdownBehavior } from "@paperbits/common/behaviors/behavior.markdown";
33

44
ko.bindingHandlers["markdown"] = {
55
update: (element: HTMLElement, valueAccessor: () => string): void => {

src/ko/bindingHandlers/bindingHandlers.roleBasedSecured.ts

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import * as ko from "knockout";
2-
import { BuiltInRoles, UserService } from "@paperbits/common/user";
2+
import { UserService } from "@paperbits/common/user";
33
import { EventManager } from "@paperbits/common/events";
44
import { RoleBasedSecurityModel } from "@paperbits/common/security/roleBasedSecurityModel";
5+
import { RoleBasedSecuredBehavior, RoleBasedSecuredBehaviorConfig } from "@paperbits/common/behaviors/behavior.roleBasedSecured";
56

67

78
export class RoleBasedSecuredBindingHandler {
@@ -10,48 +11,45 @@ export class RoleBasedSecuredBindingHandler {
1011
private readonly userService: UserService
1112
) {
1213
ko.bindingHandlers["secured"] = {
13-
init: (element: HTMLElement, valueAccessor: any) => {
14-
const securityModel = ko.unwrap(valueAccessor());
15-
const initiallyAssignedRoles = securityModel?.roles;
16-
const dataRoleObservable: ko.Observable<string> = ko.observable(initiallyAssignedRoles);
17-
const hiddenObservable: ko.Observable<boolean> = ko.observable(false);
18-
19-
const applyRoles = (securityModel: RoleBasedSecurityModel) => { // has to be synchronous to be applied during publishing
20-
const widgetRoles = securityModel?.roles || [BuiltInRoles.everyone.key];
21-
22-
const roles = widgetRoles
23-
&& widgetRoles.length === 1
24-
&& widgetRoles[0] === BuiltInRoles.everyone.key
25-
? null
26-
: widgetRoles.join(",");
27-
28-
dataRoleObservable(roles);
29-
applyVisibility();
30-
};
14+
init: (element: HTMLElement, valueAccessor: () => ko.Observable<RoleBasedSecurityModel> | RoleBasedSecurityModel) => {
15+
const securityModelObservableOrStatic = valueAccessor();
16+
const initialSecurityModel = ko.unwrap(securityModelObservableOrStatic);
3117

32-
const applyVisibility = async () => { // doesn't have to be synchronous, used in design- and run-time only
33-
const widgetRolesString = dataRoleObservable();
34-
const widgetRoles = !!widgetRolesString ? widgetRolesString.split(",") : [BuiltInRoles.everyone.key];
35-
const userRoles = await this.userService.getUserRoles();
36-
const visibleToUser = userRoles.some(x => widgetRoles.includes(x)) || widgetRoles.includes(BuiltInRoles.everyone.key);
18+
const dataRoleObservable: ko.Observable<string | null> = ko.observable(null);
19+
const hiddenObservable: ko.Observable<boolean> = ko.observable(false);
3720

38-
hiddenObservable(!visibleToUser);
21+
const behaviorConfig: RoleBasedSecuredBehaviorConfig = {
22+
initialSecurityModel: initialSecurityModel,
23+
userService: this.userService,
24+
eventManager: this.eventManager,
25+
onUpdate: (roles, isHidden) => {
26+
dataRoleObservable(roles);
27+
hiddenObservable(isHidden);
28+
}
3929
};
4030

41-
this.eventManager.addEventListener("onUserRoleChange", applyVisibility);
31+
const behaviorHandle = RoleBasedSecuredBehavior.attach(element, behaviorConfig);
4232

4333
ko.applyBindingsToNode(element, {
4434
attr: { "data-role": dataRoleObservable },
4535
css: { hidden: hiddenObservable }
4636
}, null);
4737

38+
let subscription: ko.Subscription | undefined;
39+
if (ko.isObservable(securityModelObservableOrStatic)) {
40+
subscription = securityModelObservableOrStatic.subscribe((newModel) => {
41+
behaviorHandle.update && behaviorHandle.update(newModel);
42+
});
43+
}
44+
4845
ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
49-
this.eventManager.removeEventListener("onUserRoleChange", applyVisibility);
46+
if (subscription) {
47+
subscription.dispose();
48+
}
49+
if (behaviorHandle && behaviorHandle.detach) {
50+
behaviorHandle.detach();
51+
}
5052
});
51-
52-
const assignedRolesObsevable: ko.Observable<RoleBasedSecurityModel> = valueAccessor();
53-
assignedRolesObsevable.subscribe(applyRoles);
54-
applyRoles(securityModel);
5553
}
5654
};
5755
}

0 commit comments

Comments
 (0)