mirror of
https://github.com/documize/community.git
synced 2025-07-25 16:19:46 +02:00
Merge branch 'master' into wordconvert
This commit is contained in:
commit
788437ff64
45 changed files with 1666 additions and 1124 deletions
|
@ -1,64 +1,64 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
document: {},
|
document: {},
|
||||||
meta: [],
|
meta: [],
|
||||||
pages: [],
|
pages: [],
|
||||||
|
|
||||||
didReceiveAttrs() {
|
didReceiveAttrs() {
|
||||||
let editors = this.get('meta.editors');
|
let editors = this.get('meta.editors');
|
||||||
let toc = this.get('pages');
|
let toc = this.get('pages');
|
||||||
|
|
||||||
if (is.null(editors)) {
|
if (is.null(editors)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
editors.forEach(function(item) {
|
editors.forEach(function (item) {
|
||||||
Ember.set(item, "added", item.action === "add-page");
|
Ember.set(item, "added", item.action === "add-page");
|
||||||
Ember.set(item, "changed", item.action === "update-page");
|
Ember.set(item, "changed", item.action === "update-page");
|
||||||
Ember.set(item, "deleted", item.action === "remove-page");
|
Ember.set(item, "deleted", item.action === "remove-page");
|
||||||
|
|
||||||
let page = _.findWhere(toc, {
|
let page = _.findWhere(toc, {
|
||||||
id: item.pageId
|
id: item.pageId
|
||||||
});
|
});
|
||||||
let title = "";
|
let title = "";
|
||||||
|
|
||||||
if (is.not.undefined(page)) {
|
if (is.not.undefined(page)) {
|
||||||
title = page.title;
|
title = page.get('title');
|
||||||
|
|
||||||
if (item.added) {
|
if (item.added) {
|
||||||
Ember.set(item, 'changeLabel', "added " + title);
|
Ember.set(item, 'changeLabel', "added " + title);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.changed) {
|
if (item.changed) {
|
||||||
Ember.set(item, 'changeLabel', "changed " + title);
|
Ember.set(item, 'changeLabel', "changed " + title);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Ember.set(item, "deleted", true);
|
Ember.set(item, "deleted", true);
|
||||||
|
|
||||||
if (item.added) {
|
if (item.added) {
|
||||||
Ember.set(item, 'changeLabel', "added section (since removed)");
|
Ember.set(item, 'changeLabel', "added section (since removed)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.changed) {
|
if (item.changed) {
|
||||||
Ember.set(item, 'changeLabel', "changed section (since removed)");
|
Ember.set(item, 'changeLabel', "changed section (since removed)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.deleted) {
|
if (item.deleted) {
|
||||||
Ember.set(item, 'changeLabel', "removed section");
|
Ember.set(item, 'changeLabel', "removed section");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -11,100 +11,104 @@
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
folderService: Ember.inject.service('folder'),
|
folderService: service('folder'),
|
||||||
appMeta: Ember.inject.service(),
|
appMeta: service(),
|
||||||
users: [],
|
users: [],
|
||||||
folders: [],
|
folders: [],
|
||||||
folder: {},
|
folder: {},
|
||||||
moveTarget: null,
|
moveTarget: null,
|
||||||
inviteEmail: "",
|
inviteEmail: "",
|
||||||
inviteMessage: "",
|
inviteMessage: "",
|
||||||
roleMessage: "",
|
roleMessage: "",
|
||||||
permissions: {},
|
permissions: {},
|
||||||
|
|
||||||
getDefaultInvitationMessage() {
|
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.";
|
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() {
|
willRender() {
|
||||||
if (this.inviteMessage.length === 0) {
|
if (this.inviteMessage.length === 0) {
|
||||||
this.set('inviteMessage', this.getDefaultInvitationMessage());
|
this.set('inviteMessage', this.getDefaultInvitationMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.roleMessage.length === 0) {
|
if (this.roleMessage.length === 0) {
|
||||||
this.set('roleMessage', this.getDefaultInvitationMessage());
|
this.set('roleMessage', this.getDefaultInvitationMessage());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
rename() {
|
rename() {
|
||||||
if (is.empty(this.folder.get('name'))) {
|
if (is.empty(this.folder.get('name'))) {
|
||||||
$("#folderName").addClass("error").focus();
|
$("#folderName").addClass("error").focus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendAction("onRename", this.folder);
|
this.sendAction("onRename", this.folder);
|
||||||
},
|
},
|
||||||
|
|
||||||
remove() {
|
remove() {
|
||||||
if (is.null(this.get('moveTarget'))) {
|
if (is.null(this.get('moveTarget'))) {
|
||||||
$("#delete-target > select").addClass("error").focus();
|
$("#delete-target > select").addClass("error").focus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendAction("onRemove", this.get('moveTarget').get('id'));
|
this.sendAction("onRemove", this.get('moveTarget').get('id'));
|
||||||
},
|
},
|
||||||
|
|
||||||
share() {
|
share() {
|
||||||
var email = this.get('inviteEmail').trim().replace(/ /g, '');
|
var email = this.get('inviteEmail').trim().replace(/ /g, '');
|
||||||
var message = this.get('inviteMessage').trim();
|
var message = this.get('inviteMessage').trim();
|
||||||
|
|
||||||
if (message.length === 0) {
|
if (message.length === 0) {
|
||||||
message = this.getDefaultInvitationMessage();
|
message = this.getDefaultInvitationMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (email.length === 0) {
|
if (email.length === 0) {
|
||||||
$("#inviteEmail").addClass("error").focus();
|
$("#inviteEmail").addClass("error").focus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = {
|
var result = {
|
||||||
Message: message,
|
Message: message,
|
||||||
Recipients: []
|
Recipients: []
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check for multiple email addresses
|
// Check for multiple email addresses
|
||||||
if (email.indexOf(",") > -1) {
|
if (email.indexOf(",") > -1) {
|
||||||
result.Recipients = email.split(',');
|
result.Recipients = email.split(',');
|
||||||
}
|
}
|
||||||
if (email.indexOf(";") > -1 && result.Recipients.length === 0) {
|
if (email.indexOf(";") > -1 && result.Recipients.length === 0) {
|
||||||
result.Recipients = email.split(';');
|
result.Recipients = email.split(';');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle just one email address
|
// Handle just one email address
|
||||||
if (result.Recipients.length === 0 && email.length > 0) {
|
if (result.Recipients.length === 0 && email.length > 0) {
|
||||||
result.Recipients.push(email);
|
result.Recipients.push(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.set('inviteEmail', "");
|
this.set('inviteEmail', "");
|
||||||
|
|
||||||
this.sendAction("onShare", result);
|
this.sendAction("onShare", result);
|
||||||
},
|
},
|
||||||
|
|
||||||
setPermissions() {
|
setPermissions() {
|
||||||
var message = this.get('roleMessage').trim();
|
var message = this.get('roleMessage').trim();
|
||||||
|
|
||||||
if (message.length === 0) {
|
if (message.length === 0) {
|
||||||
message = this.getDefaultInvitationMessage();
|
message = this.getDefaultInvitationMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.get('permissions').forEach(function(permission, index) /* jshint ignore:line */ {
|
this.get('permissions').forEach((permission, index) => { /* jshint ignore:line */
|
||||||
Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked'));
|
Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked'));
|
||||||
Ember.set(permission, 'canEdit', $("#canEdit-" + 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'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -14,71 +14,70 @@ import constants from '../../utils/constants';
|
||||||
import TooltipMixin from '../../mixins/tooltip';
|
import TooltipMixin from '../../mixins/tooltip';
|
||||||
|
|
||||||
export default Ember.Component.extend(TooltipMixin, {
|
export default Ember.Component.extend(TooltipMixin, {
|
||||||
folderService: Ember.inject.service('folder'),
|
folderService: Ember.inject.service('folder'),
|
||||||
publicFolders: [],
|
publicFolders: [],
|
||||||
protectedFolders: [],
|
protectedFolders: [],
|
||||||
privateFolders: [],
|
privateFolders: [],
|
||||||
hasPublicFolders: false,
|
hasPublicFolders: false,
|
||||||
hasProtectedFolders: false,
|
hasProtectedFolders: false,
|
||||||
hasPrivateFolders: false,
|
hasPrivateFolders: false,
|
||||||
newFolder: "",
|
newFolder: "",
|
||||||
|
|
||||||
didInsertElement() {
|
didInsertElement() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
if (this.session.authenticated) {
|
if (this.session.authenticated) {
|
||||||
this.addTooltip(document.getElementById("add-folder-button"));
|
this.addTooltip(document.getElementById("add-folder-button"));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
didReceiveAttrs() {
|
didReceiveAttrs() {
|
||||||
let folders = this.get('folders');
|
let folders = this.get('folders');
|
||||||
let self = this;
|
|
||||||
|
|
||||||
// clear out state
|
// clear out state
|
||||||
this.set('publicFolders', []);
|
this.set('publicFolders', []);
|
||||||
this.set('protectedFolders', []);
|
this.set('protectedFolders', []);
|
||||||
this.set('privateFolders', []);
|
this.set('privateFolders', []);
|
||||||
|
|
||||||
_.each(folders, folder => {
|
_.each(folders, folder => {
|
||||||
if (folder.folderType === constants.FolderType.Public) {
|
if (folder.get('folderType') === constants.FolderType.Public) {
|
||||||
let folders = self.get('publicFolders');
|
let folders = this.get('publicFolders');
|
||||||
folders.pushObject(folder);
|
folders.pushObject(folder);
|
||||||
self.set('publicFolders', folders);
|
this.set('publicFolders', folders);
|
||||||
}
|
}
|
||||||
if (folder.folderType === constants.FolderType.Private) {
|
if (folder.get('folderType') === constants.FolderType.Private) {
|
||||||
let folders = self.get('privateFolders');
|
let folders = this.get('privateFolders');
|
||||||
folders.pushObject(folder);
|
folders.pushObject(folder);
|
||||||
self.set('privateFolders', folders);
|
this.set('privateFolders', folders);
|
||||||
}
|
}
|
||||||
if (folder.folderType === constants.FolderType.Protected) {
|
if (folder.get('folderType') === constants.FolderType.Protected) {
|
||||||
let folders = self.get('protectedFolders');
|
let folders = this.get('protectedFolders');
|
||||||
folders.pushObject(folder);
|
folders.pushObject(folder);
|
||||||
self.set('protectedFolders', folders);
|
this.set('protectedFolders', folders);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('hasPublicFolders', this.get('publicFolders.length') > 0);
|
this.set('hasPublicFolders', this.get('publicFolders.length') > 0);
|
||||||
this.set('hasPrivateFolders', this.get('privateFolders.length') > 0);
|
this.set('hasPrivateFolders', this.get('privateFolders.length') > 0);
|
||||||
this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0);
|
this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
willDestroyElement() {
|
willDestroyElement() {
|
||||||
this.destroyTooltips();
|
this.destroyTooltips();
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
addFolder() {
|
addFolder() {
|
||||||
var folderName = this.get('newFolder');
|
var folderName = this.get('newFolder');
|
||||||
|
|
||||||
if (is.empty(folderName)) {
|
if (is.empty(folderName)) {
|
||||||
$("#new-folder-name").addClass("error").focus();
|
$("#new-folder-name").addClass("error").focus();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.attrs.onFolderAdd(folderName);
|
this.attrs.onFolderAdd(folderName);
|
||||||
|
|
||||||
this.set('newFolder', "");
|
this.set('newFolder', "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -12,14 +12,19 @@
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import netUtil from '../../utils/net';
|
import netUtil from '../../utils/net';
|
||||||
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
folderService: Ember.inject.service('folder'),
|
folderService: service('folder'),
|
||||||
folder: null,
|
folder: null,
|
||||||
appMeta: Ember.inject.service(),
|
appMeta: service(),
|
||||||
|
session: service(),
|
||||||
|
|
||||||
didInitAttrs() {
|
didInitAttrs() {
|
||||||
if (this.get("session.authenticated")) {
|
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
|
// TODO: do not mutate account.active here
|
||||||
account.active = account.orgId === this.get("appMeta.orgId");
|
account.active = account.orgId === this.get("appMeta.orgId");
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -54,7 +54,8 @@ export default Ember.Component.extend({
|
||||||
let self = this;
|
let self = this;
|
||||||
|
|
||||||
let user = this.users.findBy("id", id);
|
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', {
|
this.set('password', {
|
||||||
password: "",
|
password: "",
|
||||||
confirmation: ""
|
confirmation: ""
|
||||||
|
@ -112,15 +113,15 @@ export default Ember.Component.extend({
|
||||||
let user = this.get('editUser');
|
let user = this.get('editUser');
|
||||||
let password = this.get('password');
|
let password = this.get('password');
|
||||||
|
|
||||||
if (is.empty(user.get('firstname'))) {
|
if (is.empty(user.firstname)) {
|
||||||
$("#edit-firstname").addClass("error").focus();
|
$("#edit-firstname").addClass("error").focus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (is.empty(user.get('lastname'))) {
|
if (is.empty(user.lastname)) {
|
||||||
$("#edit-lastname").addClass("error").focus();
|
$("#edit-lastname").addClass("error").focus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (is.empty(user.get('email'))) {
|
if (is.empty(user.email)) {
|
||||||
$("#edit-email").addClass("error").focus();
|
$("#edit-email").addClass("error").focus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -144,4 +145,4 @@ export default Ember.Component.extend({
|
||||||
this.attrs.onDelete(user);
|
this.attrs.onDelete(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
25
app/app/models/attachment.js
Normal file
25
app/app/models/attachment.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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(),
|
||||||
|
});
|
36
app/app/models/document.js
Normal file
36
app/app/models/document.js
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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()
|
||||||
|
});
|
23
app/app/models/folder-permission.js
Normal file
23
app/app/models/folder-permission.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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 })
|
||||||
|
});
|
45
app/app/models/folder.js
Normal file
45
app/app/models/folder.js
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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()
|
||||||
|
});
|
23
app/app/models/organization.js
Normal file
23
app/app/models/organization.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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()
|
||||||
|
});
|
25
app/app/models/page-meta.js
Normal file
25
app/app/models/page-meta.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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(),
|
||||||
|
});
|
44
app/app/models/page.js
Normal file
44
app/app/models/page.js
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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()
|
||||||
|
});
|
29
app/app/models/protected-folder-participant.js
Normal file
29
app/app/models/protected-folder-participant.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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')}`;
|
||||||
|
})
|
||||||
|
});
|
29
app/app/models/section.js
Normal file
29
app/app/models/section.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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()
|
||||||
|
});
|
30
app/app/models/template.js
Normal file
30
app/app/models/template.js
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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()
|
||||||
|
});
|
38
app/app/models/user.js
Normal file
38
app/app/models/user.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
||||||
|
//
|
||||||
|
// This software (Documize Community Edition) is licensed under
|
||||||
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
|
//
|
||||||
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
|
// by contacting <sales@documize.com>.
|
||||||
|
//
|
||||||
|
// https://documize.com
|
||||||
|
|
||||||
|
import 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));
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -27,17 +27,16 @@ export default Ember.Controller.extend(NotifierMixin, {
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
changeOwner: function (folderId, userId) {
|
changeOwner: function (folderId, userId) {
|
||||||
let self = this;
|
this.get('folderService').getFolder(folderId).then((folder) => {
|
||||||
this.get('folderService').getFolder(folderId).then(function (folder) {
|
|
||||||
folder.set('userId', userId);
|
folder.set('userId', userId);
|
||||||
|
|
||||||
self.get('folderService').save(folder).then(function () {
|
this.get('folderService').save(folder).then(() => {
|
||||||
self.showNotification("Changed");
|
this.showNotification("Changed");
|
||||||
self.audit.record('changed-folder-owner');
|
this.audit.record('changed-folder-owner');
|
||||||
});
|
});
|
||||||
|
|
||||||
self.send('onChangeOwner');
|
this.send('onChangeOwner');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -29,17 +29,17 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||||
let nonPrivateFolders = model.rejectBy('folderType', 2);
|
let nonPrivateFolders = model.rejectBy('folderType', 2);
|
||||||
controller.set('folders', nonPrivateFolders);
|
controller.set('folders', nonPrivateFolders);
|
||||||
|
|
||||||
this.get('folderService').getProtectedFolderInfo().then(function (people) {
|
this.get('folderService').getProtectedFolderInfo().then((people) => {
|
||||||
people.forEach(function (person) {
|
people.forEach((person) => {
|
||||||
person.isEveryone = person.userId === '';
|
person.set('isEveryone', person.get('userId') === '');
|
||||||
person.isOwner = false;
|
person.set('isOwner', false);
|
||||||
});
|
});
|
||||||
|
|
||||||
nonPrivateFolders.forEach(function (folder) {
|
nonPrivateFolders.forEach(function (folder) {
|
||||||
let shared = people.filterBy('folderId', folder.get('id'));
|
let shared = people.filterBy('folderId', folder.get('id'));
|
||||||
let person = shared.findBy('userId', folder.get('userId'));
|
let person = shared.findBy('userId', folder.get('userId'));
|
||||||
if (is.not.undefined(person)) {
|
if (is.not.undefined(person)) {
|
||||||
person.isOwner = true;
|
person.set('isOwner', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
folder.set('sharedWith', shared);
|
folder.set('sharedWith', shared);
|
||||||
|
@ -56,4 +56,4 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||||
this.refresh();
|
this.refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ export default Ember.Controller.extend(NotifierMixin, {
|
||||||
this.showNotification("Saving");
|
this.showNotification("Saving");
|
||||||
|
|
||||||
let model = {
|
let model = {
|
||||||
page: page,
|
page: page.toJSON({ includeId: true }),
|
||||||
meta: meta
|
meta: meta.toJSON({ includeId: true })
|
||||||
};
|
};
|
||||||
|
|
||||||
this.get('documentService').updatePage(page.get('documentId'), page.get('id'), model).then(function () {
|
this.get('documentService').updatePage(page.get('documentId'), page.get('id'), model).then(function () {
|
||||||
|
@ -43,4 +43,4 @@ export default Ember.Controller.extend(NotifierMixin, {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// 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');
|
let pages = self.get('pages');
|
||||||
pages = _.sortBy(pages, "sequence");
|
pages = pages.sortBy('sequence');
|
||||||
self.set('pages', []);
|
self.set('pages', []);
|
||||||
self.set('pages', pages);
|
self.set('pages', pages);
|
||||||
});
|
});
|
||||||
|
@ -216,4 +216,4 @@ export default Ember.Controller.extend(NotifierMixin, {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,49 +1,52 @@
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../../../utils/model';
|
|
||||||
import NotifierMixin from '../../../mixins/notifier';
|
import NotifierMixin from '../../../mixins/notifier';
|
||||||
|
|
||||||
export default Ember.Controller.extend(NotifierMixin, {
|
export default Ember.Controller.extend(NotifierMixin, {
|
||||||
documentService: Ember.inject.service('document'),
|
documentService: Ember.inject.service('document'),
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
onCancel() {
|
onCancel() {
|
||||||
this.transitionToRoute('document');
|
this.transitionToRoute('document');
|
||||||
},
|
},
|
||||||
|
|
||||||
onAddSection(section) {
|
|
||||||
let self = this;
|
|
||||||
|
|
||||||
|
onAddSection(section) {
|
||||||
this.audit.record("added-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({
|
let page = {
|
||||||
documentId: this.get('model.document.id'),
|
documentId: this.get('model.document.id'),
|
||||||
title: `${section.title} Section`,
|
title: `${section.get('title')} Section`,
|
||||||
level: 1,
|
level: 1,
|
||||||
sequence: 2048,
|
sequence: 2048,
|
||||||
body: "",
|
body: "",
|
||||||
contentType: section.contentType
|
contentType: section.get('contentType')
|
||||||
});
|
};
|
||||||
|
|
||||||
let meta = models.PageMetaModel.create({
|
let data = this.get('store').normalize('page', page);
|
||||||
documentId: this.get('model.document.id'),
|
let pageData = this.get('store').push(data);
|
||||||
rawBody: "",
|
|
||||||
config: ""
|
|
||||||
});
|
|
||||||
|
|
||||||
let model = {
|
let meta = {
|
||||||
page: page,
|
documentId: this.get('model.document.id'),
|
||||||
meta: meta
|
rawBody: "",
|
||||||
};
|
config: ""
|
||||||
|
};
|
||||||
|
|
||||||
this.get('documentService').addPage(this.get('model.document.id'), model).then(function(newPage) {
|
let pageMeta = this.get('store').normalize('page-meta', meta);
|
||||||
self.transitionToRoute('document.edit',
|
let pageMetaData = this.get('store').push(pageMeta);
|
||||||
self.get('model.folder.id'),
|
|
||||||
self.get('model.folder.slug'),
|
let model = {
|
||||||
self.get('model.document.id'),
|
page: pageData,
|
||||||
self.get('model.document.slug'),
|
meta: pageMetaData
|
||||||
newPage.id);
|
};
|
||||||
});
|
|
||||||
}
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -31,4 +31,4 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||||
this.browser.setTitle(model.folder.get('name'));
|
this.browser.setTitle(model.folder.get('name'));
|
||||||
this.get('folderService').setCurrentFolder(model.folder);
|
this.get('folderService').setCurrentFolder(model.folder);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -27,7 +27,6 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||||
},
|
},
|
||||||
|
|
||||||
afterModel: function (model) {
|
afterModel: function (model) {
|
||||||
|
|
||||||
let params = this.paramsFor('folders.folder');
|
let params = this.paramsFor('folders.folder');
|
||||||
|
|
||||||
if (is.empty(params)) {
|
if (is.empty(params)) {
|
||||||
|
|
|
@ -1,23 +1,28 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../../../utils/model';
|
|
||||||
import NotifierMixin from '../../../mixins/notifier';
|
import NotifierMixin from '../../../mixins/notifier';
|
||||||
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Route.extend(NotifierMixin, {
|
export default Ember.Route.extend(NotifierMixin, {
|
||||||
folderService: Ember.inject.service('folder'),
|
folderService: service('folder'),
|
||||||
userService: Ember.inject.service('user'),
|
userService: service('user'),
|
||||||
folder: {},
|
folder: {},
|
||||||
tab: "",
|
tab: "",
|
||||||
|
localStorage: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
beforeModel: function (transition) {
|
beforeModel: function (transition) {
|
||||||
this.tab = is.not.undefined(transition.queryParams.tab) ? transition.queryParams.tab : "tabGeneral";
|
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) {
|
setupController(controller, model) {
|
||||||
var self = this;
|
|
||||||
this.folder = model;
|
this.folder = model;
|
||||||
controller.set('model', model);
|
controller.set('model', model);
|
||||||
|
|
||||||
|
@ -38,54 +42,63 @@ export default Ember.Route.extend(NotifierMixin, {
|
||||||
controller.set('tabDelete', false);
|
controller.set('tabDelete', false);
|
||||||
controller.set(this.get('tab'), true);
|
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')));
|
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);
|
controller.set('users', users);
|
||||||
|
|
||||||
var folderPermissions = [];
|
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: "",
|
userId: "",
|
||||||
fullname: " Everyone",
|
fullname: " Everyone",
|
||||||
orgId: model.get('orgId'),
|
orgId: model.get('orgId'),
|
||||||
folderId: model.get('id'),
|
folderId: model.get('id'),
|
||||||
canEdit: false,
|
canEdit: false,
|
||||||
canView: false
|
canView: false
|
||||||
});
|
};
|
||||||
|
|
||||||
folderPermissions.pushObject(u);
|
folderPermissions.pushObject(u);
|
||||||
|
|
||||||
users.forEach(function (user, index) /* jshint ignore:line */ {
|
this.get('folderService').getPermissions(model.id).then((permissions) => {
|
||||||
if (user.get('active')) {
|
permissions.forEach((permission, index) => { /* jshint ignore:line */
|
||||||
var u = models.FolderPermissionModel.create({
|
var folderPermission = folderPermissions.findBy('userId', permission.get('userId'));
|
||||||
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);
|
|
||||||
if (is.not.undefined(folderPermission)) {
|
if (is.not.undefined(folderPermission)) {
|
||||||
Ember.set(folderPermission, 'orgId', permission.orgId);
|
Ember.setProperties(folderPermission, {
|
||||||
Ember.set(folderPermission, 'folderId', permission.folderId);
|
orgId: permission.get('orgId'),
|
||||||
Ember.set(folderPermission, 'canEdit', permission.canEdit);
|
folderId: permission.get('folderId'),
|
||||||
Ember.set(folderPermission, 'canView', permission.canView);
|
canEdit: permission.get('canEdit'),
|
||||||
Ember.set(folderPermission, 'canViewPrevious', permission.canView);
|
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'));
|
controller.set('permissions', folderPermissions.sortBy('fullname'));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -100,36 +113,41 @@ export default Ember.Route.extend(NotifierMixin, {
|
||||||
},
|
},
|
||||||
|
|
||||||
onRemove(moveId) {
|
onRemove(moveId) {
|
||||||
let self = this;
|
|
||||||
|
|
||||||
this.get('folderService').remove(this.folder.get('id'), moveId).then(function () { /* jshint ignore:line */
|
this.get('folderService').remove(this.folder.get('id'), moveId).then(() => { /* jshint ignore:line */
|
||||||
self.showNotification("Deleted");
|
this.showNotification("Deleted");
|
||||||
self.session.clearSessionItem('folder');
|
this.get('localStorage').clearSessionItem('folder');
|
||||||
|
|
||||||
self.get('folderService').getFolder(moveId).then(function (folder) {
|
this.get('folderService').getFolder(moveId).then((folder) => {
|
||||||
self.get('folderService').setCurrentFolder(folder);
|
this.get('folderService').setCurrentFolder(folder);
|
||||||
self.transitionTo('folders.folder', folder.get('id'), folder.get('slug'));
|
this.transitionTo('folders.folder', folder.get('id'), folder.get('slug'));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onShare: function (invitation) {
|
onShare: function (invitation) {
|
||||||
let self = this;
|
|
||||||
|
|
||||||
this.get('folderService').share(this.folder.get('id'), invitation).then(function () {
|
this.get('folderService').share(this.folder.get('id'), invitation).then(() => {
|
||||||
self.showNotification("Shared");
|
this.showNotification("Shared");
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onPermission: function (folder, message, permissions) {
|
onPermission: function (folder, message, permissions) {
|
||||||
var self = this;
|
var data = permissions.map((obj) => {
|
||||||
var data = permissions.map(function (obj) {
|
let permission = {
|
||||||
return obj.getProperties('orgId', 'folderId', 'userId', 'canEdit', 'canView');
|
'orgId': obj.orgId,
|
||||||
|
'folderId': obj.folderId,
|
||||||
|
'userId': obj.userId,
|
||||||
|
'canEdit': obj.canEdit,
|
||||||
|
'canView': obj.canView
|
||||||
|
};
|
||||||
|
|
||||||
|
return permission;
|
||||||
});
|
});
|
||||||
var payload = { Message: message, Roles: data };
|
var payload = { Message: message, Roles: data };
|
||||||
|
|
||||||
this.get('folderService').savePermissions(folder.get('id'), payload).then(function () {
|
this.get('folderService').savePermissions(folder.get('id'), payload).then(() => {
|
||||||
self.showNotification("Saved");
|
this.showNotification("Saved");
|
||||||
});
|
});
|
||||||
|
|
||||||
var hasEveryone = _.find(data, function (permission) {
|
var hasEveryone = _.find(data, function (permission) {
|
||||||
|
|
13
app/app/serializers/application.js
Normal file
13
app/app/serializers/application.js
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
13
app/app/serializers/folder-permission.js
Normal file
13
app/app/serializers/folder-permission.js
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
13
app/app/serializers/page-meta.js
Normal file
13
app/app/serializers/page-meta.js
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
13
app/app/serializers/page.js
Normal file
13
app/app/serializers/page.js
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
13
app/app/serializers/protected-folder-participant.js
Normal file
13
app/app/serializers/protected-folder-participant.js
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
13
app/app/serializers/user.js
Normal file
13
app/app/serializers/user.js
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
// Copyright 2016 Documize Inc. <legal@documize.com>. 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
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
//
|
//
|
||||||
// You can operate outside the AGPL restrictions by purchasing
|
// You can operate outside the AGPL restrictions by purchasing
|
||||||
// Documize Enterprise Edition and obtaining a commercial license
|
// Documize Enterprise Edition and obtaining a commercial license
|
||||||
// by contacting <sales@documize.com>.
|
// by contacting <sales@documize.com>.
|
||||||
//
|
//
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ import AjaxService from 'ember-ajax/services/ajax';
|
||||||
import config from '../config/environment';
|
import config from '../config/environment';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
computed,
|
||||||
inject: { service }
|
inject: { service }
|
||||||
} = Ember;
|
} = Ember;
|
||||||
|
|
||||||
|
@ -22,7 +23,7 @@ export default AjaxService.extend({
|
||||||
host: config.apiHost,
|
host: config.apiHost,
|
||||||
namespace: config.apiNamespace,
|
namespace: config.apiNamespace,
|
||||||
|
|
||||||
headers: Ember.computed('session.session.content.authenticated.token', {
|
headers: computed('session.session.content.authenticated.token', {
|
||||||
get() {
|
get() {
|
||||||
let headers = {};
|
let headers = {};
|
||||||
const token = this.get('session.session.content.authenticated.token');
|
const token = this.get('session.session.content.authenticated.token');
|
||||||
|
@ -33,4 +34,4 @@ export default AjaxService.extend({
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,9 +13,13 @@ import Ember from 'ember';
|
||||||
import netUtil from '../utils/net';
|
import netUtil from '../utils/net';
|
||||||
import config from '../config/environment';
|
import config from '../config/environment';
|
||||||
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Service.extend({
|
export default Ember.Service.extend({
|
||||||
session: Ember.inject.service('session'),
|
session: service('session'),
|
||||||
appMeta: Ember.inject.service(),
|
appMeta: service(),
|
||||||
ready: false,
|
ready: false,
|
||||||
enabled: config.APP.auditEnabled,
|
enabled: config.APP.auditEnabled,
|
||||||
appId: config.APP.intercomKey,
|
appId: config.APP.intercomKey,
|
||||||
|
|
|
@ -10,18 +10,23 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Service.extend({
|
export default Ember.Service.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
// Returns document model for specified document id.
|
// Returns document model for specified document id.
|
||||||
getDocument(documentId) {
|
getDocument(documentId) {
|
||||||
return this.get('ajax').request(`documents/${documentId}`, {
|
return this.get('ajax').request(`documents/${documentId}`, {
|
||||||
method: "GET"
|
method: "GET"
|
||||||
}).then((response) => {
|
}).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([])
|
content: Ember.A([])
|
||||||
});
|
});
|
||||||
|
|
||||||
_.each(response, function (doc) {
|
if (isObject(response)) {
|
||||||
let documentModel = models.DocumentModel.create(doc);
|
return documents;
|
||||||
documents.pushObject(documentModel);
|
}
|
||||||
|
|
||||||
|
documents = response.map((doc) => {
|
||||||
|
let data = this.get('store').normalize('document', doc);
|
||||||
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
return documents;
|
return documents;
|
||||||
|
@ -52,9 +61,9 @@ export default Ember.Service.extend({
|
||||||
content: Ember.A([])
|
content: Ember.A([])
|
||||||
});
|
});
|
||||||
|
|
||||||
_.each(response, function (doc) {
|
documents = response.map((doc) => {
|
||||||
let documentModel = models.DocumentModel.create(doc);
|
let data = this.get('store').normalize('document', doc);
|
||||||
documents.pushObject(documentModel);
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
return documents;
|
return documents;
|
||||||
|
@ -115,6 +124,7 @@ export default Ember.Service.extend({
|
||||||
updatePage: function (documentId, pageId, payload, skipRevision) {
|
updatePage: function (documentId, pageId, payload, skipRevision) {
|
||||||
var revision = skipRevision ? "?r=true" : "?r=false";
|
var revision = skipRevision ? "?r=true" : "?r=false";
|
||||||
let url = `documents/${documentId}/pages/${pageId}${revision}`;
|
let url = `documents/${documentId}/pages/${pageId}${revision}`;
|
||||||
|
Ember.set(payload.meta, 'id', parseInt(payload.meta.id));
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
return this.get('ajax').request(url, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
|
@ -192,8 +202,9 @@ export default Ember.Service.extend({
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let data = [];
|
let data = [];
|
||||||
_.each(response, function (obj) {
|
data = response.map((obj) => {
|
||||||
data.pushObject(models.PageModel.create(obj));
|
let data = this.get('store').normalize('page', obj);
|
||||||
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
@ -208,8 +219,9 @@ export default Ember.Service.extend({
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let pages = [];
|
let pages = [];
|
||||||
|
|
||||||
_.each(response, function (page) {
|
pages = response.map((page) => {
|
||||||
pages.pushObject(models.PageModel.create(page));
|
let data = this.get('store').normalize('page', page);
|
||||||
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
return pages;
|
return pages;
|
||||||
|
@ -222,8 +234,8 @@ export default Ember.Service.extend({
|
||||||
return this.get('ajax').request(`documents/${documentId}/pages/${pageId}`, {
|
return this.get('ajax').request(`documents/${documentId}/pages/${pageId}`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let page = models.PageModel.create(response);
|
let data = this.get('store').normalize('page', response);
|
||||||
return page;
|
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`, {
|
return this.get('ajax').request(`documents/${documentId}/pages/${pageId}/meta`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let meta = models.PageMetaModel.create(response);
|
let data = this.get('store').normalize('page-meta', response);
|
||||||
return meta;
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -245,9 +257,16 @@ export default Ember.Service.extend({
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let data = [];
|
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;
|
return data;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -260,3 +279,7 @@ export default Ember.Service.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function isObject(a) {
|
||||||
|
return (!!a) && (a.constructor === Object);
|
||||||
|
}
|
||||||
|
|
|
@ -10,17 +10,19 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
import BaseService from '../services/base';
|
import BaseService from '../services/base';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
get
|
get,
|
||||||
|
RSVP,
|
||||||
|
inject: { service }
|
||||||
} = Ember;
|
} = Ember;
|
||||||
|
|
||||||
export default BaseService.extend({
|
export default BaseService.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
localStorage: Ember.inject.service(),
|
localStorage: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
// selected folder
|
// selected folder
|
||||||
currentFolder: null,
|
currentFolder: null,
|
||||||
|
@ -28,38 +30,35 @@ export default BaseService.extend({
|
||||||
|
|
||||||
// Add a new folder.
|
// Add a new folder.
|
||||||
add(folder) {
|
add(folder) {
|
||||||
|
|
||||||
return this.get('ajax').post(`folders`, {
|
return this.get('ajax').post(`folders`, {
|
||||||
contentType: 'json',
|
contentType: 'json',
|
||||||
data: JSON.stringify(folder)
|
data: JSON.stringify(folder)
|
||||||
}).then((folder) => {
|
}).then((folder) => {
|
||||||
let folderModel = models.FolderModel.create(folder);
|
let data = this.get('store').normalize('folder', folder);
|
||||||
return folderModel;
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// Returns folder model for specified folder id.
|
// Returns folder model for specified folder id.
|
||||||
getFolder(id) {
|
getFolder(id) {
|
||||||
|
|
||||||
return this.get('ajax').request(`folders/${id}`, {
|
return this.get('ajax').request(`folders/${id}`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) => {
|
}).then((folder) => {
|
||||||
let folder = models.FolderModel.create(response);
|
let data = this.get('store').normalize('folder', folder);
|
||||||
return folder;
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// Returns all folders that user can see.
|
// Returns all folders that user can see.
|
||||||
getAll() {
|
getAll() {
|
||||||
let self = this;
|
let folders = this.get('folders');
|
||||||
|
|
||||||
if (this.get('folders') != null) {
|
if (folders != null) {
|
||||||
return new Ember.RSVP.Promise(function (resolve) {
|
return new RSVP.resolve(folders);
|
||||||
resolve(self.get('folders'));
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return this.reload();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return this.reload();
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Updates an existing folder record.
|
// 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}`;
|
let url = `folders/${folderId}/move/${moveToId}`;
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
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}`;
|
let url = `public/share/${folderId}`;
|
||||||
|
|
||||||
return this.get('ajax').post(url, {
|
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 returns non-private folders and who has access to them.
|
||||||
getProtectedFolderInfo: function () {
|
getProtectedFolderInfo() {
|
||||||
return this.get('ajax').request(`folders?filter=viewers`, {
|
return this.get('ajax').request(`folders?filter=viewers`, {
|
||||||
method: "GET"
|
method: "GET"
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let data = [];
|
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;
|
return data;
|
||||||
|
@ -111,8 +112,10 @@ export default BaseService.extend({
|
||||||
method: "GET"
|
method: "GET"
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let data = [];
|
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;
|
return data;
|
||||||
|
@ -126,8 +129,10 @@ export default BaseService.extend({
|
||||||
method: "GET"
|
method: "GET"
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let data = [];
|
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;
|
return data;
|
||||||
|
@ -136,7 +141,6 @@ export default BaseService.extend({
|
||||||
|
|
||||||
// persist folder permissions
|
// persist folder permissions
|
||||||
savePermissions(folderId, payload) {
|
savePermissions(folderId, payload) {
|
||||||
|
|
||||||
return this.get('ajax').request(`folders/${folderId}/permissions`, {
|
return this.get('ajax').request(`folders/${folderId}/permissions`, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
contentType: 'json',
|
contentType: 'json',
|
||||||
|
@ -181,7 +185,7 @@ export default BaseService.extend({
|
||||||
let result = [];
|
let result = [];
|
||||||
let folderId = folder.get('id');
|
let folderId = folder.get('id');
|
||||||
|
|
||||||
folderPermissions.forEach(function (item) {
|
folderPermissions.forEach((item) => {
|
||||||
if (item.folderId === folderId) {
|
if (item.folderId === folderId) {
|
||||||
result.push(item);
|
result.push(item);
|
||||||
}
|
}
|
||||||
|
@ -189,7 +193,7 @@ export default BaseService.extend({
|
||||||
|
|
||||||
let canEdit = false;
|
let canEdit = false;
|
||||||
|
|
||||||
result.forEach(function (permission) {
|
result.forEach((permission) => {
|
||||||
if (permission.userId === userId) {
|
if (permission.userId === userId) {
|
||||||
canEdit = permission.canEdit;
|
canEdit = permission.canEdit;
|
||||||
}
|
}
|
||||||
|
@ -203,4 +207,4 @@ export default BaseService.extend({
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,35 +10,39 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Service.extend({
|
export default Ember.Service.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
appMeta: Ember.inject.service(),
|
appMeta: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
// Returns attributes for specified org id.
|
// Returns attributes for specified org id.
|
||||||
getOrg(id) {
|
getOrg(id) {
|
||||||
return this.get('ajax').request(`organizations/${id}`, {
|
return this.get('ajax').request(`organizations/${id}`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) =>{
|
}).then((response) => {
|
||||||
let org = models.OrganizationModel.create(response);
|
let data = this.get('store').normalize('organization', response);
|
||||||
return org;
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// Updates an existing organization record.
|
// Updates an existing organization record.
|
||||||
save(org) {
|
save(org) {
|
||||||
let id = org.get('id');
|
let id = org.id;
|
||||||
|
|
||||||
this.get('appMeta').setProperties({
|
this.get('appMeta').setProperties({
|
||||||
message: org.message,
|
message: org.get('message'),
|
||||||
title: org.title
|
title: org.get('title')
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.get('ajax').request(`organizations/${id}`, {
|
return this.get('ajax').request(`organizations/${id}`, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
data: JSON.stringify(org)
|
data: JSON.stringify(org)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -11,16 +11,20 @@
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Service.extend({
|
export default Ember.Service.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
|
|
||||||
// getUsers returns all users for organization.
|
// getUsers returns all users for organization.
|
||||||
find(keywords) {
|
find(keywords) {
|
||||||
let url = "search?keywords=" + encodeURIComponent(keywords);
|
let url = "search?keywords=" + encodeURIComponent(keywords);
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
return this.get('ajax').request(url, {
|
||||||
method: "GET"
|
method: "GET"
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,56 +10,63 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
import BaseService from '../services/base';
|
import BaseService from '../services/base';
|
||||||
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default BaseService.extend({
|
export default BaseService.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
// Returns all available sections.
|
// Returns all available sections.
|
||||||
getAll() {
|
getAll() {
|
||||||
return this.get('ajax').request(`sections`,{
|
return this.get('ajax').request(`sections`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response)=>{
|
}).then((response) => {
|
||||||
let data = [];
|
let data = [];
|
||||||
_.each(response, function(obj) {
|
|
||||||
data.pushObject(models.SectionModel.create(obj));
|
|
||||||
});
|
|
||||||
|
|
||||||
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
|
return data;
|
||||||
// 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 this.get('ajax').post(url, {
|
// Requests data from the specified section handler, passing the method and document ID
|
||||||
data: JSON.stringify(data),
|
// and POST payload.
|
||||||
contentType: "application/json"
|
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?
|
return this.get('ajax').post(url, {
|
||||||
refresh(documentId) {
|
data: JSON.stringify(data),
|
||||||
let url = `sections/refresh?documentID=${documentId}`;
|
contentType: "application/json"
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
// Did any dynamic sections change? Fetch and send up for rendering?
|
||||||
method: 'GET'
|
refresh(documentId) {
|
||||||
}).then((response)=>{
|
let url = `sections/refresh?documentID=${documentId}`;
|
||||||
let pages = [];
|
|
||||||
|
|
||||||
if (is.not.null(response) && is.array(response) && response.length > 0) {
|
return this.get('ajax').request(url, {
|
||||||
_.each(response, function(page) {
|
method: 'GET'
|
||||||
pages.pushObject(models.PageModel.create(page));
|
}).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;
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,24 +10,31 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
import SimpleAuthSession from 'ember-simple-auth/services/session';
|
import SimpleAuthSession from 'ember-simple-auth/services/session';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
inject: { service },
|
inject: { service },
|
||||||
computed: { oneWay, or, notEmpty },
|
|
||||||
computed
|
computed
|
||||||
} = Ember;
|
} = Ember;
|
||||||
|
|
||||||
export default SimpleAuthSession.extend({
|
export default SimpleAuthSession.extend({
|
||||||
ajax: service(),
|
ajax: service(),
|
||||||
appMeta: service(),
|
appMeta: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
isMac: false,
|
isMac: false,
|
||||||
isMobile: false,
|
isMobile: false,
|
||||||
authenticated: notEmpty('user.id'),
|
authenticated: computed('user.id', function () {
|
||||||
isAdmin: oneWay('user.admin'),
|
return this.get('user.id') !== '0';
|
||||||
isEditor: or('user.admin', 'user.editor'),
|
}),
|
||||||
|
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 () {
|
init: function () {
|
||||||
this.set('isMac', is.mac());
|
this.set('isMac', is.mac());
|
||||||
|
@ -37,10 +44,11 @@ export default SimpleAuthSession.extend({
|
||||||
user: computed('isAuthenticated', 'session.content.authenticated.user', function () {
|
user: computed('isAuthenticated', 'session.content.authenticated.user', function () {
|
||||||
if (this.get('isAuthenticated')) {
|
if (this.get('isAuthenticated')) {
|
||||||
let user = this.get('session.content.authenticated.user') || { id: '' };
|
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,
|
folderPermissions: null,
|
||||||
currentFolder: null
|
currentFolder: null
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,54 +10,58 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
|
const {
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Service.extend({
|
export default Ember.Service.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
importStockTemplate: function(folderId, templateId) {
|
importStockTemplate: function (folderId, templateId) {
|
||||||
let url = `templates/${templateId}/folder/${folderId}?type=stock`;
|
let url = `templates/${templateId}/folder/${folderId}?type=stock`;
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
return this.get('ajax').request(url, {
|
||||||
method: "POST"
|
method: "POST"
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
importSavedTemplate: function(folderId, templateId) {
|
importSavedTemplate: function (folderId, templateId) {
|
||||||
let url = `templates/${templateId}/folder/${folderId}?type=saved`;
|
let url = `templates/${templateId}/folder/${folderId}?type=saved`;
|
||||||
|
|
||||||
return this.get('ajax').post(url).then((doc)=>{
|
return this.get('ajax').post(url).then((doc) => {
|
||||||
let docModel = models.DocumentModel.create(doc);
|
let data = this.get('store').normalize('document', doc);
|
||||||
return docModel;
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getSavedTemplates() {
|
getSavedTemplates() {
|
||||||
return this.get('ajax').request(`templates`, {
|
return this.get('ajax').request(`templates`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
if (is.not.array(response)) {
|
if (is.not.array(response)) {
|
||||||
response = [];
|
response = [];
|
||||||
}
|
}
|
||||||
let templates = Ember.ArrayProxy.create({
|
let templates = Ember.ArrayProxy.create({
|
||||||
content: Ember.A([])
|
content: Ember.A([])
|
||||||
});
|
});
|
||||||
|
|
||||||
_.each(response, function(template) {
|
templates = response.map((template) => {
|
||||||
let templateModel = models.TemplateModel.create(template);
|
let data = this.get('store').normalize('template', template);
|
||||||
templates.pushObject(templateModel);
|
return this.get('store').push(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
return templates;
|
return templates;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getStockTemplates() {
|
getStockTemplates() {
|
||||||
return this.get('ajax').request(`templates/stock`, {
|
return this.get('ajax').request(`templates/stock`, {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
saveAsTemplate(documentId, name, excerpt) {
|
saveAsTemplate(documentId, name, excerpt) {
|
||||||
let payload = {
|
let payload = {
|
||||||
|
@ -66,10 +70,9 @@ export default Ember.Service.extend({
|
||||||
Excerpt: excerpt
|
Excerpt: excerpt
|
||||||
};
|
};
|
||||||
|
|
||||||
return this.get('ajax').request(`templates`, {
|
return this.get('ajax').request(`templates`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
data: JSON.stringify(payload)
|
data: JSON.stringify(payload)
|
||||||
}).then(() => {
|
}).then(() => {});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,21 +10,27 @@
|
||||||
// https://documize.com
|
// https://documize.com
|
||||||
|
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import models from '../utils/model';
|
|
||||||
|
const {
|
||||||
|
isEmpty,
|
||||||
|
RSVP,
|
||||||
|
inject: { service }
|
||||||
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Service.extend({
|
export default Ember.Service.extend({
|
||||||
sessionService: Ember.inject.service('session'),
|
sessionService: service('session'),
|
||||||
ajax: Ember.inject.service(),
|
ajax: service(),
|
||||||
|
store: service(),
|
||||||
|
|
||||||
// Adds a new user.
|
// Adds a new user.
|
||||||
add(user) {
|
add(user) {
|
||||||
|
|
||||||
return this.get('ajax').request(`users`, {
|
return this.get('ajax').request(`users`, {
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: JSON.stringify(user),
|
data: JSON.stringify(user),
|
||||||
contentType: 'json'
|
contentType: 'json'
|
||||||
}).then(function (response) {
|
}).then((response) => {
|
||||||
return models.UserModel.create(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, {
|
return this.get('ajax').request(url, {
|
||||||
type: 'GET'
|
type: 'GET'
|
||||||
}).then((response) => {
|
}).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.
|
// Returns all users for organization.
|
||||||
getAll() {
|
getAll() {
|
||||||
return this.get('ajax').request(`users`).then((response) => {
|
return this.get('ajax').request(`users`).then((response) => {
|
||||||
return response.map(function (obj) {
|
return response.map((obj) => {
|
||||||
return models.UserModel.create(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"
|
method: "GET"
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
let data = [];
|
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;
|
return data;
|
||||||
|
@ -66,7 +76,7 @@ export default Ember.Service.extend({
|
||||||
|
|
||||||
// Updates an existing user record.
|
// Updates an existing user record.
|
||||||
save(user) {
|
save(user) {
|
||||||
let userId = user.get('id');
|
let userId = user.id;
|
||||||
let url = `users/${userId}`;
|
let url = `users/${userId}`;
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
return this.get('ajax').request(url, {
|
||||||
|
@ -91,6 +101,9 @@ export default Ember.Service.extend({
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
return this.get('ajax').request(url, {
|
||||||
method: 'DELETE'
|
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) {
|
forgotPassword(email) {
|
||||||
let url = `public/forgot`;
|
let url = `public/forgot`;
|
||||||
|
|
||||||
if (is.empty(email)) {
|
if (isEmpty(email)) {
|
||||||
return Ember.RSVP.reject("invalid");
|
return RSVP.reject("invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = JSON.stringify({
|
let data = JSON.stringify({
|
||||||
|
@ -117,8 +130,8 @@ export default Ember.Service.extend({
|
||||||
resetPassword(token, password) {
|
resetPassword(token, password) {
|
||||||
var url = `public/reset/${token}`;
|
var url = `public/reset/${token}`;
|
||||||
|
|
||||||
if (is.empty(token) || is.empty(password)) {
|
if (isEmpty(token) || isEmpty(password)) {
|
||||||
return Ember.RSVP.reject("invalid");
|
return RSVP.reject("invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.get('ajax').request(url, {
|
return this.get('ajax').request(url, {
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
<li class="item">
|
<li class="item">
|
||||||
{{#link-to 'profile'}}Profile{{/link-to}}
|
{{#link-to 'profile'}}Profile{{/link-to}}
|
||||||
</li>
|
</li>
|
||||||
{{#if session.isAdmin}}
|
{{#if session.session.content.authenticated.user.admin}}
|
||||||
<li class="item">
|
<li class="item">
|
||||||
{{#link-to 'customize.general'}}Settings{{/link-to}}
|
{{#link-to 'customize.general'}}Settings{{/link-to}}
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -12,17 +12,17 @@
|
||||||
function getState(toc, page) {
|
function getState(toc, page) {
|
||||||
let state = {
|
let state = {
|
||||||
tocTools: {
|
tocTools: {
|
||||||
upTarget: "",
|
upTarget: "",
|
||||||
downTarget: "",
|
downTarget: "",
|
||||||
indentIncrement: 0,
|
indentIncrement: 0,
|
||||||
allowIndent: false,
|
allowIndent: false,
|
||||||
allowOutdent: false
|
allowOutdent: false
|
||||||
},
|
},
|
||||||
actionablePage: false,
|
actionablePage: false,
|
||||||
upDisabled: true,
|
upDisabled: true,
|
||||||
downDisabled: true,
|
downDisabled: true,
|
||||||
indentDisabled: true,
|
indentDisabled: true,
|
||||||
outdentDisabled: true,
|
outdentDisabled: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (is.undefined(page)) {
|
if (is.undefined(page)) {
|
||||||
|
@ -55,19 +55,19 @@ function getState(toc, page) {
|
||||||
if (index2 !== -1) {
|
if (index2 !== -1) {
|
||||||
// up
|
// up
|
||||||
for (var i = index2; i >= 0; i--) {
|
for (var i = index2; i >= 0; i--) {
|
||||||
if (page.level > toc[i].level) {
|
if (page.get('level') > toc[i].get('level')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page.level === toc[i].level) {
|
if (page.get('level') === toc[i].get('level')) {
|
||||||
state.tocTools.upTarget = toc[i].id;
|
state.tocTools.upTarget = toc[i].id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// indent?
|
// indent?
|
||||||
state.tocTools.allowIndent = upPage.level >= page.level;
|
state.tocTools.allowIndent = upPage.get('level') >= page.get('level');
|
||||||
state.tocTools.indentIncrement = upPage.level - page.level;
|
state.tocTools.indentIncrement = upPage.get('level') - page.get('level');
|
||||||
|
|
||||||
if (state.tocTools.indentIncrement === 0) {
|
if (state.tocTools.indentIncrement === 0) {
|
||||||
state.tocTools.indentIncrement = 1;
|
state.tocTools.indentIncrement = 1;
|
||||||
|
@ -94,28 +94,28 @@ function getState(toc, page) {
|
||||||
|
|
||||||
if (index3 !== -1) {
|
if (index3 !== -1) {
|
||||||
for (var i3 = index3; i3 < toc.length; i3++) {
|
for (var i3 = index3; i3 < toc.length; i3++) {
|
||||||
if (toc[i3].level < page.level) {
|
if (toc[i3].get('level') < page.get('level')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page.level === toc[i3].level) {
|
if (page.get('level') === toc[i3].get('level')) {
|
||||||
state.tocTools.downTarget = toc[i3].id;
|
state.tocTools.downTarget = toc[i3].id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page.level > downPage.level) {
|
if (page.get('level') > downPage.get('level')) {
|
||||||
state.tocTools.downTarget = '';
|
state.tocTools.downTarget = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// can we outdent?
|
// can we outdent?
|
||||||
state.tocTools.allowOutdent = page.level > 1;
|
state.tocTools.allowOutdent = page.get('level') > 1;
|
||||||
|
|
||||||
state.upDisabled = state.tocTools.upTarget === '';
|
state.upDisabled = state.tocTools.upTarget === '';
|
||||||
state.downDisabled = state.tocTools.downTarget === '';
|
state.downDisabled = state.tocTools.downTarget === '';
|
||||||
state.indentDisabled = !state.tocTools.allowIndent;
|
state.indentDisabled = !state.tocTools.allowIndent;
|
||||||
state.outdentDisabled = !state.tocTools.allowOutdent;
|
state.outdentDisabled = !state.tocTools.allowOutdent;
|
||||||
|
|
||||||
state.actionablePage = is.not.empty(state.tocTools.upTarget) ||
|
state.actionablePage = is.not.empty(state.tocTools.upTarget) ||
|
||||||
|
@ -141,8 +141,8 @@ function moveUp(state, pages, current) {
|
||||||
page2 = pages[index1 - 1];
|
page2 = pages[index1 - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
var sequence1 = page1.sequence;
|
var sequence1 = page1.get('sequence');
|
||||||
var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.sequence : 0;
|
var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.get('sequence') : 0;
|
||||||
var index = _.indexOf(pages, current, false);
|
var index = _.indexOf(pages, current, false);
|
||||||
|
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
|
@ -154,11 +154,11 @@ function moveUp(state, pages, current) {
|
||||||
});
|
});
|
||||||
|
|
||||||
for (var i = index + 1; i < pages.length; i++) {
|
for (var i = index + 1; i < pages.length; i++) {
|
||||||
if (pages[i].level <= current.level) {
|
if (pages[i].get('level') <= current.get('level')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sequence = (sequence + page1.sequence) / 2;
|
sequence = (sequence + page1.get('sequence')) / 2;
|
||||||
|
|
||||||
pendingChanges.push({
|
pendingChanges.push({
|
||||||
pageId: pages[i].id,
|
pageId: pages[i].id,
|
||||||
|
@ -184,28 +184,28 @@ function moveDown(state, pages, current) {
|
||||||
var startingSequence = 0;
|
var startingSequence = 0;
|
||||||
var upperSequence = 0;
|
var upperSequence = 0;
|
||||||
var cutOff = _.rest(pages, downTargetIndex);
|
var cutOff = _.rest(pages, downTargetIndex);
|
||||||
var siblings = _.reject(cutOff, function(p) {
|
var siblings = _.reject(cutOff, function (p) {
|
||||||
return p.level !== current.level || p.id === current.id || p.id === downTarget.id;
|
return p.get('level') !== current.get('level') || p.id === current.id || p.id === downTarget.id;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (siblings.length > 0) {
|
if (siblings.length > 0) {
|
||||||
var aboveThisGuy = siblings[0];
|
var aboveThisGuy = siblings[0];
|
||||||
var belowThisGuy = pages[_.indexOf(pages, aboveThisGuy, false) - 1];
|
var belowThisGuy = pages[_.indexOf(pages, aboveThisGuy, false) - 1];
|
||||||
|
|
||||||
if (is.not.null(belowThisGuy) && belowThisGuy.level > current.level) {
|
if (is.not.null(belowThisGuy) && belowThisGuy.get('level') > current.get('level')) {
|
||||||
startingSequence = (aboveThisGuy.sequence + belowThisGuy.sequence) / 2;
|
startingSequence = (aboveThisGuy.get('sequence') + belowThisGuy.get('sequence')) / 2;
|
||||||
upperSequence = aboveThisGuy.sequence;
|
upperSequence = aboveThisGuy.get('sequence');
|
||||||
} else {
|
} else {
|
||||||
var otherGuy = pages[downTargetIndex + 1];
|
var otherGuy = pages[downTargetIndex + 1];
|
||||||
|
|
||||||
startingSequence = (otherGuy.sequence + downTarget.sequence) / 2;
|
startingSequence = (otherGuy.get('sequence') + downTarget.get('sequence')) / 2;
|
||||||
upperSequence = otherGuy.sequence;
|
upperSequence = otherGuy.get('sequence');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// startingSequence = downTarget.sequence * 2;
|
// startingSequence = downTarget.sequence * 2;
|
||||||
startingSequence = cutOff[cutOff.length-1].sequence * 2;
|
startingSequence = cutOff[cutOff.length - 1].sequence * 2;
|
||||||
upperSequence = startingSequence * 2;
|
upperSequence = startingSequence * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingChanges.push({
|
pendingChanges.push({
|
||||||
pageId: current.id,
|
pageId: current.id,
|
||||||
|
@ -215,7 +215,7 @@ function moveDown(state, pages, current) {
|
||||||
var sequence = (startingSequence + upperSequence) / 2;
|
var sequence = (startingSequence + upperSequence) / 2;
|
||||||
|
|
||||||
for (var i = pageIndex + 1; i < pages.length; i++) {
|
for (var i = pageIndex + 1; i < pages.length; i++) {
|
||||||
if (pages[i].level <= current.level) {
|
if (pages[i].get('level') <= current.get('level')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,17 +237,17 @@ function indent(state, pages, current) {
|
||||||
|
|
||||||
pendingChanges.push({
|
pendingChanges.push({
|
||||||
pageId: current.id,
|
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++) {
|
for (var i = pageIndex + 1; i < pages.length; i++) {
|
||||||
if (pages[i].level <= current.level) {
|
if (pages[i].get('level') <= current.get('level')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingChanges.push({
|
pendingChanges.push({
|
||||||
pageId: pages[i].id,
|
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({
|
pendingChanges.push({
|
||||||
pageId: current.id,
|
pageId: current.id,
|
||||||
level: current.level - 1
|
level: current.get('level') - 1
|
||||||
});
|
});
|
||||||
|
|
||||||
for (var i = pageIndex + 1; i < pages.length; i++) {
|
for (var i = pageIndex + 1; i < pages.length; i++) {
|
||||||
if (pages[i].level <= current.level) {
|
if (pages[i].get('level') <= current.get('level')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingChanges.push({
|
pendingChanges.push({
|
||||||
pageId: pages[i].id,
|
pageId: pages[i].id,
|
||||||
level: pages[i].level - 1
|
level: pages[i].get('level') - 1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,25 @@ func Serve(ready chan struct{}) {
|
||||||
|
|
||||||
log.Info("Starting SSL server on " + port + " with " + certFile + " " + keyFile)
|
log.Info("Starting SSL server on " + port + " with " + certFile + " " + keyFile)
|
||||||
|
|
||||||
server := &http.Server{Addr: ":" + port, Handler: n}
|
// myTLSConfig := &tls.Config{
|
||||||
|
// CipherSuites: []uint16{
|
||||||
|
// tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
|
||||||
|
// tls.TLS_RSA_WITH_AES_128_CBC_SHA,
|
||||||
|
// tls.TLS_RSA_WITH_AES_256_CBC_SHA,
|
||||||
|
// // tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
|
||||||
|
// // tls.TLS_RSA_WITH_AES_256_CBC_SHA256,
|
||||||
|
// tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
// tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
|
||||||
|
// tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
|
||||||
|
// tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
|
||||||
|
// // tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
|
||||||
|
// // tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
|
||||||
|
// tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
// tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384}}
|
||||||
|
// // tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256}}
|
||||||
|
// myTLSConfig.PreferServerCipherSuites = true
|
||||||
|
|
||||||
|
server := &http.Server{Addr: ":" + port, Handler: n /*, TLSConfig: myTLSConfig*/}
|
||||||
server.SetKeepAlivesEnabled(true)
|
server.SetKeepAlivesEnabled(true)
|
||||||
if err := server.ListenAndServeTLS(certFile, keyFile); err != nil {
|
if err := server.ListenAndServeTLS(certFile, keyFile); err != nil {
|
||||||
log.Error("ListenAndServeTLS on "+port, err)
|
log.Error("ListenAndServeTLS on "+port, err)
|
||||||
|
|
|
@ -26,7 +26,7 @@ type ProdInfo struct {
|
||||||
// Product returns product edition details
|
// Product returns product edition details
|
||||||
func Product() (p ProdInfo) {
|
func Product() (p ProdInfo) {
|
||||||
p.Major = "0"
|
p.Major = "0"
|
||||||
p.Minor = "19"
|
p.Minor = "20"
|
||||||
p.Patch = "0"
|
p.Patch = "0"
|
||||||
p.Version = fmt.Sprintf("%s.%s.%s", p.Major, p.Minor, p.Patch)
|
p.Version = fmt.Sprintf("%s.%s.%s", p.Major, p.Minor, p.Patch)
|
||||||
p.Edition = "Community"
|
p.Edition = "Community"
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue