Skip to content

Commit 458800f

Browse files
committed
buttons with actions
1 parent 611131d commit 458800f

File tree

2 files changed

+171
-7
lines changed

2 files changed

+171
-7
lines changed

services/static-webserver/client/source/class/osparc/data/Resources.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,18 @@ qx.Class.define("osparc.data.Resources", {
10651065
method: "GET",
10661066
url: statics.API + "/admin/users?status=PENDING"
10671067
},
1068+
approveUser: {
1069+
method: "POST",
1070+
url: statics.API + "/admin/users/{userEmail}:approve"
1071+
},
1072+
denyUser: {
1073+
method: "POST",
1074+
url: statics.API + "/admin/users/{userEmail}:deny"
1075+
},
1076+
resendConfirmationEmail: {
1077+
method: "POST",
1078+
url: statics.API + "/admin/users/{userEmail}:resendConfirmationEmail"
1079+
},
10681080
preRegister: {
10691081
method: "POST",
10701082
url: statics.API + "/admin/users:pre-register"

services/static-webserver/client/source/class/osparc/po/UsersPending.js

Lines changed: 159 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,79 @@ qx.Class.define("osparc.po.UsersPending", {
2626
data: [{
2727
name: "John Doe",
2828
29-
status: "APPROVAL_PENDING",
3029
date: "2025-01-01 00:00:00.702394",
30+
status: "APPROVAL_PENDING",
3131
}, {
3232
name: "Jane Doe",
3333
34-
status: "APPROVAL_DENIED",
3534
date: "2025-01-01 00:01:00.702394",
35+
status: "APPROVAL_DENIED",
3636
}, {
3737
name: "Alice Smith",
3838
39-
status: "CONFIRMATION_PENDING",
4039
date: "2025-01-01 00:02:00.702394",
40+
status: "CONFIRMATION_PENDING",
4141
}]
4242
});
4343
});
4444
},
45+
46+
createApproveButton: function(email) {
47+
const button = new osparc.ui.form.FetchButton(qx.locale.Manager.tr("Approve"));
48+
button.addListener("execute", () => {
49+
button.setFetching(true);
50+
const params = {
51+
url: {
52+
userEmail: email,
53+
},
54+
};
55+
osparc.data.Resources.fetch("poUsers", "approveUser", params)
56+
.then(() => {
57+
osparc.FlashMessenger.logAs(qx.locale.Manager.tr("User approved"), "INFO");
58+
})
59+
.catch(err => osparc.FlashMessenger.logError(err))
60+
.finally(() => button.setFetching(false));
61+
});
62+
return button;
63+
},
64+
65+
createDenyButton: function(email) {
66+
const button = new osparc.ui.form.FetchButton(qx.locale.Manager.tr("Deny"));
67+
button.addListener("execute", () => {
68+
button.setFetching(true);
69+
const params = {
70+
url: {
71+
userEmail: email,
72+
},
73+
};
74+
osparc.data.Resources.fetch("poUsers", "denyUser", params)
75+
.then(() => {
76+
osparc.FlashMessenger.logAs(qx.locale.Manager.tr("User denied"), "INFO");
77+
})
78+
.catch(err => osparc.FlashMessenger.logError(err))
79+
.finally(() => button.setFetching(false));
80+
});
81+
return button;
82+
},
83+
84+
createResendEmailButton: function(email) {
85+
const button = new osparc.ui.form.FetchButton(qx.locale.Manager.tr("Resend Email"));
86+
button.addListener("execute", () => {
87+
button.setFetching(true);
88+
const params = {
89+
url: {
90+
userEmail: email,
91+
},
92+
};
93+
osparc.data.Resources.fetch("poUsers", "resendConfirmationEmail", params)
94+
.then(() => {
95+
osparc.FlashMessenger.logAs(qx.locale.Manager.tr("Email sent"), "INFO");
96+
})
97+
.catch(err => osparc.FlashMessenger.logError(err))
98+
.finally(() => button.setFetching(false));
99+
});
100+
return button;
101+
},
45102
},
46103

