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

initial commit

This commit is contained in:
Harvey Kandola 2016-07-07 18:54:16 -07:00
commit 18933c6767
1841 changed files with 810642 additions and 0 deletions

4
app/.bowerrc Normal file
View file

@ -0,0 +1,4 @@
{
"directory": "bower_components",
"analytics": false
}

3
app/.ember-cli Normal file
View file

@ -0,0 +1,3 @@
{
"disableAnalytics": true
}

17
app/.gitignore vendored Normal file
View file

@ -0,0 +1,17 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/dist
/tmp
# dependencies
/node_modules
/bower_components
# misc
/.sass-cache
/connect.lock
/coverage/*
/libpeerconnection.log
npm-debug.log
testem.log

6
app/.jshintignore Normal file
View file

@ -0,0 +1,6 @@
public/tinymce/**
public/tinymce/
public/tinymce
public/codemirror/**
public/codemirror/
public/codemirror

48
app/.jshintrc Normal file
View file

@ -0,0 +1,48 @@
{
"predef": [
"server",
"document",
"window",
"-Promise",
"moment",
"$",
"_",
"is",
"Mousetrap",
"CodeMirror",
"Intercom",
"Materialize",
"tinymce",
"Tether",
"Tooltip",
"Drop",
"Dropzone",
"dragula",
"datetimepicker"
],
"browser": true,
"boss": true,
"curly": true,
"debug": false,
"devel": true,
"eqeqeq": true,
"evil": true,
"forin": false,
"immed": false,
"laxbreak": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": false,
"nomen": false,
"onevar": false,
"plusplus": false,
"regexp": false,
"undef": true,
"sub": true,
"strict": false,
"white": false,
"eqnull": true,
"esnext": true,
"unused": true
}

23
app/.travis.yml Normal file
View file

@ -0,0 +1,23 @@
---
language: node_js
node_js:
- "0.12"
sudo: false
cache:
directories:
- node_modules
before_install:
- export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH
- "npm config set spin false"
- "npm install -g npm@^2"
install:
- npm install -g bower
- npm install
- bower install
script:
- npm test

3
app/.watchmanconfig Normal file
View file

@ -0,0 +1,3 @@
{
"ignore_dirs": ["tmp", "dist", "dist-prod"]
}

53
app/README.md Normal file
View file

@ -0,0 +1,53 @@
# Documize
This README outlines the details of collaborating on this Ember application.
A short introduction of this app could easily go here.
## Prerequisites
You will need the following things properly installed on your computer.
* [Git](http://git-scm.com/)
* [Node.js](http://nodejs.org/) (with NPM)
* [Bower](http://bower.io/)
* [Ember CLI](http://ember-cli.com/)
* [PhantomJS](http://phantomjs.org/)
## Installation
* `git clone <repository-url>` this repository
* change into the new directory
* `npm install`
* `bower install`
## Running / Development
* `ember server`
* Visit your app at [http://localhost:4200](http://localhost:4200).
### Code Generators
Make use of the many generators for code, try `ember help generate` for more details
### Running Tests
* `ember test`
* `ember test --server`
### Building
* `ember build` (development)
* `ember build --environment production` (production)
### Deploying
Specify what it takes to deploy your app.
## Further Reading / Useful Links
* [ember.js](http://emberjs.com/)
* [ember-cli](http://ember-cli.com/)
* Development Browser Extensions
* [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
* [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/)

View file

34
app/app/app.js Normal file
View file

@ -0,0 +1,34 @@
// 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 Ember from 'ember';
import Resolver from './resolver';
import loadInitializers from 'ember-load-initializers';
import config from './config/environment';
let App;
Ember.MODEL_FACTORY_INJECTIONS = true;
// Ember.RSVP.on('error', function(error) {
// console.log("App:");
// console.log(error);
// });
App = Ember.Application.extend({
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver
});
loadInitializers(App, config.modulePrefix);
export default App;

View file

@ -0,0 +1,26 @@
// 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 Ember from 'ember';
import Base from 'ember-simple-auth/authenticators/base';
const {
RSVP: { resolve }
} = Ember;
export default Base.extend({
restore(data) {
return resolve(data);
},
authenticate(data) {
return resolve(data);
}
});

View file

@ -0,0 +1,69 @@
// 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 Ember from 'ember';
import Base from 'ember-simple-auth/authenticators/base';
import encodingUtil from '../utils/encoding';
import netUtil from '../utils/net';
const {
isPresent,
RSVP: { resolve, reject },
inject: { service }
} = Ember;
export default Base.extend({
ajax: service(),
appMeta: service(),
restore(data) {
// TODO: verify authentication data
if (data) {
return resolve(data);
}
return reject();
},
authenticate(credentials) {
let domain = netUtil.getSubdomain();
let encoded;
if (typeof credentials === 'object') {
let { password, email } = credentials;
if (!isPresent(password) || !isPresent(email)) {
return Ember.RSVP.reject("invalid");
}
encoded = encodingUtil.Base64.encode(`${domain}:${email}:${password}`);
} else if (typeof credentials === 'string') {
encoded = credentials;
} else {
return Ember.RSVP.reject("invalid");
}
var headers = {
'Authorization': 'Basic ' + encoded
};
return this.get('ajax').post('public/authenticate', {
headers
});
},
invalidate() {
return resolve();
}
});

View file

@ -0,0 +1,28 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
didReceiveAttrs() {
this.set('editorType', 'section/' + this.get('page.contentType') + '/type-editor');
},
actions: {
onCancel() {
this.attrs.onCancel();
},
onAction(page, meta) {
this.attrs.onAction(page, meta);
}
}
});

View file

@ -0,0 +1,64 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
document: {},
meta: [],
pages: [],
didReceiveAttrs() {
let editors = this.get('meta.editors');
let toc = this.get('pages');
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");
let page = _.findWhere(toc, {
id: item.pageId
});
let title = "";
if (is.not.undefined(page)) {
title = page.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.added) {
Ember.set(item, 'changeLabel', "added section (since removed)");
}
if (item.changed) {
Ember.set(item, 'changeLabel', "changed section (since removed)");
}
if (item.deleted) {
Ember.set(item, 'changeLabel', "removed section");
}
}
});
}
});

View file

@ -0,0 +1,176 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
import TooltipMixin from '../../mixins/tooltip';
import tocUtil from '../../utils/toc';
export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
document: {},
folder: {},
pages: [],
page: "",
state: {
actionablePage: false,
upDisabled: true,
downDisabled: true,
indentDisabled: true,
outdentDisabled: true
},
didReceiveAttrs: function() {
this.set('showToc', is.not.undefined(this.get('pages')) && this.get('pages').get('length') > 2);
if (is.not.null(this.get('page'))) {
this.send('onEntryClick', this.get('page'));
}
},
didRender: function() {
if (this.session.authenticated) {
this.addTooltip(document.getElementById("toc-up-button"));
this.addTooltip(document.getElementById("toc-down-button"));
this.addTooltip(document.getElementById("toc-outdent-button"));
this.addTooltip(document.getElementById("toc-indent-button"));
}
},
didInsertElement() {
this.eventBus.subscribe('documentPageAdded', this, 'onDocumentPageAdded');
var s = $(".document-structure");
var pos = s.position();
$(window).scroll(function() {
var windowpos = $(window).scrollTop();
if (windowpos - 200 >= pos.top) {
s.addClass("stick");
s.css('width', s.parent().width());
} else {
s.removeClass("stick");
s.css('width', 'auto');
}
});
},
willDestroyElement() {
this.eventBus.unsubscribe('documentPageAdded');
this.destroyTooltips();
},
onDocumentPageAdded(pageId) {
this.send('onEntryClick', pageId);
},
// Controls what user can do with the toc (left sidebar).
// Identifies the target pages.
setState(pageId) {
this.set('page', pageId);
let toc = this.get('pages');
let page = _.findWhere(toc, { id: pageId });
let state = tocUtil.getState(toc, page);
if (!this.get('isEditor') || is.empty(pageId)) {
state.actionablePage = state.upDisabled = state.downDisabled = state.indentDisabled = state.outdentDisabled = false;
}
this.set('state', state);
},
actions: {
// Page up - above pages shunt down.
pageUp() {
if (this.get('state.upDisabled')) {
return;
}
let state = this.get('state');
let pages = this.get('pages');
let page = _.findWhere(pages, { id: this.get('page') });
let pendingChanges = tocUtil.moveUp(state, pages, page);
if (pendingChanges.length > 0) {
this.attrs.changePageSequence(pendingChanges);
this.send('onEntryClick', this.get('page'));
this.audit.record("moved-page-up");
this.showNotification("Moved up");
}
},
// Move down -- pages below shift up.
pageDown() {
if (this.get('state.downDisabled')) {
return;
}
let state = this.get('state');
var pages = this.get('pages');
var page = _.findWhere(pages, { id: this.get('page') });
let pendingChanges = tocUtil.moveDown(state, pages, page);
if (pendingChanges.length > 0) {
this.attrs.changePageSequence(pendingChanges);
this.send('onEntryClick', this.get('page'));
this.audit.record("moved-page-down");
this.showNotification("Moved down");
}
},
// Indent - changes a page from H2 to H3, etc.
pageIndent() {
if (this.get('state.indentDisabled')) {
return;
}
let state = this.get('state');
var pages = this.get('pages');
var page = _.findWhere(pages, { id: this.get('page') });
let pendingChanges = tocUtil.indent(state, pages, page);
if (pendingChanges.length > 0) {
this.attrs.changePageLevel(pendingChanges);
this.showNotification("Indent");
this.audit.record("changed-page-sequence");
this.send('onEntryClick', this.get('page'));
}
},
// Outdent - changes a page from H3 to H2, etc.
pageOutdent() {
if (this.get('state.outdentDisabled')) {
return;
}
let state = this.get('state');
var pages = this.get('pages');
var page = _.findWhere(pages, { id: this.get('page') });
let pendingChanges = tocUtil.outdent(state, pages, page);
if (pendingChanges.length > 0) {
this.attrs.changePageLevel(pendingChanges);
this.showNotification("Outdent");
this.audit.record("changed-page-sequence");
this.send('onEntryClick', this.get('page'));
}
},
onEntryClick(id) {
this.setState(id);
this.attrs.gotoPage(id);
},
},
});

View file

@ -0,0 +1,17 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
document: {},
meta: [],
});

View file

@ -0,0 +1,51 @@
// 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 Ember from 'ember';
import TooltipMixin from '../../mixins/tooltip';
export default Ember.Component.extend(TooltipMixin, {
documentService: Ember.inject.service('document'),
document: {},
folder: {},
didRender() {
if (this.session.authenticated) {
this.addTooltip(document.getElementById("owner-avatar"));
}
},
willDestroyElements() {
this.destroyElements();
},
actions: {
// Page up - above pages shunt down.
onPageSequenceChange(pendingChanges) {
this.attrs.changePageSequence(pendingChanges);
},
// Move down - pages below shift up.
onPageLevelChange(pendingChanges) {
this.attrs.changePageLevel(pendingChanges);
},
gotoPage(id) {
return this.attrs.gotoPage(id);
},
// close dialog
close() {
return true;
}
}
});

View file

@ -0,0 +1,141 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
import TooltipMixin from '../../mixins/tooltip';
export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
userService: Ember.inject.service('user'),
localStorage: Ember.inject.service(),
drop: null,
users: [],
saveTemplate: {
name: "",
description: ""
},
didReceiveAttrs() {
this.set('saveTemplate.name', this.get('document.name'));
this.set('saveTemplate.description', this.get('document.excerpt'));
},
didRender() {
if (this.get('isEditor')) {
this.addTooltip(document.getElementById("attachment-button"));
this.addTooltip(document.getElementById("save-template-button"));
this.addTooltip(document.getElementById("set-meta-button"));
this.addTooltip(document.getElementById("delete-document-button"));
this.addTooltip(document.getElementById("add-section-button"));
}
this.addTooltip(document.getElementById("print-document-button"));
},
didInsertElement() {
if (this.get('isEditor')) {
let self = this;
let documentId = this.get('document.id');
let url = this.get('appMeta.url');
let uploadUrl = `${url}/documents/${documentId}/attachments`;
let dzone = new Dropzone("#attachment-button > i", {
headers: {
'Authorization': 'Bearer ' + self.get('localStorage').getSessionItem('session.session.authenticated.token')
},
url: uploadUrl,
method: "post",
paramName: 'attachment',
clickable: true,
maxFilesize: 10,
parallelUploads: 3,
uploadMultiple: false,
addRemoveLinks: false,
autoProcessQueue: true,
init: function() {
this.on("success", function(file /*, response*/ ) {
self.showNotification(`Attached ${file.name}`);
});
this.on("queuecomplete", function() {
self.attrs.onAttachmentUpload();
});
this.on("addedfile", function( /*file*/ ) {
self.audit.record('attached-file');
});
}
});
dzone.on("complete", function(file) {
dzone.removeFile(file);
});
this.set('drop', dzone);
}
},
willDestroyElement() {
if (is.not.null(this.get('drop'))) {
this.get('drop').destroy();
this.set('drop', null);
}
this.destroyTooltips();
},
actions: {
deleteDocument() {
this.attrs.onDocumentDelete();
},
printDocument() {
window.print();
},
saveTemplate() {
var name = this.get('saveTemplate.name');
var excerpt = this.get('saveTemplate.description');
if (is.empty(name)) {
$("#new-template-name").addClass("error").focus();
return false;
}
if (is.empty(excerpt)) {
$("#new-template-desc").addClass("error").focus();
return false;
}
this.showNotification('Template saved');
this.attrs.onSaveTemplate(name, excerpt);
return true;
},
saveMeta() {
let doc = this.get('document');
if (is.empty(doc.get('excerpt'))) {
$("meta-excerpt").addClass("error").focus();
return false;
}
doc.set('excerpt', doc.get('excerpt').substring(0, 250));
doc.set('userId', this.get('owner.id'));
this.showNotification("Saved");
this.attrs.onDocumentChange(doc);
return true;
},
}
});

