Skip to content

Commit 9e97c48

Browse files
odeimaizmatusdrobuliak66
authored andcommitted
🐛 Bugfix: Super collaborator (#4499)
1 parent 9da7051 commit 9e97c48

File tree

14 files changed

+150
-22
lines changed

14 files changed

+150
-22
lines changed

services/static-webserver/client/source/class/osparc/component/metadata/ClassifiersEditor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ qx.Class.define("osparc.component.metadata.ClassifiersEditor", {
144144
__saveClassifiers: function(saveBtn) {
145145
saveBtn.setFetching(true);
146146

147-
if ("uuid" in this.__studyData) {
147+
if (osparc.utils.Resources.isStudy(this._serializedData) || osparc.utils.Resources.isTemplate(this._serializedData)) {
148148
this.__studyData["classifiers"] = this.__classifiersTree.getCheckedClassifierIDs();
149149
const params = {
150150
url: {

services/static-webserver/client/source/class/osparc/component/share/Collaborators.js

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,13 @@ qx.Class.define("osparc.component.share.Collaborators", {
208208

209209
__createAddCollaboratorSection: function() {
210210
const vBox = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
211-
vBox.setVisibility(this._canIWrite() ? "visible" : "excluded");
211+
if (osparc.utils.Resources.isService(this._serializedData)) {
212+
// service
213+
vBox.setVisibility(this._canIWrite() ? "visible" : "excluded");
214+
} else {
215+
// study or template
216+
vBox.setVisibility(this._canIDelete() ? "visible" : "excluded");
217+
}
212218

213219
const label = new qx.ui.basic.Label(this.tr("Select from the list below and click Share"));
214220
vBox.add(label);
@@ -236,6 +242,10 @@ qx.Class.define("osparc.component.share.Collaborators", {
236242
vBox.add(label);
237243

238244
const rolesLayout = osparc.data.Roles.createRolesResourceInfo();
245+
const leaveButton = this.__getLeaveStudyButton();
246+
if (leaveButton) {
247+
rolesLayout.addAt(leaveButton, 0);
248+
}
239249
vBox.add(rolesLayout);
240250

241251
const collaboratorsUIList = new qx.ui.form.List().set({
@@ -304,6 +314,38 @@ qx.Class.define("osparc.component.share.Collaborators", {
304314
});
305315
},
306316

317+
__getLeaveStudyButton: function() {
318+
if (osparc.utils.Resources.isStudy(this._serializedData)) {
319+
const myGid = osparc.auth.Data.getInstance().getGroupId();
320+
const leaveButton = new qx.ui.form.Button(this.tr("Leave") + " " + osparc.product.Utils.getStudyAlias({
321+
firstUpperCase: true
322+
})).set({
323+
allowGrowX: false,
324+
visibility: Object.keys(this._serializedData["accessRights"]).includes(myGid.toString()) ? "visible" : "excluded"
325+
});
326+
leaveButton.addListener("execute", () => {
327+
let msg = this._serializedData["name"] + " " + this.tr("will no longer be listed.");
328+
if (!osparc.component.share.CollaboratorsStudy.checkRemoveCollaborator(this._serializedData, myGid)) {
329+
msg += "<br>";
330+
msg += this.tr("If you remove yourself, there won't be any other Owners.");
331+
}
332+
const win = new osparc.ui.window.Confirmation(msg).set({
333+
confirmText: this.tr("Leave"),
334+
confirmAction: "delete"
335+
});
336+
win.open();
337+
win.addListener("close", () => {
338+
if (win.getConfirmed()) {
339+
this._deleteMember({gid: myGid});
340+
qx.event.message.Bus.dispatchByName("reloadStudies");
341+
}
342+
}, this);
343+
}, this);
344+
return leaveButton;
345+
}
346+
return null;
347+
},
348+
307349
_reloadCollaboratorsList: function() {
308350
this.__collaboratorsModel.removeAll();
309351

@@ -319,14 +361,18 @@ qx.Class.define("osparc.component.share.Collaborators", {
319361
collaborator["name"] = osparc.utils.Utils.firstsUp(collaborator["first_name"], collaborator["last_name"]);
320362
}
321363
collaborator["accessRights"] = aceessRights[gid];
322-
collaborator["showOptions"] = this._canIWrite();
364+
collaborator["showOptions"] = osparc.utils.Resources.isService(this._serializedData) ? this._canIWrite() : this._canIDelete();
323365
collaboratorsList.push(collaborator);
324366
}
325367
});
326368
collaboratorsList.sort(this.self().sortStudyOrServiceCollabs);
327369
collaboratorsList.forEach(c => this.__collaboratorsModel.append(qx.data.marshal.Json.createModel(c)));
328370
},
329371

372+
_canIDelete: function() {
373+
throw new Error("Abstract method called!");
374+
},
375+
330376
_canIWrite: function() {
331377
throw new Error("Abstract method called!");
332378
},

services/static-webserver/client/source/class/osparc/component/share/CollaboratorsService.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,15 @@ qx.Class.define("osparc.component.share.CollaboratorsService", {
118118
},
119119

120120
_deleteMember: function(collaborator, item) {
121+
if (item) {
122+
item.setEnabled(false);
123+
}
121124
const success = this.self().removeCollaborator(this._serializedData, collaborator["gid"]);
122125
if (!success) {
123126
osparc.component.message.FlashMessenger.getInstance().logAs(this.tr("Something went wrong removing Member"), "ERROR");
127+
if (item) {
128+
item.setEnabled(true);
129+
}
124130
}
125131

126132
const params = {
@@ -139,6 +145,11 @@ qx.Class.define("osparc.component.share.CollaboratorsService", {
139145
.catch(err => {
140146
osparc.component.message.FlashMessenger.getInstance().logAs(this.tr("Something went wrong removing Member"), "ERROR");
141147
console.error(err);
148+
})
149+
.finally(() => {
150+
if (item) {
151+
item.setEnabled(true);
152+
}
142153
});
143154
},
144155

services/static-webserver/client/source/class/osparc/component/share/CollaboratorsStudy.js

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,25 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", {
9090
};
9191
},
9292

93+
__getDeleters: function(studyData) {
94+
const deleters = [];
95+
Object.entries(studyData["accessRights"]).forEach(([key, value]) => {
96+
if (value["delete"]) {
97+
deleters.push(key);
98+
}
99+
});
100+
return deleters;
101+
},
102+
103+
// checks that if the user to remove is an owner, there will still be another owner
104+
checkRemoveCollaborator: function(studyData, gid) {
105+
const ownerGids = this.__getDeleters(studyData);
106+
if (ownerGids.includes(gid.toString())) {
107+
return ownerGids.length > 1;
108+
}
109+
return true;
110+
},
111+
93112
removeCollaborator: function(studyData, gid) {
94113
return delete studyData["accessRights"][gid];
95114
},
@@ -109,6 +128,10 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", {
109128
members: {
110129
__resourceType: null,
111130

131+
_canIDelete: function() {
132+
return osparc.data.model.Study.canIDelete(this._serializedData["accessRights"]);
133+
},
134+
112135
_canIWrite: function() {
113136
return osparc.data.model.Study.canIWrite(this._serializedData["accessRights"]);
114137
},
@@ -193,11 +216,15 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", {
193216
},
194217

195218
_deleteMember: function(collaborator, item) {
196-
item.setEnabled(false);
219+
if (item) {
220+
item.setEnabled(false);
221+
}
197222
const success = this.self().removeCollaborator(this._serializedData, collaborator["gid"]);
198223
if (!success) {
199224
osparc.component.message.FlashMessenger.getInstance().logAs(this.tr("Something went wrong removing Member"), "ERROR");
200-
item.setEnabled(true);
225+
if (item) {
226+
item.setEnabled(true);
227+
}
201228
}
202229

203230
const params = {
@@ -216,7 +243,11 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", {
216243
osparc.component.message.FlashMessenger.getInstance().logAs(this.tr("Something went wrong removing Member"), "ERROR");
217244
console.error(err);
218245
})
219-
.finally(() => item.setEnabled(true));
246+
.finally(() => {
247+
if (item) {
248+
item.setEnabled(true);
249+
}
250+
});
220251
},
221252

222253
__make: function(collboratorGId, newAccessRights, successMsg, failureMsg, item) {

services/static-webserver/client/source/class/osparc/dashboard/StudyBrowser.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,11 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
362362
this.invalidateStudies();
363363
this.reloadResources();
364364
}, this);
365+
366+
qx.event.message.Bus.subscribe("reloadStudies", () => {
367+
this.invalidateStudies();
368+
this.reloadResources();
369+
}, this);
365370
},
366371

367372
reloadStudy: function(studyId) {

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,14 @@ qx.Class.define("osparc.data.Roles", {
8686
},
8787

8888
__createIntoFromRoles: function(roles) {
89-
const rolesLayout = new qx.ui.container.Composite(new qx.ui.layout.HBox(5).set({
90-
alignX: "right"
91-
})).set({
89+
const rolesLayout = new qx.ui.container.Composite(new qx.ui.layout.HBox(5)).set({
90+
alignY: "middle",
9291
paddingRight: 10
9392
});
93+
rolesLayout.add(new qx.ui.core.Spacer(), {
94+
flex: 1
95+
});
96+
9497
const rolesText = new qx.ui.basic.Label(qx.locale.Manager.tr("Roles")).set({
9598
font: "text-13"
9699
});

services/static-webserver/client/source/class/osparc/desktop/MainPage.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ qx.Class.define("osparc.desktop.MainPage", {
5757
const store = osparc.store.Store.getInstance();
5858

5959
osparc.data.Resources.dummy.getCreditsLeft()
60-
.then(credits => store.setCredits(credits.left))
60+
.then(data => {
61+
if (data && "credits" in data) {
62+
store.setCredits(data["credits"]["left"]);
63+
}
64+
})
6165
.catch(err => console.error(err));
6266
setInterval(() => store.setCredits(store.getCredits()-1), 60000);
6367

services/static-webserver/client/source/class/osparc/desktop/StudyEditor.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,9 @@ qx.Class.define("osparc.desktop.StudyEditor", {
466466
switch (newCtxt) {
467467
case "workbench":
468468
this.__viewsStack.setSelection([this.__workbenchView]);
469-
this.__workbenchView.nodeSelected(this.getStudy().getUi().getCurrentNodeId());
469+
if (this.getStudy() && this.getStudy().getUi()) {
470+
this.__workbenchView.nodeSelected(this.getStudy().getUi().getCurrentNodeId());
471+
}
470472
break;
471473
case "guided":
472474
case "app":

services/static-webserver/client/source/class/osparc/desktop/organizations/MembersList.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ qx.Class.define("osparc.desktop.organizations.MembersList", {
2525

2626
this._add(this.__createIntroText());
2727
this._add(this.__getMemberInvitation());
28-
this._add(osparc.data.Roles.createRolesOrgInfo());
28+
this._add(this.__getRolesToolbar());
2929
this._add(this.__getMembersFilter());
3030
this._add(this.__getMembersList(), {
3131
flex: 1
@@ -129,6 +129,10 @@ qx.Class.define("osparc.desktop.organizations.MembersList", {
129129
return hBox;
130130
},
131131

132+
__getRolesToolbar: function() {
133+
return osparc.data.Roles.createRolesOrgInfo();
134+
},
135+
132136
__getMembersFilter: function() {
133137
const filter = new osparc.component.filter.TextFilter("text", "organizationMembersList").set({
134138
allowStretchX: true,
@@ -207,9 +211,9 @@ qx.Class.define("osparc.desktop.organizations.MembersList", {
207211
return;
208212
}
209213

210-
const canWrite = orgModel.getAccessRights().getWrite();
214+
const canDelete = orgModel.getAccessRights().getDelete();
211215
this.__memberInvitation.set({
212-
visibility: canWrite ? "visible" : "excluded"
216+
visibility: canDelete ? "visible" : "excluded"
213217
});
214218

215219
const params = {
@@ -223,7 +227,7 @@ qx.Class.define("osparc.desktop.organizations.MembersList", {
223227
members.forEach(member => {
224228
member["thumbnail"] = osparc.utils.Avatar.getUrl(member["login"], 32);
225229
member["name"] = osparc.utils.Utils.firstsUp(member["first_name"], member["last_name"]);
226-
member["showOptions"] = canWrite;
230+
member["showOptions"] = canDelete;
227231
membersList.push(member);
228232
});
229233
membersList.sort(this.self().sortOrgMembers);

services/static-webserver/client/source/class/osparc/ui/list/CollaboratorListItem.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,17 @@ qx.Class.define("osparc.ui.list.CollaboratorListItem", {
116116
this.base(arguments, value);
117117
},
118118

119+
// overridden
120+
_applySubtitleMD: function(value) {
121+
this.base(arguments, value);
122+
123+
// highlight me
124+
const email = osparc.auth.Data.getInstance().getEmail();
125+
if (email === value) {
126+
this.addState("selected");
127+
}
128+
},
129+
119130
__applyAccessRights: function(value) {
120131
if (value === null) {
121132
return;

0 commit comments

Comments
 (0)