diff --git a/app/.jshintrc b/app/.jshintrc index 767b6edf..cee569be 100644 --- a/app/.jshintrc +++ b/app/.jshintrc @@ -18,7 +18,8 @@ "Drop", "Dropzone", "dragula", - "datetimepicker" + "datetimepicker", + "Waypoint" ], "browser": true, "boss": true, diff --git a/app/app/components/document/document-sidebar-toc.js b/app/app/components/document/document-sidebar-toc.js index 3cc285b0..8151cd59 100644 --- a/app/app/components/document/document-sidebar-toc.js +++ b/app/app/components/document/document-sidebar-toc.js @@ -46,19 +46,19 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { 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'); - } - }); + // let s = $(".document-structure"); + // let pos = s.position(); + // + // $(window).scroll(_.throttle(function() { + // let windowpos = $(window).scrollTop(); + // if (windowpos - 200 >= pos.top) { + // s.addClass("stuck-toc"); + // s.css('width', s.parent().width()); + // } else { + // s.removeClass("stuck-toc"); + // s.css('width', 'auto'); + // } + // }, 50)); }, willDestroyElement() { diff --git a/app/app/components/document/document-sidebar.js b/app/app/components/document/document-sidebar.js index 0c1107b1..3deaee27 100644 --- a/app/app/components/document/document-sidebar.js +++ b/app/app/components/document/document-sidebar.js @@ -11,23 +11,41 @@ import Ember from 'ember'; import TooltipMixin from '../../mixins/tooltip'; +import NotifierMixin from '../../mixins/notifier'; -export default Ember.Component.extend(TooltipMixin, { +export default Ember.Component.extend(TooltipMixin, NotifierMixin, { documentService: Ember.inject.service('document'), document: {}, folder: {}, showToc: true, showViews: false, showContributions: false, + showSections: false, didRender() { if (this.session.authenticated) { this.addTooltip(document.getElementById("owner-avatar")); + this.addTooltip(document.getElementById("section-tool")); } }, - willDestroyElements() { - this.destroyElements(); + didInsertElement() { + let s = $(".section-tool"); + let pos = s.position(); + + $(window).scroll(_.throttle(function() { + let windowpos = $(window).scrollTop(); + if (windowpos - 200 >= pos.top) { + s.addClass("stuck-tool"); + s.css('left', parseInt($(".zone-sidebar").css('width')) - 18 + 'px'); + } else { + s.removeClass("stuck-tool"); + } + }, 50)); + }, + + willDestroyElement() { + this.destroyTooltips(); }, actions: { @@ -45,27 +63,40 @@ export default Ember.Component.extend(TooltipMixin, { return this.attrs.gotoPage(id); }, - // close dialog - close() { - return true; - }, - showToc() { this.set('showToc', true); this.set('showViews', false); this.set('showContributions', false); + this.set('showSections', false); }, showViews() { this.set('showToc', false); this.set('showViews', true); this.set('showContributions', false); + this.set('showSections', false); }, showContributions() { this.set('showToc', false); this.set('showViews', false); this.set('showContributions', true); + this.set('showSections', false); + }, + + showSections() { + this.set('showToc', false); + this.set('showViews', false); + this.set('showContributions', false); + this.set('showSections', true); + }, + + onCancel() { + this.send('showToc'); + }, + + onAddSection(section) { + this.attrs.onAddSection(section); } } }); diff --git a/app/app/components/document/document-toolbar.js b/app/app/components/document/document-toolbar.js index 1fec9d38..4f19a868 100644 --- a/app/app/components/document/document-toolbar.js +++ b/app/app/components/document/document-toolbar.js @@ -35,7 +35,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { 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")); @@ -139,4 +138,4 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { return true; }, } -}); \ No newline at end of file +}); diff --git a/app/app/components/document/document-view.js b/app/app/components/document/document-view.js index ed539429..5efb80c9 100644 --- a/app/app/components/document/document-view.js +++ b/app/app/components/document/document-view.js @@ -133,4 +133,4 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.get('documentService').save(doc); } } -}); \ No newline at end of file +}); diff --git a/app/app/components/document/page-wizard.js b/app/app/components/document/page-wizard.js index 493a49e3..36d6477f 100644 --- a/app/app/components/document/page-wizard.js +++ b/app/app/components/document/page-wizard.js @@ -13,9 +13,18 @@ import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; export default Ember.Component.extend(NotifierMixin, { + sectionService: Ember.inject.service('section'), + + didReceiveAttrs() { + let self = this; + this.get('sectionService').getAll().then(function(sections) { + self.set('sections', sections); + }); + }, didRender() { let self = this; + Mousetrap.bind('esc', function() { self.send('onCancel'); return false; @@ -28,12 +37,6 @@ export default Ember.Component.extend(NotifierMixin, { }, addSection(section) { - - if (section.preview) { - this.showNotification("Coming soon!"); - return; - } - this.attrs.onAction(section); } } diff --git a/app/app/pods/document/index/controller.js b/app/app/pods/document/index/controller.js index d73cbf8a..239bcb9b 100644 --- a/app/app/pods/document/index/controller.js +++ b/app/app/pods/document/index/controller.js @@ -193,18 +193,58 @@ export default Ember.Controller.extend(NotifierMixin, { }); }, - onAddPage(page) { - let self = this; + onAddSection(section) { + this.audit.record("added-section"); + this.audit.record("added-section-" + section.get('contentType')); - this.get('documentService').addPage(this.get('model.id'), page).then(function (newPage) { - self.transitionToRoute('document.edit', - self.get('folder.id'), - self.get('folder.slug'), - self.get('model.id'), - self.get('model.slug'), + let page = { + documentId: this.get('model.id'), + title: `${section.get('title')} Section`, + level: 1, + sequence: 2048, + body: "", + contentType: section.get('contentType') + }; + + let data = this.get('store').normalize('page', page); + let pageData = this.get('store').push(data); + + let meta = { + documentId: this.get('model.id'), + rawBody: "", + config: "" + }; + + let pageMeta = this.get('store').normalize('page-meta', meta); + let pageMetaData = this.get('store').push(pageMeta); + + let model = { + page: pageData, + meta: pageMetaData + }; + + this.get('documentService').addPage(this.get('model.id'), model).then((newPage) => { + this.transitionToRoute('document.edit', + this.get('folder.id'), + this.get('folder.slug'), + this.get('model.id'), + this.get('model.slug'), newPage.id); }); }, + // + // onAddPage(page) { + // let self = this; + // + // this.get('documentService').addPage(this.get('model.id'), page).then(function (newPage) { + // self.transitionToRoute('document.edit', + // self.get('folder.id'), + // self.get('folder.slug'), + // self.get('model.id'), + // self.get('model.slug'), + // newPage.id); + // }); + // }, onDocumentDelete() { let self = this; diff --git a/app/app/pods/document/index/template.hbs b/app/app/pods/document/index/template.hbs index a9fd74ee..dea165e9 100644 --- a/app/app/pods/document/index/template.hbs +++ b/app/app/pods/document/index/template.hbs @@ -3,7 +3,7 @@ {{layout/zone-navigation}} {{#layout/zone-header title=model.name message=model.excerpt}} - {{document/document-toolbar document=model pages=pages folder=folder owner=owner + {{document/document-toolbar document=model pages=pages folder=folder owner=owner isEditor=isEditor users=users onSaveTemplate=(action 'onSaveTemplate') onDocumentChange=(action 'onDocumentChange') @@ -13,7 +13,7 @@ {{#layout/zone-sidebar}} {{document/document-sidebar document=model meta=meta folder=folder pages=pages page=page owner=owner isEditor=isEditor - onAddPage=(action 'onAddPage') + onAddSection=(action 'onAddSection') changePageSequence=(action 'onPageSequenceChange') changePageLevel=(action 'onPageLevelChange') gotoPage=(action 'gotoPage')}} diff --git a/app/app/styles/color.scss b/app/app/styles/color.scss index a444b4c4..d63354bb 100644 --- a/app/app/styles/color.scss +++ b/app/app/styles/color.scss @@ -37,39 +37,39 @@ $color-chip: #dff0f9; $color-chip-border: #daeaf3; $color-chip-text: #1b88e3; -.background-color-white { - background-color: $color-white; -} .color-white { - color: $color-white; + color: $color-white !important; } .color-off-white { - color: $color-off-white; + color: $color-off-white !important; } .color-black { - color: $color-black; + color: $color-black !important; } .color-off-black { - color: $color-off-black; -} -.background-color-primary { - background-color: $color-primary; + color: $color-off-black !important; } .color-primary { - color: $color-primary; + color: $color-primary !important; } .color-link { - color: $color-link; + color: $color-link !important; } .color-blue { - color: $color-blue; + color: $color-blue !important; } .color-red { - color: $color-red; + color: $color-red !important; } .color-green { - color: $color-green; + color: $color-green !important; } .color-gray { - color: $color-gray; + color: $color-gray !important; +} +.background-color-white { + background-color: $color-white !important; +} +.background-color-primary { + background-color: $color-primary !important; } diff --git a/app/app/styles/functions.scss b/app/app/styles/functions.scss index 5282693a..1f06bdc3 100644 --- a/app/app/styles/functions.scss +++ b/app/app/styles/functions.scss @@ -137,3 +137,32 @@ $opacity-ie: $opacity * 100; filter: alpha(opacity=$opacity-ie); //IE8 } + +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Firefox < 16 */ +@-moz-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Internet Explorer */ +@-ms-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Opera < 12.1 */ +@-o-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} diff --git a/app/app/styles/view/document/sidebar.scss b/app/app/styles/view/document/sidebar.scss index 5b967c88..7c3bf30e 100644 --- a/app/app/styles/view/document/sidebar.scss +++ b/app/app/styles/view/document/sidebar.scss @@ -46,9 +46,33 @@ } } - .stick { + .stuck-toc { position: fixed; - top: 10px; + top: 20px; + -webkit-animation: fadein 1s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: fadein 1s; /* Firefox < 16 */ + -ms-animation: fadein 1s; /* Internet Explorer */ + -o-animation: fadein 1s; /* Opera < 12.1 */ + animation: fadein 1s; + } + + .section-tool { + position: absolute; + top: 150px; + right: -18px; + z-index: 999; + } + + .stuck-tool { + position: fixed !important; + top: 150px !important; + right: 0; + left: 0; + -webkit-animation: fadein 1s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: fadein 1s; /* Firefox < 16 */ + -ms-animation: fadein 1s; /* Internet Explorer */ + -o-animation: fadein 1s; /* Opera < 12.1 */ + animation: fadein 1s; } .close-action { diff --git a/app/app/styles/view/document/wizard.scss b/app/app/styles/view/document/wizard.scss index cd7d777d..d6678429 100644 --- a/app/app/styles/view/document/wizard.scss +++ b/app/app/styles/view/document/wizard.scss @@ -1,9 +1,8 @@ .section-wizard { - margin: 30px; + margin: 20px 0 30px 0; > .canvas { padding: 0; - margin: 30px 0; > .list { margin: 0; @@ -11,28 +10,33 @@ > .item { list-style: none; - float: left; cursor: pointer; - width: 400px; - height: 80px; - background-color: $color-white; - border: 1px solid $color-border; - border-radius: 3px; - margin: 0 30px 30px 0; + padding: 10px 5px; + margin: 5px 0; &:hover { - background-color: $color-card-active; - border: 1px solid $color-border; - transition: 0.2s all ease; + @include ease-in(); + + > .details { + > .title { + color: $color-primary; + } + + > .desc { + color: $color-primary; + } + } } .icon { text-align: center; display: inline-block; + padding-right: 20px; + width: 50px; > .img { + float: left; text-align: center; - margin: 17px 10px 0 20px; display: inline-block; height: 45px; width: 45px; @@ -42,30 +46,20 @@ > .details { vertical-align: top; display: inline-block; + float: left; + width: 80%; > .title { font-size: 1rem; font-weight: bold; color: $color-off-black; - margin-top: 18px; letter-spacing: 0.5px; - - .preview { - font-size: 0.7rem; - color: $color-goldy; - display: inline-block; - margin-left: 10px; - } } > .desc { color: $color-gray; font-size: 0.8rem; margin-top: 5px; - max-width: 300px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; } } } diff --git a/app/app/templates/components/document/document-sidebar.hbs b/app/app/templates/components/document/document-sidebar.hbs index 24c0499d..2c66c26b 100644 --- a/app/app/templates/components/document/document-sidebar.hbs +++ b/app/app/templates/components/document/document-sidebar.hbs @@ -28,6 +28,12 @@
{{/if}} + {{#if isEditor}} +
+ add +
+ {{/if}} + {{#if showToc}} {{document/document-sidebar-toc document=model folder=folder pages=pages page=page isEditor=isEditor changePageSequence=(action 'onPageSequenceChange') changePageLevel=(action 'onPageLevelChange') @@ -39,4 +45,7 @@ {{#if showContributions}} {{document/document-sidebar-edits pages=pages meta=meta}} {{/if}} + {{#if showSections}} + {{document/page-wizard document=document folder=folder onCancel=(action 'onCancel') onAction=(action 'onAddSection')}} + {{/if}}
diff --git a/app/app/templates/components/document/document-toolbar.hbs b/app/app/templates/components/document/document-toolbar.hbs index 7e36a401..00a0ef50 100644 --- a/app/app/templates/components/document/document-toolbar.hbs +++ b/app/app/templates/components/document/document-toolbar.hbs @@ -31,13 +31,6 @@
delete
-
- {{#link-to 'document.wizard' folder.id folder.slug document.id document.slug}} -
- add -
section
-
- {{/link-to}} {{/if}} {{#if isEditor}} diff --git a/app/app/templates/components/document/page-wizard.hbs b/app/app/templates/components/document/page-wizard.hbs index ac0b6ec0..7174fb3b 100644 --- a/app/app/templates/components/document/page-wizard.hbs +++ b/app/app/templates/components/document/page-wizard.hbs @@ -1,8 +1,4 @@
-
-
Cancel
-
-
{{section.description}}
+
{{/each}} -
  • -
    - {{section.title}} -
    -
    -
    Suggest
    -
    We'll build the integrations you need - just let us know
    -
    -
  • diff --git a/app/ember-cli-build.js b/app/ember-cli-build.js index 9503e45a..9ff276cc 100644 --- a/app/ember-cli-build.js +++ b/app/ember-cli-build.js @@ -55,6 +55,8 @@ module.exports = function(defaults) { app.import('vendor/markdown-it.min.js'); app.import('vendor/dragula.js'); app.import('vendor/datetimepicker.min.js'); + app.import('vendor/hoverIntent.js'); + app.import('vendor/waypoints.js'); return app.toTree(); -}; \ No newline at end of file +}; diff --git a/app/vendor/hoverIntent.js b/app/vendor/hoverIntent.js new file mode 100755 index 00000000..62a29ce4 --- /dev/null +++ b/app/vendor/hoverIntent.js @@ -0,0 +1,158 @@ +/*! + * hoverIntent v1.8.1 // 2014.08.11 // jQuery v1.9.1+ + * http://briancherne.github.io/jquery-hoverIntent/ + * + * You may use hoverIntent under the terms of the MIT license. Basically that + * means you are free to use hoverIntent as long as this header is left intact. + * Copyright 2007, 2014 Brian Cherne + */ + +/* hoverIntent is similar to jQuery's built-in "hover" method except that + * instead of firing the handlerIn function immediately, hoverIntent checks + * to see if the user's mouse has slowed down (beneath the sensitivity + * threshold) before firing the event. The handlerOut function is only + * called after a matching handlerIn. + * + * // basic usage ... just like .hover() + * .hoverIntent( handlerIn, handlerOut ) + * .hoverIntent( handlerInOut ) + * + * // basic usage ... with event delegation! + * .hoverIntent( handlerIn, handlerOut, selector ) + * .hoverIntent( handlerInOut, selector ) + * + * // using a basic configuration object + * .hoverIntent( config ) + * + * @param handlerIn function OR configuration object + * @param handlerOut function OR selector for delegation OR undefined + * @param selector selector OR undefined + * @author Brian Cherne + */ + +(function(factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (jQuery && !jQuery.fn.hoverIntent) { + factory(jQuery); + } +})(function($) { + 'use strict'; + + // default configuration values + var _cfg = { + interval: 100, + sensitivity: 6, + timeout: 0 + }; + + // counter used to generate an ID for each instance + var INSTANCE_COUNT = 0; + + // current X and Y position of mouse, updated during mousemove tracking (shared across instances) + var cX, cY; + + // saves the current pointer position coordinates based on the given mousemove event + var track = function(ev) { + cX = ev.pageX; + cY = ev.pageY; + }; + + // compares current and previous mouse positions + var compare = function(ev,$el,s,cfg) { + // compare mouse positions to see if pointer has slowed enough to trigger `over` function + if ( Math.sqrt( (s.pX-cX)*(s.pX-cX) + (s.pY-cY)*(s.pY-cY) ) < cfg.sensitivity ) { + $el.off(s.event,track); + delete s.timeoutId; + // set hoverIntent state as active for this element (permits `out` handler to trigger) + s.isActive = true; + // overwrite old mouseenter event coordinates with most recent pointer position + ev.pageX = cX; ev.pageY = cY; + // clear coordinate data from state object + delete s.pX; delete s.pY; + return cfg.over.apply($el[0],[ev]); + } else { + // set previous coordinates for next comparison + s.pX = cX; s.pY = cY; + // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) + s.timeoutId = setTimeout( function(){compare(ev, $el, s, cfg);} , cfg.interval ); + } + }; + + // triggers given `out` function at configured `timeout` after a mouseleave and clears state + var delay = function(ev,$el,s,out) { + delete $el.data('hoverIntent')[s.id]; + return out.apply($el[0],[ev]); + }; + + $.fn.hoverIntent = function(handlerIn,handlerOut,selector) { + // instance ID, used as a key to store and retrieve state information on an element + var instanceId = INSTANCE_COUNT++; + + // extend the default configuration and parse parameters + var cfg = $.extend({}, _cfg); + if ( $.isPlainObject(handlerIn) ) { + cfg = $.extend(cfg, handlerIn); + if ( !$.isFunction(cfg.out) ) { + cfg.out = cfg.over; + } + } else if ( $.isFunction(handlerOut) ) { + cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } ); + } else { + cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } ); + } + + // A private function for handling mouse 'hovering' + var handleHover = function(e) { + // cloned event to pass to handlers (copy required for event object to be passed in IE) + var ev = $.extend({},e); + + // the current target of the mouse event, wrapped in a jQuery object + var $el = $(this); + + // read hoverIntent data from element (or initialize if not present) + var hoverIntentData = $el.data('hoverIntent'); + if (!hoverIntentData) { $el.data('hoverIntent', (hoverIntentData = {})); } + + // read per-instance state from element (or initialize if not present) + var state = hoverIntentData[instanceId]; + if (!state) { hoverIntentData[instanceId] = state = { id: instanceId }; } + + // state properties: + // id = instance ID, used to clean up data + // timeoutId = timeout ID, reused for tracking mouse position and delaying "out" handler + // isActive = plugin state, true after `over` is called just until `out` is called + // pX, pY = previously-measured pointer coordinates, updated at each polling interval + // event = string representing the namespaced event used for mouse tracking + + // clear any existing timeout + if (state.timeoutId) { state.timeoutId = clearTimeout(state.timeoutId); } + + // namespaced event used to register and unregister mousemove tracking + var mousemove = state.event = 'mousemove.hoverIntent.hoverIntent'+instanceId; + + // handle the event, based on its type + if (e.type === 'mouseenter') { + // do nothing if already active + if (state.isActive) { return; } + // set "previous" X and Y position based on initial entry point + state.pX = ev.pageX; state.pY = ev.pageY; + // update "current" X and Y position based on mousemove + $el.off(mousemove,track).on(mousemove,track); + // start polling interval (self-calling timeout) to compare mouse coordinates over time + state.timeoutId = setTimeout( function(){compare(ev,$el,state,cfg);} , cfg.interval ); + } else { // "mouseleave" + // do nothing if not already active + if (!state.isActive) { return; } + // unbind expensive mousemove event + $el.off(mousemove,track); + // if hoverIntent state is true, then call the mouseOut function after the specified delay + state.timeoutId = setTimeout( function(){delay(ev,$el,state,cfg.out);} , cfg.timeout ); + } + }; + + // listen for mouseenter and mouseleave + return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector); + }; +}); diff --git a/app/vendor/waypoints.js b/app/vendor/waypoints.js new file mode 100644 index 00000000..ae3d60f5 --- /dev/null +++ b/app/vendor/waypoints.js @@ -0,0 +1,939 @@ +/*! +Waypoints - 4.0.1 +Copyright © 2011-2016 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +(function() { + 'use strict' + + var keyCounter = 0 + var allWaypoints = {} + + /* http://imakewebthings.com/waypoints/api/waypoint */ + function Waypoint(options) { + if (!options) { + throw new Error('No options passed to Waypoint constructor') + } + if (!options.element) { + throw new Error('No element option passed to Waypoint constructor') + } + if (!options.handler) { + throw new Error('No handler option passed to Waypoint constructor') + } + + this.key = 'waypoint-' + keyCounter + this.options = Waypoint.Adapter.extend({}, Waypoint.defaults, options) + this.element = this.options.element + this.adapter = new Waypoint.Adapter(this.element) + this.callback = options.handler + this.axis = this.options.horizontal ? 'horizontal' : 'vertical' + this.enabled = this.options.enabled + this.triggerPoint = null + this.group = Waypoint.Group.findOrCreate({ + name: this.options.group, + axis: this.axis + }) + this.context = Waypoint.Context.findOrCreateByElement(this.options.context) + + if (Waypoint.offsetAliases[this.options.offset]) { + this.options.offset = Waypoint.offsetAliases[this.options.offset] + } + this.group.add(this) + this.context.add(this) + allWaypoints[this.key] = this + keyCounter += 1 + } + + /* Private */ + Waypoint.prototype.queueTrigger = function(direction) { + this.group.queueTrigger(this, direction) + } + + /* Private */ + Waypoint.prototype.trigger = function(args) { + if (!this.enabled) { + return + } + if (this.callback) { + this.callback.apply(this, args) + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/destroy */ + Waypoint.prototype.destroy = function() { + this.context.remove(this) + this.group.remove(this) + delete allWaypoints[this.key] + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/disable */ + Waypoint.prototype.disable = function() { + this.enabled = false + return this + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/enable */ + Waypoint.prototype.enable = function() { + this.context.refresh() + this.enabled = true + return this + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/next */ + Waypoint.prototype.next = function() { + return this.group.next(this) + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/previous */ + Waypoint.prototype.previous = function() { + return this.group.previous(this) + } + + /* Private */ + Waypoint.invokeAll = function(method) { + var allWaypointsArray = [] + for (var waypointKey in allWaypoints) { + allWaypointsArray.push(allWaypoints[waypointKey]) + } + for (var i = 0, end = allWaypointsArray.length; i < end; i++) { + allWaypointsArray[i][method]() + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/destroy-all */ + Waypoint.destroyAll = function() { + Waypoint.invokeAll('destroy') + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/disable-all */ + Waypoint.disableAll = function() { + Waypoint.invokeAll('disable') + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/enable-all */ + Waypoint.enableAll = function() { + Waypoint.Context.refreshAll() + for (var waypointKey in allWaypoints) { + allWaypoints[waypointKey].enabled = true + } + return this + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/refresh-all */ + Waypoint.refreshAll = function() { + Waypoint.Context.refreshAll() + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/viewport-height */ + Waypoint.viewportHeight = function() { + return window.innerHeight || document.documentElement.clientHeight + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/viewport-width */ + Waypoint.viewportWidth = function() { + return document.documentElement.clientWidth + } + + Waypoint.adapters = [] + + Waypoint.defaults = { + context: window, + continuous: true, + enabled: true, + group: 'default', + horizontal: false, + offset: 0 + } + + Waypoint.offsetAliases = { + 'bottom-in-view': function() { + return this.context.innerHeight() - this.adapter.outerHeight() + }, + 'right-in-view': function() { + return this.context.innerWidth() - this.adapter.outerWidth() + } + } + + window.Waypoint = Waypoint +}()) +;(function() { + 'use strict' + + function requestAnimationFrameShim(callback) { + window.setTimeout(callback, 1000 / 60) + } + + var keyCounter = 0 + var contexts = {} + var Waypoint = window.Waypoint + var oldWindowLoad = window.onload + + /* http://imakewebthings.com/waypoints/api/context */ + function Context(element) { + this.element = element + this.Adapter = Waypoint.Adapter + this.adapter = new this.Adapter(element) + this.key = 'waypoint-context-' + keyCounter + this.didScroll = false + this.didResize = false + this.oldScroll = { + x: this.adapter.scrollLeft(), + y: this.adapter.scrollTop() + } + this.waypoints = { + vertical: {}, + horizontal: {} + } + + element.waypointContextKey = this.key + contexts[element.waypointContextKey] = this + keyCounter += 1 + if (!Waypoint.windowContext) { + Waypoint.windowContext = true + Waypoint.windowContext = new Context(window) + } + + this.createThrottledScrollHandler() + this.createThrottledResizeHandler() + } + + /* Private */ + Context.prototype.add = function(waypoint) { + var axis = waypoint.options.horizontal ? 'horizontal' : 'vertical' + this.waypoints[axis][waypoint.key] = waypoint + this.refresh() + } + + /* Private */ + Context.prototype.checkEmpty = function() { + var horizontalEmpty = this.Adapter.isEmptyObject(this.waypoints.horizontal) + var verticalEmpty = this.Adapter.isEmptyObject(this.waypoints.vertical) + var isWindow = this.element == this.element.window + if (horizontalEmpty && verticalEmpty && !isWindow) { + this.adapter.off('.waypoints') + delete contexts[this.key] + } + } + + /* Private */ + Context.prototype.createThrottledResizeHandler = function() { + var self = this + + function resizeHandler() { + self.handleResize() + self.didResize = false + } + + this.adapter.on('resize.waypoints', function() { + if (!self.didResize) { + self.didResize = true + Waypoint.requestAnimationFrame(resizeHandler) + } + }) + } + + /* Private */ + Context.prototype.createThrottledScrollHandler = function() { + var self = this + function scrollHandler() { + self.handleScroll() + self.didScroll = false + } + + this.adapter.on('scroll.waypoints', function() { + if (!self.didScroll || Waypoint.isTouch) { + self.didScroll = true + Waypoint.requestAnimationFrame(scrollHandler) + } + }) + } + + /* Private */ + Context.prototype.handleResize = function() { + Waypoint.Context.refreshAll() + } + + /* Private */ + Context.prototype.handleScroll = function() { + var triggeredGroups = {} + var axes = { + horizontal: { + newScroll: this.adapter.scrollLeft(), + oldScroll: this.oldScroll.x, + forward: 'right', + backward: 'left' + }, + vertical: { + newScroll: this.adapter.scrollTop(), + oldScroll: this.oldScroll.y, + forward: 'down', + backward: 'up' + } + } + + for (var axisKey in axes) { + var axis = axes[axisKey] + var isForward = axis.newScroll > axis.oldScroll + var direction = isForward ? axis.forward : axis.backward + + for (var waypointKey in this.waypoints[axisKey]) { + var waypoint = this.waypoints[axisKey][waypointKey] + if (waypoint.triggerPoint === null) { + continue + } + var wasBeforeTriggerPoint = axis.oldScroll < waypoint.triggerPoint + var nowAfterTriggerPoint = axis.newScroll >= waypoint.triggerPoint + var crossedForward = wasBeforeTriggerPoint && nowAfterTriggerPoint + var crossedBackward = !wasBeforeTriggerPoint && !nowAfterTriggerPoint + if (crossedForward || crossedBackward) { + waypoint.queueTrigger(direction) + triggeredGroups[waypoint.group.id] = waypoint.group + } + } + } + + for (var groupKey in triggeredGroups) { + triggeredGroups[groupKey].flushTriggers() + } + + this.oldScroll = { + x: axes.horizontal.newScroll, + y: axes.vertical.newScroll + } + } + + /* Private */ + Context.prototype.innerHeight = function() { + /*eslint-disable eqeqeq */ + if (this.element == this.element.window) { + return Waypoint.viewportHeight() + } + /*eslint-enable eqeqeq */ + return this.adapter.innerHeight() + } + + /* Private */ + Context.prototype.remove = function(waypoint) { + delete this.waypoints[waypoint.axis][waypoint.key] + this.checkEmpty() + } + + /* Private */ + Context.prototype.innerWidth = function() { + /*eslint-disable eqeqeq */ + if (this.element == this.element.window) { + return Waypoint.viewportWidth() + } + /*eslint-enable eqeqeq */ + return this.adapter.innerWidth() + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/context-destroy */ + Context.prototype.destroy = function() { + var allWaypoints = [] + for (var axis in this.waypoints) { + for (var waypointKey in this.waypoints[axis]) { + allWaypoints.push(this.waypoints[axis][waypointKey]) + } + } + for (var i = 0, end = allWaypoints.length; i < end; i++) { + allWaypoints[i].destroy() + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/context-refresh */ + Context.prototype.refresh = function() { + /*eslint-disable eqeqeq */ + var isWindow = this.element == this.element.window + /*eslint-enable eqeqeq */ + var contextOffset = isWindow ? undefined : this.adapter.offset() + var triggeredGroups = {} + var axes + + this.handleScroll() + axes = { + horizontal: { + contextOffset: isWindow ? 0 : contextOffset.left, + contextScroll: isWindow ? 0 : this.oldScroll.x, + contextDimension: this.innerWidth(), + oldScroll: this.oldScroll.x, + forward: 'right', + backward: 'left', + offsetProp: 'left' + }, + vertical: { + contextOffset: isWindow ? 0 : contextOffset.top, + contextScroll: isWindow ? 0 : this.oldScroll.y, + contextDimension: this.innerHeight(), + oldScroll: this.oldScroll.y, + forward: 'down', + backward: 'up', + offsetProp: 'top' + } + } + + for (var axisKey in axes) { + var axis = axes[axisKey] + for (var waypointKey in this.waypoints[axisKey]) { + var waypoint = this.waypoints[axisKey][waypointKey] + var adjustment = waypoint.options.offset + var oldTriggerPoint = waypoint.triggerPoint + var elementOffset = 0 + var freshWaypoint = oldTriggerPoint == null + var contextModifier, wasBeforeScroll, nowAfterScroll + var triggeredBackward, triggeredForward + + if (waypoint.element !== waypoint.element.window) { + elementOffset = waypoint.adapter.offset()[axis.offsetProp] + } + + if (typeof adjustment === 'function') { + adjustment = adjustment.apply(waypoint) + } + else if (typeof adjustment === 'string') { + adjustment = parseFloat(adjustment) + if (waypoint.options.offset.indexOf('%') > - 1) { + adjustment = Math.ceil(axis.contextDimension * adjustment / 100) + } + } + + contextModifier = axis.contextScroll - axis.contextOffset + waypoint.triggerPoint = Math.floor(elementOffset + contextModifier - adjustment) + wasBeforeScroll = oldTriggerPoint < axis.oldScroll + nowAfterScroll = waypoint.triggerPoint >= axis.oldScroll + triggeredBackward = wasBeforeScroll && nowAfterScroll + triggeredForward = !wasBeforeScroll && !nowAfterScroll + + if (!freshWaypoint && triggeredBackward) { + waypoint.queueTrigger(axis.backward) + triggeredGroups[waypoint.group.id] = waypoint.group + } + else if (!freshWaypoint && triggeredForward) { + waypoint.queueTrigger(axis.forward) + triggeredGroups[waypoint.group.id] = waypoint.group + } + else if (freshWaypoint && axis.oldScroll >= waypoint.triggerPoint) { + waypoint.queueTrigger(axis.forward) + triggeredGroups[waypoint.group.id] = waypoint.group + } + } + } + + Waypoint.requestAnimationFrame(function() { + for (var groupKey in triggeredGroups) { + triggeredGroups[groupKey].flushTriggers() + } + }) + + return this + } + + /* Private */ + Context.findOrCreateByElement = function(element) { + return Context.findByElement(element) || new Context(element) + } + + /* Private */ + Context.refreshAll = function() { + for (var contextId in contexts) { + contexts[contextId].refresh() + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/context-find-by-element */ + Context.findByElement = function(element) { + return contexts[element.waypointContextKey] + } + + window.onload = function() { + if (oldWindowLoad) { + oldWindowLoad() + } + Context.refreshAll() + } + + + Waypoint.requestAnimationFrame = function(callback) { + var requestFn = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + requestAnimationFrameShim + requestFn.call(window, callback) + } + Waypoint.Context = Context +}()) +;(function() { + 'use strict' + + function byTriggerPoint(a, b) { + return a.triggerPoint - b.triggerPoint + } + + function byReverseTriggerPoint(a, b) { + return b.triggerPoint - a.triggerPoint + } + + var groups = { + vertical: {}, + horizontal: {} + } + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/api/group */ + function Group(options) { + this.name = options.name + this.axis = options.axis + this.id = this.name + '-' + this.axis + this.waypoints = [] + this.clearTriggerQueues() + groups[this.axis][this.name] = this + } + + /* Private */ + Group.prototype.add = function(waypoint) { + this.waypoints.push(waypoint) + } + + /* Private */ + Group.prototype.clearTriggerQueues = function() { + this.triggerQueues = { + up: [], + down: [], + left: [], + right: [] + } + } + + /* Private */ + Group.prototype.flushTriggers = function() { + for (var direction in this.triggerQueues) { + var waypoints = this.triggerQueues[direction] + var reverse = direction === 'up' || direction === 'left' + waypoints.sort(reverse ? byReverseTriggerPoint : byTriggerPoint) + for (var i = 0, end = waypoints.length; i < end; i += 1) { + var waypoint = waypoints[i] + if (waypoint.options.continuous || i === waypoints.length - 1) { + waypoint.trigger([direction]) + } + } + } + this.clearTriggerQueues() + } + + /* Private */ + Group.prototype.next = function(waypoint) { + this.waypoints.sort(byTriggerPoint) + var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) + var isLast = index === this.waypoints.length - 1 + return isLast ? null : this.waypoints[index + 1] + } + + /* Private */ + Group.prototype.previous = function(waypoint) { + this.waypoints.sort(byTriggerPoint) + var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) + return index ? this.waypoints[index - 1] : null + } + + /* Private */ + Group.prototype.queueTrigger = function(waypoint, direction) { + this.triggerQueues[direction].push(waypoint) + } + + /* Private */ + Group.prototype.remove = function(waypoint) { + var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) + if (index > -1) { + this.waypoints.splice(index, 1) + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/first */ + Group.prototype.first = function() { + return this.waypoints[0] + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/last */ + Group.prototype.last = function() { + return this.waypoints[this.waypoints.length - 1] + } + + /* Private */ + Group.findOrCreate = function(options) { + return groups[options.axis][options.name] || new Group(options) + } + + Waypoint.Group = Group +}()) +;(function() { + 'use strict' + + var $ = window.jQuery + var Waypoint = window.Waypoint + + function JQueryAdapter(element) { + this.$element = $(element) + } + + $.each([ + 'innerHeight', + 'innerWidth', + 'off', + 'offset', + 'on', + 'outerHeight', + 'outerWidth', + 'scrollLeft', + 'scrollTop' + ], function(i, method) { + JQueryAdapter.prototype[method] = function() { + var args = Array.prototype.slice.call(arguments) + return this.$element[method].apply(this.$element, args) + } + }) + + $.each([ + 'extend', + 'inArray', + 'isEmptyObject' + ], function(i, method) { + JQueryAdapter[method] = $[method] + }) + + Waypoint.adapters.push({ + name: 'jquery', + Adapter: JQueryAdapter + }) + Waypoint.Adapter = JQueryAdapter +}()) +;(function() { + 'use strict' + + var Waypoint = window.Waypoint + + function createExtension(framework) { + return function() { + var waypoints = [] + var overrides = arguments[0] + + if (framework.isFunction(arguments[0])) { + overrides = framework.extend({}, arguments[1]) + overrides.handler = arguments[0] + } + + this.each(function() { + var options = framework.extend({}, overrides, { + element: this + }) + if (typeof options.context === 'string') { + options.context = framework(this).closest(options.context)[0] + } + waypoints.push(new Waypoint(options)) + }) + + return waypoints + } + } + + if (window.jQuery) { + window.jQuery.fn.waypoint = createExtension(window.jQuery) + } + if (window.Zepto) { + window.Zepto.fn.waypoint = createExtension(window.Zepto) + } +}()) +; + +/*! +Waypoints Sticky Element Shortcut - 4.0.1 +Copyright © 2011-2016 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +(function() { + 'use strict' + + var $ = window.jQuery + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/shortcuts/sticky-elements */ + function Sticky(options) { + this.options = $.extend({}, Waypoint.defaults, Sticky.defaults, options) + this.element = this.options.element + this.$element = $(this.element) + this.createWrapper() + this.createWaypoint() + } + + /* Private */ + Sticky.prototype.createWaypoint = function() { + var originalHandler = this.options.handler + + this.waypoint = new Waypoint($.extend({}, this.options, { + element: this.wrapper, + handler: $.proxy(function(direction) { + var shouldBeStuck = this.options.direction.indexOf(direction) > -1 + var wrapperHeight = shouldBeStuck ? this.$element.outerHeight(true) : '' + + this.$wrapper.height(wrapperHeight) + this.$element.toggleClass(this.options.stuckClass, shouldBeStuck) + + if (originalHandler) { + originalHandler.call(this, direction) + } + }, this) + })) + } + + /* Private */ + Sticky.prototype.createWrapper = function() { + if (this.options.wrapper) { + this.$element.wrap(this.options.wrapper) + } + this.$wrapper = this.$element.parent() + this.wrapper = this.$wrapper[0] + } + + /* Public */ + Sticky.prototype.destroy = function() { + if (this.$element.parent()[0] === this.wrapper) { + this.waypoint.destroy() + this.$element.removeClass(this.options.stuckClass) + if (this.options.wrapper) { + this.$element.unwrap() + } + } + } + + Sticky.defaults = { + wrapper: '
    ', + stuckClass: 'stuck', + direction: 'down right' + } + + Waypoint.Sticky = Sticky +}()) +; + +/*! +Waypoints Inview Shortcut - 4.0.1 +Copyright © 2011-2016 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +(function() { + 'use strict' + + function noop() {} + + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/shortcuts/inview */ + function Inview(options) { + this.options = Waypoint.Adapter.extend({}, Inview.defaults, options) + this.axis = this.options.horizontal ? 'horizontal' : 'vertical' + this.waypoints = [] + this.element = this.options.element + this.createWaypoints() + } + + /* Private */ + Inview.prototype.createWaypoints = function() { + var configs = { + vertical: [{ + down: 'enter', + up: 'exited', + offset: '100%' + }, { + down: 'entered', + up: 'exit', + offset: 'bottom-in-view' + }, { + down: 'exit', + up: 'entered', + offset: 0 + }, { + down: 'exited', + up: 'enter', + offset: function() { + return -this.adapter.outerHeight() + } + }], + horizontal: [{ + right: 'enter', + left: 'exited', + offset: '100%' + }, { + right: 'entered', + left: 'exit', + offset: 'right-in-view' + }, { + right: 'exit', + left: 'entered', + offset: 0 + }, { + right: 'exited', + left: 'enter', + offset: function() { + return -this.adapter.outerWidth() + } + }] + } + + for (var i = 0, end = configs[this.axis].length; i < end; i++) { + var config = configs[this.axis][i] + this.createWaypoint(config) + } + } + + /* Private */ + Inview.prototype.createWaypoint = function(config) { + var self = this + this.waypoints.push(new Waypoint({ + context: this.options.context, + element: this.options.element, + enabled: this.options.enabled, + handler: (function(config) { + return function(direction) { + self.options[config[direction]].call(self, direction) + } + }(config)), + offset: config.offset, + horizontal: this.options.horizontal + })) + } + + /* Public */ + Inview.prototype.destroy = function() { + for (var i = 0, end = this.waypoints.length; i < end; i++) { + this.waypoints[i].destroy() + } + this.waypoints = [] + } + + Inview.prototype.disable = function() { + for (var i = 0, end = this.waypoints.length; i < end; i++) { + this.waypoints[i].disable() + } + } + + Inview.prototype.enable = function() { + for (var i = 0, end = this.waypoints.length; i < end; i++) { + this.waypoints[i].enable() + } + } + + Inview.defaults = { + context: window, + enabled: true, + enter: noop, + entered: noop, + exit: noop, + exited: noop + } + + Waypoint.Inview = Inview +}()) +; + +/*! +Waypoints Infinite Scroll Shortcut - 4.0.1 +Copyright © 2011-2016 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +(function() { + 'use strict' + + var $ = window.jQuery + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/shortcuts/infinite-scroll */ + function Infinite(options) { + this.options = $.extend({}, Infinite.defaults, options) + this.container = this.options.element + if (this.options.container !== 'auto') { + this.container = this.options.container + } + this.$container = $(this.container) + this.$more = $(this.options.more) + + if (this.$more.length) { + this.setupHandler() + this.waypoint = new Waypoint(this.options) + } + } + + /* Private */ + Infinite.prototype.setupHandler = function() { + this.options.handler = $.proxy(function() { + this.options.onBeforePageLoad() + this.destroy() + this.$container.addClass(this.options.loadingClass) + + $.get($(this.options.more).attr('href'), $.proxy(function(data) { + var $data = $($.parseHTML(data)) + var $newMore = $data.find(this.options.more) + + var $items = $data.find(this.options.items) + if (!$items.length) { + $items = $data.filter(this.options.items) + } + + this.$container.append($items) + this.$container.removeClass(this.options.loadingClass) + + if (!$newMore.length) { + $newMore = $data.filter(this.options.more) + } + if ($newMore.length) { + this.$more.replaceWith($newMore) + this.$more = $newMore + this.waypoint = new Waypoint(this.options) + } + else { + this.$more.remove() + } + + this.options.onAfterPageLoad($items) + }, this)) + }, this) + } + + /* Public */ + Infinite.prototype.destroy = function() { + if (this.waypoint) { + this.waypoint.destroy() + } + } + + Infinite.defaults = { + container: 'auto', + items: '.infinite-item', + more: '.infinite-more-link', + offset: 'bottom-in-view', + loadingClass: 'infinite-loading', + onBeforePageLoad: $.noop, + onAfterPageLoad: $.noop + } + + Waypoint.Infinite = Infinite +}()) +; diff --git a/core/product.go b/core/product.go index 8192308c..d02c15ea 100644 --- a/core/product.go +++ b/core/product.go @@ -26,7 +26,7 @@ type ProdInfo struct { // Product returns product edition details func Product() (p ProdInfo) { p.Major = "0" - p.Minor = "23" + p.Minor = "24" p.Patch = "0" p.Version = fmt.Sprintf("%s.%s.%s", p.Major, p.Minor, p.Patch) p.Edition = "Community" diff --git a/core/section/code/code.go b/core/section/code/code.go index 8471ca64..c446acf1 100644 --- a/core/section/code/code.go +++ b/core/section/code/code.go @@ -27,7 +27,7 @@ func (*Provider) Meta() provider.TypeMeta { section.ID = "4f6f2b02-8397-483d-9bb9-eea1fef13304" section.Title = "Code" - section.Description = "Formatted code samples supporting 50+ languages" + section.Description = "Formatted code snippets" section.ContentType = "code" section.Order = 9997 diff --git a/core/section/gemini/gemini.go b/core/section/gemini/gemini.go index 395b16fe..bba1e27f 100644 --- a/core/section/gemini/gemini.go +++ b/core/section/gemini/gemini.go @@ -20,8 +20,8 @@ import ( "io/ioutil" "net/http" - "github.com/documize/community/core/section/provider" "github.com/documize/community/core/log" + "github.com/documize/community/core/section/provider" ) // Provider represents Gemini @@ -33,7 +33,7 @@ func (*Provider) Meta() provider.TypeMeta { section := provider.TypeMeta{} section.ID = "23b133f9-4020-4616-9291-a98fb939735f" section.Title = "Gemini" - section.Description = "Display work items and tickets from workspaces" + section.Description = "Work items and tickets" section.ContentType = "gemini" return section diff --git a/core/section/markdown/markdown.go b/core/section/markdown/markdown.go index f6828de7..24ee7eb4 100644 --- a/core/section/markdown/markdown.go +++ b/core/section/markdown/markdown.go @@ -28,7 +28,7 @@ func (*Provider) Meta() provider.TypeMeta { section.ID = "1470bb4a-36c6-4a98-a443-096f5658378b" section.Title = "Markdown" - section.Description = "CommonMark based markdown content with preview" + section.Description = "CommonMark based content" section.ContentType = "markdown" section.Order = 9998 diff --git a/core/section/table/table.go b/core/section/table/table.go index 2d44a0bf..56c3195d 100644 --- a/core/section/table/table.go +++ b/core/section/table/table.go @@ -27,7 +27,7 @@ func (*Provider) Meta() provider.TypeMeta { section.ID = "81a2ea93-2dfc-434d-841e-54b832492c92" section.Title = "Tabular" - section.Description = "Rows, columns and formatting for tabular data" + section.Description = "Rows, columns for tabular data" section.ContentType = "table" section.Order = 9996 diff --git a/core/section/wysiwyg/wysiwyg.go b/core/section/wysiwyg/wysiwyg.go index 0c10f429..781bd89a 100644 --- a/core/section/wysiwyg/wysiwyg.go +++ b/core/section/wysiwyg/wysiwyg.go @@ -27,7 +27,7 @@ func (*Provider) Meta() provider.TypeMeta { section.ID = "0f024fa0-d017-4bad-a094-2c13ce6edad7" section.Title = "Rich Text" - section.Description = "WYSIWYG editing with cut-paste image support" + section.Description = "Rich text WYSIWYG" section.ContentType = "wysiwyg" section.Order = 9999