View file

@ -0,0 +1,136 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
import TooltipMixin from '../../mixins/tooltip';
export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
documentService: Ember.inject.service('document'),
sectionService: Ember.inject.service('section'),
appMeta: Ember.inject.service(),
/* Parameters */
document: null,
// pages: [],
attachments: [],
folder: null,
folders: [],
isEditor: false,
/* Internal */
drop: null,
deleteAttachment: {
id: "",
name: "",
},
noSections: Ember.computed('pages', function () {
return this.get('pages.length') === 0;
}),
didInsertElement() {
let self = this;
this.get('sectionService').refresh(this.get('document.id')).then(function (changes) {
changes.forEach(function (newPage) {
let oldPage = self.get('pages').findBy('id', newPage.get('id'));
if (is.not.undefined(oldPage)) {
oldPage.set('body', newPage.body);
oldPage.set('revised', newPage.revised);
self.showNotification(`Refreshed ${oldPage.title}`);
}
});
});
},
willDestroyElement() {
this.destroyTooltips();
let drop = this.get('drop');
if (is.not.null(drop)) {
drop.destroy();
}
},
actions: {
confirmDeleteAttachment(id, name) {
this.set('deleteAttachment', {
id: id,
name: name
});
$(".delete-attachment-dialog").css("display", "block");
let drop = new Drop({
target: $(".delete-attachment-" + id)[0],
content: $(".delete-attachment-dialog")[0],
classes: 'drop-theme-basic',
position: "bottom right",
openOn: "always",
tetherOptions: {
offset: "5px 0",
targetOffset: "10px 0"
},
remove: false
});
this.set('drop', drop);
},
cancel() {
let drop = this.get('drop');
drop.close();
this.set('deleteAttachment', {
id: "",
name: ""
});
},
deleteAttachment() {
let attachment = this.get('deleteAttachment');
let drop = this.get('drop');
drop.close();
this.showNotification(`Deleted ${attachment.name}`);
this.attrs.onAttachmentDeleted(this.get('deleteAttachment').id);
this.set('deleteAttachment', {
id: "",
name: ""
});
return true;
},
onDeletePage(id, deleteChildren) {
let page = this.get('pages').findBy("id", id);
if (is.undefined(page)) {
return;
}
let params = {
id: id,
title: page.get('title'),
children: deleteChildren
};
this.attrs.onDeletePage(params);
},
// onTagChange event emitted from document/tag-editor component
onTagChange(tags) {
let doc = this.get('document');
doc.set('tags', tags);
this.get('documentService').save(doc);
}
}
});

View file

@ -0,0 +1,86 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
documentService: Ember.inject.service('document'),
revisions: [],
diffReport: "",
busy: false,
currentRevisionId: "",
didReceiveAttrs() {
if (is.undefined(this.get('model'))) {
return;
}
let self = this;
this.get('documentService').getPageRevisions(this.get('model.documentId'), this.get('model.pageId')).then(function(response) {
if (is.array(response)) {
self.set('revisions', response);
if (response.length > 0) {
self.send('produceReport', response[0].id);
}
}
});
},
didRender() {
let self = this;
Ember.run.schedule('afterRender', function() {
Mousetrap.bind('esc', function() {
self.send('cancelAction');
return false;
});
});
},
actions: {
produceReport(revisionId) {
this.set('busy', true);
this.set('diffReport', "");
this.set('currentRevisionId', revisionId);
// visually mark active revision
let revisions = this.get('revisions');
revisions.forEach(function(revision) {
Ember.set(revision, 'selected', false);
});
let revision = _.findWhere(revisions, {
id: revisionId
});
Ember.set(revision, 'selected', true);
let self = this;
this.get('documentService').getPageRevisionDiff(this.get('model.documentId'),
this.get('model.pageId'), revisionId).then(function(response) {
self.set('busy', false);
self.set('diffReport', Ember.String.htmlSafe(response));
});
},
cancelAction() {
this.attrs.editorClose();
},
primaryAction() {
if (this.session.isEditor) {
this.attrs.editorAction(this.get('model.pageId'), this.get('currentRevisionId'));
}
}
}
});

View file

@ -0,0 +1,34 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
page: {},
tagName: "li",
classNames: ["item"],
// indentLevel: Ember.computed('page', function() {
// let nodeLevel = this.get('page.level');
// let indent = (nodeLevel - 1) * 20;
// return indent;
// }),
didReceiveAttrs() {
// this.set('classNames', ["item", "margin-left-" + this.get("page.tocIndent")]);
},
actions: {
onClick(id) {
this.get('onClick')(id);
}
}
});

View file

@ -0,0 +1,55 @@
// 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 Ember from 'ember';
import TooltipMixin from '../../mixins/tooltip';
const {
computed: { oneWay, or, notEmpty },
computed
} = Ember;
export default Ember.Component.extend(TooltipMixin, {
deleteChildren: false,
checkId: computed('page', function () {
let id = this.get('page.id');
return `delete-check-button-${id}`;
}),
dropTarget: computed('page', function () {
let id = this.get('page.id');
return `delete-page-button-${id}`;
}),
didRender() {
if (this.get('isEditor')) {
let self = this;
$(".page-edit-button, .page-delete-button").each(function (i, el) {
self.addTooltip(el);
});
}
},
willDestroyElement() {
this.destroyTooltips();
},
actions: {
editPage(id) {
this.attrs.onEditPage(id);
},
deletePage(id) {
this.attrs.onDeletePage(id, this.get('deleteChildren'));
},
}
});

View file

@ -0,0 +1,40 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
export default Ember.Component.extend(NotifierMixin, {
didRender() {
let self = this;
Mousetrap.bind('esc', function() {
self.send('onCancel');
return false;
});
},
actions: {
onCancel() {
this.attrs.onCancel();
},
addSection(section) {
if (section.preview) {
this.showNotification("Coming soon!");
return;
}
this.attrs.onAction(section);
}
}
});

View file

@ -0,0 +1,111 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
documentTags: [],
tagz: [],
isEditor: false,
newTag: "",
maxTags: 3,
canAdd: false,
didInitAttrs() {
let tagz = [];
if (this.get('documentTags').length > 1) {
let tags = this.get('documentTags').split('#');
_.each(tags, function(tag) {
if (tag.length > 0) {
tagz.pushObject(tag);
}
});
}
this.set('tagz', tagz);
this.set('canAdd', this.get('isEditor') && this.get('tagz').get('length') < 3);
},
didUpdateAttrs() {
this.set('canAdd', this.get('isEditor') && this.get('tagz').get('length') < 3);
},
didInsertElement() {
},
willDestroyElement() {
$("#add-tag-field").off("keydown");
},
actions: {
onTagEditor() {
$("#add-tag-field").off("keydown").on("keydown", function(e) {
if (e.shiftKey) {
return false;
}
if (e.which === 13 || e.which === 45 || e.which === 189 || e.which === 8 || e.which === 127 || (e.which >= 65 && e.which <= 90) || (e.which >= 97 && e.which <= 122) || (e.which >= 48 && e.which <= 57)) {
return true;
}
return false;
});
},
addTag() {
let tags = this.get("tagz");
let tag = this.get('newTag');
tag = tag.toLowerCase().trim();
// empty or dupe?
if (tag.length === 0 || _.contains(tags, tag) || tags.length >= this.get('maxTags') || tag.startsWith('-')) {
return false;
}
tags.pushObject(tag);
this.set('tagz', tags);
this.set('newTag', '');
let save = "#";
_.each(tags, function(tag) {
save = save + tag + "#";
});
this.get('onChange')(save);
this.audit.record('added-tag');
return true;
},
// removeTag removes specified tag from the list of tags associated with this document.
removeTag(tagToRemove) {
let tags = this.get("tagz");
let save = "";
tags = _.without(tags, tagToRemove);
_.each(tags, function(tag) {
save = save + tag + "#";
});
if (save.length) {
save = "#" + save;
}
this.set('tagz', tags);
this.get('onChange')(save);
this.audit.record('removed tag');
},
}
});

View file

@ -0,0 +1,118 @@
// 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 Ember from 'ember';
import stringUtil from '../utils/string';
export default Ember.Component.extend({
drop: null,
target: null,
button: "Delete",
color: "flat-red",
button2: "",
color2: "2",
open: "click",
position: 'bottom right',
showCancel: true,
contentId: "",
focusOn: null, // is there an input field we need to focus?
selectOn: null, // is there an input field we need to select?
onOpenCallback: null, // callback when opened
onAction: null,
onAction2: null,
offset: "5px 0",
targetOffset: "10px 0",
constrainToWindow: true,
constrainToScrollParent: true,
hasSecondButton: Ember.computed('button2', 'color2', function () {
return is.not.empty(this.get('button2')) && is.not.empty(this.get('color2'));
}),
didReceiveAttrs() {
this.set("contentId", 'dropdown-dialog-' + stringUtil.makeId(10));
},
didInsertElement() {
this._super(...arguments);
let self = this;
let drop = new Drop({
target: document.getElementById(self.get('target')),
content: self.$(".dropdown-dialog")[0],
classes: 'drop-theme-basic',
position: self.get('position'),
openOn: self.get('open'),
tetherOptions: {
offset: self.offset,
targetOffset: self.targetOffset,
// optimizations: {
// moveElement: false
// },
constraints: [{
to: 'window',
attachment: 'together'
}]
},
remove: true
});
self.set('drop', drop);
drop.on('open', function () {
if (is.not.null(self.get("focusOn"))) {
document.getElementById(self.get("focusOn")).focus();
}
if (is.not.null(self.get("selectOn"))) {
document.getElementById(self.get("selectOn")).select();
}
if (is.not.null(self.get("onOpenCallback"))) {
self.attrs.onOpenCallback(drop);
}
});
},
willDestroyElement() {
this.get('drop').destroy();
},
actions: {
onCancel() {
this.get('drop').close();
},
onAction() {
if (this.get('onAction') === null) {
return;
}
let close = this.attrs.onAction();
if (close) {
this.get('drop').close();
}
},
onAction2() {
if (this.get('onAction2') === null) {
return;
}
let close = this.attrs.onAction2();
if (close) {
this.get('drop').close();
}
}
}
});

