1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-24 15:49:44 +02:00

Merge pull request #32 from documize/ember-data-store

Push data from services into ember data store
This commit is contained in:
Harvey Kandola 2016-09-16 11:34:32 -07:00 committed by GitHub
commit 8a351b8e10
43 changed files with 1069 additions and 545 deletions

View file

@ -1,64 +1,64 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
import Ember from 'ember';
export default Ember.Component.extend({
document: {},
meta: [],
pages: [],
document: {},
meta: [],
pages: [],
didReceiveAttrs() {
let editors = this.get('meta.editors');
let toc = this.get('pages');
didReceiveAttrs() {
let editors = this.get('meta.editors');
let toc = this.get('pages');
if (is.null(editors)) {
return;
}
if (is.null(editors)) {
return;
}
editors.forEach(function(item) {
Ember.set(item, "added", item.action === "add-page");
Ember.set(item, "changed", item.action === "update-page");
Ember.set(item, "deleted", item.action === "remove-page");
editors.forEach(function (item) {
Ember.set(item, "added", item.action === "add-page");
Ember.set(item, "changed", item.action === "update-page");
Ember.set(item, "deleted", item.action === "remove-page");
let page = _.findWhere(toc, {
id: item.pageId
});
let title = "";
let page = _.findWhere(toc, {
id: item.pageId
});
let title = "";
if (is.not.undefined(page)) {
title = page.title;
if (is.not.undefined(page)) {
title = page.get('title');
if (item.added) {
Ember.set(item, 'changeLabel', "added " + title);
}
if (item.added) {
Ember.set(item, 'changeLabel', "added " + title);
}
if (item.changed) {
Ember.set(item, 'changeLabel', "changed " + title);
}
} else {
Ember.set(item, "deleted", true);
if (item.changed) {
Ember.set(item, 'changeLabel', "changed " + title);
}
} else {
Ember.set(item, "deleted", true);
if (item.added) {
Ember.set(item, 'changeLabel', "added section (since removed)");
}
if (item.added) {
Ember.set(item, 'changeLabel', "added section (since removed)");
}
if (item.changed) {
Ember.set(item, 'changeLabel', "changed section (since removed)");
}
if (item.changed) {
Ember.set(item, 'changeLabel', "changed section (since removed)");
}
if (item.deleted) {
Ember.set(item, 'changeLabel', "removed section");
}
}
});
}
});
if (item.deleted) {
Ember.set(item, 'changeLabel', "removed section");
}
}
});
}
});

View file

@ -11,100 +11,104 @@
import Ember from 'ember';
const {
inject: { service }
} = Ember;
export default Ember.Component.extend({
folderService: Ember.inject.service('folder'),
appMeta: Ember.inject.service(),
users: [],
folders: [],
folder: {},
moveTarget: null,
inviteEmail: "",
inviteMessage: "",
roleMessage: "",
permissions: {},
folderService: service('folder'),
appMeta: service(),
users: [],
folders: [],
folder: {},
moveTarget: null,
inviteEmail: "",
inviteMessage: "",
roleMessage: "",
permissions: {},
getDefaultInvitationMessage() {
return "Hey there, I am sharing the " + this.folder.get('name') + " (in " + this.get("appMeta.title") + ") with you so we can both access the same documents.";
},
getDefaultInvitationMessage() {
return "Hey there, I am sharing the " + this.folder.get('name') + " (in " + this.get("appMeta.title") + ") with you so we can both access the same documents.";
},
willRender() {
if (this.inviteMessage.length === 0) {
this.set('inviteMessage', this.getDefaultInvitationMessage());
}
willRender() {
if (this.inviteMessage.length === 0) {
this.set('inviteMessage', this.getDefaultInvitationMessage());
}
if (this.roleMessage.length === 0) {
this.set('roleMessage', this.getDefaultInvitationMessage());
}
},
if (this.roleMessage.length === 0) {
this.set('roleMessage', this.getDefaultInvitationMessage());
}
},
actions: {
rename() {
if (is.empty(this.folder.get('name'))) {
$("#folderName").addClass("error").focus();
return;
}
actions: {
rename() {
if (is.empty(this.folder.get('name'))) {
$("#folderName").addClass("error").focus();
return;
}
this.sendAction("onRename", this.folder);
},
this.sendAction("onRename", this.folder);
},
remove() {
if (is.null(this.get('moveTarget'))) {
$("#delete-target > select").addClass("error").focus();
return;
}
remove() {
if (is.null(this.get('moveTarget'))) {
$("#delete-target > select").addClass("error").focus();
return;
}
this.sendAction("onRemove", this.get('moveTarget').get('id'));
},
this.sendAction("onRemove", this.get('moveTarget').get('id'));
},
share() {
var email = this.get('inviteEmail').trim().replace(/ /g, '');
var message = this.get('inviteMessage').trim();
share() {
var email = this.get('inviteEmail').trim().replace(/ /g, '');
var message = this.get('inviteMessage').trim();
if (message.length === 0) {
message = this.getDefaultInvitationMessage();
}
if (message.length === 0) {
message = this.getDefaultInvitationMessage();
}
if (email.length === 0) {
$("#inviteEmail").addClass("error").focus();
return;
}
if (email.length === 0) {
$("#inviteEmail").addClass("error").focus();
return;
}
var result = {
Message: message,
Recipients: []
};
var result = {
Message: message,
Recipients: []
};
// Check for multiple email addresses
if (email.indexOf(",") > -1) {
result.Recipients = email.split(',');
}
if (email.indexOf(";") > -1 && result.Recipients.length === 0) {
result.Recipients = email.split(';');
}
// Check for multiple email addresses
if (email.indexOf(",") > -1) {
result.Recipients = email.split(',');
}
if (email.indexOf(";") > -1 && result.Recipients.length === 0) {
result.Recipients = email.split(';');
}
// Handle just one email address
if (result.Recipients.length === 0 && email.length > 0) {
result.Recipients.push(email);
}
// Handle just one email address
if (result.Recipients.length === 0 && email.length > 0) {
result.Recipients.push(email);
}
this.set('inviteEmail', "");
this.set('inviteEmail', "");
this.sendAction("onShare", result);
},
this.sendAction("onShare", result);
},
setPermissions() {
var message = this.get('roleMessage').trim();
setPermissions() {
var message = this.get('roleMessage').trim();
if (message.length === 0) {
message = this.getDefaultInvitationMessage();
}
if (message.length === 0) {
message = this.getDefaultInvitationMessage();
}
this.get('permissions').forEach(function(permission, index) /* jshint ignore:line */ {
Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked'));
Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked'));
});
this.get('permissions').forEach((permission, index) => { /* jshint ignore:line */
Ember.set(permission, 'canView', $("#canView-" + permission.userId).prop('checked'));
Ember.set(permission, 'canEdit', $("#canEdit-" + permission.userId).prop('checked'));
});
this.sendAction("onPermission", this.get('folder'), message, this.get('permissions'));
}
}
this.sendAction("onPermission", this.get('folder'), message, this.get('permissions'));
}
}
});

