1
0
Fork 0
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:
Elliott Stoneham 2016-09-23 14:30:35 +01:00
commit 788437ff64
45 changed files with 1666 additions and 1124 deletions

View file

@ -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");
} }
} }
}); });
} }
}); });

View file

@ -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'));
} }
} }
}); });

View file

@ -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;
} }
} }
}); });

View file

@ -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");
}); });

View file

@ -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);
} }
} }
}); });

View 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(),
});

View 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()
});

View file

@ -0,0 +1,23 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
import 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
View 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()
});

View file

@ -0,0 +1,23 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
import 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()
});

View 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
View 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()
});

View 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
View 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()
});

View 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
View 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));
}
});

View file

@ -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');
}); });
} }
} }
}); });

View file

@ -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();
} }
} }
}); });

View file

@ -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, {
}); });
} }
} }
}); });

View file

@ -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, {
}); });
} }
} }
}); });

View file

@ -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);
});
}
}
}); });

View file

@ -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);
} }
}); });

View file

@ -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)) {

View file

@ -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) {

View 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
}
};
}
});

View 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
}
};
}
});

View 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
}
};
}
});

View 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
}
};
}
});

View 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
}
};
}
});

View 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
}
};
}
});

View file

@ -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;
} }
}) })
}); });

View file

@ -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,

View file

@ -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);
}

View file

@ -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({
}); });
}); });
}, },
}); });

View file

@ -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)
}); });
} }
}); });

View file

@ -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"
}); });
}, },
}); });

View file

@ -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}&section=${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}&section=${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;
});
}
}); });

View file

@ -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
}); });

View file

@ -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(() => {});
});
} }
}); });

View file

@ -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, {

View file

@ -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>

View file

@ -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
}); });
} }

View file

@ -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)

View file

@ -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