47104
members: {
@@ -54,6 +111,12 @@ qx.Class.define("osparc.po.UsersPending", {
54111
flex: 1
55112
});
56113
break;
114+
case "pending-users-layout": {
115+
const grid = new qx.ui.layout.Grid(15, 5);
116+
control = new qx.ui.container.Composite(grid);
117+
this.getChildControl("pending-users-container").add(control);
118+
break;
119+
}
57120
}
58121
return control || this.base(arguments, id);
59122
},
@@ -64,14 +127,103 @@ qx.Class.define("osparc.po.UsersPending", {
64127
this.__populatePendingUsersLayout();
65128
},
66129

67-
__populatePendingUsersLayout: function(respData) {
68-
const pendingUsersContainer = this.getChildControl("pending-users-container");
69-
osparc.utils.Utils.removeAllChildren(pendingUsersContainer);
130+
__addHeader: function() {
131+
const pendingUsersLayout = this.getChildControl("pending-users-layout");
132+
133+
pendingUsersLayout.add(new qx.ui.basic.Label(this.tr("Name")).set({
134+
font: "text-14"
135+
}), {
136+
row: 0,
137+
column: 0,
138+
});
139+
140+
pendingUsersLayout.add(new qx.ui.basic.Label(this.tr("Email")).set({
141+
font: "text-14"
142+
}), {
143+
row: 0,
144+
column: 1,
145+
});
146+
147+
pendingUsersLayout.add(new qx.ui.basic.Label(this.tr("Date")).set({
148+
font: "text-14"
149+
}), {
150+
row: 0,
151+
column: 2,
152+
});
153+
154+
pendingUsersLayout.add(new qx.ui.basic.Label(this.tr("Status")).set({
155+
font: "text-14"
156+
}), {
157+
row: 0,
158+
column: 3,
159+
});
160+
161+
pendingUsersLayout.add(new qx.ui.basic.Label(this.tr("Action")).set({
162+
font: "text-14"
163+
}), {
164+
row: 0,
165+
column: 4,
166+
});
167+
},
168+
169+
__addRows: function(pendingUsers) {
170+
const pendingUsersLayout = this.getChildControl("pending-users-layout");
171+
172+
let row = 1;
173+
pendingUsers.forEach(pendingUser => {
174+
pendingUsersLayout.add(new qx.ui.basic.Label(pendingUser.name), {
175+
row,
176+
column: 0,
177+
});
178+
pendingUsersLayout.add(new qx.ui.basic.Label(pendingUser.email), {
179+
row,
180+
column: 1,
181+
});
182+
pendingUsersLayout.add(new qx.ui.basic.Label(osparc.utils.Utils.formatDateAndTime(new Date(pendingUser.date))), {
183+
row,
184+
column: 2,
185+
});
186+
pendingUsersLayout.add(new qx.ui.basic.Label(pendingUser.status.toLowerCase()), {
187+
row,
188+
column: 3,
189+
});
190+
191+
const buttonsLayout = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
192+
pendingUsersLayout.add(buttonsLayout, {
193+
row,
194+
column: 4,
195+
});
196+
switch (pendingUser.status) {
197+
case "APPROVAL_PENDING": {
198+
const approveButton = this.self().createApproveButton(pendingUser.email);
199+
buttonsLayout.add(approveButton);
200+
const denyButton = this.self().createDenyButton(pendingUser.email);
201+
buttonsLayout.add(denyButton);
202+
break;
203+
}
204+
case "APPROVAL_DENIED": {
205+
const approveButton = this.self().createApproveButton(pendingUser.email);
206+
buttonsLayout.add(approveButton);
207+
break;
208+
}
209+
case "CONFIRMATION_PENDING": {
210+
const resendEmailButton = this.self().createResendEmailButton(pendingUser.email);
211+
buttonsLayout.add(resendEmailButton);
212+
break;
213+
}
214+
}
215+
row++;
216+
});
217+
},
70218

219+
__populatePendingUsersLayout: function() {
71220
// osparc.data.Resources.fetch("poUsers", "getPendingUsers", params)
72221
this.self().getPendingUsers()
73222
.then(pendingUsers => {
74-
console.log("Pending users: ", pendingUsers);
223+
const pendingUsersLayout = this.getChildControl("pending-users-layout");
224+
pendingUsersLayout.removeAll();
225+
this.__addHeader();
226+
this.__addRows(pendingUsers["data"]);
75227
})
76228
.catch(err => osparc.FlashMessenger.logError(err));
77229
}

0 commit comments

Comments
 (0)