diff --git a/gui/app/components/folder/category-admin.js b/gui/app/components/folder/category-admin.js index fe62cc51..b9f971a7 100644 --- a/gui/app/components/folder/category-admin.js +++ b/gui/app/components/folder/category-admin.js @@ -10,7 +10,6 @@ // https://documize.com import Component from '@ember/component'; - import { inject as service } from '@ember/service'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; @@ -22,19 +21,20 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { appMeta: service(), store: service(), newCategory: '', + deleteId: '', dropdown: null, users: [], didReceiveAttrs() { this._super(...arguments); - + this.renderTooltips(); this.load(); }, + willDestroyElement() { this._super(...arguments); - - this.destroyDropdown(); + this.removeTooltips(); }, load() { @@ -88,15 +88,17 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { }, actions: { - onAdd() { + onAdd(e) { + e.preventDefault(); + let cat = this.get('newCategory'); if (cat === '') { - $('#new-category-name').addClass('error').focus(); + $('#new-category-name').addClass('is-invalid').focus(); return; } - $('#new-category-name').removeClass('error').focus(); + $('#new-category-name').removeClass('is-invalid').focus(); this.set('newCategory', ''); let c = { @@ -109,8 +111,19 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { }); }, - onDelete(id) { - this.get('categoryService').delete(id).then(() => { + onShowDelete(id) { + let cat = this.get('category').findBy('id', id); + this.set('deleteId', cat.get('id')); + + $('#category-delete-modal').modal('dispose'); + $('#category-delete-modal').modal({show: true}); + }, + + onDelete() { + $('#category-delete-modal').modal('hide'); + $('#category-delete-modal').modal('dispose'); + + this.get('categoryService').delete(this.get('deleteId')).then(() => { this.load(); }); }, @@ -127,12 +140,12 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { onSave(id) { let cat = this.setEdit(id, true); if (cat.get('category') === '') { - $('#edit-category-' + cat.get('id')).addClass('error').focus(); - return; + $('#edit-category-' + cat.get('id')).addClass('is-invalid').focus(); + return false; } cat = this.setEdit(id, false); - $('#edit-category-' + cat.get('id')).removeClass('error'); + $('#edit-category-' + cat.get('id')).removeClass('is-invalid'); this.get('categoryService').save(cat).then(() => { this.load(); @@ -140,7 +153,8 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { }, onShowAccessPicker(catId) { - this.closeDropdown(); + this.set('showCategoryAccess', true); + let users = this.get('users'); let category = this.get('category').findBy('id', catId); @@ -155,26 +169,12 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { this.set('categoryUsers', users); this.set('currentCategory', category); - - $(".category-access-dialog").css("display", "block"); - - let dropOptions = Object.assign(this.get('dropDefaults'), { - target: $("#category-access-button-" + catId)[0], - content: $(".category-access-dialog")[0], - classes: 'drop-theme-basic', - position: "bottom right", - remove: false}); - - let drop = new Drop(dropOptions); - this.set('dropdown', drop); }); }, - onGrantCancel() { - this.closeDropdown(); - }, - onGrantAccess() { + this.set('showCategoryAccess', false); + let folder = this.get('folder'); let category = this.get('currentCategory'); let users = this.get('categoryUsers').filterBy('selected', true); @@ -196,8 +196,6 @@ export default Component.extend(NotifierMixin, TooltipMixin, DropdownMixin, { this.get('categoryService').setViewers(folder.get('id'), category.get('id'), viewers).then(() => { this.load(); }); - - this.closeDropdown(); } } }); diff --git a/gui/app/components/folder/space-view.js b/gui/app/components/folder/space-view.js index 2d08f063..a3e118e5 100644 --- a/gui/app/components/folder/space-view.js +++ b/gui/app/components/folder/space-view.js @@ -14,6 +14,7 @@ import { inject as service } from '@ember/service'; import { all } from 'rsvp'; import { schedule } from '@ember/runloop'; import { gt } from '@ember/object/computed'; +import { computed } from '@ember/object'; import AuthMixin from '../../mixins/auth'; export default Component.extend(AuthMixin, { @@ -23,6 +24,10 @@ export default Component.extend(AuthMixin, { localStorage: service('localStorage'), hasCategories: gt('categories.length', 0), filteredDocs: [], + categoryLinkName: 'Manage', + spaceSettings: computed('permissions', function() { + return this.get('permissions.spaceOwner') || this.get('permissions.spaceManage'); + }), didReceiveAttrs() { this._super(...arguments); @@ -50,6 +55,7 @@ export default Component.extend(AuthMixin, { }); this.set('categories', categories); + this.set('categoryLinkName', categories.length > 0 ? 'manage' : 'add'); schedule('afterRender', () => { if (this.get('rootDocCount') > 0) { diff --git a/gui/app/components/toolbar/for-space.js b/gui/app/components/toolbar/for-space.js index 0aa71afe..75b8a6c2 100644 --- a/gui/app/components/toolbar/for-space.js +++ b/gui/app/components/toolbar/for-space.js @@ -14,9 +14,10 @@ import { schedule } from '@ember/runloop'; import { computed } from '@ember/object'; import { inject as service } from '@ember/service'; import NotifierMixin from '../../mixins/notifier'; +import TooltipMixin from '../../mixins/tooltip'; import AuthMixin from '../../mixins/auth'; -export default Component.extend(NotifierMixin, AuthMixin, { +export default Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { spaceService: service('folder'), session: service(), appMeta: service(), @@ -75,15 +76,7 @@ export default Component.extend(NotifierMixin, AuthMixin, { willDestroyElement() { this._super(...arguments); - - $('[data-toggle="tooltip"]').tooltip('dispose'); - }, - - renderTooltips() { - schedule('afterRender', () => { - $('[data-toggle="tooltip"]').tooltip('dispose'); - $('body').tooltip({selector: '[data-toggle="tooltip"]', delay: 250}); - }); + this.removeTooltips(); }, getDefaultInvitationMessage() { diff --git a/gui/app/mixins/tooltip.js b/gui/app/mixins/tooltip.js index 8dab5543..6aca2d78 100644 --- a/gui/app/mixins/tooltip.js +++ b/gui/app/mixins/tooltip.js @@ -10,9 +10,21 @@ // https://documize.com import Mixin from '@ember/object/mixin'; +import { schedule } from '@ember/runloop'; export default Mixin.create({ - tooltips: [], + tooltips: [], + + renderTooltips() { + schedule('afterRender', () => { + $('[data-toggle="tooltip"]').tooltip('dispose'); + $('body').tooltip({selector: '[data-toggle="tooltip"]', delay: 250}); + }); + }, + + removeTooltips() { + $('[data-toggle="tooltip"]').tooltip('dispose'); + }, addTooltip(elem) { if (elem == null) { diff --git a/gui/app/pods/folder/settings/category/controller.js b/gui/app/pods/folder/category/controller.js similarity index 100% rename from gui/app/pods/folder/settings/category/controller.js rename to gui/app/pods/folder/category/controller.js diff --git a/gui/app/pods/folder/settings/category/route.js b/gui/app/pods/folder/category/route.js similarity index 89% rename from gui/app/pods/folder/settings/category/route.js rename to gui/app/pods/folder/category/route.js index 81a13ce8..fb199d5d 100644 --- a/gui/app/pods/folder/settings/category/route.js +++ b/gui/app/pods/folder/category/route.js @@ -21,7 +21,8 @@ export default Route.extend(AuthenticatedRouteMixin, { return hash({ folder: this.modelFor('folder').folder, permissions: this.modelFor('folder').permissions, - folders: this.modelFor('folder').folders + folders: this.modelFor('folder').folders, + templates: this.modelFor('folder').templates, }); } }); diff --git a/gui/app/pods/folder/category/template.hbs b/gui/app/pods/folder/category/template.hbs new file mode 100644 index 00000000..afa4513c --- /dev/null +++ b/gui/app/pods/folder/category/template.hbs @@ -0,0 +1,12 @@ +{{layout/nav-bar}} + +
+ {{#toolbar/t-toolbar}} + {{#toolbar/t-links}} + {{#link-to "folders" class="link" tagName="li"}}SPACES{{/link-to}} + {{#link-to "folder" model.folder.id model.folder.slug class="link" tagName="li"}}{{model.folder.name}}{{/link-to}} + {{/toolbar/t-links}} + {{/toolbar/t-toolbar}} + + {{folder/category-admin folders=model.folders folder=model.folder}} +
diff --git a/gui/app/pods/folder/settings/category/template.hbs b/gui/app/pods/folder/settings/category/template.hbs deleted file mode 100644 index 679ecc47..00000000 --- a/gui/app/pods/folder/settings/category/template.hbs +++ /dev/null @@ -1 +0,0 @@ -{{folder/category-admin folders=model.folders folder=model.folder}} diff --git a/gui/app/pods/folder/settings/controller.js b/gui/app/pods/folder/settings/controller.js deleted file mode 100644 index 9a6073cb..00000000 --- a/gui/app/pods/folder/settings/controller.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2016 Documize Inc. . All rights reserved. -// -// This software (Documize Community Edition) is licensed under -// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html -// -// You can operate outside the AGPL restrictions by purchasing -// Documize Enterprise Edition and obtaining a commercial license -// by contacting . -// -// https://documize.com - -import { inject as service } from '@ember/service'; - -import Controller from '@ember/controller'; -import NotifierMixin from '../../../mixins/notifier'; -import AuthProvider from '../../../mixins/auth'; - -export default Controller.extend(AuthProvider, NotifierMixin, { - documentService: service('document'), - folderService: service('folder'), - localStorage: service('localStorage'), -}); diff --git a/gui/app/pods/folder/settings/invitation/controller.js b/gui/app/pods/folder/settings/invitation/controller.js deleted file mode 100644 index fe1fb43c..00000000 --- a/gui/app/pods/folder/settings/invitation/controller.js +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 Documize Inc. . All rights reserved. -// -// This software (Documize Community Edition) is licensed under -// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html -// -// You can operate outside the AGPL restrictions by purchasing -// Documize Enterprise Edition and obtaining a commercial license -// by contacting . -// -// https://documize.com - -import Controller from '@ember/controller'; - -export default Controller.extend({ -}); diff --git a/gui/app/pods/folder/settings/invitation/route.js b/gui/app/pods/folder/settings/invitation/route.js deleted file mode 100644 index 81a13ce8..00000000 --- a/gui/app/pods/folder/settings/invitation/route.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2016 Documize Inc. . All rights reserved. -// -// This software (Documize Community Edition) is licensed under -// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html -// -// You can operate outside the AGPL restrictions by purchasing -// Documize Enterprise Edition and obtaining a commercial license -// by contacting . -// -// https://documize.com - -import { hash } from 'rsvp'; - -import Route from '@ember/routing/route'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Route.extend(AuthenticatedRouteMixin, { - model() { - this.get('browser').setTitle(this.modelFor('folder').folder.get('name')); - - return hash({ - folder: this.modelFor('folder').folder, - permissions: this.modelFor('folder').permissions, - folders: this.modelFor('folder').folders - }); - } -}); diff --git a/gui/app/pods/folder/settings/invitation/template.hbs b/gui/app/pods/folder/settings/invitation/template.hbs deleted file mode 100644 index 64fad17d..00000000 --- a/gui/app/pods/folder/settings/invitation/template.hbs +++ /dev/null @@ -1 +0,0 @@ -{{folder/invite-user folders=model.folders folder=model.folder}} diff --git a/gui/app/pods/folder/settings/route.js b/gui/app/pods/folder/settings/route.js deleted file mode 100644 index 6b66f165..00000000 --- a/gui/app/pods/folder/settings/route.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2016 Documize Inc. . All rights reserved. -// -// This software (Documize Community Edition) is licensed under -// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html -// -// You can operate outside the AGPL restrictions by purchasing -// Documize Enterprise Edition and obtaining a commercial license -// by contacting . -// -// https://documize.com - -import { hash } from 'rsvp'; - -import Route from '@ember/routing/route'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Route.extend(AuthenticatedRouteMixin, { - beforeModel: function (transition) { - if (is.equal(transition.targetName, 'folder.settings.index')) { - this.transitionTo('folder.settings.security'); - } - }, - - model() { - this.get('browser').setTitle(this.modelFor('folder').folder.get('name')); - - return hash({ - folder: this.modelFor('folder').folder, - permissions: this.modelFor('folder').permissions, - folders: this.modelFor('folder').folders - }); - } -}); diff --git a/gui/app/pods/folder/settings/security/controller.js b/gui/app/pods/folder/settings/security/controller.js deleted file mode 100644 index fe1fb43c..00000000 --- a/gui/app/pods/folder/settings/security/controller.js +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 Documize Inc. . All rights reserved. -// -// This software (Documize Community Edition) is licensed under -// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html -// -// You can operate outside the AGPL restrictions by purchasing -// Documize Enterprise Edition and obtaining a commercial license -// by contacting . -// -// https://documize.com - -import Controller from '@ember/controller'; - -export default Controller.extend({ -}); diff --git a/gui/app/pods/folder/settings/security/route.js b/gui/app/pods/folder/settings/security/route.js deleted file mode 100644 index 81a13ce8..00000000 --- a/gui/app/pods/folder/settings/security/route.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2016 Documize Inc. . All rights reserved. -// -// This software (Documize Community Edition) is licensed under -// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html -// -// You can operate outside the AGPL restrictions by purchasing -// Documize Enterprise Edition and obtaining a commercial license -// by contacting . -// -// https://documize.com - -import { hash } from 'rsvp'; - -import Route from '@ember/routing/route'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Route.extend(AuthenticatedRouteMixin, { - model() { - this.get('browser').setTitle(this.modelFor('folder').folder.get('name')); - - return hash({ - folder: this.modelFor('folder').folder, - permissions: this.modelFor('folder').permissions, - folders: this.modelFor('folder').folders - }); - } -}); diff --git a/gui/app/pods/folder/settings/security/template.hbs b/gui/app/pods/folder/settings/security/template.hbs deleted file mode 100644 index 99d66823..00000000 --- a/gui/app/pods/folder/settings/security/template.hbs +++ /dev/null @@ -1 +0,0 @@ -{{folder/permission-admin folders=model.folders folder=model.folder}} diff --git a/gui/app/pods/folder/settings/template.hbs b/gui/app/pods/folder/settings/template.hbs deleted file mode 100644 index a63d46b4..00000000 --- a/gui/app/pods/folder/settings/template.hbs +++ /dev/null @@ -1,33 +0,0 @@ -{{#layout/zone-container}} - {{#layout/zone-sidebar}} - - - {{/layout/zone-sidebar}} - {{#layout/zone-content}} -
- {{#link-to 'folder' model.folder.id model.folder.slug}} -
- arrow_back -
{{model.folder.name}}
-
- {{/link-to}} -
-
- - {{outlet}} - -
- {{/layout/zone-content}} -{{/layout/zone-container}} \ No newline at end of file diff --git a/gui/app/router.js b/gui/app/router.js index b1a7ff66..b621bd81 100644 --- a/gui/app/router.js +++ b/gui/app/router.js @@ -24,18 +24,8 @@ export default Router.map(function () { this.route('folder', { path: 's/:folder_id/:folder_slug' }, function() { - this.route('settings', { - path: 'settings' - }, function () { - this.route('security', { - path: 'security' - }); - this.route('invitation', { - path: 'invitation' - }); - this.route('category', { - path: 'category' - }); + this.route('category', { + path: 'category' }) }); diff --git a/gui/app/styles/app.scss b/gui/app/styles/app.scss index 5c5d2d58..40c7c6dc 100644 --- a/gui/app/styles/app.scss +++ b/gui/app/styles/app.scss @@ -22,7 +22,6 @@ @import "view/page-auth.scss"; @import "view/page-onboard.scss"; @import "view/page-exceptions.scss"; -@import "view/folder/all.scss"; @import "view/document/all.scss"; @import "view/common.scss"; diff --git a/gui/app/styles/base.scss b/gui/app/styles/base.scss index 9f124b23..d247f8e7 100644 --- a/gui/app/styles/base.scss +++ b/gui/app/styles/base.scss @@ -25,12 +25,24 @@ body { } a { + @include ease-in(); color: $color-link; text-decoration: none; cursor: pointer; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - text-shadow: 1px 1px 1px rgba(0,0,0,0.004); + // text-shadow: 1px 1px 1px rgba(0,0,0,0.004); + + a:focus, + a:hover { + text-decoration: none; + } +} + +a.admin-link { + // color: $color-gray; + text-decoration: none; + font-weight: bold; a:focus, a:hover { diff --git a/gui/app/styles/mixins.scss b/gui/app/styles/mixins.scss index 93ee3f29..29c684fd 100644 --- a/gui/app/styles/mixins.scss +++ b/gui/app/styles/mixins.scss @@ -55,3 +55,13 @@ color: $color-link; } } + +@mixin card-theme() { + background-color: $color-primary-light; + box-shadow: 1px 1px 3px 0px rgba(211,211,211,1); + + &:hover { + background-color: darken($color-primary-light, 5%); + color: $color-primary; + } +} diff --git a/gui/app/styles/view/folder/all.scss b/gui/app/styles/view/folder/all.scss deleted file mode 100644 index f26304ce..00000000 --- a/gui/app/styles/view/folder/all.scss +++ /dev/null @@ -1 +0,0 @@ -@import "settings.scss"; diff --git a/gui/app/styles/view/folder/settings.scss b/gui/app/styles/view/folder/settings.scss deleted file mode 100644 index 651ce3f0..00000000 --- a/gui/app/styles/view/folder/settings.scss +++ /dev/null @@ -1,51 +0,0 @@ -.space-settings { - .category-table { - padding: 0; - margin: 0 0 0 20px; - width: 60%; - - > .row { - margin: 15px 0; - padding: 15px; - background-color: $color-off-white; - @include border-radius(2px); - - > .category { - display: inline-block; - - > .name { - font-size: 1.2rem; - } - - > .info { - font-size: 0.9rem; - margin-top: 8px; - color: $color-gray; - } - } - - > .buttons { - margin-top: 5px; - } - - > .action { - display: inline-block; - } - - > .input-control { - margin: 0; - display: inline-block; - - > input { - margin: 0 0 8px 0; - padding: 0; - font-size: 1.2rem; - } - } - } - } -} - -.category-access-dialog { - display: none; -} diff --git a/gui/app/styles/view/space.scss b/gui/app/styles/view/space.scss index 7512ab60..f88bc58e 100644 --- a/gui/app/styles/view/space.scss +++ b/gui/app/styles/view/space.scss @@ -119,10 +119,18 @@ } .space-admin { - > .permission-table { - // width: 100%; - // overflow-x: auto; + > .title { + font-size: 1.5rem; + font-weight: bold; + color: $color-dark; + } + > .sub-title { + font-size: 1.1rem; + color: $color-gray; + } + + > .permission-table { > tbody, > thead { > tr, > th { > td, > th { @@ -151,4 +159,50 @@ } } } + + > .categories { + padding: 0; + margin: 0; + + > .item { + margin: 15px 0; + padding: 15px; + @include card-theme(); + @include ease-in(); + + > .category { + display: inline-block; + + > .name { + font-size: 1.2rem; + color: $color-primary; + } + + > .info { + font-size: 0.9rem; + margin-top: 8px; + color: $color-gray; + } + } + + > .buttons { + margin-top: 5px; + } + + > .action { + display: inline-block; + } + + > .input-control { + margin: 0; + display: inline-block; + + > input { + margin: 0 0 8px 0; + padding: 0; + font-size: 1.2rem; + } + } + } + } } diff --git a/gui/app/styles/view/toolbar.scss b/gui/app/styles/view/toolbar.scss index c4dcf041..bc7ffb9a 100644 --- a/gui/app/styles/view/toolbar.scss +++ b/gui/app/styles/view/toolbar.scss @@ -12,7 +12,7 @@ margin-right: 30px; cursor: pointer; @include ease-in(); - border-bottom: 2px solid $color-gray-light; + // border-bottom: 2px solid $color-gray-light; &:hover { color: $color-link; diff --git a/gui/app/styles/widget/widget-button.scss b/gui/app/styles/widget/widget-button.scss index cd75098f..6e4cc462 100644 --- a/gui/app/styles/widget/widget-button.scss +++ b/gui/app/styles/widget/widget-button.scss @@ -452,6 +452,24 @@ } } +.button-icon-black { + display: inline-block; + cursor: default; + @include ease-in(); + + > i { + color: $color-off-black; + font-size: 2rem; + @include ease-in(); + } + + &:hover { + > i { + color: darken($color-off-black, 5%); + } + } +} + .button-icon-small { > i { font-size: 1.3rem; diff --git a/gui/app/templates/components/folder/category-admin.hbs b/gui/app/templates/components/folder/category-admin.hbs index be7c2870..529c3407 100644 --- a/gui/app/templates/components/folder/category-admin.hbs +++ b/gui/app/templates/components/folder/category-admin.hbs @@ -1,74 +1,77 @@ -
-
-
-
Categories
-
Sub-divide spaces and secure document access with categories
+
+
+
+

Categories

+

Sub-divide spaces into categories which can contain documents with restricted access.

+
+
+ {{input id="new-category-name" type='text' class="form-control mousetrap" placeholder="Category name" value=newCategory}} +
+ +
-
-
-
- {{#each category as |cat|}} -
- {{#if cat.editMode}} -
- {{focus-input id=(concat 'edit-category-' cat.id) type="text" value=cat.category class="input-inline"}} -
- {{else}} -
-
{{cat.category}}
-
- {{cat.documents}} {{if (eq cat.documents 1) 'document' 'documents' }}, {{cat.users}} {{if (eq cat.users 1) 'person' 'people' }}
-
- {{/if}} -
- {{#if cat.editMode}} - -
- close -
- {{else}} -
-
- person -
-
- edit -
-
- delete -
- {{#dropdown-dialog target=(concat 'delete-category-' cat.id) position="bottom right" button="Delete" color="flat-red" onAction=(action 'onDelete' cat.id)}} -

Are you sure you want to delete category {{cat.category}}?

- {{/dropdown-dialog}} -
- {{/if}} -
-
- {{else}} -
No categories defined yet
- {{/each}} -
-
- -
Provide a short name
- {{focus-input id="new-category-name" type="text" value=newCategory}} -
-
-
add
-
-