1212 * information: "Portions copyright [year] [name of copyright owner]".
1313 *
1414 * Portions copyright 2014-2016 ForgeRock AS.
15+ * Portions copyright 2025 Wren Security.
1516 */
1617
1718define ( [
@@ -46,7 +47,7 @@ define([
4647 } ,
4748 SCRIPT_RESOURCE : "Script" ,
4849
49- render ( schema , element , itemID , itemData , callback ) {
50+ render ( schema , element , itemID , itemData , editing = false ) {
5051 var self = this ,
5152 hiddenData = { } ;
5253
@@ -61,10 +62,14 @@ define([
6162
6263 this . data . conditions = _ . sortBy ( this . data . conditions , "i18nKey" ) ;
6364
64- UIUtils . fillTemplateWithData ( this . template , this . data , function ( tpl ) {
65+ return UIUtils . compileTemplate ( this . template , this . data ) . then ( ( tpl ) => {
6566 self . $el . append ( tpl ) ;
6667 self . setElement ( `#environment_${ itemID } ` ) ;
6768
69+ if ( editing ) {
70+ self . $el . addClass ( "editing" ) ;
71+ }
72+
6873 if ( itemData ) {
6974 // Temporary fix, the name attribute is being added by the server after the policy is created.
7075 // TODO: Serverside solution required
@@ -83,10 +88,6 @@ define([
8388 self . $el . find ( "select.type-selection:first" ) . focus ( ) ;
8489
8590 self . $el . find ( ".info-button" ) . hide ( ) ;
86-
87- if ( callback ) {
88- callback ( ) ;
89- }
9091 } ) ;
9192 } ,
9293
@@ -98,47 +99,54 @@ define([
9899 mergedData = _ . merge ( { } , itemData , hiddenData ) ,
99100 type ;
100101
101- item . focus ( ) ; // Required to trigger changeInput.
102+ item . focus ( ) ; // Required to trigger changeInput.
102103 this . data . conditions = allEnvironments ;
103104
105+ const propertyI18nKey = ( type , key ) => (
106+ `${ self . i18n . condition . key } ${ type } ${ self . i18n . condition . props } ${ key } `
107+ ) ;
108+
104109 if ( mergedData && mergedData . type ) {
105110 type = mergedData . type ;
106111 itemToDisplay = { } ;
107112 if ( type === self . SCRIPT_RESOURCE ) {
108- itemToDisplay [ "console.common.type" ] = $ . t ( self . i18n . condition . key + type +
109- self . i18n . condition . title ) ;
110- PoliciesService . getScriptById ( mergedData . scriptId ) . done ( function ( script ) {
111- itemToDisplay [ `${ self . i18n . condition . key } ${ type } ${ self . i18n . condition . props } scriptId` ] =
112- script . name ;
113- self . setListItemHtml ( item , itemToDisplay ) ;
114- } ) ;
115- } else {
116- _ . each ( mergedData , function ( val , key ) {
117- if ( key === "type" ) {
118- itemToDisplay [ "console.common.type" ] = $ . t ( self . i18n . condition . key + type +
119- self . i18n . condition . title ) ;
120- } else {
121- itemToDisplay [ self . i18n . condition . key + type + self . i18n . condition . props + key ] = val ;
122- }
123- } ) ;
124- this . setListItemHtml ( item , itemToDisplay ) ;
113+ // eslint-disable-next-line max-len
114+ itemToDisplay [ "console.common.type" ] = $ . t ( `${ self . i18n . condition . key } ${ type } ${ self . i18n . condition . title } ` ) ;
115+ const i18nKey = propertyI18nKey ( type , "scriptId" ) ;
116+ if ( mergedData . scriptId ) {
117+ return PoliciesService . getScriptById ( mergedData . scriptId ) . done ( function ( script ) {
118+ itemToDisplay [ i18nKey ] = script . name ;
119+ return self . setListItemHtml ( item , itemToDisplay ) ;
120+ } ) ;
121+ }
122+ itemToDisplay [ i18nKey ] = "" ;
123+ return self . setListItemHtml ( item , itemToDisplay ) ;
125124 }
126- } else {
127- this . setListItemHtml ( item , itemToDisplay ) ;
125+
126+ _ . each ( mergedData , function ( val , key ) {
127+ if ( key === "type" ) {
128+ // eslint-disable-next-line max-len
129+ itemToDisplay [ "console.common.type" ] = $ . t ( `${ self . i18n . condition . key } ${ type } ${ self . i18n . condition . title } ` ) ;
130+ } else {
131+ itemToDisplay [ propertyI18nKey ( type , key ) ] = val ;
132+ }
133+ } ) ;
134+ return this . setListItemHtml ( item , itemToDisplay ) ;
128135 }
136+
137+ return this . setListItemHtml ( item , itemToDisplay ) ;
129138 } ,
130139
131140 setListItemHtml ( item , itemToDisplay ) {
132141 var self = this ;
133142
134- UIUtils . fillTemplateWithData (
135- "templates/admin/views/realms/authorization/policies/conditions/ListItem.html" , {
136- data : itemToDisplay
137- } ,
138- function ( tpl ) {
139- item . find ( ".item-data" ) . html ( tpl ) ;
140- self . setElement ( `#${ item . attr ( "id" ) } ` ) ;
141- } ) ;
143+ return UIUtils . compileTemplate (
144+ "templates/admin/views/realms/authorization/policies/conditions/ListItem.html" ,
145+ { data : itemToDisplay }
146+ ) . then ( ( tpl ) => {
147+ item . find ( ".item-data" ) . html ( tpl ) ;
148+ self . setElement ( `#${ item . attr ( "id" ) } ` ) ;
149+ } ) ;
142150 } ,
143151
144152 changeType ( e ) {
@@ -218,100 +226,117 @@ define([
218226 schemaProps = schema . config . properties ,
219227 i18nKey ,
220228 attributesWrapper ,
221- htmlBuiltPromise = $ . Deferred ( ) ;
229+ htmlBuiltPromises = [ ] ;
230+
231+ const renderConditionAttr = ( callback ) => {
232+ const attrBuiltPromise = $ . Deferred ( ) ;
233+ callback ( attrBuiltPromise . resolve ) ;
234+ htmlBuiltPromises . push ( attrBuiltPromise ) ;
235+ } ;
222236
223- function buildScriptAttr ( ) {
237+ const buildScriptAttr = ( resolve ) => {
224238 new ArrayAttr ( ) . render ( {
225239 itemData, hiddenData, data : [ hiddenData [ itemData . type ] ] ,
226240 title : "scriptId" , dataSource : "scripts" , multiple : false ,
227241 i18nKey : `${ self . i18n . condition . key } ${ schema . title } ${ self . i18n . condition . props } scriptId`
228- } , itemDataEl , htmlBuiltPromise . resolve ) ;
229- }
242+ } , itemDataEl , resolve ) ;
243+ } ;
230244
231245 if ( itemData . type === "SimpleTime" ) {
232246 attributesWrapper = '<div class="clearfix clear-left" id="conditionAttrTimeDate"></div>' ;
233- new TimeAttr ( ) . render ( { itemData } , itemDataEl ) ;
234- new DayAttr ( ) . render ( { itemData } , itemDataEl ) ;
235- new DateAttr ( ) . render ( { itemData } , itemDataEl ) ;
247+
248+ renderConditionAttr ( ( resolve ) => new TimeAttr ( ) . render ( { itemData } , itemDataEl , resolve ) ) ;
249+ renderConditionAttr ( ( resolve ) => new DayAttr ( ) . render ( { itemData } , itemDataEl , resolve ) ) ;
250+ renderConditionAttr ( ( resolve ) => new DateAttr ( ) . render ( { itemData } , itemDataEl , resolve ) ) ;
236251
237252 if ( ! itemData . enforcementTimeZone ) {
238253 itemData . enforcementTimeZone = "GMT" ;
239254 }
240- new ArrayAttr ( ) . render ( {
241- itemData,
242- data : [ itemData . enforcementTimeZone ] ,
243- title : "enforcementTimeZone" ,
244- i18nKey : `${ self . i18n . condition . key } ${ schema . title } ${ self . i18n . condition . props } enforcementTimeZone` ,
245- dataSource : "enforcementTimeZone" ,
246- multiple : false
247- } , itemDataEl ) ;
248- htmlBuiltPromise . resolve ( ) ;
255+ renderConditionAttr ( ( resolve ) => {
256+ // eslint-disable-next-line max-len
257+ const i18nKey = `${ self . i18n . condition . key } ${ schema . title } ${ self . i18n . condition . props } enforcementTimeZone` ;
258+ new ArrayAttr ( ) . render ( {
259+ itemData,
260+ data : [ itemData . enforcementTimeZone ] ,
261+ title : "enforcementTimeZone" ,
262+ i18nKey,
263+ dataSource : "enforcementTimeZone" ,
264+ multiple : false
265+ } , itemDataEl , resolve ) ;
266+ } ) ;
249267 } else if ( schema . title === self . SCRIPT_RESOURCE ) {
250268 attributesWrapper = '<div class="no-float"></div>' ;
251269 if ( itemData && itemData . scriptId ) {
252- PoliciesService . getScriptById ( itemData . scriptId ) . done ( function ( script ) {
253- hiddenData [ itemData . type ] = script . name ;
254- buildScriptAttr ( ) ;
270+ renderConditionAttr ( ( resolve ) => {
271+ PoliciesService . getScriptById ( itemData . scriptId ) . done ( function ( script ) {
272+ hiddenData [ itemData . type ] = script . name ;
273+ buildScriptAttr ( resolve ) ;
274+ } ) ;
255275 } ) ;
256276 } else {
257- buildScriptAttr ( ) ;
277+ renderConditionAttr ( buildScriptAttr ) ;
258278 }
259279 } else {
260280 attributesWrapper = '<div class="no-float"></div>' ;
261281
262282 _ . map ( schemaProps , function ( value , key ) {
263- i18nKey = self . i18n . condition . key + schema . title + self . i18n . condition . props + key ;
283+ i18nKey = ` ${ self . i18n . condition . key } ${ schema . title } ${ self . i18n . condition . props } ${ key } ` ;
264284
265285 switch ( value . type ) {
266286 case "string" : // fall through
267287 case "number" : // fall through
268288 case "integer" :
269- new StringAttr ( ) . render ( {
270- itemData,
271- data : itemData [ key ] ,
272- title : key ,
273- i18nKey,
274- schema,
275- value
276- } , itemDataEl ) ;
289+ renderConditionAttr ( ( resolve ) => {
290+ new StringAttr ( ) . render ( {
291+ itemData,
292+ data : itemData [ key ] ,
293+ title : key ,
294+ i18nKey,
295+ schema,
296+ value
297+ } , itemDataEl , resolve ) ;
298+ } ) ;
277299 break ;
278300 case "boolean" :
279- new BooleanAttr ( ) . render ( {
280- itemData,
281- data : value ,
282- title : key ,
283- i18nKey,
284- selected : itemData [ key ]
285- } , itemDataEl ) ;
301+ renderConditionAttr ( ( resolve ) => {
302+ new BooleanAttr ( ) . render ( {
303+ itemData,
304+ data : value ,
305+ title : key ,
306+ i18nKey,
307+ selected : itemData [ key ]
308+ } , itemDataEl , resolve ) ;
309+ } ) ;
286310 break ;
287311 case "array" :
288- new ArrayAttr ( ) . render ( {
289- itemData,
290- data : itemData [ key ] ,
291- title : key ,
292- i18nKey
293- } , itemDataEl ) ;
312+ renderConditionAttr ( ( resolve ) => {
313+ new ArrayAttr ( ) . render ( {
314+ itemData,
315+ data : itemData [ key ] ,
316+ title : key ,
317+ i18nKey
318+ } , itemDataEl , resolve ) ;
319+ } ) ;
294320 break ;
295321 case "object" :
296- new ObjectAttr ( ) . render ( {
297- itemData,
298- data : itemData [ key ] ,
299- title : key ,
300- i18nKey
301- } , itemDataEl ) ;
322+ renderConditionAttr ( ( resolve ) => {
323+ new ObjectAttr ( ) . render ( {
324+ itemData,
325+ data : itemData [ key ] ,
326+ title : key ,
327+ i18nKey
328+ } , itemDataEl , resolve ) ;
329+ } ) ;
302330 break ;
303331 default :
304332 break ;
305333 }
306334 } ) ;
307- htmlBuiltPromise . resolve ( ) ;
308335 }
309336
310- htmlBuiltPromise . done ( function ( ) {
337+ return $ . when . apply ( $ , htmlBuiltPromises ) . done ( ( ) => {
311338 self . $el . find ( ".condition-attr" ) . wrapAll ( attributesWrapper ) ;
312339 } ) ;
313-
314- return htmlBuiltPromise ;
315340 } ,
316341
317342 setDefaultJsonValues ( schema ) {
0 commit comments