From b5569be15ec3b679d7fc6def15b15581661bb4bc Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Sat, 14 May 2016 18:51:47 -0700 Subject: [PATCH 01/24] initial trello smart section commit --- app/app/components/section/trello/code.go | 40 ++++++ .../components/section/trello/type-editor.js | 133 ++++++++++++++++++ .../section/trello/type-renderer.js | 4 + app/app/initializers/application.js | 1 + app/app/services/session.js | 7 +- app/app/styles/base.scss | 6 + .../components/section/trello/type-editor.hbs | 109 ++++++++++++++ .../section/trello/type-renderer.hbs | 4 + app/app/utils/model.js | 2 +- app/public/crossdomain.xml | 9 +- documize/section/trello.go | 39 +++++ 11 files changed, 347 insertions(+), 7 deletions(-) create mode 100644 app/app/components/section/trello/code.go create mode 100644 app/app/components/section/trello/type-editor.js create mode 100644 app/app/components/section/trello/type-renderer.js create mode 100644 app/app/templates/components/section/trello/type-editor.hbs create mode 100644 app/app/templates/components/section/trello/type-renderer.hbs create mode 100644 documize/section/trello.go diff --git a/app/app/components/section/trello/code.go b/app/app/components/section/trello/code.go new file mode 100644 index 00000000..77b8a20f --- /dev/null +++ b/app/app/components/section/trello/code.go @@ -0,0 +1,40 @@ +package section + +import ( + "net/http" +) + +type code struct { +} + +func init() { + sectionsMap["code"] = &code{} +} + +func (*code) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "4f6f2b02-8397-483d-9bb9-eea1fef13304" + section.Title = "Code" + section.Description = "Code snippets supporting 50+ languages" + section.ContentType = "code" + section.IconFontLigature = "code" + section.Order = 9997 + + return section +} + +// Command stub. +func (*code) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*code) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*code) Refresh(config, data string) string { + return data +} diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js new file mode 100644 index 00000000..5974177d --- /dev/null +++ b/app/app/components/section/trello/type-editor.js @@ -0,0 +1,133 @@ +/*global Trello*/ +import Ember from 'ember'; +import NotifierMixin from '../../../mixins/notifier'; +import TooltipMixin from '../../../mixins/tooltip'; + +export default Ember.Component.extend(NotifierMixin, TooltipMixin, { + sectionService: Ember.inject.service('section'), + isDirty: false, + waiting: false, + authenticated: false, + config: { + appKey: "", + board: null, + list: null, + cards: null + }, + boards: null, + lists: null, + + hasAppKey: function() { + console.log(is.not.empty(this.get('config.appKey'))); + return is.empty(this.get('config.appKey')) ? false : true; + }.property('config'), + + didReceiveAttrs() {}, + + willDestroyElement() { + this.destroyTooltips(); + }, + + getBoardLists() { + let self = this; + let board = this.get('config.board'); + + Trello.get(`boards/${board.id}/lists/open`, + function(lists) { + self.set('lists', lists); + + if (lists.length) { + self.set('config.list', lists[0]); + } + + self.getListCards(); + }); + }, + + getListCards() { + let self = this; + let list = this.get('config.list'); + + Trello.get(`lists/${list.id}/cards`, + function(cards) { + self.set('config.cards', cards); + console.log(cards); + }); + }, + + actions: { + isDirty() { + return this.get('isDirty'); + }, + + getAppKey() { + window.open("https://trello.com/app-key", "Trello App Key", ""); + }, + + getAuthToken() { + let appKey = this.get('config.appKey'); + let self = this; + + if (is.empty(appKey)) { + $("#trello-appkey").addClass("error").focus(); + return; + } + + Ember.$.getScript("https://api.trello.com/1/client.js?key=" + appKey, function() { + Trello.authorize({ + type: "popup", + name: "Documize", + scope: { + read: true, + write: false + }, + expiration: "never", + persist: true, + success: function() { + self.set('authenticated', true); + Trello.get("members/me/boards?fields=id,name,url,closed,prefs,idOrganization", + function(boards) { + self.set('boards', boards.filterBy("closed", false)); + let board = boards.length ? boards[0] : null; + self.set('config.board', board); + self.getBoardLists(); + }); + + Trello.get("members/me/organizations", + function(orgs) { + self.set('orgs', orgs); + console.log(orgs); + }); + + }, + error: function(error) { + self.showNotification("Unable to authenticate"); + console.log(error); + } + }); + }); + }, + + onBoardChange(board) { + this.set('config.board', board); + this.getBoardLists(); + }, + + onListChange(list) { + this.set('config.list', list); + this.getListCards(); + }, + + onCancel() { + this.attrs.onCancel(); + }, + + onAction(title) { + let page = this.get('page'); + let meta = this.get('meta'); + page.set('title', title); + + this.attrs.onAction(page, meta); + } + } +}); \ No newline at end of file diff --git a/app/app/components/section/trello/type-renderer.js b/app/app/components/section/trello/type-renderer.js new file mode 100644 index 00000000..926b6130 --- /dev/null +++ b/app/app/components/section/trello/type-renderer.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ +}); diff --git a/app/app/initializers/application.js b/app/app/initializers/application.js index 9418df90..29fb4035 100644 --- a/app/app/initializers/application.js +++ b/app/app/initializers/application.js @@ -2,6 +2,7 @@ export function initialize( /*application*/ ) { // address insecure jquery defaults (kudos: @nathanhammond) $.globalEval = function() {}; $.ajaxSetup({ + crossDomain: true, converters: { 'text script': text => text } diff --git a/app/app/services/session.js b/app/app/services/session.js index a31a5bcd..72b8f420 100644 --- a/app/app/services/session.js +++ b/app/app/services/session.js @@ -117,8 +117,13 @@ export default Ember.Service.extend({ this.storeSessionItem('token', token); this.storeSessionItem('user', JSON.stringify(user)); + let self = this; + $.ajaxPrefilter(function(options, originalOptions, jqXHR) { - jqXHR.setRequestHeader('Authorization', 'Bearer ' + token); + // We only tack on auth header for Documize API calls + if (is.startWith(options.url, self.get('appMeta.url'))) { + jqXHR.setRequestHeader('Authorization', 'Bearer ' + token); + } }); }, diff --git a/app/app/styles/base.scss b/app/app/styles/base.scss index 88c5a92a..a8466b81 100644 --- a/app/app/styles/base.scss +++ b/app/app/styles/base.scss @@ -60,6 +60,12 @@ $i: 150; $i: $i - 5; } +$i: 100; +@while $i > 0 { + .width-#{$i} { width: #{$i}#{"%"}; } + $i: $i - 5; +} + .no-outline { outline:none !important; diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs new file mode 100644 index 00000000..81dbad32 --- /dev/null +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -0,0 +1,109 @@ + + +{{#section/base-editor document=document folder=folder page=page busy=waiting tip="Trello, yellow, mellow" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} + +
+
+
+
+
Trello Authentication
+
Provide your Trello App Key
+
+
+
Get App Key
+ {{focus-input id="trello-appkey" type="text" value=config.appKey}} +
+
Authenticate
+
+
+
+ +{{#if authenticated}} +
+
+
+
+
Trello Boards / Lists
+
Select board and list to display
+
+
+
+ +
Select board for display
+ {{ui-select id="boards-dropdown" + content=boards + action=(action 'onBoardChange') + optionValuePath="id" + optionLabelPath="name" + selection=config.board}} +
+
+
+
+ +
Select list for display
+ {{ui-select id="lists-dropdown" + content=lists + action=(action 'onListChange') + optionValuePath="id" + optionLabelPath="name" + selection=config.list}} +
+
+
+
+
{{config.board.name}}
+
+
{{config.list.name}}
+ {{#each config.cards as |card|}} +
{{card.name}}
+ {{/each}} +
+
+ +
+
+{{/if}} + +{{/section/base-editor}} \ No newline at end of file diff --git a/app/app/templates/components/section/trello/type-renderer.hbs b/app/app/templates/components/section/trello/type-renderer.hbs new file mode 100644 index 00000000..e9a277b8 --- /dev/null +++ b/app/app/templates/components/section/trello/type-renderer.hbs @@ -0,0 +1,4 @@ + + +{{{page.body}}} \ No newline at end of file diff --git a/app/app/utils/model.js b/app/app/utils/model.js index ed2adfe8..ef31b346 100644 --- a/app/app/utils/model.js +++ b/app/app/utils/model.js @@ -25,7 +25,7 @@ let AppMeta = BaseModel.extend({ init() { this.set('host', config.apiHost); this.set('namespace', config.apiNamespace); - this.set('url', [config.host, config.namespace, ""].join('/')); + this.set('url', [config.apiHost, config.apiNamespace, ""].join('/')); }, getUrl(endpoint) { diff --git a/app/public/crossdomain.xml b/app/public/crossdomain.xml index 29a035d7..511fb2d6 100644 --- a/app/public/crossdomain.xml +++ b/app/public/crossdomain.xml @@ -4,12 +4,11 @@ - + - + --> + diff --git a/documize/section/trello.go b/documize/section/trello.go new file mode 100644 index 00000000..77e35afc --- /dev/null +++ b/documize/section/trello.go @@ -0,0 +1,39 @@ +package section + +import ( + "net/http" +) + +type trello struct { +} + +func init() { + sectionsMap["trello"] = &trello{} +} + +func (*trello) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "c455a552-202e-441c-ad79-397a8152920b" + section.Title = "Trello" + section.Description = "Trello boards" + section.ContentType = "trello" + section.IconFontLigature = "dashboard" + + return section +} + +// Command stub. +func (*trello) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*trello) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*trello) Refresh(config, data string) string { + return data +} From 20e70f52d0eb30e21afeba4bdc50fd2e14bdb6ae Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Sun, 15 May 2016 18:44:12 -0700 Subject: [PATCH 02/24] trello smart section config handling --- .../components/section/trello/type-editor.js | 134 ++++++++++++------ app/app/styles/widget/widget-input.scss | 10 ++ .../components/section/trello/type-editor.hbs | 108 +++++++------- .../section/trello/type-renderer.hbs | 43 +++++- 4 files changed, 190 insertions(+), 105 deletions(-) diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index 5974177d..b8b40af1 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -8,21 +8,34 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { isDirty: false, waiting: false, authenticated: false, - config: { - appKey: "", - board: null, - list: null, - cards: null - }, + config: {}, boards: null, lists: null, - hasAppKey: function() { - console.log(is.not.empty(this.get('config.appKey'))); - return is.empty(this.get('config.appKey')) ? false : true; - }.property('config'), + didReceiveAttrs() { + let config = {}; - didReceiveAttrs() {}, + try { + config = JSON.parse(this.get('meta.config')); + } catch (e) {} + + if (is.empty(config)) { + config = { + appKey: "", + token: "", + board: null, + list: null, + cards: null + }; + } + + this.set('config', config); + + if (this.get('config.appKey') !== "" && + this.get('config.token') !== "") { + this.send('auth'); + } + }, willDestroyElement() { this.destroyTooltips(); @@ -30,30 +43,52 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { getBoardLists() { let self = this; + let boards = this.get('boards'); let board = this.get('config.board'); + this.set('waiting', true); + + if (board === null) { + if (boards.length) { + board = boards[0]; + this.set('config.board', board); + } + } else { + this.set('config.board', boards.findBy('id', board.id)); + } Trello.get(`boards/${board.id}/lists/open`, function(lists) { - self.set('lists', lists); - - if (lists.length) { - self.set('config.list', lists[0]); + let savedLists = self.get('config.lists'); + if (savedLists === null) { + savedLists = []; } - self.getListCards(); + 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('waiting', false); + + // self.getListCards(); }); }, - getListCards() { - let self = this; - let list = this.get('config.list'); + // getListCards() { + // let self = this; + // let list = this.get('config.list'); - Trello.get(`lists/${list.id}/cards`, - function(cards) { - self.set('config.cards', cards); - console.log(cards); - }); - }, + // Trello.get(`lists/${list.id}/cards`, + // function(cards) { + // self.set('config.cards', cards); + // console.log(cards); + // }); + // }, actions: { isDirty() { @@ -64,18 +99,29 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { window.open("https://trello.com/app-key", "Trello App Key", ""); }, - getAuthToken() { - let appKey = this.get('config.appKey'); - let self = this; + onListCheckbox(id) { + let lists = this.get('config.lists'); + let list = lists.findBy('id', id); - if (is.empty(appKey)) { - $("#trello-appkey").addClass("error").focus(); + if (list !== null) { + Ember.set(list, 'included', !list.included); + } + }, + + auth() { + if (this.get('config.appKey') === "") { + $("#trello-appkey").addClass('error').focus(); + this.set('authenticated', false); return; } - Ember.$.getScript("https://api.trello.com/1/client.js?key=" + appKey, function() { + let self = this; + self.set('waiting', true); + + Ember.$.getScript("https://api.trello.com/1/client.js?key=" + this.get('config.appKey'), function() { Trello.authorize({ type: "popup", + // interactive: false, name: "Documize", scope: { read: true, @@ -85,22 +131,16 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { persist: true, success: function() { self.set('authenticated', true); + self.set('config.token', Trello.token()); Trello.get("members/me/boards?fields=id,name,url,closed,prefs,idOrganization", function(boards) { + self.set('waiting', false); self.set('boards', boards.filterBy("closed", false)); - let board = boards.length ? boards[0] : null; - self.set('config.board', board); self.getBoardLists(); }); - - Trello.get("members/me/organizations", - function(orgs) { - self.set('orgs', orgs); - console.log(orgs); - }); - }, error: function(error) { + self.set('waiting', false); self.showNotification("Unable to authenticate"); console.log(error); } @@ -109,14 +149,16 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { }, onBoardChange(board) { + this.set('isDirty', true); this.set('config.board', board); + this.set('config.lists', []); this.getBoardLists(); }, - onListChange(list) { - this.set('config.list', list); - this.getListCards(); - }, + // onListChange(list) { + // this.set('config.list', list); + // this.getListCards(); + // }, onCancel() { this.attrs.onCancel(); @@ -126,6 +168,10 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { let page = this.get('page'); let meta = this.get('meta'); page.set('title', title); + // meta.set('rawBody', JSON.stringify(this.get("items"))); + meta.set('rawBody', ''); + meta.set('config', JSON.stringify(this.get('config'))); + meta.set('externalSource', true); this.attrs.onAction(page, meta); } diff --git a/app/app/styles/widget/widget-input.scss b/app/app/styles/widget/widget-input.scss index c3849ac0..95398f72 100644 --- a/app/app/styles/widget/widget-input.scss +++ b/app/app/styles/widget/widget-input.scss @@ -186,3 +186,13 @@ .form-divider { margin-top: 30px; } + + +.widget-checkbox { + color: $color-link; + cursor: pointer; +} + +.checkbox-gray { + color: $color-gray !important; +} \ No newline at end of file diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 81dbad32..5be096b7 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -2,6 +2,8 @@ .board { width: 100%; padding: 10px; + white-space: nowrap; + overflow: auto } .board-title { @@ -14,7 +16,7 @@ background-color: #e2e4e6; padding: 10px; border-radius: 3px; - margin-top: 10px; + margin: 10px 10px 0 0; max-width: 300px; } @@ -22,23 +24,12 @@ font-weight: bold; color: #4c4c4c; font-size: 14px; - margin-bottom: 10px; + margin: 5px; } -.card { - color: #4c4c4c; - border-bottom: 1px solid #CDD2D4; - background-color: #fff; - border-radius: 3px; - padding: 7px 7px; - margin: 5px 0; - font-size: 14px; - font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; - line-height: 18px; - overflow: hidden; - word-wrap: break-word; +.list-checkbox { + vertical-align: text-bottom; } - {{#section/base-editor document=document folder=folder page=page busy=waiting tip="Trello, yellow, mellow" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} @@ -47,63 +38,60 @@
-
Trello Authentication
-
Provide your Trello App Key
+
Authentication
+
Provide Trello App Key and then authenticate
-
Get App Key
- {{focus-input id="trello-appkey" type="text" value=config.appKey}} + +
Use plain old button below to grab the magic key -- you might need to log into Trello
+ {{focus-input id="trello-appkey" type="password" value=config.appKey}}
-
Authenticate
+
Get App Key
+
+
Authenticate
{{#if authenticated}} -
+
-
-
-
Trello Boards / Lists
-
Select board and list to display
-
-
-
- -
Select board for display
- {{ui-select id="boards-dropdown" - content=boards - action=(action 'onBoardChange') - optionValuePath="id" - optionLabelPath="name" - selection=config.board}} -
-
-
-
- -
Select list for display
- {{ui-select id="lists-dropdown" - content=lists - action=(action 'onListChange') - optionValuePath="id" - optionLabelPath="name" - selection=config.list}} -
-
-
-
+
+
Select Board & Lists
+
Choose lists to include from board
+
+
+ +
Select board
+ {{ui-select id="boards-dropdown" + content=boards + action=(action 'onBoardChange') + optionValuePath="id" + optionLabelPath="name" + selection=config.board}} +
+
+ +
Select lists to include
+
{{config.board.name}}
-
-
{{config.list.name}}
- {{#each config.cards as |card|}} -
{{card.name}}
- {{/each}} -
+ {{#each config.lists as |list|}} +
+ {{#if list.included}} + check_box + {{else}} + check_box_outline_blank + {{/if}} + {{list.name}} + {{!----}} + {{!----}} +
+ {{/each}} +
- +
-
+
{{/if}} {{/section/base-editor}} \ No newline at end of file diff --git a/app/app/templates/components/section/trello/type-renderer.hbs b/app/app/templates/components/section/trello/type-renderer.hbs index e9a277b8..4c2c28eb 100644 --- a/app/app/templates/components/section/trello/type-renderer.hbs +++ b/app/app/templates/components/section/trello/type-renderer.hbs @@ -1,4 +1,45 @@ - {{{page.body}}} \ No newline at end of file From d697e7926b8f716a4b88e10e9ad83700cddded8e Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Mon, 16 May 2016 22:10:28 -0700 Subject: [PATCH 03/24] Trello board rendering --- app/app/components/section/trello/code.go | 40 --- .../components/section/trello/type-editor.js | 30 +- .../components/section/trello/type-editor.hbs | 26 +- .../section/trello/type-renderer.hbs | 19 +- documize/section/gemini.go | 53 ++-- documize/section/trello.go | 282 +++++++++++++++++- 6 files changed, 346 insertions(+), 104 deletions(-) delete mode 100644 app/app/components/section/trello/code.go diff --git a/app/app/components/section/trello/code.go b/app/app/components/section/trello/code.go deleted file mode 100644 index 77b8a20f..00000000 --- a/app/app/components/section/trello/code.go +++ /dev/null @@ -1,40 +0,0 @@ -package section - -import ( - "net/http" -) - -type code struct { -} - -func init() { - sectionsMap["code"] = &code{} -} - -func (*code) Meta() TypeMeta { - section := TypeMeta{} - - section.ID = "4f6f2b02-8397-483d-9bb9-eea1fef13304" - section.Title = "Code" - section.Description = "Code snippets supporting 50+ languages" - section.ContentType = "code" - section.IconFontLigature = "code" - section.Order = 9997 - - return section -} - -// Command stub. -func (*code) Command(w http.ResponseWriter, r *http.Request) { - writeEmpty(w) -} - -// Render just sends back HMTL as-is. -func (*code) Render(config, data string) string { - return data -} - -// Refresh just sends back data as-is. -func (*code) Refresh(config, data string) string { - return data -} diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index b8b40af1..b8480295 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -10,7 +10,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { authenticated: false, config: {}, boards: null, - lists: null, didReceiveAttrs() { let config = {}; @@ -24,8 +23,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { appKey: "", token: "", board: null, - list: null, - cards: null + lists: [] }; } @@ -47,7 +45,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { let board = this.get('config.board'); this.set('waiting', true); - if (board === null) { + if (is.null(board)) { if (boards.length) { board = boards[0]; this.set('config.board', board); @@ -56,7 +54,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.set('config.board', boards.findBy('id', board.id)); } - Trello.get(`boards/${board.id}/lists/open`, + Trello.get(`boards/${board.id}/lists/open?fields=id,name,url`, function(lists) { let savedLists = self.get('config.lists'); if (savedLists === null) { @@ -74,8 +72,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { self.set('config.lists', lists); self.set('waiting', false); - - // self.getListCards(); }); }, @@ -155,25 +151,31 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.getBoardLists(); }, - // onListChange(list) { - // this.set('config.list', list); - // this.getListCards(); - // }, - onCancel() { this.attrs.onCancel(); }, onAction(title) { + this.set('waiting', false); + + let self = this; let page = this.get('page'); let meta = this.get('meta'); page.set('title', title); - // meta.set('rawBody', JSON.stringify(this.get("items"))); meta.set('rawBody', ''); meta.set('config', JSON.stringify(this.get('config'))); meta.set('externalSource', true); - this.attrs.onAction(page, meta); + this.get('sectionService').fetch(page, "cards", this.get('config')) + .then(function(response) { + console.log(response); + meta.set('rawBody', JSON.stringify(response)); + self.set('waiting', false); + self.attrs.onAction(page, meta); + }, function(reason) { //jshint ignore: line + self.set('waiting', false); + self.attrs.onAction(page, meta); + }); } } }); \ No newline at end of file diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 5be096b7..6672552f 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -1,18 +1,18 @@ -{{#section/base-editor document=document folder=folder page=page busy=waiting tip="Trello, yellow, mellow" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} +{{#section/base-editor document=document folder=folder page=page busy=waiting tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}}
@@ -73,18 +73,16 @@
Select lists to include
-
-
{{config.board.name}}
+
+
{{config.board.name}}
{{#each config.lists as |list|}} -
+
{{#if list.included}} - check_box + check_box {{else}} - check_box_outline_blank + check_box_outline_blank {{/if}} - {{list.name}} - {{!----}} - {{!----}} + {{list.name}}
{{/each}}
diff --git a/app/app/templates/components/section/trello/type-renderer.hbs b/app/app/templates/components/section/trello/type-renderer.hbs index 4c2c28eb..db8fbf6b 100644 --- a/app/app/templates/components/section/trello/type-renderer.hbs +++ b/app/app/templates/components/section/trello/type-renderer.hbs @@ -1,5 +1,5 @@ diff --git a/documize/section/gemini.go b/documize/section/gemini.go index 33fb3a27..31e13c1a 100644 --- a/documize/section/gemini.go +++ b/documize/section/gemini.go @@ -13,8 +13,6 @@ import ( "github.com/documize/community/wordsmith/log" ) -const sectionName = "gemini" - // the HTML that is rendered by this section. const renderTemplate = `

The Gemini workspace {{.Config.WorkspaceName}} contains {{.Config.ItemCount}} items.

@@ -47,17 +45,16 @@ type gemini struct { // Register ourselves. func init() { - sectionsMap[sectionName] = &gemini{} + sectionsMap["gemini"] = &gemini{} } // Meta describes this section type. func (*gemini) Meta() TypeMeta { section := TypeMeta{} - section.ID = "23b133f9-4020-4616-9291-a98fb939735f" section.Title = "Gemini" section.Description = "Display work items and tickets from Gemini workspaces" - section.ContentType = sectionName + section.ContentType = "gemini" section.IconFontLigature = "" section.IconFilePath = "sections/gemini.png" @@ -93,7 +90,7 @@ func (*gemini) Command(w http.ResponseWriter, r *http.Request) { method := query.Get("method") if len(method) == 0 { - writeMessage(w, sectionName, "missing method name") + writeMessage(w, "gemini", "missing method name") return } @@ -222,7 +219,7 @@ func auth(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { - writeMessage(w, sectionName, "Bad payload") + writeMessage(w, "gemini", "Bad payload") return } @@ -230,24 +227,24 @@ func auth(w http.ResponseWriter, r *http.Request) { err = json.Unmarshal(body, &config) if err != nil { - writeMessage(w, sectionName, "Bad payload") + writeMessage(w, "gemini", "Bad payload") return } config.Clean() if len(config.URL) == 0 { - writeMessage(w, sectionName, "Missing URL value") + writeMessage(w, "gemini", "Missing URL value") return } if len(config.Username) == 0 { - writeMessage(w, sectionName, "Missing Username value") + writeMessage(w, "gemini", "Missing Username value") return } if len(config.APIKey) == 0 { - writeMessage(w, sectionName, "Missing APIKey value") + writeMessage(w, "gemini", "Missing APIKey value") return } @@ -261,7 +258,7 @@ func auth(w http.ResponseWriter, r *http.Request) { if err != nil { fmt.Println(err) - writeError(w, sectionName, err) + writeError(w, "gemini", err) return } @@ -278,7 +275,7 @@ func auth(w http.ResponseWriter, r *http.Request) { if err != nil { fmt.Println(err) - writeError(w, sectionName, err) + writeError(w, "gemini", err) return } @@ -290,7 +287,7 @@ func workspace(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { - writeMessage(w, sectionName, "Bad payload") + writeMessage(w, "gemini", "Bad payload") return } @@ -298,29 +295,29 @@ func workspace(w http.ResponseWriter, r *http.Request) { err = json.Unmarshal(body, &config) if err != nil { - writeMessage(w, sectionName, "Bad payload") + writeMessage(w, "gemini", "Bad payload") return } config.Clean() if len(config.URL) == 0 { - writeMessage(w, sectionName, "Missing URL value") + writeMessage(w, "gemini", "Missing URL value") return } if len(config.Username) == 0 { - writeMessage(w, sectionName, "Missing Username value") + writeMessage(w, "gemini", "Missing Username value") return } if len(config.APIKey) == 0 { - writeMessage(w, sectionName, "Missing APIKey value") + writeMessage(w, "gemini", "Missing APIKey value") return } if config.UserID == 0 { - writeMessage(w, sectionName, "Missing UserId value") + writeMessage(w, "gemini", "Missing UserId value") return } @@ -334,7 +331,7 @@ func workspace(w http.ResponseWriter, r *http.Request) { if err != nil { fmt.Println(err) - writeError(w, sectionName, err) + writeError(w, "gemini", err) return } @@ -363,7 +360,7 @@ func items(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { - writeMessage(w, sectionName, "Bad payload") + writeMessage(w, "gemini", "Bad payload") return } @@ -371,24 +368,24 @@ func items(w http.ResponseWriter, r *http.Request) { err = json.Unmarshal(body, &config) if err != nil { - writeMessage(w, sectionName, "Bad payload") + writeMessage(w, "gemini", "Bad payload") return } config.Clean() if len(config.URL) == 0 { - writeMessage(w, sectionName, "Missing URL value") + writeMessage(w, "gemini", "Missing URL value") return } if len(config.Username) == 0 { - writeMessage(w, sectionName, "Missing Username value") + writeMessage(w, "gemini", "Missing Username value") return } if len(config.APIKey) == 0 { - writeMessage(w, sectionName, "Missing APIKey value") + writeMessage(w, "gemini", "Missing APIKey value") return } @@ -397,7 +394,7 @@ func items(w http.ResponseWriter, r *http.Request) { filter, err := json.Marshal(config.Filter) if err != nil { fmt.Println(err) - writeError(w, sectionName, err) + writeError(w, "gemini", err) return } @@ -411,7 +408,7 @@ func items(w http.ResponseWriter, r *http.Request) { if err != nil { fmt.Println(err) - writeError(w, sectionName, err) + writeError(w, "gemini", err) return } @@ -428,7 +425,7 @@ func items(w http.ResponseWriter, r *http.Request) { if err != nil { fmt.Println(err) - writeError(w, sectionName, err) + writeError(w, "gemini", err) return } diff --git a/documize/section/trello.go b/documize/section/trello.go index 77e35afc..28c4f3c9 100644 --- a/documize/section/trello.go +++ b/documize/section/trello.go @@ -1,7 +1,13 @@ package section import ( + "bytes" + "encoding/json" + "fmt" + "html/template" + "io/ioutil" "net/http" + "strings" ) type trello struct { @@ -13,7 +19,6 @@ func init() { func (*trello) Meta() TypeMeta { section := TypeMeta{} - section.ID = "c455a552-202e-441c-ad79-397a8152920b" section.Title = "Trello" section.Description = "Trello boards" @@ -25,15 +30,286 @@ func (*trello) Meta() TypeMeta { // Command stub. func (*trello) Command(w http.ResponseWriter, r *http.Request) { - writeEmpty(w) + query := r.URL.Query() + method := query.Get("method") + + if len(method) == 0 { + writeMessage(w, "trello", "missing method name") + return + } + + switch method { + case "cards": + cards(w, r) + } } // Render just sends back HMTL as-is. func (*trello) Render(config, data string) string { - return data + raw := []trelloListCards{} + payload := trelloRender{} + var c = trelloConfig{} + + json.Unmarshal([]byte(data), &raw) + json.Unmarshal([]byte(config), &c) + + payload.Board = c.Board + payload.Data = raw + payload.ListCount = len(raw) + + for _, list := range raw { + payload.CardCount += len(list.Cards) + } + + t := template.New("trello") + t, _ = t.Parse(trelloTemplate) + + buffer := new(bytes.Buffer) + t.Execute(buffer, payload) + + return buffer.String() } // Refresh just sends back data as-is. func (*trello) Refresh(config, data string) string { return data } + +// Helpers +func cards(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + body, err := ioutil.ReadAll(r.Body) + + if err != nil { + writeMessage(w, "trello", "Bad body") + return + } + + var config = trelloConfig{} + err = json.Unmarshal(body, &config) + + if err != nil { + writeError(w, "trello", err) + // writeMessage(w, "trello", "Bad payload") + return + } + + config.Clean() + + if len(config.AppKey) == 0 { + writeMessage(w, "trello", "Missing appKey") + return + } + + if len(config.Token) == 0 { + writeMessage(w, "trello", "Missing token") + return + } + + render := []trelloListCards{} + + for _, list := range config.Lists { + + if !list.Included { + continue + } + + req, err := http.NewRequest("GET", fmt.Sprintf("https://api.trello.com/1/lists/%s/cards?key=%s&token=%s", list.ID, config.AppKey, config.Token), nil) + client := &http.Client{} + res, err := client.Do(req) + + if err != nil { + fmt.Println(err) + writeError(w, "trello", err) + return + } + + if res.StatusCode != http.StatusOK { + writeForbidden(w) + return + } + + defer res.Body.Close() + var cards []trelloCard + + dec := json.NewDecoder(res.Body) + err = dec.Decode(&cards) + + if err != nil { + fmt.Println(err) + writeError(w, "trello", err) + return + } + + data := trelloListCards{} + data.Cards = cards + data.List = list + + render = append(render, data) + } + + writeJSON(w, render) +} + +type trelloConfig struct { + AppKey string `json:"appKey"` + Token string `json:"token"` + Board trelloBoard `json:"board"` + Lists []trelloList `json:"lists"` +} + +func (c *trelloConfig) Clean() { + c.AppKey = strings.TrimSpace(c.AppKey) + c.Token = strings.TrimSpace(c.Token) +} + +type trelloBoard struct { + ID string `json:"id"` + Name string `json:"name"` + Desc string `json:"desc"` + DescData struct { + Emoji struct{} `json:"emoji"` + } `json:"descData"` + Closed bool `json:"closed"` + OrganizationID string `json:"idOrganization"` + Pinned bool `json:"pinned"` + URL string `json:"url"` + ShortURL string `json:"shortUrl"` + Prefs struct { + PermissionLevel string `json:"permissionLevel"` + Voting string `json:"voting"` + Comments string `json:"comments"` + Invitations string `json:"invitations"` + SelfJoin bool `json:"selfjoin"` + CardCovers bool `json:"cardCovers"` + CardAging string `json:"cardAging"` + CalendarFeedEnabled bool `json:"calendarFeedEnabled"` + Background string `json:"background"` + BackgroundColor string `json:"backgroundColor"` + BackgroundImage string `json:"backgroundImage"` + BackgroundImageScaled []trelloBoardBackground `json:"backgroundImageScaled"` + BackgroundTile bool `json:"backgroundTile"` + BackgroundBrightness string `json:"backgroundBrightness"` + CanBePublic bool `json:"canBePublic"` + CanBeOrg bool `json:"canBeOrg"` + CanBePrivate bool `json:"canBePrivate"` + CanInvite bool `json:"canInvite"` + } `json:"prefs"` + LabelNames struct { + Red string `json:"red"` + Orange string `json:"orange"` + Yellow string `json:"yellow"` + Green string `json:"green"` + Blue string `json:"blue"` + Purple string `json:"purple"` + } `json:"labelNames"` +} + +type trelloBoardBackground struct { + width int `json:"width"` + height int `json:"height"` + url string `json:"url"` +} + +type trelloList struct { + ID string `json:"id"` + Name string `json:"name"` + Closed bool `json:"closed"` + BoardID string `json:"idBoard"` + Pos float32 `json:"pos"` + Included bool `json:"included"` // indicates whether we display cards from this list +} + +type trelloCard struct { + ID string `json:"id"` + Name string `json:"name"` + Email string `json:"email"` + ShortID int `json:"idShort"` + AttachmentCoverID string `json:"idAttachmentCover"` + CheckListsID []string `json:"idCheckLists"` + BoardID string `json:"idBoard"` + ListID string `json:"idList"` + MembersID []string `json:"idMembers"` + MembersVotedID []string `json:"idMembersVoted"` + ManualCoverAttachment bool `json:"manualCoverAttachment"` + Closed bool `json:"closed"` + Pos float32 `json:"pos"` + ShortLink string `json:"shortLink"` + DateLastActivity string `json:"dateLastActivity"` + ShortURL string `json:"shortUrl"` + Subscribed bool `json:"subscribed"` + URL string `json:"url"` + Due string `json:"due"` + Desc string `json:"desc"` + DescData struct { + Emoji struct{} `json:"emoji"` + } `json:"descData"` + CheckItemStates []struct { + CheckItemID string `json:"idCheckItem"` + State string `json:"state"` + } `json:"checkItemStates"` + Badges struct { + Votes int `json:"votes"` + ViewingMemberVoted bool `json:"viewingMemberVoted"` + Subscribed bool `json:"subscribed"` + Fogbugz string `json:"fogbugz"` + CheckItems int `json:"checkItems"` + CheckItemsChecked int `json:"checkItemsChecked"` + Comments int `json:"comments"` + Attachments int `json:"attachments"` + Description bool `json:"description"` + Due string `json:"due"` + } `json:"badges"` + Labels []struct { + Color string `json:"color"` + Name string `json:"name"` + } `json:"labels"` +} + +type trelloListCards struct { + List trelloList + Cards []trelloCard +} + +type trelloRender struct { + Board trelloBoard + Data []trelloListCards + CardCount int + ListCount int +} + +// the HTML that is rendered by this section +const trelloTemplate = ` +

There are {{ .CardCount }} cards across {{ .ListCount }} lists for board {{.Board.Name}}.

+
+
{{.Board.Name}}
+ {{range $data := .Data}} +
+
{{ $data.List.Name }}
+ {{range $card := $data.Cards}} + +
+ {{ $card.Name }} +
+
+ {{end}} +
+ {{end}} +
+` + +/* + +refresh method + +does server side load up all data? YES!!?? + +we need method to use different trello accounts + - does this mean logout button? + - does this only work on add section phase? + +is appKey is global? + - where stored? + - how access? + - does section.go ask config to give us saved json +*/ From 8bee0114879226e84bfd378cb4c77041c3b8f5df Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 11:38:15 -0700 Subject: [PATCH 04/24] refresh method for Trello section --- documize/section/trello.go | 57 ++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/documize/section/trello.go b/documize/section/trello.go index 28c4f3c9..033bc908 100644 --- a/documize/section/trello.go +++ b/documize/section/trello.go @@ -8,6 +8,8 @@ import ( "io/ioutil" "net/http" "strings" + + "github.com/documize/community/wordsmith/log" ) type trello struct { @@ -72,7 +74,23 @@ func (*trello) Render(config, data string) string { // Refresh just sends back data as-is. func (*trello) Refresh(config, data string) string { - return data + var c = trelloConfig{} + json.Unmarshal([]byte(config), &c) + + refreshed, err := getCards(c) + + if err != nil { + return data + } + + j, err := json.Marshal(refreshed) + + if err != nil { + log.Error("unable to marshall trello cards", err) + return data + } + + return string(j) } // Helpers @@ -106,8 +124,18 @@ func cards(w http.ResponseWriter, r *http.Request) { return } - render := []trelloListCards{} + render, err := getCards(config) + if err != nil { + fmt.Println(err) + writeError(w, "trello", err) + return + } + + writeJSON(w, render) +} + +func getCards(config trelloConfig) (listCards []trelloListCards, err error) { for _, list := range config.Lists { if !list.Included { @@ -119,14 +147,11 @@ func cards(w http.ResponseWriter, r *http.Request) { res, err := client.Do(req) if err != nil { - fmt.Println(err) - writeError(w, "trello", err) - return + return nil, err } if res.StatusCode != http.StatusOK { - writeForbidden(w) - return + return nil, fmt.Errorf("error: HTTP status code %d", res.StatusCode) } defer res.Body.Close() @@ -136,19 +161,17 @@ func cards(w http.ResponseWriter, r *http.Request) { err = dec.Decode(&cards) if err != nil { - fmt.Println(err) - writeError(w, "trello", err) - return + return nil, err } data := trelloListCards{} data.Cards = cards data.List = list - render = append(render, data) + listCards = append(listCards, data) } - writeJSON(w, render) + return listCards, nil } type trelloConfig struct { @@ -206,9 +229,9 @@ type trelloBoard struct { } type trelloBoardBackground struct { - width int `json:"width"` - height int `json:"height"` - url string `json:"url"` + Width int `json:"width"` + Height int `json:"height"` + URL string `json:"url"` } type trelloList struct { @@ -299,10 +322,8 @@ const trelloTemplate = ` ` /* - -refresh method - does server side load up all data? YES!!?? +owner read-only control? we need method to use different trello accounts - does this mean logout button? From 2f645c029fe5e781311e7fd7b6c85be85d0884c6 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 12:22:30 -0700 Subject: [PATCH 05/24] JS copyright notice --- app/app/app.js | 19 +- .../components/document/document-editor.js | 11 + .../document/document-sidebar-edits.js | 11 + .../document/document-sidebar-toc.js | 241 ++++++++++-------- .../document/document-sidebar-viewers.js | 11 + .../components/document/document-sidebar.js | 11 + .../components/document/document-toolbar.js | 11 + app/app/components/document/document-view.js | 11 + app/app/components/document/editor-history.js | 28 +- app/app/components/document/page-heading.js | 11 + app/app/components/document/page-wizard.js | 73 +++--- app/app/components/document/tag-editor.js | 93 ++++--- app/app/components/dropdown-dialog.js | 92 ++++--- app/app/components/dropdown-menu.js | 28 +- app/app/components/focus-input.js | 13 +- app/app/components/focus-textarea.js | 13 +- app/app/components/folder/document-tags.js | 13 +- app/app/components/folder/documents-list.js | 39 ++- app/app/components/folder/folder-dashboard.js | 123 +++++---- app/app/components/folder/folder-settings.js | 29 ++- app/app/components/folder/folders-list.js | 107 ++++---- app/app/components/folder/start-document.js | 142 ++++++----- app/app/components/header/message-box.js | 14 +- app/app/components/header/page-navigation.js | 26 +- app/app/components/header/search-box.js | 13 +- app/app/components/layout/page-container.js | 14 +- app/app/components/layout/page-content.js | 14 +- app/app/components/layout/page-sidebar.js | 14 +- app/app/components/onboard/share-folder.js | 62 ++--- app/app/components/search/search-results.js | 16 +- app/app/components/search/tag-list.js | 13 +- app/app/components/section/base-editor.js | 11 + app/app/components/section/base-renderer.js | 19 +- .../components/section/code/type-editor.js | 11 + .../components/section/code/type-renderer.js | 11 + .../components/section/gemini/type-editor.js | 11 + .../section/gemini/type-renderer.js | 14 +- .../components/section/trello/type-editor.js | 17 ++ .../section/trello/type-renderer.js | 14 +- .../components/section/wysiwyg/type-editor.js | 11 + .../section/wysiwyg/type-renderer.js | 14 +- app/app/components/settings/user-list.js | 230 +++++++++-------- app/app/components/ui-select.js | 15 +- app/app/components/user-notification.js | 15 +- app/app/components/widget-sample.js | 29 ++- app/app/helpers/document/file-icon.js | 16 +- app/app/helpers/document/toc-entry.js | 17 +- app/app/helpers/formatted-date.js | 13 +- app/app/helpers/generate-id.js | 13 +- app/app/helpers/is-equal.js | 13 +- app/app/helpers/is-not.js | 13 +- app/app/helpers/read-path.js | 13 +- app/app/helpers/time-ago.js | 13 +- app/app/helpers/user-initials.js | 15 +- app/app/initializers/application.js | 11 + app/app/initializers/audit.js | 12 +- app/app/initializers/browser.js | 13 +- app/app/initializers/event-bus.js | 13 +- app/app/initializers/logger.js | 13 +- app/app/initializers/session.js | 13 +- app/app/mixins/notifier.js | 19 +- app/app/mixins/tooltip.js | 43 ++-- app/app/resolver.js | 13 +- app/app/router.js | 11 + app/app/routes/application.js | 11 + app/app/services/audit.js | 16 +- app/app/services/base.js | 22 +- app/app/services/browser.js | 15 +- app/app/services/document.js | 11 + app/app/services/event-bus.js | 13 +- app/app/services/folder.js | 45 ++-- app/app/services/logger.js | 13 +- app/app/services/organization.js | 19 +- app/app/services/search.js | 17 +- app/app/services/section.js | 11 + app/app/services/session.js | 11 + app/app/services/template.js | 29 ++- app/app/services/user.js | 11 + app/app/styles/app.scss | 11 + app/app/styles/base.scss | 11 + app/app/styles/color.scss | 15 +- .../components/section/trello/type-editor.hbs | 10 +- app/app/utils/constants.js | 23 +- app/app/utils/date.js | 13 +- app/app/utils/encoding.js | 104 +++++++- app/app/utils/misc.js | 20 +- app/app/utils/model.js | 11 + app/app/utils/net.js | 23 +- app/app/utils/string.js | 17 +- app/ember-cli-build.js | 11 + documize/section/code.go | 11 + documize/section/trello.go | 15 +- 92 files changed, 1835 insertions(+), 729 deletions(-) diff --git a/app/app/app.js b/app/app/app.js index 98abc2bc..39e6de86 100644 --- a/app/app/app.js +++ b/app/app/app.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; @@ -13,11 +24,11 @@ Ember.RSVP.on('error', function(error) { }); App = Ember.Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver }); loadInitializers(App, config.modulePrefix); -export default App; +export default App; \ No newline at end of file diff --git a/app/app/components/document/document-editor.js b/app/app/components/document/document-editor.js index a4bb4744..f958a111 100644 --- a/app/app/components/document/document-editor.js +++ b/app/app/components/document/document-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/document/document-sidebar-edits.js b/app/app/components/document/document-sidebar-edits.js index 86770cbc..da17e751 100644 --- a/app/app/components/document/document-sidebar-edits.js +++ b/app/app/components/document/document-sidebar-edits.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/document/document-sidebar-toc.js b/app/app/components/document/document-sidebar-toc.js index 5f94754c..ef0f239c 100644 --- a/app/app/components/document/document-sidebar-toc.js +++ b/app/app/components/document/document-sidebar-toc.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; @@ -8,7 +19,12 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { pages: [], page: "", showToc: false, - tocTools: { UpTarget: "", DownTarget: "", AllowIndent: false, AllowOutdent: false }, + tocTools: { + UpTarget: "", + DownTarget: "", + AllowIndent: false, + AllowOutdent: false + }, actionablePage: false, upDisabled: true, downDisabled: true, @@ -17,36 +33,36 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { didReceiveAttrs: function() { this.set('showToc', is.not.undefined(this.get('pages')) && this.get('pages').get('length') > 2); - if (is.not.null(this.get('page'))) { + if (is.not.null(this.get('page'))) { this.send('clickGotoPage', 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")); - } + 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'); + 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'); - } - }); - }, + 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'); @@ -77,9 +93,11 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.set('page', pageId); var toc = this.get('pages'); - var page = _.findWhere(toc, {id: pageId}); + var page = _.findWhere(toc, { + id: pageId + }); - // handle root node + // handle root node if (is.undefined(page) || page.level === 1) { return; } @@ -90,8 +108,8 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { return; } - var upPage = toc[index-1]; - var downPage = toc[index+1]; + var upPage = toc[index - 1]; + var downPage = toc[index + 1]; if (_.isUndefined(upPage)) { this.set('tocTools.UpTarget', ""); @@ -103,39 +121,31 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { // can we go up? // can we indent? - if (!_.isUndefined(upPage)) - { + if (!_.isUndefined(upPage)) { // can only go up if someone is same or higher level? var index2 = _.indexOf(toc, upPage, false); - if (index2 !== -1) - { + if (index2 !== -1) { // up - for (var i = index2; i > 0; i--) - { - if (page.level > toc[i].level) - { + for (var i = index2; i > 0; i--) { + if (page.level > toc[i].level) { break; } - if (page.level === toc[i].level) - { + if (page.level === toc[i].level) { this.set('tocTools.UpTarget', toc[i].id); break; } } // indent? - for (var i2 = index2; i2 > 0; i2--) - { - if (toc[i2].level < page.level) - { + for (var i2 = index2; i2 > 0; i2--) { + if (toc[i2].level < page.level) { this.set('tocTools.AllowIndent', false); break; } - if (page.level === toc[i2].level) - { + if (page.level === toc[i2].level) { this.set('tocTools.AllowIndent', true); break; } @@ -143,30 +153,24 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } // if page above is root node then some things you can't do - if (upPage.level === 1) - { + if (upPage.level === 1) { this.set('tocTools.AllowIndent', false); this.set('tocTools.UpTarget', ""); } } // can we go down? - if (!_.isUndefined(downPage)) - { + if (!_.isUndefined(downPage)) { // can only go down if someone below is at our level or higher var index3 = _.indexOf(toc, downPage, false); - if (index3 !== -1) - { - for (var i3 = index3; i3 < toc.length; i3++) - { - if (toc[i3].level < page.level) - { + if (index3 !== -1) { + for (var i3 = index3; i3 < toc.length; i3++) { + if (toc[i3].level < page.level) { break; } - if (page.level === toc[i3].level) - { + if (page.level === toc[i3].level) { this.set('tocTools.DownTarget', toc[i3].id); break; } @@ -201,8 +205,12 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } var pages = this.get('pages'); - var current = _.findWhere(pages, {id: this.get('page')}); - var page1 = _.findWhere(pages, {id: this.tocTools.UpTarget}); + var current = _.findWhere(pages, { + id: this.get('page') + }); + var page1 = _.findWhere(pages, { + id: this.tocTools.UpTarget + }); var page2 = null; var pendingChanges = []; @@ -221,30 +229,33 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { var index = _.indexOf(pages, current, false); - if (index !== -1) - { + if (index !== -1) { var sequence = (sequence1 + sequence2) / 2; - pendingChanges.push({ pageId: current.id, sequence: sequence }); + pendingChanges.push({ + pageId: current.id, + sequence: sequence + }); - for (var i = index + 1; i < pages.length; i++) - { - if (pages[i].level <= current.level) - { + for (var i = index + 1; i < pages.length; i++) { + if (pages[i].level <= current.level) { break; } sequence = (sequence + page1.sequence) / 2; - pendingChanges.push({ pageId: pages[i].id, sequence: sequence }); + pendingChanges.push({ + pageId: pages[i].id, + sequence: sequence + }); } } this.attrs.changePageSequence(pendingChanges); - this.send('clickGotoPage', this.get('page')); + this.send('clickGotoPage', this.get('page')); this.audit.record("moved-page-up"); - this.showNotification("Moved up"); + this.showNotification("Moved up"); }, // Move down -- pages below shift up. @@ -254,9 +265,13 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } var pages = this.get('pages'); - var current = _.findWhere(pages, {id: this.get('page')}); + var current = _.findWhere(pages, { + id: this.get('page') + }); var pageIndex = _.indexOf(pages, current, false); - var downTarget = _.findWhere(pages, {id: this.tocTools.DownTarget}); + var downTarget = _.findWhere(pages, { + id: this.tocTools.DownTarget + }); var downTargetIndex = _.indexOf(pages, downTarget, false); var pendingChanges = []; @@ -267,53 +282,53 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { var startingSequence = 0; var upperSequence = 0; var cutOff = _.rest(pages, downTargetIndex); - var siblings = _.reject(cutOff, function(p){ return p.level !== current.level || p.id === current.id || p.id === downTarget.id; }); + var siblings = _.reject(cutOff, function(p) { + return p.level !== current.level || p.id === current.id || p.id === downTarget.id; + }); - if (siblings.length > 0) - { + if (siblings.length > 0) { var aboveThisGuy = siblings[0]; var belowThisGuy = pages[_.indexOf(pages, aboveThisGuy, false) - 1]; - if (is.not.null(belowThisGuy) && belowThisGuy.level > current.level) - { + if (is.not.null(belowThisGuy) && belowThisGuy.level > current.level) { startingSequence = (aboveThisGuy.sequence + belowThisGuy.sequence) / 2; upperSequence = aboveThisGuy.sequence; - } - else - { + } else { var otherGuy = pages[downTargetIndex + 1]; startingSequence = (otherGuy.sequence + downTarget.sequence) / 2; upperSequence = otherGuy.sequence; } - } - else - { + } else { startingSequence = downTarget.sequence * 2; upperSequence = startingSequence * 2; } - pendingChanges.push({ pageId: current.id, sequence: startingSequence }); + pendingChanges.push({ + pageId: current.id, + sequence: startingSequence + }); var sequence = (startingSequence + upperSequence) / 2; - for (var i = pageIndex + 1; i < pages.length; i++) - { - if (pages[i].level <= current.level) - { + for (var i = pageIndex + 1; i < pages.length; i++) { + if (pages[i].level <= current.level) { break; } var sequence2 = (sequence + upperSequence) / 2; - pendingChanges.push({ pageId: pages[i].id, sequence: sequence2 }); + pendingChanges.push({ + pageId: pages[i].id, + sequence: sequence2 + }); } this.attrs.changePageSequence(pendingChanges); - this.send('clickGotoPage', this.get('page')); + this.send('clickGotoPage', this.get('page')); this.audit.record("moved-page-down"); - this.showNotification("Moved down"); + this.showNotification("Moved down"); }, // Indent - changes a page from H2 to H3, etc. @@ -323,27 +338,33 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } var pages = this.get('pages'); - var current = _.findWhere(pages, {id: this.get('page')}); + var current = _.findWhere(pages, { + id: this.get('page') + }); var pageIndex = _.indexOf(pages, current, false); var pendingChanges = []; - pendingChanges.push({ pageId: current.id, level: current.level + 1 }); + pendingChanges.push({ + pageId: current.id, + level: current.level + 1 + }); - for (var i = pageIndex + 1; i < pages.length; i++) - { - if (pages[i].level <= current.level) - { + for (var i = pageIndex + 1; i < pages.length; i++) { + if (pages[i].level <= current.level) { break; } - pendingChanges.push({ pageId: pages[i].id, level: pages[i].level + 1 }); + pendingChanges.push({ + pageId: pages[i].id, + level: pages[i].level + 1 + }); } this.attrs.changePageLevel(pendingChanges); - this.send('clickGotoPage', this.get('page')); + this.send('clickGotoPage', this.get('page')); this.audit.record("changed-page-sequence"); - this.showNotification("Indent"); + this.showNotification("Indent"); }, // Outdent - changes a page from H3 to H2, etc. @@ -353,26 +374,32 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } var pages = this.get('pages'); - var current = _.findWhere(pages, {id: this.get('page')}); + var current = _.findWhere(pages, { + id: this.get('page') + }); var pageIndex = _.indexOf(pages, current, false); var pendingChanges = []; - pendingChanges.push({ pageId: current.id, level: current.level - 1 }); + pendingChanges.push({ + pageId: current.id, + level: current.level - 1 + }); - for (var i = pageIndex + 1; i < pages.length; i++) - { - if (pages[i].level <= current.level) - { + for (var i = pageIndex + 1; i < pages.length; i++) { + if (pages[i].level <= current.level) { break; } - pendingChanges.push({ pageId: pages[i].id, level: pages[i].level - 1 }); + pendingChanges.push({ + pageId: pages[i].id, + level: pages[i].level - 1 + }); } this.attrs.changePageLevel(pendingChanges); this.audit.record("changed-page-sequence"); - this.showNotification("Outdent"); - this.send('clickGotoPage', this.get('page')); + this.showNotification("Outdent"); + this.send('clickGotoPage', this.get('page')); }, clickGotoPage(id) { @@ -380,4 +407,4 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.attrs.gotoPage(id); }, }, -}); +}); \ No newline at end of file diff --git a/app/app/components/document/document-sidebar-viewers.js b/app/app/components/document/document-sidebar-viewers.js index 969824b7..47a2a6c9 100644 --- a/app/app/components/document/document-sidebar-viewers.js +++ b/app/app/components/document/document-sidebar-viewers.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/document/document-sidebar.js b/app/app/components/document/document-sidebar.js index 889bb047..3da1ee56 100644 --- a/app/app/components/document/document-sidebar.js +++ b/app/app/components/document/document-sidebar.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/document/document-toolbar.js b/app/app/components/document/document-toolbar.js index 4f4a6049..077bde0f 100644 --- a/app/app/components/document/document-toolbar.js +++ b/app/app/components/document/document-toolbar.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; diff --git a/app/app/components/document/document-view.js b/app/app/components/document/document-view.js index 708bbc44..5ecbbe32 100644 --- a/app/app/components/document/document-view.js +++ b/app/app/components/document/document-view.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; diff --git a/app/app/components/document/editor-history.js b/app/app/components/document/editor-history.js index d42a1f33..815e656a 100644 --- a/app/app/components/document/editor-history.js +++ b/app/app/components/document/editor-history.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -27,8 +38,11 @@ export default Ember.Component.extend({ didRender() { let self = this; - Ember.run.schedule('afterRender', function(){ - Mousetrap.bind('esc', function() { self.send('cancelAction'); return false;}); + Ember.run.schedule('afterRender', function() { + Mousetrap.bind('esc', function() { + self.send('cancelAction'); + return false; + }); }); }, @@ -45,15 +59,17 @@ export default Ember.Component.extend({ Ember.set(revision, 'selected', false); }); - let revision = _.findWhere(revisions, { id: revisionId}); + 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)); + self.set('busy', false); + self.set('diffReport', Ember.String.htmlSafe(response)); }); }, @@ -67,4 +83,4 @@ export default Ember.Component.extend({ } } } -}); +}); \ No newline at end of file diff --git a/app/app/components/document/page-heading.js b/app/app/components/document/page-heading.js index 165bcfb3..64b060b2 100644 --- a/app/app/components/document/page-heading.js +++ b/app/app/components/document/page-heading.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import TooltipMixin from '../../mixins/tooltip'; diff --git a/app/app/components/document/page-wizard.js b/app/app/components/document/page-wizard.js index 5669b3df..17842d67 100644 --- a/app/app/components/document/page-wizard.js +++ b/app/app/components/document/page-wizard.js @@ -1,43 +1,54 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ - title: "", - contentType: "", + title: "", + contentType: "", - didReceiveAttrs() { - let section = this.get("sections").get('firstObject'); - section.set("selected", true); - }, + didReceiveAttrs() { + let section = this.get("sections").get('firstObject'); + section.set("selected", true); + }, - didInsertElement() { - $("#page-title").removeClass("error").focus(); - }, + didInsertElement() { + $("#page-title").removeClass("error").focus(); + }, - actions: { - setOption(id) { - let sections = this.get("sections"); + actions: { + setOption(id) { + let sections = this.get("sections"); - sections.forEach(function(option) { - Ember.set(option, 'selected', option.id === id); - }); + sections.forEach(function(option) { + Ember.set(option, 'selected', option.id === id); + }); - this.set("sections", sections); - }, + this.set("sections", sections); + }, - onCancel() { - this.attrs.onCancel(); - }, + onCancel() { + this.attrs.onCancel(); + }, - onAction() { - let title = this.get("title"); - let contentType = this.get("sections").findBy("selected", true).contentType; + onAction() { + let title = this.get("title"); + let contentType = this.get("sections").findBy("selected", true).contentType; - if (is.empty(title)) { - $("#page-title").addClass("error").focus(); - return; - } + if (is.empty(title)) { + $("#page-title").addClass("error").focus(); + return; + } - this.attrs.onAction(title, contentType); - } - } -}); + this.attrs.onAction(title, contentType); + } + } +}); \ No newline at end of file diff --git a/app/app/components/document/tag-editor.js b/app/app/components/document/tag-editor.js index 9a212f93..1d189887 100644 --- a/app/app/components/document/tag-editor.js +++ b/app/app/components/document/tag-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -6,7 +17,7 @@ export default Ember.Component.extend({ isEditor: false, newTag: "", maxTags: 3, - canAdd: false, + canAdd: false, didInitAttrs() { let tagz = []; @@ -21,61 +32,61 @@ export default Ember.Component.extend({ } this.set('tagz', tagz); - this.set('canAdd', this.get('isEditor') && this.get('tagz').get('length') < 3); + 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); - }, + didUpdateAttrs() { + this.set('canAdd', this.get('isEditor') && this.get('tagz').get('length') < 3); + }, - didInsertElement() { + didInsertElement() { - }, + }, - willDestroyElement() { - $("#add-tag-field").off("keydown"); - }, + willDestroyElement() { + $("#add-tag-field").off("keydown"); + }, actions: { - onTagEditor() { - $("#add-tag-field").off("keydown").on("keydown", function(e) { - if (e.shiftKey) { - return false; - } + 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; - } + 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; - }); - }, + return false; + }); + }, - addTag() { - let tags = this.get("tagz"); - let tag = this.get('newTag'); - tag = tag.toLowerCase().trim(); + 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; - } + // 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', ''); + tags.pushObject(tag); + this.set('tagz', tags); + this.set('newTag', ''); - let save = "#"; - _.each(tags, function(tag) { - save = save + tag + "#"; - }); + let save = "#"; + _.each(tags, function(tag) { + save = save + tag + "#"; + }); - this.get('onChange')(save); + this.get('onChange')(save); - this.audit.record('added-tag'); + this.audit.record('added-tag'); - return true; - }, + return true; + }, // removeTag removes specified tag from the list of tags associated with this document. removeTag(tagToRemove) { @@ -97,4 +108,4 @@ export default Ember.Component.extend({ this.audit.record('removed tag'); }, } -}); +}); \ No newline at end of file diff --git a/app/app/components/dropdown-dialog.js b/app/app/components/dropdown-dialog.js index f08ecfbf..09c6e1f9 100644 --- a/app/app/components/dropdown-dialog.js +++ b/app/app/components/dropdown-dialog.js @@ -1,29 +1,39 @@ -// Copyright (c) 2015 Documize Inc. +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import stringUtil from '../utils/string'; export default Ember.Component.extend({ - drop: null, + drop: null, target: null, button: "Delete", - color: "flat-red", - button2: "", - color2: "2", + 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", + 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", - hasSecondButton: Ember.computed('button2', 'color2', function() { - return is.not.empty(this.get('button2')) && is.not.empty(this.get('color2')); - }), + 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)); @@ -37,35 +47,35 @@ export default Ember.Component.extend({ target: document.getElementById(self.get('target')), content: self.$(".dropdown-dialog")[0], classes: 'drop-theme-basic', - position: self.get('position'), + position: self.get('position'), openOn: self.get('open'), - tetherOptions: { + tetherOptions: { offset: self.offset, targetOffset: self.targetOffset }, - remove: true + remove: true }); - self.set('drop', drop); + self.set('drop', drop); - drop.on('open', function() { - if (is.not.null(self.get("focusOn"))) { - document.getElementById(self.get("focusOn")).focus(); - } + 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("selectOn"))) { + document.getElementById(self.get("selectOn")).select(); + } - if (is.not.null(self.get("onOpenCallback"))) { - self.attrs.onOpenCallback(drop); - } - }); + if (is.not.null(self.get("onOpenCallback"))) { + self.attrs.onOpenCallback(drop); + } + }); }, - willDestroyElement() { - this.get('drop').destroy(); - }, + willDestroyElement() { + this.get('drop').destroy(); + }, actions: { onCancel() { @@ -73,9 +83,9 @@ export default Ember.Component.extend({ }, onAction() { - if (this.get('onAction') === null) { - return; - } + if (this.get('onAction') === null) { + return; + } let close = this.attrs.onAction(); @@ -84,10 +94,10 @@ export default Ember.Component.extend({ } }, - onAction2() { - if (this.get('onAction2') === null) { - return; - } + onAction2() { + if (this.get('onAction2') === null) { + return; + } let close = this.attrs.onAction2(); @@ -96,4 +106,4 @@ export default Ember.Component.extend({ } } } -}); +}); \ No newline at end of file diff --git a/app/app/components/dropdown-menu.js b/app/app/components/dropdown-menu.js index e1dd2554..38fb9f9d 100644 --- a/app/app/components/dropdown-menu.js +++ b/app/app/components/dropdown-menu.js @@ -1,4 +1,14 @@ -// Copyright (c) 2015 Documize Inc. +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import stringUtil from '../utils/string'; @@ -12,9 +22,9 @@ export default Ember.Component.extend({ didReceiveAttrs() { this.set("contentId", 'dropdown-menu-' + stringUtil.makeId(10)); - // if (this.session.get('isMobile')) { - // this.set('open', "click"); - // } + // if (this.session.get('isMobile')) { + // this.set('open', "click"); + // } }, didInsertElement() { @@ -25,7 +35,7 @@ export default Ember.Component.extend({ target: document.getElementById(self.get('target')), content: self.$(".dropdown-menu")[0], classes: 'drop-theme-menu', - position: self.get('position'), + position: self.get('position'), openOn: self.get('open'), tetherOptions: { offset: "5px 0", @@ -36,7 +46,7 @@ export default Ember.Component.extend({ self.set('drop', drop); }, - willDestroyElement() { - this.get('drop').destroy(); - } -}); + willDestroyElement() { + this.get('drop').destroy(); + } +}); \ No newline at end of file diff --git a/app/app/components/focus-input.js b/app/app/components/focus-input.js index 0043abf2..d42d7360 100644 --- a/app/app/components/focus-input.js +++ b/app/app/components/focus-input.js @@ -1,7 +1,18 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.TextField.extend({ becomeFocused: function() { this.$().focus(); }.on('didInsertElement') -}); +}); \ No newline at end of file diff --git a/app/app/components/focus-textarea.js b/app/app/components/focus-textarea.js index e0f05883..e64feca9 100644 --- a/app/app/components/focus-textarea.js +++ b/app/app/components/focus-textarea.js @@ -1,7 +1,18 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.TextArea.extend({ becomeFocused: function() { this.$().focus(); }.on('didInsertElement') -}); +}); \ No newline at end of file diff --git a/app/app/components/folder/document-tags.js b/app/app/components/folder/document-tags.js index 8f2d7a7f..1fda80d8 100644 --- a/app/app/components/folder/document-tags.js +++ b/app/app/components/folder/document-tags.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -24,4 +35,4 @@ export default Ember.Component.extend({ this.get('filterByTag')(tag); } } -}); +}); \ No newline at end of file diff --git a/app/app/components/folder/documents-list.js b/app/app/components/folder/documents-list.js index 196cb8b2..ebc4cba3 100644 --- a/app/app/components/folder/documents-list.js +++ b/app/app/components/folder/documents-list.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -9,22 +20,22 @@ export default Ember.Component.extend({ actions: { selectDocument(documentId) { - let doc = this.get('documents').findBy('id', documentId); - let list = this.get('selectedDocuments'); + let doc = this.get('documents').findBy('id', documentId); + let list = this.get('selectedDocuments'); - doc.set('selected', !doc.get('selected')); + 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); - } - } + 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); + this.set('selectedDocuments', list); + this.get('onDocumentsChecked')(list); } } -}); +}); \ No newline at end of file diff --git a/app/app/components/folder/folder-dashboard.js b/app/app/components/folder/folder-dashboard.js index a7be4454..0f31e243 100644 --- a/app/app/components/folder/folder-dashboard.js +++ b/app/app/components/folder/folder-dashboard.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; @@ -12,9 +23,9 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { hasSelectedDocuments: false, selectedDocuments: [], importedDocuments: [], - savedTemplates: [], + savedTemplates: [], isFolderOwner: false, - moveFolderId: "", + moveFolderId: "", hasDocuments: function() { return this.documents.get('length') > 0; @@ -26,38 +37,44 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.set('importedDocuments', []); this.set('isFolderOwner', this.get('folder.userId') === this.session.user.id); - let self = this; + 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); - }); + 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); + 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")); - } - } - }, + 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(); - }, + willDestroyElement() { + this.destroyTooltips(); + }, - navigateToDocument(document){ + navigateToDocument(document) { this.attrs.showDocument(this.get('folder'), document); }, @@ -67,14 +84,14 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.set('hasSelectedDocuments', documents.length > 0); }, - onEditTemplate(template) { - this.navigateToDocument(template); - }, + onEditTemplate(template) { + this.navigateToDocument(template); + }, - onDocumentTemplate(id /*, title, type*/) { + onDocumentTemplate(id /*, title, type*/ ) { let self = this; - this.send("showNotification", "Creating"); + this.send("showNotification", "Creating"); this.get('templateService').importSavedTemplate(this.folder.get('id'), id).then(function(document) { self.navigateToDocument(document); @@ -82,21 +99,21 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { }, onDocumentImporting(filename) { - this.send("showNotification", `Importing ${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`); + onDocumentImported(filename /*, document*/ ) { + this.send("showNotification", `${filename} ready`); let documents = this.get('importedDocuments'); documents.pop(filename); this.set('importedDocuments', documents); - this.attrs.refresh(); + this.attrs.refresh(); if (documents.length === 0) { // this.get('showDocument')(this.get('folder'), document); @@ -115,31 +132,31 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.set('selectedDocuments', []); this.set('hasSelectedDocuments', false); - this.send("showNotification", "Deleted"); + this.send("showNotification", "Deleted"); - return true; + return true; }, - setMoveFolder(folderId) { - this.set('moveFolderId', folderId); + setMoveFolder(folderId) { + this.set('moveFolderId', folderId); - let folders = this.get('folders'); + let folders = this.get('folders'); - folders.forEach(folder => { - folder.set('selected', folder.id === folderId); - }); - }, + folders.forEach(folder => { + folder.set('selected', folder.id === folderId); + }); + }, moveDocuments() { - if (this.get("moveFolderId") === "") { - return false; - } + if (this.get("moveFolderId") === "") { + return false; + } this.get('onMoveDocument')(this.get('selectedDocuments'), this.get('moveFolderId')); - this.set("moveFolderId", ""); - this.send("showNotification", "Moved"); + this.set("moveFolderId", ""); + this.send("showNotification", "Moved"); - return true; + return true; } } -}); +}); \ No newline at end of file diff --git a/app/app/components/folder/folder-settings.js b/app/app/components/folder/folder-settings.js index 029351cf..7460bbd7 100644 --- a/app/app/components/folder/folder-settings.js +++ b/app/app/components/folder/folder-settings.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -28,16 +39,16 @@ export default Ember.Component.extend({ actions: { rename() { if (is.empty(this.folder.get('name'))) { - $("#folderName").addClass("error").focus(); + $("#folderName").addClass("error").focus(); return; } - this.sendAction("onRename", this.folder); + this.sendAction("onRename", this.folder); }, remove() { if (is.null(this.get('moveTarget'))) { - $("#delete-target > select").addClass("error").focus(); + $("#delete-target > select").addClass("error").focus(); return; } @@ -52,10 +63,10 @@ export default Ember.Component.extend({ message = this.getDefaultInvitationMessage(); } - if (email.length === 0) { - $("#inviteEmail").addClass("error").focus(); - return; - } + if (email.length === 0) { + $("#inviteEmail").addClass("error").focus(); + return; + } var result = { Message: message, @@ -75,7 +86,7 @@ export default Ember.Component.extend({ result.Recipients.push(email); } - this.set('inviteEmail', ""); + this.set('inviteEmail', ""); this.sendAction("onShare", result); }, @@ -95,4 +106,4 @@ export default Ember.Component.extend({ this.sendAction("onPermission", this.get('folder'), message, this.get('permissions')); } } -}); +}); \ No newline at end of file diff --git a/app/app/components/folder/folders-list.js b/app/app/components/folder/folders-list.js index b366a074..2f9bb61c 100644 --- a/app/app/components/folder/folders-list.js +++ b/app/app/components/folder/folders-list.js @@ -1,62 +1,73 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + // Copyright (c) 2015 Documize Inc. 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, + folderService: Ember.inject.service('folder'), + publicFolders: [], + protectedFolders: [], + privateFolders: [], + hasPublicFolders: false, + hasProtectedFolders: false, + hasPrivateFolders: false, newFolder: "", - didInsertElement() { + didInsertElement() { this._super(...arguments); - if (this.session.authenticated) { - this.addTooltip(document.getElementById("add-folder-button")); - } - }, + if (this.session.authenticated) { + this.addTooltip(document.getElementById("add-folder-button")); + } + }, - didReceiveAttrs() { - let folders = this.get('folders'); - let self = this; + didReceiveAttrs() { + let folders = this.get('folders'); + let self = this; - // clear out state - this.set('publicFolders', []); - this.set('protectedFolders', []); - this.set('privateFolders', []); + // clear out state + this.set('publicFolders', []); + this.set('protectedFolders', []); + this.set('privateFolders', []); - _.each(folders, folder => { - if (folder.folderType === constants.FolderType.Public) { - let folders = self.get('publicFolders'); - folders.pushObject(folder); - self.set('publicFolders', folders); - } - if (folder.folderType === constants.FolderType.Private) { - let folders = self.get('privateFolders'); - folders.pushObject(folder); - self.set('privateFolders', folders); - } - if (folder.folderType === constants.FolderType.Protected) { - let folders = self.get('protectedFolders'); - folders.pushObject(folder); - self.set('protectedFolders', folders); - } - }); + _.each(folders, folder => { + if (folder.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); - }, + this.set('hasPublicFolders', this.get('publicFolders.length') > 0); + this.set('hasPrivateFolders', this.get('privateFolders.length') > 0); + this.set('hasProtectedFolders', this.get('protectedFolders.length') > 0); + }, - willDestroyElement() { - this.destroyTooltips(); - }, + willDestroyElement() { + this.destroyTooltips(); + }, - actions: { + actions: { addFolder() { var folderName = this.get('newFolder'); @@ -65,10 +76,10 @@ export default Ember.Component.extend(TooltipMixin, { return false; } - this.attrs.onFolderAdd(folderName); + this.attrs.onFolderAdd(folderName); - this.set('newFolder', ""); - return true; + this.set('newFolder', ""); + return true; } } -}); +}); \ No newline at end of file diff --git a/app/app/components/folder/start-document.js b/app/app/components/folder/start-document.js index 6b264beb..f6b5b322 100644 --- a/app/app/components/folder/start-document.js +++ b/app/app/components/folder/start-document.js @@ -1,89 +1,103 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; export default Ember.Component.extend(NotifierMixin, { - tagName: 'span', - selectedTemplate: { id: "0" }, - canEditTemplate: "", + tagName: 'span', + selectedTemplate: { + id: "0" + }, + canEditTemplate: "", - didReceiveAttrs() { - this.send('setTemplate', this.get('savedTemplates')[0]); - }, + didReceiveAttrs() { + this.send('setTemplate', this.get('savedTemplates')[0]); + }, actions: { - setTemplate(chosen) { - if (is.undefined(chosen)) { - return; - } + setTemplate(chosen) { + if (is.undefined(chosen)) { + return; + } - this.set('selectedTemplate', chosen); - this.set('canEditTemplate', chosen.id !== "0" ? "Edit" : ""); + this.set('selectedTemplate', chosen); + this.set('canEditTemplate', chosen.id !== "0" ? "Edit" : ""); - let templates = this.get('savedTemplates'); + let templates = this.get('savedTemplates'); - templates.forEach(template => { - Ember.set(template, 'selected', template.id === chosen.id); - }); - }, + templates.forEach(template => { + Ember.set(template, 'selected', template.id === chosen.id); + }); + }, - editTemplate() { - let template = this.get('selectedTemplate'); + editTemplate() { + let template = this.get('selectedTemplate'); - this.audit.record('edited-saved-template'); - this.attrs.onEditTemplate(template); + this.audit.record('edited-saved-template'); + this.attrs.onEditTemplate(template); - return true; - }, + return true; + }, - startDocument() { - let template = this.get('selectedTemplate'); + startDocument() { + let template = this.get('selectedTemplate'); - this.audit.record('used-saved-template'); + this.audit.record('used-saved-template'); this.attrs.onDocumentTemplate(template.id, template.title, "private"); - return true; - }, + return true; + }, - onOpenCallback() { - let self = this; - let folderId = this.get('folder.id'); - let importUrl = this.session.appMeta.getUrl('import/folder/' + folderId); + onOpenCallback() { + let self = this; + let folderId = this.get('folder.id'); + let importUrl = this.session.appMeta.getUrl('import/folder/' + folderId); - let dzone = new Dropzone("#upload-documents", { - headers: {'Authorization': 'Bearer ' + self.session.getSessionItem('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, + let dzone = new Dropzone("#upload-documents", { + headers: { + 'Authorization': 'Bearer ' + self.session.getSessionItem('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) { + 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() { - }); + console.log("Conversion failed for ", x.name, " obj ", x); // TODO proper error handling + }); - this.on("addedfile", function(file) { - self.attrs.onDocumentImporting(file.name); - self.audit.record('converted-document'); - }); - } - }); + this.on("queuecomplete", function() {}); - dzone.on("complete", function(file) { - dzone.removeFile(file); - }); - } - } -}); + this.on("addedfile", function(file) { + self.attrs.onDocumentImporting(file.name); + self.audit.record('converted-document'); + }); + } + }); + + dzone.on("complete", function(file) { + dzone.removeFile(file); + }); + } + } +}); \ No newline at end of file diff --git a/app/app/components/header/message-box.js b/app/app/components/header/message-box.js index 926b6130..a5417462 100644 --- a/app/app/components/header/message-box.js +++ b/app/app/components/header/message-box.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/header/page-navigation.js b/app/app/components/header/page-navigation.js index f7722dac..c161fed1 100644 --- a/app/app/components/header/page-navigation.js +++ b/app/app/components/header/page-navigation.js @@ -1,13 +1,23 @@ -// Copyright (c) 2015 Documize Inc. +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import netUtil from '../../utils/net'; export default Ember.Component.extend({ - dashboardMode: false, - searchMode: false, - profileMode: false, - settingsMode: false, - folderMode: false, + dashboardMode: false, + searchMode: false, + profileMode: false, + settingsMode: false, + folderMode: false, documentMode: false, didInitAttrs() { @@ -22,7 +32,7 @@ export default Ember.Component.extend({ actions: { switchAccount(domain) { this.audit.record('switched-account'); - window.location.href = netUtil.getAppUrl(domain); + window.location.href = netUtil.getAppUrl(domain); } } -}); +}); \ No newline at end of file diff --git a/app/app/components/header/search-box.js b/app/app/components/header/search-box.js index a9a5dd22..67cc0f65 100644 --- a/app/app/components/header/search-box.js +++ b/app/app/components/header/search-box.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -14,4 +25,4 @@ export default Ember.Component.extend({ fetch() { this.get('onFilter')(this.get('filter')); }, -}); +}); \ No newline at end of file diff --git a/app/app/components/layout/page-container.js b/app/app/components/layout/page-container.js index 926b6130..a5417462 100644 --- a/app/app/components/layout/page-container.js +++ b/app/app/components/layout/page-container.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/layout/page-content.js b/app/app/components/layout/page-content.js index 926b6130..a5417462 100644 --- a/app/app/components/layout/page-content.js +++ b/app/app/components/layout/page-content.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/layout/page-sidebar.js b/app/app/components/layout/page-sidebar.js index 926b6130..a5417462 100644 --- a/app/app/components/layout/page-sidebar.js +++ b/app/app/components/layout/page-sidebar.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/onboard/share-folder.js b/app/app/components/onboard/share-folder.js index 62eda811..0429b897 100644 --- a/app/app/components/onboard/share-folder.js +++ b/app/app/components/onboard/share-folder.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import encodingUtil from '../../utils/encoding'; import netUtil from '../../utils/net'; @@ -16,31 +27,24 @@ export default Ember.Component.extend({ $("#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()) - { + $("#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 - { + } 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-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()) - { + if (!$("#stage-1-lastname").val()) { $("#stage-1-lastname").focus(); $("#stage-1-lastname").addClass("error"); $(".name-status").attr("src", "assets/img/onboard/person-red.png"); @@ -49,8 +53,7 @@ export default Ember.Component.extend({ self.set('processing', false); - $(".stage-1").fadeOut("slow", function() - { + $(".stage-1").fadeOut("slow", function() { if (self.get('processing')) { return; } @@ -61,15 +64,11 @@ export default Ember.Component.extend({ $("#stage-2-password").focus(); // Stage 2 - password keypress handler - $("#stage-2-password-confirm").keyup(function() - { + $("#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())) - { + ($("#stage-2-password").val() !== $("#stage-2-password-confirm").val())) { $(".password-status").attr("src", "assets/img/onboard/lock-red.png"); - } - else - { + } else { $(".password-status").attr("src", "assets/img/onboard/lock-green.png"); } }); @@ -77,24 +76,20 @@ export default Ember.Component.extend({ }); // 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-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()) - { + 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()) - { + if ($("#stage-2-password-confirm").val() !== $("#stage-2-password").val()) { $(".mismatch").show(); $(".password-status").attr("src", "assets/img/onboard/lock-red.png"); return; @@ -102,8 +97,7 @@ export default Ember.Component.extend({ self.set('processing', false); - $(".stage-2").fadeOut("slow", function() - { + $(".stage-2").fadeOut("slow", function() { if (self.get('processing')) { return; } @@ -113,7 +107,7 @@ export default Ember.Component.extend({ $(".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 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) { @@ -127,4 +121,4 @@ export default Ember.Component.extend({ }); }); }, -}); +}); \ No newline at end of file diff --git a/app/app/components/search/search-results.js b/app/app/components/search/search-results.js index 0ff706e2..dca722aa 100644 --- a/app/app/components/search/search-results.js +++ b/app/app/components/search/search-results.js @@ -1,4 +1,14 @@ -// Copyright (c) 2015 Documize Inc. +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -7,7 +17,7 @@ export default Ember.Component.extend({ didReceiveAttrs() { let count = this.get('results').length; - let self = this; + let self = this; switch (count) { case 0: @@ -20,4 +30,4 @@ export default Ember.Component.extend({ self.set("resultPhrase", `${count} references found`); } } -}); +}); \ No newline at end of file diff --git a/app/app/components/search/tag-list.js b/app/app/components/search/tag-list.js index 8e65d6ee..fb8a5d32 100644 --- a/app/app/components/search/tag-list.js +++ b/app/app/components/search/tag-list.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ @@ -18,4 +29,4 @@ export default Ember.Component.extend({ this.set('tagz', tagz); } -}); +}); \ No newline at end of file diff --git a/app/app/components/section/base-editor.js b/app/app/components/section/base-editor.js index 79620938..35eb2c6f 100644 --- a/app/app/components/section/base-editor.js +++ b/app/app/components/section/base-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/section/base-renderer.js b/app/app/components/section/base-renderer.js index d4702603..041d0751 100644 --- a/app/app/components/section/base-renderer.js +++ b/app/app/components/section/base-renderer.js @@ -1,7 +1,18 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ - didReceiveAttrs() { - this.set('rendererType', 'section/' + this.get('page.contentType') + '/type-renderer'); - }, -}); + didReceiveAttrs() { + this.set('rendererType', 'section/' + this.get('page.contentType') + '/type-renderer'); + }, +}); \ No newline at end of file diff --git a/app/app/components/section/code/type-editor.js b/app/app/components/section/code/type-editor.js index 49c4e559..599ed147 100644 --- a/app/app/components/section/code/type-editor.js +++ b/app/app/components/section/code/type-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import TooltipMixin from '../../../mixins/tooltip'; diff --git a/app/app/components/section/code/type-renderer.js b/app/app/components/section/code/type-renderer.js index ec1f47b1..af256e06 100644 --- a/app/app/components/section/code/type-renderer.js +++ b/app/app/components/section/code/type-renderer.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/section/gemini/type-editor.js b/app/app/components/section/gemini/type-editor.js index 321f40b2..ca307e83 100644 --- a/app/app/components/section/gemini/type-editor.js +++ b/app/app/components/section/gemini/type-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import NotifierMixin from '../../../mixins/notifier'; import TooltipMixin from '../../../mixins/tooltip'; diff --git a/app/app/components/section/gemini/type-renderer.js b/app/app/components/section/gemini/type-renderer.js index 926b6130..a5417462 100644 --- a/app/app/components/section/gemini/type-renderer.js +++ b/app/app/components/section/gemini/type-renderer.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index b8480295..f0cdc539 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + /*global Trello*/ import Ember from 'ember'; import NotifierMixin from '../../../mixins/notifier'; @@ -104,6 +115,12 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } }, + logout() { + Trello.deauthorize(); + this.set('authenticated', false); + this.set('token', ''); + }, + auth() { if (this.get('config.appKey') === "") { $("#trello-appkey").addClass('error').focus(); diff --git a/app/app/components/section/trello/type-renderer.js b/app/app/components/section/trello/type-renderer.js index 926b6130..a5417462 100644 --- a/app/app/components/section/trello/type-renderer.js +++ b/app/app/components/section/trello/type-renderer.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/section/wysiwyg/type-editor.js b/app/app/components/section/wysiwyg/type-editor.js index 4977cd89..5500aa77 100644 --- a/app/app/components/section/wysiwyg/type-editor.js +++ b/app/app/components/section/wysiwyg/type-editor.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/app/components/section/wysiwyg/type-renderer.js b/app/app/components/section/wysiwyg/type-renderer.js index 926b6130..a5417462 100644 --- a/app/app/components/section/wysiwyg/type-renderer.js +++ b/app/app/components/section/wysiwyg/type-renderer.js @@ -1,4 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; -export default Ember.Component.extend({ -}); +export default Ember.Component.extend({}); \ No newline at end of file diff --git a/app/app/components/settings/user-list.js b/app/app/components/settings/user-list.js index 992c4579..8d92bd99 100644 --- a/app/app/components/settings/user-list.js +++ b/app/app/components/settings/user-list.js @@ -1,133 +1,147 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ - editUser: null, - deleteUser: null, - drop: null, - password: {}, + editUser: null, + deleteUser: null, + drop: null, + password: {}, - didReceiveAttrs() { - this.users.forEach(user => { - user.set('me', user.get('id') === this.session.user.id); - }); - }, + didReceiveAttrs() { + this.users.forEach(user => { + user.set('me', user.get('id') === this.session.user.id); + }); + }, - willDestroyElement() { - let drop = this.get('drop'); + willDestroyElement() { + let drop = this.get('drop'); - if (is.not.null(drop)) { - drop.destroy(); - } - }, + 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); - }, + 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); - }, + 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); - }, + toggleAdmin(id) { + let user = this.users.findBy("id", id); + user.set('admin', !user.get('admin')); + this.attrs.onSave(user); + }, - edit(id) { - let self = this; + 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 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 - }); + 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); + self.set('drop', drop); - drop.on('open', function() { - self.$("#edit-firstname").focus(); - }); - }, + 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"); + 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 - }); + 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); - }, + this.set('drop', drop); + }, - cancel() { - let drop = this.get('drop'); - drop.close(); - }, + cancel() { + let drop = this.get('drop'); + drop.close(); + }, - save() { - let user = this.get('editUser'); - let password = this.get('password'); + 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; - } + 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(); + let drop = this.get('drop'); + drop.close(); - this.attrs.onSave(user); + 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); - } - }, + 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(); + delete() { + let drop = this.get('drop'); + drop.close(); - let user = this.get('deleteUser'); - this.attrs.onDelete(user); - } - } -}); + let user = this.get('deleteUser'); + this.attrs.onDelete(user); + } + } +}); \ No newline at end of file diff --git a/app/app/components/ui-select.js b/app/app/components/ui-select.js index 06feebc7..6e61bf03 100644 --- a/app/app/components/ui-select.js +++ b/app/app/components/ui-select.js @@ -1,7 +1,18 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Component.extend({ - cssClass: "", + cssClass: "", content: [], prompt: null, optionValuePath: 'id', @@ -32,4 +43,4 @@ export default Ember.Component.extend({ changeCallback(selection); } } -}); +}); \ No newline at end of file diff --git a/app/app/components/user-notification.js b/app/app/components/user-notification.js index e8effedb..198d8ce8 100644 --- a/app/app/components/user-notification.js +++ b/app/app/components/user-notification.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import miscUtil from '../utils/misc'; @@ -24,7 +35,7 @@ export default Ember.Component.extend({ self.$(elem).show(); // FIXME: need a more robust solution - miscUtil.interval(function(){ + miscUtil.interval(function() { let notifications = self.get('notifications'); if (notifications.length > 0) { @@ -38,4 +49,4 @@ export default Ember.Component.extend({ }, 2500, self.get('notifications').length); }); }, -}); +}); \ No newline at end of file diff --git a/app/app/components/widget-sample.js b/app/app/components/widget-sample.js index f5b841dc..f1129cce 100644 --- a/app/app/components/widget-sample.js +++ b/app/app/components/widget-sample.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + // Copyright (c) 2015 Documize Inc. import Ember from 'ember'; import NotifierMixin from '../mixins/notifier'; @@ -7,10 +18,18 @@ export default Ember.Component.extend(NotifierMixin, { 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")}); + 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'), @@ -33,4 +52,4 @@ export default Ember.Component.extend(NotifierMixin, { return true; } } -}); +}); \ No newline at end of file diff --git a/app/app/helpers/document/file-icon.js b/app/app/helpers/document/file-icon.js index be63d56d..04058c71 100644 --- a/app/app/helpers/document/file-icon.js +++ b/app/app/helpers/document/file-icon.js @@ -1,11 +1,21 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export function documentFileIcon(params) { let fileExtension = params[0].toLowerCase(); let html = "unknown.png"; - switch (fileExtension) - { + switch (fileExtension) { case "7z": case "7zip": case "zipx": @@ -95,4 +105,4 @@ export function documentFileIcon(params) { return new Ember.Handlebars.SafeString(html); } -export default Ember.Helper.helper(documentFileIcon); +export default Ember.Helper.helper(documentFileIcon); \ No newline at end of file diff --git a/app/app/helpers/document/toc-entry.js b/app/app/helpers/document/toc-entry.js index e6ad0751..27a8a5ba 100644 --- a/app/app/helpers/document/toc-entry.js +++ b/app/app/helpers/document/toc-entry.js @@ -1,9 +1,20 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export function documentTocEntry(params) { - let currentPage = params[0]; + let currentPage = params[0]; let nodeId = params[1]; - let nodeLevel = params[2]; + let nodeLevel = params[2]; let html = ""; let indent = (nodeLevel - 1) * 20; @@ -20,4 +31,4 @@ export function documentTocEntry(params) { return new Ember.Handlebars.SafeString(html); } -export default Ember.Helper.helper(documentTocEntry); +export default Ember.Helper.helper(documentTocEntry); \ No newline at end of file diff --git a/app/app/helpers/formatted-date.js b/app/app/helpers/formatted-date.js index 09daa555..67162831 100644 --- a/app/app/helpers/formatted-date.js +++ b/app/app/helpers/formatted-date.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import dateUtil from '../utils/date'; @@ -5,4 +16,4 @@ export function formattedDate(params) { return dateUtil.toIsoDate(params[0], params[1]); } -export default Ember.Helper.helper(formattedDate); +export default Ember.Helper.helper(formattedDate); \ No newline at end of file diff --git a/app/app/helpers/generate-id.js b/app/app/helpers/generate-id.js index de322a70..a950d0f2 100644 --- a/app/app/helpers/generate-id.js +++ b/app/app/helpers/generate-id.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; // Usage: {{generate-id 'admin-' 123}} @@ -5,4 +16,4 @@ export default Ember.Helper.helper(function(params) { let prefix = params[0]; let id = params[1]; return prefix + "-" + id; -}); +}); \ No newline at end of file diff --git a/app/app/helpers/is-equal.js b/app/app/helpers/is-equal.js index 7416a532..80ac40a3 100644 --- a/app/app/helpers/is-equal.js +++ b/app/app/helpers/is-equal.js @@ -1,6 +1,17 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; // Usage: {{is-equal item selection}} export default Ember.Helper.helper(function([leftSide, rightSide]) { return leftSide === rightSide; -}); +}); \ No newline at end of file diff --git a/app/app/helpers/is-not.js b/app/app/helpers/is-not.js index 24992fc0..3c2d58ab 100644 --- a/app/app/helpers/is-not.js +++ b/app/app/helpers/is-not.js @@ -1,6 +1,17 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; // Usage: {{is-not selection}} export default Ember.Helper.helper(function([value]) { return !value; -}); +}); \ No newline at end of file diff --git a/app/app/helpers/read-path.js b/app/app/helpers/read-path.js index db70dcf4..a9c1e037 100644 --- a/app/app/helpers/read-path.js +++ b/app/app/helpers/read-path.js @@ -1,5 +1,16 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Helper.helper(function([object, path]) { return Ember.get(object, path); -}); +}); \ No newline at end of file diff --git a/app/app/helpers/time-ago.js b/app/app/helpers/time-ago.js index b2c00dc2..e44fee70 100644 --- a/app/app/helpers/time-ago.js +++ b/app/app/helpers/time-ago.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import dateUtil from '../utils/date'; @@ -6,4 +17,4 @@ export function timeAgo(params) { return dateUtil.timeAgo(params[0]); } -export default Ember.Helper.helper(timeAgo); +export default Ember.Helper.helper(timeAgo); \ No newline at end of file diff --git a/app/app/helpers/user-initials.js b/app/app/helpers/user-initials.js index 4e2ede90..b4999582 100644 --- a/app/app/helpers/user-initials.js +++ b/app/app/helpers/user-initials.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; // {{user-initials firstname lastname}} @@ -5,7 +16,7 @@ export function userInitials(params) { let firstname = params[0]; let lastname = params[1]; - return (firstname.substring(0, 1) + lastname.substring(0, 1)).toUpperCase(); + return (firstname.substring(0, 1) + lastname.substring(0, 1)).toUpperCase(); } -export default Ember.Helper.helper(userInitials); +export default Ember.Helper.helper(userInitials); \ No newline at end of file diff --git a/app/app/initializers/application.js b/app/app/initializers/application.js index 29fb4035..7a75ad66 100644 --- a/app/app/initializers/application.js +++ b/app/app/initializers/application.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + export function initialize( /*application*/ ) { // address insecure jquery defaults (kudos: @nathanhammond) $.globalEval = function() {}; diff --git a/app/app/initializers/audit.js b/app/app/initializers/audit.js index 50db1e58..17da4585 100644 --- a/app/app/initializers/audit.js +++ b/app/app/initializers/audit.js @@ -1,3 +1,13 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com export function initialize(application) { application.inject('route', 'audit', 'service:audit'); @@ -9,4 +19,4 @@ export default { name: 'audit', after: 'session', initialize: initialize -}; +}; \ No newline at end of file diff --git a/app/app/initializers/browser.js b/app/app/initializers/browser.js index 4156696a..2a1f9c26 100644 --- a/app/app/initializers/browser.js +++ b/app/app/initializers/browser.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + export function initialize(application) { application.inject('route', 'browser', 'service:browser'); application.inject('controller', 'browser', 'service:browser'); @@ -8,4 +19,4 @@ export default { name: 'browser', after: "session", initialize: initialize -}; +}; \ No newline at end of file diff --git a/app/app/initializers/event-bus.js b/app/app/initializers/event-bus.js index 136d804b..877524c9 100644 --- a/app/app/initializers/event-bus.js +++ b/app/app/initializers/event-bus.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + export function initialize(application) { application.inject('route', 'eventBus', 'service:eventBus'); application.inject('component', 'eventBus', 'service:eventBus'); @@ -9,4 +20,4 @@ export default { name: 'eventBus', after: 'session', initialize: initialize -}; +}; \ No newline at end of file diff --git a/app/app/initializers/logger.js b/app/app/initializers/logger.js index f333cf09..cad17240 100644 --- a/app/app/initializers/logger.js +++ b/app/app/initializers/logger.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + export function initialize(application) { application.inject('route', 'logger', 'service:logger'); application.inject('component', 'logger', 'service:logger'); @@ -8,4 +19,4 @@ export default { name: 'logger', after: 'session', initialize: initialize -}; +}; \ No newline at end of file diff --git a/app/app/initializers/session.js b/app/app/initializers/session.js index 3ffbaec1..0350dbd8 100644 --- a/app/app/initializers/session.js +++ b/app/app/initializers/session.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + export function initialize(application) { application.inject('route', 'session', 'service:session'); application.inject('controller', 'session', 'service:session'); @@ -9,4 +20,4 @@ export default { after: 'application', before: 'audit', initialize: initialize -}; +}; \ No newline at end of file diff --git a/app/app/mixins/notifier.js b/app/app/mixins/notifier.js index fc315e8a..7086a358 100644 --- a/app/app/mixins/notifier.js +++ b/app/app/mixins/notifier.js @@ -1,13 +1,24 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Mixin.create({ - showNotification(msg) { - this.eventBus.publish('notifyUser', msg); - }, + showNotification(msg) { + this.eventBus.publish('notifyUser', msg); + }, actions: { showNotification(msg) { this.eventBus.publish('notifyUser', msg); } } -}); +}); \ No newline at end of file diff --git a/app/app/mixins/tooltip.js b/app/app/mixins/tooltip.js index 99d8d3e3..45f3c9b6 100644 --- a/app/app/mixins/tooltip.js +++ b/app/app/mixins/tooltip.js @@ -1,23 +1,36 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Mixin.create({ - tooltips: [], + tooltips: [], - addTooltip(elem) { - let t = new Tooltip({target: elem}); - let tt = this.get('tooltips'); - tt.push(t); - }, + addTooltip(elem) { + let t = new Tooltip({ + target: elem + }); + let tt = this.get('tooltips'); + tt.push(t); + }, - destroyTooltips() { - let tt = this.get('tooltips'); + destroyTooltips() { + let tt = this.get('tooltips'); - tt.forEach(t => { - t.destroy(); - }); + tt.forEach(t => { + t.destroy(); + }); - tt.length = 0; + tt.length = 0; - this.set('tooltips', tt); - } -}); + this.set('tooltips', tt); + } +}); \ No newline at end of file diff --git a/app/app/resolver.js b/app/app/resolver.js index 2fb563d6..49331f17 100644 --- a/app/app/resolver.js +++ b/app/app/resolver.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Resolver from 'ember-resolver'; -export default Resolver; +export default Resolver; \ No newline at end of file diff --git a/app/app/router.js b/app/app/router.js index 4a86c2a0..dd9b740a 100644 --- a/app/app/router.js +++ b/app/app/router.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import config from './config/environment'; diff --git a/app/app/routes/application.js b/app/app/routes/application.js index 0cf77c68..ade10ade 100644 --- a/app/app/routes/application.js +++ b/app/app/routes/application.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Route.extend({ diff --git a/app/app/services/audit.js b/app/app/services/audit.js index 076ad08a..1bf39d6a 100644 --- a/app/app/services/audit.js +++ b/app/app/services/audit.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import netUtil from '../utils/net'; import config from '../config/environment'; @@ -45,8 +56,7 @@ export default Ember.Service.extend({ email: session.user.email, user_id: session.user.id, "administrator": session.user.admin, - company: - { + company: { id: session.get('appMeta.orgId'), name: session.get('appMeta.title').string, "domain": netUtil.getSubdomain(), @@ -62,4 +72,4 @@ export default Ember.Service.extend({ window.Intercom('boot', window.intercomSettings); }, -}); +}); \ No newline at end of file diff --git a/app/app/services/base.js b/app/app/services/base.js index d4e9172f..270aac4b 100644 --- a/app/app/services/base.js +++ b/app/app/services/base.js @@ -1,15 +1,25 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Service.extend({ interval(func, wait, times) { - var interv = function(w, t){ - return function(){ - if(typeof t === "undefined" || t-- > 0) { + var interv = function(w, t) { + return function() { + if (typeof t === "undefined" || t-- > 0) { setTimeout(interv, w); try { func.call(null); - } - catch(e) { + } catch (e) { t = 0; throw e.toString(); } @@ -19,4 +29,4 @@ export default Ember.Service.extend({ setTimeout(interv, wait); } -}); +}); \ No newline at end of file diff --git a/app/app/services/browser.js b/app/app/services/browser.js index d4a45de8..c42bec2c 100644 --- a/app/app/services/browser.js +++ b/app/app/services/browser.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Service.extend({ @@ -30,6 +41,6 @@ export default Ember.Service.extend({ description = this.get('sessionService').appMeta.message; } - $('head').append( '' ); + $('head').append(''); } -}); +}); \ No newline at end of file diff --git a/app/app/services/document.js b/app/app/services/document.js index f3000184..dc230af9 100644 --- a/app/app/services/document.js +++ b/app/app/services/document.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import models from '../utils/model'; diff --git a/app/app/services/event-bus.js b/app/app/services/event-bus.js index d2b0dfa2..58301200 100644 --- a/app/app/services/event-bus.js +++ b/app/app/services/event-bus.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Service.extend(Ember.Evented, { @@ -12,4 +23,4 @@ export default Ember.Service.extend(Ember.Evented, { unsubscribe: function() { return this.off.apply(this, arguments); } -}); +}); \ No newline at end of file diff --git a/app/app/services/folder.js b/app/app/services/folder.js index 049399a9..b0ed6b18 100644 --- a/app/app/services/folder.js +++ b/app/app/services/folder.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import models from '../utils/model'; import BaseService from '../services/base'; @@ -34,15 +45,15 @@ export default BaseService.extend({ getFolder(id) { let url = this.get('sessionService').appMeta.getUrl(`folders/${id}`); - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: url, type: 'GET', - success: function(response){ + success: function(response) { let folder = models.FolderModel.create(response); resolve(folder); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -54,7 +65,9 @@ export default BaseService.extend({ let self = this; if (this.get('folders') != null) { - return new Ember.RSVP.Promise(function(resolve) { resolve(self.get('folders')); }); + return new Ember.RSVP.Promise(function(resolve) { + resolve(self.get('folders')); + }); } else { return this.reload(); } @@ -123,11 +136,11 @@ export default BaseService.extend({ getProtectedFolderInfo: function() { var url = this.get('sessionService').appMeta.getUrl('folders?filter=viewers'); - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: url, type: 'GET', - success: function(response){ + success: function(response) { let data = []; _.each(response, function(obj) { data.pushObject(models.ProtectedFolderParticipant.create(obj)); @@ -135,7 +148,7 @@ export default BaseService.extend({ resolve(data); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -146,7 +159,7 @@ export default BaseService.extend({ reload() { let url = this.get('sessionService').appMeta.getUrl(`folders`); - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: url, type: 'GET', @@ -157,7 +170,7 @@ export default BaseService.extend({ }); resolve(data); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -172,14 +185,14 @@ export default BaseService.extend({ $.ajax({ url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`), type: 'GET', - success: function(response){ + success: function(response) { let data = []; _.each(response, function(obj) { data.pushObject(models.FolderPermissionModel.create(obj)); }); resolve(data); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -196,10 +209,10 @@ export default BaseService.extend({ type: 'PUT', contentType: 'json', data: JSON.stringify(payload), - success: function(response){ + success: function(response) { resolve(response); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -216,10 +229,10 @@ export default BaseService.extend({ type: 'POST', contentType: 'json', data: JSON.stringify(invitation), - success: function(response){ + success: function(response) { resolve(response); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -280,4 +293,4 @@ export default BaseService.extend({ } }); }, -}); +}); \ No newline at end of file diff --git a/app/app/services/logger.js b/app/app/services/logger.js index e1bf8be0..ee7f68a7 100644 --- a/app/app/services/logger.js +++ b/app/app/services/logger.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Service.extend({ @@ -12,4 +23,4 @@ export default Ember.Service.extend({ info: function(entry) { console.log(entry); } -}); +}); \ No newline at end of file diff --git a/app/app/services/organization.js b/app/app/services/organization.js index 46df91e1..24ee457e 100644 --- a/app/app/services/organization.js +++ b/app/app/services/organization.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import models from '../utils/model'; @@ -8,15 +19,15 @@ export default Ember.Service.extend({ getOrg(id) { let url = this.get('sessionService').appMeta.getUrl(`organizations/${id}`); - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: url, type: 'GET', - success: function(response){ + success: function(response) { let org = models.OrganizationModel.create(response); resolve(org); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); @@ -47,4 +58,4 @@ export default Ember.Service.extend({ }); }); } -}); +}); \ No newline at end of file diff --git a/app/app/services/search.js b/app/app/services/search.js index 3a3b5349..c4f88d92 100644 --- a/app/app/services/search.js +++ b/app/app/services/search.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; export default Ember.Service.extend({ @@ -7,17 +18,17 @@ export default Ember.Service.extend({ find(keywords) { let url = this.get('sessionService').appMeta.getUrl("search?keywords=" + encodeURIComponent(keywords)); - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: url, type: 'GET', success: function(response) { resolve(response); }, - error: function(reason){ + error: function(reason) { reject(reason); } }); }); }, -}); +}); \ No newline at end of file diff --git a/app/app/services/section.js b/app/app/services/section.js index b5c8b528..b7da9c7c 100644 --- a/app/app/services/section.js +++ b/app/app/services/section.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import models from '../utils/model'; import BaseService from '../services/base'; diff --git a/app/app/services/session.js b/app/app/services/session.js index 72b8f420..45599421 100644 --- a/app/app/services/session.js +++ b/app/app/services/session.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import encodingUtil from '../utils/encoding'; import netUtil from '../utils/net'; diff --git a/app/app/services/template.js b/app/app/services/template.js index f49b1862..471d6eee 100644 --- a/app/app/services/template.js +++ b/app/app/services/template.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import models from '../utils/model'; @@ -29,7 +40,7 @@ export default Ember.Service.extend({ url: self.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=saved"), type: 'POST', success: function(doc) { - let docModel = models.DocumentModel.create(doc); + let docModel = models.DocumentModel.create(doc); resolve(docModel); }, error: function(reason) { @@ -42,15 +53,17 @@ export default Ember.Service.extend({ getSavedTemplates() { let self = this; - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: self.get('sessionService').appMeta.getUrl("templates"), type: 'GET', success: function(response) { - if (is.not.array(response)) { - response = []; - } - let templates = Ember.ArrayProxy.create({ content: Ember.A([]) }); + if (is.not.array(response)) { + response = []; + } + let templates = Ember.ArrayProxy.create({ + content: Ember.A([]) + }); _.each(response, function(template) { let templateModel = models.TemplateModel.create(template); @@ -69,7 +82,7 @@ export default Ember.Service.extend({ getStockTemplates() { let self = this; - return new Ember.RSVP.Promise(function(resolve, reject){ + return new Ember.RSVP.Promise(function(resolve, reject) { $.ajax({ url: self.get('sessionService').appMeta.getUrl("templates/stock"), type: 'GET', @@ -82,4 +95,4 @@ export default Ember.Service.extend({ }); }); } -}); +}); \ No newline at end of file diff --git a/app/app/services/user.js b/app/app/services/user.js index 7e484e19..186d863a 100644 --- a/app/app/services/user.js +++ b/app/app/services/user.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import models from '../utils/model'; diff --git a/app/app/styles/app.scss b/app/app/styles/app.scss index 5c6d50fe..aadb56c4 100644 --- a/app/app/styles/app.scss +++ b/app/app/styles/app.scss @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + @import "color.scss"; @import "font.scss"; @import "functions.scss"; diff --git a/app/app/styles/base.scss b/app/app/styles/base.scss index a8466b81..44854a2e 100644 --- a/app/app/styles/base.scss +++ b/app/app/styles/base.scss @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + .cursor-pointer { cursor: pointer; } .cursor-not-allowed { cursor: not-allowed !important; } .cursor-auto { cursor: auto; } diff --git a/app/app/styles/color.scss b/app/app/styles/color.scss index dc469870..b189241b 100644 --- a/app/app/styles/color.scss +++ b/app/app/styles/color.scss @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + $color-off-white: #f5f5f5; $color-off-black: #4c4c4c; $color-black: #000000; @@ -21,12 +32,8 @@ $color-card-active: #f7fcff; $color-border: #dbdbdb; $color-border2: #e2e2e2; -// FIXME remove/replace below? -// $color-primary: #1b75bb; $color-primary-light: lighten($color-primary, 30%); $color-primary-dark: darken($color-primary, 10%); -// $color-green: #79ad30; -// $color-gray: #a0a0a0; $color-gray2: #f0eeee; $color-active-state: #e2e2e2; $color-sidebar: #e7f1f6; diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 6672552f..7666f4a0 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -46,9 +46,13 @@
Use plain old button below to grab the magic key -- you might need to log into Trello
{{focus-input id="trello-appkey" type="password" value=config.appKey}}
-
Get App Key
-
-
Authenticate
+ {{#if authenticated}} +
Logout
+ {{else}} +
Get App Key
+
+
Authenticate
+ {{/if}}
diff --git a/app/app/utils/constants.js b/app/app/utils/constants.js index 535ba88a..7c7d8efa 100644 --- a/app/app/utils/constants.js +++ b/app/app/utils/constants.js @@ -1,7 +1,18 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + export default { - FolderType: { - Public: 1, - Private: 2, - Protected: 3 - } -}; + FolderType: { + Public: 1, + Private: 2, + Protected: 3 + } +}; \ No newline at end of file diff --git a/app/app/utils/date.js b/app/app/utils/date.js index 4e7a4d6d..e97a45c4 100644 --- a/app/app/utils/date.js +++ b/app/app/utils/date.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + // "2014/02/05" function toShortDate(date) { return moment(new Date(date)).format('YYYY/MM/DD'); @@ -26,4 +37,4 @@ export default { formatDate, timeAgo, timeAgoUTC -}; +}; \ No newline at end of file diff --git a/app/app/utils/encoding.js b/app/app/utils/encoding.js index 9bbbd5b6..8f033859 100644 --- a/app/app/utils/encoding.js +++ b/app/app/utils/encoding.js @@ -1,8 +1,108 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + //************************************* // Base64 Object //************************************* -var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128);}}return t;},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2;}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3;}}return t;}}; //jshint ignore:line +var Base64 = { + _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + encode: function(e) { + var t = ""; + var n, r, i, s, o, u, a; + var f = 0; + e = Base64._utf8_encode(e); + while (f < e.length) { + n = e.charCodeAt(f++); + r = e.charCodeAt(f++); + i = e.charCodeAt(f++); + s = n >> 2; + o = (n & 3) << 4 | r >> 4; + u = (r & 15) << 2 | i >> 6; + a = i & 63; + if (isNaN(r)) { + u = a = 64 + } else if (isNaN(i)) { + a = 64 + } + t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a) + } + return t + }, + decode: function(e) { + var t = ""; + var n, r, i; + var s, o, u, a; + var f = 0; + e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + while (f < e.length) { + s = this._keyStr.indexOf(e.charAt(f++)); + o = this._keyStr.indexOf(e.charAt(f++)); + u = this._keyStr.indexOf(e.charAt(f++)); + a = this._keyStr.indexOf(e.charAt(f++)); + n = s << 2 | o >> 4; + r = (o & 15) << 4 | u >> 2; + i = (u & 3) << 6 | a; + t = t + String.fromCharCode(n); + if (u != 64) { + t = t + String.fromCharCode(r) + } + if (a != 64) { + t = t + String.fromCharCode(i) + } + } + t = Base64._utf8_decode(t); + return t + }, + _utf8_encode: function(e) { + e = e.replace(/\r\n/g, "\n"); + var t = ""; + for (var n = 0; n < e.length; n++) { + var r = e.charCodeAt(n); + if (r < 128) { + t += String.fromCharCode(r) + } else if (r > 127 && r < 2048) { + t += String.fromCharCode(r >> 6 | 192); + t += String.fromCharCode(r & 63 | 128) + } else { + t += String.fromCharCode(r >> 12 | 224); + t += String.fromCharCode(r >> 6 & 63 | 128); + t += String.fromCharCode(r & 63 | 128); + } + } + return t; + }, + _utf8_decode: function(e) { + var t = ""; + var n = 0; + var r = c1 = c2 = 0; + while (n < e.length) { + r = e.charCodeAt(n); + if (r < 128) { + t += String.fromCharCode(r); + n++; + } else if (r > 191 && r < 224) { + c2 = e.charCodeAt(n + 1); + t += String.fromCharCode((r & 31) << 6 | c2 & 63); + n += 2; + } else { + c2 = e.charCodeAt(n + 1); + c3 = e.charCodeAt(n + 2); + t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63); + n += 3; + } + } + return t; + } +}; //jshint ignore:line export default { Base64 -}; +}; \ No newline at end of file diff --git a/app/app/utils/misc.js b/app/app/utils/misc.js index ae22b156..3c1958e8 100644 --- a/app/app/utils/misc.js +++ b/app/app/utils/misc.js @@ -1,13 +1,23 @@ -// http://thecodeship.com/web-development/alternative-to-javascript-evil-setinterval/ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +// from http://thecodeship.com/web-development/alternative-to-javascript-evil-setinterval/ function interval(func, wait, times) { var interv = function(w, t) { return function() { - if(typeof t === "undefined" || t-- > 0) { + if (typeof t === "undefined" || t-- > 0) { setTimeout(interv, w); try { func.call(null); - } - catch(e) { + } catch (e) { t = 0; throw e.toString(); } @@ -33,4 +43,4 @@ function wrapFunction(fn, context, params) { export default { interval, wrapFunction -}; +}; \ No newline at end of file diff --git a/app/app/utils/model.js b/app/app/utils/model.js index ef31b346..cca15591 100644 --- a/app/app/utils/model.js +++ b/app/app/utils/model.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + import Ember from 'ember'; import stringUtil from '../utils/string'; import config from '../config/environment'; diff --git a/app/app/utils/net.js b/app/app/utils/net.js index 3fd30109..cc75ee1f 100644 --- a/app/app/utils/net.js +++ b/app/app/utils/net.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + function getSubdomain() { if (is.ipv4(window.location.host)) { return ""; @@ -19,11 +30,11 @@ function getAppUrl(domain) { let leftOvers = parts.join("."); - if (is.empty(domain)) { - domain = ""; - } else { - domain = domain + "."; - } + if (is.empty(domain)) { + domain = ""; + } else { + domain = domain + "."; + } return window.location.protocol + "//" + domain + leftOvers; } @@ -31,4 +42,4 @@ function getAppUrl(domain) { export default { getSubdomain, getAppUrl -}; +}; \ No newline at end of file diff --git a/app/app/utils/string.js b/app/app/utils/string.js index f3b8a0d0..100ce4b5 100644 --- a/app/app/utils/string.js +++ b/app/app/utils/string.js @@ -1,13 +1,24 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + // make url friendly slug from specified text. function makeSlug(text) { - return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-'); + return text.toLowerCase().replace(/[^\w ]+/g, '').replace(/ +/g, '-'); } function makeId(len) { var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for( var i=0; i < len; i++ ) { + for (var i = 0; i < len; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); } @@ -22,4 +33,4 @@ export default { makeSlug, makeId, endsWith -}; +}; \ No newline at end of file diff --git a/app/ember-cli-build.js b/app/ember-cli-build.js index 7d32c52b..2ce09f06 100644 --- a/app/ember-cli-build.js +++ b/app/ember-cli-build.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + /* global require, module */ var EmberApp = require('ember-cli/lib/broccoli/ember-app'); var isDevelopment = EmberApp.env() === 'development'; diff --git a/documize/section/code.go b/documize/section/code.go index 77b8a20f..b4327e2a 100644 --- a/documize/section/code.go +++ b/documize/section/code.go @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + package section import ( diff --git a/documize/section/trello.go b/documize/section/trello.go index 033bc908..42a73fe5 100644 --- a/documize/section/trello.go +++ b/documize/section/trello.go @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + package section import ( @@ -325,10 +336,6 @@ const trelloTemplate = ` does server side load up all data? YES!!?? owner read-only control? -we need method to use different trello accounts - - does this mean logout button? - - does this only work on add section phase? - is appKey is global? - where stored? - how access? From 1f8bdd7c4e99b7afd9bf452a36ad66053c9b75ae Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 12:53:27 -0700 Subject: [PATCH 06/24] fixed line height glitch for Firefox --- app/app/components/folder/folders-list.js | 1 - app/app/styles/widget/widget-input.scss | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/app/components/folder/folders-list.js b/app/app/components/folder/folders-list.js index 2f9bb61c..7f730850 100644 --- a/app/app/components/folder/folders-list.js +++ b/app/app/components/folder/folders-list.js @@ -9,7 +9,6 @@ // // https://documize.com -// Copyright (c) 2015 Documize Inc. import Ember from 'ember'; import constants from '../../utils/constants'; import TooltipMixin from '../../mixins/tooltip'; diff --git a/app/app/styles/widget/widget-input.scss b/app/app/styles/widget/widget-input.scss index 95398f72..f5e6a672 100644 --- a/app/app/styles/widget/widget-input.scss +++ b/app/app/styles/widget/widget-input.scss @@ -28,7 +28,7 @@ width: 100%; border: none; border-bottom: 1px solid $color-input; - height: 2rem; + height: 2.3rem; outline: none; &:focus { From 912e321cd99f6445ef232926d72aa997d85ae4f6 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 12:53:53 -0700 Subject: [PATCH 07/24] removed global 401 trap - useless --- app/app/initializers/application.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/app/initializers/application.js b/app/app/initializers/application.js index 7a75ad66..0cc3d498 100644 --- a/app/app/initializers/application.js +++ b/app/app/initializers/application.js @@ -20,13 +20,6 @@ export function initialize( /*application*/ ) { }); Dropzone.autoDiscover = false; - - // global trap for XHR 401 - $(document).ajaxError(function(e, xhr /*, settings, exception*/ ) { - if (xhr.status === 401 && is.not.startWith(window.location.pathname, "/auth/")) { - window.location.href = "/auth/login"; - } - }); } export default { From 60b4b21467e15377ea2729b45ae15e6ee239a4e6 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 12:54:16 -0700 Subject: [PATCH 08/24] better trello ajax error handling --- .../components/section/trello/type-editor.js | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index f0cdc539..ba0c3ae4 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -83,20 +83,15 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { self.set('config.lists', lists); self.set('waiting', false); + }, + function(error) { + self.set('waiting', false); + self.set('authenticated', false); + self.showNotification("Unable to fetch board lists"); + console.log(error); }); }, - // getListCards() { - // let self = this; - // let list = this.get('config.list'); - - // Trello.get(`lists/${list.id}/cards`, - // function(cards) { - // self.set('config.cards', cards); - // console.log(cards); - // }); - // }, - actions: { isDirty() { return this.get('isDirty'); @@ -145,15 +140,25 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { success: function() { self.set('authenticated', true); self.set('config.token', Trello.token()); + self.set('waiting', true); + Trello.get("members/me/boards?fields=id,name,url,closed,prefs,idOrganization", function(boards) { self.set('waiting', false); self.set('boards', boards.filterBy("closed", false)); self.getBoardLists(); - }); + }, + function(error) { + self.set('waiting', false); + self.set('authenticated', false); + self.showNotification("Unable to fetch boards"); + console.log(error); + } + ); }, error: function(error) { self.set('waiting', false); + self.set('authenticated', false); self.showNotification("Unable to authenticate"); console.log(error); } @@ -185,7 +190,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.get('sectionService').fetch(page, "cards", this.get('config')) .then(function(response) { - console.log(response); meta.set('rawBody', JSON.stringify(response)); self.set('waiting', false); self.attrs.onAction(page, meta); From f1316e3d932b72dcbf44a526797dc8a1a4e218be Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 13:25:04 -0700 Subject: [PATCH 09/24] read document font tweaks --- app/app/styles/view/document/content.scss | 2 +- app/app/styles/view/document/wysiwyg.scss | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/app/styles/view/document/content.scss b/app/app/styles/view/document/content.scss index 7c09e754..73f5e725 100644 --- a/app/app/styles/view/document/content.scss +++ b/app/app/styles/view/document/content.scss @@ -15,7 +15,7 @@ > .item { color: $color-off-black; - margin: 10px 5px; + margin: 0px 5px; padding: 0; list-style-type: none; diff --git a/app/app/styles/view/document/wysiwyg.scss b/app/app/styles/view/document/wysiwyg.scss index a9ca8712..a39bcf69 100644 --- a/app/app/styles/view/document/wysiwyg.scss +++ b/app/app/styles/view/document/wysiwyg.scss @@ -1,5 +1,7 @@ .wysiwyg { - font-size: 1rem; + // font-size: 1rem; + font-size: 15px; + line-height: 30px; table { @@ -16,7 +18,7 @@ p { margin: 0 !important; - padding: 0 !important; + padding: 0 !important; } } } From 99dca0e1ad38ab0c781fbe4c18467e3323aba5b3 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Tue, 17 May 2016 14:32:28 -0700 Subject: [PATCH 10/24] document toc cleaner --- app/app/helpers/document/toc-entry.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/app/helpers/document/toc-entry.js b/app/app/helpers/document/toc-entry.js index 27a8a5ba..2f35f025 100644 --- a/app/app/helpers/document/toc-entry.js +++ b/app/app/helpers/document/toc-entry.js @@ -21,10 +21,10 @@ export function documentTocEntry(params) { html += ""; if (currentPage === nodeId) { - html += "remove"; + html += ""; html += ""; } else { - html += "remove"; + html += ""; html += ""; } From 58a8f9169e424c1d3eba9676af3964458f70b756 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Wed, 18 May 2016 16:22:42 -0700 Subject: [PATCH 11/24] fixes and Trello updates 1. Fixed Firefox input field height. 2. Moved to server side Trello API calls. 3. New mixing for Section types. 4. Cleaned up TOC entry HTML --- .../components/section/gemini/type-editor.js | 11 +- .../components/section/trello/type-editor.js | 106 +++++++--- app/app/initializers/session.js | 1 + app/app/mixins/section.js | 26 +++ app/app/styles/widget/widget-input.scss | 2 +- .../components/section/gemini/type-editor.hbs | 6 +- .../components/section/trello/type-editor.hbs | 5 +- app/app/templates/components/ui-select.hbs | 2 +- .../unit/helpers/document/toc-entry-test.js | 15 +- documize/section/trello.go | 188 ++++++++++++++---- 10 files changed, 270 insertions(+), 92 deletions(-) create mode 100644 app/app/mixins/section.js diff --git a/app/app/components/section/gemini/type-editor.js b/app/app/components/section/gemini/type-editor.js index ca307e83..14a265b9 100644 --- a/app/app/components/section/gemini/type-editor.js +++ b/app/app/components/section/gemini/type-editor.js @@ -12,8 +12,9 @@ import Ember from 'ember'; import NotifierMixin from '../../../mixins/notifier'; import TooltipMixin from '../../../mixins/tooltip'; +import SectionMixin from '../../../mixins/section'; -export default Ember.Component.extend(NotifierMixin, TooltipMixin, { +export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, { sectionService: Ember.inject.service('section'), isDirty: false, waiting: false, @@ -22,14 +23,6 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { workspaces: [], config: {}, - fieldEditable: function() { - if (this.get('page.userId') !== this.session.user.id) { - return "readonly"; - } else { - return undefined; - } - }.property('config'), - didReceiveAttrs() { let config = {}; diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index ba0c3ae4..fb5ebaed 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -13,11 +13,12 @@ import Ember from 'ember'; import NotifierMixin from '../../../mixins/notifier'; import TooltipMixin from '../../../mixins/tooltip'; +import SectionMixin from '../../../mixins/section'; -export default Ember.Component.extend(NotifierMixin, TooltipMixin, { +export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, { sectionService: Ember.inject.service('section'), isDirty: false, - waiting: false, + busy: false, authenticated: false, config: {}, boards: null, @@ -42,6 +43,8 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { if (this.get('config.appKey') !== "" && this.get('config.token') !== "") { + console.log(this.get('isReadonly')); + console.log(this.get('isMine')); this.send('auth'); } }, @@ -51,12 +54,14 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { }, getBoardLists() { + this.set('busy', true); + let self = this; let boards = this.get('boards'); let board = this.get('config.board'); - this.set('waiting', true); + let page = this.get('page'); - if (is.null(board)) { + if (is.null(board) || is.undefined(board)) { if (boards.length) { board = boards[0]; this.set('config.board', board); @@ -65,9 +70,9 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.set('config.board', boards.findBy('id', board.id)); } - Trello.get(`boards/${board.id}/lists/open?fields=id,name,url`, - function(lists) { - let savedLists = self.get('config.lists'); + this.get('sectionService').fetch(page, "lists", self.get('config')) + .then(function(lists) { + let savedLists = self.get('config.lists'); if (savedLists === null) { savedLists = []; } @@ -82,14 +87,40 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { }); self.set('config.lists', lists); - self.set('waiting', false); - }, - function(error) { - self.set('waiting', false); + 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); - }); + }); + + + // Trello.get(`boards/${board.id}/lists/open?fields=id,name,url`, + // 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) { + // self.set('busy', false); + // self.set('authenticated', false); + // self.showNotification("Unable to fetch board lists"); + // console.log(error); + // }); }, actions: { @@ -124,7 +155,9 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { } let self = this; - self.set('waiting', true); + let page = this.get('page'); + + self.set('busy', true); Ember.$.getScript("https://api.trello.com/1/client.js?key=" + this.get('config.appKey'), function() { Trello.authorize({ @@ -140,24 +173,36 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { success: function() { self.set('authenticated', true); self.set('config.token', Trello.token()); - self.set('waiting', true); + self.set('busy', true); - Trello.get("members/me/boards?fields=id,name,url,closed,prefs,idOrganization", - function(boards) { - self.set('waiting', false); + self.get('sectionService').fetch(page, "boards", self.get('config')) + .then(function(boards) { + self.set('busy', false); self.set('boards', boards.filterBy("closed", false)); self.getBoardLists(); - }, - function(error) { - self.set('waiting', false); + }, function(error) { //jshint ignore: line + self.set('busy', false); self.set('authenticated', false); self.showNotification("Unable to fetch boards"); console.log(error); - } - ); + }); + + // Trello.get("members/me/boards?fields=id,name,url,closed,prefs,idOrganization", + // function(boards) { + // self.set('busy', false); + // self.set('boards', boards.filterBy("closed", false)); + // self.getBoardLists(); + // }, + // function(error) { + // self.set('busy', false); + // self.set('authenticated', false); + // self.showNotification("Unable to fetch boards"); + // console.log(error); + // } + // ); }, error: function(error) { - self.set('waiting', false); + self.set('busy', false); self.set('authenticated', false); self.showNotification("Unable to authenticate"); console.log(error); @@ -178,7 +223,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { }, onAction(title) { - this.set('waiting', false); + this.set('busy', true); let self = this; let page = this.get('page'); @@ -191,12 +236,15 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.get('sectionService').fetch(page, "cards", this.get('config')) .then(function(response) { meta.set('rawBody', JSON.stringify(response)); - self.set('waiting', false); + self.set('busy', false); self.attrs.onAction(page, meta); }, function(reason) { //jshint ignore: line - self.set('waiting', false); + self.set('busy', false); self.attrs.onAction(page, meta); }); } } -}); \ No newline at end of file +}); + +// show who owner is -- logout +// key really required? diff --git a/app/app/initializers/session.js b/app/app/initializers/session.js index 0350dbd8..55bb0999 100644 --- a/app/app/initializers/session.js +++ b/app/app/initializers/session.js @@ -13,6 +13,7 @@ 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 { diff --git a/app/app/mixins/section.js b/app/app/mixins/section.js new file mode 100644 index 00000000..e40a6209 --- /dev/null +++ b/app/app/mixins/section.js @@ -0,0 +1,26 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +import Ember from 'ember'; + +export default Ember.Mixin.create({ + isReadonly: function() { + if (this.get('page.userId') !== this.session.user.id) { + return "readonly"; + } else { + return undefined; + } + }.property('page'), + + isMine: function() { + return this.get('page.userId') !== this.session.user.id; + }.property('page') +}); \ No newline at end of file diff --git a/app/app/styles/widget/widget-input.scss b/app/app/styles/widget/widget-input.scss index f5e6a672..54e4eed2 100644 --- a/app/app/styles/widget/widget-input.scss +++ b/app/app/styles/widget/widget-input.scss @@ -53,7 +53,7 @@ padding: 5px; border: 1px solid $color-input; border-radius: 2px; - height: 2rem; + height: 2.3rem; font-size: 1rem; display: inline-block; diff --git a/app/app/templates/components/section/gemini/type-editor.hbs b/app/app/templates/components/section/gemini/type-editor.hbs index 40553fe8..47c484d1 100644 --- a/app/app/templates/components/section/gemini/type-editor.hbs +++ b/app/app/templates/components/section/gemini/type-editor.hbs @@ -47,17 +47,17 @@
e.g. http://helpdesk.countersoft.com
- {{focus-input id="gemini-url" type="text" value=config.url readonly=fieldEditable}} + {{focus-input id="gemini-url" type="text" value=config.url readonly=isReadonly}}
Gemini username
- {{input id="gemini-username" type="text" value=config.username readonly=fieldEditable}} + {{input id="gemini-username" type="text" value=config.username readonly=isReadonly}}
Gemini user API key (from user profile)
- {{input id="gemini-apikey" type="password" value=config.APIKey readonly=fieldEditable}} + {{input id="gemini-apikey" type="password" value=config.APIKey readonly=isReadonly}}
Authenticate
diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 7666f4a0..1a1602a4 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -32,7 +32,7 @@ } -{{#section/base-editor document=document folder=folder page=page busy=waiting tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} +{{#section/base-editor document=document folder=folder page=page busy=busy tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}}
@@ -72,7 +72,8 @@ action=(action 'onBoardChange') optionValuePath="id" optionLabelPath="name" - selection=config.board}} + selection=config.board + readonly=isReadonly}}
diff --git a/app/app/templates/components/ui-select.hbs b/app/app/templates/components/ui-select.hbs index 33ce913c..a5c2e767 100644 --- a/app/app/templates/components/ui-select.hbs +++ b/app/app/templates/components/ui-select.hbs @@ -1,4 +1,4 @@ - {{#if prompt}}
- {{end}} + {{end}}
{{end}}
@@ -334,10 +444,4 @@ const trelloTemplate = ` /* does server side load up all data? YES!!?? -owner read-only control? - -is appKey is global? - - where stored? - - how access? - - does section.go ask config to give us saved json */ From 475df5817456ee60f89e92a04111c16e1e3c050c Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 12:02:26 -0700 Subject: [PATCH 12/24] coming soon smart sections, markdown-it.js --- app/app/components/document/page-wizard.js | 17 ++++-- .../components/section/trello/type-editor.js | 2 + app/app/styles/view/document/wizard.scss | 53 +++++++++++------- .../components/document/page-wizard.hbs | 25 ++++++--- app/config/environment.js | 36 ++++++++---- app/ember-cli-build.js | 7 ++- app/public/sections/asana.png | Bin 0 -> 3013 bytes app/public/sections/code.png | Bin 0 -> 1575 bytes app/public/sections/docusign.png | Bin 0 -> 3579 bytes app/public/sections/gemini.png | Bin 2783 -> 3276 bytes app/public/sections/github.png | Bin 0 -> 2526 bytes app/public/sections/intercom.png | Bin 0 -> 3259 bytes app/public/sections/mailchimp.png | Bin 0 -> 5186 bytes app/public/sections/markdown.png | Bin 0 -> 1506 bytes app/public/sections/salesforce.png | Bin 0 -> 3166 bytes app/public/sections/stripe.png | Bin 0 -> 2495 bytes app/public/sections/suggest.png | Bin 0 -> 1584 bytes app/public/sections/table.png | Bin 0 -> 1467 bytes app/public/sections/trello.png | Bin 0 -> 2493 bytes app/public/sections/wysiwyg.png | Bin 0 -> 1549 bytes app/public/sections/zendesk.png | Bin 0 -> 4157 bytes app/vendor/markdown-it.min.js | 5 ++ documize/section/asana.go | 51 +++++++++++++++++ documize/section/code.go | 4 +- documize/section/docusign.go | 51 +++++++++++++++++ documize/section/gemini.go | 5 +- documize/section/github.go | 51 +++++++++++++++++ documize/section/intercom.go | 51 +++++++++++++++++ documize/section/mailchimp.go | 51 +++++++++++++++++ documize/section/markdown.go | 4 +- documize/section/salesforce.go | 51 +++++++++++++++++ documize/section/section.go | 14 ++--- documize/section/section_test.go | 1 - documize/section/stripe.go | 51 +++++++++++++++++ documize/section/table.go | 4 +- documize/section/trello.go | 48 +--------------- documize/section/wysiwyg.go | 2 +- documize/section/zendesk.go | 51 +++++++++++++++++ 38 files changed, 526 insertions(+), 109 deletions(-) create mode 100644 app/public/sections/asana.png create mode 100644 app/public/sections/code.png create mode 100644 app/public/sections/docusign.png create mode 100644 app/public/sections/github.png create mode 100644 app/public/sections/intercom.png create mode 100644 app/public/sections/mailchimp.png create mode 100644 app/public/sections/markdown.png create mode 100644 app/public/sections/salesforce.png create mode 100644 app/public/sections/stripe.png create mode 100644 app/public/sections/suggest.png create mode 100644 app/public/sections/table.png create mode 100644 app/public/sections/trello.png create mode 100644 app/public/sections/wysiwyg.png create mode 100644 app/public/sections/zendesk.png create mode 100644 app/vendor/markdown-it.min.js create mode 100644 documize/section/asana.go create mode 100644 documize/section/docusign.go create mode 100644 documize/section/github.go create mode 100644 documize/section/intercom.go create mode 100644 documize/section/mailchimp.go create mode 100644 documize/section/salesforce.go create mode 100644 documize/section/stripe.go create mode 100644 documize/section/zendesk.go diff --git a/app/app/components/document/page-wizard.js b/app/app/components/document/page-wizard.js index 17842d67..f9b79069 100644 --- a/app/app/components/document/page-wizard.js +++ b/app/app/components/document/page-wizard.js @@ -1,17 +1,18 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com import Ember from 'ember'; +import NotifierMixin from '../../mixins/notifier'; -export default Ember.Component.extend({ +export default Ember.Component.extend(NotifierMixin, { title: "", contentType: "", @@ -41,7 +42,13 @@ export default Ember.Component.extend({ onAction() { let title = this.get("title"); - let contentType = this.get("sections").findBy("selected", true).contentType; + let section = this.get("sections").findBy("selected", true); + let contentType = section.contentType; + + if (section.preview) { + this.showNotification("Coming soon!"); + return; + } if (is.empty(title)) { $("#page-title").addClass("error").focus(); @@ -51,4 +58,4 @@ export default Ember.Component.extend({ this.attrs.onAction(title, contentType); } } -}); \ No newline at end of file +}); diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index fb5ebaed..740e8516 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -248,3 +248,5 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, // show who owner is -- logout // key really required? +// no private boards? +// pass/save global section config? diff --git a/app/app/styles/view/document/wizard.scss b/app/app/styles/view/document/wizard.scss index 8c89984f..11a90a78 100644 --- a/app/app/styles/view/document/wizard.scss +++ b/app/app/styles/view/document/wizard.scss @@ -33,13 +33,12 @@ list-style: none; float: left; cursor: pointer; - width: 100px; - height: 100px; + width: 400px; + height: 80px; background-color: $color-white; border: 1px solid $color-border2; border-radius: 3px; margin: 0 30px 30px 0; - font-weight: bold; &:hover { @extend .z-depth-half; @@ -48,30 +47,46 @@ transition: 0.2s all ease; } - > .material-icons { - text-align: center; - margin: 20px 0 0 31px; - font-size: 2.5rem; - color: $color-stroke; - } - > .img { - height: 30px; - width: 30px; text-align: center; - margin: 23px 0 6px 33px; + margin: 17px 10px 0 20px; + display: inline-block; } - > .title { - font-size: 1rem; - color: $color-stroke; - text-align: center; - margin-top: 5px; + > .details { + vertical-align: top; + display: inline-block; + + > .title { + font-size: 1rem; + font-weight: bold; + color: $color-off-black; + margin-top: 18px; + letter-spacing: 0.5px; + + .preview { + font-size: 0.7rem; + color: #cc9933; + display: inline-block; + margin-left: 10px; + } + } + + > .desc { + color: $color-stroke; + font-size: 0.8rem; + margin-top: 5px; + max-width: 300px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } } } > .selected { - border-color: $color-link; + background-color: $color-card-active; + border: 1px dotted $color-link; } } } diff --git a/app/app/templates/components/document/page-wizard.hbs b/app/app/templates/components/document/page-wizard.hbs index b612483c..4f0c3867 100644 --- a/app/app/templates/components/document/page-wizard.hbs +++ b/app/app/templates/components/document/page-wizard.hbs @@ -17,15 +17,26 @@
    {{#each sections as |section|}} -
  • - {{#if section.hasImage}} - - {{else}} - {{section.iconFont}} - {{/if}} -
    {{section.title}}
    +
  • + +
    +
    + {{section.title}} + {{#if section.preview}} +
    coming soon
    + {{/if}} +
    +
    {{section.description}}
    +
  • {{/each}} +
  • + +
    +
    Suggest
    +
    We'll build the integrations you need - just let us know
    +
    +
diff --git a/app/config/environment.js b/app/config/environment.js index ff3c5ffc..52539dbf 100644 --- a/app/config/environment.js +++ b/app/config/environment.js @@ -1,3 +1,14 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + /* jshint node: true */ module.exports = function(environment) { @@ -9,6 +20,7 @@ module.exports = function(environment) { baseURL: '/', apiHost: '', apiNamespace: '', + contentSecurityPolicyHeader: 'Content-Security-Policy-Report-Only', EmberENV: { FEATURES: {} @@ -21,7 +33,7 @@ module.exports = function(environment) { ENV.APP.LOG_TRANSITIONS_INTERNAL = true; ENV.apiHost = "https://localhost:5001"; - // ENV.apiHost = "https://demo1.dev:5001"; + ENV.apiHost = "https://demo1.dev:5001"; } if (environment === 'test') { @@ -52,6 +64,8 @@ module.exports = function(environment) { ENV.apiNamespace = "api"; + ENV.contentSecurityPolicy = null; + // ENV.contentSecurityPolicy = { // 'img-src': "'self' data: self https://js.intercomcdn.com", // 'font-src': "'self' data: fonts.gstatic.com", @@ -61,14 +75,14 @@ module.exports = function(environment) { // 'default-src': "none" // }; - return ENV; -}; + // ENV.contentSecurityPolicy = { + // 'img-src': "'self' data: self", + // 'font-src': "'self' *", + // 'style-src': "'self' *", + // 'script-src': "'self' *", + // 'connect-src': "'self' *", + // 'default-src': "*" + // }; -// contentSecurityPolicy: { -// 'img-src': "'self' data: self", -// 'font-src': "'self' data: fonts.gstatic.com", -// 'style-src': "'self' 'unsafe-inline' fonts.googleapis.com", -// 'script-src': "'self' 'unsafe-inline' 'unsafe-eval' *", -// 'connect-src': "'self'", -// 'default-src': "none" -// }, \ No newline at end of file + return ENV; +}; \ No newline at end of file diff --git a/app/ember-cli-build.js b/app/ember-cli-build.js index 2ce09f06..f36b5ffe 100644 --- a/app/ember-cli-build.js +++ b/app/ember-cli-build.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -55,6 +55,7 @@ module.exports = function(defaults) { app.import('vendor/tether.js'); app.import('vendor/drop.js'); app.import('vendor/tooltip.js'); + app.import('vendor/markdown-it.min.js'); return app.toTree(); -}; \ No newline at end of file +}; diff --git a/app/public/sections/asana.png b/app/public/sections/asana.png new file mode 100644 index 0000000000000000000000000000000000000000..56fd9f61e9e65420f062750d7c9628e6b8f623fe GIT binary patch literal 3013 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 literal 0 HcmV?d00001 diff --git a/app/public/sections/docusign.png b/app/public/sections/docusign.png new file mode 100644 index 0000000000000000000000000000000000000000..2b832abc9152bd2e3f0c8e524bca06ebd9d5f9e1 GIT binary patch literal 3579 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%0D+lu3@$zV?UEgF3FY*fSeq#0(&k?Gjh)T~QT;-? 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 diff --git a/app/public/sections/github.png b/app/public/sections/github.png new file mode 100644 index 0000000000000000000000000000000000000000..322a6c24682f08936518c06f5a8c7d78006f8f9e GIT binary patch literal 2526 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 bt=a&=-l`K{2yS_`@;gDL*jU^)|0(o8x;Lj% literal 0 HcmV?d00001 diff --git a/app/public/sections/mailchimp.png b/app/public/sections/mailchimp.png new file mode 100644 index 0000000000000000000000000000000000000000..1f51e24f347aaeb8c081ad464ee310dfb9173ce0 GIT binary patch literal 5186 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 LEA(9xkGTH={Xh=B literal 0 HcmV?d00001 diff --git a/app/public/sections/markdown.png b/app/public/sections/markdown.png new file mode 100644 index 0000000000000000000000000000000000000000..2056149eb8e676100195cfa09623ffa4db24db29 GIT binary patch literal 1506 zcmbVMZBP_t9ABZ7kPAjo3=Nk9C!E;Zm%F{Y-8kX67eG7IgE7)Ru($ghEXVDhyNh=) zL^EU|qvmK?lZt6CO&ZCYBCuZc~Gg&;^%SYUUnD-wQVrm9~$-c|mcMD#fB#2{ICZteofpaG{?m z2X4S{HLH3+HUve7_>xkk)b%ROihdmv#^^%+fXarT?3_@5VSPY>J)oQyEZSQ~JGC&+ zS+uW_F3c6MfeOB$RszMfMI~&lkEJ+m&O$glM5_w?Kw;pJze;}NSBi&ph?JOqEh<(gD1$P$=FjaPut@Z;!DYRR(>Wz-$IT{#nlJl612noC< z#9&}Zguy*t#Kf?`W6+xk1H(l0Jc*AvDW{b*8FA96$8m>|ayasAR@`C64JL=vibuGG zf~+tC3nI38)%FCJd@7f=Nq|vAsYDd3B3-bwLR3V#LJYt*+gR1%Oc%rQLilh&xKQJ9 z+kwQd2Aoq8{qR_(Y5oabcu6DWAv_df;=B}MzzqQLm^cC2!P0=IQ?|hxJuxHiWuHENrd^HOd^Tg>mPI2kPMdE} zy!}O1Z+s8u?l)+X98;E`IPAwXBLND$R4JE@z34bN3A$ zh#5^)TPBujFpd2n(@LV_IJn(igX; z?#8sz4@Z7IwrlU+ZO3*tev_uq%^g=h>K%c%ENa^Ns5)cDb8DTS)eR}w>^1H^&z$il zc3-R0B3j%+ZcXp9?M9@f7Voz=S1a4LP)I%~#^2ZPnUrh92Q znRk*Ka;F=v-`EINzIXrj_UAu6bD^sH*^6?@+Ik}H?db=v*IDmbsK+aQ_>!gi8jJ28 zI8}FYHQn5>+ literal 0 HcmV?d00001 diff --git a/app/public/sections/salesforce.png b/app/public/sections/salesforce.png new file mode 100644 index 0000000000000000000000000000000000000000..5c09927d73bbb226dc9f5c3ed6ee51c03f921791 GIT binary patch literal 3166 zcmbVOc{r478@DGy(Sn1;mPD8Tt*rKeIkixeGaPq(7F(isFAz@_U#B?2I0FM=Cj2@qTYe4YWCTwJ{VWNUl6 zy_qSNMD|j*=y}UVWE-p=Ne{TZG1E7P5fE$^j1zxIc0E5UbT3|br8O+REA8;q1 z3Zwy6fp}|Dpa)6A1+4umNYfw7QQ!s82_SzjPl_+rUkm(QFP5|45ktYC?-06&7Wglx z?9I-A^r-Ovt@;|aGW|EiNP7_!hdp&DZX?9g#`SxP3GAC!A1Nl7pqSL2y`mVno9Nj z*#&3ZsdTEZJJlPcum8R3pkrnP5}C3iRNg7nUvV1%H1Z|D#gInz0)5Xkmi!N15HN5I z0$(`-r z!@xQGJx&0HGeb1au&gD->2h%iUN$z+we}w!bRc_L4@qe;4hCsXm$msT2>f!2w|Gjg zG3&(9P(z`<0(tJ-0^=73W`}Um$*RXp!la{}i?W|s4keo;Ub8GfKe$&AttX)*FDTx4 zROihw^NOR%GAmZ?HT!WrBWTgFOLL5r@YLdiN=Cri>)?+WTfuW%EZ_04Wbv0}k!`wi z>6*xDSSn>w!+lb%bo2^iEvh5p)qd7Fp^}Nri(GU5pURdUlZ}dawv940BU=Z~TV|aM zuq=zxVJP=Wn>*bJ+`~p8H`qRfN|Bq1`+4L-7p@<2JbwAUaz{jFgWJX9laKjbLa4Z!2Yntk@Lk;yaF z7L|j)2dS){dG9+8TOjL-9ihL!oU?1mhxn!nao1!zCpFUfmDSay5)t{H@hxr1mflo_ z>ops(6?lLKtzTWMy|&U)#NX}{^O?7sFRr`fQuYHCe4~RsPAdaEJQm|!cQP`^PHI9< zb?~NuiL@FwT~b_nv#_VFbF5?1FZwh0cIPem_gXK-K506LTcysLl3fp1dTcsOD{Hb; z!+F>H1nUDM=rxEmgWJeL)pcq5S%-;GrRFrzz8qs&W|&>pgPx|%4|{an7|j(SHx3oQ z8?IjE2J~+GT^nRx4(xU{oBqN!uanFRQ&Rl`Zuix>aJ%o&%!+BJ@ zGeytXW~m&19`w=n^UBaxheZY>u0Yh8^zfVy7Z9@!#>evFl?zAmm(SWG zrxV|?pKnTDd^Z+1c#^-|gzuZ23I1&4?RD)uT9DAvn>{K?Y6++rsn@;x-bxQxd`!US z(&zb#kFXfjJv!&x`W}V{5ognVkuvCn-@WJy2TTG7VWRR>J>sZ zI8H@CaKn|%My?Xt7X$5c`288t)kkB&>4r=jQekmiFkI%|Gzw=VYHRe~3IEcB^C?b8Sgxky}_%&R$AK!e*xXsm$fXnDnguOkBXC1v03V z+14+7YecGO=~ChMaXGe^83w{6+5~uCJNP zZ(6Z!&AUzyFCKr_A^YkOmCzVsz%r_8uX*HTiOasTZens;*uuRcn8e?bBFcD%aX23L zh&&WbxF>tF$C}!#)%2&AEwg;e)m1vDVYR5HCuz&wtWU5mAK%|PnHQLUtp#cfEk0-*0R{~Q!-$vczPLw)sCBQ_cd(KqswYohu>)(XW!904J z6e*v2xVQ;x*-?>NOt(cR-m8(gv%y<}6SQp&lPInG^^Oi@X)fM~8@2E0`W=f^<@+Xz%&(r#vs$p zF5ZNze=DunFVbQ)C<)JoBF(ob`i*6+N0qOfUrN#*gzjl3@p9cP;pw^U+9Dkv?5u>LvI zE}CcM>m{i+G4pVrJWR$xciU^Ud!6_$*7J(c5$yY^5h-Q_BTq*!Sz^Yo`V-|#H`+pdF0&;Cbf;lte%|8 v{*xF}PMv;19%paxfAXpuWq;A;7U0Uxyf=~byI1?pAHOjUZ&0jv;p%??FXo9~ literal 0 HcmV?d00001 diff --git a/app/public/sections/stripe.png b/app/public/sections/stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..d0abc97a240ce13aedac7f4e5fbf362a929abce7 GIT binary patch literal 2495 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 literal 0 HcmV?d00001 diff --git a/app/public/sections/trello.png b/app/public/sections/trello.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc8a64b3bf89ebc08da09126200b17adf629bf7 GIT binary patch literal 2493 zcmbVOc{r478=q2fs4$_As4BDtN9@68izDem0A$7DGXRJqmmUaE0Xi!xtQ9Z^f#f6{ zPam-l#hJ+DbK&$w3|zt$$k-r|`F4qb&I|#>5C#y);gO(k>TW?H92N=cjin$d0vjNR z;}9(bJfdAZnb9Fk0t>p`0%9&9$`o(`F&!e|hVn#22?_d5FHyE%6eFOJZxC?^3HseB zABr2qhA#vlSU3*GM4?a+JOPfvnwg@pCJ;0dg+(9<2ow^AL=jO)A{q(#@jzwPge*3Z zO1Ar9OLihbgT!J15rK$|jD$y;!ui5L1d2c)AdqMT8V!>nV4^6Vm@a|wM0!ga$bg6` z13MiDHig}_RiISxZA)yNpC^!|UWa`(@M7J)Kvh^|78tSIzQGM^dF1$bgdG6^cXfwMR) zB7i|*SqwZ5h6UJo7zRVf!ssXl8-}Md0S3m@42_}Fm-PIKk0jWb5^S(|6c%TSLfPU7 zwzk$bRw!FD6b5f=XN6kgI`TwfI*$n~+2+V>|KQ^OkxR4@0(3E7=*j1YE_H!h5MRs} z1@Q$C8=G%chiswHnH=7taO+~BzQ;`lgq#R~WhdlwA>T4h zFenTFW8hh67?z2_F#sfrVah;5fACrVZw3)Erx1(n@;~jfB$D;y;`Zk-$PPcp3E;_Q zNGKZ?l(eN71X|hWNVf8nJiFuT$k(=2`&wFLuG#0_T%)EPs7lobZ#9umyaUY{wahSs zgeCcXP*s3J&Ei3N>-5*MHh6X*PW{TRd4^dc7== zqx5@j&dG9bFaJGnx??JKo7V5q8NMq}Je)6|P!%91lZHULoWs+am&-16Z1&Li$MB5K z+@dYJxjMyQHpoEBYX8eAU$+IhSw487cXVg5s|GhyH(ICIwRxjpni>Ta#d+#zz+ zflP|3QM^;e8}V<)@zLYrZpByCwXNe_dJ3I_2eCRG2cD;8x>s;l)?V-S(4WaxIFzz- zO>Urbi}Mzm#+%Tg#wJsVB_&Iq>w2Z@$cOPUjX&Un)@A48lupLe4po$$TE8iDq<`R1 zEwhxS_`Cn{o;siT$xS8;Jyxt5N2UXOohmI;Jw24#vV{Mn3PZ!s%IxUZ^NvLeFRf1^op_EWoaLw@yGBee7*n4m`B?z3OX?}z&)w92r z$dPU@ZWP!pJT*?4YA8@ZPmxzWnl{|@Z&0oNWyXo}J87+AgNL1x1O93nUrOAb#zE_vDU#o_v^7+XaF|E4;DQXntI+x{wwg5xejoL-^NTEza45VaLI0 z^6N_{vG>Y3TWV-M&wPB}6dc*;DgE3Sw){GPNdEL2&9Y#EBs3}?Dcy3aJ_O`+BR?Qn zt+tu!>W;ArYxE@4n#F;eKdKB+DwFySflnB2rfWTUWiXxA7p_)0Oah~}$+zkF*c6=` zQ*lcgUp5P`*zXjYtv;8!L*aBZL)x31DC|3T*$7A($UKo-q+9Rwb(mgQ8SK>LO%dTJ zHRA^-S z{XtUcDPG!&4;8P=C#zIT@(5TJ)4Te@gzP?Ea9k)}`?=Cid-w9nuF2t9#DZnnhN1S) zS=4RD)ie1namxFATHcLP3Un3I9eA3zORpl$CIX>jZREMt6?-WeRyPNqrJn3?aZTLH z$f*vEG`P;)HE?0Vdv((d7tPV|t9qtK`v>uF zBXs|zc4;T5bMsi;dEFON(UBWEm=8kgP4?j7G3UE(enh|Lo$?Cyy|?=HLVXrKAXa^L m0&woUQQ|B;xOct+BnOHz)L_F5@9`FYs2puw$mP}n34a4UIv5K8 literal 0 HcmV?d00001 diff --git a/app/public/sections/wysiwyg.png b/app/public/sections/wysiwyg.png new file mode 100644 index 0000000000000000000000000000000000000000..d20a899527e01a8ea1b6a62262fedb212039134d GIT binary patch literal 1549 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\\x00-\\x20]+",o="'[^']*'",i='"[^"]*"',a="(?:"+s+"|"+o+"|"+i+")",c="(?:\\s+"+n+"(?:\\s*=\\s*"+a+")?)",l="<[A-Za-z][A-Za-z0-9\\-]*"+c+"*\\s*\\/?>",u="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",p="|",h="<[?].*?[?]>",f="]*>",d="",m=new RegExp("^(?:"+l+"|"+u+"|"+p+"|"+h+"|"+f+"|"+d+")"),g=new RegExp("^(?:"+l+"|"+u+")");r.exports.HTML_TAG_RE=m,r.exports.HTML_OPEN_CLOSE_TAG_RE=g},{}],4:[function(e,r,t){"use strict";function n(e){return Object.prototype.toString.call(e)}function s(e){return"[object String]"===n(e)}function o(e,r){return x.call(e,r)}function i(e){var r=Array.prototype.slice.call(arguments,1);return r.forEach(function(r){if(r){if("object"!=typeof r)throw new TypeError(r+"must be object");Object.keys(r).forEach(function(t){e[t]=r[t]})}}),e}function a(e,r,t){return[].concat(e.slice(0,r),t,e.slice(r+1))}function c(e){return e>=55296&&57343>=e?!1:e>=64976&&65007>=e?!1:65535===(65535&e)||65534===(65535&e)?!1:e>=0&&8>=e?!1:11===e?!1:e>=14&&31>=e?!1:e>=127&&159>=e?!1:e>1114111?!1:!0}function l(e){if(e>65535){e-=65536;var r=55296+(e>>10),t=56320+(1023&e);return String.fromCharCode(r,t)}return String.fromCharCode(e)}function u(e,r){var t=0;return o(q,r)?q[r]:35===r.charCodeAt(0)&&w.test(r)&&(t="x"===r[1].toLowerCase()?parseInt(r.slice(2),16):parseInt(r.slice(1),10),c(t))?l(t):e}function p(e){return e.indexOf("\\")<0?e:e.replace(y,"$1")}function h(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(A,function(e,r,t){return r?r:u(e,t)})}function f(e){return S[e]}function d(e){return D.test(e)?e.replace(E,f):e}function m(e){return e.replace(F,"\\$&")}function g(e){switch(e){case 9:case 32:return!0}return!1}function _(e){if(e>=8192&&8202>=e)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function k(e){return L.test(e)}function b(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function v(e){return e.trim().replace(/\s+/g," ").toUpperCase()}var x=Object.prototype.hasOwnProperty,y=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,C=/&([a-z#][a-z0-9]{1,31});/gi,A=new RegExp(y.source+"|"+C.source,"gi"),w=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,q=e("./entities"),D=/[&<>"]/,E=/[&<>"]/g,S={"&":"&","<":"<",">":">",'"':"""},F=/[.?*+^$[\]\\(){}|-]/g,L=e("uc.micro/categories/P/regex");t.lib={},t.lib.mdurl=e("mdurl"),t.lib.ucmicro=e("uc.micro"),t.assign=i,t.isString=s,t.has=o,t.unescapeMd=p,t.unescapeAll=h,t.isValidEntityCode=c,t.fromCodePoint=l,t.escapeHtml=d,t.arrayReplaceAt=a,t.isSpace=g,t.isWhiteSpace=_,t.isMdAsciiPunct=b,t.isPunctChar=k,t.escapeRE=m,t.normalizeReference=v},{"./entities":1,mdurl:59,"uc.micro":65,"uc.micro/categories/P/regex":63}],5:[function(e,r,t){"use strict";t.parseLinkLabel=e("./parse_link_label"),t.parseLinkDestination=e("./parse_link_destination"),t.parseLinkTitle=e("./parse_link_title")},{"./parse_link_destination":6,"./parse_link_label":7,"./parse_link_title":8}],6:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace,s=e("../common/utils").unescapeAll;r.exports=function(e,r,t){var o,i,a=0,c=r,l={ok:!1,pos:0,lines:0,str:""};if(60===e.charCodeAt(r)){for(r++;t>r;){if(o=e.charCodeAt(r),10===o||n(o))return l;if(62===o)return l.pos=r+1,l.str=s(e.slice(c+1,r)),l.ok=!0,l;92===o&&t>r+1?r+=2:r++}return l}for(i=0;t>r&&(o=e.charCodeAt(r),32!==o)&&!(32>o||127===o);)if(92===o&&t>r+1)r+=2;else{if(40===o&&(i++,i>1))break;if(41===o&&(i--,0>i))break;r++}return c===r?l:(l.str=s(e.slice(c,r)),l.lines=a,l.pos=r,l.ok=!0,l)}},{"../common/utils":4}],7:[function(e,r,t){"use strict";r.exports=function(e,r,t){var n,s,o,i,a=-1,c=e.posMax,l=e.pos;for(e.pos=r+1,n=1;e.pos=t)return c;if(o=e.charCodeAt(r),34!==o&&39!==o&&40!==o)return c;for(r++,40===o&&(o=41);t>r;){if(s=e.charCodeAt(r),s===o)return c.pos=r+1,c.lines=i,c.str=n(e.slice(a+1,r)),c.ok=!0,c;10===s?i++:92===s&&t>r+1&&(r++,10===e.charCodeAt(r)&&i++),r++}return c}},{"../common/utils":4}],9:[function(e,r,t){"use strict";function n(e){var r=e.trim().toLowerCase();return _.test(r)?k.test(r)?!0:!1:!0}function s(e){var r=d.parse(e,!0);if(r.hostname&&(!r.protocol||b.indexOf(r.protocol)>=0))try{r.hostname=m.toASCII(r.hostname)}catch(t){}return d.encode(d.format(r))}function o(e){var r=d.parse(e,!0);if(r.hostname&&(!r.protocol||b.indexOf(r.protocol)>=0))try{r.hostname=m.toUnicode(r.hostname)}catch(t){}return d.decode(d.format(r))}function i(e,r){return this instanceof i?(r||a.isString(e)||(r=e||{},e="default"),this.inline=new h,this.block=new p,this.core=new u,this.renderer=new l,this.linkify=new f,this.validateLink=n,this.normalizeLink=s,this.normalizeLinkText=o,this.utils=a,this.helpers=c,this.options={},this.configure(e),void(r&&this.set(r))):new i(e,r)}var a=e("./common/utils"),c=e("./helpers"),l=e("./renderer"),u=e("./parser_core"),p=e("./parser_block"),h=e("./parser_inline"),f=e("linkify-it"),d=e("mdurl"),m=e("punycode"),g={"default":e("./presets/default"),zero:e("./presets/zero"),commonmark:e("./presets/commonmark")},_=/^(vbscript|javascript|file|data):/,k=/^data:image\/(gif|png|jpeg|webp);/,b=["http:","https:","mailto:"];i.prototype.set=function(e){return a.assign(this.options,e),this},i.prototype.configure=function(e){var r,t=this;if(a.isString(e)&&(r=e,e=g[r],!e))throw new Error('Wrong `markdown-it` preset "'+r+'", check name');if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enableOnly(e.components[r].rules),e.components[r].rules2&&t[r].ruler2.enableOnly(e.components[r].rules2)}),this},i.prototype.enable=function(e,r){var t=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(r){t=t.concat(this[r].ruler.enable(e,!0))},this),t=t.concat(this.inline.ruler2.enable(e,!0));var n=e.filter(function(e){return t.indexOf(e)<0});if(n.length&&!r)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},i.prototype.disable=function(e,r){var t=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(r){t=t.concat(this[r].ruler.disable(e,!0))},this),t=t.concat(this.inline.ruler2.disable(e,!0));var n=e.filter(function(e){return t.indexOf(e)<0});if(n.length&&!r)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},i.prototype.use=function(e){var r=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,r),this},i.prototype.parse=function(e,r){var t=new this.core.State(e,this,r);return this.core.process(t),t.tokens},i.prototype.render=function(e,r){return r=r||{},this.renderer.render(this.parse(e,r),this.options,r)},i.prototype.parseInline=function(e,r){var t=new this.core.State(e,this,r);return t.inlineMode=!0,this.core.process(t),t.tokens},i.prototype.renderInline=function(e,r){return r=r||{},this.renderer.render(this.parseInline(e,r),this.options,r)},r.exports=i},{"./common/utils":4,"./helpers":5,"./parser_block":10,"./parser_core":11,"./parser_inline":12,"./presets/commonmark":13,"./presets/default":14,"./presets/zero":15,"./renderer":16,"linkify-it":54,mdurl:59,punycode:52}],10:[function(e,r,t){"use strict";function n(){this.ruler=new s;for(var e=0;ea&&(e.line=a=e.skipEmptyLines(a),!(a>=t))&&!(e.sCount[a]=l){e.line=t;break}for(s=0;i>s&&!(n=o[s](e,a,t,!1));s++);if(e.tight=!c,e.isEmpty(e.line-1)&&(c=!0),a=e.line,t>a&&e.isEmpty(a)){if(c=!0,a++,t>a&&"list"===e.parentType&&e.isEmpty(a))break;e.line=a}}},n.prototype.parse=function(e,r,t,n){var s;return e?(s=new this.State(e,r,t,n),void this.tokenize(s,s.line,s.lineMax)):[]},n.prototype.State=e("./rules_block/state_block"),r.exports=n},{"./ruler":17,"./rules_block/blockquote":18,"./rules_block/code":19,"./rules_block/fence":20,"./rules_block/heading":21,"./rules_block/hr":22,"./rules_block/html_block":23,"./rules_block/lheading":24,"./rules_block/list":25,"./rules_block/paragraph":26,"./rules_block/reference":27,"./rules_block/state_block":28,"./rules_block/table":29}],11:[function(e,r,t){"use strict";function n(){this.ruler=new s;for(var e=0;er;r++)n[r](e)},n.prototype.State=e("./rules_core/state_core"),r.exports=n},{"./ruler":17,"./rules_core/block":30,"./rules_core/inline":31,"./rules_core/linkify":32,"./rules_core/normalize":33,"./rules_core/replacements":34,"./rules_core/smartquotes":35,"./rules_core/state_core":36}],12:[function(e,r,t){"use strict";function n(){var e;for(this.ruler=new s,e=0;et&&(e.level++,r=s[t](e,!0),e.level--,!r);t++);else e.pos=e.posMax;r||e.pos++,a[n]=e.pos},n.prototype.tokenize=function(e){for(var r,t,n=this.ruler.getRules(""),s=n.length,o=e.posMax,i=e.md.options.maxNesting;e.post&&!(r=n[t](e,!1));t++);if(r){if(e.pos>=o)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},n.prototype.parse=function(e,r,t,n){var s,o,i,a=new this.State(e,r,t,n);for(this.tokenize(a),o=this.ruler2.getRules(""),i=o.length,s=0;i>s;s++)o[s](a)},n.prototype.State=e("./rules_inline/state_inline"),r.exports=n},{"./ruler":17,"./rules_inline/autolink":37,"./rules_inline/backticks":38,"./rules_inline/balance_pairs":39,"./rules_inline/emphasis":40,"./rules_inline/entity":41,"./rules_inline/escape":42,"./rules_inline/html_inline":43,"./rules_inline/image":44,"./rules_inline/link":45,"./rules_inline/newline":46,"./rules_inline/state_inline":47,"./rules_inline/strikethrough":48,"./rules_inline/text":49,"./rules_inline/text_collapse":50}],13:[function(e,r,t){"use strict";r.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},{}],14:[function(e,r,t){"use strict";r.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},{}],15:[function(e,r,t){"use strict";r.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},{}],16:[function(e,r,t){"use strict";function n(){this.rules=s({},a)}var s=e("./common/utils").assign,o=e("./common/utils").unescapeAll,i=e("./common/utils").escapeHtml,a={};a.code_inline=function(e,r){return""+i(e[r].content)+""},a.code_block=function(e,r){return"
"+i(e[r].content)+"
\n"},a.fence=function(e,r,t,n,s){var a,c=e[r],l=c.info?o(c.info).trim():"",u="";return l&&(u=l.split(/\s+/g)[0],c.attrJoin("class",t.langPrefix+u)),a=t.highlight?t.highlight(c.content,u)||i(c.content):i(c.content),0===a.indexOf(""+a+"\n"},a.image=function(e,r,t,n,s){var o=e[r];return o.attrs[o.attrIndex("alt")][1]=s.renderInlineAsText(o.children,t,n),s.renderToken(e,r,t)},a.hardbreak=function(e,r,t){return t.xhtmlOut?"
\n":"
\n"},a.softbreak=function(e,r,t){return t.breaks?t.xhtmlOut?"
\n":"
\n":"\n"},a.text=function(e,r){return i(e[r].content)},a.html_block=function(e,r){return e[r].content},a.html_inline=function(e,r){return e[r].content},n.prototype.renderAttrs=function(e){var r,t,n;if(!e.attrs)return"";for(n="",r=0,t=e.attrs.length;t>r;r++)n+=" "+i(e.attrs[r][0])+'="'+i(e.attrs[r][1])+'"';return n},n.prototype.renderToken=function(e,r,t){var n,s="",o=!1,i=e[r];return i.hidden?"":(i.block&&-1!==i.nesting&&r&&e[r-1].hidden&&(s+="\n"),s+=(-1===i.nesting?"\n":">")},n.prototype.renderInline=function(e,r,t){for(var n,s="",o=this.rules,i=0,a=e.length;a>i;i++)n=e[i].type,s+="undefined"!=typeof o[n]?o[n](e,i,r,t,this):this.renderToken(e,i,r);return s},n.prototype.renderInlineAsText=function(e,r,t){for(var n="",s=this.rules,o=0,i=e.length;i>o;o++)"text"===e[o].type?n+=s.text(e,o,r,t,this):"image"===e[o].type&&(n+=this.renderInlineAsText(e[o].children,r,t));return n},n.prototype.render=function(e,r,t){var n,s,o,i="",a=this.rules;for(n=0,s=e.length;s>n;n++)o=e[n].type,i+="inline"===o?this.renderInline(e[n].children,r,t):"undefined"!=typeof a[o]?a[e[n].type](e,n,r,t,this):this.renderToken(e,n,r,t);return i},r.exports=n},{"./common/utils":4}],17:[function(e,r,t){"use strict";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(e){for(var r=0;rn){if(r)return;throw new Error("Rules manager: invalid rule name "+e)}this.__rules__[n].enabled=!0,t.push(e)},this),this.__cache__=null,t},n.prototype.enableOnly=function(e,r){Array.isArray(e)||(e=[e]),this.__rules__.forEach(function(e){e.enabled=!1}),this.enable(e,r)},n.prototype.disable=function(e,r){Array.isArray(e)||(e=[e]);var t=[];return e.forEach(function(e){var n=this.__find__(e);if(0>n){if(r)return;throw new Error("Rules manager: invalid rule name "+e)}this.__rules__[n].enabled=!1,t.push(e)},this),this.__cache__=null,t},n.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},r.exports=n},{}],18:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace;r.exports=function(e,r,t,s){var o,i,a,c,l,u,p,h,f,d,m,g,_,k,b,v,x=e.bMarks[r]+e.tShift[r],y=e.eMarks[r];if(62!==e.src.charCodeAt(x++))return!1;if(s)return!0;for(32===e.src.charCodeAt(x)&&x++,u=e.blkIndent,e.blkIndent=0,f=d=e.sCount[r]+x-(e.bMarks[r]+e.tShift[r]),l=[e.bMarks[r]],e.bMarks[r]=x;y>x&&(m=e.src.charCodeAt(x),n(m));)9===m?d+=4-d%4:d++,x++;for(i=x>=y,c=[e.sCount[r]],e.sCount[r]=d-f,a=[e.tShift[r]],e.tShift[r]=x-e.bMarks[r],g=e.md.block.ruler.getRules("blockquote"),o=r+1;t>o&&!(e.sCount[o]=y));o++)if(62!==e.src.charCodeAt(x++)){if(i)break;for(v=!1,k=0,b=g.length;b>k;k++)if(g[k](e,o,t,!0)){v=!0;break}if(v)break;l.push(e.bMarks[o]),a.push(e.tShift[o]),c.push(e.sCount[o]),e.sCount[o]=-1}else{for(32===e.src.charCodeAt(x)&&x++,f=d=e.sCount[o]+x-(e.bMarks[o]+e.tShift[o]),l.push(e.bMarks[o]),e.bMarks[o]=x;y>x&&(m=e.src.charCodeAt(x),n(m));)9===m?d+=4-d%4:d++,x++;i=x>=y,c.push(e.sCount[o]),e.sCount[o]=d-f,a.push(e.tShift[o]),e.tShift[o]=x-e.bMarks[o]}for(p=e.parentType,e.parentType="blockquote",_=e.push("blockquote_open","blockquote",1),_.markup=">",_.map=h=[r,0],e.md.block.tokenize(e,r,o),_=e.push("blockquote_close","blockquote",-1),_.markup=">",e.parentType=p,h[1]=e.line,k=0;kn;)if(e.isEmpty(n)){if(i++,i>=2&&"list"===e.parentType)break;n++}else{if(i=0,!(e.sCount[n]-e.blkIndent>=4))break;n++,s=n}return e.line=s,o=e.push("code_block","code",0),o.content=e.getLines(r,s,4+e.blkIndent,!0),o.map=[r,e.line],!0}},{}],20:[function(e,r,t){"use strict";r.exports=function(e,r,t,n){var s,o,i,a,c,l,u,p=!1,h=e.bMarks[r]+e.tShift[r],f=e.eMarks[r];if(h+3>f)return!1;if(s=e.src.charCodeAt(h),126!==s&&96!==s)return!1;if(c=h,h=e.skipChars(h,s),o=h-c,3>o)return!1;if(u=e.src.slice(c,h),i=e.src.slice(h,f),i.indexOf("`")>=0)return!1;if(n)return!0;for(a=r;(a++,!(a>=t))&&(h=c=e.bMarks[a]+e.tShift[a],f=e.eMarks[a],!(f>h&&e.sCount[a]=4||(h=e.skipChars(h,s),o>h-c||(h=e.skipSpaces(h),f>h)))){p=!0;break}return o=e.sCount[r],e.line=a+(p?1:0),l=e.push("fence","code",0),l.info=i,l.content=e.getLines(r+1,a,o,!0),l.markup=u,l.map=[r,e.line],!0}},{}],21:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace;r.exports=function(e,r,t,s){var o,i,a,c,l=e.bMarks[r]+e.tShift[r],u=e.eMarks[r];if(o=e.src.charCodeAt(l),35!==o||l>=u)return!1;for(i=1,o=e.src.charCodeAt(++l);35===o&&u>l&&6>=i;)i++,o=e.src.charCodeAt(++l);return i>6||u>l&&32!==o?!1:s?!0:(u=e.skipSpacesBack(u,l),a=e.skipCharsBack(u,35,l),a>l&&n(e.src.charCodeAt(a-1))&&(u=a),e.line=r+1,c=e.push("heading_open","h"+String(i),1),c.markup="########".slice(0,i),c.map=[r,e.line],c=e.push("inline","",0),c.content=e.src.slice(l,u).trim(),c.map=[r,e.line],c.children=[],c=e.push("heading_close","h"+String(i),-1),c.markup="########".slice(0,i),!0)}},{"../common/utils":4}],22:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace;r.exports=function(e,r,t,s){var o,i,a,c,l=e.bMarks[r]+e.tShift[r],u=e.eMarks[r];if(o=e.src.charCodeAt(l++),42!==o&&45!==o&&95!==o)return!1;for(i=1;u>l;){if(a=e.src.charCodeAt(l++),a!==o&&!n(a))return!1;a===o&&i++}return 3>i?!1:s?!0:(e.line=r+1,c=e.push("hr","hr",0),c.map=[r,e.line],c.markup=Array(i+1).join(String.fromCharCode(o)),!0)}},{"../common/utils":4}],23:[function(e,r,t){"use strict";var n=e("../common/html_blocks"),s=e("../common/html_re").HTML_OPEN_CLOSE_TAG_RE,o=[[/^<(script|pre|style)(?=(\s|>|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(s.source+"\\s*$"),/^$/,!1]];r.exports=function(e,r,t,n){var s,i,a,c,l=e.bMarks[r]+e.tShift[r],u=e.eMarks[r];if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(l))return!1;for(c=e.src.slice(l,u),s=0;si&&!(e.sCount[i]h&&!e.isEmpty(h);h++)if(!(e.sCount[h]-e.blkIndent>3)){if(e.sCount[h]>=e.blkIndent&&(c=e.bMarks[h]+e.tShift[h],l=e.eMarks[h],l>c&&(p=e.src.charCodeAt(c),(45===p||61===p)&&(c=e.skipChars(c,p),c=e.skipSpaces(c),c>=l)))){u=61===p?1:2;break}if(!(e.sCount[h]<0)){for(s=!1,o=0,i=f.length;i>o;o++)if(f[o](e,h,t,!0)){s=!0;break}if(s)break}}return u?(n=e.getLines(r,h,e.blkIndent,!1).trim(),e.line=h+1,a=e.push("heading_open","h"+String(u),1),a.markup=String.fromCharCode(p),a.map=[r,e.line],a=e.push("inline","",0),a.content=n,a.map=[r,e.line-1],a.children=[],a=e.push("heading_close","h"+String(u),-1),a.markup=String.fromCharCode(p),!0):!1}},{}],25:[function(e,r,t){"use strict";function n(e,r){var t,n,s,o;return n=e.bMarks[r]+e.tShift[r],s=e.eMarks[r],t=e.src.charCodeAt(n++),42!==t&&45!==t&&43!==t?-1:s>n&&(o=e.src.charCodeAt(n),!i(o))?-1:n}function s(e,r){var t,n=e.bMarks[r]+e.tShift[r],s=n,o=e.eMarks[r];if(s+1>=o)return-1;if(t=e.src.charCodeAt(s++),48>t||t>57)return-1;for(;;){if(s>=o)return-1;t=e.src.charCodeAt(s++);{if(!(t>=48&&57>=t)){if(41===t||46===t)break;return-1}if(s-n>=10)return-1}}return o>s&&(t=e.src.charCodeAt(s),!i(t))?-1:s}function o(e,r){var t,n,s=e.level+2;for(t=r+2,n=e.tokens.length-2;n>t;t++)e.tokens[t].level===s&&"paragraph_open"===e.tokens[t].type&&(e.tokens[t+2].hidden=!0,e.tokens[t].hidden=!0,t+=2)}var i=e("../common/utils").isSpace;r.exports=function(e,r,t,a){var c,l,u,p,h,f,d,m,g,_,k,b,v,x,y,C,A,w,q,D,E,S,F,L,z,T,R,M,I=!0;if((k=s(e,r))>=0)w=!0;else{if(!((k=n(e,r))>=0))return!1;w=!1}if(A=e.src.charCodeAt(k-1),a)return!0;for(D=e.tokens.length,w?(_=e.bMarks[r]+e.tShift[r],C=Number(e.src.substr(_,k-_-1)),z=e.push("ordered_list_open","ol",1),1!==C&&(z.attrs=[["start",C]])):z=e.push("bullet_list_open","ul",1),z.map=S=[r,0],z.markup=String.fromCharCode(A),c=r,E=!1,L=e.md.block.ruler.getRules("list");t>c;){for(v=k,x=e.eMarks[c],l=u=e.sCount[c]+k-(e.bMarks[r]+e.tShift[r]);x>v&&(b=e.src.charCodeAt(v),i(b));)9===b?u+=4-u%4:u++,v++;if(q=v,y=q>=x?1:u-l,y>4&&(y=1),p=l+y,z=e.push("list_item_open","li",1),z.markup=String.fromCharCode(A),z.map=F=[r,0],f=e.blkIndent,m=e.tight,h=e.tShift[r],d=e.sCount[r],g=e.parentType,e.blkIndent=p,e.tight=!0,e.parentType="list",e.tShift[r]=q-e.bMarks[r],e.sCount[r]=u,q>=x&&e.isEmpty(r+1)?e.line=Math.min(e.line+2,t):e.md.block.tokenize(e,r,t,!0),(!e.tight||E)&&(I=!1),E=e.line-r>1&&e.isEmpty(e.line-1),e.blkIndent=f,e.tShift[r]=h,e.sCount[r]=d,e.tight=m,e.parentType=g,z=e.push("list_item_close","li",-1),z.markup=String.fromCharCode(A),c=r=e.line,F[1]=c,q=e.bMarks[r],c>=t)break;if(e.isEmpty(c))break;if(e.sCount[c]T;T++)if(L[T](e,c,t,!0)){M=!0;break}if(M)break;if(w){if(k=s(e,c),0>k)break}else if(k=n(e,c),0>k)break;if(A!==e.src.charCodeAt(k-1))break}return z=w?e.push("ordered_list_close","ol",-1):e.push("bullet_list_close","ul",-1),z.markup=String.fromCharCode(A),S[1]=c,e.line=c,I&&o(e,D),!0}},{"../common/utils":4}],26:[function(e,r,t){"use strict";r.exports=function(e,r){for(var t,n,s,o,i,a=r+1,c=e.md.block.ruler.getRules("paragraph"),l=e.lineMax;l>a&&!e.isEmpty(a);a++)if(!(e.sCount[a]-e.blkIndent>3||e.sCount[a]<0)){for(n=!1,s=0,o=c.length;o>s;s++)if(c[s](e,a,l,!0)){n=!0;break}if(n)break}return t=e.getLines(r,a,e.blkIndent,!1).trim(),e.line=a,i=e.push("paragraph_open","p",1),i.map=[r,e.line],i=e.push("inline","",0),i.content=t,i.map=[r,e.line],i.children=[],i=e.push("paragraph_close","p",-1),!0}},{}],27:[function(e,r,t){"use strict";var n=e("../helpers/parse_link_destination"),s=e("../helpers/parse_link_title"),o=e("../common/utils").normalizeReference,i=e("../common/utils").isSpace;r.exports=function(e,r,t,a){var c,l,u,p,h,f,d,m,g,_,k,b,v,x,y,C=0,A=e.bMarks[r]+e.tShift[r],w=e.eMarks[r],q=r+1;if(91!==e.src.charCodeAt(A))return!1;for(;++Aq&&!e.isEmpty(q);q++)if(!(e.sCount[q]-e.blkIndent>3||e.sCount[q]<0)){for(v=!1,f=0,d=x.length;d>f;f++)if(x[f](e,q,p,!0)){v=!0;break}if(v)break}for(b=e.getLines(r,q,e.blkIndent,!1).trim(),w=b.length,A=1;w>A;A++){if(c=b.charCodeAt(A),91===c)return!1;if(93===c){g=A;break}10===c?C++:92===c&&(A++,w>A&&10===b.charCodeAt(A)&&C++)}if(0>g||58!==b.charCodeAt(g+1))return!1;for(A=g+2;w>A;A++)if(c=b.charCodeAt(A),10===c)C++;else if(!i(c))break;if(_=n(b,A,w),!_.ok)return!1;if(h=e.md.normalizeLink(_.str),!e.md.validateLink(h))return!1;for(A=_.pos,C+=_.lines,l=A,u=C,k=A;w>A;A++)if(c=b.charCodeAt(A),10===c)C++;else if(!i(c))break;for(_=s(b,A,w),w>A&&k!==A&&_.ok?(y=_.str,A=_.pos,C+=_.lines):(y="",A=l,C=u);w>A&&(c=b.charCodeAt(A),i(c));)A++;if(w>A&&10!==b.charCodeAt(A)&&y)for(y="",A=l,C=u;w>A&&(c=b.charCodeAt(A),i(c));)A++;return w>A&&10!==b.charCodeAt(A)?!1:(m=o(b.slice(1,g)))?a?!0:("undefined"==typeof e.env.references&&(e.env.references={}),"undefined"==typeof e.env.references[m]&&(e.env.references[m]={title:y,href:h}),e.line=r+C+1,!0):!1}},{"../common/utils":4,"../helpers/parse_link_destination":6,"../helpers/parse_link_title":8}],28:[function(e,r,t){"use strict";function n(e,r,t,n){var s,i,a,c,l,u,p,h;for(this.src=e,this.md=r,this.env=t,this.tokens=n,this.bMarks=[],this.eMarks=[],this.tShift=[],this.sCount=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType="root",this.ddIndent=-1,this.level=0,this.result="",i=this.src,h=!1,a=c=u=p=0,l=i.length;l>c;c++){if(s=i.charCodeAt(c),!h){if(o(s)){u++,9===s?p+=4-p%4:p++;continue}h=!0}(10===s||c===l-1)&&(10!==s&&c++,this.bMarks.push(a),this.eMarks.push(c),this.tShift.push(u),this.sCount.push(p),h=!1,u=0,p=0,a=c+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.sCount.push(0),this.lineMax=this.bMarks.length-1}var s=e("../token"),o=e("../common/utils").isSpace;n.prototype.push=function(e,r,t){var n=new s(e,r,t);return n.block=!0,0>t&&this.level--,n.level=this.level,t>0&&this.level++,this.tokens.push(n),n},n.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},n.prototype.skipEmptyLines=function(e){for(var r=this.lineMax;r>e&&!(this.bMarks[e]+this.tShift[e]e&&(r=this.src.charCodeAt(e),o(r));e++);return e},n.prototype.skipSpacesBack=function(e,r){if(r>=e)return e;for(;e>r;)if(!o(this.src.charCodeAt(--e)))return e+1;return e},n.prototype.skipChars=function(e,r){for(var t=this.src.length;t>e&&this.src.charCodeAt(e)===r;e++);return e},n.prototype.skipCharsBack=function(e,r,t){if(t>=e)return e;for(;e>t;)if(r!==this.src.charCodeAt(--e))return e+1;return e},n.prototype.getLines=function(e,r,t,n){var s,i,a,c,l,u,p,h=e;if(e>=r)return"";for(u=new Array(r-e),s=0;r>h;h++,s++){for(i=0,p=c=this.bMarks[h],l=r>h+1||n?this.eMarks[h]+1:this.eMarks[h];l>c&&t>i;){if(a=this.src.charCodeAt(c),o(a))9===a?i+=4-i%4:i++;else{if(!(c-pn;)96===r&&o%2===0?(a=!a,c=n):124!==r||o%2!==0||a?92===r?o++:o=0:(t.push(e.substring(i,n)),i=n+1),n++,n===s&&a&&(a=!1,n=c+1),r=e.charCodeAt(n);return t.push(e.substring(i)),t}r.exports=function(e,r,t,o){var i,a,c,l,u,p,h,f,d,m,g,_;if(r+2>t)return!1;if(u=r+1,e.sCount[u]=e.eMarks[u])return!1;if(i=e.src.charCodeAt(c),124!==i&&45!==i&&58!==i)return!1;if(a=n(e,r+1),!/^[-:| ]+$/.test(a))return!1;for(p=a.split("|"),d=[],l=0;ld.length)return!1;if(o)return!0;for(f=e.push("table_open","table",1),f.map=g=[r,0],f=e.push("thead_open","thead",1),f.map=[r,r+1],f=e.push("tr_open","tr",1),f.map=[r,r+1],l=0;lu&&!(e.sCount[u]l;l++)f=e.push("td_open","td",1),d[l]&&(f.attrs=[["style","text-align:"+d[l]]]),f=e.push("inline","",0),f.content=p[l]?p[l].trim():"",f.children=[],f=e.push("td_close","td",-1);f=e.push("tr_close","tr",-1)}return f=e.push("tbody_close","tbody",-1),f=e.push("table_close","table",-1),g[1]=_[1]=u,e.line=u,!0}},{}],30:[function(e,r,t){"use strict";r.exports=function(e){var r;e.inlineMode?(r=new e.Token("inline","",0),r.content=e.src,r.map=[0,1],r.children=[],e.tokens.push(r)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}},{}],31:[function(e,r,t){"use strict";r.exports=function(e){var r,t,n,s=e.tokens;for(t=0,n=s.length;n>t;t++)r=s[t],"inline"===r.type&&e.md.inline.parse(r.content,e.md,e.env,r.children)}},{}],32:[function(e,r,t){"use strict";function n(e){return/^\s]/i.test(e)}function s(e){return/^<\/a\s*>/i.test(e)}var o=e("../common/utils").arrayReplaceAt;r.exports=function(e){var r,t,i,a,c,l,u,p,h,f,d,m,g,_,k,b,v,x=e.tokens;if(e.md.options.linkify)for(t=0,i=x.length;i>t;t++)if("inline"===x[t].type&&e.md.linkify.pretest(x[t].content))for(a=x[t].children,g=0,r=a.length-1;r>=0;r--)if(l=a[r],"link_close"!==l.type){if("html_inline"===l.type&&(n(l.content)&&g>0&&g--,s(l.content)&&g++),!(g>0)&&"text"===l.type&&e.md.linkify.test(l.content)){for(h=l.content,v=e.md.linkify.match(h),u=[],m=l.level,d=0,p=0;pd&&(c=new e.Token("text","",0),c.content=h.slice(d,f),c.level=m,u.push(c)),c=new e.Token("link_open","a",1),c.attrs=[["href",k]],c.level=m++,c.markup="linkify",c.info="auto",u.push(c),c=new e.Token("text","",0),c.content=b,c.level=m,u.push(c),c=new e.Token("link_close","a",-1),c.level=--m,c.markup="linkify",c.info="auto",u.push(c),d=v[p].lastIndex);d=0;r--)t=e[r],"text"===t.type&&(t.content=t.content.replace(c,n))}function o(e){var r,t;for(r=e.length-1;r>=0;r--)t=e[r],"text"===t.type&&i.test(t.content)&&(t.content=t.content.replace(/\+-/g,"\xb1").replace(/\.{2,}/g,"\u2026").replace(/([?!])\u2026/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1\u2014$2").replace(/(^|\s)--(\s|$)/gm,"$1\u2013$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1\u2013$2"))}var i=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,a=/\((c|tm|r|p)\)/i,c=/\((c|tm|r|p)\)/gi,l={c:"\xa9",r:"\xae",p:"\xa7",tm:"\u2122"};r.exports=function(e){var r;if(e.md.options.typographer)for(r=e.tokens.length-1;r>=0;r--)"inline"===e.tokens[r].type&&(a.test(e.tokens[r].content)&&s(e.tokens[r].children),i.test(e.tokens[r].content)&&o(e.tokens[r].children))}},{}],35:[function(e,r,t){"use strict";function n(e,r,t){return e.substr(0,r)+t+e.substr(r+1)}function s(e,r){var t,s,c,p,h,f,d,m,g,_,k,b,v,x,y,C,A,w,q,D,E;for(q=[],t=0;t=0&&!(q[A].level<=d);A--);if(q.length=A+1,"text"===s.type){c=s.content,h=0,f=c.length;e:for(;f>h&&(l.lastIndex=h,p=l.exec(c));){if(y=C=!0,h=p.index+1,w="'"===p[0],g=32,p.index-1>=0)g=c.charCodeAt(p.index-1);else for(A=t-1;A>=0;A--)if("text"===e[A].type){g=e[A].content.charCodeAt(e[A].content.length-1);break}if(_=32,f>h)_=c.charCodeAt(h);else for(A=t+1;A=48&&57>=g&&(C=y=!1),y&&C&&(y=!1,C=b),y||C){if(C)for(A=q.length-1;A>=0&&(m=q[A],!(q[A].level=0;r--)"inline"===e.tokens[r].type&&c.test(e.tokens[r].content)&&s(e.tokens[r].children,e)}},{"../common/utils":4}],36:[function(e,r,t){"use strict";function n(e,r,t){this.src=e,this.env=t,this.tokens=[],this.inlineMode=!1,this.md=r}var s=e("../token");n.prototype.Token=s,r.exports=n},{"../token":51}],37:[function(e,r,t){"use strict";var n=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,s=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;r.exports=function(e,r){var t,o,i,a,c,l,u=e.pos;return 60!==e.src.charCodeAt(u)?!1:(t=e.src.slice(u),t.indexOf(">")<0?!1:s.test(t)?(o=t.match(s),a=o[0].slice(1,-1),c=e.md.normalizeLink(a),e.md.validateLink(c)?(r||(l=e.push("link_open","a",1),l.attrs=[["href",c]],l.markup="autolink",l.info="auto",l=e.push("text","",0),l.content=e.md.normalizeLinkText(a),l=e.push("link_close","a",-1),l.markup="autolink",l.info="auto"),e.pos+=o[0].length,!0):!1):n.test(t)?(i=t.match(n),a=i[0].slice(1,-1),c=e.md.normalizeLink("mailto:"+a),e.md.validateLink(c)?(r||(l=e.push("link_open","a",1),l.attrs=[["href",c]],l.markup="autolink",l.info="auto",l=e.push("text","",0),l.content=e.md.normalizeLinkText(a),l=e.push("link_close","a",-1),l.markup="autolink",l.info="auto"),e.pos+=i[0].length,!0):!1):!1)}},{}],38:[function(e,r,t){"use strict";r.exports=function(e,r){var t,n,s,o,i,a,c=e.pos,l=e.src.charCodeAt(c);if(96!==l)return!1;for(t=c,c++,n=e.posMax;n>c&&96===e.src.charCodeAt(c);)c++;for(s=e.src.slice(t,c),o=i=c;-1!==(o=e.src.indexOf("`",i));){for(i=o+1;n>i&&96===e.src.charCodeAt(i);)i++;if(i-o===s.length)return r||(a=e.push("code_inline","code",0),a.markup=s,a.content=e.src.slice(c,o).replace(/[ \n]+/g," ").trim()),e.pos=i,!0}return r||(e.pending+=s),e.pos+=s.length,!0}},{}],39:[function(e,r,t){"use strict";r.exports=function(e){var r,t,n,s,o=e.delimiters,i=e.delimiters.length;for(r=0;i>r;r++)if(n=o[r],n.close)for(t=r-n.jump-1;t>=0;){if(s=o[t],s.open&&s.marker===n.marker&&s.end<0&&s.level===n.level){n.jump=r-t,n.open=!1,s.end=r,s.jump=0;break}t-=s.jump+1}}},{}],40:[function(e,r,t){"use strict";r.exports.tokenize=function(e,r){var t,n,s,o=e.pos,i=e.src.charCodeAt(o);if(r)return!1;if(95!==i&&42!==i)return!1;for(n=e.scanDelims(e.pos,42===i),t=0;tr;r++)t=a[r],(95===t.marker||42===t.marker)&&-1!==t.end&&(n=a[t.end],i=c>r+1&&a[r+1].end===t.end-1&&a[r+1].token===t.token+1&&a[t.end-1].token===n.token-1&&a[r+1].marker===t.marker,o=String.fromCharCode(t.marker),s=e.tokens[t.token],s.type=i?"strong_open":"em_open",s.tag=i?"strong":"em",s.nesting=1,s.markup=i?o+o:o,s.content="",s=e.tokens[n.token],s.type=i?"strong_close":"em_close",s.tag=i?"strong":"em",s.nesting=-1,s.markup=i?o+o:o,s.content="",i&&(e.tokens[a[r+1].token].content="",e.tokens[a[t.end-1].token].content="",r++))}},{}],41:[function(e,r,t){"use strict";var n=e("../common/entities"),s=e("../common/utils").has,o=e("../common/utils").isValidEntityCode,i=e("../common/utils").fromCodePoint,a=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;r.exports=function(e,r){var t,l,u,p=e.pos,h=e.posMax;if(38!==e.src.charCodeAt(p))return!1;if(h>p+1)if(t=e.src.charCodeAt(p+1),35===t){if(u=e.src.slice(p).match(a))return r||(l="x"===u[1][0].toLowerCase()?parseInt(u[1].slice(1),16):parseInt(u[1],10),e.pending+=i(o(l)?l:65533)),e.pos+=u[0].length,!0}else if(u=e.src.slice(p).match(c),u&&s(n,u[1]))return r||(e.pending+=n[u[1]]),e.pos+=u[0].length,!0;return r||(e.pending+="&"),e.pos++,!0}},{"../common/entities":1,"../common/utils":4}],42:[function(e,r,t){"use strict";for(var n=e("../common/utils").isSpace,s=[],o=0;256>o;o++)s.push(0);"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(e){s[e.charCodeAt(0)]=1}),r.exports=function(e,r){var t,o=e.pos,i=e.posMax;if(92!==e.src.charCodeAt(o))return!1;if(o++,i>o){if(t=e.src.charCodeAt(o),256>t&&0!==s[t])return r||(e.pending+=e.src[o]),e.pos+=2,!0;if(10===t){for(r||e.push("hardbreak","br",0),o++;i>o&&(t=e.src.charCodeAt(o),n(t));)o++;return e.pos=o,!0}}return r||(e.pending+="\\"),e.pos++,!0}},{"../common/utils":4}],43:[function(e,r,t){"use strict";function n(e){var r=32|e;return r>=97&&122>=r}var s=e("../common/html_re").HTML_TAG_RE;r.exports=function(e,r){var t,o,i,a,c=e.pos;return e.md.options.html?(i=e.posMax,60!==e.src.charCodeAt(c)||c+2>=i?!1:(t=e.src.charCodeAt(c+1),(33===t||63===t||47===t||n(t))&&(o=e.src.slice(c).match(s))?(r||(a=e.push("html_inline","",0),a.content=e.src.slice(c,c+o[0].length)),e.pos+=o[0].length,!0):!1)):!1}},{"../common/html_re":3}],44:[function(e,r,t){"use strict";var n=e("../helpers/parse_link_label"),s=e("../helpers/parse_link_destination"),o=e("../helpers/parse_link_title"),i=e("../common/utils").normalizeReference,a=e("../common/utils").isSpace;r.exports=function(e,r){var t,c,l,u,p,h,f,d,m,g,_,k,b,v="",x=e.pos,y=e.posMax;if(33!==e.src.charCodeAt(e.pos))return!1;if(91!==e.src.charCodeAt(e.pos+1))return!1;if(h=e.pos+2,p=n(e,e.pos+1,!1),0>p)return!1;if(f=p+1,y>f&&40===e.src.charCodeAt(f)){for(f++;y>f&&(c=e.src.charCodeAt(f),a(c)||10===c);f++);if(f>=y)return!1;for(b=f,m=s(e.src,f,e.posMax),m.ok&&(v=e.md.normalizeLink(m.str),e.md.validateLink(v)?f=m.pos:v=""),b=f;y>f&&(c=e.src.charCodeAt(f),a(c)||10===c);f++);if(m=o(e.src,f,e.posMax),y>f&&b!==f&&m.ok)for(g=m.str,f=m.pos;y>f&&(c=e.src.charCodeAt(f),a(c)||10===c);f++);else g="";if(f>=y||41!==e.src.charCodeAt(f))return e.pos=x,!1;f++}else{if("undefined"==typeof e.env.references)return!1;if(y>f&&91===e.src.charCodeAt(f)?(b=f+1,f=n(e,f),f>=0?u=e.src.slice(b,f++):f=p+1):f=p+1,u||(u=e.src.slice(h,p)),d=e.env.references[i(u)],!d)return e.pos=x,!1;v=d.href,g=d.title}return r||(l=e.src.slice(h,p),e.md.inline.parse(l,e.md,e.env,k=[]),_=e.push("image","img",0),_.attrs=t=[["src",v],["alt",""]],_.children=k,_.content=l,g&&t.push(["title",g])),e.pos=f,e.posMax=y,!0}},{"../common/utils":4,"../helpers/parse_link_destination":6,"../helpers/parse_link_label":7,"../helpers/parse_link_title":8}],45:[function(e,r,t){"use strict";var n=e("../helpers/parse_link_label"),s=e("../helpers/parse_link_destination"),o=e("../helpers/parse_link_title"),i=e("../common/utils").normalizeReference,a=e("../common/utils").isSpace;r.exports=function(e,r){var t,c,l,u,p,h,f,d,m,g,_="",k=e.pos,b=e.posMax,v=e.pos;if(91!==e.src.charCodeAt(e.pos))return!1;if(p=e.pos+1,u=n(e,e.pos,!0),0>u)return!1;if(h=u+1,b>h&&40===e.src.charCodeAt(h)){for(h++;b>h&&(c=e.src.charCodeAt(h),a(c)||10===c);h++);if(h>=b)return!1;for(v=h,f=s(e.src,h,e.posMax),f.ok&&(_=e.md.normalizeLink(f.str),e.md.validateLink(_)?h=f.pos:_=""),v=h;b>h&&(c=e.src.charCodeAt(h),a(c)||10===c);h++);if(f=o(e.src,h,e.posMax),b>h&&v!==h&&f.ok)for(m=f.str,h=f.pos;b>h&&(c=e.src.charCodeAt(h),a(c)||10===c);h++);else m="";if(h>=b||41!==e.src.charCodeAt(h))return e.pos=k,!1;h++}else{if("undefined"==typeof e.env.references)return!1;if(b>h&&91===e.src.charCodeAt(h)?(v=h+1,h=n(e,h),h>=0?l=e.src.slice(v,h++):h=u+1):h=u+1,l||(l=e.src.slice(p,u)),d=e.env.references[i(l)],!d)return e.pos=k,!1;_=d.href,m=d.title}return r||(e.pos=p,e.posMax=u,g=e.push("link_open","a",1),g.attrs=t=[["href",_]],m&&t.push(["title",m]),e.md.inline.tokenize(e),g=e.push("link_close","a",-1)),e.pos=h,e.posMax=b,!0}},{"../common/utils":4,"../helpers/parse_link_destination":6,"../helpers/parse_link_label":7,"../helpers/parse_link_title":8}],46:[function(e,r,t){"use strict";r.exports=function(e,r){var t,n,s=e.pos;if(10!==e.src.charCodeAt(s))return!1;for(t=e.pending.length-1,n=e.posMax,r||(t>=0&&32===e.pending.charCodeAt(t)?t>=1&&32===e.pending.charCodeAt(t-1)?(e.pending=e.pending.replace(/ +$/,""),e.push("hardbreak","br",0)):(e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0)):e.push("softbreak","br",0)),s++;n>s&&32===e.src.charCodeAt(s);)s++;return e.pos=s,!0}},{}],47:[function(e,r,t){"use strict";function n(e,r,t,n){this.src=e,this.env=t,this.md=r,this.tokens=n,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache={},this.delimiters=[]}var s=e("../token"),o=e("../common/utils").isWhiteSpace,i=e("../common/utils").isPunctChar,a=e("../common/utils").isMdAsciiPunct;n.prototype.pushPending=function(){var e=new s("text","",0);return e.content=this.pending,e.level=this.pendingLevel,this.tokens.push(e),this.pending="",e},n.prototype.push=function(e,r,t){this.pending&&this.pushPending();var n=new s(e,r,t);return 0>t&&this.level--,n.level=this.level,t>0&&this.level++,this.pendingLevel=this.level,this.tokens.push(n),n},n.prototype.scanDelims=function(e,r){var t,n,s,c,l,u,p,h,f,d=e,m=!0,g=!0,_=this.posMax,k=this.src.charCodeAt(e);for(t=e>0?this.src.charCodeAt(e-1):32;_>d&&this.src.charCodeAt(d)===k;)d++;return s=d-e,n=_>d?this.src.charCodeAt(d):32,p=a(t)||i(String.fromCharCode(t)),f=a(n)||i(String.fromCharCode(n)),u=o(t),h=o(n),h?m=!1:f&&(u||p||(m=!1)),u?g=!1:p&&(h||f||(g=!1)),r?(c=m,l=g):(c=m&&(!g||p),l=g&&(!m||f)),{can_open:c,can_close:l,length:s}},n.prototype.Token=s,r.exports=n},{"../common/utils":4,"../token":51}],48:[function(e,r,t){"use strict";r.exports.tokenize=function(e,r){var t,n,s,o,i,a=e.pos,c=e.src.charCodeAt(a);if(r)return!1;if(126!==c)return!1;if(n=e.scanDelims(e.pos,!0),o=n.length,i=String.fromCharCode(c),2>o)return!1;for(o%2&&(s=e.push("text","",0),s.content=i,o--),t=0;o>t;t+=2)s=e.push("text","",0),s.content=i+i,e.delimiters.push({marker:c,jump:t,token:e.tokens.length-1,level:e.level,end:-1,open:n.can_open,close:n.can_close});return e.pos+=n.length,!0},r.exports.postProcess=function(e){var r,t,n,s,o,i=[],a=e.delimiters,c=e.delimiters.length;for(r=0;c>r;r++)n=a[r],126===n.marker&&-1!==n.end&&(s=a[n.end],o=e.tokens[n.token],o.type="s_open",o.tag="s",o.nesting=1,o.markup="~~",o.content="",o=e.tokens[s.token],o.type="s_close",o.tag="s",o.nesting=-1,o.markup="~~",o.content="","text"===e.tokens[s.token-1].type&&"~"===e.tokens[s.token-1].content&&i.push(s.token-1));for(;i.length;){for(r=i.pop(),t=r+1;tr;r++)n+=s[r].nesting,s[r].level=n,"text"===s[r].type&&o>r+1&&"text"===s[r+1].type?s[r+1].content=s[r].content+s[r+1].content:(r!==t&&(s[t]=s[r]),t++);r!==t&&(s.length=t)}},{}],51:[function(e,r,t){"use strict";function n(e,r,t){this.type=e,this.tag=r,this.attrs=null,this.map=null,this.nesting=t,this.level=0,this.children=null,this.content="",this.markup="",this.info="",this.meta=null,this.block=!1,this.hidden=!1}n.prototype.attrIndex=function(e){var r,t,n;if(!this.attrs)return-1;for(r=this.attrs,t=0,n=r.length;n>t;t++)if(r[t][0]===e)return t;return-1},n.prototype.attrPush=function(e){this.attrs?this.attrs.push(e):this.attrs=[e]},n.prototype.attrSet=function(e,r){var t=this.attrIndex(e),n=[e,r];0>t?this.attrPush(n):this.attrs[t]=n},n.prototype.attrJoin=function(e,r){var t=this.attrIndex(e);0>t?this.attrPush([e,r]):this.attrs[t][1]=this.attrs[t][1]+" "+r},r.exports=n},{}],52:[function(r,t,n){(function(r){!function(s){function o(e){throw new RangeError(R[e])}function i(e,r){for(var t=e.length,n=[];t--;)n[t]=r(e[t]);return n}function a(e,r){var t=e.split("@"),n="";t.length>1&&(n=t[0]+"@",e=t[1]),e=e.replace(T,".");var s=e.split("."),o=i(s,r).join(".");return n+o}function c(e){for(var r,t,n=[],s=0,o=e.length;o>s;)r=e.charCodeAt(s++),r>=55296&&56319>=r&&o>s?(t=e.charCodeAt(s++),56320==(64512&t)?n.push(((1023&r)<<10)+(1023&t)+65536):(n.push(r),s--)):n.push(r);return n}function l(e){return i(e,function(e){var r="";return e>65535&&(e-=65536,r+=B(e>>>10&1023|55296),e=56320|1023&e),r+=B(e)}).join("")}function u(e){return 10>e-48?e-22:26>e-65?e-65:26>e-97?e-97:C}function p(e,r){return e+22+75*(26>e)-((0!=r)<<5)}function h(e,r,t){var n=0;for(e=t?I(e/D):e>>1,e+=I(e/r);e>M*w>>1;n+=C)e=I(e/M);return I(n+(M+1)*e/(e+q))}function f(e){var r,t,n,s,i,a,c,p,f,d,m=[],g=e.length,_=0,k=S,b=E;for(t=e.lastIndexOf(F),0>t&&(t=0),n=0;t>n;++n)e.charCodeAt(n)>=128&&o("not-basic"),m.push(e.charCodeAt(n));for(s=t>0?t+1:0;g>s;){for(i=_,a=1,c=C;s>=g&&o("invalid-input"),p=u(e.charCodeAt(s++)),(p>=C||p>I((y-_)/a))&&o("overflow"),_+=p*a,f=b>=c?A:c>=b+w?w:c-b,!(f>p);c+=C)d=C-f,a>I(y/d)&&o("overflow"),a*=d;r=m.length+1,b=h(_-i,r,0==i),I(_/r)>y-k&&o("overflow"),k+=I(_/r),_%=r,m.splice(_++,0,k)}return l(m)}function d(e){var r,t,n,s,i,a,l,u,f,d,m,g,_,k,b,v=[];for(e=c(e),g=e.length,r=S,t=0,i=E,a=0;g>a;++a)m=e[a],128>m&&v.push(B(m));for(n=s=v.length,s&&v.push(F);g>n;){for(l=y,a=0;g>a;++a)m=e[a],m>=r&&l>m&&(l=m);for(_=n+1,l-r>I((y-t)/_)&&o("overflow"),t+=(l-r)*_,r=l,a=0;g>a;++a)if(m=e[a],r>m&&++t>y&&o("overflow"),m==r){for(u=t,f=C;d=i>=f?A:f>=i+w?w:f-i,!(d>u);f+=C)b=u-d,k=C-d,v.push(B(p(d+b%k,0))),u=I(b/k);v.push(B(p(u,0))),i=h(t,_,n==s),t=0,++n}++t,++r}return v.join("")}function m(e){return a(e,function(e){return L.test(e)?f(e.slice(4).toLowerCase()):e})}function g(e){return a(e,function(e){return z.test(e)?"xn--"+d(e):e})}var _="object"==typeof n&&n&&!n.nodeType&&n,k="object"==typeof t&&t&&!t.nodeType&&t,b="object"==typeof r&&r;(b.global===b||b.window===b||b.self===b)&&(s=b);var v,x,y=2147483647,C=36,A=1,w=26,q=38,D=700,E=72,S=128,F="-",L=/^xn--/,z=/[^\x20-\x7E]/,T=/[\x2E\u3002\uFF0E\uFF61]/g,R={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},M=C-A,I=Math.floor,B=String.fromCharCode;if(v={version:"1.3.2",ucs2:{decode:c,encode:l},decode:f,encode:d,toASCII:g,toUnicode:m},"function"==typeof e&&"object"==typeof e.amd&&e.amd)e("punycode",function(){return v});else if(_&&k)if(t.exports==_)k.exports=v;else for(x in v)v.hasOwnProperty(x)&&(_[x]=v[x]);else s.punycode=v}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],53:[function(e,r,t){r.exports={Aacute:"\xc1",aacute:"\xe1",Abreve:"\u0102",abreve:"\u0103",ac:"\u223e",acd:"\u223f",acE:"\u223e\u0333",Acirc:"\xc2",acirc:"\xe2",acute:"\xb4",Acy:"\u0410",acy:"\u0430",AElig:"\xc6",aelig:"\xe6",af:"\u2061",Afr:"\ud835\udd04",afr:"\ud835\udd1e",Agrave:"\xc0",agrave:"\xe0",alefsym:"\u2135",aleph:"\u2135",Alpha:"\u0391",alpha:"\u03b1",Amacr:"\u0100",amacr:"\u0101",amalg:"\u2a3f",amp:"&",AMP:"&",andand:"\u2a55",And:"\u2a53",and:"\u2227",andd:"\u2a5c",andslope:"\u2a58",andv:"\u2a5a",ang:"\u2220",ange:"\u29a4",angle:"\u2220",angmsdaa:"\u29a8",angmsdab:"\u29a9",angmsdac:"\u29aa",angmsdad:"\u29ab",angmsdae:"\u29ac",angmsdaf:"\u29ad",angmsdag:"\u29ae",angmsdah:"\u29af",angmsd:"\u2221",angrt:"\u221f",angrtvb:"\u22be",angrtvbd:"\u299d",angsph:"\u2222",angst:"\xc5",angzarr:"\u237c",Aogon:"\u0104",aogon:"\u0105",Aopf:"\ud835\udd38",aopf:"\ud835\udd52",apacir:"\u2a6f",ap:"\u2248",apE:"\u2a70",ape:"\u224a",apid:"\u224b",apos:"'",ApplyFunction:"\u2061",approx:"\u2248",approxeq:"\u224a",Aring:"\xc5",aring:"\xe5",Ascr:"\ud835\udc9c",ascr:"\ud835\udcb6",Assign:"\u2254",ast:"*",asymp:"\u2248",asympeq:"\u224d",Atilde:"\xc3",atilde:"\xe3",Auml:"\xc4",auml:"\xe4",awconint:"\u2233",awint:"\u2a11",backcong:"\u224c",backepsilon:"\u03f6",backprime:"\u2035",backsim:"\u223d",backsimeq:"\u22cd",Backslash:"\u2216",Barv:"\u2ae7",barvee:"\u22bd",barwed:"\u2305",Barwed:"\u2306",barwedge:"\u2305",bbrk:"\u23b5",bbrktbrk:"\u23b6",bcong:"\u224c",Bcy:"\u0411",bcy:"\u0431",bdquo:"\u201e",becaus:"\u2235",because:"\u2235",Because:"\u2235",bemptyv:"\u29b0",bepsi:"\u03f6",bernou:"\u212c",Bernoullis:"\u212c",Beta:"\u0392",beta:"\u03b2",beth:"\u2136",between:"\u226c",Bfr:"\ud835\udd05",bfr:"\ud835\udd1f",bigcap:"\u22c2",bigcirc:"\u25ef",bigcup:"\u22c3",bigodot:"\u2a00",bigoplus:"\u2a01",bigotimes:"\u2a02",bigsqcup:"\u2a06",bigstar:"\u2605",bigtriangledown:"\u25bd",bigtriangleup:"\u25b3",biguplus:"\u2a04",bigvee:"\u22c1",bigwedge:"\u22c0",bkarow:"\u290d",blacklozenge:"\u29eb",blacksquare:"\u25aa",blacktriangle:"\u25b4",blacktriangledown:"\u25be",blacktriangleleft:"\u25c2",blacktriangleright:"\u25b8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20e5",bnequiv:"\u2261\u20e5",bNot:"\u2aed",bnot:"\u2310",Bopf:"\ud835\udd39",bopf:"\ud835\udd53",bot:"\u22a5",bottom:"\u22a5",bowtie:"\u22c8",boxbox:"\u29c9",boxdl:"\u2510",boxdL:"\u2555",boxDl:"\u2556",boxDL:"\u2557",boxdr:"\u250c",boxdR:"\u2552",boxDr:"\u2553",boxDR:"\u2554",boxh:"\u2500",boxH:"\u2550",boxhd:"\u252c",boxHd:"\u2564",boxhD:"\u2565",boxHD:"\u2566",boxhu:"\u2534",boxHu:"\u2567",boxhU:"\u2568",boxHU:"\u2569",boxminus:"\u229f",boxplus:"\u229e",boxtimes:"\u22a0",boxul:"\u2518",boxuL:"\u255b",boxUl:"\u255c",boxUL:"\u255d",boxur:"\u2514",boxuR:"\u2558",boxUr:"\u2559",boxUR:"\u255a",boxv:"\u2502",boxV:"\u2551",boxvh:"\u253c",boxvH:"\u256a",boxVh:"\u256b",boxVH:"\u256c",boxvl:"\u2524",boxvL:"\u2561",boxVl:"\u2562",boxVL:"\u2563",boxvr:"\u251c",boxvR:"\u255e",boxVr:"\u255f",boxVR:"\u2560",bprime:"\u2035",breve:"\u02d8",Breve:"\u02d8",brvbar:"\xa6",bscr:"\ud835\udcb7",Bscr:"\u212c",bsemi:"\u204f",bsim:"\u223d",bsime:"\u22cd",bsolb:"\u29c5",bsol:"\\",bsolhsub:"\u27c8",bull:"\u2022",bullet:"\u2022",bump:"\u224e",bumpE:"\u2aae",bumpe:"\u224f",Bumpeq:"\u224e",bumpeq:"\u224f",Cacute:"\u0106",cacute:"\u0107",capand:"\u2a44",capbrcup:"\u2a49",capcap:"\u2a4b",cap:"\u2229",Cap:"\u22d2",capcup:"\u2a47",capdot:"\u2a40",CapitalDifferentialD:"\u2145",caps:"\u2229\ufe00",caret:"\u2041",caron:"\u02c7",Cayleys:"\u212d",ccaps:"\u2a4d",Ccaron:"\u010c",ccaron:"\u010d",Ccedil:"\xc7",ccedil:"\xe7",Ccirc:"\u0108",ccirc:"\u0109",Cconint:"\u2230",ccups:"\u2a4c",ccupssm:"\u2a50",Cdot:"\u010a",cdot:"\u010b",cedil:"\xb8",Cedilla:"\xb8",cemptyv:"\u29b2",cent:"\xa2",centerdot:"\xb7",CenterDot:"\xb7",cfr:"\ud835\udd20",Cfr:"\u212d",CHcy:"\u0427",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",Chi:"\u03a7",chi:"\u03c7",circ:"\u02c6",circeq:"\u2257",circlearrowleft:"\u21ba",circlearrowright:"\u21bb",circledast:"\u229b",circledcirc:"\u229a",circleddash:"\u229d",CircleDot:"\u2299",circledR:"\xae",circledS:"\u24c8",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",cir:"\u25cb",cirE:"\u29c3",cire:"\u2257",cirfnint:"\u2a10",cirmid:"\u2aef",cirscir:"\u29c2",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201d",CloseCurlyQuote:"\u2019",clubs:"\u2663",clubsuit:"\u2663",colon:":",Colon:"\u2237",Colone:"\u2a74",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2a6d",Congruent:"\u2261",conint:"\u222e",Conint:"\u222f",ContourIntegral:"\u222e",copf:"\ud835\udd54",Copf:"\u2102",coprod:"\u2210",Coproduct:"\u2210",copy:"\xa9",COPY:"\xa9",copysr:"\u2117",CounterClockwiseContourIntegral:"\u2233",crarr:"\u21b5",cross:"\u2717",Cross:"\u2a2f",Cscr:"\ud835\udc9e",cscr:"\ud835\udcb8",csub:"\u2acf",csube:"\u2ad1",csup:"\u2ad0",csupe:"\u2ad2",ctdot:"\u22ef",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22de",cuesc:"\u22df",cularr:"\u21b6",cularrp:"\u293d",cupbrcap:"\u2a48",cupcap:"\u2a46",CupCap:"\u224d",cup:"\u222a",Cup:"\u22d3",cupcup:"\u2a4a",cupdot:"\u228d",cupor:"\u2a45",cups:"\u222a\ufe00",curarr:"\u21b7",curarrm:"\u293c",curlyeqprec:"\u22de",curlyeqsucc:"\u22df",curlyvee:"\u22ce",curlywedge:"\u22cf",curren:"\xa4",curvearrowleft:"\u21b6",curvearrowright:"\u21b7",cuvee:"\u22ce",cuwed:"\u22cf",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232d",dagger:"\u2020",Dagger:"\u2021",daleth:"\u2138",darr:"\u2193",Darr:"\u21a1",dArr:"\u21d3",dash:"\u2010",Dashv:"\u2ae4",dashv:"\u22a3",dbkarow:"\u290f",dblac:"\u02dd",Dcaron:"\u010e",dcaron:"\u010f",Dcy:"\u0414",dcy:"\u0434",ddagger:"\u2021",ddarr:"\u21ca",DD:"\u2145",dd:"\u2146",DDotrahd:"\u2911",ddotseq:"\u2a77",deg:"\xb0",Del:"\u2207",Delta:"\u0394",delta:"\u03b4",demptyv:"\u29b1",dfisht:"\u297f",Dfr:"\ud835\udd07",dfr:"\ud835\udd21",dHar:"\u2965",dharl:"\u21c3",dharr:"\u21c2",DiacriticalAcute:"\xb4",DiacriticalDot:"\u02d9",DiacriticalDoubleAcute:"\u02dd",DiacriticalGrave:"`",DiacriticalTilde:"\u02dc",diam:"\u22c4",diamond:"\u22c4",Diamond:"\u22c4",diamondsuit:"\u2666",diams:"\u2666",die:"\xa8",DifferentialD:"\u2146",digamma:"\u03dd",disin:"\u22f2",div:"\xf7",divide:"\xf7",divideontimes:"\u22c7",divonx:"\u22c7",DJcy:"\u0402",djcy:"\u0452",dlcorn:"\u231e",dlcrop:"\u230d",dollar:"$",Dopf:"\ud835\udd3b",dopf:"\ud835\udd55",Dot:"\xa8",dot:"\u02d9",DotDot:"\u20dc",doteq:"\u2250",doteqdot:"\u2251",DotEqual:"\u2250",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22a1",doublebarwedge:"\u2306",DoubleContourIntegral:"\u222f",DoubleDot:"\xa8",DoubleDownArrow:"\u21d3",DoubleLeftArrow:"\u21d0",DoubleLeftRightArrow:"\u21d4",DoubleLeftTee:"\u2ae4",DoubleLongLeftArrow:"\u27f8",DoubleLongLeftRightArrow:"\u27fa",DoubleLongRightArrow:"\u27f9",DoubleRightArrow:"\u21d2",DoubleRightTee:"\u22a8",DoubleUpArrow:"\u21d1",DoubleUpDownArrow:"\u21d5",DoubleVerticalBar:"\u2225",DownArrowBar:"\u2913",downarrow:"\u2193",DownArrow:"\u2193",Downarrow:"\u21d3",DownArrowUpArrow:"\u21f5",DownBreve:"\u0311",downdownarrows:"\u21ca",downharpoonleft:"\u21c3",downharpoonright:"\u21c2",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295e",DownLeftVectorBar:"\u2956",DownLeftVector:"\u21bd",DownRightTeeVector:"\u295f",DownRightVectorBar:"\u2957",DownRightVector:"\u21c1",DownTeeArrow:"\u21a7",DownTee:"\u22a4",drbkarow:"\u2910",drcorn:"\u231f",drcrop:"\u230c",Dscr:"\ud835\udc9f",dscr:"\ud835\udcb9",DScy:"\u0405",dscy:"\u0455",dsol:"\u29f6",Dstrok:"\u0110",dstrok:"\u0111",dtdot:"\u22f1",dtri:"\u25bf",dtrif:"\u25be",duarr:"\u21f5",duhar:"\u296f",dwangle:"\u29a6",DZcy:"\u040f",dzcy:"\u045f",dzigrarr:"\u27ff",Eacute:"\xc9",eacute:"\xe9",easter:"\u2a6e",Ecaron:"\u011a",ecaron:"\u011b",Ecirc:"\xca",ecirc:"\xea",ecir:"\u2256",ecolon:"\u2255",Ecy:"\u042d",ecy:"\u044d",eDDot:"\u2a77",Edot:"\u0116",edot:"\u0117",eDot:"\u2251",ee:"\u2147",efDot:"\u2252",Efr:"\ud835\udd08",efr:"\ud835\udd22",eg:"\u2a9a",Egrave:"\xc8",egrave:"\xe8",egs:"\u2a96",egsdot:"\u2a98",el:"\u2a99",Element:"\u2208",elinters:"\u23e7",ell:"\u2113",els:"\u2a95",elsdot:"\u2a97",Emacr:"\u0112",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",EmptySmallSquare:"\u25fb",emptyv:"\u2205",EmptyVerySmallSquare:"\u25ab",emsp13:"\u2004",emsp14:"\u2005",emsp:"\u2003",ENG:"\u014a",eng:"\u014b",ensp:"\u2002",Eogon:"\u0118",eogon:"\u0119",Eopf:"\ud835\udd3c",eopf:"\ud835\udd56",epar:"\u22d5",eparsl:"\u29e3",eplus:"\u2a71",epsi:"\u03b5",Epsilon:"\u0395",epsilon:"\u03b5",epsiv:"\u03f5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2a96",eqslantless:"\u2a95",Equal:"\u2a75",equals:"=",EqualTilde:"\u2242",equest:"\u225f",Equilibrium:"\u21cc",equiv:"\u2261",equivDD:"\u2a78",eqvparsl:"\u29e5",erarr:"\u2971",erDot:"\u2253",escr:"\u212f",Escr:"\u2130",esdot:"\u2250",Esim:"\u2a73",esim:"\u2242",Eta:"\u0397",eta:"\u03b7",ETH:"\xd0",eth:"\xf0",Euml:"\xcb",euml:"\xeb",euro:"\u20ac",excl:"!",exist:"\u2203",Exists:"\u2203",expectation:"\u2130",exponentiale:"\u2147",ExponentialE:"\u2147",fallingdotseq:"\u2252",Fcy:"\u0424",fcy:"\u0444",female:"\u2640",ffilig:"\ufb03",fflig:"\ufb00",ffllig:"\ufb04",Ffr:"\ud835\udd09",ffr:"\ud835\udd23",filig:"\ufb01",FilledSmallSquare:"\u25fc",FilledVerySmallSquare:"\u25aa",fjlig:"fj",flat:"\u266d",fllig:"\ufb02",fltns:"\u25b1",fnof:"\u0192",Fopf:"\ud835\udd3d",fopf:"\ud835\udd57",forall:"\u2200",ForAll:"\u2200",fork:"\u22d4",forkv:"\u2ad9",Fouriertrf:"\u2131",fpartint:"\u2a0d",frac12:"\xbd",frac13:"\u2153",frac14:"\xbc",frac15:"\u2155",frac16:"\u2159",frac18:"\u215b",frac23:"\u2154",frac25:"\u2156",frac34:"\xbe",frac35:"\u2157",frac38:"\u215c",frac45:"\u2158",frac56:"\u215a",frac58:"\u215d",frac78:"\u215e",frasl:"\u2044",frown:"\u2322",fscr:"\ud835\udcbb",Fscr:"\u2131",gacute:"\u01f5",Gamma:"\u0393",gamma:"\u03b3",Gammad:"\u03dc",gammad:"\u03dd",gap:"\u2a86",Gbreve:"\u011e",gbreve:"\u011f",Gcedil:"\u0122",Gcirc:"\u011c",gcirc:"\u011d",Gcy:"\u0413",gcy:"\u0433",Gdot:"\u0120",gdot:"\u0121",ge:"\u2265",gE:"\u2267",gEl:"\u2a8c",gel:"\u22db",geq:"\u2265",geqq:"\u2267",geqslant:"\u2a7e",gescc:"\u2aa9",ges:"\u2a7e",gesdot:"\u2a80",gesdoto:"\u2a82",gesdotol:"\u2a84",gesl:"\u22db\ufe00",gesles:"\u2a94",Gfr:"\ud835\udd0a",gfr:"\ud835\udd24",gg:"\u226b",Gg:"\u22d9",ggg:"\u22d9",gimel:"\u2137",GJcy:"\u0403",gjcy:"\u0453",gla:"\u2aa5",gl:"\u2277",glE:"\u2a92",glj:"\u2aa4",gnap:"\u2a8a",gnapprox:"\u2a8a",gne:"\u2a88",gnE:"\u2269",gneq:"\u2a88",gneqq:"\u2269",gnsim:"\u22e7",Gopf:"\ud835\udd3e",gopf:"\ud835\udd58",grave:"`",GreaterEqual:"\u2265",GreaterEqualLess:"\u22db",GreaterFullEqual:"\u2267",GreaterGreater:"\u2aa2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2a7e",GreaterTilde:"\u2273",Gscr:"\ud835\udca2",gscr:"\u210a",gsim:"\u2273",gsime:"\u2a8e",gsiml:"\u2a90",gtcc:"\u2aa7",gtcir:"\u2a7a",gt:">",GT:">",Gt:"\u226b",gtdot:"\u22d7",gtlPar:"\u2995",gtquest:"\u2a7c",gtrapprox:"\u2a86",gtrarr:"\u2978",gtrdot:"\u22d7",gtreqless:"\u22db",gtreqqless:"\u2a8c",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\ufe00",gvnE:"\u2269\ufe00",Hacek:"\u02c7",hairsp:"\u200a",half:"\xbd",hamilt:"\u210b",HARDcy:"\u042a",hardcy:"\u044a",harrcir:"\u2948",harr:"\u2194",hArr:"\u21d4",harrw:"\u21ad",Hat:"^",hbar:"\u210f",Hcirc:"\u0124",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22b9",hfr:"\ud835\udd25",Hfr:"\u210c",HilbertSpace:"\u210b",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21ff",homtht:"\u223b",hookleftarrow:"\u21a9",hookrightarrow:"\u21aa",hopf:"\ud835\udd59",Hopf:"\u210d",horbar:"\u2015",HorizontalLine:"\u2500",hscr:"\ud835\udcbd",Hscr:"\u210b",hslash:"\u210f",Hstrok:"\u0126",hstrok:"\u0127",HumpDownHump:"\u224e",HumpEqual:"\u224f",hybull:"\u2043",hyphen:"\u2010",Iacute:"\xcd",iacute:"\xed",ic:"\u2063",Icirc:"\xce",icirc:"\xee",Icy:"\u0418",icy:"\u0438",Idot:"\u0130",IEcy:"\u0415",iecy:"\u0435",iexcl:"\xa1",iff:"\u21d4",ifr:"\ud835\udd26",Ifr:"\u2111", +Igrave:"\xcc",igrave:"\xec",ii:"\u2148",iiiint:"\u2a0c",iiint:"\u222d",iinfin:"\u29dc",iiota:"\u2129",IJlig:"\u0132",ijlig:"\u0133",Imacr:"\u012a",imacr:"\u012b",image:"\u2111",ImaginaryI:"\u2148",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",Im:"\u2111",imof:"\u22b7",imped:"\u01b5",Implies:"\u21d2",incare:"\u2105","in":"\u2208",infin:"\u221e",infintie:"\u29dd",inodot:"\u0131",intcal:"\u22ba","int":"\u222b",Int:"\u222c",integers:"\u2124",Integral:"\u222b",intercal:"\u22ba",Intersection:"\u22c2",intlarhk:"\u2a17",intprod:"\u2a3c",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",IOcy:"\u0401",iocy:"\u0451",Iogon:"\u012e",iogon:"\u012f",Iopf:"\ud835\udd40",iopf:"\ud835\udd5a",Iota:"\u0399",iota:"\u03b9",iprod:"\u2a3c",iquest:"\xbf",iscr:"\ud835\udcbe",Iscr:"\u2110",isin:"\u2208",isindot:"\u22f5",isinE:"\u22f9",isins:"\u22f4",isinsv:"\u22f3",isinv:"\u2208",it:"\u2062",Itilde:"\u0128",itilde:"\u0129",Iukcy:"\u0406",iukcy:"\u0456",Iuml:"\xcf",iuml:"\xef",Jcirc:"\u0134",jcirc:"\u0135",Jcy:"\u0419",jcy:"\u0439",Jfr:"\ud835\udd0d",jfr:"\ud835\udd27",jmath:"\u0237",Jopf:"\ud835\udd41",jopf:"\ud835\udd5b",Jscr:"\ud835\udca5",jscr:"\ud835\udcbf",Jsercy:"\u0408",jsercy:"\u0458",Jukcy:"\u0404",jukcy:"\u0454",Kappa:"\u039a",kappa:"\u03ba",kappav:"\u03f0",Kcedil:"\u0136",kcedil:"\u0137",Kcy:"\u041a",kcy:"\u043a",Kfr:"\ud835\udd0e",kfr:"\ud835\udd28",kgreen:"\u0138",KHcy:"\u0425",khcy:"\u0445",KJcy:"\u040c",kjcy:"\u045c",Kopf:"\ud835\udd42",kopf:"\ud835\udd5c",Kscr:"\ud835\udca6",kscr:"\ud835\udcc0",lAarr:"\u21da",Lacute:"\u0139",lacute:"\u013a",laemptyv:"\u29b4",lagran:"\u2112",Lambda:"\u039b",lambda:"\u03bb",lang:"\u27e8",Lang:"\u27ea",langd:"\u2991",langle:"\u27e8",lap:"\u2a85",Laplacetrf:"\u2112",laquo:"\xab",larrb:"\u21e4",larrbfs:"\u291f",larr:"\u2190",Larr:"\u219e",lArr:"\u21d0",larrfs:"\u291d",larrhk:"\u21a9",larrlp:"\u21ab",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21a2",latail:"\u2919",lAtail:"\u291b",lat:"\u2aab",late:"\u2aad",lates:"\u2aad\ufe00",lbarr:"\u290c",lBarr:"\u290e",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298b",lbrksld:"\u298f",lbrkslu:"\u298d",Lcaron:"\u013d",lcaron:"\u013e",Lcedil:"\u013b",lcedil:"\u013c",lceil:"\u2308",lcub:"{",Lcy:"\u041b",lcy:"\u043b",ldca:"\u2936",ldquo:"\u201c",ldquor:"\u201e",ldrdhar:"\u2967",ldrushar:"\u294b",ldsh:"\u21b2",le:"\u2264",lE:"\u2266",LeftAngleBracket:"\u27e8",LeftArrowBar:"\u21e4",leftarrow:"\u2190",LeftArrow:"\u2190",Leftarrow:"\u21d0",LeftArrowRightArrow:"\u21c6",leftarrowtail:"\u21a2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27e6",LeftDownTeeVector:"\u2961",LeftDownVectorBar:"\u2959",LeftDownVector:"\u21c3",LeftFloor:"\u230a",leftharpoondown:"\u21bd",leftharpoonup:"\u21bc",leftleftarrows:"\u21c7",leftrightarrow:"\u2194",LeftRightArrow:"\u2194",Leftrightarrow:"\u21d4",leftrightarrows:"\u21c6",leftrightharpoons:"\u21cb",leftrightsquigarrow:"\u21ad",LeftRightVector:"\u294e",LeftTeeArrow:"\u21a4",LeftTee:"\u22a3",LeftTeeVector:"\u295a",leftthreetimes:"\u22cb",LeftTriangleBar:"\u29cf",LeftTriangle:"\u22b2",LeftTriangleEqual:"\u22b4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVectorBar:"\u2958",LeftUpVector:"\u21bf",LeftVectorBar:"\u2952",LeftVector:"\u21bc",lEg:"\u2a8b",leg:"\u22da",leq:"\u2264",leqq:"\u2266",leqslant:"\u2a7d",lescc:"\u2aa8",les:"\u2a7d",lesdot:"\u2a7f",lesdoto:"\u2a81",lesdotor:"\u2a83",lesg:"\u22da\ufe00",lesges:"\u2a93",lessapprox:"\u2a85",lessdot:"\u22d6",lesseqgtr:"\u22da",lesseqqgtr:"\u2a8b",LessEqualGreater:"\u22da",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2aa1",lesssim:"\u2272",LessSlantEqual:"\u2a7d",LessTilde:"\u2272",lfisht:"\u297c",lfloor:"\u230a",Lfr:"\ud835\udd0f",lfr:"\ud835\udd29",lg:"\u2276",lgE:"\u2a91",lHar:"\u2962",lhard:"\u21bd",lharu:"\u21bc",lharul:"\u296a",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",llarr:"\u21c7",ll:"\u226a",Ll:"\u22d8",llcorner:"\u231e",Lleftarrow:"\u21da",llhard:"\u296b",lltri:"\u25fa",Lmidot:"\u013f",lmidot:"\u0140",lmoustache:"\u23b0",lmoust:"\u23b0",lnap:"\u2a89",lnapprox:"\u2a89",lne:"\u2a87",lnE:"\u2268",lneq:"\u2a87",lneqq:"\u2268",lnsim:"\u22e6",loang:"\u27ec",loarr:"\u21fd",lobrk:"\u27e6",longleftarrow:"\u27f5",LongLeftArrow:"\u27f5",Longleftarrow:"\u27f8",longleftrightarrow:"\u27f7",LongLeftRightArrow:"\u27f7",Longleftrightarrow:"\u27fa",longmapsto:"\u27fc",longrightarrow:"\u27f6",LongRightArrow:"\u27f6",Longrightarrow:"\u27f9",looparrowleft:"\u21ab",looparrowright:"\u21ac",lopar:"\u2985",Lopf:"\ud835\udd43",lopf:"\ud835\udd5d",loplus:"\u2a2d",lotimes:"\u2a34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25ca",lozenge:"\u25ca",lozf:"\u29eb",lpar:"(",lparlt:"\u2993",lrarr:"\u21c6",lrcorner:"\u231f",lrhar:"\u21cb",lrhard:"\u296d",lrm:"\u200e",lrtri:"\u22bf",lsaquo:"\u2039",lscr:"\ud835\udcc1",Lscr:"\u2112",lsh:"\u21b0",Lsh:"\u21b0",lsim:"\u2272",lsime:"\u2a8d",lsimg:"\u2a8f",lsqb:"[",lsquo:"\u2018",lsquor:"\u201a",Lstrok:"\u0141",lstrok:"\u0142",ltcc:"\u2aa6",ltcir:"\u2a79",lt:"<",LT:"<",Lt:"\u226a",ltdot:"\u22d6",lthree:"\u22cb",ltimes:"\u22c9",ltlarr:"\u2976",ltquest:"\u2a7b",ltri:"\u25c3",ltrie:"\u22b4",ltrif:"\u25c2",ltrPar:"\u2996",lurdshar:"\u294a",luruhar:"\u2966",lvertneqq:"\u2268\ufe00",lvnE:"\u2268\ufe00",macr:"\xaf",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21a6",mapsto:"\u21a6",mapstodown:"\u21a7",mapstoleft:"\u21a4",mapstoup:"\u21a5",marker:"\u25ae",mcomma:"\u2a29",Mcy:"\u041c",mcy:"\u043c",mdash:"\u2014",mDDot:"\u223a",measuredangle:"\u2221",MediumSpace:"\u205f",Mellintrf:"\u2133",Mfr:"\ud835\udd10",mfr:"\ud835\udd2a",mho:"\u2127",micro:"\xb5",midast:"*",midcir:"\u2af0",mid:"\u2223",middot:"\xb7",minusb:"\u229f",minus:"\u2212",minusd:"\u2238",minusdu:"\u2a2a",MinusPlus:"\u2213",mlcp:"\u2adb",mldr:"\u2026",mnplus:"\u2213",models:"\u22a7",Mopf:"\ud835\udd44",mopf:"\ud835\udd5e",mp:"\u2213",mscr:"\ud835\udcc2",Mscr:"\u2133",mstpos:"\u223e",Mu:"\u039c",mu:"\u03bc",multimap:"\u22b8",mumap:"\u22b8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20d2",nap:"\u2249",napE:"\u2a70\u0338",napid:"\u224b\u0338",napos:"\u0149",napprox:"\u2249",natural:"\u266e",naturals:"\u2115",natur:"\u266e",nbsp:"\xa0",nbump:"\u224e\u0338",nbumpe:"\u224f\u0338",ncap:"\u2a43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2a6d\u0338",ncup:"\u2a42",Ncy:"\u041d",ncy:"\u043d",ndash:"\u2013",nearhk:"\u2924",nearr:"\u2197",neArr:"\u21d7",nearrow:"\u2197",ne:"\u2260",nedot:"\u2250\u0338",NegativeMediumSpace:"\u200b",NegativeThickSpace:"\u200b",NegativeThinSpace:"\u200b",NegativeVeryThinSpace:"\u200b",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",NestedGreaterGreater:"\u226b",NestedLessLess:"\u226a",NewLine:"\n",nexist:"\u2204",nexists:"\u2204",Nfr:"\ud835\udd11",nfr:"\ud835\udd2b",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2a7e\u0338",nges:"\u2a7e\u0338",nGg:"\u22d9\u0338",ngsim:"\u2275",nGt:"\u226b\u20d2",ngt:"\u226f",ngtr:"\u226f",nGtv:"\u226b\u0338",nharr:"\u21ae",nhArr:"\u21ce",nhpar:"\u2af2",ni:"\u220b",nis:"\u22fc",nisd:"\u22fa",niv:"\u220b",NJcy:"\u040a",njcy:"\u045a",nlarr:"\u219a",nlArr:"\u21cd",nldr:"\u2025",nlE:"\u2266\u0338",nle:"\u2270",nleftarrow:"\u219a",nLeftarrow:"\u21cd",nleftrightarrow:"\u21ae",nLeftrightarrow:"\u21ce",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2a7d\u0338",nles:"\u2a7d\u0338",nless:"\u226e",nLl:"\u22d8\u0338",nlsim:"\u2274",nLt:"\u226a\u20d2",nlt:"\u226e",nltri:"\u22ea",nltrie:"\u22ec",nLtv:"\u226a\u0338",nmid:"\u2224",NoBreak:"\u2060",NonBreakingSpace:"\xa0",nopf:"\ud835\udd5f",Nopf:"\u2115",Not:"\u2aec",not:"\xac",NotCongruent:"\u2262",NotCupCap:"\u226d",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226f",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226b\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2a7e\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224e\u0338",NotHumpEqual:"\u224f\u0338",notin:"\u2209",notindot:"\u22f5\u0338",notinE:"\u22f9\u0338",notinva:"\u2209",notinvb:"\u22f7",notinvc:"\u22f6",NotLeftTriangleBar:"\u29cf\u0338",NotLeftTriangle:"\u22ea",NotLeftTriangleEqual:"\u22ec",NotLess:"\u226e",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226a\u0338",NotLessSlantEqual:"\u2a7d\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2aa2\u0338",NotNestedLessLess:"\u2aa1\u0338",notni:"\u220c",notniva:"\u220c",notnivb:"\u22fe",notnivc:"\u22fd",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2aaf\u0338",NotPrecedesSlantEqual:"\u22e0",NotReverseElement:"\u220c",NotRightTriangleBar:"\u29d0\u0338",NotRightTriangle:"\u22eb",NotRightTriangleEqual:"\u22ed",NotSquareSubset:"\u228f\u0338",NotSquareSubsetEqual:"\u22e2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22e3",NotSubset:"\u2282\u20d2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2ab0\u0338",NotSucceedsSlantEqual:"\u22e1",NotSucceedsTilde:"\u227f\u0338",NotSuperset:"\u2283\u20d2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",nparallel:"\u2226",npar:"\u2226",nparsl:"\u2afd\u20e5",npart:"\u2202\u0338",npolint:"\u2a14",npr:"\u2280",nprcue:"\u22e0",nprec:"\u2280",npreceq:"\u2aaf\u0338",npre:"\u2aaf\u0338",nrarrc:"\u2933\u0338",nrarr:"\u219b",nrArr:"\u21cf",nrarrw:"\u219d\u0338",nrightarrow:"\u219b",nRightarrow:"\u21cf",nrtri:"\u22eb",nrtrie:"\u22ed",nsc:"\u2281",nsccue:"\u22e1",nsce:"\u2ab0\u0338",Nscr:"\ud835\udca9",nscr:"\ud835\udcc3",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22e2",nsqsupe:"\u22e3",nsub:"\u2284",nsubE:"\u2ac5\u0338",nsube:"\u2288",nsubset:"\u2282\u20d2",nsubseteq:"\u2288",nsubseteqq:"\u2ac5\u0338",nsucc:"\u2281",nsucceq:"\u2ab0\u0338",nsup:"\u2285",nsupE:"\u2ac6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20d2",nsupseteq:"\u2289",nsupseteqq:"\u2ac6\u0338",ntgl:"\u2279",Ntilde:"\xd1",ntilde:"\xf1",ntlg:"\u2278",ntriangleleft:"\u22ea",ntrianglelefteq:"\u22ec",ntriangleright:"\u22eb",ntrianglerighteq:"\u22ed",Nu:"\u039d",nu:"\u03bd",num:"#",numero:"\u2116",numsp:"\u2007",nvap:"\u224d\u20d2",nvdash:"\u22ac",nvDash:"\u22ad",nVdash:"\u22ae",nVDash:"\u22af",nvge:"\u2265\u20d2",nvgt:">\u20d2",nvHarr:"\u2904",nvinfin:"\u29de",nvlArr:"\u2902",nvle:"\u2264\u20d2",nvlt:"<\u20d2",nvltrie:"\u22b4\u20d2",nvrArr:"\u2903",nvrtrie:"\u22b5\u20d2",nvsim:"\u223c\u20d2",nwarhk:"\u2923",nwarr:"\u2196",nwArr:"\u21d6",nwarrow:"\u2196",nwnear:"\u2927",Oacute:"\xd3",oacute:"\xf3",oast:"\u229b",Ocirc:"\xd4",ocirc:"\xf4",ocir:"\u229a",Ocy:"\u041e",ocy:"\u043e",odash:"\u229d",Odblac:"\u0150",odblac:"\u0151",odiv:"\u2a38",odot:"\u2299",odsold:"\u29bc",OElig:"\u0152",oelig:"\u0153",ofcir:"\u29bf",Ofr:"\ud835\udd12",ofr:"\ud835\udd2c",ogon:"\u02db",Ograve:"\xd2",ograve:"\xf2",ogt:"\u29c1",ohbar:"\u29b5",ohm:"\u03a9",oint:"\u222e",olarr:"\u21ba",olcir:"\u29be",olcross:"\u29bb",oline:"\u203e",olt:"\u29c0",Omacr:"\u014c",omacr:"\u014d",Omega:"\u03a9",omega:"\u03c9",Omicron:"\u039f",omicron:"\u03bf",omid:"\u29b6",ominus:"\u2296",Oopf:"\ud835\udd46",oopf:"\ud835\udd60",opar:"\u29b7",OpenCurlyDoubleQuote:"\u201c",OpenCurlyQuote:"\u2018",operp:"\u29b9",oplus:"\u2295",orarr:"\u21bb",Or:"\u2a54",or:"\u2228",ord:"\u2a5d",order:"\u2134",orderof:"\u2134",ordf:"\xaa",ordm:"\xba",origof:"\u22b6",oror:"\u2a56",orslope:"\u2a57",orv:"\u2a5b",oS:"\u24c8",Oscr:"\ud835\udcaa",oscr:"\u2134",Oslash:"\xd8",oslash:"\xf8",osol:"\u2298",Otilde:"\xd5",otilde:"\xf5",otimesas:"\u2a36",Otimes:"\u2a37",otimes:"\u2297",Ouml:"\xd6",ouml:"\xf6",ovbar:"\u233d",OverBar:"\u203e",OverBrace:"\u23de",OverBracket:"\u23b4",OverParenthesis:"\u23dc",para:"\xb6",parallel:"\u2225",par:"\u2225",parsim:"\u2af3",parsl:"\u2afd",part:"\u2202",PartialD:"\u2202",Pcy:"\u041f",pcy:"\u043f",percnt:"%",period:".",permil:"\u2030",perp:"\u22a5",pertenk:"\u2031",Pfr:"\ud835\udd13",pfr:"\ud835\udd2d",Phi:"\u03a6",phi:"\u03c6",phiv:"\u03d5",phmmat:"\u2133",phone:"\u260e",Pi:"\u03a0",pi:"\u03c0",pitchfork:"\u22d4",piv:"\u03d6",planck:"\u210f",planckh:"\u210e",plankv:"\u210f",plusacir:"\u2a23",plusb:"\u229e",pluscir:"\u2a22",plus:"+",plusdo:"\u2214",plusdu:"\u2a25",pluse:"\u2a72",PlusMinus:"\xb1",plusmn:"\xb1",plussim:"\u2a26",plustwo:"\u2a27",pm:"\xb1",Poincareplane:"\u210c",pointint:"\u2a15",popf:"\ud835\udd61",Popf:"\u2119",pound:"\xa3",prap:"\u2ab7",Pr:"\u2abb",pr:"\u227a",prcue:"\u227c",precapprox:"\u2ab7",prec:"\u227a",preccurlyeq:"\u227c",Precedes:"\u227a",PrecedesEqual:"\u2aaf",PrecedesSlantEqual:"\u227c",PrecedesTilde:"\u227e",preceq:"\u2aaf",precnapprox:"\u2ab9",precneqq:"\u2ab5",precnsim:"\u22e8",pre:"\u2aaf",prE:"\u2ab3",precsim:"\u227e",prime:"\u2032",Prime:"\u2033",primes:"\u2119",prnap:"\u2ab9",prnE:"\u2ab5",prnsim:"\u22e8",prod:"\u220f",Product:"\u220f",profalar:"\u232e",profline:"\u2312",profsurf:"\u2313",prop:"\u221d",Proportional:"\u221d",Proportion:"\u2237",propto:"\u221d",prsim:"\u227e",prurel:"\u22b0",Pscr:"\ud835\udcab",pscr:"\ud835\udcc5",Psi:"\u03a8",psi:"\u03c8",puncsp:"\u2008",Qfr:"\ud835\udd14",qfr:"\ud835\udd2e",qint:"\u2a0c",qopf:"\ud835\udd62",Qopf:"\u211a",qprime:"\u2057",Qscr:"\ud835\udcac",qscr:"\ud835\udcc6",quaternions:"\u210d",quatint:"\u2a16",quest:"?",questeq:"\u225f",quot:'"',QUOT:'"',rAarr:"\u21db",race:"\u223d\u0331",Racute:"\u0154",racute:"\u0155",radic:"\u221a",raemptyv:"\u29b3",rang:"\u27e9",Rang:"\u27eb",rangd:"\u2992",range:"\u29a5",rangle:"\u27e9",raquo:"\xbb",rarrap:"\u2975",rarrb:"\u21e5",rarrbfs:"\u2920",rarrc:"\u2933",rarr:"\u2192",Rarr:"\u21a0",rArr:"\u21d2",rarrfs:"\u291e",rarrhk:"\u21aa",rarrlp:"\u21ac",rarrpl:"\u2945",rarrsim:"\u2974",Rarrtl:"\u2916",rarrtl:"\u21a3",rarrw:"\u219d",ratail:"\u291a",rAtail:"\u291c",ratio:"\u2236",rationals:"\u211a",rbarr:"\u290d",rBarr:"\u290f",RBarr:"\u2910",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298c",rbrksld:"\u298e",rbrkslu:"\u2990",Rcaron:"\u0158",rcaron:"\u0159",Rcedil:"\u0156",rcedil:"\u0157",rceil:"\u2309",rcub:"}",Rcy:"\u0420",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201d",rdquor:"\u201d",rdsh:"\u21b3",real:"\u211c",realine:"\u211b",realpart:"\u211c",reals:"\u211d",Re:"\u211c",rect:"\u25ad",reg:"\xae",REG:"\xae",ReverseElement:"\u220b",ReverseEquilibrium:"\u21cb",ReverseUpEquilibrium:"\u296f",rfisht:"\u297d",rfloor:"\u230b",rfr:"\ud835\udd2f",Rfr:"\u211c",rHar:"\u2964",rhard:"\u21c1",rharu:"\u21c0",rharul:"\u296c",Rho:"\u03a1",rho:"\u03c1",rhov:"\u03f1",RightAngleBracket:"\u27e9",RightArrowBar:"\u21e5",rightarrow:"\u2192",RightArrow:"\u2192",Rightarrow:"\u21d2",RightArrowLeftArrow:"\u21c4",rightarrowtail:"\u21a3",RightCeiling:"\u2309",RightDoubleBracket:"\u27e7",RightDownTeeVector:"\u295d",RightDownVectorBar:"\u2955",RightDownVector:"\u21c2",RightFloor:"\u230b",rightharpoondown:"\u21c1",rightharpoonup:"\u21c0",rightleftarrows:"\u21c4",rightleftharpoons:"\u21cc",rightrightarrows:"\u21c9",rightsquigarrow:"\u219d",RightTeeArrow:"\u21a6",RightTee:"\u22a2",RightTeeVector:"\u295b",rightthreetimes:"\u22cc",RightTriangleBar:"\u29d0",RightTriangle:"\u22b3",RightTriangleEqual:"\u22b5",RightUpDownVector:"\u294f",RightUpTeeVector:"\u295c",RightUpVectorBar:"\u2954",RightUpVector:"\u21be",RightVectorBar:"\u2953",RightVector:"\u21c0",ring:"\u02da",risingdotseq:"\u2253",rlarr:"\u21c4",rlhar:"\u21cc",rlm:"\u200f",rmoustache:"\u23b1",rmoust:"\u23b1",rnmid:"\u2aee",roang:"\u27ed",roarr:"\u21fe",robrk:"\u27e7",ropar:"\u2986",ropf:"\ud835\udd63",Ropf:"\u211d",roplus:"\u2a2e",rotimes:"\u2a35",RoundImplies:"\u2970",rpar:")",rpargt:"\u2994",rppolint:"\u2a12",rrarr:"\u21c9",Rrightarrow:"\u21db",rsaquo:"\u203a",rscr:"\ud835\udcc7",Rscr:"\u211b",rsh:"\u21b1",Rsh:"\u21b1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22cc",rtimes:"\u22ca",rtri:"\u25b9",rtrie:"\u22b5",rtrif:"\u25b8",rtriltri:"\u29ce",RuleDelayed:"\u29f4",ruluhar:"\u2968",rx:"\u211e",Sacute:"\u015a",sacute:"\u015b",sbquo:"\u201a",scap:"\u2ab8",Scaron:"\u0160",scaron:"\u0161",Sc:"\u2abc",sc:"\u227b",sccue:"\u227d",sce:"\u2ab0",scE:"\u2ab4",Scedil:"\u015e",scedil:"\u015f",Scirc:"\u015c",scirc:"\u015d",scnap:"\u2aba",scnE:"\u2ab6",scnsim:"\u22e9",scpolint:"\u2a13",scsim:"\u227f",Scy:"\u0421",scy:"\u0441",sdotb:"\u22a1",sdot:"\u22c5",sdote:"\u2a66",searhk:"\u2925",searr:"\u2198",seArr:"\u21d8",searrow:"\u2198",sect:"\xa7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",Sfr:"\ud835\udd16",sfr:"\ud835\udd30",sfrown:"\u2322",sharp:"\u266f",SHCHcy:"\u0429",shchcy:"\u0449",SHcy:"\u0428",shcy:"\u0448",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",shortmid:"\u2223",shortparallel:"\u2225",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",shy:"\xad",Sigma:"\u03a3",sigma:"\u03c3",sigmaf:"\u03c2",sigmav:"\u03c2",sim:"\u223c",simdot:"\u2a6a",sime:"\u2243",simeq:"\u2243",simg:"\u2a9e",simgE:"\u2aa0",siml:"\u2a9d",simlE:"\u2a9f",simne:"\u2246",simplus:"\u2a24",simrarr:"\u2972",slarr:"\u2190",SmallCircle:"\u2218",smallsetminus:"\u2216",smashp:"\u2a33",smeparsl:"\u29e4",smid:"\u2223",smile:"\u2323",smt:"\u2aaa",smte:"\u2aac",smtes:"\u2aac\ufe00",SOFTcy:"\u042c",softcy:"\u044c",solbar:"\u233f",solb:"\u29c4",sol:"/",Sopf:"\ud835\udd4a",sopf:"\ud835\udd64",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\ufe00",sqcup:"\u2294",sqcups:"\u2294\ufe00",Sqrt:"\u221a",sqsub:"\u228f",sqsube:"\u2291",sqsubset:"\u228f",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",square:"\u25a1",Square:"\u25a1",SquareIntersection:"\u2293",SquareSubset:"\u228f",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",squarf:"\u25aa",squ:"\u25a1",squf:"\u25aa",srarr:"\u2192",Sscr:"\ud835\udcae",sscr:"\ud835\udcc8",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22c6",Star:"\u22c6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03f5",straightphi:"\u03d5",strns:"\xaf",sub:"\u2282",Sub:"\u22d0",subdot:"\u2abd",subE:"\u2ac5",sube:"\u2286",subedot:"\u2ac3",submult:"\u2ac1",subnE:"\u2acb",subne:"\u228a",subplus:"\u2abf",subrarr:"\u2979",subset:"\u2282",Subset:"\u22d0",subseteq:"\u2286",subseteqq:"\u2ac5",SubsetEqual:"\u2286",subsetneq:"\u228a",subsetneqq:"\u2acb",subsim:"\u2ac7",subsub:"\u2ad5",subsup:"\u2ad3",succapprox:"\u2ab8",succ:"\u227b",succcurlyeq:"\u227d",Succeeds:"\u227b",SucceedsEqual:"\u2ab0",SucceedsSlantEqual:"\u227d",SucceedsTilde:"\u227f",succeq:"\u2ab0",succnapprox:"\u2aba",succneqq:"\u2ab6",succnsim:"\u22e9",succsim:"\u227f",SuchThat:"\u220b",sum:"\u2211",Sum:"\u2211",sung:"\u266a",sup1:"\xb9",sup2:"\xb2",sup3:"\xb3",sup:"\u2283",Sup:"\u22d1",supdot:"\u2abe",supdsub:"\u2ad8",supE:"\u2ac6",supe:"\u2287",supedot:"\u2ac4",Superset:"\u2283",SupersetEqual:"\u2287",suphsol:"\u27c9",suphsub:"\u2ad7",suplarr:"\u297b",supmult:"\u2ac2",supnE:"\u2acc",supne:"\u228b",supplus:"\u2ac0",supset:"\u2283",Supset:"\u22d1",supseteq:"\u2287",supseteqq:"\u2ac6",supsetneq:"\u228b",supsetneqq:"\u2acc",supsim:"\u2ac8",supsub:"\u2ad4",supsup:"\u2ad6",swarhk:"\u2926",swarr:"\u2199",swArr:"\u21d9",swarrow:"\u2199",swnwar:"\u292a",szlig:"\xdf",Tab:" ",target:"\u2316",Tau:"\u03a4",tau:"\u03c4",tbrk:"\u23b4",Tcaron:"\u0164",tcaron:"\u0165",Tcedil:"\u0162",tcedil:"\u0163",Tcy:"\u0422",tcy:"\u0442",tdot:"\u20db",telrec:"\u2315",Tfr:"\ud835\udd17",tfr:"\ud835\udd31",there4:"\u2234",therefore:"\u2234",Therefore:"\u2234",Theta:"\u0398",theta:"\u03b8",thetasym:"\u03d1",thetav:"\u03d1",thickapprox:"\u2248",thicksim:"\u223c",ThickSpace:"\u205f\u200a",ThinSpace:"\u2009",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223c",THORN:"\xde",thorn:"\xfe",tilde:"\u02dc",Tilde:"\u223c",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",timesbar:"\u2a31",timesb:"\u22a0",times:"\xd7",timesd:"\u2a30",tint:"\u222d",toea:"\u2928",topbot:"\u2336",topcir:"\u2af1",top:"\u22a4",Topf:"\ud835\udd4b",topf:"\ud835\udd65",topfork:"\u2ada",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",TRADE:"\u2122",triangle:"\u25b5",triangledown:"\u25bf",triangleleft:"\u25c3",trianglelefteq:"\u22b4",triangleq:"\u225c",triangleright:"\u25b9",trianglerighteq:"\u22b5",tridot:"\u25ec",trie:"\u225c",triminus:"\u2a3a",TripleDot:"\u20db",triplus:"\u2a39",trisb:"\u29cd",tritime:"\u2a3b",trpezium:"\u23e2",Tscr:"\ud835\udcaf",tscr:"\ud835\udcc9",TScy:"\u0426",tscy:"\u0446",TSHcy:"\u040b",tshcy:"\u045b",Tstrok:"\u0166",tstrok:"\u0167",twixt:"\u226c",twoheadleftarrow:"\u219e",twoheadrightarrow:"\u21a0",Uacute:"\xda",uacute:"\xfa",uarr:"\u2191",Uarr:"\u219f",uArr:"\u21d1",Uarrocir:"\u2949",Ubrcy:"\u040e",ubrcy:"\u045e",Ubreve:"\u016c",ubreve:"\u016d",Ucirc:"\xdb",ucirc:"\xfb",Ucy:"\u0423",ucy:"\u0443",udarr:"\u21c5",Udblac:"\u0170",udblac:"\u0171",udhar:"\u296e",ufisht:"\u297e",Ufr:"\ud835\udd18",ufr:"\ud835\udd32",Ugrave:"\xd9",ugrave:"\xf9",uHar:"\u2963",uharl:"\u21bf",uharr:"\u21be",uhblk:"\u2580",ulcorn:"\u231c",ulcorner:"\u231c",ulcrop:"\u230f",ultri:"\u25f8",Umacr:"\u016a",umacr:"\u016b",uml:"\xa8",UnderBar:"_",UnderBrace:"\u23df",UnderBracket:"\u23b5",UnderParenthesis:"\u23dd",Union:"\u22c3",UnionPlus:"\u228e",Uogon:"\u0172",uogon:"\u0173",Uopf:"\ud835\udd4c",uopf:"\ud835\udd66",UpArrowBar:"\u2912",uparrow:"\u2191",UpArrow:"\u2191",Uparrow:"\u21d1",UpArrowDownArrow:"\u21c5",updownarrow:"\u2195",UpDownArrow:"\u2195",Updownarrow:"\u21d5",UpEquilibrium:"\u296e",upharpoonleft:"\u21bf",upharpoonright:"\u21be",uplus:"\u228e",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",upsi:"\u03c5",Upsi:"\u03d2",upsih:"\u03d2",Upsilon:"\u03a5",upsilon:"\u03c5",UpTeeArrow:"\u21a5",UpTee:"\u22a5",upuparrows:"\u21c8",urcorn:"\u231d",urcorner:"\u231d",urcrop:"\u230e",Uring:"\u016e",uring:"\u016f",urtri:"\u25f9",Uscr:"\ud835\udcb0",uscr:"\ud835\udcca",utdot:"\u22f0",Utilde:"\u0168",utilde:"\u0169",utri:"\u25b5",utrif:"\u25b4",uuarr:"\u21c8",Uuml:"\xdc",uuml:"\xfc",uwangle:"\u29a7",vangrt:"\u299c",varepsilon:"\u03f5",varkappa:"\u03f0",varnothing:"\u2205",varphi:"\u03d5",varpi:"\u03d6",varpropto:"\u221d",varr:"\u2195",vArr:"\u21d5",varrho:"\u03f1",varsigma:"\u03c2",varsubsetneq:"\u228a\ufe00",varsubsetneqq:"\u2acb\ufe00",varsupsetneq:"\u228b\ufe00",varsupsetneqq:"\u2acc\ufe00",vartheta:"\u03d1",vartriangleleft:"\u22b2",vartriangleright:"\u22b3",vBar:"\u2ae8",Vbar:"\u2aeb",vBarv:"\u2ae9",Vcy:"\u0412",vcy:"\u0432",vdash:"\u22a2",vDash:"\u22a8",Vdash:"\u22a9",VDash:"\u22ab",Vdashl:"\u2ae6",veebar:"\u22bb",vee:"\u2228",Vee:"\u22c1",veeeq:"\u225a",vellip:"\u22ee",verbar:"|",Verbar:"\u2016",vert:"|",Vert:"\u2016",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200a",Vfr:"\ud835\udd19",vfr:"\ud835\udd33",vltri:"\u22b2",vnsub:"\u2282\u20d2",vnsup:"\u2283\u20d2",Vopf:"\ud835\udd4d",vopf:"\ud835\udd67",vprop:"\u221d",vrtri:"\u22b3",Vscr:"\ud835\udcb1",vscr:"\ud835\udccb",vsubnE:"\u2acb\ufe00",vsubne:"\u228a\ufe00",vsupnE:"\u2acc\ufe00",vsupne:"\u228b\ufe00",Vvdash:"\u22aa",vzigzag:"\u299a",Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2a5f",wedge:"\u2227",Wedge:"\u22c0",wedgeq:"\u2259",weierp:"\u2118",Wfr:"\ud835\udd1a",wfr:"\ud835\udd34",Wopf:"\ud835\udd4e",wopf:"\ud835\udd68",wp:"\u2118",wr:"\u2240",wreath:"\u2240",Wscr:"\ud835\udcb2",wscr:"\ud835\udccc",xcap:"\u22c2",xcirc:"\u25ef",xcup:"\u22c3",xdtri:"\u25bd",Xfr:"\ud835\udd1b",xfr:"\ud835\udd35",xharr:"\u27f7",xhArr:"\u27fa",Xi:"\u039e",xi:"\u03be",xlarr:"\u27f5",xlArr:"\u27f8",xmap:"\u27fc",xnis:"\u22fb",xodot:"\u2a00",Xopf:"\ud835\udd4f",xopf:"\ud835\udd69",xoplus:"\u2a01",xotime:"\u2a02",xrarr:"\u27f6",xrArr:"\u27f9",Xscr:"\ud835\udcb3",xscr:"\ud835\udccd",xsqcup:"\u2a06",xuplus:"\u2a04",xutri:"\u25b3",xvee:"\u22c1",xwedge:"\u22c0",Yacute:"\xdd",yacute:"\xfd",YAcy:"\u042f",yacy:"\u044f",Ycirc:"\u0176",ycirc:"\u0177",Ycy:"\u042b",ycy:"\u044b",yen:"\xa5",Yfr:"\ud835\udd1c",yfr:"\ud835\udd36",YIcy:"\u0407",yicy:"\u0457",Yopf:"\ud835\udd50",yopf:"\ud835\udd6a",Yscr:"\ud835\udcb4",yscr:"\ud835\udcce",YUcy:"\u042e",yucy:"\u044e",yuml:"\xff",Yuml:"\u0178",Zacute:"\u0179",zacute:"\u017a",Zcaron:"\u017d",zcaron:"\u017e",Zcy:"\u0417",zcy:"\u0437",Zdot:"\u017b",zdot:"\u017c",zeetrf:"\u2128",ZeroWidthSpace:"\u200b",Zeta:"\u0396",zeta:"\u03b6",zfr:"\ud835\udd37",Zfr:"\u2128",ZHcy:"\u0416",zhcy:"\u0436",zigrarr:"\u21dd",zopf:"\ud835\udd6b",Zopf:"\u2124",Zscr:"\ud835\udcb5",zscr:"\ud835\udccf",zwj:"\u200d",zwnj:"\u200c"}},{}],54:[function(e,r,t){"use strict";function n(e){var r=Array.prototype.slice.call(arguments,1);return r.forEach(function(r){r&&Object.keys(r).forEach(function(t){e[t]=r[t]})}),e}function s(e){return Object.prototype.toString.call(e)}function o(e){return"[object String]"===s(e)}function i(e){return"[object Object]"===s(e)}function a(e){return"[object RegExp]"===s(e)}function c(e){return"[object Function]"===s(e)}function l(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function u(e){return Object.keys(e||{}).reduce(function(e,r){return e||k.hasOwnProperty(r)},!1)}function p(e){e.__index__=-1,e.__text_cache__=""}function h(e){return function(r,t){var n=r.slice(t);return e.test(n)?n.match(e)[0].length:0}}function f(){return function(e,r){r.normalize(e)}}function d(r){function t(e){return e.replace("%TLDS%",u.src_tlds)}function s(e,r){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+r)}var u=r.re=n({},e("./lib/re")),d=r.__tlds__.slice();r.__tlds_replaced__||d.push(v),d.push(u.src_xn),u.src_tlds=d.join("|"),u.email_fuzzy=RegExp(t(u.tpl_email_fuzzy),"i"),u.link_fuzzy=RegExp(t(u.tpl_link_fuzzy),"i"),u.link_no_ip_fuzzy=RegExp(t(u.tpl_link_no_ip_fuzzy),"i"),u.host_fuzzy_test=RegExp(t(u.tpl_host_fuzzy_test),"i");var m=[];r.__compiled__={},Object.keys(r.__schemas__).forEach(function(e){var t=r.__schemas__[e];if(null!==t){var n={validate:null,link:null};return r.__compiled__[e]=n,i(t)?(a(t.validate)?n.validate=h(t.validate):c(t.validate)?n.validate=t.validate:s(e,t),void(c(t.normalize)?n.normalize=t.normalize:t.normalize?s(e,t):n.normalize=f())):o(t)?void m.push(e):void s(e,t)}}),m.forEach(function(e){r.__compiled__[r.__schemas__[e]]&&(r.__compiled__[e].validate=r.__compiled__[r.__schemas__[e]].validate,r.__compiled__[e].normalize=r.__compiled__[r.__schemas__[e]].normalize)}),r.__compiled__[""]={validate:null,normalize:f()};var g=Object.keys(r.__compiled__).filter(function(e){return e.length>0&&r.__compiled__[e]}).map(l).join("|");r.re.schema_test=RegExp("(^|(?!_)(?:>|"+u.src_ZPCc+"))("+g+")","i"),r.re.schema_search=RegExp("(^|(?!_)(?:>|"+u.src_ZPCc+"))("+g+")","ig"),r.re.pretest=RegExp("("+r.re.schema_test.source+")|("+r.re.host_fuzzy_test.source+")|@","i"),p(r)}function m(e,r){var t=e.__index__,n=e.__last_index__,s=e.__text_cache__.slice(t,n);this.schema=e.__schema__.toLowerCase(),this.index=t+r,this.lastIndex=n+r,this.raw=s,this.text=s,this.url=s}function g(e,r){var t=new m(e,r);return e.__compiled__[t.schema].normalize(t,e),t}function _(e,r){return this instanceof _?(r||u(e)&&(r=e,e={}),this.__opts__=n({},k,r),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},b,e),this.__compiled__={},this.__tlds__=x,this.__tlds_replaced__=!1,this.re={},void d(this)):new _(e,r)}var k={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1},b={"http:":{validate:function(e,r,t){var n=e.slice(r);return t.re.http||(t.re.http=new RegExp("^\\/\\/"+t.re.src_auth+t.re.src_host_port_strict+t.re.src_path,"i")),t.re.http.test(n)?n.match(t.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,r,t){var n=e.slice(r);return t.re.no_http||(t.re.no_http=new RegExp("^"+t.re.src_auth+t.re.src_host_port_strict+t.re.src_path,"i")),t.re.no_http.test(n)?r>=3&&":"===e[r-3]?0:n.match(t.re.no_http)[0].length:0}},"mailto:":{validate:function(e,r,t){var n=e.slice(r);return t.re.mailto||(t.re.mailto=new RegExp("^"+t.re.src_email_name+"@"+t.re.src_host_strict,"i")),t.re.mailto.test(n)?n.match(t.re.mailto)[0].length:0}}},v="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",x="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");_.prototype.add=function(e,r){return this.__schemas__[e]=r,d(this),this},_.prototype.set=function(e){return this.__opts__=n(this.__opts__,e),this},_.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;var r,t,n,s,o,i,a,c,l;if(this.re.schema_test.test(e))for(a=this.re.schema_search,a.lastIndex=0;null!==(r=a.exec(e));)if(s=this.testSchemaAt(e,r[2],a.lastIndex)){this.__schema__=r[2],this.__index__=r.index+r[1].length,this.__last_index__=r.index+r[0].length+s;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=e.search(this.re.host_fuzzy_test),c>=0&&(this.__index__<0||c=0&&null!==(n=e.match(this.re.email_fuzzy))&&(o=n.index+n[1].length,i=n.index+n[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=i))),this.__index__>=0},_.prototype.pretest=function(e){return this.re.pretest.test(e)},_.prototype.testSchemaAt=function(e,r,t){return this.__compiled__[r.toLowerCase()]?this.__compiled__[r.toLowerCase()].validate(e,t,this):0},_.prototype.match=function(e){var r=0,t=[];this.__index__>=0&&this.__text_cache__===e&&(t.push(g(this,r)),r=this.__last_index__);for(var n=r?e.slice(r):e;this.test(n);)t.push(g(this,r)),n=n.slice(this.__last_index__),r+=this.__last_index__;return t.length?t:null},_.prototype.tlds=function(e,r){return e=Array.isArray(e)?e:[e],r?(this.__tlds__=this.__tlds__.concat(e).sort().filter(function(e,r,t){return e!==t[r-1]}).reverse(),d(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,d(this),this)},_.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},r.exports=_},{"./lib/re":55}],55:[function(e,r,t){"use strict";var n=t.src_Any=e("uc.micro/properties/Any/regex").source,s=t.src_Cc=e("uc.micro/categories/Cc/regex").source,o=t.src_Z=e("uc.micro/categories/Z/regex").source,i=t.src_P=e("uc.micro/categories/P/regex").source,a=t.src_ZPCc=[o,i,s].join("|"),c=t.src_ZCc=[o,s].join("|"),l="(?:(?!"+a+")"+n+")",u="(?:(?![0-9]|"+a+")"+n+")",p=t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";t.src_auth="(?:(?:(?!"+c+").)+@)?";var h=t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",f=t.src_host_terminator="(?=$|"+a+")(?!-|_|:\\d|\\.-|\\.(?!$|"+a+"))",d=t.src_path="(?:[/?#](?:(?!"+c+"|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+c+"|\\]).)*\\]|\\((?:(?!"+c+"|[)]).)*\\)|\\{(?:(?!"+c+'|[}]).)*\\}|\\"(?:(?!'+c+'|["]).)+\\"|\\\'(?:(?!'+c+"|[']).)+\\'|\\'(?="+l+").|\\.{2,3}[a-zA-Z0-9%/]|\\.(?!"+c+"|[.]).|\\-(?!--(?:[^-]|$))(?:-*)|\\,(?!"+c+").|\\!(?!"+c+"|[!]).|\\?(?!"+c+"|[?]).)+|\\/)?",m=t.src_email_name='[\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]+',g=t.src_xn="xn--[a-z0-9\\-]{1,59}",_=t.src_domain_root="(?:"+g+"|"+u+"{1,63})",k=t.src_domain="(?:"+g+"|(?:"+l+")|(?:"+l+"(?:-(?!-)|"+l+"){0,61}"+l+"))",b=t.src_host="(?:"+p+"|(?:(?:(?:"+k+")\\.)*"+_+"))",v=t.tpl_host_fuzzy="(?:"+p+"|(?:(?:(?:"+k+")\\.)+(?:%TLDS%)))",x=t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+k+")\\.)+(?:%TLDS%))";t.src_host_strict=b+f;var y=t.tpl_host_fuzzy_strict=v+f;t.src_host_port_strict=b+h+f;var C=t.tpl_host_port_fuzzy_strict=v+h+f,A=t.tpl_host_port_no_ip_fuzzy_strict=x+h+f;t.tpl_host_fuzzy_test="localhost|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+a+"|$))",t.tpl_email_fuzzy="(^|>|"+c+")("+m+"@"+y+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|]|"+a+"))((?![$+<=>^`|])"+C+d+")", +t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|]|"+a+"))((?![$+<=>^`|])"+A+d+")"},{"uc.micro/categories/Cc/regex":61,"uc.micro/categories/P/regex":63,"uc.micro/categories/Z/regex":64,"uc.micro/properties/Any/regex":66}],56:[function(e,r,t){"use strict";function n(e){var r,t,n=o[e];if(n)return n;for(n=o[e]=[],r=0;128>r;r++)t=String.fromCharCode(r),n.push(t);for(r=0;rr;r+=3)s=parseInt(e.slice(r+1,r+3),16),128>s?l+=t[s]:192===(224&s)&&n>r+3&&(o=parseInt(e.slice(r+4,r+6),16),128===(192&o))?(c=s<<6&1984|63&o,l+=128>c?"\ufffd\ufffd":String.fromCharCode(c),r+=3):224===(240&s)&&n>r+6&&(o=parseInt(e.slice(r+4,r+6),16),i=parseInt(e.slice(r+7,r+9),16),128===(192&o)&&128===(192&i))?(c=s<<12&61440|o<<6&4032|63&i,l+=2048>c||c>=55296&&57343>=c?"\ufffd\ufffd\ufffd":String.fromCharCode(c),r+=6):240===(248&s)&&n>r+9&&(o=parseInt(e.slice(r+4,r+6),16),i=parseInt(e.slice(r+7,r+9),16),a=parseInt(e.slice(r+10,r+12),16),128===(192&o)&&128===(192&i)&&128===(192&a))?(c=s<<18&1835008|o<<12&258048|i<<6&4032|63&a,65536>c||c>1114111?l+="\ufffd\ufffd\ufffd\ufffd":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),r+=9):l+="\ufffd";return l})}var o={};s.defaultChars=";/?:@&=+$,#",s.componentChars="",r.exports=s},{}],57:[function(e,r,t){"use strict";function n(e){var r,t,n=o[e];if(n)return n;for(n=o[e]=[],r=0;128>r;r++)t=String.fromCharCode(r),/^[0-9a-z]$/i.test(t)?n.push(t):n.push("%"+("0"+r.toString(16).toUpperCase()).slice(-2));for(r=0;ro;o++)if(a=e.charCodeAt(o),t&&37===a&&i>o+2&&/^[0-9a-f]{2}$/i.test(e.slice(o+1,o+3)))u+=e.slice(o,o+3),o+=2;else if(128>a)u+=l[a];else if(a>=55296&&57343>=a){if(a>=55296&&56319>=a&&i>o+1&&(c=e.charCodeAt(o+1),c>=56320&&57343>=c)){u+=encodeURIComponent(e[o]+e[o+1]),o++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[o]);return u}var o={};s.defaultChars=";/?:@&=+$,-_.!~*'()#",s.componentChars="-_.!~*'()",r.exports=s},{}],58:[function(e,r,t){"use strict";r.exports=function(e){var r="";return r+=e.protocol||"",r+=e.slashes?"//":"",r+=e.auth?e.auth+"@":"",r+=e.hostname&&-1!==e.hostname.indexOf(":")?"["+e.hostname+"]":e.hostname||"",r+=e.port?":"+e.port:"",r+=e.pathname||"",r+=e.search||"",r+=e.hash||""}},{}],59:[function(e,r,t){"use strict";r.exports.encode=e("./encode"),r.exports.decode=e("./decode"),r.exports.format=e("./format"),r.exports.parse=e("./parse")},{"./decode":56,"./encode":57,"./format":58,"./parse":60}],60:[function(e,r,t){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}function s(e,r){if(e&&e instanceof n)return e;var t=new n;return t.parse(e,r),t}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,a=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,c=["<",">",'"',"`"," ","\r","\n"," "],l=["{","}","|","\\","^","`"].concat(c),u=["'"].concat(l),p=["%","/","?",";","#"].concat(u),h=["/","?","#"],f=255,d=/^[+a-z0-9A-Z_-]{0,63}$/,m=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,g={javascript:!0,"javascript:":!0},_={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(e,r){var t,n,s,i,c,l=e;if(l=l.trim(),!r&&1===e.split("#").length){var u=a.exec(l);if(u)return this.pathname=u[1],u[2]&&(this.search=u[2]),this}var k=o.exec(l);if(k&&(k=k[0],s=k.toLowerCase(),this.protocol=k,l=l.substr(k.length)),(r||k||l.match(/^\/\/[^@\/]+@[^@\/]+/))&&(c="//"===l.substr(0,2),!c||k&&g[k]||(l=l.substr(2),this.slashes=!0)),!g[k]&&(c||k&&!_[k])){var b=-1;for(t=0;ti)&&(b=i);var v,x;for(x=-1===b?l.lastIndexOf("@"):l.lastIndexOf("@",b),-1!==x&&(v=l.slice(0,x),l=l.slice(x+1),this.auth=v),b=-1,t=0;ti)&&(b=i);-1===b&&(b=l.length),":"===l[b-1]&&b--;var y=l.slice(0,b);l=l.slice(b),this.parseHost(y),this.hostname=this.hostname||"";var C="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!C){var A=this.hostname.split(/\./);for(t=0,n=A.length;n>t;t++){var w=A[t];if(w&&!w.match(d)){for(var q="",D=0,E=w.length;E>D;D++)q+=w.charCodeAt(D)>127?"x":w[D];if(!q.match(d)){var S=A.slice(0,t),F=A.slice(t+1),L=w.match(m);L&&(S.push(L[1]),F.unshift(L[2])),F.length&&(l=F.join(".")+l),this.hostname=S.join(".");break}}}}this.hostname.length>f&&(this.hostname=""),C&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var z=l.indexOf("#");-1!==z&&(this.hash=l.substr(z),l=l.slice(0,z));var T=l.indexOf("?");return-1!==T&&(this.search=l.substr(T),l=l.slice(0,T)),l&&(this.pathname=l),_[s]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(e){var r=i.exec(e);r&&(r=r[0],":"!==r&&(this.port=r.substr(1)),e=e.substr(0,e.length-r.length)),e&&(this.hostname=e)},r.exports=s},{}],61:[function(e,r,t){r.exports=/[\0-\x1F\x7F-\x9F]/},{}],62:[function(e,r,t){r.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},{}],63:[function(e,r,t){r.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDE38-\uDE3D]|\uD805[\uDCC6\uDDC1-\uDDC9\uDE41-\uDE43]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F/},{}],64:[function(e,r,t){r.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},{}],65:[function(e,r,t){r.exports.Any=e("./properties/Any/regex"),r.exports.Cc=e("./categories/Cc/regex"),r.exports.Cf=e("./categories/Cf/regex"),r.exports.P=e("./categories/P/regex"),r.exports.Z=e("./categories/Z/regex")},{"./categories/Cc/regex":61,"./categories/Cf/regex":62,"./categories/P/regex":63,"./categories/Z/regex":64,"./properties/Any/regex":66}],66:[function(e,r,t){r.exports=/[\0-\uD7FF\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF]/},{}],67:[function(e,r,t){"use strict";r.exports=e("./lib/")},{"./lib/":9}]},{},[67])(67)}); diff --git a/documize/section/asana.go b/documize/section/asana.go new file mode 100644 index 00000000..22e22643 --- /dev/null +++ b/documize/section/asana.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type asana struct { +} + +func init() { + sectionsMap["asana"] = &asana{} +} + +func (*asana) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "3a3f4661-2195-46b1-a69c-546eaccb5f93" + section.Title = "Asana" + section.Description = "Embed tasks and projects" + section.ContentType = "asana" + section.IconFile = "sections/asana.png" + section.Preview = true + + return section +} + +// Command stub. +func (*asana) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*asana) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*asana) Refresh(config, data string) string { + return data +} diff --git a/documize/section/code.go b/documize/section/code.go index b4327e2a..423a191c 100644 --- a/documize/section/code.go +++ b/documize/section/code.go @@ -27,9 +27,9 @@ func (*code) Meta() TypeMeta { section.ID = "4f6f2b02-8397-483d-9bb9-eea1fef13304" section.Title = "Code" - section.Description = "Code snippets supporting 50+ languages" + section.Description = "Formatted code samples supporting 50+ languages" section.ContentType = "code" - section.IconFontLigature = "code" + section.IconFile = "sections/code.png" section.Order = 9997 return section diff --git a/documize/section/docusign.go b/documize/section/docusign.go new file mode 100644 index 00000000..3945a96a --- /dev/null +++ b/documize/section/docusign.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type docusign struct { +} + +func init() { + sectionsMap["docusign"] = &docusign{} +} + +func (*docusign) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "a195f983-4bd7-412b-879e-2d71d2f822a7" + section.Title = "DocuSign" + section.Description = "Sign and approve documents" + section.ContentType = "docusign" + section.IconFile = "sections/docusign.png" + section.Preview = true + + return section +} + +// Command stub. +func (*docusign) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*docusign) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*docusign) Refresh(config, data string) string { + return data +} diff --git a/documize/section/gemini.go b/documize/section/gemini.go index 31e13c1a..05008ab4 100644 --- a/documize/section/gemini.go +++ b/documize/section/gemini.go @@ -53,10 +53,9 @@ func (*gemini) Meta() TypeMeta { section := TypeMeta{} section.ID = "23b133f9-4020-4616-9291-a98fb939735f" section.Title = "Gemini" - section.Description = "Display work items and tickets from Gemini workspaces" + section.Description = "Display work items and tickets from workspaces" section.ContentType = "gemini" - section.IconFontLigature = "" - section.IconFilePath = "sections/gemini.png" + section.IconFile = "sections/gemini.png" return section } diff --git a/documize/section/github.go b/documize/section/github.go new file mode 100644 index 00000000..6e71b42d --- /dev/null +++ b/documize/section/github.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type github struct { +} + +func init() { + sectionsMap["github"] = &github{} +} + +func (*github) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "38c0e4c5-291c-415e-8a4d-262ee80ba5df" + section.Title = "GitHub" + section.Description = "Code commits and branches" + section.ContentType = "github" + section.IconFile = "sections/github.png" + section.Preview = true + + return section +} + +// Command stub. +func (*github) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*github) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*github) Refresh(config, data string) string { + return data +} diff --git a/documize/section/intercom.go b/documize/section/intercom.go new file mode 100644 index 00000000..3f2900c0 --- /dev/null +++ b/documize/section/intercom.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type intercom struct { +} + +func init() { + sectionsMap["intercom"] = &intercom{} +} + +func (*intercom) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "bf40314d-3b3c-41f9-b283-517da56aa7e4" + section.Title = "Intercom" + section.Description = "Application events and metrics" + section.ContentType = "intercom" + section.IconFile = "sections/intercom.png" + section.Preview = true + + return section +} + +// Command stub. +func (*intercom) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*intercom) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*intercom) Refresh(config, data string) string { + return data +} diff --git a/documize/section/mailchimp.go b/documize/section/mailchimp.go new file mode 100644 index 00000000..286e7224 --- /dev/null +++ b/documize/section/mailchimp.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type mailchimp struct { +} + +func init() { + sectionsMap["mailchimp"] = &mailchimp{} +} + +func (*mailchimp) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "feab735b-2d02-4bb1-b501-ced825e22465" + section.Title = "Mailchimp" + section.Description = "Email campaigns and results" + section.ContentType = "mailchimp" + section.IconFile = "sections/mailchimp.png" + section.Preview = true + + return section +} + +// Command stub. +func (*mailchimp) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*mailchimp) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*mailchimp) Refresh(config, data string) string { + return data +} diff --git a/documize/section/markdown.go b/documize/section/markdown.go index cceb4a2c..732a03e0 100644 --- a/documize/section/markdown.go +++ b/documize/section/markdown.go @@ -18,9 +18,9 @@ func (*markdown) Meta() TypeMeta { section.ID = "1470bb4a-36c6-4a98-a443-096f5658378b" section.Title = "Markdown" - section.Description = "CommonMark based markdown editing" + section.Description = "CommonMark based markdown content with preview" section.ContentType = "markdown" - section.IconFontLigature = "functions" + section.IconFile = "sections/markdown.png" section.Order = 9998 return section diff --git a/documize/section/salesforce.go b/documize/section/salesforce.go new file mode 100644 index 00000000..c765ea11 --- /dev/null +++ b/documize/section/salesforce.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type salesforce struct { +} + +func init() { + sectionsMap["salesforce"] = &salesforce{} +} + +func (*salesforce) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "2240c0f8-b795-47b0-bcd4-5f6b171a2ffd" + section.Title = "Salesforce" + section.Description = "Customers, contacts and leads" + section.ContentType = "salesforce" + section.IconFile = "sections/salesforce.png" + section.Preview = true + + return section +} + +// Command stub. +func (*salesforce) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*salesforce) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*salesforce) Refresh(config, data string) string { + return data +} diff --git a/documize/section/section.go b/documize/section/section.go index b73c5983..eb747260 100644 --- a/documize/section/section.go +++ b/documize/section/section.go @@ -14,13 +14,13 @@ var sectionsMap = make(map[string]section) // TypeMeta details a "smart section" that represents a "page" in a document. type TypeMeta struct { - ID string `json:"id"` - Order int `json:"order"` - ContentType string `json:"contentType"` - Title string `json:"title"` - Description string `json:"description"` - IconFontLigature string `json:"iconFont"` // e.g. 'done_all' see https://design.google.com/icons/ - IconFilePath string `json:"iconFile"` + ID string `json:"id"` + Order int `json:"order"` + ContentType string `json:"contentType"` + Title string `json:"title"` + Description string `json:"description"` + IconFile string `json:"iconFile"` + Preview bool `json:"preview"` // coming soon! } // section represents a 'page' in a document. diff --git a/documize/section/section_test.go b/documize/section/section_test.go index eb73bff9..88f21602 100644 --- a/documize/section/section_test.go +++ b/documize/section/section_test.go @@ -32,7 +32,6 @@ func (*testsection) Meta() TypeMeta { section.Title = "TestSection" section.Description = "A Test Section" section.ContentType = "testsection" - section.IconFontLigature = "border_all" return section } diff --git a/documize/section/stripe.go b/documize/section/stripe.go new file mode 100644 index 00000000..9a9c9dde --- /dev/null +++ b/documize/section/stripe.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type stripe struct { +} + +func init() { + sectionsMap["stripe"] = &stripe{} +} + +func (*stripe) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "cb597d8d-c724-4034-b272-e8d9e261444f" + section.Title = "Stripe" + section.Description = "Online and mobile payments, refunds and transfers" + section.ContentType = "stripe" + section.IconFile = "sections/stripe.png" + section.Preview = true + + return section +} + +// Command stub. +func (*stripe) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*stripe) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*stripe) Refresh(config, data string) string { + return data +} diff --git a/documize/section/table.go b/documize/section/table.go index 1b8ff4b6..09434502 100644 --- a/documize/section/table.go +++ b/documize/section/table.go @@ -16,9 +16,9 @@ func (*table) Meta() TypeMeta { section.ID = "81a2ea93-2dfc-434d-841e-54b832492c92" section.Title = "Table" - section.Description = "Your standard table" + section.Description = "Table with rows, columns and formatting" section.ContentType = "table" - section.IconFontLigature = "border_all" + section.IconFile = "sections/table.png" section.Order = 9996 return section diff --git a/documize/section/trello.go b/documize/section/trello.go index d999b9e2..aae7cf64 100644 --- a/documize/section/trello.go +++ b/documize/section/trello.go @@ -34,9 +34,9 @@ func (*trello) Meta() TypeMeta { section := TypeMeta{} section.ID = "c455a552-202e-441c-ad79-397a8152920b" section.Title = "Trello" - section.Description = "Trello boards" + section.Description = "Embed cards from boards and lists" section.ContentType = "trello" - section.IconFontLigature = "dashboard" + section.IconFile = "sections/trello.png" return section } @@ -163,46 +163,6 @@ func (*trello) Refresh(config, data string) string { } // Helpers -// func cards(w http.ResponseWriter, r *http.Request) { -// defer r.Body.Close() -// body, err := ioutil.ReadAll(r.Body) -// -// if err != nil { -// writeMessage(w, "trello", "Bad body") -// return -// } -// -// var config = trelloConfig{} -// err = json.Unmarshal(body, &config) -// -// if err != nil { -// writeError(w, "trello", err) -// return -// } -// -// config.Clean() -// -// if len(config.AppKey) == 0 { -// writeMessage(w, "trello", "Missing appKey") -// return -// } -// -// if len(config.Token) == 0 { -// writeMessage(w, "trello", "Missing token") -// return -// } -// -// render, err := getCards(config) -// -// if err != nil { -// fmt.Println(err) -// writeError(w, "trello", err) -// return -// } -// -// writeJSON(w, render) -// } - func getBoards(config trelloConfig) (boards []trelloBoard, err error) { req, err := http.NewRequest("GET", fmt.Sprintf("https://api.trello.com/1/members/me/boards?fields=id,name,url,closed,prefs,idOrganization&key=%s&token=%s", config.AppKey, config.Token), nil) client := &http.Client{} @@ -441,7 +401,3 @@ const trelloTemplate = ` {{end}}
` - -/* -does server side load up all data? YES!!?? -*/ diff --git a/documize/section/wysiwyg.go b/documize/section/wysiwyg.go index d1d053d1..e06f1514 100644 --- a/documize/section/wysiwyg.go +++ b/documize/section/wysiwyg.go @@ -22,7 +22,7 @@ func (*wysiwyg) Meta() TypeMeta { section.Title = "Rich Text" section.Description = "WYSIWYG editing with cut-paste image support" section.ContentType = "wysiwyg" - section.IconFontLigature = "format_bold" + section.IconFile = "sections/wysiwyg.png" section.Order = 9999 return section diff --git a/documize/section/zendesk.go b/documize/section/zendesk.go new file mode 100644 index 00000000..8ec5af93 --- /dev/null +++ b/documize/section/zendesk.go @@ -0,0 +1,51 @@ +// Copyright 2016 Documize Inc. . 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 . +// +// https://documize.com + +package section + +import ( + "net/http" +) + +type zendesk struct { +} + +func init() { + sectionsMap["zendesk"] = &zendesk{} +} + +func (*zendesk) Meta() TypeMeta { + section := TypeMeta{} + + section.ID = "05b02331-4ca2-4fc2-a31a-82bc45dceafe" + section.Title = "Zendesk" + section.Description = "Show customer support tickets" + section.ContentType = "zendesk" + section.IconFile = "sections/zendesk.png" + section.Preview = true + + return section +} + +// Command stub. +func (*zendesk) Command(w http.ResponseWriter, r *http.Request) { + writeEmpty(w) +} + +// Render just sends back HMTL as-is. +func (*zendesk) Render(config, data string) string { + return data +} + +// Refresh just sends back data as-is. +func (*zendesk) Refresh(config, data string) string { + return data +} From 7f5df6e2abf2dfd05af977217d057cb109c6ff91 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 14:02:02 -0700 Subject: [PATCH 13/24] revised smart section icons --- .../components/section/trello/type-editor.js | 4 ++-- app/public/sections/asana.png | Bin 3013 -> 3948 bytes app/public/sections/github.png | Bin 2526 -> 3746 bytes app/public/sections/mailchimp.png | Bin 5186 -> 5710 bytes app/public/sections/richtext.png | Bin 0 -> 1549 bytes app/public/sections/salesforce.png | Bin 3166 -> 3650 bytes app/public/sections/stripe.png | Bin 2495 -> 2845 bytes 7 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 app/public/sections/richtext.png diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index 740e8516..b5297996 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -246,7 +246,7 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, } }); -// show who owner is -- logout -// key really required? // no private boards? +// show who owner is -- logout +// app key really required? // pass/save global section config? diff --git a/app/public/sections/asana.png b/app/public/sections/asana.png index 56fd9f61e9e65420f062750d7c9628e6b8f623fe..723bf76887a37ab39e823db2846e00a81b8b0af5 100644 GIT binary patch delta 3088 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 diff --git a/app/public/sections/github.png b/app/public/sections/github.png index 322a6c24682f08936518c06f5a8c7d78006f8f9e..b4163da9eb782c82b1d75a2cec80ed5874d6dbed 100644 GIT binary patch delta 2882 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 delta 1653 zcmV-*28#Kj9o`eLUIGh4MK(b&LNPKiH8zuJ0x=6iMK(b&LNPHhH8zu_0(&H3H!(Ld zHaRveIWlHpEi^MXH!V12H!>|`H!x*lVPa)8Vl^<6L<534BU!=}MMlW5Z0V@PS zh2)|lnuRGUh=BtR<(QgTY0m4ewbhfyv-iLExpsC7mWuz{|NhQ@*6^+MTLA#um0;Ar zQ4>(TQ3a-dQfQBvnHl!w%NO?J#}Br=yv)|u*V)mdN1467J#%nyV6LvN?8J!^%-Y(T znIQyj8uee)Qq)1i3sI9%SHKMU{{1_=dGiMH^Yh`{xpUy?=m>%!!0wBT)XK^V5Ils2 zhC+6BHZ(Ri!uYt?|BB+y$tiw6%L00xvr0q<8j^^J`U9;9t1yRy9vxw*NTf!(jk$;p5jNEWp$ z=*-N2%s&EnPZJUnV0Cp>J?O&1!aoXlPg7D-)Pb(9u9n=u*47rn!otAK&F!}Wb8&GI z_jPu5mR!Gc=MEqA*w`32IXOu_OzuJfGBq^?_wL<;$jHb;fej8076DP-r+ptkek^H+ z6%^jRduIgN3U=!_{kn1E2CJ#5F{!0k(O6r5TN}G{>5}1pTU%S~<;#~03k3W8`7=9t z@+9-{@L;D-of6Bnjg1XMFl=FAfsKxiGOU0M0gC^>b?X+(%F1HLjvX`XH#9WFbUK~* z%t65eV%^={?8uQL2Hqe_OG^v)D@0(D{`K|iSNQnxBOuq{CfCi)O_-dVgz4#N$#p7! z>%7AC@Zm#a_n-~&6uBk$+qZ9ENumAy{QP7woIZUT*4Ea3f$r?=;sCr_S;wj%w+AmH-Dm6a9N+}zA8DdXeg3{RVD^XSo|oj;HR0|pTH6MA`h!QkMa zMNgUt6Qw>L4oZt;M^VW&B#!*_=~K{uLOMD+MDESQ^Wwz|U=n;I0o03@`zGm1`6m8_TqmGiS~)bV=EDDpmp}dszcI zVP9WgO+jON6|1J4P~$962h9^h>C{N*lzHy>^XE?{V3pyH1{N0=H3dzer1-~we$FG% zJc1`gcC-|lnINr@T_=(yDETZlwVHzd@Zke@od!PwQA(a*!q*gZRaF&t9jhV}qNAg^ zMwAlYzJ03+VB#N0k-0W>$in&a=eb7YUj+pPnt;~p^^BJoNUmJD!Wa?rh(t+h z$Vh~S*x2uo-rinFOG{JT3>Oy{|LR<*)xn0;XefxmXBa8aobBKSF)=YvUS1CG-@g~R zHjRFHLW38w>+0$PVwQ1napK{q1&s9s=H}*%M+lXbl}1L`Q5yz=G>)ZzK2dH%jA+2f z=Ypme9%k&2lapgQ_rUTA5fKq44FC8 z4oDRZYdYSY3*~Q`%JWXd)6M{rMn*=U ztgK9=l;)1U$lWj`7}c0>@8YT0#V2C@Pk;dc?*{%c-lfYI00000NkvXXu0mjfzym8J diff --git a/app/public/sections/mailchimp.png b/app/public/sections/mailchimp.png index 1f51e24f347aaeb8c081ad464ee310dfb9173ce0..395788bd047bfa66911b74de8189f2d4ecb440d3 100644 GIT binary patch delta 4864 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 delta 2298 zcmV|`H!x*lVPa)8Vl^<6L<53<^N)=|000PlNkl3&289jFvdpzT@$9N+K8%P7L;zGcnEGB_Q3ec({0i>!))kIAfMTwLyC`yAGiC?Xv zwo=!WN|B0Esy3;ms)<4qCm{$Dz$QTC*r9-1O7OmnGv3Cty?1-=Tg*J$V~@d6?JJ&n z^WJ^;p8I`&=li~M--DDA*0F}iK^~nvG`TREZs9p-;WMz>fOqqV%7xt&zFi8h;Gb#$ z=Xm(B@LQBetpfc=o;-%d(_T`bJ9$#Eh(LEK&>Bx%nR*PyH8l0cajYkX_K_3<9)aqR z7h5WPs42>YpTB2nDsF_BSI|;{mebuy>JqaxcB|^Sg@i#H|I$af|r_%><3juXduT zD^9?FSy)9qo+8-Wi*URq`@zAl6V^w0>sdWCelGMq%1G^{T48gyD&;DIN@oDR^V zNgbhsSD>lR!uIV9KxcQuwSJQquIt#f!jHy({y2IV;3gVjTo?4z=JH(Z<-&Hdk7trc z9H8H9kK)Uu27KP@12$_4NneBlF3q0~P*$KTD$#rQR{8PQ`^r(Cca5qJU%u55HM4{x zf{^yV1zG~#_^`Hyw`<`{RzDA@vsxL z^3ttEIVR7foEeC^ujyvrX@RDVq53eu-Pzh8)7(tI&o+fI&h+Xa!=9T1&Oy|Kngu{w z=ZtRp2~VvpK+O`5aqd`v-Oma%zgyyeg)K$cx1qoQuX6fCKV41~o{708j3S*zp;cq7 zu8n;$C+LLgs0xF6kU(zoyRg2*3m-43;JvNHgQ|SD0dy-%cUhjti105g@iMyEDXDQl zv%D`0xZvd&Pu3J*dC-gBHxHqhp1TE$MdS4Q9BB3i38H$Bx&#&FsOBo65X+ZetOXehLlj=;lhdEze`}_u!}JA{byH zh|y}#Yz$#FX%%9*|H+vM9$FJ105|%^Q}}b+7`|1Vk4qe53!nWa&y|e1@M!{nyBtOR zwo;txiKG7V7-c{qI-@BZx-^P^omF`>k_*K&#M7rfMMqSh$TY3tq-p8a!34Iy+6C#d z$}ing%yd%~@ZebIIF3+*Tw-SF7)}{p*h+;rMpv(5)q1450H^yBlqdqbZV8~0=25)+ z%f(T&g%cb*iM=NWvAxod!=J?PwSV?t^U^%rPETDO(eUktUW1me{Wpq#?;P#{3nU&` z89)F2C5V^qE5mn>4ZzEM+dY~zBy7UszG5M#pc>Sa z(1eeDqQ*TFh7w-=F&#gDV&Huop`mQ~%V*0;G0)ll7%mSaOw!tooV~l!$1aY~{5OQ<&oBc*0JjH?qN!h9R0CuEIJ}%C(w*u5?y5k)^s5ne_v&MF>{K zgA=g4KAAvn@8^z30XFK)Zl;%s1TN&*bu^VwV`V^VH%Rl z4t;`t6%ek;?w)}HbC%dM&`!7Ri!_~0YLziK|FE?b57Myd>o+z5Cz#0ZuJ54ucTWX8 ztI(HDooq*cdRFffOyRYZ1<8ne0?lR6*D>H8W}(_q89=}*GHlcxHsTjs-&`zwqMwQj_$Fw*Bt%yMkE-tQU54^M<~rZ=7zXjY1HrOQstzR|UT z**}GFN>2vYnqn^+cUPh)cW&8b%5Ge}q-mqhIKvHpr`jC{>7L)T4x@!S!pxy!4l$*p z!tX|x+PDhKdrDh#%x7*Z#E&V+0@slaGrnO;Z)drHO|P`4y;ex)afU^(s_olU$f#d} z^Q>~GSp^4qO_l2PtgIzB@TMs%(5l1Z$NTZ(N5f{Y8Wc$jxXA&=QeR3De)W+mLk!J# z%L=rAsi7pkexwie7e|a;@->dyRa8s_SBML1WVux@DnE;sHE7F#_-$(h&o&Msk+iHU z(h32=Klb?`p1-REW%KZ&ab7^%EzG^z`^@d{@#q~(QKq`Fp)?2Em-`JRC-B*}>jM4% zZi^Q5j9&s4V3UjTn~Sn=!y;qH+l%r$;-dU1VvDqI3#`OjGZM@pX`ab~%0HU9z U;F5=J$N&HU07*qoM6N<$g3XYAP5=M^ diff --git a/app/public/sections/stripe.png b/app/public/sections/stripe.png index d0abc97a240ce13aedac7f4e5fbf362a929abce7..45daa9c4ba994e20c41da061e4e5d4db98cfd673 100644 GIT binary patch delta 1976 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 W-JyaVo4)`6002ovP6b4+LSTYMYZ%4= From 9ebeb7726bb914bde1c69d3f328fcf50ba571b9a Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 15:39:53 -0700 Subject: [PATCH 14/24] don't show personal trello boards --- .../components/section/trello/type-editor.js | 91 +++------- app/app/mixins/section.js | 15 +- .../components/section/trello/type-editor.hbs | 171 +++++++++--------- documize/section/trello.go | 50 ++++- 4 files changed, 166 insertions(+), 161 deletions(-) diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index b5297996..ba71ad3b 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -28,12 +28,14 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, try { config = JSON.parse(this.get('meta.config')); - } catch (e) {} + } + catch (e) {} if (is.empty(config)) { config = { appKey: "", token: "", + user: null, board: null, lists: [] }; @@ -41,10 +43,7 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, this.set('config', config); - if (this.get('config.appKey') !== "" && - this.get('config.token') !== "") { - console.log(this.get('isReadonly')); - console.log(this.get('isMine')); + if (this.get('config.appKey') !== "" && this.get('config.token') !== "") { this.send('auth'); } }, @@ -59,20 +58,21 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, let self = this; let boards = this.get('boards'); let board = this.get('config.board'); - let page = this.get('page'); + let page = this.get('page'); if (is.null(board) || is.undefined(board)) { if (boards.length) { board = boards[0]; this.set('config.board', board); } - } else { + } + 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'); + this.get('sectionService').fetch(page, "lists", self.get('config')) + .then(function(lists) { + let savedLists = self.get('config.lists'); if (savedLists === null) { savedLists = []; } @@ -88,39 +88,12 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, self.set('config.lists', lists); self.set('busy', false); - }, function(error) { //jshint ignore: line - 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); - }); - - - // Trello.get(`boards/${board.id}/lists/open?fields=id,name,url`, - // 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) { - // self.set('busy', false); - // self.set('authenticated', false); - // self.showNotification("Unable to fetch board lists"); - // console.log(error); - // }); + }); }, actions: { @@ -155,7 +128,7 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, } let self = this; - let page = this.get('page'); + let page = this.get('page'); self.set('busy', true); @@ -175,31 +148,23 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, self.set('config.token', Trello.token()); self.set('busy', true); - self.get('sectionService').fetch(page, "boards", self.get('config')) - .then(function(boards) { - self.set('busy', false); - self.set('boards', boards.filterBy("closed", false)); + 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); + }, function(error) { //jshint ignore: line + self.set('busy', false); self.set('authenticated', false); self.showNotification("Unable to fetch boards"); console.log(error); - }); - - // Trello.get("members/me/boards?fields=id,name,url,closed,prefs,idOrganization", - // function(boards) { - // self.set('busy', false); - // self.set('boards', boards.filterBy("closed", false)); - // self.getBoardLists(); - // }, - // function(error) { - // self.set('busy', false); - // self.set('authenticated', false); - // self.showNotification("Unable to fetch boards"); - // console.log(error); - // } - // ); + }); }, error: function(error) { self.set('busy', false); @@ -246,7 +211,5 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, } }); -// no private boards? -// show who owner is -- logout // app key really required? // pass/save global section config? diff --git a/app/app/mixins/section.js b/app/app/mixins/section.js index e40a6209..0b2b1725 100644 --- a/app/app/mixins/section.js +++ b/app/app/mixins/section.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -13,14 +13,15 @@ import Ember from 'ember'; export default Ember.Mixin.create({ isReadonly: function() { - if (this.get('page.userId') !== this.session.user.id) { - return "readonly"; - } else { + if (this.get('page.userId') === this.session.user.id) { return undefined; } + else { + return "readonly"; + } }.property('page'), isMine: function() { - return this.get('page.userId') !== this.session.user.id; + return this.get('page.userId') === this.session.user.id; }.property('page') -}); \ No newline at end of file +}); diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 1a1602a4..998a1e30 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -1,100 +1,95 @@ - -{{#section/base-editor document=document folder=folder page=page busy=busy tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} +{{#section/base-editor document=document folder=folder page=page busy=busy tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action + 'onAction')}} -
-
-
-
-
Authentication
-
Provide Trello App Key and then authenticate
-
-
- -
Use plain old button below to grab the magic key -- you might need to log into Trello
- {{focus-input id="trello-appkey" type="password" value=config.appKey}} -
- {{#if authenticated}} -
Logout
- {{else}} -
Get App Key
-
-
Authenticate
- {{/if}} - +
+
+
+
+
Authentication
+
Provide Trello App Key and then authenticate
+
+
+ +
Use plain old button below to grab the magic key -- you might need to log into Trello
+ {{focus-input id="trello-appkey" type="password" value=config.appKey readonly=isReadonly}} +
+ {{#if authenticated}} +
Logout {{config.user.fullName}}
+ {{else}} +
Get App Key
+
+
Authenticate
+ {{/if}} + +
-
-{{#if authenticated}} -
-
-
-
Select Board & Lists
-
Choose lists to include from board
-
-
- -
Select board
- {{ui-select id="boards-dropdown" - content=boards - action=(action 'onBoardChange') - optionValuePath="id" - optionLabelPath="name" - selection=config.board - readonly=isReadonly}} -
-
- -
Select lists to include
-
-
{{config.board.name}}
- {{#each config.lists as |list|}} -
- {{#if list.included}} - check_box - {{else}} - check_box_outline_blank - {{/if}} - {{list.name}} + {{#if authenticated}} +
+
+
+
Select Board & Lists
+
Choose lists to include from board
+
+
+ +
Select board
+ {{ui-select id="boards-dropdown" content=boards action=(action 'onBoardChange') optionValuePath="id" optionLabelPath="name" selection=config.board}} +
+
+ +
Select lists to include
+
+
{{config.board.name}}
+ {{#each config.lists as |list|}} +
+ {{#if list.included}} + check_box + {{else}} + check_box_outline_blank + {{/if}} + {{list.name}} +
+ {{/each}} +
- {{/each}} -
+
-
-
-{{/if}} - -{{/section/base-editor}} \ No newline at end of file + {{/if}} + +{{/section/base-editor}} diff --git a/documize/section/trello.go b/documize/section/trello.go index aae7cf64..e864ab70 100644 --- a/documize/section/trello.go +++ b/documize/section/trello.go @@ -176,10 +176,18 @@ func getBoards(config trelloConfig) (boards []trelloBoard, err error) { return nil, fmt.Errorf("error: HTTP status code %d", res.StatusCode) } - defer res.Body.Close() + b := []trelloBoard{} + defer res.Body.Close() dec := json.NewDecoder(res.Body) - err = dec.Decode(&boards) + err = dec.Decode(&b) + + // we only show open, team boards (not personal) + for _, b := range b { + if !b.Closed && len(b.OrganizationID) > 0 { + boards = append(boards, b) + } + } if err != nil { fmt.Println(err) @@ -267,6 +275,44 @@ func (c *trelloConfig) Clean() { c.Token = strings.TrimSpace(c.Token) } +// Trello objects based upon https://github.com/VojtechVitek/go-trello +type trelloMember struct { + ID string `json:"id"` + AvatarHash string `json:"avatarHash"` + Bio string `json:"bio"` + BioData struct { + Emoji interface{} `json:"emoji,omitempty"` + } `json:"bioData"` + Confirmed bool `json:"confirmed"` + FullName string `json:"fullName"` + PremOrgsAdminID []string `json:"idPremOrgsAdmin"` + Initials string `json:"initials"` + MemberType string `json:"memberType"` + Products []int `json:"products"` + Status string `json:"status"` + URL string `json:"url"` + Username string `json:"username"` + AvatarSource string `json:"avatarSource"` + Email string `json:"email"` + GravatarHash string `json:"gravatarHash"` + BoardsID []string `json:"idBoards"` + BoardsPinnedID []string `json:"idBoardsPinned"` + OrganizationsID []string `json:"idOrganizations"` + LoginTypes []string `json:"loginTypes"` + NewEmail string `json:"newEmail"` + OneTimeMessagesDismissed []string `json:"oneTimeMessagesDismissed"` + Prefs struct { + SendSummaries bool `json:"sendSummaries"` + MinutesBetweenSummaries int `json:"minutesBetweenSummaries"` + MinutesBeforeDeadlineToNotify int `json:"minutesBeforeDeadlineToNotify"` + ColorBlind bool `json:"colorBlind"` + Locale string `json:"locale"` + } `json:"prefs"` + Trophies []string `json:"trophies"` + UploadedAvatarHash string `json:"uploadedAvatarHash"` + PremiumFeatures []string `json:"premiumFeatures"` +} + type trelloBoard struct { ID string `json:"id"` Name string `json:"name"` From eeabd06faf762e4af5cecfd7a6020edf6877aaba Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 15:49:06 -0700 Subject: [PATCH 15/24] trello list width set to 300px --- .../components/section/trello/type-editor.js | 5 + .../components/section/trello/type-editor.hbs | 2 +- .../section/trello/type-renderer.hbs | 96 +++++++++---------- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index ba71ad3b..332eb5f9 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -23,6 +23,11 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, config: {}, boards: null, + boardStyle: Ember.computed('config.board', function() { + var color = this.get('config.board').prefs.backgroundColor; + return Ember.String.htmlSafe("background-color: " + color); + }), + didReceiveAttrs() { let config = {}; diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 998a1e30..11ba75e1 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -73,7 +73,7 @@
Select lists to include
-
+
{{config.board.name}}
{{#each config.lists as |list|}}
diff --git a/app/app/templates/components/section/trello/type-renderer.hbs b/app/app/templates/components/section/trello/type-renderer.hbs index db8fbf6b..4f2743a9 100644 --- a/app/app/templates/components/section/trello/type-renderer.hbs +++ b/app/app/templates/components/section/trello/type-renderer.hbs @@ -1,54 +1,54 @@ - -{{{page.body}}} \ No newline at end of file +{{{page.body}}} From 918cc8386db7cb4feedbeab08c415e81d23142f4 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 15:49:46 -0700 Subject: [PATCH 16/24] comments --- app/app/components/section/trello/type-editor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index 332eb5f9..b6953170 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -216,5 +216,5 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, } }); -// app key really required? -// pass/save global section config? +// app key per user +// global section config From edd4f8a56ca59daba52379358c554e7d24e2eb3b Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 15:57:10 -0700 Subject: [PATCH 17/24] bumped version and formatted sql --- documize/api/endpoint/router.go | 6 +++--- .../database/scripts/autobuild/db_00000.sql | 19 +++---------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/documize/api/endpoint/router.go b/documize/api/endpoint/router.go index dd28d736..a030826b 100644 --- a/documize/api/endpoint/router.go +++ b/documize/api/endpoint/router.go @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -30,7 +30,7 @@ const ( // AppVersion does what it says // Versioning scheme major.minor where "minor" is optional // e.g. 1, 2, 3, 4.1, 4.2, 5, 6, 7, 7.1, 8, 9, 10, ..... 127, 127.1, 128 - AppVersion = "11.2" + AppVersion = "12" ) var port, certFile, keyFile, forcePort2SSL string diff --git a/documize/database/scripts/autobuild/db_00000.sql b/documize/database/scripts/autobuild/db_00000.sql index 01459a66..40fd8e60 100644 --- a/documize/database/scripts/autobuild/db_00000.sql +++ b/documize/database/scripts/autobuild/db_00000.sql @@ -233,7 +233,7 @@ CREATE TABLE IF NOT EXISTS `revision` ( `refid` CHAR(16) NOT NULL COLLATE utf8_bin, `orgid` CHAR(16) NOT NULL COLLATE utf8_bin, `documentid` CHAR(16) NOT NULL COLLATE utf8_bin, - `ownerid` CHAR(16) DEFAULT '' COLLATE utf8_bin, + `ownerid` CHAR(16) DEFAULT '' COLLATE utf8_bin, `pageid` CHAR(16) NOT NULL COLLATE utf8_bin, `userid` CHAR(16) NOT NULL COLLATE utf8_bin, `contenttype` CHAR(20) NOT NULL DEFAULT 'wysiwyg', @@ -251,29 +251,16 @@ CREATE TABLE IF NOT EXISTS `revision` ( DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB; -/* -ALTER DATABASE documize CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE organization CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE account CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE user CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE revision CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE label CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE document CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -ALTER TABLE page CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; -*/ - DROP TABLE IF EXISTS `config`; CREATE TABLE IF NOT EXISTS `config` ( `key` CHAR(225) NOT NULL, `config` JSON, - UNIQUE INDEX `idx_config_area` (`key` ASC) ) ; + UNIQUE INDEX `idx_config_area` (`key` ASC) ) +DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; INSERT INTO `config` VALUES ('SMTP','{\"userid\": \"\",\"password\": \"\",\"host\": \"\",\"port\": \"\",\"sender\": \"\"}'); - INSERT INTO `config` VALUES ('FILEPLUGINS', '[{\"Comment\": \"Disable (or not) built-in html import (NOTE: no Plugin name)\",\"Disabled\": false,\"API\": \"Convert\",\"Actions\": [\"htm\",\"html\"]},{\"Comment\": \"Disable (or not) built-in Documize API import used from SDK (NOTE: no Plugin name)\",\"Disabled\": false,\"API\": \"Convert\",\"Actions\": [\"documizeapi\"]}]'); - INSERT INTO `config` VALUES ('LICENSE','{\"token\": \"\",\"endpoint\": \"https://api.documize.com\"}'); - INSERT INTO `config` VALUES ('META','{\"database\": \"db_00000.sql\"}'); From 1d29caef53381b44f22b1260ca8f6747feec6829 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 16:09:07 -0700 Subject: [PATCH 18/24] change test url back to localhost --- app/config/environment.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/config/environment.js b/app/config/environment.js index 52539dbf..e011edbc 100644 --- a/app/config/environment.js +++ b/app/config/environment.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -33,7 +33,7 @@ module.exports = function(environment) { ENV.APP.LOG_TRANSITIONS_INTERNAL = true; ENV.apiHost = "https://localhost:5001"; - ENV.apiHost = "https://demo1.dev:5001"; + // ENV.apiHost = "https://demo1.dev:5001"; } if (environment === 'test') { @@ -49,7 +49,8 @@ module.exports = function(environment) { // ENV.locationType = 'none'; // ENV.APP.rootElement = '#ember-testing'; - ENV.apiHost = "https://demo1.dev:5001"; + ENV.apiHost = "https://localhost:5001"; + // ENV.apiHost = "https://demo1.dev:5001"; } if (environment === 'production') { @@ -63,7 +64,6 @@ module.exports = function(environment) { } ENV.apiNamespace = "api"; - ENV.contentSecurityPolicy = null; // ENV.contentSecurityPolicy = { @@ -85,4 +85,4 @@ module.exports = function(environment) { // }; return ENV; -}; \ No newline at end of file +}; From 2d7f6e7e107cf44ae7472fed828cc8c9de79b000 Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Thu, 19 May 2016 16:50:26 -0700 Subject: [PATCH 19/24] removed per section trello auth --- .../components/section/trello/type-editor.js | 36 ++++--- app/app/styles/color.scss | 61 ++++++++---- .../components/section/trello/type-editor.hbs | 96 +++++++++---------- 3 files changed, 110 insertions(+), 83 deletions(-) diff --git a/app/app/components/section/trello/type-editor.js b/app/app/components/section/trello/type-editor.js index b6953170..9f8b0f37 100644 --- a/app/app/components/section/trello/type-editor.js +++ b/app/app/components/section/trello/type-editor.js @@ -22,9 +22,16 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, authenticated: false, config: {}, boards: null, + noBoards: false, boardStyle: Ember.computed('config.board', function() { - var color = this.get('config.board').prefs.backgroundColor; + 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); }), @@ -38,7 +45,7 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, if (is.empty(config)) { config = { - appKey: "", + appKey: "8e00492ee9a8934cfb8604d3a51f8f70", token: "", user: null, board: null, @@ -51,6 +58,11 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, if (this.get('config.appKey') !== "" && this.get('config.token') !== "") { this.send('auth'); } + else { + Ember.$.getScript("https://api.trello.com/1/client.js?key=" + this.get('config.appKey'), function() { + Trello.deauthorize(); + }); + } }, willDestroyElement() { @@ -65,6 +77,13 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, 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]; @@ -106,10 +125,6 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, return this.get('isDirty'); }, - getAppKey() { - window.open("https://trello.com/app-key", "Trello App Key", ""); - }, - onListCheckbox(id) { let lists = this.get('config.lists'); let list = lists.findBy('id', id); @@ -119,12 +134,6 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, } }, - logout() { - Trello.deauthorize(); - this.set('authenticated', false); - this.set('token', ''); - }, - auth() { if (this.get('config.appKey') === "") { $("#trello-appkey").addClass('error').focus(); @@ -215,6 +224,3 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, } } }); - -// app key per user -// global section config diff --git a/app/app/styles/color.scss b/app/app/styles/color.scss index b189241b..5e7204e1 100644 --- a/app/app/styles/color.scss +++ b/app/app/styles/color.scss @@ -1,19 +1,17 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com - $color-off-white: #f5f5f5; $color-off-black: #4c4c4c; $color-black: #000000; $color-white: #ffffff; - $color-primary: #2180cc; $color-link: #5680de; $color-red: #d9493c; @@ -27,11 +25,8 @@ $color-chip: #98A2AB; $color-input: #98A2AB; $color-stroke: #98A2AB; $color-card-active: #f7fcff; - - $color-border: #dbdbdb; $color-border2: #e2e2e2; - $color-primary-light: lighten($color-primary, 30%); $color-primary-dark: darken($color-primary, 10%); $color-gray2: #f0eeee; @@ -41,16 +36,42 @@ $color-shadow: #dbdbdb; $color-error: #c23c56; $color-highlight: #fff8dc; $color-warning: #990012; - -.background-color-white { background-color: $color-white; } -.color-white { color: $color-white; } -.color-off-white { color: $color-off-white; } -.color-black { color: $color-black; } -.color-off-black { color: $color-off-black; } -.background-color-primary { background-color: $color-primary; } -.color-primary { color: $color-primary; } -.color-link { color: $color-link; } -.color-blue { color: $color-blue; } -.color-red { color: $color-red; } -.color-green { color: $color-green; } -.color-gray { color: $color-gray; } +.background-color-white { + background-color: $color-white; +} +.color-white { + color: $color-white; +} +.color-off-white { + color: $color-off-white; +} +.color-black { + color: $color-black; +} +.color-off-black { + color: $color-off-black; +} +.background-color-primary { + background-color: $color-primary; +} +.color-primary { + color: $color-primary; +} +.color-link { + color: $color-link; +} +.color-blue { + color: $color-blue; +} +.color-red { + color: $color-red; +} +.color-green { + color: $color-green; +} +.color-gray { + color: $color-gray; +} +.color-error { + color: $color-error; +} diff --git a/app/app/templates/components/section/trello/type-editor.hbs b/app/app/templates/components/section/trello/type-editor.hbs index 11ba75e1..001cdcc0 100644 --- a/app/app/templates/components/section/trello/type-editor.hbs +++ b/app/app/templates/components/section/trello/type-editor.hbs @@ -32,64 +32,64 @@ } -{{#section/base-editor document=document folder=folder page=page busy=busy tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action - 'onAction')}} - -
-
-
-
-
Authentication
-
Provide Trello App Key and then authenticate
-
-
- -
Use plain old button below to grab the magic key -- you might need to log into Trello
- {{focus-input id="trello-appkey" type="password" value=config.appKey readonly=isReadonly}} -
- {{#if authenticated}} -
Logout {{config.user.fullName}}
- {{else}} -
Get App Key
-
-
Authenticate
- {{/if}} - -
-
+{{#section/base-editor document=document folder=folder page=page busy=busy + tip="Trello is the visual way to manage your projects and organize anything (https://trello.com)" + isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}} {{#if authenticated}} -
+ +
Select Board & Lists
Choose lists to include from board
-
- -
Select board
- {{ui-select id="boards-dropdown" content=boards action=(action 'onBoardChange') optionValuePath="id" optionLabelPath="name" selection=config.board}} -
-
- -
Select lists to include
-
-
{{config.board.name}}
- {{#each config.lists as |list|}} -
- {{#if list.included}} - check_box - {{else}} - check_box_outline_blank - {{/if}} - {{list.name}} -
- {{/each}} -
+ {{#if noBoards}} +
+
You have no team boards to share - personal boards are never shown.
-
+ {{else}} +
+ +
Select board
+ {{ui-select id="boards-dropdown" content=boards action=(action 'onBoardChange') optionValuePath="id" optionLabelPath="name" selection=config.board}} +
+
+ +
Select lists to include
+
+
{{config.board.name}}
+ {{#each config.lists as |list|}} +
+ {{#if list.included}} + check_box + {{else}} + check_box_outline_blank + {{/if}} + {{list.name}} +
+ {{/each}} +
+
+
+ {{/if}}
+ + {{else}} + +
+
+
+
+
Authentication
+
Click to authenticate with Trello
+
+
Authenticate
+
+
+
+ {{/if}} {{/section/base-editor}} From 434358088d4c2e3cd363d71270339c6b8e89ec7a Mon Sep 17 00:00:00 2001 From: Harvey Kandola Date: Fri, 20 May 2016 09:30:15 -0700 Subject: [PATCH 20/24] retina smart section icons --- app/app/styles/view/document/wizard.scss | 4 +++- .../components/document/page-wizard.hbs | 2 +- app/config/environment.js | 2 +- app/public/sections/asana@2x.png | Bin 0 -> 10138 bytes app/public/sections/code@2x.png | Bin 0 -> 2009 bytes app/public/sections/docusign@2x.png | Bin 0 -> 9274 bytes app/public/sections/gemini@2x.png | Bin 0 -> 5745 bytes app/public/sections/github@2x.png | Bin 0 -> 7351 bytes app/public/sections/intercom@2x.png | Bin 0 -> 9404 bytes app/public/sections/mailchimp@2x.png | Bin 0 -> 13263 bytes app/public/sections/markdown@2x.png | Bin 0 -> 2027 bytes app/public/sections/richtext.png | Bin 1549 -> 0 bytes app/public/sections/salesforce@2x.png | Bin 0 -> 8462 bytes app/public/sections/stripe@2x.png | Bin 0 -> 5116 bytes app/public/sections/suggest@2x.png | Bin 0 -> 2165 bytes app/public/sections/table@2x.png | Bin 0 -> 1882 bytes app/public/sections/trello@2x.png | Bin 0 -> 3635 bytes app/public/sections/wysiwyg@2x.png | Bin 0 -> 2094 bytes app/public/sections/zendesk@2x.png | Bin 0 -> 9227 bytes documize/section/asana.go | 1 - documize/section/code.go | 1 - documize/section/docusign.go | 1 - documize/section/gemini.go | 5 ++--- documize/section/github.go | 1 - documize/section/intercom.go | 1 - documize/section/mailchimp.go | 1 - documize/section/markdown.go | 5 ++--- documize/section/salesforce.go | 1 - documize/section/section.go | 5 ++--- documize/section/stripe.go | 1 - documize/section/table.go | 5 ++--- documize/section/trello.go | 1 - documize/section/wysiwyg.go | 5 ++--- documize/section/zendesk.go | 1 - 34 files changed, 15 insertions(+), 28 deletions(-) create mode 100644 app/public/sections/asana@2x.png create mode 100644 app/public/sections/code@2x.png create mode 100644 app/public/sections/docusign@2x.png create mode 100644 app/public/sections/gemini@2x.png create mode 100644 app/public/sections/github@2x.png create mode 100644 app/public/sections/intercom@2x.png create mode 100644 app/public/sections/mailchimp@2x.png create mode 100644 app/public/sections/markdown@2x.png delete mode 100644 app/public/sections/richtext.png create mode 100644 app/public/sections/salesforce@2x.png create mode 100644 app/public/sections/stripe@2x.png create mode 100644 app/public/sections/suggest@2x.png create mode 100644 app/public/sections/table@2x.png create mode 100644 app/public/sections/trello@2x.png create mode 100644 app/public/sections/wysiwyg@2x.png create mode 100644 app/public/sections/zendesk@2x.png diff --git a/app/app/styles/view/document/wizard.scss b/app/app/styles/view/document/wizard.scss index 11a90a78..015ea1af 100644 --- a/app/app/styles/view/document/wizard.scss +++ b/app/app/styles/view/document/wizard.scss @@ -51,6 +51,8 @@ text-align: center; margin: 17px 10px 0 20px; display: inline-block; + height: 45px; + width: 45px; } > .details { @@ -68,7 +70,7 @@ font-size: 0.7rem; color: #cc9933; display: inline-block; - margin-left: 10px; + margin-left: 10px; } } diff --git a/app/app/templates/components/document/page-wizard.hbs b/app/app/templates/components/document/page-wizard.hbs index 4f0c3867..dab886b4 100644 --- a/app/app/templates/components/document/page-wizard.hbs +++ b/app/app/templates/components/document/page-wizard.hbs @@ -18,7 +18,7 @@