View file

@ -1,11 +1,11 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -14,71 +14,70 @@ import constants from '../../utils/constants';
import TooltipMixin from '../../mixins/tooltip';
export default Ember.Component.extend(TooltipMixin, {
folderService: Ember.inject.service('folder'),
publicFolders: [],
protectedFolders: [],
privateFolders: [],
hasPublicFolders: false,
hasProtectedFolders: false,
hasPrivateFolders: false,
newFolder: "",
folderService: Ember.inject.service('folder'),
publicFolders: [],
protectedFolders: [],
privateFolders: [],
hasPublicFolders: false,
hasProtectedFolders: false,
hasPrivateFolders: false,
newFolder: "",
didInsertElement() {
this._super(...arguments);
if (this.session.authenticated) {
this.addTooltip(document.getElementById("add-folder-button"));
}
},
didInsertElement() {
this._super(...arguments);
if (this.session.authenticated) {
this.addTooltip(document.getElementById("add-folder-button"));
}
},
didReceiveAttrs() {
let folders = this.get('folders');
let self = this;
didReceiveAttrs() {
let folders = this.get('folders');
// clear out state
this.set('publicFolders', []);
this.set('protectedFolders', []);
this.set('privateFolders', []);
// clear out state
this.set('publicFolders', []);
this.set('protectedFolders', []);
this.set('privateFolders', []);
_.each(folders, folder => {
if (folder.folderType === constants.FolderType.Public) {
let folders = self.get('publicFolders');
folders.pushObject(folder);
self.set('publicFolders', folders);
}
if (folder.folderType === constants.FolderType.Private) {
let folders = self.get('privateFolders');
folders.pushObject(folder);
self.set('privateFolders', folders);
}
if (folder.folderType === constants.FolderType.Protected) {
let folders = self.get('protectedFolders');
folders.pushObject(folder);
self.set('protectedFolders', folders);
}
});
_.each(folders, folder => {
if (folder.get('folderType') === constants.FolderType.Public) {
let folders = this.get('publicFolders');
folders.pushObject(folder);
this.set('publicFolders', folders);
}
if (folder.get('folderType') === constants.FolderType.Private) {
let folders = this.get('privateFolders');
folders.pushObject(folder);
this.set('privateFolders', folders);
}
if (folder.get('folderType') === constants.FolderType.Protected) {
let folders = this.get('protectedFolders');
folders.pushObject(folder);
this.set('protectedFolders', folders);
}
});
this.set('hasPublicFolders', this.get('publicFolders.length') > 0);
this.set('hasPrivateFolders', this.get('privateFolders.length') > 0);
this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0);
},
this.set('hasPublicFolders', this.get('publicFolders.length') > 0);
this.set('hasPrivateFolders', this.get('privateFolders.length') > 0);
this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0);
},
willDestroyElement() {
this.destroyTooltips();
},
willDestroyElement() {
this.destroyTooltips();
},
actions: {
addFolder() {
var folderName = this.get('newFolder');
actions: {
addFolder() {
var folderName = this.get('newFolder');
if (is.empty(folderName)) {
$("#new-folder-name").addClass("error").focus();
return false;
}
if (is.empty(folderName)) {
$("#new-folder-name").addClass("error").focus();
return false;
}
this.attrs.onFolderAdd(folderName);
this.attrs.onFolderAdd(folderName);
this.set('newFolder', "");
return true;
}
}
});
this.set('newFolder', "");
return true;
}
}
});

View file

