diff --git a/app/app/components/folder/documents-list.js b/app/app/components/folder/documents-list.js index ba68de9b..9db44990 100644 --- a/app/app/components/folder/documents-list.js +++ b/app/app/components/folder/documents-list.js @@ -12,17 +12,40 @@ import Ember from 'ember'; export default Ember.Component.extend({ + folderService: Ember.inject.service('folder'), selectedDocuments: [], - + moveTarget: null, emptyState: Ember.computed('documents', function() { return this.get('documents.length') === 0; }), didReceiveAttrs() { - this.set('selectedDocuments', []); this.audit.record('viewed-space'); + this.set('selectedDocuments', []); + this.set('canCreate', this.get('folderService').get('canEditCurrentFolder')); + this.set('deleteTargets', this.get('folders').rejectBy('id', this.get('folder.id'))); }, + didInsertElement() { + this._super(...arguments); + + this.setupAddWizard(); + }, + + setupAddWizard() { + Ember.run.schedule('afterRender', () => { + $('.start-document:not(.start-document-empty-state)').off('.hoverIntent'); + + $('.start-document:not(.start-document-empty-state)').hoverIntent({interval: 100, over: function() { + // in + $(this).find('.start-button').velocity("transition.slideDownIn", {duration: 300}); + }, out: function() { + // out + $(this).find('.start-button').velocity("transition.slideUpOut", {duration: 300}); + } }); + }); + }, + actions: { selectDocument(documentId) { let doc = this.get('documents').findBy('id', documentId); @@ -41,6 +64,39 @@ export default Ember.Component.extend({ this.set('selectedDocuments', list); this.get('onDocumentsChecked')(list); - } + }, + + onDelete() { + this.get("onDeleteSpace")(); + }, + + onImport() { + this.get('onImport')(); + }, + + onShowDocumentWizard(docId) { + if ($("#new-document-wizard").is(':visible') && this.get('docId') === docId) { + this.send('onHideDocumentWizard'); + return; + } + + this.set('docId', docId); + + if (docId === '') { + $("#new-document-wizard").insertAfter('#wizard-placeholder'); + } else { + $("#new-document-wizard").insertAfter(`#document-${docId}`); + } + + $("#new-document-wizard").velocity("transition.slideDownIn", { duration: 300, complete: + function() { + $("#new-document-name").focus(); + }}); + }, + + onHideDocumentWizard() { + $("#new-document-wizard").insertAfter('#wizard-placeholder'); + $("#new-document-wizard").velocity("transition.slideUpOut", { duration: 300 }); + } } }); diff --git a/app/app/components/folder/folder-heading.js b/app/app/components/folder/folder-heading.js new file mode 100644 index 00000000..0d55d398 --- /dev/null +++ b/app/app/components/folder/folder-heading.js @@ -0,0 +1,60 @@ +// 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 Ember from 'ember'; +import NotifierMixin from '../../mixins/notifier'; +import TooltipMixin from '../../mixins/tooltip'; + +const { + computed, +} = Ember; + +export default Ember.Component.extend(NotifierMixin, TooltipMixin, { + folderService: Ember.inject.service('folder'), + folderName: '', + hasNameError: computed.empty('folderName'), + editMode: false, + isEditor: false, + + keyUp(e) { + if (e.keyCode === 27) { // escape key + this.send('onCancel'); + } + }, + + actions: { + toggleEdit() { + this.set('folderName', this.get('folder.name')); + this.set('editMode', true); + + Ember.run.schedule('afterRender', () => { + $('#folder-name').select(); + }); + }, + + onSave() { + if (this.get('hasNameError')) { + return; + } + + this.set('folder.name', this.get('folderName')); + + this.get('folderService').save(this.get('folder')); + this.showNotification('Saved'); + + this.set('editMode', false); + }, + + onCancel() { + this.set('editMode', false); + } + } +}); diff --git a/app/app/components/folder/folder-toolbar.js b/app/app/components/folder/folder-toolbar.js index 37d805cb..bd086414 100644 --- a/app/app/components/folder/folder-toolbar.js +++ b/app/app/components/folder/folder-toolbar.js @@ -28,12 +28,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { isFolderOwner: computed.equal('folder.userId', 'session.user.id'), moveFolderId: "", drop: null, - pinned: Ember.inject.service(), - pinState : { - isPinned: false, - pinId: '', - newName: '', - }, didReceiveAttrs() { this.set('isFolderOwner', this.get('folder.userId') === this.get("session.user.id")); @@ -46,11 +40,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { }); this.set('movedFolderOptions', targets); - - let folder = this.get('folder'); - this.set('pinState.pinId', this.get('pinned').isSpacePinned(folder.get('id'))); - this.set('pinState.isPinned', this.get('pinState.pinId') !== ''); - this.set('pinState.newName', folder.get('name').substring(0,3).toUpperCase()); }, didRender() { @@ -97,39 +86,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, AuthMixin, { this.attrs.onMoveDocument(this.get('moveFolderId')); this.set("moveFolderId", ""); - return true; - }, - - unpin() { - this.audit.record('unpinned-space'); - - this.get('pinned').unpinItem(this.get('pinState.pinId')).then(() => { - this.set('pinState.isPinned', false); - this.set('pinState.pinId', ''); - this.eventBus.publish('pinChange'); - }); - }, - - pin() { - let pin = { - pin: this.get('pinState.newName'), - documentId: '', - folderId: this.get('folder.id') - }; - - if (is.empty(pin.pin)) { - $("#pin-space-name").addClass("error").focus(); - return false; - } - - this.audit.record('pinned-space'); - - this.get('pinned').pinItem(pin).then((pin) => { - this.set('pinState.isPinned', true); - this.set('pinState.pinId', pin.get('id')); - this.eventBus.publish('pinChange'); - }); - return true; } } diff --git a/app/app/components/folder/folders-list.js b/app/app/components/folder/folders-list.js deleted file mode 100644 index c63296f0..00000000 --- a/app/app/components/folder/folders-list.js +++ /dev/null @@ -1,193 +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 Ember from 'ember'; -import constants from '../../utils/constants'; -import TooltipMixin from '../../mixins/tooltip'; -import NotifierMixin from '../../mixins/notifier'; - -const { - inject: { service } -} = Ember; - -export default Ember.Component.extend(TooltipMixin, NotifierMixin, { - folderService: Ember.inject.service('folder'), - templateService: Ember.inject.service('template'), - appMeta: service(), - publicFolders: [], - protectedFolders: [], - privateFolders: [], - savedTemplates: [], - hasPublicFolders: false, - hasProtectedFolders: false, - hasPrivateFolders: false, - newFolder: "", - showScrollTool: false, - showingDocument: false, - showingList: true, - - init() { - this._super(...arguments); - - if (this.get('noFolder')) { - return; - } - - let _this = this; - this.get('templateService').getSavedTemplates().then(function(saved) { - let emptyTemplate = { - id: "0", - title: "Empty", - description: "An empty canvas for your words", - img: "insert_drive_file", - layout: "doc", - locked: true - }; - - saved.forEach(function(t) { - Ember.set(t, 'img', 'content_copy'); - }); - - saved.unshiftObject(emptyTemplate); - _this.set('savedTemplates', saved); - }); - }, - - didRender() { - if (this.get('noFolder')) { - return; - } - - if (this.get('folderService').get('canEditCurrentFolder')) { - this.addTooltip(document.getElementById("start-document-button")); - } - }, - - didInsertElement() { - if (this.get('noFolder')) { - return; - } - - this.eventBus.subscribe('resized', this, 'positionTool'); - this.eventBus.subscribe('scrolled', this, 'positionTool'); - }, - - willDestroyElement() { - this.eventBus.unsubscribe('resized'); - this.eventBus.unsubscribe('scrolled'); - this.destroyTooltips(); - }, - - didReceiveAttrs() { - let folders = this.get('folders'); - - // clear out state - this.set('publicFolders', []); - this.set('protectedFolders', []); - this.set('privateFolders', []); - - _.each(folders, folder => { - if (folder.get('folderType') === constants.FolderType.Public) { - let folders = this.get('publicFolders'); - folders.pushObject(folder); - this.set('publicFolders', folders); - } - if (folder.get('folderType') === constants.FolderType.Private) { - let folders = this.get('privateFolders'); - folders.pushObject(folder); - this.set('privateFolders', folders); - } - if (folder.get('folderType') === constants.FolderType.Protected) { - let folders = this.get('protectedFolders'); - folders.pushObject(folder); - this.set('protectedFolders', folders); - } - }); - - this.set('hasPublicFolders', this.get('publicFolders.length') > 0); - this.set('hasPrivateFolders', this.get('privateFolders.length') > 0); - this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0); - }, - - positionTool() { - if (this.get('isDestroyed') || this.get('isDestroying')) { - return; - } - - let s = $(".scroll-space-tool"); - let windowpos = $(window).scrollTop(); - - if (windowpos >= 300) { - this.set('showScrollTool', true); - s.addClass("stuck-space-tool"); - s.css('left', parseInt($(".zone-navigation").css('width')) + parseInt($(".zone-sidebar").css('width')) - 17 + 'px'); - } else { - this.set('showScrollTool', false); - s.removeClass("stuck-space-tool"); - } - }, - - navigateToDocument(document) { - this.attrs.showDocument(this.get('folder'), document); - }, - - actions: { - onImport() { - this.attrs.onImport(); - }, - - scrollTop() { - this.set('showScrollTool', false); - - $("html,body").animate({ - scrollTop: 0 - }, 500, "linear"); - }, - - addFolder() { - var folderName = this.get('newFolder'); - - if (is.empty(folderName)) { - $("#new-folder-name").addClass("error").focus(); - return false; - } - - this.attrs.onFolderAdd(folderName); - - this.set('newFolder', ""); - return true; - }, - - showDocument() { - this.set('showingDocument', true); - this.set('showingList', false); - }, - - showList() { - this.set('showingDocument', false); - this.set('showingList', true); - }, - - onEditTemplate(template) { - this.navigateToDocument(template); - }, - - onDocumentTemplate(id /*, title, type*/ ) { - let self = this; - - this.send("showNotification", "Creating"); - - this.get('templateService').importSavedTemplate(this.folder.get('id'), id).then(function(document) { - self.navigateToDocument(document); - }); - } - } -}); diff --git a/app/app/components/folder/sidebar-folders-list.js b/app/app/components/folder/sidebar-folders-list.js new file mode 100644 index 00000000..c358b74f --- /dev/null +++ b/app/app/components/folder/sidebar-folders-list.js @@ -0,0 +1,73 @@ +// 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 Ember from 'ember'; +import constants from '../../utils/constants'; +import TooltipMixin from '../../mixins/tooltip'; +import NotifierMixin from '../../mixins/notifier'; +import AuthMixin from '../../mixins/auth'; + +export default Ember.Component.extend(TooltipMixin, NotifierMixin, AuthMixin, { + publicFolders: [], + protectedFolders: [], + privateFolders: [], + hasPublicFolders: false, + hasProtectedFolders: false, + hasPrivateFolders: false, + newFolder: '', + + didReceiveAttrs() { + let folders = this.get('folders'); + + // clear out state + this.set('publicFolders', []); + this.set('protectedFolders', []); + this.set('privateFolders', []); + + _.each(folders, folder => { + if (folder.get('folderType') === constants.FolderType.Public) { + let folders = this.get('publicFolders'); + folders.pushObject(folder); + this.set('publicFolders', folders); + } + if (folder.get('folderType') === constants.FolderType.Private) { + let folders = this.get('privateFolders'); + folders.pushObject(folder); + this.set('privateFolders', folders); + } + if (folder.get('folderType') === constants.FolderType.Protected) { + let folders = this.get('protectedFolders'); + folders.pushObject(folder); + this.set('protectedFolders', folders); + } + }); + + this.set('hasPublicFolders', this.get('publicFolders.length') > 0); + this.set('hasPrivateFolders', this.get('privateFolders.length') > 0); + this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0); + }, + + actions: { + addFolder() { + var folderName = this.get('newFolder'); + + if (is.empty(folderName)) { + $("#new-folder-name").addClass("error").focus(); + return false; + } + + this.attrs.onFolderAdd(folderName); + + this.set('newFolder', ''); + return true; + } + } +}); diff --git a/app/app/pods/settings/route.js b/app/app/components/folder/sidebar-permissions.js similarity index 59% rename from app/app/pods/settings/route.js rename to app/app/components/folder/sidebar-permissions.js index 5500cd14..cd7b2cba 100644 --- a/app/app/pods/settings/route.js +++ b/app/app/components/folder/sidebar-permissions.js @@ -16,38 +16,15 @@ const { inject: { service } } = Ember; -export default Ember.Route.extend(NotifierMixin, { +export default Ember.Component.extend(NotifierMixin, { folderService: service('folder'), userService: service('user'), - folder: {}, - tab: "", - localStorage: service(), + appMeta: service(), store: service(), - beforeModel: function (transition) { - this.tab = is.not.undefined(transition.queryParams.tab) ? transition.queryParams.tab : "tabGeneral"; - }, - - model(params) { - return this.get('folderService').getFolder(params.folder_id); - }, - - setupController(controller, model) { - this.folder = model; - controller.set('model', model); - - controller.set('tabGeneral', false); - controller.set('tabShare', false); - controller.set('tabPermissions', false); - controller.set('tabDelete', false); - controller.set(this.get('tab'), true); - - this.get('folderService').getAll().then((folders) => { - controller.set('folders', folders.rejectBy('id', model.get('id'))); - }); - + didReceiveAttrs() { this.get('userService').getAll().then((users) => { - controller.set('users', users); + this.set('users', users); var folderPermissions = []; @@ -57,8 +34,8 @@ export default Ember.Route.extend(NotifierMixin, { let u = { userId: user.get('id'), fullname: user.get('fullname'), - orgId: model.get('orgId'), - folderId: model.get('id'), + orgId: this.get('folder.orgId'), + folderId: this.get('folder.id'), canEdit: false, canView: false, canViewPrevious: false @@ -72,15 +49,15 @@ export default Ember.Route.extend(NotifierMixin, { var u = { userId: "", fullname: " Everyone", - orgId: model.get('orgId'), - folderId: model.get('id'), + orgId: this.get('folder.orgId'), + folderId: this.get('folder.id'), canEdit: false, canView: false }; folderPermissions.pushObject(u); - this.get('folderService').getPermissions(model.id).then((permissions) => { + this.get('folderService').getPermissions(this.get('folder.id')).then((permissions) => { permissions.forEach((permission, index) => { // eslint-disable-line no-unused-vars var folderPermission = folderPermissions.findBy('userId', permission.get('userId')); if (is.not.undefined(folderPermission)) { @@ -99,38 +76,26 @@ export default Ember.Route.extend(NotifierMixin, { return this.get('store').push(data); }); - controller.set('permissions', folderPermissions.sortBy('fullname')); + this.set('permissions', folderPermissions.sortBy('fullname')); }); - }); + }); + }, + + getDefaultInvitationMessage() { + return "Hey there, I am sharing the " + this.get('folder.name') + " (in " + this.get("appMeta.title") + ") with you so we can both access the same documents."; }, actions: { - onRename: function (folder) { - let self = this; - this.get('folderService').save(folder).then(function () { - self.showNotification("Renamed"); + setPermissions() { + let message = this.getDefaultInvitationMessage(); + let folder = this.get('folder'); + let permissions = this.get('permissions'); + + this.get('permissions').forEach((permission, index) => { // eslint-disable-line no-unused-vars + Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked')); + Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked')); }); - }, - onRemove(moveId) { - this.get('folderService').remove(this.folder.get('id'), moveId).then(() => { /* jshint ignore:line */ - this.showNotification("Deleted"); - this.get('localStorage').clearSessionItem('folder'); - - this.get('folderService').getFolder(moveId).then((folder) => { - this.get('folderService').setCurrentFolder(folder); - this.transitionTo('folder', folder.get('id'), folder.get('slug')); - }); - }); - }, - - onShare: function(invitation) { - this.get('folderService').share(this.folder.get('id'), invitation).then(() => { - this.showNotification("Shared"); - }); - }, - - onPermission: function (folder, message, permissions) { var data = permissions.map((obj) => { let permission = { 'orgId': obj.orgId, @@ -142,6 +107,7 @@ export default Ember.Route.extend(NotifierMixin, { return permission; }); + var payload = { Message: message, Roles: data }; this.get('folderService').savePermissions(folder.get('id'), payload).then(() => { diff --git a/app/app/components/folder/folder-settings.js b/app/app/components/folder/sidebar-share.js similarity index 52% rename from app/app/components/folder/folder-settings.js rename to app/app/components/folder/sidebar-share.js index cf7e5868..7f0cd7dd 100644 --- a/app/app/components/folder/folder-settings.js +++ b/app/app/components/folder/sidebar-share.js @@ -10,58 +10,30 @@ // https://documize.com import Ember from 'ember'; -import AuthMixin from '../../mixins/auth'; +import NotifierMixin from '../../mixins/notifier'; const { inject: { service } } = Ember; -export default Ember.Component.extend(AuthMixin, { +export default Ember.Component.extend(NotifierMixin, { folderService: service('folder'), appMeta: service(), - users: [], - folders: [], - folder: {}, - moveTarget: null, - inviteEmail: "", - inviteMessage: "", - roleMessage: "", - permissions: {}, + inviteEmail: '', + inviteMessage: '', getDefaultInvitationMessage() { return "Hey there, I am sharing the " + this.folder.get('name') + " (in " + this.get("appMeta.title") + ") with you so we can both access the same documents."; }, willRender() { - if (this.inviteMessage.length === 0) { + if (this.get('inviteMessage').length === 0) { this.set('inviteMessage', this.getDefaultInvitationMessage()); } - - if (this.roleMessage.length === 0) { - this.set('roleMessage', this.getDefaultInvitationMessage()); - } }, actions: { - rename() { - if (is.empty(this.folder.get('name'))) { - $("#folderName").addClass("error").focus(); - return; - } - - this.sendAction("onRename", this.folder); - }, - - remove() { - if (is.null(this.get('moveTarget'))) { - $("#delete-target > select").addClass("error").focus(); - return; - } - - this.sendAction("onRemove", this.get('moveTarget').get('id')); - }, - - share() { + onShare() { var email = this.get('inviteEmail').trim().replace(/ /g, ''); var message = this.get('inviteMessage').trim(); @@ -70,7 +42,7 @@ export default Ember.Component.extend(AuthMixin, { } if (email.length === 0) { - $("#inviteEmail").addClass("error").focus(); + $('#inviteEmail').addClass('error').focus(); return; } @@ -92,24 +64,11 @@ export default Ember.Component.extend(AuthMixin, { result.Recipients.push(email); } - this.set('inviteEmail', ""); + this.set('inviteEmail', ''); - this.sendAction("onShare", result); - }, - - setPermissions() { - var message = this.get('roleMessage').trim(); - - if (message.length === 0) { - message = this.getDefaultInvitationMessage(); - } - - this.get('permissions').forEach((permission, index) => { // eslint-disable-line no-unused-vars - Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked')); - Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked')); + this.get('folderService').share(this.folder.get('id'), result).then(() => { + this.showNotification('Shared'); }); - - this.sendAction("onPermission", this.get('folder'), message, this.get('permissions')); } } }); diff --git a/app/app/components/folder/sidebar-zone.js b/app/app/components/folder/sidebar-zone.js new file mode 100644 index 00000000..8e0dcb08 --- /dev/null +++ b/app/app/components/folder/sidebar-zone.js @@ -0,0 +1,105 @@ +// 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 Ember from 'ember'; +import TooltipMixin from '../../mixins/tooltip'; +import NotifierMixin from '../../mixins/notifier'; +import AuthMixin from '../../mixins/auth'; + +const { + inject: { service } +} = Ember; + +export default Ember.Component.extend(TooltipMixin, NotifierMixin, AuthMixin, { + folderService: service('folder'), + templateService: service('template'), + appMeta: service(), + pinned: service(), + publicFolders: [], + protectedFolders: [], + privateFolders: [], + hasPublicFolders: false, + hasProtectedFolders: false, + hasPrivateFolders: false, + newFolder: "", + menuOpen: false, + pinState : { + isPinned: false, + pinId: '', + newName: '', + }, + tab: '', + + init() { + this._super(...arguments); + + if (is.empty(this.get('tab')) || is.undefined(this.get('tab'))) { + this.set('tab', 'index'); + } + }, + + didReceiveAttrs() { + if (!this.get('noFolder')) { + let folder = this.get('folder'); + this.set('pinState.pinId', this.get('pinned').isSpacePinned(folder.get('id'))); + this.set('pinState.isPinned', this.get('pinState.pinId') !== ''); + this.set('pinState.newName', folder.get('name').substring(0,3).toUpperCase()); + } + }, + + actions: { + onFolderAdd(folderName) { + this.attrs.onFolderAdd(folderName); + return true; + }, + + onChangeTab(tab) { + this.set('tab', tab); + }, + + onMenuOpen() { + this.set('menuOpen', !this.get('menuOpen')); + }, + + onUnpin() { + this.audit.record('unpinned-space'); + + this.get('pinned').unpinItem(this.get('pinState.pinId')).then(() => { + this.set('pinState.isPinned', false); + this.set('pinState.pinId', ''); + this.eventBus.publish('pinChange'); + }); + }, + + onPin() { + let pin = { + pin: this.get('pinState.newName'), + documentId: '', + folderId: this.get('folder.id') + }; + + if (is.empty(pin.pin)) { + $('#pin-space-name').addClass('error').focus(); + return false; + } + + this.audit.record('pinned-space'); + + this.get('pinned').pinItem(pin).then((pin) => { + this.set('pinState.isPinned', true); + this.set('pinState.pinId', pin.get('id')); + this.eventBus.publish('pinChange'); + }); + + return true; + }, + } +}); diff --git a/app/app/components/folder/start-document.js b/app/app/components/folder/start-document.js index 65743767..d4097f89 100644 --- a/app/app/components/folder/start-document.js +++ b/app/app/components/folder/start-document.js @@ -12,13 +12,37 @@ import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; + +const { + computed, +} = Ember; export default Ember.Component.extend(NotifierMixin, { localStorage: Ember.inject.service(), appMeta: Ember.inject.service(), - + templateService: Ember.inject.service('template'), canEditTemplate: "", importedDocuments: [], + savedTemplates: [], drop: null, + newDocumentName: 'New Document', + newDocumentNameMissing: computed.empty('newDocumentName'), + + init() { + this._super(...arguments); + + this.get('templateService').getSavedTemplates().then((saved) => { + let emptyTemplate = { + id: "0", + title: "Empty", + description: "An empty canvas for your words", + layout: "doc", + locked: true + }; + + saved.unshiftObject(emptyTemplate); + this.set('savedTemplates', saved); + }); + }, didInsertElement() { this.setupImport(); @@ -84,8 +108,31 @@ export default Ember.Component.extend(NotifierMixin, { }, actions: { + onHideDocumentWizard() { + this.get('onHideDocumentWizard')(); + }, + + editTemplate(template) { + this.audit.record('edited-saved-template'); + this.get('router').transitionTo('document', this.get('folder.id'), this.get('folder.slug'), template.get('id'), template.get('slug')); + + return true; + }, + + startDocument(template) { + this.audit.record('used-saved-template'); + this.send("showNotification", "Creating"); + + this.get('templateService').importSavedTemplate(this.folder.get('id'), template.id).then((document) => { + this.get('router').transitionTo('document', this.get('folder.id'), this.get('folder.slug'), document.get('id'), document.get('slug')); + }); + + return true; + }, + onDocumentImporting(filename) { this.send("showNotification", `Importing ${filename}`); + this.get('onHideDocumentWizard')(); let documents = this.get('importedDocuments'); documents.push(filename); @@ -99,25 +146,12 @@ export default Ember.Component.extend(NotifierMixin, { documents.pop(filename); this.set('importedDocuments', documents); - this.attrs.onImport(); + this.get('onImport')(); if (documents.length === 0) { // this.get('showDocument')(this.get('folder'), document); } }, - - editTemplate(template) { - this.audit.record('edited-saved-template'); - this.attrs.onEditTemplate(template); - - return true; - }, - - startDocument(template) { - this.audit.record('used-saved-template'); - this.attrs.onDocumentTemplate(template.id, template.title, "private"); - - return true; - } } }); + diff --git a/app/app/components/layout/zone-header.js b/app/app/components/layout/zone-header.js deleted file mode 100644 index 937dca3c..00000000 --- a/app/app/components/layout/zone-header.js +++ /dev/null @@ -1,21 +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 Ember from 'ember'; - -export default Ember.Component.extend({ - title: "", - message: "", - - hasMessage: Ember.computed('message', function() { - return this.get('message').length !== 0; - }) -}); diff --git a/app/app/pods/customize/folders/template.hbs b/app/app/pods/customize/folders/template.hbs index 9ba8a6f5..44ec0bd9 100644 --- a/app/app/pods/customize/folders/template.hbs +++ b/app/app/pods/customize/folders/template.hbs @@ -1,43 +1,41 @@
-
-
-
{{folders.length}} shared {{label}}
-
View and change shared space ownership
-
-
- - +
+
{{folders.length}} shared {{label}}
+
View and change shared space ownership
+
+
+
+ + + + + + + + {{#each folders as |folder|}} - - - - - - {{#each folders as |folder|}} - - - + - - {{/each}} - -
SpaceParticipants
SpaceParticipants
- {{#link-to 'folder' folder.id folder.slug class="alt"}}{{folder.name}}{{/link-to}} - - {{#each folder.sharedWith as |person|}} - {{#if person.isEveryone}} - Everyone - {{else}} + + {{#link-to 'folder' folder.id folder.slug class="alt"}}{{folder.name}}{{/link-to}} + + {{#each folder.sharedWith as |person|}} + {{#if person.isEveryone}} + Everyone + {{else}} - {{#if person.isOwner}} - {{person.firstname}} {{person.lastname}} (owner) - {{else}} - {{person.firstname}} {{person.lastname}} - make owner - {{/if}} + {{#if person.isOwner}} + {{person.firstname}} {{person.lastname}} (owner) + {{else}} + {{person.firstname}} {{person.lastname}} + make owner {{/if}} -
- {{/each}} -
-
-
+ {{/if}} +
+ {{/each}} + + + {{/each}} + + +
diff --git a/app/app/pods/customize/template.hbs b/app/app/pods/customize/template.hbs index 462de47e..1e00c3f2 100644 --- a/app/app/pods/customize/template.hbs +++ b/app/app/pods/customize/template.hbs @@ -1,20 +1,28 @@ {{layout/zone-navigation}} - -{{#layout/zone-sidebar}} - {{layout/sidebar-intro title='Settings' message='Documize application settings'}} - -{{/layout/zone-sidebar}} - -{{#layout/zone-content}} - {{outlet}} -{{/layout/zone-content}} +{{#layout/zone-container}} + {{#layout/zone-sidebar}} + + + + {{/layout/zone-sidebar}} + {{#layout/zone-content}} +
+ {{outlet}} +
+ {{/layout/zone-content}} +{{/layout/zone-container}} diff --git a/app/app/pods/document/index/template.hbs b/app/app/pods/document/index/template.hbs index d1b6b62e..43785a2c 100644 --- a/app/app/pods/document/index/template.hbs +++ b/app/app/pods/document/index/template.hbs @@ -1,45 +1,23 @@ -
- - - -
-
-
-
- {{#if toggled}} - - {{else}} - - {{/if}} -
-
- {{#link-to 'folder' model.folder.id model.folder.slug}} - arrow_back {{model.folder.name}} - {{/link-to}} -
- {{document/document-heading document=model.document isEditor=model.isEditor onSaveDocument=(action 'onSaveDocument')}} - {{document/document-view document=model.document links=model.links pages=model.pages - folder=model.folder folders=model.folders sections=model.sections isEditor=model.isEditor pageId=pageId - onSavePage=(action 'onSavePage') onInsertSection=(action 'onInsertSection') - onSavePageAsBlock=(action 'onSavePageAsBlock') onDeleteBlock=(action 'onDeleteBlock') - onCopyPage=(action 'onCopyPage') onMovePage=(action 'onMovePage') onDeletePage=(action 'onPageDeleted')}} -
-
+ {{/layout/zone-sidebar}} + {{#layout/zone-content}} +
+
+ {{#link-to 'folder' model.folder.id model.folder.slug}} + arrow_back {{model.folder.name}} + {{/link-to}}
+ {{document/document-heading document=model.document isEditor=model.isEditor onSaveDocument=(action 'onSaveDocument')}} + {{document/document-view document=model.document links=model.links pages=model.pages + folder=model.folder folders=model.folders sections=model.sections isEditor=model.isEditor pageId=pageId + onSavePage=(action 'onSavePage') onInsertSection=(action 'onInsertSection') + onSavePageAsBlock=(action 'onSavePageAsBlock') onDeleteBlock=(action 'onDeleteBlock') + onCopyPage=(action 'onCopyPage') onMovePage=(action 'onMovePage') onDeletePage=(action 'onPageDeleted')}}
-
- -
+ {{/layout/zone-content}} +{{/layout/zone-container}} diff --git a/app/app/pods/document/route.js b/app/app/pods/document/route.js index c3127cda..c3ea9513 100644 --- a/app/app/pods/document/route.js +++ b/app/app/pods/document/route.js @@ -54,14 +54,6 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { sections: this.get('sectionService').getAll() }); }, - - activate() { - $('body').addClass('background-color-off-white'); - }, - - deactivate() { - $('body').removeClass('background-color-off-white'); - }, actions: { error(error /*, transition*/ ) { diff --git a/app/app/pods/folder/controller.js b/app/app/pods/folder/controller.js index c3d84974..3369ecc3 100644 --- a/app/app/pods/folder/controller.js +++ b/app/app/pods/folder/controller.js @@ -15,14 +15,13 @@ import NotifierMixin from '../../mixins/notifier'; export default Ember.Controller.extend(NotifierMixin, { documentService: Ember.inject.service('document'), folderService: Ember.inject.service('folder'), + localStorage: Ember.inject.service('localStorage'), hasSelectedDocuments: false, selectedDocuments: [], + queryParams: ['tab'], + tab: 'index', actions: { - onImport() { - this.get('target.router').refresh(); - }, - onDocumentsChecked(documents) { this.set('selectedDocuments', documents); this.set('hasSelectedDocuments', documents.length > 0); @@ -61,10 +60,6 @@ export default Ember.Controller.extend(NotifierMixin, { this.send("showNotification", "Deleted"); }, - showDocument(folder, document) { - this.transitionToRoute('document', folder.get('id'), folder.get('slug'), document.get('id'), document.get('slug')); - }, - onFolderAdd(folder) { let self = this; this.showNotification("Added"); @@ -73,6 +68,18 @@ export default Ember.Controller.extend(NotifierMixin, { self.get('folderService').setCurrentFolder(newFolder); self.transitionToRoute('folder', newFolder.get('id'), newFolder.get('slug')); }); + }, + + onDeleteSpace() { + this.get('folderService').delete(this.get('model.folder.id')).then(() => { /* jshint ignore:line */ + this.showNotification("Deleted"); + this.get('localStorage').clearSessionItem('folder'); + this.transitionToRoute('application'); + }); + }, + + onImport() { + this.get('target.router').refresh(); } } }); diff --git a/app/app/pods/folder/route.js b/app/app/pods/folder/route.js index 329faf8f..d7dd7d35 100644 --- a/app/app/pods/folder/route.js +++ b/app/app/pods/folder/route.js @@ -15,20 +15,47 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { documentService: Ember.inject.service('document'), folderService: Ember.inject.service('folder'), - + session: Ember.inject.service(''), folder: {}, - model: function (params) { + beforeModel() { + this.set('folderId', this.paramsFor('folder').folder_id) + + return new Ember.RSVP.Promise((resolve) => { + this.get('folderService').getFolder(this.get('folderId')).then((folder) => { + this.set('folder', folder); + + this.get('folderService').setCurrentFolder(folder).then(() => { + this.set('isEditor', this.get('folderService').get('canEditCurrentFolder')); + this.set('isFolderOwner', this.get('session.user.id') === folder.get('userId')); + + resolve(); + }); + }); + }); + }, + + model(params) { return Ember.RSVP.hash({ - folder: this.get('folderService').getFolder(params.folder_id), + folder: this.get('folder'), + isEditor: this.get('isEditor'), + isFolderOwner: this.get('isFolderOwner'), folders: this.get('folderService').getAll(), documents: this.get('documentService').getAllByFolder(params.folder_id) }); }, - setupController: function (controller, model) { + setupController(controller, model) { controller.set('model', model); this.browser.setTitle(model.folder.get('name')); - this.get('folderService').setCurrentFolder(model.folder); - } + }, + + actions: { + error(error /*, transition*/ ) { + if (error) { + this.transitionTo('/not-found'); + return false; + } + } + } }); diff --git a/app/app/pods/folder/template.hbs b/app/app/pods/folder/template.hbs index c66f742f..0aa88c09 100644 --- a/app/app/pods/folder/template.hbs +++ b/app/app/pods/folder/template.hbs @@ -1,12 +1,14 @@ {{layout/zone-navigation}} - -{{#layout/zone-sidebar}} - {{folder/folders-list folders=model.folders folder=model.folder onImport=(action 'onImport') onFolderAdd=(action 'onFolderAdd') - showDocument=(action 'showDocument')}} -{{/layout/zone-sidebar}} - -{{#layout/zone-content}} - {{folder/folder-toolbar folders=model.folders folder=model.folder hasSelectedDocuments=hasSelectedDocuments onDeleteDocument=(action - 'onDeleteDocument') onMoveDocument=(action 'onMoveDocument')}} - {{folder/documents-list documents=model.documents folder=model.folder isFolderOwner=isFolderOwner onDocumentsChecked=(action 'onDocumentsChecked') }} -{{/layout/zone-content}} +{{#layout/zone-container}} + {{#layout/zone-sidebar}} + {{folder/sidebar-zone folders=model.folders folder=model.folder isFolderOwner=model.isFolderOwner isEditor=model.isEditor tab=tab + onFolderAdd=(action 'onFolderAdd')}} + {{/layout/zone-sidebar}} + {{#layout/zone-content}} + {{folder/folder-heading folder=model.folder isFolderOwner=model.isFolderOwner isEditor=model.isEditor}} + {{folder/folder-toolbar folders=model.folders folder=model.folder hasSelectedDocuments=hasSelectedDocuments + onDeleteDocument=(action 'onDeleteDocument') onMoveDocument=(action 'onMoveDocument')}} + {{folder/documents-list documents=model.documents folders=model.folders folder=model.folder isFolderOwner=model.isFolderOwner isEditor=model.isEditor + onDocumentsChecked=(action 'onDocumentsChecked') onDeleteSpace=(action 'onDeleteSpace') onImport=(action 'onImport')}} + {{/layout/zone-content}} +{{/layout/zone-container}} \ No newline at end of file diff --git a/app/app/pods/folders/template.hbs b/app/app/pods/folders/template.hbs index eb81b23e..b9af815e 100644 --- a/app/app/pods/folders/template.hbs +++ b/app/app/pods/folders/template.hbs @@ -1,8 +1,9 @@ {{layout/zone-navigation}} - -{{#layout/zone-sidebar}} - {{folder/folders-list folders=model noFolder=true onFolderAdd=(action 'onFolderAdd')}} -{{/layout/zone-sidebar}} - -{{#layout/zone-content}} -{{/layout/zone-content}} +{{#layout/zone-container}} + {{#layout/zone-sidebar}} + {{folder/sidebar-zone folders=model noFolder=true isFolderOwner=false isEditor=false + onFolderAdd=(action 'onFolderAdd')}} + {{/layout/zone-sidebar}} + {{#layout/zone-content}} + {{/layout/zone-content}} +{{/layout/zone-container}} diff --git a/app/app/pods/profile/template.hbs b/app/app/pods/profile/template.hbs index 476f9eb5..230554d9 100644 --- a/app/app/pods/profile/template.hbs +++ b/app/app/pods/profile/template.hbs @@ -1,12 +1,18 @@ {{layout/zone-navigation}} - -{{#layout/zone-sidebar}} - {{layout/sidebar-intro title="Profile" message=session.user.fullname}} - -{{/layout/zone-sidebar}} - -{{#layout/zone-content}} - {{user-profile model=model save=(action 'save')}} -{{/layout/zone-content}} +{{#layout/zone-container}} + {{#layout/zone-sidebar}} + + + + {{/layout/zone-sidebar}} + {{#layout/zone-content}} + {{user-profile model=model save=(action 'save')}} + {{/layout/zone-content}} +{{/layout/zone-container}} diff --git a/app/app/pods/search/template.hbs b/app/app/pods/search/template.hbs index d1dbae70..bf1e19cf 100644 --- a/app/app/pods/search/template.hbs +++ b/app/app/pods/search/template.hbs @@ -1,16 +1,22 @@ {{layout/zone-navigation}} - -{{#layout/zone-sidebar}} - {{layout/sidebar-intro title="Search" message='Search by: #tags, keywords, "some phrase", this AND that, this OR that'}} -