From 0c8bed50dc25094a916332f64aa98eed576ccd6b Mon Sep 17 00:00:00 2001 From: doudoudzj Date: Tue, 16 Jul 2019 16:42:20 +0800 Subject: [PATCH] add summernote editor --- admin/controllers/news_add.php | 4 +- admin/controllers/tickets_details.php | 4 +- admin/views/footer.php | 70 ++-- admin/views/header.php | 5 +- admin/views/navbar.php | 72 ++-- admin/views/news_add.php | 15 +- admin/views/news_details.php | 8 +- admin/views/tickets_details.php | 6 +- assets/summernote/font/summernote.eot | Bin 0 -> 17342 bytes assets/summernote/font/summernote.ttf | Bin 0 -> 17156 bytes assets/summernote/font/summernote.woff | Bin 0 -> 10604 bytes assets/summernote/lang/summernote-ar-AR.js | 156 +++++++++ assets/summernote/lang/summernote-bg-BG.js | 156 +++++++++ assets/summernote/lang/summernote-ca-ES.js | 155 +++++++++ assets/summernote/lang/summernote-cs-CZ.js | 150 +++++++++ assets/summernote/lang/summernote-da-DK.js | 155 +++++++++ assets/summernote/lang/summernote-de-DE.js | 156 +++++++++ assets/summernote/lang/summernote-el-GR.js | 155 +++++++++ assets/summernote/lang/summernote-es-ES.js | 155 +++++++++ assets/summernote/lang/summernote-es-EU.js | 154 +++++++++ assets/summernote/lang/summernote-fa-IR.js | 155 +++++++++ assets/summernote/lang/summernote-fi-FI.js | 153 +++++++++ assets/summernote/lang/summernote-fr-FR.js | 155 +++++++++ assets/summernote/lang/summernote-gl-ES.js | 155 +++++++++ assets/summernote/lang/summernote-he-IL.js | 155 +++++++++ assets/summernote/lang/summernote-hr-HR.js | 155 +++++++++ assets/summernote/lang/summernote-hu-HU.js | 155 +++++++++ assets/summernote/lang/summernote-id-ID.js | 155 +++++++++ assets/summernote/lang/summernote-it-IT.js | 155 +++++++++ assets/summernote/lang/summernote-ja-JP.js | 155 +++++++++ assets/summernote/lang/summernote-ko-KR.js | 157 +++++++++ assets/summernote/lang/summernote-lt-LT.js | 155 +++++++++ assets/summernote/lang/summernote-lt-LV.js | 155 +++++++++ assets/summernote/lang/summernote-mn-MN.js | 157 +++++++++ assets/summernote/lang/summernote-nb-NO.js | 154 +++++++++ assets/summernote/lang/summernote-nl-NL.js | 155 +++++++++ assets/summernote/lang/summernote-pl-PL.js | 155 +++++++++ assets/summernote/lang/summernote-pt-BR.js | 156 +++++++++ assets/summernote/lang/summernote-pt-PT.js | 155 +++++++++ assets/summernote/lang/summernote-ro-RO.js | 155 +++++++++ assets/summernote/lang/summernote-ru-RU.js | 155 +++++++++ assets/summernote/lang/summernote-sk-SK.js | 153 +++++++++ assets/summernote/lang/summernote-sl-SI.js | 155 +++++++++ .../summernote/lang/summernote-sr-RS-Latin.js | 155 +++++++++ assets/summernote/lang/summernote-sr-RS.js | 155 +++++++++ assets/summernote/lang/summernote-sv-SE.js | 155 +++++++++ assets/summernote/lang/summernote-ta-IN.js | 155 +++++++++ assets/summernote/lang/summernote-th-TH.js | 155 +++++++++ assets/summernote/lang/summernote-tr-TR.js | 155 +++++++++ assets/summernote/lang/summernote-uk-UA.js | 155 +++++++++ assets/summernote/lang/summernote-uz-UZ.js | 112 +++++++ assets/summernote/lang/summernote-vi-VN.js | 155 +++++++++ assets/summernote/lang/summernote-zh-CN.js | 155 +++++++++ assets/summernote/lang/summernote-zh-HK.js | 155 +++++++++ assets/summernote/lang/summernote-zh-SG.js | 155 +++++++++ assets/summernote/lang/summernote-zh-TW.js | 155 +++++++++ .../databasic/summernote-ext-databasic.css | 16 + .../databasic/summernote-ext-databasic.js | 292 ++++++++++++++++ .../plugin/hello/summernote-ext-hello.js | 81 +++++ .../summernote-ext-specialchars.js | 312 ++++++++++++++++++ assets/summernote/summernote.css | 1 + assets/summernote/summernote.min.js | 3 + clientarea/controllers/tickets_add.php | 4 +- clientarea/controllers/tickets_details.php | 4 +- clientarea/views/footer.php | 15 + clientarea/views/header.php | 3 + clientarea/views/tickets_add.php | 2 +- clientarea/views/tickets_details.php | 8 +- data/language/{ko => ko-KR}/language.php | 0 library/lang.class.php | 27 +- 70 files changed, 7781 insertions(+), 100 deletions(-) create mode 100644 assets/summernote/font/summernote.eot create mode 100644 assets/summernote/font/summernote.ttf create mode 100644 assets/summernote/font/summernote.woff create mode 100644 assets/summernote/lang/summernote-ar-AR.js create mode 100644 assets/summernote/lang/summernote-bg-BG.js create mode 100644 assets/summernote/lang/summernote-ca-ES.js create mode 100644 assets/summernote/lang/summernote-cs-CZ.js create mode 100644 assets/summernote/lang/summernote-da-DK.js create mode 100644 assets/summernote/lang/summernote-de-DE.js create mode 100644 assets/summernote/lang/summernote-el-GR.js create mode 100644 assets/summernote/lang/summernote-es-ES.js create mode 100644 assets/summernote/lang/summernote-es-EU.js create mode 100644 assets/summernote/lang/summernote-fa-IR.js create mode 100644 assets/summernote/lang/summernote-fi-FI.js create mode 100644 assets/summernote/lang/summernote-fr-FR.js create mode 100644 assets/summernote/lang/summernote-gl-ES.js create mode 100644 assets/summernote/lang/summernote-he-IL.js create mode 100644 assets/summernote/lang/summernote-hr-HR.js create mode 100644 assets/summernote/lang/summernote-hu-HU.js create mode 100644 assets/summernote/lang/summernote-id-ID.js create mode 100644 assets/summernote/lang/summernote-it-IT.js create mode 100644 assets/summernote/lang/summernote-ja-JP.js create mode 100644 assets/summernote/lang/summernote-ko-KR.js create mode 100644 assets/summernote/lang/summernote-lt-LT.js create mode 100644 assets/summernote/lang/summernote-lt-LV.js create mode 100644 assets/summernote/lang/summernote-mn-MN.js create mode 100644 assets/summernote/lang/summernote-nb-NO.js create mode 100644 assets/summernote/lang/summernote-nl-NL.js create mode 100644 assets/summernote/lang/summernote-pl-PL.js create mode 100644 assets/summernote/lang/summernote-pt-BR.js create mode 100644 assets/summernote/lang/summernote-pt-PT.js create mode 100644 assets/summernote/lang/summernote-ro-RO.js create mode 100644 assets/summernote/lang/summernote-ru-RU.js create mode 100644 assets/summernote/lang/summernote-sk-SK.js create mode 100644 assets/summernote/lang/summernote-sl-SI.js create mode 100644 assets/summernote/lang/summernote-sr-RS-Latin.js create mode 100644 assets/summernote/lang/summernote-sr-RS.js create mode 100644 assets/summernote/lang/summernote-sv-SE.js create mode 100644 assets/summernote/lang/summernote-ta-IN.js create mode 100644 assets/summernote/lang/summernote-th-TH.js create mode 100644 assets/summernote/lang/summernote-tr-TR.js create mode 100644 assets/summernote/lang/summernote-uk-UA.js create mode 100644 assets/summernote/lang/summernote-uz-UZ.js create mode 100644 assets/summernote/lang/summernote-vi-VN.js create mode 100644 assets/summernote/lang/summernote-zh-CN.js create mode 100644 assets/summernote/lang/summernote-zh-HK.js create mode 100644 assets/summernote/lang/summernote-zh-SG.js create mode 100644 assets/summernote/lang/summernote-zh-TW.js create mode 100644 assets/summernote/plugin/databasic/summernote-ext-databasic.css create mode 100644 assets/summernote/plugin/databasic/summernote-ext-databasic.js create mode 100644 assets/summernote/plugin/hello/summernote-ext-hello.js create mode 100644 assets/summernote/plugin/specialchars/summernote-ext-specialchars.js create mode 100644 assets/summernote/summernote.css create mode 100644 assets/summernote/summernote.min.js rename data/language/{ko => ko-KR}/language.php (100%) diff --git a/admin/controllers/news_add.php b/admin/controllers/news_add.php index 4d3304b..9f76d99 100644 --- a/admin/controllers/news_add.php +++ b/admin/controllers/news_add.php @@ -14,10 +14,12 @@ $status_types = [ "打开" ]; +$load_editor = true; + if (isset($_POST["do_add_news"])) { $title = filter_input(INPUT_POST, "title", FILTER_SANITIZE_STRING); $status = filter_input(INPUT_POST, "status", FILTER_SANITIZE_STRING); - $content = filter_input(INPUT_POST, "content", FILTER_SANITIZE_STRING); + $content = filter_input(INPUT_POST, "content", FILTER_SANITIZE_SPECIAL_CHARS); $errors = array(); $data = [ diff --git a/admin/controllers/tickets_details.php b/admin/controllers/tickets_details.php index b9838c6..2fd646e 100644 --- a/admin/controllers/tickets_details.php +++ b/admin/controllers/tickets_details.php @@ -8,7 +8,7 @@ if (!defined('IN_SYS')) { $err = getMsg("errors"); $data = getMsg("form_data"); - +$load_editor = true; $ticket_types = [ "技术支持", "销售财务", "管理员信箱" ]; @@ -22,7 +22,7 @@ if (empty($_GET["id"])) { $tickets_id = filter_input(INPUT_GET, "id", FILTER_SANITIZE_STRING); if (isset($_POST["do_comment_tickets"])) { - $comment = filter_input(INPUT_POST, "comment", FILTER_SANITIZE_STRING); + $comment = filter_input(INPUT_POST, "comment", FILTER_SANITIZE_SPECIAL_CHARS); $errors = array(); $data = [ diff --git a/admin/views/footer.php b/admin/views/footer.php index 494a202..a09449a 100644 --- a/admin/views/footer.php +++ b/admin/views/footer.php @@ -6,34 +6,50 @@ if (!defined('IN_SYS')) { } ?> - + + + + + + + language_cached != 'en-US' && is_file($ROOT . '/assets/summernote/lang/summernote-' . $lang->language_cached . '.js')) { ?> + + + + + \ No newline at end of file diff --git a/admin/views/header.php b/admin/views/header.php index 4a71c67..a357f53 100644 --- a/admin/views/header.php +++ b/admin/views/header.php @@ -24,6 +24,9 @@ if (!defined('IN_SYS')) { + + + - + \ No newline at end of file diff --git a/admin/views/navbar.php b/admin/views/navbar.php index e06bfe5..18259a1 100644 --- a/admin/views/navbar.php +++ b/admin/views/navbar.php @@ -21,44 +21,44 @@ if (!defined('IN_SYS')) { diff --git a/admin/views/news_add.php b/admin/views/news_add.php index 4d34940..f45dd11 100644 --- a/admin/views/news_add.php +++ b/admin/views/news_add.php @@ -4,10 +4,13 @@ if (!defined('IN_SYS')) { header("Location: ../../admin.php"); exit; } + ?>
- +
News Add @@ -24,15 +27,15 @@ if (!defined('IN_SYS')) {
- +
@@ -43,4 +46,4 @@ if (!defined('IN_SYS')) {
- \ No newline at end of file + diff --git a/admin/views/news_details.php b/admin/views/news_details.php index 7d5d5ba..f9304f0 100644 --- a/admin/views/news_details.php +++ b/admin/views/news_details.php @@ -17,11 +17,11 @@ if (!defined('IN_SYS')) {
-

Status:

-

Date:

Title:

-

Content:

+

Date:

+

Status:

+
+
- \ No newline at end of file diff --git a/admin/views/tickets_details.php b/admin/views/tickets_details.php index e71c781..d6826ca 100644 --- a/admin/views/tickets_details.php +++ b/admin/views/tickets_details.php @@ -19,11 +19,13 @@ if (!defined('IN_SYS')) {

Type:

Status:

Subject:

-

Content:

+
+ +
- +
diff --git a/assets/summernote/font/summernote.eot b/assets/summernote/font/summernote.eot new file mode 100644 index 0000000000000000000000000000000000000000..28d098bc0cc360486312dd8a7b612d01a6b6ea90 GIT binary patch literal 17342 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 literal 0 HcmV?d00001 diff --git a/assets/summernote/font/summernote.woff b/assets/summernote/font/summernote.woff new file mode 100644 index 0000000000000000000000000000000000000000..13a6ab9301a196b2a73a6ddf7815734256eeb219 GIT binary patch literal 10604 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', + tooltip: lang.image.resizeFull, + click: context.createInvokeHandler('editor.resize', '1'), + }).render(); + }); + context.memo('button.databasicSize50', function() { + return ui.button({ + contents: '50%', + tooltip: lang.image.resizeHalf, + click: context.createInvokeHandler('editor.resize', '0.5'), + }).render(); + }); + context.memo('button.databasicSize25', function() { + return ui.button({ + contents: '25%', + tooltip: lang.image.resizeQuarter, + click: context.createInvokeHandler('editor.resize', '0.25'), + }).render(); + }); + + self.events = { + 'summernote.init': function(we, e) { + // update existing containers + $('data.ext-databasic', e.editable).each(function() { self.setContent($(this)); }); + // TODO: make this an undo snapshot... + }, + 'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function() { + self.update(); + }, + 'summernote.dialog.shown': function() { + self.hidePopover(); + }, + }; + + self.initialize = function() { + // create dialog markup + var $container = options.dialogsInBody ? $(document.body) : context.layoutInfo.editor; + + var body = '
' + + '' + + '' + + '
'; + var footer = ''; + + self.$dialog = ui.dialog({ + title: lang.databasic.name, + fade: options.dialogsFade, + body: body, + footer: footer, + }).render().appendTo($container); + + // create popover + self.$popover = ui.popover({ + className: 'ext-databasic-popover', + }).render().appendTo('body'); + var $content = self.$popover.find('.popover-content'); + + context.invoke('buttons.build', $content, options.popover.databasic); + }; + + self.destroy = function() { + self.$popover.remove(); + self.$popover = null; + self.$dialog.remove(); + self.$dialog = null; + }; + + self.update = function() { + // Prevent focusing on editable when invoke('code') is executed + if (!context.invoke('editor.hasFocus')) { + self.hidePopover(); + return; + } + + var rng = context.invoke('editor.createRange'); + var visible = false; + + if (rng.isOnData()) { + var $data = $(rng.sc).closest('data.ext-databasic'); + + if ($data.length) { + var pos = dom.posFromPlaceholder($data[0]); + + self.$popover.css({ + display: 'block', + left: pos.left, + top: pos.top, + }); + + // save editor target to let size buttons resize the container + context.invoke('editor.saveTarget', $data[0]); + + visible = true; + } + } + + // hide if not visible + if (!visible) { + self.hidePopover(); + } + }; + + self.hidePopover = function() { + self.$popover.hide(); + }; + + // define plugin dialog + self.getInfo = function() { + var rng = context.invoke('editor.createRange'); + + if (rng.isOnData()) { + var $data = $(rng.sc).closest('data.ext-databasic'); + + if ($data.length) { + // Get the first node on range(for edit). + return { + node: $data, + test: $data.attr('data-test'), + }; + } + } + + return {}; + }; + + self.setContent = function($node) { + $node.html('

' + self.icon + ' ' + lang.databasic.name + ': ' + + $node.attr('data-test') + '

'); + }; + + self.updateNode = function(info) { + self.setContent(info.node + .attr('data-test', info.test)); + }; + + self.createNode = function(info) { + var $node = $(''); + + if ($node) { + // save node to info structure + info.node = $node; + // insert node into editor dom + context.invoke('editor.insertNode', $node[0]); + } + + return $node; + }; + + self.showDialog = function() { + var info = self.getInfo(); + var newNode = !info.node; + context.invoke('editor.saveRange'); + + self + .openDialog(info) + .then(function(dialogInfo) { + // [workaround] hide dialog before restore range for IE range focus + ui.hideDialog(self.$dialog); + context.invoke('editor.restoreRange'); + + // insert a new node + if (newNode) { + self.createNode(info); + } + + // update info with dialog info + $.extend(info, dialogInfo); + + self.updateNode(info); + }) + .fail(function() { + context.invoke('editor.restoreRange'); + }); + }; + + self.openDialog = function(info) { + return $.Deferred(function(deferred) { + var $inpTest = self.$dialog.find('.ext-databasic-test'); + var $saveBtn = self.$dialog.find('.ext-databasic-save'); + var onKeyup = function(event) { + if (event.keyCode === 13) { + $saveBtn.trigger('click'); + } + }; + + ui.onDialogShown(self.$dialog, function() { + context.triggerEvent('dialog.shown'); + + $inpTest.val(info.test).on('input', function() { + ui.toggleBtn($saveBtn, $inpTest.val()); + }).trigger('focus').on('keyup', onKeyup); + + $saveBtn + .text(info.node ? lang.databasic.edit : lang.databasic.insert) + .click(function(event) { + event.preventDefault(); + + deferred.resolve({ test: $inpTest.val() }); + }); + + // init save button + ui.toggleBtn($saveBtn, $inpTest.val()); + }); + + ui.onDialogHidden(self.$dialog, function() { + $inpTest.off('input keyup'); + $saveBtn.off('click'); + + if (deferred.state() === 'pending') { + deferred.reject(); + } + }); + + ui.showDialog(self.$dialog); + }); + }; + }; + + // Extends summernote + $.extend(true, $.summernote, { + plugins: { + databasic: DataBasicPlugin, + }, + + options: { + popover: { + databasic: [ + ['databasic', ['databasicDialog', 'databasicSize100', 'databasicSize50', 'databasicSize25']], + ], + }, + }, + + // add localization texts + lang: { + 'en-US': { + databasic: { + name: 'Basic Data Container', + insert: 'insert basic data container', + edit: 'edit basic data container', + testLabel: 'test input', + }, + }, + }, + + }); +})); diff --git a/assets/summernote/plugin/hello/summernote-ext-hello.js b/assets/summernote/plugin/hello/summernote-ext-hello.js new file mode 100644 index 0000000..9477260 --- /dev/null +++ b/assets/summernote/plugin/hello/summernote-ext-hello.js @@ -0,0 +1,81 @@ +(function(factory) { + /* global define */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(window.jQuery); + } +}(function($) { + // Extends plugins for adding hello. + // - plugin is external module for customizing. + $.extend($.summernote.plugins, { + /** + * @param {Object} context - context object has status of editor. + */ + 'hello': function(context) { + var self = this; + + // ui has renders to build ui elements. + // - you can create a button with `ui.button` + var ui = $.summernote.ui; + + // add hello button + context.memo('button.hello', function() { + // create button + var button = ui.button({ + contents: ' Hello', + tooltip: 'hello', + click: function() { + self.$panel.show(); + self.$panel.hide(500); + // invoke insertText method with 'hello' on editor module. + context.invoke('editor.insertText', 'hello'); + }, + }); + + // create jQuery object from button instance. + var $hello = button.render(); + return $hello; + }); + + // This events will be attached when editor is initialized. + this.events = { + // This will be called after modules are initialized. + 'summernote.init': function(we, e) { + console.log('summernote initialized', we, e); + }, + // This will be called when user releases a key on editable. + 'summernote.keyup': function(we, e) { + console.log('summernote keyup', we, e); + }, + }; + + // This method will be called when editor is initialized by $('..').summernote(); + // You can create elements for plugin + this.initialize = function() { + this.$panel = $('
').css({ + position: 'absolute', + width: 100, + height: 100, + left: '50%', + top: '50%', + background: 'red', + }).hide(); + + this.$panel.appendTo('body'); + }; + + // This methods will be called when editor is destroyed by $('..').summernote('destroy'); + // You should remove elements on `initialize`. + this.destroy = function() { + this.$panel.remove(); + this.$panel = null; + }; + }, + }); +})); diff --git a/assets/summernote/plugin/specialchars/summernote-ext-specialchars.js b/assets/summernote/plugin/specialchars/summernote-ext-specialchars.js new file mode 100644 index 0000000..c8a85e8 --- /dev/null +++ b/assets/summernote/plugin/specialchars/summernote-ext-specialchars.js @@ -0,0 +1,312 @@ +(function(factory) { + /* global define */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(window.jQuery); + } +}(function($) { + $.extend($.summernote.plugins, { + 'specialchars': function(context) { + var self = this; + var ui = $.summernote.ui; + + var $editor = context.layoutInfo.editor; + var options = context.options; + var lang = options.langInfo; + + var KEY = { + UP: 38, + DOWN: 40, + LEFT: 37, + RIGHT: 39, + ENTER: 13, + }; + var COLUMN_LENGTH = 15; + var COLUMN_WIDTH = 35; + + var currentColumn = 0; + var currentRow = 0; + var totalColumn = 0; + var totalRow = 0; + + // special characters data set + var specialCharDataSet = [ + '"', '&', '<', '>', '¡', '¢', + '£', '¤', '¥', '¦', '§', + '¨', '©', 'ª', '«', '¬', + '®', '¯', '°', '±', '²', + '³', '´', 'µ', '¶', '·', + '¸', '¹', 'º', '»', '¼', + '½', '¾', '¿', '×', '÷', + 'ƒ', 'ˆ', '˜', '–', '—', + '‘', '’', '‚', '“', '”', + '„', '†', '‡', '•', '…', + '‰', '′', '″', '‹', '›', + '‾', '⁄', '€', 'ℑ', '℘', + 'ℜ', '™', 'ℵ', '←', '↑', + '→', '↓', '↔', '↵', '⇐', + '⇑', '⇒', '⇓', '⇔', '∀', + '∂', '∃', '∅', '∇', '∈', + '∉', '∋', '∏', '∑', '−', + '∗', '√', '∝', '∞', '∠', + '∧', '∨', '∩', '∪', '∫', + '∴', '∼', '≅', '≈', '≠', + '≡', '≤', '≥', '⊂', '⊃', + '⊄', '⊆', '⊇', '⊕', '⊗', + '⊥', '⋅', '⌈', '⌉', '⌊', + '⌋', '◊', '♠', '♣', '♥', + '♦', + ]; + + context.memo('button.specialchars', function() { + return ui.button({ + contents: '', + tooltip: lang.specialChar.specialChar, + click: function() { + self.show(); + }, + }).render(); + }); + + /** + * Make Special Characters Table + * + * @member plugin.specialChar + * @private + * @return {jQuery} + */ + this.makeSpecialCharSetTable = function() { + var $table = $(''); + $.each(specialCharDataSet, function(idx, text) { + var $td = $('') : $table.find('tr').last(); + + var $button = ui.button({ + callback: function($node) { + $node.html(text); + $node.attr('title', text); + $node.attr('data-value', encodeURIComponent(text)); + $node.css({ + width: COLUMN_WIDTH, + 'margin-right': '2px', + 'margin-bottom': '2px', + }); + }, + }).render(); + + $td.append($button); + + $tr.append($td); + if (idx % COLUMN_LENGTH === 0) { + $table.append($tr); + } + }); + + totalRow = $table.find('tr').length; + totalColumn = COLUMN_LENGTH; + + return $table; + }; + + this.initialize = function() { + var $container = options.dialogsInBody ? $(document.body) : $editor; + + var body = '
' + this.makeSpecialCharSetTable()[0].outerHTML + '
'; + + this.$dialog = ui.dialog({ + title: lang.specialChar.select, + body: body, + }).render().appendTo($container); + }; + + this.show = function() { + var text = context.invoke('editor.getSelectedText'); + context.invoke('editor.saveRange'); + this.showSpecialCharDialog(text).then(function(selectChar) { + context.invoke('editor.restoreRange'); + + // build node + var $node = $('').html(selectChar)[0]; + + if ($node) { + // insert video node + context.invoke('editor.insertNode', $node); + } + }).fail(function() { + context.invoke('editor.restoreRange'); + }); + }; + + /** + * show image dialog + * + * @param {jQuery} $dialog + * @return {Promise} + */ + this.showSpecialCharDialog = function(text) { + return $.Deferred(function(deferred) { + var $specialCharDialog = self.$dialog; + var $specialCharNode = $specialCharDialog.find('.note-specialchar-node'); + var $selectedNode = null; + var ARROW_KEYS = [KEY.UP, KEY.DOWN, KEY.LEFT, KEY.RIGHT]; + var ENTER_KEY = KEY.ENTER; + + function addActiveClass($target) { + if (!$target) { + return; + } + $target.find('button').addClass('active'); + $selectedNode = $target; + } + + function removeActiveClass($target) { + $target.find('button').removeClass('active'); + $selectedNode = null; + } + + // find next node + function findNextNode(row, column) { + var findNode = null; + $.each($specialCharNode, function(idx, $node) { + var findRow = Math.ceil((idx + 1) / COLUMN_LENGTH); + var findColumn = ((idx + 1) % COLUMN_LENGTH === 0) ? COLUMN_LENGTH : (idx + 1) % COLUMN_LENGTH; + if (findRow === row && findColumn === column) { + findNode = $node; + return false; + } + }); + return $(findNode); + } + + function arrowKeyHandler(keyCode) { + // left, right, up, down key + var $nextNode; + var lastRowColumnLength = $specialCharNode.length % totalColumn; + + if (KEY.LEFT === keyCode) { + if (currentColumn > 1) { + currentColumn = currentColumn - 1; + } else if (currentRow === 1 && currentColumn === 1) { + currentColumn = lastRowColumnLength; + currentRow = totalRow; + } else { + currentColumn = totalColumn; + currentRow = currentRow - 1; + } + } else if (KEY.RIGHT === keyCode) { + if (currentRow === totalRow && lastRowColumnLength === currentColumn) { + currentColumn = 1; + currentRow = 1; + } else if (currentColumn < totalColumn) { + currentColumn = currentColumn + 1; + } else { + currentColumn = 1; + currentRow = currentRow + 1; + } + } else if (KEY.UP === keyCode) { + if (currentRow === 1 && lastRowColumnLength < currentColumn) { + currentRow = totalRow - 1; + } else { + currentRow = currentRow - 1; + } + } else if (KEY.DOWN === keyCode) { + currentRow = currentRow + 1; + } + + if (currentRow === totalRow && currentColumn > lastRowColumnLength) { + currentRow = 1; + } else if (currentRow > totalRow) { + currentRow = 1; + } else if (currentRow < 1) { + currentRow = totalRow; + } + + $nextNode = findNextNode(currentRow, currentColumn); + + if ($nextNode) { + removeActiveClass($selectedNode); + addActiveClass($nextNode); + } + } + + function enterKeyHandler() { + if (!$selectedNode) { + return; + } + + deferred.resolve(decodeURIComponent($selectedNode.find('button').attr('data-value'))); + $specialCharDialog.modal('hide'); + } + + function keyDownEventHandler(event) { + event.preventDefault(); + var keyCode = event.keyCode; + if (keyCode === undefined || keyCode === null) { + return; + } + // check arrowKeys match + if (ARROW_KEYS.indexOf(keyCode) > -1) { + if ($selectedNode === null) { + addActiveClass($specialCharNode.eq(0)); + currentColumn = 1; + currentRow = 1; + return; + } + arrowKeyHandler(keyCode); + } else if (keyCode === ENTER_KEY) { + enterKeyHandler(); + } + return false; + } + + // remove class + removeActiveClass($specialCharNode); + + // find selected node + if (text) { + for (var i = 0; i < $specialCharNode.length; i++) { + var $checkNode = $($specialCharNode[i]); + if ($checkNode.text() === text) { + addActiveClass($checkNode); + currentRow = Math.ceil((i + 1) / COLUMN_LENGTH); + currentColumn = (i + 1) % COLUMN_LENGTH; + } + } + } + + ui.onDialogShown(self.$dialog, function() { + $(document).on('keydown', keyDownEventHandler); + + self.$dialog.find('button').tooltip(); + + $specialCharNode.on('click', function(event) { + event.preventDefault(); + deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').attr('data-value'))); + ui.hideDialog(self.$dialog); + }); + }); + + ui.onDialogHidden(self.$dialog, function() { + $specialCharNode.off('click'); + + self.$dialog.find('button').tooltip('destroy'); + + $(document).off('keydown', keyDownEventHandler); + + if (deferred.state() === 'pending') { + deferred.reject(); + } + }); + + ui.showDialog(self.$dialog); + }); + }; + }, + }); +})); diff --git a/assets/summernote/summernote.css b/assets/summernote/summernote.css new file mode 100644 index 0000000..9e557cb --- /dev/null +++ b/assets/summernote/summernote.css @@ -0,0 +1 @@ +@font-face{font-family:"summernote";font-style:normal;font-weight:normal;src:url("./font/summernote.eot?1d9aeaaff0a8939558a45be6cd52cd4c");src:url("./font/summernote.eot?1d9aeaaff0a8939558a45be6cd52cd4c#iefix") format("embedded-opentype"),url("./font/summernote.woff?1d9aeaaff0a8939558a45be6cd52cd4c") format("woff"),url("./font/summernote.ttf?1d9aeaaff0a8939558a45be6cd52cd4c") format("truetype")}[class^="note-icon-"]:before,[class*=" note-icon-"]:before{display:inline-block;font:normal normal normal 14px summernote;font-size:inherit;-webkit-font-smoothing:antialiased;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;speak:none;-moz-osx-font-smoothing:grayscale}.note-icon-align-center:before,.note-icon-align-indent:before,.note-icon-align-justify:before,.note-icon-align-left:before,.note-icon-align-outdent:before,.note-icon-align-right:before,.note-icon-align:before,.note-icon-arrow-circle-down:before,.note-icon-arrow-circle-left:before,.note-icon-arrow-circle-right:before,.note-icon-arrow-circle-up:before,.note-icon-arrows-alt:before,.note-icon-arrows-h:before,.note-icon-arrows-v:before,.note-icon-bold:before,.note-icon-caret:before,.note-icon-chain-broken:before,.note-icon-circle:before,.note-icon-close:before,.note-icon-code:before,.note-icon-col-after:before,.note-icon-col-before:before,.note-icon-col-remove:before,.note-icon-eraser:before,.note-icon-float-left:before,.note-icon-float-none:before,.note-icon-float-right:before,.note-icon-font:before,.note-icon-frame:before,.note-icon-italic:before,.note-icon-link:before,.note-icon-magic:before,.note-icon-menu-check:before,.note-icon-minus:before,.note-icon-orderedlist:before,.note-icon-pencil:before,.note-icon-picture:before,.note-icon-question:before,.note-icon-redo:before,.note-icon-rollback:before,.note-icon-row-above:before,.note-icon-row-below:before,.note-icon-row-remove:before,.note-icon-special-character:before,.note-icon-square:before,.note-icon-strikethrough:before,.note-icon-subscript:before,.note-icon-summernote:before,.note-icon-superscript:before,.note-icon-table:before,.note-icon-text-height:before,.note-icon-trash:before,.note-icon-underline:before,.note-icon-undo:before,.note-icon-unorderedlist:before,.note-icon-video:before{display:inline-block;font-family:"summernote";font-style:normal;font-weight:normal;text-decoration:inherit}.note-icon-align-center:before{content:"\f101"}.note-icon-align-indent:before{content:"\f102"}.note-icon-align-justify:before{content:"\f103"}.note-icon-align-left:before{content:"\f104"}.note-icon-align-outdent:before{content:"\f105"}.note-icon-align-right:before{content:"\f106"}.note-icon-align:before{content:"\f107"}.note-icon-arrow-circle-down:before{content:"\f108"}.note-icon-arrow-circle-left:before{content:"\f109"}.note-icon-arrow-circle-right:before{content:"\f10a"}.note-icon-arrow-circle-up:before{content:"\f10b"}.note-icon-arrows-alt:before{content:"\f10c"}.note-icon-arrows-h:before{content:"\f10d"}.note-icon-arrows-v:before{content:"\f10e"}.note-icon-bold:before{content:"\f10f"}.note-icon-caret:before{content:"\f110"}.note-icon-chain-broken:before{content:"\f111"}.note-icon-circle:before{content:"\f112"}.note-icon-close:before{content:"\f113"}.note-icon-code:before{content:"\f114"}.note-icon-col-after:before{content:"\f115"}.note-icon-col-before:before{content:"\f116"}.note-icon-col-remove:before{content:"\f117"}.note-icon-eraser:before{content:"\f118"}.note-icon-float-left:before{content:"\f119"}.note-icon-float-none:before{content:"\f11a"}.note-icon-float-right:before{content:"\f11b"}.note-icon-font:before{content:"\f11c"}.note-icon-frame:before{content:"\f11d"}.note-icon-italic:before{content:"\f11e"}.note-icon-link:before{content:"\f11f"}.note-icon-magic:before{content:"\f120"}.note-icon-menu-check:before{content:"\f121"}.note-icon-minus:before{content:"\f122"}.note-icon-orderedlist:before{content:"\f123"}.note-icon-pencil:before{content:"\f124"}.note-icon-picture:before{content:"\f125"}.note-icon-question:before{content:"\f126"}.note-icon-redo:before{content:"\f127"}.note-icon-rollback:before{content:"\f128"}.note-icon-row-above:before{content:"\f129"}.note-icon-row-below:before{content:"\f12a"}.note-icon-row-remove:before{content:"\f12b"}.note-icon-special-character:before{content:"\f12c"}.note-icon-square:before{content:"\f12d"}.note-icon-strikethrough:before{content:"\f12e"}.note-icon-subscript:before{content:"\f12f"}.note-icon-summernote:before{content:"\f130"}.note-icon-superscript:before{content:"\f131"}.note-icon-table:before{content:"\f132"}.note-icon-text-height:before{content:"\f133"}.note-icon-trash:before{content:"\f134"}.note-icon-underline:before{content:"\f135"}.note-icon-undo:before{content:"\f136"}.note-icon-unorderedlist:before{content:"\f137"}.note-icon-video:before{content:"\f138"}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:0}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area img.note-float-left{margin-right:10px}.note-editor .note-editing-area img.note-float-right{margin-left:10px}.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable{padding:10px;overflow:auto;color:#000;word-wrap:break-word;background-color:#fff}.note-editor.note-frame .note-editing-area .note-editable[contenteditable="false"]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;outline:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-editor.note-frame.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important}.note-editor.note-frame.fullscreen .note-editable{background-color:#fff}.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output{display:block;width:100%;height:20px;margin-bottom:0;font-size:14px;line-height:1.42857143;color:#000;border:0;border-top:1px solid #e2e2e2}.note-editor.note-frame .note-status-output:empty{height:0;border-top:0 solid transparent}.note-editor.note-frame .note-status-output .pull-right{float:right!important}.note-editor.note-frame .note-status-output .text-muted{color:#777}.note-editor.note-frame .note-status-output .text-primary{color:#286090}.note-editor.note-frame .note-status-output .text-success{color:#3c763d}.note-editor.note-frame .note-status-output .text-info{color:#31708f}.note-editor.note-frame .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-frame .note-status-output .text-danger{color:#a94442}.note-editor.note-frame .note-status-output .alert{padding:7px 10px 2px 10px;margin:-7px 0 0 0;color:#000;background-color:#f5f5f5;border-radius:0}.note-editor.note-frame .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-frame .note-status-output .alert-success{color:#3c763d!important;background-color:#dff0d8!important}.note-editor.note-frame .note-status-output .alert-info{color:#31708f!important;background-color:#d9edf7!important}.note-editor.note-frame .note-status-output .alert-warning{color:#8a6d3b!important;background-color:#fcf8e3!important}.note-editor.note-frame .note-status-output .alert-danger{color:#a94442!important;background-color:#f2dede!important}.note-editor.note-frame .note-statusbar{background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.note-editor.note-frame .note-statusbar .note-resizebar{width:100%;height:9px;padding-top:1px;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder{padding:10px}.note-popover.popover{max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px!important}.note-toolbar{position:relative;z-index:500}.note-popover .popover-content,.panel-heading.note-toolbar{padding:0 0 5px 5px;margin:0}.note-popover .popover-content>.btn-group,.panel-heading.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.panel-heading.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.panel-heading.note-toolbar .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.panel-heading.note-toolbar .note-style .dropdown-style pre{padding:5px 10px;margin:0}.note-popover .popover-content .note-style .dropdown-style h1,.panel-heading.note-toolbar .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.panel-heading.note-toolbar .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.panel-heading.note-toolbar .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.panel-heading.note-toolbar .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.panel-heading.note-toolbar .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.panel-heading.note-toolbar .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.panel-heading.note-toolbar .note-style .dropdown-style p{padding:0;margin:0}.note-popover .popover-content .note-color-all .dropdown-menu,.panel-heading.note-toolbar .note-color-all .dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-toggle,.panel-heading.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette{display:inline-block;width:160px;margin:0}.note-popover .popover-content .note-color .dropdown-menu .note-palette:first-child,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-palette-title,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-select,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-select{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-row,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset:hover,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-select-btn,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-select-btn{display:none}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-holder-custom .note-color-btn,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-popover .popover-content .note-para .dropdown-menu,.panel-heading.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.panel-heading.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.panel-heading.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu.right,.panel-heading.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.panel-heading.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover-content .dropdown-menu.right::after,.panel-heading.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover-content .dropdown-menu.note-check li a i,.panel-heading.note-toolbar .dropdown-menu.note-check li a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check li a.checked i,.panel-heading.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.panel-heading.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.panel-heading.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.panel-heading.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #fff}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.panel-heading.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed lightgray}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:#fff;border:1px solid #000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:#000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0} \ No newline at end of file diff --git a/assets/summernote/summernote.min.js b/assets/summernote/summernote.min.js new file mode 100644 index 0000000..8a3d124 --- /dev/null +++ b/assets/summernote/summernote.min.js @@ -0,0 +1,3 @@ +/*! Summernote v0.8.12 | (c) 2013- Alan Hong and other contributors | MIT license */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],e):e((t=t||self).jQuery)}(this,function(C){"use strict";C=C&&C.hasOwnProperty("default")?C.default:C;var i=function(){function t(t,e,o,n){this.markup=t,this.children=e,this.options=o,this.callback=n}return t.prototype.render=function(t){var o=C(this.markup);if(this.options&&this.options.contents&&o.html(this.options.contents),this.options&&this.options.className&&o.addClass(this.options.className),this.options&&this.options.data&&C.each(this.options.data,function(t,e){o.attr("data-"+t,e)}),this.options&&this.options.click&&o.on("click",this.options.click),this.children){var e=o.find(".note-children-container");this.children.forEach(function(t){t.render(e.length?e:o)})}return this.callback&&this.callback(o,this.options),this.options&&this.options.callback&&this.options.callback(o),t&&t.append(o),o},t}(),o=function(o,n){return function(){var t="object"==typeof arguments[1]?arguments[1]:arguments[0],e=Array.isArray(arguments[0])?arguments[0]:[];return t&&t.children&&(e=t.children),new i(o,e,t,n)}},t=o('
'),e=o('
'),n=o('
'),r=o(' +
diff --git a/clientarea/views/tickets_details.php b/clientarea/views/tickets_details.php index 6884058..4a6cb21 100644 --- a/clientarea/views/tickets_details.php +++ b/clientarea/views/tickets_details.php @@ -20,13 +20,15 @@ if (!defined('IN_SYS')) {

Type:

-

Subject:

+

Status:

Subject:

-

Content:

+
+ +
- +
diff --git a/data/language/ko/language.php b/data/language/ko-KR/language.php similarity index 100% rename from data/language/ko/language.php rename to data/language/ko-KR/language.php diff --git a/library/lang.class.php b/library/lang.class.php index 0db9200..829a429 100644 --- a/library/lang.class.php +++ b/library/lang.class.php @@ -4,10 +4,10 @@ class Language { public $language_current; - private $language_cached; - private $language_default; - private $language_root; - private $language_file; + public $language_cached; + public $language_default; + public $language_root; + public $language_file; private $languages = [ 'en-US' => ['English', 'English'], 'zh-CN' => ['简体中文', 'Chinese_simplified'], @@ -17,14 +17,14 @@ class Language 'af' => ['Afrikaans', 'Afrikaans'], 'sq' => ['የአልባኒያ', 'Albanian'], 'am' => ['Amharic', 'Amharic'], - 'ar' => ['Arabic', 'Arabic'], + 'ar-AR' => ['Arabic', 'Arabic'], 'hy' => ['Armenian', 'Armenian'], 'az' => ['Azərbaycan', 'Azeerbaijani'], 'eu' => ['Basque', 'Basque'], 'be' => ['Belarusian', 'Belarusian'], 'bn' => ['Bengali', 'Bengali'], 'bs' => ['Bosnian', 'Bosnian'], - 'bg' => ['Bulgarian', 'Bulgarian'], + 'bg-BG' => ['Bulgarian', 'Bulgarian'], 'my' => ['Burmese', 'Burmese'], 'ca' => ['Catalan', 'Catalan'], 'ce' => ['Cebuano', 'Cebuano'], // 宿务语 @@ -39,7 +39,7 @@ class Language 'fa' => ['Farsi', 'Farsi'], 'fil' => ['Filipino', 'Filipino'], 'fi' => ['Finnish', 'Finnish'], - 'fr' => ['français', 'French'], + 'fr-FR' => ['français', 'French'], // 法语 'fy' => ['Frisian', 'Frisian'], 'gl' => ['Galician', 'Galician'], 'ka' => ['Georgian', 'Georgian'], @@ -57,13 +57,13 @@ class Language 'ig' => ['Igbo', 'Igbo'], 'id' => ['Indonesian', 'Indonesian'], 'ga' => ['Irish', 'Irish'], - 'it' => ['Italian', 'Italian'], - 'jp' => ['日本語', 'Japanese'], + 'it-IT' => ['Italian', 'Italian'], + 'ja-JP' => ['日本語', 'Japanese'], 'jv' => ['Wong Jawa', 'Javanese'], 'kn' => ['Kannada', 'Kannada'], 'kk' => ['Kazakh', 'Kazakh'], 'kh' => ['Khmer', 'Khmer'], - 'ko' => ['한국의', 'Korean'], + 'ko-KR' => ['한국의', 'Korean'], 'ku' => ['Kurdish', 'Kurdish'], 'kz' => ['Kyrgyz', 'Kyrgyz'], 'lo' => ['ພາສາລາວ', 'Lao'], @@ -86,8 +86,8 @@ class Language 'po' => ['Polish', 'Polish'], 'pg' => ['Português', 'Portuguese'], 'pu' => ['Punjabi', 'Punjabi'], - 'ro' => ['Romanian', 'Romanian'], - 'ru' => ['Russian', 'Russian'], + 'ro-RO' => ['Romanian', 'Romanian'], + 'ru-RU' => ['Russian', 'Russian'], 'sa' => ['Samoan', 'Samoan'], 'gd' => ['Scots Gaelic', 'Scots Gaelic'], 'sr' => ['Serbian', 'Serbian'], @@ -109,7 +109,7 @@ class Language 'tu' => ['Turkish', 'Turkish'], 'uk' => ['Ukrainian', 'Ukrainian'], 'ur' => ['Urdu', 'Urdu'], - 'uz' => ['Uzbek', 'Uzbek'], + 'uz-UZ' => ['Uzbek', 'Uzbek'], 'vi' => ['Vietnamese', 'Vietnamese'], 'we' => ['Welsh', 'Welsh'], 'xh' => ['Xhosa', 'Xhosa'], @@ -139,6 +139,7 @@ class Language $this->init_domain(); $this->init_language(); $this->init_language_file(); + // echo '

'.$this->language_cached.'

'; } private function init_domain()
').addClass('note-specialchar-node'); + var $tr = (idx % COLUMN_LENGTH === 0) ? $('