Skip to content

Commit 08c458f

Browse files
committed
Rewritten hyperlink binding handler into behavior.
1 parent 5b19c18 commit 08c458f

File tree

2 files changed

+63
-57
lines changed

2 files changed

+63
-57
lines changed

src/behaviors/hyperlinkBehavior.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
import { HyperlinkModel, HyperlinkTarget } from "@paperbits/common/permalinks";
3+
import { Attributes, DataAttributes, HyperlinkRels } from "@paperbits/common/html";
4+
5+
export class HyperlinkBehavior {
6+
public apply(element: HTMLElement, hyperlink: HyperlinkModel): void {
7+
let href = "#";
8+
let toggleType = null;
9+
let triggerEvent = null;
10+
let toggleTarget = null;
11+
let isDownloadLink = false;
12+
let targetWindow = null;
13+
let rels = null;
14+
15+
if (hyperlink) {
16+
switch (hyperlink.target) {
17+
case HyperlinkTarget.popup:
18+
href = "javascript:void(0)";
19+
toggleType = "popup";
20+
triggerEvent = hyperlink.triggerEvent;
21+
toggleTarget = `#${hyperlink.targetKey.replace("popups/", "popups")}`;
22+
break;
23+
24+
case HyperlinkTarget.download:
25+
href = hyperlink.href;
26+
isDownloadLink = true;
27+
break;
28+
29+
default:
30+
toggleType = element.getAttribute("data-toggle");
31+
href = `${hyperlink.href}${hyperlink.anchor ? "#" + hyperlink.anchor : ""}`;
32+
targetWindow = hyperlink.target;
33+
34+
if (hyperlink.targetKey?.startsWith("urls/")) {
35+
rels = [HyperlinkRels.NoOpener, HyperlinkRels.NoReferrer].join(" ");
36+
}
37+
}
38+
}
39+
40+
const hyperlinkObj = {
41+
[DataAttributes.Toggle]: toggleType,
42+
[DataAttributes.TriggerEvent]: triggerEvent,
43+
[DataAttributes.Target]: toggleTarget,
44+
[Attributes.Href]: href,
45+
[Attributes.Target]: targetWindow,
46+
[Attributes.Download]: isDownloadLink ? "" : null,
47+
[Attributes.Rel]: rels
48+
};
49+
50+
for (const key in hyperlinkObj) {
51+
if (hyperlinkObj[key] !== null) {
52+
element.setAttribute(key, hyperlinkObj[key]);
53+
} else {
54+
element.removeAttribute(key);
55+
}
56+
}
57+
}
58+
}
Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,17 @@
11
import * as ko from "knockout";
2-
import { HyperlinkModel, HyperlinkTarget } from "@paperbits/common/permalinks";
3-
import { Attributes, DataAttributes, HyperlinkRels } from "@paperbits/common/html";
4-
2+
import { HyperlinkModel } from "@paperbits/common/permalinks";
3+
import { HyperlinkBehavior } from "../../behaviors/hyperlinkBehavior";
54

65
ko.bindingHandlers["hyperlink"] = {
76
update(element: HTMLElement, valueAccessor: () => HyperlinkModel): void {
87
const hyperlink: HyperlinkModel = valueAccessor();
9-
const attributesObservable = ko.observable();
10-
11-
const setElementAttributes = (hyperlink: HyperlinkModel) => {
12-
let href = "#";
13-
let toggleType = null;
14-
let triggerEvent = null;
15-
let toggleTarget = null;
16-
let isDownloadLink = false;
17-
let targetWindow = null;
18-
let rels = null;
19-
20-
if (hyperlink) {
21-
switch (hyperlink.target) {
22-
case HyperlinkTarget.popup:
23-
href = "javascript:void(0)";
24-
toggleType = "popup";
25-
triggerEvent = hyperlink.triggerEvent;
26-
toggleTarget = `#${hyperlink.targetKey.replace("popups/", "popups")}`;
27-
break;
28-
29-
case HyperlinkTarget.download:
30-
href = hyperlink.href;
31-
isDownloadLink = true;
32-
break;
33-
34-
default:
35-
toggleType = element.getAttribute("data-toggle");
36-
href = `${hyperlink.href}${hyperlink.anchor ? "#" + hyperlink.anchor : ""}`;
37-
targetWindow = hyperlink.target;
38-
39-
if (hyperlink.targetKey?.startsWith("urls/")) {
40-
rels = [HyperlinkRels.NoOpener, HyperlinkRels.NoReferrer].join(" ");
41-
}
42-
}
43-
}
44-
45-
const hyperlinkObj = {
46-
[DataAttributes.Toggle]: toggleType,
47-
[DataAttributes.TriggerEvent]: triggerEvent,
48-
[DataAttributes.Target]: toggleTarget,
49-
[Attributes.Href]: href,
50-
[Attributes.Target]: targetWindow,
51-
[Attributes.Download]: isDownloadLink
52-
? "" // Leave empty unless file name gets specified.
53-
: null,
54-
[Attributes.Rel]: rels
55-
};
56-
57-
attributesObservable(hyperlinkObj);
58-
};
8+
const behavior = new HyperlinkBehavior();
599

6010
if (ko.isObservable(hyperlink)) {
61-
hyperlink.subscribe(setElementAttributes);
11+
hyperlink.subscribe(newValue => behavior.apply(element, newValue));
6212
}
6313

6414
const initial = ko.unwrap(hyperlink);
65-
setElementAttributes(initial);
66-
67-
ko.applyBindingsToNode(element, { attr: attributesObservable }, null);
15+
behavior.apply(element, initial);
6816
}
6917
};

0 commit comments

Comments
 (0)