1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-27 17:19:42 +02:00

markdown links support, 404 ember page added

This commit is contained in:
Harvey Kandola 2016-10-28 19:21:54 -07:00
parent 7c2051cc7a
commit 991b1a2740
14 changed files with 207 additions and 146 deletions

View file

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

View file

@ -32,21 +32,20 @@ export default Ember.Component.extend(TooltipMixin, {
{ label: 'Search', selected: false } { label: 'Search', selected: false }
], ],
showSections: Ember.computed('tabs.@each.selected', function() { showSections: Ember.computed('tabs.@each.selected', function () {
return this.get('tabs').findBy('label', 'Section').selected; return this.get('tabs').findBy('label', 'Section').selected;
}), }),
showAttachments: Ember.computed('tabs.@each.selected', function() { showAttachments: Ember.computed('tabs.@each.selected', function () {
return this.get('tabs').findBy('label', 'Attachment').selected; return this.get('tabs').findBy('label', 'Attachment').selected;
}), }),
showSearch: Ember.computed('tabs.@each.selected', function() { showSearch: Ember.computed('tabs.@each.selected', function () {
return this.get('tabs').findBy('label', 'Search').selected; return this.get('tabs').findBy('label', 'Search').selected;
}), }),
hasMatches: Ember.computed('matches', function() { hasMatches: Ember.computed('matches', function () {
let m = this.get('matches'); let m = this.get('matches');
return m.documents.length || m.pages.length || m.attachments.length; return m.documents.length || m.pages.length || m.attachments.length;
}), }),
init() { init() {
this._super(...arguments); this._super(...arguments);
let self = this; let self = this;
@ -64,6 +63,7 @@ export default Ember.Component.extend(TooltipMixin, {
didRender() { didRender() {
this.addTooltip(document.getElementById("content-linker-button")); this.addTooltip(document.getElementById("content-linker-button"));
this.addTooltip(document.getElementById("content-counter-button"));
}, },
willDestroyElement() { willDestroyElement() {

View file

@ -1,17 +1,24 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved. // Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
// //
// This software (Documize Community Edition) is licensed under // This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
// //
// You can operate outside the AGPL restrictions by purchasing // You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license // Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>. // by contacting <sales@documize.com>.
// //
// https://documize.com // https://documize.com
import Ember from 'ember'; import Ember from 'ember';
import miscUtil from '../../../utils/misc';
const {
inject: { service }
} = Ember;
export default Ember.Component.extend({ export default Ember.Component.extend({
link: service(),
isDirty: false, isDirty: false,
pageBody: "", pageBody: "",
@ -45,6 +52,13 @@ export default Ember.Component.extend({
}, },
actions: { actions: {
onInsertLink(link) {
let linkMarkdown = this.get('link').buildLink(link);
miscUtil.insertAtCursor($("#section-markdown-editor")[0], linkMarkdown);
return true;
},
isDirty() { isDirty() {
return this.get('isDirty'); return this.get('isDirty');
}, },
@ -62,4 +76,4 @@ export default Ember.Component.extend({
this.attrs.onAction(page, meta); this.attrs.onAction(page, meta);
} }
} }
}); });

View file

@ -16,7 +16,7 @@ const {
} = Ember; } = Ember;
export default Ember.Component.extend({ export default Ember.Component.extend({
appMeta: Ember.inject.service(), appMeta: service(),
link: service(), link: service(),
pageBody: "", pageBody: "",

View file

@ -1,11 +1,11 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved. // Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
// //
// This software (Documize Community Edition) is licensed under // This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
// //
// You can operate outside the AGPL restrictions by purchasing // You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license // Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>. // by contacting <sales@documize.com>.
// //
// https://documize.com // https://documize.com
@ -19,4 +19,13 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
this.audit.record("viewed-document"); this.audit.record("viewed-document");
return this.get('documentService').getDocument(params.document_id); return this.get('documentService').getDocument(params.document_id);
}, },
});
actions: {
error(error /*, transition*/ ) {
if (error) {
this.transitionTo('/not-found');
return false;
}
}
}
});

View file

@ -1,11 +1,11 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved. // Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
// //
// This software (Documize Community Edition) is licensed under // This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
// //
// You can operate outside the AGPL restrictions by purchasing // You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license // Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>. // by contacting <sales@documize.com>.
// //
// https://documize.com // https://documize.com
@ -13,8 +13,7 @@ import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, { export default Ember.Route.extend(AuthenticatedRouteMixin, {
beforeModel() {
beforeModel: function () {
this.transitionTo('folders'); this.transitionTo('folders');
} }
}); });

View file

@ -101,5 +101,5 @@ export default Router.map(function () {
path: '/*wildcard' path: '/*wildcard'
}); });
this.route('pods', function () {}); // this.route('pods', function () {});
}); });