@ -12,14 +12,19 @@
import Ember from 'ember';
import netUtil from '../../utils/net';
const {
inject: { service }
} = Ember;
export default Ember.Component.extend({
folderService: Ember.inject.service('folder'),
folderService: service('folder'),
folder: null,
appMeta: Ember.inject.service(),
appMeta: service(),
session: service(),
didInitAttrs() {
if (this.get("session.authenticated")) {
this.get("session.user.accounts").forEach((account)=>{
this.get("session.session.content.authenticated.user.accounts").forEach((account) => {
// TODO: do not mutate account.active here
account.active = account.orgId === this.get("appMeta.orgId");
});

View file

@ -1,11 +1,11 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -54,7 +54,8 @@ export default Ember.Component.extend({
let self = this;
let user = this.users.findBy("id", id);
this.set('editUser', user.copy());
let userCopy = user.getProperties('id', 'created', 'revised', 'firstname', 'lastname', 'email', 'initials', 'active', 'editor', 'admin', 'accounts');
this.set('editUser', userCopy);
this.set('password', {
password: "",
confirmation: ""
@ -112,15 +113,15 @@ export default Ember.Component.extend({
let user = this.get('editUser');
let password = this.get('password');
if (is.empty(user.get('firstname'))) {
if (is.empty(user.firstname)) {
$("#edit-firstname").addClass("error").focus();
return;
}
if (is.empty(user.get('lastname'))) {
if (is.empty(user.lastname)) {
$("#edit-lastname").addClass("error").focus();
return;
}
if (is.empty(user.get('email'))) {
if (is.empty(user.email)) {
$("#edit-email").addClass("error").focus();
return;
}
@ -144,4 +145,4 @@ export default Ember.Component.extend({
this.attrs.onDelete(user);
}
}
});
});

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.
//
// This software (Documize Community Edition) is licensed under
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -27,17 +27,16 @@ export default Ember.Controller.extend(NotifierMixin, {
actions: {
changeOwner: function (folderId, userId) {
let self = this;
this.get('folderService').getFolder(folderId).then(function (folder) {
this.get('folderService').getFolder(folderId).then((folder) => {
folder.set('userId', userId);
self.get('folderService').save(folder).then(function () {
self.showNotification("Changed");
self.audit.record('changed-folder-owner');
this.get('folderService').save(folder).then(() => {
this.showNotification("Changed");
this.audit.record('changed-folder-owner');
});
self.send('onChangeOwner');
this.send('onChangeOwner');
});
}
}
});
});

View file

@ -1,11 +1,11 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -29,17 +29,17 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
let nonPrivateFolders = model.rejectBy('folderType', 2);
controller.set('folders', nonPrivateFolders);
this.get('folderService').getProtectedFolderInfo().then(function (people) {
people.forEach(function (person) {
person.isEveryone = person.userId === '';
person.isOwner = false;
this.get('folderService').getProtectedFolderInfo().then((people) => {
people.forEach((person) => {
person.set('isEveryone', person.get('userId') === '');
person.set('isOwner', false);
});
nonPrivateFolders.forEach(function (folder) {
let shared = people.filterBy('folderId', folder.get('id'));
let person = shared.findBy('userId', folder.get('userId'));
if (is.not.undefined(person)) {
person.isOwner = true;
person.set('isOwner', true);
}
folder.set('sharedWith', shared);
@ -56,4 +56,4 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
this.refresh();
}
}
});
});

View file

@ -1,11 +1,11 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -29,8 +29,8 @@ export default Ember.Controller.extend(NotifierMixin, {
this.showNotification("Saving");
let model = {
page: page,
meta: meta
page: page.toJSON({ includeId: true }),
meta: meta.toJSON({ includeId: true })
};
this.get('documentService').updatePage(page.get('documentId'), page.get('id'), model).then(function () {
@ -43,4 +43,4 @@ export default Ember.Controller.extend(NotifierMixin, {
});
}
}
});
});

View file

@ -1,11 +1,11 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@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');
pages = _.sortBy(pages, "sequence");
pages = pages.sortBy('sequence');
self.set('pages', []);
self.set('pages', pages);
});
@ -216,4 +216,4 @@ export default Ember.Controller.extend(NotifierMixin, {
});
}
}
});
});

View file

@ -1,49 +1,52 @@
import Ember from 'ember';
import models from '../../../utils/model';
import NotifierMixin from '../../../mixins/notifier';
export default Ember.Controller.extend(NotifierMixin, {
documentService: Ember.inject.service('document'),
documentService: Ember.inject.service('document'),
actions: {
onCancel() {
this.transitionToRoute('document');
},
onAddSection(section) {
let self = this;
actions: {
onCancel() {
this.transitionToRoute('document');
},
onAddSection(section) {
this.audit.record("added-section");
this.audit.record("added-section-" + section.contentType);
this.audit.record("added-section-" + section.get('contentType'));
let page = models.PageModel.create({
documentId: this.get('model.document.id'),
title: `${section.title} Section`,
level: 1,
sequence: 2048,
body: "",
contentType: section.contentType
});
let page = {
documentId: this.get('model.document.id'),
title: `${section.get('title')} Section`,
level: 1,
sequence: 2048,
body: "",
contentType: section.get('contentType')
};
let meta = models.PageMetaModel.create({
documentId: this.get('model.document.id'),
rawBody: "",
config: ""
});
let data = this.get('store').normalize('page', page);
let pageData = this.get('store').push(data);
let model = {
page: page,
meta: meta
};
let meta = {
documentId: this.get('model.document.id'),
rawBody: "",
config: ""
};
this.get('documentService').addPage(this.get('model.document.id'), model).then(function(newPage) {
self.transitionToRoute('document.edit',
self.get('model.folder.id'),
self.get('model.folder.slug'),
self.get('model.document.id'),
self.get('model.document.slug'),
newPage.id);
});
}
}
let pageMeta = this.get('store').normalize('page-meta', meta);
let pageMetaData = this.get('store').push(pageMeta);
let model = {
page: pageData,
meta: pageMetaData
};
this.get('documentService').addPage(this.get('model.document.id'), model).then((newPage) => {
this.transitionToRoute('document.edit',
this.get('model.folder.id'),
this.get('model.folder.slug'),
this.get('model.document.id'),
this.get('model.document.slug'),
newPage.id);
});
}
}
});

View file

@ -1,11 +1,11 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -31,4 +31,4 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
this.browser.setTitle(model.folder.get('name'));
this.get('folderService').setCurrentFolder(model.folder);
}
});
});

View file

