1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-08-02 20:15:26 +02:00

category permission admin, re-vamped view layout

This commit is contained in:
Harvey Kandola 2017-09-21 15:48:00 +01:00
parent 0c152c219f
commit 3f31d6d15e
48 changed files with 753 additions and 373 deletions

View file

@ -17,7 +17,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
documentService: Ember.inject.service('document'),
appMeta: Ember.inject.service(),
drop: null,
emptyState: Ember.computed.empty('files'),
hasAttachments: Ember.computed.notEmpty('files'),
deleteAttachment: {
id: "",
name: "",
@ -104,7 +104,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
target: $(".delete-attachment-" + id)[0],
content: $(".delete-attachment-dialog")[0],
classes: 'drop-theme-basic',
position: "bottom left",
position: "bottom right",
openOn: "always",
tetherOptions: {
offset: "5px 0",

View file

@ -31,38 +31,31 @@ export default Ember.Component.extend(TooltipMixin, NotifierMixin, {
name: "",
description: ""
},
tab: '',
init() {
this._super(...arguments);
if (is.empty(this.get('tab')) || is.undefined(this.get('tab'))) {
this.set('tab', 'index');
}
},
didReceiveAttrs() {
this._super(...arguments);
this.set('saveTemplate.name', this.get('document.name'));
this.set('saveTemplate.description', this.get('document.excerpt'));
this.set('pinState.pinId', this.get('pinned').isDocumentPinned(this.get('document.id')));
this.set('pinState.isPinned', this.get('pinState.pinId') !== '');
this.set('pinState.newName', this.get('document.name').substring(0,3).toUpperCase());
this.set('pinState.newName', this.get('document.name'));
},
didRender() {
this.destroyTooltips();
if (this.get('permissions.documentEdit')) {
this.addTooltip(document.getElementById("document-activity-button"));
}
},
actions: {
onChangeTab(tab) {
this.set('tab', tab);
},
onTagChange(tags) {
let doc = this.get('document');
doc.set('tags', tags);
this.get('documentService').save(doc);
},
onMenuOpen() {
this.set('menuOpen', !this.get('menuOpen'));
},
@ -78,15 +71,15 @@ export default Ember.Component.extend(TooltipMixin, NotifierMixin, {
onPageSequenceChange(changes) {
this.get('onPageSequenceChange')(changes);
},
},
onPageLevelChange(changes) {
this.get('onPageLevelChange')(changes);
},
},
onGotoPage(id) {
this.get('onGotoPage')(id);
},
},
onUnpin() {
this.get('pinned').unpinItem(this.get('pinState.pinId')).then(() => {
@ -136,12 +129,15 @@ export default Ember.Component.extend(TooltipMixin, NotifierMixin, {
return true;
},
onLayoutChange(layout) {
let doc = this.get('document');
doc.set('layout', layout);
this.get('documentService').save(doc);
if (this.get('permissions.documentEdit')) {
this.get('documentService').save(doc);
}
return true;
}
}

View file

@ -76,7 +76,7 @@ export default Ember.Component.extend(TooltipMixin, {
let permissions = this.get('permissions');
return permissions.get('documentDelete') || permissions.get('documentCopy') ||
permissions.get('documentMove') || permissions.get('documentTemplate');;
permissions.get('documentMove') || permissions.get('documentTemplate');
}),
didRender() {

View file

@ -0,0 +1,34 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. 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 <sales@documize.com>.
//
// https://documize.com
import Ember from 'ember';
import TooltipMixin from '../../mixins/tooltip';
import NotifierMixin from '../../mixins/notifier';
export default Ember.Component.extend(TooltipMixin, NotifierMixin, {
documentService: Ember.inject.service('document'),
sectionService: Ember.inject.service('section'),
sessionService: Ember.inject.service('session'),
appMeta: Ember.inject.service(),
userService: Ember.inject.service('user'),
localStorage: Ember.inject.service(),
init() {
this._super(...arguments);
},
didReceiveAttrs() {
this._super(...arguments);
},
actions: {
}
});

View file

@ -11,25 +11,59 @@
import Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
import TooltipMixin from '../../mixins/tooltip';
const {
inject: { service }
} = Ember;
export default Ember.Component.extend(NotifierMixin, {
folderService: service('folder'),
export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
userService: service('user'),
categoryService: service('category'),
appMeta: service(),
store: service(),
newCategory: '',
drop: null,
users: [],
didReceiveAttrs() {
this.load();
},
didRender() {
// this.addTooltip(this.$(".action"));
},
willDestroyElement() {
let drop = this.get('drop');
if (is.not.null(drop)) {
drop.destroy();
}
},
load() {
// get categories
this.get('categoryService').getAll(this.get('folder.id')).then((c) => {
this.set('category', c);
// get users that this space admin user can see
this.get('userService').getAll().then((users) => {
// set up Everyone user
let u = {
orgId: this.get('folder.orgId'),
folderId: this.get('folder.id'),
userId: '',
firstname: 'Everyone',
lastname: '',
};
let data = this.get('store').normalize('user', u)
users.pushObject(this.get('store').push(data));
users = users.sortBy('firstname', 'lastname');
this.set('users', users);
});
});
},
@ -76,7 +110,7 @@ export default Ember.Component.extend(NotifierMixin, {
this.setEdit(id, true);
},
onCancel(id) {
onEditCancel(id) {
this.setEdit(id, false);
this.load();
},
@ -94,6 +128,69 @@ export default Ember.Component.extend(NotifierMixin, {
this.get('categoryService').save(cat).then(() => {
this.load();
});
},
onShowAccessPicker(catId) {
let users = this.get('users');
let category = this.get('category').findBy('id', catId);
this.get('categoryService').getViewers(category.get('id')).then((viewers) => {
// mark those users as selected that have already been given permission
// to see the current category;
console.log(viewers);
users.forEach((user) => {
let selected = viewers.isAny('id', user.get('id'));
user.set('selected', selected);
});
this.set('categoryUsers', users);
this.set('currentCategory', category);
$(".category-access-dialog").css("display", "block");
let drop = new Drop({
target: $("#category-access-button-" + catId)[0],
content: $(".category-access-dialog")[0],
classes: 'drop-theme-basic',
position: "bottom right",
openOn: "always",
tetherOptions: {
offset: "5px 0",
targetOffset: "10px 0"
},
remove: false
});
this.set('drop', drop);
});
},
onGrantCancel() {
let drop = this.get('drop');
drop.close();
},
onGrantAccess() {
let category = this.get('currentCategory');
let users = this.get('categoryUsers').filterBy('selected', true);
let viewers = [];
users.forEach((user) => {
let v = {
orgId: this.get('folder.orgId'),
folderId: this.get('folder.id'),
categoryId: category.get('id'),
userId: user.get('id')
};
viewers.push(v);
});
this.get('categoryService').setViewers(category.get('id'), viewers).then( () => {});
let drop = this.get('drop');
drop.close();
}
}
});

View file

@ -60,6 +60,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, {
if (this.get('permissions.documentMove')) {
this.addTooltip(document.getElementById("move-documents-button"));
}
if (this.get('permissions.documentDelete')) {
this.addTooltip(document.getElementById("delete-documents-button"));
}
@ -67,11 +68,13 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, {
if (this.get('permissions.spaceOwner')) {
this.addTooltip(document.getElementById("space-delete-button"));
}
if (this.get('permissions.spaceManage')) {
this.addTooltip(document.getElementById("space-settings-button"));
}
if (this.get('session.authenticated')) {
this.addTooltip(document.getElementById("space-unpin-button"));
if (this.get('pinState.isPinned')) {
this.addTooltip(document.getElementById("space-unpin-button"));
} else {
this.addTooltip(document.getElementById("space-pin-button"));
}

View file

@ -69,7 +69,7 @@ export default Ember.Component.extend(NotifierMixin, {
documentMove: false,
documentCopy: false,
documentTemplate: false
};
};
let data = this.get('store').normalize('space-permission', u)
folderPermissions.pushObject(this.get('store').push(data));

View file

@ -0,0 +1,23 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. 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 <sales@documize.com>.
//
// https://documize.com
import Ember from 'ember';
export default Ember.Component.extend({
nameField: 'category',
items: [],
actions: {
onToggle(item) {
Ember.set(item, 'selected', !item.get('selected'));
}
}
});

View file

@ -15,10 +15,9 @@ export default Ember.Mixin.create({
tooltips: [],
addTooltip(elem) {
if(elem == null) {
if (elem == null) {
return;
}
}
let t = new Tooltip({
target: elem

View file

@ -226,6 +226,12 @@ export default Ember.Controller.extend(NotifierMixin, {
if (this.get('pageId') !== id && id !== '') {
this.set('pageId', id);
}
},
onTagChange(tags) {
let doc = this.get('model.document');
doc.set('tags', tags);
this.get('documentService').save(doc);
}
}
});

View file

@ -1,27 +1,44 @@
{{#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 permissions=model.permissions tab=tab
onDocumentDelete=(action 'onDocumentDelete') onSaveTemplate=(action 'onSaveTemplate')
{{document/document-index
document=model.document folder=model.folder pages=model.pages page=model.page permissions=model.permissions
onPageSequenceChange=(action 'onPageSequenceChange') onPageLevelChange=(action 'onPageLevelChange')
onGotoPage=(action 'onGotoPage')}}
{{/layout/zone-sidebar}}
{{#layout/zone-content}}
<div id="zone-document-content" class="zone-document-content">
<div class="back-to-space">
{{#link-to 'folder' model.folder.id model.folder.slug}}
<div class="regular-button button-gray">
<i class="material-icons">arrow_back</i>
<div class="name">{{model.folder.name}}</div>
</div>
{{/link-to}}
<div class="pull-left">
{{document/space-category document=model.document folder=model.folder folders=model.folders permissions=model.permissions}}
</div>
<div class="pull-right">
{{document/document-toolbar
document=model.document folder=model.folder folders=model.folders permissions=model.permissions
onDocumentDelete=(action 'onDocumentDelete') onSaveTemplate=(action 'onSaveTemplate')
onPageSequenceChange=(action 'onPageSequenceChange') onPageLevelChange=(action 'onPageLevelChange')
onGotoPage=(action 'onGotoPage')}}
</div>
<div class="clearfix"/>
{{#if model.document.template}}
<div class="document-template-header">Template</div>
{{/if}}
{{document/document-heading document=model.document permissions=model.permissions onSaveDocument=(action 'onSaveDocument')}}
{{document/document-view document=model.document links=model.links pages=model.pages
{{document/tag-editor documentTags=model.document.tags permissions=model.permissions onChange=(action 'onTagChange')}}
{{document/document-view
document=model.document links=model.links pages=model.pages
folder=model.folder folders=model.folders sections=model.sections permissions=model.permissions pageId=pageId
onSavePage=(action 'onSavePage') onInsertSection=(action 'onInsertSection')
onSavePageAsBlock=(action 'onSavePageAsBlock') onDeleteBlock=(action 'onDeleteBlock') onGotoPage=(action 'onGotoPage')
onCopyPage=(action 'onCopyPage') onMovePage=(action 'onMovePage') onDeletePage=(action 'onPageDeleted')}}
</div>
{{/layout/zone-content}}
{{/layout/zone-container}}

View file

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

View file

@ -10,7 +10,7 @@
{{#link-to 'folder.settings.invitation' activeClass='selected' class="option" tagName="li"}}Invite{{/link-to}}
{{/if}}
{{#link-to 'folder.settings.security' activeClass='selected' class="option" tagName="li"}}Secure{{/link-to}}
{{#link-to 'folder.settings.category' activeClass='selected' class="option" tagName="li"}}Organize{{/link-to}}
{{#link-to 'folder.settings.category' activeClass='selected' class="option" tagName="li"}}Categorize{{/link-to}}
</ul>
</div>
</div>

View file

@ -83,5 +83,30 @@ export default BaseService.extend({
return this.get('ajax').request(`category/${categoryId}`, {
method: 'DELETE'
});
}
},
// Get list of users who can see given category
getViewers(categoryId) {
return this.get('ajax').request(`category/${categoryId}/permission`, {
method: 'GET'
}).then((response) => {
let data = [];
data = response.map((obj) => {
let data = this.get('store').normalize('user', obj);
return this.get('store').push(data);
});
return data;
});
},
// Save list of users who can see given category
setViewers(categoryId, viewers) {
return this.get('ajax').request(`category/${categoryId}/permission`, {
method: 'PUT',
contentType: 'json',
data: JSON.stringify(viewers)
});
},
});

View file

@ -66,7 +66,6 @@ export default Ember.Service.extend({
});
},
// Returns all users that can see folder.
getFolderUsers(folderId) {
let url = `users/folder/${folderId}`;

View file

@ -48,13 +48,12 @@
#sidebar-wrapper,
.sidebar-wrapper,
.sidebar-common,
.sidebar-toolbar,
.sidebar-panel,
.edit-document-heading,
.back-to-space,
.start-section,
.start-button,
.is-a-tab,
.is-a-tab,
.new-section-wizard {
float: none !important;
display: none !important;

View file

@ -15,7 +15,8 @@
}
.back-to-space {
margin: 10px 0;
margin: 0 0 10px 0;
display: inline-block;
> a {
> .regular-button {

View file

@ -2,8 +2,8 @@
@import "history.scss";
@import "inline-editor.scss";
@import "section-editor.scss";
@import "sidebar-view-activity.scss";
@import "sidebar-view-attachments.scss";
@import "sidebar-view-index.scss";
@import "activity.scss";
@import "attachments.scss";
@import "toc.scss";
@import "view.scss";
@import "wysiwyg.scss";

View file

@ -1,31 +1,17 @@
.document-sidebar-view-attachments {
.document-attachments {
margin: 0;
> .upload-document-files {
width: 100%;
padding: 20px;
margin-bottom: 20px;
text-align: center;
color: $color-gray;
border: 1px solid $color-stroke;
cursor: pointer;
font-size: 0.9rem;
line-height: 1.7rem;
margin: 10px 0 0 0;
@include ease-in();
&:hover {
border-color: $color-link;
color: $color-link;
}
> .dz-preview,
.dz-processing {
> .dz-preview, .dz-processing {
display: none !important;
}
}
> .list {
margin: 0 0 50px;
margin: 20px 0 0 0;
padding: 7px 0;
> .item {
@ -45,7 +31,7 @@
> a {
@extend .truncate;
width: 200px;
width: 80%;
color: $color-gray;
&:hover {
@ -56,7 +42,8 @@
@extend .truncate;
display: inline-block;
font-size: 0.9rem;
width: 200px;
width: 80%;
vertical-align: text-top;
}
}

View file

@ -8,7 +8,7 @@
.doc-excerpt {
font-size: 1rem;
color: $color-gray;
margin: 0 0 45px;
margin: 0 0 60px;
}
.edit-document-heading {
@ -341,3 +341,25 @@
.dropdown-page-toolbar {
width: 300px;
}
.document-toolbar {
> .round-button-mono {
background-color: $color-white;
border: 1px solid $color-gray;
> .material-icons {
@include ease-in();
color: $color-gray;
}
}
}
.document-template-header {
color: $color-goldy;
font-size: 1.5em;
margin-bottom: 20px;
}
.document-tags {
margin-top: 15px;
}

View file

@ -43,15 +43,26 @@
> .row {
margin: 15px 0;
padding: 8px 10px;
padding: 15px;
background-color: $color-off-white;
@include border-radius(2px);
> .category {
font-size: 1.2rem;
vertical-align: bottom;
display: inline-block;
margin-top: 8px;
> .name {
font-size: 1.2rem;
}
> .info {
font-size: 0.9rem;
margin-top: 8px;
color: $color-gray;
}
}
> .buttons {
margin-top: 5px;
}
> .action {
@ -63,7 +74,7 @@
display: inline-block;
> input {
margin: 0;
margin: 0 0 8px 0;
padding: 0;
font-size: 1.2rem;
}
@ -72,3 +83,6 @@
}
}
.category-access-dialog {
display: none;
}

View file

@ -58,48 +58,6 @@ $sidebar-width: 400px;
#sidebar-wrapper {
width: $sidebar-width;
}
// #page-content-wrapper {
// padding: 30px;
// position: relative;
// }
}
.sidebar-toolbar {
display: inline-block;
width: 60px;
background-color: $color-primary;
text-align: center;
position: fixed;
left: 0;
top: 0;
height: 100%;
padding: 40px 0 0 0;
> .selected {
background-color: $color-link !important;
border: 1px solid $color-link !important;
> .material-icons {
color: $color-white !important;
}
}
> .round-button-mono {
background-color: $color-off-white;
border: 1px solid $color-off-white;
> .material-icons {
@include ease-in();
color: $color-gray;
}
&:hover {
> .material-icons {
color: $color-link;
}
}
}
}
.sidebar-common {
@ -108,20 +66,6 @@ $sidebar-width: 400px;
padding: 40px 20px 0px 20px;
margin-left: 20px;
> .pinner {
cursor: pointer;
> .material-icons {
color: $color-primary;
}
}
> .template-header {
color: $color-goldy;
font-size: 1.5em;
margin-bottom: 20px;
}
.zone-sidebar-page-title {
color: $color-primary;
font-size: 1.3rem;
@ -150,7 +94,7 @@ $sidebar-width: 400px;
margin-bottom: 30px;
}
.folder-sidebar-form-wrapper, .document-sidebar-form-wrapper {
.document-sidebar-form-wrapper {
padding: 20px;
border: 1px solid $color-stroke;
@include border-radius(3px);

View file

@ -0,0 +1,41 @@
.widget-list-picker {
margin: 10px 0;
> .options {
width: 300px;
max-height: 400px;
overflow: auto;
> .option {
margin: 0 0 5px 0;
padding: 10px 15px;
color: $color-gray;
background-color: $color-off-white;
cursor: pointer;
position: relative;
&:hover {
color: $color-white;
background-color: $color-gray;
}
> .text {
width: 220px;
overflow: hidden;
font-weight: bold;
}
> .material-icons {
position: absolute;
top: 10px;
right: 10px;
color: $color-white;
}
}
> .selected {
color: $color-white !important;
background-color: $color-link !important;
}
}
}

View file

@ -64,15 +64,16 @@
@import "widget-avatar";
@import "widget-button";
@import "widget-card";
@import "widget-checkbox";
@import "widget-chip";
@import "widget-dropdown";
@import "widget-input";
@import "widget-list-picker";
@import "widget-notification";
@import "widget-radio";
@import "widget-selection";
@import "widget-sidebar-menu";
@import "widget-symbol";
@import "widget-tab";
@import "widget-table";
@import "widget-tooltip";
@import "widget-checkbox";
@import "widget-radio";
@import "widget-tab";
@import "widget-selection";
@import "widget-symbol";

View file

@ -0,0 +1,41 @@
<div class="document-attachments">
{{#if hasAttachments}}
<ul class="list">
{{#each files key="id" as |a index|}}
<li class="item">
<img class="icon" src="/assets/img/attachments/{{document/file-icon a.extension}}" />
<a href="{{ appMeta.endpoint }}/public/attachments/{{ appMeta.orgId }}/{{ a.id }}">
<span class="file">{{ a.filename }}</span>
</a>
{{#if permissions.documentEdit}}
<div class="action round-button-mono">
<i class="material-icons color-gray delete-attachment-{{a.id}}" title="Delete" {{action 'onConfirmDelete' a.id a.filename}}>delete</i>
</div>
{{/if}}
</li>
{{/each}}
</ul>
{{/if}}
{{#if permissions.documentEdit}}
<div class="upload-document-files">
<div class="chip chip-action">
<span id="upload-document-files" class="chip-text">+ attachment</span>
</div>
</div>
{{/if}}
</div>
<div class="dropdown-dialog delete-attachment-dialog">
<div class="content">
<p>Are you sure you want to delete <span class="bold">{{deleteAttachment.name}}?</span></p>
</div>
<div class="actions">
<div class="flat-button" {{action 'onCancel'}}>
cancel
</div>
<div class="flat-button flat-red" {{action 'onDelete'}}>
delete
</div>
</div>
<div class="clearfix"></div>
</div>

View file

@ -0,0 +1,35 @@
<div class="sidebar-wrapper">
<div class="sidebar-panel">
<div class="document-sidebar-view-index">
<div class="structure">
{{#if session.authenticated}}
{{#unless emptyState}}
<div id="tocToolbar" class="hidden-xs hidden-sm toc-controls {{if state.actionablePage 'current-page' ''}}">
<div id="toc-up-button" class="round-button-mono {{if state.upDisabled 'disabled'}}" data-tooltip="Move up" data-tooltip-position="top center" {{action 'pageUp'}}>
<i class="material-icons">arrow_upward</i>
</div>
<div class="button-gap" />
<div id="toc-down-button" class="round-button-mono {{if state.downDisabled 'disabled'}}" data-tooltip="Move down" data-tooltip-position="top center" {{action 'pageDown'}}>
<i class="material-icons">arrow_downward</i>
</div>
<div class="button-gap" />
<div id="toc-outdent-button" class="round-button-mono {{if state.outdentDisabled 'disabled'}}" data-tooltip="Outdent" data-tooltip-position="top center" {{action 'pageOutdent'}}>
<i class="material-icons">format_indent_decrease</i>
</div>
<div class="button-gap" />
<div id="toc-indent-button" class="round-button-mono {{if state.indentDisabled 'disabled'}}" data-tooltip="Indent" data-tooltip-position="top center" {{action 'pageIndent'}}>
<i class="material-icons">format_indent_increase</i>
</div>
</div>
{{/unless}}
{{/if}}
<ul class="index-list">
{{#each pages key="id" as |p index|}}
{{document/index-entry page=p index=index onClick=(action 'onEntryClick')}}
{{/each}}
</ul>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,80 @@
{{#if (is-equal tab 'activitysdsd')}}
{{document/sidebar-view-activity document=document pages=pages permissions=permissions}}
{{/if}}
<div class="document-toolbar">
<div class="round-button-mono" id="document-more-button">
<i class="material-icons">more_vert</i>
</div>
</div>
{{#dropdown-menu target="document-more-button" position="bottom right" open="click" onOpenCallback=(action 'onMenuOpen') onCloseCallback=(action 'onMenuOpen')}}
<ul class="menu">
{{#if session.authenticated}}
{{#if (is-equal document.layout 'section')}}
<li class="item" {{action 'onLayoutChange' 'doc'}}>Flat view</li>
{{else}}
<li class="item" {{action 'onLayoutChange' 'section'}}>Section view</li>
{{/if}}
{{#if pinState.isPinned}}
<li class="item" {{action 'onUnpin'}}>Unfavorite</li>
{{else}}
<li class="item" id="pin-document-button">Favorite</li>
{{/if}}
{{#if permissions.documentEdit}}
<li class="item">{{#link-to 'document.history'}}History{{/link-to}}</li>
{{/if}}
{{/if}}
{{#if permissions.documentTemplate}}
<li class="item" id="save-template-button">Template</li>
{{/if}}
<li class="divider"/>
<li class="item" id="print-document-button" {{action 'onPrintDocument'}}>Print</li>
{{#if permissions.documentDelete}}
<li class="item danger" id="delete-document-button">Delete</li>
{{/if}}
</ul>
{{/dropdown-menu}}
{{#if session.authenticated}}
{{#if menuOpen}}
{{#unless pinState.isPinned}}
{{#dropdown-dialog target="pin-document-button" position="bottom right" button="Pin" color="flat-green" onAction=(action 'onPin') focusOn="pin-document-name" }}
<div class="input-control">
<label>Favorite Document</label>
<div class="tip">Provide short name</div>
{{input type='text' id="pin-document-name" value=pinState.newName}}
</div>
{{/dropdown-dialog}}
{{/unless}}
{{/if}}
{{#if permissions.documentDelete}}
{{#if menuOpen}}
{{#dropdown-dialog target="delete-document-button" position="bottom right" button="Delete" color="flat-red" onAction=(action 'onDeleteDocument')}}
<p>Are you sure you want to delete this document?</p>
<p>There is no undo, so be careful.</p>
{{/dropdown-dialog}}
{{/if}}
{{/if}}
{{#if permissions.documentTemplate}}
{{#if menuOpen}}
{{#dropdown-dialog target="save-template-button" position="bottom right" button="Save as Template" color="flat-green" onAction=(action 'onSaveTemplate') focusOn="new-template-name" }}
<div class="input-control">
<label>Name</label>
<div class="tip">Short name for this type of document</div>
{{input type='text' id="new-template-name" value=saveTemplate.name}}
</div>
<div class="input-control">
<label>Excerpt</label>
<div class="tip">Explain use case for this template</div>
{{textarea value=saveTemplate.description rows="3" id="new-template-desc"}}
</div>
{{/dropdown-dialog}}
{{/if}}
{{/if}}
{{/if}}

View file

@ -1,3 +1,5 @@
{{document/document-attachments document=document permissions=permissions}}
<div class="document-view {{if (is-equal document.layout 'doc') 'document-view-unified'}}">
{{#if hasPages}}

View file

@ -1,47 +0,0 @@
<div class="sidebar-panel">
<div class="title">Attachments</div>
<div class="document-sidebar-view-attachments">
{{#if permissions.documentEdit}}
<div id="upload-document-files" class="upload-document-files">
Drag-drop files or click to select files
</div>
{{/if}}
<ul class="list">
{{#each files key="id" as |a index|}}
<li class="item">
<img class="icon" src="/assets/img/attachments/{{document/file-icon a.extension}}" />
<a href="{{ appMeta.endpoint }}/public/attachments/{{ appMeta.orgId }}/{{ a.id }}">
<span class="file">{{ a.filename }}</span>
</a>
{{#if permissions.documentEdit}}
<div class="action round-button-mono">
<i class="material-icons color-gray delete-attachment-{{a.id}}" title="Delete" {{action 'onConfirmDelete' a.id a.filename}}>delete</i>
</div>
{{/if}}
</li>
{{/each}}
</ul>
{{#if emptyState}}
<div class="explainer">
<div class="empty-state">
There are no attachments
</div>
</div>
{{/if}}
</div>
<div class="dropdown-dialog delete-attachment-dialog">
<div class="content">
<p>Are you sure you want to delete <span class="bold">{{deleteAttachment.name}}?</span></p>
</div>
<div class="actions">
<div class="flat-button" {{action 'onCancel'}}>
cancel
</div>
<div class="flat-button flat-red" {{action 'onDelete'}}>
delete
</div>
</div>
<div class="clearfix"></div>
</div>
</div>

View file

@ -1,34 +0,0 @@
<div class="sidebar-panel">
<div class="title">Index</div>
<div class="document-sidebar-view-index">
<div class="structure">
{{#if this.session.authenticated}}
{{#unless emptyState}}
<div id="tocToolbar" class="hidden-xs hidden-sm toc-controls {{if state.actionablePage 'current-page' ''}}">
<div id="toc-up-button" class="round-button-mono {{if state.upDisabled 'disabled'}}" data-tooltip="Move up" data-tooltip-position="top center" {{action 'pageUp'}}>
<i class="material-icons">arrow_upward</i>
</div>
<div class="button-gap" />
<div id="toc-down-button" class="round-button-mono {{if state.downDisabled 'disabled'}}" data-tooltip="Move down" data-tooltip-position="top center" {{action 'pageDown'}}>
<i class="material-icons">arrow_downward</i>
</div>
<div class="button-gap" />
<div id="toc-outdent-button" class="round-button-mono {{if state.outdentDisabled 'disabled'}}" data-tooltip="Outdent" data-tooltip-position="top center" {{action 'pageOutdent'}}>
<i class="material-icons">format_indent_decrease</i>
</div>
<div class="button-gap" />
<div id="toc-indent-button" class="round-button-mono {{if state.indentDisabled 'disabled'}}" data-tooltip="Indent" data-tooltip-position="top center" {{action 'pageIndent'}}>
<i class="material-icons">format_indent_increase</i>
</div>
</div>
{{/unless}}
{{/if}}
<ul class="index-list">
{{#each pages key="id" as |p index|}}
{{document/sidebar-view-index-entry page=p index=index onClick=(action 'onEntryClick')}}
{{/each}}
</ul>
</div>
</div>
</div>

View file

@ -1,118 +0,0 @@
<div class="sidebar-toolbar">
<div class="round-button-mono" id="sidebar-zone-more-button">
<i class="material-icons">more_horiz</i>
</div>
<div class="margin-top-20"></div>
<div class="round-button-mono {{if (is-equal tab 'index') 'selected'}}" {{action 'onChangeTab' 'index'}}>
<i class="material-icons">view_headline</i>
</div>
<div class="margin-top-20"></div>
<div class="round-button-mono {{if (is-equal tab 'attachments') 'selected'}}" {{action 'onChangeTab' 'attachments'}}>
<i class="material-icons">attach_file</i>
</div>
{{#if permissions.documentEdit}}
<div class="margin-top-20"></div>
<div class="round-button-mono {{if (is-equal tab 'activity') 'selected'}}" {{action 'onChangeTab' 'activity'}}>
<i class="material-icons">timeline</i>
</div>
{{/if}}
</div>
<div class="sidebar-common">
{{#if document.template}}
<div class="template-header">Template</div>
{{/if}}
{{document/tag-editor documentTags=document.tags permissions=permissions onChange=(action 'onTagChange')}}
</div>
<div class="sidebar-wrapper">
{{#if (is-equal tab 'index')}}
{{document/sidebar-view-index document=document folder=folder pages=pages page=page permissions=permissions
onPageSequenceChange=(action 'onPageSequenceChange') onPageLevelChange=(action 'onPageLevelChange') onGotoPage=(action 'onGotoPage')}}
{{/if}}
{{#if (is-equal tab 'attachments')}}
{{document/sidebar-view-attachments document=document permissions=permissions}}
{{/if}}
{{#if (is-equal tab 'activity')}}
{{document/sidebar-view-activity document=document pages=pages permissions=permissions}}
{{/if}}
</div>
{{#dropdown-menu target="sidebar-zone-more-button" position="bottom left" open="click" onOpenCallback=(action 'onMenuOpen') onCloseCallback=(action 'onMenuOpen')}}
<ul class="menu">
{{#if session.authenticated}}
{{#if (is-equal document.layout 'section')}}
<li class="item" {{action 'onLayoutChange' 'doc'}}>Flat view</li>
<li class="divider"></li>
{{else}}
<li class="item" {{action 'onLayoutChange' 'section'}}>Section view</li>
<li class="divider"></li>
{{/if}}
{{#if pinState.isPinned}}
<li class="item" {{action 'onUnpin'}}>Unpin</li>
{{else}}
<li class="item" id="pin-document-button">Pin</li>
{{/if}}
{{#if permissions.documentEdit}}
<li class="item">
{{#link-to 'document.history'}}History{{/link-to}}
</li>
<li class="divider"></li>
{{/if}}
{{/if}}
{{#if permissions.documentTemplate}}
<li class="item" id="save-template-button">Template</li>
<li class="divider"></li>
{{/if}}
<li class="item" id="print-document-button" {{action 'onPrintDocument'}}>Print</li>
{{#if permissions.documentDelete}}
<li class="divider"></li>
<li class="item danger" id="delete-document-button">Delete</li>
{{/if}}
</ul>
{{/dropdown-menu}}
{{#if session.authenticated}}
{{#if menuOpen}}
{{#unless pinState.isPinned}}
{{#dropdown-dialog target="pin-document-button" position="bottom left" button="Pin" color="flat-green" onAction=(action 'onPin') focusOn="pin-document-name" }}
<div class="input-control">
<label>Pin Document</label>
<div class="tip">A 3 or 4 character name</div>
{{input type='text' id="pin-document-name" value=pinState.newName}}
</div>
{{/dropdown-dialog}}
{{/unless}}
{{/if}}
{{#if permissions.documentDelete}}
{{#if menuOpen}}
{{#dropdown-dialog target="delete-document-button" position="bottom left" button="Delete" color="flat-red" onAction=(action 'onDeleteDocument')}}
<p>Are you sure you want to delete this document?</p>
<p>There is no undo, so be careful.</p>
{{/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" }}
<div class="input-control">
<label>Name</label>
<div class="tip">Short name for this type of document</div>
{{input type='text' id="new-template-name" value=saveTemplate.name}}
</div>
<div class="input-control">
<label>Excerpt</label>
<div class="tip">Explain use case for this template</div>
{{textarea value=saveTemplate.description rows="3" id="new-template-desc"}}
</div>
{{/dropdown-dialog}}
{{/if}}
{{/if}}
{{/if}}

View file

@ -0,0 +1,14 @@
<div class="back-to-space">
{{#link-to 'folder' folder.id folder.slug}}
<div class="regular-button button-gray">
<i class="material-icons">arrow_back</i>
<div class="name">{{folder.name}}</div>
</div>
{{/link-to}}
</div>
<div class="document-category hide">
<div class="chip chip-action">
<span id="upload-document-files" class="chip-text">+ category</span>
</div>
</div>

View file

@ -9,7 +9,7 @@
{{/each}}
{{#if canAdd}}
<div class="chip-action">
<span id="add-tag-button" class="chip-text">add tag</span>
<span id="add-tag-button" class="chip-text">+ tag</span>
</div>
{{#dropdown-dialog target="add-tag-button" position="bottom left" button="Add" color="flat-green" onAction=(action 'addTag') focusOn="add-tag-field" onOpenCallback=(action 'onTagEditor') targetOffset="20px 0"}}
<div class="input-control">

View file

@ -2,7 +2,7 @@
<div class="panel">
<div class="form-header">
<div class="title">Categories</div>
<div class="tip">Organize and secure document access with optional categories</div>
<div class="tip">Sub-divide spaces and secure document access with categories</div>
</div>
<form id="category-form" {{action 'onAdd' on='submit'}}>
<div class="input-control">
@ -14,26 +14,34 @@
{{focus-input id=(concat 'edit-category-' cat.id) type="text" value=cat.category class="input-inline"}}
</div>
{{else}}
<div class="category">{{cat.category}}</div>
<div class="category">
<div class="name">{{cat.category}}</div>
<div class="info">7 documents, 14 people</div>
</div>
{{/if}}
<div class="pull-right">
<div class="pull-right buttons">
{{#if cat.editMode}}
<button type="submit" class="round-button-mono" {{action 'onSave' cat.id}}>
<i class="material-icons color-green">check</i>
</button>
<div class="round-button-mono" {{action 'onCancel' cat.id}}>
<div class="round-button-mono" {{action 'onEditCancel' cat.id}}>
<i class="material-icons color-gray">close</i>
</div>
{{else}}
<div {{action 'onEdit' cat.id}} class="action round-button-mono button-white">
<i class="material-icons">edit</i>
<div class="">
<div id="category-access-button-{{cat.id}}" data-tooltip="Set user access" data-tooltip-position="top center" class="action round-button-mono button-white" {{action 'onShowAccessPicker' cat.id}}>
<i class="material-icons">person</i>
</div>
<div {{action 'onEdit' cat.id}} class="action round-button-mono button-white">
<i class="material-icons">edit</i>
</div>
<div id="{{concat 'delete-category-' cat.id}}" class="action round-button-mono button-white">
<i class="material-icons">delete</i>
</div>
{{#dropdown-dialog target=(concat 'delete-category-' cat.id) position="bottom right" button="Delete" color="flat-red" onAction=(action 'onDelete' cat.id)}}
<p>Are you sure you want to delete category <b>{{cat.category}}?</b></p>
{{/dropdown-dialog}}
</div>
<div id="{{concat 'delete-category-' cat.id}}" class="action round-button-mono button-white">
<i class="material-icons">delete</i>
</div>
{{#dropdown-dialog target=(concat 'delete-category-' cat.id) position="bottom right" button="Delete" color="flat-red" onAction=(action 'onDelete' cat.id)}}
<p>Are you sure you want to delete category <b>{{cat.category}}?</b></p>
{{/dropdown-dialog}}
{{/if}}
</div>
</div>
@ -51,3 +59,18 @@
</form>
</div>
</div>
<div class="dropdown-dialog category-access-dialog">
<div class="content">
{{ui/ui-list-picker items=categoryUsers nameField='fullname'}}
</div>
<div class="actions">
<div class="flat-button" {{action 'onGrantCancel'}}>
cancel
</div>
<div class="flat-button flat-blue" {{action 'onGrantAccess'}}>
grant access
</div>
</div>
<div class="clearfix"></div>
</div>

View file

@ -54,7 +54,7 @@
{{#if permissions.spaceManage}}
<div class="button-gap"></div>
{{#link-to 'folder.settings' folder.id folder.slug}}{{model.document.name}}
<div class="round-button button-blue" id="space-settings-button" data-tooltip="Manage permissions" data-tooltip-position="top center">
<div class="round-button button-gray" id="space-settings-button" data-tooltip="Manage permissions" data-tooltip-position="top center">
<i class="material-icons">settings</i>
</div>
{{/link-to}}

View file

@ -0,0 +1,12 @@
<div class="widget-list-picker">
<ul class="options">
{{#each items as |item|}}
<li class="option {{if item.selected 'selected'}}" {{action 'onToggle' item}}>
<div class="text">{{get item nameField}}</div>
{{#if item.selected}}
<i class="material-icons">check</i>
{{/if}}
</li>
{{/each}}
</ul>
</div>