diff --git a/app/app/components/document/document-sidebar-edits.js b/app/app/components/document/document-sidebar-edits.js index da17e751..957fea8a 100644 --- a/app/app/components/document/document-sidebar-edits.js +++ b/app/app/components/document/document-sidebar-edits.js @@ -1,64 +1,64 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com import Ember from 'ember'; export default Ember.Component.extend({ - document: {}, - meta: [], - pages: [], + document: {}, + meta: [], + pages: [], - didReceiveAttrs() { - let editors = this.get('meta.editors'); - let toc = this.get('pages'); + didReceiveAttrs() { + let editors = this.get('meta.editors'); + let toc = this.get('pages'); - if (is.null(editors)) { - return; - } + if (is.null(editors)) { + return; + } - editors.forEach(function(item) { - Ember.set(item, "added", item.action === "add-page"); - Ember.set(item, "changed", item.action === "update-page"); - Ember.set(item, "deleted", item.action === "remove-page"); + editors.forEach(function (item) { + Ember.set(item, "added", item.action === "add-page"); + Ember.set(item, "changed", item.action === "update-page"); + Ember.set(item, "deleted", item.action === "remove-page"); - let page = _.findWhere(toc, { - id: item.pageId - }); - let title = ""; + let page = _.findWhere(toc, { + id: item.pageId + }); + let title = ""; - if (is.not.undefined(page)) { - title = page.title; + if (is.not.undefined(page)) { + title = page.get('title'); - if (item.added) { - Ember.set(item, 'changeLabel', "added " + title); - } + if (item.added) { + Ember.set(item, 'changeLabel', "added " + title); + } - if (item.changed) { - Ember.set(item, 'changeLabel', "changed " + title); - } - } else { - Ember.set(item, "deleted", true); + if (item.changed) { + Ember.set(item, 'changeLabel', "changed " + title); + } + } else { + Ember.set(item, "deleted", true); - if (item.added) { - Ember.set(item, 'changeLabel', "added section (since removed)"); - } + if (item.added) { + Ember.set(item, 'changeLabel', "added section (since removed)"); + } - if (item.changed) { - Ember.set(item, 'changeLabel', "changed section (since removed)"); - } + if (item.changed) { + Ember.set(item, 'changeLabel', "changed section (since removed)"); + } - if (item.deleted) { - Ember.set(item, 'changeLabel', "removed section"); - } - } - }); - } -}); \ No newline at end of file + if (item.deleted) { + Ember.set(item, 'changeLabel', "removed section"); + } + } + }); + } +}); diff --git a/app/app/components/folder/folder-settings.js b/app/app/components/folder/folder-settings.js index 5339437d..7b065f56 100644 --- a/app/app/components/folder/folder-settings.js +++ b/app/app/components/folder/folder-settings.js @@ -11,100 +11,104 @@ import Ember from 'ember'; +const { + inject: { service } +} = Ember; + export default Ember.Component.extend({ - folderService: Ember.inject.service('folder'), - appMeta: Ember.inject.service(), - users: [], - folders: [], - folder: {}, - moveTarget: null, - inviteEmail: "", - inviteMessage: "", - roleMessage: "", - permissions: {}, + folderService: service('folder'), + appMeta: service(), + users: [], + folders: [], + folder: {}, + moveTarget: null, + inviteEmail: "", + inviteMessage: "", + roleMessage: "", + permissions: {}, - 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."; - }, + 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) { - this.set('inviteMessage', this.getDefaultInvitationMessage()); - } + willRender() { + if (this.inviteMessage.length === 0) { + this.set('inviteMessage', this.getDefaultInvitationMessage()); + } - if (this.roleMessage.length === 0) { - this.set('roleMessage', 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; - } + actions: { + rename() { + if (is.empty(this.folder.get('name'))) { + $("#folderName").addClass("error").focus(); + return; + } - this.sendAction("onRename", this.folder); - }, + this.sendAction("onRename", this.folder); + }, - remove() { - if (is.null(this.get('moveTarget'))) { - $("#delete-target > select").addClass("error").focus(); - return; - } + remove() { + if (is.null(this.get('moveTarget'))) { + $("#delete-target > select").addClass("error").focus(); + return; + } - this.sendAction("onRemove", this.get('moveTarget').get('id')); - }, + this.sendAction("onRemove", this.get('moveTarget').get('id')); + }, - share() { - var email = this.get('inviteEmail').trim().replace(/ /g, ''); - var message = this.get('inviteMessage').trim(); + share() { + var email = this.get('inviteEmail').trim().replace(/ /g, ''); + var message = this.get('inviteMessage').trim(); - if (message.length === 0) { - message = this.getDefaultInvitationMessage(); - } + if (message.length === 0) { + message = this.getDefaultInvitationMessage(); + } - if (email.length === 0) { - $("#inviteEmail").addClass("error").focus(); - return; - } + if (email.length === 0) { + $("#inviteEmail").addClass("error").focus(); + return; + } - var result = { - Message: message, - Recipients: [] - }; + var result = { + Message: message, + Recipients: [] + }; - // Check for multiple email addresses - if (email.indexOf(",") > -1) { - result.Recipients = email.split(','); - } - if (email.indexOf(";") > -1 && result.Recipients.length === 0) { - result.Recipients = email.split(';'); - } + // Check for multiple email addresses + if (email.indexOf(",") > -1) { + result.Recipients = email.split(','); + } + if (email.indexOf(";") > -1 && result.Recipients.length === 0) { + result.Recipients = email.split(';'); + } - // Handle just one email address - if (result.Recipients.length === 0 && email.length > 0) { - result.Recipients.push(email); - } + // Handle just one email address + if (result.Recipients.length === 0 && email.length > 0) { + result.Recipients.push(email); + } - this.set('inviteEmail', ""); + this.set('inviteEmail', ""); - this.sendAction("onShare", result); - }, + this.sendAction("onShare", result); + }, - setPermissions() { - var message = this.get('roleMessage').trim(); + setPermissions() { + var message = this.get('roleMessage').trim(); - if (message.length === 0) { - message = this.getDefaultInvitationMessage(); - } + if (message.length === 0) { + message = this.getDefaultInvitationMessage(); + } - this.get('permissions').forEach(function(permission, index) /* jshint ignore:line */ { - Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked')); - Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked')); - }); + this.get('permissions').forEach((permission, index) => { /* jshint ignore:line */ + Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked')); + Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked')); + }); - this.sendAction("onPermission", this.get('folder'), message, this.get('permissions')); - } - } + this.sendAction("onPermission", this.get('folder'), message, this.get('permissions')); + } + } }); diff --git a/app/app/components/folder/folders-list.js b/app/app/components/folder/folders-list.js index 7f730850..31a61e44 100644 --- a/app/app/components/folder/folders-list.js +++ b/app/app/components/folder/folders-list.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -14,71 +14,70 @@ import constants from '../../utils/constants'; import TooltipMixin from '../../mixins/tooltip'; export default Ember.Component.extend(TooltipMixin, { - folderService: Ember.inject.service('folder'), - publicFolders: [], - protectedFolders: [], - privateFolders: [], - hasPublicFolders: false, - hasProtectedFolders: false, - hasPrivateFolders: false, - newFolder: "", + folderService: Ember.inject.service('folder'), + publicFolders: [], + protectedFolders: [], + privateFolders: [], + hasPublicFolders: false, + hasProtectedFolders: false, + hasPrivateFolders: false, + newFolder: "", - didInsertElement() { - this._super(...arguments); - if (this.session.authenticated) { - this.addTooltip(document.getElementById("add-folder-button")); - } - }, + didInsertElement() { + this._super(...arguments); + if (this.session.authenticated) { + this.addTooltip(document.getElementById("add-folder-button")); + } + }, - didReceiveAttrs() { - let folders = this.get('folders'); - let self = this; + didReceiveAttrs() { + let folders = this.get('folders'); - // clear out state - this.set('publicFolders', []); - this.set('protectedFolders', []); - this.set('privateFolders', []); + // clear out state + this.set('publicFolders', []); + this.set('protectedFolders', []); + this.set('privateFolders', []); - _.each(folders, folder => { - if (folder.folderType === constants.FolderType.Public) { - let folders = self.get('publicFolders'); - folders.pushObject(folder); - self.set('publicFolders', folders); - } - if (folder.folderType === constants.FolderType.Private) { - let folders = self.get('privateFolders'); - folders.pushObject(folder); - self.set('privateFolders', folders); - } - if (folder.folderType === constants.FolderType.Protected) { - let folders = self.get('protectedFolders'); - folders.pushObject(folder); - self.set('protectedFolders', folders); - } - }); + _.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); - }, + this.set('hasPublicFolders', this.get('publicFolders.length') > 0); + this.set('hasPrivateFolders', this.get('privateFolders.length') > 0); + this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0); + }, - willDestroyElement() { - this.destroyTooltips(); - }, + willDestroyElement() { + this.destroyTooltips(); + }, - actions: { - addFolder() { - var folderName = this.get('newFolder'); + actions: { + addFolder() { + var folderName = this.get('newFolder'); - if (is.empty(folderName)) { - $("#new-folder-name").addClass("error").focus(); - return false; - } + if (is.empty(folderName)) { + $("#new-folder-name").addClass("error").focus(); + return false; + } - this.attrs.onFolderAdd(folderName); + this.attrs.onFolderAdd(folderName); - this.set('newFolder', ""); - return true; - } - } -}); \ No newline at end of file + this.set('newFolder', ""); + return true; + } + } +}); diff --git a/app/app/components/layout/zone-navigation.js b/app/app/components/layout/zone-navigation.js index cf52fc08..b3eb42e8 100644 --- a/app/app/components/layout/zone-navigation.js +++ b/app/app/components/layout/zone-navigation.js @@ -12,14 +12,19 @@ import Ember from 'ember'; import netUtil from '../../utils/net'; +const { + inject: { service } +} = Ember; + export default Ember.Component.extend({ - folderService: Ember.inject.service('folder'), + folderService: service('folder'), folder: null, - appMeta: Ember.inject.service(), + appMeta: service(), + session: service(), didInitAttrs() { if (this.get("session.authenticated")) { - this.get("session.user.accounts").forEach((account)=>{ + this.get("session.session.content.authenticated.user.accounts").forEach((account) => { // TODO: do not mutate account.active here account.active = account.orgId === this.get("appMeta.orgId"); }); diff --git a/app/app/components/settings/user-list.js b/app/app/components/settings/user-list.js index c03ec12b..32bc4a25 100644 --- a/app/app/components/settings/user-list.js +++ b/app/app/components/settings/user-list.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -54,7 +54,8 @@ export default Ember.Component.extend({ let self = this; let user = this.users.findBy("id", id); - this.set('editUser', user.copy()); + let userCopy = user.getProperties('id', 'created', 'revised', 'firstname', 'lastname', 'email', 'initials', 'active', 'editor', 'admin', 'accounts'); + this.set('editUser', userCopy); this.set('password', { password: "", confirmation: "" @@ -112,15 +113,15 @@ export default Ember.Component.extend({ let user = this.get('editUser'); let password = this.get('password'); - if (is.empty(user.get('firstname'))) { + if (is.empty(user.firstname)) { $("#edit-firstname").addClass("error").focus(); return; } - if (is.empty(user.get('lastname'))) { + if (is.empty(user.lastname)) { $("#edit-lastname").addClass("error").focus(); return; } - if (is.empty(user.get('email'))) { + if (is.empty(user.email)) { $("#edit-email").addClass("error").focus(); return; } @@ -144,4 +145,4 @@ export default Ember.Component.extend({ this.attrs.onDelete(user); } } -}); \ No newline at end of file +}); diff --git a/app/app/models/attachment.js b/app/app/models/attachment.js new file mode 100644 index 00000000..473a497b --- /dev/null +++ b/app/app/models/attachment.js @@ -0,0 +1,25 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + documentId: attr('string'), + extension: attr('string'), + fileId: attr('string'), + filename: attr('string'), + job: attr('string'), + orgId: attr('string'), + created: attr(), + revised: attr(), +}); diff --git a/app/app/models/document.js b/app/app/models/document.js new file mode 100644 index 00000000..b32b2545 --- /dev/null +++ b/app/app/models/document.js @@ -0,0 +1,36 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import Ember from 'ember'; +import stringUtil from '../utils/string'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string'), + excerpt: attr('string'), + job: attr('string'), + location: attr('string'), + orgId: attr('string'), + folderId: attr('string'), + userId: attr('string'), + tags: attr('string'), + template: attr('boolean'), + + // client-side property + selected: attr('boolean', { defaultValue: false }), + slug: Ember.computed('name', function () { + return stringUtil.makeSlug(this.get('name')); + }), + created: attr(), + revised: attr() +}); diff --git a/app/app/models/folder-permission.js b/app/app/models/folder-permission.js new file mode 100644 index 00000000..58f01b04 --- /dev/null +++ b/app/app/models/folder-permission.js @@ -0,0 +1,23 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + orgId: attr('string'), + folderId: attr('string'), + userId: attr('string'), + fullname: attr('string'), + canView: attr('boolean', { defaultValue: false }), + canEdit: attr('boolean', { defaultValue: false }) +}); diff --git a/app/app/models/folder.js b/app/app/models/folder.js new file mode 100644 index 00000000..b8d35a71 --- /dev/null +++ b/app/app/models/folder.js @@ -0,0 +1,45 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import constants from '../utils/constants'; +import stringUtil from '../utils/string'; +import Ember from 'ember'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string'), + orgId: attr('string'), + userId: attr('string'), + folderType: attr('number', { defaultValue: 2 }), + + slug: Ember.computed('name', function () { + return stringUtil.makeSlug(this.get('name')); + }), + + markAsRestricted() { + this.set('folderType', constants.FolderType.Protected); + }, + + markAsPrivate() { + this.set('folderType', constants.FolderType.Private); + }, + + markAsPublic() { + this.set('folderType', constants.FolderType.Public); + }, + + // client-side prop that holds who can see this folder + sharedWith: attr(), + created: attr(), + revised: attr() +}); diff --git a/app/app/models/organization.js b/app/app/models/organization.js new file mode 100644 index 00000000..db50b26e --- /dev/null +++ b/app/app/models/organization.js @@ -0,0 +1,23 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + title: attr('string'), + message: attr('string'), + email: attr('string'), + allowAnonymousAccess: attr('boolean', { defaultValue: false }), + created: attr(), + revised: attr() +}); diff --git a/app/app/models/page-meta.js b/app/app/models/page-meta.js new file mode 100644 index 00000000..d584d70b --- /dev/null +++ b/app/app/models/page-meta.js @@ -0,0 +1,25 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +// import { belongsTo } from 'ember-data/relationships'; + +export default Model.extend({ + pageId: attr('string'), + documentId: attr('string'), + orgId: attr('string'), + rawBody: attr(), + config: attr(), + externalSource: attr('boolean', { defaultValue: false }), + created: attr(), + revised: attr(), +}); diff --git a/app/app/models/page.js b/app/app/models/page.js new file mode 100644 index 00000000..586991b4 --- /dev/null +++ b/app/app/models/page.js @@ -0,0 +1,44 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import Ember from 'ember'; +// import { hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + documentId: attr('string'), + orgId: attr('string'), + contentType: attr('string'), + level: attr('number', { defaultValue: 1 }), + sequence: attr('number', { defaultValue: 0 }), + revisions: attr('number', { defaultValue: 0 }), + title: attr('string'), + body: attr('string'), + rawBody: attr('string'), + meta: attr(), + // meta: hasMany('page-meta'), + + tagName: Ember.computed('level', function () { + return "h" + this.get('level'); + }), + + tocIndent: Ember.computed('level', function () { + return (this.get('level') - 1) * 20; + }), + + tocIndentCss: Ember.computed('tocIndent', function () { + let tocIndent = this.get('tocIndent'); + return `margin-left-${tocIndent}`; + }), + created: attr(), + revised: attr() +}); diff --git a/app/app/models/protected-folder-participant.js b/app/app/models/protected-folder-participant.js new file mode 100644 index 00000000..ddfe1f35 --- /dev/null +++ b/app/app/models/protected-folder-participant.js @@ -0,0 +1,29 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import Ember from 'ember'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + userId: attr('string'), + email: attr('string'), + firstname: attr('string'), + lastname: attr('string'), + name: attr('string'), + folderId: attr('string'), + folderType: attr('number', { defaultValue: 0 }), + + fullname: Ember.computed('firstname', 'lastname', function () { + return `${this.get('firstname')} ${this.get('lastname')}`; + }) +}); diff --git a/app/app/models/section.js b/app/app/models/section.js new file mode 100644 index 00000000..8887648b --- /dev/null +++ b/app/app/models/section.js @@ -0,0 +1,29 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import Ember from 'ember'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + contentType: attr('string'), + title: attr('string'), + description: attr('string'), + iconFont: attr('string'), + iconFile: attr('string'), + + hasImage: Ember.computed('iconFont', 'iconFile', function () { + return this.get('iconFile').length > 0; + }), + created: attr(), + revised: attr() +}); diff --git a/app/app/models/template.js b/app/app/models/template.js new file mode 100644 index 00000000..7f6a02ff --- /dev/null +++ b/app/app/models/template.js @@ -0,0 +1,30 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import stringUtil from '../utils/string'; +import Ember from 'ember'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + author: attr('string'), + dated: attr(), + description: attr('string'), + title: attr('string'), + type: attr('number', { defaultValue: 0 }), + + slug: Ember.computed('title', function () { + return stringUtil.makeSlug(this.get('title')); + }), + created: attr(), + revised: attr() +}); diff --git a/app/app/models/user.js b/app/app/models/user.js new file mode 100644 index 00000000..7c3fc94f --- /dev/null +++ b/app/app/models/user.js @@ -0,0 +1,38 @@ +// 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 Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import Ember from 'ember'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + firstname: attr('string'), + lastname: attr('string'), + email: attr('string'), + initials: attr('string'), + active: attr('boolean', { defaultValue: false }), + editor: attr('boolean', { defaultValue: false }), + admin: attr('boolean', { defaultValue: false }), + accounts: attr(), + created: attr(), + revised: attr(), + + fullname: Ember.computed('firstname', 'lastname', function () { + return `${this.get('firstname')} ${this.get('lastname')}`; + }), + + generateInitials() { + let first = this.get('firstname').trim(); + let last = this.get('lastname').trim(); + this.set('initials', first.substr(0, 1) + last.substr(0, 1)); + } +}); diff --git a/app/app/pods/customize/folders/controller.js b/app/app/pods/customize/folders/controller.js index 83be5a11..c250dff4 100644 --- a/app/app/pods/customize/folders/controller.js +++ b/app/app/pods/customize/folders/controller.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -27,17 +27,16 @@ export default Ember.Controller.extend(NotifierMixin, { actions: { changeOwner: function (folderId, userId) { - let self = this; - this.get('folderService').getFolder(folderId).then(function (folder) { + this.get('folderService').getFolder(folderId).then((folder) => { folder.set('userId', userId); - self.get('folderService').save(folder).then(function () { - self.showNotification("Changed"); - self.audit.record('changed-folder-owner'); + this.get('folderService').save(folder).then(() => { + this.showNotification("Changed"); + this.audit.record('changed-folder-owner'); }); - self.send('onChangeOwner'); + this.send('onChangeOwner'); }); } } -}); \ No newline at end of file +}); diff --git a/app/app/pods/customize/folders/route.js b/app/app/pods/customize/folders/route.js index 9a2a5df2..445d4b89 100644 --- a/app/app/pods/customize/folders/route.js +++ b/app/app/pods/customize/folders/route.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -29,17 +29,17 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { let nonPrivateFolders = model.rejectBy('folderType', 2); controller.set('folders', nonPrivateFolders); - this.get('folderService').getProtectedFolderInfo().then(function (people) { - people.forEach(function (person) { - person.isEveryone = person.userId === ''; - person.isOwner = false; + this.get('folderService').getProtectedFolderInfo().then((people) => { + people.forEach((person) => { + person.set('isEveryone', person.get('userId') === ''); + person.set('isOwner', false); }); nonPrivateFolders.forEach(function (folder) { let shared = people.filterBy('folderId', folder.get('id')); let person = shared.findBy('userId', folder.get('userId')); if (is.not.undefined(person)) { - person.isOwner = true; + person.set('isOwner', true); } folder.set('sharedWith', shared); @@ -56,4 +56,4 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { this.refresh(); } } -}); \ No newline at end of file +}); diff --git a/app/app/pods/document/edit/controller.js b/app/app/pods/document/edit/controller.js index 8d95b6f3..91a2f2b0 100644 --- a/app/app/pods/document/edit/controller.js +++ b/app/app/pods/document/edit/controller.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -29,8 +29,8 @@ export default Ember.Controller.extend(NotifierMixin, { this.showNotification("Saving"); let model = { - page: page, - meta: meta + page: page.toJSON({ includeId: true }), + meta: meta.toJSON({ includeId: true }) }; this.get('documentService').updatePage(page.get('documentId'), page.get('id'), model).then(function () { @@ -43,4 +43,4 @@ export default Ember.Controller.extend(NotifierMixin, { }); } } -}); \ No newline at end of file +}); diff --git a/app/app/pods/document/index/controller.js b/app/app/pods/document/index/controller.js index 7c190f99..d73cbf8a 100644 --- a/app/app/pods/document/index/controller.js +++ b/app/app/pods/document/index/controller.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -79,7 +79,7 @@ export default Ember.Controller.extend(NotifierMixin, { } }); - self.set('pages', _.sortBy(self.get('pages'), "sequence")); + self.set('pages', self.get('pages').sortBy('sequence')); }); }, @@ -98,7 +98,7 @@ export default Ember.Controller.extend(NotifierMixin, { }); let pages = self.get('pages'); - pages = _.sortBy(pages, "sequence"); + pages = pages.sortBy('sequence'); self.set('pages', []); self.set('pages', pages); }); @@ -216,4 +216,4 @@ export default Ember.Controller.extend(NotifierMixin, { }); } } -}); \ No newline at end of file +}); diff --git a/app/app/pods/document/wizard/controller.js b/app/app/pods/document/wizard/controller.js index a67d82ee..b3e7a973 100644 --- a/app/app/pods/document/wizard/controller.js +++ b/app/app/pods/document/wizard/controller.js @@ -1,49 +1,52 @@ import Ember from 'ember'; -import models from '../../../utils/model'; import NotifierMixin from '../../../mixins/notifier'; export default Ember.Controller.extend(NotifierMixin, { - documentService: Ember.inject.service('document'), + documentService: Ember.inject.service('document'), - actions: { - onCancel() { - this.transitionToRoute('document'); - }, - - onAddSection(section) { - let self = this; + actions: { + onCancel() { + this.transitionToRoute('document'); + }, + onAddSection(section) { this.audit.record("added-section"); - this.audit.record("added-section-" + section.contentType); + this.audit.record("added-section-" + section.get('contentType')); - let page = models.PageModel.create({ - documentId: this.get('model.document.id'), - title: `${section.title} Section`, - level: 1, - sequence: 2048, - body: "", - contentType: section.contentType - }); + let page = { + documentId: this.get('model.document.id'), + title: `${section.get('title')} Section`, + level: 1, + sequence: 2048, + body: "", + contentType: section.get('contentType') + }; - let meta = models.PageMetaModel.create({ - documentId: this.get('model.document.id'), - rawBody: "", - config: "" - }); + let data = this.get('store').normalize('page', page); + let pageData = this.get('store').push(data); - let model = { - page: page, - meta: meta - }; + let meta = { + documentId: this.get('model.document.id'), + rawBody: "", + config: "" + }; - this.get('documentService').addPage(this.get('model.document.id'), model).then(function(newPage) { - self.transitionToRoute('document.edit', - self.get('model.folder.id'), - self.get('model.folder.slug'), - self.get('model.document.id'), - self.get('model.document.slug'), - newPage.id); - }); - } - } + let pageMeta = this.get('store').normalize('page-meta', meta); + let pageMetaData = this.get('store').push(pageMeta); + + let model = { + page: pageData, + meta: pageMetaData + }; + + this.get('documentService').addPage(this.get('model.document.id'), model).then((newPage) => { + this.transitionToRoute('document.edit', + this.get('model.folder.id'), + this.get('model.folder.slug'), + this.get('model.document.id'), + this.get('model.document.slug'), + newPage.id); + }); + } + } }); diff --git a/app/app/pods/folders/folder/route.js b/app/app/pods/folders/folder/route.js index 50ab6b7f..329faf8f 100644 --- a/app/app/pods/folders/folder/route.js +++ b/app/app/pods/folders/folder/route.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -31,4 +31,4 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { this.browser.setTitle(model.folder.get('name')); this.get('folderService').setCurrentFolder(model.folder); } -}); \ No newline at end of file +}); diff --git a/app/app/pods/folders/route.js b/app/app/pods/folders/route.js index d525af18..e2a284e8 100644 --- a/app/app/pods/folders/route.js +++ b/app/app/pods/folders/route.js @@ -27,7 +27,6 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { }, afterModel: function (model) { - let params = this.paramsFor('folders.folder'); if (is.empty(params)) { diff --git a/app/app/pods/folders/settings/route.js b/app/app/pods/folders/settings/route.js index a75a0f97..008ccf08 100644 --- a/app/app/pods/folders/settings/route.js +++ b/app/app/pods/folders/settings/route.js @@ -1,23 +1,28 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com import Ember from 'ember'; -import models from '../../../utils/model'; import NotifierMixin from '../../../mixins/notifier'; +const { + inject: { service } +} = Ember; + export default Ember.Route.extend(NotifierMixin, { - folderService: Ember.inject.service('folder'), - userService: Ember.inject.service('user'), + folderService: service('folder'), + userService: service('user'), folder: {}, tab: "", + localStorage: service(), + store: service(), beforeModel: function (transition) { this.tab = is.not.undefined(transition.queryParams.tab) ? transition.queryParams.tab : "tabGeneral"; @@ -28,7 +33,6 @@ export default Ember.Route.extend(NotifierMixin, { }, setupController(controller, model) { - var self = this; this.folder = model; controller.set('model', model); @@ -38,54 +42,63 @@ export default Ember.Route.extend(NotifierMixin, { controller.set('tabDelete', false); controller.set(this.get('tab'), true); - this.get('folderService').getAll().then(function (folders) { + this.get('folderService').getAll().then((folders) => { controller.set('folders', folders.rejectBy('id', model.get('id'))); }); - this.get('userService').getAll().then(function (users) { + this.get('userService').getAll().then((users) => { controller.set('users', users); var folderPermissions = []; - var u = models.FolderPermissionModel.create({ + users.forEach((user) => { + let isActive = user.get('active'); + + let u = { + userId: user.get('id'), + fullname: user.get('fullname'), + orgId: model.get('orgId'), + folderId: model.get('id'), + canEdit: false, + canView: false, + canViewPrevious: false + }; + + if (isActive) { + folderPermissions.pushObject(u); + } + }); + + var u = { userId: "", fullname: " Everyone", orgId: model.get('orgId'), folderId: model.get('id'), canEdit: false, canView: false - }); + }; folderPermissions.pushObject(u); - users.forEach(function (user, index) /* jshint ignore:line */ { - if (user.get('active')) { - var u = models.FolderPermissionModel.create({ - userId: user.get('id'), - fullname: user.get('fullname'), - orgId: model.get('orgId'), - folderId: model.get('id'), - canEdit: false, - canView: false, - canViewPrevious: false - }); - - folderPermissions.pushObject(u); - } - }); - - self.get('folderService').getPermissions(model.id).then(function (permissions) { - permissions.forEach(function (permission, index) /* jshint ignore:line */ { - var folderPermission = folderPermissions.findBy('userId', permission.userId); + this.get('folderService').getPermissions(model.id).then((permissions) => { + permissions.forEach((permission, index) => { /* jshint ignore:line */ + var folderPermission = folderPermissions.findBy('userId', permission.get('userId')); if (is.not.undefined(folderPermission)) { - Ember.set(folderPermission, 'orgId', permission.orgId); - Ember.set(folderPermission, 'folderId', permission.folderId); - Ember.set(folderPermission, 'canEdit', permission.canEdit); - Ember.set(folderPermission, 'canView', permission.canView); - Ember.set(folderPermission, 'canViewPrevious', permission.canView); + Ember.setProperties(folderPermission, { + orgId: permission.get('orgId'), + folderId: permission.get('folderId'), + canEdit: permission.get('canEdit'), + canView: permission.get('canView'), + canViewPrevious: permission.get('canView') + }); } }); + folderPermissions.map((permission) => { + let data = this.get('store').normalize('folder-permission', permission); + return this.get('store').push(data); + }); + controller.set('permissions', folderPermissions.sortBy('fullname')); }); }); @@ -100,36 +113,41 @@ export default Ember.Route.extend(NotifierMixin, { }, onRemove(moveId) { - let self = this; - this.get('folderService').remove(this.folder.get('id'), moveId).then(function () { /* jshint ignore:line */ - self.showNotification("Deleted"); - self.session.clearSessionItem('folder'); + this.get('folderService').remove(this.folder.get('id'), moveId).then(() => { /* jshint ignore:line */ + this.showNotification("Deleted"); + this.get('localStorage').clearSessionItem('folder'); - self.get('folderService').getFolder(moveId).then(function (folder) { - self.get('folderService').setCurrentFolder(folder); - self.transitionTo('folders.folder', folder.get('id'), folder.get('slug')); + this.get('folderService').getFolder(moveId).then((folder) => { + this.get('folderService').setCurrentFolder(folder); + this.transitionTo('folders.folder', folder.get('id'), folder.get('slug')); }); }); }, onShare: function (invitation) { - let self = this; - this.get('folderService').share(this.folder.get('id'), invitation).then(function () { - self.showNotification("Shared"); + this.get('folderService').share(this.folder.get('id'), invitation).then(() => { + this.showNotification("Shared"); }); }, onPermission: function (folder, message, permissions) { - var self = this; - var data = permissions.map(function (obj) { - return obj.getProperties('orgId', 'folderId', 'userId', 'canEdit', 'canView'); + var data = permissions.map((obj) => { + let permission = { + 'orgId': obj.orgId, + 'folderId': obj.folderId, + 'userId': obj.userId, + 'canEdit': obj.canEdit, + 'canView': obj.canView + }; + + return permission; }); var payload = { Message: message, Roles: data }; - this.get('folderService').savePermissions(folder.get('id'), payload).then(function () { - self.showNotification("Saved"); + this.get('folderService').savePermissions(folder.get('id'), payload).then(() => { + this.showNotification("Saved"); }); var hasEveryone = _.find(data, function (permission) { diff --git a/app/app/serializers/application.js b/app/app/serializers/application.js new file mode 100644 index 00000000..beea6668 --- /dev/null +++ b/app/app/serializers/application.js @@ -0,0 +1,13 @@ +import JSONAPISerializer from 'ember-data/serializers/json-api'; + +export default JSONAPISerializer.extend({ + normalize(modelClass, resourceHash) { + return { + data: { + id: resourceHash.id, + type: modelClass.modelName, + attributes: resourceHash + } + }; + } +}); diff --git a/app/app/serializers/folder-permission.js b/app/app/serializers/folder-permission.js new file mode 100644 index 00000000..2c2733a5 --- /dev/null +++ b/app/app/serializers/folder-permission.js @@ -0,0 +1,13 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + normalize(modelClass, resourceHash) { + return { + data: { + id: resourceHash.userId ? resourceHash.userId : 0, + type: modelClass.modelName, + attributes: resourceHash + } + }; + } +}); diff --git a/app/app/serializers/page-meta.js b/app/app/serializers/page-meta.js new file mode 100644 index 00000000..811356f5 --- /dev/null +++ b/app/app/serializers/page-meta.js @@ -0,0 +1,13 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + normalize(modelClass, resourceHash) { + return { + data: { + id: resourceHash.id ? resourceHash.id : resourceHash.documentId, + type: modelClass.modelName, + attributes: resourceHash + } + }; + } +}); diff --git a/app/app/serializers/page.js b/app/app/serializers/page.js new file mode 100644 index 00000000..811356f5 --- /dev/null +++ b/app/app/serializers/page.js @@ -0,0 +1,13 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + normalize(modelClass, resourceHash) { + return { + data: { + id: resourceHash.id ? resourceHash.id : resourceHash.documentId, + type: modelClass.modelName, + attributes: resourceHash + } + }; + } +}); diff --git a/app/app/serializers/protected-folder-participant.js b/app/app/serializers/protected-folder-participant.js new file mode 100644 index 00000000..d38ff5dd --- /dev/null +++ b/app/app/serializers/protected-folder-participant.js @@ -0,0 +1,13 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + normalize(modelClass, resourceHash) { + return { + data: { + id: resourceHash.id ? resourceHash.id : resourceHash.folderId + resourceHash.userId, + type: modelClass.modelName, + attributes: resourceHash + } + }; + } +}); diff --git a/app/app/serializers/user.js b/app/app/serializers/user.js new file mode 100644 index 00000000..bdc8cff8 --- /dev/null +++ b/app/app/serializers/user.js @@ -0,0 +1,13 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + normalize(modelClass, resourceHash) { + return { + data: { + id: resourceHash.id ? resourceHash.id : 0, + type: modelClass.modelName, + attributes: resourceHash + } + }; + } +}); diff --git a/app/app/services/ajax.js b/app/app/services/ajax.js index ebab3af9..c28f5dcc 100644 --- a/app/app/services/ajax.js +++ b/app/app/services/ajax.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// 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 . +// by contacting . // // https://documize.com @@ -14,6 +14,7 @@ import AjaxService from 'ember-ajax/services/ajax'; import config from '../config/environment'; const { + computed, inject: { service } } = Ember; @@ -22,7 +23,7 @@ export default AjaxService.extend({ host: config.apiHost, namespace: config.apiNamespace, - headers: Ember.computed('session.session.content.authenticated.token', { + headers: computed('session.session.content.authenticated.token', { get() { let headers = {}; const token = this.get('session.session.content.authenticated.token'); @@ -33,4 +34,4 @@ export default AjaxService.extend({ return headers; } }) -}); \ No newline at end of file +}); diff --git a/app/app/services/audit.js b/app/app/services/audit.js index 50d37510..742e66f9 100644 --- a/app/app/services/audit.js +++ b/app/app/services/audit.js @@ -13,9 +13,13 @@ import Ember from 'ember'; import netUtil from '../utils/net'; import config from '../config/environment'; +const { + inject: { service } +} = Ember; + export default Ember.Service.extend({ - session: Ember.inject.service('session'), - appMeta: Ember.inject.service(), + session: service('session'), + appMeta: service(), ready: false, enabled: config.APP.auditEnabled, appId: config.APP.intercomKey, diff --git a/app/app/services/document.js b/app/app/services/document.js index 1108e158..de3f093a 100644 --- a/app/app/services/document.js +++ b/app/app/services/document.js @@ -10,18 +10,23 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; + +const { + inject: { service } +} = Ember; export default Ember.Service.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), + store: service(), // Returns document model for specified document id. getDocument(documentId) { return this.get('ajax').request(`documents/${documentId}`, { method: "GET" }).then((response) => { - return models.DocumentModel.create(response); + let data = this.get('store').normalize('document', response); + return this.get('store').push(data); }); }, @@ -34,9 +39,13 @@ export default Ember.Service.extend({ content: Ember.A([]) }); - _.each(response, function (doc) { - let documentModel = models.DocumentModel.create(doc); - documents.pushObject(documentModel); + if (isObject(response)) { + return documents; + } + + documents = response.map((doc) => { + let data = this.get('store').normalize('document', doc); + return this.get('store').push(data); }); return documents; @@ -52,9 +61,9 @@ export default Ember.Service.extend({ content: Ember.A([]) }); - _.each(response, function (doc) { - let documentModel = models.DocumentModel.create(doc); - documents.pushObject(documentModel); + documents = response.map((doc) => { + let data = this.get('store').normalize('document', doc); + return this.get('store').push(data); }); return documents; @@ -115,6 +124,7 @@ export default Ember.Service.extend({ updatePage: function (documentId, pageId, payload, skipRevision) { var revision = skipRevision ? "?r=true" : "?r=false"; let url = `documents/${documentId}/pages/${pageId}${revision}`; + Ember.set(payload.meta, 'id', parseInt(payload.meta.id)); return this.get('ajax').request(url, { method: 'PUT', @@ -192,8 +202,9 @@ export default Ember.Service.extend({ method: 'GET' }).then((response) => { let data = []; - _.each(response, function (obj) { - data.pushObject(models.PageModel.create(obj)); + data = response.map((obj) => { + let data = this.get('store').normalize('page', obj); + return this.get('store').push(data); }); return data; @@ -208,8 +219,9 @@ export default Ember.Service.extend({ }).then((response) => { let pages = []; - _.each(response, function (page) { - pages.pushObject(models.PageModel.create(page)); + pages = response.map((page) => { + let data = this.get('store').normalize('page', page); + return this.get('store').push(data); }); return pages; @@ -222,8 +234,8 @@ export default Ember.Service.extend({ return this.get('ajax').request(`documents/${documentId}/pages/${pageId}`, { method: 'GET' }).then((response) => { - let page = models.PageModel.create(response); - return page; + let data = this.get('store').normalize('page', response); + return this.get('store').push(data); }); }, @@ -233,8 +245,8 @@ export default Ember.Service.extend({ return this.get('ajax').request(`documents/${documentId}/pages/${pageId}/meta`, { method: 'GET' }).then((response) => { - let meta = models.PageMetaModel.create(response); - return meta; + let data = this.get('store').normalize('page-meta', response); + return this.get('store').push(data); }); }, @@ -245,9 +257,16 @@ export default Ember.Service.extend({ method: 'GET' }).then((response) => { let data = []; - _.each(response, function (obj) { - data.pushObject(models.AttachmentModel.create(obj)); + + if (isObject(response)) { + return data; + } + + data = response.map((obj) => { + let data = this.get('store').normalize('attachment', obj); + return this.get('store').push(data); }); + return data; }); }, @@ -260,3 +279,7 @@ export default Ember.Service.extend({ }); }, }); + +function isObject(a) { + return (!!a) && (a.constructor === Object); +} diff --git a/app/app/services/folder.js b/app/app/services/folder.js index b8ac6f65..630d3112 100644 --- a/app/app/services/folder.js +++ b/app/app/services/folder.js @@ -10,17 +10,19 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; import BaseService from '../services/base'; const { - get + get, + RSVP, + inject: { service } } = Ember; export default BaseService.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), - localStorage: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), + localStorage: service(), + store: service(), // selected folder currentFolder: null, @@ -28,38 +30,35 @@ export default BaseService.extend({ // Add a new folder. add(folder) { - return this.get('ajax').post(`folders`, { contentType: 'json', data: JSON.stringify(folder) }).then((folder) => { - let folderModel = models.FolderModel.create(folder); - return folderModel; + let data = this.get('store').normalize('folder', folder); + return this.get('store').push(data); }); }, // Returns folder model for specified folder id. getFolder(id) { - return this.get('ajax').request(`folders/${id}`, { method: 'GET' - }).then((response) => { - let folder = models.FolderModel.create(response); - return folder; + }).then((folder) => { + let data = this.get('store').normalize('folder', folder); + return this.get('store').push(data); }); }, // Returns all folders that user can see. getAll() { - let self = this; + let folders = this.get('folders'); - if (this.get('folders') != null) { - return new Ember.RSVP.Promise(function (resolve) { - resolve(self.get('folders')); - }); - } else { - return this.reload(); + if (folders != null) { + return new RSVP.resolve(folders); } + + return this.reload(); + }, // Updates an existing folder record. @@ -73,7 +72,7 @@ export default BaseService.extend({ }); }, - remove: function (folderId, moveToId) { + remove(folderId, moveToId) { let url = `folders/${folderId}/move/${moveToId}`; return this.get('ajax').request(url, { @@ -81,7 +80,7 @@ export default BaseService.extend({ }); }, - onboard: function (folderId, payload) { + onboard(folderId, payload) { let url = `public/share/${folderId}`; return this.get('ajax').post(url, { @@ -91,13 +90,15 @@ export default BaseService.extend({ }, // getProtectedFolderInfo returns non-private folders and who has access to them. - getProtectedFolderInfo: function () { + getProtectedFolderInfo() { return this.get('ajax').request(`folders?filter=viewers`, { method: "GET" }).then((response) => { let data = []; - _.each(response, function (obj) { - data.pushObject(models.ProtectedFolderParticipant.create(obj)); + + data = response.map((obj) => { + let data = this.get('store').normalize('protected-folder-participant', obj); + return this.get('store').push(data); }); return data; @@ -111,8 +112,10 @@ export default BaseService.extend({ method: "GET" }).then((response) => { let data = []; - _.each(response, function (obj) { - data.pushObject(models.FolderModel.create(obj)); + + data = response.map((obj) => { + let data = this.get('store').normalize('folder', obj); + return this.get('store').push(data); }); return data; @@ -126,8 +129,10 @@ export default BaseService.extend({ method: "GET" }).then((response) => { let data = []; - _.each(response, function (obj) { - data.pushObject(models.FolderPermissionModel.create(obj)); + + data = response.map((obj) => { + let data = this.get('store').normalize('folder-permission', obj); + return this.get('store').push(data); }); return data; @@ -136,7 +141,6 @@ export default BaseService.extend({ // persist folder permissions savePermissions(folderId, payload) { - return this.get('ajax').request(`folders/${folderId}/permissions`, { method: 'PUT', contentType: 'json', @@ -181,7 +185,7 @@ export default BaseService.extend({ let result = []; let folderId = folder.get('id'); - folderPermissions.forEach(function (item) { + folderPermissions.forEach((item) => { if (item.folderId === folderId) { result.push(item); } @@ -189,7 +193,7 @@ export default BaseService.extend({ let canEdit = false; - result.forEach(function (permission) { + result.forEach((permission) => { if (permission.userId === userId) { canEdit = permission.canEdit; } @@ -203,4 +207,4 @@ export default BaseService.extend({ }); }); }, -}); \ No newline at end of file +}); diff --git a/app/app/services/organization.js b/app/app/services/organization.js index cfe86fea..3e9284cf 100644 --- a/app/app/services/organization.js +++ b/app/app/services/organization.js @@ -10,35 +10,39 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; + +const { + inject: { service } +} = Ember; export default Ember.Service.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), - appMeta: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), + appMeta: service(), + store: service(), - // Returns attributes for specified org id. - getOrg(id) { - return this.get('ajax').request(`organizations/${id}`, { - method: 'GET' - }).then((response) =>{ - let org = models.OrganizationModel.create(response); - return org; - }); - }, + // Returns attributes for specified org id. + getOrg(id) { + return this.get('ajax').request(`organizations/${id}`, { + method: 'GET' + }).then((response) => { + let data = this.get('store').normalize('organization', response); + return this.get('store').push(data); + }); + }, - // Updates an existing organization record. - save(org) { - let id = org.get('id'); + // Updates an existing organization record. + save(org) { + let id = org.id; - this.get('appMeta').setProperties({ - message: org.message, - title: org.title - }); + this.get('appMeta').setProperties({ + message: org.get('message'), + title: org.get('title') + }); - return this.get('ajax').request(`organizations/${id}`, { - method: 'PUT', - data: JSON.stringify(org) - }); - } + return this.get('ajax').request(`organizations/${id}`, { + method: 'PUT', + data: JSON.stringify(org) + }); + } }); diff --git a/app/app/services/search.js b/app/app/services/search.js index a669a67c..e962b45a 100644 --- a/app/app/services/search.js +++ b/app/app/services/search.js @@ -11,16 +11,20 @@ import Ember from 'ember'; +const { + inject: { service } +} = Ember; + export default Ember.Service.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), - // getUsers returns all users for organization. - find(keywords) { - let url = "search?keywords=" + encodeURIComponent(keywords); + // getUsers returns all users for organization. + find(keywords) { + let url = "search?keywords=" + encodeURIComponent(keywords); - return this.get('ajax').request(url, { - method: "GET" - }); - }, + return this.get('ajax').request(url, { + method: "GET" + }); + }, }); diff --git a/app/app/services/section.js b/app/app/services/section.js index 9ea55d7c..fdac0d35 100644 --- a/app/app/services/section.js +++ b/app/app/services/section.js @@ -10,56 +10,63 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; import BaseService from '../services/base'; +const { + inject: { service } +} = Ember; + export default BaseService.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), + store: service(), - // Returns all available sections. - getAll() { - return this.get('ajax').request(`sections`,{ - method: 'GET' - }).then((response)=>{ - let data = []; - _.each(response, function(obj) { - data.pushObject(models.SectionModel.create(obj)); - }); + // Returns all available sections. + getAll() { + return this.get('ajax').request(`sections`, { + method: 'GET' + }).then((response) => { + let data = []; - return data; - }); - }, + data = response.map((obj) => { + let data = this.get('store').normalize('section', obj); + return this.get('store').push(data); + }); - // Requests data from the specified section handler, passing the method and document ID - // and POST payload. - fetch(page, method, data) { - let documentId = page.get('documentId'); - let section = page.get('contentType'); - let url = `sections?documentID=${documentId}§ion=${section}&method=${method}`; + return data; + }); + }, - return this.get('ajax').post(url, { - data: JSON.stringify(data), - contentType: "application/json" - }); - }, + // Requests data from the specified section handler, passing the method and document ID + // and POST payload. + fetch(page, method, data) { + let documentId = page.get('documentId'); + let section = page.get('contentType'); + let url = `sections?documentID=${documentId}§ion=${section}&method=${method}`; - // Did any dynamic sections change? Fetch and send up for rendering? - refresh(documentId) { - let url = `sections/refresh?documentID=${documentId}`; + return this.get('ajax').post(url, { + data: JSON.stringify(data), + contentType: "application/json" + }); + }, - return this.get('ajax').request(url, { - method: 'GET' - }).then((response)=>{ - let pages = []; + // Did any dynamic sections change? Fetch and send up for rendering? + refresh(documentId) { + let url = `sections/refresh?documentID=${documentId}`; - if (is.not.null(response) && is.array(response) && response.length > 0) { - _.each(response, function(page) { - pages.pushObject(models.PageModel.create(page)); - }); - } + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + let pages = []; - return pages; - }); - } + if (is.not.null(response) && is.array(response) && response.length > 0) { + pages = response.map((page) => { + let data = this.get('store').normalize('page', page); + return this.get('store').push(data); + }); + } + + return pages; + }); + } }); diff --git a/app/app/services/session.js b/app/app/services/session.js index 00b4c878..9e486ef4 100644 --- a/app/app/services/session.js +++ b/app/app/services/session.js @@ -10,24 +10,31 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; import SimpleAuthSession from 'ember-simple-auth/services/session'; const { inject: { service }, - computed: { oneWay, or, notEmpty }, computed } = Ember; export default SimpleAuthSession.extend({ ajax: service(), appMeta: service(), + store: service(), isMac: false, isMobile: false, - authenticated: notEmpty('user.id'), - isAdmin: oneWay('user.admin'), - isEditor: or('user.admin', 'user.editor'), + authenticated: computed('user.id', function () { + return this.get('user.id') !== '0'; + }), + isAdmin: computed('user', function () { + let data = this.get('user'); + return data.get('admin'); + }), + isEditor: computed('user', function () { + let data = this.get('user'); + return data.get('editor'); + }), init: function () { this.set('isMac', is.mac()); @@ -37,10 +44,11 @@ export default SimpleAuthSession.extend({ user: computed('isAuthenticated', 'session.content.authenticated.user', function () { if (this.get('isAuthenticated')) { let user = this.get('session.content.authenticated.user') || { id: '' }; - return models.UserModel.create(user); + let data = this.get('store').normalize('user', user); + return this.get('store').push(data); } }), folderPermissions: null, currentFolder: null -}); \ No newline at end of file +}); diff --git a/app/app/services/template.js b/app/app/services/template.js index eeea0646..e3d2eb57 100644 --- a/app/app/services/template.js +++ b/app/app/services/template.js @@ -10,54 +10,58 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; + +const { + inject: { service } +} = Ember; export default Ember.Service.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), + store: service(), - importStockTemplate: function(folderId, templateId) { - let url = `templates/${templateId}/folder/${folderId}?type=stock`; + importStockTemplate: function (folderId, templateId) { + let url = `templates/${templateId}/folder/${folderId}?type=stock`; - return this.get('ajax').request(url, { - method: "POST" - }); - }, + return this.get('ajax').request(url, { + method: "POST" + }); + }, - importSavedTemplate: function(folderId, templateId) { - let url = `templates/${templateId}/folder/${folderId}?type=saved`; + importSavedTemplate: function (folderId, templateId) { + let url = `templates/${templateId}/folder/${folderId}?type=saved`; - return this.get('ajax').post(url).then((doc)=>{ - let docModel = models.DocumentModel.create(doc); - return docModel; - }); - }, + return this.get('ajax').post(url).then((doc) => { + let data = this.get('store').normalize('document', doc); + return this.get('store').push(data); + }); + }, - getSavedTemplates() { - return this.get('ajax').request(`templates`, { - method: 'GET' - }).then((response) => { - if (is.not.array(response)) { - response = []; - } - let templates = Ember.ArrayProxy.create({ - content: Ember.A([]) - }); + getSavedTemplates() { + return this.get('ajax').request(`templates`, { + method: 'GET' + }).then((response) => { + if (is.not.array(response)) { + response = []; + } + let templates = Ember.ArrayProxy.create({ + content: Ember.A([]) + }); - _.each(response, function(template) { - let templateModel = models.TemplateModel.create(template); - templates.pushObject(templateModel); - }); + templates = response.map((template) => { + let data = this.get('store').normalize('template', template); + return this.get('store').push(data); + }); - return templates; - }); - }, + return templates; + }); + }, - getStockTemplates() { - return this.get('ajax').request(`templates/stock`, { - method: 'GET' - }); - }, + getStockTemplates() { + return this.get('ajax').request(`templates/stock`, { + method: 'GET' + }); + }, saveAsTemplate(documentId, name, excerpt) { let payload = { @@ -66,10 +70,9 @@ export default Ember.Service.extend({ Excerpt: excerpt }; - return this.get('ajax').request(`templates`, { - method: 'POST', - data: JSON.stringify(payload) - }).then(() => { - }); + return this.get('ajax').request(`templates`, { + method: 'POST', + data: JSON.stringify(payload) + }).then(() => {}); } }); diff --git a/app/app/services/user.js b/app/app/services/user.js index 28df54e9..138d16d1 100644 --- a/app/app/services/user.js +++ b/app/app/services/user.js @@ -10,21 +10,27 @@ // https://documize.com import Ember from 'ember'; -import models from '../utils/model'; + +const { + isEmpty, + RSVP, + inject: { service } +} = Ember; export default Ember.Service.extend({ - sessionService: Ember.inject.service('session'), - ajax: Ember.inject.service(), + sessionService: service('session'), + ajax: service(), + store: service(), // Adds a new user. add(user) { - return this.get('ajax').request(`users`, { type: 'POST', data: JSON.stringify(user), contentType: 'json' - }).then(function (response) { - return models.UserModel.create(response); + }).then((response) => { + let data = this.get('store').normalize('user', response); + return this.get('store').push(data); }); }, @@ -35,15 +41,17 @@ export default Ember.Service.extend({ return this.get('ajax').request(url, { type: 'GET' }).then((response) => { - return models.UserModel.create(response); + let data = this.get('store').normalize('user', response); + return this.get('store').push(data); }); }, // Returns all users for organization. getAll() { return this.get('ajax').request(`users`).then((response) => { - return response.map(function (obj) { - return models.UserModel.create(obj); + return response.map((obj) => { + let data = this.get('store').normalize('user', obj); + return this.get('store').push(data); }); }); }, @@ -56,8 +64,10 @@ export default Ember.Service.extend({ method: "GET" }).then((response) => { let data = []; - _.each(response, function (obj) { - data.pushObject(models.UserModel.create(obj)); + + data = response.map((obj) => { + let data = this.get('store').normalize('user', obj); + return this.get('store').push(data); }); return data; @@ -66,7 +76,7 @@ export default Ember.Service.extend({ // Updates an existing user record. save(user) { - let userId = user.get('id'); + let userId = user.id; let url = `users/${userId}`; return this.get('ajax').request(url, { @@ -91,6 +101,9 @@ export default Ember.Service.extend({ return this.get('ajax').request(url, { method: 'DELETE' + }).then(() => { + let user = this.get('store').peekRecord('user', `${userId}`); + return user.deleteRecord(); }); }, @@ -98,8 +111,8 @@ export default Ember.Service.extend({ forgotPassword(email) { let url = `public/forgot`; - if (is.empty(email)) { - return Ember.RSVP.reject("invalid"); + if (isEmpty(email)) { + return RSVP.reject("invalid"); } let data = JSON.stringify({ @@ -117,8 +130,8 @@ export default Ember.Service.extend({ resetPassword(token, password) { var url = `public/reset/${token}`; - if (is.empty(token) || is.empty(password)) { - return Ember.RSVP.reject("invalid"); + if (isEmpty(token) || isEmpty(password)) { + return RSVP.reject("invalid"); } return this.get('ajax').request(url, { diff --git a/app/app/templates/components/layout/zone-navigation.hbs b/app/app/templates/components/layout/zone-navigation.hbs index 90cb95f2..011d1e95 100644 --- a/app/app/templates/components/layout/zone-navigation.hbs +++ b/app/app/templates/components/layout/zone-navigation.hbs @@ -50,7 +50,7 @@
  • {{#link-to 'profile'}}Profile{{/link-to}}
  • - {{#if session.isAdmin}} + {{#if session.session.content.authenticated.user.admin}}
  • {{#link-to 'customize.general'}}Settings{{/link-to}}
  • diff --git a/app/app/utils/toc.js b/app/app/utils/toc.js index 4ed9b572..27f139d6 100644 --- a/app/app/utils/toc.js +++ b/app/app/utils/toc.js @@ -12,17 +12,17 @@ function getState(toc, page) { let state = { tocTools: { - upTarget: "", - downTarget: "", + upTarget: "", + downTarget: "", indentIncrement: 0, - allowIndent: false, - allowOutdent: false - }, - actionablePage: false, - upDisabled: true, - downDisabled: true, - indentDisabled: true, - outdentDisabled: true, + allowIndent: false, + allowOutdent: false + }, + actionablePage: false, + upDisabled: true, + downDisabled: true, + indentDisabled: true, + outdentDisabled: true, }; if (is.undefined(page)) { @@ -55,19 +55,19 @@ function getState(toc, page) { if (index2 !== -1) { // up for (var i = index2; i >= 0; i--) { - if (page.level > toc[i].level) { + if (page.get('level') > toc[i].get('level')) { break; } - if (page.level === toc[i].level) { + if (page.get('level') === toc[i].get('level')) { state.tocTools.upTarget = toc[i].id; break; } } // indent? - state.tocTools.allowIndent = upPage.level >= page.level; - state.tocTools.indentIncrement = upPage.level - page.level; + state.tocTools.allowIndent = upPage.get('level') >= page.get('level'); + state.tocTools.indentIncrement = upPage.get('level') - page.get('level'); if (state.tocTools.indentIncrement === 0) { state.tocTools.indentIncrement = 1; @@ -94,28 +94,28 @@ function getState(toc, page) { if (index3 !== -1) { for (var i3 = index3; i3 < toc.length; i3++) { - if (toc[i3].level < page.level) { + if (toc[i3].get('level') < page.get('level')) { break; } - if (page.level === toc[i3].level) { + if (page.get('level') === toc[i3].get('level')) { state.tocTools.downTarget = toc[i3].id; break; } } } - if (page.level > downPage.level) { + if (page.get('level') > downPage.get('level')) { state.tocTools.downTarget = ''; } } // can we outdent? - state.tocTools.allowOutdent = page.level > 1; + state.tocTools.allowOutdent = page.get('level') > 1; state.upDisabled = state.tocTools.upTarget === ''; state.downDisabled = state.tocTools.downTarget === ''; - state.indentDisabled = !state.tocTools.allowIndent; + state.indentDisabled = !state.tocTools.allowIndent; state.outdentDisabled = !state.tocTools.allowOutdent; state.actionablePage = is.not.empty(state.tocTools.upTarget) || @@ -141,8 +141,8 @@ function moveUp(state, pages, current) { page2 = pages[index1 - 1]; } - var sequence1 = page1.sequence; - var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.sequence : 0; + var sequence1 = page1.get('sequence'); + var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.get('sequence') : 0; var index = _.indexOf(pages, current, false); if (index !== -1) { @@ -154,11 +154,11 @@ function moveUp(state, pages, current) { }); for (var i = index + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { + if (pages[i].get('level') <= current.get('level')) { break; } - sequence = (sequence + page1.sequence) / 2; + sequence = (sequence + page1.get('sequence')) / 2; pendingChanges.push({ pageId: pages[i].id, @@ -184,28 +184,28 @@ function moveDown(state, pages, current) { var startingSequence = 0; var upperSequence = 0; var cutOff = _.rest(pages, downTargetIndex); - var siblings = _.reject(cutOff, function(p) { - return p.level !== current.level || p.id === current.id || p.id === downTarget.id; + var siblings = _.reject(cutOff, function (p) { + return p.get('level') !== current.get('level') || p.id === current.id || p.id === downTarget.id; }); if (siblings.length > 0) { var aboveThisGuy = siblings[0]; var belowThisGuy = pages[_.indexOf(pages, aboveThisGuy, false) - 1]; - if (is.not.null(belowThisGuy) && belowThisGuy.level > current.level) { - startingSequence = (aboveThisGuy.sequence + belowThisGuy.sequence) / 2; - upperSequence = aboveThisGuy.sequence; + if (is.not.null(belowThisGuy) && belowThisGuy.get('level') > current.get('level')) { + startingSequence = (aboveThisGuy.get('sequence') + belowThisGuy.get('sequence')) / 2; + upperSequence = aboveThisGuy.get('sequence'); } else { var otherGuy = pages[downTargetIndex + 1]; - startingSequence = (otherGuy.sequence + downTarget.sequence) / 2; - upperSequence = otherGuy.sequence; + startingSequence = (otherGuy.get('sequence') + downTarget.get('sequence')) / 2; + upperSequence = otherGuy.get('sequence'); } } else { // startingSequence = downTarget.sequence * 2; - startingSequence = cutOff[cutOff.length-1].sequence * 2; + startingSequence = cutOff[cutOff.length - 1].sequence * 2; upperSequence = startingSequence * 2; - } + } pendingChanges.push({ pageId: current.id, @@ -215,7 +215,7 @@ function moveDown(state, pages, current) { var sequence = (startingSequence + upperSequence) / 2; for (var i = pageIndex + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { + if (pages[i].get('level') <= current.get('level')) { break; } @@ -237,17 +237,17 @@ function indent(state, pages, current) { pendingChanges.push({ pageId: current.id, - level: current.level + state.tocTools.indentIncrement + level: current.get('level') + state.tocTools.indentIncrement }); for (var i = pageIndex + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { + if (pages[i].get('level') <= current.get('level')) { break; } pendingChanges.push({ pageId: pages[i].id, - level: pages[i].level + state.tocTools.indentIncrement + level: pages[i].get('level') + state.tocTools.indentIncrement }); } @@ -260,17 +260,17 @@ function outdent(state, pages, current) { pendingChanges.push({ pageId: current.id, - level: current.level - 1 + level: current.get('level') - 1 }); for (var i = pageIndex + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { + if (pages[i].get('level') <= current.get('level')) { break; } pendingChanges.push({ pageId: pages[i].id, - level: pages[i].level - 1 + level: pages[i].get('level') - 1 }); } diff --git a/core/product.go b/core/product.go index c7845bbb..74b3b312 100644 --- a/core/product.go +++ b/core/product.go @@ -26,7 +26,7 @@ type ProdInfo struct { // Product returns product edition details func Product() (p ProdInfo) { p.Major = "0" - p.Minor = "19" + p.Minor = "20" p.Patch = "0" p.Version = fmt.Sprintf("%s.%s.%s", p.Major, p.Minor, p.Patch) p.Edition = "Community"