@ -27,7 +27,6 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
},
afterModel: function (model) {
let params = this.paramsFor('folders.folder');
if (is.empty(params)) {

View file

@ -1,23 +1,28 @@
// 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
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
import Ember from 'ember';
import models from '../../../utils/model';
import NotifierMixin from '../../../mixins/notifier';
const {
inject: { service }
} = Ember;
export default Ember.Route.extend(NotifierMixin, {
folderService: Ember.inject.service('folder'),
userService: Ember.inject.service('user'),
folderService: service('folder'),
userService: service('user'),
folder: {},
tab: "",
localStorage: service(),
store: service(),
beforeModel: function (transition) {
this.tab = is.not.undefined(transition.queryParams.tab) ? transition.queryParams.tab : "tabGeneral";
@ -28,7 +33,6 @@ export default Ember.Route.extend(NotifierMixin, {
},
setupController(controller, model) {
var self = this;
this.folder = model;
controller.set('model', model);
@ -38,54 +42,63 @@ export default Ember.Route.extend(NotifierMixin, {
controller.set('tabDelete', false);
controller.set(this.get('tab'), true);
this.get('folderService').getAll().then(function (folders) {
this.get('folderService').getAll().then((folders) => {
controller.set('folders', folders.rejectBy('id', model.get('id')));
});
this.get('userService').getAll().then(function (users) {
this.get('userService').getAll().then((users) => {
controller.set('users', users);
var folderPermissions = [];
var u = models.FolderPermissionModel.create({
users.forEach((user) => {
let isActive = user.get('active');
let u = {
userId: user.get('id'),
fullname: user.get('fullname'),
orgId: model.get('orgId'),
folderId: model.get('id'),
canEdit: false,
canView: false,
canViewPrevious: false
};
if (isActive) {
folderPermissions.pushObject(u);
}
});
var u = {
userId: "",
fullname: " Everyone",
orgId: model.get('orgId'),
folderId: model.get('id'),
canEdit: false,
canView: false
});
};
folderPermissions.pushObject(u);
users.forEach(function (user, index) /* jshint ignore:line */ {
if (user.get('active')) {
var u = models.FolderPermissionModel.create({
userId: user.get('id'),
fullname: user.get('fullname'),
orgId: model.get('orgId'),
folderId: model.get('id'),
canEdit: false,
canView: false,
canViewPrevious: false
});
folderPermissions.pushObject(u);
}
});
self.get('folderService').getPermissions(model.id).then(function (permissions) {
permissions.forEach(function (permission, index) /* jshint ignore:line */ {
var folderPermission = folderPermissions.findBy('userId', permission.userId);
this.get('folderService').getPermissions(model.id).then((permissions) => {
permissions.forEach((permission, index) => { /* jshint ignore:line */
var folderPermission = folderPermissions.findBy('userId', permission.get('userId'));
if (is.not.undefined(folderPermission)) {
Ember.set(folderPermission, 'orgId', permission.orgId);
Ember.set(folderPermission, 'folderId', permission.folderId);
Ember.set(folderPermission, 'canEdit', permission.canEdit);
Ember.set(folderPermission, 'canView', permission.canView);
Ember.set(folderPermission, 'canViewPrevious', permission.canView);
Ember.setProperties(folderPermission, {
orgId: permission.get('orgId'),
folderId: permission.get('folderId'),
canEdit: permission.get('canEdit'),
canView: permission.get('canView'),
canViewPrevious: permission.get('canView')
});
}
});
folderPermissions.map((permission) => {
let data = this.get('store').normalize('folder-permission', permission);
return this.get('store').push(data);
});
controller.set('permissions', folderPermissions.sortBy('fullname'));
});
});
@ -100,36 +113,41 @@ export default Ember.Route.extend(NotifierMixin, {
},
onRemove(moveId) {
let self = this;
this.get('folderService').remove(this.folder.get('id'), moveId).then(function () { /* jshint ignore:line */
self.showNotification("Deleted");
self.session.clearSessionItem('folder');
this.get('folderService').remove(this.folder.get('id'), moveId).then(() => { /* jshint ignore:line */
this.showNotification("Deleted");
this.get('localStorage').clearSessionItem('folder');
self.get('folderService').getFolder(moveId).then(function (folder) {
self.get('folderService').setCurrentFolder(folder);
self.transitionTo('folders.folder', folder.get('id'), folder.get('slug'));
this.get('folderService').getFolder(moveId).then((folder) => {
this.get('folderService').setCurrentFolder(folder);
this.transitionTo('folders.folder', folder.get('id'), folder.get('slug'));
});
});
},
onShare: function (invitation) {
let self = this;
this.get('folderService').share(this.folder.get('id'), invitation).then(function () {
self.showNotification("Shared");
this.get('folderService').share(this.folder.get('id'), invitation).then(() => {
this.showNotification("Shared");
});
},
onPermission: function (folder, message, permissions) {
var self = this;
var data = permissions.map(function (obj) {
return obj.getProperties('orgId', 'folderId', 'userId', 'canEdit', 'canView');
var data = permissions.map((obj) => {
let permission = {
'orgId': obj.orgId,
'folderId': obj.folderId,
'userId': obj.userId,
'canEdit': obj.canEdit,
'canView': obj.canView
};
return permission;
});
var payload = { Message: message, Roles: data };
this.get('folderService').savePermissions(folder.get('id'), payload).then(function () {
self.showNotification("Saved");
this.get('folderService').savePermissions(folder.get('id'), payload).then(() => {
this.showNotification("Saved");
});
var hasEveryone = _.find(data, function (permission) {

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.
//
// This software (Documize Community Edition) is licensed under
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
// by contacting <sales@documize.com>.
//
// https://documize.com
@ -14,6 +14,7 @@ import AjaxService from 'ember-ajax/services/ajax';
import config from '../config/environment';
const {
computed,
inject: { service }
} = Ember;
@ -22,7 +23,7 @@ export default AjaxService.extend({
host: config.apiHost,
namespace: config.apiNamespace,
headers: Ember.computed('session.session.content.authenticated.token', {
headers: computed('session.session.content.authenticated.token', {
get() {
let headers = {};
const token = this.get('session.session.content.authenticated.token');
@ -33,4 +34,4 @@ export default AjaxService.extend({
return headers;
}
})
});
});

View file

@ -13,9 +13,13 @@ import Ember from 'ember';
import netUtil from '../utils/net';
import config from '../config/environment';
const {
inject: { service }
} = Ember;
export default Ember.Service.extend({
session: Ember.inject.service('session'),
appMeta: Ember.inject.service(),
session: service('session'),
appMeta: service(),
ready: false,
enabled: config.APP.auditEnabled,
appId: config.APP.intercomKey,

View file

@ -10,18 +10,23 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
const {
inject: { service }
} = Ember;
export default Ember.Service.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
store: service(),
// Returns document model for specified document id.
getDocument(documentId) {
return this.get('ajax').request(`documents/${documentId}`, {
method: "GET"
}).then((response) => {
return models.DocumentModel.create(response);
let data = this.get('store').normalize('document', response);
return this.get('store').push(data);
});
},
@ -34,9 +39,13 @@ export default Ember.Service.extend({
content: Ember.A([])
});
_.each(response, function (doc) {
let documentModel = models.DocumentModel.create(doc);
documents.pushObject(documentModel);
if (isObject(response)) {
return documents;
}
documents = response.map((doc) => {
let data = this.get('store').normalize('document', doc);
return this.get('store').push(data);
});
return documents;
@ -52,9 +61,9 @@ export default Ember.Service.extend({
content: Ember.A([])
});
_.each(response, function (doc) {
let documentModel = models.DocumentModel.create(doc);
documents.pushObject(documentModel);
documents = response.map((doc) => {
let data = this.get('store').normalize('document', doc);
return this.get('store').push(data);
});
return documents;
@ -115,6 +124,7 @@ export default Ember.Service.extend({
updatePage: function (documentId, pageId, payload, skipRevision) {
var revision = skipRevision ? "?r=true" : "?r=false";
let url = `documents/${documentId}/pages/${pageId}${revision}`;
Ember.set(payload.meta, 'id', parseInt(payload.meta.id));
return this.get('ajax').request(url, {
method: 'PUT',
@ -192,8 +202,9 @@ export default Ember.Service.extend({
method: 'GET'
}).then((response) => {
let data = [];
_.each(response, function (obj) {
data.pushObject(models.PageModel.create(obj));
data = response.map((obj) => {
let data = this.get('store').normalize('page', obj);
return this.get('store').push(data);
});
return data;
@ -208,8 +219,9 @@ export default Ember.Service.extend({
}).then((response) => {
let pages = [];
_.each(response, function (page) {
pages.pushObject(models.PageModel.create(page));
pages = response.map((page) => {
let data = this.get('store').normalize('page', page);
return this.get('store').push(data);
});
return pages;
@ -222,8 +234,8 @@ export default Ember.Service.extend({
return this.get('ajax').request(`documents/${documentId}/pages/${pageId}`, {
method: 'GET'
}).then((response) => {
let page = models.PageModel.create(response);
return page;
let data = this.get('store').normalize('page', response);
return this.get('store').push(data);
});
},
@ -233,8 +245,8 @@ export default Ember.Service.extend({
return this.get('ajax').request(`documents/${documentId}/pages/${pageId}/meta`, {
method: 'GET'
}).then((response) => {
let meta = models.PageMetaModel.create(response);
return meta;
let data = this.get('store').normalize('page-meta', response);
return this.get('store').push(data);
});
},
@ -245,9 +257,16 @@ export default Ember.Service.extend({
method: 'GET'
}).then((response) => {
let data = [];
_.each(response, function (obj) {
data.pushObject(models.AttachmentModel.create(obj));
if (isObject(response)) {
return data;
}
data = response.map((obj) => {
let data = this.get('store').normalize('attachment', obj);
return this.get('store').push(data);
});
return data;
});
},
@ -260,3 +279,7 @@ export default Ember.Service.extend({
});
},
});
function isObject(a) {
return (!!a) && (a.constructor === Object);
}

View file

@ -10,17 +10,19 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
import BaseService from '../services/base';
const {
get
get,
RSVP,
inject: { service }
} = Ember;
export default BaseService.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
localStorage: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
localStorage: service(),
store: service(),
// selected folder
currentFolder: null,
@ -28,38 +30,35 @@ export default BaseService.extend({
// Add a new folder.
add(folder) {
return this.get('ajax').post(`folders`, {
contentType: 'json',
data: JSON.stringify(folder)
}).then((folder) => {
let folderModel = models.FolderModel.create(folder);
return folderModel;
let data = this.get('store').normalize('folder', folder);
return this.get('store').push(data);
});
},
// Returns folder model for specified folder id.
getFolder(id) {
return this.get('ajax').request(`folders/${id}`, {
method: 'GET'
}).then((response) => {
let folder = models.FolderModel.create(response);
return folder;
}).then((folder) => {
let data = this.get('store').normalize('folder', folder);
return this.get('store').push(data);
});
},
// Returns all folders that user can see.
getAll() {
let self = this;
let folders = this.get('folders');
if (this.get('folders') != null) {
return new Ember.RSVP.Promise(function (resolve) {
resolve(self.get('folders'));
});
} else {
return this.reload();
if (folders != null) {
return new RSVP.resolve(folders);
}
return this.reload();
},
// Updates an existing folder record.
@ -73,7 +72,7 @@ export default BaseService.extend({
});
},
remove: function (folderId, moveToId) {
remove(folderId, moveToId) {
let url = `folders/${folderId}/move/${moveToId}`;
return this.get('ajax').request(url, {
@ -81,7 +80,7 @@ export default BaseService.extend({
});
},
onboard: function (folderId, payload) {
onboard(folderId, payload) {
let url = `public/share/${folderId}`;
return this.get('ajax').post(url, {
@ -91,13 +90,15 @@ export default BaseService.extend({
},
// getProtectedFolderInfo returns non-private folders and who has access to them.
getProtectedFolderInfo: function () {
getProtectedFolderInfo() {
return this.get('ajax').request(`folders?filter=viewers`, {
method: "GET"
}).then((response) => {
let data = [];
_.each(response, function (obj) {
data.pushObject(models.ProtectedFolderParticipant.create(obj));
data = response.map((obj) => {
let data = this.get('store').normalize('protected-folder-participant', obj);
return this.get('store').push(data);
});
return data;
@ -111,8 +112,10 @@ export default BaseService.extend({
method: "GET"
}).then((response) => {
let data = [];
_.each(response, function (obj) {
data.pushObject(models.FolderModel.create(obj));
data = response.map((obj) => {
let data = this.get('store').normalize('folder', obj);
return this.get('store').push(data);
});
return data;
@ -126,8 +129,10 @@ export default BaseService.extend({
method: "GET"
}).then((response) => {
let data = [];
_.each(response, function (obj) {
data.pushObject(models.FolderPermissionModel.create(obj));
data = response.map((obj) => {
let data = this.get('store').normalize('folder-permission', obj);
return this.get('store').push(data);
});
return data;
@ -136,7 +141,6 @@ export default BaseService.extend({
// persist folder permissions
savePermissions(folderId, payload) {
return this.get('ajax').request(`folders/${folderId}/permissions`, {
method: 'PUT',
contentType: 'json',
@ -181,7 +185,7 @@ export default BaseService.extend({
let result = [];
let folderId = folder.get('id');
folderPermissions.forEach(function (item) {
folderPermissions.forEach((item) => {
if (item.folderId === folderId) {
result.push(item);
}
@ -189,7 +193,7 @@ export default BaseService.extend({
let canEdit = false;
result.forEach(function (permission) {
result.forEach((permission) => {
if (permission.userId === userId) {
canEdit = permission.canEdit;
}
@ -203,4 +207,4 @@ export default BaseService.extend({
});
});
},
});
});

View file

@ -10,35 +10,39 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
const {
inject: { service }
} = Ember;
export default Ember.Service.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
appMeta: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
appMeta: service(),
store: service(),
// Returns attributes for specified org id.
getOrg(id) {
return this.get('ajax').request(`organizations/${id}`, {
method: 'GET'
}).then((response) =>{
let org = models.OrganizationModel.create(response);
return org;
});
},
// Returns attributes for specified org id.
getOrg(id) {
return this.get('ajax').request(`organizations/${id}`, {
method: 'GET'
}).then((response) => {
let data = this.get('store').normalize('organization', response);
return this.get('store').push(data);
});
},
// Updates an existing organization record.
save(org) {
let id = org.get('id');
// Updates an existing organization record.
save(org) {
let id = org.id;
this.get('appMeta').setProperties({
message: org.message,
title: org.title
});
this.get('appMeta').setProperties({
message: org.get('message'),
title: org.get('title')
});
return this.get('ajax').request(`organizations/${id}`, {
method: 'PUT',
data: JSON.stringify(org)
});
}
return this.get('ajax').request(`organizations/${id}`, {
method: 'PUT',
data: JSON.stringify(org)
});
}
});

View file

@ -11,16 +11,20 @@
import Ember from 'ember';
const {
inject: { service }
} = Ember;
export default Ember.Service.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
// getUsers returns all users for organization.
find(keywords) {
let url = "search?keywords=" + encodeURIComponent(keywords);
// getUsers returns all users for organization.
find(keywords) {
let url = "search?keywords=" + encodeURIComponent(keywords);
return this.get('ajax').request(url, {
method: "GET"
});
},
return this.get('ajax').request(url, {
method: "GET"
});
},
});

View file

@ -10,56 +10,63 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
import BaseService from '../services/base';
const {
inject: { service }
} = Ember;
export default BaseService.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
store: service(),
// Returns all available sections.
getAll() {
return this.get('ajax').request(`sections`,{
method: 'GET'
}).then((response)=>{
let data = [];
_.each(response, function(obj) {
data.pushObject(models.SectionModel.create(obj));
});
// Returns all available sections.
getAll() {
return this.get('ajax').request(`sections`, {
method: 'GET'
}).then((response) => {
let data = [];
return data;
});
},
data = response.map((obj) => {
let data = this.get('store').normalize('section', obj);
return this.get('store').push(data);
});
// Requests data from the specified section handler, passing the method and document ID
// and POST payload.
fetch(page, method, data) {
let documentId = page.get('documentId');
let section = page.get('contentType');
let url = `sections?documentID=${documentId}&section=${section}&method=${method}`;
return data;
});
},
return this.get('ajax').post(url, {
data: JSON.stringify(data),
contentType: "application/json"
});
},
// Requests data from the specified section handler, passing the method and document ID
// and POST payload.
fetch(page, method, data) {
let documentId = page.get('documentId');
let section = page.get('contentType');
let url = `sections?documentID=${documentId}&section=${section}&method=${method}`;
// Did any dynamic sections change? Fetch and send up for rendering?
refresh(documentId) {
let url = `sections/refresh?documentID=${documentId}`;
return this.get('ajax').post(url, {
data: JSON.stringify(data),
contentType: "application/json"
});
},
return this.get('ajax').request(url, {
method: 'GET'
}).then((response)=>{
let pages = [];
// Did any dynamic sections change? Fetch and send up for rendering?
refresh(documentId) {
let url = `sections/refresh?documentID=${documentId}`;
if (is.not.null(response) && is.array(response) && response.length > 0) {
_.each(response, function(page) {
pages.pushObject(models.PageModel.create(page));
});
}
return this.get('ajax').request(url, {
method: 'GET'
}).then((response) => {
let pages = [];
return pages;
});
}
if (is.not.null(response) && is.array(response) && response.length > 0) {
pages = response.map((page) => {
let data = this.get('store').normalize('page', page);
return this.get('store').push(data);
});
}
return pages;
});
}
});

View file

@ -10,24 +10,31 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
import SimpleAuthSession from 'ember-simple-auth/services/session';
const {
inject: { service },
computed: { oneWay, or, notEmpty },
computed
} = Ember;
export default SimpleAuthSession.extend({
ajax: service(),
appMeta: service(),
store: service(),
isMac: false,
isMobile: false,
authenticated: notEmpty('user.id'),
isAdmin: oneWay('user.admin'),
isEditor: or('user.admin', 'user.editor'),
authenticated: computed('user.id', function () {
return this.get('user.id') !== '0';
}),
isAdmin: computed('user', function () {
let data = this.get('user');
return data.get('admin');
}),
isEditor: computed('user', function () {
let data = this.get('user');
return data.get('editor');
}),
init: function () {
this.set('isMac', is.mac());
@ -37,10 +44,11 @@ export default SimpleAuthSession.extend({
user: computed('isAuthenticated', 'session.content.authenticated.user', function () {
if (this.get('isAuthenticated')) {
let user = this.get('session.content.authenticated.user') || { id: '' };
return models.UserModel.create(user);
let data = this.get('store').normalize('user', user);
return this.get('store').push(data);
}
}),
folderPermissions: null,
currentFolder: null
});
});

View file

@ -10,54 +10,58 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
const {
inject: { service }
} = Ember;
export default Ember.Service.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
store: service(),
importStockTemplate: function(folderId, templateId) {
let url = `templates/${templateId}/folder/${folderId}?type=stock`;
importStockTemplate: function (folderId, templateId) {
let url = `templates/${templateId}/folder/${folderId}?type=stock`;
return this.get('ajax').request(url, {
method: "POST"
});
},
return this.get('ajax').request(url, {
method: "POST"
});
},
importSavedTemplate: function(folderId, templateId) {
let url = `templates/${templateId}/folder/${folderId}?type=saved`;
importSavedTemplate: function (folderId, templateId) {
let url = `templates/${templateId}/folder/${folderId}?type=saved`;
return this.get('ajax').post(url).then((doc)=>{
let docModel = models.DocumentModel.create(doc);
return docModel;
});
},
return this.get('ajax').post(url).then((doc) => {
let data = this.get('store').normalize('document', doc);
return this.get('store').push(data);
});
},
getSavedTemplates() {
return this.get('ajax').request(`templates`, {
method: 'GET'
}).then((response) => {
if (is.not.array(response)) {
response = [];
}
let templates = Ember.ArrayProxy.create({
content: Ember.A([])
});
getSavedTemplates() {
return this.get('ajax').request(`templates`, {
method: 'GET'
}).then((response) => {
if (is.not.array(response)) {
response = [];
}
let templates = Ember.ArrayProxy.create({
content: Ember.A([])
});
_.each(response, function(template) {
let templateModel = models.TemplateModel.create(template);
templates.pushObject(templateModel);
});
templates = response.map((template) => {
let data = this.get('store').normalize('template', template);
return this.get('store').push(data);
});
return templates;
});
},
return templates;
});
},
getStockTemplates() {
return this.get('ajax').request(`templates/stock`, {
method: 'GET'
});
},
getStockTemplates() {
return this.get('ajax').request(`templates/stock`, {
method: 'GET'
});
},
saveAsTemplate(documentId, name, excerpt) {
let payload = {
@ -66,10 +70,9 @@ export default Ember.Service.extend({
Excerpt: excerpt
};
return this.get('ajax').request(`templates`, {
method: 'POST',
data: JSON.stringify(payload)
}).then(() => {
});
return this.get('ajax').request(`templates`, {
method: 'POST',
data: JSON.stringify(payload)
}).then(() => {});
}
});

View file

@ -10,21 +10,27 @@
// https://documize.com
import Ember from 'ember';
import models from '../utils/model';
const {
isEmpty,
RSVP,
inject: { service }
} = Ember;
export default Ember.Service.extend({
sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
sessionService: service('session'),
ajax: service(),
store: service(),
// Adds a new user.
add(user) {
return this.get('ajax').request(`users`, {
type: 'POST',
data: JSON.stringify(user),
contentType: 'json'
}).then(function (response) {
return models.UserModel.create(response);
}).then((response) => {
let data = this.get('store').normalize('user', response);
return this.get('store').push(data);
});
},
@ -35,15 +41,17 @@ export default Ember.Service.extend({
return this.get('ajax').request(url, {
type: 'GET'
}).then((response) => {
return models.UserModel.create(response);
let data = this.get('store').normalize('user', response);
return this.get('store').push(data);
});
},
// Returns all users for organization.
getAll() {
return this.get('ajax').request(`users`).then((response) => {
return response.map(function (obj) {
return models.UserModel.create(obj);
return response.map((obj) => {
let data = this.get('store').normalize('user', obj);
return this.get('store').push(data);
});
});
},
@ -56,8 +64,10 @@ export default Ember.Service.extend({
method: "GET"
}).then((response) => {
let data = [];
_.each(response, function (obj) {
data.pushObject(models.UserModel.create(obj));
data = response.map((obj) => {
let data = this.get('store').normalize('user', obj);
return this.get('store').push(data);
});
return data;
@ -66,7 +76,7 @@ export default Ember.Service.extend({
// Updates an existing user record.
save(user) {
let userId = user.get('id');
let userId = user.id;
let url = `users/${userId}`;
return this.get('ajax').request(url, {
@ -91,6 +101,9 @@ export default Ember.Service.extend({
return this.get('ajax').request(url, {
method: 'DELETE'
}).then(() => {
let user = this.get('store').peekRecord('user', `${userId}`);
return user.deleteRecord();
});
},
@ -98,8 +111,8 @@ export default Ember.Service.extend({
forgotPassword(email) {
let url = `public/forgot`;
if (is.empty(email)) {
return Ember.RSVP.reject("invalid");
if (isEmpty(email)) {
return RSVP.reject("invalid");
}
let data = JSON.stringify({
@ -117,8 +130,8 @@ export default Ember.Service.extend({
resetPassword(token, password) {
var url = `public/reset/${token}`;
if (is.empty(token) || is.empty(password)) {
return Ember.RSVP.reject("invalid");
if (isEmpty(token) || isEmpty(password)) {
return RSVP.reject("invalid");
}
return this.get('ajax').request(url, {

View file

@ -50,7 +50,7 @@
<li class="item">
{{#link-to 'profile'}}Profile{{/link-to}}
</li>
{{#if session.isAdmin}}
{{#if session.session.content.authenticated.user.admin}}
<li class="item">
{{#link-to 'customize.general'}}Settings{{/link-to}}
</li>

View file

@ -12,17 +12,17 @@
function getState(toc, page) {
let state = {
tocTools: {
upTarget: "",
downTarget: "",
upTarget: "",
downTarget: "",
indentIncrement: 0,
allowIndent: false,
allowOutdent: false
},
actionablePage: false,
upDisabled: true,
downDisabled: true,
indentDisabled: true,
outdentDisabled: true,
allowIndent: false,
allowOutdent: false
},
actionablePage: false,
upDisabled: true,
downDisabled: true,
indentDisabled: true,
outdentDisabled: true,
};
if (is.undefined(page)) {
@ -55,19 +55,19 @@ function getState(toc, page) {
if (index2 !== -1) {
// up
for (var i = index2; i >= 0; i--) {
if (page.level > toc[i].level) {
if (page.get('level') > toc[i].get('level')) {
break;
}
if (page.level === toc[i].level) {
if (page.get('level') === toc[i].get('level')) {
state.tocTools.upTarget = toc[i].id;
break;
}
}
// indent?
state.tocTools.allowIndent = upPage.level >= page.level;
state.tocTools.indentIncrement = upPage.level - page.level;
state.tocTools.allowIndent = upPage.get('level') >= page.get('level');
state.tocTools.indentIncrement = upPage.get('level') - page.get('level');
if (state.tocTools.indentIncrement === 0) {
state.tocTools.indentIncrement = 1;
@ -94,28 +94,28 @@ function getState(toc, page) {
if (index3 !== -1) {
for (var i3 = index3; i3 < toc.length; i3++) {
if (toc[i3].level < page.level) {
if (toc[i3].get('level') < page.get('level')) {
break;
}
if (page.level === toc[i3].level) {
if (page.get('level') === toc[i3].get('level')) {
state.tocTools.downTarget = toc[i3].id;
break;
}
}
}
if (page.level > downPage.level) {
if (page.get('level') > downPage.get('level')) {
state.tocTools.downTarget = '';
}
}
// can we outdent?
state.tocTools.allowOutdent = page.level > 1;
state.tocTools.allowOutdent = page.get('level') > 1;
state.upDisabled = state.tocTools.upTarget === '';
state.downDisabled = state.tocTools.downTarget === '';
state.indentDisabled = !state.tocTools.allowIndent;
state.indentDisabled = !state.tocTools.allowIndent;
state.outdentDisabled = !state.tocTools.allowOutdent;
state.actionablePage = is.not.empty(state.tocTools.upTarget) ||
@ -141,8 +141,8 @@ function moveUp(state, pages, current) {
page2 = pages[index1 - 1];
}
var sequence1 = page1.sequence;
var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.sequence : 0;
var sequence1 = page1.get('sequence');
var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.get('sequence') : 0;
var index = _.indexOf(pages, current, false);
if (index !== -1) {
@ -154,11 +154,11 @@ function moveUp(state, pages, current) {
});
for (var i = index + 1; i < pages.length; i++) {
if (pages[i].level <= current.level) {
if (pages[i].get('level') <= current.get('level')) {
break;
}
sequence = (sequence + page1.sequence) / 2;
sequence = (sequence + page1.get('sequence')) / 2;
pendingChanges.push({
pageId: pages[i].id,
@ -184,28 +184,28 @@ function moveDown(state, pages, current) {
var startingSequence = 0;
var upperSequence = 0;
var cutOff = _.rest(pages, downTargetIndex);
var siblings = _.reject(cutOff, function(p) {
return p.level !== current.level || p.id === current.id || p.id === downTarget.id;
var siblings = _.reject(cutOff, function (p) {
return p.get('level') !== current.get('level') || p.id === current.id || p.id === downTarget.id;
});
if (siblings.length > 0) {
var aboveThisGuy = siblings[0];
var belowThisGuy = pages[_.indexOf(pages, aboveThisGuy, false) - 1];
if (is.not.null(belowThisGuy) && belowThisGuy.level > current.level) {
startingSequence = (aboveThisGuy.sequence + belowThisGuy.sequence) / 2;
upperSequence = aboveThisGuy.sequence;
if (is.not.null(belowThisGuy) && belowThisGuy.get('level') > current.get('level')) {
startingSequence = (aboveThisGuy.get('sequence') + belowThisGuy.get('sequence')) / 2;
upperSequence = aboveThisGuy.get('sequence');
} else {
var otherGuy = pages[downTargetIndex + 1];
startingSequence = (otherGuy.sequence + downTarget.sequence) / 2;
upperSequence = otherGuy.sequence;
startingSequence = (otherGuy.get('sequence') + downTarget.get('sequence')) / 2;
upperSequence = otherGuy.get('sequence');
}
} else {
// startingSequence = downTarget.sequence * 2;
startingSequence = cutOff[cutOff.length-1].sequence * 2;
startingSequence = cutOff[cutOff.length - 1].sequence * 2;
upperSequence = startingSequence * 2;
}
}
pendingChanges.push({
pageId: current.id,
@ -215,7 +215,7 @@ function moveDown(state, pages, current) {
var sequence = (startingSequence + upperSequence) / 2;
for (var i = pageIndex + 1; i < pages.length; i++) {
if (pages[i].level <= current.level) {
if (pages[i].get('level') <= current.get('level')) {
break;
}
@ -237,17 +237,17 @@ function indent(state, pages, current) {
pendingChanges.push({
pageId: current.id,
level: current.level + state.tocTools.indentIncrement
level: current.get('level') + state.tocTools.indentIncrement
});
for (var i = pageIndex + 1; i < pages.length; i++) {
if (pages[i].level <= current.level) {
if (pages[i].get('level') <= current.get('level')) {
break;
}
pendingChanges.push({
pageId: pages[i].id,
level: pages[i].level + state.tocTools.indentIncrement
level: pages[i].get('level') + state.tocTools.indentIncrement
});
}
@ -260,17 +260,17 @@ function outdent(state, pages, current) {
pendingChanges.push({
pageId: current.id,
level: current.level - 1
level: current.get('level') - 1
});
for (var i = pageIndex + 1; i < pages.length; i++) {
if (pages[i].level <= current.level) {
if (pages[i].get('level') <= current.get('level')) {
break;
}
pendingChanges.push({
pageId: pages[i].id,
level: pages[i].level - 1
level: pages[i].get('level') - 1
});
}

View file

@ -26,7 +26,7 @@ type ProdInfo struct {
// Product returns product edition details
func Product() (p ProdInfo) {
p.Major = "0"
p.Minor = "19"
p.Minor = "20"
p.Patch = "0"
p.Version = fmt.Sprintf("%s.%s.%s", p.Major, p.Minor, p.Patch)
p.Edition = "Community"