diff --git a/domain/space/endpoint.go b/domain/space/endpoint.go index cf0ca02e..888308e1 100644 --- a/domain/space/endpoint.go +++ b/domain/space/endpoint.go @@ -714,7 +714,7 @@ func (h *Handler) SetPermissions(w http.ResponseWriter, r *http.Request) { response.WriteEmpty(w) } -// GetPermissions returns permissions for the requested space, for all users. +// GetPermissions returns permissions for alll users for given space. func (h *Handler) GetPermissions(w http.ResponseWriter, r *http.Request) { method := "space.GetPermissions" ctx := domain.GetRequestContext(r) @@ -730,12 +730,21 @@ func (h *Handler) GetPermissions(w http.ResponseWriter, r *http.Request) { response.WriteServerError(w, method, err) return } - if len(perms) == 0 { perms = []space.Permission{} } - response.WriteJSON(w, perms) + userPerms := make(map[string][]space.Permission) + for _, p := range perms { + userPerms[p.WhoID] = append(userPerms[p.WhoID], p) + } + + records := []space.PermissionRecord{} + for _, up := range userPerms { + records = append(records, space.DecodeUserPermissions(up)) + } + + response.WriteJSON(w, records) } // GetUserPermissions returns permissions for the requested space, for current user. @@ -754,12 +763,12 @@ func (h *Handler) GetUserPermissions(w http.ResponseWriter, r *http.Request) { response.WriteServerError(w, method, err) return } - if len(perms) == 0 { perms = []space.Permission{} } - response.WriteJSON(w, perms) + record := space.DecodeUserPermissions(perms) + response.WriteJSON(w, record) } // AcceptInvitation records the fact that a user has completed space onboard process. diff --git a/domain/space/mysql/store.go b/domain/space/mysql/store.go index e14f9384..ec4a39aa 100644 --- a/domain/space/mysql/store.go +++ b/domain/space/mysql/store.go @@ -208,7 +208,7 @@ func (s Scope) AddPermission(ctx domain.RequestContext, r space.Permission) (err // AddPermissions inserts records into permission database table, one per action. func (s Scope) AddPermissions(ctx domain.RequestContext, r space.Permission, actions ...space.PermissionAction) (err error) { for _, a := range actions { - r.Action = string(a) + r.Action = a s.AddPermission(ctx, r) } @@ -242,12 +242,12 @@ func (s Scope) GetUserPermissions(ctx domain.RequestContext, spaceID string) (r func (s Scope) GetPermissions(ctx domain.RequestContext, spaceID string) (r []space.Permission, err error) { err = s.Runtime.Db.Select(&r, ` SELECT id, orgid, who, whoid, action, scope, location, refid - FROM permission WHERE orgid=? AND location='space' AND refid=? AND who='user' AND (whoid=? OR whoid='') + FROM permission WHERE orgid=? AND location='space' AND refid=? AND who='user' UNION ALL SELECT p.id, p.orgid, p.who, p.whoid, p.action, p.scope, p.location, p.refid FROM permission p LEFT JOIN rolemember r ON p.whoid=r.roleid WHERE p.orgid=? AND p.location='space' AND p.refid=? - AND p.who='role' AND (r.userid=? OR r.userid='')`, - ctx.OrgID, spaceID, ctx.UserID, ctx.OrgID, spaceID, ctx.OrgID) + AND p.who='role'`, + ctx.OrgID, spaceID, ctx.OrgID, spaceID) if err == sql.ErrNoRows { err = nil diff --git a/gui/app/components/document/sidebar-view-attachments.js b/gui/app/components/document/sidebar-view-attachments.js index 0075a97d..aa425eec 100644 --- a/gui/app/components/document/sidebar-view-attachments.js +++ b/gui/app/components/document/sidebar-view-attachments.js @@ -32,7 +32,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { didInsertElement() { this._super(...arguments); - if (!this.get('isEditor')) { + if (!this.get('permissions.documentEdit')) { return; } diff --git a/gui/app/components/document/tag-editor.js b/gui/app/components/document/tag-editor.js index 6ae93b7e..77753eeb 100644 --- a/gui/app/components/document/tag-editor.js +++ b/gui/app/components/document/tag-editor.js @@ -33,11 +33,11 @@ export default Ember.Component.extend({ } this.set('tagz', tagz); - this.set('canAdd', this.get('isEditor') && this.get('tagz').get('length') < 3); + this.set('canAdd', this.get('permissions.documentEdit') && this.get('tagz').get('length') < 3); }, didUpdateAttrs() { - this.set('canAdd', this.get('isEditor') && this.get('tagz').get('length') < 3); + this.set('canAdd', this.get('permissions.documentEdit') && this.get('tagz').get('length') < 3); }, didInsertElement() { diff --git a/gui/app/components/folder/documents-list.js b/gui/app/components/folder/documents-list.js index 8fbfb516..88100bed 100644 --- a/gui/app/components/folder/documents-list.js +++ b/gui/app/components/folder/documents-list.js @@ -21,7 +21,7 @@ export default Ember.Component.extend({ didReceiveAttrs() { this._super(...arguments); - this.set('canCreate', this.get('folderService').get('canEditCurrentFolder')); + this.set('canCreate', this.get('permissions.documentAdd')); this.set('deleteTargets', this.get('folders').rejectBy('id', this.get('folder.id'))); }, diff --git a/gui/app/components/folder/folder-heading.js b/gui/app/components/folder/folder-heading.js index 0d55d398..a2e7eaed 100644 --- a/gui/app/components/folder/folder-heading.js +++ b/gui/app/components/folder/folder-heading.js @@ -22,7 +22,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { folderName: '', hasNameError: computed.empty('folderName'), editMode: false, - isEditor: false, keyUp(e) { if (e.keyCode === 27) { // escape key diff --git a/gui/app/components/folder/folder-toolbar.js b/gui/app/components/folder/folder-toolbar.js index 79681996..2fd204ec 100644 --- a/gui/app/components/folder/folder-toolbar.js +++ b/gui/app/components/folder/folder-toolbar.js @@ -14,10 +14,6 @@ import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; import AuthMixin from '../../mixins/auth'; -const { - computed -} = Ember; - export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { folderService: Ember.inject.service('folder'), session: Ember.inject.service(), @@ -25,16 +21,11 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { showToolbar: false, folder: {}, busy: false, - isFolderOwner: computed.equal('folder.userId', 'session.user.id'), moveFolderId: "", drop: null, didReceiveAttrs() { - this.set('isFolderOwner', this.get('folder.userId') === this.get("session.user.id")); - - let show = this.get('session.authenticated') || this.get('isFolderOwner') || this.get('hasSelectedDocuments') || this.get('folderService').get('canEditCurrentFolder'); - this.set('showToolbar', show); - + console.log(this.get('permissions')); let targets = _.reject(this.get('folders'), { id: this.get('folder').get('id') }); @@ -44,11 +35,17 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { didRender() { if (this.get('hasSelectedDocuments')) { - this.addTooltip(document.getElementById("move-documents-button")); - this.addTooltip(document.getElementById("delete-documents-button")); + if (this.get('permissions.documentMove')) { + this.addTooltip(document.getElementById("move-documents-button")); + } + if (this.get('permissions.documentDelete')) { + this.addTooltip(document.getElementById("delete-documents-button")); + } } else { - if (this.get('isFolderOwner')) { + if (this.get('permissions.spaceOwner')) { this.addTooltip(document.getElementById("space-delete-button")); + } + if (this.get('permissions.spaceManage')) { this.addTooltip(document.getElementById("space-settings-button")); } } diff --git a/gui/app/components/folder/permission-admin.js b/gui/app/components/folder/permission-admin.js index f9df03cd..7ba4cd88 100644 --- a/gui/app/components/folder/permission-admin.js +++ b/gui/app/components/folder/permission-admin.js @@ -26,75 +26,62 @@ export default Ember.Component.extend(NotifierMixin, { this.get('userService').getAll().then((users) => { this.set('users', users); - var folderPermissions = []; + // set up users + let folderPermissions = []; users.forEach((user) => { let isActive = user.get('active'); let u = { - fullname: user.get('fullname'), orgId: this.get('folder.orgId'), - who: 'user', - whoId: user.get('id'), - location: 'space', - scope: 'object', - refId: this.get('folder.id'), + folderId: this.get('folder.id'), + userId: user.get('id'), + fullname: user.get('fullname'), spaceView: false, spaceManage: false, spaceOwner: false, - docAdd: false, - docEdit: false, - docDelete: false, - docMove: false, - docCopy: false, - docTemplate: false, + documentAdd: false, + documentEdit: false, + documentDelete: false, + documentMove: false, + documentCopy: false, + documentTemplate: false }; if (isActive) { - folderPermissions.pushObject(u); + let data = this.get('store').normalize('space-permission', u) + folderPermissions.pushObject(this.get('store').push(data)); } }); - var u = { - fullname: " Everyone", + // set up Everyone user + let u = { orgId: this.get('folder.orgId'), - who: 'user', - whoId: '', - location: 'space', - scope: 'object', - refId: this.get('folder.id'), + folderId: this.get('folder.id'), + userId: '', + fullname: ' Everyone', spaceView: false, spaceManage: false, spaceOwner: false, - docAdd: false, - docEdit: false, - docDelete: false, - docMove: false, - docCopy: false, - docTemplate: false, + documentAdd: false, + documentEdit: false, + documentDelete: false, + documentMove: false, + documentCopy: false, + documentTemplate: false }; - folderPermissions.pushObject(u); + let data = this.get('store').normalize('space-permission', u) + folderPermissions.pushObject(this.get('store').push(data)); this.get('folderService').getPermissions(this.get('folder.id')).then((permissions) => { permissions.forEach((permission, index) => { // eslint-disable-line no-unused-vars - var folderPermission = folderPermissions.findBy('userId', permission.get('userId')); - if (is.not.undefined(folderPermission)) { - Ember.setProperties(folderPermission, { - orgId: permission.get('orgId'), - folderId: permission.get('folderId'), - canEdit: permission.get('canEdit'), - canView: permission.get('canView'), - canViewPrevious: permission.get('canView') - }); + let user = folderPermissions.findBy('userId', permission.get('userId')); + if (is.not.undefined(user)) { + Ember.setProperties(user, permission); } }); - folderPermissions.map((permission) => { - let data = this.get('store').normalize('folder-permission', permission); - return this.get('store').push(data); - }); - this.set('permissions', folderPermissions.sortBy('fullname')); }); }); @@ -107,48 +94,44 @@ export default Ember.Component.extend(NotifierMixin, { actions: { setPermissions() { let message = this.getDefaultInvitationMessage(); - let folder = this.get('folder'); + // let folder = this.get('folder'); let permissions = this.get('permissions'); - this.get('permissions').forEach((permission, index) => { // eslint-disable-line no-unused-vars - Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked')); - Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked')); + permissions.forEach((permission, index) => { // eslint-disable-line no-unused-vars + Ember.set(permission, 'spaceView', $("#space-role-view-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'spaceManage', $("#space-role-manage-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'spaceOwner', $("#space-role-owner-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'documentAdd', $("#doc-role-add-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'documentEdit', $("#doc-role-edit-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'documentDelete', $("#doc-role-delete-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'documentMove', $("#doc-role-move-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'documentCopy', $("#doc-role-copy-" + permission.get('userId')).prop('checked')); + Ember.set(permission, 'documentTemplate', $("#doc-role-template-" + permission.get('userId')).prop('checked')); }); - var data = permissions.map((obj) => { - let permission = { - 'orgId': obj.orgId, - 'folderId': obj.folderId, - 'userId': obj.userId, - 'canEdit': obj.canEdit, - 'canView': obj.canView - }; + let payload = { Message: message, Permissions: permissions }; + console.log(payload); - return permission; - }); + // this.get('folderService').savePermissions(folder.get('id'), payload).then(() => { + // this.showNotification('Saved permissions'); + // }); - var payload = { Message: message, Roles: data }; + // var hasEveryone = _.find(data, function (permission) { + // return permission.userId === "" && (permission.canView || permission.canEdit); + // }); - this.get('folderService').savePermissions(folder.get('id'), payload).then(() => { - this.showNotification('Saved permissions'); - }); + // if (is.not.undefined(hasEveryone)) { + // folder.markAsPublic(); + // } else { + // if (data.length > 1) { + // folder.markAsRestricted(); + // } else { + // folder.markAsPrivate(); + // } + // } - var hasEveryone = _.find(data, function (permission) { - return permission.userId === "" && (permission.canView || permission.canEdit); - }); - - if (is.not.undefined(hasEveryone)) { - folder.markAsPublic(); - } else { - if (data.length > 1) { - folder.markAsRestricted(); - } else { - folder.markAsPrivate(); - } - } - - this.get('folderService').save(folder).then(function () { - }); + // this.get('folderService').save(folder).then(function () { + // }); } } }); diff --git a/gui/app/models/folder-permission.js b/gui/app/models/folder-permission.js index 58f01b04..9ff8fd8a 100644 --- a/gui/app/models/folder-permission.js +++ b/gui/app/models/folder-permission.js @@ -11,13 +11,12 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -// import { belongsTo, hasMany } from 'ember-data/relationships'; +import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ orgId: attr('string'), folderId: attr('string'), userId: attr('string'), fullname: attr('string'), - canView: attr('boolean', { defaultValue: false }), - canEdit: attr('boolean', { defaultValue: false }) + permissions: belongsTo('space-permission') }); diff --git a/gui/app/models/user-permission.js b/gui/app/models/space-permission.js similarity index 59% rename from gui/app/models/user-permission.js rename to gui/app/models/space-permission.js index 9ca130bb..3ca7342f 100644 --- a/gui/app/models/user-permission.js +++ b/gui/app/models/space-permission.js @@ -15,10 +15,17 @@ import attr from 'ember-data/attr'; export default Model.extend({ orgId: attr('string'), - who: attr('string'), - whoId: attr('string'), - action: attr('string'), - scope: attr('string'), - location: attr('string'), - refId: attr('string') + folderId: attr('string'), + userId: attr('string'), + fullname: attr('string'), // client-side usage only, not from API + + spaceView: attr('boolean'), + spaceManage: attr('boolean'), + spaceOwner: attr('boolean'), + documentAdd: attr('boolean'), + documentEdit: attr('boolean'), + documentDelete: attr('boolean'), + documentMove: attr('boolean'), + documentCopy: attr('boolean'), + documentTemplate: attr('boolean') }); diff --git a/gui/app/pods/document/index/route.js b/gui/app/pods/document/index/route.js index 801db9cd..f1155e38 100644 --- a/gui/app/pods/document/index/route.js +++ b/gui/app/pods/document/index/route.js @@ -30,7 +30,7 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { pages: this.get('documentService').getPages(this.modelFor('document').document.get('id')), links: this.modelFor('document').links, sections: this.modelFor('document').sections, - isEditor: this.get('folderService').get('canEditCurrentFolder') + permissions: this.get('folderService').get('permissions') }); } }); diff --git a/gui/app/pods/document/index/template.hbs b/gui/app/pods/document/index/template.hbs index 0d1ab648..d75dcb78 100644 --- a/gui/app/pods/document/index/template.hbs +++ b/gui/app/pods/document/index/template.hbs @@ -1,9 +1,10 @@ {{#layout/zone-container}} {{#layout/zone-sidebar}} {{document/sidebar-zone folders=model.folders folder=model.folder document=model.document - pages=model.pages sections=model.section links=model.links isEditor=model.isEditor tab=tab + pages=model.pages sections=model.section links=model.links permissions=model.permissions tab=tab onDocumentDelete=(action 'onDocumentDelete') onSaveTemplate=(action 'onSaveTemplate') - onPageSequenceChange=(action 'onPageSequenceChange') onPageLevelChange=(action 'onPageLevelChange') onGotoPage=(action 'onGotoPage')}} + onPageSequenceChange=(action 'onPageSequenceChange') onPageLevelChange=(action 'onPageLevelChange') + onGotoPage=(action 'onGotoPage')}} {{/layout/zone-sidebar}} {{#layout/zone-content}}
Are you sure you want to delete this document?
There is no undo, so be careful.
{{/dropdown-dialog}} + {{/if}} + {{/if}} + {{#if permissions.documentTemplate}} + {{#if menuOpen}} {{#dropdown-dialog target="save-template-button" position="bottom left" button="Save as Template" color="flat-green" onAction=(action 'onSaveTemplate') focusOn="new-template-name" }}