View file

@ -0,0 +1,52 @@
// 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 Ember from 'ember';
import stringUtil from '../utils/string';
export default Ember.Component.extend({
target: null,
open: "click",
position: 'bottom right',
contentId: "",
drop: null,
didReceiveAttrs() {
this.set("contentId", 'dropdown-menu-' + stringUtil.makeId(10));
// if (this.session.get('isMobile')) {
// this.set('open', "click");
// }
},
didInsertElement() {
this._super(...arguments);
let self = this;
let drop = new Drop({
target: document.getElementById(self.get('target')),
content: self.$(".dropdown-menu")[0],
classes: 'drop-theme-menu',
position: self.get('position'),
openOn: self.get('open'),
tetherOptions: {
offset: "5px 0",
targetOffset: "10px 0"
}
});
self.set('drop', drop);
},
willDestroyElement() {
this.get('drop').destroy();
}
});

View file

@ -0,0 +1,18 @@
// 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 Ember from 'ember';
export default Ember.TextField.extend({
becomeFocused: function() {
this.$().focus();
}.on('didInsertElement')
});

View file

@ -0,0 +1,18 @@
// 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 Ember from 'ember';
export default Ember.TextArea.extend({
becomeFocused: function() {
this.$().focus();
}.on('didInsertElement')
});

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 Ember from 'ember';
export default Ember.Component.extend({
documentTags: [],
tagz: [],
didInitAttrs() {
let tagz = [];
if (this.get('documentTags').length > 1) {
let tags = this.get('documentTags').split('#');
_.each(tags, function(tag) {
if (tag.length > 0) {
tagz.pushObject("#" + tag);
}
});
}
this.set('tagz', tagz);
},
actions: {
filterByTag(tag) {
this.get('filterByTag')(tag);
}
}
});

View file

@ -0,0 +1,46 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
selectedDocuments: [],
emptyState: Ember.computed('documents', function() {
return this.get('documents.length') === 0;
}),
didReceiveAttrs() {
this.set('selectedDocuments', []);
this.audit.record('viewed-space');
},
actions: {
selectDocument(documentId) {
let doc = this.get('documents').findBy('id', documentId);
let list = this.get('selectedDocuments');
doc.set('selected', !doc.get('selected'));
if (doc.get('selected')) {
list.push(documentId);
} else {
var index = list.indexOf(documentId);
if (index > -1) {
list.splice(index, 1);
}
}
this.set('selectedDocuments', list);
this.get('onDocumentsChecked')(list);
}
}
});

View file

@ -0,0 +1,110 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
folderService: Ember.inject.service('folder'),
appMeta: Ember.inject.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.";
},
willRender() {
if (this.inviteMessage.length === 0) {
this.set('inviteMessage', this.getDefaultInvitationMessage());
}
if (this.roleMessage.length === 0) {
this.set('roleMessage', this.getDefaultInvitationMessage());
}
},
actions: {
rename() {
if (is.empty(this.folder.get('name'))) {
$("#folderName").addClass("error").focus();
return;
}
this.sendAction("onRename", this.folder);
},
remove() {
if (is.null(this.get('moveTarget'))) {
$("#delete-target > select").addClass("error").focus();
return;
}
this.sendAction("onRemove", this.get('moveTarget').get('id'));
},
share() {
var email = this.get('inviteEmail').trim().replace(/ /g, '');
var message = this.get('inviteMessage').trim();
if (message.length === 0) {
message = this.getDefaultInvitationMessage();
}
if (email.length === 0) {
$("#inviteEmail").addClass("error").focus();
return;
}
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(';');
}
// Handle just one email address
if (result.Recipients.length === 0 && email.length > 0) {
result.Recipients.push(email);
}
this.set('inviteEmail', "");
this.sendAction("onShare", result);
},
setPermissions() {
var message = this.get('roleMessage').trim();
if (message.length === 0) {
message = this.getDefaultInvitationMessage();
}
this.get('permissions').forEach(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.sendAction("onPermission", this.get('folder'), message, this.get('permissions'));
}
}
});

View file

@ -0,0 +1,140 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
import TooltipMixin from '../../mixins/tooltip';
const {
computed
} = Ember;
export default Ember.Component.extend(NotifierMixin, TooltipMixin, {
documentService: Ember.inject.service('document'),
templateService: Ember.inject.service('template'),
folderService: Ember.inject.service('folder'),
session: Ember.inject.service(),
folder: {},
busy: false,
importedDocuments: [],
savedTemplates: [],
isFolderOwner: computed.equal('folder.userId', 'session.user.id'),
moveFolderId: "",
didReceiveAttrs() {
this.set('isFolderOwner', this.get('folder.userId') === this.get("session.user.id"));
let self = this;
this.get('templateService').getSavedTemplates().then(function(saved) {
let emptyTemplate = {
id: "0",
title: "Empty document",
selected: true
};
saved.unshiftObject(emptyTemplate);
self.set('savedTemplates', saved);
});
let targets = _.reject(this.get('folders'), {
id: this.get('folder').get('id')
});
this.set('movedFolderOptions', targets);
},
didRender() {
if (this.get('hasSelectedDocuments')) {
this.addTooltip(document.getElementById("move-documents-button"));
this.addTooltip(document.getElementById("delete-documents-button"));
} else {
if (this.get('isFolderOwner')) {
this.addTooltip(document.getElementById("folder-share-button"));
this.addTooltip(document.getElementById("folder-settings-button"));
}
if (this.get('folderService').get('canEditCurrentFolder')) {
this.addTooltip(document.getElementById("start-document-button"));
}
}
},
willDestroyElement() {
this.destroyTooltips();
},
navigateToDocument(document) {
this.attrs.showDocument(this.get('folder'), document);
},
actions: {
onEditTemplate(template) {
this.navigateToDocument(template);
},
onDocumentTemplate(id /*, title, type*/ ) {
let self = this;
this.send("showNotification", "Creating");
this.get('templateService').importSavedTemplate(this.folder.get('id'), id).then(function(document) {
self.navigateToDocument(document);
});
},
onDocumentImporting(filename) {
this.send("showNotification", `Importing ${filename}`);
let documents = this.get('importedDocuments');
documents.push(filename);
this.set('importedDocuments', documents);
},
onDocumentImported(filename /*, document*/ ) {
this.send("showNotification", `${filename} ready`);
let documents = this.get('importedDocuments');
documents.pop(filename);
this.set('importedDocuments', documents);
this.attrs.refresh();
if (documents.length === 0) {
// this.get('showDocument')(this.get('folder'), document);
}
},
deleteDocuments() {
this.attrs.onDeleteDocument();
},
setMoveFolder(folderId) {
this.set('moveFolderId', folderId);
let folders = this.get('folders');
folders.forEach(folder => {
folder.set('selected', folder.id === folderId);
});
},
moveDocuments() {
if (this.get("moveFolderId") === "") {
return false;
}
this.attrs.onMoveDocument(this.get('moveFolderId'));
this.set("moveFolderId", "");
return true;
}
}
});

View file

@ -0,0 +1,84 @@
// 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 Ember from 'ember';
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: "",
didInsertElement() {
this._super(...arguments);
if (this.session.authenticated) {
this.addTooltip(document.getElementById("add-folder-button"));
}
},
didReceiveAttrs() {
let folders = this.get('folders');
let self = this;
// 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);
}
});
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();
},
actions: {
addFolder() {
var folderName = this.get('newFolder');
if (is.empty(folderName)) {
$("#new-folder-name").addClass("error").focus();
return false;
}
this.attrs.onFolderAdd(folderName);
this.set('newFolder', "");
return true;
}
}
});

View file

@ -0,0 +1,122 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../mixins/notifier';
export default Ember.Component.extend(NotifierMixin, {
localStorage: Ember.inject.service(),
tagName: 'span',
selectedTemplate: {
id: "0"
},
canEditTemplate: "",
drop: null,
appMeta: Ember.inject.service(),
didReceiveAttrs() {
this.send('setTemplate', this.get('savedTemplates')[0]);
},
willDestroyElement() {
if (is.not.null(this.get('drop'))) {
this.get('drop').destroy();
this.set('drop', null);
}
},
actions: {
setTemplate(chosen) {
if (is.undefined(chosen)) {
return;
}
this.set('selectedTemplate', chosen);
this.set('canEditTemplate', chosen.id !== "0" ? "Edit" : "");
let templates = this.get('savedTemplates');
templates.forEach(template => {
Ember.set(template, 'selected', template.id === chosen.id);
});
},
editTemplate() {
let template = this.get('selectedTemplate');
this.audit.record('edited-saved-template');
this.attrs.onEditTemplate(template);
return true;
},
startDocument() {
let template = this.get('selectedTemplate');
this.audit.record('used-saved-template');
this.attrs.onDocumentTemplate(template.id, template.title, "private");
return true;
},
onOpenCallback() {
if (is.not.null(this.get('drop'))) {
return;
}
let self = this;
let folderId = this.get('folder.id');
let url = this.get('appMeta.url');
let importUrl = `${url}/import/folder/${folderId}`;
Dropzone.options.uploadDocuments = false;
let dzone = new Dropzone("#upload-documents", {
headers: {
'Authorization': 'Bearer ' + self.get('localStorage').getSessionItem('session.session.authenticated.token')
},
url: importUrl,
method: "post",
paramName: 'attachment',
acceptedFiles: ".doc,.docx,.txt,.md,.markdown",
clickable: true,
maxFilesize: 10,
parallelUploads: 3,
uploadMultiple: false,
addRemoveLinks: false,
autoProcessQueue: true,
init: function() {
this.on("success", function(document) {
self.attrs.onDocumentImported(document.name, document);
});
this.on("error", function(x) {
console.log("Conversion failed for ", x.name, " obj ", x); // TODO proper error handling
});
this.on("queuecomplete", function() {
});
this.on("addedfile", function(file) {
self.attrs.onDocumentImporting(file.name);
self.audit.record('converted-document');
});
}
});
dzone.on("complete", function(file) {
dzone.removeFile(file);
});
this.set('drop', dzone);
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,15 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
});

View file

@ -0,0 +1,21 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
title: "",
message: "",
hasMessage: Ember.computed('message', function() {
return this.get('message').length !== 0;
})
});

View file