View file

@ -107,7 +107,7 @@ export default Ember.Service.extend({
// handle section link // handle section link
if (link.linkType === "section") { if (link.linkType === "section") {
let options = {}; let options = {};
options['page'] = link.targetId; options['page'] = link.targetId;
router.transitionTo('document', link.folderId, folderSlug, link.documentId, documentSlug, { queryParams: options }); router.transitionTo('document', link.folderId, folderSlug, link.documentId, documentSlug, { queryParams: options });
return; return;
} }
@ -127,12 +127,5 @@ export default Ember.Service.extend({
}); });
/* /*
when attachment deleted: doc meta to show inbound and outbound links.
mark as orphan references where link.documentid = document.refId
permission checks:
can view space
can view document
Markdown editor support
*/ */

View file

@ -1,6 +1,21 @@
.edit-tools { .edit-tools {
margin: 0 0 0 20px; margin: 0 0 0 20px;
min-height: 600px; min-height: 600px;
> .toolbar {
margin: 0;
padding: 0;
> .item {
list-style-type: none;
margin: 0 0 20px;
}
}
}
.content-counter-dialog {
width: 200px;
height: 200px;
} }
.content-linker-dialog { .content-linker-dialog {

View file

@ -1,8 +1,12 @@
<div class="edit-tools"> <div class="edit-tools">
<div class="square-button-mono button-gray" id="content-linker-button" data-tooltip="Insert content link" data-tooltip-position="left middle"> <ul class="toolbar">
<i class="material-icons color-white">link</i> <li class="item">
</div> <div class="square-button-mono button-gray" id="content-linker-button" data-tooltip="Reference link" data-tooltip-position="left middle">
<i class="material-icons color-white">link</i>
</div>
</li>
</ul>
{{#dropdown-dialog target="content-linker-button" position="bottom right" button="Insert" color="flat-blue" onAction=(action 'onInsertLink')}} {{#dropdown-dialog target="content-linker-button" position="bottom right" button="Insert" color="flat-blue" onAction=(action 'onInsertLink')}}
<div class="content-linker-dialog"> <div class="content-linker-dialog">

View file

@ -1,13 +1,16 @@
{{#section/base-editor document=document folder=folder page=page isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} {{#section/base-editor document=document folder=folder page=page isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}}
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-xs-6"> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
{{focus-textarea id="section-markdown-editor" class="mousetrap bordered" value=pageBody}} {{focus-textarea id="section-markdown-editor" class="mousetrap bordered" value=pageBody}}
</div> </div>
<div class="col-xs-6"> <div class="col-xs-5 col-sm-5 col-md-5 col-lg-5">
<div id="section-markdown-preview" class="mousetrap bordered wysiwyg"> <div id="section-markdown-preview" class="mousetrap bordered wysiwyg">
</div> </div>
</div> </div>
<div class="col-xs-1 col-sm-1 col-md-1 col-lg-1">
{{document/edit-tools document=document folder=folder page=page onInsertLink=(action 'onInsertLink')}}
</div>
</div> </div>
</div> </div>
{{/section/base-editor}} {{/section/base-editor}}

View file

@ -1,11 +1,13 @@
{{#section/base-editor document=document folder=folder page=page isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} {{#section/base-editor document=document folder=folder page=page isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}}
<div class="container-fluid">
<div class="row">
<div class="col-xs-11 col-sm-11 col-md-11 col-lg-11">
{{focus-textarea value=pageBody id="rich-text-editor" class="mousetrap"}}
</div>
<div class="pull-left width-96"> <div class="col-xs-1 col-sm-1 col-md-1 col-lg-1">
{{focus-textarea value=pageBody id="rich-text-editor" class="mousetrap"}} {{document/edit-tools document=document folder=folder page=page onInsertLink=(action 'onInsertLink')}}
</div>
</div>
</div> </div>
<div class="pull-left">
{{document/edit-tools document=document folder=folder page=page onInsertLink=(action 'onInsertLink')}}
</div>
{{/section/base-editor}} {{/section/base-editor}}

View file

@ -1,31 +1,31 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved. // Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
// //
// This software (Documize Community Edition) is licensed under // This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
// //
// You can operate outside the AGPL restrictions by purchasing // You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license // Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>. // by contacting <sales@documize.com>.
// //
// https://documize.com // https://documize.com
// from http://thecodeship.com/web-development/alternative-to-javascript-evil-setinterval/ // from http://thecodeship.com/web-development/alternative-to-javascript-evil-setinterval/
function interval(func, wait, times) { function interval(func, wait, times) {
var interv = function(w, t) { var interv = function (w, t) {
return function() { return function () {
if (typeof t === "undefined" || t-- > 0) { if (typeof t === "undefined" || t-- > 0) {
setTimeout(interv, w); setTimeout(interv, w);
try { try {
func.call(null); func.call(null);
} catch (e) { } catch (e) {
t = 0; t = 0;
throw e.toString(); throw e.toString();
} }
} }
}; };
}(wait, times); }(wait, times);
setTimeout(interv, wait); setTimeout(interv, wait);
} }
// Function wrapping code. // Function wrapping code.
@ -35,12 +35,34 @@ function interval(func, wait, times) {
// e.g. var fun1 = wrapFunction(sayStuff, this, ["Hello, world!"]); // e.g. var fun1 = wrapFunction(sayStuff, this, ["Hello, world!"]);
// http://stackoverflow.com/questions/899102/how-do-i-store-javascript-functions-in-a-queue-for-them-to-be-executed-eventuall // http://stackoverflow.com/questions/899102/how-do-i-store-javascript-functions-in-a-queue-for-them-to-be-executed-eventuall
function wrapFunction(fn, context, params) { function wrapFunction(fn, context, params) {
return function() { return function () {
fn.apply(context, params); fn.apply(context, params);
}; };
}
function insertAtCursor(myField, myValue) {
//IE support
if (document.selection) {
myField.focus();
let sel = document.selection.createRange();
sel.text = myValue;
}
//MOZILLA and others
else if (myField.selectionStart || myField.selectionStart === '0') {
var startPos = myField.selectionStart;
var endPos = myField.selectionEnd;
myField.value = myField.value.substring(0, startPos) +
myValue +
myField.value.substring(endPos, myField.value.length);
myField.selectionStart = startPos + myValue.length;
myField.selectionEnd = startPos + myValue.length;
} else {
myField.value += myValue;
}
} }
export default { export default {
interval, interval,
wrapFunction wrapFunction,
}; insertAtCursor
};

View file

@ -13,50 +13,50 @@
var EmberApp = require('ember-cli/lib/broccoli/ember-app'); var EmberApp = require('ember-cli/lib/broccoli/ember-app');
var isDevelopment = EmberApp.env() === 'development'; var isDevelopment = EmberApp.env() === 'development';
module.exports = function(defaults) { module.exports = function (defaults) {
var app = new EmberApp(defaults, { var app = new EmberApp(defaults, {
fingerprint: { fingerprint: {
enabled: true, enabled: true,
extensions: ['js', 'css'], extensions: ['js', 'css'],
exclude: ['tinymce/**', 'codemirror/**'] exclude: ['tinymce/**', 'codemirror/**']
}, },
minifyJS: { minifyJS: {
enabled: !isDevelopment, enabled: !isDevelopment,
options: { options: {
exclude: ['tinymce/**', 'codemirror/**'] exclude: ['tinymce/**', 'codemirror/**']
} }
}, },
minifyCSS: { minifyCSS: {
enabled: !isDevelopment, enabled: !isDevelopment,
options: { options: {
exclude: ['tinymce/**', 'codemirror/**'] exclude: ['tinymce/**', 'codemirror/**']
} }
}, },
sourcemaps: { sourcemaps: {
enabled: isDevelopment, enabled: isDevelopment,
extensions: ['js'] extensions: ['js']
} }
}); });
app.import('vendor/dropzone.js'); app.import('vendor/dropzone.js');
app.import('vendor/is.js'); app.import('vendor/is.js');
app.import('vendor/md5.js'); app.import('vendor/md5.js');
app.import('vendor/moment.js'); app.import('vendor/moment.js');
app.import('vendor/mousetrap.js'); app.import('vendor/mousetrap.js');
app.import('vendor/table-editor.min.js'); app.import('vendor/table-editor.min.js');
app.import('vendor/underscore.js'); app.import('vendor/underscore.js');
app.import('vendor/bootstrap.css'); app.import('vendor/bootstrap.css');
app.import('vendor/tether.js'); app.import('vendor/tether.js');
app.import('vendor/drop.js'); app.import('vendor/drop.js');
app.import('vendor/tooltip.js'); app.import('vendor/tooltip.js');
app.import('vendor/markdown-it.min.js'); app.import('vendor/markdown-it.min.js');
app.import('vendor/dragula.js'); app.import('vendor/dragula.js');
app.import('vendor/datetimepicker.min.js'); app.import('vendor/datetimepicker.min.js');
app.import('vendor/hoverIntent.js'); app.import('vendor/hoverIntent.js');
app.import('vendor/waypoints.js'); app.import('vendor/waypoints.js');
return app.toTree(); return app.toTree();
}; };