Skip to content

Commit 50c786a

Browse files
authored
Merge pull request #199 from krausvo1/policy_edit_fix
Fix editing of policy subjects and environments
2 parents db68c1c + 61f5057 commit 50c786a

File tree

9 files changed

+263
-222
lines changed

9 files changed

+263
-222
lines changed

openam-ui/openam-ui-ria/src/main/js/org/forgerock/openam/ui/admin/views/realms/authorization/policies/conditions/ConditionAttrArrayView.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* information: "Portions copyright [year] [name of copyright owner]".
1313
*
1414
* Copyright 2015-2016 ForgeRock AS.
15-
* Portions copyright 2024 Wren Security.
15+
* Portions copyright 2024-2025 Wren Security.
1616
*/
1717

1818
define([
@@ -165,7 +165,7 @@ define([
165165
selectize.addOption({ value, text: value });
166166
});
167167
callback(data.result);
168-
}).error(function (e) {
168+
}).fail(function (e) {
169169
console.error("error", e);
170170
callback();
171171
});
@@ -187,7 +187,7 @@ define([
187187
selectize.addOption({ value: value._id, text: value.name });
188188
});
189189
callback(data.result);
190-
}).error(function (e) {
190+
}).fail(function (e) {
191191
console.error("error", e);
192192
callback();
193193
});

openam-ui/openam-ui-ria/src/main/js/org/forgerock/openam/ui/admin/views/realms/authorization/policies/conditions/EditEnvironmentView.js

Lines changed: 111 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
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

1718
define([
@@ -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

Comments
 (0)