1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-19 13:19:43 +02:00

implemented view users permission

This commit is contained in:
Harvey Kandola 2017-10-04 12:27:56 -04:00
parent f5f30d2322
commit 30321781c2
13 changed files with 423 additions and 388 deletions

View file

@ -110,7 +110,7 @@ func (h *Handler) Login(w http.ResponseWriter, r *http.Request) {
return return
} }
h.Runtime.Log.Info("login " + email + " @ " + dom) h.Runtime.Log.Info("logged in " + email + " @ " + dom)
authModel := auth.AuthenticationModel{} authModel := auth.AuthenticationModel{}
authModel.Token = GenerateJWT(h.Runtime, u.RefID, org.RefID, dom) authModel.Token = GenerateJWT(h.Runtime, u.RefID, org.RefID, dom)

View file

@ -1,51 +1,51 @@
{{#if folders}} <div class="page-customize">
<div class="space-admin">
<div class="global-folder-settings"> {{#if folders}}
<div class="form-header"> <div class="form-header">
<div class="title">{{folders.length}} shared {{label}}</div> <div class="title">{{folders.length}} shared {{label}}</div>
<div class="tip">View and change shared space ownership</div> <div class="tip">View and change shared space ownership</div>
</div> </div>
<div class="input-control manage-space-list"> <div class="input-control manage-space-list">
{{#each folders as |folder|}} {{#each folders as |folder|}}
<div class="space pull-left width-80"> <div class="space pull-left width-80">
{{#link-to 'folder' folder.id folder.slug class="alt"}}{{folder.name}}{{/link-to}} {{#link-to 'folder' folder.id folder.slug class="alt"}}{{folder.name}}{{/link-to}}
</div> </div>
<div class="pull-right"> <div class="pull-right">
<div id="delete-space-button-{{folder.id}}" class="round-button-mono" title="Delete" {{action "onShow" folder.id}}> <div id="delete-space-button-{{folder.id}}" class="round-button-mono" title="Delete" {{action "onShow" folder.id}}>
<i class="material-icons">delete</i> <i class="material-icons">delete</i>
</div>
</div>
<div class="clearfix" />
{{/each}}
</div>
<div class="dropdown-dialog delete-space-dialog">
<div class="content">
<p>Are you sure you want to delete this space and all associated documents?</p>
<div class="input-control">
<div class="tip">Please type the space name to confirm</div>
{{input type='text' id="delete-space-name" value=deleteSpace.name}}
</div> </div>
</div> </div>
<div class="clearfix" /> <div class="actions">
{{/each}} <div class="flat-button" {{action 'onCancel'}}>
</div> cancel
</div> </div>
<div class="flat-button flat-red" {{action 'onDelete'}}>
<div class="dropdown-dialog delete-space-dialog"> delete
<div class="content"> </div>
<p>Are you sure you want to delete this space and all associated documents?</p> </div>
<div class="input-control"> <div class="clearfix"></div>
<div class="tip">Please type the space name to confirm</div>
{{input type='text' id="delete-space-name" value=deleteSpace.name}}
</div> </div>
</div>
<div class="actions"> {{else}}
<div class="flat-button" {{action 'onCancel'}}>
cancel <div class="form-header">
<div class="title">{{folders.length}} shared {{label}}</div>
<div class="tip">There are no spaces to maintain</div>
</div> </div>
<div class="flat-button flat-red" {{action 'onDelete'}}>
delete {{/if}}
</div>
</div>
<div class="clearfix"></div>
</div> </div>
</div>
{{else}}
<div class="global-folder-settings">
<div class="form-header">
<div class="title">{{folders.length}} shared {{label}}</div>
<div class="tip">There are no spaces to maintain</div>
</div>
</div>
{{/if}}

View file

@ -1,5 +1,3 @@
{{customize/user-settings add=(action 'add')}} {{customize/user-settings add=(action 'add')}}
<div class="clearfix" />
{{customize/user-admin users=model onDelete=(action "onDelete") onSave=(action "onSave") onPassword=(action "onPassword")}} {{customize/user-admin users=model onDelete=(action "onDelete") onSave=(action "onSave") onPassword=(action "onPassword")}}

View file

@ -15,7 +15,7 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout
export default Ember.Route.extend(AuthenticatedRouteMixin, { export default Ember.Route.extend(AuthenticatedRouteMixin, {
beforeModel: function (transition) { beforeModel: function (transition) {
if (is.equal(transition.targetName, 'folder.settings.index')) { if (is.equal(transition.targetName, 'folder.settings.index')) {
this.transitionTo('folder.settings.invitation'); this.transitionTo('folder.settings.security');
} }
}, },

View file

@ -42,7 +42,7 @@ export default AjaxService.extend({
if (is.not.empty(userUpdate)) { if (is.not.empty(userUpdate)) {
let latest = JSON.parse(userUpdate); let latest = JSON.parse(userUpdate);
if (!latest.active || user.editor !== latest.editor || user.admin !== latest.admin) { if (!latest.active || user.editor !== latest.editor || user.admin !== latest.admin || user.viewUsers !== latest.viewUsers) {
window.location.href = 'auth/login'; window.location.href = 'auth/login';
} }
} }

View file

@ -26,12 +26,15 @@ export default SimpleAuthSession.extend({
currentFolder: null, currentFolder: null,
isMac: false, isMac: false,
isMobile: false, isMobile: false,
hasAccounts: computed('isAuthenticated', 'session.content.authenticated.user', function() { hasAccounts: computed('isAuthenticated', 'session.content.authenticated.user', function() {
return this.get('session.authenticator') !== 'authenticator:anonymous' && this.get('session.content.authenticated.user.accounts').length > 0; return this.get('session.authenticator') !== 'authenticator:anonymous' && this.get('session.content.authenticated.user.accounts').length > 0;
}), }),
accounts: computed('hasAccounts', function() { accounts: computed('hasAccounts', function() {
return this.get('session.content.authenticated.user.accounts'); return this.get('session.content.authenticated.user.accounts');
}), }),
user: computed('isAuthenticated', 'session.content.authenticated.user', function () { user: computed('isAuthenticated', 'session.content.authenticated.user', function () {
if (this.get('isAuthenticated')) { if (this.get('isAuthenticated')) {
let user = this.get('session.content.authenticated.user') || { id: '0' }; let user = this.get('session.content.authenticated.user') || { id: '0' };
@ -39,28 +42,32 @@ export default SimpleAuthSession.extend({
return this.get('store').push(data); return this.get('store').push(data);
} }
}), }),
authenticated: computed('session.content.authenticated.user', function () { authenticated: computed('session.content.authenticated.user', function () {
return this.get('session.authenticator') !== 'authenticator:anonymous' && this.get('session.content.authenticated.user.id') !== '0'; return this.get('session.authenticator') !== 'authenticator:anonymous' && this.get('session.content.authenticated.user.id') !== '0';
}), }),
isAdmin: computed('session.content.authenticated.user', function () { isAdmin: computed('session.content.authenticated.user', function () {
return this.get('session.authenticator') !== 'authenticator:anonymous' && return this.get('session.authenticator') !== 'authenticator:anonymous' &&
this.get('session.content.authenticated.user.id') !== '0' && this.get('session.content.authenticated.user.id') !== '0' &&
this.get('session.content.authenticated.user.admin') === true; this.get('session.content.authenticated.user.admin') === true;
}), }),
isEditor: computed('session.content.authenticated.user', function () { isEditor: computed('session.content.authenticated.user', function () {
return this.get('session.authenticator') !== 'authenticator:anonymous' && return this.get('session.authenticator') !== 'authenticator:anonymous' &&
this.get('session.content.authenticated.user.id') !== '0' && this.get('session.content.authenticated.user.id') !== '0' &&
this.get('session.content.authenticated.user.editor') === true; this.get('session.content.authenticated.user.editor') === true;
}), }),
isGlobalAdmin: computed('session.content.authenticated.user', function () { isGlobalAdmin: computed('session.content.authenticated.user', function () {
return this.get('session.authenticator') !== 'authenticator:anonymous' && return this.get('session.authenticator') !== 'authenticator:anonymous' &&
this.get('session.content.authenticated.user.id') !== '0' && this.get('session.content.authenticated.user.id') !== '0' &&
this.get('session.content.authenticated.user.global') === true; this.get('session.content.authenticated.user.global') === true;
}), }),
init() { init() {
this._super(...arguments); this._super(...arguments);
this.set('isMac', is.mac()); this.set('isMac', is.mac());
this.set('isMobile', is.mobile()); this.set('isMobile', is.mobile());
}, },

View file

@ -1,7 +1,16 @@
.page-customize { .page-customize {
@include content-container();
.user-admin { > .auth-admin, > .general-admin, > .license-admin, > .smtp-admin, > .space-admin {
@include content-container();
}
> .add-user {
@include content-container();
margin-bottom: 50px;
}
> .user-admin {
@include content-container();
margin: 30px 0; margin: 30px 0;
> .heading { > .heading {

View file

@ -1,72 +1,76 @@
<form class=> <div class="page-customize">
<div class="form-header"> <div class="auth-admin">
<div class="title">Authentication</div> <form>
<div class="tip">Determine the method for user authentication</div> <div class="form-header">
</div> <div class="title">Authentication</div>
<div class="input-control"> <div class="tip">Determine the method for user authentication</div>
<label>Provider</label> </div>
<div class="tip">External authentication servers, services must be accessible from the server running this Documize instance</div> <div class="input-control">
{{#ui/ui-radio selected=isDocumizeProvider onClick=(action 'onDocumize')}}Documize &mdash; email/password{{/ui/ui-radio}} <label>Provider</label>
{{#ui/ui-radio selected=isKeycloakProvider onClick=(action 'onKeycloak')}}Keycloak &mdash; bring your own authentication server{{/ui/ui-radio}} <div class="tip">External authentication servers, services must be accessible from the server running this Documize instance</div>
</div> {{#ui/ui-radio selected=isDocumizeProvider onClick=(action 'onDocumize')}}Documize &mdash; email/password{{/ui/ui-radio}}
{{#ui/ui-radio selected=isKeycloakProvider onClick=(action 'onKeycloak')}}Keycloak &mdash; bring your own authentication server{{/ui/ui-radio}}
</div>
{{#if isKeycloakProvider}} {{#if isKeycloakProvider}}
<div class="form-header"> <div class="form-header">
<div class="title">Keycloak Configuration</div> <div class="title">Keycloak Configuration</div>
<div class="tip">Connection parameters &mdash; create a documize user in Master realm with 'manage-users' role against target realm</div> <div class="tip">Connection parameters &mdash; create a documize user in Master realm with 'manage-users' role against target realm</div>
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak Server URL</label> <label>Keycloak Server URL</label>
<div class="tip">e.g. http://localhost:8888/auth</div> <div class="tip">e.g. http://localhost:8888/auth</div>
{{focus-input id="keycloak-url" type="text" value=keycloakConfig.url class=(if KeycloakUrlError 'error')}} {{focus-input id="keycloak-url" type="text" value=keycloakConfig.url class=(if KeycloakUrlError 'error')}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak Realm</label> <label>Keycloak Realm</label>
<div class="tip">e.g. main</div> <div class="tip">e.g. main</div>
{{input id="keycloak-realm" type="text" value=keycloakConfig.realm class=(if keycloakRealmError 'error')}} {{input id="keycloak-realm" type="text" value=keycloakConfig.realm class=(if keycloakRealmError 'error')}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak Realm Public Key</label> <label>Keycloak Realm Public Key</label>
<div class="tip">Copy the RSA Public Key from Realm Settings &rarr; Keys</div> <div class="tip">Copy the RSA Public Key from Realm Settings &rarr; Keys</div>
{{textarea id="keycloak-publicKey" type="text" value=keycloakConfig.publicKey rows=7 class=(if KeycloakPublicKeyError 'error')}} {{textarea id="keycloak-publicKey" type="text" value=keycloakConfig.publicKey rows=7 class=(if KeycloakPublicKeyError 'error')}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak OIDC Client ID</label> <label>Keycloak OIDC Client ID</label>
<div class="tip">e.g. account</div> <div class="tip">e.g. account</div>
{{input id="keycloak-clientId" type="text" value=keycloakConfig.clientId class=(if KeycloakClientIdError 'error')}} {{input id="keycloak-clientId" type="text" value=keycloakConfig.clientId class=(if KeycloakClientIdError 'error')}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak Group ID (Optional)</label> <label>Keycloak Group ID (Optional)</label>
<div class="tip">If you want to sync users in a particular Group (e.g. 'Documize Users'), provide the Group ID (e.g. 511d8b61-1ec8-45f6-bc8d-5de64d54c9d2)</div> <div class="tip">If you want to sync users in a particular Group (e.g. 'Documize Users'), provide the Group ID (e.g. 511d8b61-1ec8-45f6-bc8d-5de64d54c9d2)</div>
{{input id="keycloak-group" type="text" value=keycloakConfig.group}} {{input id="keycloak-group" type="text" value=keycloakConfig.group}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak Username</label> <label>Keycloak Username</label>
<div class="tip">Used to connect with Keycloak and sync users with Documize (create user under Master Realm and assign 'view-users' role against Realm specified above)</div> <div class="tip">Used to connect with Keycloak and sync users with Documize (create user under Master Realm and assign 'view-users' role against Realm specified above)</div>
{{input id="keycloak-admin-user" type="text" value=keycloakConfig.adminUser class=(if KeycloakAdminUserError 'error')}} {{input id="keycloak-admin-user" type="text" value=keycloakConfig.adminUser class=(if KeycloakAdminUserError 'error')}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Keycloak Password</label> <label>Keycloak Password</label>
<div class="tip">Used to connect with Keycloak and sync users with Documize</div> <div class="tip">Used to connect with Keycloak and sync users with Documize</div>
{{input id="keycloak-admin-password" type="password" value=keycloakConfig.adminPassword class=(if KeycloakAdminPasswordError 'error')}} {{input id="keycloak-admin-password" type="password" value=keycloakConfig.adminPassword class=(if KeycloakAdminPasswordError 'error')}}
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Disable Logout</label> <label>Disable Logout</label>
<div class="tip">Hide the logout button for Keycloak users</div> <div class="tip">Hide the logout button for Keycloak users</div>
<div class="checkbox"> <div class="checkbox">
{{input type="checkbox" checked=keycloakConfig.disableLogout}} {{input type="checkbox" checked=keycloakConfig.disableLogout}}
<label for="allowAnonymousAccess">Do not show logout button</label> <label for="allowAnonymousAccess">Do not show logout button</label>
</div> </div>
</div> </div>
<div class="input-control"> <div class="input-control">
<label>Grant Add Space Permission</label> <label>Grant Add Space Permission</label>
<div class="tip">Determine if Keycloak sync'ed users permission to add new spaces</div> <div class="tip">Determine if Keycloak sync'ed users permission to add new spaces</div>
<div class="checkbox"> <div class="checkbox">
{{input type="checkbox" checked=keycloakConfig.defaultPermissionAddSpace}} {{input type="checkbox" checked=keycloakConfig.defaultPermissionAddSpace}}
<label for="allowAnonymousAccess">Can add spaces</label> <label for="allowAnonymousAccess">Can add spaces</label>
</div> </div>
</div> </div>
{{/if}} {{/if}}
<div class="regular-button button-blue" {{action 'onSave'}}>save</div> <div class="regular-button button-blue" {{action 'onSave'}}>save</div>
</form> </form>
</div>
</div>

View file

@ -1,30 +1,34 @@
<form> <div class="page-customize">
<div class="form-header"> <div class="general-admin">
<div class="title">Instance Settings</div> <form>
<div class="tip">Settings applicable to your Documize instance</div> <div class="form-header">
</div> <div class="title">Instance Settings</div>
<div class="input-control"> <div class="tip">Settings applicable to your Documize instance</div>
<label>Title</label> </div>
<div class="tip">Describe the title of this Documize instance</div> <div class="input-control">
{{focus-input id="siteTitle" type="text" value=model.general.title class=(if hasTitleInputError 'error')}} <label>Title</label>
</div> <div class="tip">Describe the title of this Documize instance</div>
<div class="input-control"> {{focus-input id="siteTitle" type="text" value=model.general.title class=(if hasTitleInputError 'error')}}
<label>Message</label> </div>
<div class="tip">Describe the purpose of this Documize instance</div> <div class="input-control">
{{textarea id="siteMessage" rows="3" value=model.general.message class=(if hasMessageInputError 'error')}} <label>Message</label>
</div> <div class="tip">Describe the purpose of this Documize instance</div>
<div class="input-control"> {{textarea id="siteMessage" rows="3" value=model.general.message class=(if hasMessageInputError 'error')}}
<label>Anonymous Access</label> </div>
<div class="tip">Content within "Everyone" will be made available to anonymous users</div> <div class="input-control">
<div class="checkbox"> <label>Anonymous Access</label>
<input type="checkbox" id="allowAnonymousAccess" checked={{model.general.allowAnonymousAccess}} /> <div class="tip">Content within "Everyone" will be made available to anonymous users</div>
<label for="allowAnonymousAccess">Allow anyone to access this Documize instance</label> <div class="checkbox">
</div> <input type="checkbox" id="allowAnonymousAccess" checked={{model.general.allowAnonymousAccess}} />
</div> <label for="allowAnonymousAccess">Allow anyone to access this Documize instance</label>
<div class="input-control"> </div>
<label>Conversion Service URL</label> </div>
<div class="tip">Endpoint for handling import/export (e.g. https://api.documize.com, <a href="https://docs.documize.com/s/WNEpptWJ9AABRnha/administration-guides/d/WO0pt_MXigAB6sJ7/general-options">view documentation</a>)</div> <div class="input-control">
{{focus-input id="conversionEndpoint" type="text" value=model.general.conversionEndpoint class=(if hasConversionEndpointInputError 'error')}} <label>Conversion Service URL</label>
<div class="tip">Endpoint for handling import/export (e.g. https://api.documize.com, <a href="https://docs.documize.com/s/WNEpptWJ9AABRnha/administration-guides/d/WO0pt_MXigAB6sJ7/general-options">view documentation</a>)</div>
{{focus-input id="conversionEndpoint" type="text" value=model.general.conversionEndpoint class=(if hasConversionEndpointInputError 'error')}}
</div>
<div class="regular-button button-blue" {{ action 'save' }}>save</div>
</form>
</div> </div>
<div class="regular-button button-blue" {{ action 'save' }}>save</div> </div>
</form>

View file

@ -1,48 +1,53 @@
<form> <div class="page-customize">
<div class="form-header"> <div class="smtp-admin">
<div class="title">Mail Server Settings</div> <form>
<div class="tip">Used for sending email notifications</div> <div class="form-header">
</div> <div class="title">Mail Server Settings</div>
<div class="input-control"> <div class="tip">Used for sending email notifications</div>
<label>SMTP Host</label> </div>
<div class="tip">e.g. my.host.com</div> <div class="input-control">
{{focus-input id="smtp-host" type="text" value=model.smtp.host class=(if SMTPHostEmptyError 'error')}} <label>SMTP Host</label>
</div> <div class="tip">e.g. my.host.com</div>
<div class="input-control"> {{focus-input id="smtp-host" type="text" value=model.smtp.host class=(if SMTPHostEmptyError 'error')}}
<label>SMTP Port</label> </div>
<div class="tip">e.g. 587</div> <div class="input-control">
{{input id="smtp-port" type="text" value=model.smtp.port class=(if SMTPPortEmptyError 'error')}} <label>SMTP Port</label>
</div> <div class="tip">e.g. 587</div>
<div class="input-control"> {{input id="smtp-port" type="text" value=model.smtp.port class=(if SMTPPortEmptyError 'error')}}
<label>SMTP Sender</label> </div>
<div class="tip">e.g. noreply@documize.com</div> <div class="input-control">
{{input id="smtp-sender" type="text" value=model.smtp.sender class=(if SMTPSenderEmptyError 'error')}} <label>SMTP Sender</label>
</div> <div class="tip">e.g. noreply@documize.com</div>
<div class="input-control"> {{input id="smtp-sender" type="text" value=model.smtp.sender class=(if SMTPSenderEmptyError 'error')}}
<label>SMTP User ID</label> </div>
<div class="tip">Your credentials</div> <div class="input-control">
{{input id="smtp-userid" type="text" value=model.smtp.userid class=(if SMTPUserIdEmptyError 'error')}} <label>SMTP User ID</label>
</div> <div class="tip">Your credentials</div>
<div class="input-control"> {{input id="smtp-userid" type="text" value=model.smtp.userid class=(if SMTPUserIdEmptyError 'error')}}
<label>SMTP Password</label> </div>
<div class="tip">Your credentials</div> <div class="input-control">
{{input id="smtp-password" type="text" value=model.smtp.password class=(if SMTPPasswordEmptyError 'error')}} <label>SMTP Password</label>
</div> <div class="tip">Your credentials</div>
<div class="regular-button button-blue" {{ action 'saveSMTP' }}>save</div> {{input id="smtp-password" type="text" value=model.smtp.password class=(if SMTPPasswordEmptyError 'error')}}
</form> </div>
<div class="regular-button button-blue" {{ action 'saveSMTP' }}>save</div>
</form>
</div>
<div class="margin-top-50"> <div class="margin-top-50" />
<div class="license-admin">
<form class="form-bordered">
<div class="form-header">
<div class="title">Optional Edition License</div>
<div class="tip">Only applies to Enterprise Edition</div>
</div>
<div class="input-control">
<label>License</label>
<div class="tip">XML format accepted</div>
{{textarea value=model.license rows="15"}}
</div>
<div class="regular-button button-blue" {{ action 'saveLicense' }}>save</div>
</form>
</div>
</div> </div>
<form class="form-bordered">
<div class="form-header">
<div class="title">Optional Edition License</div>
<div class="tip">Only applies to Enterprise Edition</div>
</div>
<div class="input-control">
<label>License</label>
<div class="tip">XML format accepted</div>
{{textarea value=model.license rows="15"}}
</div>
<div class="regular-button button-blue" {{ action 'saveLicense' }}>save</div>
</form>

View file

@ -1,169 +1,171 @@
<div class="user-admin"> <div class="page-customize">
<div class="form-header"> <div class="user-admin">
<div class="title">User Management</div> <div class="form-header">
<div class="tip">Set basic information, passwords and permissions for {{users.length}} users</div> <div class="title">User Management</div>
<div class="tip">Set basic information, passwords and permissions for {{users.length}} users</div>
</div>
<table class="basic-table">
<thead>
<tr>
<th class="">
<div class="input-inline input-transparent">
{{focus-input type="text" placeholder="< type here to filter users >" value=filter}}
</div>
</th>
<th class="no-width">Add Space</th>
<th class="no-width">View Users</th>
<th class="no-width">Admin</th>
<th class="no-width">Active</th>
<th class="no-width">
{{#if hasSelectedUsers}}
<div class="round-button round-button-small button-red" id="bulk-delete-users">
<i class="material-icons">delete</i>
</div>
{{#dropdown-dialog target="bulk-delete-users" position="bottom right" button="Delete" color="flat-red" onAction=(action 'onBulkDelete')}}
<p>Are you sure you want to delete selected users?</p>
{{/dropdown-dialog}}
{{/if}}
</th>
</tr>
</thead>
<tbody>
{{#each users key="id" as |user|}}
<tr>
<td class="{{unless user.active 'inactive-user'}} {{if user.admin 'admin-user'}}">
<div class="selector pull-left">
{{#if user.me}}
<i class="material-icons color-gray">check_box_outline_blank</i>
{{else if user.selected}}
<i class="material-icons checkbox" {{action 'toggleSelect' user}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleSelect' user}}>check_box_outline_blank</i>
{{/if}}
</div>
<div class="name">{{ user.fullname }}</div>
<div class="email">{{ user.email }}</div>
</td>
<td class="no-width text-center">
{{#if user.editor}}
<i class="material-icons checkbox" {{action 'toggleEditor' user.id}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleEditor' user.id}}>check_box_outline_blank</i>
{{/if}}
</td>
<td class="no-width text-center">
{{#if user.viewUsers}}
<i class="material-icons checkbox" {{action 'toggleUsers' user.id}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleUsers' user.id}}>check_box_outline_blank</i>
{{/if}}
</td>
<td class="no-width text-center">
{{#if user.me}}
<i class="material-icons color-gray">check_box</i>
{{else if user.admin}}
<i class="material-icons checkbox" {{action 'toggleAdmin' user.id}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleAdmin' user.id}}>check_box_outline_blank</i>
{{/if}}
</td>
<td class="no-width text-center">
{{#if user.me}}
<i class="material-icons color-gray">check_box</i>
{{else if user.active}}
<i class="material-icons checkbox" {{action 'toggleActive' user.id}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleActive' user.id}}>check_box_outline_blank</i>
{{/if}}
</td>
<td class="no-width text-center">
{{#if user.me}}
<div class="edit-button-{{user.id}} round-button-mono" title="Edit" {{action "edit" user.id}}>
<i class="material-icons">edit</i>
</div>
{{else}}
<div class="edit-button-{{user.id}} round-button-mono" title="Edit" {{action "edit" user.id}}>
<i class="material-icons">edit</i>
</div>
<div class="button-gap"></div>
<div class="delete-button-{{user.id}} round-button-mono" title="Delete" {{action "confirmDelete" user.id}}>
<i class="material-icons">delete</i>
</div>
{{/if}}
</td>
</tr>
{{/each}}
</tbody>
</table>
</div> </div>
<table class="basic-table"> <div class="dropdown-dialog edit-user-dialog">
<thead> <div class="content">
<tr> <form>
<th class=""> <div class="row">
<div class="input-inline input-transparent"> <div class="col-md-6">
{{focus-input type="text" placeholder="< type here to filter users >" value=filter}} <div class="input-control">
</div> <label>Firstname</label>
</th> {{input id="edit-firstname" type="text" value=editUser.firstname}}
<th class="no-width">Add Space</th> </div>
<th class="no-width">View Users</th> </div>
<th class="no-width">Admin</th> <div class="col-md-6">
<th class="no-width">Active</th> <div class="input-control">
<th class="no-width"> <label>Lastname</label>
{{#if hasSelectedUsers}} {{input id="edit-lastname" type="text" value=editUser.lastname}}
<div class="round-button round-button-small button-red" id="bulk-delete-users"> </div>
<i class="material-icons">delete</i> </div>
</div> </div>
{{#dropdown-dialog target="bulk-delete-users" position="bottom right" button="Delete" color="flat-red" onAction=(action 'onBulkDelete')}} <div class="row">
<p>Are you sure you want to delete selected users?</p> <div class="col-md-12">
{{/dropdown-dialog}} <div class="input-control">
{{/if}} <label>Email</label>
</th> {{input id="edit-email" type="text" value=editUser.email}}
</tr> </div>
</thead> </div>
<tbody> </div>
{{#each users as |user|}} {{#if isAuthProviderDocumize}}
<tr> <div class="row">
<td class="{{unless user.active 'inactive-user'}} {{if user.admin 'admin-user'}}"> <div class="col-md-6">
<div class="selector pull-left"> <div class="input-control">
{{#if user.selected}} <label>Password</label>
<i class="material-icons checkbox" {{action 'toggleSelect' user}}>check_box</i> <div class="tip">Optional new password</div>
{{else if user.me}} {{input id="edit-password" type="password" value=password.password}}
<i class="material-icons color-gray">check_box_outline_blank</i> </div>
{{else}} </div>
<i class="material-icons checkbox" {{action 'toggleSelect' user}}>check_box_outline_blank</i> <div class="col-md-6">
{{/if}} <div class="input-control">
</div> <label>Confirm Password</label>
<div class="name">{{ user.fullname }}</div> <div class="tip">Confirm new password</div>
<div class="email">{{ user.email }}</div> {{input id="edit-confirmPassword" type="password" value=password.confirmation}}
</td> </div>
<td class="no-width text-center"> </div>
{{#if user.editor}} </div>
<i class="material-icons checkbox" {{action 'toggleEditor' user.id}}>check_box</i> {{/if}}
{{else}} </form>
<i class="material-icons checkbox" {{action 'toggleEditor' user.id}}>check_box_outline_blank</i> </div>
{{/if}} <div class="actions">
</td> <div class="flat-button" {{action 'cancel'}}>
<td class="no-width text-center"> cancel
{{#if user.viewUsers}} </div>
<i class="material-icons checkbox" {{action 'toggleUsers' user.id}}>check_box</i> <div class="flat-button flat-blue" {{action 'save'}}>
{{else}} save
<i class="material-icons checkbox" {{action 'toggleUsers' user.id}}>check_box_outline_blank</i> </div>
{{/if}} </div>
</td> <div class="clearfix"></div>
<td class="no-width text-center"> </div>
{{#if user.me}}
<i class="material-icons color-gray">check_box</i>
{{else if user.admin}}
<i class="material-icons checkbox" {{action 'toggleAdmin' user.id}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleAdmin' user.id}}>check_box_outline_blank</i>
{{/if}}
</td>
<td class="no-width text-center">
{{#if user.me}}
<i class="material-icons color-gray">check_box</i>
{{else if user.active}}
<i class="material-icons checkbox" {{action 'toggleActive' user.id}}>check_box</i>
{{else}}
<i class="material-icons checkbox" {{action 'toggleActive' user.id}}>check_box_outline_blank</i>
{{/if}}
</td>
<td class="no-width text-center">
{{#if user.me}}
<div class="edit-button-{{user.id}} round-button-mono" title="Edit" {{action "edit" user.id}}>
<i class="material-icons">edit</i>
</div>
{{else}}
<div class="edit-button-{{user.id}} round-button-mono" title="Edit" {{action "edit" user.id}}>
<i class="material-icons">edit</i>
</div>
<div class="button-gap"></div>
<div class="delete-button-{{user.id}} round-button-mono" title="Delete" {{action "confirmDelete" user.id}}>
<i class="material-icons">delete</i>
</div>
{{/if}}
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="dropdown-dialog edit-user-dialog"> <div class="dropdown-dialog delete-user-dialog">
<div class="content"> <div class="content">
<form> <p>Are you sure you want to delete user <span class="bold">{{deleteUser.fullname}}?</span></p>
<div class="row"> </div>
<div class="col-md-6"> <div class="actions">
<div class="input-control"> <div class="flat-button" {{action 'cancel'}}>
<label>Firstname</label> cancel
{{input id="edit-firstname" type="text" value=editUser.firstname}} </div>
</div> <div class="flat-button flat-red" {{action 'delete'}}>
</div> delete
<div class="col-md-6"> </div>
<div class="input-control"> </div>
<label>Lastname</label> <div class="clearfix"></div>
{{input id="edit-lastname" type="text" value=editUser.lastname}} </div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="input-control">
<label>Email</label>
{{input id="edit-email" type="text" value=editUser.email}}
</div>
</div>
</div>
{{#if isAuthProviderDocumize}}
<div class="row">
<div class="col-md-6">
<div class="input-control">
<label>Password</label>
<div class="tip">Optional new password</div>
{{input id="edit-password" type="password" value=password.password}}
</div>
</div>
<div class="col-md-6">
<div class="input-control">
<label>Confirm Password</label>
<div class="tip">Confirm new password</div>
{{input id="edit-confirmPassword" type="password" value=password.confirmation}}
</div>
</div>
</div>
{{/if}}
</form>
</div>
<div class="actions">
<div class="flat-button" {{action 'cancel'}}>
cancel
</div>
<div class="flat-button flat-blue" {{action 'save'}}>
save
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="dropdown-dialog delete-user-dialog">
<div class="content">
<p>Are you sure you want to delete user <span class="bold">{{deleteUser.fullname}}?</span></p>
</div>
<div class="actions">
<div class="flat-button" {{action 'cancel'}}>
cancel
</div>
<div class="flat-button flat-red" {{action 'delete'}}>
delete
</div>
</div>
<div class="clearfix"></div>
</div> </div>

View file

@ -1,21 +1,25 @@
{{#if isAuthProviderDocumize}} {{#if isAuthProviderDocumize}}
<form> <div class="page-customize">
<div class="form-header"> <div class="add-user">
<div class="title">Add user</div> <form>
<div class="tip">New users receive an invitation email with a random password</div> <div class="form-header">
</div> <div class="title">New User</div>
<div class="input-control"> <div class="tip">Newly added users receive an invitation email with a random password</div>
<label>Firstname</label> </div>
{{focus-input id="newUserFirstname" type="text" value=newUser.firstname class=(if hasFirstnameEmptyError 'error')}} <div class="input-control">
</div> <label>Firstname</label>
<div class="input-control"> {{focus-input id="newUserFirstname" type="text" value=newUser.firstname class=(if hasFirstnameEmptyError 'error')}}
<label>Lastname</label> </div>
{{input id="newUserLastname" type="text" value=newUser.lastname class=(if hasLastnameEmptyError 'error')}} <div class="input-control">
</div> <label>Lastname</label>
<div class="input-control"> {{input id="newUserLastname" type="text" value=newUser.lastname class=(if hasLastnameEmptyError 'error')}}
<label>Email</label> </div>
{{input id="newUserEmail" type="text" value=newUser.email class=(if hasEmailEmptyError 'error')}} <div class="input-control">
</div> <label>Email</label>
<div class="regular-button button-blue" {{ action 'add' }}>Add</div> {{input id="newUserEmail" type="text" value=newUser.email class=(if hasEmailEmptyError 'error')}}
</form> </div>
<div class="regular-button button-blue" {{ action 'add' }}>Add</div>
</form>
</div>
</div>
{{/if}} {{/if}}

View file

@ -166,14 +166,16 @@ func (m *middleware) Authorize(w http.ResponseWriter, r *http.Request, next http
// user state. This helps client-side applications to detect changes in // user state. This helps client-side applications to detect changes in
// user state/privileges. // user state/privileges.
var state struct { var state struct {
Active bool `json:"active"` Active bool `json:"active"`
Admin bool `json:"admin"` Admin bool `json:"admin"`
Editor bool `json:"editor"` Editor bool `json:"editor"`
ViewUsers bool `json:"viewUsers"`
} }
state.Active = u.Active state.Active = u.Active
state.Admin = u.Admin state.Admin = u.Admin
state.Editor = u.Editor state.Editor = u.Editor
state.ViewUsers = u.ViewUsers
sb, err := json.Marshal(state) sb, err := json.Marshal(state)
w.Header().Add("X-Documize-Status", string(sb)) w.Header().Add("X-Documize-Status", string(sb))