Skip to content

Commit f33ad2c

Browse files
authored
use dialogs to add users and groups (#342)
2 parents 064148e + 06731cd commit f33ad2c

File tree

9 files changed

+82
-182
lines changed

9 files changed

+82
-182
lines changed

pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
<properties>
5252
<changelist>999999-SNAPSHOT</changelist>
53-
<jenkins.version>2.387.3</jenkins.version>
53+
<jenkins.version>2.426.3</jenkins.version>
5454
<checkstyle.version>10.13.0</checkstyle.version>
5555
<hpi.compatibleSinceVersion>640</hpi.compatibleSinceVersion>
5656
</properties>
@@ -59,8 +59,8 @@
5959
<dependencies>
6060
<dependency>
6161
<groupId>io.jenkins.tools.bom</groupId>
62-
<artifactId>bom-2.387.x</artifactId>
63-
<version>2378.v3e03930028f2</version>
62+
<artifactId>bom-2.426.x</artifactId>
63+
<version>2839.v003b_4d9d24fd</version>
6464
<type>pom</type>
6565
<scope>import</scope>
6666
</dependency>

src/main/resources/com/michelin/cio/hudson/plugins/rolestrategy/RoleStrategyConfig/assign-roles.properties

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@
2323
migrate_user=Migrate ambiguous permissions assignment to user {0}
2424
migrate_group=Migrate ambiguous permissions assignment to group {0}
2525

26-
promptUser=User name:
26+
promptUser=User ID:
2727
userExists=An entry for this user already exists
28-
emptyUser=Please enter a user name
2928

3029
promptGroup=Group name:
3130
groupExists=An entry for this group already exists

src/main/resources/com/michelin/cio/hudson/plugins/rolestrategy/RoleStrategyConfig/index.jelly

-9
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,6 @@
242242
</f:bottomButtonBar>
243243
</l:isAdmin>
244244
</f:form>
245-
<section class="modal">
246-
<div class="flex">
247-
<button class="btn-close">⨉</button>
248-
</div>
249-
<h3 id="modaltitle">
250-
</h3>
251-
<div id="modalmessage">
252-
</div>
253-
</section>
254245
<div class="overlay default-hidden"/>
255246
<st:adjunct includes="lib.form.confirm" />
256247
</l:main-panel>

src/main/resources/com/michelin/cio/hudson/plugins/rolestrategy/RoleStrategyConfig/permission-templates.jelly

+3-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
<td class="start">
4949
<l:isAdmin>
5050
<div class="rsp-remove" data-is-used="${template.isUsed()}">
51-
<l:icon src="symbol-trash-outline plugin-ionicons-api" class="icon-sm alert-danger rsp-table__icon"/>
51+
<l:icon src="symbol-trash-outline plugin-ionicons-api" class="icon-sm icon-red rsp-table__icon"/>
5252
</div>
5353
</l:isAdmin>
5454
</td>
@@ -73,7 +73,7 @@
7373
<l:isAdmin>
7474
<td class="stop">
7575
<div class="rsp-remove" data-is-used="${template.isUsed()}">
76-
<l:icon src="symbol-trash-outline plugin-ionicons-api" class="icon-sm alert-danger rsp-table__icon"
76+
<l:icon src="symbol-trash-outline plugin-ionicons-api" class="icon-sm icon-red rsp-table__icon"
7777
htmlTooltip="&lt;b&gt;Role&lt;/b&gt;: ${h.escape(attrs.title)}"/>
7878
</div>
7979
</td>
@@ -210,6 +210,7 @@
210210
<script>
211211
</script>
212212
</f:form>
213+
<st:adjunct includes="lib.form.confirm" />
213214
</l:main-panel>
214215
</l:layout>
215216
</j:jelly>

src/main/webapp/css/role-strategy.css

-55
Original file line numberDiff line numberDiff line change
@@ -160,58 +160,3 @@ label.attach-previous {
160160
display: none;
161161
max-width: 500px;
162162
}
163-
164-
.modal {
165-
display: none;
166-
flex-direction: column;
167-
justify-content: center;
168-
gap: 0.4rem;
169-
min-width: 350px;
170-
padding: 1.3rem;
171-
min-height: 150px;
172-
max-height: 400px;
173-
position: fixed;
174-
z-index: 2000;
175-
top: 50%;
176-
left: 50%;
177-
transform: translate(-50%, -50%);
178-
background-color: var(--background);
179-
border: 1px solid #ddd;
180-
border-radius: 15px;
181-
}
182-
183-
.modal .flex {
184-
display: flex;
185-
align-items: center;
186-
justify-content: right;
187-
}
188-
189-
#modalmessage {
190-
overflow-y: auto;
191-
}
192-
193-
.overlay {
194-
position: fixed;
195-
top: 0;
196-
bottom: 0;
197-
left: 0;
198-
right: 0;
199-
width: 100%;
200-
height: 100%;
201-
background: rgba(0, 0, 0, 0.5);
202-
backdrop-filter: blur(3px);
203-
z-index: 1999;
204-
}
205-
206-
207-
.btn-close {
208-
transform: translate(10px, -10px);
209-
padding: 0.4rem 0.6rem;
210-
background: var(--btn-primary-bg);
211-
border-radius: 50%;
212-
color: var(--btn-text-color);
213-
cursor: pointer;
214-
border: none;
215-
font-weight: 600;
216-
font-family: sans-serif;
217-
}

