11import * 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
65ko . 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