@ -0,0 +1,41 @@
// 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 Ember from 'ember';
import netUtil from '../../utils/net';
export default Ember.Component.extend({
folderService: Ember.inject.service('folder'),
folder: null,
appMeta: Ember.inject.service(),
didInitAttrs() {
if (this.get("session.authenticated")) {
this.get("session.user.accounts").forEach((account)=>{
// TODO: do not mutate account.active here
account.active = account.orgId === this.get("appMeta.orgId");
});
}
},
didReceiveAttrs() {
if (this.get('folder') === null) {
this.set("folder", this.get('folderService.currentFolder'));
}
},
actions: {
switchAccount(domain) {
this.audit.record('switched-account');
window.location.href = netUtil.getAppUrl(domain);
}
}
});

View file

@ -0,0 +1,15 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
});

View file

@ -0,0 +1,124 @@
// 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 Ember from 'ember';
import encodingUtil from '../../utils/encoding';
import netUtil from '../../utils/net';
export default Ember.Component.extend({
folderService: Ember.inject.service('folder'),
serial: "",
folderId: "",
slug: "",
processing: false,
didRender() {
let self = this;
$("#stage-1-firstname").focus();
// Stage 1 - person name keypress handler
$("#stage-1-firstname, #stage-1-lastname").keyup(function() {
if (!$("#stage-1-firstname").val() || !$("#stage-1-lastname").val()) {
$(".name-status").attr("src", "assets/img/onboard/person-red.png");
} else {
$(".name-status").attr("src", "assets/img/onboard/person-green.png");
}
});
// Stage 1 - finish
$("#stage-1-next").off('click').on('click', function() {
if (!$("#stage-1-firstname").val()) {
$("#stage-1-firstname").focus();
$("#stage-1-firstname").addClass("error");
$(".name-status").attr("src", "assets/img/onboard/person-red.png");
return;
}
if (!$("#stage-1-lastname").val()) {
$("#stage-1-lastname").focus();
$("#stage-1-lastname").addClass("error");
$(".name-status").attr("src", "assets/img/onboard/person-red.png");
return;
}
self.set('processing', false);
$(".stage-1").fadeOut("slow", function() {
if (self.get('processing')) {
return;
}
self.set('processing', true);
$(".stage-2").fadeIn();
$("#stage-2-password").focus();
// Stage 2 - password keypress handler
$("#stage-2-password-confirm").keyup(function() {
if ($("#stage-2-password").val().length < 6 || $("#stage-2-password").val().length > 50 ||
($("#stage-2-password").val() !== $("#stage-2-password-confirm").val())) {
$(".password-status").attr("src", "assets/img/onboard/lock-red.png");
} else {
$(".password-status").attr("src", "assets/img/onboard/lock-green.png");
}
});
});
});
// Stage 2 - finish
$("#stage-2-next").off('click').on('click', function() {
if (!$("#stage-2-password").val() || $("#stage-2-password").val().length < 6 || $("#stage-2-password").val().length > 50) {
$("#stage-2-password").focus();
$("#stage-2-password").addClass("error");
return;
}
if (!$("#stage-2-password-confirm").val()) {
$("#stage-2-password-confirm").focus();
$("#stage-2-password-confirm").addClass("error");
return;
}
if ($("#stage-2-password-confirm").val() !== $("#stage-2-password").val()) {
$(".mismatch").show();
$(".password-status").attr("src", "assets/img/onboard/lock-red.png");
return;
}
self.set('processing', false);
$(".stage-2").fadeOut("slow", function() {
if (self.get('processing')) {
return;
}
self.set('processing', true);
$(".stage-3").fadeIn();
$("#spinner-1").show();
var payload = '{ "Password": "' + $("#stage-2-password").val() + '", "Serial": "' + self.serial + '", "Firstname": "' + $("#stage-1-firstname").val() + '", "Lastname": "' + $("#stage-1-lastname").val() + '" }';
var password = $("#stage-2-password").val();
self.get('folderService').onboard(self.folderId, payload).then(function(user) {
var credentials = encodingUtil.Base64.encode(netUtil.getSubdomain() + ":" + user.email + ":" + password);
self.session.sso(credentials).then(function() {
window.location.href = 's/' + self.folderId + "/" + self.slug;
});
}, function() {
window.location.href = "/";
});
});
});
},
});

View file

@ -0,0 +1,56 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
results: [],
resultPhrase: "",
didReceiveAttrs() {
let results = this.get('results');
let temp = _.groupBy(results, 'documentId');
let documents = [];
_.each(temp, function(document) {
let refs = [];
if (document.length > 1) {
refs = document.slice(1);
}
_.each(refs, function(ref, index) {
ref.comma = index === refs.length-1 ? "" : ", ";
});
let hasRefs = refs.length > 0;
documents.pushObject( {
doc: document[0],
ref: refs,
hasReferences: hasRefs
});
});
let phrase = 'Nothing found';
if (results.length > 0) {
let places = documents.length === 1 ? "place" : "places";
let references = results.length === 1 ? "secton" : "sections";
let i = results.length;
let j = documents.length;
phrase = `${i} ${references} in ${j} ${places}`;
}
this.set('resultPhrase', phrase);
this.set('documents', documents);
}
});

View file

@ -0,0 +1,32 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
documentTags: [],
tagz: [],
didInitAttrs() {
let tagz = [];
if (this.get('documentTags').length > 1) {
let tags = this.get('documentTags').split('#');
_.each(tags, function(tag) {
if (tag.length > 0) {
tagz.pushObject(tag);
}
});
}
this.set('tagz', tagz);
}
});

View file

@ -0,0 +1,91 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
drop: null,
cancelLabel: "Close",
actionLabel: "Save",
tip: "Short and concise title for the page",
busy: false,
didRender() {
let self = this;
Mousetrap.bind('esc', function () {
self.send('onCancel');
return false;
});
Mousetrap.bind(['ctrl+s', 'command+s'], function () {
self.send('onAction');
return false;
});
$("#page-title").removeClass("error");
},
willDestroyElement() {
let drop = this.get('drop');
if (is.not.null(drop)) {
drop.destroy();
}
},
actions: {
onCancel() {
if (this.attrs.isDirty() !== null && this.attrs.isDirty()) {
$(".discard-edits-dialog").css("display", "block");
let drop = new Drop({
target: $("#editor-cancel")[0],
content: $(".cancel-edits-dialog")[0],
classes: 'drop-theme-basic',
position: "bottom right",
openOn: "always",
tetherOptions: {
offset: "5px 0",
targetOffset: "10px 0"
},
remove: false
});
this.set('drop', drop);
return;
}
this.attrs.onCancel();
},
onAction() {
if (this.get('busy')) {
return;
}
if (is.empty(this.get('page.title'))) {
$("#page-title").addClass("error").focus();
return;
}
this.attrs.onAction(this.get('page.title'));
},
keepEditing() {
let drop = this.get('drop');
drop.close();
},
discardEdits() {
this.attrs.onCancel();
}
}
});

View file

@ -0,0 +1,18 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
didReceiveAttrs() {
this.set('rendererType', 'section/' + this.get('page.contentType') + '/type-renderer');
},
});

View file

@ -0,0 +1,132 @@
// 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 Ember from 'ember';
import TooltipMixin from '../../../mixins/tooltip';
export default Ember.Component.extend(TooltipMixin, {
isDirty: false,
pageBody: "",
codeEditor: null,
syntaxOptions: [],
codeSyntax: null,
didInitAttrs() {
let self = this;
CodeMirror.modeURL = "codemirror/mode/%N/%N.js";
let rawBody = this.get('meta.rawBody');
let cleanBody = rawBody.replace("</pre>", "");
cleanBody = cleanBody.replace('<pre class="code-mirror cm-s-solarized cm-s-dark" data-lang="', "");
let startPos = cleanBody.indexOf('">');
let syntax = {
mode: "html",
name: "HTML"
};
if (startPos !== -1) {
syntax = cleanBody.substring(0, startPos);
cleanBody = cleanBody.substring(startPos + 2);
}
this.set('pageBody', cleanBody);
let opts = [];
_.each(_.sortBy(CodeMirror.modeInfo, 'name'), function(item) {
let i = {
mode: item.mode,
name: item.name
};
opts.pushObject(i);
if (item.mode === syntax) {
self.set('codeSyntax', i);
}
});
this.set('syntaxOptions', opts);
// default check
if (is.null(this.get("codeSyntax"))) {
this.set("codeSyntax", opts.findBy("mode", "html"));
}
},
didRender() {
this.addTooltip(document.getElementById("set-syntax-zone"));
},
didInsertElement() {
var editor = CodeMirror.fromTextArea(document.getElementById("code-editor"), {
theme: "solarized dark",
lineNumbers: true,
lineWrapping: true,
indentUnit: 4,
tabSize: 4,
value: "",
dragDrop: false
});
editor.setSize("100%", $(document).height() - $(".document-editor > .toolbar").height() - 180);
this.set('codeEditor', editor);
let syntax = this.get("codeSyntax");
if (is.not.undefined(syntax)) {
CodeMirror.autoLoadMode(editor, syntax.mode);
editor.setOption("mode", syntax.mode);
}
},
willDestroyElement() {
this.destroyTooltips();
this.set('codeEditor', null);
},
// Wrap code in PRE tag with language identifier for subsequent rendering.
getPRE() {
let codeSyntax = this.get("codeSyntax.mode");
let body = this.get('codeEditor').getDoc().getValue();
return `<pre class="code-mirror cm-s-solarized cm-s-dark" data-lang="${codeSyntax}">${body}</pre>`;
},
actions: {
onSyntaxChange(syntax) {
let editor = this.get('codeEditor');
CodeMirror.autoLoadMode(editor, syntax.mode);
editor.setOption("mode", syntax.mode);
this.set('isDirty', true);
this.set('codeSyntax', syntax);
},
isDirty() {
return this.get('isDirty');
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('rawBody', this.getPRE());
this.attrs.onAction(page, meta);
}
}
});

View file

@ -0,0 +1,57 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
codeBody: "",
codeSyntax: "htmlmixed",
didReceiveAttrs() {
CodeMirror.modeURL = "codemirror/mode/%N/%N.js";
let page = this.get('page');
let rawBody = page.get('body');
let cleanBody = rawBody.replace("</pre>", "").replace('<pre class="code-mirror cm-s-solarized cm-s-dark" data-lang="', "");
let startPos = cleanBody.indexOf('">');
if (startPos !== -1) {
this.set('codeSyntax', cleanBody.substring(0, startPos));
this.set('codeBody', cleanBody.substring(startPos + 2));
}
},
didRender() {
let page = this.get('page');
let elem = `page-${page.id}-code`;
var editor = CodeMirror.fromTextArea(document.getElementById(elem), {
theme: "solarized dark",
lineNumbers: true,
lineWrapping: true,
indentUnit: 4,
tabSize: 4,
value: "",
dragDrop: false,
readOnly: true
});
let syntax = this.get("codeSyntax");
CodeMirror.autoLoadMode(editor, syntax);
editor.setOption("mode", syntax);
this.set('codeEditor', editor);
},
willDestroyElement() {
this.set('codeEditor', null);
}
});

View file

