1+ import { css , customElement , html , state , when } from '@umbraco-cms/backoffice/external/lit' ;
2+ import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal' ;
3+ import { type UUIBooleanInputEvent , UUIInputEvent } from "@umbraco-cms/backoffice/external/uui" ;
4+ import { UmbTextStyles } from '@umbraco-cms/backoffice/style' ;
5+ import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui' ;
6+ import { UmbNavSettingsItem , UmbNavSettingsItemModalData } from "./settings-item-modal-token.ts" ;
7+
8+ @customElement ( 'umbnav-settings-item-modal' )
9+ export class UmbNavModalElement extends
10+ UmbModalBaseElement < UmbNavSettingsItemModalData , UmbNavSettingsItem >
11+ {
12+ constructor ( ) {
13+ super ( ) ;
14+ }
15+
16+ connectedCallback ( ) : void {
17+ super . connectedCallback ( ) ;
18+ this . updateValue ( { customCssClasses : this . data ?. customCssClasses } ) ;
19+ }
20+
21+ @state ( )
22+ public get enableCustomCssClasses ( ) : Boolean {
23+ return < Boolean > this . data ?. config . find ( item => item . alias === 'allowCustomClasses' ) ?. value ?? false ;
24+ }
25+
26+ @state ( )
27+ public get hideNoOpenerToggle ( ) : Boolean {
28+ return < Boolean > this . data ?. config . find ( item => item . alias === 'hideNoopener' ) ?. value ?? false ;
29+ }
30+
31+ @state ( )
32+ public get hideNoReferrerToggle ( ) : Boolean {
33+ return < Boolean > this . data ?. config . find ( item => item . alias === 'hideNoreferrer' ) ?. value ?? false ;
34+ }
35+
36+ @state ( )
37+ customCssClasses : string = '' ;
38+
39+ @state ( )
40+ noReferrer : string = '' ;
41+
42+ @state ( )
43+ noOpener : string = '' ;
44+
45+ @state ( )
46+ private _submitButtonState : UUIButtonState ;
47+
48+ #handleConfirm( ) {
49+ this . _submitButtonState = 'waiting' ;
50+
51+ this . value = {
52+ customCssClasses : this . value ?. customCssClasses ?? '' ,
53+ noReferrer : this . value ?. noReferrer ?? '' ,
54+ noOpener : this . value ?. noOpener ?? '' }
55+ ;
56+ this . modalContext ?. submit ( ) ;
57+ }
58+
59+ #handleCancel( ) {
60+ this . modalContext ?. reject ( ) ;
61+ }
62+
63+ #contentChange( event : UUIInputEvent ) {
64+ this . updateValue ( { customCssClasses : event . target . value . toString ( ) } ) ;
65+ }
66+
67+ #handleNoReferrerToggle( event : UUIBooleanInputEvent ) {
68+
69+ if ( event . target . checked ) {
70+ this . updateValue ( { noReferrer : 'noreferrer' } ) ;
71+ this . noReferrer = 'noreferrer' ;
72+ } else {
73+ this . updateValue ( { noReferrer : '' } ) ;
74+ this . noReferrer = '' ;
75+ }
76+ }
77+
78+ #handleNoOpenerToggle( event : UUIBooleanInputEvent ) {
79+
80+ if ( event . target . checked ) {
81+ this . updateValue ( { noOpener : 'noopener' } ) ;
82+ this . noOpener = 'noopener' ;
83+ } else {
84+ this . updateValue ( { noOpener : '' } ) ;
85+ this . noOpener = '' ;
86+ }
87+ }
88+
89+ override render ( ) {
90+ return html `
91+ <umb- body- layout headline= ${ this . data ?. headline } >
92+ <uui- box>
93+ ${ when (
94+ this . enableCustomCssClasses ,
95+ ( ) => html `${ this . #renderCustomCssClassesInput( ) } ` ,
96+ ) }
97+
98+ ${ when (
99+ ! this . hideNoOpenerToggle || ! this . hideNoReferrerToggle ,
100+ ( ) => html `${ this . #renderSEOToggles( ) } ` ,
101+ ) }
102+ </ uui- box>
103+ <div slot= "actions" >
104+ <uui- butto n label= ${ this . localize . term ( 'general_close' ) } @click = ${ this . #handleCancel} > </ uui- butto n>
105+ <uui- butto n
106+ color = "positive"
107+ look = "primary"
108+ label = ${ this . localize . term ( 'general_submit' ) }
109+ .state = ${ this . _submitButtonState }
110+ @click = ${ this . #handleConfirm} > </ uui- butto n>
111+ </ div>
112+ </ umb- body- layout>
113+ ` ;
114+ }
115+
116+ #renderCustomCssClassesInput( ) {
117+ return html `
118+ <umb- property- layout or ientation= "vertical" >
119+ <div class= "side-by-side" slot = "editor" >
120+ <umb- property- layout
121+ or ientation= "vertical"
122+ label = "Custom CSS Classes"
123+ style = "padding:0;" >
124+ <uui- input
125+ slot= "editor"
126+ label = "Custom CSS Classes"
127+ .value = ${ this . data ?. customCssClasses }
128+ @input = ${ this . #contentChange} / >
129+ </ uui- input>
130+ </ umb- property- layout>
131+ </ div>
132+ </ umb- property- layout>
133+ ` ;
134+ }
135+
136+ #renderSEOToggles( ) {
137+ return html `
138+ <umb- property- layout or ientation= "vertical" >
139+ <div class= "side-by-side" slot = "editor" >
140+ <umb- property- layout
141+ or ientation= "vertical"
142+ label = 'SEO'
143+ style = "padding:0;"
144+ class = "seo-toggles" >
145+ ${ when (
146+ ! this . hideNoReferrerToggle ,
147+ ( ) => html `
148+ <uui- to ggle label= 'Add "noreferrer" to link'
149+ slot = "editor"
150+ ?checked= "${ this . data ?. noReferrer === 'noreferrer' } "
151+ @change = ${ this . #handleNoReferrerToggle} > </ uui- to ggle> ` ,
152+ ) }
153+
154+ ${ when (
155+ ! this . hideNoOpenerToggle ,
156+ ( ) => html `
157+ <uui- to ggle label= 'Add "noopener" to link'
158+ slot = "editor"
159+ ?checked= "${ this . data ?. noOpener === 'noopener' } "
160+ @change = ${ this . #handleNoOpenerToggle} > </ uui- to ggle> ` ,
161+ ) }
162+ </ umb- property- layout>
163+ </ div>
164+ </ umb- property- layout>
165+ ` ;
166+ }
167+
168+ static override styles = [
169+ UmbTextStyles ,
170+ css `
171+ uui-box {
172+ --uui-box-default-padding : 0 var (--uui-size-space-5 );
173+ }
174+
175+ uui-button-group {
176+ width : 100% ;
177+ }
178+
179+ uui-input {
180+ width : 100% ;
181+ }
182+
183+ .side-by-side {
184+ display : flex;
185+ flex-wrap : wrap;
186+ gap : var (--uui-size-space-5 );
187+
188+ umb-property-layout {
189+ flex : 1 1 0px ;
190+ }
191+ }
192+
193+ .invalid {
194+ color : var (--uui-color-danger );
195+ }
196+
197+ .seo-toggles uui-toggle : not (: last-child ) {
198+ display : block;
199+ margin-bottom : var (--uui-size-space-5 );
200+ }
201+ ` ,
202+ ] ;
203+
204+ }
205+
206+ export default UmbNavModalElement ;
0 commit comments