1
- import { customElement , html , repeat , state } from "@umbraco-cms/backoffice/external/lit" ;
1
+ import { css , customElement , html , nothing , property , repeat , state } from "@umbraco-cms/backoffice/external/lit" ;
2
2
import { UmbModalBaseElement } from "@umbraco-cms/backoffice/modal" ;
3
3
import { DynamicsFormPickerModalData , DynamicsFormPickerModalValue } from "./dynamics.modal-token" ;
4
4
import { DYNAMICS_CONTEXT_TOKEN } from "../context/dynamics.context" ;
5
- import { FormDtoModel , OAuthConfigurationDtoModel } from "@umbraco-integrations/dynamics/generated" ;
5
+ import { DynamicsModuleModel , FormDtoModel , OAuthConfigurationDtoModel } from "@umbraco-integrations/dynamics/generated" ;
6
6
import { UMB_NOTIFICATION_CONTEXT , UmbNotificationColor } from "@umbraco-cms/backoffice/notification" ;
7
7
import { UUIInputEvent } from "@umbraco-cms/backoffice/external/uui" ;
8
- import { UmbPropertyValueChangeEvent } from "@umbraco-cms/backoffice/property-editor" ;
8
+ import {
9
+ type UmbPropertyEditorConfigCollection ,
10
+ UmbPropertyValueChangeEvent
11
+ } from "@umbraco-cms/backoffice/property-editor" ;
12
+ import * as dynamicsModuleHelper from "../helpers/dynamic-module.helper" ;
9
13
10
14
const elementName = "dynamics-forms-modal" ;
11
- enum testEnum {
12
- OUTBOUND = "1" ,
13
- REAL_TIME = "2"
14
- }
15
15
16
16
@customElement ( elementName )
17
17
export default class DynamicsFormModalElement extends UmbModalBaseElement < DynamicsFormPickerModalData , DynamicsFormPickerModalValue > {
@@ -23,12 +23,19 @@ export default class DynamicsFormModalElement extends UmbModalBaseElement<Dynami
23
23
@state ( )
24
24
private _forms : Array < FormDtoModel > = [ ] ;
25
25
@state ( )
26
- private _filterForms : Array < FormDtoModel > = [ ] ;
26
+ private _filteredForms : Array < FormDtoModel > = [ ] ;
27
+ @state ( )
28
+ private _selectedForm : FormDtoModel = {
29
+ id : "" ,
30
+ module : DynamicsModuleModel . BOTH ,
31
+ name : "" ,
32
+ rawHtml : "" ,
33
+ standaloneHtml : ""
34
+ } ;
27
35
@state ( )
28
36
private renderWithIFrame : boolean = false ;
29
37
@state ( )
30
38
private toggleLabel : string = "Render with Script" ;
31
-
32
39
33
40
constructor ( ) {
34
41
super ( ) ;
@@ -47,7 +54,7 @@ export default class DynamicsFormModalElement extends UmbModalBaseElement<Dynami
47
54
await this . #checkOAuthConfiguration( ) ;
48
55
}
49
56
50
- async #checkOAuthConfiguration( ) {
57
+ async #checkOAuthConfiguration( ) {
51
58
if ( ! this . #settingsModel) return ;
52
59
53
60
if ( ! this . #settingsModel. isAuthorized ) {
@@ -57,34 +64,31 @@ export default class DynamicsFormModalElement extends UmbModalBaseElement<Dynami
57
64
}
58
65
}
59
66
60
- async #getForms( ) {
67
+ async #getForms( ) {
61
68
this . _loading = true ;
62
- const { data } = await this . #dynamicsContext. getForms ( "Both" ) ;
63
- if ( ! data ) return ;
69
+ const { data } = await this . #dynamicsContext. getForms ( this . data ?. module ! ) ;
70
+ if ( ! data ) return ;
64
71
65
72
this . _forms = data ;
66
- this . _filterForms = data ;
73
+ this . _filteredForms = data ;
67
74
this . _loading = false ;
68
75
}
69
76
70
- async _onSelect ( form : FormDtoModel ) {
71
- var result = await this . checkEmbed ( form ) ;
72
- if ( result ) {
73
- this . value = { selectedForm : form } ;
74
- this . _submitModal ( ) ;
75
- }
77
+ async _onSelect ( form : FormDtoModel ) {
78
+ this . _selectedForm = form ;
76
79
}
77
80
78
- async checkEmbed ( form : FormDtoModel ) {
79
- if ( this . renderWithIFrame && form . module . toString ( ) === testEnum . REAL_TIME ) {
80
- var { data } = await this . #dynamicsContext. getEmbedCode ( form . id ) ;
81
- if ( ! data || data . result . length == 0 ) {
81
+ async _onSubmit ( ) {
82
+ if ( this . renderWithIFrame && dynamicsModuleHelper . parseModule ( this . _selectedForm . module . toString ( ) ) == DynamicsModuleModel . OUTBOUND ) {
83
+ var { data } = await this . #dynamicsContext. getEmbedCode ( this . _selectedForm . id ) ;
84
+ if ( ! data || data . result . length == 0 ) {
82
85
this . _showError ( "Unable to embed selected form. Please check if it is live." ) ;
83
86
return false ;
84
87
}
85
88
}
86
89
87
- return true ;
90
+ this . value = { selectedForm : this . _selectedForm , iframeEmbedded : this . renderWithIFrame } ;
91
+ this . _submitModal ( ) ;
88
92
}
89
93
90
94
private async _showError ( message : string ) {
@@ -98,63 +102,82 @@ export default class DynamicsFormModalElement extends UmbModalBaseElement<Dynami
98
102
} ) ;
99
103
}
100
104
101
- onMessageOnSubmitIsHtmlChange ( ) {
105
+ onMessageOnSubmitIsHtmlChange ( ) {
102
106
this . renderWithIFrame = ! this . renderWithIFrame ;
103
107
this . toggleLabel = ! this . renderWithIFrame ? "Render with Script" : "Render with iFrame" ;
104
108
}
105
109
106
- onSearchChange ( e : UUIInputEvent ) {
107
- var searchText = e . target ?. value as string ;
108
- this . _filterForms = this . _forms . filter ( f => f . name . toLowerCase ( ) . includes ( searchText . toLowerCase ( ) ) ) ;
109
- this . dispatchEvent ( new UmbPropertyValueChangeEvent ( ) ) ;
110
+ #handleFilterInput( event : UUIInputEvent ) {
111
+ let query = ( event . target . value as string ) || '' ;
112
+ query = query . toLowerCase ( ) ;
113
+
114
+ const result = ! query
115
+ ? this . _forms
116
+ : this . _forms . filter ( ( form ) => form . name ?. toLowerCase ( ) . includes ( query ) ) ;
117
+
118
+ this . _filteredForms = result ;
119
+ }
120
+ private _renderFilter ( ) {
121
+ return html ` <uui- input
122
+ type= "search"
123
+ id = "filter"
124
+ @input = "${ this . #handleFilterInput} "
125
+ placeholder = "Type to filter..."
126
+ label = "Type to filter forms" >
127
+ <uui- icon name= "search" slot = "prepend" id = "filter-icon" > </ uui- icon>
128
+ </ uui- input> ` ;
110
129
}
111
130
112
- render ( ) {
131
+ render ( ) {
113
132
return html `
114
133
<umb- body- layout>
115
- ${ this . _loading ?
116
- html `< div class ="center loader "> < uui-loader > </ uui-loader > </ div > ` :
134
+ ${ this . _loading ?
135
+ html `<div class= "center loader" > <uui- loader> </ uui- loader> </ div> ` :
117
136
html `
118
137
<uui- box headline= ${ this . data ! . headline } >
119
- < div slot ="header "> Select a form</ div >
120
-
121
- < uui-input placeholder ="Type to search... " @change =${ ( e : UUIInputEvent ) => this . onSearchChange ( e ) } >
122
- < div slot ="append " style ="background:#f3f3f3; padding-left:var(--uui-size-2, 6px) ">
123
- < uui-icon-registry-essential >
124
- < uui-icon name ="search "> </ uui-icon >
125
- </ uui-icon-registry-essential >
126
- </ div >
127
- </ uui-input >
128
-
129
- ${ this . _filterForms . length > 0 ?
138
+ ${ this . _renderFilter ( ) }
139
+ ${ this . _filteredForms . length > 0 ?
130
140
html `
131
- ${ repeat ( this . _filterForms , ( form ) => html `
132
- < uui-ref-node-form
133
- selectable
134
- name =${ form . name ?? "" }
135
- @selected =${ ( ) => this . _onSelect ( form ) } >
136
- </ uui-ref-node- form>
137
- ` ) }
138
-
139
- < uui-toggle
140
- ?checked =${ this . renderWithIFrame }
141
- .label =${ this . toggleLabel }
142
- @change=${ this . onMessageOnSubmitIsHtmlChange } > </ uui-toggle >
143
- ` :
141
+ ${ repeat ( this . _filteredForms , ( form ) => html `
142
+ <uui- ref- node- for m
143
+ selectable
144
+ ?selected = ${ this . _selectedForm . id == form . id }
145
+ name = ${ form . name ?? "" }
146
+ @selected = ${ ( ) => this . _onSelect ( form ) } >
147
+ < / uui - ref - node - f or m >
148
+ ` ) }
149
+ <uui- to ggle
150
+ ?checked= ${ this . renderWithIFrame }
151
+ .label = ${ this . toggleLabel }
152
+ @change = ${ this . onMessageOnSubmitIsHtmlChange } > </ uui- to ggle>
153
+ ` :
144
154
html `` }
145
155
</ uui- box>
146
156
147
157
<br / >
148
158
149
159
<uui- box headline= "Dynamics - OAuth Status" >
150
- < div slot ="header "> Please connect with your Microsoft account.</ div >
151
160
<dynamics- authorization> </ dynamics- authorization>
152
161
</ uui- box>
153
162
` }
154
163
164
+ <uui- butto n look= "primary" slot = "actions" label= "Submit" @click = ${ this . _onSubmit } > </ uui- butto n>
155
165
<uui- butto n slot= "actions" label = ${ this . localize . term ( "general_close" ) } @click = ${ this . _rejectModal } > </ uui- butto n>
156
166
</ umb- body- layout>
157
167
` ;
158
168
}
169
+
170
+ static styles = [
171
+ css `
172
+ # filter {
173
+ width : 100% ;
174
+ margin-bottom : var (--uui-size-3 );
175
+ }
176
+
177
+ uui-icon {
178
+ margin : auto;
179
+ margin-left : var (--uui-size-2 );
180
+ }
181
+ ` ] ;
159
182
}
160
183
0 commit comments