src/main/webapp/js/table.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class TableHighlighter {
5959

6060
highlightRowOnly = e => {
6161
let enable = e.type === 'mouseenter';
62-
let tr = findAncestor(e.target, "TR")
62+
let tr = e.target.closest("TR");
6363
if (enable) {
6464
tr.classList.add('highlighted');
6565
} else {

src/main/webapp/js/tableAssign.js

+31-33
Original file line numberDiff line numberDiff line change
@@ -113,43 +113,41 @@ addButtonAction = function (e, template, table, tableHighlighter, tableId) {
113113
let dataReference = e.target;
114114
let type = dataReference.getAttribute('data-type');
115115
let tbody = table.tBodies[0];
116-
117-
let name = prompt(dataReference.getAttribute('data-prompt')).trim();
118-
if (name=="") {
119-
alert(dataReference.getAttribute('data-empty-message'));
120-
return;
121-
}
122-
if (findElementsBySelector(table,"TR").find(function(n){return n.getAttribute("name")=='['+type+':'+name+']';})!=null) {
123-
alert(dataReference.getAttribute('data-error-message'));
124-
return;
125-
}
126-
127-
let copy = document.importNode(template,true);
128-
copy.removeAttribute("id");
129-
copy.removeAttribute("style");
130-
131-
let children = copy.childNodes;
132-
let tooltipDescription = "Group";
133-
if (type==="USER") {
134-
tooltipDescription = "User";
135-
}
136-
children.forEach(function(item){
137-
item.outerHTML= item.outerHTML.replace(/{{USER}}/g, doubleEscapeHTML(name)).replace(/{{USERGROUP}}/g, tooltipDescription);
116+
117+
dialog.prompt(dataReference.getAttribute('data-prompt')).then( (name) => {
118+
name = name.trim();
119+
if (findElementsBySelector(table,"TR").find(function(n){return n.getAttribute("name")=='['+type+':'+name+']';})!=null) {
120+
dialog.alert(dataReference.getAttribute('data-error-message'))
121+
return;
122+
}
123+
124+
let copy = document.importNode(template,true);
125+
copy.removeAttribute("id");
126+
copy.removeAttribute("style");
127+
128+
let children = copy.childNodes;
129+
let tooltipDescription = "Group";
130+
if (type==="USER") {
131+
tooltipDescription = "User";
132+
}
133+
children.forEach(function(item){
134+
item.outerHTML= item.outerHTML.replace(/{{USER}}/g, doubleEscapeHTML(name)).replace(/{{USERGROUP}}/g, tooltipDescription);
135+
});
136+
137+
copy.childNodes[1].innerHTML = escapeHTML(name);
138+
copy.setAttribute("name",'['+type+':'+name+']');
139+
tbody.appendChild(copy);
140+
Behaviour.applySubtree(table, true);
141+
tableHighlighter.scan(copy);
138142
});
139-
140-
copy.childNodes[1].innerHTML = escapeHTML(name);
141-
copy.setAttribute("name",'['+type+':'+name+']');
142-
tbody.appendChild(copy);
143-
Behaviour.applySubtree(table, true);
144-
tableHighlighter.scan(copy);
145143
}
146144

147145

148146
Behaviour.specify(".global-matrix-authorization-strategy-table .rsp-remove", 'RoleBasedAuthorizationStrategy', 0, function(e) {
149147
e.onclick = function() {
150-
let table = findAncestor(this,"TABLE");
148+
let table = this.closest("TABLE");
151149
let tableId = table.getAttribute("id");
152-
let tr = findAncestor(this,"TR");
150+
let tr = this.closest("TR");
153151
parent = tr.parentNode;
154152
parent.removeChild(tr);
155153
if (parent.children.length < filterLimit) {
@@ -187,15 +185,15 @@ Behaviour.specify(".global-matrix-authorization-strategy-table TR.permission-row
187185
*/
188186
Behaviour.specify(".global-matrix-authorization-strategy-table TD.stop .migrate", 'RoleBasedAuthorizationStrategy', 0, function(e) {
189187
e.onclick = function() {
190-
let tr = findAncestor(this,"TR");
188+
let tr = this.closest("TR");
191189
let name = tr.getAttribute('name');
192190

193191
let newName = name.replace('[EITHER:', '[USER:'); // migrate_user behavior
194192
if (this.classList.contains('migrate_group')) {
195193
newName = name.replace('[EITHER:', '[GROUP:');
196194
}
197195

198-
let table = findAncestor(this,"TABLE");
196+
let table = this.closest("TABLE");
199197
let tableRows = table.getElementsByTagName('tr');
200198
let newNameElement = null;
201199
for (let i = 0; i < tableRows.length; i++) {
@@ -214,7 +212,7 @@ Behaviour.specify(".global-matrix-authorization-strategy-table TD.stop .migrate"
214212
tr.removeAttribute('data-checked');
215213

216214
// remove migration buttons from updated row
217-
let buttonContainer = findAncestor(this, "TD");
215+
let buttonContainer = this.closest("TD");
218216
let migrateButtons = buttonContainer.getElementsByClassName('migrate');
219217
for (let i = migrateButtons.length - 1; i >= 0; i--) {
220218
migrateButtons[i].remove();

src/main/webapp/js/tableManage.js

+12-41
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ var projectTableHighlighter;
3232
var newItemRoleTemplate;
3333
var agentTableHighlighter;
3434
var newAgentRoleTemplate;
35-
var modal;
36-
var overlay;
37-
var closeModalBtn;
3835

3936

4037
function filterRows(filter, table) {
@@ -107,7 +104,7 @@ endPatternInput = function(span, cancel) {
107104
let div = span.childNodes[0];
108105
let input = span.childNodes[1];
109106
let pattern = input.value;
110-
let table = findAncestor(span, "TABLE");
107+
let table = span.closest("TABLE");
111108
input.type = "hidden";
112109
div.style.display = "block";
113110
span.setAttribute("data-edit", "false");
@@ -116,7 +113,7 @@ endPatternInput = function(span, cancel) {
116113
} else {
117114
div.setAttribute("data-pattern", pattern);
118115
div.textContent = '"' + pattern + '"'
119-
let row = findAncestor(span, "TR");
116+
let row = span.closest("TR");
120117
for (td of row.getElementsByClassName('permissionInput')) {
121118
updateTooltip(row, td, pattern);
122119
}
@@ -257,15 +254,15 @@ addButtonAction = function(e, templateId, table, tableHighlighter, tableId) {
257254
}
258255
tbody.appendChild(copy);
259256
tableHighlighter.scan(copy);
260-
Behaviour.applySubtree(findAncestor(copy, "TABLE"), true);
257+
Behaviour.applySubtree(copy.closest("TABLE"), true);
261258
}
262259

263260

264261
Behaviour.specify(".global-matrix-authorization-strategy-table .rsp-remove", 'RoleBasedAuthorizationStrategy', 0, function(e) {
265262
e.onclick = function() {
266-
let table = findAncestor(this, "TABLE");
263+
let table = this.closest("TABLE");
267264
let tableId = table.getAttribute("id");
268-
let tr = findAncestor(this, "TR");
265+
let tr = this.closest("TR");
269266
parent = tr.parentNode;
270267
parent.removeChild(tr);
271268
if (parent.children.length < filterLimit) {
@@ -290,12 +287,12 @@ Behaviour.specify(".global-matrix-authorization-strategy-table .rsp-remove", 'Ro
290287
});
291288

292289
Behaviour.specify(".global-matrix-authorization-strategy-table td.permissionInput input", 'RoleBasedAuthorizationStrategy', 0, function(e) {
293-
let row = findAncestor(e, "TR");
290+
let row = e.closest("TR");
294291
let pattern = getPattern(row);
295-
let td = findAncestor(e, "TD");
292+
let td = e.closest("TD");
296293
updateTooltip(row, td, pattern);
297294
e.onchange = function() {
298-
Behaviour.applySubtree(findAncestor(row, "TABLE"), true);
295+
Behaviour.applySubtree(row.closest("TABLE"), true);
299296
return true;
300297
};
301298
});
@@ -346,7 +343,7 @@ showItemsModal = function(items, itemCount, maxItems, pattern) {
346343
}
347344

348345
showErrorMessageModal = function() {
349-
alert('Unable to fetch matching Jobs.');
346+
dialog.alert('Unable to fetch matching Jobs.');
350347
}
351348

352349
bindListenerToPattern = function(elem) {
@@ -398,34 +395,23 @@ showAgentsModal = function(agents, agentCount, maxAgents, pattern) {
398395
}
399396

400397
showModal = function(title, itemlist) {
401-
titleElement=document.getElementById("modaltitle");
402-
titleElement.textContent = title;
403-
404-
messageElement=document.getElementById("modalmessage");
405-
messageElement.textContent = "";
398+
messageElement=document.createElement("div");
406399
for (let item of itemlist) {
407400
line = document.createTextNode("- " + item);
408401
messageElement.appendChild(line);
409402
messageElement.appendChild(document.createElement("br"));
410403
}
411-
412-
modal.style.display="flex";
413-
overlay.classList.remove("default-hidden");
404+
dialog.modal(messageElement, {title: title});
414405
}
415406

416407
showAgentErrorMessageModal = function() {
417-
alert('Unable to fetch matching Agents.');
408+
dialogalert('Unable to fetch matching Agents.');
418409
}
419410

420411
bindAgentListenerToPattern = function(elem) {
421412
elem.addEventListener('click', showMatchingAgents);
422413
}
423414

424-
closeModal = function () {
425-
modal.style.display="none";
426-
overlay.classList.add("default-hidden");
427-
};
428-
429415
document.addEventListener('DOMContentLoaded', function() {
430416
// global roles initialization
431417
let globalRoleInputFilter = document.getElementById('globalRoleInputFilter');
@@ -463,19 +449,4 @@ document.addEventListener('DOMContentLoaded', function() {
463449
for (let pattern of agentPatterns) {
464450
bindAgentListenerToPattern(pattern);
465451
}
466-
467-
//
468-
modal = document.querySelector(".modal");
469-
470-
overlay = document.querySelector(".overlay");
471-
overlay.addEventListener("click", closeModal);
472-
473-
closeModalBtn = document.querySelector(".btn-close");
474-
closeModalBtn.addEventListener("click", closeModal);
475-
476-
document.addEventListener("keydown", function (e) {
477-
if (e.key === "Escape" && !modal.classList.contains("hidden")) {
478-
closeModal();
479-
}
480-
});
481452
});

0 commit comments

Comments
 (0)