@ -0,0 +1,208 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../../mixins/notifier';
import TooltipMixin from '../../../mixins/tooltip';
import SectionMixin from '../../../mixins/section';
export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, {
sectionService: Ember.inject.service('section'),
isDirty: false,
waiting: false,
authenticated: false,
user: {},
workspaces: [],
config: {},
didReceiveAttrs() {
let config = {};
try {
config = JSON.parse(this.get('meta.config'));
} catch (e) {}
if (is.empty(config)) {
config = {
APIKey: "",
filter: {},
itemCount: 0,
url: "",
userId: 0,
username: "",
workspaceId: 0,
workspaceName: "",
};
}
this.set('config', config);
if (this.get('config.userId') > 0) {
this.send('auth');
}
},
willDestroyElement() {
this.destroyTooltips();
},
getWorkspaces() {
let page = this.get('page');
let self = this;
this.set('waiting', true);
this.get('sectionService').fetch(page, "workspace", this.get('config'))
.then(function(response) {
// console.log(response);
let workspaceId = self.get('config.workspaceId');
if (response.length > 0 && workspaceId === 0) {
workspaceId = response[0].Id;
}
self.set("config.workspaceId", workspaceId);
self.set('workspaces', response);
self.selectWorkspace(workspaceId);
Ember.run.schedule('afterRender', function() {
window.scrollTo(0, document.body.scrollHeight);
response.forEach(function(workspace) {
self.addTooltip(document.getElementById("gemini-workspace-" + workspace.Id));
});
});
self.set('waiting', false);
}, function(reason) { //jshint ignore: line
self.set('workspaces', []);
self.set('waiting', false);
});
},
getItems() {
let page = this.get('page');
let self = this;
this.set('waiting', true);
this.get('sectionService').fetch(page, "items", this.get('config'))
.then(function(response) {
// console.log(response);
self.set('items', response);
self.set('config.itemCount', response.length);
self.set('waiting', false);
}, function(reason) { //jshint ignore: line
self.set('items', []);
self.set('waiting', false);
});
},
selectWorkspace(id) {
let self = this;
let w = this.get('workspaces');
w.forEach(function(w) {
Ember.set(w, 'selected', w.Id === id);
if (w.Id === id) {
self.set("config.filter", w.Filter);
self.set("config.workspaceId", id);
self.set("config.workspaceName", w.Title);
// console.log(self.get('config'));
}
});
this.set('workspaces', w);
this.getItems();
},
actions: {
isDirty() {
return this.get('isDirty');
},
auth() {
// missing data?
if (is.empty(this.get('config.url'))) {
$("#gemini-url").addClass("error").focus();
return;
}
if (is.empty(this.get('config.username'))) {
$("#gemini-username").addClass("error").focus();
return;
}
if (is.empty(this.get('config.APIKey'))) {
$("#gemini-apikey").addClass("error").focus();
return;
}
// knock out spaces
this.set('config.url', this.get('config.url').trim());
this.set('config.username', this.get('config.username').trim());
this.set('config.APIKey', this.get('config.APIKey').trim());
// remove trailing slash in URL
let url = this.get('config.url');
if (url.indexOf("/", url.length - 1) !== -1) {
this.set('config.url', url.substring(0, url.length - 1));
}
let page = this.get('page');
let self = this;
this.set('waiting', true);
this.get('sectionService').fetch(page, "auth", this.get('config'))
.then(function(response) {
self.set('authenticated', true);
self.set('user', response);
self.set('config.userId', response.BaseEntity.id);
self.set('waiting', false);
self.getWorkspaces();
}, function(reason) { //jshint ignore: line
self.set('authenticated', false);
self.set('user', null);
self.set('config.userId', 0);
self.set('waiting', false);
switch (reason.status) {
case 400:
self.showNotification(`Unable to connect to Gemini URL`);
break;
case 403:
self.showNotification(`Unable to authenticate`);
break;
default:
self.showNotification(`Something went wrong, try again!`);
}
});
},
onWorkspaceChange(id) {
this.set('isDirty', true);
this.selectWorkspace(id);
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('rawBody', JSON.stringify(this.get("items")));
meta.set('config', JSON.stringify(this.get('config')));
meta.set('externalSource', true);
this.attrs.onAction(page, meta);
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,455 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../../mixins/notifier';
import TooltipMixin from '../../../mixins/tooltip';
import SectionMixin from '../../../mixins/section';
export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, {
sectionService: Ember.inject.service('section'),
isDirty: false,
busy: false,
authenticated: false,
config: {},
owners: null,
repos: null,
noRepos: false,
showCommits: false,
showIssueNum: false,
showLabels: false,
didReceiveAttrs() {
let self = this;
let page = this.get('page');
if (is.undefined(this.get('config.clientId')) || is.undefined(this.get('config.callbackUrl'))) {
self.get('sectionService').fetch(page, "config", {})
.then(function (cfg) {
let config = {};
config = {
clientId: cfg.clientID,
callbackUrl: cfg.authorizationCallbackURL,
owner: null,
owner_name: "",
repo: null,
repo_name: "",
report: null,
lists: [],
branch: "",
branchURL: "",
branchSince: "",
branchLines: "30",
state: null,
issues: "",
userId: "",
pageId: page.get('id'),
};
try {
let metaConfig = JSON.parse(self.get('meta.config'));
config.owner = metaConfig.owner;
config.repo = metaConfig.repo;
config.report = metaConfig.report;
config.lists = metaConfig.lists;
config.branchSince = metaConfig.branchSince;
config.branchLines = metaConfig.branchLines;
config.state = metaConfig.state;
config.issues = metaConfig.issues;
config.userId = metaConfig.userId;
config.pageId = metaConfig.pageId;
} catch (e) {}
self.set('config', config);
self.set('config.pageId', page.get('id'));
// On auth callback capture code
let code = window.location.search;
if (is.not.undefined(code) && is.not.null(code) && is.not.empty(code) && code !== "") {
let tok = code.replace("?code=", "");
self.get('sectionService').fetch(page, "saveSecret", { "token": tok })
.then(function () {
console.log("github auth code saved to db");
self.send('authStage2');
}, function (error) { //jshint ignore: line
console.log(error);
self.send('auth');
});
} else {
if (config.userId !== self.get("session.session.authenticated.user.id")) {
console.log("github auth wrong user ID, switching");
self.set('config.userId', self.get("session.session.authenticated.user.id"));
}
self.get('sectionService').fetch(page, "checkAuth", self.get('config'))
.then(function () {
console.log("github auth code valid");
self.send('authStage2');
}, function (error) { //jshint ignore: line
console.log(error);
self.send('auth'); // require auth if the db token is invalid
});
}
}, function (error) { //jshint ignore: line
console.log(error);
});
}
},
willDestroyElement() {
this.destroyTooltips();
},
getOwnerLists() {
this.set('busy', true);
let self = this;
let owners = this.get('owners');
let thisOwner = this.get('config.owner');
let page = this.get('page');
if (is.null(thisOwner) || is.undefined(thisOwner)) {
if (owners.length) {
thisOwner = owners[0];
this.set('config.owner', thisOwner);
}
} else {
this.set('config.owner', owners.findBy('id', thisOwner.id));
}
this.set('owner', thisOwner);
this.get('sectionService').fetch(page, "repos", self.get('config'))
.then(function (lists) {
self.set('busy', false);
self.set('repos', lists);
self.getRepoLists();
}, function (error) { //jshint ignore: line
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to fetch repositories");
console.log(error);
});
},
getRepoLists() {
this.set('busy', true);
let repos = this.get('repos');
let thisRepo = this.get('config.repo');
if (is.null(repos) || is.undefined(repos) || repos.length === 0) {
this.set('noRepos', true);
return;
}
this.set('noRepos', false);
if (is.null(thisRepo) || is.undefined(thisRepo) || thisRepo.owner !== this.get('config.owner').name) {
if (repos.length) {
thisRepo = repos[0];
this.set('config.repo', thisRepo);
}
} else {
this.set('config.repo', repos.findBy('id', thisRepo.id));
}
this.set('repo', thisRepo);
this.getReportLists();
},
getReportLists() {
let reports = [];
reports[0] = {
id: "commitsData", // used as method for fetching Go data
name: "Commits on a branch"
};
reports[1] = {
id: "issuesData", // used as method for fetching Go data
name: "Issues"
};
this.set("reports", reports);
let thisReport = this.get('config.report');
if (is.null(thisReport) || is.undefined(thisReport)) {
thisReport = reports[0];
this.set('config.report', thisReport);
} else {
this.set('config.report', reports.findBy('id', thisReport.id));
}
this.set('report', thisReport);
this.renderSwitch(thisReport);
},
renderSwitch(thisReport) {
if (is.undefined(this.get('initDateTimePicker'))) {
$.datetimepicker.setLocale('en');
$('#branch-since').datetimepicker();
this.set('initDateTimePicker', "Done");
}
let bl = this.get('config.branchLines');
if (is.undefined(bl) || bl === "" || bl <= 0) {
this.set('config.branchLines', "30");
}
this.set('showCommits', false);
this.set('showLabels', false);
switch (thisReport.id) {
case 'commitsData':
this.set('showCommits', true);
this.getBranchLists();
break;
case 'issuesData':
this.set('showLabels', true);
this.getLabelLists();
break;
}
},
getBranchLists() {
this.set('busy', true);
let self = this;
let page = this.get('page');
this.get('sectionService').fetch(page, "branches", self.get('config'))
.then(function (lists) {
let savedLists = self.get('config.lists');
if (savedLists === null) {
savedLists = [];
}
if (lists.length > 0) {
let noIncluded = true;
lists.forEach(function (list) {
let included = false;
var saved;
if (is.not.undefined(savedLists)) {
saved = savedLists.findBy("id", list.id);
}
if (is.not.undefined(saved)) {
included = saved.included;
noIncluded = false;
}
list.included = included;
});
if (noIncluded) {
lists[0].included = true; // make the first entry the default
}
}
self.set('config.lists', lists);
self.set('busy', false);
}, function (error) { //jshint ignore: line
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to fetch repository branches");
console.log(error);
});
},
getLabelLists() {
this.set('busy', true);
let self = this;
let page = this.get('page');
let states = [];
states[0] = {
id: "open",
name: "Open Issues"
};
states[1] = {
id: "closed",
name: "Closed Issues"
};
states[2] = {
id: "all",
name: "All Issues"
};
this.set("states", states);
let thisState = this.get('config.state');
if (is.null(thisState) || is.undefined(thisState)) {
thisState = states[0];
this.set('config.state', thisState);
} else {
this.set('config.state', states.findBy('id', thisState.id));
}
this.set('state', thisState);
this.get('sectionService').fetch(page, "labels", self.get('config'))
.then(function (lists) {
let savedLists = self.get('config.lists');
if (savedLists === null) {
savedLists = [];
}
if (lists.length > 0) {
lists.forEach(function (list) {
var saved;
if (is.not.undefined(savedLists)) {
saved = savedLists.findBy("id", list.id);
}
let included = false;
if (is.not.undefined(saved)) {
included = saved.included;
}
list.included = included;
});
}
self.set('config.lists', lists);
self.set('busy', false);
}, function (error) { //jshint ignore: line
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to fetch repository labels");
console.log(error);
});
},
actions: {
isDirty() {
return this.get('isDirty');
},
onListCheckbox(id) {
let lists = this.get('config.lists');
let list = lists.findBy('id', id);
// restore the list of branches to the default state
lists.forEach(function (lst) {
Ember.set(lst, 'included', false);
});
if (list !== null) {
Ember.set(list, 'included', !list.included);
}
},
onLabelCheckbox(id) {
let lists = this.get('config.lists');
let list = lists.findBy('id', id);
if (list !== null) {
Ember.set(list, 'included', !list.included);
}
},
authStage2() {
let self = this;
self.set('config.userId', self.get("session.session.authenticated.user.id"));
self.set('authenticated', true);
self.set('busy', true);
let page = this.get('page');
self.get('sectionService').fetch(page, "owners", self.get('config'))
.then(function (owners) {
self.set('busy', false);
self.set('owners', owners);
self.getOwnerLists();
}, function (error) { //jshint ignore: line
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to fetch owners");
console.log(error);
});
},
auth() {
let self = this;
self.set('busy', true);
self.set('authenticated', false);
let target = "https://github.com/login/oauth/authorize?client_id=" + self.get('config.clientId') +
"&scope=repo&redirect_uri=" + encodeURIComponent(self.get('config.callbackUrl')) +
"&state=" + encodeURIComponent(window.location.href);
window.location.href = target;
},
onOwnerChange(thisOwner) {
this.set('isDirty', true);
this.set('config.owner', thisOwner);
this.set('config.repos', []);
this.set('config.lists', []);
this.getOwnerLists();
},
onRepoChange(thisRepo) {
this.set('isDirty', true);
this.set('config.repo', thisRepo);
this.set('config.lists', []);
this.getRepoLists();
},
onReportChange(thisReport) {
this.set('isDirty', true);
this.set('config.report', thisReport);
this.getReportLists();
},
onStateChange(thisState) {
this.set('config.state', thisState);
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
this.set('busy', true);
let thisLines = this.get('config.branchLines');
if (is.undefined(thisLines) || thisLines === "") {
this.set('config.branchLines', 30);
} else if (thisLines < 1) {
this.set('config.branchLines', 1);
} else if (thisLines > 100) {
this.set('config.branchLines', 100);
}
let self = this;
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('rawBody', '');
meta.set('config', JSON.stringify(this.get('config')));
meta.set('externalSource', true);
let thisReport = this.get('config.report');
this.get('sectionService').fetch(page, thisReport.id, this.get('config'))
.then(function (response) {
meta.set('rawBody', JSON.stringify(response));
self.set('busy', false);
self.attrs.onAction(page, meta);
}, function (reason) { //jshint ignore: line
self.set('busy', false);
self.attrs.onAction(page, meta);
});
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,65 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
isDirty: false,
pageBody: "",
didReceiveAttrs() {
this.set("pageBody", this.get("meta.rawBody"));
},
didInsertElement() {
let height = $(document).height() - $(".document-editor > .toolbar").height() - 130;
$("#section-markdown-editor, #section-markdown-preview").css("height", height);
this.renderPreview();
let self = this;
$("#section-markdown-editor").off("keyup").on("keyup", function () {
self.renderPreview();
self.set('isDirty', true);
});
},
willDestroyElement() {
$("#section-markdown-editor").off("keyup");
},
renderPreview() {
let md = window.markdownit({
linkify: true
});
let result = md.render(this.get("pageBody"));
$("#section-markdown-preview").html(result);
},
actions: {
isDirty() {
return this.get('isDirty');
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('rawBody', this.get("pageBody"));
this.attrs.onAction(page, meta);
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,193 @@
// 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 Ember from 'ember';
import NotifierMixin from '../../../mixins/notifier';
import TooltipMixin from '../../../mixins/tooltip';
import SectionMixin from '../../../mixins/section';
import netUtil from '../../../utils/net';
export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, {
sectionService: Ember.inject.service('section'),
isDirty: false,
waiting: false,
authenticated: false,
config: {},
items: {},
didReceiveAttrs() {
let config = {};
try {
config = JSON.parse(this.get('meta.config'));
} catch (e) {}
if (is.empty(config)) {
config = {
APIToken: "",
query: "",
max: 10,
group: null,
system: null
};
}
this.set('config', config);
if (this.get('config.APIToken').length > 0) {
this.send('auth');
}
},
willDestroyElement() {
this.destroyTooltips();
},
displayError(reason) {
if (netUtil.isAjaxAccessError(reason)) {
this.showNotification(`Unable to authenticate`);
} else {
this.showNotification(`Something went wrong, try again!`);
}
},
actions: {
isDirty() {
return this.get('isDirty');
},
auth() {
// missing data?
this.set('config.APIToken', this.get('config.APIToken').trim());
if (is.empty(this.get('config.APIToken'))) {
$("#papertrail-apitoken").addClass("error").focus();
console.log("auth token empty");
return;
}
let page = this.get('page');
let config = this.get('config');
let self = this;
this.set('waiting', true);
this.get('sectionService').fetch(page, "auth", config)
.then(function (response) {
self.set('authenticated', true);
self.set('items', response);
self.set('config.APIToken', '********'); // reset the api token once it has been sent to the host
console.log("auth token OK");
self.get('sectionService').fetch(page, "options", config)
.then(function (response) {
self.set('options', response);
self.set('waiting', false);
let options = self.get('options');
let group = _.findWhere(options.groups, { id: config.group.id });
if (is.not.undefined(group)) {
Ember.set(config, 'group', group);
}
}, function (reason) { //jshint ignore: line
self.set('authenticated', false);
self.set('waiting', false);
self.set('config.APIToken', ''); // clear the api token
self.displayError(reason);
console.log("get options call failed");
});
}, function (reason) { //jshint ignore: line
self.set('authenticated', false);
self.set('waiting', false);
self.set('config.APIToken', ''); // clear the api token
self.displayError(reason);
console.log("auth token invalid");
});
},
onGroupsChange(group) {
let config = this.get('config');
let page = this.get('page');
let self = this;
this.set('isDirty', true);
this.set('config.group', group);
this.set('waiting', true);
this.get('sectionService').fetch(page, "auth", config)
.then(function (response) {
self.set('waiting', false);
self.set('items', response);
}, function (reason) { //jshint ignore: line
self.set('waiting', false);
self.displayError(reason);
});
},
onSystemsChange(system) {
let config = this.get('config');
let page = this.get('page');
let self = this;
this.set('isDirty', true);
this.set('config.system', system);
this.set('waiting', true);
this.get('sectionService').fetch(page, "auth", config)
.then(function (response) {
self.set('waiting', false);
self.set('items', response);
}, function (reason) { //jshint ignore: line
self.set('waiting', false);
self.displayError(reason);
});
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
let self = this;
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('externalSource', true);
let config = this.get('config');
let max = 10;
if (is.number(parseInt(config.max))) {
max = parseInt(config.max);
}
Ember.set(config, 'max', max);
this.set('waiting', true);
this.get('sectionService').fetch(page, "auth", this.get('config'))
.then(function (response) {
self.set('items', response);
let items = self.get('items');
if (items.events.length > max) {
items.events = items.events.slice(0, max);
}
meta.set('config', JSON.stringify(config));
meta.set('rawBody', JSON.stringify(items));
self.set('waiting', false);
self.attrs.onAction(page, meta);
}, function (reason) { //jshint ignore: line
self.set('authenticated', false);
self.set('waiting', false);
self.showNotification(`Something went wrong, try again!`);
});
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,72 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
isDirty: false,
pageBody: "",
defaultTable: '<table class="wysiwyg-table" style="width: 100%;"><thead><tr><th><br></th><th><br></th><th><br></th><th><br></th></tr></thead><tbody><tr><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td></tr><tr><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td></tr><tr><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td><td style="width: 25.0000%;"><br></td></tr></tbody></table>',
didReceiveAttrs() {
this.set('pageBody', this.get('meta.rawBody'));
if (is.empty(this.get('pageBody'))) {
this.set('pageBody', this.get('defaultTable'));
}
},
didInsertElement() {
let self = this;
$('#table-editor').froalaEditor({
toolbarButtons: [],
height: this.get('editorHeight') - 260,
toolbarInline: true,
tableResizerOffset: 10
});
$('#table-editor').on('froalaEditor.contentChanged', function () {
self.set('isDirty', true);
});
},
willDestroyElement() {
$('#table-editor').froalaEditor('destroy');
$('#table-editor').off('froalaEditor.contentChanged');
},
actions: {
isDirty() {
return this.get('isDirty');
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
let page = this.get('page');
let meta = this.get('meta');
let body = $("#table-editor").froalaEditor('html.get', true);
page.set('title', title);
if (is.empty(body)) {
body = this.get('defaultTable');
}
meta.set('rawBody', body);
this.attrs.onAction(page, meta);
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,244 @@
// 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
/*global Trello*/
import Ember from 'ember';
import NotifierMixin from '../../../mixins/notifier';
import TooltipMixin from '../../../mixins/tooltip';
import SectionMixin from '../../../mixins/section';
export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, {
sectionService: Ember.inject.service('section'),
isDirty: false,
busy: false,
authenticated: false,
config: {},
boards: null,
noBoards: false,
appKey: "",
boardStyle: Ember.computed('config.board', function() {
let board = this.get('config.board');
if (is.null(board) || is.undefined(board)) {
return "#4c4c4c";
}
let color = board.prefs.backgroundColor;
return Ember.String.htmlSafe("background-color: " + color);
}),
didReceiveAttrs() {
let page = this.get('page');
let config = {};
let self = this;
try {
config = JSON.parse(this.get('meta.config'));
}
catch (e) {}
if (is.empty(config)) {
config = {
token: "",
user: null,
board: null,
lists: []
};
}
this.set('config', config);
this.get('sectionService').fetch(page, "config", {})
.then(function(s) {
self.set('appKey', s.appKey);
// On auth callback capture user token
let hashToken = window.location.hash;
if (is.not.undefined(hashToken) && is.not.null(hashToken)) {
let token = hashToken.replace("#token=", "");
if (is.not.empty(token)) {
self.set('config.token', token);
}
}
if (self.get('appKey') !== "" && self.get('config.token') !== "") {
self.send('auth');
}
else {
Ember.$.getScript("https://api.trello.com/1/client.js?key=" + self.get('appKey'), function() {
Trello.deauthorize();
});
}
}, function(error) { //jshint ignore: line
console.log(error);
});
},
willDestroyElement() {
this.destroyTooltips();
},
getBoardLists() {
this.set('busy', true);
let self = this;
let boards = this.get('boards');
let board = this.get('config.board');
let page = this.get('page');
if (is.null(boards) || is.undefined(boards) || boards.length === 0) {
this.set('noBoards', true);
return;
}
this.set('noBoards', false);
if (is.null(board) || is.undefined(board)) {
if (boards.length) {
board = boards[0];
this.set('config.board', board);
}
}
else {
this.set('config.board', boards.findBy('id', board.id));
}
this.get('sectionService').fetch(page, "lists", self.get('config'))
.then(function(lists) {
let savedLists = self.get('config.lists');
if (savedLists === null) {
savedLists = [];
}
lists.forEach(function(list) {
let saved = savedLists.findBy("id", list.id);
let included = true;
if (is.not.undefined(saved)) {
included = saved.included;
}
list.included = included;
});
self.set('config.lists', lists);
self.set('busy', false);
}, function(error) { //jshint ignore: line
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to fetch board lists");
console.log(error);
});
},
actions: {
isDirty() {
return this.get('isDirty');
},
onListCheckbox(id) {
let lists = this.get('config.lists');
let list = lists.findBy('id', id);
if (list !== null) {
Ember.set(list, 'included', !list.included);
}
},
auth() {
if (this.get('appKey') === "") {
$("#trello-appkey").addClass('error').focus();
this.set('authenticated', false);
return;
}
let self = this;
let page = this.get('page');
self.set('busy', true);
Ember.$.getScript("https://api.trello.com/1/client.js?key=" + this.get('appKey'), function() {
Trello.authorize({
type: "redirect",
interactive: true,
name: "Documize",
scope: {
read: true,
write: false
},
expiration: "never",
persist: true,
success: function() {
self.set('authenticated', true);
self.set('config.token', Trello.token());
self.set('busy', true);
Trello.members.get("me", function(user) {
self.set('config.user', user);
}, function(error) {
console.log(error);
});
self.get('sectionService').fetch(page, "boards", self.get('config'))
.then(function(boards) {
self.set('busy', false);
self.set('boards', boards);
self.getBoardLists();
}, function(error) { //jshint ignore: line
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to fetch boards");
console.log(error);
});
},
error: function(error) {
self.set('busy', false);
self.set('authenticated', false);
self.showNotification("Unable to authenticate");
console.log(error);
}
});
});
},
onBoardChange(board) {
this.set('isDirty', true);
this.set('config.board', board);
this.set('config.lists', []);
this.getBoardLists();
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
this.set('busy', true);
let self = this;
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('rawBody', '');
meta.set('config', JSON.stringify(this.get('config')));
meta.set('externalSource', true);
this.get('sectionService').fetch(page, "cards", this.get('config'))
.then(function(response) {
meta.set('rawBody', JSON.stringify(response));
self.set('busy', false);
self.attrs.onAction(page, meta);
}, function(reason) { //jshint ignore: line
self.set('busy', false);
self.attrs.onAction(page, meta);
});
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,114 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
pageBody: "",
appMeta: Ember.inject.service(),
didReceiveAttrs() {
this.set('pageBody', this.get('meta.rawBody'));
},
didInsertElement() {
let self = this;
let options = {
selector: "#rich-text-editor",
relative_urls: false,
cache_suffix: "?v=430",
browser_spellcheck: false,
gecko_spellcheck: false,
theme: "modern",
statusbar: false,
height: $(document).height() - $(".document-editor > .toolbar").height() - 200,
entity_encoding: "raw",
paste_data_images: true,
image_advtab: true,
image_caption: true,
media_live_embeds: true,
fontsize_formats: "8pt 10pt 12pt 14pt 16pt 18pt 20pt 22pt 24pt 26pt 28pt 30pt 32pt 34pt 36pt",
formats: {
bold: {
inline: 'b'
},
italic: {
inline: 'i'
}
},
extended_valid_elements: "b,i,b/strong,i/em",
plugins: [
'advlist autolink lists link image charmap print preview hr anchor pagebreak',
'searchreplace wordcount visualblocks visualchars code codesample fullscreen',
'insertdatetime media nonbreaking save table directionality',
'emoticons template paste textcolor colorpicker textpattern imagetools'
],
menu: {
edit: {
title: 'Edit',
items: 'undo redo | cut copy paste pastetext | selectall | searchreplace'
},
insert: {
title: 'Insert',
items: 'anchor link media | hr | charmap emoticons | blockquote'
},
format: {
title: 'Format',
items: 'bold italic underline strikethrough superscript subscript | formats fonts | removeformat'
},
table: {
title: 'Table',
items: 'inserttable tableprops deletetable | cell row column'
}
},
toolbar1: "formatselect fontselect fontsizeselect | bold italic underline | link unlink | image media | codesample | outdent indent | alignleft aligncenter alignright alignjustify | bullist numlist | forecolor backcolor",
save_onsavecallback: function() {
self.send('onAction');
}
};
if (typeof tinymce === 'undefined') {
$.getScript(this.get("appMeta").getBaseUrl("tinymce/tinymce.min.js?v=430"), function() {
window.tinymce.dom.Event.domLoaded = true;
tinymce.baseURL = "//" + window.location.host + "/tinymce";
tinymce.suffix = ".min";
tinymce.init(options);
});
} else {
tinymce.init(options);
}
},
willDestroyElement() {
tinymce.remove();
},
actions: {
isDirty() {
return is.not.undefined(tinymce) && is.not.undefined(tinymce.activeEditor) && tinymce.activeEditor.isDirty();
},
onCancel() {
this.attrs.onCancel();
},
onAction(title) {
let page = this.get('page');
let meta = this.get('meta');
page.set('title', title);
meta.set('rawBody', tinymce.activeEditor.getContent());
this.attrs.onAction(page, meta);
}
}
});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({});

View file

@ -0,0 +1,147 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
editUser: null,
deleteUser: null,
drop: null,
password: {},
didReceiveAttrs() {
this.users.forEach(user => {
user.set('me', user.get('id') === this.get('session.session.authenticated.user.id'));
});
},
willDestroyElement() {
let drop = this.get('drop');
if (is.not.null(drop)) {
drop.destroy();
}
},
actions: {
toggleActive(id) {
let user = this.users.findBy("id", id);
user.set('active', !user.get('active'));
this.attrs.onSave(user);
},
toggleEditor(id) {
let user = this.users.findBy("id", id);
user.set('editor', !user.get('editor'));
this.attrs.onSave(user);
},
toggleAdmin(id) {
let user = this.users.findBy("id", id);
user.set('admin', !user.get('admin'));
this.attrs.onSave(user);
},
edit(id) {
let self = this;
let user = this.users.findBy("id", id);
this.set('editUser', user.copy());
this.set('password', {
password: "",
confirmation: ""
});
$(".edit-user-dialog").css("display", "block");
$("input").removeClass("error");
let drop = new Drop({
target: $(".edit-button-" + id)[0],
content: $(".edit-user-dialog")[0],
classes: 'drop-theme-basic',
position: "bottom right",
openOn: "always",
tetherOptions: {
offset: "5px 0",
targetOffset: "10px 0"
},
remove: false
});
self.set('drop', drop);
drop.on('open', function () {
self.$("#edit-firstname").focus();
});
},
confirmDelete(id) {
let user = this.users.findBy("id", id);
this.set('deleteUser', user);
$(".delete-user-dialog").css("display", "block");
let drop = new Drop({
target: $(".delete-button-" + id)[0],
content: $(".delete-user-dialog")[0],
classes: 'drop-theme-basic',
position: "bottom right",
openOn: "always",
tetherOptions: {
offset: "5px 0",
targetOffset: "10px 0"
},
remove: false
});
this.set('drop', drop);
},
cancel() {
let drop = this.get('drop');
drop.close();
},
save() {
let user = this.get('editUser');
let password = this.get('password');
if (is.empty(user.get('firstname'))) {
$("#edit-firstname").addClass("error").focus();
return;
}
if (is.empty(user.get('lastname'))) {
$("#edit-lastname").addClass("error").focus();
return;
}
if (is.empty(user.get('email'))) {
$("#edit-email").addClass("error").focus();
return;
}
let drop = this.get('drop');
drop.close();
this.attrs.onSave(user);
if (is.not.empty(password.password) && is.not.empty(password.confirmation) &&
password.password === password.confirmation) {
this.attrs.onPassword(user, password.password);
}
},
delete() {
let drop = this.get('drop');
drop.close();
let user = this.get('deleteUser');
this.attrs.onDelete(user);
}
}
});

View file

@ -0,0 +1,46 @@
// 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 Ember from 'ember';
export default Ember.Component.extend({
cssClass: "",
content: [],
prompt: null,
optionValuePath: 'id',
optionLabelPath: 'name',
action: Ember.K, // action to fire on change
// shadow the passed-in `selection` to avoid
// leaking changes to it via a 2-way binding
_selection: Ember.computed.reads('selection'),
actions: {
change() {
const selectEl = this.$('select')[0];
const selectedIndex = selectEl.selectedIndex;
const content = this.get('content');
// decrement index by 1 if we have a prompt
const hasPrompt = !!this.get('prompt');
const contentIndex = hasPrompt ? selectedIndex - 1 : selectedIndex;
const selection = content[contentIndex];
// set the local, shadowed selection to avoid leaking
// changes to `selection` out via 2-way binding
this.set('_selection', selection);
const changeCallback = this.get('action');
changeCallback(selection);
}
}
});

View file

@ -0,0 +1,52 @@
// 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 Ember from 'ember';
import miscUtil from '../utils/misc';
export default Ember.Component.extend({
notifications: [],
didInsertElement() {
this.eventBus.subscribe('notifyUser', this, 'showNotification');
},
willDestroyElement() {
this.eventBus.unsubscribe('notifyUser');
},
showNotification(msg) {
let self = this;
let notifications = this.get('notifications');
notifications.pushObject(msg);
this.set('notifications', notifications);
let elem = this.$(".user-notification")[0];
Ember.run(() => {
self.$(elem).show();
// FIXME: need a more robust solution
miscUtil.interval(function() {
let notifications = self.get('notifications');
if (notifications.length > 0) {
notifications.removeAt(0);
self.set('notifications', notifications);
}
if (notifications.length === 0) {
self.$(elem).hide();
}
}, 2500, self.get('notifications').length);
});
},
});

View file

@ -0,0 +1,55 @@
// 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
// Copyright (c) 2015 Documize Inc.
import Ember from 'ember';
import NotifierMixin from '../mixins/notifier';
export default Ember.Component.extend(NotifierMixin, {
drop1: null,
didInsertElement() {
this._super(...arguments);
new Tooltip({
target: document.getElementById("sample-1")
});
new Tooltip({
target: document.getElementById("sample-2")
});
new Tooltip({
target: document.getElementById("sample-3")
});
new Tooltip({
target: document.getElementById("sample-4")
});
let drop1 = new Drop({
target: document.getElementById('sample-dropdown-1'),
content: document.getElementById('sample-dropdown-content-1'),
classes: 'drop-theme-basic',
position: 'bottom middle',
openOn: 'click'
});
this.set('drop1', drop1);
},
actions: {
dropClose() {
this.get('drop1').close();
},
addFolder() {
console.log("adding folder!");
return true;
}
}
});

View file

View file

@ -0,0 +1,113 @@
// 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 Ember from 'ember';
export function documentFileIcon(params) {
let fileExtension = params[0].toLowerCase();
let html = "unknown.png";
switch (fileExtension) {
case "7z":
case "7zip":
case "zipx":
case "zip":
case "war":
case "rar":
case "tar":
case "gzip":
html = "zip.png";
break;
case "avi":
case "mov":
case "mp4":
html = "avi.png";
break;
case "html":
html = "html.png";
break;
case "css":
html = "css.png";
break;
case "bat":
case "sh":
case "ps":
case "ps1":
case "cs":
case "vb":
case "php":
case "java":
case "go":
case "js":
case "rb":
case "py":
case "json":
case "config":
case "xml":
html = "code.png";
break;
case "bin":
case "exe":
case "dll":
html = "bin.png";
break;
case "bmp":
case "jpg":
case "jpeg":
case "gif":
case "tiff":
case "svg":
case "png":
case "psd":
case "ai":
case "sketch":
html = "image.png";
break;
case "xls":
case "xlsx":
case "csv":
html = "xls.png";
break;
case "log":
case "txt":
case "md":
case "markdown":
html = "txt.png";
break;
case "mp3":
case "wav":
html = "mp3.png";
break;
case "pdf":
html = "pdf.png";
break;
case "ppt":
case "pptx":
html = "ppt.png";
break;
case "vsd":
case "vsdx":
html = "vsd.png";
break;
case "doc":
case "docx":
html = "doc.png";
break;
case "xslt":
}
return new Ember.Handlebars.SafeString(html);
}
export default Ember.Helper.helper(documentFileIcon);

View file

@ -0,0 +1,19 @@
// 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 Ember from 'ember';
import dateUtil from '../utils/date';
export function formattedDate(params) {
return dateUtil.toIsoDate(params[0], params[1]);
}
export default Ember.Helper.helper(formattedDate);

View file

@ -0,0 +1,19 @@
// 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 Ember from 'ember';
// Usage: {{generate-id 'admin-' 123}}
export default Ember.Helper.helper(function(params) {
let prefix = params[0];
let id = params[1];
return prefix + "-" + id;
});

View file

@ -0,0 +1,17 @@
// 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 Ember from 'ember';
// Usage: {{is-equal item selection}}
export default Ember.Helper.helper(function([leftSide, rightSide]) {
return leftSide === rightSide;
});

17
app/app/helpers/is-not.js Normal file
View file

@ -0,0 +1,17 @@
// 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 Ember from 'ember';
// Usage: {{is-not selection}}
export default Ember.Helper.helper(function([value]) {
return !value;
});

View file

@ -0,0 +1,16 @@
// 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 Ember from 'ember';
export default Ember.Helper.helper(function([object, path]) {
return Ember.get(object, path);
});

View file

@ -0,0 +1,20 @@
// 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 Ember from 'ember';
import dateUtil from '../utils/date';
// {{time-ago createdAt}}
export function timeAgo(params) {
return dateUtil.timeAgo(params[0]);
}
export default Ember.Helper.helper(timeAgo);

View file

@ -0,0 +1,22 @@
// 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 Ember from 'ember';
// {{user-initials firstname lastname}}
export function userInitials(params) {
let firstname = params[0];
let lastname = params[1];
return (firstname.substring(0, 1) + lastname.substring(0, 1)).toUpperCase();
}
export default Ember.Helper.helper(userInitials);

32
app/app/index.html Normal file
View file

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
{{content-for 'head'}}
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Documize</title>
<meta property="dbname" content="{{.DBname}}" />
<meta property="dbhash" content="{{.DBhash}}" />
<meta name="author" content="Documize" />
<meta name="description" content="Documize">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<link rel="shortcut icon" href="/favicon.ico?v=1.1" />
<link rel="icon" type="image/png" href="/favicon-32x32.png?v=1.1" sizes="32x32" />
<link rel="stylesheet" href="assets/vendor.css">
<link rel="stylesheet" href="assets/documize.css"> {{content-for 'head-footer'}}
</head>
<body>
{{content-for 'body'}}
<script src="assets/vendor.js"></script>
<script src="assets/documize.js"></script>
<script src="codemirror/lib/codemirror.js"></script>
<script src="codemirror/mode/meta.js"></script>
<script src="codemirror/addon/mode/loadmode.js"></script>
<script src="codemirror/addon/runmode/runmode.js"></script>
<script src="codemirror/addon/runmode/colorize.js"></script>
{{content-for 'body-footer'}}
</body>
</html>

View file

@ -0,0 +1,28 @@
// 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
export function initialize( /*application*/ ) {
// address insecure jquery defaults (kudos: @nathanhammond)
$.globalEval = function() {};
$.ajaxSetup({
crossDomain: true,
converters: {
'text script': text => text
}
});
Dropzone.autoDiscover = false;
}
export default {
name: 'application',
initialize: initialize
};

View file

@ -0,0 +1,22 @@
// 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
export function initialize(application) {
application.inject('route', 'audit', 'service:audit');
application.inject('controller', 'audit', 'service:audit');
application.inject('component', 'audit', 'service:audit');
}
export default {
name: 'audit',
after: 'session',
initialize: initialize
};

View file

@ -0,0 +1,22 @@
// 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
export function initialize(application) {
application.inject('route', 'browser', 'service:browser');
application.inject('controller', 'browser', 'service:browser');
application.inject('component', 'browser', 'service:browser');
}
export default {
name: 'browser',
after: "session",
initialize: initialize
};

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
export function initialize(application) {
application.inject('route', 'eventBus', 'service:eventBus');
application.inject('component', 'eventBus', 'service:eventBus');
application.inject('controller', 'eventBus', 'service:eventBus');
application.inject('mixin', 'eventBus', 'service:eventBus');
}
export default {
name: 'eventBus',
after: 'session',
initialize: initialize
};

View file

@ -0,0 +1,22 @@
// 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
export function initialize(application) {
application.inject('route', 'logger', 'service:logger');
application.inject('component', 'logger', 'service:logger');
application.inject('controller', 'logger', 'service:logger');
}
export default {
name: 'logger',
after: 'session',
initialize: initialize
};

View file

@ -0,0 +1,24 @@
// 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
export function initialize(application) {
application.inject('route', 'session', 'service:session');
application.inject('controller', 'session', 'service:session');
application.inject('component', 'session', 'service:session');
application.inject('mixin', 'session', 'service:session');
}
export default {
name: 'session',
after: 'application',
before: 'audit',
initialize: initialize
};

View file

@ -0,0 +1,24 @@
// 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 Ember from 'ember';
export default Ember.Mixin.create({
showNotification(msg) {
this.eventBus.publish('notifyUser', msg);
},
actions: {
showNotification(msg) {
this.eventBus.publish('notifyUser', msg);
}
}
});

26
app/app/mixins/section.js Normal file
View file

@ -0,0 +1,26 @@
// 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 Ember from 'ember';
export default Ember.Mixin.create({
isReadonly: function () {
if (this.get('page.userId') === this.get('session.session.authenticated.user.id')) {
return undefined;
} else {
return "readonly";
}
}.property('page'),
isMine: function () {
return this.get('page.userId') === this.get('session.session.authenticated.user.id');
}.property('page')
});

42
app/app/mixins/tooltip.js Normal file
View file

@ -0,0 +1,42 @@
// 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 Ember from 'ember';
export default Ember.Mixin.create({
tooltips: [],
addTooltip(elem) {
if(elem == null) {
return;
}
let t = new Tooltip({
target: elem
});
let tt = this.get('tooltips');
tt.push(t);
},
destroyTooltips() {
let tt = this.get('tooltips');
tt.forEach(t => {
t.destroy();
});
tt.length = 0;
this.set('tooltips', tt);
}
});

0
app/app/models/.gitkeep Normal file
View file

View file

@ -0,0 +1,35 @@
// 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 Ember from 'ember';
export default Ember.Controller.extend({
userService: Ember.inject.service('user'),
email: "",
sayThanks: false,
actions: {
forgot: function () {
var self = this;
var email = this.get('email');
if (is.empty(email)) {
$("#email").addClass("error").focus();
return;
}
self.set('sayThanks', true);
this.set('email', '');
this.get('userService').forgotPassword(email);
}
}
});

View file

@ -0,0 +1,19 @@
// 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 Ember from 'ember';
export default Ember.Route.extend({
setupController(controller, model) {
controller.set('model', model);
controller.set('sayThanks', false);
}
});

View file

@ -0,0 +1,22 @@
<div class="auth-box">
<div class="logo">
<img src="assets/img/logo-color.png" title="Documize" alt="Documize" class="responsive-img" />
</div>
<div class="login-form">
<form {{action 'forgot' on="submit"}}>
{{#if sayThanks}}
<div class="reset-thanks margin-bottom-30">Thanks. Check your email for instructions.</div>
{{else}}
<div class="input-control">
<label>Email</label>
{{focus-input type="email" value=email id="email"}}
</div>
<div class="clearfix" />
<div class="margin-top-10 margin-bottom-20">
<button type="submit" class="regular-button button-blue">Reset</button>
</div>
{{/if}}
{{#link-to 'auth.login'}}Sign In{{/link-to}}
</form>
</div>
</div>

View file

@ -0,0 +1,48 @@
// 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 Ember from 'ember';
export default Ember.Controller.extend({
email: "",
password: "",
invalidCredentials: false,
session: Ember.inject.service('session'),
audit: Ember.inject.service('audit'),
reset() {
this.setProperties({
email: "",
password: ""
});
let dbhash = document.head.querySelector("[property=dbhash]").content;
if (dbhash.length > 0 && dbhash !== "{{.DBhash}}") {
this.transitionToRoute('setup');
}
},
actions: {
login() {
let creds = this.getProperties('email', 'password');
this.get('session').authenticate('authenticator:documize', creds)
.then((response) => {
this.get('audit').record("logged-in");
this.transitionToRoute('folders.folder');
return response;
}).catch(() => {
this.set('invalidCredentials', true);
});
}
}
});

View file

@ -0,0 +1,20 @@
// 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 Ember from 'ember';
export default Ember.Route.extend({
setupController: function (controller, model) {
controller.set('model', model);
controller.reset();
this.browser.setTitleAsPhrase("Login");
}
});

View file

@ -0,0 +1,23 @@
<div class="auth-box">
<div class="logo">
<img src="assets/img/logo-color.png" title="Documize" alt="Documize" class="responsive-img" />
</div>
<div class="login-form">
<form id="login-form" {{action 'login' on="submit"}}>
<div class="input-control">
<label>Email</label>
{{focus-input type="email" value=email id="authEmail"}}
</div>
<div class="input-control">
<label>Password</label>
{{input type="password" value=password id="authPassword"}}
</div>
<div class="clearfix" />
<div class="margin-top-10 margin-bottom-20">
<button type="submit" class="regular-button button-blue">Sign in</button>
<span class="{{unless invalidCredentials "hide"}} color-red margin-left-20">Invalid credentials</span>
</div>
{{#link-to 'auth.forgot'}}Forgot your password?{{/link-to}}
</form>
</div>
</div>

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Controller.extend({});

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 Ember from 'ember';
import config from 'documize/config/environment';
export default Ember.Route.extend({
session: Ember.inject.service(),
appMeta: Ember.inject.service(),
activate: function () {
this.get('session').invalidate();
this.audit.record("logged-in");
this.audit.stop();
if (config.environment === 'test') {
this.transitionTo('auth.login');
} else {
window.document.location = this.get("appMeta.allowAnonymousAccess") ? "/" : "/auth/login";
}
}
});

View file

@ -0,0 +1 @@
{{outlet}}

View file

@ -0,0 +1,48 @@
// 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 Ember from 'ember';
export default Ember.Controller.extend({
userService: Ember.inject.service('user'),
password: "",
passwordConfirm: "",
mustMatch: false,
actions: {
reset() {
let self = this;
let password = this.get('password');
let passwordConfirm = this.get('passwordConfirm');
if (is.empty(password)) {
$("#newPassword").addClass("error").focus();
return;
}
if (is.empty(passwordConfirm)) {
$("#passwordConfirm").addClass("error").focus();
return;
}
if (is.not.equal(password, passwordConfirm)) {
$("#newPassword").addClass("error").focus();
$("#passwordConfirm").addClass("error");
self.set('mustMatch', true);
return;
}
this.get('userService').resetPassword(self.model, password).then(function (response) { /* jshint ignore:line */
self.transitionToRoute('auth.login');
});
}
}
});

View file

@ -0,0 +1,18 @@
// 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 Ember from 'ember';
export default Ember.Route.extend({
model: function (params) {
return params.token;
},
});

View file

@ -0,0 +1,24 @@
<div class="auth-box">
<div class="logo">
<img src="assets/img/logo-color.png" title="Documize" alt="Documize" class="responsive-img" />
</div>
<div class="login-form">
<form {{action 'reset' on="submit"}}>
<div class="input-control">
<label>New Password</label>
<div class="tip">Choose a strong password</div>
{{focus-input type="password" value=password id="newPassword"}}
</div>
<div class="input-control">
<label>Confirm Password</label>
<div class="tip">Please type your new password again</div>
{{input type="password" value=passwordConfirm id="passwordConfirm"}}
</div>
<div class="clearfix" />
<div class="margin-top-10 margin-bottom-20">
<button type="submit" class="regular-button button-blue">Reset</button>
<span class="{{unless mustMatch "hide"}} color-red margin-left-20">Passwords must match</span>
</div>
</form>
</div>
</div>

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Route.extend({});

View file

@ -0,0 +1,14 @@
// 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 Ember from 'ember';
export default Ember.Controller.extend({});

View file

@ -0,0 +1,28 @@
// 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 Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model: function (params) {
this.set('folderId', params.id);
this.set('slug', params.slug);
this.set('serial', params.serial);
},
setupController(controller, model) {
controller.set('model', model);
controller.set('serial', this.serial);
controller.set('slug', this.slug);
controller.set('folderId', this.folderId);
}
});

Some files were not shown because too many files have changed in this diff Show more