From c2a2fec0670f20e4887a9df41465d012f5d65a49 Mon Sep 17 00:00:00 2001 From: Yulong Jing <yulong.jing@hotmail.com> Date: Thu, 20 Dec 2018 14:49:14 +0800 Subject: [PATCH 001/202] fix[Example]: add <el-form-item> wrapper for validate (#1428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 创建文章里js里有验证规则,但是由于少了<el-form-item>元素而不起作用。 --- src/views/example/components/ArticleDetail.vue | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index ce22b3b4..12a42f60 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -60,13 +60,16 @@ <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span> </el-form-item> - <div class="editor-container"> - <Tinymce ref="editor" :height="400" v-model="postForm.content" /> - </div> - - <div style="margin-bottom: 20px;"> - <Upload v-model="postForm.image_uri" /> - </div> + <el-form-item prop="content"> + <div class="editor-container"> + <Tinymce ref="editor" :height="400" v-model="postForm.content" /> + </div> + </el-form-item> + <el-form-item prop="image_uri"> + <div style="margin-bottom: 20px;"> + <Upload v-model="postForm.image_uri" /> + </div> + </el-form-item> </div> </el-form> From 1b394ae41757a91e7288820f8e3a24e561ff095a Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 20 Dec 2018 15:01:22 +0800 Subject: [PATCH 002/202] refine[Example]: refine style --- src/components/Tinymce/index.vue | 1 + .../example/components/ArticleDetail.vue | 24 ++++--------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index 9032a6a8..ce0fe6a9 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -185,6 +185,7 @@ export default { <style scoped> .tinymce-container { position: relative; + line-height: normal; } .tinymce-container>>>.mce-fullscreen { z-index: 10000; diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 12a42f60..129016d7 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -60,15 +60,12 @@ <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span> </el-form-item> - <el-form-item prop="content"> - <div class="editor-container"> - <Tinymce ref="editor" :height="400" v-model="postForm.content" /> - </div> + <el-form-item prop="content" style="margin-bottom: 30px;"> + <Tinymce ref="editor" :height="400" v-model="postForm.content" /> </el-form-item> - <el-form-item prop="image_uri"> - <div style="margin-bottom: 20px;"> - <Upload v-model="postForm.image_uri" /> - </div> + + <el-form-item prop="image_uri" style="margin-bottom: 30px;"> + <Upload v-model="postForm.image_uri" /> </el-form-item> </div> </el-form> @@ -250,17 +247,6 @@ export default { float: left; } } - .editor-container { - min-height: 500px; - margin: 0 0 30px; - .editor-upload-btn-container { - text-align: right; - margin-right: 10px; - .editor-upload-btn { - display: inline-block; - } - } - } } .word-counter { width: 40px; From a56145509d25ce16adfba9d4419f5b1fcc173f2c Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 24 Dec 2018 10:45:47 +0800 Subject: [PATCH 003/202] perf[Tinymce]: remove importcss plugin #1452 --- src/components/Tinymce/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Tinymce/plugins.js b/src/components/Tinymce/plugins.js index 8fc207e8..058d2aef 100644 --- a/src/components/Tinymce/plugins.js +++ b/src/components/Tinymce/plugins.js @@ -2,6 +2,6 @@ // Detail plugins list see https://www.tinymce.com/docs/plugins/ // Custom builds see https://www.tinymce.com/download/custom-builds/ -const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount'] +const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount'] export default plugins From 6f1db28ea280ebea456398003911a26dad596a98 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 24 Dec 2018 11:12:24 +0800 Subject: [PATCH 004/202] feat[Breadcrumb]: add hide Breadcrumb option #1442 --- src/components/Breadcrumb/index.vue | 5 +++-- src/router/index.js | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 554abe8d..4b321e06 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -1,8 +1,9 @@ <template> <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> - <el-breadcrumb-item v-for="(item,index) in levelList" v-if="item.meta.title" :key="item.path"> - <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ generateTitle(item.meta.title) }}</span> + <el-breadcrumb-item v-for="(item,index) in levelList" v-if="item.meta.title&&item.meta.breadcrumb!==false" :key="item.path"> + <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ + generateTitle(item.meta.title) }}</span> <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> </el-breadcrumb-item> </transition-group> diff --git a/src/router/index.js b/src/router/index.js index ab328c46..73b09697 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -24,10 +24,11 @@ import nestedRouter from './modules/nested' * redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb * name:'router-name' the name is used by <keep-alive> (must set!!!) * meta : { - roles: ['admin','editor'] will control the page roles (you can set multiple roles) + roles: ['admin','editor'] will control the page roles (you can set multiple roles) title: 'title' the name show in submenu and breadcrumb (recommend set) - icon: 'svg-name' the icon show in the sidebar, - noCache: true if true ,the page will no be cached(default is false) + icon: 'svg-name' the icon show in the sidebar + noCache: true if true, the page will no be cached(default is false) + breadcrumb: false if false, the item will hidden in breadcrumb(default is true) } **/ export const constantRouterMap = [ From 90ee05df9371c658d94eedfe8a7ba8f5476dea12 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 24 Dec 2018 16:23:12 +0800 Subject: [PATCH 005/202] perf: use WeChat 7.0 new version icon color --- src/views/login/socialsignin.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/login/socialsignin.vue b/src/views/login/socialsignin.vue index d5f48830..62a63acc 100644 --- a/src/views/login/socialsignin.vue +++ b/src/views/login/socialsignin.vue @@ -60,7 +60,7 @@ export default { margin-right: 5px; } .wx-svg-container { - background-color: #8ada53; + background-color: #24da70; } .qq-svg-container { background-color: #6BA2D6; From afdb893dcda349502b528812a1ba25795dd12baa Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 24 Dec 2018 17:51:05 +0800 Subject: [PATCH 006/202] refactor[login]: refactor login page style --- src/views/login/index.vue | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index bbd3287b..5e872595 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -39,19 +39,21 @@ <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">{{ $t('login.logIn') }}</el-button> - <div class="tips"> - <span>{{ $t('login.username') }} : admin</span> - <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> - </div> - <div class="tips"> - <span style="margin-right:18px;">{{ $t('login.username') }} : editor</span> - <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> - </div> + <div style="position:relative"> + <div class="tips"> + <span>{{ $t('login.username') }} : admin</span> + <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> + </div> + <div class="tips"> + <span style="margin-right:18px;">{{ $t('login.username') }} : editor</span> + <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> + </div> - <el-button class="thirdparty-button" type="primary" @click="showDialog=true">{{ $t('login.thirdparty') }}</el-button> + <el-button class="thirdparty-button" type="primary" @click="showDialog=true">{{ $t('login.thirdparty') }}</el-button> + </div> </el-form> - <el-dialog :title="$t('login.thirdparty')" :visible.sync="showDialog" append-to-body> + <el-dialog :title="$t('login.thirdparty')" :visible.sync="showDialog"> {{ $t('login.thirdpartyTips') }} <br> <br> @@ -213,18 +215,17 @@ $dark_gray:#889aa4; $light_gray:#eee; .login-container { - position: fixed; - height: 100%; + min-height: 100%; width: 100%; background-color: $bg; + overflow: hidden; .login-form { - position: absolute; - left: 0; - right: 0; + position: relative; width: 520px; max-width: 100%; - padding: 35px 35px 15px 35px; - margin: 120px auto; + padding: 160px 35px 0; + margin: 0 auto; + overflow: hidden; } .tips { font-size: 14px; @@ -270,8 +271,8 @@ $light_gray:#eee; } .thirdparty-button { position: absolute; - right: 35px; - bottom: 28px; + right: 0; + bottom: 6px; } } </style> From 07c3211989dbf519e27015227ca164c94deb5770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E9=9B=A8?= <rainyday66@sina.com> Date: Wed, 26 Dec 2018 14:02:43 +0800 Subject: [PATCH 007/202] perf[ScrollPane]: refine moveToTarget code (#1460) --- src/components/ScrollPane/index.vue | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/components/ScrollPane/index.vue b/src/components/ScrollPane/index.vue index 89998e80..172afccc 100644 --- a/src/components/ScrollPane/index.vue +++ b/src/components/ScrollPane/index.vue @@ -28,8 +28,6 @@ export default { let firstTag = null let lastTag = null - let prevTag = null - let nextTag = null // find first tag and last tag if (tagList.length > 0) { @@ -37,26 +35,15 @@ export default { lastTag = tagList[tagList.length - 1] } - // find preTag and nextTag - for (let i = 0; i < tagList.length; i++) { - if (tagList[i] === currentTag) { - if (i === 0) { - nextTag = tagList[i].length > 1 && tagList[i + 1] - } else if (i === tagList.length - 1) { - prevTag = tagList[i].length > 1 && tagList[i - 1] - } else { - prevTag = tagList[i - 1] - nextTag = tagList[i + 1] - } - break - } - } - if (firstTag === currentTag) { $scrollWrapper.scrollLeft = 0 } else if (lastTag === currentTag) { $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth } else { + // find preTag and nextTag + const currentIndex = tagList.findIndex(item => item === currentTag) + const prevTag = tagList[currentIndex - 1] + const nextTag = tagList[currentIndex + 1] // the tag's offsetLeft after of nextTag const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing From deb68401748cff8ec3af4fbfd2003255f8a8d54c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 27 Dec 2018 13:42:10 +0800 Subject: [PATCH 008/202] feature[PDF]: add PDF demo (#1469) --- src/icons/svg/edit.svg | 2 +- src/icons/svg/email.svg | 2 +- src/icons/svg/excel.svg | 2 +- src/icons/svg/language.svg | 2 +- src/icons/svg/link.svg | 2 +- src/icons/svg/pdf.svg | 1 + src/icons/svg/peoples.svg | 2 +- src/icons/svg/table.svg | 2 +- src/icons/svg/wechat.svg | 2 +- src/lang/en.js | 3 + src/lang/es.js | 3 + src/lang/zh.js | 3 + src/router/index.js | 20 ++++ src/views/pdf/content.js | 58 +++++++++++ src/views/pdf/download.vue | 199 +++++++++++++++++++++++++++++++++++++ src/views/pdf/index.vue | 9 ++ 16 files changed, 304 insertions(+), 8 deletions(-) create mode 100644 src/icons/svg/pdf.svg create mode 100644 src/views/pdf/content.js create mode 100644 src/views/pdf/download.vue create mode 100644 src/views/pdf/index.vue diff --git a/src/icons/svg/edit.svg b/src/icons/svg/edit.svg index 0306a867..d26101f2 100644 --- a/src/icons/svg/edit.svg +++ b/src/icons/svg/edit.svg @@ -1 +1 @@ -<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></g></svg> \ No newline at end of file +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/email.svg b/src/icons/svg/email.svg index 055e5013..74d25e21 100644 --- a/src/icons/svg/email.svg +++ b/src/icons/svg/email.svg @@ -1 +1 @@ -<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><g><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></g></svg> \ No newline at end of file +<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/excel.svg b/src/icons/svg/excel.svg index 59d54b2c..74d97b80 100644 --- a/src/icons/svg/excel.svg +++ b/src/icons/svg/excel.svg @@ -1 +1 @@ -<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></g></svg> \ No newline at end of file +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/language.svg b/src/icons/svg/language.svg index 96d00288..0082b577 100644 --- a/src/icons/svg/language.svg +++ b/src/icons/svg/language.svg @@ -1 +1 @@ -<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></g></svg> \ No newline at end of file +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/link.svg b/src/icons/svg/link.svg index 07090147..48197ba4 100644 --- a/src/icons/svg/link.svg +++ b/src/icons/svg/link.svg @@ -1 +1 @@ -<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></g></svg> \ No newline at end of file +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/pdf.svg b/src/icons/svg/pdf.svg new file mode 100644 index 00000000..957aa0cc --- /dev/null +++ b/src/icons/svg/pdf.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M869.073 277.307H657.111V65.344l211.962 211.963zm-238.232 26.27V65.344l-476.498-.054v416.957h714.73v-178.67H630.841zm-335.836 360.57c-5.07-3.064-10.944-5.133-17.61-6.201-6.67-1.064-13.603-1.6-20.81-1.6h-48.821v85.641h48.822c7.206 0 14.14-.532 20.81-1.6 6.665-1.065 12.54-3.133 17.609-6.202 5.064-3.063 9.134-7.406 12.208-13.007 3.065-5.602 4.6-12.937 4.6-22.011 0-9.07-1.535-16.408-4.6-22.01-3.074-5.603-7.144-9.94-12.208-13.01zM35.82 541.805v416.904h952.358V541.805H35.821zm331.421 191.179c-3.6 11.071-9.343 20.879-17.209 29.413-7.874 8.542-18.078 15.408-30.617 20.61-12.544 5.206-27.747 7.807-45.621 7.807h-66.036v102.45h-62.831V607.517h128.867c17.874 0 33.077 2.6 45.62 7.802 12.541 5.207 22.745 12.076 30.618 20.615 7.866 8.538 13.604 18.277 17.21 29.212 3.6 10.943 5.401 22.278 5.401 34.018 0 11.477-1.8 22.752-5.402 33.819zM644.9 806.417c-5.343 17.61-13.408 32.818-24.212 45.627-10.807 12.803-24.283 22.879-40.423 30.213-16.146 7.343-35.155 11.007-57.03 11.007h-123.26V607.518h123.26c18.41 0 35.552 2.941 51.428 8.808 15.873 5.869 29.618 14.671 41.22 26.412 11.608 11.744 20.674 26.411 27.217 44.02 6.535 17.61 9.803 38.288 9.803 62.035 0 20.81-2.67 40.02-8.003 57.624zm245.362-146.07h-138.07v66.03h119.66v48.829h-119.66v118.058h-62.83V607.518h200.9v52.829h-.001zm-318.2 25.611c-6.402-8.266-14.877-14.604-25.412-19.01-10.544-4.402-23.551-6.602-39.019-6.602h-44.825v180.088h56.029c9.07 0 17.872-1.463 26.415-4.401 8.535-2.932 16.14-7.802 22.812-14.609 6.665-6.8 12.007-15.667 16.007-26.61 4.003-10.94 6.003-24.275 6.003-40.021 0-14.408-1.4-27.416-4.202-39.019-2.8-11.607-7.406-21.542-13.808-29.816zm0 0"/></svg> \ No newline at end of file diff --git a/src/icons/svg/peoples.svg b/src/icons/svg/peoples.svg index 2c911615..aab852e5 100644 --- a/src/icons/svg/peoples.svg +++ b/src/icons/svg/peoples.svg @@ -1 +1 @@ -<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></g></svg> \ No newline at end of file +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/table.svg b/src/icons/svg/table.svg index dbfe5d64..0e3dc9de 100644 --- a/src/icons/svg/table.svg +++ b/src/icons/svg/table.svg @@ -1 +1 @@ -<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></g></svg> \ No newline at end of file +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/wechat.svg b/src/icons/svg/wechat.svg index 9e18b717..c586e551 100644 --- a/src/icons/svg/wechat.svg +++ b/src/icons/svg/wechat.svg @@ -1 +1 @@ -<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><g><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></g></svg> \ No newline at end of file +<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></svg> \ No newline at end of file diff --git a/src/lang/en.js b/src/lang/en.js index 930f0ad1..656b746b 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -142,6 +142,9 @@ export default { export: 'Export', placeholder: 'Please enter the file name(default file)' }, + pdf: { + tips: 'Here we use window.print() to implement the feature of downloading pdf.' + }, theme: { change: 'Change Theme', documentation: 'Theme documentation', diff --git a/src/lang/es.js b/src/lang/es.js index f16044c4..69218ad2 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -142,6 +142,9 @@ export default { export: 'Exportar', placeholder: 'Por favor escribe un nombre de fichero' }, + pdf: { + tips: 'Here we use window.print() to implement the feature of downloading pdf.' + }, theme: { change: 'Cambiar tema', documentation: 'Documentación del tema', diff --git a/src/lang/zh.js b/src/lang/zh.js index 46e96ccf..021a5fa7 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -142,6 +142,9 @@ export default { export: '导出', placeholder: '请输入文件名(默认file)' }, + pdf: { + tips: '这里使用 window.print() 来实现下载pdf的功能' + }, theme: { change: '换肤', documentation: '换肤文档', diff --git a/src/router/index.js b/src/router/index.js index 73b09697..f42046ee 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -293,6 +293,26 @@ export const asyncRouterMap = [ ] }, + { + path: '/pdf', + component: Layout, + redirect: '/pdf/index', + meta: { title: 'PDF', icon: 'pdf' }, + children: [ + { + path: 'index', + component: () => import('@/views/pdf/index'), + name: 'PDF', + meta: { title: 'PDF' } + } + ] + }, + { + path: '/pdf/download', + component: () => import('@/views/pdf/download'), + hidden: true + }, + { path: '/theme', component: Layout, diff --git a/src/views/pdf/content.js b/src/views/pdf/content.js new file mode 100644 index 00000000..e62b1a2b --- /dev/null +++ b/src/views/pdf/content.js @@ -0,0 +1,58 @@ +const title = 'Plans for the Next Iteration of Vue.js' + +const content = `<p>Last week at<a href="https://vuejs.london/summary" rel="nofollow">Vue.js London</a>I gave a brief sneak peek of what’s coming in the next major version of Vue. This post provides an in-depth overview of the plan.</p> +<p><img class=" wscnph" src="https://wpimg.wallstcn.com/b8a1d7be-0b73-41b8-be8c-7c01c93cab66.png" data-wscntype="image" data-wscnh="742" data-wscnw="692" /></p> +<h3>Why a new majorversion?</h3> +<p>Vue 2.0 was released<a href="https://medium.com/the-vue-point/vue-2-0-is-here-ef1f26acf4b8" rel="nofollow">exactly two years ago</a>(how time flies!). During this period, the core has remained backwards compatible with five minor releases. We’ve accumulated a number of ideas that would bring improvements, but they were held off because they would result in breaking changes. At the same time, the JavaScript ecosystem and the language itself has been evolving rapidly. There are greatly improved tools that could enhance our workflow, and many new language features that could unlock simpler, more complete, and more efficient solutions to the problems Vue is trying to solve. What’s more exciting is that we are seeing ES2015 support becoming a baseline for all major evergreen browsers. Vue 3.0 aims to leverage these new language features to make Vue core smaller, faster, and more powerful.</p> +<p>Vue 3.0 is currently in prototyping phase, and we have already implemented a runtime close to feature-parity with 2.x.<strong>Many of the items listed below are either already implemented, or confirmed to be feasible. Ones that are not yet implemented or still in exploration phase are marked with a *.</strong></p> +<h3>The Details</h3> +<h4>High-Level APIChanges</h4> +<blockquote>TL;DR: Everything except render function API and scoped-slots syntax will either remain the same or can be made 2.x compatible via a compatibility build.</blockquote> +<p>Since it’s a new major, there is going to be some breaking changes. However, we take backwards compatibility seriously, so we want to start communicating these changes as soon as possible. Here’s the currently planned public API changes:</p> +<ul><li>Template syntax will remain 99% the same. There may be small tweaks in scoped slots syntax, but other than that we have no plans to change anything else for templates.</li><li>3.0 will support class-based components natively, with the aim to provide an API that is pleasant to use in native ES2015 without requiring any transpilation or stage-x features. Most current options will have a reasonable mapping in the class-based API. Stage-x features such as class fields and decorators can still be used optionally to enhance the authoring experience. In addition, the API is designed with TypeScript type inference in mind. The 3.x codebase will itself be written in TypeScript, and providing improved TypeScript support. (That said, usage of TypeScript in an application is still entirely optional.)</li><li>The 2.x object-based component format will still be supported by internally transforming the object to a corresponding class.</li><li>Mixins will still be supported.*</li><li>Top level APIs will likely receive an overhaul to avoid globally mutating the Vue runtime when installing plugins. Instead, plugins will be applied and scoped to a component tree. This will make it easier to test components that rely on specific plugins, and also make it possible to mount multiple Vue applications on the same page with different plugins, but using the same Vue runtime.*</li><li>Functional components can finally be plain functions —however, async components will now need to be explicitly created via a helper function.</li><li>The part that will receive the most changes is the Virtual DOM format used in render functions. We are currently collecting feedback from major library authors and will be sharing more details as we are more confident of the changes, but as long as you don’t heavily rely on hand-written (non-JSX) render functions in your app, upgrading should be a reasonably straightforward process.</li></ul> +<h4>Source Code Architecture</h4> +<blockquote>TL;DR: better decoupled internal modules, TypeScript, and a codebase that is easier to contribute to.</blockquote> +<p>We are re-writing 3.0 from the ground up for a cleaner and more maintainable architecture, in particular trying to make it easier to contribute to. We are breaking some internal functionalities into individual packages in order to isolate the scope of complexity. For example, the observer module will become its own package, with its own public API and tests. Note this does not affect framework-level API— you will not have to manually import individual bits from multiple packages in order to use Vue. Instead, the final Vue package is assembled using these internal packages.</p> +<p>The codebase is also now written in TypeScript. Although this will make proficiency in TypeScript a pre-requisite for contributing to the new codebase, we believe the type information and IDE support will actually make it easier for a new contributor to make meaningful contributions.</p> +<p>Decoupling the observer and scheduler into separate packages also allows us to easily experiment with alternative implementations of these parts. For example, we can implement an IE11 compatible observer implementation with the same API, or an alternative scheduler that leverages<code>requestIdleCallback</code>to yield to the browser during long updates.*</p> +<p><img class=" wscnph" src="https://wpimg.wallstcn.com/4d0b5fb2-d7f9-48fd-8f1b-03362b534dd9.png" data-wscntype="image" data-wscnh="716" data-wscnw="460" /></p> +<h4>Observation Mechanism</h4> +<blockquote>TL;DR: more complete, precise, efficient and debuggable reactivity tracking & API for creating observables.</blockquote> +<p>3.0 will ship with a Proxy-based observer implementation that provides reactivity tracking with full language coverage. This eliminates a number of limitations of Vue 2’s current implementation based on<code>Object.defineProperty</code>:</p> +<p>The new observer also features the following:</p> +<p>Easily understand why a component is re-rendering</p> +<p><img class=" wscnph" src="https://wpimg.wallstcn.com/a0c9d811-1ef9-4628-8976-f7c1aaa66da0.png" data-wscntype="image" data-wscnh="540" data-wscnw="789" /></p> +<h4>Other Runtime Improvements</h4> +<blockquote>TL;DR: smaller, faster, tree-shakable features, fragments & portals, custom renderer API.</blockquote> +<h4>Compiler Improvements*</h4> +<blockquote>TL;DR: tree-shaking friendly output, more AOT optimizations, parser with better error info and source map support.</blockquote> +<h4>IE11 Support*</h4> +<blockquote>TL;DR: it will be supported, but in a separate build with the same reactivity limitations of Vue 2.x.</blockquote> +<p>The new codebase currently targets evergreen browsers only and assumes baseline native ES2015 support. But alas, we know a lot of our users still need to support IE11 for the foreseeable future. Most of the ES2015 features used can be transpiled / polyfilled for IE11, with the exception for Proxies. Our plan is to implement an alternative observer with the same API, but using the good old ES5<code>Object.defineProperty</code>API. A separate build of Vue 3.x will be distributed using this observer implementation. However, this build will be subject to the same change detection caveats of Vue 2.x and thus not fully compatible with the “modern” build of 3.x. We are aware that this imposes some inconvenience for library authors as they will need to be aware of compatibility for two different builds, but we will make sure to provide clear guidelines on this when we reach that stage.</p> +<h3>How Do We GetThere</h3> +<p>First of all, although we are announcing it today, we do not have a definitive timeline yet. What we do know at the moment is the steps we will be taking to get there:</p> +<h4>1. Internal Feedback for the Runtime Prototype</h4> +<p>This is the phase we are in right now. Currently, we already have a working runtime prototype that includes the new observer, Virtual DOM and component implementation. We have invited a group of authors of influential community projects to provide feedback for the internal changes, and would like to make sure they are comfortable with the changes before moving forward. We want to ensure that important libraries in the ecosystem will be ready at the same time when we release 3.0, so that users relying on those projects can upgrade easily.</p> +<h4>2. Public Feedback viaRFCs</h4> +<p>Once we gain a certain level of confidence in the new design, for each breaking change we will be opening a dedicated RFC issue which includes:</p> +<p>We will anticipate public feedback from the wider community to help us consolidate these ideas.</p> +<h4>3. Introduce Compatible Features in 2.x &2.x-next</h4> +<p>We are not forgetting about 2.x! In fact, we plan to use 2.x to progressively accustom users to the new changes. We will be gradually introducing confirmed API changes into 2.x via opt-in adaptors, and 2.x-next will allow users to try out the new Proxy-based observer.</p> +<p>The last minor release in 2.x will become LTS and continue to receive bug and security fixes for 18 months when 3.0 is released.</p> +<h4>4. AlphaPhase</h4> +<p>Next, we will finish up the compiler and server-side rendering parts of 3.0 and start making alpha releases. These will mostly be for stability testing purposes in small greenfield apps.</p> +<h4>5. BetaPhase</h4> +<p>During beta phase, our main goal is updating support libraries and tools like Vue Router, Vuex, Vue CLI, Vue DevTools and make sure they work smoothly with the new core. We will also be working with major library authors from the community to help them get ready for 3.0.</p> +<h4>6. RCPhase</h4> +<p>Once we consider the API and codebase stable, we will enter RC phase with API freeze. During this phase we will also work on a “compat build”: a build of 3.0 that includes compatibility layers for 2.x API. This build will also ship with a flag you can turn on to emit deprecation warnings for 2.x API usage in your app. The compat build can be used as a guide to upgrade your app to 3.0.</p> +<h4>7. IE11build</h4> +<p>The last task before the final release will be the IE11 compatibility build as mentioned above.</p> +<h4>8. FinalRelease</h4> +<p>In all honesty, we don’t know when this will happen yet, but likely in 2019. Again, we care more about shipping something that is solid and stable rather than hitting specific dates. There is a lot of work to be done, but we are excited for what’s coming next!</p>` + +const data = { + title, + content +} + +export default data diff --git a/src/views/pdf/download.vue b/src/views/pdf/download.vue new file mode 100644 index 00000000..b0f30f6f --- /dev/null +++ b/src/views/pdf/download.vue @@ -0,0 +1,199 @@ +<template> + <div v-loading.fullscreen.lock="fullscreenLoading" class="main-article" element-loading-text="Efforts to generate PDF"> + <div class="article__heading"> + <div class="article__heading__title"> {{ article.title }}</div> + </div> + <div style="color: #ccc;"> + This article is from Evan You on <a target="_blank" href="https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf">medium</a> + </div> + <div ref="content" class="node-article-content" v-html="article.content"/> + </div> +</template> + +<script> + +export default { + data() { + return { + article: '', + fullscreenLoading: true + } + }, + mounted() { + this.fetchData() + }, + methods: { + fetchData() { + import('./content.js').then(data => { + const { title } = data.default + document.title = title + this.article = data.default + setTimeout(() => { + this.fullscreenLoading = false + this.$nextTick(() => { + window.print() + }) + }, 3000) + }) + } + } +} +</script> + +<style rel="stylesheet/scss" lang="scss"> +@mixin clearfix { + &:before { + display: table; + content: ''; + clear: both; + } + + &:after { + display: table; + content: ''; + clear: both; + } +} + +.main-article { + padding: 20px; + margin: 0 auto; + display: block; + width: 740px; + background: #fff; +} + +.article__heading { + position: relative; + padding: 0 0 20px; + overflow: hidden; +} + +.article__heading__title { + display: block; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + line-clamp: 2; + word-wrap: break-word; + overflow-wrap: break-word; + font-size: 32px; + line-height: 48px; + font-weight: 600; + color: #333; + overflow: hidden; +} + +.node-article-content { + margin: 20px 0 0; + @include clearfix; + font-size: 16px; + color: #333; + letter-spacing: 0.5px; + line-height: 28px; + margin-bottom: 30px; + font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; + + &> :last-child { + margin-bottom: 0; + } + + b, + strong { + font-weight: inherit; + font-weight: bolder; + } + + img { + max-width: 100%; + display: block; + margin: 0 auto; + } + + p { + font-weight: 400; + font-style: normal; + font-size: 21px; + line-height: 1.58; + letter-spacing: -.003em; + + } + + ul { + margin-bottom: 30px; + } + + li { + --x-height-multiplier: 0.375; + --baseline-multiplier: 0.17; + + letter-spacing: .01rem; + font-weight: 400; + font-style: normal; + font-size: 21px; + line-height: 1.58; + letter-spacing: -.003em; + margin-left: 30px; + margin-bottom: 14px; + } + + a { + text-decoration: none; + background-repeat: repeat-x; + background-image: linear-gradient(to right, rgba(0, 0, 0, .84) 100%, rgba(0, 0, 0, 0) 0); + background-size: 1px 1px; + background-position: 0 calc(1em + 1px); + padding: 0 6px; + } + + code { + background: rgba(0, 0, 0, .05); + padding: 3px 4px; + margin: 0 2px; + font-size: 16px; + display: inline-block; + } + + img { + border: 0; + } + + /* 解决 IE6-7 图片缩放锯齿问题 */ + img { + -ms-interpolation-mode: bicubic; + } + + blockquote { + --x-height-multiplier: 0.375; + --baseline-multiplier: 0.17; + font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; + letter-spacing: .01rem; + font-weight: 400; + font-style: italic; + font-size: 21px; + line-height: 1.58; + letter-spacing: -.003em; + border-left: 3px solid rgba(0, 0, 0, .84); + padding-left: 20px; + margin-left: -23px; + padding-bottom: 2px; + } + + a { + text-decoration: none; + } + + h2, + h3, + h4 { + font-size: 34px; + line-height: 1.15; + letter-spacing: -.015em; + margin: 53px 0 0; + } + + h4 { + font-size: 26px; + } +} +</style> diff --git a/src/views/pdf/index.vue b/src/views/pdf/index.vue new file mode 100644 index 00000000..b7728152 --- /dev/null +++ b/src/views/pdf/index.vue @@ -0,0 +1,9 @@ +<template> + <div class="app-container"> + <code style="margin-top:15px;">{{ $t('pdf.tips') }}</code> + <router-link target="_blank" to="/pdf/download"> + <el-button type="primary">Click to download PDF</el-button> + </router-link> + </div> +</template> + From cc7572820e7cec835548bcc54e2728be4c466f97 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 27 Dec 2018 18:19:11 +0800 Subject: [PATCH 009/202] perf[v-permission]: refine v-permission demo --- src/lang/en.js | 3 +- src/lang/es.js | 3 +- src/lang/zh.js | 3 +- src/views/permission/directive.vue | 71 +++++++++++++++++++++--------- 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/lang/en.js b/src/lang/en.js index 656b746b..2af355b1 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -87,7 +87,8 @@ export default { }, permission: { roles: 'Your roles', - switchRoles: 'Switch roles' + switchRoles: 'Switch roles', + tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.' }, guide: { description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ', diff --git a/src/lang/es.js b/src/lang/es.js index 69218ad2..1268f083 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -87,7 +87,8 @@ export default { }, permission: { roles: 'Tus permisos', - switchRoles: 'Cambiar permisos' + switchRoles: 'Cambiar permisos', + tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.' }, guide: { description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ', diff --git a/src/lang/zh.js b/src/lang/zh.js index 021a5fa7..4371713f 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -87,7 +87,8 @@ export default { }, permission: { roles: '你的权限', - switchRoles: '切换权限' + switchRoles: '切换权限', + tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。' }, guide: { description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于', diff --git a/src/views/permission/directive.vue b/src/views/permission/directive.vue index 2817f1c5..df277ddc 100644 --- a/src/views/permission/directive.vue +++ b/src/views/permission/directive.vue @@ -2,29 +2,53 @@ <div class="app-container"> <switch-roles @change="handleRolesChange" /> <div :key="key" style="margin-top:30px;"> - <span v-permission="['admin']" class="permission-alert"> - Only - <el-tag class="permission-tag" size="small">admin</el-tag> can see this - </span> - <span v-permission="['editor']" class="permission-alert"> - Only - <el-tag class="permission-tag" size="small">editor</el-tag> can see this - </span> - <span v-permission="['admin','editor']" class="permission-alert"> - Both - <el-tag class="permission-tag" size="small">admin</el-tag> and - <el-tag class="permission-tag" size="small">editor</el-tag> can see this - </span> + <div> + <span v-permission="['admin']" class="permission-alert"> + Only + <el-tag class="permission-tag" size="small">admin</el-tag> can see this + </span> + <el-tag v-permission="['admin']" class="permission-sourceCode" type="info">v-permission="['admin']"</el-tag> + </div> + + <div> + <span v-permission="['editor']" class="permission-alert"> + Only + <el-tag class="permission-tag" size="small">editor</el-tag> can see this + </span> + <el-tag v-permission="['editor']" class="permission-sourceCode" type="info">v-permission="['editor']"</el-tag> + </div> + + <div> + <span v-permission="['admin','editor']" class="permission-alert"> + Both + <el-tag class="permission-tag" size="small">admin</el-tag> and + <el-tag class="permission-tag" size="small">editor</el-tag> can see this + </span> + <el-tag v-permission="['admin','editor']" class="permission-sourceCode" type="info">v-permission="['admin','editor']"</el-tag> + </div> </div> - <div :key="'checkPermission'+key" style="margin-top:30px;"> - <code>In some cases it is not suitable to use v-permission, such as element Tab component which can only be achieved by manually setting the v-if. + <div :key="'checkPermission'+key" style="margin-top:60px;"> + <code> + {{ $t('permission.tips') }} <br> e.g. </code> - <el-tabs type="border-card" style="width:500px;"> - <el-tab-pane v-if="checkPermission(['admin'])" label="Admin">Admin can see this</el-tab-pane> - <el-tab-pane v-if="checkPermission(['editor'])" label="Editor">Editor can see this</el-tab-pane> - <el-tab-pane v-if="checkPermission(['admin','editor'])" label="Admin-OR-Editor">Both admin or editor can see this</el-tab-pane> + + <el-tabs type="border-card" style="width:550px;"> + <el-tab-pane v-if="checkPermission(['admin'])" label="Admin"> + Admin can see this + <el-tag class="permission-sourceCode" type="info">v-if="checkPermission(['admin'])"</el-tag> + </el-tab-pane> + + <el-tab-pane v-if="checkPermission(['editor'])" label="Editor"> + Editor can see this + <el-tag class="permission-sourceCode" type="info">v-if="checkPermission(['editor'])"</el-tag> + </el-tab-pane> + + <el-tab-pane v-if="checkPermission(['admin','editor'])" label="Admin-OR-Editor"> + Both admin or editor can see this + <el-tag class="permission-sourceCode" type="info">v-if="checkPermission(['admin','editor'])"</el-tag> + </el-tab-pane> </el-tabs> </div> </div> @@ -57,14 +81,17 @@ export default{ .app-container { /deep/ .permission-alert { width: 320px; - margin-top: 30px; + margin-top: 15px; background-color: #f0f9eb; color: #67c23a; padding: 8px 16px; border-radius: 4px; - display: block; + display: inline-block; } - /deep/ .permission-tag{ + /deep/ .permission-sourceCode { + margin-left: 15px; + } + /deep/ .permission-tag { background-color: #ecf5ff; } } From 311796a14b034fdd6e670fbb0f415dc12f3a3df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 28 Dec 2018 15:28:26 +0800 Subject: [PATCH 010/202] perf[Sidebar]: refine sidebar store #1473 (#1474) --- src/store/modules/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/store/modules/app.js b/src/store/modules/app.js index bc4fb478..fba4b05c 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -3,7 +3,7 @@ import Cookies from 'js-cookie' const app = { state: { sidebar: { - opened: !+Cookies.get('sidebarStatus'), + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, withoutAnimation: false }, device: 'desktop', @@ -12,16 +12,16 @@ const app = { }, mutations: { TOGGLE_SIDEBAR: state => { + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false if (state.sidebar.opened) { Cookies.set('sidebarStatus', 1) } else { Cookies.set('sidebarStatus', 0) } - state.sidebar.opened = !state.sidebar.opened - state.sidebar.withoutAnimation = false }, CLOSE_SIDEBAR: (state, withoutAnimation) => { - Cookies.set('sidebarStatus', 1) + Cookies.set('sidebarStatus', 0) state.sidebar.opened = false state.sidebar.withoutAnimation = withoutAnimation }, From c98d5787575e6048a7a65f1aed45cafcf7d3acd8 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 31 Dec 2018 21:22:20 +0800 Subject: [PATCH 011/202] [release] 3.10.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 75d88dd4..66bfe789 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-admin", - "version": "3.9.3", + "version": "3.10.0", "description": "A magical vue admin. Typical templates for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", From 3dd29ab07abba639e5ab581e699d3c4b03d53fbc Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 9 Jan 2019 14:48:19 +0800 Subject: [PATCH 012/202] chore: update webpack-dev-server --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66bfe789..8ba9aadf 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "webpack": "4.16.5", "webpack-bundle-analyzer": "2.13.1", "webpack-cli": "3.1.0", - "webpack-dev-server": "3.1.5", + "webpack-dev-server": "3.1.14", "webpack-merge": "4.1.4" }, "engines": { From 68a19d55deddec5c34ee2f81f49b9407b184a6ab Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 9 Jan 2019 14:53:36 +0800 Subject: [PATCH 013/202] fix[chore]: fix error when enable gzip --- build/webpack.prod.conf.js | 1 - package.json | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js index 946a134a..4f84e0c6 100644 --- a/build/webpack.prod.conf.js +++ b/build/webpack.prod.conf.js @@ -150,7 +150,6 @@ if (config.build.productionGzip) { webpackConfig.plugins.push( new CompressionWebpackPlugin({ - asset: '[path].gz[query]', algorithm: 'gzip', test: new RegExp( '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' diff --git a/package.json b/package.json index 8ba9aadf..e5b0b9ec 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "babel-preset-env": "1.7.0", "babel-preset-stage-2": "6.24.1", "chalk": "2.4.1", + "compression-webpack-plugin": "2.0.0", "copy-webpack-plugin": "4.5.2", "cross-env": "5.2.0", "css-loader": "1.0.0", From 9cea3c3abe31746c044db1388d24ee86e343a623 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 9 Jan 2019 16:04:24 +0800 Subject: [PATCH 014/202] refine: GetUserInfo error message --- src/permission.js | 2 +- src/store/modules/user.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/permission.js b/src/permission.js index 81f9d113..e556cb00 100644 --- a/src/permission.js +++ b/src/permission.js @@ -33,7 +33,7 @@ router.beforeEach((to, from, next) => { }) }).catch((err) => { store.dispatch('FedLogOut').then(() => { - Message.error(err || 'Verification failed, please login again') + Message.error(err) next({ path: '/' }) }) }) diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 0f7e2296..38e81a36 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -63,15 +63,16 @@ const user = { GetUserInfo({ commit, state }) { return new Promise((resolve, reject) => { getUserInfo(state.token).then(response => { - if (!response.data) { // 由于mockjs 不支持自定义状态码只能这样hack - reject('error') + // 由于mockjs 不支持自定义状态码只能这样hack + if (!response.data) { + reject('Verification failed, please login again.') } const data = response.data if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组 commit('SET_ROLES', data.roles) } else { - reject('getInfo: roles must be a non-null array !') + reject('getInfo: roles must be a non-null array!') } commit('SET_NAME', data.name) From 1bb9283eddbba310b72c876dc8807a66b76c26c8 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev <mail@sobolevn.me> Date: Thu, 10 Jan 2019 05:05:17 +0300 Subject: [PATCH 015/202] fix typo (#1505) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d0ff7d74..cf67c757 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - Multiple dynamic themes - Dynamic sidebar (supports multi-level routing) - Dynamic breadcrumb - - Tags-view(Tab page Support right-click operation) + - Tags-view (Tab page Support right-click operation) - Svg Sprite - Mock data - Screenfull From 5ea614fe5d1fead70f62879410d2cd4358b34e7c Mon Sep 17 00:00:00 2001 From: Duy Nguyen Hoang <nhduy88@gmail.com> Date: Fri, 11 Jan 2019 15:37:59 +0800 Subject: [PATCH 016/202] perf: add sidebar width to variables.scss (#1494) --- src/styles/sidebar.scss | 18 +++++++++--------- src/styles/variables.scss | 2 ++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index faa7366e..2de9fd91 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -1,15 +1,15 @@ #app { - // 主体区域 + // 主体区域 Main container .main-container { min-height: 100%; transition: margin-left .28s; - margin-left: 180px; + margin-left: $sideBarWidth; position: relative; } - // 侧边栏 + // 侧边栏 Sidebar container .sidebar-container { transition: width 0.28s; - width: 180px !important; + width: $sideBarWidth !important; height: 100%; position: fixed; font-size: 0px; @@ -90,29 +90,29 @@ } .sidebar-container .nest-menu .el-submenu>.el-submenu__title, .sidebar-container .el-submenu .el-menu-item { - min-width: 180px !important; + min-width: $sideBarWidth !important; background-color: $subMenuBg !important; &:hover { background-color: $menuHover !important; } } .el-menu--collapse .el-menu .el-submenu { - min-width: 180px !important; + min-width: $sideBarWidth !important; } - //适配移动端 + // 适配移动端, Mobile responsive .mobile { .main-container { margin-left: 0px; } .sidebar-container { transition: transform .28s; - width: 180px !important; + width: $sideBarWidth !important; } &.hideSidebar { .sidebar-container { transition-duration: 0.3s; - transform: translate3d(-180px, 0, 0); + transform: translate3d(-$sideBarWidth, 0, 0); } } } diff --git a/src/styles/variables.scss b/src/styles/variables.scss index acc77a82..1af649c4 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -11,3 +11,5 @@ $panGreen: #30B08F; $menuBg:#304156; $subMenuBg:#1f2d3d; $menuHover:#001528; + +$sideBarWidth: 180px; From c54e99d0a9c9a5ec18300ad60409b8b444771cd9 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 11 Jan 2019 15:42:53 +0800 Subject: [PATCH 017/202] tweak --- src/styles/btn.scss | 7 +- src/styles/element-ui.scss | 129 +++++++++++++++++++------------------ src/styles/index.scss | 20 ++++-- src/styles/mixin.scss | 6 ++ src/styles/sidebar.scss | 40 ++++++++++-- src/styles/transition.scss | 3 +- src/styles/variables.scss | 2 +- 7 files changed, 128 insertions(+), 79 deletions(-) diff --git a/src/styles/btn.scss b/src/styles/btn.scss index 0c5ee768..e6ba1a8e 100644 --- a/src/styles/btn.scss +++ b/src/styles/btn.scss @@ -2,8 +2,10 @@ @mixin colorBtn($color) { background: $color; + &:hover { color: $color; + &:before, &:after { background: $color; @@ -49,14 +51,17 @@ transition: 600ms ease all; position: relative; display: inline-block; + &:hover { background: #fff; + &:before, &:after { width: 100%; transition: 600ms ease all; } } + &:before, &:after { content: ''; @@ -67,6 +72,7 @@ width: 0; transition: 400ms ease all; } + &::after { right: inherit; top: inherit; @@ -91,4 +97,3 @@ font-size: 14px; border-radius: 4px; } - diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss index dc59591e..494dcfa4 100644 --- a/src/styles/element-ui.scss +++ b/src/styles/element-ui.scss @@ -1,82 +1,85 @@ - //覆盖一些element-ui样式 +//覆盖一些element-ui样式 - .el-breadcrumb__inner, .el-breadcrumb__inner a{ - font-weight: 400!important; +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; } - .el-upload { - input[type="file"] { - display: none !important; - } - } +.el-upload { + input[type="file"] { + display: none !important; + } +} - .el-upload__input { - display: none; - } +.el-upload__input { + display: none; +} - .cell { - .el-tag { - margin-right: 0px; - } - } +.cell { + .el-tag { + margin-right: 0px; + } +} - .small-padding { - .cell { - padding-left: 5px; - padding-right: 5px; - } - } +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} - .fixed-width{ - .el-button--mini{ +.fixed-width { + .el-button--mini { padding: 7px 10px; width: 60px; } - } +} - .status-col { - .cell { - padding: 0 10px; - text-align: center; - .el-tag { - margin-right: 0px; - } - } - } +.status-col { + .cell { + padding: 0 10px; + text-align: center; - //暂时性解决dialog 问题 https://github.com/ElemeFE/element/issues/2461 - .el-dialog { - transform: none; - left: 0; - position: relative; - margin: 0 auto; - } + .el-tag { + margin-right: 0px; + } + } +} - //文章页textarea修改样式 - .article-textarea { - textarea { - padding-right: 40px; - resize: none; - border: none; - border-radius: 0px; - border-bottom: 1px solid #bfcbd9; - } - } +//暂时性解决dialog 问题 https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} - //element ui upload - .upload-container { - .el-upload { - width: 100%; - .el-upload-dragger { - width: 100%; - height: 200px; - } - } - } +//文章页textarea修改样式 +.article-textarea { + textarea { + padding-right: 40px; + resize: none; + border: none; + border-radius: 0px; + border-bottom: 1px solid #bfcbd9; + } +} + +//element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} //dropdown - .el-dropdown-menu{ - a{ +.el-dropdown-menu { + a { display: block } } diff --git a/src/styles/index.scss b/src/styles/index.scss index b6fd924e..93f2157e 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -22,7 +22,7 @@ html { box-sizing: border-box; } -#app{ +#app { height: 100%; } @@ -53,9 +53,9 @@ a:hover { text-decoration: none; } -div:focus{ +div:focus { outline: none; - } +} .fr { float: right; @@ -104,23 +104,26 @@ code { line-height: 36px; font-size: 15px; font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif; + a { color: #337ab7; cursor: pointer; + &:hover { color: rgb(32, 160, 255); } } } -.warn-content{ - background: rgba(66,185,131,.1); +.warn-content { + background: rgba(66, 185, 131, .1); border-radius: 2px; padding: 16px; padding: 1rem; line-height: 1.6rem; word-spacing: .05rem; - a{ + + a { color: #42b983; font-weight: 600; } @@ -153,13 +156,16 @@ code { padding-right: 20px; transition: 600ms ease position; background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + .subtitle { font-size: 20px; color: #fff; } + &.draft { background: #d0d0d0; } + &.deleted { background: #d0d0d0; } @@ -169,6 +175,7 @@ code { .link-type:focus { color: #337ab7; cursor: pointer; + &:hover { color: rgb(32, 160, 255); } @@ -176,6 +183,7 @@ code { .filter-container { padding-bottom: 10px; + .filter-item { display: inline-block; vertical-align: middle; diff --git a/src/styles/mixin.scss b/src/styles/mixin.scss index 822ab92a..06fa0612 100644 --- a/src/styles/mixin.scss +++ b/src/styles/mixin.scss @@ -10,9 +10,11 @@ &::-webkit-scrollbar-track-piece { background: #d3dce6; } + &::-webkit-scrollbar { width: 6px; } + &::-webkit-scrollbar-thumb { background: #99a9bf; border-radius: 20px; @@ -37,21 +39,25 @@ $transparent-border-style: $width solid transparent; height: 0; width: 0; + @if $direction==up { border-bottom: $color-border-style; border-left: $transparent-border-style; border-right: $transparent-border-style; } + @else if $direction==right { border-left: $color-border-style; border-top: $transparent-border-style; border-bottom: $transparent-border-style; } + @else if $direction==down { border-top: $color-border-style; border-left: $transparent-border-style; border-right: $transparent-border-style; } + @else if $direction==left { border-right: $color-border-style; border-top: $transparent-border-style; diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 2de9fd91..723f9a12 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -1,4 +1,5 @@ #app { + // 主体区域 Main container .main-container { min-height: 100%; @@ -6,6 +7,7 @@ margin-left: $sideBarWidth; position: relative; } + // 侧边栏 Sidebar container .sidebar-container { transition: width 0.28s; @@ -18,62 +20,79 @@ left: 0; z-index: 1001; overflow: hidden; + //reset element-ui css .horizontal-collapse-transition { transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; } + .scrollbar-wrapper { - overflow-x: hidden!important; + overflow-x: hidden !important; + .el-scrollbar__view { height: 100%; } } - .el-scrollbar__bar.is-vertical{ + + .el-scrollbar__bar.is-vertical { right: 0px; } + .is-horizontal { display: none; } + a { display: inline-block; width: 100%; overflow: hidden; } + .svg-icon { margin-right: 16px; } + .el-menu { border: none; height: 100%; width: 100% !important; } - .is-active > .el-submenu__title{ - color: #f4f4f5!important; + + .is-active>.el-submenu__title { + color: #f4f4f5 !important; } } + .hideSidebar { .sidebar-container { width: 36px !important; } + .main-container { margin-left: 36px; } + .submenu-title-noDropdown { padding-left: 10px !important; position: relative; + .el-tooltip { padding: 0 10px !important; } } + .el-submenu { overflow: hidden; + &>.el-submenu__title { padding-left: 10px !important; + .el-submenu__icon-arrow { display: none; } } } + .el-menu--collapse { .el-submenu { &>.el-submenu__title { @@ -88,14 +107,17 @@ } } } + .sidebar-container .nest-menu .el-submenu>.el-submenu__title, .sidebar-container .el-submenu .el-menu-item { min-width: $sideBarWidth !important; background-color: $subMenuBg !important; + &:hover { background-color: $menuHover !important; } } + .el-menu--collapse .el-menu .el-submenu { min-width: $sideBarWidth !important; } @@ -105,10 +127,12 @@ .main-container { margin-left: 0px; } + .sidebar-container { transition: transform .28s; width: $sideBarWidth !important; } + &.hideSidebar { .sidebar-container { transition-duration: 0.3s; @@ -116,7 +140,9 @@ } } } + .withoutAnimation { + .main-container, .sidebar-container { transition: none; @@ -124,9 +150,9 @@ } } -.el-menu--vertical{ - & >.el-menu{ - .svg-icon{ +.el-menu--vertical { + &>.el-menu { + .svg-icon { margin-right: 16px; } } diff --git a/src/styles/transition.scss b/src/styles/transition.scss index 04e16279..ab68317d 100644 --- a/src/styles/transition.scss +++ b/src/styles/transition.scss @@ -16,10 +16,12 @@ .fade-transform-enter-active { transition: all .5s; } + .fade-transform-enter { opacity: 0; transform: translateX(-30px); } + .fade-transform-leave-to { opacity: 0; transform: translateX(30px); @@ -44,4 +46,3 @@ .breadcrumb-leave-active { position: absolute; } - diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 1af649c4..09c3e9b0 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -1,3 +1,4 @@ +// base color $blue:#324157; $light-blue:#3A71A8; $red:#C03639; @@ -11,5 +12,4 @@ $panGreen: #30B08F; $menuBg:#304156; $subMenuBg:#1f2d3d; $menuHover:#001528; - $sideBarWidth: 180px; From 109c393cc6ee0cb1fc7fe097645cd4ddf1bf980a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 14 Jan 2019 14:07:56 +0800 Subject: [PATCH 018/202] fix[ThemePicker]: fixed bug when oldVal is null (#1517) --- src/components/ThemePicker/index.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index e797d6c2..5d1ff8bd 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -18,7 +18,8 @@ export default { } }, watch: { - theme(val, oldVal) { + theme(val) { + const oldVal = this.theme if (typeof val !== 'string') return const themeCluster = this.getThemeCluster(val.replace('#', '')) const originalCluster = this.getThemeCluster(oldVal.replace('#', '')) From 77a40745bb702e3f99ce1d2e7110ad3cb7202c69 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 15 Jan 2019 14:14:39 +0800 Subject: [PATCH 019/202] update README.md --- README.zh-CN.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 55882115..d6cacf56 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -40,7 +40,7 @@ - [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) -- [Donate](https://panjiachen.github.io/vue-element-admin-site/zh/donate/) +- [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) - [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览 @@ -214,6 +214,8 @@ Detailed changes for each release are documented in the [release notes](https:// 如果你觉得这个项目帮助到了你,你可以帮作者买一杯果汁表示鼓励 :tropical_drink:  +[更多捐赠方式](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) + [Paypal Me](https://www.paypal.me/panfree23) ## Browsers support From f767fab4cc085361d6177c8ddd492cf4cf791f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 15 Jan 2019 16:36:03 +0800 Subject: [PATCH 020/202] fix[Breadcrumb]: fixed eslint error (#1521) --- src/components/Breadcrumb/index.vue | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 4b321e06..5bc7a1b8 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -1,7 +1,7 @@ <template> <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> - <el-breadcrumb-item v-for="(item,index) in levelList" v-if="item.meta.title&&item.meta.breadcrumb!==false" :key="item.path"> + <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ generateTitle(item.meta.title) }}</span> <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> @@ -31,16 +31,14 @@ export default { methods: { generateTitle, getBreadcrumb() { - let matched = this.$route.matched.filter(item => { - if (item.name) { - return true - } - }) + let matched = this.$route.matched.filter(item => item.name) + const first = matched[0] if (first && first.name.trim().toLocaleLowerCase() !== 'Dashboard'.toLocaleLowerCase()) { matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched) } - this.levelList = matched + + this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) }, pathCompile(path) { // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561 From d84a17688d3717a649dabf72e5e2213d0887f2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 16 Jan 2019 10:18:32 +0800 Subject: [PATCH 021/202] fix[DndList]: fixed drag bug (#1527) https://github.com/PanJiaChen/vue-element-admin/issues/1524 --- src/components/DndList/index.vue | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/components/DndList/index.vue b/src/components/DndList/index.vue index 43e0bb28..7587daa7 100644 --- a/src/components/DndList/index.vue +++ b/src/components/DndList/index.vue @@ -4,7 +4,7 @@ <h3>{{ list1Title }}</h3> <draggable :list="list1" :options="{group:'article'}" class="dragArea"> <div v-for="element in list1" :key="element.id" class="list-complete-item"> - <div class="list-complete-item-handle">[{{ element.author }}] {{ element.title }}</div> + <div class="list-complete-item-handle">{{ element.id }}[{{ element.author }}] {{ element.title }}</div> <div style="position:absolute;right:0px;"> <span style="float: right ;margin-top: -20px;margin-right:5px;" @click="deleteEle(element)"> <i style="color:#ff4949" class="el-icon-delete"/> @@ -15,9 +15,9 @@ </div> <div :style="{width:width2}" class="dndList-list"> <h3>{{ list2Title }}</h3> - <draggable :list="filterList2" :options="{group:'article'}" class="dragArea"> - <div v-for="element in filterList2" :key="element.id" class="list-complete-item"> - <div class="list-complete-item-handle2" @click="pushEle(element)"> [{{ element.author }}] {{ element.title }}</div> + <draggable :list="list2" :options="{group:'article'}" class="dragArea"> + <div v-for="element in list2" :key="element.id" class="list-complete-item"> + <div class="list-complete-item-handle2" @click="pushEle(element)">{{ element.id }} [{{ element.author }}] {{ element.title }}</div> </div> </draggable> </div> @@ -60,16 +60,6 @@ export default { default: '48%' } }, - computed: { - filterList2() { - return this.list2.filter(v => { - if (this.isNotInList1(v)) { - return v - } - return false - }) - } - }, methods: { isNotInList1(v) { return this.list1.every(k => v.id !== k.id) @@ -90,7 +80,16 @@ export default { } }, pushEle(ele) { - this.list1.push(ele) + for (const item of this.list2) { + if (item.id === ele.id) { + const index = this.list2.indexOf(item) + this.list2.splice(index, 1) + break + } + } + if (this.isNotInList1(ele)) { + this.list1.push(ele) + } } } } From 6234db924e572e3106ccdf7450621af29486f753 Mon Sep 17 00:00:00 2001 From: Jiankian <luozhengan@vip.qq.com> Date: Wed, 16 Jan 2019 15:05:12 +0800 Subject: [PATCH 022/202] pref[Hamburger]: refactor Hamburger component (#1528) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 美化侧栏菜单切换按钮 * tweak --- src/components/Hamburger/index.vue | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue index 26472e23..220d67ec 100644 --- a/src/components/Hamburger/index.vue +++ b/src/components/Hamburger/index.vue @@ -2,26 +2,13 @@ <div> <svg :class="{'is-active':isActive}" - t="1492500959545" class="hamburger" - style="" viewBox="0 0 1024 1024" - version="1.1" xmlns="http://www.w3.org/2000/svg" - p-id="1691" - xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64" @click="toggleClick"> - <path - d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z" - p-id="1692"/> - <path - d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z" - p-id="1693"/> - <path - d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z" - p-id="1694"/> + <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" /> </svg> </div> </template> @@ -48,12 +35,8 @@ export default { cursor: pointer; width: 20px; height: 20px; - transform: rotate(90deg); - transition: .38s; - transform-origin: 50% 50%; } - .hamburger.is-active { - transform: rotate(0deg); + transform: rotate(180deg); } </style> From ac8eddf3d7662a36c8ad3f3fde52af12e0a77150 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 22 Jan 2019 16:35:53 +0800 Subject: [PATCH 023/202] update element-ui version --- README.md | 2 +- README.zh-CN.md | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cf67c757..bf0e08be 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ <img src="https://img.shields.io/badge/vue-2.5.17-brightgreen.svg" alt="vue"> </a> <a href="https://github.com/ElemeFE/element"> - <img src="https://img.shields.io/badge/element--ui-2.4.6-brightgreen.svg" alt="element-ui"> + <img src="https://img.shields.io/badge/element--ui-2.4.11-brightgreen.svg" alt="element-ui"> </a> <a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow"> <img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Build Status"> diff --git a/README.zh-CN.md b/README.zh-CN.md index d6cacf56..5dc9f1d7 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -7,7 +7,7 @@ <img src="https://img.shields.io/badge/vue-2.5.10-brightgreen.svg" alt="vue"> </a> <a href="https://github.com/ElemeFE/element"> - <img src="https://img.shields.io/badge/element--ui-2.3.2-brightgreen.svg" alt="element-ui"> + <img src="https://img.shields.io/badge/element--ui-2.4.11-brightgreen.svg" alt="element-ui"> </a> <a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow"> <img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Build Status"> diff --git a/package.json b/package.json index e5b0b9ec..83e93bce 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "driver.js": "0.8.1", "dropzone": "5.2.0", "echarts": "4.1.0", - "element-ui": "2.4.6", + "element-ui": "2.4.11", "file-saver": "1.3.8", "js-cookie": "2.2.0", "jsonlint": "1.6.3", From 8cf279fbe1e6b698b147a869290138934e003455 Mon Sep 17 00:00:00 2001 From: Yuga Sun <yuga_sun@163.com> Date: Wed, 23 Jan 2019 11:18:02 +0800 Subject: [PATCH 024/202] perf[Login Form]: optimize eye icon style (#1545) * optimiz: eye icon style for login form * change eye-open svg --- src/icons/svg/eye-open.svg | 1 + src/views/login/index.vue | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/icons/svg/eye-open.svg diff --git a/src/icons/svg/eye-open.svg b/src/icons/svg/eye-open.svg new file mode 100644 index 00000000..88dcc98e --- /dev/null +++ b/src/icons/svg/eye-open.svg @@ -0,0 +1 @@ +<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg> \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 5e872595..a44c6ad3 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,11 +1,11 @@ <template> <div class="login-container"> - <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left"> - <div class="title-container"> - <h3 class="title">{{ $t('login.title') }}</h3> - <lang-select class="set-language"/> + <h3 class="title"> + {{ $t('login.title') }} + </h3> + <lang-select class="set-language" /> </div> <el-form-item prop="username"> @@ -26,18 +26,21 @@ <svg-icon icon-class="password" /> </span> <el-input - :type="passwordType" v-model="loginForm.password" + :type="passwordType" :placeholder="$t('login.password')" name="password" auto-complete="on" - @keyup.enter.native="handleLogin" /> + @keyup.enter.native="handleLogin" + /> <span class="show-pwd" @click="showPwd"> - <svg-icon icon-class="eye" /> + <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> </span> </el-form-item> - <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">{{ $t('login.logIn') }}</el-button> + <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin"> + {{ $t('login.logIn') }} + </el-button> <div style="position:relative"> <div class="tips"> @@ -45,11 +48,15 @@ <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> </div> <div class="tips"> - <span style="margin-right:18px;">{{ $t('login.username') }} : editor</span> + <span style="margin-right:18px;"> + {{ $t('login.username') }} : editor + </span> <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> </div> - <el-button class="thirdparty-button" type="primary" @click="showDialog=true">{{ $t('login.thirdparty') }}</el-button> + <el-button class="thirdparty-button" type="primary" @click="showDialog=true"> + {{ $t('login.thirdparty') }} + </el-button> </div> </el-form> @@ -60,7 +67,6 @@ <br> <social-sign /> </el-dialog> - </div> </template> From eb1d3381f48ff81632b22f944e1f53563ef22a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 24 Jan 2019 11:14:23 +0800 Subject: [PATCH 025/202] perf[Sticky]: export reset method (#1550) --- src/components/Sticky/index.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/Sticky/index.vue b/src/components/Sticky/index.vue index e0fb7c57..a287216d 100644 --- a/src/components/Sticky/index.vue +++ b/src/components/Sticky/index.vue @@ -56,10 +56,13 @@ export default { this.width = this.width + 'px' this.isSticky = true }, - reset() { + handleReset() { if (!this.active) { return } + this.reset() + }, + reset() { this.position = '' this.width = 'auto' this.active = false @@ -72,7 +75,7 @@ export default { this.sticky() return } - this.reset() + this.handleReset() }, handleReize() { if (this.isSticky) { From 8ef6c7ee7dc7cd78ccbc2545a1ec29fad5243cee Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 24 Jan 2019 13:48:19 +0800 Subject: [PATCH 026/202] perf[Sticky]: refine width default value --- src/components/Sticky/index.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Sticky/index.vue b/src/components/Sticky/index.vue index a287216d..5624a989 100644 --- a/src/components/Sticky/index.vue +++ b/src/components/Sticky/index.vue @@ -69,7 +69,8 @@ export default { this.isSticky = false }, handleScroll() { - this.width = this.$el.getBoundingClientRect().width + const width = this.$el.getBoundingClientRect().width + this.width = width || 'auto' const offsetTop = this.$el.getBoundingClientRect().top if (offsetTop < this.stickyTop) { this.sticky() From 23055c9b2c332930bddac1d25d099fde14390f76 Mon Sep 17 00:00:00 2001 From: xbigcat <big.cat@qq.com> Date: Thu, 24 Jan 2019 15:32:35 +0800 Subject: [PATCH 027/202] perf[utils]: refine parseTime function (#1546) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 优化 parseTime 修复传入的时间戳是字符串类型,不能转换时间的问题 例:parseTime("1548221490638") * Update index.js --- src/utils/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/utils/index.js b/src/utils/index.js index 0445827b..821392e9 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -11,7 +11,12 @@ export function parseTime(time, cFormat) { if (typeof time === 'object') { date = time } else { - if (('' + time).length === 10) time = parseInt(time) * 1000 + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } date = new Date(time) } const formatObj = { From 3153a1b10bc32e1650c644d829f284d37ee044c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 25 Jan 2019 12:50:21 +0800 Subject: [PATCH 028/202] perf[UploadExcel]: optimized code (#1552) --- src/components/UploadExcel/index.vue | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/components/UploadExcel/index.vue b/src/components/UploadExcel/index.vue index 20e16398..a6b8dbce 100644 --- a/src/components/UploadExcel/index.vue +++ b/src/components/UploadExcel/index.vue @@ -82,8 +82,7 @@ export default { const reader = new FileReader() reader.onload = e => { const data = e.target.result - const fixedData = this.fixData(data) - const workbook = XLSX.read(btoa(fixedData), { type: 'base64' }) + const workbook = XLSX.read(data, { type: 'array' }) const firstSheetName = workbook.SheetNames[0] const worksheet = workbook.Sheets[firstSheetName] const header = this.getHeaderRow(worksheet) @@ -95,14 +94,6 @@ export default { reader.readAsArrayBuffer(rawFile) }) }, - fixData(data) { - let o = '' - let l = 0 - const w = 10240 - for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w))) - o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w))) - return o - }, getHeaderRow(sheet) { const headers = [] const range = XLSX.utils.decode_range(sheet['!ref']) From 9daeb1cb340136fdbbec021fe20941a97dc41d5b Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 29 Jan 2019 16:54:38 +0800 Subject: [PATCH 029/202] perf: adjust the import order to make it more elegant #1537 --- src/main.js | 2 +- src/store/modules/permission.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.js b/src/main.js index 1ce709c9..7739639d 100644 --- a/src/main.js +++ b/src/main.js @@ -10,8 +10,8 @@ import 'element-ui/lib/theme-chalk/index.css' import '@/styles/index.scss' // global css import App from './App' -import router from './router' import store from './store' +import router from './router' import i18n from './lang' // Internationalization import './icons' // icon diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 97de701e..13f60efb 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -36,7 +36,7 @@ function filterAsyncRouter(routes, roles) { const permission = { state: { - routers: constantRouterMap, + routers: [], addRouters: [] }, mutations: { From 727c1a45dd15bd668cfe584a2af8b5b0a9cd28ec Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 29 Jan 2019 18:00:59 +0800 Subject: [PATCH 030/202] perf[Sidebar]: use sass variables in vue template --- src/styles/variables.scss | 12 ++++++++++++ src/views/layout/components/Sidebar/index.vue | 10 +++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 09c3e9b0..87a5dd50 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -12,4 +12,16 @@ $panGreen: #30B08F; $menuBg:#304156; $subMenuBg:#1f2d3d; $menuHover:#001528; +$menuText:#bfcbd9; +$menuActiveText:#409EFF; $sideBarWidth: 180px; + +// the :export directive is the magic sauce for webpack +:export { + menuBg: $menuBg; + subMenuBg: $subMenuBg; + menuHover: $menuHover; + menuText:$menuText; + menuActiveText:$menuActiveText; + sideBarWidth: $sideBarWidth; +} diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index dff85f18..48407286 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -4,10 +4,10 @@ :show-timeout="200" :default-active="$route.path" :collapse="isCollapse" + :background-color="variables.menuBg" + :text-color="variables.menuText" + :active-text-color="variables.menuActiveText" mode="vertical" - background-color="#304156" - text-color="#bfcbd9" - active-text-color="#409EFF" > <sidebar-item v-for="route in permission_routers" :key="route.path" :item="route" :base-path="route.path"/> </el-menu> @@ -17,6 +17,7 @@ <script> import { mapGetters } from 'vuex' import SidebarItem from './SidebarItem' +import variables from '@/styles/variables.scss' export default { components: { SidebarItem }, @@ -25,6 +26,9 @@ export default { 'permission_routers', 'sidebar' ]), + variables() { + return variables + }, isCollapse() { return !this.sidebar.opened } From b44000c9dea21525c600a6881c3b0973fe218d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 30 Jan 2019 12:58:11 +0800 Subject: [PATCH 031/202] perf[Style]: optimize the sidebar style to make it better to set (#1568) --- src/styles/sidebar.scss | 39 ++++++++++++++++++++++++++++----------- src/styles/variables.scss | 19 +++++++++++++------ 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 723f9a12..f4f699a5 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -58,8 +58,26 @@ width: 100% !important; } + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + .is-active>.el-submenu__title { - color: #f4f4f5 !important; + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } } } @@ -108,16 +126,6 @@ } } - .sidebar-container .nest-menu .el-submenu>.el-submenu__title, - .sidebar-container .el-submenu .el-menu-item { - min-width: $sideBarWidth !important; - background-color: $subMenuBg !important; - - &:hover { - background-color: $menuHover !important; - } - } - .el-menu--collapse .el-menu .el-submenu { min-width: $sideBarWidth !important; } @@ -150,10 +158,19 @@ } } +// when menu collapsed .el-menu--vertical { &>.el-menu { .svg-icon { margin-right: 16px; } } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // You can use $subMenuHover + background-color: $menuHover !important; + } + } } diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 87a5dd50..50d9b3ef 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -9,19 +9,26 @@ $yellow:#FEC171; $panGreen: #30B08F; //sidebar -$menuBg:#304156; -$subMenuBg:#1f2d3d; -$menuHover:#001528; $menuText:#bfcbd9; $menuActiveText:#409EFF; +$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#304156; +$menuHover:#263445; + +$subMenuBg:#1f2d3d; +$subMenuHover:#001528; + $sideBarWidth: 180px; // the :export directive is the magic sauce for webpack :export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; menuBg: $menuBg; - subMenuBg: $subMenuBg; menuHover: $menuHover; - menuText:$menuText; - menuActiveText:$menuActiveText; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; sideBarWidth: $sideBarWidth; } From 4b3a41c5359acfea2bf4537d16135784c8743bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 30 Jan 2019 12:58:30 +0800 Subject: [PATCH 032/202] perf[SizeSelect]: add default size option (#1566) --- src/components/SizeSelect/index.vue | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue index 0e428a23..a92a17c3 100644 --- a/src/components/SizeSelect/index.vue +++ b/src/components/SizeSelect/index.vue @@ -4,15 +4,24 @@ <svg-icon class-name="size-icon" icon-class="size" /> </div> <el-dropdown-menu slot="dropdown"> - <el-dropdown-item :disabled="size==='medium'" command="medium">Medium</el-dropdown-item> - <el-dropdown-item :disabled="size==='small'" command="small">Small</el-dropdown-item> - <el-dropdown-item :disabled="size==='mini'" command="mini">Mini</el-dropdown-item> + <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value">{{ + item.label }}</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </template> <script> export default { + data() { + return { + sizeOptions: [ + { label: 'Default', value: 'default' }, + { label: 'Medium', value: 'medium' }, + { label: 'Small', value: 'small' }, + { label: 'Mini', value: 'mini' } + ] + } + }, computed: { size() { return this.$store.getters.size From 3b9abde89a56a18b089252d02062b095e26911ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 30 Jan 2019 13:38:01 +0800 Subject: [PATCH 033/202] fix[SIdebar]: fixed bug in mobile #1567 (#1569) --- src/styles/sidebar.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index f4f699a5..ce619fd3 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -143,6 +143,7 @@ &.hideSidebar { .sidebar-container { + pointer-events: none; transition-duration: 0.3s; transform: translate3d(-$sideBarWidth, 0, 0); } From 6e42b4c896a712bad9a4494c4bedd9a3df163daf Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 1 Feb 2019 14:09:29 +0800 Subject: [PATCH 034/202] perf: fixed eslint errors --- src/views/layout/components/Sidebar/Link.vue | 7 ++--- .../layout/components/Sidebar/SidebarItem.vue | 28 ++++++++++--------- src/views/table/dragTable.vue | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/views/layout/components/Sidebar/Link.vue b/src/views/layout/components/Sidebar/Link.vue index 5d366f24..cd2e0413 100644 --- a/src/views/layout/components/Sidebar/Link.vue +++ b/src/views/layout/components/Sidebar/Link.vue @@ -1,6 +1,6 @@ <template> - <!-- eslint-disable vue/require-component-is--> + <!-- eslint-disable vue/require-component-is --> <component v-bind="linkProps(to)"> <slot/> </component> @@ -17,11 +17,8 @@ export default { } }, methods: { - isExternalLink(routePath) { - return isExternal(routePath) - }, linkProps(url) { - if (this.isExternalLink(url)) { + if (isExternal(url)) { return { is: 'a', href: url, diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 8a9b4396..56edf9f7 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -14,20 +14,22 @@ <item v-if="item.meta" :icon="item.meta.icon" :title="generateTitle(item.meta.title)" /> </template> - <template v-for="child in item.children" v-if="!child.hidden"> - <sidebar-item - v-if="child.children&&child.children.length>0" - :is-nest="true" - :item="child" - :key="child.path" - :base-path="resolvePath(child.path)" - class="nest-menu" /> + <template v-for="child in item.children"> + <template v-if="!child.hidden"> + <sidebar-item + v-if="child.children&&child.children.length>0" + :is-nest="true" + :item="child" + :key="child.path" + :base-path="resolvePath(child.path)" + class="nest-menu" /> - <app-link v-else :to="resolvePath(child.path)" :key="child.name"> - <el-menu-item :index="resolvePath(child.path)"> - <item v-if="child.meta" :icon="child.meta.icon" :title="generateTitle(child.meta.title)" /> - </el-menu-item> - </app-link> + <app-link v-else :to="resolvePath(child.path)" :key="child.name"> + <el-menu-item :index="resolvePath(child.path)"> + <item v-if="child.meta" :icon="child.meta.icon" :title="generateTitle(child.meta.title)" /> + </el-menu-item> + </app-link> + </template> </template> </el-submenu> diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index 8f52c5de..3f3fb941 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -46,7 +46,7 @@ </el-table-column> <el-table-column align="center" label="Drag" width="80"> - <template slot-scope="scope"> + <template slot-scope="{}"> <svg-icon class="drag-handler" icon-class="drag"/> </template> </el-table-column> From dd9fb09a293aa5d8332a5b8a9f9a70ff39deeb52 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 11 Feb 2019 14:15:55 +0800 Subject: [PATCH 035/202] perf[Lang]: make up for miss keywords --- src/lang/en.js | 1 + src/lang/es.js | 1 + src/lang/zh.js | 1 + src/router/index.js | 4 ++-- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lang/en.js b/src/lang/en.js index 2af355b1..ef98af4b 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -58,6 +58,7 @@ export default { selectExcel: 'Export Selected', uploadExcel: 'Upload Excel', zip: 'Zip', + pdf: 'PDF', exportZip: 'Export Zip', theme: 'Theme', clipboardDemo: 'Clipboard', diff --git a/src/lang/es.js b/src/lang/es.js index 1268f083..ed71fc15 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -58,6 +58,7 @@ export default { selectExcel: 'Export seleccionado', uploadExcel: 'Subir Excel', zip: 'Zip', + pdf: 'PDF', exportZip: 'Exportar a Zip', theme: 'Tema', clipboardDemo: 'Clipboard', diff --git a/src/lang/zh.js b/src/lang/zh.js index 4371713f..7da0ccee 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -58,6 +58,7 @@ export default { selectExcel: 'Export Selected', uploadExcel: 'Upload Excel', zip: 'Zip', + pdf: 'PDF', exportZip: 'Export Zip', theme: '换肤', clipboardDemo: 'Clipboard', diff --git a/src/router/index.js b/src/router/index.js index f42046ee..ce2b0d84 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -297,13 +297,13 @@ export const asyncRouterMap = [ path: '/pdf', component: Layout, redirect: '/pdf/index', - meta: { title: 'PDF', icon: 'pdf' }, + meta: { title: 'pdf', icon: 'pdf' }, children: [ { path: 'index', component: () => import('@/views/pdf/index'), name: 'PDF', - meta: { title: 'PDF' } + meta: { title: 'pdf' } } ] }, From 0b6e7515ce791d83fbbeb29fcbc8e567cbb65d0e Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 11 Feb 2019 14:51:09 +0800 Subject: [PATCH 036/202] perf: optimize some code --- src/components/Kanban/index.vue | 4 ++-- src/components/SvgIcon/index.vue | 2 +- src/router/index.js | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/Kanban/index.vue b/src/components/Kanban/index.vue index 4975dbdd..dadeb648 100644 --- a/src/components/Kanban/index.vue +++ b/src/components/Kanban/index.vue @@ -41,7 +41,7 @@ export default { } } </script> -<style lang="scss"> +<style lang="scss" scoped> .board-column { min-width: 300px; min-height: 100px; @@ -81,7 +81,7 @@ export default { line-height: 54px; padding: 5px 10px; box-sizing: border-box; - box-shadow: 0px 1px 3px 0 rgba(0,0,0,0.2); + box-shadow: 0px 1px 3px 0 rgba(0, 0, 0, 0.2); } } } diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue index 12a1f58d..b0b6d4cb 100644 --- a/src/components/SvgIcon/index.vue +++ b/src/components/SvgIcon/index.vue @@ -1,5 +1,5 @@ <template> - <svg :class="svgClass" aria-hidden="true"> + <svg :class="svgClass" aria-hidden="true" v-on="$listeners"> <use :xlink:href="iconName"/> </svg> </template> diff --git a/src/router/index.js b/src/router/index.js index ce2b0d84..dda18156 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -297,13 +297,12 @@ export const asyncRouterMap = [ path: '/pdf', component: Layout, redirect: '/pdf/index', - meta: { title: 'pdf', icon: 'pdf' }, children: [ { path: 'index', component: () => import('@/views/pdf/index'), name: 'PDF', - meta: { title: 'pdf' } + meta: { title: 'pdf', icon: 'pdf' } } ] }, From 24ee761809d8ffd8726c88f5a741dd2b169e3433 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 11 Feb 2019 17:42:31 +0800 Subject: [PATCH 037/202] perf[Navbar]: refactor navbar style --- src/components/Breadcrumb/index.vue | 2 +- src/components/ErrorLog/index.vue | 29 ++----------- src/components/Hamburger/index.vue | 7 ++-- src/components/LangSelect/index.vue | 9 ---- src/components/Screenfull/index.vue | 39 +----------------- src/components/SizeSelect/index.vue | 9 ---- src/components/ThemePicker/index.vue | 5 ++- src/icons/svg/screenfull.svg | 1 + src/views/layout/components/Navbar.vue | 57 +++++++++++++++----------- 9 files changed, 48 insertions(+), 110 deletions(-) create mode 100644 src/icons/svg/screenfull.svg diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 5bc7a1b8..5f4d054f 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -63,7 +63,7 @@ export default { display: inline-block; font-size: 14px; line-height: 50px; - margin-left: 10px; + margin-left: 8px; .no-redirect { color: #97a8be; cursor: text; diff --git a/src/components/ErrorLog/index.vue b/src/components/ErrorLog/index.vue index 1fd883d0..c46cf110 100644 --- a/src/components/ErrorLog/index.vue +++ b/src/components/ErrorLog/index.vue @@ -1,21 +1,8 @@ <template> <div v-if="errorLogs.length>0"> - <el-badge :is-dot="true" style="line-height: 30px;" @click.native="dialogTableVisible=true"> - <el-button size="small" type="danger" class="bug-btn"> - <svg - t="1492682037685" - class="bug-svg" - viewBox="0 0 1024 1024" - version="1.1" - xmlns="http://www.w3.org/2000/svg" - p-id="1863" - xmlns:xlink="http://www.w3.org/1999/xlink" - width="128" - height="128"> - <path - d="M969.142857 548.571429q0 14.848-10.861714 25.709714t-25.709714 10.861714l-128 0q0 97.718857-38.290286 165.705143l118.857143 119.442286q10.861714 10.861714 10.861714 25.709714t-10.861714 25.709714q-10.276571 10.861714-25.709714 10.861714t-25.709714-10.861714l-113.152-112.566857q-2.852571 2.852571-8.557714 7.424t-23.990857 16.274286-37.156571 20.845714-46.848 16.566857-55.442286 7.424l0-512-73.142857 0 0 512q-29.147429 0-58.002286-7.716571t-49.700571-18.870857-37.705143-22.272-24.868571-18.578286l-8.557714-8.009143-104.557714 118.272q-11.446857 11.995429-27.428571 11.995429-13.714286 0-24.576-9.142857-10.861714-10.276571-11.702857-25.417143t8.850286-26.587429l115.419429-129.718857q-33.133714-65.133714-33.133714-156.562286l-128 0q-14.848 0-25.709714-10.861714t-10.861714-25.709714 10.861714-25.709714 25.709714-10.861714l128 0 0-168.009143-98.852571-98.852571q-10.861714-10.861714-10.861714-25.709714t10.861714-25.709714 25.709714-10.861714 25.709714 10.861714l98.852571 98.852571 482.304 0 98.852571-98.852571q10.861714-10.861714 25.709714-10.861714t25.709714 10.861714 10.861714 25.709714-10.861714 25.709714l-98.852571 98.852571 0 168.009143 128 0q14.848 0 25.709714 10.861714t10.861714 25.709714zM694.857143 219.428571l-365.714286 0q0-75.995429 53.430857-129.426286t129.426286-53.430857 129.426286 53.430857 53.430857 129.426286z" - p-id="1864"/> - </svg> + <el-badge :is-dot="true" style="line-height: 25px;margin-top: -5px;" @click.native="dialogTableVisible=true"> + <el-button style="padding: 8px 10px;" size="small" type="danger"> + <svg-icon icon-class="bug" /> </el-button> </el-badge> @@ -67,16 +54,6 @@ export default { </script> <style scoped> -.bug-btn.el-button--small { - padding: 9px 10px; -} -.bug-svg { - width: 1em; - height: 1em; - vertical-align: -0.15em; - fill: currentColor; - overflow: hidden; -} .message-title { font-size: 16px; color: #333; diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue index 220d67ec..ca7457c1 100644 --- a/src/components/Hamburger/index.vue +++ b/src/components/Hamburger/index.vue @@ -1,5 +1,5 @@ <template> - <div> + <div style="padding: 0 15px;" @click="toggleClick"> <svg :class="{'is-active':isActive}" class="hamburger" @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" width="64" height="64" - @click="toggleClick"> + > <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" /> </svg> </div> @@ -32,10 +32,11 @@ export default { <style scoped> .hamburger { display: inline-block; - cursor: pointer; + vertical-align: middle; width: 20px; height: 20px; } + .hamburger.is-active { transform: rotate(180deg); } diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue index ef5f2c44..fea7ba71 100644 --- a/src/components/LangSelect/index.vue +++ b/src/components/LangSelect/index.vue @@ -30,12 +30,3 @@ export default { } } </script> - -<style scoped> -.international-icon { - font-size: 20px; - cursor: pointer; - vertical-align: -5px!important; -} -</style> - diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index 4cdcb568..5801ba4a 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -1,29 +1,6 @@ <template> <div> - <svg - t="1508738709248" - class="screenfull-svg" - viewBox="0 0 1024 1024" - version="1.1" - xmlns="http://www.w3.org/2000/svg" - p-id="2069" - xmlns:xlink="http://www.w3.org/1999/xlink" - width="32" - height="32" - @click="click"> - <path - d="M333.493443 428.647617 428.322206 333.832158 262.572184 168.045297 366.707916 64.444754 64.09683 64.444754 63.853283 366.570793 167.283957 262.460644Z" - p-id="2070"/> - <path - d="M854.845439 760.133334 688.61037 593.95864 593.805144 688.764889 759.554142 854.56096 655.44604 958.161503 958.055079 958.161503 958.274066 656.035464Z" - p-id="2071"/> - <path - d="M688.535669 428.550403 854.31025 262.801405 957.935352 366.921787 957.935352 64.34754 655.809313 64.081481 759.919463 167.535691 593.70793 333.731874Z" - p-id="2072"/> - <path - d="M333.590658 594.033341 167.8171 759.804852 64.218604 655.67219 64.218604 958.270996 366.342596 958.502263 262.234493 855.071589 428.421466 688.86108Z" - p-id="2073"/> - </svg> + <svg-icon class-name="screenfull-icon" icon-class="screenfull" /> </div> </template> @@ -32,20 +9,6 @@ import screenfull from 'screenfull' export default { name: 'Screenfull', - props: { - width: { - type: Number, - default: 22 - }, - height: { - type: Number, - default: 22 - }, - fill: { - type: String, - default: '#48576a' - } - }, data() { return { isFullscreen: false diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue index a92a17c3..6d3cd43a 100644 --- a/src/components/SizeSelect/index.vue +++ b/src/components/SizeSelect/index.vue @@ -53,12 +53,3 @@ export default { } </script> - -<style scoped> -.size-icon { - font-size: 20px; - cursor: pointer; - vertical-align: -4px!important; -} -</style> - diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index 5d1ff8bd..332b07e7 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -136,7 +136,10 @@ export default { <style> .theme-picker .el-color-picker__trigger { - vertical-align: middle; + margin-top: 12px; + height: 26px!important; + width: 26px!important; + padding: 2px; } .theme-picker-dropdown .el-color-dropdown__link-btn { diff --git a/src/icons/svg/screenfull.svg b/src/icons/svg/screenfull.svg new file mode 100644 index 00000000..0e86b6fa --- /dev/null +++ b/src/icons/svg/screenfull.svg @@ -0,0 +1 @@ +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg> \ No newline at end of file diff --git a/src/views/layout/components/Navbar.vue b/src/views/layout/components/Navbar.vue index 208186e3..018ef0f9 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/views/layout/components/Navbar.vue @@ -9,17 +9,17 @@ <error-log class="errLog-container right-menu-item"/> <el-tooltip :content="$t('navbar.screenfull')" effect="dark" placement="bottom"> - <screenfull class="screenfull right-menu-item"/> + <screenfull class="right-menu-item"/> </el-tooltip> <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom"> - <size-select class="international right-menu-item"/> + <size-select class="right-menu-item"/> </el-tooltip> - <lang-select class="international right-menu-item"/> + <lang-select class="right-menu-item"/> <el-tooltip :content="$t('navbar.theme')" effect="dark" placement="bottom"> - <theme-picker class="theme-switch right-menu-item"/> + <theme-picker class="theme-picker right-menu-item"/> </el-tooltip> </template> @@ -92,42 +92,52 @@ export default { <style rel="stylesheet/scss" lang="scss" scoped> .navbar { height: 50px; - line-height: 50px; - border-radius: 0px !important; + overflow: hidden; + .hamburger-container { - line-height: 58px; - height: 50px; + line-height: 46px; + height: 100%; float: left; - padding: 0 10px; + cursor: pointer; + transition: background .3s; + &:hover { + background: rgba(0, 0, 0, .025) + } } - .breadcrumb-container{ + + .breadcrumb-container { float: left; } + .errLog-container { display: inline-block; vertical-align: top; } + .right-menu { float: right; height: 100%; - &:focus{ - outline: none; + line-height: 50px; + + &:focus { + outline: none; } + .right-menu-item { + cursor: pointer; display: inline-block; - margin: 0 8px; - } - .screenfull { - height: 20px; - } - .international{ - vertical-align: top; - } - .theme-switch { - vertical-align: 15px; + padding: 0 8px; + height: 100%; + font-size: 20px; + color: #5a5e66; + vertical-align: text-bottom; + transition: background .3s; + &:hover { + background: rgba(0, 0, 0, .025) + } } + .avatar-container { - height: 50px; margin-right: 30px; .avatar-wrapper { margin-top: 5px; @@ -138,6 +148,7 @@ export default { height: 40px; border-radius: 10px; } + .el-icon-caret-bottom { cursor: pointer; position: absolute; From fe381503eb0f6700ea18a9405e38c0d7cd16132e Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 11 Feb 2019 17:52:53 +0800 Subject: [PATCH 038/202] perf[Login]: refine css --- src/views/login/index.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index a44c6ad3..634c32da 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -262,8 +262,10 @@ $light_gray:#eee; .set-language { color: #fff; position: absolute; - top: 5px; + top: 3px; + font-size:18px; right: 0px; + cursor: pointer; } } .show-pwd { From c71f3110fb415c5da940f3436d5c8ff3244659c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 13 Feb 2019 15:09:14 +0800 Subject: [PATCH 039/202] feature[Navbar]: add header-search component (#1591) * init * init * refactor search function by fuse * fix bug * fix bug * tweak --- package.json | 1 + src/components/HeaderSearch/index.vue | 187 +++++++++++++++++++++++++ src/icons/svg/search.svg | 1 + src/views/layout/components/Navbar.vue | 35 +++-- 4 files changed, 212 insertions(+), 12 deletions(-) create mode 100644 src/components/HeaderSearch/index.vue create mode 100644 src/icons/svg/search.svg diff --git a/package.json b/package.json index 83e93bce..5854b8d6 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "echarts": "4.1.0", "element-ui": "2.4.11", "file-saver": "1.3.8", + "fuse.js": "3.4.2", "js-cookie": "2.2.0", "jsonlint": "1.6.3", "jszip": "3.1.5", diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue new file mode 100644 index 00000000..ab0d556a --- /dev/null +++ b/src/components/HeaderSearch/index.vue @@ -0,0 +1,187 @@ +<template> + <div :class="{'show':show}" class="header-search"> + <svg-icon class-name="search-icon" icon-class="search" @click="click" /> + <el-select + ref="headerSearchSelect" + v-model="search" + :remote-method="querySearch" + filterable + default-first-option + remote + placeholder="Search" + class="header-search-select" + @change="change"> + <el-option v-for="item in options" :key="item.path" :value="item" :label="item.title.join(' > ')"/> + </el-select> + </div> +</template> + +<script> +import Fuse from 'fuse.js' +import path from 'path' +import i18n from '@/lang' + +export default { + name: 'HeaderSearch', + data() { + return { + search: '', + options: [], + searchPool: [], + show: false, + fuse: undefined + } + }, + computed: { + routers() { + return this.$store.getters.permission_routers + }, + lang() { + return this.$store.getters.language + } + }, + watch: { + lang() { + this.searchPool = this.generateRouters(this.routers) + }, + routers() { + this.searchPool = this.generateRouters(this.routers) + }, + searchPool(list) { + this.initFuse(list) + }, + show(value) { + if (value) { + document.body.addEventListener('click', this.close) + } else { + document.body.removeEventListener('click', this.close) + } + } + }, + mounted() { + this.searchPool = this.generateRouters(this.routers) + }, + methods: { + click() { + this.show = !this.show + if (this.show) { + this.$refs.headerSearchSelect && this.$refs.headerSearchSelect.focus() + } + }, + close() { + this.$refs.headerSearchSelect && this.$refs.headerSearchSelect.blur() + this.options = [] + this.show = false + }, + change(val) { + this.$router.push(val.path) + this.search = '' + this.options = [] + this.$nextTick(() => { + this.show = false + }) + }, + initFuse(list) { + this.fuse = new Fuse(list, { + shouldSort: true, + threshold: 0.4, + location: 0, + distance: 100, + maxPatternLength: 32, + minMatchCharLength: 1, + keys: [{ + name: 'title', + weight: 0.7 + }, { + name: 'path', + weight: 0.3 + }] + }) + }, + // Filter out the routes that can be displayed in the sidebar + // And generate the internationalized title + generateRouters(routers, basePath = '/', prefixTitle = []) { + let res = [] + + for (const router of routers) { + // skip hidden router + if (router.hidden) { continue } + + const data = { + path: path.resolve(basePath, router.path), + title: [...prefixTitle] + } + + if (router.meta && router.meta.title) { + // generate internationalized title + const i18ntitle = i18n.t(`route.${router.meta.title}`) + + data.title = [...data.title, i18ntitle] + + if (router.redirect !== 'noredirect') { + // only push the routes with title + // special case: need to exclude parent router without redirect + res.push(data) + } + } + + // recursive child routers + if (router.children) { + const tempRouters = this.generateRouters(router.children, data.path, data.title) + if (tempRouters.length >= 1) { + res = [...res, ...tempRouters] + } + } + } + return res + }, + querySearch(query) { + if (query !== '') { + this.options = this.fuse.search(query) + } else { + this.options = [] + } + } + } +} +</script> + +<style lang="scss" scoped> +.header-search { + font-size: 0 !important; + + .search-icon { + cursor: pointer; + font-size: 18px; + vertical-align: middle; + } + + .header-search-select { + font-size: 18px; + transition: width 0.2s; + width: 0; + overflow: hidden; + background: transparent; + border-radius: 0; + display: inline-block; + vertical-align: middle; + + /deep/ .el-input__inner { + border-radius: 0; + border: 0; + padding-left: 0; + padding-right: 0; + box-shadow: none !important; + border-bottom: 1px solid #d9d9d9; + vertical-align: middle; + } + } + + &.show { + .header-search-select { + width: 210px; + margin-left: 10px; + } + } +} +</style> diff --git a/src/icons/svg/search.svg b/src/icons/svg/search.svg new file mode 100644 index 00000000..84233dda --- /dev/null +++ b/src/icons/svg/search.svg @@ -0,0 +1 @@ +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg> \ No newline at end of file diff --git a/src/views/layout/components/Navbar.vue b/src/views/layout/components/Navbar.vue index 018ef0f9..dcb09ec1 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/views/layout/components/Navbar.vue @@ -6,24 +6,26 @@ <div class="right-menu"> <template v-if="device!=='mobile'"> - <error-log class="errLog-container right-menu-item"/> + <search class="right-menu-item" /> + + <error-log class="errLog-container right-menu-item hover-effect"/> <el-tooltip :content="$t('navbar.screenfull')" effect="dark" placement="bottom"> - <screenfull class="right-menu-item"/> + <screenfull class="right-menu-item hover-effect"/> </el-tooltip> <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom"> - <size-select class="right-menu-item"/> + <size-select class="right-menu-item hover-effect"/> </el-tooltip> - <lang-select class="right-menu-item"/> + <lang-select class="right-menu-item hover-effect"/> <el-tooltip :content="$t('navbar.theme')" effect="dark" placement="bottom"> - <theme-picker class="theme-picker right-menu-item"/> + <theme-picker class="right-menu-item hover-effect"/> </el-tooltip> </template> - <el-dropdown class="avatar-container right-menu-item" trigger="click"> + <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> <div class="avatar-wrapper"> <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"> <i class="el-icon-caret-bottom"/> @@ -57,6 +59,7 @@ import Screenfull from '@/components/Screenfull' import SizeSelect from '@/components/SizeSelect' import LangSelect from '@/components/LangSelect' import ThemePicker from '@/components/ThemePicker' +import Search from '@/components/HeaderSearch' export default { components: { @@ -66,7 +69,8 @@ export default { Screenfull, SizeSelect, LangSelect, - ThemePicker + ThemePicker, + Search }, computed: { ...mapGetters([ @@ -100,6 +104,7 @@ export default { float: left; cursor: pointer; transition: background .3s; + &:hover { background: rgba(0, 0, 0, .025) } @@ -124,24 +129,30 @@ export default { } .right-menu-item { - cursor: pointer; display: inline-block; padding: 0 8px; height: 100%; - font-size: 20px; + font-size: 18px; color: #5a5e66; vertical-align: text-bottom; - transition: background .3s; - &:hover { - background: rgba(0, 0, 0, .025) + + &.hover-effect { + cursor: pointer; + transition: background .3s; + + &:hover { + background: rgba(0, 0, 0, .025) + } } } .avatar-container { margin-right: 30px; + .avatar-wrapper { margin-top: 5px; position: relative; + .user-avatar { cursor: pointer; width: 40px; From a1d6ad34530854699c38f3d5127c21b293083b93 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 13 Feb 2019 16:10:23 +0800 Subject: [PATCH 040/202] fix[Screenfull]: fix screenfull click bug --- src/components/Screenfull/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index 5801ba4a..7f8e6fc3 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -1,6 +1,6 @@ <template> <div> - <svg-icon class-name="screenfull-icon" icon-class="screenfull" /> + <svg-icon class-name="screenfull-icon" icon-class="screenfull" @click="click" /> </div> </template> From 0fed69f367899c6f5d3321e5cb86b84faa08d2e9 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 13 Feb 2019 16:34:03 +0800 Subject: [PATCH 041/202] perf[Screenfull]: refactor screenfull component --- package.json | 2 +- src/components/Screenfull/index.vue | 6 ++++-- src/icons/svg/exit-fullscreen.svg | 1 + src/icons/svg/{screenfull.svg => fullscreen.svg} | 0 src/lang/en.js | 1 - src/lang/es.js | 1 - src/lang/zh.js | 1 - src/views/layout/components/Navbar.vue | 4 +--- 8 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 src/icons/svg/exit-fullscreen.svg rename src/icons/svg/{screenfull.svg => fullscreen.svg} (100%) diff --git a/package.json b/package.json index 5854b8d6..77c25de4 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "mockjs": "1.0.1-beta3", "normalize.css": "7.0.0", "nprogress": "0.2.0", - "screenfull": "3.3.3", + "screenfull": "4.0.0", "showdown": "1.8.6", "sortablejs": "1.7.0", "tui-editor": "1.2.7", diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index 7f8e6fc3..8e7bcba4 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -1,6 +1,6 @@ <template> <div> - <svg-icon class-name="screenfull-icon" icon-class="screenfull" @click="click" /> + <svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" @click="click" /> </div> </template> @@ -23,7 +23,9 @@ export default { }) return false } - screenfull.toggle() + screenfull.toggle().then(() => { + this.isFullscreen = screenfull.isFullscreen + }) } } } diff --git a/src/icons/svg/exit-fullscreen.svg b/src/icons/svg/exit-fullscreen.svg new file mode 100644 index 00000000..485c128b --- /dev/null +++ b/src/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/screenfull.svg b/src/icons/svg/fullscreen.svg similarity index 100% rename from src/icons/svg/screenfull.svg rename to src/icons/svg/fullscreen.svg diff --git a/src/lang/en.js b/src/lang/en.js index ef98af4b..05b34598 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -69,7 +69,6 @@ export default { logOut: 'Log Out', dashboard: 'Dashboard', github: 'Github', - screenfull: 'Screenfull', theme: 'Theme', size: 'Global Size' }, diff --git a/src/lang/es.js b/src/lang/es.js index ed71fc15..8575d382 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -69,7 +69,6 @@ export default { logOut: 'Salir', dashboard: 'Panel de control', github: 'Github', - screenfull: 'Pantalla completa', theme: 'Tema', size: 'Tamaño global' }, diff --git a/src/lang/zh.js b/src/lang/zh.js index 7da0ccee..1fd18355 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -69,7 +69,6 @@ export default { logOut: '退出登录', dashboard: '首页', github: '项目地址', - screenfull: '全屏', theme: '换肤', size: '布局大小' }, diff --git a/src/views/layout/components/Navbar.vue b/src/views/layout/components/Navbar.vue index dcb09ec1..5c3bcda4 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/views/layout/components/Navbar.vue @@ -10,9 +10,7 @@ <error-log class="errLog-container right-menu-item hover-effect"/> - <el-tooltip :content="$t('navbar.screenfull')" effect="dark" placement="bottom"> - <screenfull class="right-menu-item hover-effect"/> - </el-tooltip> + <screenfull class="right-menu-item hover-effect"/> <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom"> <size-select class="right-menu-item hover-effect"/> From 9ed5db044f22bd9feb88dca6ce8ec7d08f7b8088 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 14 Feb 2019 10:57:57 +0800 Subject: [PATCH 042/202] perf[deps]: move connect to devDependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 77c25de4..aef30525 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "axios": "0.18.0", "clipboard": "1.7.1", "codemirror": "5.39.2", - "connect": "3.6.6", "driver.js": "0.8.1", "dropzone": "5.2.0", "echarts": "4.1.0", @@ -77,6 +76,7 @@ "babel-preset-stage-2": "6.24.1", "chalk": "2.4.1", "compression-webpack-plugin": "2.0.0", + "connect": "3.6.6", "copy-webpack-plugin": "4.5.2", "cross-env": "5.2.0", "css-loader": "1.0.0", From 8c18c000d42d913be7bd03c933964d388852cc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 15 Feb 2019 10:03:34 +0800 Subject: [PATCH 043/202] fix[Screenfull]: fix screenfull bug (#1603) --- src/components/Screenfull/index.vue | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index 8e7bcba4..479bf3e3 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -14,6 +14,9 @@ export default { isFullscreen: false } }, + mounted() { + this.init() + }, methods: { click() { if (!screenfull.enabled) { @@ -23,9 +26,14 @@ export default { }) return false } - screenfull.toggle().then(() => { - this.isFullscreen = screenfull.isFullscreen - }) + screenfull.toggle() + }, + init() { + if (screenfull.enabled) { + screenfull.on('change', () => { + this.isFullscreen = screenfull.isFullscreen + }) + } } } } From 4e0559833fe7ec8ad13d3ca9ac26f3d1ee039927 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 15 Feb 2019 14:54:57 +0800 Subject: [PATCH 044/202] fix typo --- src/router/index.js | 4 ++-- src/views/layout/components/Sidebar/FixiOSBug.js | 10 +++++----- src/views/layout/components/Sidebar/SidebarItem.vue | 2 +- src/views/layout/components/Sidebar/index.vue | 1 - 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index dda18156..a86e3a13 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -12,7 +12,7 @@ import chartsRouter from './modules/charts' import tableRouter from './modules/table' import nestedRouter from './modules/nested' -/** note: Submenu only appear when children.length>=1 +/** note: sub-menu only appear when children.length>=1 * detail see https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html **/ @@ -25,7 +25,7 @@ import nestedRouter from './modules/nested' * name:'router-name' the name is used by <keep-alive> (must set!!!) * meta : { roles: ['admin','editor'] will control the page roles (you can set multiple roles) - title: 'title' the name show in submenu and breadcrumb (recommend set) + title: 'title' the name show in sub-menu and breadcrumb (recommend set) icon: 'svg-name' the icon show in the sidebar noCache: true if true, the page will no be cached(default is false) breadcrumb: false if false, the item will hidden in breadcrumb(default is true) diff --git a/src/views/layout/components/Sidebar/FixiOSBug.js b/src/views/layout/components/Sidebar/FixiOSBug.js index 5e0a9262..bc14856f 100644 --- a/src/views/layout/components/Sidebar/FixiOSBug.js +++ b/src/views/layout/components/Sidebar/FixiOSBug.js @@ -5,16 +5,16 @@ export default { } }, mounted() { - // In order to fix the click on menu on the ios device will trigger the mouseeleave bug + // In order to fix the click on menu on the ios device will trigger the mouseleave bug // https://github.com/PanJiaChen/vue-element-admin/issues/1135 this.fixBugIniOS() }, methods: { fixBugIniOS() { - const $submenu = this.$refs.submenu - if ($submenu) { - const handleMouseleave = $submenu.handleMouseleave - $submenu.handleMouseleave = (e) => { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { if (this.device === 'mobile') { return } diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 56edf9f7..f0381a90 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -9,7 +9,7 @@ </app-link> </template> - <el-submenu v-else ref="submenu" :index="resolvePath(item.path)"> + <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)"> <template slot="title"> <item v-if="item.meta" :icon="item.meta.icon" :title="generateTitle(item.meta.title)" /> </template> diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index 48407286..11ef4c02 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -1,7 +1,6 @@ <template> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu - :show-timeout="200" :default-active="$route.path" :collapse="isCollapse" :background-color="variables.menuBg" From 48e47e86f176ac63b420331dfb5e56211c720a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 15 Feb 2019 15:26:48 +0800 Subject: [PATCH 045/202] fearure[TagsView]: add affix option (#1577) --- src/router/index.js | 5 +- src/store/modules/tagsView.js | 13 ++-- src/views/layout/components/TagsView.vue | 76 +++++++++++++++++++----- 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index a86e3a13..60524517 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -29,6 +29,7 @@ import nestedRouter from './modules/nested' icon: 'svg-name' the icon show in the sidebar noCache: true if true, the page will no be cached(default is false) breadcrumb: false if false, the item will hidden in breadcrumb(default is true) + affix: true if true, the tag will affix in the tags-view } **/ export const constantRouterMap = [ @@ -72,7 +73,7 @@ export const constantRouterMap = [ path: 'dashboard', component: () => import('@/views/dashboard/index'), name: 'Dashboard', - meta: { title: 'dashboard', icon: 'dashboard', noCache: true } + meta: { title: 'dashboard', icon: 'dashboard', noCache: true, affix: true } } ] }, @@ -85,7 +86,7 @@ export const constantRouterMap = [ path: 'index', component: () => import('@/views/documentation/index'), name: 'Documentation', - meta: { title: 'documentation', icon: 'documentation', noCache: true } + meta: { title: 'documentation', icon: 'documentation', affix: true } } ] }, diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js index cbf9eeb7..378cbcd3 100644 --- a/src/store/modules/tagsView.js +++ b/src/store/modules/tagsView.js @@ -38,12 +38,9 @@ const tagsView = { }, DEL_OTHERS_VISITED_VIEWS: (state, view) => { - for (const [i, v] of state.visitedViews.entries()) { - if (v.path === view.path) { - state.visitedViews = state.visitedViews.slice(i, i + 1) - break - } - } + state.visitedViews = state.visitedViews.filter(v => { + return v.meta.affix || v.path === view.path + }) }, DEL_OTHERS_CACHED_VIEWS: (state, view) => { for (const i of state.cachedViews) { @@ -56,7 +53,9 @@ const tagsView = { }, DEL_ALL_VISITED_VIEWS: state => { - state.visitedViews = [] + // keep affix tags + const affixTags = state.visitedViews.filter(tag => tag.meta.affix) + state.visitedViews = affixTags }, DEL_ALL_CACHED_VIEWS: state => { state.cachedViews = [] diff --git a/src/views/layout/components/TagsView.vue b/src/views/layout/components/TagsView.vue index c16827b6..cfac9c7d 100644 --- a/src/views/layout/components/TagsView.vue +++ b/src/views/layout/components/TagsView.vue @@ -12,14 +12,15 @@ @click.middle.native="closeSelectedTag(tag)" @contextmenu.prevent.native="openMenu(tag,$event)"> {{ generateTitle(tag.title) }} - <span class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> + <span v-if="!tag.meta.affix" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> </router-link> </scroll-pane> <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> <li @click="refreshSelectedTag(selectedTag)">{{ $t('tagsView.refresh') }}</li> - <li @click="closeSelectedTag(selectedTag)">{{ $t('tagsView.close') }}</li> + <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">{{ + $t('tagsView.close') }}</li> <li @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}</li> - <li @click="closeAllTags">{{ $t('tagsView.closeAll') }}</li> + <li @click="closeAllTags(selectedTag)">{{ $t('tagsView.closeAll') }}</li> </ul> </div> </template> @@ -27,6 +28,7 @@ <script> import ScrollPane from '@/components/ScrollPane' import { generateTitle } from '@/utils/i18n' +import path from 'path' export default { components: { ScrollPane }, @@ -35,17 +37,21 @@ export default { visible: false, top: 0, left: 0, - selectedTag: {} + selectedTag: {}, + affixTags: [] } }, computed: { visitedViews() { return this.$store.state.tagsView.visitedViews + }, + routers() { + return this.$store.state.permission.routers } }, watch: { $route() { - this.addViewTags() + this.addTags() this.moveToCurrentTag() }, visible(value) { @@ -57,14 +63,44 @@ export default { } }, mounted() { - this.addViewTags() + this.initTags() + this.addTags() }, methods: { generateTitle, // generateTitle by vue-i18n isActive(route) { return route.path === this.$route.path }, - addViewTags() { + filterAffixTags(routes, basePath = '/') { + let tags = [] + routes.forEach(route => { + if (route.meta && route.meta.affix) { + tags.push({ + path: path.resolve(basePath, route.path), + name: route.name, + meta: { ...route.meta } + }) + } + if (route.children) { + const tempTags = this.filterAffixTags(route.children, route.path) + if (tempTags.length >= 1) { + tags = [...tags, ...tempTags] + } + } + }) + + return tags + }, + initTags() { + const affixTags = this.affixTags = this.filterAffixTags(this.routers) + for (const tag of affixTags) { + // Must have tag name + if (tag.name) { + this.$store.dispatch('addVisitedView', tag) + } + } + }, + addTags() { const { name } = this.$route if (name) { this.$store.dispatch('addView', this.$route) @@ -101,12 +137,7 @@ export default { closeSelectedTag(view) { this.$store.dispatch('delView', view).then(({ visitedViews }) => { if (this.isActive(view)) { - const latestView = visitedViews.slice(-1)[0] - if (latestView) { - this.$router.push(latestView) - } else { - this.$router.push('/') - } + this.toLastView(visitedViews) } }) }, @@ -116,9 +147,22 @@ export default { this.moveToCurrentTag() }) }, - closeAllTags() { - this.$store.dispatch('delAllViews') - this.$router.push('/') + closeAllTags(view) { + this.$store.dispatch('delAllViews').then(({ visitedViews }) => { + if (this.affixTags.some(tag => tag.path === view.path)) { + return + } + this.toLastView(visitedViews) + }) + }, + toLastView(visitedViews) { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + this.$router.push(latestView) + } else { + // You can set another route + this.$router.push('/') + } }, openMenu(tag, e) { const menuMinWidth = 105 From 070a3343f26c34f05ff4d9ed296d65e66622ac88 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 19 Feb 2019 10:07:18 +0800 Subject: [PATCH 046/202] perf[utils]: optimize code --- src/utils/index.js | 4 ---- src/utils/validate.js | 4 ++++ src/views/layout/components/Sidebar/Link.vue | 2 +- src/views/layout/components/Sidebar/SidebarItem.vue | 8 +++----- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/utils/index.js b/src/utils/index.js index 821392e9..60a3922c 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -290,7 +290,3 @@ export function deepClone(source) { export function uniqueArr(arr) { return Array.from(new Set(arr)) } - -export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) -} diff --git a/src/utils/validate.js b/src/utils/validate.js index ada0e7e2..dda046de 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -7,6 +7,10 @@ export function isvalidUsername(str) { return valid_map.indexOf(str.trim()) >= 0 } +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + /* 合法uri*/ export function validateURL(textval) { const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ diff --git a/src/views/layout/components/Sidebar/Link.vue b/src/views/layout/components/Sidebar/Link.vue index cd2e0413..bff45cd8 100644 --- a/src/views/layout/components/Sidebar/Link.vue +++ b/src/views/layout/components/Sidebar/Link.vue @@ -7,7 +7,7 @@ </template> <script> -import { isExternal } from '@/utils' +import { isExternal } from '@/utils/validate' export default { props: { diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index f0381a90..3a6477f6 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -39,7 +39,7 @@ <script> import path from 'path' import { generateTitle } from '@/utils/i18n' -import { isExternal } from '@/utils' +import { isExternal } from '@/utils/validate' import Item from './Item' import AppLink from './Link' import FixiOSBug from './FixiOSBug' @@ -94,14 +94,12 @@ export default { return false }, resolvePath(routePath) { - if (this.isExternalLink(routePath)) { + if (isExternal(routePath)) { return routePath } return path.resolve(this.basePath, routePath) }, - isExternalLink(routePath) { - return isExternal(routePath) - }, + generateTitle } } From fe950801c91c4b5011829069aaa7d58882f67177 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 19 Feb 2019 10:24:22 +0800 Subject: [PATCH 047/202] perf[utils]: optimizate variable name --- src/utils/createUniqueString.js | 8 ------- src/utils/index.js | 8 ++++++- src/utils/validate.js | 24 +++++++++---------- .../example/components/ArticleDetail.vue | 4 ++-- src/views/login/index.vue | 4 ++-- 5 files changed, 23 insertions(+), 25 deletions(-) delete mode 100644 src/utils/createUniqueString.js diff --git a/src/utils/createUniqueString.js b/src/utils/createUniqueString.js deleted file mode 100644 index 611725c4..00000000 --- a/src/utils/createUniqueString.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Created by jiachenpan on 17/3/8. - */ -export default function createUniqueString() { - const timestamp = +new Date() + '' - const randomNum = parseInt((1 + Math.random()) * 65536) + '' - return (+(randomNum + timestamp)).toString(32) -} diff --git a/src/utils/index.js b/src/utils/index.js index 60a3922c..1370a423 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -239,7 +239,7 @@ export function debounce(func, wait, immediate) { // 据上一次触发时间间隔 const last = +new Date() - timestamp - // 上次被包装函数被调用时间间隔last小于设定时间间隔wait + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait if (last < wait && last > 0) { timeout = setTimeout(later, wait - last) } else { @@ -290,3 +290,9 @@ export function deepClone(source) { export function uniqueArr(arr) { return Array.from(new Set(arr)) } + +export function createUniqueString() { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536) + '' + return (+(randomNum + timestamp)).toString(32) +} diff --git a/src/utils/validate.js b/src/utils/validate.js index dda046de..5e4056f5 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -2,35 +2,35 @@ * Created by jiachenpan on 16/11/18. */ -export function isvalidUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 -} - export function isExternal(path) { return /^(https?:|mailto:|tel:)/.test(path) } +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + /* 合法uri*/ -export function validateURL(textval) { - const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ - return urlregex.test(textval) +export function validURL(url) { + const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) } /* 小写字母*/ -export function validateLowerCase(str) { +export function validLowerCase(str) { const reg = /^[a-z]+$/ return reg.test(str) } /* 大写字母*/ -export function validateUpperCase(str) { +export function validUpperCase(str) { const reg = /^[A-Z]+$/ return reg.test(str) } /* 大小写字母*/ -export function validateAlphabets(str) { +export function validAlphabets(str) { const reg = /^[A-Za-z]+$/ return reg.test(str) } @@ -40,7 +40,7 @@ export function validateAlphabets(str) { * @param email * @returns {boolean} */ -export function validateEmail(email) { +export function validEmail(email) { const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return re.test(email) } diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 129016d7..1026559f 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -78,7 +78,7 @@ import Tinymce from '@/components/Tinymce' import Upload from '@/components/Upload/singleImage3' import MDinput from '@/components/MDinput' import Sticky from '@/components/Sticky' // 粘性header组件 -import { validateURL } from '@/utils/validate' +import { validURL } from '@/utils/validate' import { fetchArticle } from '@/api/article' import { userSearch } from '@/api/remoteSearch' import Warning from './Warning' @@ -121,7 +121,7 @@ export default { } const validateSourceUri = (rule, value, callback) => { if (value) { - if (validateURL(value)) { + if (validURL(value)) { callback() } else { this.$message({ diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 634c32da..352df494 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -71,7 +71,7 @@ </template> <script> -import { isvalidUsername } from '@/utils/validate' +import { validUsername } from '@/utils/validate' import LangSelect from '@/components/LangSelect' import SocialSign from './socialsignin' @@ -80,7 +80,7 @@ export default { components: { LangSelect, SocialSign }, data() { const validateUsername = (rule, value, callback) => { - if (!isvalidUsername(value)) { + if (!validUsername(value)) { callback(new Error('Please enter the correct user name')) } else { callback() From 2e89ef444bb751b0a73fb1d05da715e68c4011f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 21 Feb 2019 16:08:22 +0800 Subject: [PATCH 048/202] perf[Navbar]: add scroll bar when the subMenu is too long (#1619) --- src/styles/sidebar.scss | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index ce619fd3..96e89be7 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -170,8 +170,27 @@ .nest-menu .el-submenu>.el-submenu__title, .el-menu-item { &:hover { - // You can use $subMenuHover + // you can use $subMenuHover background-color: $menuHover !important; } } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } } From 6b88c41ffc7d3794467481629f3025837e6d54a8 Mon Sep 17 00:00:00 2001 From: WangXinhai <18907191365@189.cn> Date: Mon, 25 Feb 2019 17:29:58 +0800 Subject: [PATCH 049/202] perf[ThemePicker]: refine updateStyle function (#554) * theme replacing should cut tons of irrelevant css --- src/components/ThemePicker/index.vue | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index 332b07e7..52419929 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -67,11 +67,18 @@ export default { methods: { updateStyle(style, oldCluster, newCluster) { - let newStyle = style + const colorOverrides = [] // only capture color overides oldCluster.forEach((color, index) => { - newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index]) + const value = newCluster[index] + const color_plain = color.replace(/([()])/g, '\\$1') + const repl = new RegExp(`(^|})([^{]+{[^{}]+)${color_plain}\\b([^}]*)(?=})`, 'gi') + const nestRepl = new RegExp(color_plain, 'ig') // for greed matching before the 'color' + let v + while ((v = repl.exec(style))) { + colorOverrides.push(v[2].replace(nestRepl, value) + value + v[3] + '}') // '}' not captured in the regexp repl to reserve it as locator-boundary + } }) - return newStyle + return colorOverrides.join('') }, getCSSString(url, callback, variable) { From c0f378e50a1d7bb7e2be1f365ba414ef31340988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 25 Feb 2019 17:54:10 +0800 Subject: [PATCH 050/202] perf[ResizeHandler]: optimized the judgment of isMobile (#1633) perf[ResizeHandler]: optimized the judgment of isMobile --- src/views/layout/mixin/ResizeHandler.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/views/layout/mixin/ResizeHandler.js b/src/views/layout/mixin/ResizeHandler.js index 2636d5bd..352ab133 100644 --- a/src/views/layout/mixin/ResizeHandler.js +++ b/src/views/layout/mixin/ResizeHandler.js @@ -1,8 +1,7 @@ import store from '@/store' const { body } = document -const WIDTH = 1024 -const RATIO = 3 +const WIDTH = 992 // refer to Bootstrap's responsive design export default { watch: { @@ -25,7 +24,7 @@ export default { methods: { isMobile() { const rect = body.getBoundingClientRect() - return rect.width - RATIO < WIDTH + return rect.width - 1 < WIDTH }, resizeHandler() { if (!document.hidden) { From e544c01e63f3228c38147d72904e756b5d3d55c6 Mon Sep 17 00:00:00 2001 From: frank10000 <740427741@qq.com> Date: Wed, 27 Feb 2019 13:48:30 +0800 Subject: [PATCH 051/202] fix[Sidebar]: fixed infinite loop bug(#1333) * fixed infinite loop Bug when in hasOneShowingChild Edit the onlyOneChild * tweak --- src/views/layout/components/Sidebar/SidebarItem.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 3a6477f6..58cee945 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -64,9 +64,9 @@ export default { } }, data() { - return { - onlyOneChild: null - } + // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237 + // TODO: refactor with render function + this.onlyOneChild = null }, methods: { hasOneShowingChild(children, parent) { From fc277c75ee08152a440778850b9398ea8a9d49d2 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 27 Feb 2019 13:50:27 +0800 Subject: [PATCH 052/202] fix[Sidebar]: data should return a object --- src/views/layout/components/Sidebar/SidebarItem.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 58cee945..9a555f4b 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -67,6 +67,7 @@ export default { // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237 // TODO: refactor with render function this.onlyOneChild = null + return {} }, methods: { hasOneShowingChild(children, parent) { From c2495545a5d32812d53e2c631ad64d3c618152ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=B4=AA=E8=8E=B9?= <565644124@qq.com> Date: Thu, 28 Feb 2019 13:22:49 +0800 Subject: [PATCH 053/202] perf[Sidebar]: optimize code logic (#1349) --- .../layout/components/Sidebar/SidebarItem.vue | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 9a555f4b..94275aa8 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -1,36 +1,25 @@ <template> - <div v-if="!item.hidden&&item.children" class="menu-wrapper"> + <div v-if="!item.hidden" class="menu-wrapper"> <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> <app-link :to="resolvePath(onlyOneChild.path)"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> - <item v-if="onlyOneChild.meta" :icon="onlyOneChild.meta.icon||item.meta.icon" :title="generateTitle(onlyOneChild.meta.title)" /> + <item v-if="onlyOneChild.meta" :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="generateTitle(onlyOneChild.meta.title)" /> </el-menu-item> </app-link> </template> <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)"> <template slot="title"> - <item v-if="item.meta" :icon="item.meta.icon" :title="generateTitle(item.meta.title)" /> - </template> - - <template v-for="child in item.children"> - <template v-if="!child.hidden"> - <sidebar-item - v-if="child.children&&child.children.length>0" - :is-nest="true" - :item="child" - :key="child.path" - :base-path="resolvePath(child.path)" - class="nest-menu" /> - - <app-link v-else :to="resolvePath(child.path)" :key="child.name"> - <el-menu-item :index="resolvePath(child.path)"> - <item v-if="child.meta" :icon="child.meta.icon" :title="generateTitle(child.meta.title)" /> - </el-menu-item> - </app-link> - </template> + <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="generateTitle(item.meta.title)" /> </template> + <sidebar-item + v-for="child in item.children" + :is-nest="true" + :item="child" + :key="child.path" + :base-path="resolvePath(child.path)" + class="nest-menu" /> </el-submenu> </div> @@ -70,7 +59,7 @@ export default { return {} }, methods: { - hasOneShowingChild(children, parent) { + hasOneShowingChild(children = [], parent) { const showingChildren = children.filter(item => { if (item.hidden) { return false From 6255f54f413ae9784d9bfb94151b59aeca72c0ec Mon Sep 17 00:00:00 2001 From: kaisawind <wind.kaisa@gmail.com> Date: Fri, 1 Mar 2019 18:44:37 +0800 Subject: [PATCH 054/202] fix[TagsView]: fixed refresh affixed-tag bug (#1653) --- src/views/layout/components/TagsView.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/layout/components/TagsView.vue b/src/views/layout/components/TagsView.vue index cfac9c7d..7b7be8f7 100644 --- a/src/views/layout/components/TagsView.vue +++ b/src/views/layout/components/TagsView.vue @@ -76,6 +76,7 @@ export default { routes.forEach(route => { if (route.meta && route.meta.affix) { tags.push({ + fullPath: path.resolve(basePath, route.path), path: path.resolve(basePath, route.path), name: route.name, meta: { ...route.meta } From aa2eb7d40f1e64bfaf3a0ee1d0dd5a0a6d161dee Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Mon, 4 Mar 2019 10:54:58 +0800 Subject: [PATCH 055/202] perf[utils.js]: refactor byteLength function (#1650) --- src/utils/index.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/utils/index.js b/src/utils/index.js index 1370a423..fbcb4602 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -91,20 +91,19 @@ export function getQueryObject(url) { } /** - *get getByteLen - * @param {Sting} val input value + * @param {Sting} input value * @returns {number} output value */ -export function getByteLen(val) { - let len = 0 - for (let i = 0; i < val.length; i++) { - if (val[i].match(/[^\x00-\xff]/gi) != null) { - len += 1 - } else { - len += 0.5 - } +export function byteLength(str) { + // returns the byte length of an utf8 string + let s = str.length + for (var i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- } - return Math.floor(len) + return s } export function cleanArray(actual) { From 1e06f1da67ed090c74ffa85ceb17c6217ae7a55c Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 4 Mar 2019 11:43:14 +0800 Subject: [PATCH 056/202] perf[TagsView]: refine code --- src/views/layout/components/TagsView.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/layout/components/TagsView.vue b/src/views/layout/components/TagsView.vue index 7b7be8f7..66059816 100644 --- a/src/views/layout/components/TagsView.vue +++ b/src/views/layout/components/TagsView.vue @@ -75,9 +75,10 @@ export default { let tags = [] routes.forEach(route => { if (route.meta && route.meta.affix) { + const tagPath = path.resolve(basePath, route.path) tags.push({ - fullPath: path.resolve(basePath, route.path), - path: path.resolve(basePath, route.path), + fullPath: tagPath, + path: tagPath, name: route.name, meta: { ...route.meta } }) From 96774060020a2d80436faf08dd1089fae5a17ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 5 Mar 2019 13:20:30 +0800 Subject: [PATCH 057/202] perf[TagsView]: set the scrollPane as a business component (#1660) --- .../layout/components/TagsView/ScrollPane.vue} | 10 ++++++++-- .../components/{TagsView.vue => TagsView/index.vue} | 7 ++----- src/views/layout/components/index.js | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) rename src/{components/ScrollPane/index.vue => views/layout/components/TagsView/ScrollPane.vue} (91%) rename src/views/layout/components/{TagsView.vue => TagsView/index.vue} (99%) diff --git a/src/components/ScrollPane/index.vue b/src/views/layout/components/TagsView/ScrollPane.vue similarity index 91% rename from src/components/ScrollPane/index.vue rename to src/views/layout/components/TagsView/ScrollPane.vue index 172afccc..820a536e 100644 --- a/src/components/ScrollPane/index.vue +++ b/src/views/layout/components/TagsView/ScrollPane.vue @@ -14,16 +14,21 @@ export default { left: 0 } }, + computed: { + scrollWrapper() { + return this.$refs.scrollContainer.$refs.wrap + } + }, methods: { handleScroll(e) { const eventDelta = e.wheelDelta || -e.deltaY * 40 - const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap + const $scrollWrapper = this.scrollWrapper $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 }, moveToTarget(currentTag) { const $container = this.$refs.scrollContainer.$el const $containerWidth = $container.offsetWidth - const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap + const $scrollWrapper = this.scrollWrapper const tagList = this.$parent.$refs.tag let firstTag = null @@ -44,6 +49,7 @@ export default { const currentIndex = tagList.findIndex(item => item === currentTag) const prevTag = tagList[currentIndex - 1] const nextTag = tagList[currentIndex + 1] + // the tag's offsetLeft after of nextTag const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing diff --git a/src/views/layout/components/TagsView.vue b/src/views/layout/components/TagsView/index.vue similarity index 99% rename from src/views/layout/components/TagsView.vue rename to src/views/layout/components/TagsView/index.vue index 66059816..53d592bc 100644 --- a/src/views/layout/components/TagsView.vue +++ b/src/views/layout/components/TagsView/index.vue @@ -26,7 +26,7 @@ </template> <script> -import ScrollPane from '@/components/ScrollPane' +import ScrollPane from './ScrollPane' import { generateTitle } from '@/utils/i18n' import path from 'path' @@ -90,7 +90,6 @@ export default { } } }) - return tags }, initTags() { @@ -115,12 +114,10 @@ export default { for (const tag of tags) { if (tag.to.path === this.$route.path) { this.$refs.scrollPane.moveToTarget(tag) - // when query is different then update if (tag.to.fullPath !== this.$route.fullPath) { this.$store.dispatch('updateVisitedView', this.$route) } - break } } @@ -178,8 +175,8 @@ export default { } else { this.left = left } - this.top = e.clientY + this.top = e.clientY this.visible = true this.selectedTag = tag }, diff --git a/src/views/layout/components/index.js b/src/views/layout/components/index.js index 07cc9947..5262e113 100644 --- a/src/views/layout/components/index.js +++ b/src/views/layout/components/index.js @@ -1,4 +1,4 @@ export { default as Navbar } from './Navbar' export { default as Sidebar } from './Sidebar/index.vue' -export { default as TagsView } from './TagsView' +export { default as TagsView } from './TagsView/index.vue' export { default as AppMain } from './AppMain' From fc9e7249e707f36c4c640660dad2076cd3006386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 6 Mar 2019 09:49:47 +0800 Subject: [PATCH 058/202] fix[DragTable]: support multiple drag-table (#1666) --- src/views/table/dragTable.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index 3f3fb941..50d17da4 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> <!-- Note that row-key is necessary to get a correct row order. --> - <el-table v-loading="listLoading" :data="list" row-key="id" border fit highlight-current-row style="width: 100%"> + <el-table v-loading="listLoading" ref="dragTable" :data="list" row-key="id" border fit highlight-current-row style="width: 100%"> <el-table-column align="center" label="ID" width="65"> <template slot-scope="scope"> @@ -107,7 +107,7 @@ export default { }) }, setSort() { - const el = document.querySelectorAll('.el-table__body-wrapper > table > tbody')[0] + const el = this.$refs.dragTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0] this.sortable = Sortable.create(el, { ghostClass: 'sortable-ghost', // Class name for the drop placeholder, setData: function(dataTransfer) { From dc6030bce6c7017a7ea76eee13042305c13814af Mon Sep 17 00:00:00 2001 From: liugq <liugq5713@gmail.com> Date: Thu, 7 Mar 2019 11:34:23 +0800 Subject: [PATCH 059/202] perf[Tree-Table]: refactor tree-table (#1587) --- src/components/TreeTable/eval.js | 65 +++-- src/components/TreeTable/index.vue | 228 ++++++++++------- src/components/TreeTable/readme.md | 150 ++++++----- src/mock/table.js | 0 src/views/table/treeTable/customEval.js | 48 ---- src/views/table/treeTable/customTreeTable.vue | 239 ++++++++++-------- src/views/table/treeTable/data.js | 49 ++++ src/views/table/treeTable/treeTable.vue | 158 ++++++++---- 8 files changed, 551 insertions(+), 386 deletions(-) create mode 100644 src/mock/table.js delete mode 100644 src/views/table/treeTable/customEval.js create mode 100644 src/views/table/treeTable/data.js diff --git a/src/components/TreeTable/eval.js b/src/components/TreeTable/eval.js index d9b89e1c..8659ead8 100644 --- a/src/components/TreeTable/eval.js +++ b/src/components/TreeTable/eval.js @@ -1,29 +1,48 @@ -/** -* @Author: jianglei -* @Date: 2017-10-12 12:06:49 -*/ -'use strict' import Vue from 'vue' -export default function treeToArray(data, expandAll, parent = null, level = null) { + +// Flattened array +export default function treeToArray(data, children = 'children') { let tmp = [] - Array.from(data).forEach(function(record) { - if (record._expanded === undefined) { - Vue.set(record, '_expanded', expandAll) - } - let _level = 1 - if (level !== undefined && level !== null) { - _level = level + 1 - } - Vue.set(record, '_level', _level) - // 如果有父元素 - if (parent) { - Vue.set(record, 'parent', parent) - } - tmp.push(record) - if (record.children && record.children.length > 0) { - const children = treeToArray(record.children, expandAll, record, _level) - tmp = tmp.concat(children) + data.forEach((item, index) => { + Vue.set(item, '_index', index) + tmp.push(item) + if (item[children] && item[children].length > 0) { + const res = treeToArray(item[children], children) + tmp = tmp.concat(res) } }) return tmp } + +export function addAttrs(data, { parent = null, preIndex = false, level = 0, expand = false, children = 'children', show = true, select = false } = {}) { + data.forEach((item, index) => { + const _id = (preIndex ? `${preIndex}-${index}` : index) + '' + Vue.set(item, '_id', _id) + Vue.set(item, '_level', level) + Vue.set(item, '_expand', expand) + Vue.set(item, '_parent', parent) + Vue.set(item, '_show', show) + Vue.set(item, '_select', select) + if (item[children] && item[children].length > 0) { + addAttrs(item[children], { + parent: item, + level: level + 1, + expand, + preIndex: _id, + children, + status, + select + }) + } + }) +} + +export function cleanParentAttr(data, children = 'children') { + data.forEach(item => { + item._parent = null + if (item[children] && item[children].length > 0) { + addAttrs(item[children], children) + } + }) + return data +} diff --git a/src/components/TreeTable/index.vue b/src/components/TreeTable/index.vue index a48765c8..cbe1eb60 100644 --- a/src/components/TreeTable/index.vue +++ b/src/components/TreeTable/index.vue @@ -1,127 +1,177 @@ <template> - <el-table :data="formatData" :row-style="showRow" v-bind="$attrs"> - <el-table-column v-if="columns.length===0" width="150"> + <el-table :data="tableData" :row-style="showRow" v-bind="$attrs" v-on="$listeners" > + <slot name="selection" /> + <slot name="pre-column" /> + <el-table-column + v-for="item in columns" + :label="item.label" + :key="item.key" + :width="item.width" + :align="item.align||'center'" + :header-align="item.headerAlign"> <template slot-scope="scope"> - <span v-for="space in scope.row._level" :key="space" class="ms-tree-space"/> - <span v-if="iconShow(0,scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)"> - <i v-if="!scope.row._expanded" class="el-icon-plus"/> - <i v-else class="el-icon-minus"/> - </span> - {{ scope.$index }} + <slot :scope="scope" :name="item.key"> + <template v-if="item.expand"> + <span :style="{'padding-left':+scope.row._level*indent + 'px'} "/> + <span v-show="showSperadIcon(scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)"> + <i v-if="!scope.row._expand" class="el-icon-plus" /> + <i v-else class="el-icon-minus" /> + </span> + </template> + <template v-if="item.checkbox"> + <el-checkbox + v-if="scope.row[defaultChildren]&&scope.row[defaultChildren].length>0" + :style="{'padding-left':+scope.row._level*indent + 'px'} " + :indeterminate="scope.row._select" + v-model="scope.row._select" + @change="handleCheckAllChange(scope.row)" /> + <el-checkbox + v-else + :style="{'padding-left':+scope.row._level*indent + 'px'} " + v-model="scope.row._select" + @change="handleCheckAllChange(scope.row)" /> + </template> + {{ scope.row[item.key] }} + </slot> </template> </el-table-column> - <el-table-column v-for="(column, index) in columns" v-else :key="column.value" :label="column.text" :width="column.width"> - <template slot-scope="scope"> - <!-- Todo --> - <!-- eslint-disable-next-line vue/no-confusing-v-for-v-if --> - <span v-for="space in scope.row._level" v-if="index === 0" :key="space" class="ms-tree-space"/> - <span v-if="iconShow(index,scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)"> - <i v-if="!scope.row._expanded" class="el-icon-plus"/> - <i v-else class="el-icon-minus"/> - </span> - {{ scope.row[column.value] }} - </template> - </el-table-column> - <slot/> </el-table> </template> <script> -/** - Auth: Lei.j1ang - Created: 2018/1/19-13:59 -*/ -import treeToArray from './eval' +import treeToArray, { addAttrs } from './eval.js' + export default { name: 'TreeTable', props: { - /* eslint-disable */ data: { - type: [Array, Object], - required: true + type: Array, + required: true, + default: () => [] }, columns: { type: Array, default: () => [] }, - evalFunc: Function, - evalArgs: Array, - expandAll: { + defaultExpandAll: { type: Boolean, default: false + }, + defaultChildren: { + type: String, + default: 'children' + }, + indent: { + type: Number, + default: 50 + } + }, + data() { + return { + guard: 1 } }, computed: { - // 格式化数据源 - formatData: function() { - let tmp - if (!Array.isArray(this.data)) { - tmp = [this.data] - } else { - tmp = this.data + children() { + return this.defaultChildren + }, + tableData() { + const data = this.data + if (this.data.length === 0) { + return [] } - const func = this.evalFunc || treeToArray - const args = this.evalArgs ? Array.concat([tmp, this.expandAll], this.evalArgs) : [tmp, this.expandAll] - return func.apply(null, args) + addAttrs(data, { + expand: this.defaultExpandAll, + children: this.defaultChildren + }) + + const retval = treeToArray(data, this.defaultChildren) + return retval } }, methods: { - showRow: function(row) { - const show = (row.row.parent ? (row.row.parent._expanded && row.row.parent._show) : true) - row.row._show = show - return show ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' : 'display:none;' + addBrother(row, data) { + if (row._parent) { + row._parent.children.push(data) + } else { + this.data.push(data) + } }, - // 切换下级是否展开 - toggleExpanded: function(trIndex) { - const record = this.formatData[trIndex] - record._expanded = !record._expanded + addChild(row, data) { + if (!row.children) { + this.$set(row, 'children', []) + } + row.children.push(data) }, - // 图标显示 - iconShow(index, record) { - return (index === 0 && record.children && record.children.length > 0) + delete(row) { + const { _index, _parent } = row + if (_parent) { + _parent.children.splice(_index, 1) + } else { + this.data.splice(_index, 1) + } + }, + getData() { + return this.tableData + }, + showRow: function({ row }) { + const parent = row._parent + const show = parent ? parent._expand && parent._show : true + row._show = show + return show + ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' + : 'display:none;' + }, + showSperadIcon(record) { + return record[this.children] && record[this.children].length > 0 + }, + toggleExpanded(trIndex) { + const record = this.tableData[trIndex] + const expand = !record._expand + record._expand = expand + }, + handleCheckAllChange(row) { + this.selcetRecursion(row, row._select, this.defaultChildren) + this.isIndeterminate = row._select + }, + selcetRecursion(row, select, children = 'children') { + if (select) { + this.$set(row, '_expand', true) + this.$set(row, '_show', true) + } + const sub_item = row[children] + if (sub_item && sub_item.length > 0) { + sub_item.map(child => { + child._select = select + this.selcetRecursion(child, select, children) + }) + } } } } </script> -<style rel="stylesheet/css"> - @keyframes treeTableShow { - from {opacity: 0;} - to {opacity: 1;} - } - @-webkit-keyframes treeTableShow { - from {opacity: 0;} - to {opacity: 1;} - } -</style> -<style lang="scss" rel="stylesheet/scss" scoped> - $color-blue: #2196F3; - $space-width: 18px; - .ms-tree-space { - position: relative; - top: 1px; - display: inline-block; - font-style: normal; - font-weight: 400; - line-height: 1; - width: $space-width; - height: 14px; - &::before { - content: "" - } +<style> +@keyframes treeTableShow { + from { + opacity: 0; } - .processContainer{ - width: 100%; - height: 100%; + to { + opacity: 1; } - table td { - line-height: 26px; +} +@-webkit-keyframes treeTableShow { + from { + opacity: 0; } + to { + opacity: 1; + } +} - .tree-ctrl{ - position: relative; - cursor: pointer; - color: $color-blue; - margin-left: -$space-width; - } +.tree-ctrl { + position: relative; + cursor: pointer; + color: #2196f3; +} </style> diff --git a/src/components/TreeTable/readme.md b/src/components/TreeTable/readme.md index 5b598e11..fe404ed0 100644 --- a/src/components/TreeTable/readme.md +++ b/src/components/TreeTable/readme.md @@ -1,89 +1,99 @@ ## 写在前面 -此组件仅提供一个创建TreeTable的解决思路 -## prop说明 -#### *data* - **必填** +此组件仅提供一个创建 TreeTable 的解决思路,本组件充分利用 vue 插槽的特性,方便用户自定义 - 原始数据,要求是一个数组或者对象 - ```javascript - [{ - key1: value1, - key2: value2, - children: [{ +evel.js 里面 `addAttrs` 方法会给数据添加几个属性,treeTotable 会对数组扁平化。这些操作都不会破坏源数据,只是会新增属性。 + +调用 addAttrs 后,因\_\_parent 属性,会造成数据循环引用,使用 JSON.stringify()报错,所以转成 JSON 之前需要清除\_\_parent 属性。 + +## prop 说明 + +- data(原始数据,要求是一个数组或者对象) +- columns(列属性,要求是一个数组) +- renderContent(数组扁平化方法(可选)) +- defaultExpandAll(默认是否全部展开,默认全部展开) +- defaultChildren(子元素名,默认为 children) +- spreadOffset(扩展符号的偏移量,默认为 50px) +- checkboxOffset(复选框的偏移量,默认为 50px) + +--- + +### 代码示例 + +- data(**必填**) + +原始数据, + +```js +const data = [ + { + key1: value1, + key2: value2, + children: [ + { key1: value1 }, { key1: value1 - }] - }, - { - key1: value1 - }] - ``` - 或者 - ```javascript - { - key1: value1, - key2: value2, - children: [{ - key1: value1 - }, - { - key1: value1 - }] - } - ``` + } + ] + }, + { + key1: value1 + } +] +``` -#### columns - 列属性,要求是一个数组 +或者 - 1. text: 显示在表头的文字 - 2. value: 对应data的key。treeTable将显示相应的value - 3. width: 每列的宽度,为一个数字(可选) +```javascript + { + key1: value1, + key2: value2, + children: [{ + key1: value1 + }, + { + key1: value1 + }] + } +``` - 如果你想要每个字段都有自定义的样式或者嵌套其他组件,columns可不提供,直接像在el-table一样写即可,如果没有自定义内容,提供columns将更加的便捷方便 +- columns - 如果你有几个字段是需要自定义的,几个不需要,那么可以将不需要自定义的字段放入columns,将需要自定义的内容放入到slot中,详情见后文 - ```javascript - [{ - value:string, - text:string, - width:number - },{ - value:string, - text:string, - width:number - }] - ``` +1. label: 显示在表头的文字 +2. key: 对应 data 的 key。treeTable 将显示相应的 value +3. width: 每列的宽度,为一个数字(可选) -#### expandAll - 是否默认全部展开,boolean值,默认为false +树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 -#### evalFunc - 解析函数,function,非必须 +```javascript +const columns = [ + // 建议第一列做展开收缩操作 + { label: '', key: '__spread', width: '200' }, + // 如果添加复选框 + { label: '', key: '__checkbox', width: '200' }, + { + label: string, + key: string, + width: number + }, + { + label: string, + key: string, + width: number + } +] +``` - 如果不提供,将使用默认的[evalFunc](./eval.js) +#### renderContent - 如果提供了evalFunc,那么会用提供的evalFunc去解析data,并返回treeTable渲染所需要的值。如何编写一个evalFunc,请参考[*eval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/TreeTable/eval.js)或[*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customEval.js) +解析函数,function,非必须 -#### evalArgs - 解析函数的参数,是一个数组 +如果不提供,将使用默认的[evalFunc](./eval.js) - **请注意,自定义的解析函数参数第一个为this.data,第二个参数为, this.expandAll,你不需要在evalArgs填写。一定记住,这两个参数是强制性的,并且位置不可颠倒** *this.data为需要解析的数据,this.expandAll为是否默认展开* +如果提供了 evalFunc,那么会用提供的 evalFunc 去解析 data,并返回 treeTable 渲染所需要的值。 - 如你的解析函数需要的参数为`(this.data, this.expandAll,1,2,3,4)`,那么你只需要将`[1,2,3,4]`赋值给`evalArgs`就可以了 +## 其他 - 如果你的解析函数参数只有`(this.data, this.expandAll)`,那么就可以不用填写evalArgs了 - - 具体可参考[*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customEval.js)的函数参数和[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customTreeTable.vue)的`evalArgs`属性值 - - ## slot - 这是一个自定义列的插槽。 - - 默认情况下,treeTable只有一行行展示数据的功能。但是一般情况下,我们会要给行加上一个操作按钮或者根据当行数据展示不同的样式,这时我们就需要自定义列了。请参考[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customTreeTable.vue),[实例效果](https://panjiachen.github.io/vue-element-admin/#/table/tree-table) - - `slot`和`columns属性`可同时存在,columns里面的数据列会在slot自定义列的左边展示 - - ## 其他 - 如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的api自行修改index.vue +如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue diff --git a/src/mock/table.js b/src/mock/table.js new file mode 100644 index 00000000..e69de29b diff --git a/src/views/table/treeTable/customEval.js b/src/views/table/treeTable/customEval.js deleted file mode 100644 index 73badb68..00000000 --- a/src/views/table/treeTable/customEval.js +++ /dev/null @@ -1,48 +0,0 @@ -/** -* @Author: jianglei -* @Date: 2017-10-12 12:06:49 -*/ -'use strict' -import Vue from 'vue' -export default function treeToArray(data, expandAll, parent, level, item) { - const marLTemp = [] - let tmp = [] - Array.from(data).forEach(function(record) { - if (record._expanded === undefined) { - Vue.set(record, '_expanded', expandAll) - } - let _level = 1 - if (level !== undefined && level !== null) { - _level = level + 1 - } - Vue.set(record, '_level', _level) - // 如果有父元素 - if (parent) { - Vue.set(record, 'parent', parent) - // 如果父元素有偏移量,需要计算在this的偏移量中 - // 偏移量还与前面同级元素有关,需要加上前面所有元素的长度和 - if (!marLTemp[_level]) { - marLTemp[_level] = 0 - } - Vue.set(record, '_marginLeft', marLTemp[_level] + parent._marginLeft) - Vue.set(record, '_width', record[item] / parent[item] * parent._width) - // 在本次计算过偏移量后加上自己长度,以供下一个元素使用 - marLTemp[_level] += record._width - } else { - // 如果为根 - // 初始化偏移量存储map - marLTemp[record.id] = [] - // map中是一个数组,存储的是每级的长度和 - // 初始情况下为0 - marLTemp[record.id][_level] = 0 - Vue.set(record, '_marginLeft', 0) - Vue.set(record, '_width', 1) - } - tmp.push(record) - if (record.children && record.children.length > 0) { - const children = treeToArray(record.children, expandAll, record, _level, item) - tmp = tmp.concat(children) - } - }) - return tmp -} diff --git a/src/views/table/treeTable/customTreeTable.vue b/src/views/table/treeTable/customTreeTable.vue index 2a216171..1ed346fb 100644 --- a/src/views/table/treeTable/customTreeTable.vue +++ b/src/views/table/treeTable/customTreeTable.vue @@ -1,137 +1,162 @@ <template> - <div class="app-container"> + <div> + <div class="app-container"> + <el-tag style="margin-bottom:20px;"> + <a + href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" + target="_blank" + >Documentation</a> + </el-tag> - <el-tag style="margin-bottom:20px;"> - <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> - </el-tag> + <tree-table + ref="TreeTable" + :data="tableData" + :default-expand-all="true" + :columns="columns" + border + default-children="children" + @selection-change ="selectChange" + > - <tree-table :data="data" :eval-func="func" :eval-args="args" :expand-all="expandAll" border> - <el-table-column label="事件"> - <template slot-scope="scope"> - <span style="color:sandybrown">{{ scope.row.event }}</span> - <el-tag>{{ scope.row.timeLine+'ms' }}</el-tag> + <template slot="selection"> + <el-table-column type="selection" align="center" width="55"/> </template> - </el-table-column> - <el-table-column label="时间线"> - <template slot-scope="scope"> + + <template slot="pre-column"> + <el-table-column type="expand" width="55"> + <template> + <el-tag type="info"> + Here is just a placeholder slot, you can display anything. + </el-tag> + </template> + </el-table-column> + </template> + + <template slot="timeline" slot-scope="{scope}"> + <el-tooltip :content="scope.row.timeLine+'ms'" effect="dark" placement="left"> <div class="processContainer"> <div - :style="{ width:scope.row._width * 500+'px', - background:scope.row._width>0.5?'rgba(233,0,0,.5)':'rgba(0,0,233,0.5)', - marginLeft:scope.row._marginLeft * 500+'px' }" + :style="{ width:(scope.row.timeLine||0) * 3+'px', + background:scope.row.timeLine>50?'rgba(233,0,0,.5)':'rgba(0,0,233,0.5)', + marginLeft:scope.row._level * 50+'px' }" class="process"> <span style="display:inline-block"/> </div> </div> </el-tooltip> + </template> - </el-table-column> - <el-table-column label="操作" width="200"> - <template slot-scope="scope"> - <el-button type="text" @click="message(scope.row)">点击</el-button> + + <template slot="append" slot-scope="{scope}"> + <el-button + size="mini" + type="primary" + @click="addMenuItem(scope.row,'brother')" + >Append Brother + </el-button> + <el-button + size="mini" + type="primary" + @click="addMenuItem(scope.row,'children')" + >Append Child + </el-button> </template> - </el-table-column> - </tree-table> + <template slot="operation" slot-scope="{scope}"> + <el-button size="mini" type="success" @click="editItem(scope.row)">Edit</el-button> + <el-button size="mini" type="danger" @click="deleteItem(scope.row)">Delete</el-button> + </template> + </tree-table> + </div> + + <el-dialog :visible.sync="dialogFormVisible" title="Edit"> + <el-form :model="tempItem" label-width="100px" style="width:600px"> + <el-form-item label="Name"> + <el-input v-model.trim="tempItem.name" placeholder="Name"/> + </el-form-item> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="dialogFormVisible = false">Cancel</el-button> + <el-button type="primary" @click="updateItem">Confirm</el-button> + </span> + </el-dialog> + </div> </template> <script> -/** - Auth: Lei.j1ang - Created: 2018/1/19-14:54 -*/ -import treeTable from '@/components/TreeTable' -import treeToArray from './customEval' + +import TreeTable from '@/components/TreeTable' +import { data } from './data.js' export default { - name: 'CustomTreeTableDemo', - components: { treeTable }, + components: { TreeTable }, data() { return { - func: treeToArray, - expandAll: false, - data: + tableData: [], + tempItem: {}, + dialogFormVisible: false, + columns: [ { - id: 1, - event: '事件1', - timeLine: 100, - comment: '无', - children: [ - { - id: 2, - event: '事件2', - timeLine: 10, - comment: '无' - }, - { - id: 3, - event: '事件3', - timeLine: 90, - comment: '无', - children: [ - { - id: 4, - event: '事件4', - timeLine: 5, - comment: '无' - }, - { - id: 5, - event: '事件5', - timeLine: 10, - comment: '无' - }, - { - id: 6, - event: '事件6', - timeLine: 75, - comment: '无', - children: [ - { - id: 7, - event: '事件7', - timeLine: 50, - comment: '无', - children: [ - { - id: 71, - event: '事件71', - timeLine: 25, - comment: 'xx' - }, - { - id: 72, - event: '事件72', - timeLine: 5, - comment: 'xx' - }, - { - id: 73, - event: '事件73', - timeLine: 20, - comment: 'xx' - } - ] - }, - { - id: 8, - event: '事件8', - timeLine: 25, - comment: '无' - } - ] - } - ] - } - ] + label: 'Name', + key: 'name', + expand: true }, - args: [null, null, 'timeLine'] + { + label: 'Timeline', + key: 'timeline' + }, + { + label: 'Append', + key: 'append', + width: 300 + }, + { + label: 'Operation', + key: 'operation', + width: 160 + } + ] } }, + created() { + this.getData() + }, methods: { - message(row) { - this.$message.info(row.event) + getData() { + this.tableData = data + }, + editItem(row) { + this.tempItem = Object.assign({}, row) + this.dialogFormVisible = true + }, + updateItem() { + const data = this.$refs.TreeTable.getData() + const { _id } = this.tempItem + + for (let i = 0; i < data.length; i++) { + if (data[i]._id === _id) { + data.splice(i, 1, Object.assign({}, this.tempItem)) + break + } + } + + this.dialogFormVisible = false + }, + addMenuItem(row, type) { + if (type === 'children') { + this.$refs.TreeTable.addChild(row, { name: 'child' }) + } + + if (type === 'brother') { + this.$refs.TreeTable.addBrother(row, { name: 'brother' }) + } + }, + deleteItem(row) { + this.$refs.TreeTable.delete(row) + }, + selectChange(val) { + console.log(val) } } } diff --git a/src/views/table/treeTable/data.js b/src/views/table/treeTable/data.js new file mode 100644 index 00000000..a1bbbaf1 --- /dev/null +++ b/src/views/table/treeTable/data.js @@ -0,0 +1,49 @@ +export const data = [ + { + name: '1', + timeLine: 100, + children: [ + { + name: '1-1', + timeLine: 20 + }, + { + name: '1-2', + timeLine: 60, + children: [ + { + name: '1-2-1', + timeLine: 35 + }, + { + name: '1-2-2', + timeLine: 25 + } + ] + } + ] + }, + { + name: '2', + timeLine: 80, + children: [ + { + name: '2-1', + timeLine: 30 + }, + { + name: '2-2', + timeLine: 50 + }, + { + name: '2-3', + timeLine: 60 + } + ] + }, + { + name: '3', + timeLine: 40 + } +] + diff --git a/src/views/table/treeTable/treeTable.vue b/src/views/table/treeTable/treeTable.vue index d2ecf14d..3785dd5e 100644 --- a/src/views/table/treeTable/treeTable.vue +++ b/src/views/table/treeTable/treeTable.vue @@ -1,20 +1,48 @@ <template> <div class="app-container"> - <el-tag style="margin-bottom:20px;"> - <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> - </el-tag> + <div style="margin-bottom:20px;"> - <tree-table :data="data" :columns="columns" border/> + <el-button type="primary" class="option-item"> + <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> + </el-button> + + <div class="option-item"> + <el-tag>Expand All</el-tag> + <el-switch + v-model="defaultExpandAll" + active-color="#13ce66" + inactive-color="#ff4949" + @change="reset"/> + </div> + + <div class="option-item"> + <el-tag>Show Checkbox</el-tag> + <el-switch + v-model="showCheckbox" + active-color="#13ce66" + inactive-color="#ff4949" + /> + </div> + + </div> + + <tree-table :key="key" :default-expand-all="defaultExpandAll" :data="data" :columns="columns" border> + <template slot="scope" slot-scope="{scope}"> + <el-tag>level: {{ scope.row._level }}</el-tag> + <el-tag>expand: {{ scope.row._expand }}</el-tag> + <el-tag>select: {{ scope.row._select }}</el-tag> + </template> + <template slot="operation" slot-scope="{scope}"> + <el-button type="primary" size="" @click="click(scope)">Click</el-button> + </template> + </tree-table> </div> </template> <script> -/** - Auth: Lei.j1ang - Created: 2018/1/19-14:54 -*/ + import treeTable from '@/components/TreeTable' export default { @@ -22,99 +50,103 @@ export default { components: { treeTable }, data() { return { + defaultExpandAll: false, + showCheckbox: true, + key: 1, columns: [ { - text: '事件', - value: 'event', - width: 200 + label: 'Checkbox', + checkbox: true }, { - text: 'ID', - value: 'id' + label: '', + key: 'id', + expand: true }, { - text: '时间线', - value: 'timeLine' + label: 'Event', + key: 'event', + width: 200, + align: 'left' }, { - text: '备注', - value: 'comment' + label: 'Scope', + key: 'scope' + }, + { + label: 'Operation', + key: 'operation' } ], data: [ { id: 0, - event: '事件1', - timeLine: 50, - comment: '无' + event: 'Event-0', + timeLine: 50 }, { id: 1, - event: '事件1', + event: 'Event-1', timeLine: 100, - comment: '无', children: [ { id: 2, - event: '事件2', - timeLine: 10, - comment: '无' + event: 'Event-2', + timeLine: 10 + }, { id: 3, - event: '事件3', + event: 'Event-3', timeLine: 90, - comment: '无', children: [ { id: 4, - event: '事件4', - timeLine: 5, - comment: '无' + event: 'Event-4', + timeLine: 5 + }, { id: 5, - event: '事件5', - timeLine: 10, - comment: '无' + event: 'Event-5', + timeLine: 10 + }, { id: 6, - event: '事件6', + event: 'Event-6', timeLine: 75, - comment: '无', + children: [ { id: 7, - event: '事件7', + event: 'Event-7', timeLine: 50, - comment: '无', + children: [ { id: 71, - event: '事件71', - timeLine: 25, - comment: 'xx' + event: 'Event-7-1', + timeLine: 25 + }, { id: 72, - event: '事件72', - timeLine: 5, - comment: 'xx' + event: 'Event-7-2', + timeLine: 5 + }, { id: 73, - event: '事件73', - timeLine: 20, - comment: 'xx' + event: 'Event-7-3', + timeLine: 20 } ] }, { id: 8, - event: '事件8', - timeLine: 25, - comment: '无' + event: 'Event-8', + timeLine: 25 } ] } @@ -124,6 +156,34 @@ export default { } ] } + }, + watch: { + showCheckbox(val) { + if (val) { + this.columns.unshift({ + label: 'Checkbox', + checkbox: true + }) + } else { + this.columns.shift() + } + this.reset() + } + }, + methods: { + reset() { + ++this.key + }, + click(scope) { + console.log(scope) + } } } </script> + +<style scoped> +.option-item{ + display: inline-block; + margin-right: 15px; +} +</style> From 5ca6f798364a67718a08ed29321bd4547573cf5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 7 Mar 2019 14:13:36 +0800 Subject: [PATCH 060/202] perf[Tree-Table]: organize the structure and add documentation (#1673) --- src/components/TreeTable/README.md | 220 ++++++++++++++++++ src/components/TreeTable/readme.md | 99 -------- src/icons/svg/tree-table.svg | 1 + src/router/index.js | 2 + src/router/modules/table.js | 12 - src/router/modules/tree-table.js | 29 +++ .../treeTable => tree-table/custom}/data.js | 4 +- .../custom/index.vue} | 23 +- src/views/tree-table/data.js | 80 +++++++ .../treeTable.vue => tree-table/index.vue} | 96 ++------ 10 files changed, 365 insertions(+), 201 deletions(-) create mode 100644 src/components/TreeTable/README.md delete mode 100644 src/components/TreeTable/readme.md create mode 100644 src/icons/svg/tree-table.svg create mode 100644 src/router/modules/tree-table.js rename src/views/{table/treeTable => tree-table/custom}/data.js (94%) rename src/views/{table/treeTable/customTreeTable.vue => tree-table/custom/index.vue} (87%) create mode 100644 src/views/tree-table/data.js rename src/views/{table/treeTable/treeTable.vue => tree-table/index.vue} (55%) diff --git a/src/components/TreeTable/README.md b/src/components/TreeTable/README.md new file mode 100644 index 00000000..05326dfa --- /dev/null +++ b/src/components/TreeTable/README.md @@ -0,0 +1,220 @@ + +- [Enlgish](#Brief) + +# 中文 + +## 写在前面 + +此组件仅提供一个创建 `TreeTable` 的解决思路。它基于`element-ui`的 table 组件实现,通过`el-table`的`row-style`方法,在里面判断元素是否需要隐藏或者显示,从而实现`TreeTable`的展开与收起。 + +并且本组件充分利用 `vue` 插槽的特性来方便用户自定义。 + +`evel.js` 里面,`addAttrs` 方法会给数据添加几个属性,`treeTotable` 会对数组扁平化。这些操作都不会破坏源数据,只是会新增属性。 + +## Props 说明 + +| Attribute | Description | Type | Default | +| :--------------: | :--------------------------------- | :-----: | :------: | +| data | 原始展示数据 | Array | [] | +| columns | 列属性 | Array | [] | +| defaultExpandAll | 默认是否全部展开 | Boolean | false | +| defaultChildren | 指定子树为节点对象的某个属性值 | String | children | | +| indent | 相邻级节点间的水平缩进,单位为像素 | Number | 50 | + +> 任何 `el-table` 的属性都支持,例如`border`、`fit`、`size`或者`@select`、`@cell-click`等方法。详情属性见`el-table`文档。 + +--- + +### 代码示例 + +```html +<tree-table :data="data" :columns="columns" border> +``` + +#### data(**必填**) + +```js +const data = [ + { + name:'1' + children: [ + { + name: '1-1' + }, + { + name: '1-2' + } + ] + }, + { + name: `2` + } +] +``` + +#### columns(**必填**) + +- label: 显示在表头的文字 +- key: 对应 data 的 key。treeTable 将显示相应的 value +- expand: `true` or `false`。若为 true,则在该列显示展开收起图标 +- checkbox: `true` or `false`。若为 true,则在该列显示`checkbox` +- width: 每列的宽度,为一个数字(可选)。例如`200` +- align: 对齐方式 `left/center/right` +- header-align: 表头对齐方式 `left/center/right` + +```javascript +const columns = [ + { + label: 'Checkbox', + checkbox: true + }, + { + label: '', + key: 'id', + expand: true + }, + { + label: 'Event', + key: 'event', + width: 200, + align: 'left' + }, + { + label: 'Scope', + key: 'scope' + } +] +``` + +> 树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 + +```html +<template slot="your key" slot-scope="{scope}"> + <el-tag>level: {{ scope.row._level }}</el-tag> + <el-tag>expand: {{ scope.row._expand }}</el-tag> + <el-tag>select: {{ scope.row._select }}</el-tag> +</template> +``` + +## Events + +目前提供了几个方法,不过只是`beta`版本,之后很可能会修改。 + +```js +this.$refs.TreeTable.addChild(row, data) //添加子元素 +this.$refs.TreeTable.addBrother(row, data) //添加兄弟元素 +this.$refs.TreeTable.delete(row) //删除该元素 +``` + +## 其他 + +如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue + +# English + +## Brief + +This component only provides a solution for creating `TreeTable`. It is based on the `element-ui` table component. It uses the `row-style` method of `el-table` to determine whether the element needs to be hidden or displayed. + +And this component makes full use of the features of the `vue` slot to make it user-friendly. + +In `evel.js`, the `addAttrs` method adds several properties to the data, and `treeTotable` flattens the array. None of these operations will destroy the source data, just add properties. + +## Props + +| Attribute | Description | Type | Default | +| :--------------: | :----------------------------------------------------------- | :-----: | :------: | +| data | original display data | Array | [] | +| columns | column attribute | Array | [] | +| defaultExpandAll | whether to expand all nodes by default | Boolean | false | +| defaultChildren | specify which node object is used as the node's subtree | String | children | | +| indent | horizontal indentation of nodes in adjacent levels in pixels | Number | 50 | + +> Any of the `el-table` properties are supported, such as `border`, `fit`, `size` or `@select`, `@cell-click`. See the ʻel-table` documentation for details. + +--- + +### Example + +```html +<tree-table :data="data" :columns="columns" border> +``` + +#### data(**Required**) + +```js +const data = [ + { + name:'1' + children: [ + { + name: '1-1' + }, + { + name: '1-2' + } + ] + }, + { + name: `2` + } +] +``` + +#### columns(**Required**) + +- label: text displayed in the header +- key: data.key will show in column +- expand: `true` or `false` +- checkbox: `true` or `false` +- width: column width 。such as `200` +- align: alignment `left/center/right` +- header-align: alignment of the table header `left/center/right` + +```javascript +const columns = [ + { + label: 'Checkbox', + checkbox: true + }, + { + label: '', + key: 'id', + expand: true + }, + { + label: 'Event', + key: 'event', + width: 200, + align: 'left' + }, + { + label: 'Scope', + key: 'scope' + } +] +``` + +> The tree table component will generate a named slot based on the key property of columns. If you need to customize the column data, you can do it through the slot. + +```html +<template slot="your key" slot-scope="{scope}"> + <el-tag>level: {{ scope.row._level }}</el-tag> + <el-tag>expand: {{ scope.row._expand }}</el-tag> + <el-tag>select: {{ scope.row._select }}</el-tag> +</template> +``` + +## Events + +Several methods are currently available, but only the `beta` version, which is likely to be modified later. + +```js +this.$refs.TreeTable.addChild(row, data) //Add child elements +this.$refs.TreeTable.addBrother(row, data) //Add a sibling element +this.$refs.TreeTable.delete(row) //Delete the element +``` + +## Other + +If you have other requirements, please refer to the [el-table](http://element-cn.eleme.io/#/en-US/component/table) api to modify the index.vue diff --git a/src/components/TreeTable/readme.md b/src/components/TreeTable/readme.md deleted file mode 100644 index fe404ed0..00000000 --- a/src/components/TreeTable/readme.md +++ /dev/null @@ -1,99 +0,0 @@ -## 写在前面 - -此组件仅提供一个创建 TreeTable 的解决思路,本组件充分利用 vue 插槽的特性,方便用户自定义 - -evel.js 里面 `addAttrs` 方法会给数据添加几个属性,treeTotable 会对数组扁平化。这些操作都不会破坏源数据,只是会新增属性。 - -调用 addAttrs 后,因\_\_parent 属性,会造成数据循环引用,使用 JSON.stringify()报错,所以转成 JSON 之前需要清除\_\_parent 属性。 - -## prop 说明 - -- data(原始数据,要求是一个数组或者对象) -- columns(列属性,要求是一个数组) -- renderContent(数组扁平化方法(可选)) -- defaultExpandAll(默认是否全部展开,默认全部展开) -- defaultChildren(子元素名,默认为 children) -- spreadOffset(扩展符号的偏移量,默认为 50px) -- checkboxOffset(复选框的偏移量,默认为 50px) - ---- - -### 代码示例 - -- data(**必填**) - -原始数据, - -```js -const data = [ - { - key1: value1, - key2: value2, - children: [ - { - key1: value1 - }, - { - key1: value1 - } - ] - }, - { - key1: value1 - } -] -``` - -或者 - -```javascript - { - key1: value1, - key2: value2, - children: [{ - key1: value1 - }, - { - key1: value1 - }] - } -``` - -- columns - -1. label: 显示在表头的文字 -2. key: 对应 data 的 key。treeTable 将显示相应的 value -3. width: 每列的宽度,为一个数字(可选) - -树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 - -```javascript -const columns = [ - // 建议第一列做展开收缩操作 - { label: '', key: '__spread', width: '200' }, - // 如果添加复选框 - { label: '', key: '__checkbox', width: '200' }, - { - label: string, - key: string, - width: number - }, - { - label: string, - key: string, - width: number - } -] -``` - -#### renderContent - -解析函数,function,非必须 - -如果不提供,将使用默认的[evalFunc](./eval.js) - -如果提供了 evalFunc,那么会用提供的 evalFunc 去解析 data,并返回 treeTable 渲染所需要的值。 - -## 其他 - -如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue diff --git a/src/icons/svg/tree-table.svg b/src/icons/svg/tree-table.svg new file mode 100644 index 00000000..8aafdb82 --- /dev/null +++ b/src/icons/svg/tree-table.svg @@ -0,0 +1 @@ +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M44.8 0h79.543C126.78 0 128 1.422 128 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H44.8c-2.438 0-3.657-1.422-3.657-4.267V4.267C41.143 1.422 42.362 0 44.8 0zm22.857 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 80 64 78.578 64 75.733V52.267C64 49.422 65.219 48 67.657 48zm0 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 128 64 126.578 64 123.733v-23.466C64 97.422 65.219 96 67.657 96zM50.286 68.267c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V32h6.4c2.02 0 3.658-1.91 3.658-4.267V4.267C27.429 1.91 25.79 0 23.77 0H3.657C1.637 0 0 1.91 0 4.267v23.466C0 30.09 1.637 32 3.657 32h6.4v80c0 2.356 1.638 4.267 3.657 4.267h36.572c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V68.267h32.915z"/></svg> \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 60524517..a4a71e46 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -10,6 +10,7 @@ import Layout from '@/views/layout/Layout' import componentsRouter from './modules/components' import chartsRouter from './modules/charts' import tableRouter from './modules/table' +import treeTableRouter from './modules/tree-table' import nestedRouter from './modules/nested' /** note: sub-menu only appear when children.length>=1 @@ -162,6 +163,7 @@ export const asyncRouterMap = [ chartsRouter, nestedRouter, tableRouter, + treeTableRouter, { path: '/example', diff --git a/src/router/modules/table.js b/src/router/modules/table.js index a9c4cb44..4d7f55ef 100644 --- a/src/router/modules/table.js +++ b/src/router/modules/table.js @@ -30,18 +30,6 @@ const tableRouter = { name: 'InlineEditTable', meta: { title: 'inlineEditTable' } }, - { - path: 'tree-table', - component: () => import('@/views/table/treeTable/treeTable'), - name: 'TreeTableDemo', - meta: { title: 'treeTable' } - }, - { - path: 'custom-tree-table', - component: () => import('@/views/table/treeTable/customTreeTable'), - name: 'CustomTreeTableDemo', - meta: { title: 'customTreeTable' } - }, { path: 'complex-table', component: () => import('@/views/table/complexTable'), diff --git a/src/router/modules/tree-table.js b/src/router/modules/tree-table.js new file mode 100644 index 00000000..5ee26828 --- /dev/null +++ b/src/router/modules/tree-table.js @@ -0,0 +1,29 @@ +/** When your routing table is too long, you can split it into small modules**/ + +import Layout from '@/views/layout/Layout' + +const treeTableRouter = { + path: '/tree-table', + component: Layout, + redirect: '/table/complex-table', + name: 'TreeTable', + meta: { + title: 'treeTable', + icon: 'tree-table' + }, + children: [ + { + path: 'index', + component: () => import('@/views/tree-table/index'), + name: 'TreeTableDemo', + meta: { title: 'treeTable' } + }, + { + path: 'custom', + component: () => import('@/views/tree-table/custom'), + name: 'CustomTreeTableDemo', + meta: { title: 'customTreeTable' } + } + ] +} +export default treeTableRouter diff --git a/src/views/table/treeTable/data.js b/src/views/tree-table/custom/data.js similarity index 94% rename from src/views/table/treeTable/data.js rename to src/views/tree-table/custom/data.js index a1bbbaf1..020f6247 100644 --- a/src/views/table/treeTable/data.js +++ b/src/views/tree-table/custom/data.js @@ -1,4 +1,4 @@ -export const data = [ +const data = [ { name: '1', timeLine: 100, @@ -47,3 +47,5 @@ export const data = [ } ] +export default data + diff --git a/src/views/table/treeTable/customTreeTable.vue b/src/views/tree-table/custom/index.vue similarity index 87% rename from src/views/table/treeTable/customTreeTable.vue rename to src/views/tree-table/custom/index.vue index 1ed346fb..6f9142a6 100644 --- a/src/views/table/treeTable/customTreeTable.vue +++ b/src/views/tree-table/custom/index.vue @@ -1,12 +1,10 @@ <template> <div> <div class="app-container"> - <el-tag style="margin-bottom:20px;"> - <a - href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" - target="_blank" - >Documentation</a> - </el-tag> + + <el-button type="primary" size="small" style="margin:0 0 20px 0;"> + <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> + </el-button> <tree-table ref="TreeTable" @@ -85,9 +83,8 @@ </template> <script> - import TreeTable from '@/components/TreeTable' -import { data } from './data.js' +import data from './data.js' export default { components: { TreeTable }, @@ -145,11 +142,11 @@ export default { }, addMenuItem(row, type) { if (type === 'children') { - this.$refs.TreeTable.addChild(row, { name: 'child' }) + this.$refs.TreeTable.addChild(row, { name: 'child', timeLine: this.randomNum() }) } if (type === 'brother') { - this.$refs.TreeTable.addBrother(row, { name: 'brother' }) + this.$refs.TreeTable.addBrother(row, { name: 'brother', timeLine: this.randomNum() }) } }, deleteItem(row) { @@ -157,6 +154,12 @@ export default { }, selectChange(val) { console.log(val) + }, + randomNum() { + // return 1~100 + const max = 100 + const min = 1 + return Math.floor(Math.random() * (max - min + 1) + min) } } } diff --git a/src/views/tree-table/data.js b/src/views/tree-table/data.js new file mode 100644 index 00000000..67b0137a --- /dev/null +++ b/src/views/tree-table/data.js @@ -0,0 +1,80 @@ + +const data = [ + { + id: 0, + event: 'Event-0', + timeLine: 50 + }, + { + id: 1, + event: 'Event-1', + timeLine: 100, + children: [ + { + id: 2, + event: 'Event-2', + timeLine: 10 + + }, + { + id: 3, + event: 'Event-3', + timeLine: 90, + children: [ + { + id: 4, + event: 'Event-4', + timeLine: 5 + + }, + { + id: 5, + event: 'Event-5', + timeLine: 10 + + }, + { + id: 6, + event: 'Event-6', + timeLine: 75, + + children: [ + { + id: 7, + event: 'Event-7', + timeLine: 50, + + children: [ + { + id: 71, + event: 'Event-7-1', + timeLine: 25 + + }, + { + id: 72, + event: 'Event-7-2', + timeLine: 5 + + }, + { + id: 73, + event: 'Event-7-3', + timeLine: 20 + } + ] + }, + { + id: 8, + event: 'Event-8', + timeLine: 25 + } + ] + } + ] + } + ] + } +] + +export default data diff --git a/src/views/table/treeTable/treeTable.vue b/src/views/tree-table/index.vue similarity index 55% rename from src/views/table/treeTable/treeTable.vue rename to src/views/tree-table/index.vue index 3785dd5e..2e131157 100644 --- a/src/views/table/treeTable/treeTable.vue +++ b/src/views/tree-table/index.vue @@ -3,7 +3,7 @@ <div style="margin-bottom:20px;"> - <el-button type="primary" class="option-item"> + <el-button type="primary" size="small" class="option-item"> <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> </el-button> @@ -42,8 +42,8 @@ </template> <script> - import treeTable from '@/components/TreeTable' +import data from './data' export default { name: 'TreeTableDemo', @@ -78,83 +78,7 @@ export default { key: 'operation' } ], - data: [ - { - id: 0, - event: 'Event-0', - timeLine: 50 - }, - { - id: 1, - event: 'Event-1', - timeLine: 100, - children: [ - { - id: 2, - event: 'Event-2', - timeLine: 10 - - }, - { - id: 3, - event: 'Event-3', - timeLine: 90, - children: [ - { - id: 4, - event: 'Event-4', - timeLine: 5 - - }, - { - id: 5, - event: 'Event-5', - timeLine: 10 - - }, - { - id: 6, - event: 'Event-6', - timeLine: 75, - - children: [ - { - id: 7, - event: 'Event-7', - timeLine: 50, - - children: [ - { - id: 71, - event: 'Event-7-1', - timeLine: 25 - - }, - { - id: 72, - event: 'Event-7-2', - timeLine: 5 - - }, - { - id: 73, - event: 'Event-7-3', - timeLine: 20 - } - ] - }, - { - id: 8, - event: 'Event-8', - timeLine: 25 - } - ] - } - ] - } - ] - } - ] + data: data } }, watch: { @@ -176,6 +100,20 @@ export default { }, click(scope) { console.log(scope) + + const row = scope.row + const message = Object.keys(row) + .map(i => { + return `<p>${i}: ${row[i]}</p>` + }) + .join('') + + this.$notify({ + title: 'Success', + dangerouslyUseHTMLString: true, + message: message, + type: 'success' + }) } } } From 3e92814f13c62aa626542859c2927ccbad81baf6 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 7 Mar 2019 17:50:36 +0800 Subject: [PATCH 061/202] fix[Sidebar]: fixed nested router hover bug --- src/views/layout/components/Sidebar/SidebarItem.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 94275aa8..47ac4b4d 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -9,7 +9,7 @@ </app-link> </template> - <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)"> + <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> <template slot="title"> <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="generateTitle(item.meta.title)" /> </template> From 1e2fc52ac964c8418fd0607f072726c05bc1427a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Sat, 9 Mar 2019 11:06:48 +0800 Subject: [PATCH 062/202] remove empty file --- src/mock/table.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/mock/table.js diff --git a/src/mock/table.js b/src/mock/table.js deleted file mode 100644 index e69de29b..00000000 From 698df4942db8c9d65353dbefb75b383e67f33bb5 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 11 Mar 2019 11:43:07 +0800 Subject: [PATCH 063/202] docs: add link --- src/styles/variables.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 50d9b3ef..22689568 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -22,6 +22,7 @@ $subMenuHover:#001528; $sideBarWidth: 180px; // the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass :export { menuText: $menuText; menuActiveText: $menuActiveText; From 8edf2094986130c57de00f936e242e2c34ad26d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 12 Mar 2019 11:12:28 +0800 Subject: [PATCH 064/202] fix[Sidebar]: fixed collapse animation problem (#1690) --- src/styles/sidebar.scss | 20 ++++++++++++++----- src/styles/variables.scss | 2 +- src/views/layout/components/Sidebar/index.vue | 1 + 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 96e89be7..03449706 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -83,19 +83,26 @@ .hideSidebar { .sidebar-container { - width: 36px !important; + width: 54px !important; } .main-container { - margin-left: 36px; + margin-left: 54px; + } + + .svg-icon { + margin-right: 0px; } .submenu-title-noDropdown { - padding-left: 10px !important; + padding: 0 !important; position: relative; .el-tooltip { - padding: 0 10px !important; + padding: 0 !important; + .svg-icon { + margin-left: 20px; + } } } @@ -103,7 +110,10 @@ overflow: hidden; &>.el-submenu__title { - padding-left: 10px !important; + padding: 0 !important; + .svg-icon { + margin-left: 20px; + } .el-submenu__icon-arrow { display: none; diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 22689568..98d7b672 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -19,7 +19,7 @@ $menuHover:#263445; $subMenuBg:#1f2d3d; $subMenuHover:#001528; -$sideBarWidth: 180px; +$sideBarWidth: 210px; // the :export directive is the magic sauce for webpack // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index 11ef4c02..27da29b5 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -6,6 +6,7 @@ :background-color="variables.menuBg" :text-color="variables.menuText" :active-text-color="variables.menuActiveText" + :collapse-transition="false" mode="vertical" > <sidebar-item v-for="route in permission_routers" :key="route.path" :item="route" :base-path="route.path"/> From 9574643e927788826082c05db59a2f0ca458f4c3 Mon Sep 17 00:00:00 2001 From: Jesonhu <jesonhu_web@163.com> Date: Tue, 12 Mar 2019 13:23:59 +0800 Subject: [PATCH 065/202] fix[Tree-Table]: fixed update item data bug (#1692) --- src/components/TreeTable/index.vue | 13 +++++++++++++ src/views/tree-table/custom/index.vue | 13 ++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/components/TreeTable/index.vue b/src/components/TreeTable/index.vue index cbe1eb60..9ce7a503 100644 --- a/src/components/TreeTable/index.vue +++ b/src/components/TreeTable/index.vue @@ -146,6 +146,19 @@ export default { this.selcetRecursion(child, select, children) }) } + }, + updateTreeNode(item) { + return new Promise(resolve => { + const { _id, _parent } = item + const index = _id.split('-').slice(-1)[0] // get last index + if (_parent) { + _parent.children.splice(index, 1, item) + resolve(this.data) + } else { + this.data.splice(index, 1, item) + resolve(this.data) + } + }) } } } diff --git a/src/views/tree-table/custom/index.vue b/src/views/tree-table/custom/index.vue index 6f9142a6..11e47912 100644 --- a/src/views/tree-table/custom/index.vue +++ b/src/views/tree-table/custom/index.vue @@ -127,17 +127,8 @@ export default { this.tempItem = Object.assign({}, row) this.dialogFormVisible = true }, - updateItem() { - const data = this.$refs.TreeTable.getData() - const { _id } = this.tempItem - - for (let i = 0; i < data.length; i++) { - if (data[i]._id === _id) { - data.splice(i, 1, Object.assign({}, this.tempItem)) - break - } - } - + async updateItem() { + await this.$refs.TreeTable.updateTreeNode(this.tempItem) this.dialogFormVisible = false }, addMenuItem(row, type) { From cf48ed218bf2ae6a843a11245de33952e4ddc173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A3=A4=E8=A3=86=E4=B8=89=E9=87=8D=E5=A5=8F?= <kimimi_king@163.com> Date: Wed, 13 Mar 2019 15:26:09 +0800 Subject: [PATCH 066/202] fix[Waves-Directive]: fixed v-waves does not support update (#1705) --- src/directive/waves/waves.js | 97 ++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 33 deletions(-) diff --git a/src/directive/waves/waves.js b/src/directive/waves/waves.js index a77f876e..38e07f88 100644 --- a/src/directive/waves/waves.js +++ b/src/directive/waves/waves.js @@ -1,42 +1,73 @@ import './waves.css' -export default{ - bind(el, binding) { - el.addEventListener('click', e => { - const customOpts = Object.assign({}, binding.value) - const opts = Object.assign({ +const context = '@@wavesContext' + +function handleClick(el, binding) { + function handle(e) { + const customOpts = Object.assign({}, binding.value) + const opts = Object.assign( + { ele: el, // 波纹作用元素 type: 'hit', // hit 点击位置扩散 center中心点扩展 color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 - }, customOpts) - const target = opts.ele - if (target) { - target.style.position = 'relative' - target.style.overflow = 'hidden' - const rect = target.getBoundingClientRect() - let ripple = target.querySelector('.waves-ripple') - if (!ripple) { - ripple = document.createElement('span') - ripple.className = 'waves-ripple' - ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' - target.appendChild(ripple) - } else { - ripple.className = 'waves-ripple' - } - switch (opts.type) { - case 'center': - ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px' - ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px' - break - default: - ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || document.body.scrollTop) + 'px' - ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || document.body.scrollLeft) + 'px' - } - ripple.style.backgroundColor = opts.color - ripple.className = 'waves-ripple z-active' - return false + }, + customOpts + ) + const target = opts.ele + if (target) { + target.style.position = 'relative' + target.style.overflow = 'hidden' + const rect = target.getBoundingClientRect() + let ripple = target.querySelector('.waves-ripple') + if (!ripple) { + ripple = document.createElement('span') + ripple.className = 'waves-ripple' + ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' + target.appendChild(ripple) + } else { + ripple.className = 'waves-ripple' } - }, false) + switch (opts.type) { + case 'center': + ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px' + ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px' + break + default: + ripple.style.top = + (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || + document.body.scrollTop) + 'px' + ripple.style.left = + (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || + document.body.scrollLeft) + 'px' + } + ripple.style.backgroundColor = opts.color + ripple.className = 'waves-ripple z-active' + return false + } } + + if (!el[context]) { + el[context] = { + removeHandle: handle + } + } else { + el[context].removeHandle = handle + } + + return handle } +export default { + bind(el, binding) { + el.addEventListener('click', handleClick(el, binding), false) + }, + update(el, binding) { + el.removeEventListener('click', el[context].removeHandle, false) + el.addEventListener('click', handleClick(el, binding), false) + }, + unbind(el) { + el.removeEventListener('click', el[context].removeHandle, false) + el[context] = null + delete el[context] + } +} From f38d5810d91101c1ec38f1270c57302bfdf92a0f Mon Sep 17 00:00:00 2001 From: Yunfei <687418+OtaconBYF@users.noreply.github.com> Date: Thu, 14 Mar 2019 16:12:47 +0800 Subject: [PATCH 067/202] fix[utils]: fixed param2Obj not decoding plus sign (#1712) --- src/utils/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/index.js b/src/utils/index.js index fbcb4602..ebe58ff8 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -136,7 +136,8 @@ export function param2Obj(url) { decodeURIComponent(search) .replace(/"/g, '\\"') .replace(/&/g, '","') - .replace(/=/g, '":"') + + .replace(/=/g, '":"') + .replace(/\+/g, ' ') + '"}' ) } From 17f0d84b35188fdfe0d39a9740a472df8ea58aaf Mon Sep 17 00:00:00 2001 From: yuntao1997 <510835147@qq.com> Date: Fri, 15 Mar 2019 16:00:58 +0800 Subject: [PATCH 068/202] feature[Directive]: add auto-height table directive (#1702) --- src/directive/el-table/adaptive.js | 42 ++++++++++++++++++++++++++++++ src/directive/el-table/index.js | 14 ++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/directive/el-table/adaptive.js create mode 100644 src/directive/el-table/index.js diff --git a/src/directive/el-table/adaptive.js b/src/directive/el-table/adaptive.js new file mode 100644 index 00000000..3fa29c91 --- /dev/null +++ b/src/directive/el-table/adaptive.js @@ -0,0 +1,42 @@ + +import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' + +/** + * How to use + * <el-table height="100px" v-el-height-adaptive-table="{bottomOffset: 30}">...</el-table> + * el-table height is must be set + * bottomOffset: 30(default) // The height of the table from the bottom of the page. + */ + +const doResize = (el, binding, vnode) => { + const { componentInstance: $table } = vnode + + const { value } = binding + + if (!$table.height) { + throw new Error(`el-$table must set the height. Such as height='100px'`) + } + const bottomOffset = (value && value.bottomOffset) || 30 + + if (!$table) return + + const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset + $table.layout.setHeight(height) + $table.doLayout() +} + +export default { + bind(el, binding, vnode) { + el.resizeListener = () => { + doResize(el, binding, vnode) + } + + addResizeListener(el, el.resizeListener) + }, + inserted(el, binding, vnode) { + doResize(el, binding, vnode) + }, + unbind(el) { + removeResizeListener(el, el.resizeListener) + } +} diff --git a/src/directive/el-table/index.js b/src/directive/el-table/index.js new file mode 100644 index 00000000..d4cf406d --- /dev/null +++ b/src/directive/el-table/index.js @@ -0,0 +1,14 @@ + +import adaptive from './adaptive' + +const install = function(Vue) { + Vue.directive('el-height-adaptive-table', adaptive) +} + +if (window.Vue) { + window['el-height-adaptive-table'] = adaptive + Vue.use(install); // eslint-disable-line +} + +adaptive.install = install +export default adaptive From c963f56686b9731a517a17c4d562bc3da0fa3771 Mon Sep 17 00:00:00 2001 From: Serge <gaosj1993@foxmail.com> Date: Fri, 15 Mar 2019 18:08:12 +0800 Subject: [PATCH 069/202] feature[Permission]: add role permission management page (#1605) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加角色权限管理菜单 --- src/api/role.js | 38 +++ src/components/HeaderSearch/index.vue | 24 +- src/lang/en.js | 8 +- src/lang/es.js | 8 +- src/lang/zh.js | 8 +- src/mock/index.js | 8 + src/mock/role.js | 61 ++++ src/permission.js | 45 +-- src/router/index.js | 16 +- src/store/getters.js | 4 +- src/store/modules/permission.js | 28 +- src/views/layout/components/Sidebar/index.vue | 4 +- .../layout/components/TagsView/index.vue | 6 +- src/views/permission/role.vue | 267 ++++++++++++++++++ 14 files changed, 467 insertions(+), 58 deletions(-) create mode 100644 src/api/role.js create mode 100644 src/mock/role.js create mode 100644 src/views/permission/role.vue diff --git a/src/api/role.js b/src/api/role.js new file mode 100644 index 00000000..c81405a8 --- /dev/null +++ b/src/api/role.js @@ -0,0 +1,38 @@ +import request from '@/utils/request' + +export function getRoutes() { + return request({ + url: '/routes', + method: 'get' + }) +} + +export function getRoles() { + return request({ + url: '/roles', + method: 'get' + }) +} + +export function deleteRole(id) { + return request({ + url: `/roles/${id}`, + method: 'delete' + }) +} + +export function addRole(data) { + return request({ + url: '/roles', + method: 'post', + data + }) +} + +export function updateRole(key, data) { + return request({ + url: `/roles/${key}`, + method: 'put', + data + }) +} diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index ab0d556a..678a218c 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -33,8 +33,8 @@ export default { } }, computed: { - routers() { - return this.$store.getters.permission_routers + routes() { + return this.$store.getters.permission_routes }, lang() { return this.$store.getters.language @@ -42,10 +42,10 @@ export default { }, watch: { lang() { - this.searchPool = this.generateRouters(this.routers) + this.searchPool = this.generateRoutes(this.routes) }, - routers() { - this.searchPool = this.generateRouters(this.routers) + routes() { + this.searchPool = this.generateRoutes(this.routes) }, searchPool(list) { this.initFuse(list) @@ -59,7 +59,7 @@ export default { } }, mounted() { - this.searchPool = this.generateRouters(this.routers) + this.searchPool = this.generateRoutes(this.routes) }, methods: { click() { @@ -100,10 +100,10 @@ export default { }, // Filter out the routes that can be displayed in the sidebar // And generate the internationalized title - generateRouters(routers, basePath = '/', prefixTitle = []) { + generateRoutes(routes, basePath = '/', prefixTitle = []) { let res = [] - for (const router of routers) { + for (const router of routes) { // skip hidden router if (router.hidden) { continue } @@ -125,11 +125,11 @@ export default { } } - // recursive child routers + // recursive child routes if (router.children) { - const tempRouters = this.generateRouters(router.children, data.path, data.title) - if (tempRouters.length >= 1) { - res = [...res, ...tempRouters] + const tempRoutes = this.generateRoutes(router.children, data.path, data.title) + if (tempRoutes.length >= 1) { + res = [...res, ...tempRoutes] } } } diff --git a/src/lang/en.js b/src/lang/en.js index 05b34598..caed5c5b 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -6,6 +6,7 @@ export default { guide: 'Guide', permission: 'Permission', pagePermission: 'Page Permission', + rolePermission: 'Role Permission', directivePermission: 'Directive Permission', icons: 'Icons', components: 'Components', @@ -86,9 +87,14 @@ export default { github: 'Github Repository' }, permission: { + addRole: 'New Role', + editPermission: 'Edit Permission', roles: 'Your roles', switchRoles: 'Switch roles', - tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.' + tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.', + delete: 'Delete', + confirm: 'Confirm', + cancel: 'Cancel' }, guide: { description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ', diff --git a/src/lang/es.js b/src/lang/es.js index 8575d382..f0d7de41 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -5,6 +5,7 @@ export default { documentation: 'Documentación', guide: 'Guía', permission: 'Permisos', + rolePermission: 'Permisos de rol', pagePermission: 'Permisos de la página', directivePermission: 'Permisos de la directiva', icons: 'Iconos', @@ -86,9 +87,14 @@ export default { github: 'Repositorio Github' }, permission: { + addRole: 'Nuevo rol', + editPermission: 'Permiso de edición', roles: 'Tus permisos', switchRoles: 'Cambiar permisos', - tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.' + tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.', + delete: 'Borrar', + confirm: 'Confirmar', + cancel: 'Cancelar' }, guide: { description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ', diff --git a/src/lang/zh.js b/src/lang/zh.js index 1fd18355..9bea838e 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -5,6 +5,7 @@ export default { documentation: '文档', guide: '引导页', permission: '权限测试页', + rolePermission: '角色权限', pagePermission: '页面权限', directivePermission: '指令权限', icons: '图标', @@ -86,9 +87,14 @@ export default { github: 'Github 地址' }, permission: { + addRole: '新增角色', + editPermission: '编辑权限', roles: '你的权限', switchRoles: '切换权限', - tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。' + tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。', + delete: '删除', + confirm: '确定', + cancel: '取消' }, guide: { description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于', diff --git a/src/mock/index.js b/src/mock/index.js index 3e00e918..f22c762f 100644 --- a/src/mock/index.js +++ b/src/mock/index.js @@ -3,6 +3,7 @@ import loginAPI from './login' import articleAPI from './article' import remoteSearchAPI from './remoteSearch' import transactionAPI from './transaction' +import roleAPI from './role' // 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题 // https://github.com/nuysoft/Mock/issues/300 @@ -23,6 +24,13 @@ Mock.mock(/\/login\/login/, 'post', loginAPI.loginByUsername) Mock.mock(/\/login\/logout/, 'post', loginAPI.logout) Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo) +// 角色相关 +Mock.mock(/\/routes/, 'get', roleAPI.getRoutes) +Mock.mock(/\/roles/, 'get', roleAPI.getRoles) +Mock.mock(/\/roles$/, 'post', roleAPI.addRole) +Mock.mock(/\/roles\/[A-Za-z0-9]+/, 'put', roleAPI.updateRole) +Mock.mock(/\/roles\/[A-Za-z0-9]+/, 'delete', roleAPI.deleteRole) + // 文章相关 Mock.mock(/\/article\/list/, 'get', articleAPI.getList) Mock.mock(/\/article\/detail/, 'get', articleAPI.getArticle) diff --git a/src/mock/role.js b/src/mock/role.js new file mode 100644 index 00000000..ae4afeb8 --- /dev/null +++ b/src/mock/role.js @@ -0,0 +1,61 @@ +import Mock from 'mockjs' +import { deepClone } from '@/utils' +import { filterAsyncRoutes } from '@/store/modules/permission' +import { asyncRoutes, constantRoutes } from '@/router' + +const routes = deepClone([...constantRoutes, ...asyncRoutes]) + +const roles = [ + { + key: 'admin', + name: 'admin', + description: 'Super Administrator. Have access to view all pages.', + routes: routes + }, + { + key: 'editor', + name: 'editor', + description: 'Normal Editor. Can see all pages except permission page', + routes: filterAsyncRoutes(routes, ['editor']) + }, + { + key: 'visitor', + name: 'visitor', + description: 'Just a visitor. Can only see the home page and the document page', + routes: [{ + path: '', + redirect: 'dashboard', + children: [ + { + path: 'dashboard', + name: 'Dashboard', + meta: { title: 'dashboard', icon: 'dashboard' } + } + ] + }] + } +] + +export default { + getRoutes() { + return routes + }, + getRoles() { + return roles + }, + addRole() { + return Mock.mock('@integer(300, 5000)') + }, + updateRole() { + const res = { + data: 'success' + } + return res + }, + deleteRole() { + const res = { + data: 'success' + } + return res + } +} diff --git a/src/permission.js b/src/permission.js index e556cb00..25b6812f 100644 --- a/src/permission.js +++ b/src/permission.js @@ -2,41 +2,49 @@ import router from './router' import store from './store' import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar -import 'nprogress/nprogress.css'// progress bar style -import { getToken } from '@/utils/auth' // getToken from cookie +import 'nprogress/nprogress.css' // progress bar style +import { getToken } from '@/utils/auth' // get token from cookie -NProgress.configure({ showSpinner: false })// NProgress Configuration +NProgress.configure({ showSpinner: false }) // NProgress Configuration // permission judge function function hasPermission(roles, permissionRoles) { - if (roles.indexOf('admin') >= 0) return true // admin permission passed directly + if (roles.includes('admin')) return true // admin permission passed directly if (!permissionRoles) return true return roles.some(role => permissionRoles.indexOf(role) >= 0) } -const whiteList = ['/login', '/auth-redirect']// no redirect whitelist +const whiteList = ['/login', '/auth-redirect'] // no redirect whitelist router.beforeEach((to, from, next) => { NProgress.start() // start progress bar - if (getToken()) { // determine if there has token + if (getToken()) { + // determine if there has token + /* has token*/ if (to.path === '/login') { next({ path: '/' }) NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it } else { - if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息 - store.dispatch('GetUserInfo').then(res => { // 拉取user_info - const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop'] - store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表 - router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表 - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record + if (store.getters.roles.length === 0) { + // 判断当前用户是否已拉取完user_info信息 + store + .dispatch('GetUserInfo') + .then(res => { + // 拉取user_info + const roles = res.data.roles // note: roles must be a object array! such as: [{id: '1', name: 'editor'}, {id: '2', name: 'developer'}] + store.dispatch('GenerateRoutes', { roles }).then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + router.addRoutes(accessRoutes) // 动态添加可访问路由表 + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record + }) }) - }).catch((err) => { - store.dispatch('FedLogOut').then(() => { - Message.error(err) - next({ path: '/' }) + .catch(err => { + store.dispatch('FedLogOut').then(() => { + Message.error(err) + next({ path: '/' }) + }) }) - }) } else { // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓ if (hasPermission(store.getters.roles, to.meta.roles)) { @@ -49,7 +57,8 @@ router.beforeEach((to, from, next) => { } } else { /* has no token*/ - if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 + if (whiteList.indexOf(to.path) !== -1) { + // 在免登录白名单,直接进入 next() } else { next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页 diff --git a/src/router/index.js b/src/router/index.js index a4a71e46..54305b26 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -33,7 +33,7 @@ import nestedRouter from './modules/nested' affix: true if true, the tag will affix in the tags-view } **/ -export const constantRouterMap = [ +export const constantRoutes = [ { path: '/redirect', component: Layout, @@ -81,7 +81,6 @@ export const constantRouterMap = [ { path: '/documentation', component: Layout, - redirect: '/documentation/index', children: [ { path: 'index', @@ -109,10 +108,10 @@ export const constantRouterMap = [ export default new Router({ // mode: 'history', // require service support scrollBehavior: () => ({ y: 0 }), - routes: constantRouterMap + routes: constantRoutes }) -export const asyncRouterMap = [ +export const asyncRoutes = [ { path: '/permission', component: Layout, @@ -141,6 +140,15 @@ export const asyncRouterMap = [ title: 'directivePermission' // if do not set roles, means: this page does not require permission } + }, + { + path: 'role', + component: () => import('@/views/permission/role'), + name: 'RolePermission', + meta: { + title: 'rolePermission', + roles: ['admin'] + } } ] }, diff --git a/src/store/getters.js b/src/store/getters.js index cf314f5c..797573f7 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -12,8 +12,8 @@ const getters = { status: state => state.user.status, roles: state => state.user.roles, setting: state => state.user.setting, - permission_routers: state => state.permission.routers, - addRouters: state => state.permission.addRouters, + permission_routes: state => state.permission.routes, + addRoutes: state => state.permission.addRoutes, errorLogs: state => state.errorLog.logs } export default getters diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 13f60efb..fba03bc3 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -1,4 +1,4 @@ -import { asyncRouterMap, constantRouterMap } from '@/router' +import { asyncRoutes, constantRoutes } from '@/router' /** * 通过meta.role判断是否与当前用户权限匹配 @@ -15,17 +15,17 @@ function hasPermission(roles, route) { /** * 递归过滤异步路由表,返回符合用户角色权限的路由表 - * @param routes asyncRouterMap + * @param routes asyncRoutes * @param roles */ -function filterAsyncRouter(routes, roles) { +export function filterAsyncRoutes(routes, roles) { const res = [] routes.forEach(route => { const tmp = { ...route } if (hasPermission(roles, tmp)) { if (tmp.children) { - tmp.children = filterAsyncRouter(tmp.children, roles) + tmp.children = filterAsyncRoutes(tmp.children, roles) } res.push(tmp) } @@ -36,27 +36,27 @@ function filterAsyncRouter(routes, roles) { const permission = { state: { - routers: [], - addRouters: [] + routes: [], + addRoutes: [] }, mutations: { - SET_ROUTERS: (state, routers) => { - state.addRouters = routers - state.routers = constantRouterMap.concat(routers) + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) } }, actions: { GenerateRoutes({ commit }, data) { return new Promise(resolve => { const { roles } = data - let accessedRouters + let accessedRoutes if (roles.includes('admin')) { - accessedRouters = asyncRouterMap + accessedRoutes = asyncRoutes } else { - accessedRouters = filterAsyncRouter(asyncRouterMap, roles) + accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) } - commit('SET_ROUTERS', accessedRouters) - resolve() + commit('SET_ROUTES', accessedRoutes) + resolve(accessedRoutes) }) } } diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index 27da29b5..5a81e84f 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -9,7 +9,7 @@ :collapse-transition="false" mode="vertical" > - <sidebar-item v-for="route in permission_routers" :key="route.path" :item="route" :base-path="route.path"/> + <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path"/> </el-menu> </el-scrollbar> </template> @@ -23,7 +23,7 @@ export default { components: { SidebarItem }, computed: { ...mapGetters([ - 'permission_routers', + 'permission_routes', 'sidebar' ]), variables() { diff --git a/src/views/layout/components/TagsView/index.vue b/src/views/layout/components/TagsView/index.vue index 53d592bc..72e127f2 100644 --- a/src/views/layout/components/TagsView/index.vue +++ b/src/views/layout/components/TagsView/index.vue @@ -45,8 +45,8 @@ export default { visitedViews() { return this.$store.state.tagsView.visitedViews }, - routers() { - return this.$store.state.permission.routers + routes() { + return this.$store.state.permission.routes } }, watch: { @@ -93,7 +93,7 @@ export default { return tags }, initTags() { - const affixTags = this.affixTags = this.filterAffixTags(this.routers) + const affixTags = this.affixTags = this.filterAffixTags(this.routes) for (const tag of affixTags) { // Must have tag name if (tag.name) { diff --git a/src/views/permission/role.vue b/src/views/permission/role.vue new file mode 100644 index 00000000..df7befa6 --- /dev/null +++ b/src/views/permission/role.vue @@ -0,0 +1,267 @@ +<template> + <div class="app-container"> + <el-button type="primary" @click="handleAddRole">{{ $t('permission.addRole') }}</el-button> + + <el-table :data="rolesList" style="width: 100%;margin-top:30px;" border> + <el-table-column align="center" label="Role Key" width="220"> + <template slot-scope="scope">{{ scope.row.key }}</template> + </el-table-column> + <el-table-column align="center" label="Role Name" width="220"> + <template slot-scope="scope">{{ scope.row.name }}</template> + </el-table-column> + <el-table-column align="header-center" label="Description"> + <template slot-scope="scope">{{ scope.row.description }}</template> + </el-table-column> + <el-table-column align="center" label="Operations"> + <template slot-scope="scope"> + <el-button type="primary" size="small" @click="handleEdit(scope)">{{ $t('permission.editPermission') }}</el-button> + <el-button type="danger" size="small" @click="handleDelete(scope)">{{ $t('permission.delete') }}</el-button> + </template> + </el-table-column> + </el-table> + + <el-dialog :visible.sync="dialogVisible" :title="dialogType==='edit'?'Edit Role':'New Role'"> + <el-form :model="role" label-width="80px" label-position="left" > + <el-form-item label="Name"> + <el-input v-model="role.name" placeholder="Role Name"/> + </el-form-item> + <el-form-item label="Desc"> + <el-input + v-model="role.description" + :autosize="{ minRows: 2, maxRows: 4}" + type="textarea" + placeholder="Role Description"/> + </el-form-item> + <el-form-item label="Menus"> + <el-tree ref="tree" :check-strictly="checkStrictly" :data="routesData" :props="defaultProps" show-checkbox node-key="path" class="permission-tree"/> + </el-form-item> + </el-form> + <div style="text-align:right;"> + <el-button type="danger" @click="dialogVisible=false">{{ $t('permission.cancel') }}</el-button> + <el-button type="primary" @click="confirmRole">{{ $t('permission.confirm') }}</el-button> + </div> + </el-dialog> + </div> + +</template> + +<script> +import path from 'path' +import { deepClone } from '@/utils' +import { getRoutes, getRoles, addRole, deleteRole, updateRole } from '@/api/role' +import i18n from '@/lang' + +const defaultRole = { + key: '', + name: '', + description: '', + routes: [] +} + +export default { + data() { + return { + role: Object.assign({}, defaultRole), + routes: [], + rolesList: [], + dialogVisible: false, + dialogType: 'new', + checkStrictly: false, + defaultProps: { + children: 'children', + label: 'title' + } + } + }, + computed: { + routesData() { + return this.routes + } + }, + created() { + // Mock: get all routes and roles list from server + this.getRoutes() + this.getRoles() + }, + methods: { + async getRoutes() { + const res = await getRoutes() + this.serviceRoutes = res.data + const routes = this.generateRoutes(res.data) + this.routes = this.i18n(routes) + }, + async getRoles() { + const res = await getRoles() + this.rolesList = res.data + }, + i18n(routes) { + const app = routes.map(route => { + route.title = i18n.t(`route.${route.title}`) + if (route.children) { + route.children = this.i18n(route.children) + } + return route + }) + return app + }, + // Reshape the routes structure so that it looks the same as the sidebar + generateRoutes(routes, basePath = '/') { + const res = [] + + for (let route of routes) { + // skip some route + if (route.hidden) { continue } + + const onlyOneShowingChild = this.onlyOneShowingChild(route.children, route) + + if (route.children && onlyOneShowingChild && !route.alwaysShow) { + route = onlyOneShowingChild + } + + const data = { + path: path.resolve(basePath, route.path), + title: route.meta && route.meta.title + + } + + // recursive child routes + if (route.children) { + data.children = this.generateRoutes(route.children, data.path) + } + res.push(data) + } + return res + }, + generateArr(routes) { + let data = [] + routes.forEach(route => { + data.push(route) + if (route.children) { + const temp = this.generateArr(route.children) + if (temp.length > 0) { + data = [...data, ...temp] + } + } + }) + return data + }, + handleAddRole() { + this.role = Object.assign({}, defaultRole) + if (this.$refs.tree) { + this.$refs.tree.setCheckedNodes([]) + } + this.dialogType = 'new' + this.dialogVisible = true + }, + handleEdit(scope) { + this.dialogType = 'edit' + this.dialogVisible = true + this.checkStrictly = true + this.role = deepClone(scope.row) + this.$nextTick(() => { + const routes = this.generateRoutes(this.role.routes) + this.$refs.tree.setCheckedNodes(this.generateArr(routes)) + // set checked state of a node not affects its father and child nodes + this.checkStrictly = false + }) + }, + handleDelete({ $index, row }) { + this.$confirm('Confirm to remove the role?', 'Warning', { + confirmButtonText: 'Confirm', + cancelButtonText: 'Cancel', + type: 'warning' + }) + .then(async() => { + await deleteRole(row.id) + this.rolesList.splice($index, 1) + this.$message({ + type: 'success', + message: 'Delete succed!' + }) + }) + .catch(err => { console.error(err) }) + }, + generateTree(routes, basePath = '/', checkedKeys) { + const res = [] + + for (const route of routes) { + const routePath = path.resolve(basePath, route.path) + + // recursive child routes + if (route.children) { + route.children = this.generateTree(route.children, routePath, checkedKeys) + } + + if (checkedKeys.includes(routePath) || (route.children && route.children.length >= 1)) { + res.push(route) + } + } + return res + }, + async confirmRole() { + const isEdit = this.dialogType === 'edit' + + const checkedKeys = this.$refs.tree.getCheckedKeys() + this.role.routes = this.generateTree(deepClone(this.serviceRoutes), '/', checkedKeys) + + if (isEdit) { + await updateRole(this.role.key, this.role) + for (let index = 0; index < this.rolesList.length; index++) { + if (this.rolesList[index].key === this.role.key) { + this.rolesList.splice(index, 1, Object.assign({}, this.role)) + break + } + } + } else { + const { data } = await addRole(this.role) + this.role.key = data + this.rolesList.push(this.role) + } + + const { description, key, name } = this.role + this.dialogVisible = false + this.$notify({ + title: 'Success', + dangerouslyUseHTMLString: true, + message: ` + <div>Role Key: ${key}</div> + <div>Role Nmae: ${name}</div> + <div>Description: ${description}</div> + `, + type: 'success' + }) + }, + // reference: src/view/layout/components/Sidebar/SidebarItem.vue + onlyOneShowingChild(children = [], parent) { + let onlyOneChild = null + const showingChildren = children.filter(item => !item.hidden) + + // When there is only one child route, the child route is displayed by default + if (showingChildren.length === 1) { + onlyOneChild = showingChildren[0] + onlyOneChild.path = path.resolve(parent.path, onlyOneChild.path) + return onlyOneChild + } + + // Show parent if there are no child route to display + if (showingChildren.length === 0) { + onlyOneChild = { ... parent, path: '', noShowingChildren: true } + return onlyOneChild + } + + return false + } + } +} +</script> + +<style lang="scss" scoped> +.app-container { + .roles-table { + margin-top: 30px; + } + .permission-tree { + margin-bottom: 30px; + } +} +</style> From 763b31d915be67aecc8f24283d4898ccded8b55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=96=B0?= <lcf33123@gmail.com> Date: Sun, 17 Mar 2019 16:36:09 +0800 Subject: [PATCH 070/202] feature[Excel]: support export merged header export (#1718) --- src/vendor/Export2Excel.js | 14 +++++++++++++ src/views/excel/exportExcel.vue | 36 +++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/vendor/Export2Excel.js b/src/vendor/Export2Excel.js index ba956dc1..3fda4465 100644 --- a/src/vendor/Export2Excel.js +++ b/src/vendor/Export2Excel.js @@ -145,9 +145,11 @@ export function export_table_to_excel(id) { } export function export_json_to_excel({ + multiHeader, header, data, filename, + merges, autoWidth = true, bookType= 'xlsx' } = {}) { @@ -155,10 +157,22 @@ export function export_json_to_excel({ filename = filename || 'excel-list' data = [...data] data.unshift(header); + + for (let header of multiHeader) { + data.unshift(header) + } + var ws_name = "SheetJS"; var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + if (merges.length > 0) { + if (!ws['!merges']) ws['!merges'] = []; + merges.forEach(item => { + ws['!merges'].push(XLSX.utils.decode_range(item)) + }) + } + if (autoWidth) { /*设置worksheet每列的最大宽度*/ const colWidth = data.map(row => row.map(val => { diff --git a/src/views/excel/exportExcel.vue b/src/views/excel/exportExcel.vue index 551b89f8..1702d978 100644 --- a/src/views/excel/exportExcel.vue +++ b/src/views/excel/exportExcel.vue @@ -18,20 +18,22 @@ {{ scope.$index }} </template> </el-table-column> - <el-table-column label="Title"> - <template slot-scope="scope"> - {{ scope.row.title }} - </template> - </el-table-column> - <el-table-column label="Author" width="110" align="center"> - <template slot-scope="scope"> - <el-tag>{{ scope.row.author }}</el-tag> - </template> - </el-table-column> - <el-table-column label="Readings" width="115" align="center"> - <template slot-scope="scope"> - {{ scope.row.pageviews }} - </template> + <el-table-column label="主要信息" align="center"> + <el-table-column label="Title"> + <template slot-scope="scope"> + {{ scope.row.title }} + </template> + </el-table-column> + <el-table-column label="Author" width="110" align="center"> + <template slot-scope="scope"> + <el-tag>{{ scope.row.author }}</el-tag> + </template> + </el-table-column> + <el-table-column label="Readings" width="115" align="center"> + <template slot-scope="scope"> + {{ scope.row.pageviews }} + </template> + </el-table-column> </el-table-column> <el-table-column align="center" label="Date" width="220"> <template slot-scope="scope"> @@ -79,13 +81,17 @@ export default { handleDownload() { this.downloadLoading = true import('@/vendor/Export2Excel').then(excel => { - const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date'] + const multiHeader = [['Id', '主要信息', '', '', 'Date']] + const tHeader = ['', 'Title', 'Author', 'Readings', ''] const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time'] const list = this.list const data = this.formatJson(filterVal, list) + const merges = ['A1:A2', 'B1:D1', 'E1:E2'] excel.export_json_to_excel({ + multiHeader, header: tHeader, data, + merges, filename: this.filename, autoWidth: this.autoWidth, bookType: this.bookType From 8d242a002f5b72e9cf7b20dea21e3ab0abfb81e6 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 17 Mar 2019 16:52:11 +0800 Subject: [PATCH 071/202] feature[Excel]: add export merge header excel demo --- src/lang/en.js | 1 + src/lang/es.js | 1 + src/lang/zh.js | 7 ++- src/router/index.js | 6 ++ src/views/excel/exportExcel.vue | 39 +++++------- src/views/excel/mergeHeader.vue | 101 ++++++++++++++++++++++++++++++++ 6 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 src/views/excel/mergeHeader.vue diff --git a/src/lang/en.js b/src/lang/en.js index caed5c5b..963c60d3 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -57,6 +57,7 @@ export default { excel: 'Excel', exportExcel: 'Export Excel', selectExcel: 'Export Selected', + mergeHeader: 'Merge Header', uploadExcel: 'Upload Excel', zip: 'Zip', pdf: 'PDF', diff --git a/src/lang/es.js b/src/lang/es.js index f0d7de41..31fa8303 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -57,6 +57,7 @@ export default { excel: 'Excel', exportExcel: 'Exportar a Excel', selectExcel: 'Export seleccionado', + mergeHeader: 'Merge Header', uploadExcel: 'Subir Excel', zip: 'Zip', pdf: 'PDF', diff --git a/src/lang/zh.js b/src/lang/zh.js index 9bea838e..574cba11 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -55,9 +55,10 @@ export default { page404: '404', errorLog: '错误日志', excel: 'Excel', - exportExcel: 'Export Excel', - selectExcel: 'Export Selected', - uploadExcel: 'Upload Excel', + exportExcel: '导出 Excel', + selectExcel: '导出 已选择项', + mergeHeader: '导出 多级表头', + uploadExcel: '上传 Excel', zip: 'Zip', pdf: 'PDF', exportZip: 'Export Zip', diff --git a/src/router/index.js b/src/router/index.js index 54305b26..bc1d2a64 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -279,6 +279,12 @@ export const asyncRoutes = [ name: 'SelectExcel', meta: { title: 'selectExcel' } }, + { + path: 'export-merge-header', + component: () => import('@/views/excel/mergeHeader'), + name: 'MergeHeader', + meta: { title: 'mergeHeader' } + }, { path: 'upload-excel', component: () => import('@/views/excel/uploadExcel'), diff --git a/src/views/excel/exportExcel.vue b/src/views/excel/exportExcel.vue index 1702d978..914ccb7b 100644 --- a/src/views/excel/exportExcel.vue +++ b/src/views/excel/exportExcel.vue @@ -18,22 +18,20 @@ {{ scope.$index }} </template> </el-table-column> - <el-table-column label="主要信息" align="center"> - <el-table-column label="Title"> - <template slot-scope="scope"> - {{ scope.row.title }} - </template> - </el-table-column> - <el-table-column label="Author" width="110" align="center"> - <template slot-scope="scope"> - <el-tag>{{ scope.row.author }}</el-tag> - </template> - </el-table-column> - <el-table-column label="Readings" width="115" align="center"> - <template slot-scope="scope"> - {{ scope.row.pageviews }} - </template> - </el-table-column> + <el-table-column label="Title"> + <template slot-scope="scope"> + {{ scope.row.title }} + </template> + </el-table-column> + <el-table-column label="Author" width="110" align="center"> + <template slot-scope="scope"> + <el-tag>{{ scope.row.author }}</el-tag> + </template> + </el-table-column> + <el-table-column label="Readings" width="115" align="center"> + <template slot-scope="scope"> + {{ scope.row.pageviews }} + </template> </el-table-column> <el-table-column align="center" label="Date" width="220"> <template slot-scope="scope"> @@ -48,12 +46,10 @@ <script> import { fetchList } from '@/api/article' import { parseTime } from '@/utils' - // options components import FilenameOption from './components/FilenameOption' import AutoWidthOption from './components/AutoWidthOption' import BookTypeOption from './components/BookTypeOption' - export default { name: 'ExportExcel', components: { FilenameOption, AutoWidthOption, BookTypeOption }, @@ -81,17 +77,13 @@ export default { handleDownload() { this.downloadLoading = true import('@/vendor/Export2Excel').then(excel => { - const multiHeader = [['Id', '主要信息', '', '', 'Date']] - const tHeader = ['', 'Title', 'Author', 'Readings', ''] + const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date'] const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time'] const list = this.list const data = this.formatJson(filterVal, list) - const merges = ['A1:A2', 'B1:D1', 'E1:E2'] excel.export_json_to_excel({ - multiHeader, header: tHeader, data, - merges, filename: this.filename, autoWidth: this.autoWidth, bookType: this.bookType @@ -120,4 +112,3 @@ export default { padding: 0 12px 0 30px; } </style> - diff --git a/src/views/excel/mergeHeader.vue b/src/views/excel/mergeHeader.vue new file mode 100644 index 00000000..81d12a89 --- /dev/null +++ b/src/views/excel/mergeHeader.vue @@ -0,0 +1,101 @@ +<template> + <div class="app-container"> + + <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload">Export</el-button> + + <el-table + v-loading="listLoading" + ref="multipleTable" + :data="list" + element-loading-text="Loading" + border + fit + highlight-current-row + > + <el-table-column align="center" label="Id" width="95"> + <template slot-scope="scope"> + {{ scope.$index }} + </template> + </el-table-column> + <el-table-column label="Main Information" align="center"> + <el-table-column label="Title"> + <template slot-scope="scope"> + {{ scope.row.title }} + </template> + </el-table-column> + <el-table-column label="Author" width="110" align="center"> + <template slot-scope="scope"> + <el-tag>{{ scope.row.author }}</el-tag> + </template> + </el-table-column> + <el-table-column label="Readings" width="115" align="center"> + <template slot-scope="scope"> + {{ scope.row.pageviews }} + </template> + </el-table-column> + </el-table-column> + <el-table-column align="center" label="Date" width="220"> + <template slot-scope="scope"> + <i class="el-icon-time"/> + <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span> + </template> + </el-table-column> + </el-table> + + </div> +</template> + +<script> +import { fetchList } from '@/api/article' +import { parseTime } from '@/utils' + +export default { + name: 'MergeHeader', + data() { + return { + list: null, + listLoading: true, + downloadLoading: false + } + }, + created() { + this.fetchData() + }, + methods: { + fetchData() { + this.listLoading = true + fetchList(this.listQuery).then(response => { + this.list = response.data.items + this.listLoading = false + }) + }, + handleDownload() { + this.downloadLoading = true + import('@/vendor/Export2Excel').then(excel => { + const multiHeader = [['Id', 'Main Information', '', '', 'Date']] + const header = ['', 'Title', 'Author', 'Readings', ''] + const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time'] + const list = this.list + const data = this.formatJson(filterVal, list) + const merges = ['A1:A2', 'B1:D1', 'E1:E2'] + excel.export_json_to_excel({ + multiHeader, + header, + merges, + data + }) + this.downloadLoading = false + }) + }, + formatJson(filterVal, jsonData) { + return jsonData.map(v => filterVal.map(j => { + if (j === 'timestamp') { + return parseTime(v[j]) + } else { + return v[j] + } + })) + } + } +} +</script> From b8d47bd8477657c485e9f14617196823012be27e Mon Sep 17 00:00:00 2001 From: Jere <tsuijy@gmail.com> Date: Sun, 17 Mar 2019 17:40:51 +0800 Subject: [PATCH 072/202] chore: update eslint && lint code --- .eslintrc.js | 2 + package.json | 6 +- src/App.vue | 4 +- src/components/BackToTop/index.vue | 2 +- src/components/Breadcrumb/index.vue | 5 +- src/components/Charts/keyboard.vue | 2 +- src/components/Charts/lineMarker.vue | 2 +- src/components/Charts/mixChart.vue | 2 +- src/components/DndList/index.vue | 2 +- src/components/DragSelect/index.vue | 2 +- src/components/Dropzone/index.vue | 2 +- src/components/GithubCorner/index.vue | 11 +- src/components/HeaderSearch/index.vue | 5 +- src/components/ImageCropper/index.vue | 29 +-- src/components/JsonEditor/index.vue | 2 +- src/components/Kanban/index.vue | 3 +- src/components/LangSelect/index.vue | 12 +- src/components/MDinput/index.vue | 36 +-- src/components/MarkdownEditor/index.vue | 2 +- src/components/Pagination/index.vue | 3 +- src/components/PanThumb/index.vue | 2 +- src/components/SizeSelect/index.vue | 5 +- src/components/SvgIcon/index.vue | 2 +- src/components/TextHoverEffect/Mallki.vue | 4 +- src/components/ThemePicker/index.vue | 3 +- .../Tinymce/components/editorImage.vue | 6 +- src/components/Tinymce/index.vue | 4 +- src/components/TreeTable/index.vue | 19 +- src/components/TreeTable/readme.md | 220 ++++++++++++++++++ src/components/Upload/singleImage.vue | 7 +- src/components/Upload/singleImage2.vue | 7 +- src/components/Upload/singleImage3.vue | 9 +- src/directive/el-dragDialog/drag.js | 2 +- src/directive/permission/permission.js | 2 +- src/views/charts/keyboard.vue | 2 +- src/views/charts/line.vue | 2 +- src/views/charts/mixChart.vue | 2 +- src/views/clipboard/index.vue | 4 +- src/views/components-demo/avatarUpload.vue | 10 +- src/views/components-demo/backToTop.vue | 2 +- src/views/components-demo/countTo.vue | 25 +- src/views/components-demo/dndList.vue | 2 +- src/views/components-demo/dragDialog.vue | 8 +- src/views/components-demo/dragKanban.vue | 6 +- src/views/components-demo/dragSelect.vue | 2 +- src/views/components-demo/dropzone.vue | 2 +- src/views/components-demo/jsonEditor.vue | 2 +- src/views/components-demo/markdown.vue | 11 +- src/views/components-demo/mixin.vue | 5 +- src/views/components-demo/splitpane.vue | 6 +- src/views/components-demo/sticky.vue | 11 +- src/views/components-demo/tinymce.vue | 5 +- .../dashboard/admin/components/BarChart.vue | 2 +- .../dashboard/admin/components/BoxCard.vue | 12 +- .../dashboard/admin/components/LineChart.vue | 2 +- .../dashboard/admin/components/PanelGroup.vue | 8 +- .../dashboard/admin/components/PieChart.vue | 2 +- .../admin/components/RaddarChart.vue | 2 +- .../admin/components/TodoList/Todo.vue | 12 +- .../admin/components/TodoList/index.vue | 5 +- .../admin/components/TransactionTable.vue | 4 +- src/views/dashboard/admin/index.vue | 18 +- src/views/dashboard/editor/index.vue | 5 +- src/views/dashboard/index.vue | 2 +- src/views/documentation/index.vue | 2 +- src/views/errorLog/errorTestB.vue | 2 +- src/views/errorLog/index.vue | 4 +- src/views/errorPage/404.vue | 3 +- .../example/components/ArticleDetail.vue | 14 +- .../example/components/Dropdown/Comment.vue | 13 +- .../example/components/Dropdown/Platform.vue | 4 +- .../example/components/Dropdown/SourceUrl.vue | 6 +- src/views/example/components/Warning.vue | 3 +- src/views/example/create.vue | 2 +- src/views/example/edit.vue | 2 +- src/views/example/list.vue | 2 +- src/views/excel/components/BookTypeOption.vue | 5 +- src/views/excel/components/FilenameOption.vue | 2 +- src/views/excel/exportExcel.vue | 2 +- src/views/excel/mergeHeader.vue | 4 +- src/views/excel/selectExcel.vue | 11 +- src/views/excel/uploadExcel.vue | 4 +- src/views/i18n-demo/index.vue | 11 +- src/views/layout/Layout.vue | 10 +- src/views/layout/components/AppMain.vue | 2 +- src/views/layout/components/Navbar.vue | 16 +- src/views/layout/components/Sidebar/Link.vue | 2 +- .../layout/components/Sidebar/SidebarItem.vue | 5 +- src/views/layout/components/Sidebar/index.vue | 2 +- .../layout/components/TagsView/ScrollPane.vue | 2 +- .../layout/components/TagsView/index.vue | 10 +- src/views/login/socialsignin.vue | 4 +- src/views/nested/menu1/index.vue | 2 +- src/views/nested/menu1/menu1-1/index.vue | 2 +- src/views/pdf/download.vue | 3 +- .../permission/components/SwitchRoles.vue | 4 +- src/views/permission/directive.vue | 2 +- src/views/permission/page.vue | 2 +- src/views/permission/role.vue | 9 +- src/views/qiniu/upload.vue | 4 +- src/views/tab/components/tabPane.vue | 9 +- src/views/tab/index.vue | 6 +- src/views/table/complexTable.vue | 40 ++-- src/views/table/dragTable.vue | 6 +- src/views/table/dynamicTable/fixedThead.vue | 4 +- src/views/table/dynamicTable/index.vue | 4 +- src/views/table/dynamicTable/unfixedThead.vue | 2 +- src/views/table/inlineEditTable.vue | 4 +- src/views/theme/index.vue | 14 +- src/views/tree-table/custom/index.vue | 11 +- src/views/tree-table/index.vue | 3 +- src/views/zip/index.vue | 4 +- 112 files changed, 592 insertions(+), 299 deletions(-) create mode 100644 src/components/TreeTable/readme.md diff --git a/.eslintrc.js b/.eslintrc.js index 6f55c5a1..1266f38d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,6 +21,8 @@ module.exports = { "allowFirstLine": false } }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", "vue/name-property-casing": ["error", "PascalCase"], 'accessor-pairs': 2, 'arrow-spacing': [2, { diff --git a/package.json b/package.json index aef30525..d2748c5a 100644 --- a/package.json +++ b/package.json @@ -80,10 +80,10 @@ "copy-webpack-plugin": "4.5.2", "cross-env": "5.2.0", "css-loader": "1.0.0", - "eslint": "4.19.1", + "eslint": "5.15.2", "eslint-friendly-formatter": "4.0.1", - "eslint-loader": "2.0.0", - "eslint-plugin-vue": "4.7.1", + "eslint-loader": "2.1.2", + "eslint-plugin-vue": "5.2.2", "file-loader": "1.1.11", "friendly-errors-webpack-plugin": "1.7.0", "hash-sum": "1.0.2", diff --git a/src/App.vue b/src/App.vue index ab408f3e..ec9032c1 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,11 +1,11 @@ <template> <div id="app"> - <router-view/> + <router-view /> </div> </template> <script> -export default{ +export default { name: 'App' } </script> diff --git a/src/components/BackToTop/index.vue b/src/components/BackToTop/index.vue index 39977178..0c1ff792 100644 --- a/src/components/BackToTop/index.vue +++ b/src/components/BackToTop/index.vue @@ -4,7 +4,7 @@ <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height: 16px; width: 16px;"> <title>回到顶部</title> <g> - <path d="M12.036 15.59c0 .55-.453.995-.997.995H5.032c-.55 0-.997-.445-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29c.39-.39 1.026-.385 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" fill-rule="evenodd"/> + <path d="M12.036 15.59c0 .55-.453.995-.997.995H5.032c-.55 0-.997-.445-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29c.39-.39 1.026-.385 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" fill-rule="evenodd" /> </g> </svg> </div> diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 5f4d054f..9e78b1ec 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -2,8 +2,9 @@ <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> - <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ - generateTitle(item.meta.title) }}</span> + <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect"> + {{ generateTitle(item.meta.title) }} + </span> <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> </el-breadcrumb-item> </transition-group> diff --git a/src/components/Charts/keyboard.vue b/src/components/Charts/keyboard.vue index 857b26ae..3f061bd0 100644 --- a/src/components/Charts/keyboard.vue +++ b/src/components/Charts/keyboard.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :id="id" :style="{height:height,width:width}"/> + <div :id="id" :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/components/Charts/lineMarker.vue b/src/components/Charts/lineMarker.vue index 5d41b022..3dd74369 100644 --- a/src/components/Charts/lineMarker.vue +++ b/src/components/Charts/lineMarker.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :id="id" :style="{height:height,width:width}"/> + <div :id="id" :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/components/Charts/mixChart.vue b/src/components/Charts/mixChart.vue index a8e271ca..c416542e 100644 --- a/src/components/Charts/mixChart.vue +++ b/src/components/Charts/mixChart.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :id="id" :style="{height:height,width:width}"/> + <div :id="id" :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/components/DndList/index.vue b/src/components/DndList/index.vue index 7587daa7..0da113eb 100644 --- a/src/components/DndList/index.vue +++ b/src/components/DndList/index.vue @@ -7,7 +7,7 @@ <div class="list-complete-item-handle">{{ element.id }}[{{ element.author }}] {{ element.title }}</div> <div style="position:absolute;right:0px;"> <span style="float: right ;margin-top: -20px;margin-right:5px;" @click="deleteEle(element)"> - <i style="color:#ff4949" class="el-icon-delete"/> + <i style="color:#ff4949" class="el-icon-delete" /> </span> </div> </div> diff --git a/src/components/DragSelect/index.vue b/src/components/DragSelect/index.vue index 513be006..4a2e6300 100644 --- a/src/components/DragSelect/index.vue +++ b/src/components/DragSelect/index.vue @@ -1,6 +1,6 @@ <template> <el-select ref="dragSelect" v-model="selectVal" v-bind="$attrs" class="drag-select" multiple v-on="$listeners"> - <slot/> + <slot /> </el-select> </template> diff --git a/src/components/Dropzone/index.vue b/src/components/Dropzone/index.vue index 15d811d9..081f0067 100644 --- a/src/components/Dropzone/index.vue +++ b/src/components/Dropzone/index.vue @@ -1,5 +1,5 @@ <template> - <div :ref="id" :action="url" :id="id" class="dropzone"> + <div :id="id" :ref="id" :action="url" class="dropzone"> <input type="file" name="file"> </div> </template> diff --git a/src/components/GithubCorner/index.vue b/src/components/GithubCorner/index.vue index b5da8874..970faaf1 100644 --- a/src/components/GithubCorner/index.vue +++ b/src/components/GithubCorner/index.vue @@ -5,17 +5,20 @@ height="80" viewBox="0 0 250 250" style="fill:#40c9c6; color:#fff;" - aria-hidden="true"> - <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"/> + aria-hidden="true" + > + <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" /> <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" - class="octo-arm"/> + class="octo-arm" + /> <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" - class="octo-body"/> + class="octo-body" + /> </svg> </a> </template> diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 678a218c..2227a93e 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -10,8 +10,9 @@ remote placeholder="Search" class="header-search-select" - @change="change"> - <el-option v-for="item in options" :key="item.path" :value="item" :label="item.title.join(' > ')"/> + @change="change" + > + <el-option v-for="item in options" :key="item.path" :value="item" :label="item.title.join(' > ')" /> </el-select> </div> </template> diff --git a/src/components/ImageCropper/index.vue b/src/components/ImageCropper/index.vue index 04b1ede9..c30c5b18 100644 --- a/src/components/ImageCropper/index.vue +++ b/src/components/ImageCropper/index.vue @@ -2,22 +2,22 @@ <div v-show="value" class="vue-image-crop-upload"> <div class="vicp-wrap"> <div class="vicp-close" @click="off"> - <i class="vicp-icon4"/> + <i class="vicp-icon4" /> </div> <div v-show="step == 1" class="vicp-step1"> <div class="vicp-drop-area" @dragleave="preventDefault" @dragover="preventDefault" @dragenter="preventDefault" @click="handleClick" @drop="handleChange"> <i v-show="loading != 1" class="vicp-icon1"> - <i class="vicp-icon1-arrow"/> - <i class="vicp-icon1-body"/> - <i class="vicp-icon1-bottom"/> + <i class="vicp-icon1-arrow" /> + <i class="vicp-icon1-body" /> + <i class="vicp-icon1-bottom" /> </i> <span v-show="loading !== 1" class="vicp-hint">{{ lang.hint }}</span> <span v-show="!isSupported" class="vicp-no-supported-hint">{{ lang.noSupported }}</span> <input v-show="false" v-if="step == 1" ref="fileinput" type="file" @change="handleChange"> </div> <div v-show="hasError" class="vicp-error"> - <i class="vicp-icon2"/> {{ errorMsg }} + <i class="vicp-icon2" /> {{ errorMsg }} </div> <div class="vicp-operate"> <a @click="off" @mousedown="ripple">{{ lang.btn.off }}</a> @@ -48,15 +48,16 @@ @mousedown="imgStartMove" @mousemove="imgMove" @mouseup="createImg" - @mouseout="createImg"> - <div :style="sourceImgShadeStyle" class="vicp-img-shade vicp-img-shade-1"/> - <div :style="sourceImgShadeStyle" class="vicp-img-shade vicp-img-shade-2"/> + @mouseout="createImg" + > + <div :style="sourceImgShadeStyle" class="vicp-img-shade vicp-img-shade-1" /> + <div :style="sourceImgShadeStyle" class="vicp-img-shade vicp-img-shade-2" /> </div> <div class="vicp-range"> <input :value="scale.range" type="range" step="1" min="0" max="100" @input="zoomChange"> - <i class="vicp-icon5" @mousedown="startZoomSub" @mouseout="endZoomSub" @mouseup="endZoomSub"/> - <i class="vicp-icon6" @mousedown="startZoomAdd" @mouseout="endZoomAdd" @mouseup="endZoomAdd"/> + <i class="vicp-icon5" @mousedown="startZoomSub" @mouseout="endZoomSub" @mouseup="endZoomSub" /> + <i class="vicp-icon6" @mousedown="startZoomAdd" @mouseout="endZoomAdd" @mouseup="endZoomAdd" /> </div> <div v-if="!noRotate" class="vicp-rotate"> @@ -87,13 +88,13 @@ <div class="vicp-upload"> <span v-show="loading === 1" class="vicp-loading">{{ lang.loading }}</span> <div class="vicp-progress-wrap"> - <span v-show="loading === 1" :style="progressStyle" class="vicp-progress"/> + <span v-show="loading === 1" :style="progressStyle" class="vicp-progress" /> </div> <div v-show="hasError" class="vicp-error"> - <i class="vicp-icon2"/> {{ errorMsg }} + <i class="vicp-icon2" /> {{ errorMsg }} </div> <div v-show="loading === 2" class="vicp-success"> - <i class="vicp-icon3"/> {{ lang.success }} + <i class="vicp-icon3" /> {{ lang.success }} </div> </div> <div class="vicp-operate"> @@ -101,7 +102,7 @@ <a @click="off" @mousedown="ripple">{{ lang.btn.close }}</a> </div> </div> - <canvas v-show="false" ref="canvas" :width="width" :height="height"/> + <canvas v-show="false" ref="canvas" :width="width" :height="height" /> </div> </div> </template> diff --git a/src/components/JsonEditor/index.vue b/src/components/JsonEditor/index.vue index d68b8c05..81715f5d 100644 --- a/src/components/JsonEditor/index.vue +++ b/src/components/JsonEditor/index.vue @@ -1,6 +1,6 @@ <template> <div class="json-editor"> - <textarea ref="textarea"/> + <textarea ref="textarea" /> </div> </template> diff --git a/src/components/Kanban/index.vue b/src/components/Kanban/index.vue index dadeb648..059e4186 100644 --- a/src/components/Kanban/index.vue +++ b/src/components/Kanban/index.vue @@ -6,7 +6,8 @@ <draggable :list="list" :options="options" - class="board-column-content"> + class="board-column-content" + > <div v-for="element in list" :key="element.id" class="board-item"> {{ element.name }} {{ element.id }} </div> diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue index fea7ba71..9130efc7 100644 --- a/src/components/LangSelect/index.vue +++ b/src/components/LangSelect/index.vue @@ -4,9 +4,15 @@ <svg-icon class-name="international-icon" icon-class="language" /> </div> <el-dropdown-menu slot="dropdown"> - <el-dropdown-item :disabled="language==='zh'" command="zh">中文</el-dropdown-item> - <el-dropdown-item :disabled="language==='en'" command="en">English</el-dropdown-item> - <el-dropdown-item :disabled="language==='es'" command="es">Español</el-dropdown-item> + <el-dropdown-item :disabled="language==='zh'" command="zh"> + 中文 + </el-dropdown-item> + <el-dropdown-item :disabled="language==='en'" command="en"> + English + </el-dropdown-item> + <el-dropdown-item :disabled="language==='es'" command="es"> + Español + </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </template> diff --git a/src/components/MDinput/index.vue b/src/components/MDinput/index.vue index 7ede73db..c774aa0e 100644 --- a/src/components/MDinput/index.vue +++ b/src/components/MDinput/index.vue @@ -1,12 +1,12 @@ <template> <div :class="computedClasses" class="material-input__component"> <div :class="{iconClass:icon}"> - <i v-if="icon" :class="['el-icon-' + icon]" class="el-input__icon material-input__icon"/> + <i v-if="icon" :class="['el-icon-' + icon]" class="el-input__icon material-input__icon" /> <input v-if="type === 'email'" + v-model="currentValue" :name="name" :placeholder="fillPlaceHolder" - v-model="currentValue" :readonly="readonly" :disabled="disabled" :autoComplete="autoComplete" @@ -15,12 +15,13 @@ class="material-input" @focus="handleMdFocus" @blur="handleMdBlur" - @input="handleModelInput"> + @input="handleModelInput" + > <input v-if="type === 'url'" + v-model="currentValue" :name="name" :placeholder="fillPlaceHolder" - v-model="currentValue" :readonly="readonly" :disabled="disabled" :autoComplete="autoComplete" @@ -29,12 +30,13 @@ class="material-input" @focus="handleMdFocus" @blur="handleMdBlur" - @input="handleModelInput"> + @input="handleModelInput" + > <input v-if="type === 'number'" + v-model="currentValue" :name="name" :placeholder="fillPlaceHolder" - v-model="currentValue" :step="step" :readonly="readonly" :disabled="disabled" @@ -48,12 +50,13 @@ class="material-input" @focus="handleMdFocus" @blur="handleMdBlur" - @input="handleModelInput"> + @input="handleModelInput" + > <input v-if="type === 'password'" + v-model="currentValue" :name="name" :placeholder="fillPlaceHolder" - v-model="currentValue" :readonly="readonly" :disabled="disabled" :autoComplete="autoComplete" @@ -64,12 +67,13 @@ class="material-input" @focus="handleMdFocus" @blur="handleMdBlur" - @input="handleModelInput"> + @input="handleModelInput" + > <input v-if="type === 'tel'" + v-model="currentValue" :name="name" :placeholder="fillPlaceHolder" - v-model="currentValue" :readonly="readonly" :disabled="disabled" :autoComplete="autoComplete" @@ -78,12 +82,13 @@ class="material-input" @focus="handleMdFocus" @blur="handleMdBlur" - @input="handleModelInput"> + @input="handleModelInput" + > <input v-if="type === 'text'" + v-model="currentValue" :name="name" :placeholder="fillPlaceHolder" - v-model="currentValue" :readonly="readonly" :disabled="disabled" :autoComplete="autoComplete" @@ -94,10 +99,11 @@ class="material-input" @focus="handleMdFocus" @blur="handleMdBlur" - @input="handleModelInput"> - <span class="material-input-bar"/> + @input="handleModelInput" + > + <span class="material-input-bar" /> <label class="material-label"> - <slot/> + <slot /> </label> </div> </div> diff --git a/src/components/MarkdownEditor/index.vue b/src/components/MarkdownEditor/index.vue index 4a6d8b0f..9ed7a584 100644 --- a/src/components/MarkdownEditor/index.vue +++ b/src/components/MarkdownEditor/index.vue @@ -1,5 +1,5 @@ <template> - <div :id="id"/> + <div :id="id" /> </template> <script> diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue index 8d104e84..a4962964 100644 --- a/src/components/Pagination/index.vue +++ b/src/components/Pagination/index.vue @@ -9,7 +9,8 @@ :total="total" v-bind="$attrs" @size-change="handleSizeChange" - @current-change="handleCurrentChange"/> + @current-change="handleCurrentChange" + /> </div> </template> diff --git a/src/components/PanThumb/index.vue b/src/components/PanThumb/index.vue index ec549f43..de6940ad 100644 --- a/src/components/PanThumb/index.vue +++ b/src/components/PanThumb/index.vue @@ -2,7 +2,7 @@ <div :style="{zIndex:zIndex,height:height,width:width}" class="pan-item"> <div class="pan-info"> <div class="pan-info-roles-container"> - <slot/> + <slot /> </div> </div> <img :src="image" class="pan-thumb"> diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue index 6d3cd43a..0fa61706 100644 --- a/src/components/SizeSelect/index.vue +++ b/src/components/SizeSelect/index.vue @@ -4,8 +4,9 @@ <svg-icon class-name="size-icon" icon-class="size" /> </div> <el-dropdown-menu slot="dropdown"> - <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value">{{ - item.label }}</el-dropdown-item> + <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value"> + {{ item.label }} + </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </template> diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue index b0b6d4cb..27da76cf 100644 --- a/src/components/SvgIcon/index.vue +++ b/src/components/SvgIcon/index.vue @@ -1,6 +1,6 @@ <template> <svg :class="svgClass" aria-hidden="true" v-on="$listeners"> - <use :xlink:href="iconName"/> + <use :xlink:href="iconName" /> </svg> </template> diff --git a/src/components/TextHoverEffect/Mallki.vue b/src/components/TextHoverEffect/Mallki.vue index 4ea29fc2..5d6d16ca 100644 --- a/src/components/TextHoverEffect/Mallki.vue +++ b/src/components/TextHoverEffect/Mallki.vue @@ -1,8 +1,8 @@ <template> <a :class="className" class="link--mallki" href="#"> {{ text }} - <span :data-letters="text"/> - <span :data-letters="text"/> + <span :data-letters="text" /> + <span :data-letters="text" /> </a> </template> diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index 52419929..be3a573a 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -2,7 +2,8 @@ <el-color-picker v-model="theme" class="theme-picker" - popper-class="theme-picker-dropdown"/> + popper-class="theme-picker-dropdown" + /> </template> <script> diff --git a/src/components/Tinymce/components/editorImage.vue b/src/components/Tinymce/components/editorImage.vue index bcd82099..ea834652 100644 --- a/src/components/Tinymce/components/editorImage.vue +++ b/src/components/Tinymce/components/editorImage.vue @@ -1,6 +1,7 @@ <template> <div class="upload-container"> - <el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true">上传图片 + <el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true"> + 上传图片 </el-button> <el-dialog :visible.sync="dialogVisible"> <el-upload @@ -12,7 +13,8 @@ :before-upload="beforeUpload" class="editor-slide-upload" action="https://httpbin.org/post" - list-type="picture-card"> + list-type="picture-card" + > <el-button size="small" type="primary">点击上传</el-button> </el-upload> <el-button @click="dialogVisible = false">取 消</el-button> diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index ce0fe6a9..3d6dba2b 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -1,8 +1,8 @@ <template> <div :class="{fullscreen:fullscreen}" class="tinymce-container editor-container"> - <textarea :id="tinymceId" class="tinymce-textarea"/> + <textarea :id="tinymceId" class="tinymce-textarea" /> <div class="editor-custom-btn-container"> - <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK"/> + <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" /> </div> </div> </template> diff --git a/src/components/TreeTable/index.vue b/src/components/TreeTable/index.vue index 9ce7a503..92ddc434 100644 --- a/src/components/TreeTable/index.vue +++ b/src/components/TreeTable/index.vue @@ -1,18 +1,19 @@ <template> - <el-table :data="tableData" :row-style="showRow" v-bind="$attrs" v-on="$listeners" > + <el-table :data="tableData" :row-style="showRow" v-bind="$attrs" v-on="$listeners"> <slot name="selection" /> <slot name="pre-column" /> <el-table-column v-for="item in columns" - :label="item.label" :key="item.key" + :label="item.label" :width="item.width" :align="item.align||'center'" - :header-align="item.headerAlign"> + :header-align="item.headerAlign" + > <template slot-scope="scope"> <slot :scope="scope" :name="item.key"> <template v-if="item.expand"> - <span :style="{'padding-left':+scope.row._level*indent + 'px'} "/> + <span :style="{'padding-left':+scope.row._level*indent + 'px'} " /> <span v-show="showSperadIcon(scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)"> <i v-if="!scope.row._expand" class="el-icon-plus" /> <i v-else class="el-icon-minus" /> @@ -21,15 +22,17 @@ <template v-if="item.checkbox"> <el-checkbox v-if="scope.row[defaultChildren]&&scope.row[defaultChildren].length>0" + v-model="scope.row._select" :style="{'padding-left':+scope.row._level*indent + 'px'} " :indeterminate="scope.row._select" - v-model="scope.row._select" - @change="handleCheckAllChange(scope.row)" /> + @change="handleCheckAllChange(scope.row)" + /> <el-checkbox v-else - :style="{'padding-left':+scope.row._level*indent + 'px'} " v-model="scope.row._select" - @change="handleCheckAllChange(scope.row)" /> + :style="{'padding-left':+scope.row._level*indent + 'px'} " + @change="handleCheckAllChange(scope.row)" + /> </template> {{ scope.row[item.key] }} </slot> diff --git a/src/components/TreeTable/readme.md b/src/components/TreeTable/readme.md new file mode 100644 index 00000000..05326dfa --- /dev/null +++ b/src/components/TreeTable/readme.md @@ -0,0 +1,220 @@ + +- [Enlgish](#Brief) + +# 中文 + +## 写在前面 + +此组件仅提供一个创建 `TreeTable` 的解决思路。它基于`element-ui`的 table 组件实现,通过`el-table`的`row-style`方法,在里面判断元素是否需要隐藏或者显示,从而实现`TreeTable`的展开与收起。 + +并且本组件充分利用 `vue` 插槽的特性来方便用户自定义。 + +`evel.js` 里面,`addAttrs` 方法会给数据添加几个属性,`treeTotable` 会对数组扁平化。这些操作都不会破坏源数据,只是会新增属性。 + +## Props 说明 + +| Attribute | Description | Type | Default | +| :--------------: | :--------------------------------- | :-----: | :------: | +| data | 原始展示数据 | Array | [] | +| columns | 列属性 | Array | [] | +| defaultExpandAll | 默认是否全部展开 | Boolean | false | +| defaultChildren | 指定子树为节点对象的某个属性值 | String | children | | +| indent | 相邻级节点间的水平缩进,单位为像素 | Number | 50 | + +> 任何 `el-table` 的属性都支持,例如`border`、`fit`、`size`或者`@select`、`@cell-click`等方法。详情属性见`el-table`文档。 + +--- + +### 代码示例 + +```html +<tree-table :data="data" :columns="columns" border> +``` + +#### data(**必填**) + +```js +const data = [ + { + name:'1' + children: [ + { + name: '1-1' + }, + { + name: '1-2' + } + ] + }, + { + name: `2` + } +] +``` + +#### columns(**必填**) + +- label: 显示在表头的文字 +- key: 对应 data 的 key。treeTable 将显示相应的 value +- expand: `true` or `false`。若为 true,则在该列显示展开收起图标 +- checkbox: `true` or `false`。若为 true,则在该列显示`checkbox` +- width: 每列的宽度,为一个数字(可选)。例如`200` +- align: 对齐方式 `left/center/right` +- header-align: 表头对齐方式 `left/center/right` + +```javascript +const columns = [ + { + label: 'Checkbox', + checkbox: true + }, + { + label: '', + key: 'id', + expand: true + }, + { + label: 'Event', + key: 'event', + width: 200, + align: 'left' + }, + { + label: 'Scope', + key: 'scope' + } +] +``` + +> 树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 + +```html +<template slot="your key" slot-scope="{scope}"> + <el-tag>level: {{ scope.row._level }}</el-tag> + <el-tag>expand: {{ scope.row._expand }}</el-tag> + <el-tag>select: {{ scope.row._select }}</el-tag> +</template> +``` + +## Events + +目前提供了几个方法,不过只是`beta`版本,之后很可能会修改。 + +```js +this.$refs.TreeTable.addChild(row, data) //添加子元素 +this.$refs.TreeTable.addBrother(row, data) //添加兄弟元素 +this.$refs.TreeTable.delete(row) //删除该元素 +``` + +## 其他 + +如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue + +# English + +## Brief + +This component only provides a solution for creating `TreeTable`. It is based on the `element-ui` table component. It uses the `row-style` method of `el-table` to determine whether the element needs to be hidden or displayed. + +And this component makes full use of the features of the `vue` slot to make it user-friendly. + +In `evel.js`, the `addAttrs` method adds several properties to the data, and `treeTotable` flattens the array. None of these operations will destroy the source data, just add properties. + +## Props + +| Attribute | Description | Type | Default | +| :--------------: | :----------------------------------------------------------- | :-----: | :------: | +| data | original display data | Array | [] | +| columns | column attribute | Array | [] | +| defaultExpandAll | whether to expand all nodes by default | Boolean | false | +| defaultChildren | specify which node object is used as the node's subtree | String | children | | +| indent | horizontal indentation of nodes in adjacent levels in pixels | Number | 50 | + +> Any of the `el-table` properties are supported, such as `border`, `fit`, `size` or `@select`, `@cell-click`. See the ʻel-table` documentation for details. + +--- + +### Example + +```html +<tree-table :data="data" :columns="columns" border> +``` + +#### data(**Required**) + +```js +const data = [ + { + name:'1' + children: [ + { + name: '1-1' + }, + { + name: '1-2' + } + ] + }, + { + name: `2` + } +] +``` + +#### columns(**Required**) + +- label: text displayed in the header +- key: data.key will show in column +- expand: `true` or `false` +- checkbox: `true` or `false` +- width: column width 。such as `200` +- align: alignment `left/center/right` +- header-align: alignment of the table header `left/center/right` + +```javascript +const columns = [ + { + label: 'Checkbox', + checkbox: true + }, + { + label: '', + key: 'id', + expand: true + }, + { + label: 'Event', + key: 'event', + width: 200, + align: 'left' + }, + { + label: 'Scope', + key: 'scope' + } +] +``` + +> The tree table component will generate a named slot based on the key property of columns. If you need to customize the column data, you can do it through the slot. + +```html +<template slot="your key" slot-scope="{scope}"> + <el-tag>level: {{ scope.row._level }}</el-tag> + <el-tag>expand: {{ scope.row._expand }}</el-tag> + <el-tag>select: {{ scope.row._select }}</el-tag> +</template> +``` + +## Events + +Several methods are currently available, but only the `beta` version, which is likely to be modified later. + +```js +this.$refs.TreeTable.addChild(row, data) //Add child elements +this.$refs.TreeTable.addBrother(row, data) //Add a sibling element +this.$refs.TreeTable.delete(row) //Delete the element +``` + +## Other + +If you have other requirements, please refer to the [el-table](http://element-cn.eleme.io/#/en-US/component/table) api to modify the index.vue diff --git a/src/components/Upload/singleImage.vue b/src/components/Upload/singleImage.vue index 291e4cf1..0609a79d 100644 --- a/src/components/Upload/singleImage.vue +++ b/src/components/Upload/singleImage.vue @@ -7,15 +7,16 @@ :on-success="handleImageSuccess" class="image-uploader" drag - action="https://httpbin.org/post"> - <i class="el-icon-upload"/> + action="https://httpbin.org/post" + > + <i class="el-icon-upload" /> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> </el-upload> <div class="image-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> <img :src="imageUrl+'?imageView2/1/w/200/h/200'"> <div class="image-preview-action"> - <i class="el-icon-delete" @click="rmImage"/> + <i class="el-icon-delete" @click="rmImage" /> </div> </div> </div> diff --git a/src/components/Upload/singleImage2.vue b/src/components/Upload/singleImage2.vue index cf4dc0b7..a14d028f 100644 --- a/src/components/Upload/singleImage2.vue +++ b/src/components/Upload/singleImage2.vue @@ -7,15 +7,16 @@ :on-success="handleImageSuccess" class="image-uploader" drag - action="https://httpbin.org/post"> - <i class="el-icon-upload"/> + action="https://httpbin.org/post" + > + <i class="el-icon-upload" /> <div class="el-upload__text">Drag或<em>点击上传</em></div> </el-upload> <div v-show="imageUrl.length>0" class="image-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> <img :src="imageUrl"> <div class="image-preview-action"> - <i class="el-icon-delete" @click="rmImage"/> + <i class="el-icon-delete" @click="rmImage" /> </div> </div> </div> diff --git a/src/components/Upload/singleImage3.vue b/src/components/Upload/singleImage3.vue index 2cce98da..5eef0d1e 100644 --- a/src/components/Upload/singleImage3.vue +++ b/src/components/Upload/singleImage3.vue @@ -7,15 +7,16 @@ :on-success="handleImageSuccess" class="image-uploader" drag - action="https://httpbin.org/post"> - <i class="el-icon-upload"/> + action="https://httpbin.org/post" + > + <i class="el-icon-upload" /> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> </el-upload> <div class="image-preview image-app-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> <img :src="imageUrl"> <div class="image-preview-action"> - <i class="el-icon-delete" @click="rmImage"/> + <i class="el-icon-delete" @click="rmImage" /> </div> </div> </div> @@ -23,7 +24,7 @@ <div v-show="imageUrl.length>1" class="image-preview-wrapper"> <img :src="imageUrl"> <div class="image-preview-action"> - <i class="el-icon-delete" @click="rmImage"/> + <i class="el-icon-delete" @click="rmImage" /> </div> </div> </div> diff --git a/src/directive/el-dragDialog/drag.js b/src/directive/el-dragDialog/drag.js index 58e29110..299e9854 100644 --- a/src/directive/el-dragDialog/drag.js +++ b/src/directive/el-dragDialog/drag.js @@ -1,4 +1,4 @@ -export default{ +export default { bind(el, binding, vnode) { const dialogHeaderEl = el.querySelector('.el-dialog__header') const dragDom = el.querySelector('.el-dialog') diff --git a/src/directive/permission/permission.js b/src/directive/permission/permission.js index 17b85d79..1fc8f136 100644 --- a/src/directive/permission/permission.js +++ b/src/directive/permission/permission.js @@ -1,7 +1,7 @@ import store from '@/store' -export default{ +export default { inserted(el, binding, vnode) { const { value } = binding const roles = store.getters && store.getters.roles diff --git a/src/views/charts/keyboard.vue b/src/views/charts/keyboard.vue index 3ea21397..3c158fcc 100644 --- a/src/views/charts/keyboard.vue +++ b/src/views/charts/keyboard.vue @@ -1,6 +1,6 @@ <template> <div class="chart-container"> - <chart height="100%" width="100%"/> + <chart height="100%" width="100%" /> </div> </template> diff --git a/src/views/charts/line.vue b/src/views/charts/line.vue index 2034d4c7..daa181fa 100644 --- a/src/views/charts/line.vue +++ b/src/views/charts/line.vue @@ -1,6 +1,6 @@ <template> <div class="chart-container"> - <chart height="100%" width="100%"/> + <chart height="100%" width="100%" /> </div> </template> diff --git a/src/views/charts/mixChart.vue b/src/views/charts/mixChart.vue index 7ccc7fa0..d41e655b 100644 --- a/src/views/charts/mixChart.vue +++ b/src/views/charts/mixChart.vue @@ -1,6 +1,6 @@ <template> <div class="chart-container"> - <chart height="100%" width="100%"/> + <chart height="100%" width="100%" /> </div> </template> diff --git a/src/views/clipboard/index.vue b/src/views/clipboard/index.vue index 607dfb66..54fbf946 100644 --- a/src/views/clipboard/index.vue +++ b/src/views/clipboard/index.vue @@ -2,11 +2,11 @@ <div class="app-container"> <el-tabs v-model="activeName"> <el-tab-pane label="use clipboard directly" name="directly"> - <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;"/> + <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" /> <el-button type="primary" icon="document" @click="handleCopy(inputData,$event)">copy</el-button> </el-tab-pane> <el-tab-pane label="use clipboard by v-directive" name="v-directive"> - <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;"/> + <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" /> <el-button v-clipboard:copy="inputData" v-clipboard:success="clipboardSuccess" type="primary" icon="document">copy</el-button> </el-tab-pane> </el-tabs> diff --git a/src/views/components-demo/avatarUpload.vue b/src/views/components-demo/avatarUpload.vue index 144448ce..c40ef4a4 100644 --- a/src/views/components-demo/avatarUpload.vue +++ b/src/views/components-demo/avatarUpload.vue @@ -5,20 +5,22 @@ {{ $t('components.imageUploadTips') }} </code> - <pan-thumb :image="image"/> + <pan-thumb :image="image" /> - <el-button type="primary" icon="upload" style="position: absolute;bottom: 15px;margin-left: 40px;" @click="imagecropperShow=true">Change Avatar + <el-button type="primary" icon="upload" style="position: absolute;bottom: 15px;margin-left: 40px;" @click="imagecropperShow=true"> + Change Avatar </el-button> <image-cropper v-show="imagecropperShow" + :key="imagecropperKey" :width="300" :height="300" - :key="imagecropperKey" url="https://httpbin.org/post" lang-type="en" @close="close" - @crop-upload-success="cropSuccess"/> + @crop-upload-success="cropSuccess" + /> </div> </template> diff --git a/src/views/components-demo/backToTop.vue b/src/views/components-demo/backToTop.vue index 83a5529b..1404f574 100644 --- a/src/views/components-demo/backToTop.vue +++ b/src/views/components-demo/backToTop.vue @@ -116,7 +116,7 @@ <!--可自定义按钮的样式、show/hide临界点、返回的位置 --> <!--如需文字提示,可在外部添加element的<el-tooltip></el-tooltip>元素 --> <el-tooltip placement="top" content="tooltip"> - <back-to-top :custom-style="myBackToTopStyle" :visibility-height="300" :back-position="50" transition-name="fade"/> + <back-to-top :custom-style="myBackToTopStyle" :visibility-height="300" :back-position="50" transition-name="fade" /> </el-tooltip> </div> </template> diff --git a/src/views/components-demo/countTo.vue b/src/views/components-demo/countTo.vue index 7044a5d2..de9339bc 100644 --- a/src/views/components-demo/countTo.vue +++ b/src/views/components-demo/countTo.vue @@ -13,36 +13,39 @@ :prefix="_prefix" :suffix="_suffix" :autoplay="false" - class="example"/> + class="example" + /> <div style="margin-left: 25%;margin-top: 40px;"> <label class="label" for="startValInput">startVal: - <input v-model.number="setStartVal" type="number" name="startValInput" > + <input v-model.number="setStartVal" type="number" name="startValInput"> </label> <label class="label" for="endValInput">endVal: - <input v-model.number="setEndVal" type="number" name="endVaInput" > + <input v-model.number="setEndVal" type="number" name="endVaInput"> </label> <label class="label" for="durationInput">duration: - <input v-model.number="setDuration" type="number" name="durationInput" > + <input v-model.number="setDuration" type="number" name="durationInput"> </label> <div class="startBtn example-btn" @click="start">开始</div> <div class="pause-resume-btn example-btn" @click="pauseResume">暂停/恢复</div> <br> <label class="label" for="decimalsInput">decimals: - <input v-model.number="setDecimals" type="number" name="decimalsInput" > + <input v-model.number="setDecimals" type="number" name="decimalsInput"> </label> <label class="label" for="separatorInput">separator: - <input v-model="setSeparator" name="separatorInput" > + <input v-model="setSeparator" name="separatorInput"> </label> <label class="label" for="prefixInput">prefix: - <input v-model="setPrefix" name="prefixInput" > + <input v-model="setPrefix" name="prefixInput"> </label> <label class="label" for="suffixInput">suffix: - <input v-model="setSuffix" name="suffixInput" > + <input v-model="setSuffix" name="suffixInput"> </label> </div> - <code><count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}' - :decimals='{{ _decimals }}' :separator='{{ _separator }}' :prefix='{{ _prefix }}' :suffix='{{ _suffix }}' - :autoplay=false></code> + <code> + <count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}' + :decimals='{{ _decimals }}' :separator='{{ _separator }}' :prefix='{{ _prefix }}' :suffix='{{ _suffix }}' + :autoplay=false> + </code> </div> </template> diff --git a/src/views/components-demo/dndList.vue b/src/views/components-demo/dndList.vue index 9c8847a9..0e4c215a 100644 --- a/src/views/components-demo/dndList.vue +++ b/src/views/components-demo/dndList.vue @@ -4,7 +4,7 @@ <a href="https://github.com/SortableJS/Vue.Draggable" target="_blank">Vue.Draggable</a> </code> <div class="editor-container"> - <dnd-list :list1="list1" :list2="list2" list1-title="List" list2-title="Article pool"/> + <dnd-list :list1="list1" :list2="list2" list1-title="List" list2-title="Article pool" /> </div> </div> </template> diff --git a/src/views/components-demo/dragDialog.vue b/src/views/components-demo/dragDialog.vue index 0a023f90..ae4b4900 100644 --- a/src/views/components-demo/dragDialog.vue +++ b/src/views/components-demo/dragDialog.vue @@ -3,12 +3,12 @@ <el-button type="primary" @click="dialogTableVisible = true">open a Drag Dialog</el-button> <el-dialog v-el-drag-dialog :visible.sync="dialogTableVisible" title="Shipping address" @dragDialog="handleDrag"> <el-select ref="select" v-model="value" placeholder="请选择"> - <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"/> + <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </el-select> <el-table :data="gridData"> - <el-table-column property="date" label="Date" width="150"/> - <el-table-column property="name" label="Name" width="200"/> - <el-table-column property="address" label="Address"/> + <el-table-column property="date" label="Date" width="150" /> + <el-table-column property="name" label="Name" width="200" /> + <el-table-column property="address" label="Address" /> </el-table> </el-dialog> </div> diff --git a/src/views/components-demo/dragKanban.vue b/src/views/components-demo/dragKanban.vue index 4353fb1e..bbbfe3df 100644 --- a/src/views/components-demo/dragKanban.vue +++ b/src/views/components-demo/dragKanban.vue @@ -1,8 +1,8 @@ <template> <div class="components-container board"> - <Kanban :key="1" :list="list1" :options="options" class="kanban todo" header-text="Todo"/> - <Kanban :key="2" :list="list2" :options="options" class="kanban working" header-text="Working"/> - <Kanban :key="3" :list="list3" :options="options" class="kanban done" header-text="Done"/> + <Kanban :key="1" :list="list1" :options="options" class="kanban todo" header-text="Todo" /> + <Kanban :key="2" :list="list2" :options="options" class="kanban working" header-text="Working" /> + <Kanban :key="3" :list="list3" :options="options" class="kanban done" header-text="Done" /> </div> </template> <script> diff --git a/src/views/components-demo/dragSelect.vue b/src/views/components-demo/dragSelect.vue index 559e8a57..c2ac4b9b 100644 --- a/src/views/components-demo/dragSelect.vue +++ b/src/views/components-demo/dragSelect.vue @@ -2,7 +2,7 @@ <div class="components-container"> <el-drag-select v-model="value" style="width:500px;" multiple placeholder="请选择"> - <el-option v-for="item in options" :label="item.label" :value="item.value" :key="item.value" /> + <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </el-drag-select> <div style="margin-top:30px;"> diff --git a/src/views/components-demo/dropzone.vue b/src/views/components-demo/dropzone.vue index 0044a525..62e9fdad 100644 --- a/src/views/components-demo/dropzone.vue +++ b/src/views/components-demo/dropzone.vue @@ -5,7 +5,7 @@ {{ $t('components.dropzoneTips') }} </code> <div class="editor-container"> - <dropzone id="myVueDropzone" url="https://httpbin.org/post" @dropzone-removedFile="dropzoneR" @dropzone-success="dropzoneS"/> + <dropzone id="myVueDropzone" url="https://httpbin.org/post" @dropzone-removedFile="dropzoneR" @dropzone-success="dropzoneS" /> </div> </div> </template> diff --git a/src/views/components-demo/jsonEditor.vue b/src/views/components-demo/jsonEditor.vue index cff3780c..06e60114 100644 --- a/src/views/components-demo/jsonEditor.vue +++ b/src/views/components-demo/jsonEditor.vue @@ -2,7 +2,7 @@ <div class="components-container"> <code>JsonEditor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a> , lint base on json-lint </code> <div class="editor-container"> - <json-editor ref="jsonEditor" v-model="value"/> + <json-editor ref="jsonEditor" v-model="value" /> </div> </div> </template> diff --git a/src/views/components-demo/markdown.vue b/src/views/components-demo/markdown.vue index de2e817e..fb6b503b 100644 --- a/src/views/components-demo/markdown.vue +++ b/src/views/components-demo/markdown.vue @@ -9,12 +9,12 @@ <div class="editor-container"> <el-tag class="tag-title">Basic:</el-tag> - <markdown-editor v-model="content" height="300px"/> + <markdown-editor v-model="content" height="300px" /> </div> <div class="editor-container"> <el-tag class="tag-title">Markdown Mode:</el-tag> - <markdown-editor ref="markdownEditor" v-model="content" :options="{hideModeSwitch:true,previewStyle:'tab'}" height="200px"/> + <markdown-editor ref="markdownEditor" v-model="content" :options="{hideModeSwitch:true,previewStyle:'tab'}" height="200px" /> </div> <div class="editor-container"> @@ -28,12 +28,13 @@ <div class="editor-container"> <el-tag class="tag-title">I18n:</el-tag> - <el-alert :closable="false" title="You can change the language of the admin system to see the effect" type="success"/> - <markdown-editor v-model="content" :language="language" height="300px"/> + <el-alert :closable="false" title="You can change the language of the admin system to see the effect" type="success" /> + <markdown-editor v-model="content" :language="language" height="300px" /> </div> <el-button style="margin-top:80px;" type="primary" icon="el-icon-document" @click="getHtml">Get HTML</el-button> - <div v-html="html"/> + <!-- eslint-disable-next-line --> + <div v-html="html" /> </div> </template> diff --git a/src/views/components-demo/mixin.vue b/src/views/components-demo/mixin.vue index 99b62468..08bca0a2 100644 --- a/src/views/components-demo/mixin.vue +++ b/src/views/components-demo/mixin.vue @@ -74,7 +74,7 @@ <span>hover text</span> </div> <div class="component-item"> - <mallki class-name="mallki-text" text="vue-element-admin"/> + <mallki class-name="mallki-text" text="vue-element-admin" /> </div> </el-card> </el-col> @@ -87,12 +87,11 @@ <span>Share</span> </div> <div class="component-item" style="height:420px;"> - <dropdown-menu :items="articleList" style="margin:0 auto;" title="系列文章"/> + <dropdown-menu :items="articleList" style="margin:0 auto;" title="系列文章" /> </div> </el-card> </el-col> </el-row> - </div> </template> diff --git a/src/views/components-demo/splitpane.vue b/src/views/components-demo/splitpane.vue index dcd87149..72b62014 100644 --- a/src/views/components-demo/splitpane.vue +++ b/src/views/components-demo/splitpane.vue @@ -7,15 +7,15 @@ </code> <split-pane split="vertical" @resize="resize"> <template slot="paneL"> - <div class="left-container"/> + <div class="left-container" /> </template> <template slot="paneR"> <split-pane split="horizontal"> <template slot="paneL"> - <div class="top-container"/> + <div class="top-container" /> </template> <template slot="paneR"> - <div class="bottom-container"/> + <div class="bottom-container" /> </template> </split-pane> </template> diff --git a/src/views/components-demo/sticky.vue b/src/views/components-demo/sticky.vue index 65cfb091..618f383e 100644 --- a/src/views/components-demo/sticky.vue +++ b/src/views/components-demo/sticky.vue @@ -3,11 +3,11 @@ <sticky class-name="sub-navbar"> <el-dropdown trigger="click"> <el-button plain> - Platform<i class="el-icon-caret-bottom el-icon--right"/> + Platform<i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-border"> <el-checkbox-group v-model="platforms" style="padding: 5px 15px;"> - <el-checkbox v-for="item in platformsOptions" :label="item.key" :key="item.key"> + <el-checkbox v-for="item in platformsOptions" :key="item.key" :label="item.key"> {{ item.name }} </el-checkbox> </el-checkbox-group> @@ -16,7 +16,7 @@ <el-dropdown trigger="click"> <el-button plain> - Link<i class="el-icon-caret-bottom el-icon--right"/> + Link<i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:300px"> <el-input v-model="url" placeholder="Please enter the content"> @@ -26,10 +26,11 @@ </el-dropdown> <div class="time-container"> - <el-date-picker v-model="time" :picker-options="pickerOptions" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Release time"/> + <el-date-picker v-model="time" :picker-options="pickerOptions" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Release time" /> </div> - <el-button style="margin-left: 10px;" type="success">publish + <el-button style="margin-left: 10px;" type="success"> + publish </el-button> </sticky> diff --git a/src/views/components-demo/tinymce.vue b/src/views/components-demo/tinymce.vue index c7a94694..22e72647 100644 --- a/src/views/components-demo/tinymce.vue +++ b/src/views/components-demo/tinymce.vue @@ -5,9 +5,10 @@ <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/component/rich-editor.html"> {{ $t('components.documentation') }}</a> </code> <div> - <tinymce :height="300" v-model="content"/> + <tinymce v-model="content" :height="300" /> </div> - <div class="editor-content" v-html="content"/> + <!-- eslint-disable-next-line --> + <div class="editor-content" v-html="content" /> </div> </template> diff --git a/src/views/dashboard/admin/components/BarChart.vue b/src/views/dashboard/admin/components/BarChart.vue index 28e0aef9..fa265ef6 100644 --- a/src/views/dashboard/admin/components/BarChart.vue +++ b/src/views/dashboard/admin/components/BarChart.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :style="{height:height,width:width}"/> + <div :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/views/dashboard/admin/components/BoxCard.vue b/src/views/dashboard/admin/components/BoxCard.vue index 0e4d1e27..0ab38b1b 100644 --- a/src/views/dashboard/admin/components/BoxCard.vue +++ b/src/views/dashboard/admin/components/BoxCard.vue @@ -4,23 +4,23 @@ <img src="https://wpimg.wallstcn.com/e7d23d71-cf19-4b90-a1cc-f56af8c0903d.png"> </div> <div style="position:relative;"> - <pan-thumb :image="avatar" class="panThumb"/> - <mallki class-name="mallki-text" text="vue-element-admin"/> + <pan-thumb :image="avatar" class="panThumb" /> + <mallki class-name="mallki-text" text="vue-element-admin" /> <div style="padding-top:35px;" class="progress-item"> <span>Vue</span> - <el-progress :percentage="70"/> + <el-progress :percentage="70" /> </div> <div class="progress-item"> <span>JavaScript</span> - <el-progress :percentage="18"/> + <el-progress :percentage="18" /> </div> <div class="progress-item"> <span>Css</span> - <el-progress :percentage="12"/> + <el-progress :percentage="12" /> </div> <div class="progress-item"> <span>ESLint</span> - <el-progress :percentage="100" status="success"/> + <el-progress :percentage="100" status="success" /> </div> </div> </el-card> diff --git a/src/views/dashboard/admin/components/LineChart.vue b/src/views/dashboard/admin/components/LineChart.vue index dfd121e5..2e05102d 100644 --- a/src/views/dashboard/admin/components/LineChart.vue +++ b/src/views/dashboard/admin/components/LineChart.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :style="{height:height,width:width}"/> + <div :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/views/dashboard/admin/components/PanelGroup.vue b/src/views/dashboard/admin/components/PanelGroup.vue index 8125b846..61c237cb 100644 --- a/src/views/dashboard/admin/components/PanelGroup.vue +++ b/src/views/dashboard/admin/components/PanelGroup.vue @@ -7,7 +7,7 @@ </div> <div class="card-panel-description"> <div class="card-panel-text">New Visits</div> - <count-to :start-val="0" :end-val="102400" :duration="2600" class="card-panel-num"/> + <count-to :start-val="0" :end-val="102400" :duration="2600" class="card-panel-num" /> </div> </div> </el-col> @@ -18,7 +18,7 @@ </div> <div class="card-panel-description"> <div class="card-panel-text">Messages</div> - <count-to :start-val="0" :end-val="81212" :duration="3000" class="card-panel-num"/> + <count-to :start-val="0" :end-val="81212" :duration="3000" class="card-panel-num" /> </div> </div> </el-col> @@ -29,7 +29,7 @@ </div> <div class="card-panel-description"> <div class="card-panel-text">Purchases</div> - <count-to :start-val="0" :end-val="9280" :duration="3200" class="card-panel-num"/> + <count-to :start-val="0" :end-val="9280" :duration="3200" class="card-panel-num" /> </div> </div> </el-col> @@ -40,7 +40,7 @@ </div> <div class="card-panel-description"> <div class="card-panel-text">Shoppings</div> - <count-to :start-val="0" :end-val="13600" :duration="3600" class="card-panel-num"/> + <count-to :start-val="0" :end-val="13600" :duration="3600" class="card-panel-num" /> </div> </div> </el-col> diff --git a/src/views/dashboard/admin/components/PieChart.vue b/src/views/dashboard/admin/components/PieChart.vue index edb17d54..ff1bc52c 100644 --- a/src/views/dashboard/admin/components/PieChart.vue +++ b/src/views/dashboard/admin/components/PieChart.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :style="{height:height,width:width}"/> + <div :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/views/dashboard/admin/components/RaddarChart.vue b/src/views/dashboard/admin/components/RaddarChart.vue index 11fde329..de70e523 100644 --- a/src/views/dashboard/admin/components/RaddarChart.vue +++ b/src/views/dashboard/admin/components/RaddarChart.vue @@ -1,5 +1,5 @@ <template> - <div :class="className" :style="{height:height,width:width}"/> + <div :class="className" :style="{height:height,width:width}" /> </template> <script> diff --git a/src/views/dashboard/admin/components/TodoList/Todo.vue b/src/views/dashboard/admin/components/TodoList/Todo.vue index 9f5a6bb2..c4b3cae2 100644 --- a/src/views/dashboard/admin/components/TodoList/Todo.vue +++ b/src/views/dashboard/admin/components/TodoList/Todo.vue @@ -5,18 +5,20 @@ :checked="todo.done" class="toggle" type="checkbox" - @change="toggleTodo( todo)"> - <label @dblclick="editing = true" v-text="todo.text"/> - <button class="destroy" @click="deleteTodo( todo )"/> + @change="toggleTodo( todo)" + > + <label @dblclick="editing = true" v-text="todo.text" /> + <button class="destroy" @click="deleteTodo( todo )" /> </div> <input - v-focus="editing" v-show="editing" + v-focus="editing" :value="todo.text" class="edit" @keyup.enter="doneEdit" @keyup.esc="cancelEdit" - @blur="doneEdit"> + @blur="doneEdit" + > </li> </template> diff --git a/src/views/dashboard/admin/components/TodoList/index.vue b/src/views/dashboard/admin/components/TodoList/index.vue index 5b840c65..8000d414 100644 --- a/src/views/dashboard/admin/components/TodoList/index.vue +++ b/src/views/dashboard/admin/components/TodoList/index.vue @@ -7,7 +7,7 @@ <!-- main section --> <section v-show="todos.length" class="main"> <input id="toggle-all" :checked="allChecked" class="toggle-all" type="checkbox" @change="toggleAll({ done: !allChecked })"> - <label for="toggle-all"/> + <label for="toggle-all" /> <ul class="todo-list"> <todo v-for="(todo, index) in filteredTodos" @@ -15,7 +15,8 @@ :todo="todo" @toggleTodo="toggleTodo" @editTodo="editTodo" - @deleteTodo="deleteTodo"/> + @deleteTodo="deleteTodo" + /> </ul> </section> <!-- footer --> diff --git a/src/views/dashboard/admin/components/TransactionTable.vue b/src/views/dashboard/admin/components/TransactionTable.vue index 07417523..f2b217d9 100644 --- a/src/views/dashboard/admin/components/TransactionTable.vue +++ b/src/views/dashboard/admin/components/TransactionTable.vue @@ -12,7 +12,9 @@ </el-table-column> <el-table-column label="Status" width="100" align="center"> <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> {{ scope.row.status }}</el-tag> + <el-tag :type="scope.row.status | statusFilter"> + {{ scope.row.status }} + </el-tag> </template> </el-table-column> </el-table> diff --git a/src/views/dashboard/admin/index.vue b/src/views/dashboard/admin/index.vue index 1a79637a..85dcc186 100644 --- a/src/views/dashboard/admin/index.vue +++ b/src/views/dashboard/admin/index.vue @@ -1,41 +1,41 @@ <template> <div class="dashboard-editor-container"> - <github-corner style="position: absolute; top: 0px; border: 0; right: 0;"/> + <github-corner style="position: absolute; top: 0px; border: 0; right: 0;" /> - <panel-group @handleSetLineChartData="handleSetLineChartData"/> + <panel-group @handleSetLineChartData="handleSetLineChartData" /> <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;"> - <line-chart :chart-data="lineChartData"/> + <line-chart :chart-data="lineChartData" /> </el-row> <el-row :gutter="32"> <el-col :xs="24" :sm="24" :lg="8"> <div class="chart-wrapper"> - <raddar-chart/> + <raddar-chart /> </div> </el-col> <el-col :xs="24" :sm="24" :lg="8"> <div class="chart-wrapper"> - <pie-chart/> + <pie-chart /> </div> </el-col> <el-col :xs="24" :sm="24" :lg="8"> <div class="chart-wrapper"> - <bar-chart/> + <bar-chart /> </div> </el-col> </el-row> <el-row :gutter="8"> <el-col :xs="{span: 24}" :sm="{span: 24}" :md="{span: 24}" :lg="{span: 12}" :xl="{span: 12}" style="padding-right:8px;margin-bottom:30px;"> - <transaction-table/> + <transaction-table /> </el-col> <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;"> - <todo-list/> + <todo-list /> </el-col> <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;"> - <box-card/> + <box-card /> </el-col> </el-row> diff --git a/src/views/dashboard/editor/index.vue b/src/views/dashboard/editor/index.vue index ace11426..7775ce39 100644 --- a/src/views/dashboard/editor/index.vue +++ b/src/views/dashboard/editor/index.vue @@ -1,10 +1,11 @@ <template> <div class="dashboard-editor-container"> <div class=" clearfix"> - <pan-thumb :image="avatar" style="float: left"> Your roles: + <pan-thumb :image="avatar" style="float: left"> + Your roles: <span v-for="item in roles" :key="item" class="pan-info-roles">{{ item }}</span> </pan-thumb> - <github-corner style="position: absolute; top: 0px; border: 0; right: 0;"/> + <github-corner style="position: absolute; top: 0px; border: 0; right: 0;" /> <div class="info-container"> <span class="display_name">{{ name }}</span> <span style="font-size:20px;padding-top:20px;display:inline-block;">Editor's Dashboard</span> diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue index 7011f6ad..1720ea8f 100644 --- a/src/views/dashboard/index.vue +++ b/src/views/dashboard/index.vue @@ -1,6 +1,6 @@ <template> <div class="dashboard-container"> - <component :is="currentRole"/> + <component :is="currentRole" /> </div> </template> diff --git a/src/views/documentation/index.vue b/src/views/documentation/index.vue index 4c7afc9d..5004e82b 100644 --- a/src/views/documentation/index.vue +++ b/src/views/documentation/index.vue @@ -3,7 +3,7 @@ <a class="document-btn" target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/">{{ $t('documentation.documentation') }}</a> <a class="document-btn" target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">{{ $t('documentation.github') }}</a> <a class="document-btn" target="_blank" href="https://panjiachen.gitee.io/vue-element-admin-site/zh/">国内文档</a> - <dropdown-menu :items="articleList" style="float:left;margin-left:50px;" title="系列文章"/> + <dropdown-menu :items="articleList" style="float:left;margin-left:50px;" title="系列文章" /> </div> </template> <script> diff --git a/src/views/errorLog/errorTestB.vue b/src/views/errorLog/errorTestB.vue index b04c2511..d796beef 100644 --- a/src/views/errorLog/errorTestB.vue +++ b/src/views/errorLog/errorTestB.vue @@ -1,5 +1,5 @@ <template> - <div/> + <div /> </template> <script> diff --git a/src/views/errorLog/index.vue b/src/views/errorLog/index.vue index 47db4ae5..8cbe18e2 100644 --- a/src/views/errorLog/index.vue +++ b/src/views/errorLog/index.vue @@ -1,7 +1,7 @@ <template> <div class="errPage-container"> - <errorA/> - <errorB/> + <errorA /> + <errorB /> <!-- $t is vue-i18n global function to translate lang --> <h3>{{ $t('errorLog.tips') }}</h3> <code> diff --git a/src/views/errorPage/404.vue b/src/views/errorPage/404.vue index 6483fd5f..94a2b07b 100644 --- a/src/views/errorPage/404.vue +++ b/src/views/errorPage/404.vue @@ -9,7 +9,8 @@ </div> <div class="bullshit"> <div class="bullshit__oops">OOPS!</div> - <div class="bullshit__info">版权所有 + <div class="bullshit__info"> + 版权所有 <a class="link-type" href="https://wallstreetcn.com" target="_blank">华尔街见闻</a> </div> <div class="bullshit__headline">{{ message }}</div> diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 1026559f..27d42ccc 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -6,7 +6,8 @@ <CommentDropdown v-model="postForm.comment_disabled" /> <PlatformDropdown v-model="postForm.platforms" /> <SourceUrlDropdown v-model="postForm.source_uri" /> - <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm">发布 + <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm"> + 发布 </el-button> <el-button v-loading="loading" type="warning" @click="draftForm">草稿</el-button> </sticky> @@ -28,14 +29,14 @@ <el-col :span="8"> <el-form-item label-width="45px" label="作者:" class="postInfo-container-item"> <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable remote placeholder="搜索用户"> - <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item"/> + <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item" /> </el-select> </el-form-item> </el-col> <el-col :span="10"> <el-form-item label-width="80px" label="发布时间:" class="postInfo-container-item"> - <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间"/> + <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间" /> </el-form-item> </el-col> @@ -47,7 +48,8 @@ :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :low-threshold="1" :high-threshold="3" - style="margin-top:8px;"/> + style="margin-top:8px;" + /> </el-form-item> </el-col> </el-row> @@ -56,12 +58,12 @@ </el-row> <el-form-item style="margin-bottom: 40px;" label-width="45px" label="摘要:"> - <el-input :rows="1" v-model="postForm.content_short" type="textarea" class="article-textarea" autosize placeholder="请输入内容"/> + <el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="请输入内容" /> <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span> </el-form-item> <el-form-item prop="content" style="margin-bottom: 30px;"> - <Tinymce ref="editor" :height="400" v-model="postForm.content" /> + <Tinymce ref="editor" v-model="postForm.content" :height="400" /> </el-form-item> <el-form-item prop="image_uri" style="margin-bottom: 30px;"> diff --git a/src/views/example/components/Dropdown/Comment.vue b/src/views/example/components/Dropdown/Comment.vue index 77e8d5f1..26509611 100644 --- a/src/views/example/components/Dropdown/Comment.vue +++ b/src/views/example/components/Dropdown/Comment.vue @@ -1,13 +1,18 @@ <template> <el-dropdown :show-timeout="100" trigger="click"> - <el-button plain>{{ !comment_disabled?'评论已打开':'评论已关闭' }} - <i class="el-icon-caret-bottom el-icon--right"/> + <el-button plain> + {{ !comment_disabled?'评论已打开':'评论已关闭' }} + <i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-padding"> <el-dropdown-item> <el-radio-group v-model="comment_disabled" style="padding: 10px;"> - <el-radio :label="true">关闭评论</el-radio> - <el-radio :label="false">打开评论</el-radio> + <el-radio :label="true"> + 关闭评论 + </el-radio> + <el-radio :label="false"> + 打开评论 + </el-radio> </el-radio-group> </el-dropdown-item> </el-dropdown-menu> diff --git a/src/views/example/components/Dropdown/Platform.vue b/src/views/example/components/Dropdown/Platform.vue index fce5e4b3..98fcaf28 100644 --- a/src/views/example/components/Dropdown/Platform.vue +++ b/src/views/example/components/Dropdown/Platform.vue @@ -2,11 +2,11 @@ <el-dropdown :hide-on-click="false" :show-timeout="100" trigger="click"> <el-button plain> 平台({{ platforms.length }}) - <i class="el-icon-caret-bottom el-icon--right"/> + <i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-border"> <el-checkbox-group v-model="platforms" style="padding: 5px 15px;"> - <el-checkbox v-for="item in platformsOptions" :label="item.key" :key="item.key"> + <el-checkbox v-for="item in platformsOptions" :key="item.key" :label="item.key"> {{ item.name }} </el-checkbox> </el-checkbox-group> diff --git a/src/views/example/components/Dropdown/SourceUrl.vue b/src/views/example/components/Dropdown/SourceUrl.vue index d14e8549..21a58907 100644 --- a/src/views/example/components/Dropdown/SourceUrl.vue +++ b/src/views/example/components/Dropdown/SourceUrl.vue @@ -2,12 +2,14 @@ <el-dropdown :show-timeout="100" trigger="click"> <el-button plain> 外链 - <i class="el-icon-caret-bottom el-icon--right"/> + <i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:400px"> <el-form-item label-width="0px" style="margin-bottom: 0px" prop="source_uri"> <el-input v-model="source_uri" placeholder="请输入内容"> - <template slot="prepend">填写url</template> + <template slot="prepend"> + 填写url + </template> </el-input> </el-form-item> </el-dropdown-menu> diff --git a/src/views/example/components/Warning.vue b/src/views/example/components/Warning.vue index 77d90c26..bee172d4 100644 --- a/src/views/example/components/Warning.vue +++ b/src/views/example/components/Warning.vue @@ -4,7 +4,8 @@ 的include,直接缓存所有页面。详情见 <a href="https://panjiachen.github.io/vue-element-admin-site/guide/essentials/tags-view.html" - target="_blank">文档</a> + target="_blank" + >文档</a> </p> </template> diff --git a/src/views/example/create.vue b/src/views/example/create.vue index d0f7b787..4d3a24b5 100644 --- a/src/views/example/create.vue +++ b/src/views/example/create.vue @@ -1,5 +1,5 @@ <template> - <article-detail :is-edit="false"/> + <article-detail :is-edit="false" /> </template> <script> diff --git a/src/views/example/edit.vue b/src/views/example/edit.vue index c21af0c9..87b61260 100644 --- a/src/views/example/edit.vue +++ b/src/views/example/edit.vue @@ -1,5 +1,5 @@ <template> - <article-detail :is-edit="true"/> + <article-detail :is-edit="true" /> </template> <script> diff --git a/src/views/example/list.vue b/src/views/example/list.vue index 85ae4e43..59f6ee6e 100644 --- a/src/views/example/list.vue +++ b/src/views/example/list.vue @@ -22,7 +22,7 @@ <el-table-column width="100px" label="Importance"> <template slot-scope="scope"> - <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon"/> + <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon" /> </template> </el-table-column> diff --git a/src/views/excel/components/BookTypeOption.vue b/src/views/excel/components/BookTypeOption.vue index 9970b0e4..af9fed39 100644 --- a/src/views/excel/components/BookTypeOption.vue +++ b/src/views/excel/components/BookTypeOption.vue @@ -1,12 +1,13 @@ <template> <div style="display:inline-block;"> <label class="radio-label">Book Type: </label> - <el-select v-model="bookType" style="width:120px;" > + <el-select v-model="bookType" style="width:120px;"> <el-option v-for="item in options" :key="item" :label="item" - :value="item"/> + :value="item" + /> </el-select> </div> </template> diff --git a/src/views/excel/components/FilenameOption.vue b/src/views/excel/components/FilenameOption.vue index 5cc931ad..b578d65c 100644 --- a/src/views/excel/components/FilenameOption.vue +++ b/src/views/excel/components/FilenameOption.vue @@ -2,7 +2,7 @@ <div style="display:inline-block;"> <!-- $t is vue-i18n global function to translate lang --> <label class="radio-label" style="padding-left:0;">Filename: </label> - <el-input :placeholder="$t('excel.placeholder')" v-model="filename" style="width:340px;" prefix-icon="el-icon-document"/> + <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:340px;" prefix-icon="el-icon-document" /> </div> </template> diff --git a/src/views/excel/exportExcel.vue b/src/views/excel/exportExcel.vue index 914ccb7b..413b8822 100644 --- a/src/views/excel/exportExcel.vue +++ b/src/views/excel/exportExcel.vue @@ -35,7 +35,7 @@ </el-table-column> <el-table-column align="center" label="Date" width="220"> <template slot-scope="scope"> - <i class="el-icon-time"/> + <i class="el-icon-time" /> <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span> </template> </el-table-column> diff --git a/src/views/excel/mergeHeader.vue b/src/views/excel/mergeHeader.vue index 81d12a89..c145932c 100644 --- a/src/views/excel/mergeHeader.vue +++ b/src/views/excel/mergeHeader.vue @@ -4,8 +4,8 @@ <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload">Export</el-button> <el-table - v-loading="listLoading" ref="multipleTable" + v-loading="listLoading" :data="list" element-loading-text="Loading" border @@ -36,7 +36,7 @@ </el-table-column> <el-table-column align="center" label="Date" width="220"> <template slot-scope="scope"> - <i class="el-icon-time"/> + <i class="el-icon-time" /> <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span> </template> </el-table-column> diff --git a/src/views/excel/selectExcel.vue b/src/views/excel/selectExcel.vue index 2695bfb4..7ee99c37 100644 --- a/src/views/excel/selectExcel.vue +++ b/src/views/excel/selectExcel.vue @@ -1,21 +1,22 @@ <template> <div class="app-container"> <!-- $t is vue-i18n global function to translate lang --> - <el-input :placeholder="$t('excel.placeholder')" v-model="filename" style="width:340px;" prefix-icon="el-icon-document"/> + <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:340px;" prefix-icon="el-icon-document" /> <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload">{{ $t('excel.selectedExport') }}</el-button> <a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;"> <el-tag type="info">Documentation</el-tag> </a> <el-table - v-loading="listLoading" ref="multipleTable" + v-loading="listLoading" :data="list" element-loading-text="拼命加载中" border fit highlight-current-row - @selection-change="handleSelectionChange"> - <el-table-column type="selection" align="center"/> + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" align="center" /> <el-table-column align="center" label="Id" width="95"> <template slot-scope="scope"> {{ scope.$index }} @@ -38,7 +39,7 @@ </el-table-column> <el-table-column align="center" label="PDate" width="220"> <template slot-scope="scope"> - <i class="el-icon-time"/> + <i class="el-icon-time" /> <span>{{ scope.row.display_time }}</span> </template> </el-table-column> diff --git a/src/views/excel/uploadExcel.vue b/src/views/excel/uploadExcel.vue index 4095e910..1772b7fd 100644 --- a/src/views/excel/uploadExcel.vue +++ b/src/views/excel/uploadExcel.vue @@ -1,8 +1,8 @@ <template> <div class="app-container"> - <upload-excel-component :on-success="handleSuccess" :before-upload="beforeUpload"/> + <upload-excel-component :on-success="handleSuccess" :before-upload="beforeUpload" /> <el-table :data="tableData" border highlight-current-row style="width: 100%;margin-top:20px;"> - <el-table-column v-for="item of tableHeader" :prop="item" :label="item" :key="item"/> + <el-table-column v-for="item of tableHeader" :key="item" :prop="item" :label="item" /> </el-table> </div> </template> diff --git a/src/views/i18n-demo/index.vue b/src/views/i18n-demo/index.vue index b5344c67..fad364af 100644 --- a/src/views/i18n-demo/index.vue +++ b/src/views/i18n-demo/index.vue @@ -18,7 +18,7 @@ <el-row :gutter="20" style="margin:100px 15px 50px;"> <el-col :span="12" :xs="24"> <div class="block"> - <el-date-picker v-model="date" :placeholder="$t('i18nView.datePlaceholder')" type="date"/> + <el-date-picker v-model="date" :placeholder="$t('i18nView.datePlaceholder')" type="date" /> </div> <div class="block"> <el-select v-model="value" :placeholder="$t('i18nView.selectPlaceholder')"> @@ -26,7 +26,8 @@ v-for="item in options" :key="item.value" :label="item.label" - :value="item.value"/> + :value="item.value" + /> </el-select> </div> <div class="block"> @@ -40,9 +41,9 @@ </el-col> <el-col :span="12" :xs="24"> <el-table :data="tableData" fit highlight-current-row border style="width: 100%"> - <el-table-column :label="$t('i18nView.tableName')" prop="name" width="100" align="center"/> - <el-table-column :label="$t('i18nView.tableDate')" prop="date" width="120" align="center"/> - <el-table-column :label="$t('i18nView.tableAddress')" prop="address"/> + <el-table-column :label="$t('i18nView.tableName')" prop="name" width="100" align="center" /> + <el-table-column :label="$t('i18nView.tableDate')" prop="date" width="120" align="center" /> + <el-table-column :label="$t('i18nView.tableAddress')" prop="address" /> </el-table> </el-col> </el-row> diff --git a/src/views/layout/Layout.vue b/src/views/layout/Layout.vue index 0e14f160..4d0eaa2b 100644 --- a/src/views/layout/Layout.vue +++ b/src/views/layout/Layout.vue @@ -1,11 +1,11 @@ <template> <div :class="classObj" class="app-wrapper"> - <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> - <sidebar class="sidebar-container"/> + <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> + <sidebar class="sidebar-container" /> <div class="main-container"> - <navbar/> - <tags-view/> - <app-main/> + <navbar /> + <tags-view /> + <app-main /> </div> </div> </template> diff --git a/src/views/layout/components/AppMain.vue b/src/views/layout/components/AppMain.vue index b6a3378f..9ee5bd52 100644 --- a/src/views/layout/components/AppMain.vue +++ b/src/views/layout/components/AppMain.vue @@ -2,7 +2,7 @@ <section class="app-main"> <transition name="fade-transform" mode="out-in"> <keep-alive :include="cachedViews"> - <router-view :key="key"/> + <router-view :key="key" /> </keep-alive> </transition> </section> diff --git a/src/views/layout/components/Navbar.vue b/src/views/layout/components/Navbar.vue index 5c3bcda4..e2c095ec 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/views/layout/components/Navbar.vue @@ -1,32 +1,32 @@ <template> <div class="navbar"> - <hamburger :toggle-click="toggleSideBar" :is-active="sidebar.opened" class="hamburger-container"/> + <hamburger :toggle-click="toggleSideBar" :is-active="sidebar.opened" class="hamburger-container" /> - <breadcrumb class="breadcrumb-container"/> + <breadcrumb class="breadcrumb-container" /> <div class="right-menu"> <template v-if="device!=='mobile'"> <search class="right-menu-item" /> - <error-log class="errLog-container right-menu-item hover-effect"/> + <error-log class="errLog-container right-menu-item hover-effect" /> - <screenfull class="right-menu-item hover-effect"/> + <screenfull class="right-menu-item hover-effect" /> <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom"> - <size-select class="right-menu-item hover-effect"/> + <size-select class="right-menu-item hover-effect" /> </el-tooltip> - <lang-select class="right-menu-item hover-effect"/> + <lang-select class="right-menu-item hover-effect" /> <el-tooltip :content="$t('navbar.theme')" effect="dark" placement="bottom"> - <theme-picker class="right-menu-item hover-effect"/> + <theme-picker class="right-menu-item hover-effect" /> </el-tooltip> </template> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> <div class="avatar-wrapper"> <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"> - <i class="el-icon-caret-bottom"/> + <i class="el-icon-caret-bottom" /> </div> <el-dropdown-menu slot="dropdown"> <router-link to="/"> diff --git a/src/views/layout/components/Sidebar/Link.vue b/src/views/layout/components/Sidebar/Link.vue index bff45cd8..eb4dd107 100644 --- a/src/views/layout/components/Sidebar/Link.vue +++ b/src/views/layout/components/Sidebar/Link.vue @@ -2,7 +2,7 @@ <template> <!-- eslint-disable vue/require-component-is --> <component v-bind="linkProps(to)"> - <slot/> + <slot /> </component> </template> diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 47ac4b4d..9664ffb6 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -15,11 +15,12 @@ </template> <sidebar-item v-for="child in item.children" + :key="child.path" :is-nest="true" :item="child" - :key="child.path" :base-path="resolvePath(child.path)" - class="nest-menu" /> + class="nest-menu" + /> </el-submenu> </div> diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index 5a81e84f..4c4d6db4 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -9,7 +9,7 @@ :collapse-transition="false" mode="vertical" > - <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path"/> + <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" /> </el-menu> </el-scrollbar> </template> diff --git a/src/views/layout/components/TagsView/ScrollPane.vue b/src/views/layout/components/TagsView/ScrollPane.vue index 820a536e..89c72e1c 100644 --- a/src/views/layout/components/TagsView/ScrollPane.vue +++ b/src/views/layout/components/TagsView/ScrollPane.vue @@ -1,6 +1,6 @@ <template> <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll"> - <slot/> + <slot /> </el-scrollbar> </template> diff --git a/src/views/layout/components/TagsView/index.vue b/src/views/layout/components/TagsView/index.vue index 72e127f2..c793ca1e 100644 --- a/src/views/layout/components/TagsView/index.vue +++ b/src/views/layout/components/TagsView/index.vue @@ -4,21 +4,23 @@ <router-link v-for="tag in visitedViews" ref="tag" + :key="tag.path" :class="isActive(tag)?'active':''" :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" - :key="tag.path" tag="span" class="tags-view-item" @click.middle.native="closeSelectedTag(tag)" - @contextmenu.prevent.native="openMenu(tag,$event)"> + @contextmenu.prevent.native="openMenu(tag,$event)" + > {{ generateTitle(tag.title) }} <span v-if="!tag.meta.affix" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> </router-link> </scroll-pane> <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> <li @click="refreshSelectedTag(selectedTag)">{{ $t('tagsView.refresh') }}</li> - <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">{{ - $t('tagsView.close') }}</li> + <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)"> + {{ $t('tagsView.close') }} + </li> <li @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}</li> <li @click="closeAllTags(selectedTag)">{{ $t('tagsView.closeAll') }}</li> </ul> diff --git a/src/views/login/socialsignin.vue b/src/views/login/socialsignin.vue index 62a63acc..567ac553 100644 --- a/src/views/login/socialsignin.vue +++ b/src/views/login/socialsignin.vue @@ -1,10 +1,10 @@ <template> <div class="social-signup-container"> <div class="sign-btn" @click="wechatHandleClick('wechat')"> - <span class="wx-svg-container"><svg-icon icon-class="wechat" class="icon"/></span> 微信 + <span class="wx-svg-container"><svg-icon icon-class="wechat" class="icon" /></span> 微信 </div> <div class="sign-btn" @click="tencentHandleClick('tencent')"> - <span class="qq-svg-container"><svg-icon icon-class="qq" class="icon"/></span> QQ + <span class="qq-svg-container"><svg-icon icon-class="qq" class="icon" /></span> QQ </div> </div> </template> diff --git a/src/views/nested/menu1/index.vue b/src/views/nested/menu1/index.vue index fdba73a4..30cb6701 100644 --- a/src/views/nested/menu1/index.vue +++ b/src/views/nested/menu1/index.vue @@ -1,4 +1,4 @@ -<template > +<template> <div style="padding:30px;"> <el-alert :closable="false" title="menu 1"> <router-view /> diff --git a/src/views/nested/menu1/menu1-1/index.vue b/src/views/nested/menu1/menu1-1/index.vue index 824b2cb6..27e173a6 100644 --- a/src/views/nested/menu1/menu1-1/index.vue +++ b/src/views/nested/menu1/menu1-1/index.vue @@ -1,4 +1,4 @@ -<template > +<template> <div style="padding:30px;"> <el-alert :closable="false" title="menu 1-1" type="success"> <router-view /> diff --git a/src/views/pdf/download.vue b/src/views/pdf/download.vue index b0f30f6f..b87b882d 100644 --- a/src/views/pdf/download.vue +++ b/src/views/pdf/download.vue @@ -6,7 +6,8 @@ <div style="color: #ccc;"> This article is from Evan You on <a target="_blank" href="https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf">medium</a> </div> - <div ref="content" class="node-article-content" v-html="article.content"/> + <!-- eslint-disable-next-line --> + <div ref="content" class="node-article-content" v-html="article.content" /> </div> </template> diff --git a/src/views/permission/components/SwitchRoles.vue b/src/views/permission/components/SwitchRoles.vue index 6e5f84e5..c69de5a5 100644 --- a/src/views/permission/components/SwitchRoles.vue +++ b/src/views/permission/components/SwitchRoles.vue @@ -3,8 +3,8 @@ <div style="margin-bottom:15px;">{{ $t('permission.roles') }}: {{ roles }}</div> {{ $t('permission.switchRoles') }}: <el-radio-group v-model="switchRoles"> - <el-radio-button label="editor"/> - <el-radio-button label="admin"/> + <el-radio-button label="editor" /> + <el-radio-button label="admin" /> </el-radio-group> </div> </template> diff --git a/src/views/permission/directive.vue b/src/views/permission/directive.vue index df277ddc..6019fae3 100644 --- a/src/views/permission/directive.vue +++ b/src/views/permission/directive.vue @@ -59,7 +59,7 @@ import permission from '@/directive/permission/index.js' // 权限判断指令 import checkPermission from '@/utils/permission' // 权限判断函数 import SwitchRoles from './components/SwitchRoles' -export default{ +export default { name: 'DirectivePermission', components: { SwitchRoles }, directives: { permission }, diff --git a/src/views/permission/page.vue b/src/views/permission/page.vue index 3f8a50e8..5291a782 100644 --- a/src/views/permission/page.vue +++ b/src/views/permission/page.vue @@ -7,7 +7,7 @@ <script> import SwitchRoles from './components/SwitchRoles' -export default{ +export default { name: 'PagePermission', components: { SwitchRoles }, methods: { diff --git a/src/views/permission/role.vue b/src/views/permission/role.vue index df7befa6..4e22e50f 100644 --- a/src/views/permission/role.vue +++ b/src/views/permission/role.vue @@ -21,19 +21,20 @@ </el-table> <el-dialog :visible.sync="dialogVisible" :title="dialogType==='edit'?'Edit Role':'New Role'"> - <el-form :model="role" label-width="80px" label-position="left" > + <el-form :model="role" label-width="80px" label-position="left"> <el-form-item label="Name"> - <el-input v-model="role.name" placeholder="Role Name"/> + <el-input v-model="role.name" placeholder="Role Name" /> </el-form-item> <el-form-item label="Desc"> <el-input v-model="role.description" :autosize="{ minRows: 2, maxRows: 4}" type="textarea" - placeholder="Role Description"/> + placeholder="Role Description" + /> </el-form-item> <el-form-item label="Menus"> - <el-tree ref="tree" :check-strictly="checkStrictly" :data="routesData" :props="defaultProps" show-checkbox node-key="path" class="permission-tree"/> + <el-tree ref="tree" :check-strictly="checkStrictly" :data="routesData" :props="defaultProps" show-checkbox node-key="path" class="permission-tree" /> </el-form-item> </el-form> <div style="text-align:right;"> diff --git a/src/views/qiniu/upload.vue b/src/views/qiniu/upload.vue index 9cb5eb09..5766c669 100644 --- a/src/views/qiniu/upload.vue +++ b/src/views/qiniu/upload.vue @@ -1,6 +1,6 @@ <template> <el-upload :data="dataObj" :multiple="true" :before-upload="beforeUpload" action="https://upload.qbox.me" drag> - <i class="el-icon-upload"/> + <i class="el-icon-upload" /> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> </el-upload> </template> @@ -10,7 +10,7 @@ import { getToken } from '@/api/qiniu' // 获取七牛token 后端通过Access Key,Secret Key,bucket等生成token // 七牛官方sdk https://developer.qiniu.com/sdk#official-sdk -export default{ +export default { data() { return { dataObj: { token: '', key: '' }, diff --git a/src/views/tab/components/tabPane.vue b/src/views/tab/components/tabPane.vue index e9ac20ac..1b6030c6 100644 --- a/src/views/tab/components/tabPane.vue +++ b/src/views/tab/components/tabPane.vue @@ -6,7 +6,8 @@ align="center" label="ID" width="65" - element-loading-text="请给我点时间!"> + element-loading-text="请给我点时间!" + > <template slot-scope="scope"> <span>{{ scope.row.id }}</span> </template> @@ -33,7 +34,7 @@ <el-table-column width="120px" label="Importance"> <template slot-scope="scope"> - <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star"/> + <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" /> </template> </el-table-column> @@ -45,7 +46,9 @@ <el-table-column class-name="status-col" label="Status" width="110"> <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> + <el-tag :type="scope.row.status | statusFilter"> + {{ scope.row.status }} + </el-tag> </template> </el-table-column> diff --git a/src/views/tab/index.vue b/src/views/tab/index.vue index 67936c0c..cce15d8a 100644 --- a/src/views/tab/index.vue +++ b/src/views/tab/index.vue @@ -1,11 +1,11 @@ <template> <div class="tab-container"> <el-tag>mounted times :{{ createdTimes }}</el-tag> - <el-alert :closable="false" style="width:200px;display:inline-block;vertical-align: middle;margin-left:30px;" title="Tab with keep-alive" type="success"/> + <el-alert :closable="false" style="width:200px;display:inline-block;vertical-align: middle;margin-left:30px;" title="Tab with keep-alive" type="success" /> <el-tabs v-model="activeName" style="margin-top:15px;" type="border-card"> - <el-tab-pane v-for="item in tabMapOptions" :label="item.label" :key="item.key" :name="item.key"> + <el-tab-pane v-for="item in tabMapOptions" :key="item.key" :label="item.label" :name="item.key"> <keep-alive> - <tab-pane v-if="activeName==item.key" :type="item.key" @create="showCreatedTimes"/> + <tab-pane v-if="activeName==item.key" :type="item.key" @create="showCreatedTimes" /> </keep-alive> </el-tab-pane> </el-tabs> diff --git a/src/views/table/complexTable.vue b/src/views/table/complexTable.vue index eb355e3b..a276df1a 100644 --- a/src/views/table/complexTable.vue +++ b/src/views/table/complexTable.vue @@ -1,15 +1,15 @@ <template> <div class="app-container"> <div class="filter-container"> - <el-input :placeholder="$t('table.title')" v-model="listQuery.title" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/> + <el-input v-model="listQuery.title" :placeholder="$t('table.title')" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" /> <el-select v-model="listQuery.importance" :placeholder="$t('table.importance')" clearable style="width: 90px" class="filter-item"> - <el-option v-for="item in importanceOptions" :key="item" :label="item" :value="item"/> + <el-option v-for="item in importanceOptions" :key="item" :label="item" :value="item" /> </el-select> <el-select v-model="listQuery.type" :placeholder="$t('table.type')" clearable class="filter-item" style="width: 130px"> - <el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name+'('+item.key+')'" :value="item.key"/> + <el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name+'('+item.key+')'" :value="item.key" /> </el-select> <el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> - <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key"/> + <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> </el-select> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('table.search') }}</el-button> <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate">{{ $t('table.add') }}</el-button> @@ -18,14 +18,15 @@ </div> <el-table - v-loading="listLoading" :key="tableKey" + v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%;" - @sort-change="sortChange"> + @sort-change="sortChange" + > <el-table-column :label="$t('table.id')" prop="id" sortable="custom" align="center" width="65"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> @@ -54,7 +55,7 @@ </el-table-column> <el-table-column :label="$t('table.importance')" width="80px"> <template slot-scope="scope"> - <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon"/> + <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon" /> </template> </el-table-column> <el-table-column :label="$t('table.readings')" align="center" width="95"> @@ -71,11 +72,14 @@ <el-table-column :label="$t('table.actions')" align="center" width="230" class-name="small-padding fixed-width"> <template slot-scope="scope"> <el-button type="primary" size="mini" @click="handleUpdate(scope.row)">{{ $t('table.edit') }}</el-button> - <el-button v-if="scope.row.status!='published'" size="mini" type="success" @click="handleModifyStatus(scope.row,'published')">{{ $t('table.publish') }} + <el-button v-if="scope.row.status!='published'" size="mini" type="success" @click="handleModifyStatus(scope.row,'published')"> + {{ $t('table.publish') }} </el-button> - <el-button v-if="scope.row.status!='draft'" size="mini" @click="handleModifyStatus(scope.row,'draft')">{{ $t('table.draft') }} + <el-button v-if="scope.row.status!='draft'" size="mini" @click="handleModifyStatus(scope.row,'draft')"> + {{ $t('table.draft') }} </el-button> - <el-button v-if="scope.row.status!='deleted'" size="mini" type="danger" @click="handleModifyStatus(scope.row,'deleted')">{{ $t('table.delete') }} + <el-button v-if="scope.row.status!='deleted'" size="mini" type="danger" @click="handleModifyStatus(scope.row,'deleted')"> + {{ $t('table.delete') }} </el-button> </template> </el-table-column> @@ -87,25 +91,25 @@ <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;"> <el-form-item :label="$t('table.type')" prop="type"> <el-select v-model="temp.type" class="filter-item" placeholder="Please select"> - <el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name" :value="item.key"/> + <el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" /> </el-select> </el-form-item> <el-form-item :label="$t('table.date')" prop="timestamp"> - <el-date-picker v-model="temp.timestamp" type="datetime" placeholder="Please pick a date"/> + <el-date-picker v-model="temp.timestamp" type="datetime" placeholder="Please pick a date" /> </el-form-item> <el-form-item :label="$t('table.title')" prop="title"> - <el-input v-model="temp.title"/> + <el-input v-model="temp.title" /> </el-form-item> <el-form-item :label="$t('table.status')"> <el-select v-model="temp.status" class="filter-item" placeholder="Please select"> - <el-option v-for="item in statusOptions" :key="item" :label="item" :value="item"/> + <el-option v-for="item in statusOptions" :key="item" :label="item" :value="item" /> </el-select> </el-form-item> <el-form-item :label="$t('table.importance')"> - <el-rate v-model="temp.importance" :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :max="3" style="margin-top:8px;"/> + <el-rate v-model="temp.importance" :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :max="3" style="margin-top:8px;" /> </el-form-item> <el-form-item :label="$t('table.remark')"> - <el-input :autosize="{ minRows: 2, maxRows: 4}" v-model="temp.remark" type="textarea" placeholder="Please input"/> + <el-input v-model="temp.remark" :autosize="{ minRows: 2, maxRows: 4}" type="textarea" placeholder="Please input" /> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> @@ -116,8 +120,8 @@ <el-dialog :visible.sync="dialogPvVisible" title="Reading statistics"> <el-table :data="pvData" border fit highlight-current-row style="width: 100%"> - <el-table-column prop="key" label="Channel"/> - <el-table-column prop="pv" label="Pv"/> + <el-table-column prop="key" label="Channel" /> + <el-table-column prop="pv" label="Pv" /> </el-table> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="dialogPvVisible = false">{{ $t('table.confirm') }}</el-button> diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index 50d17da4..97c1e815 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> <!-- Note that row-key is necessary to get a correct row order. --> - <el-table v-loading="listLoading" ref="dragTable" :data="list" row-key="id" border fit highlight-current-row style="width: 100%"> + <el-table ref="dragTable" v-loading="listLoading" :data="list" row-key="id" border fit highlight-current-row style="width: 100%"> <el-table-column align="center" label="ID" width="65"> <template slot-scope="scope"> @@ -29,7 +29,7 @@ <el-table-column width="100px" label="Importance"> <template slot-scope="scope"> - <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="icon-star"/> + <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="icon-star" /> </template> </el-table-column> @@ -47,7 +47,7 @@ <el-table-column align="center" label="Drag" width="80"> <template slot-scope="{}"> - <svg-icon class="drag-handler" icon-class="drag"/> + <svg-icon class="drag-handler" icon-class="drag" /> </template> </el-table-column> diff --git a/src/views/table/dynamicTable/fixedThead.vue b/src/views/table/dynamicTable/fixedThead.vue index 30dcee00..e4887a06 100644 --- a/src/views/table/dynamicTable/fixedThead.vue +++ b/src/views/table/dynamicTable/fixedThead.vue @@ -9,8 +9,8 @@ </el-checkbox-group> </div> - <el-table :data="tableData" :key="key" border fit highlight-current-row style="width: 100%"> - <el-table-column prop="name" label="fruitName" width="180"/> + <el-table :key="key" :data="tableData" border fit highlight-current-row style="width: 100%"> + <el-table-column prop="name" label="fruitName" width="180" /> <el-table-column v-for="fruit in formThead" :key="fruit" :label="fruit"> <template slot-scope="scope"> {{ scope.row[fruit] }} diff --git a/src/views/table/dynamicTable/index.vue b/src/views/table/dynamicTable/index.vue index 3c16bc46..56eac980 100644 --- a/src/views/table/dynamicTable/index.vue +++ b/src/views/table/dynamicTable/index.vue @@ -1,10 +1,10 @@ <template> <div class="app-container"> <div style="margin:0 0 5px 20px">{{ $t('table.dynamicTips1') }}</div> - <fixed-thead/> + <fixed-thead /> <div style="margin:30px 0 5px 20px">{{ $t('table.dynamicTips2') }}</div> - <unfixed-thead/> + <unfixed-thead /> </div> </template> diff --git a/src/views/table/dynamicTable/unfixedThead.vue b/src/views/table/dynamicTable/unfixedThead.vue index caa97506..d7f1bbcf 100644 --- a/src/views/table/dynamicTable/unfixedThead.vue +++ b/src/views/table/dynamicTable/unfixedThead.vue @@ -10,7 +10,7 @@ </div> <el-table :data="tableData" border fit highlight-current-row style="width: 100%"> - <el-table-column prop="name" label="fruitName" width="180"/> + <el-table-column prop="name" label="fruitName" width="180" /> <el-table-column v-for="fruit in formThead" :key="fruit" :label="fruit"> <template slot-scope="scope"> {{ scope.row[fruit] }} diff --git a/src/views/table/inlineEditTable.vue b/src/views/table/inlineEditTable.vue index 78800ce5..3f1e1611 100644 --- a/src/views/table/inlineEditTable.vue +++ b/src/views/table/inlineEditTable.vue @@ -23,7 +23,7 @@ <el-table-column width="100px" label="Importance"> <template slot-scope="scope"> - <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon"/> + <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon" /> </template> </el-table-column> @@ -36,7 +36,7 @@ <el-table-column min-width="300px" label="Title"> <template slot-scope="scope"> <template v-if="scope.row.edit"> - <el-input v-model="scope.row.title" class="edit-input" size="small"/> + <el-input v-model="scope.row.title" class="edit-input" size="small" /> <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(scope.row)">cancel</el-button> </template> <span v-else>{{ scope.row.title }}</span> diff --git a/src/views/theme/index.vue b/src/views/theme/index.vue index 9eec5f01..906b0b18 100644 --- a/src/views/theme/index.vue +++ b/src/views/theme/index.vue @@ -8,7 +8,7 @@ </div> <div class="box-item"> <span class="field-label">{{ $t('theme.change') }} : </span> - <el-switch v-model="theme"/> + <el-switch v-model="theme" /> <code style="margin-top:15px;">{{ $t('theme.tips') }}</code> </div> </el-card> @@ -22,18 +22,18 @@ </div> <div class="block"> - <el-button type="primary" icon="el-icon-edit"/> - <el-button type="primary" icon="el-icon-share"/> - <el-button type="primary" icon="el-icon-delete"/> + <el-button type="primary" icon="el-icon-edit" /> + <el-button type="primary" icon="el-icon-share" /> + <el-button type="primary" icon="el-icon-delete" /> <el-button type="primary" icon="el-icon-search">Search</el-button> <el-button type="primary"> Upload - <i class="el-icon-upload el-icon-right"/> + <i class="el-icon-upload el-icon-right" /> </el-button> </div> <div class="block"> - <el-tag v-for="tag in tags" :type="tag.type" :key="tag.type" class="tag-item"> + <el-tag v-for="tag in tags" :key="tag.type" :type="tag.type" class="tag-item"> {{ tag.name }} </el-tag> </div> @@ -47,7 +47,7 @@ </div> <div class="block"> - <el-slider v-model="slideValue"/> + <el-slider v-model="slideValue" /> </div> </div> diff --git a/src/views/tree-table/custom/index.vue b/src/views/tree-table/custom/index.vue index 11e47912..9c4930a2 100644 --- a/src/views/tree-table/custom/index.vue +++ b/src/views/tree-table/custom/index.vue @@ -13,11 +13,11 @@ :columns="columns" border default-children="children" - @selection-change ="selectChange" + @selection-change="selectChange" > <template slot="selection"> - <el-table-column type="selection" align="center" width="55"/> + <el-table-column type="selection" align="center" width="55" /> </template> <template slot="pre-column"> @@ -38,8 +38,9 @@ :style="{ width:(scope.row.timeLine||0) * 3+'px', background:scope.row.timeLine>50?'rgba(233,0,0,.5)':'rgba(0,0,233,0.5)', marginLeft:scope.row._level * 50+'px' }" - class="process"> - <span style="display:inline-block"/> + class="process" + > + <span style="display:inline-block" /> </div> </div> </el-tooltip> @@ -70,7 +71,7 @@ <el-dialog :visible.sync="dialogFormVisible" title="Edit"> <el-form :model="tempItem" label-width="100px" style="width:600px"> <el-form-item label="Name"> - <el-input v-model.trim="tempItem.name" placeholder="Name"/> + <el-input v-model.trim="tempItem.name" placeholder="Name" /> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> diff --git a/src/views/tree-table/index.vue b/src/views/tree-table/index.vue index 2e131157..ade9f4f3 100644 --- a/src/views/tree-table/index.vue +++ b/src/views/tree-table/index.vue @@ -13,7 +13,8 @@ v-model="defaultExpandAll" active-color="#13ce66" inactive-color="#ff4949" - @change="reset"/> + @change="reset" + /> </div> <div class="option-item"> diff --git a/src/views/zip/index.vue b/src/views/zip/index.vue index 42f0efe6..11ce77b7 100644 --- a/src/views/zip/index.vue +++ b/src/views/zip/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> <!-- $t is vue-i18n global function to translate lang --> - <el-input :placeholder="$t('zip.placeholder')" v-model="filename" style="width:300px;" prefix-icon="el-icon-document"/> + <el-input v-model="filename" :placeholder="$t('zip.placeholder')" style="width:300px;" prefix-icon="el-icon-document" /> <el-button :loading="downloadLoading" style="margin-bottom:20px;" type="primary" icon="document" @click="handleDownload">{{ $t('zip.export') }} zip</el-button> <el-table v-loading="listLoading" :data="list" element-loading-text="拼命加载中" border fit highlight-current-row> <el-table-column align="center" label="ID" width="95"> @@ -26,7 +26,7 @@ </el-table-column> <el-table-column align="center" label="Date" width="220"> <template slot-scope="scope"> - <i class="el-icon-time"/> + <i class="el-icon-time" /> <span>{{ scope.row.display_time }}</span> </template> </el-table-column> From e601da38d0791b3ec115741dea7e763a1e75ed35 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 18 Mar 2019 15:56:43 +0800 Subject: [PATCH 073/202] fix[Excel]: fixed export merge-header excel bug --- src/vendor/Export2Excel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vendor/Export2Excel.js b/src/vendor/Export2Excel.js index 3fda4465..3a2e8aed 100644 --- a/src/vendor/Export2Excel.js +++ b/src/vendor/Export2Excel.js @@ -158,8 +158,8 @@ export function export_json_to_excel({ data = [...data] data.unshift(header); - for (let header of multiHeader) { - data.unshift(header) + for (let i = multiHeader.length-1; i > -1; i--) { + data.unshift(multiHeader[i]) } var ws_name = "SheetJS"; From d1f32a05a8e9c2f4fb8a83b0cb2660b8a5d19eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 19 Mar 2019 10:18:04 +0800 Subject: [PATCH 074/202] fix[HeaderSearch]: fixed bug in vue2.6+ (#1733) --- src/components/HeaderSearch/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 2227a93e..c4276d96 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -1,6 +1,6 @@ <template> <div :class="{'show':show}" class="header-search"> - <svg-icon class-name="search-icon" icon-class="search" @click="click" /> + <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" /> <el-select ref="headerSearchSelect" v-model="search" From abb1d91a9eac0d0523ac1e6f8dc091b0ed9ff65d Mon Sep 17 00:00:00 2001 From: Mrli2016 <mrli2016@126.com> Date: Tue, 19 Mar 2019 10:31:12 +0800 Subject: [PATCH 075/202] fix[Sticky]: fixed bug when set stickyTop --- src/components/Sticky/index.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Sticky/index.vue b/src/components/Sticky/index.vue index 5624a989..fa165bc7 100644 --- a/src/components/Sticky/index.vue +++ b/src/components/Sticky/index.vue @@ -1,6 +1,9 @@ <template> <div :style="{height:height+'px',zIndex:zIndex}"> - <div :class="className" :style="{top:stickyTop+'px',zIndex:zIndex,position:position,width:width,height:height+'px'}"> + <div + :class="className" + :style="{top:(isSticky ? stickyTop +'px' : ''),zIndex:zIndex,position:position,width:width,height:height+'px'}" + > <slot> <div>sticky</div> </slot> From 715fe3e6841ef19cc36e26895e336adbbdb94db6 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 19 Mar 2019 10:36:50 +0800 Subject: [PATCH 076/202] perf[Sticky]: refine demo --- src/views/components-demo/sticky.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/components-demo/sticky.vue b/src/views/components-demo/sticky.vue index 618f383e..c49b089d 100644 --- a/src/views/components-demo/sticky.vue +++ b/src/views/components-demo/sticky.vue @@ -49,7 +49,9 @@ <div>placeholder</div> <div>placeholder</div> <div>placeholder</div> - <div>placeholder</div> + <sticky :sticky-top="200"> + <el-button type="primary"> placeholder</el-button> + </sticky> <div>placeholder</div> <div>placeholder</div> <div>placeholder</div> From ccb227fbec5c72e8182097078de759860a8f1570 Mon Sep 17 00:00:00 2001 From: toruksmakto <42709228+toruksmakto@users.noreply.github.com> Date: Tue, 19 Mar 2019 18:33:59 +0800 Subject: [PATCH 077/202] fix[Excel]: fixed export bug (#1736) --- src/vendor/Export2Excel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vendor/Export2Excel.js b/src/vendor/Export2Excel.js index 3a2e8aed..20784f3a 100644 --- a/src/vendor/Export2Excel.js +++ b/src/vendor/Export2Excel.js @@ -145,11 +145,11 @@ export function export_table_to_excel(id) { } export function export_json_to_excel({ - multiHeader, + multiHeader = [], header, data, filename, - merges, + merges = [], autoWidth = true, bookType= 'xlsx' } = {}) { From 63dba8b7d89c63b012afdd0a3b387ba32a53fd35 Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Thu, 21 Mar 2019 11:04:33 +0800 Subject: [PATCH 078/202] perf[ThemePicker]: add predefine (#1743) --- src/components/ThemePicker/index.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index be3a573a..f6784710 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -1,6 +1,7 @@ <template> <el-color-picker v-model="theme" + :predefine="['#409EFF', '#11a983', '#13c2c2', '#6959CD', '#f5222d', '#eb2f96', '#DB7093', '#e6a23c', '#8B8989', '#212121']" class="theme-picker" popper-class="theme-picker-dropdown" /> From ae6bbf78584a0f61477ed941674812177f525253 Mon Sep 17 00:00:00 2001 From: Yuga Sun <yuga_sun@163.com> Date: Thu, 21 Mar 2019 15:14:15 +0800 Subject: [PATCH 079/202] fix[Utils]: fixed deepClone error msg (#1748) --- src/utils/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/index.js b/src/utils/index.js index ebe58ff8..1df0f45d 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -274,7 +274,7 @@ export function debounce(func, wait, immediate) { */ export function deepClone(source) { if (!source && typeof source !== 'object') { - throw new Error('error arguments', 'shallowClone') + throw new Error('error arguments', 'deepClone') } const targetObj = source.constructor === Array ? [] : {} Object.keys(source).forEach(keys => { From 3100d0cff4831aa1efed60cf7686c53a229a3d10 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 22 Mar 2019 15:11:22 +0800 Subject: [PATCH 080/202] fix[Sidebar]: fixed v-if meta bug --- src/views/layout/components/Sidebar/SidebarItem.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue index 9664ffb6..42c167fa 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/views/layout/components/Sidebar/SidebarItem.vue @@ -2,9 +2,9 @@ <div v-if="!item.hidden" class="menu-wrapper"> <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> - <app-link :to="resolvePath(onlyOneChild.path)"> + <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> - <item v-if="onlyOneChild.meta" :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="generateTitle(onlyOneChild.meta.title)" /> + <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="generateTitle(onlyOneChild.meta.title)" /> </el-menu-item> </app-link> </template> From fb300794779b8017f04b2d28ea95d824a206d85c Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 25 Mar 2019 18:04:14 +0800 Subject: [PATCH 081/202] docs --- README.md | 2 ++ README.zh-CN.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index bf0e08be..21c1cd0b 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ English | [简体中文](./README.zh-CN.md) It is a magical vue admin based on the newest development stack of vue, built-in i18n solution, typical templates for enterprise applications, lots of awesome features. It helps you build a large complex Single-Page Applications. I believe whatever your needs are, this project will help you. +** [v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) has in beta. It built on vue-cli, optimized a lot of code, and added a lot of new features. Welcome to use and make suggestions. ** + - [Preview](http://panjiachen.github.io/vue-element-admin) - [Documentation](https://panjiachen.github.io/vue-element-admin-site/) diff --git a/README.zh-CN.md b/README.zh-CN.md index 5dc9f1d7..310095f1 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -32,6 +32,8 @@ [vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 +**[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) 已经进入 beta 测试阶段。 它基于vue-cli进行构建,优化了大量代码尤其是权限和mock这快,并且增加了不少新特性。欢迎使用并提出建议。** + - [在线访问](http://panjiachen.github.io/vue-element-admin) - [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/) From f890685d8d36eccf8774bae998d4dc389d477a5b Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 25 Mar 2019 18:39:54 +0800 Subject: [PATCH 082/202] docs --- README.md | 2 +- README.zh-CN.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 21c1cd0b..5f26a357 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ English | [简体中文](./README.zh-CN.md) It is a magical vue admin based on the newest development stack of vue, built-in i18n solution, typical templates for enterprise applications, lots of awesome features. It helps you build a large complex Single-Page Applications. I believe whatever your needs are, this project will help you. -** [v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) has in beta. It built on vue-cli, optimized a lot of code, and added a lot of new features. Welcome to use and make suggestions. ** +**[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) has in beta. It built on vue-cli@3, optimized a lot of code and added a lot of new features. Welcome to use and make suggestions.** - [Preview](http://panjiachen.github.io/vue-element-admin) diff --git a/README.zh-CN.md b/README.zh-CN.md index 310095f1..b1fa5c9f 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -32,7 +32,7 @@ [vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 -**[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) 已经进入 beta 测试阶段。 它基于vue-cli进行构建,优化了大量代码尤其是权限和mock这快,并且增加了不少新特性。欢迎使用并提出建议。** +**[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) 已经进入 beta 测试阶段。 它基于 vue-cli@3 进行构建,优化了大量代码(尤其是权限和 mock),并且增加了不少新特性。欢迎使用并提出建议。** - [在线访问](http://panjiachen.github.io/vue-element-admin) @@ -54,7 +54,7 @@ - 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescript版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) -群主 **[圈子](https://jianshiapp.com/circles/1209)** 楼主会经常分享一些技术相关的东西,或者加入[qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602) +群主 **[圈子](https://jianshiapp.com/circles/1209)** 楼主会经常分享一些技术相关的东西,或者加入[qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602)或者关注[微博](https://weibo.com/u/3423485724?is_all=1) **注意:该项目使用 element-ui@2.3.0+ 版本,所以最低兼容 vue@2.5.0+** From 331173ffee0601073e228383926aaffa43ef28b7 Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Tue, 26 Mar 2019 12:59:31 +0800 Subject: [PATCH 083/202] perf[Css]: fixed typo (#1776) --- src/views/login/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 352df494..d74e027a 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -201,7 +201,7 @@ export default { height: 47px; caret-color: $cursor; &:-webkit-autofill { - -webkit-box-shadow: 0 0 0px 1000px $bg inset !important; + box-shadow: 0 0 0px 1000px $bg inset !important; -webkit-text-fill-color: $cursor !important; } } From 9d975b5effe7a9718f17f15e235889df363e6e8d Mon Sep 17 00:00:00 2001 From: sun ao <sunao_0626@hotmail.com> Date: Wed, 27 Mar 2019 13:31:34 +0800 Subject: [PATCH 084/202] fix[Mock]: add xhr.responseType (#1779) --- src/mock/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mock/index.js b/src/mock/index.js index f22c762f..a6ab5f14 100644 --- a/src/mock/index.js +++ b/src/mock/index.js @@ -11,6 +11,7 @@ Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { this.custom.xhr.withCredentials = this.withCredentials || false + this.custom.xhr.responseType = this.responseType } this.proxy_send(...arguments) } From 9a5c404ef8d1b24856f5a48266d0545895c253d2 Mon Sep 17 00:00:00 2001 From: zhu yu <codeyu@gmail.com> Date: Wed, 27 Mar 2019 16:18:30 +0900 Subject: [PATCH 085/202] docs: fix typo (#1782) i18 -> i18n --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index b1fa5c9f..18d4aca3 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -30,7 +30,7 @@ ## 简介 -[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 +[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 **[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) 已经进入 beta 测试阶段。 它基于 vue-cli@3 进行构建,优化了大量代码(尤其是权限和 mock),并且增加了不少新特性。欢迎使用并提出建议。** From 77030050135b2483890bf4ed2ee636254477dee3 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 28 Mar 2019 11:43:36 +0800 Subject: [PATCH 086/202] perf: remove redundant code --- src/views/example/list.vue | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/views/example/list.vue b/src/views/example/list.vue index 59f6ee6e..e90d3443 100644 --- a/src/views/example/list.vue +++ b/src/views/example/list.vue @@ -94,14 +94,6 @@ export default { this.total = response.data.total this.listLoading = false }) - }, - handleSizeChange(val) { - this.listQuery.limit = val - this.getList() - }, - handleCurrentChange(val) { - this.listQuery.page = val - this.getList() } } } From 20f61507419283a812042122c2d3bb4946f81075 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 28 Mar 2019 14:15:32 +0800 Subject: [PATCH 087/202] [release] 3.11.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d2748c5a..86c334f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-admin", - "version": "3.10.0", + "version": "3.11.0", "description": "A magical vue admin. Typical templates for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", From 96d3cfa2158235ae9ad7d1977f8956a5647792e5 Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Fri, 29 Mar 2019 12:55:07 +0800 Subject: [PATCH 088/202] perf[Login]: optimize input focus interaction (#1798) --- src/views/login/index.vue | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index d74e027a..1d43a2ab 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -13,6 +13,7 @@ <svg-icon icon-class="user" /> </span> <el-input + ref="username" v-model="loginForm.username" :placeholder="$t('login.username')" name="username" @@ -26,6 +27,7 @@ <svg-icon icon-class="password" /> </span> <el-input + ref="password" v-model="loginForm.password" :type="passwordType" :placeholder="$t('login.password')" @@ -96,7 +98,7 @@ export default { return { loginForm: { username: 'admin', - password: '1111111' + password: '111111' }, loginRules: { username: [{ required: true, trigger: 'blur', validator: validateUsername }], @@ -119,6 +121,13 @@ export default { created() { // window.addEventListener('hashchange', this.afterQRScan) }, + mounted() { + if (this.loginForm.username === '') { + this.$refs.username.focus() + } else if (this.loginForm.password === '') { + this.$refs.password.focus() + } + }, destroyed() { // window.removeEventListener('hashchange', this.afterQRScan) }, @@ -129,6 +138,9 @@ export default { } else { this.passwordType = 'password' } + this.$nextTick(() => { + this.$refs.password.focus() + }) }, handleLogin() { this.$refs.loginForm.validate(valid => { From b94e69be6f9a5cb42741c77c5039bdf7eb155add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 1 Apr 2019 17:07:16 +0800 Subject: [PATCH 089/202] [release] 4.0.0 (#1291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[ExternalLink]: fixed bug when url include chinese #1182 * feature: support Spanish(#1196) * fix[MockJS]: fix bug with withCredentials after using mockjs (#1194) * 修复 Mock 导致请求丢失 Cookie 的问题 修复 Mock 导致 Cookie 丢失的问题,只有在 XHR.open() 周期时,自定义的 withCredentials 会被挂载,此时检查是否是未被拦截的 xhr,并挂载自定义的 withCredentials ,无则默认为 false * update readme * perf[tagsView]: refactor the moveToTarget function (#1195) * fix[tagsView]:fixed visited view move to currentTag * edit the scroll regular friendly * tweak * fix[tagsView]: fixed moveToCurrentTag bug * feature: add pagination component (#1213) * fix[TagsView]: fixed update tags title demo bug (#1223) * chore: temporary hack cssnano bug #1222 * [release] 3.9.2 * chore: restore the hack of cssnano bug https://github.com/cssnano/cssnano/issues/643 * add an example of sort data by table (#1236) * feature: add drag select component (#1249) * feat: perfect migrate to @vue/cli-service, upgrade vue babel version (#1267) * feat: perfect migrate to @vue/cli-service, upgrade vue babel version 1. update to @vue/cli-service@3.0.5, @babel/core@7.0.0 2. use vue-cli service replace config file in build/ and config/ 3. upgrade vue and babel configuration 4. solve the svg-sprite config problem #980 refs: #932 #1087 #980 #1056 * fix: fix breadcrumb dependency * fix: fix index template and static assets load with vue-cli 3 * fix: fix import driver.js in guide page * refactor(mock): mak mock api compatible with both web-view and webpack server 1. 把 Mockjs 功能移到 server 端中间件,同时也兼容前端直接劫持 XHR 2. dev 环境下默认作为 express 中间件通过 webpack server 提供 mock api 3. prod 构建时,默认在前端用 Mockjs 劫持 XHR benefits: - dev 开发调试时能直接看到 XHR 请求,方便调试网络,能和后端对接联调 - 避开在开发时因为 Mockjs 引起的网络 bug - prod 构建时劫持 XHR,保证本项目的 Github Pages preview 能正常显示 (逻辑和 error-log 一样) - 前后台使用的 mock 是同一份代码,不会增加维护负担 ref: [#562](https://github.com/PanJiaChen/vue-element-admin/issues/562#issuecomment-378116233) * update requires the lowest version of node * add favicon * fix(TreeTable): fix `Array.prototype.concat` on custom-tree-table page * update * add test * fix bug * fix[Charts]: fixed charts resize mixins bug #1285 (#1290) * perf[Tinymce]: add searchreplace plugin * perf[avatar]:minimize the selected area of avatar on the mobile phone when user clicked avatar (#1304) * refine css * fix[DragSelect]: fixed querySelectorAll bug * perf[DragSelect]: add $listeners * fix link * fix[Breadcurmb]: fixed pathCompile bug * fix[Breadcurmb]: fixed router-link bug * perf[style]: use webpack alias instead of hard code src path (#1338) * perf[style]: use webpack alias instead of hard code src path * add sponsors * fix import path bug * update vue-router to fixed url path for non ascii urls #1362 * fix[Pagination]: apply PageSizes property to el-pagination (#1355) Apply PageSizes property to el-pagination * update dependence * add tui.editor (#1374) * tweak * add preview * fix return back bug * update guide page * fix[Tinymce]: fixed fullScreen bug #1400 * feat[Breadcrumb]: add hide Breadcrumb option #1442 * perf: use WeChat 7.0 new version icon color * refactor[login]: refactor login page style * perf[ScrollPane]: refine moveToTarget code (#1460) * feature[PDF]: add PDF demo (#1469) * perf[v-permission]: refine v-permission demo * perf[Sidebar]: refine sidebar store #1473 (#1474) * refine: GetUserInfo error message * fix typo (#1505) * perf: add sidebar width to variables.scss (#1494) * tweak * fix[ThemePicker]: fixed bug when oldVal is null (#1517) * update README.md * fix[Breadcrumb]: fixed eslint error (#1521) * fix[DndList]: fixed drag bug (#1527) https://github.com/PanJiaChen/vue-element-admin/issues/1524 * pref[Hamburger]: refactor Hamburger component (#1528) * 美化侧栏菜单切换按钮 * tweak * perf[Login Form]: optimize eye icon style (#1545) * optimiz: eye icon style for login form * change eye-open svg * perf[Sticky]: export reset method (#1550) * perf[Sticky]: refine width default value * perf[utils]: refine parseTime function (#1546) * 优化 parseTime 修复传入的时间戳是字符串类型,不能转换时间的问题 例:parseTime("1548221490638") * Update index.js * perf[UploadExcel]: optimized code (#1552) * perf: adjust the import order to make it more elegant #1537 * perf[Sidebar]: use sass variables in vue template * perf[Style]: optimize the sidebar style to make it better to set (#1568) * perf[SizeSelect]: add default size option (#1566) * fix[SIdebar]: fixed bug in mobile #1567 (#1569) * perf: fixed eslint errors * perf[Lang]: make up for miss keywords * perf: optimize some code * perf[Navbar]: refactor navbar style * perf[Login]: refine css * feature[Navbar]: add header-search component(#1591) * fix[Screenfull]: fix screenfull click bug * perf[Screenfull]: refactor screenfull component * fix[Screenfull]: fix screenfull bug (#1603) * fix typo * fearure[TagsView]: add affix option (#1577) * perf[utils]: optimize code * perf[utils]: optimizate variable name * perf[Navbar]: add scroll bar when the subMenu is too long (#1619) * perf[ThemePicker]: refine updateStyle function (#554) * theme replacing should cut tons of irrelevant css * perf[ResizeHandler]: optimized the judgment of isMobile (#1633) perf[ResizeHandler]: optimized the judgment of isMobile * fix[Sidebar]: fixed infinite loop bug(#1333) * fixed infinite loop Bug when in hasOneShowingChild Edit the onlyOneChild * tweak * fix[Sidebar]: data should return a object * perf[Sidebar]: optimize code logic (#1349) * fix[TagsView]: fixed refresh affixed-tag bug (#1653) * perf[utils.js]: refactor byteLength function (#1650) * perf[TagsView]: refine code * perf[TagsView]: set the scrollPane as a business component (#1660) * fix[DragTable]: support multiple drag-table (#1666) * perf[Tree-Table]: refactor tree-table * perf[Tree-Table]: organize the structure and add documentation (#1673) * fix[Sidebar]: fixed nested router hover bug * update version * set preserveWhitespace * lint code * fix jest test case * update config * bump * remove empty file * docs: add link * fix[Sidebar]: fixed collapse animation problem (#1690) * fix[Tree-Table]: fixed update item data bug (#1692) * fix[Waves-Directive]: fixed v-waves does not support update (#1705) * update husky * rm cli-plugin-eslint * add settings (#1707) * refine settings * fix[utils]: fixed param2Obj not decoding plus sign (#1712) * feature[Directive]: add auto-height table directive (#1702) * fix bug * feature[Permission]: add role permission management page (#1605) * feature[Excel]: support export merged header export (#1718) * feature[Excel]: add export merge header excel demo * lint * refine theme color * add role mock * tweak mock * fix[Excel]: fixed export merge-header excel bug * refine code * add ThemePicker to setting * fix[HeaderSearch]: fixed bug in vue2.6+ (#1733) * fix[Sticky]: fixed bug when set stickyTop * perf[Sticky]: refine demo * refine code * tweak mock * vuex add namespaced * fix[Excel]: fixed export bug (#1736) * rm * refactor permission * perf[ThemePicker]: add predefine (#1743) * fix[Utils]: fixed deepClone error msg (#1748) * feature: add fixedHeader settings * fix style in mobile * fix chore * perf[Eslint]: update eslint rules * feature: add create template (#1762) * add comment * update vue.config.js * feature: add sidebar logo (#1767) * rm * perf settings * bump * refine script and css * update * refine settings * refine config * update docs * refine * rm * fix jest * add theme setting * dump vue-cli * perf: remove redundant code * update element-ui * fix sticky demo bug * docs * fixed password input bug * refine login form css * remove tree-table * update version * mock error * refine layout name * refine --- .babelrc | 17 - .env.development | 14 + .env.production | 6 + .env.staging | 8 + .eslintignore | 3 +- .eslintrc.js | 3 +- .gitignore | 6 +- .postcssrc.js | 2 - README.md | 51 +- README.zh-CN.md | 63 +-- babel.config.js | 5 + build/build.js | 67 --- build/check-versions.js | 64 --- build/index.js | 35 ++ build/logo.png | Bin 6849 -> 0 bytes build/utils.js | 108 ---- build/vue-loader.conf.js | 5 - build/webpack.base.conf.js | 107 ---- build/webpack.dev.conf.js | 98 ---- build/webpack.prod.conf.js | 187 ------- config/dev.env.js | 5 - config/index.js | 88 --- config/prod.env.js | 5 - config/sit.env.js | 5 - jest.config.js | 27 + mock/article.js | 116 ++++ mock/index.js | 54 ++ mock/mocks.js | 12 + mock/remoteSearch.js | 51 ++ mock/role/index.js | 98 ++++ mock/role/routes.js | 525 ++++++++++++++++++ mock/user.js | 84 +++ package.json | 148 +++-- plop-templates/component/index.hbs | 26 + plop-templates/component/prompt.js | 55 ++ plop-templates/utils.js | 9 + plop-templates/view/index.hbs | 26 + plop-templates/view/prompt.js | 55 ++ plopfile.js | 7 + favicon.ico => public/favicon.ico | Bin index.html => public/index.html | 5 +- .../static}/tinymce4.7.5/langs/zh_CN.js | 0 .../plugins/codesample/css/prism.css | 0 .../plugins/emoticons/img/smiley-cool.gif | Bin .../plugins/emoticons/img/smiley-cry.gif | Bin .../emoticons/img/smiley-embarassed.gif | Bin .../emoticons/img/smiley-foot-in-mouth.gif | Bin .../plugins/emoticons/img/smiley-frown.gif | Bin .../plugins/emoticons/img/smiley-innocent.gif | Bin .../plugins/emoticons/img/smiley-kiss.gif | Bin .../plugins/emoticons/img/smiley-laughing.gif | Bin .../emoticons/img/smiley-money-mouth.gif | Bin .../plugins/emoticons/img/smiley-sealed.gif | Bin .../plugins/emoticons/img/smiley-smile.gif | Bin .../emoticons/img/smiley-surprised.gif | Bin .../emoticons/img/smiley-tongue-out.gif | Bin .../emoticons/img/smiley-undecided.gif | Bin .../plugins/emoticons/img/smiley-wink.gif | Bin .../plugins/emoticons/img/smiley-yell.gif | Bin .../plugins/visualblocks/css/visualblocks.css | 0 .../skins/lightgray/content.inline.min.css | 0 .../skins/lightgray/content.min.css | 0 .../skins/lightgray/fonts/tinymce-mobile.woff | Bin .../skins/lightgray/fonts/tinymce-small.eot | Bin .../skins/lightgray/fonts/tinymce-small.svg | 0 .../skins/lightgray/fonts/tinymce-small.ttf | Bin .../skins/lightgray/fonts/tinymce-small.woff | Bin .../skins/lightgray/fonts/tinymce.eot | Bin .../skins/lightgray/fonts/tinymce.svg | 0 .../skins/lightgray/fonts/tinymce.ttf | Bin .../skins/lightgray/fonts/tinymce.woff | Bin .../skins/lightgray/img/anchor.gif | Bin .../skins/lightgray/img/loader.gif | Bin .../skins/lightgray/img/object.gif | Bin .../skins/lightgray/img/trans.gif | Bin .../tinymce4.7.5/skins/lightgray/skin.min.css | 0 .../skins/lightgray/skin.min.css.map | 0 .../static}/tinymce4.7.5/tinymce.min.js | 0 src/api/remoteSearch.js | 10 +- src/api/role.js | 20 +- src/api/transaction.js | 9 - src/api/{login.js => user.js} | 24 +- src/components/BackToTop/index.vue | 42 +- src/components/Breadcrumb/index.vue | 26 +- src/components/DndList/index.vue | 14 +- src/components/Dropzone/index.vue | 2 +- src/components/ErrorLog/index.vue | 13 +- src/components/Hamburger/index.vue | 9 +- src/components/HeaderSearch/index.vue | 2 + src/components/Kanban/index.vue | 2 +- src/components/LangSelect/index.vue | 2 +- src/components/MDinput/index.vue | 2 +- src/components/RightPanel/index.vue | 152 +++++ src/components/Screenfull/index.vue | 15 +- src/components/Share/dropdownMenu.vue | 2 +- src/components/SizeSelect/index.vue | 7 +- src/components/ThemePicker/index.vue | 79 +-- .../Tinymce/components/editorImage.vue | 14 +- src/components/TreeTable/README.md | 220 -------- src/components/TreeTable/eval.js | 48 -- src/components/TreeTable/index.vue | 193 ------- src/components/TreeTable/readme.md | 220 -------- src/components/Upload/singleImage.vue | 8 +- src/components/Upload/singleImage2.vue | 6 +- src/components/Upload/singleImage3.vue | 6 +- src/components/UploadExcel/index.vue | 4 +- src/directive/waves/waves.js | 13 +- src/errorLog.js | 19 - src/lang/en.js | 9 +- src/lang/es.js | 9 +- src/lang/zh.js | 9 +- src/{views => }/layout/components/AppMain.vue | 21 +- src/{views => }/layout/components/Navbar.vue | 22 +- src/layout/components/Settings/index.vue | 108 ++++ .../layout/components/Sidebar/FixiOSBug.js | 0 .../layout/components/Sidebar/Item.vue | 0 .../layout/components/Sidebar/Link.vue | 0 src/layout/components/Sidebar/Logo.vue | 82 +++ .../layout/components/Sidebar/SidebarItem.vue | 2 - src/layout/components/Sidebar/index.vue | 44 ++ .../layout/components/TagsView/ScrollPane.vue | 2 +- .../layout/components/TagsView/index.vue | 35 +- src/{views => }/layout/components/index.js | 1 + src/layout/index.vue | 102 ++++ src/{views => }/layout/mixin/ResizeHandler.js | 13 +- src/main.js | 10 +- src/mock/article.js | 70 --- src/mock/index.js | 48 -- src/mock/login.js | 34 -- src/mock/remoteSearch.js | 24 - src/mock/role.js | 61 -- src/mock/transaction.js | 23 - src/permission.js | 82 ++- src/router/index.js | 38 +- src/router/modules/charts.js | 2 +- src/router/modules/components.js | 2 +- src/router/modules/nested.js | 2 +- src/router/modules/table.js | 2 +- src/router/modules/tree-table.js | 29 - src/settings.js | 37 ++ src/store/getters.js | 2 - src/store/index.js | 2 + src/store/modules/app.js | 105 ++-- src/store/modules/errorLog.js | 34 +- src/store/modules/permission.js | 56 +- src/store/modules/settings.js | 32 ++ src/store/modules/tagsView.js | 299 +++++----- src/store/modules/user.js | 258 ++++----- src/styles/element-variables.scss | 31 ++ src/styles/sidebar.scss | 12 + src/styles/transition.scss | 2 +- src/utils/errorLog.js | 35 ++ src/utils/index.js | 19 +- src/utils/request.js | 66 +-- src/utils/validate.js | 27 +- src/views/clipboard/index.vue | 8 +- src/views/components-demo/countTo.vue | 14 +- src/views/components-demo/dragDialog.vue | 4 +- src/views/components-demo/dragKanban.vue | 10 +- src/views/components-demo/dragSelect.vue | 6 +- src/views/components-demo/jsonEditor.vue | 6 +- src/views/components-demo/markdown.vue | 57 +- src/views/components-demo/mixin.vue | 32 +- src/views/components-demo/sticky.vue | 6 +- src/views/components-demo/tinymce.vue | 1 - .../dashboard/admin/components/BoxCard.vue | 4 +- .../dashboard/admin/components/PanelGroup.vue | 18 +- .../admin/components/TransactionTable.vue | 4 +- src/views/dashboard/admin/index.vue | 4 +- src/views/dashboard/editor/index.vue | 2 +- src/views/documentation/index.vue | 2 +- src/views/errorPage/401.vue | 18 +- src/views/errorPage/404.vue | 18 +- .../example/components/ArticleDetail.vue | 17 +- src/views/example/list.vue | 11 +- .../excel/components/AutoWidthOption.vue | 8 +- src/views/excel/exportExcel.vue | 5 +- src/views/excel/selectExcel.vue | 4 +- src/views/guide/index.vue | 4 +- src/views/i18n-demo/index.vue | 42 +- src/views/layout/Layout.vue | 71 --- src/views/layout/components/Sidebar/index.vue | 37 -- src/views/login/authredirect.vue | 11 +- src/views/login/index.vue | 149 ++--- src/views/login/socialsignin.vue | 2 +- src/views/pdf/download.vue | 7 +- src/views/pdf/index.vue | 4 +- .../permission/components/SwitchRoles.vue | 6 +- src/views/permission/directive.vue | 26 +- src/views/permission/role.vue | 37 +- src/views/qiniu/upload.vue | 4 +- src/views/svg-icons/index.vue | 2 +- src/views/tab/components/tabPane.vue | 2 - src/views/table/complexTable.vue | 35 +- src/views/table/dragTable.vue | 34 +- src/views/table/dynamicTable/fixedThead.vue | 14 +- src/views/table/dynamicTable/index.vue | 8 +- src/views/table/dynamicTable/unfixedThead.vue | 14 +- src/views/table/inlineEditTable.vue | 36 +- src/views/theme/index.vue | 37 +- src/views/tree-table/custom/data.js | 51 -- src/views/tree-table/custom/index.vue | 158 ------ src/views/tree-table/data.js | 80 --- src/views/tree-table/index.vue | 128 ----- src/views/zip/index.vue | 13 +- tests/unit/.eslintrc.js | 5 + tests/unit/components/Hamburger.spec.js | 18 + tests/unit/components/SvgIcon.spec.js | 22 + tests/unit/utils/formatTime.spec.js | 29 + tests/unit/utils/parseTime.spec.js | 27 + tests/unit/utils/validate.spec.js | 28 + vue.config.js | 147 +++++ 212 files changed, 3517 insertions(+), 3366 deletions(-) delete mode 100644 .babelrc create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 babel.config.js delete mode 100644 build/build.js delete mode 100644 build/check-versions.js create mode 100644 build/index.js delete mode 100644 build/logo.png delete mode 100644 build/utils.js delete mode 100644 build/vue-loader.conf.js delete mode 100644 build/webpack.base.conf.js delete mode 100644 build/webpack.dev.conf.js delete mode 100644 build/webpack.prod.conf.js delete mode 100644 config/dev.env.js delete mode 100644 config/index.js delete mode 100644 config/prod.env.js delete mode 100644 config/sit.env.js create mode 100644 jest.config.js create mode 100644 mock/article.js create mode 100644 mock/index.js create mode 100644 mock/mocks.js create mode 100644 mock/remoteSearch.js create mode 100644 mock/role/index.js create mode 100644 mock/role/routes.js create mode 100644 mock/user.js create mode 100644 plop-templates/component/index.hbs create mode 100644 plop-templates/component/prompt.js create mode 100644 plop-templates/utils.js create mode 100644 plop-templates/view/index.hbs create mode 100644 plop-templates/view/prompt.js create mode 100644 plopfile.js rename favicon.ico => public/favicon.ico (100%) rename index.html => public/index.html (68%) rename {static => public/static}/tinymce4.7.5/langs/zh_CN.js (100%) rename {static => public/static}/tinymce4.7.5/plugins/codesample/css/prism.css (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif (100%) rename {static => public/static}/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/content.inline.min.css (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/content.min.css (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/img/anchor.gif (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/img/loader.gif (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/img/object.gif (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/img/trans.gif (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/skin.min.css (100%) rename {static => public/static}/tinymce4.7.5/skins/lightgray/skin.min.css.map (100%) rename {static => public/static}/tinymce4.7.5/tinymce.min.js (100%) delete mode 100644 src/api/transaction.js rename src/api/{login.js => user.js} (57%) create mode 100644 src/components/RightPanel/index.vue delete mode 100644 src/components/TreeTable/README.md delete mode 100644 src/components/TreeTable/eval.js delete mode 100644 src/components/TreeTable/index.vue delete mode 100644 src/components/TreeTable/readme.md delete mode 100644 src/errorLog.js rename src/{views => }/layout/components/AppMain.vue (62%) rename src/{views => }/layout/components/Navbar.vue (85%) create mode 100644 src/layout/components/Settings/index.vue rename src/{views => }/layout/components/Sidebar/FixiOSBug.js (100%) rename src/{views => }/layout/components/Sidebar/Item.vue (100%) rename src/{views => }/layout/components/Sidebar/Link.vue (100%) create mode 100644 src/layout/components/Sidebar/Logo.vue rename src/{views => }/layout/components/Sidebar/SidebarItem.vue (99%) create mode 100644 src/layout/components/Sidebar/index.vue rename src/{views => }/layout/components/TagsView/ScrollPane.vue (97%) rename src/{views => }/layout/components/TagsView/index.vue (88%) rename src/{views => }/layout/components/index.js (80%) create mode 100644 src/layout/index.vue rename src/{views => }/layout/mixin/ResizeHandler.js (61%) delete mode 100644 src/mock/article.js delete mode 100644 src/mock/index.js delete mode 100644 src/mock/login.js delete mode 100644 src/mock/remoteSearch.js delete mode 100644 src/mock/role.js delete mode 100644 src/mock/transaction.js delete mode 100644 src/router/modules/tree-table.js create mode 100644 src/settings.js create mode 100644 src/store/modules/settings.js create mode 100644 src/styles/element-variables.scss create mode 100644 src/utils/errorLog.js delete mode 100644 src/views/layout/Layout.vue delete mode 100644 src/views/layout/components/Sidebar/index.vue delete mode 100644 src/views/tree-table/custom/data.js delete mode 100644 src/views/tree-table/custom/index.vue delete mode 100644 src/views/tree-table/data.js delete mode 100644 src/views/tree-table/index.vue create mode 100644 tests/unit/.eslintrc.js create mode 100644 tests/unit/components/Hamburger.spec.js create mode 100644 tests/unit/components/SvgIcon.spec.js create mode 100644 tests/unit/utils/formatTime.spec.js create mode 100644 tests/unit/utils/parseTime.spec.js create mode 100644 tests/unit/utils/validate.spec.js create mode 100644 vue.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 6c0b7f27..00000000 --- a/.babelrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "presets": [ - ["env", { - "modules": false, - "targets": { - "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] - } - }], - "stage-2" - ], - "plugins": ["transform-vue-jsx", "transform-runtime"], - "env": { - "development":{ - "plugins": ["dynamic-import-node"] - } - } -} diff --git a/.env.development b/.env.development new file mode 100644 index 00000000..8f5856db --- /dev/null +++ b/.env.development @@ -0,0 +1,14 @@ +# just a flag +ENV = 'development' + +# base api +VUE_APP_BASE_API = '/dev-api' + +# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, +# to control whether the babel-plugin-dynamic-import-node plugin is enabled. +# It only does one thing by converting all import() to require(). +# This configuration can significantly increase the speed of hot updates, +# when you have a large number of pages. +# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js + +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/.env.production b/.env.production new file mode 100644 index 00000000..80c81030 --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +# just a flag +ENV = 'production' + +# base api +VUE_APP_BASE_API = '/prod-api' + diff --git a/.env.staging b/.env.staging new file mode 100644 index 00000000..a8793a09 --- /dev/null +++ b/.env.staging @@ -0,0 +1,8 @@ +NODE_ENV = production + +# just a flag +ENV = 'staging' + +# base api +VUE_APP_BASE_API = '/stage-api' + diff --git a/.eslintignore b/.eslintignore index e3a4037e..e6529fc0 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ build/*.js -config/*.js src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js index 1266f38d..c9775054 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -24,6 +24,7 @@ module.exports = { "vue/singleline-html-element-content-newline": "off", "vue/multiline-html-element-content-newline":"off", "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", 'accessor-pairs': 2, 'arrow-spacing': [2, { 'before': true, @@ -46,7 +47,7 @@ module.exports = { 'curly': [2, 'multi-line'], 'dot-location': [2, 'property'], 'eol-last': 2, - 'eqeqeq': [2, 'allow-null'], + 'eqeqeq': ["error", "always", {"null": "ignore"}], 'generator-star-spacing': [2, { 'before': true, 'after': true diff --git a/.gitignore b/.gitignore index 9322b8a6..78a752d8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,8 @@ yarn-debug.log* yarn-error.log* **/*.log -test/unit/coverage -test/e2e/reports +tests/**/coverage/ +tests/e2e/reports selenium-debug.log # Editor directories and files @@ -17,5 +17,7 @@ selenium-debug.log *.ntvs* *.njsproj *.sln +*.local package-lock.json +yarn.lock diff --git a/.postcssrc.js b/.postcssrc.js index eee3e92d..09948d63 100644 --- a/.postcssrc.js +++ b/.postcssrc.js @@ -2,8 +2,6 @@ module.exports = { "plugins": { - "postcss-import": {}, - "postcss-url": {}, // to edit target browsers: use "browserslist" field in package.json "autoprefixer": {} } diff --git a/README.md b/README.md index 5f26a357..48599a7e 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ <p align="center"> <a href="https://github.com/vuejs/vue"> - <img src="https://img.shields.io/badge/vue-2.5.17-brightgreen.svg" alt="vue"> + <img src="https://img.shields.io/badge/vue-2.6.10-brightgreen.svg" alt="vue"> </a> <a href="https://github.com/ElemeFE/element"> - <img src="https://img.shields.io/badge/element--ui-2.4.11-brightgreen.svg" alt="element-ui"> + <img src="https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg" alt="element-ui"> </a> <a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow"> <img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Build Status"> @@ -30,48 +30,41 @@ English | [简体中文](./README.zh-CN.md) ## Introduction -[vue-element-admin](http://panjiachen.github.io/vue-element-admin) is a front-end management background integration solution. It based on [vue](https://github.com/vuejs/vue) and use the UI Toolkit [element](https://github.com/ElemeFE/element). +[vue-element-admin](http://panjiachen.github.io/vue-element-admin) is a production-ready front-end solution for admin interfaces. It based on [vue](https://github.com/vuejs/vue) and use the UI Toolkit [element-ui](https://github.com/ElemeFE/element). It is a magical vue admin based on the newest development stack of vue, built-in i18n solution, typical templates for enterprise applications, lots of awesome features. It helps you build a large complex Single-Page Applications. I believe whatever your needs are, this project will help you. -**[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) has in beta. It built on vue-cli@3, optimized a lot of code and added a lot of new features. Welcome to use and make suggestions.** - - [Preview](http://panjiachen.github.io/vue-element-admin) - [Documentation](https://panjiachen.github.io/vue-element-admin-site/) - [Gitter](https://gitter.im/vue-element-admin/discuss) -- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) - - [Donate](https://panjiachen.github.io/vue-element-admin-site/donate/) -- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览 +- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) -**This project is positioned as a background integration solution and is not suitable for secondary development as a basic template.** +- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览 - Base template recommends using: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) - Desktop: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour)) -**This project does not support low version browsers (e.g. IE). Please add polyfill yourself if you need them.** +**The current version is `4.0-beta`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version - stable version, you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)** -**Note: This project uses element-ui@2.3.0+ version, so the minimum compatible vue@2.5.0+** - -**Start using `webpack4` from `v3.8.0`. If you still want to continue using `webpack3`, please use this branch [webpack3](https://github.com/PanJiaChen/vue-element-admin/tree/webpack3)** +**This project does not support low version browsers (e.g. IE). Please add polyfill by yourself.** ## Preparation -You need to install [node](http://nodejs.org/) and [git](https://git-scm.com/) locally. The project is based on [ES2015+](http://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), all request data is simulated using [Mock.js](https://github.com/nuysoft/Mock). +You need to install [node](http://nodejs.org/) and [git](https://git-scm.com/) locally. The project is based on [ES2015+](http://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), all request data is simulated using [Mock.js](https://github.com/nuysoft/Mock). Understanding and learning this knowledge in advance will greatly help the use of this project. ---- - <p align="center"> <img width="900" src="https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png"> </p> ## Sponsors + Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen) <a href="https://flatlogic.com/admin-dashboards?from=vue-element-admin"><img width="150px" src="https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p> @@ -84,6 +77,7 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - Permission Authentication - Page permission - Directive permission + - Permission configuration page - Two-step login - Multi-environment build @@ -107,14 +101,13 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - Excel - Export Excel - - Export zip - Upload Excel - Visualization Excel + - Export zip - Table - Dynamic Table - Drag And Drop Table - - Tree Table - Inline Edit Table - Error Page @@ -148,6 +141,9 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s # clone the project git clone https://github.com/PanJiaChen/vue-element-admin.git +# enter the project directory +cd vue-element-admin + # install dependency npm install @@ -155,13 +151,13 @@ npm install npm run dev ``` -This will automatically open http://localhost:9527. +This will automatically open http://localhost:9527 ## Build ```bash # build for test environment -npm run build:sit +npm run build:stage # build for production environment npm run build:prod @@ -170,19 +166,16 @@ npm run build:prod ## Advanced ```bash -# --report to build with bundle size analytics -npm run build:prod --report +# preview the release environment effect +npm run preview -# --generate a bundle size analytics. default: bundle-report.html -npm run build:prod --generate_report +# preview the release environment effect + static resource analysis +npm run preview -- --report -# --preview to start a server in local to preview -npm run build:prod --preview - -# lint code +# code format check npm run lint -# auto fix +# code format check and auto fix npm run lint -- --fix ``` diff --git a/README.zh-CN.md b/README.zh-CN.md index 18d4aca3..e0ec09bb 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -4,10 +4,10 @@ <p align="center"> <a href="https://github.com/vuejs/vue"> - <img src="https://img.shields.io/badge/vue-2.5.10-brightgreen.svg" alt="vue"> + <img src="https://img.shields.io/badge/vue-2.6.10-brightgreen.svg" alt="vue"> </a> <a href="https://github.com/ElemeFE/element"> - <img src="https://img.shields.io/badge/element--ui-2.4.11-brightgreen.svg" alt="element-ui"> + <img src="https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg" alt="element-ui"> </a> <a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow"> <img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Build Status"> @@ -30,43 +30,37 @@ ## 简介 -[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 +[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台前端解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element-ui](https://github.com/ElemeFE/element)实现。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 -**[v4.0](https://github.com/PanJiaChen/vue-element-admin/tree/v4.0) 已经进入 beta 测试阶段。 它基于 vue-cli@3 进行构建,优化了大量代码(尤其是权限和 mock),并且增加了不少新特性。欢迎使用并提出建议。** - -- [在线访问](http://panjiachen.github.io/vue-element-admin) +- [在线预览](http://panjiachen.github.io/vue-element-admin) - [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/) - [Gitter 讨论组](https://gitter.im/vue-element-admin/discuss) -- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) - - [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) -- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览 +- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) -- [国内访问文档](https://panjiachen.gitee.io/vue-element-admin-site/zh/) 方便没翻墙的用户查看文档 +- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 在线预览(国内用户可访问该地址) -**本项目的定位是后台集成方案,不适合当基础模板来开发。** +- [国内访问文档](https://panjiachen.gitee.io/vue-element-admin-site/zh/) 文档(方便没翻墙的用户查看) -- 模板建议使用: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- 基础模板建议使用: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) - 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) -- Typescript版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) +- Typescript 版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) -群主 **[圈子](https://jianshiapp.com/circles/1209)** 楼主会经常分享一些技术相关的东西,或者加入[qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602)或者关注[微博](https://weibo.com/u/3423485724?is_all=1) - -**注意:该项目使用 element-ui@2.3.0+ 版本,所以最低兼容 vue@2.5.0+** - -**从`v3.8.0`开始使用`webpack4`。所以若还想使用`webpack3`开发,请使用该分支[webpack3](https://github.com/PanJiaChen/vue-element-admin/tree/webpack3)** +**目前版本为 `4.0-beta`,若发现问题,欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本-稳定版,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)** **该项目不支持低版本浏览器(如 ie),有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** +群主 **[圈子](https://jianshiapp.com/circles/1209)** 群主会经常分享一些技术相关的东西,或者加入 [qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602) 或者关注 [微博](https://weibo.com/u/3423485724?is_all=1) + ## 前序准备 -你需要在本地安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。本项目技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[axios](https://github.com/axios/axios) 和 [element-ui](https://github.com/ElemeFE/element),所有的请求数据都使用[Mock.js](https://github.com/nuysoft/Mock)模拟,提前了解和学习这些知识会对使用本项目有很大的帮助。 +你需要在本地安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。本项目技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[vue-cli](https://github.com/vuejs/vue-cli) 、[axios](https://github.com/axios/axios) 和 [element-ui](https://github.com/ElemeFE/element),所有的请求数据都使用[Mock.js](https://github.com/nuysoft/Mock)进行模拟,提前了解和学习这些知识会对使用本项目有很大的帮助。 -同时配套一个系列的教程文章,如何从零构建后一个完整的后台项目,建议大家先看完这些文章再来实践本项目 +同时配套了系列教程文章,如何从零构建后一个完整的后台项目,建议大家先看完这些文章再来实践本项目 - [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2) - [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac) @@ -84,6 +78,7 @@ </p> ## Sponsors + Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen) <a href="https://flatlogic.com/admin-dashboards?from=vue-element-admin"><img width="150px" src="https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p> @@ -96,6 +91,7 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - 权限验证 - 页面权限 - 指令权限 + - 权限配置 - 二步登录 - 多环境发布 @@ -108,7 +104,7 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - 动态面包屑 - 快捷导航(标签页) - Svg Sprite 图标 - - 本地mock数据 + - 本地/后端 mock 数据 - Screenfull全屏 - 自适应收缩侧边栏 @@ -119,14 +115,13 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s - Excel - 导出excel - - 导出zip - 导入excel - 前端可视化excel + - 导出zip - 表格 - 动态表格 - 拖拽表格 - - 树形表格 - 内联编辑 - 错误页面 @@ -160,6 +155,9 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s # 克隆项目 git clone https://github.com/PanJiaChen/vue-element-admin.git +# 进入项目目录 +cd vue-element-admin + # 安装依赖 npm install @@ -176,7 +174,7 @@ npm run dev ```bash # 构建测试环境 -npm run build:sit +npm run build:stage # 构建生产环境 npm run build:prod @@ -185,19 +183,16 @@ npm run build:prod ## 其它 ```bash -# --report to build with bundle size analytics -npm run build:prod +# 预览发布环境效果 +npm run preview -# --generate a bundle size analytics. default: bundle-report.html -npm run build:prod --generate_report +# 预览发布环境效果 + 静态资源分析 +npm run preview -- --report -# --preview to start a server in local to preview -npm run build:prod --preview - -# lint code +# 代码格式检查 npm run lint -# auto fix +# 代码格式检查并自动修复 npm run lint -- --fix ``` @@ -220,6 +215,8 @@ Detailed changes for each release are documented in the [release notes](https:// [Paypal Me](https://www.paypal.me/panfree23) +[Buy me a coffee](https://www.buymeacoffee.com/Pan) + ## Browsers support Modern browsers and Internet Explorer 10+. diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..ba179669 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/app' + ] +} diff --git a/build/build.js b/build/build.js deleted file mode 100644 index 34c71a55..00000000 --- a/build/build.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict' -require('./check-versions')() - -const ora = require('ora') -const rm = require('rimraf') -const path = require('path') -const chalk = require('chalk') -const webpack = require('webpack') -const config = require('../config') -const webpackConfig = require('./webpack.prod.conf') -var connect = require('connect') -var serveStatic = require('serve-static') - -const spinner = ora( - 'building for ' + process.env.env_config + ' environment...' -) -spinner.start() - -rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { - if (err) throw err - webpack(webpackConfig, (err, stats) => { - spinner.stop() - if (err) throw err - process.stdout.write( - stats.toString({ - colors: true, - modules: false, - children: false, - chunks: false, - chunkModules: false - }) + '\n\n' - ) - - if (stats.hasErrors()) { - console.log(chalk.red(' Build failed with errors.\n')) - process.exit(1) - } - - console.log(chalk.cyan(' Build complete.\n')) - console.log( - chalk.yellow( - ' Tip: built files are meant to be served over an HTTP server.\n' + - " Opening index.html over file:// won't work.\n" - ) - ) - - if (process.env.npm_config_preview) { - const port = 9526 - const host = 'http://localhost:' + port - const basePath = config.build.assetsPublicPath - const app = connect() - - app.use( - basePath, - serveStatic('./dist', { - index: ['index.html', '/'] - }) - ) - - app.listen(port, function() { - console.log( - chalk.green(`> Listening at http://localhost:${port}${basePath}`) - ) - }) - } - }) -}) diff --git a/build/check-versions.js b/build/check-versions.js deleted file mode 100644 index c5c29e90..00000000 --- a/build/check-versions.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict' -const chalk = require('chalk') -const semver = require('semver') -const packageConfig = require('../package.json') -const shell = require('shelljs') - -function exec(cmd) { - return require('child_process') - .execSync(cmd) - .toString() - .trim() -} - -const versionRequirements = [ - { - name: 'node', - currentVersion: semver.clean(process.version), - versionRequirement: packageConfig.engines.node - } -] - -if (shell.which('npm')) { - versionRequirements.push({ - name: 'npm', - currentVersion: exec('npm --version'), - versionRequirement: packageConfig.engines.npm - }) -} - -module.exports = function() { - const warnings = [] - - for (let i = 0; i < versionRequirements.length; i++) { - const mod = versionRequirements[i] - - if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { - warnings.push( - mod.name + - ': ' + - chalk.red(mod.currentVersion) + - ' should be ' + - chalk.green(mod.versionRequirement) - ) - } - } - - if (warnings.length) { - console.log('') - console.log( - chalk.yellow( - 'To use this template, you must update following to modules:' - ) - ) - console.log() - - for (let i = 0; i < warnings.length; i++) { - const warning = warnings[i] - console.log(' ' + warning) - } - - console.log() - process.exit(1) - } -} diff --git a/build/index.js b/build/index.js new file mode 100644 index 00000000..baf3807a --- /dev/null +++ b/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}/report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/build/logo.png b/build/logo.png deleted file mode 100644 index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6849 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 diff --git a/build/utils.js b/build/utils.js deleted file mode 100644 index c96d0936..00000000 --- a/build/utils.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict' -const path = require('path') -const config = require('../config') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const packageConfig = require('../package.json') - -exports.assetsPath = function(_path) { - const assetsSubDirectory = - process.env.NODE_ENV === 'production' - ? config.build.assetsSubDirectory - : config.dev.assetsSubDirectory - - return path.posix.join(assetsSubDirectory, _path) -} - -exports.cssLoaders = function(options) { - options = options || {} - - const cssLoader = { - loader: 'css-loader', - options: { - sourceMap: options.sourceMap - } - } - - const postcssLoader = { - loader: 'postcss-loader', - options: { - sourceMap: options.sourceMap - } - } - - // generate loader string to be used with extract text plugin - function generateLoaders(loader, loaderOptions) { - const loaders = [] - - // Extract CSS when that option is specified - // (which is the case during production build) - if (options.extract) { - loaders.push(MiniCssExtractPlugin.loader) - } else { - loaders.push('vue-style-loader') - } - - loaders.push(cssLoader) - - if (options.usePostCSS) { - loaders.push(postcssLoader) - } - - if (loader) { - loaders.push({ - loader: loader + '-loader', - options: Object.assign({}, loaderOptions, { - sourceMap: options.sourceMap - }) - }) - } - - return loaders - } - // https://vue-loader.vuejs.org/en/configurations/extract-css.html - return { - css: generateLoaders(), - postcss: generateLoaders(), - less: generateLoaders('less'), - sass: generateLoaders('sass', { - indentedSyntax: true - }), - scss: generateLoaders('sass'), - stylus: generateLoaders('stylus'), - styl: generateLoaders('stylus') - } -} - -// Generate loaders for standalone style files (outside of .vue) -exports.styleLoaders = function(options) { - const output = [] - const loaders = exports.cssLoaders(options) - - for (const extension in loaders) { - const loader = loaders[extension] - output.push({ - test: new RegExp('\\.' + extension + '$'), - use: loader - }) - } - - return output -} - -exports.createNotifierCallback = () => { - const notifier = require('node-notifier') - - return (severity, errors) => { - if (severity !== 'error') return - - const error = errors[0] - const filename = error.file && error.file.split('!').pop() - - notifier.notify({ - title: packageConfig.name, - message: severity + ': ' + error.name, - subtitle: filename || '', - icon: path.join(__dirname, 'logo.png') - }) - } -} diff --git a/build/vue-loader.conf.js b/build/vue-loader.conf.js deleted file mode 100644 index 5496c931..00000000 --- a/build/vue-loader.conf.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' - -module.exports = { - //You can set the vue-loader configuration by yourself. -} diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js deleted file mode 100644 index 3b946b4b..00000000 --- a/build/webpack.base.conf.js +++ /dev/null @@ -1,107 +0,0 @@ -'use strict' -const path = require('path') -const utils = require('./utils') -const config = require('../config') -const { VueLoaderPlugin } = require('vue-loader') -const vueLoaderConfig = require('./vue-loader.conf') - -function resolve(dir) { - return path.join(__dirname, '..', dir) -} - -const createLintingRule = () => ({ - test: /\.(js|vue)$/, - loader: 'eslint-loader', - enforce: 'pre', - include: [resolve('src'), resolve('test')], - options: { - formatter: require('eslint-friendly-formatter'), - emitWarning: !config.dev.showEslintErrorsInOverlay - } -}) - -module.exports = { - context: path.resolve(__dirname, '../'), - entry: { - app: './src/main.js' - }, - output: { - path: config.build.assetsRoot, - filename: '[name].js', - publicPath: - process.env.NODE_ENV === 'production' - ? config.build.assetsPublicPath - : config.dev.assetsPublicPath - }, - resolve: { - extensions: ['.js', '.vue', '.json'], - alias: { - '@': resolve('src') - } - }, - module: { - rules: [ - ...(config.dev.useEslint ? [createLintingRule()] : []), - { - test: /\.vue$/, - loader: 'vue-loader', - options: vueLoaderConfig - }, - { - test: /\.js$/, - loader: 'babel-loader?cacheDirectory', - include: [ - resolve('src'), - resolve('test'), - resolve('node_modules/webpack-dev-server/client') - ] - }, - { - test: /\.svg$/, - loader: 'svg-sprite-loader', - include: [resolve('src/icons')], - options: { - symbolId: 'icon-[name]' - } - }, - { - test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - loader: 'url-loader', - exclude: [resolve('src/icons')], - options: { - limit: 10000, - name: utils.assetsPath('img/[name].[hash:7].[ext]') - } - }, - { - test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: utils.assetsPath('media/[name].[hash:7].[ext]') - } - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: utils.assetsPath('fonts/[name].[hash:7].[ext]') - } - } - ] - }, - plugins: [new VueLoaderPlugin()], - node: { - // prevent webpack from injecting useless setImmediate polyfill because Vue - // source contains it (although only uses it if it's native). - setImmediate: false, - // prevent webpack from injecting mocks to Node native modules - // that does not make sense for the client - dgram: 'empty', - fs: 'empty', - net: 'empty', - tls: 'empty', - child_process: 'empty' - } -} diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js deleted file mode 100644 index 26a5584a..00000000 --- a/build/webpack.dev.conf.js +++ /dev/null @@ -1,98 +0,0 @@ -'use strict' -const path = require('path') -const utils = require('./utils') -const webpack = require('webpack') -const config = require('../config') -const merge = require('webpack-merge') -const baseWebpackConfig = require('./webpack.base.conf') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') -const portfinder = require('portfinder') - -function resolve(dir) { - return path.join(__dirname, '..', dir) -} - -const HOST = process.env.HOST -const PORT = process.env.PORT && Number(process.env.PORT) - -const devWebpackConfig = merge(baseWebpackConfig, { - mode: 'development', - module: { - rules: utils.styleLoaders({ - sourceMap: config.dev.cssSourceMap, - usePostCSS: true - }) - }, - // cheap-module-eval-source-map is faster for development - devtool: config.dev.devtool, - - // these devServer options should be customized in /config/index.js - devServer: { - clientLogLevel: 'warning', - historyApiFallback: true, - hot: true, - compress: true, - host: HOST || config.dev.host, - port: PORT || config.dev.port, - open: config.dev.autoOpenBrowser, - overlay: config.dev.errorOverlay - ? { warnings: false, errors: true } - : false, - publicPath: config.dev.assetsPublicPath, - proxy: config.dev.proxyTable, - quiet: true, // necessary for FriendlyErrorsPlugin - watchOptions: { - poll: config.dev.poll - } - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env': require('../config/dev.env') - }), - new webpack.HotModuleReplacementPlugin(), - // https://github.com/ampedandwired/html-webpack-plugin - new HtmlWebpackPlugin({ - filename: 'index.html', - template: 'index.html', - inject: true, - favicon: resolve('favicon.ico'), - title: 'vue-element-admin', - templateParameters: { - BASE_URL: config.dev.assetsPublicPath + config.dev.assetsSubDirectory, - }, - }), - ] -}) - -module.exports = new Promise((resolve, reject) => { - portfinder.basePort = process.env.PORT || config.dev.port - portfinder.getPort((err, port) => { - if (err) { - reject(err) - } else { - // publish the new Port, necessary for e2e tests - process.env.PORT = port - // add port to devServer config - devWebpackConfig.devServer.port = port - - // Add FriendlyErrorsPlugin - devWebpackConfig.plugins.push( - new FriendlyErrorsPlugin({ - compilationSuccessInfo: { - messages: [ - `Your application is running here: http://${ - devWebpackConfig.devServer.host - }:${port}` - ] - }, - onErrors: config.dev.notifyOnErrors - ? utils.createNotifierCallback() - : undefined - }) - ) - - resolve(devWebpackConfig) - } - }) -}) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js deleted file mode 100644 index 4f84e0c6..00000000 --- a/build/webpack.prod.conf.js +++ /dev/null @@ -1,187 +0,0 @@ -'use strict' -const path = require('path') -const utils = require('./utils') -const webpack = require('webpack') -const config = require('../config') -const merge = require('webpack-merge') -const baseWebpackConfig = require('./webpack.base.conf') -const CopyWebpackPlugin = require('copy-webpack-plugin') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin') -const UglifyJsPlugin = require('uglifyjs-webpack-plugin') - -function resolve(dir) { - return path.join(__dirname, '..', dir) -} - -const env = require('../config/' + process.env.env_config + '.env') - -// For NamedChunksPlugin -const seen = new Set() -const nameLength = 4 - -const webpackConfig = merge(baseWebpackConfig, { - mode: 'production', - module: { - rules: utils.styleLoaders({ - sourceMap: config.build.productionSourceMap, - extract: true, - usePostCSS: true - }) - }, - devtool: config.build.productionSourceMap ? config.build.devtool : false, - output: { - path: config.build.assetsRoot, - filename: utils.assetsPath('js/[name].[chunkhash:8].js'), - chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js') - }, - plugins: [ - // http://vuejs.github.io/vue-loader/en/workflow/production.html - new webpack.DefinePlugin({ - 'process.env': env - }), - // extract css into its own file - new MiniCssExtractPlugin({ - filename: utils.assetsPath('css/[name].[contenthash:8].css'), - chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css') - }), - // generate dist index.html with correct asset hash for caching. - // you can customize output by editing /index.html - // see https://github.com/ampedandwired/html-webpack-plugin - new HtmlWebpackPlugin({ - filename: config.build.index, - template: 'index.html', - inject: true, - favicon: resolve('favicon.ico'), - title: 'vue-element-admin', - templateParameters: { - BASE_URL: config.build.assetsPublicPath + config.build.assetsSubDirectory, - }, - minify: { - removeComments: true, - collapseWhitespace: true, - removeAttributeQuotes: true - // more options: - // https://github.com/kangax/html-minifier#options-quick-reference - } - // default sort mode uses toposort which cannot handle cyclic deps - // in certain cases, and in webpack 4, chunk order in HTML doesn't - // matter anyway - }), - new ScriptExtHtmlWebpackPlugin({ - //`runtime` must same as runtimeChunk name. default is `runtime` - inline: /runtime\..*\.js$/ - }), - // keep chunk.id stable when chunk has no name - new webpack.NamedChunksPlugin(chunk => { - if (chunk.name) { - return chunk.name - } - const modules = Array.from(chunk.modulesIterable) - if (modules.length > 1) { - const hash = require('hash-sum') - const joinedHash = hash(modules.map(m => m.id).join('_')) - let len = nameLength - while (seen.has(joinedHash.substr(0, len))) len++ - seen.add(joinedHash.substr(0, len)) - return `chunk-${joinedHash.substr(0, len)}` - } else { - return modules[0].id - } - }), - // keep module.id stable when vender modules does not change - new webpack.HashedModuleIdsPlugin(), - // copy custom static assets - new CopyWebpackPlugin([ - { - from: path.resolve(__dirname, '../static'), - to: config.build.assetsSubDirectory, - ignore: ['.*'] - } - ]) - ], - optimization: { - splitChunks: { - chunks: 'all', - cacheGroups: { - libs: { - name: 'chunk-libs', - test: /[\\/]node_modules[\\/]/, - priority: 10, - chunks: 'initial' // 只打包初始时依赖的第三方 - }, - elementUI: { - name: 'chunk-elementUI', // 单独将 elementUI 拆包 - priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app - test: /[\\/]node_modules[\\/]element-ui[\\/]/ - }, - commons: { - name: 'chunk-commons', - test: resolve('src/components'), // 可自定义拓展你的规则 - minChunks: 3, // 最小公用次数 - priority: 5, - reuseExistingChunk: true - } - } - }, - runtimeChunk: 'single', - minimizer: [ - new UglifyJsPlugin({ - uglifyOptions: { - mangle: { - safari10: true - } - }, - sourceMap: config.build.productionSourceMap, - cache: true, - parallel: true - }), - // Compress extracted CSS. We are using this plugin so that possible - // duplicated CSS from different components can be deduped. - new OptimizeCSSAssetsPlugin() - ] - } -}) - -if (config.build.productionGzip) { - const CompressionWebpackPlugin = require('compression-webpack-plugin') - - webpackConfig.plugins.push( - new CompressionWebpackPlugin({ - algorithm: 'gzip', - test: new RegExp( - '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' - ), - threshold: 10240, - minRatio: 0.8 - }) - ) -} - -if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) { - const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin - - if (config.build.bundleAnalyzerReport) { - webpackConfig.plugins.push( - new BundleAnalyzerPlugin({ - analyzerPort: 8080, - generateStatsFile: false - }) - ) - } - - if (config.build.generateAnalyzerReport) { - webpackConfig.plugins.push( - new BundleAnalyzerPlugin({ - analyzerMode: 'static', - reportFilename: 'bundle-report.html', - openAnalyzer: false - }) - ) - } -} - -module.exports = webpackConfig diff --git a/config/dev.env.js b/config/dev.env.js deleted file mode 100644 index 68ddea56..00000000 --- a/config/dev.env.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - NODE_ENV: '"development"', - ENV_CONFIG: '"dev"', - BASE_API: '"https://api-dev"' -} diff --git a/config/index.js b/config/index.js deleted file mode 100644 index 599e4a63..00000000 --- a/config/index.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' -// Template version: 1.2.6 -// see http://vuejs-templates.github.io/webpack for documentation. - -const path = require('path') - -module.exports = { - dev: { - // Paths - assetsSubDirectory: 'static', - assetsPublicPath: '/', - proxyTable: {}, - - // Various Dev Server settings - - // can be overwritten by process.env.HOST - // if you want dev by ip, please set host: '0.0.0.0' - host: 'localhost', - port: 9527, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined - autoOpenBrowser: true, - errorOverlay: true, - notifyOnErrors: false, - poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- - - // Use Eslint Loader? - // If true, your code will be linted during bundling and - // linting errors and warnings will be shown in the console. - useEslint: true, - // If true, eslint errors and warnings will also be shown in the error overlay - // in the browser. - showEslintErrorsInOverlay: false, - - /** - * Source Maps - */ - - // https://webpack.js.org/configuration/devtool/#development - devtool: 'cheap-source-map', - - // CSS Sourcemaps off by default because relative paths are "buggy" - // with this option, according to the CSS-Loader README - // (https://github.com/webpack/css-loader#sourcemaps) - // In our experience, they generally work as expected, - // just be aware of this issue when enabling this option. - cssSourceMap: false - }, - - build: { - // Template for index.html - index: path.resolve(__dirname, '../dist/index.html'), - - // Paths - assetsRoot: path.resolve(__dirname, '../dist'), - assetsSubDirectory: 'static', - - /** - * You can set by youself according to actual condition - * You will need to set this if you plan to deploy your site under a sub path, - * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/, - * then assetsPublicPath should be set to "/bar/". - * In most cases please use '/' !!! - */ - assetsPublicPath: '/', - - /** - * Source Maps - */ - productionSourceMap: false, - // https://webpack.js.org/configuration/devtool/#production - devtool: 'source-map', - - // Gzip off by default as many popular static hosts such as - // Surge or Netlify already gzip all static assets for you. - // Before setting to `true`, make sure to: - // npm install --save-dev compression-webpack-plugin - productionGzip: false, - productionGzipExtensions: ['js', 'css'], - - // Run the build command with an extra argument to - // View the bundle analyzer report after build finishes: - // `npm run build:prod --report` - // Set to `true` or `false` to always turn it on or off - bundleAnalyzerReport: process.env.npm_config_report || false, - - // `npm run build:prod --generate_report` - generateAnalyzerReport: process.env.npm_config_generate_report || false - } -} diff --git a/config/prod.env.js b/config/prod.env.js deleted file mode 100644 index bfcd6d27..00000000 --- a/config/prod.env.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - NODE_ENV: '"production"', - ENV_CONFIG: '"prod"', - BASE_API: '"https://api-prod"' -} diff --git a/config/sit.env.js b/config/sit.env.js deleted file mode 100644 index 93178e80..00000000 --- a/config/sit.env.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - NODE_ENV: '"production"', - ENV_CONFIG: '"sit"', - BASE_API: '"https://api-sit"' -} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..1ce813e1 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,27 @@ +module.exports = { + verbose: true, + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transformIgnorePatterns: [ + 'node_modules/(?!(babel-jest|jest-vue-preprocessor)/)' + ], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '<rootDir>/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '<rootDir>/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/mock/article.js b/mock/article.js new file mode 100644 index 00000000..45b75296 --- /dev/null +++ b/mock/article.js @@ -0,0 +1,116 @@ +import Mock from 'mockjs' + +const List = [] +const count = 100 + +const baseContent = '<p>我是测试数据我是测试数据</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>' +const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3' + +for (let i = 0; i < count; i++) { + List.push(Mock.mock({ + id: '@increment', + timestamp: +Mock.Random.date('T'), + author: '@first', + reviewer: '@first', + title: '@title(5, 10)', + content_short: 'mock data', + content: baseContent, + forecast: '@float(0, 100, 2, 2)', + importance: '@integer(1, 3)', + 'type|1': ['CN', 'US', 'JP', 'EU'], + 'status|1': ['published', 'draft', 'deleted'], + display_time: '@datetime', + comment_disabled: true, + pageviews: '@integer(300, 5000)', + image_uri, + platforms: ['a-platform'] + })) +} + +export default [ + { + url: '/article/list', + type: 'get', + response: config => { + const { importance, type, title, page = 1, limit = 20, sort } = config.query + + let mockList = List.filter(item => { + if (importance && item.importance !== +importance) return false + if (type && item.type !== type) return false + if (title && item.title.indexOf(title) < 0) return false + return true + }) + + if (sort === '-id') { + mockList = mockList.reverse() + } + + const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1)) + + return { + code: 20000, + data: { + total: mockList.length, + items: pageList + } + } + } + }, + + { + url: '/article/detail', + type: 'get', + response: config => { + const { id } = config.query + for (const article of List) { + if (article.id === +id) { + return { + code: 20000, + data: article + } + } + } + } + }, + + { + url: '/article/pv', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + pvData: [ + { key: 'PC', pv: 1024 }, + { key: 'mobile', pv: 1024 }, + { key: 'ios', pv: 1024 }, + { key: 'android', pv: 1024 } + ] + } + } + } + }, + + { + url: '/article/create', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + }, + + { + url: '/article/update', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] + diff --git a/mock/index.js b/mock/index.js new file mode 100644 index 00000000..15e07afa --- /dev/null +++ b/mock/index.js @@ -0,0 +1,54 @@ +import Mock from 'mockjs' +import mocks from './mocks' +import { param2Obj } from '../src/utils' + +const MOCK_API_BASE = '/mock' + +export function mockXHR() { + // 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题 + // https://github.com/nuysoft/Mock/issues/300 + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send + Mock.XHR.prototype.send = function() { + if (this.custom.xhr) { + this.custom.xhr.withCredentials = this.withCredentials || false + this.custom.xhr.responseType = this.responseType + } + this.proxy_send(...arguments) + } + + function XHR2ExpressReqWrap(respond) { + return function(options) { + let result = null + if (respond instanceof Function) { + const { body, type, url } = options + // https://expressjs.com/en/4x/api.html#req + result = respond({ + method: type, + body: JSON.parse(body), + query: param2Obj(url) + }) + } else { + result = respond + } + return Mock.mock(result) + } + } + + for (const i of mocks) { + Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response)) + } +} + +const responseFake = (url, type, respond) => { + return { + url: new RegExp(`${MOCK_API_BASE}${url}`), + type: type || 'get', + response(req, res) { + res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond)) + } + } +} + +export default mocks.map(route => { + return responseFake(route.url, route.type, route.response) +}) diff --git a/mock/mocks.js b/mock/mocks.js new file mode 100644 index 00000000..84a25ddc --- /dev/null +++ b/mock/mocks.js @@ -0,0 +1,12 @@ +import user from './user' +import role from './role' +import article from './article' +import search from './remoteSearch' + +export default [ + ...user, + ...role, + ...article, + ...search +] + diff --git a/mock/remoteSearch.js b/mock/remoteSearch.js new file mode 100644 index 00000000..bb33c2f4 --- /dev/null +++ b/mock/remoteSearch.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/role/index.js b/mock/role/index.js new file mode 100644 index 00000000..39148076 --- /dev/null +++ b/mock/role/index.js @@ -0,0 +1,98 @@ +import Mock from 'mockjs' +import { deepClone } from '../../src/utils/index.js' +import { asyncRoutes, constantRoutes } from './routes.js' + +const routes = deepClone([...constantRoutes, ...asyncRoutes]) + +const roles = [ + { + key: 'admin', + name: 'admin', + description: 'Super Administrator. Have access to view all pages.', + routes: routes + }, + { + key: 'editor', + name: 'editor', + description: 'Normal Editor. Can see all pages except permission page', + routes: routes.filter(i => i.path !== '/permission')// just a mock + }, + { + key: 'visitor', + name: 'visitor', + description: 'Just a visitor. Can only see the home page and the document page', + routes: [{ + path: '', + redirect: 'dashboard', + children: [ + { + path: 'dashboard', + name: 'Dashboard', + meta: { title: 'dashboard', icon: 'dashboard' } + } + ] + }] + } +] + +export default [ + // mock get all routes form server + { + url: '/routes', + type: 'get', + response: _ => { + return { + code: 20000, + data: routes + } + } + }, + + // mock get all roles form server + { + url: '/roles', + type: 'get', + response: _ => { + return { + code: 20000, + data: roles + } + } + }, + + // add role + { + url: '/role', + type: 'post', + response: { + code: 20000, + data: { + key: Mock.mock('@integer(300, 5000)') + } + } + }, + + // update role + { + url: '/role/[A-Za-z0-9]', + type: 'put', + response: { + code: 20000, + data: { + status: 'success' + } + } + }, + + // delete role + { + url: '/role/[A-Za-z0-9]', + type: 'delete', + response: { + code: 20000, + data: { + status: 'success' + } + } + } +] diff --git a/mock/role/routes.js b/mock/role/routes.js new file mode 100644 index 00000000..d8eaf42a --- /dev/null +++ b/mock/role/routes.js @@ -0,0 +1,525 @@ +// Just a mock data + +export const constantRoutes = [ + { + path: '/redirect', + component: 'layout/Layout', + hidden: true, + children: [ + { + path: '/redirect/:path*', + component: 'views/redirect/index' + } + ] + }, + { + path: '/login', + component: 'views/login/index', + hidden: true + }, + { + path: '/auth-redirect', + component: 'views/login/authredirect', + hidden: true + }, + { + path: '/404', + component: 'views/errorPage/404', + hidden: true + }, + { + path: '/401', + component: 'views/errorPage/401', + hidden: true + }, + { + path: '', + component: 'layout/Layout', + redirect: 'dashboard', + children: [ + { + path: 'dashboard', + component: 'views/dashboard/index', + name: 'Dashboard', + meta: { title: 'dashboard', icon: 'dashboard', noCache: true, affix: true } + } + ] + }, + { + path: '/documentation', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/documentation/index', + name: 'Documentation', + meta: { title: 'documentation', icon: 'documentation', affix: true } + } + ] + }, + { + path: '/guide', + component: 'layout/Layout', + redirect: '/guide/index', + children: [ + { + path: 'index', + component: 'views/guide/index', + name: 'Guide', + meta: { title: 'guide', icon: 'guide', noCache: true } + } + ] + } +] + +export const asyncRoutes = [ + { + path: '/permission', + component: 'layout/Layout', + redirect: '/permission/index', + alwaysShow: true, + meta: { + title: 'permission', + icon: 'lock', + roles: ['admin', 'editor'] + }, + children: [ + { + path: 'page', + component: 'views/permission/page', + name: 'PagePermission', + meta: { + title: 'pagePermission', + roles: ['admin'] + } + }, + { + path: 'directive', + component: 'views/permission/directive', + name: 'DirectivePermission', + meta: { + title: 'directivePermission' + } + }, + { + path: 'role', + component: 'views/permission/role', + name: 'RolePermission', + meta: { + title: 'rolePermission', + roles: ['admin'] + } + } + ] + }, + + { + path: '/icon', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/svg-icons/index', + name: 'Icons', + meta: { title: 'icons', icon: 'icon', noCache: true } + } + ] + }, + + { + path: '/components', + component: 'layout/Layout', + redirect: 'noredirect', + name: 'ComponentDemo', + meta: { + title: 'components', + icon: 'component' + }, + children: [ + { + path: 'tinymce', + component: 'views/components-demo/tinymce', + name: 'TinymceDemo', + meta: { title: 'tinymce' } + }, + { + path: 'markdown', + component: 'views/components-demo/markdown', + name: 'MarkdownDemo', + meta: { title: 'markdown' } + }, + { + path: 'json-editor', + component: 'views/components-demo/jsonEditor', + name: 'JsonEditorDemo', + meta: { title: 'jsonEditor' } + }, + { + path: 'splitpane', + component: 'views/components-demo/splitpane', + name: 'SplitpaneDemo', + meta: { title: 'splitPane' } + }, + { + path: 'avatar-upload', + component: 'views/components-demo/avatarUpload', + name: 'AvatarUploadDemo', + meta: { title: 'avatarUpload' } + }, + { + path: 'dropzone', + component: 'views/components-demo/dropzone', + name: 'DropzoneDemo', + meta: { title: 'dropzone' } + }, + { + path: 'sticky', + component: 'views/components-demo/sticky', + name: 'StickyDemo', + meta: { title: 'sticky' } + }, + { + path: 'count-to', + component: 'views/components-demo/countTo', + name: 'CountToDemo', + meta: { title: 'countTo' } + }, + { + path: 'mixin', + component: 'views/components-demo/mixin', + name: 'ComponentMixinDemo', + meta: { title: 'componentMixin' } + }, + { + path: 'back-to-top', + component: 'views/components-demo/backToTop', + name: 'BackToTopDemo', + meta: { title: 'backToTop' } + }, + { + path: 'drag-dialog', + component: 'views/components-demo/dragDialog', + name: 'DragDialogDemo', + meta: { title: 'dragDialog' } + }, + { + path: 'drag-select', + component: 'views/components-demo/dragSelect', + name: 'DragSelectDemo', + meta: { title: 'dragSelect' } + }, + { + path: 'dnd-list', + component: 'views/components-demo/dndList', + name: 'DndListDemo', + meta: { title: 'dndList' } + }, + { + path: 'drag-kanban', + component: 'views/components-demo/dragKanban', + name: 'DragKanbanDemo', + meta: { title: 'dragKanban' } + } + ] + }, + { + path: '/charts', + component: 'layout/Layout', + redirect: 'noredirect', + name: 'Charts', + meta: { + title: 'charts', + icon: 'chart' + }, + children: [ + { + path: 'keyboard', + component: 'views/charts/keyboard', + name: 'KeyboardChart', + meta: { title: 'keyboardChart', noCache: true } + }, + { + path: 'line', + component: 'views/charts/line', + name: 'LineChart', + meta: { title: 'lineChart', noCache: true } + }, + { + path: 'mixchart', + component: 'views/charts/mixChart', + name: 'MixChart', + meta: { title: 'mixChart', noCache: true } + } + ] + }, + { + path: '/nested', + component: 'layout/Layout', + redirect: '/nested/menu1/menu1-1', + name: 'Nested', + meta: { + title: 'nested', + icon: 'nested' + }, + children: [ + { + path: 'menu1', + component: 'views/nested/menu1/index', + name: 'Menu1', + meta: { title: 'menu1' }, + redirect: '/nested/menu1/menu1-1', + children: [ + { + path: 'menu1-1', + component: 'views/nested/menu1/menu1-1', + name: 'Menu1-1', + meta: { title: 'menu1-1' } + }, + { + path: 'menu1-2', + component: 'views/nested/menu1/menu1-2', + name: 'Menu1-2', + redirect: '/nested/menu1/menu1-2/menu1-2-1', + meta: { title: 'menu1-2' }, + children: [ + { + path: 'menu1-2-1', + component: 'views/nested/menu1/menu1-2/menu1-2-1', + name: 'Menu1-2-1', + meta: { title: 'menu1-2-1' } + }, + { + path: 'menu1-2-2', + component: 'views/nested/menu1/menu1-2/menu1-2-2', + name: 'Menu1-2-2', + meta: { title: 'menu1-2-2' } + } + ] + }, + { + path: 'menu1-3', + component: 'views/nested/menu1/menu1-3', + name: 'Menu1-3', + meta: { title: 'menu1-3' } + } + ] + }, + { + path: 'menu2', + name: 'Menu2', + component: 'views/nested/menu2/index', + meta: { title: 'menu2' } + } + ] + }, + + { + path: '/example', + component: 'layout/Layout', + redirect: '/example/list', + name: 'Example', + meta: { + title: 'example', + icon: 'example' + }, + children: [ + { + path: 'create', + component: 'views/example/create', + name: 'CreateArticle', + meta: { title: 'createArticle', icon: 'edit' } + }, + { + path: 'edit/:id(\\d+)', + component: 'views/example/edit', + name: 'EditArticle', + meta: { title: 'editArticle', noCache: true }, + hidden: true + }, + { + path: 'list', + component: 'views/example/list', + name: 'ArticleList', + meta: { title: 'articleList', icon: 'list' } + } + ] + }, + + { + path: '/tab', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/tab/index', + name: 'Tab', + meta: { title: 'tab', icon: 'tab' } + } + ] + }, + + { + path: '/error', + component: 'layout/Layout', + redirect: 'noredirect', + name: 'ErrorPages', + meta: { + title: 'errorPages', + icon: '404' + }, + children: [ + { + path: '401', + component: 'views/errorPage/401', + name: 'Page401', + meta: { title: 'page401', noCache: true } + }, + { + path: '404', + component: 'views/errorPage/404', + name: 'Page404', + meta: { title: 'page404', noCache: true } + } + ] + }, + + { + path: '/error-log', + component: 'layout/Layout', + redirect: 'noredirect', + children: [ + { + path: 'log', + component: 'views/errorLog/index', + name: 'ErrorLog', + meta: { title: 'errorLog', icon: 'bug' } + } + ] + }, + + { + path: '/excel', + component: 'layout/Layout', + redirect: '/excel/export-excel', + name: 'Excel', + meta: { + title: 'excel', + icon: 'excel' + }, + children: [ + { + path: 'export-excel', + component: 'views/excel/exportExcel', + name: 'ExportExcel', + meta: { title: 'exportExcel' } + }, + { + path: 'export-selected-excel', + component: 'views/excel/selectExcel', + name: 'SelectExcel', + meta: { title: 'selectExcel' } + }, + { + path: 'export-merge-header', + component: 'views/excel/mergeHeader', + name: 'MergeHeader', + meta: { title: 'mergeHeader' } + }, + { + path: 'upload-excel', + component: 'views/excel/uploadExcel', + name: 'UploadExcel', + meta: { title: 'uploadExcel' } + } + ] + }, + + { + path: '/zip', + component: 'layout/Layout', + redirect: '/zip/download', + alwaysShow: true, + meta: { title: 'zip', icon: 'zip' }, + children: [ + { + path: 'download', + component: 'views/zip/index', + name: 'ExportZip', + meta: { title: 'exportZip' } + } + ] + }, + + { + path: '/pdf', + component: 'layout/Layout', + redirect: '/pdf/index', + children: [ + { + path: 'index', + component: 'views/pdf/index', + name: 'PDF', + meta: { title: 'pdf', icon: 'pdf' } + } + ] + }, + { + path: '/pdf/download', + component: 'views/pdf/download', + hidden: true + }, + + { + path: '/theme', + component: 'layout/Layout', + redirect: 'noredirect', + children: [ + { + path: 'index', + component: 'views/theme/index', + name: 'Theme', + meta: { title: 'theme', icon: 'theme' } + } + ] + }, + + { + path: '/clipboard', + component: 'layout/Layout', + redirect: 'noredirect', + children: [ + { + path: 'index', + component: 'views/clipboard/index', + name: 'ClipboardDemo', + meta: { title: 'clipboardDemo', icon: 'clipboard' } + } + ] + }, + + { + path: '/i18n', + component: 'layout/Layout', + children: [ + { + path: 'index', + component: 'views/i18n-demo/index', + name: 'I18n', + meta: { title: 'i18n', icon: 'international' } + } + ] + }, + + { + path: 'external-link', + component: 'layout/Layout', + children: [ + { + path: 'https://github.com/PanJiaChen/vue-element-admin', + meta: { title: 'externalLink', icon: 'link' } + } + ] + }, + + { path: '*', redirect: '/404', hidden: true } +] diff --git a/mock/user.js b/mock/user.js new file mode 100644 index 00000000..43f93a04 --- /dev/null +++ b/mock/user.js @@ -0,0 +1,84 @@ + +const tokens = { + admin: { + token: 'admin-token' + }, + editor: { + token: 'editor-token' + } +} + +const users = { + 'admin-token': { + roles: ['admin'], + introduction: 'I am a super administrator', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Super Admin' + }, + 'editor-token': { + roles: ['editor'], + introduction: 'I am an editor', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Normal Editor' + } +} + +export default [ + // user login + { + url: '/user/login', + type: 'post', + response: config => { + const { username } = config.body + const token = tokens[username] + + // mock error + if (!token) { + return { + code: 60204, + message: 'Account and password are incorrect.' + } + } + + return { + code: 20000, + data: token + } + } + }, + + // get user info + { + url: '/user/info\.*', + type: 'get', + response: config => { + const { token } = config.query + const info = users[token] + + // mock error + if (!info) { + return { + code: 50008, + message: 'Login failed, unable to get user details.' + } + } + + return { + code: 20000, + data: info + } + } + }, + + // user logout + { + url: '/user/logout', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] diff --git a/package.json b/package.json index 86c334f2..12bf3ffc 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,24 @@ { "name": "vue-element-admin", - "version": "3.11.0", - "description": "A magical vue admin. Typical templates for enterprise applications. Newest development stack of vue. Lots of awesome features", + "version": "4.0.0", + "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", "scripts": { - "dev": "cross-env BABEL_ENV=development webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", - "build:prod": "cross-env NODE_ENV=production env_config=prod node build/build.js", - "build:sit": "cross-env NODE_ENV=production env_config=sit node build/build.js", + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", "lint": "eslint --ext .js,.vue src", - "test": "npm run lint", - "precommit": "lint-staged", - "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml" + "test:unit": "vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "new": "plop" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } }, "lint-staged": { "src/**/*.{js,vue}": [ @@ -21,10 +28,12 @@ }, "keywords": [ "vue", - "element-ui", "admin", - "management-system", - "admin-template" + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" ], "repository": { "type": "git", @@ -35,93 +44,64 @@ }, "dependencies": { "axios": "0.18.0", - "clipboard": "1.7.1", - "codemirror": "5.39.2", - "driver.js": "0.8.1", - "dropzone": "5.2.0", - "echarts": "4.1.0", - "element-ui": "2.4.11", - "file-saver": "1.3.8", - "fuse.js": "3.4.2", + "clipboard": "2.0.4", + "codemirror": "5.45.0", + "driver.js": "0.9.5", + "dropzone": "5.5.1", + "echarts": "4.2.1", + "element-ui": "2.7.0", + "file-saver": "2.0.1", + "fuse.js": "3.4.4", "js-cookie": "2.2.0", "jsonlint": "1.6.3", - "jszip": "3.1.5", - "mockjs": "1.0.1-beta3", + "jszip": "3.2.1", "normalize.css": "7.0.0", "nprogress": "0.2.0", - "screenfull": "4.0.0", - "showdown": "1.8.6", - "sortablejs": "1.7.0", - "tui-editor": "1.2.7", - "vue": "2.5.17", + "path-to-regexp": "2.4.0", + "screenfull": "4.2.0", + "showdown": "1.9.0", + "sortablejs": "1.8.4", + "tui-editor": "1.3.3", + "vue": "2.6.10", "vue-count-to": "1.0.13", "vue-i18n": "7.3.2", "vue-router": "3.0.2", - "vue-splitpane": "1.0.2", - "vuedraggable": "^2.16.0", - "vuex": "3.0.1", - "xlsx": "^0.11.16" + "vue-splitpane": "1.0.4", + "vuedraggable": "2.20.0", + "vuex": "3.1.0", + "xlsx": "0.14.1" }, "devDependencies": { - "autoprefixer": "8.5.0", - "babel-core": "6.26.3", - "babel-eslint": "8.2.6", - "babel-helper-vue-jsx-merge-props": "2.0.3", - "babel-loader": "7.1.5", - "babel-plugin-dynamic-import-node": "2.0.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-plugin-transform-vue-jsx": "3.7.0", - "babel-preset-env": "1.7.0", - "babel-preset-stage-2": "6.24.1", - "chalk": "2.4.1", - "compression-webpack-plugin": "2.0.0", + "@babel/core": "7.0.0", + "@babel/register": "7.0.0", + "@vue/cli-plugin-babel": "3.5.3", + "@vue/cli-plugin-unit-jest": "3.5.3", + "@vue/cli-service": "3.5.3", + "@vue/test-utils": "1.0.0-beta.29", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "10.0.1", + "babel-jest": "23.6.0", + "chalk": "2.4.2", "connect": "3.6.6", - "copy-webpack-plugin": "4.5.2", - "cross-env": "5.2.0", - "css-loader": "1.0.0", - "eslint": "5.15.2", - "eslint-friendly-formatter": "4.0.1", - "eslint-loader": "2.1.2", + "eslint": "5.15.3", "eslint-plugin-vue": "5.2.2", - "file-loader": "1.1.11", - "friendly-errors-webpack-plugin": "1.7.0", - "hash-sum": "1.0.2", - "html-webpack-plugin": "4.0.0-alpha", - "husky": "0.14.3", - "lint-staged": "7.2.2", - "mini-css-extract-plugin": "0.4.1", - "node-notifier": "5.2.1", - "node-sass": "^4.7.2", - "optimize-css-assets-webpack-plugin": "5.0.0", - "ora": "3.0.0", - "path-to-regexp": "2.4.0", - "portfinder": "1.0.13", - "postcss-import": "11.1.0", - "postcss-loader": "2.1.6", - "postcss-url": "7.3.2", - "rimraf": "2.6.2", - "sass-loader": "7.0.3", - "script-ext-html-webpack-plugin": "2.0.1", + "html-webpack-plugin": "3.2.0", + "husky": "1.3.1", + "lint-staged": "8.1.5", + "mockjs": "1.0.1-beta3", + "node-sass": "^4.9.0", + "plop": "2.3.0", + "runjs": "^4.3.2", + "sass-loader": "^7.1.0", + "script-ext-html-webpack-plugin": "2.1.3", "script-loader": "0.7.2", - "semver": "5.5.0", - "serve-static": "1.13.2", - "shelljs": "0.8.2", - "svg-sprite-loader": "3.8.0", - "svgo": "1.0.5", - "uglifyjs-webpack-plugin": "1.2.7", - "url-loader": "1.0.1", - "vue-loader": "15.3.0", - "vue-style-loader": "4.1.2", - "vue-template-compiler": "2.5.17", - "webpack": "4.16.5", - "webpack-bundle-analyzer": "2.13.1", - "webpack-cli": "3.1.0", - "webpack-dev-server": "3.1.14", - "webpack-merge": "4.1.4" + "serve-static": "^1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.0", + "vue-template-compiler": "2.6.10" }, "engines": { - "node": ">= 6.0.0", + "node": ">=8.9", "npm": ">= 3.0.0" }, "browserslist": [ diff --git a/plop-templates/component/index.hbs b/plop-templates/component/index.hbs new file mode 100644 index 00000000..76610552 --- /dev/null +++ b/plop-templates/component/index.hbs @@ -0,0 +1,26 @@ +{{#if template}} +<template> + <div /> +</template> +{{/if}} + +{{#if script}} +<script> +export default { + name: '{{ properCase name }}', + props: {}, + data() { + return {} + }, + created() {}, + mounted() {}, + methods: {} +} +</script> +{{/if}} + +{{#if style}} +<style lang="scss" scoped> + +</style> +{{/if}} diff --git a/plop-templates/component/prompt.js b/plop-templates/component/prompt.js new file mode 100644 index 00000000..3723e8e1 --- /dev/null +++ b/plop-templates/component/prompt.js @@ -0,0 +1,55 @@ +const { notEmpty } = require('../utils.js') + +module.exports = { + description: 'generate vue component', + prompts: [{ + type: 'input', + name: 'name', + message: 'component name please', + validate: notEmpty('name') + }, + { + type: 'checkbox', + name: 'blocks', + message: 'Blocks:', + choices: [{ + name: '<template>', + value: 'template', + checked: true + }, + { + name: '<script>', + value: 'script', + checked: true + }, + { + name: 'style', + value: 'style', + checked: true + } + ], + validate(value) { + if (value.indexOf('script') === -1 && value.indexOf('template') === -1) { + return 'Components require at least a <script> or <template> tag.' + } + return true + } + } + ], + actions: data => { + const name = '{{properCase name}}' + const actions = [{ + type: 'add', + path: `src/components/${name}/index.vue`, + templateFile: 'plop-templates/component/index.hbs', + data: { + name: name, + template: data.blocks.includes('template'), + script: data.blocks.includes('script'), + style: data.blocks.includes('style') + } + }] + + return actions + } +} diff --git a/plop-templates/utils.js b/plop-templates/utils.js new file mode 100644 index 00000000..0310ca02 --- /dev/null +++ b/plop-templates/utils.js @@ -0,0 +1,9 @@ +exports.notEmpty = name => { + return v => { + if (!v || v.trim === '') { + return `${name} is required` + } else { + return true + } + } +} diff --git a/plop-templates/view/index.hbs b/plop-templates/view/index.hbs new file mode 100644 index 00000000..76610552 --- /dev/null +++ b/plop-templates/view/index.hbs @@ -0,0 +1,26 @@ +{{#if template}} +<template> + <div /> +</template> +{{/if}} + +{{#if script}} +<script> +export default { + name: '{{ properCase name }}', + props: {}, + data() { + return {} + }, + created() {}, + mounted() {}, + methods: {} +} +</script> +{{/if}} + +{{#if style}} +<style lang="scss" scoped> + +</style> +{{/if}} diff --git a/plop-templates/view/prompt.js b/plop-templates/view/prompt.js new file mode 100644 index 00000000..1d490ee8 --- /dev/null +++ b/plop-templates/view/prompt.js @@ -0,0 +1,55 @@ +const { notEmpty } = require('../utils.js') + +module.exports = { + description: 'generate a view', + prompts: [{ + type: 'input', + name: 'name', + message: 'view name please', + validate: notEmpty('name') + }, + { + type: 'checkbox', + name: 'blocks', + message: 'Blocks:', + choices: [{ + name: '<template>', + value: 'template', + checked: true + }, + { + name: '<script>', + value: 'script', + checked: true + }, + { + name: 'style', + value: 'style', + checked: true + } + ], + validate(value) { + if (value.indexOf('script') === -1 && value.indexOf('template') === -1) { + return 'View require at least a <script> or <template> tag.' + } + return true + } + } + ], + actions: data => { + const name = '{{name}}' + const actions = [{ + type: 'add', + path: `src/views/${name}/index.vue`, + templateFile: 'plop-templates/view/index.hbs', + data: { + name: name, + template: data.blocks.includes('template'), + script: data.blocks.includes('script'), + style: data.blocks.includes('style') + } + }] + + return actions + } +} diff --git a/plopfile.js b/plopfile.js new file mode 100644 index 00000000..9f3147e2 --- /dev/null +++ b/plopfile.js @@ -0,0 +1,7 @@ +const viewGenerator = require('./plop-templates/view/prompt') +const componentGenerator = require('./plop-templates/component/prompt') + +module.exports = function(plop) { + plop.setGenerator('view', viewGenerator) + plop.setGenerator('component', componentGenerator) +} diff --git a/favicon.ico b/public/favicon.ico similarity index 100% rename from favicon.ico rename to public/favicon.ico diff --git a/index.html b/public/index.html similarity index 68% rename from index.html rename to public/index.html index 7a7ecacf..a2fac6d6 100644 --- a/index.html +++ b/public/index.html @@ -5,10 +5,11 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> - <title>vue-element-admin</title> + <link rel="icon" href="<%= BASE_URL %>favicon.ico"> + <title><%= webpackConfig.name %></title> </head> <body> - <script src=<%= BASE_URL %>/tinymce4.7.5/tinymce.min.js></script> + <script src="<%= BASE_URL %>static/tinymce4.7.5/tinymce.min.js"></script> <div id="app"></div> <!-- built files will be auto injected --> </body> diff --git a/static/tinymce4.7.5/langs/zh_CN.js b/public/static/tinymce4.7.5/langs/zh_CN.js similarity index 100% rename from static/tinymce4.7.5/langs/zh_CN.js rename to public/static/tinymce4.7.5/langs/zh_CN.js diff --git a/static/tinymce4.7.5/plugins/codesample/css/prism.css b/public/static/tinymce4.7.5/plugins/codesample/css/prism.css similarity index 100% rename from static/tinymce4.7.5/plugins/codesample/css/prism.css rename to public/static/tinymce4.7.5/plugins/codesample/css/prism.css diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif diff --git a/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif similarity index 100% rename from static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif rename to public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif diff --git a/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css b/public/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css similarity index 100% rename from static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css rename to public/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css diff --git a/static/tinymce4.7.5/skins/lightgray/content.inline.min.css b/public/static/tinymce4.7.5/skins/lightgray/content.inline.min.css similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/content.inline.min.css rename to public/static/tinymce4.7.5/skins/lightgray/content.inline.min.css diff --git a/static/tinymce4.7.5/skins/lightgray/content.min.css b/public/static/tinymce4.7.5/skins/lightgray/content.min.css similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/content.min.css rename to public/static/tinymce4.7.5/skins/lightgray/content.min.css diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf diff --git a/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff rename to public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff diff --git a/static/tinymce4.7.5/skins/lightgray/img/anchor.gif b/public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/img/anchor.gif rename to public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif diff --git a/static/tinymce4.7.5/skins/lightgray/img/loader.gif b/public/static/tinymce4.7.5/skins/lightgray/img/loader.gif similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/img/loader.gif rename to public/static/tinymce4.7.5/skins/lightgray/img/loader.gif diff --git a/static/tinymce4.7.5/skins/lightgray/img/object.gif b/public/static/tinymce4.7.5/skins/lightgray/img/object.gif similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/img/object.gif rename to public/static/tinymce4.7.5/skins/lightgray/img/object.gif diff --git a/static/tinymce4.7.5/skins/lightgray/img/trans.gif b/public/static/tinymce4.7.5/skins/lightgray/img/trans.gif similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/img/trans.gif rename to public/static/tinymce4.7.5/skins/lightgray/img/trans.gif diff --git a/static/tinymce4.7.5/skins/lightgray/skin.min.css b/public/static/tinymce4.7.5/skins/lightgray/skin.min.css similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/skin.min.css rename to public/static/tinymce4.7.5/skins/lightgray/skin.min.css diff --git a/static/tinymce4.7.5/skins/lightgray/skin.min.css.map b/public/static/tinymce4.7.5/skins/lightgray/skin.min.css.map similarity index 100% rename from static/tinymce4.7.5/skins/lightgray/skin.min.css.map rename to public/static/tinymce4.7.5/skins/lightgray/skin.min.css.map diff --git a/static/tinymce4.7.5/tinymce.min.js b/public/static/tinymce4.7.5/tinymce.min.js similarity index 100% rename from static/tinymce4.7.5/tinymce.min.js rename to public/static/tinymce4.7.5/tinymce.min.js diff --git a/src/api/remoteSearch.js b/src/api/remoteSearch.js index f2792789..c7e19117 100644 --- a/src/api/remoteSearch.js +++ b/src/api/remoteSearch.js @@ -1,9 +1,17 @@ import request from '@/utils/request' -export function userSearch(name) { +export function searchUser(name) { return request({ url: '/search/user', method: 'get', params: { name } }) } + +export function transactionList(query) { + return request({ + url: '/transaction/list', + method: 'get', + params: query + }) +} diff --git a/src/api/role.js b/src/api/role.js index c81405a8..f6a983f1 100644 --- a/src/api/role.js +++ b/src/api/role.js @@ -14,25 +14,25 @@ export function getRoles() { }) } -export function deleteRole(id) { - return request({ - url: `/roles/${id}`, - method: 'delete' - }) -} - export function addRole(data) { return request({ - url: '/roles', + url: '/role', method: 'post', data }) } -export function updateRole(key, data) { +export function updateRole(id, data) { return request({ - url: `/roles/${key}`, + url: `/role/${id}`, method: 'put', data }) } + +export function deleteRole(id) { + return request({ + url: `/role/${id}`, + method: 'delete' + }) +} diff --git a/src/api/transaction.js b/src/api/transaction.js deleted file mode 100644 index dfe64392..00000000 --- a/src/api/transaction.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -export function fetchList(query) { - return request({ - url: '/transaction/list', - method: 'get', - params: query - }) -} diff --git a/src/api/login.js b/src/api/user.js similarity index 57% rename from src/api/login.js rename to src/api/user.js index a64935c3..a8052005 100644 --- a/src/api/login.js +++ b/src/api/user.js @@ -1,25 +1,14 @@ import request from '@/utils/request' -export function loginByUsername(username, password) { - const data = { - username, - password - } +export function login(data) { return request({ - url: '/login/login', + url: '/user/login', method: 'post', data }) } -export function logout() { - return request({ - url: '/login/logout', - method: 'post' - }) -} - -export function getUserInfo(token) { +export function getInfo(token) { return request({ url: '/user/info', method: 'get', @@ -27,3 +16,10 @@ export function getUserInfo(token) { }) } +export function logout() { + return request({ + url: '/user/logout', + method: 'post' + }) +} + diff --git a/src/components/BackToTop/index.vue b/src/components/BackToTop/index.vue index 0c1ff792..c094037f 100644 --- a/src/components/BackToTop/index.vue +++ b/src/components/BackToTop/index.vue @@ -88,29 +88,29 @@ export default { </script> <style scoped> - .back-to-ceiling { - position: fixed; - display: inline-block; - text-align: center; - cursor: pointer; - } +.back-to-ceiling { + position: fixed; + display: inline-block; + text-align: center; + cursor: pointer; +} - .back-to-ceiling:hover { - background: #d5dbe7; - } +.back-to-ceiling:hover { + background: #d5dbe7; +} - .fade-enter-active, - .fade-leave-active { - transition: opacity .5s; - } +.fade-enter-active, +.fade-leave-active { + transition: opacity .5s; +} - .fade-enter, - .fade-leave-to { - opacity: 0 - } +.fade-enter, +.fade-leave-to { + opacity: 0 +} - .back-to-ceiling .Icon { - fill: #9aaabf; - background: none; - } +.back-to-ceiling .Icon { + fill: #9aaabf; + background: none; +} </style> diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 9e78b1ec..ff93ff45 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -2,9 +2,8 @@ <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> - <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect"> - {{ generateTitle(item.meta.title) }} - </span> + <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ + generateTitle(item.meta.title) }}</span> <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> </el-breadcrumb-item> </transition-group> @@ -59,15 +58,16 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> - .app-breadcrumb.el-breadcrumb { - display: inline-block; - font-size: 14px; - line-height: 50px; - margin-left: 8px; - .no-redirect { - color: #97a8be; - cursor: text; - } +<style lang="scss" scoped> +.app-breadcrumb.el-breadcrumb { + display: inline-block; + font-size: 14px; + line-height: 50px; + margin-left: 8px; + + .no-redirect { + color: #97a8be; + cursor: text; } +} </style> diff --git a/src/components/DndList/index.vue b/src/components/DndList/index.vue index 0da113eb..a4643c0a 100644 --- a/src/components/DndList/index.vue +++ b/src/components/DndList/index.vue @@ -2,9 +2,11 @@ <div class="dndList"> <div :style="{width:width1}" class="dndList-list"> <h3>{{ list1Title }}</h3> - <draggable :list="list1" :options="{group:'article'}" class="dragArea"> + <draggable :list="list1" group="article" class="dragArea"> <div v-for="element in list1" :key="element.id" class="list-complete-item"> - <div class="list-complete-item-handle">{{ element.id }}[{{ element.author }}] {{ element.title }}</div> + <div class="list-complete-item-handle"> + {{ element.id }}[{{ element.author }}] {{ element.title }} + </div> <div style="position:absolute;right:0px;"> <span style="float: right ;margin-top: -20px;margin-right:5px;" @click="deleteEle(element)"> <i style="color:#ff4949" class="el-icon-delete" /> @@ -15,9 +17,11 @@ </div> <div :style="{width:width2}" class="dndList-list"> <h3>{{ list2Title }}</h3> - <draggable :list="list2" :options="{group:'article'}" class="dragArea"> + <draggable :list="list2" group="article" class="dragArea"> <div v-for="element in list2" :key="element.id" class="list-complete-item"> - <div class="list-complete-item-handle2" @click="pushEle(element)">{{ element.id }} [{{ element.author }}] {{ element.title }}</div> + <div class="list-complete-item-handle2" @click="pushEle(element)"> + {{ element.id }} [{{ element.author }}] {{ element.title }} + </div> </div> </draggable> </div> @@ -95,7 +99,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .dndList { background: #fff; padding-bottom: 40px; diff --git a/src/components/Dropzone/index.vue b/src/components/Dropzone/index.vue index 081f0067..bad9eb90 100644 --- a/src/components/Dropzone/index.vue +++ b/src/components/Dropzone/index.vue @@ -237,7 +237,7 @@ export default { .dropzone .dz-preview:hover .dz-image img { transform: none; - -webkit-filter: none; + filter: none; width: 100%; height: 100%; } diff --git a/src/components/ErrorLog/index.vue b/src/components/ErrorLog/index.vue index c46cf110..198e4916 100644 --- a/src/components/ErrorLog/index.vue +++ b/src/components/ErrorLog/index.vue @@ -12,17 +12,23 @@ <template slot-scope="scope"> <div> <span class="message-title">Msg:</span> - <el-tag type="danger">{{ scope.row.err.message }}</el-tag> + <el-tag type="danger"> + {{ scope.row.err.message }} + </el-tag> </div> <br> <div> <span class="message-title" style="padding-right: 10px;">Info: </span> - <el-tag type="warning">{{ scope.row.vm.$vnode.tag }} error in {{ scope.row.info }}</el-tag> + <el-tag type="warning"> + {{ scope.row.vm.$vnode.tag }} error in {{ scope.row.info }} + </el-tag> </div> <br> <div> <span class="message-title" style="padding-right: 16px;">Url: </span> - <el-tag type="success">{{ scope.row.url }}</el-tag> + <el-tag type="success"> + {{ scope.row.url }} + </el-tag> </div> </template> </el-table-column> @@ -33,7 +39,6 @@ </el-table-column> </el-table> </el-dialog> - </div> </template> diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue index ca7457c1..368b0021 100644 --- a/src/components/Hamburger/index.vue +++ b/src/components/Hamburger/index.vue @@ -20,10 +20,11 @@ export default { isActive: { type: Boolean, default: false - }, - toggleClick: { - type: Function, - default: null + } + }, + methods: { + toggleClick() { + this.$emit('toggleClick') } } } diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index c4276d96..6668ad5c 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -18,6 +18,8 @@ </template> <script> +// fuse is a lightweight fuzzy-search module +// make search results more in line with expectations import Fuse from 'fuse.js' import path from 'path' import i18n from '@/lang' diff --git a/src/components/Kanban/index.vue b/src/components/Kanban/index.vue index 059e4186..1171b5b8 100644 --- a/src/components/Kanban/index.vue +++ b/src/components/Kanban/index.vue @@ -5,7 +5,7 @@ </div> <draggable :list="list" - :options="options" + v-bind="$attrs" class="board-column-content" > <div v-for="element in list" :key="element.id" class="board-item"> diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue index 9130efc7..7fe30b5d 100644 --- a/src/components/LangSelect/index.vue +++ b/src/components/LangSelect/index.vue @@ -27,7 +27,7 @@ export default { methods: { handleSetLanguage(lang) { this.$i18n.locale = lang - this.$store.dispatch('setLanguage', lang) + this.$store.dispatch('app/setLanguage', lang) this.$message({ message: 'Switch Language Success', type: 'success' diff --git a/src/components/MDinput/index.vue b/src/components/MDinput/index.vue index c774aa0e..013462fa 100644 --- a/src/components/MDinput/index.vue +++ b/src/components/MDinput/index.vue @@ -197,7 +197,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> // Fonts: $font-size-base: 16px; $font-size-small: 18px; diff --git a/src/components/RightPanel/index.vue b/src/components/RightPanel/index.vue new file mode 100644 index 00000000..63408d8b --- /dev/null +++ b/src/components/RightPanel/index.vue @@ -0,0 +1,152 @@ +<template> + <div ref="rightPanel" :class="{show:show}" class="rightPanel-container"> + <div class="rightPanel-background" /> + <div class="rightPanel"> + <div class="handle-button" :style="{'top':buttonTop+'px','background-color':theme}" @click="show=!show"> + <i :class="show?'el-icon-close':'el-icon-setting'" /> + </div> + <div class="rightPanel-items"> + <slot /> + </div> + </div> + </div> +</template> + +<script> +import { addClass, removeClass } from '@/utils' + +export default { + name: 'RightPanel', + props: { + clickNotClose: { + default: false, + type: Boolean + }, + buttonTop: { + default: 250, + type: Number + } + }, + data() { + return { + show: false + } + }, + computed: { + theme() { + return this.$store.state.settings.theme + } + }, + watch: { + show(value) { + if (value && !this.clickNotClose) { + this.addEventClick() + } + if (value) { + addClass(document.body, 'showRightPanel') + } else { + removeClass(document.body, 'showRightPanel') + } + } + }, + mounted() { + this.insertToBody() + }, + beforeDestroy() { + const elx = this.$refs.rightPanel + elx.remove() + }, + methods: { + addEventClick() { + window.addEventListener('click', this.closeSidebar) + }, + closeSidebar(evt) { + const parent = evt.target.closest('.rightPanel') + if (!parent) { + this.show = false + window.removeEventListener('click', this.closeSidebar) + } + }, + insertToBody() { + const elx = this.$refs.rightPanel + const body = document.querySelector('body') + body.insertBefore(elx, body.firstChild) + } + } +} +</script> + +<style> +.showRightPanel { + overflow: hidden; + position: relative; + width: calc(100% - 15px); +} +</style> + +<style lang="scss" scoped> +.rightPanel-background { + opacity: 0; + transition: opacity .3s cubic-bezier(.7, .3, .1, 1); + background: rgba(0, 0, 0, .2); + width: 0; + height: 0; + top: 0; + left: 0; + position: fixed; + z-index: -1; +} + +.rightPanel { + background: #fff; + z-index: 3000; + position: fixed; + height: 100vh; + width: 100%; + max-width: 260px; + top: 0px; + left: 0px; + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05); + transition: all .25s cubic-bezier(.7, .3, .1, 1); + transform: translate(100%); + z-index: 40000; + left: auto; + right: 0px; +} + +.show { + transition: all .3s cubic-bezier(.7, .3, .1, 1); + + .rightPanel-background { + z-index: 20000; + opacity: 1; + width: 100%; + height: 100%; + } + + .rightPanel { + transform: translate(0); + } +} + +.handle-button { + position: absolute; + left: -48px; + border-radius: 6px 0 0 6px !important; + width: 48px; + height: 48px; + pointer-events: auto; + z-index: 0; + cursor: pointer; + pointer-events: auto; + font-size: 24px; + text-align: center; + color: #fff; + line-height: 48px; + + i { + font-size: 24px; + line-height: 48px; + } +} +</style> diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index 479bf3e3..260c90de 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -17,6 +17,9 @@ export default { mounted() { this.init() }, + beforeDestroy() { + this.destroy() + }, methods: { click() { if (!screenfull.enabled) { @@ -28,11 +31,17 @@ export default { } screenfull.toggle() }, + change() { + this.isFullscreen = screenfull.isFullscreen + }, init() { if (screenfull.enabled) { - screenfull.on('change', () => { - this.isFullscreen = screenfull.isFullscreen - }) + screenfull.on('change', this.change) + } + }, + destroy() { + if (screenfull.enabled) { + screenfull.off('change', this.change) } } } diff --git a/src/components/Share/dropdownMenu.vue b/src/components/Share/dropdownMenu.vue index f7b1dd2c..ac29bde7 100644 --- a/src/components/Share/dropdownMenu.vue +++ b/src/components/Share/dropdownMenu.vue @@ -37,7 +37,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" > +<style lang="scss" > $n: 8; //和items.length 相同 $t: .1s; .share-dropdown-menu { diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue index 0fa61706..e88065b4 100644 --- a/src/components/SizeSelect/index.vue +++ b/src/components/SizeSelect/index.vue @@ -5,7 +5,8 @@ </div> <el-dropdown-menu slot="dropdown"> <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value"> - {{ item.label }} + {{ + item.label }} </el-dropdown-item> </el-dropdown-menu> </el-dropdown> @@ -31,7 +32,7 @@ export default { methods: { handleSetSize(size) { this.$ELEMENT.size = size - this.$store.dispatch('setSize', size) + this.$store.dispatch('app/setSize', size) this.refreshView() this.$message({ message: 'Switch Size Success', @@ -40,7 +41,7 @@ export default { }, refreshView() { // In order to make the cached page re-rendered - this.$store.dispatch('delAllCachedViews', this.$route) + this.$store.dispatch('tagsView/delAllCachedViews', this.$route) const { fullPath } = this.$route diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index f6784710..0a556248 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -1,7 +1,7 @@ <template> <el-color-picker v-model="theme" - :predefine="['#409EFF', '#11a983', '#13c2c2', '#6959CD', '#f5222d', '#eb2f96', '#DB7093', '#e6a23c', '#8B8989', '#212121']" + :predefine="['#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d', ]" class="theme-picker" popper-class="theme-picker-dropdown" /> @@ -11,21 +11,31 @@ const version = require('element-ui/package.json').version // element-ui version from node_modules const ORIGINAL_THEME = '#409EFF' // default color +import defaultSettings from '@/settings' export default { data() { return { chalk: '', // content of theme-chalk css - theme: ORIGINAL_THEME + theme: defaultSettings.theme } }, watch: { - theme(val) { - const oldVal = this.theme + async theme(val) { + const oldVal = this.chalk ? this.theme : ORIGINAL_THEME if (typeof val !== 'string') return const themeCluster = this.getThemeCluster(val.replace('#', '')) const originalCluster = this.getThemeCluster(oldVal.replace('#', '')) console.log(themeCluster, originalCluster) + + const $message = this.$message({ + message: ' Compiling the theme', + customClass: 'theme-message', + type: 'success', + duration: 0, + iconClass: 'el-icon-loading' + }) + const getHandler = (variable, id) => { return () => { const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', '')) @@ -41,15 +51,15 @@ export default { } } - const chalkHandler = getHandler('chalk', 'chalk-style') - if (!this.chalk) { const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css` - this.getCSSString(url, chalkHandler, 'chalk') - } else { - chalkHandler() + await this.getCSSString(url, 'chalk') } + const chalkHandler = getHandler('chalk', 'chalk-style') + + chalkHandler() + const styles = [].slice.call(document.querySelectorAll('style')) .filter(style => { const text = style.innerText @@ -60,39 +70,34 @@ export default { if (typeof innerText !== 'string') return style.innerText = this.updateStyle(innerText, originalCluster, themeCluster) }) - this.$message({ - message: '换肤成功', - type: 'success' - }) + + this.$emit('change', val) + + $message.close() } }, methods: { updateStyle(style, oldCluster, newCluster) { - const colorOverrides = [] // only capture color overides + let newStyle = style oldCluster.forEach((color, index) => { - const value = newCluster[index] - const color_plain = color.replace(/([()])/g, '\\$1') - const repl = new RegExp(`(^|})([^{]+{[^{}]+)${color_plain}\\b([^}]*)(?=})`, 'gi') - const nestRepl = new RegExp(color_plain, 'ig') // for greed matching before the 'color' - let v - while ((v = repl.exec(style))) { - colorOverrides.push(v[2].replace(nestRepl, value) + value + v[3] + '}') // '}' not captured in the regexp repl to reserve it as locator-boundary - } + newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index]) }) - return colorOverrides.join('') + return newStyle }, - getCSSString(url, callback, variable) { - const xhr = new XMLHttpRequest() - xhr.onreadystatechange = () => { - if (xhr.readyState === 4 && xhr.status === 200) { - this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '') - callback() + getCSSString(url, variable) { + return new Promise(resolve => { + const xhr = new XMLHttpRequest() + xhr.onreadystatechange = () => { + if (xhr.readyState === 4 && xhr.status === 200) { + this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '') + resolve() + } } - } - xhr.open('GET', url) - xhr.send() + xhr.open('GET', url) + xhr.send() + }) }, getThemeCluster(theme) { @@ -144,10 +149,14 @@ export default { </script> <style> +.theme-message, +.theme-picker-dropdown { + z-index: 99999 !important; +} + .theme-picker .el-color-picker__trigger { - margin-top: 12px; - height: 26px!important; - width: 26px!important; + height: 26px !important; + width: 26px !important; padding: 2px; } diff --git a/src/components/Tinymce/components/editorImage.vue b/src/components/Tinymce/components/editorImage.vue index ea834652..b3a4a2be 100644 --- a/src/components/Tinymce/components/editorImage.vue +++ b/src/components/Tinymce/components/editorImage.vue @@ -15,10 +15,16 @@ action="https://httpbin.org/post" list-type="picture-card" > - <el-button size="small" type="primary">点击上传</el-button> + <el-button size="small" type="primary"> + 点击上传 + </el-button> </el-upload> - <el-button @click="dialogVisible = false">取 消</el-button> - <el-button type="primary" @click="handleSubmit">确 定</el-button> + <el-button @click="dialogVisible = false"> + 取 消 + </el-button> + <el-button type="primary" @click="handleSubmit"> + 确 定 + </el-button> </el-dialog> </div> </template> @@ -95,7 +101,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .editor-slide-upload { margin-bottom: 20px; /deep/ .el-upload--picture-card { diff --git a/src/components/TreeTable/README.md b/src/components/TreeTable/README.md deleted file mode 100644 index 05326dfa..00000000 --- a/src/components/TreeTable/README.md +++ /dev/null @@ -1,220 +0,0 @@ - -- [Enlgish](#Brief) - -# 中文 - -## 写在前面 - -此组件仅提供一个创建 `TreeTable` 的解决思路。它基于`element-ui`的 table 组件实现,通过`el-table`的`row-style`方法,在里面判断元素是否需要隐藏或者显示,从而实现`TreeTable`的展开与收起。 - -并且本组件充分利用 `vue` 插槽的特性来方便用户自定义。 - -`evel.js` 里面,`addAttrs` 方法会给数据添加几个属性,`treeTotable` 会对数组扁平化。这些操作都不会破坏源数据,只是会新增属性。 - -## Props 说明 - -| Attribute | Description | Type | Default | -| :--------------: | :--------------------------------- | :-----: | :------: | -| data | 原始展示数据 | Array | [] | -| columns | 列属性 | Array | [] | -| defaultExpandAll | 默认是否全部展开 | Boolean | false | -| defaultChildren | 指定子树为节点对象的某个属性值 | String | children | | -| indent | 相邻级节点间的水平缩进,单位为像素 | Number | 50 | - -> 任何 `el-table` 的属性都支持,例如`border`、`fit`、`size`或者`@select`、`@cell-click`等方法。详情属性见`el-table`文档。 - ---- - -### 代码示例 - -```html -<tree-table :data="data" :columns="columns" border> -``` - -#### data(**必填**) - -```js -const data = [ - { - name:'1' - children: [ - { - name: '1-1' - }, - { - name: '1-2' - } - ] - }, - { - name: `2` - } -] -``` - -#### columns(**必填**) - -- label: 显示在表头的文字 -- key: 对应 data 的 key。treeTable 将显示相应的 value -- expand: `true` or `false`。若为 true,则在该列显示展开收起图标 -- checkbox: `true` or `false`。若为 true,则在该列显示`checkbox` -- width: 每列的宽度,为一个数字(可选)。例如`200` -- align: 对齐方式 `left/center/right` -- header-align: 表头对齐方式 `left/center/right` - -```javascript -const columns = [ - { - label: 'Checkbox', - checkbox: true - }, - { - label: '', - key: 'id', - expand: true - }, - { - label: 'Event', - key: 'event', - width: 200, - align: 'left' - }, - { - label: 'Scope', - key: 'scope' - } -] -``` - -> 树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 - -```html -<template slot="your key" slot-scope="{scope}"> - <el-tag>level: {{ scope.row._level }}</el-tag> - <el-tag>expand: {{ scope.row._expand }}</el-tag> - <el-tag>select: {{ scope.row._select }}</el-tag> -</template> -``` - -## Events - -目前提供了几个方法,不过只是`beta`版本,之后很可能会修改。 - -```js -this.$refs.TreeTable.addChild(row, data) //添加子元素 -this.$refs.TreeTable.addBrother(row, data) //添加兄弟元素 -this.$refs.TreeTable.delete(row) //删除该元素 -``` - -## 其他 - -如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue - -# English - -## Brief - -This component only provides a solution for creating `TreeTable`. It is based on the `element-ui` table component. It uses the `row-style` method of `el-table` to determine whether the element needs to be hidden or displayed. - -And this component makes full use of the features of the `vue` slot to make it user-friendly. - -In `evel.js`, the `addAttrs` method adds several properties to the data, and `treeTotable` flattens the array. None of these operations will destroy the source data, just add properties. - -## Props - -| Attribute | Description | Type | Default | -| :--------------: | :----------------------------------------------------------- | :-----: | :------: | -| data | original display data | Array | [] | -| columns | column attribute | Array | [] | -| defaultExpandAll | whether to expand all nodes by default | Boolean | false | -| defaultChildren | specify which node object is used as the node's subtree | String | children | | -| indent | horizontal indentation of nodes in adjacent levels in pixels | Number | 50 | - -> Any of the `el-table` properties are supported, such as `border`, `fit`, `size` or `@select`, `@cell-click`. See the ʻel-table` documentation for details. - ---- - -### Example - -```html -<tree-table :data="data" :columns="columns" border> -``` - -#### data(**Required**) - -```js -const data = [ - { - name:'1' - children: [ - { - name: '1-1' - }, - { - name: '1-2' - } - ] - }, - { - name: `2` - } -] -``` - -#### columns(**Required**) - -- label: text displayed in the header -- key: data.key will show in column -- expand: `true` or `false` -- checkbox: `true` or `false` -- width: column width 。such as `200` -- align: alignment `left/center/right` -- header-align: alignment of the table header `left/center/right` - -```javascript -const columns = [ - { - label: 'Checkbox', - checkbox: true - }, - { - label: '', - key: 'id', - expand: true - }, - { - label: 'Event', - key: 'event', - width: 200, - align: 'left' - }, - { - label: 'Scope', - key: 'scope' - } -] -``` - -> The tree table component will generate a named slot based on the key property of columns. If you need to customize the column data, you can do it through the slot. - -```html -<template slot="your key" slot-scope="{scope}"> - <el-tag>level: {{ scope.row._level }}</el-tag> - <el-tag>expand: {{ scope.row._expand }}</el-tag> - <el-tag>select: {{ scope.row._select }}</el-tag> -</template> -``` - -## Events - -Several methods are currently available, but only the `beta` version, which is likely to be modified later. - -```js -this.$refs.TreeTable.addChild(row, data) //Add child elements -this.$refs.TreeTable.addBrother(row, data) //Add a sibling element -this.$refs.TreeTable.delete(row) //Delete the element -``` - -## Other - -If you have other requirements, please refer to the [el-table](http://element-cn.eleme.io/#/en-US/component/table) api to modify the index.vue diff --git a/src/components/TreeTable/eval.js b/src/components/TreeTable/eval.js deleted file mode 100644 index 8659ead8..00000000 --- a/src/components/TreeTable/eval.js +++ /dev/null @@ -1,48 +0,0 @@ -import Vue from 'vue' - -// Flattened array -export default function treeToArray(data, children = 'children') { - let tmp = [] - data.forEach((item, index) => { - Vue.set(item, '_index', index) - tmp.push(item) - if (item[children] && item[children].length > 0) { - const res = treeToArray(item[children], children) - tmp = tmp.concat(res) - } - }) - return tmp -} - -export function addAttrs(data, { parent = null, preIndex = false, level = 0, expand = false, children = 'children', show = true, select = false } = {}) { - data.forEach((item, index) => { - const _id = (preIndex ? `${preIndex}-${index}` : index) + '' - Vue.set(item, '_id', _id) - Vue.set(item, '_level', level) - Vue.set(item, '_expand', expand) - Vue.set(item, '_parent', parent) - Vue.set(item, '_show', show) - Vue.set(item, '_select', select) - if (item[children] && item[children].length > 0) { - addAttrs(item[children], { - parent: item, - level: level + 1, - expand, - preIndex: _id, - children, - status, - select - }) - } - }) -} - -export function cleanParentAttr(data, children = 'children') { - data.forEach(item => { - item._parent = null - if (item[children] && item[children].length > 0) { - addAttrs(item[children], children) - } - }) - return data -} diff --git a/src/components/TreeTable/index.vue b/src/components/TreeTable/index.vue deleted file mode 100644 index 92ddc434..00000000 --- a/src/components/TreeTable/index.vue +++ /dev/null @@ -1,193 +0,0 @@ -<template> - <el-table :data="tableData" :row-style="showRow" v-bind="$attrs" v-on="$listeners"> - <slot name="selection" /> - <slot name="pre-column" /> - <el-table-column - v-for="item in columns" - :key="item.key" - :label="item.label" - :width="item.width" - :align="item.align||'center'" - :header-align="item.headerAlign" - > - <template slot-scope="scope"> - <slot :scope="scope" :name="item.key"> - <template v-if="item.expand"> - <span :style="{'padding-left':+scope.row._level*indent + 'px'} " /> - <span v-show="showSperadIcon(scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)"> - <i v-if="!scope.row._expand" class="el-icon-plus" /> - <i v-else class="el-icon-minus" /> - </span> - </template> - <template v-if="item.checkbox"> - <el-checkbox - v-if="scope.row[defaultChildren]&&scope.row[defaultChildren].length>0" - v-model="scope.row._select" - :style="{'padding-left':+scope.row._level*indent + 'px'} " - :indeterminate="scope.row._select" - @change="handleCheckAllChange(scope.row)" - /> - <el-checkbox - v-else - v-model="scope.row._select" - :style="{'padding-left':+scope.row._level*indent + 'px'} " - @change="handleCheckAllChange(scope.row)" - /> - </template> - {{ scope.row[item.key] }} - </slot> - </template> - </el-table-column> - </el-table> -</template> - -<script> -import treeToArray, { addAttrs } from './eval.js' - -export default { - name: 'TreeTable', - props: { - data: { - type: Array, - required: true, - default: () => [] - }, - columns: { - type: Array, - default: () => [] - }, - defaultExpandAll: { - type: Boolean, - default: false - }, - defaultChildren: { - type: String, - default: 'children' - }, - indent: { - type: Number, - default: 50 - } - }, - data() { - return { - guard: 1 - } - }, - computed: { - children() { - return this.defaultChildren - }, - tableData() { - const data = this.data - if (this.data.length === 0) { - return [] - } - addAttrs(data, { - expand: this.defaultExpandAll, - children: this.defaultChildren - }) - - const retval = treeToArray(data, this.defaultChildren) - return retval - } - }, - methods: { - addBrother(row, data) { - if (row._parent) { - row._parent.children.push(data) - } else { - this.data.push(data) - } - }, - addChild(row, data) { - if (!row.children) { - this.$set(row, 'children', []) - } - row.children.push(data) - }, - delete(row) { - const { _index, _parent } = row - if (_parent) { - _parent.children.splice(_index, 1) - } else { - this.data.splice(_index, 1) - } - }, - getData() { - return this.tableData - }, - showRow: function({ row }) { - const parent = row._parent - const show = parent ? parent._expand && parent._show : true - row._show = show - return show - ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' - : 'display:none;' - }, - showSperadIcon(record) { - return record[this.children] && record[this.children].length > 0 - }, - toggleExpanded(trIndex) { - const record = this.tableData[trIndex] - const expand = !record._expand - record._expand = expand - }, - handleCheckAllChange(row) { - this.selcetRecursion(row, row._select, this.defaultChildren) - this.isIndeterminate = row._select - }, - selcetRecursion(row, select, children = 'children') { - if (select) { - this.$set(row, '_expand', true) - this.$set(row, '_show', true) - } - const sub_item = row[children] - if (sub_item && sub_item.length > 0) { - sub_item.map(child => { - child._select = select - this.selcetRecursion(child, select, children) - }) - } - }, - updateTreeNode(item) { - return new Promise(resolve => { - const { _id, _parent } = item - const index = _id.split('-').slice(-1)[0] // get last index - if (_parent) { - _parent.children.splice(index, 1, item) - resolve(this.data) - } else { - this.data.splice(index, 1, item) - resolve(this.data) - } - }) - } - } -} -</script> - -<style> -@keyframes treeTableShow { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@-webkit-keyframes treeTableShow { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -.tree-ctrl { - position: relative; - cursor: pointer; - color: #2196f3; -} -</style> diff --git a/src/components/TreeTable/readme.md b/src/components/TreeTable/readme.md deleted file mode 100644 index 05326dfa..00000000 --- a/src/components/TreeTable/readme.md +++ /dev/null @@ -1,220 +0,0 @@ - -- [Enlgish](#Brief) - -# 中文 - -## 写在前面 - -此组件仅提供一个创建 `TreeTable` 的解决思路。它基于`element-ui`的 table 组件实现,通过`el-table`的`row-style`方法,在里面判断元素是否需要隐藏或者显示,从而实现`TreeTable`的展开与收起。 - -并且本组件充分利用 `vue` 插槽的特性来方便用户自定义。 - -`evel.js` 里面,`addAttrs` 方法会给数据添加几个属性,`treeTotable` 会对数组扁平化。这些操作都不会破坏源数据,只是会新增属性。 - -## Props 说明 - -| Attribute | Description | Type | Default | -| :--------------: | :--------------------------------- | :-----: | :------: | -| data | 原始展示数据 | Array | [] | -| columns | 列属性 | Array | [] | -| defaultExpandAll | 默认是否全部展开 | Boolean | false | -| defaultChildren | 指定子树为节点对象的某个属性值 | String | children | | -| indent | 相邻级节点间的水平缩进,单位为像素 | Number | 50 | - -> 任何 `el-table` 的属性都支持,例如`border`、`fit`、`size`或者`@select`、`@cell-click`等方法。详情属性见`el-table`文档。 - ---- - -### 代码示例 - -```html -<tree-table :data="data" :columns="columns" border> -``` - -#### data(**必填**) - -```js -const data = [ - { - name:'1' - children: [ - { - name: '1-1' - }, - { - name: '1-2' - } - ] - }, - { - name: `2` - } -] -``` - -#### columns(**必填**) - -- label: 显示在表头的文字 -- key: 对应 data 的 key。treeTable 将显示相应的 value -- expand: `true` or `false`。若为 true,则在该列显示展开收起图标 -- checkbox: `true` or `false`。若为 true,则在该列显示`checkbox` -- width: 每列的宽度,为一个数字(可选)。例如`200` -- align: 对齐方式 `left/center/right` -- header-align: 表头对齐方式 `left/center/right` - -```javascript -const columns = [ - { - label: 'Checkbox', - checkbox: true - }, - { - label: '', - key: 'id', - expand: true - }, - { - label: 'Event', - key: 'event', - width: 200, - align: 'left' - }, - { - label: 'Scope', - key: 'scope' - } -] -``` - -> 树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 - -```html -<template slot="your key" slot-scope="{scope}"> - <el-tag>level: {{ scope.row._level }}</el-tag> - <el-tag>expand: {{ scope.row._expand }}</el-tag> - <el-tag>select: {{ scope.row._select }}</el-tag> -</template> -``` - -## Events - -目前提供了几个方法,不过只是`beta`版本,之后很可能会修改。 - -```js -this.$refs.TreeTable.addChild(row, data) //添加子元素 -this.$refs.TreeTable.addBrother(row, data) //添加兄弟元素 -this.$refs.TreeTable.delete(row) //删除该元素 -``` - -## 其他 - -如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue - -# English - -## Brief - -This component only provides a solution for creating `TreeTable`. It is based on the `element-ui` table component. It uses the `row-style` method of `el-table` to determine whether the element needs to be hidden or displayed. - -And this component makes full use of the features of the `vue` slot to make it user-friendly. - -In `evel.js`, the `addAttrs` method adds several properties to the data, and `treeTotable` flattens the array. None of these operations will destroy the source data, just add properties. - -## Props - -| Attribute | Description | Type | Default | -| :--------------: | :----------------------------------------------------------- | :-----: | :------: | -| data | original display data | Array | [] | -| columns | column attribute | Array | [] | -| defaultExpandAll | whether to expand all nodes by default | Boolean | false | -| defaultChildren | specify which node object is used as the node's subtree | String | children | | -| indent | horizontal indentation of nodes in adjacent levels in pixels | Number | 50 | - -> Any of the `el-table` properties are supported, such as `border`, `fit`, `size` or `@select`, `@cell-click`. See the ʻel-table` documentation for details. - ---- - -### Example - -```html -<tree-table :data="data" :columns="columns" border> -``` - -#### data(**Required**) - -```js -const data = [ - { - name:'1' - children: [ - { - name: '1-1' - }, - { - name: '1-2' - } - ] - }, - { - name: `2` - } -] -``` - -#### columns(**Required**) - -- label: text displayed in the header -- key: data.key will show in column -- expand: `true` or `false` -- checkbox: `true` or `false` -- width: column width 。such as `200` -- align: alignment `left/center/right` -- header-align: alignment of the table header `left/center/right` - -```javascript -const columns = [ - { - label: 'Checkbox', - checkbox: true - }, - { - label: '', - key: 'id', - expand: true - }, - { - label: 'Event', - key: 'event', - width: 200, - align: 'left' - }, - { - label: 'Scope', - key: 'scope' - } -] -``` - -> The tree table component will generate a named slot based on the key property of columns. If you need to customize the column data, you can do it through the slot. - -```html -<template slot="your key" slot-scope="{scope}"> - <el-tag>level: {{ scope.row._level }}</el-tag> - <el-tag>expand: {{ scope.row._expand }}</el-tag> - <el-tag>select: {{ scope.row._select }}</el-tag> -</template> -``` - -## Events - -Several methods are currently available, but only the `beta` version, which is likely to be modified later. - -```js -this.$refs.TreeTable.addChild(row, data) //Add child elements -this.$refs.TreeTable.addBrother(row, data) //Add a sibling element -this.$refs.TreeTable.delete(row) //Delete the element -``` - -## Other - -If you have other requirements, please refer to the [el-table](http://element-cn.eleme.io/#/en-US/component/table) api to modify the index.vue diff --git a/src/components/Upload/singleImage.vue b/src/components/Upload/singleImage.vue index 0609a79d..ecec20a9 100644 --- a/src/components/Upload/singleImage.vue +++ b/src/components/Upload/singleImage.vue @@ -10,7 +10,9 @@ action="https://httpbin.org/post" > <i class="el-icon-upload" /> - <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> + <div class="el-upload__text"> + 将文件拖到此处,或<em>点击上传</em> + </div> </el-upload> <div class="image-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> @@ -76,8 +78,8 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> - @import "src/styles/mixin.scss"; +<style lang="scss" scoped> + @import "~@/styles/mixin.scss"; .upload-container { width: 100%; position: relative; diff --git a/src/components/Upload/singleImage2.vue b/src/components/Upload/singleImage2.vue index a14d028f..07637a9e 100644 --- a/src/components/Upload/singleImage2.vue +++ b/src/components/Upload/singleImage2.vue @@ -10,7 +10,9 @@ action="https://httpbin.org/post" > <i class="el-icon-upload" /> - <div class="el-upload__text">Drag或<em>点击上传</em></div> + <div class="el-upload__text"> + Drag或<em>点击上传</em> + </div> </el-upload> <div v-show="imageUrl.length>0" class="image-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> @@ -74,7 +76,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .upload-container { width: 100%; height: 100%; diff --git a/src/components/Upload/singleImage3.vue b/src/components/Upload/singleImage3.vue index 5eef0d1e..6300da4b 100644 --- a/src/components/Upload/singleImage3.vue +++ b/src/components/Upload/singleImage3.vue @@ -10,7 +10,9 @@ action="https://httpbin.org/post" > <i class="el-icon-upload" /> - <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> + <div class="el-upload__text"> + 将文件拖到此处,或<em>点击上传</em> + </div> </el-upload> <div class="image-preview image-app-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> @@ -83,7 +85,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> @import "~@/styles/mixin.scss"; .upload-container { width: 100%; diff --git a/src/components/UploadExcel/index.vue b/src/components/UploadExcel/index.vue index a6b8dbce..9e8ba8b6 100644 --- a/src/components/UploadExcel/index.vue +++ b/src/components/UploadExcel/index.vue @@ -3,7 +3,9 @@ <input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick"> <div class="drop" @drop="handleDrop" @dragover="handleDragover" @dragenter="handleDragover"> Drop excel file here or - <el-button :loading="loading" style="margin-left:16px;" size="mini" type="primary" @click="handleUpload">Browse</el-button> + <el-button :loading="loading" style="margin-left:16px;" size="mini" type="primary" @click="handleUpload"> + Browse + </el-button> </div> </div> </template> diff --git a/src/directive/waves/waves.js b/src/directive/waves/waves.js index 38e07f88..ec2ff439 100644 --- a/src/directive/waves/waves.js +++ b/src/directive/waves/waves.js @@ -5,13 +5,12 @@ const context = '@@wavesContext' function handleClick(el, binding) { function handle(e) { const customOpts = Object.assign({}, binding.value) - const opts = Object.assign( - { - ele: el, // 波纹作用元素 - type: 'hit', // hit 点击位置扩散 center中心点扩展 - color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 - }, - customOpts + const opts = Object.assign({ + ele: el, // 波纹作用元素 + type: 'hit', // hit 点击位置扩散 center中心点扩展 + color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 + }, + customOpts ) const target = opts.ele if (target) { diff --git a/src/errorLog.js b/src/errorLog.js deleted file mode 100644 index 00b18b72..00000000 --- a/src/errorLog.js +++ /dev/null @@ -1,19 +0,0 @@ -import Vue from 'vue' -import store from './store' - -// you can set only in production env show the error-log -if (process.env.NODE_ENV === 'production') { - Vue.config.errorHandler = function(err, vm, info, a) { - // Don't ask me why I use Vue.nextTick, it just a hack. - // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500 - Vue.nextTick(() => { - store.dispatch('addErrorLog', { - err, - vm, - info, - url: window.location.href - }) - console.error(err, info) - }) - } -} diff --git a/src/lang/en.js b/src/lang/en.js index 963c60d3..ef4548e7 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -43,8 +43,6 @@ export default { dragTable: 'Drag Table', inlineEditTable: 'Inline Edit', complexTable: 'Complex Table', - treeTable: 'Tree Table', - customTreeTable: 'Custom TreeTable', tab: 'Tab', form: 'Form', createArticle: 'Create Article', @@ -163,5 +161,12 @@ export default { close: 'Close', closeOthers: 'Close Others', closeAll: 'Close All' + }, + settings: { + title: 'Page style setting', + theme: 'Theme Color', + tagsView: 'Open Tags-View', + fixedHeader: 'Fixed Header', + sidebarLogo: 'Sidebar Logo' } } diff --git a/src/lang/es.js b/src/lang/es.js index 31fa8303..89a9e9d3 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -43,8 +43,6 @@ export default { dragTable: 'Arrastrar tabla', inlineEditTable: 'Editor', complexTable: 'Complex Table', - treeTable: 'Tree Table', - customTreeTable: 'Custom TreeTable', tab: 'Pestaña', form: 'Formulario', createArticle: 'Crear artículo', @@ -163,5 +161,12 @@ export default { close: 'Cerrar', closeOthers: 'Cerrar otros', closeAll: 'Cerrar todos' + }, + settings: { + title: 'Page style setting', + theme: 'Theme Color', + tagsView: 'Open Tags-View', + fixedHeader: 'Fixed Header', + sidebarLogo: 'Sidebar Logo' } } diff --git a/src/lang/zh.js b/src/lang/zh.js index 574cba11..702725cd 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -43,8 +43,6 @@ export default { dragTable: '拖拽Table', inlineEditTable: 'Table内编辑', complexTable: '综合Table', - treeTable: '树形表格', - customTreeTable: '自定义树表', tab: 'Tab', form: '表单', createArticle: '创建文章', @@ -163,5 +161,12 @@ export default { close: '关闭', closeOthers: '关闭其它', closeAll: '关闭所有' + }, + settings: { + title: '系统布局配置', + theme: '主题色', + tagsView: '开启 Tags-View', + fixedHeader: '固定 Header', + sidebarLogo: '侧边栏 Logo' } } diff --git a/src/views/layout/components/AppMain.vue b/src/layout/components/AppMain.vue similarity index 62% rename from src/views/layout/components/AppMain.vue rename to src/layout/components/AppMain.vue index 9ee5bd52..62e6ace5 100644 --- a/src/views/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -22,13 +22,28 @@ export default { } </script> -<style scoped> +<style lang="scss" scoped> .app-main { - /*84 = navbar + tags-view = 50 +34 */ - min-height: calc(100vh - 84px); + /* 50= navbar 50 */ + min-height: calc(100vh - 50px); width: 100%; position: relative; overflow: hidden; } + +.fixed-header+.app-main { + padding-top: 50px; +} + +.hasTagsView { + .app-main { + /* 84 = navbar + tags-view = 50 + 34 */ + min-height: calc(100vh - 84px); + } + + .fixed-header+.app-main { + padding-top: 84px; + } +} </style> diff --git a/src/views/layout/components/Navbar.vue b/src/layout/components/Navbar.vue similarity index 85% rename from src/views/layout/components/Navbar.vue rename to src/layout/components/Navbar.vue index e2c095ec..b0ee54c1 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,6 +1,6 @@ <template> <div class="navbar"> - <hamburger :toggle-click="toggleSideBar" :is-active="sidebar.opened" class="hamburger-container" /> + <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> <breadcrumb class="breadcrumb-container" /> @@ -18,9 +18,6 @@ <lang-select class="right-menu-item hover-effect" /> - <el-tooltip :content="$t('navbar.theme')" effect="dark" placement="bottom"> - <theme-picker class="right-menu-item hover-effect" /> - </el-tooltip> </template> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> @@ -56,7 +53,6 @@ import ErrorLog from '@/components/ErrorLog' import Screenfull from '@/components/Screenfull' import SizeSelect from '@/components/SizeSelect' import LangSelect from '@/components/LangSelect' -import ThemePicker from '@/components/ThemePicker' import Search from '@/components/HeaderSearch' export default { @@ -67,7 +63,6 @@ export default { Screenfull, SizeSelect, LangSelect, - ThemePicker, Search }, computed: { @@ -80,21 +75,23 @@ export default { }, methods: { toggleSideBar() { - this.$store.dispatch('toggleSideBar') + this.$store.dispatch('app/toggleSideBar') }, - logout() { - this.$store.dispatch('LogOut').then(() => { - location.reload()// In order to re-instantiate the vue-router object to avoid bugs - }) + async logout() { + await this.$store.dispatch('user/logout') + this.$router.push(`/login?redirect=${this.$route.fullPath}`) } } } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .navbar { height: 50px; overflow: hidden; + position: relative; + background: #fff; + box-shadow: 0 1px 4px rgba(0,21,41,.08); .hamburger-container { line-height: 46px; @@ -102,6 +99,7 @@ export default { float: left; cursor: pointer; transition: background .3s; + -webkit-tap-highlight-color:transparent; &:hover { background: rgba(0, 0, 0, .025) diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue new file mode 100644 index 00000000..19e4e68b --- /dev/null +++ b/src/layout/components/Settings/index.vue @@ -0,0 +1,108 @@ +<template> + <div class="drawer-container"> + <div> + <h3 class="drawer-title">{{ $t('settings.title') }}</h3> + + <div class="drawer-item"> + <span>{{ $t('settings.theme') }}</span> + <theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" /> + </div> + + <div class="drawer-item"> + <span>{{ $t('settings.tagsView') }}</span> + <el-switch v-model="tagsView" class="drawer-switch" /> + </div> + + <div class="drawer-item"> + <span>{{ $t('settings.fixedHeader') }}</span> + <el-switch v-model="fixedHeader" class="drawer-switch" /> + </div> + + <div class="drawer-item"> + <span>{{ $t('settings.sidebarLogo') }}</span> + <el-switch v-model="sidebarLogo" class="drawer-switch" /> + </div> + + </div> + </div> +</template> + +<script> +import ThemePicker from '@/components/ThemePicker' + +export default { + components: { ThemePicker }, + data() { + return {} + }, + computed: { + fixedHeader: { + get() { + return this.$store.state.settings.fixedHeader + }, + set(val) { + this.$store.dispatch('settings/changeSetting', { + key: 'fixedHeader', + value: val + }) + } + }, + tagsView: { + get() { + return this.$store.state.settings.tagsView + }, + set(val) { + this.$store.dispatch('settings/changeSetting', { + key: 'tagsView', + value: val + }) + } + }, + sidebarLogo: { + get() { + return this.$store.state.settings.sidebarLogo + }, + set(val) { + this.$store.dispatch('settings/changeSetting', { + key: 'sidebarLogo', + value: val + }) + } + } + }, + methods: { + themeChange(val) { + this.$store.dispatch('settings/changeSetting', { + key: 'theme', + value: val + }) + } + } +} +</script> + +<style lang="scss" scoped> +.drawer-container { + padding: 24px; + font-size: 14px; + line-height: 1.5; + word-wrap: break-word; + + .drawer-title { + margin-bottom: 12px; + color: rgba(0, 0, 0, .85); + font-size: 14px; + line-height: 22px; + } + + .drawer-item { + color: rgba(0, 0, 0, .65); + font-size: 14px; + padding: 12px 0; + } + + .drawer-switch { + float: right + } +} +</style> diff --git a/src/views/layout/components/Sidebar/FixiOSBug.js b/src/layout/components/Sidebar/FixiOSBug.js similarity index 100% rename from src/views/layout/components/Sidebar/FixiOSBug.js rename to src/layout/components/Sidebar/FixiOSBug.js diff --git a/src/views/layout/components/Sidebar/Item.vue b/src/layout/components/Sidebar/Item.vue similarity index 100% rename from src/views/layout/components/Sidebar/Item.vue rename to src/layout/components/Sidebar/Item.vue diff --git a/src/views/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue similarity index 100% rename from src/views/layout/components/Sidebar/Link.vue rename to src/layout/components/Sidebar/Link.vue diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 00000000..ac0c8d8f --- /dev/null +++ b/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,82 @@ +<template> + <div class="sidebar-logo-container" :class="{'collapse':collapse}"> + <transition name="sidebarLogoFade"> + <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> + <img v-if="logo" :src="logo" class="sidebar-logo"> + <h1 v-else class="sidebar-title">{{ title }} </h1> + </router-link> + <router-link v-else key="expand" class="sidebar-logo-link" to="/"> + <img v-if="logo" :src="logo" class="sidebar-logo"> + <h1 class="sidebar-title">{{ title }} </h1> + </router-link> + </transition> + </div> +</template> + +<script> +export default { + name: 'SidebarLogo', + props: { + collapse: { + type: Boolean, + required: true + } + }, + data() { + return { + title: 'Vue Element Admin', + logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png' + } + } +} +</script> + +<style lang="scss" scoped> +.sidebarLogoFade-enter-active { + transition: opacity 1.5s; +} + +.sidebarLogoFade-enter, +.sidebarLogoFade-leave-to { + opacity: 0; +} + +.sidebar-logo-container { + position: relative; + width: 100%; + height: 50px; + line-height: 50px; + background: #2b2f3a; + text-align: center; + overflow: hidden; + + & .sidebar-logo-link { + height: 100%; + width: 100%; + + & .sidebar-logo { + width: 32px; + height: 32px; + vertical-align: middle; + margin-right: 12px; + } + + & .sidebar-title { + display: inline-block; + margin: 0; + color: #fff; + font-weight: 600; + line-height: 50px; + font-size: 14px; + font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; + vertical-align: middle; + } + } + + &.collapse { + .sidebar-logo { + margin-right: 0px; + } + } +} +</style> diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue similarity index 99% rename from src/views/layout/components/Sidebar/SidebarItem.vue rename to src/layout/components/Sidebar/SidebarItem.vue index 42c167fa..8c9c4328 100644 --- a/src/views/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -1,6 +1,5 @@ <template> <div v-if="!item.hidden" class="menu-wrapper"> - <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> @@ -22,7 +21,6 @@ class="nest-menu" /> </el-submenu> - </div> </template> diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 00000000..f02a4819 --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,44 @@ +<template> + <div :class="{'has-logo':showLogo}"> + <logo v-if="showLogo" :collapse="isCollapse" /> + <el-scrollbar wrap-class="scrollbar-wrapper"> + <el-menu + :default-active="$route.path" + :collapse="isCollapse" + :background-color="variables.menuBg" + :text-color="variables.menuText" + :active-text-color="variables.menuActiveText" + :collapse-transition="false" + mode="vertical" + > + <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" /> + </el-menu> + </el-scrollbar> + </div> +</template> + +<script> +import { mapGetters } from 'vuex' +import Logo from './Logo' +import SidebarItem from './SidebarItem' +import variables from '@/styles/variables.scss' + +export default { + components: { SidebarItem, Logo }, + computed: { + ...mapGetters([ + 'permission_routes', + 'sidebar' + ]), + showLogo() { + return this.$store.state.settings.sidebarLogo + }, + variables() { + return variables + }, + isCollapse() { + return !this.sidebar.opened + } + } +} +</script> diff --git a/src/views/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue similarity index 97% rename from src/views/layout/components/TagsView/ScrollPane.vue rename to src/layout/components/TagsView/ScrollPane.vue index 89c72e1c..0ec76e72 100644 --- a/src/views/layout/components/TagsView/ScrollPane.vue +++ b/src/layout/components/TagsView/ScrollPane.vue @@ -67,7 +67,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .scroll-container { white-space: nowrap; position: relative; diff --git a/src/views/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue similarity index 88% rename from src/views/layout/components/TagsView/index.vue rename to src/layout/components/TagsView/index.vue index c793ca1e..bdddaba6 100644 --- a/src/views/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -17,12 +17,19 @@ </router-link> </scroll-pane> <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> - <li @click="refreshSelectedTag(selectedTag)">{{ $t('tagsView.refresh') }}</li> - <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)"> - {{ $t('tagsView.close') }} + <li @click="refreshSelectedTag(selectedTag)"> + {{ $t('tagsView.refresh') }} + </li> + <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)"> + {{ + $t('tagsView.close') }} + </li> + <li @click="closeOthersTags"> + {{ $t('tagsView.closeOthers') }} + </li> + <li @click="closeAllTags(selectedTag)"> + {{ $t('tagsView.closeAll') }} </li> - <li @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}</li> - <li @click="closeAllTags(selectedTag)">{{ $t('tagsView.closeAll') }}</li> </ul> </div> </template> @@ -99,14 +106,14 @@ export default { for (const tag of affixTags) { // Must have tag name if (tag.name) { - this.$store.dispatch('addVisitedView', tag) + this.$store.dispatch('tagsView/addVisitedView', tag) } } }, addTags() { const { name } = this.$route if (name) { - this.$store.dispatch('addView', this.$route) + this.$store.dispatch('tagsView/addView', this.$route) } return false }, @@ -118,7 +125,7 @@ export default { this.$refs.scrollPane.moveToTarget(tag) // when query is different then update if (tag.to.fullPath !== this.$route.fullPath) { - this.$store.dispatch('updateVisitedView', this.$route) + this.$store.dispatch('tagsView/updateVisitedView', this.$route) } break } @@ -126,7 +133,7 @@ export default { }) }, refreshSelectedTag(view) { - this.$store.dispatch('delCachedView', view).then(() => { + this.$store.dispatch('tagsView/delCachedView', view).then(() => { const { fullPath } = view this.$nextTick(() => { this.$router.replace({ @@ -136,7 +143,7 @@ export default { }) }, closeSelectedTag(view) { - this.$store.dispatch('delView', view).then(({ visitedViews }) => { + this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => { if (this.isActive(view)) { this.toLastView(visitedViews) } @@ -144,12 +151,12 @@ export default { }, closeOthersTags() { this.$router.push(this.selectedTag) - this.$store.dispatch('delOthersViews', this.selectedTag).then(() => { + this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => { this.moveToCurrentTag() }) }, closeAllTags(view) { - this.$store.dispatch('delAllViews').then(({ visitedViews }) => { + this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => { if (this.affixTags.some(tag => tag.path === view.path)) { return } @@ -189,7 +196,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .tags-view-container { height: 34px; width: 100%; @@ -257,7 +264,7 @@ export default { } </style> -<style rel="stylesheet/scss" lang="scss"> +<style lang="scss"> //reset element css of el-icon-close .tags-view-wrapper { .tags-view-item { diff --git a/src/views/layout/components/index.js b/src/layout/components/index.js similarity index 80% rename from src/views/layout/components/index.js rename to src/layout/components/index.js index 5262e113..e9f79ddd 100644 --- a/src/views/layout/components/index.js +++ b/src/layout/components/index.js @@ -2,3 +2,4 @@ export { default as Navbar } from './Navbar' export { default as Sidebar } from './Sidebar/index.vue' export { default as TagsView } from './TagsView/index.vue' export { default as AppMain } from './AppMain' +export { default as Settings } from './Settings' diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 00000000..ec6df90c --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,102 @@ +<template> + <div :class="classObj" class="app-wrapper"> + <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> + <sidebar class="sidebar-container" /> + <div :class="{hasTagsView:needTagsView}" class="main-container"> + <div :class="{'fixed-header':fixedHeader}"> + <navbar /> + <tags-view v-if="needTagsView" /> + </div> + <app-main /> + <right-panel v-if="showSettings"> + <settings /> + </right-panel> + </div> + </div> +</template> + +<script> +import RightPanel from '@/components/RightPanel' +import { Navbar, Sidebar, AppMain, TagsView, Settings } from './components' +import ResizeMixin from './mixin/ResizeHandler' +import { mapState } from 'vuex' + +export default { + name: 'Layout', + components: { + RightPanel, + Navbar, + Sidebar, + AppMain, + TagsView, + Settings + }, + mixins: [ResizeMixin], + computed: { + ...mapState({ + sidebar: state => state.app.sidebar, + device: state => state.app.device, + showSettings: state => state.settings.showSettings, + needTagsView: state => state.settings.tagsView, + fixedHeader: state => state.settings.fixedHeader + }), + classObj() { + return { + hideSidebar: !this.sidebar.opened, + openSidebar: this.sidebar.opened, + withoutAnimation: this.sidebar.withoutAnimation, + mobile: this.device === 'mobile' + } + } + }, + methods: { + handleClickOutside() { + this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } +} +</script> + +<style lang="scss" scoped> + @import "~@/styles/mixin.scss"; + @import "~@/styles/variables.scss"; + + .app-wrapper { + @include clearfix; + position: relative; + height: 100%; + width: 100%; + + &.mobile.openSidebar { + position: fixed; + top: 0; + } + } + + .drawer-bg { + background: #000; + opacity: 0.3; + width: 100%; + top: 0; + height: 100%; + position: absolute; + z-index: 999; + } + + .fixed-header { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: calc(100% - #{$sideBarWidth}); + transition: width 0.28s; + } + + .hideSidebar .fixed-header { + width: calc(100% - 54px) + } + + .mobile .fixed-header { + width: 100%; + } +</style> diff --git a/src/views/layout/mixin/ResizeHandler.js b/src/layout/mixin/ResizeHandler.js similarity index 61% rename from src/views/layout/mixin/ResizeHandler.js rename to src/layout/mixin/ResizeHandler.js index 352ab133..65879d16 100644 --- a/src/views/layout/mixin/ResizeHandler.js +++ b/src/layout/mixin/ResizeHandler.js @@ -7,18 +7,21 @@ export default { watch: { $route(route) { if (this.device === 'mobile' && this.sidebar.opened) { - store.dispatch('closeSideBar', { withoutAnimation: false }) + store.dispatch('app/closeSideBar', { withoutAnimation: false }) } } }, beforeMount() { window.addEventListener('resize', this.resizeHandler) }, + beforeDestroy() { + window.removeEventListener('resize', this.resizeHandler) + }, mounted() { const isMobile = this.isMobile() if (isMobile) { - store.dispatch('toggleDevice', 'mobile') - store.dispatch('closeSideBar', { withoutAnimation: true }) + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) } }, methods: { @@ -29,10 +32,10 @@ export default { resizeHandler() { if (!document.hidden) { const isMobile = this.isMobile() - store.dispatch('toggleDevice', isMobile ? 'mobile' : 'desktop') + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') if (isMobile) { - store.dispatch('closeSideBar', { withoutAnimation: true }) + store.dispatch('app/closeSideBar', { withoutAnimation: true }) } } } diff --git a/src/main.js b/src/main.js index 7739639d..375a6b6e 100644 --- a/src/main.js +++ b/src/main.js @@ -5,7 +5,7 @@ import Cookies from 'js-cookie' import 'normalize.css/normalize.css' // A modern alternative to CSS resets import Element from 'element-ui' -import 'element-ui/lib/theme-chalk/index.css' +import './styles/element-variables.scss' import '@/styles/index.scss' // global css @@ -15,12 +15,16 @@ import router from './router' import i18n from './lang' // Internationalization import './icons' // icon -import './errorLog' // error log import './permission' // permission control -import './mock' // simulation data +import './utils/errorLog' // error log import * as filters from './filters' // global filters +import { mockXHR } from '../mock' // simulation data + +// mock api in github pages site build +if (process.env.NODE_ENV === 'production') { mockXHR() } + Vue.use(Element, { size: Cookies.get('size') || 'medium', // set element-ui default size i18n: (key, value) => i18n.t(key, value) diff --git a/src/mock/article.js b/src/mock/article.js deleted file mode 100644 index 45923ddd..00000000 --- a/src/mock/article.js +++ /dev/null @@ -1,70 +0,0 @@ -import Mock from 'mockjs' -import { param2Obj } from '@/utils' - -const List = [] -const count = 100 - -const baseContent = '<p>我是测试数据我是测试数据</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>' -const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3' - -for (let i = 0; i < count; i++) { - List.push(Mock.mock({ - id: '@increment', - timestamp: +Mock.Random.date('T'), - author: '@first', - reviewer: '@first', - title: '@title(5, 10)', - content_short: '我是测试数据', - content: baseContent, - forecast: '@float(0, 100, 2, 2)', - importance: '@integer(1, 3)', - 'type|1': ['CN', 'US', 'JP', 'EU'], - 'status|1': ['published', 'draft', 'deleted'], - display_time: '@datetime', - comment_disabled: true, - pageviews: '@integer(300, 5000)', - image_uri, - platforms: ['a-platform'] - })) -} - -export default { - getList: config => { - const { importance, type, title, page = 1, limit = 20, sort } = param2Obj(config.url) - - let mockList = List.filter(item => { - if (importance && item.importance !== +importance) return false - if (type && item.type !== type) return false - if (title && item.title.indexOf(title) < 0) return false - return true - }) - - if (sort === '-id') { - mockList = mockList.reverse() - } - - const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1)) - - return { - total: mockList.length, - items: pageList - } - }, - getPv: () => ({ - pvData: [{ key: 'PC', pv: 1024 }, { key: 'mobile', pv: 1024 }, { key: 'ios', pv: 1024 }, { key: 'android', pv: 1024 }] - }), - getArticle: (config) => { - const { id } = param2Obj(config.url) - for (const article of List) { - if (article.id === +id) { - return article - } - } - }, - createArticle: () => ({ - data: 'success' - }), - updateArticle: () => ({ - data: 'success' - }) -} diff --git a/src/mock/index.js b/src/mock/index.js deleted file mode 100644 index a6ab5f14..00000000 --- a/src/mock/index.js +++ /dev/null @@ -1,48 +0,0 @@ -import Mock from 'mockjs' -import loginAPI from './login' -import articleAPI from './article' -import remoteSearchAPI from './remoteSearch' -import transactionAPI from './transaction' -import roleAPI from './role' - -// 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题 -// https://github.com/nuysoft/Mock/issues/300 -Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send -Mock.XHR.prototype.send = function() { - if (this.custom.xhr) { - this.custom.xhr.withCredentials = this.withCredentials || false - this.custom.xhr.responseType = this.responseType - } - this.proxy_send(...arguments) -} - -// Mock.setup({ -// timeout: '350-600' -// }) - -// 登录相关 -Mock.mock(/\/login\/login/, 'post', loginAPI.loginByUsername) -Mock.mock(/\/login\/logout/, 'post', loginAPI.logout) -Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo) - -// 角色相关 -Mock.mock(/\/routes/, 'get', roleAPI.getRoutes) -Mock.mock(/\/roles/, 'get', roleAPI.getRoles) -Mock.mock(/\/roles$/, 'post', roleAPI.addRole) -Mock.mock(/\/roles\/[A-Za-z0-9]+/, 'put', roleAPI.updateRole) -Mock.mock(/\/roles\/[A-Za-z0-9]+/, 'delete', roleAPI.deleteRole) - -// 文章相关 -Mock.mock(/\/article\/list/, 'get', articleAPI.getList) -Mock.mock(/\/article\/detail/, 'get', articleAPI.getArticle) -Mock.mock(/\/article\/pv/, 'get', articleAPI.getPv) -Mock.mock(/\/article\/create/, 'post', articleAPI.createArticle) -Mock.mock(/\/article\/update/, 'post', articleAPI.updateArticle) - -// 搜索相关 -Mock.mock(/\/search\/user/, 'get', remoteSearchAPI.searchUser) - -// 账单相关 -Mock.mock(/\/transaction\/list/, 'get', transactionAPI.getList) - -export default Mock diff --git a/src/mock/login.js b/src/mock/login.js deleted file mode 100644 index b9694f09..00000000 --- a/src/mock/login.js +++ /dev/null @@ -1,34 +0,0 @@ -import { param2Obj } from '@/utils' - -const userMap = { - admin: { - roles: ['admin'], - token: 'admin', - introduction: '我是超级管理员', - avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', - name: 'Super Admin' - }, - editor: { - roles: ['editor'], - token: 'editor', - introduction: '我是编辑', - avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', - name: 'Normal Editor' - } -} - -export default { - loginByUsername: config => { - const { username } = JSON.parse(config.body) - return userMap[username] - }, - getUserInfo: config => { - const { token } = param2Obj(config.url) - if (userMap[token]) { - return userMap[token] - } else { - return false - } - }, - logout: () => 'success' -} diff --git a/src/mock/remoteSearch.js b/src/mock/remoteSearch.js deleted file mode 100644 index b70f6f7d..00000000 --- a/src/mock/remoteSearch.js +++ /dev/null @@ -1,24 +0,0 @@ -import Mock from 'mockjs' -import { param2Obj } from '@/utils' - -const NameList = [] -const count = 100 - -for (let i = 0; i < count; i++) { - NameList.push(Mock.mock({ - name: '@first' - })) -} -NameList.push({ name: 'mockPan' }) - -export default { - searchUser: config => { - const { name } = param2Obj(config.url) - const mockNameList = NameList.filter(item => { - const lowerCaseName = item.name.toLowerCase() - if (name && lowerCaseName.indexOf(name.toLowerCase()) < 0) return false - return true - }) - return { items: mockNameList } - } -} diff --git a/src/mock/role.js b/src/mock/role.js deleted file mode 100644 index ae4afeb8..00000000 --- a/src/mock/role.js +++ /dev/null @@ -1,61 +0,0 @@ -import Mock from 'mockjs' -import { deepClone } from '@/utils' -import { filterAsyncRoutes } from '@/store/modules/permission' -import { asyncRoutes, constantRoutes } from '@/router' - -const routes = deepClone([...constantRoutes, ...asyncRoutes]) - -const roles = [ - { - key: 'admin', - name: 'admin', - description: 'Super Administrator. Have access to view all pages.', - routes: routes - }, - { - key: 'editor', - name: 'editor', - description: 'Normal Editor. Can see all pages except permission page', - routes: filterAsyncRoutes(routes, ['editor']) - }, - { - key: 'visitor', - name: 'visitor', - description: 'Just a visitor. Can only see the home page and the document page', - routes: [{ - path: '', - redirect: 'dashboard', - children: [ - { - path: 'dashboard', - name: 'Dashboard', - meta: { title: 'dashboard', icon: 'dashboard' } - } - ] - }] - } -] - -export default { - getRoutes() { - return routes - }, - getRoles() { - return roles - }, - addRole() { - return Mock.mock('@integer(300, 5000)') - }, - updateRole() { - const res = { - data: 'success' - } - return res - }, - deleteRole() { - const res = { - data: 'success' - } - return res - } -} diff --git a/src/mock/transaction.js b/src/mock/transaction.js deleted file mode 100644 index a17517e4..00000000 --- a/src/mock/transaction.js +++ /dev/null @@ -1,23 +0,0 @@ -import Mock from 'mockjs' - -const List = [] -const count = 20 - -for (let i = 0; i < count; i++) { - List.push(Mock.mock({ - order_no: '@guid()', - timestamp: +Mock.Random.date('T'), - username: '@name()', - price: '@float(1000, 15000, 0, 2)', - 'status|1': ['success', 'pending'] - })) -} - -export default { - getList: () => { - return { - total: List.length, - items: List - } - } -} diff --git a/src/permission.js b/src/permission.js index 25b6812f..7cc2a5cf 100644 --- a/src/permission.js +++ b/src/permission.js @@ -7,66 +7,64 @@ import { getToken } from '@/utils/auth' // get token from cookie NProgress.configure({ showSpinner: false }) // NProgress Configuration -// permission judge function -function hasPermission(roles, permissionRoles) { - if (roles.includes('admin')) return true // admin permission passed directly - if (!permissionRoles) return true - return roles.some(role => permissionRoles.indexOf(role) >= 0) -} - const whiteList = ['/login', '/auth-redirect'] // no redirect whitelist -router.beforeEach((to, from, next) => { - NProgress.start() // start progress bar - if (getToken()) { - // determine if there has token +router.beforeEach(async(to, from, next) => { + // start progress bar + NProgress.start() - /* has token*/ + // determine whether the user has logged in + const hasToken = getToken() + + if (hasToken) { if (to.path === '/login') { + // if is logged in, redirect to the home page next({ path: '/' }) - NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it + NProgress.done() } else { - if (store.getters.roles.length === 0) { - // 判断当前用户是否已拉取完user_info信息 - store - .dispatch('GetUserInfo') - .then(res => { - // 拉取user_info - const roles = res.data.roles // note: roles must be a object array! such as: [{id: '1', name: 'editor'}, {id: '2', name: 'developer'}] - store.dispatch('GenerateRoutes', { roles }).then(accessRoutes => { - // 根据roles权限生成可访问的路由表 - router.addRoutes(accessRoutes) // 动态添加可访问路由表 - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record - }) - }) - .catch(err => { - store.dispatch('FedLogOut').then(() => { - Message.error(err) - next({ path: '/' }) - }) - }) + // determine whether the user has obtained his permission roles through getInfo + const hasRoles = store.getters.roles && store.getters.roles.length > 0 + if (hasRoles) { + next() } else { - // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓ - if (hasPermission(store.getters.roles, to.meta.roles)) { - next() - } else { - next({ path: '/401', replace: true, query: { noGoBack: true }}) + try { + // get user info + // note: roles must be a object array! such as: ['admin'] or ,['developer','editor'] + const { roles } = await store.dispatch('user/getInfo') + + // generate accessible routes map based on roles + const accessRoutes = await store.dispatch('permission/generateRoutes', roles) + + // dynamically add accessible routes + router.addRoutes(accessRoutes) + + // hack method to ensure that addRoutes is complete + // set the replace: true, so the navigation will not leave a history record + next({ ...to, replace: true }) + } catch (error) { + // remove token and go to login page to re-login + await store.dispatch('user/resetToken') + Message.error(error || 'Has Error') + next(`/login?redirect=${to.path}`) + NProgress.done() } - // 可删 ↑ } } } else { /* has no token*/ + if (whiteList.indexOf(to.path) !== -1) { - // 在免登录白名单,直接进入 + // in the free login whitelist, go directly next() } else { - next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页 - NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it + // other pages that do not have permission to access are redirected to the login page. + next(`/login?redirect=${to.path}`) + NProgress.done() } } }) router.afterEach(() => { - NProgress.done() // finish progress bar + // finish progress bar + NProgress.done() }) diff --git a/src/router/index.js b/src/router/index.js index bc1d2a64..a883d398 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -4,13 +4,12 @@ import Router from 'vue-router' Vue.use(Router) /* Layout */ -import Layout from '@/views/layout/Layout' +import Layout from '@/layout' /* Router Modules */ import componentsRouter from './modules/components' import chartsRouter from './modules/charts' import tableRouter from './modules/table' -import treeTableRouter from './modules/tree-table' import nestedRouter from './modules/nested' /** note: sub-menu only appear when children.length>=1 @@ -33,6 +32,12 @@ import nestedRouter from './modules/nested' affix: true if true, the tag will affix in the tags-view } **/ + +/** + * constantRoutes + * a base page that does not have permission requirements + * all roles can be accessed + * */ export const constantRoutes = [ { path: '/redirect', @@ -105,12 +110,10 @@ export const constantRoutes = [ } ] -export default new Router({ - // mode: 'history', // require service support - scrollBehavior: () => ({ y: 0 }), - routes: constantRoutes -}) - +/** + * asyncRoutes + * the routes that need to be dynamically loaded based on user roles +*/ export const asyncRoutes = [ { path: '/permission', @@ -166,12 +169,11 @@ export const asyncRoutes = [ ] }, - /** When your routing table is too long, you can split it into small modules**/ + /** when your routing map is too long, you can split it into small modules **/ componentsRouter, chartsRouter, nestedRouter, tableRouter, - treeTableRouter, { path: '/example', @@ -383,3 +385,19 @@ export const asyncRoutes = [ { path: '*', redirect: '/404', hidden: true } ] + +const createRouter = () => new Router({ + // mode: 'history', // require service support + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) + +const router = createRouter() + +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 +export function resetRouter() { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + +export default router diff --git a/src/router/modules/charts.js b/src/router/modules/charts.js index d11f6efd..7293490e 100644 --- a/src/router/modules/charts.js +++ b/src/router/modules/charts.js @@ -1,6 +1,6 @@ /** When your routing table is too long, you can split it into small modules**/ -import Layout from '@/views/layout/Layout' +import Layout from '@/layout' const chartsRouter = { path: '/charts', diff --git a/src/router/modules/components.js b/src/router/modules/components.js index 5fd9bd29..889c371d 100644 --- a/src/router/modules/components.js +++ b/src/router/modules/components.js @@ -1,6 +1,6 @@ /** When your routing table is too long, you can split it into small modules**/ -import Layout from '@/views/layout/Layout' +import Layout from '@/layout' const componentsRouter = { path: '/components', diff --git a/src/router/modules/nested.js b/src/router/modules/nested.js index ad8e31f9..ee165c8c 100644 --- a/src/router/modules/nested.js +++ b/src/router/modules/nested.js @@ -1,6 +1,6 @@ /** When your routing table is too long, you can split it into small modules**/ -import Layout from '@/views/layout/Layout' +import Layout from '@/layout' const nestedRouter = { path: '/nested', diff --git a/src/router/modules/table.js b/src/router/modules/table.js index 4d7f55ef..b54fb42d 100644 --- a/src/router/modules/table.js +++ b/src/router/modules/table.js @@ -1,6 +1,6 @@ /** When your routing table is too long, you can split it into small modules**/ -import Layout from '@/views/layout/Layout' +import Layout from '@/layout' const tableRouter = { path: '/table', diff --git a/src/router/modules/tree-table.js b/src/router/modules/tree-table.js deleted file mode 100644 index 5ee26828..00000000 --- a/src/router/modules/tree-table.js +++ /dev/null @@ -1,29 +0,0 @@ -/** When your routing table is too long, you can split it into small modules**/ - -import Layout from '@/views/layout/Layout' - -const treeTableRouter = { - path: '/tree-table', - component: Layout, - redirect: '/table/complex-table', - name: 'TreeTable', - meta: { - title: 'treeTable', - icon: 'tree-table' - }, - children: [ - { - path: 'index', - component: () => import('@/views/tree-table/index'), - name: 'TreeTableDemo', - meta: { title: 'treeTable' } - }, - { - path: 'custom', - component: () => import('@/views/tree-table/custom'), - name: 'CustomTreeTableDemo', - meta: { title: 'customTreeTable' } - } - ] -} -export default treeTableRouter diff --git a/src/settings.js b/src/settings.js new file mode 100644 index 00000000..d6300efc --- /dev/null +++ b/src/settings.js @@ -0,0 +1,37 @@ +import variables from '@/styles/element-variables.scss' + +export default { + theme: variables.theme, + + /** + * @type {boolean} true | false + * @description Whether show the settings right-panel + */ + showSettings: true, + + /** + * @type {boolean} true | false + * @description Whether need tagsView + */ + tagsView: true, + + /** + * @type {boolean} true | false + * @description Whether fix the header + */ + fixedHeader: false, + + /** + * @type {boolean} true | false + * @description Whether show the logo in sidebar + */ + sidebarLogo: false, + + /** + * @type {string | array} 'production' | ['production','development'] + * @description Need show err logs component. + * The default is only used in the production env + * If you want to also use it in dev, you can pass ['production','development'] + */ + errorLog: 'production' +} diff --git a/src/store/getters.js b/src/store/getters.js index 797573f7..3fb5b068 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -9,9 +9,7 @@ const getters = { avatar: state => state.user.avatar, name: state => state.user.name, introduction: state => state.user.introduction, - status: state => state.user.status, roles: state => state.user.roles, - setting: state => state.user.setting, permission_routes: state => state.permission.routes, addRoutes: state => state.permission.addRoutes, errorLogs: state => state.errorLog.logs diff --git a/src/store/index.js b/src/store/index.js index 24778fad..4842ea7e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,6 +4,7 @@ import app from './modules/app' import errorLog from './modules/errorLog' import permission from './modules/permission' import tagsView from './modules/tagsView' +import settings from './modules/settings' import user from './modules/user' import getters from './getters' @@ -15,6 +16,7 @@ const store = new Vuex.Store({ errorLog, permission, tagsView, + settings, user }, getters diff --git a/src/store/modules/app.js b/src/store/modules/app.js index fba4b05c..84875dd6 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -1,59 +1,64 @@ import Cookies from 'js-cookie' -const app = { - state: { - sidebar: { - opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, - withoutAnimation: false - }, - device: 'desktop', - language: Cookies.get('language') || 'en', - size: Cookies.get('size') || 'medium' +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false }, - mutations: { - TOGGLE_SIDEBAR: state => { - state.sidebar.opened = !state.sidebar.opened - state.sidebar.withoutAnimation = false - if (state.sidebar.opened) { - Cookies.set('sidebarStatus', 1) - } else { - Cookies.set('sidebarStatus', 0) - } - }, - CLOSE_SIDEBAR: (state, withoutAnimation) => { + device: 'desktop', + language: Cookies.get('language') || 'en', + size: Cookies.get('size') || 'medium' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { Cookies.set('sidebarStatus', 0) - state.sidebar.opened = false - state.sidebar.withoutAnimation = withoutAnimation - }, - TOGGLE_DEVICE: (state, device) => { - state.device = device - }, - SET_LANGUAGE: (state, language) => { - state.language = language - Cookies.set('language', language) - }, - SET_SIZE: (state, size) => { - state.size = size - Cookies.set('size', size) } }, - actions: { - toggleSideBar({ commit }) { - commit('TOGGLE_SIDEBAR') - }, - closeSideBar({ commit }, { withoutAnimation }) { - commit('CLOSE_SIDEBAR', withoutAnimation) - }, - toggleDevice({ commit }, device) { - commit('TOGGLE_DEVICE', device) - }, - setLanguage({ commit }, language) { - commit('SET_LANGUAGE', language) - }, - setSize({ commit }, size) { - commit('SET_SIZE', size) - } + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + }, + SET_LANGUAGE: (state, language) => { + state.language = language + Cookies.set('language', language) + }, + SET_SIZE: (state, size) => { + state.size = size + Cookies.set('size', size) } } -export default app +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + }, + setLanguage({ commit }, language) { + commit('SET_LANGUAGE', language) + }, + setSize({ commit }, size) { + commit('SET_SIZE', size) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/store/modules/errorLog.js b/src/store/modules/errorLog.js index 50fc1b1a..c97d452a 100644 --- a/src/store/modules/errorLog.js +++ b/src/store/modules/errorLog.js @@ -1,17 +1,23 @@ -const errorLog = { - state: { - logs: [] - }, - mutations: { - ADD_ERROR_LOG: (state, log) => { - state.logs.push(log) - } - }, - actions: { - addErrorLog({ commit }, log) { - commit('ADD_ERROR_LOG', log) - } + +const state = { + logs: [] +} + +const mutations = { + ADD_ERROR_LOG: (state, log) => { + state.logs.push(log) } } -export default errorLog +const actions = { + addErrorLog({ commit }, log) { + commit('ADD_ERROR_LOG', log) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index fba03bc3..820ca46b 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -34,32 +34,36 @@ export function filterAsyncRoutes(routes, roles) { return res } -const permission = { - state: { - routes: [], - addRoutes: [] - }, - mutations: { - SET_ROUTES: (state, routes) => { - state.addRoutes = routes - state.routes = constantRoutes.concat(routes) - } - }, - actions: { - GenerateRoutes({ commit }, data) { - return new Promise(resolve => { - const { roles } = data - let accessedRoutes - if (roles.includes('admin')) { - accessedRoutes = asyncRoutes - } else { - accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) - } - commit('SET_ROUTES', accessedRoutes) - resolve(accessedRoutes) - }) - } +const state = { + routes: [], + addRoutes: [] +} + +const mutations = { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) } } -export default permission +const actions = { + generateRoutes({ commit }, roles) { + return new Promise(resolve => { + let accessedRoutes + if (roles.includes('admin')) { + accessedRoutes = asyncRoutes + } else { + accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) + } + commit('SET_ROUTES', accessedRoutes) + resolve(accessedRoutes) + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js new file mode 100644 index 00000000..8522a5aa --- /dev/null +++ b/src/store/modules/settings.js @@ -0,0 +1,32 @@ +import defaultSettings from '@/settings' +const { showSettings, tagsView, fixedHeader, sidebarLogo, theme } = defaultSettings + +const state = { + theme: theme, + showSettings: showSettings, + tagsView: tagsView, + fixedHeader: fixedHeader, + sidebarLogo: sidebarLogo +} + +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js index 378cbcd3..5cbe32f3 100644 --- a/src/store/modules/tagsView.js +++ b/src/store/modules/tagsView.js @@ -1,161 +1,166 @@ -const tagsView = { - state: { - visitedViews: [], - cachedViews: [] - }, - mutations: { - ADD_VISITED_VIEW: (state, view) => { - if (state.visitedViews.some(v => v.path === view.path)) return - state.visitedViews.push( - Object.assign({}, view, { - title: view.meta.title || 'no-name' - }) - ) - }, - ADD_CACHED_VIEW: (state, view) => { - if (state.cachedViews.includes(view.name)) return - if (!view.meta.noCache) { - state.cachedViews.push(view.name) - } - }, - DEL_VISITED_VIEW: (state, view) => { - for (const [i, v] of state.visitedViews.entries()) { - if (v.path === view.path) { - state.visitedViews.splice(i, 1) - break - } - } - }, - DEL_CACHED_VIEW: (state, view) => { - for (const i of state.cachedViews) { - if (i === view.name) { - const index = state.cachedViews.indexOf(i) - state.cachedViews.splice(index, 1) - break - } - } - }, +const state = { + visitedViews: [], + cachedViews: [] +} - DEL_OTHERS_VISITED_VIEWS: (state, view) => { - state.visitedViews = state.visitedViews.filter(v => { - return v.meta.affix || v.path === view.path +const mutations = { + ADD_VISITED_VIEW: (state, view) => { + if (state.visitedViews.some(v => v.path === view.path)) return + state.visitedViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' }) - }, - DEL_OTHERS_CACHED_VIEWS: (state, view) => { - for (const i of state.cachedViews) { - if (i === view.name) { - const index = state.cachedViews.indexOf(i) - state.cachedViews = state.cachedViews.slice(index, index + 1) - break - } - } - }, + ) + }, + ADD_CACHED_VIEW: (state, view) => { + if (state.cachedViews.includes(view.name)) return + if (!view.meta.noCache) { + state.cachedViews.push(view.name) + } + }, - DEL_ALL_VISITED_VIEWS: state => { - // keep affix tags - const affixTags = state.visitedViews.filter(tag => tag.meta.affix) - state.visitedViews = affixTags - }, - DEL_ALL_CACHED_VIEWS: state => { - state.cachedViews = [] - }, - - UPDATE_VISITED_VIEW: (state, view) => { - for (let v of state.visitedViews) { - if (v.path === view.path) { - v = Object.assign(v, view) - break - } + DEL_VISITED_VIEW: (state, view) => { + for (const [i, v] of state.visitedViews.entries()) { + if (v.path === view.path) { + state.visitedViews.splice(i, 1) + break + } + } + }, + DEL_CACHED_VIEW: (state, view) => { + for (const i of state.cachedViews) { + if (i === view.name) { + const index = state.cachedViews.indexOf(i) + state.cachedViews.splice(index, 1) + break } } - }, - actions: { - addView({ dispatch }, view) { - dispatch('addVisitedView', view) - dispatch('addCachedView', view) - }, - addVisitedView({ commit }, view) { - commit('ADD_VISITED_VIEW', view) - }, - addCachedView({ commit }, view) { - commit('ADD_CACHED_VIEW', view) - }, - delView({ dispatch, state }, view) { - return new Promise(resolve => { - dispatch('delVisitedView', view) - dispatch('delCachedView', view) - resolve({ - visitedViews: [...state.visitedViews], - cachedViews: [...state.cachedViews] - }) - }) - }, - delVisitedView({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_VISITED_VIEW', view) - resolve([...state.visitedViews]) - }) - }, - delCachedView({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_CACHED_VIEW', view) - resolve([...state.cachedViews]) - }) - }, + DEL_OTHERS_VISITED_VIEWS: (state, view) => { + state.visitedViews = state.visitedViews.filter(v => { + return v.meta.affix || v.path === view.path + }) + }, + DEL_OTHERS_CACHED_VIEWS: (state, view) => { + for (const i of state.cachedViews) { + if (i === view.name) { + const index = state.cachedViews.indexOf(i) + state.cachedViews = state.cachedViews.slice(index, index + 1) + break + } + } + }, - delOthersViews({ dispatch, state }, view) { - return new Promise(resolve => { - dispatch('delOthersVisitedViews', view) - dispatch('delOthersCachedViews', view) - resolve({ - visitedViews: [...state.visitedViews], - cachedViews: [...state.cachedViews] - }) - }) - }, - delOthersVisitedViews({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_OTHERS_VISITED_VIEWS', view) - resolve([...state.visitedViews]) - }) - }, - delOthersCachedViews({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_OTHERS_CACHED_VIEWS', view) - resolve([...state.cachedViews]) - }) - }, + DEL_ALL_VISITED_VIEWS: state => { + // keep affix tags + const affixTags = state.visitedViews.filter(tag => tag.meta.affix) + state.visitedViews = affixTags + }, + DEL_ALL_CACHED_VIEWS: state => { + state.cachedViews = [] + }, - delAllViews({ dispatch, state }, view) { - return new Promise(resolve => { - dispatch('delAllVisitedViews', view) - dispatch('delAllCachedViews', view) - resolve({ - visitedViews: [...state.visitedViews], - cachedViews: [...state.cachedViews] - }) - }) - }, - delAllVisitedViews({ commit, state }) { - return new Promise(resolve => { - commit('DEL_ALL_VISITED_VIEWS') - resolve([...state.visitedViews]) - }) - }, - delAllCachedViews({ commit, state }) { - return new Promise(resolve => { - commit('DEL_ALL_CACHED_VIEWS') - resolve([...state.cachedViews]) - }) - }, - - updateVisitedView({ commit }, view) { - commit('UPDATE_VISITED_VIEW', view) + UPDATE_VISITED_VIEW: (state, view) => { + for (let v of state.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } } } } -export default tagsView +const actions = { + addView({ dispatch }, view) { + dispatch('addVisitedView', view) + dispatch('addCachedView', view) + }, + addVisitedView({ commit }, view) { + commit('ADD_VISITED_VIEW', view) + }, + addCachedView({ commit }, view) { + commit('ADD_CACHED_VIEW', view) + }, + + delView({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delVisitedView', view) + dispatch('delCachedView', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delVisitedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_VISITED_VIEW', view) + resolve([...state.visitedViews]) + }) + }, + delCachedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_CACHED_VIEW', view) + resolve([...state.cachedViews]) + }) + }, + + delOthersViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delOthersVisitedViews', view) + dispatch('delOthersCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delOthersVisitedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_VISITED_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delOthersCachedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_CACHED_VIEWS', view) + resolve([...state.cachedViews]) + }) + }, + + delAllViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delAllVisitedViews', view) + dispatch('delAllCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delAllVisitedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_VISITED_VIEWS') + resolve([...state.visitedViews]) + }) + }, + delAllCachedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_CACHED_VIEWS') + resolve([...state.cachedViews]) + }) + }, + + updateVisitedView({ commit }, view) { + commit('UPDATE_VISITED_VIEW', view) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 38e81a36..f27615b0 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,144 +1,128 @@ -import { loginByUsername, logout, getUserInfo } from '@/api/login' +import { login, logout, getInfo } from '@/api/user' import { getToken, setToken, removeToken } from '@/utils/auth' +import router, { resetRouter } from '@/router' -const user = { - state: { - user: '', - status: '', - code: '', - token: getToken(), - name: '', - avatar: '', - introduction: '', - roles: [], - setting: { - articlePlatform: [] - } +const state = { + token: getToken(), + name: '', + avatar: '', + introduction: '', + roles: [] +} + +const mutations = { + SET_TOKEN: (state, token) => { + state.token = token }, - - mutations: { - SET_CODE: (state, code) => { - state.code = code - }, - SET_TOKEN: (state, token) => { - state.token = token - }, - SET_INTRODUCTION: (state, introduction) => { - state.introduction = introduction - }, - SET_SETTING: (state, setting) => { - state.setting = setting - }, - SET_STATUS: (state, status) => { - state.status = status - }, - SET_NAME: (state, name) => { - state.name = name - }, - SET_AVATAR: (state, avatar) => { - state.avatar = avatar - }, - SET_ROLES: (state, roles) => { - state.roles = roles - } + SET_INTRODUCTION: (state, introduction) => { + state.introduction = introduction }, - - actions: { - // 用户名登录 - LoginByUsername({ commit }, userInfo) { - const username = userInfo.username.trim() - return new Promise((resolve, reject) => { - loginByUsername(username, userInfo.password).then(response => { - const data = response.data - commit('SET_TOKEN', data.token) - setToken(response.data.token) - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // 获取用户信息 - GetUserInfo({ commit, state }) { - return new Promise((resolve, reject) => { - getUserInfo(state.token).then(response => { - // 由于mockjs 不支持自定义状态码只能这样hack - if (!response.data) { - reject('Verification failed, please login again.') - } - const data = response.data - - if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组 - commit('SET_ROLES', data.roles) - } else { - reject('getInfo: roles must be a non-null array!') - } - - commit('SET_NAME', data.name) - commit('SET_AVATAR', data.avatar) - commit('SET_INTRODUCTION', data.introduction) - resolve(response) - }).catch(error => { - reject(error) - }) - }) - }, - - // 第三方验证登录 - // LoginByThirdparty({ commit, state }, code) { - // return new Promise((resolve, reject) => { - // commit('SET_CODE', code) - // loginByThirdparty(state.status, state.email, state.code).then(response => { - // commit('SET_TOKEN', response.data.token) - // setToken(response.data.token) - // resolve() - // }).catch(error => { - // reject(error) - // }) - // }) - // }, - - // 登出 - LogOut({ commit, state }) { - return new Promise((resolve, reject) => { - logout(state.token).then(() => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - removeToken() - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // 前端 登出 - FedLogOut({ commit }) { - return new Promise(resolve => { - commit('SET_TOKEN', '') - removeToken() - resolve() - }) - }, - - // 动态修改权限 - ChangeRoles({ commit, dispatch }, role) { - return new Promise(resolve => { - commit('SET_TOKEN', role) - setToken(role) - getUserInfo(role).then(response => { - const data = response.data - commit('SET_ROLES', data.roles) - commit('SET_NAME', data.name) - commit('SET_AVATAR', data.avatar) - commit('SET_INTRODUCTION', data.introduction) - dispatch('GenerateRoutes', data) // 动态修改权限后 重绘侧边菜单 - resolve() - }) - }) - } + SET_NAME: (state, name) => { + state.name = name + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_ROLES: (state, roles) => { + state.roles = roles } } -export default user +const actions = { + // user login + login({ commit }, userInfo) { + const { username, password } = userInfo + return new Promise((resolve, reject) => { + login({ username: username.trim(), password: password }).then(response => { + const { data } = response + commit('SET_TOKEN', data.token) + setToken(data.token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // get user info + getInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo(state.token).then(response => { + const { data } = response + + if (!data) { + reject('Verification failed, please Login again.') + } + + const { roles, name, avatar, introduction } = data + + // roles must be a non-empty array + if (!roles || roles.length <= 0) { + reject('getInfo: roles must be a non-null array!') + } + + commit('SET_ROLES', roles) + commit('SET_NAME', name) + commit('SET_AVATAR', avatar) + commit('SET_INTRODUCTION', introduction) + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + removeToken() + resetRouter() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + removeToken() + resolve() + }) + }, + + // Dynamically modify permissions + changeRoles({ commit, dispatch }, role) { + return new Promise(async resolve => { + const token = role + '-token' + + commit('SET_TOKEN', token) + setToken(token) + + const { roles } = await dispatch('getInfo') + + resetRouter() + + // generate accessible routes map based on roles + const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true }) + + // dynamically add accessible routes + router.addRoutes(accessRoutes) + + resolve() + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/styles/element-variables.scss b/src/styles/element-variables.scss new file mode 100644 index 00000000..30a0e6bc --- /dev/null +++ b/src/styles/element-variables.scss @@ -0,0 +1,31 @@ +/** +* I think element-ui's default theme color is too light for long-term use. +* So I modified the default color and you can modify it to your liking. +**/ + +/* theme color */ +$--color-primary: #1890ff; +$--color-success: #13ce66; +$--color-warning: #FFBA00; +$--color-danger: #ff4949; +// $--color-info: #1E1E1E; + +$--button-font-weight: 400; + +// $--color-text-regular: #1f2d3d; + +$--border-color-light: #dfe4ed; +$--border-color-lighter: #e6ebf5; + +$--table-border:1px solid#dfe6ec; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + theme: $--color-primary; +} diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 03449706..5911eb85 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -38,6 +38,16 @@ right: 0px; } + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + .is-horizontal { display: none; } @@ -100,6 +110,7 @@ .el-tooltip { padding: 0 !important; + .svg-icon { margin-left: 20px; } @@ -111,6 +122,7 @@ &>.el-submenu__title { padding: 0 !important; + .svg-icon { margin-left: 20px; } diff --git a/src/styles/transition.scss b/src/styles/transition.scss index ab68317d..7b5e4bfd 100644 --- a/src/styles/transition.scss +++ b/src/styles/transition.scss @@ -1,4 +1,4 @@ -//globl transition css +//global transition css /*fade*/ .fade-enter-active, diff --git a/src/utils/errorLog.js b/src/utils/errorLog.js new file mode 100644 index 00000000..c508c789 --- /dev/null +++ b/src/utils/errorLog.js @@ -0,0 +1,35 @@ +import Vue from 'vue' +import store from '@/store' +import { isString, isArray } from '@/utils/validate' +import settings from '@/settings' + +// you can set in settings.js +// errorLog:'production' | ['production','development'] +const { errorLog: needErrorLog } = settings + +function checkNeed(arg) { + const env = process.env.NODE_ENV + if (isString(needErrorLog)) { + return env === needErrorLog + } + if (isArray(needErrorLog)) { + return needErrorLog.includes(env) + } + return false +} + +if (checkNeed()) { + Vue.config.errorHandler = function(err, vm, info, a) { + // Don't ask me why I use Vue.nextTick, it just a hack. + // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500 + Vue.nextTick(() => { + store.dispatch('errorLog/addErrorLog', { + err, + vm, + info, + url: window.location.href + }) + console.error(err, info) + }) + } +} diff --git a/src/utils/index.js b/src/utils/index.js index 1df0f45d..bfff4dda 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -41,7 +41,11 @@ export function parseTime(time, cFormat) { } export function formatTime(time, option) { - time = +time * 1000 + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } const d = new Date(time) const now = Date.now() @@ -296,3 +300,16 @@ export function createUniqueString() { const randomNum = parseInt((1 + Math.random()) * 65536) + '' return (+(randomNum + timestamp)).toString(32) } + +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} diff --git a/src/utils/request.js b/src/utils/request.js index 50f9ecec..a9b8c18f 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,11 +1,12 @@ import axios from 'axios' -import { Message } from 'element-ui' +import { MessageBox, Message } from 'element-ui' import store from '@/store' import { getToken } from '@/utils/auth' // create an axios instance const service = axios.create({ - baseURL: process.env.BASE_API, // api 的 base_url + baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url + withCredentials: true, // 跨域请求时发送 cookies timeout: 5000 // request timeout }) @@ -28,40 +29,43 @@ service.interceptors.request.use( // response interceptor service.interceptors.response.use( - response => response, + /** + * If you want to get information such as headers or status + * Please return response => response + */ /** * 下面的注释为通过在response里,自定义code来标示请求状态 * 当code返回如下情况则说明权限有问题,登出并返回到登录页 - * 如想通过 xmlhttprequest 来状态码标识 逻辑可写在下面error中 + * 如想通过 XMLHttpRequest 来状态码标识 逻辑可写在下面error中 * 以下代码均为样例,请结合自生需求加以修改,若不需要,则可删除 */ - // response => { - // const res = response.data - // if (res.code !== 20000) { - // Message({ - // message: res.message, - // type: 'error', - // duration: 5 * 1000 - // }) - // // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; - // if (res.code === 50008 || res.code === 50012 || res.code === 50014) { - // // 请自行在引入 MessageBox - // // import { Message, MessageBox } from 'element-ui' - // MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { - // confirmButtonText: '重新登录', - // cancelButtonText: '取消', - // type: 'warning' - // }).then(() => { - // store.dispatch('FedLogOut').then(() => { - // location.reload() // 为了重新实例化vue-router对象 避免bug - // }) - // }) - // } - // return Promise.reject('error') - // } else { - // return response.data - // } - // }, + response => { + const res = response.data + if (res.code !== 20000) { + Message({ + message: res.message, + type: 'error', + duration: 5 * 1000 + }) + // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; + if (res.code === 50008 || res.code === 50012 || res.code === 50014) { + // 请自行在引入 MessageBox + // import { Message, MessageBox } from 'element-ui' + MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { + confirmButtonText: '重新登录', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + store.dispatch('user/resetToken').then(() => { + location.reload() // 为了重新实例化vue-router对象 避免bug + }) + }) + } + return Promise.reject('error') + } else { + return res + } + }, error => { console.log('err' + error) // for debug Message({ diff --git a/src/utils/validate.js b/src/utils/validate.js index 5e4056f5..ba93d1c3 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -11,36 +11,41 @@ export function validUsername(str) { return valid_map.indexOf(str.trim()) >= 0 } -/* 合法uri*/ export function validURL(url) { const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ return reg.test(url) } -/* 小写字母*/ export function validLowerCase(str) { const reg = /^[a-z]+$/ return reg.test(str) } -/* 大写字母*/ export function validUpperCase(str) { const reg = /^[A-Z]+$/ return reg.test(str) } -/* 大小写字母*/ export function validAlphabets(str) { const reg = /^[A-Za-z]+$/ return reg.test(str) } -/** - * validate email - * @param email - * @returns {boolean} - */ export function validEmail(email) { - const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - return re.test(email) + const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +export function isString(str) { + if (typeof str === 'string' || str instanceof String) { + return true + } + return false +} + +export function isArray(arg) { + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) } diff --git a/src/views/clipboard/index.vue b/src/views/clipboard/index.vue index 54fbf946..e78c6359 100644 --- a/src/views/clipboard/index.vue +++ b/src/views/clipboard/index.vue @@ -3,11 +3,15 @@ <el-tabs v-model="activeName"> <el-tab-pane label="use clipboard directly" name="directly"> <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" /> - <el-button type="primary" icon="document" @click="handleCopy(inputData,$event)">copy</el-button> + <el-button type="primary" icon="document" @click="handleCopy(inputData,$event)"> + copy + </el-button> </el-tab-pane> <el-tab-pane label="use clipboard by v-directive" name="v-directive"> <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" /> - <el-button v-clipboard:copy="inputData" v-clipboard:success="clipboardSuccess" type="primary" icon="document">copy</el-button> + <el-button v-clipboard:copy="inputData" v-clipboard:success="clipboardSuccess" type="primary" icon="document"> + copy + </el-button> </el-tab-pane> </el-tabs> </div> diff --git a/src/views/components-demo/countTo.vue b/src/views/components-demo/countTo.vue index de9339bc..9fae2694 100644 --- a/src/views/components-demo/countTo.vue +++ b/src/views/components-demo/countTo.vue @@ -25,8 +25,12 @@ <label class="label" for="durationInput">duration: <input v-model.number="setDuration" type="number" name="durationInput"> </label> - <div class="startBtn example-btn" @click="start">开始</div> - <div class="pause-resume-btn example-btn" @click="pauseResume">暂停/恢复</div> + <div class="startBtn example-btn" @click="start"> + Start + </div> + <div class="pause-resume-btn example-btn" @click="pauseResume"> + pause/resume + </div> <br> <label class="label" for="decimalsInput">decimals: <input v-model.number="setDecimals" type="number" name="decimalsInput"> @@ -41,11 +45,9 @@ <input v-model="setSuffix" name="suffixInput"> </label> </div> - <code> - <count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}' + <code><count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}' :decimals='{{ _decimals }}' :separator='{{ _separator }}' :prefix='{{ _prefix }}' :suffix='{{ _suffix }}' - :autoplay=false> - </code> + :autoplay=false></code> </div> </template> diff --git a/src/views/components-demo/dragDialog.vue b/src/views/components-demo/dragDialog.vue index ae4b4900..3c985552 100644 --- a/src/views/components-demo/dragDialog.vue +++ b/src/views/components-demo/dragDialog.vue @@ -1,6 +1,8 @@ <template> <div class="components-container"> - <el-button type="primary" @click="dialogTableVisible = true">open a Drag Dialog</el-button> + <el-button type="primary" @click="dialogTableVisible = true"> + open a Drag Dialog + </el-button> <el-dialog v-el-drag-dialog :visible.sync="dialogTableVisible" title="Shipping address" @dragDialog="handleDrag"> <el-select ref="select" v-model="value" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> diff --git a/src/views/components-demo/dragKanban.vue b/src/views/components-demo/dragKanban.vue index bbbfe3df..943be455 100644 --- a/src/views/components-demo/dragKanban.vue +++ b/src/views/components-demo/dragKanban.vue @@ -1,8 +1,8 @@ <template> <div class="components-container board"> - <Kanban :key="1" :list="list1" :options="options" class="kanban todo" header-text="Todo" /> - <Kanban :key="2" :list="list2" :options="options" class="kanban working" header-text="Working" /> - <Kanban :key="3" :list="list3" :options="options" class="kanban done" header-text="Done" /> + <Kanban :key="1" :list="list1" :group="group" class="kanban todo" header-text="Todo" /> + <Kanban :key="2" :list="list2" :group="group" class="kanban working" header-text="Working" /> + <Kanban :key="3" :list="list3" :group="group" class="kanban done" header-text="Done" /> </div> </template> <script> @@ -15,9 +15,7 @@ export default { }, data() { return { - options: { - group: 'mission' - }, + group: 'mission', list1: [ { name: 'Mission', id: 1 }, { name: 'Mission', id: 2 }, diff --git a/src/views/components-demo/dragSelect.vue b/src/views/components-demo/dragSelect.vue index c2ac4b9b..905ecb94 100644 --- a/src/views/components-demo/dragSelect.vue +++ b/src/views/components-demo/dragSelect.vue @@ -1,14 +1,14 @@ <template> <div class="components-container"> - <el-drag-select v-model="value" style="width:500px;" multiple placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </el-drag-select> <div style="margin-top:30px;"> - <el-tag v-for="item of value" :key="item" style="margin-right:15px;">{{ item }}</el-tag> + <el-tag v-for="item of value" :key="item" style="margin-right:15px;"> + {{ item }} + </el-tag> </div> - </div> </template> diff --git a/src/views/components-demo/jsonEditor.vue b/src/views/components-demo/jsonEditor.vue index 06e60114..01fed710 100644 --- a/src/views/components-demo/jsonEditor.vue +++ b/src/views/components-demo/jsonEditor.vue @@ -1,6 +1,10 @@ <template> <div class="components-container"> - <code>JsonEditor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a> , lint base on json-lint </code> + <code>Json-Editor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a>. Lint + base on <a + href="https://github.com/codemirror/CodeMirror/blob/master/addon/lint/json-lint.js" + target="_blank" + >json-lint</a>.</code> <div class="editor-container"> <json-editor ref="jsonEditor" v-model="value" /> </div> diff --git a/src/views/components-demo/markdown.vue b/src/views/components-demo/markdown.vue index fb6b503b..8483a470 100644 --- a/src/views/components-demo/markdown.vue +++ b/src/views/components-demo/markdown.vue @@ -1,41 +1,51 @@ <template> <div class="components-container"> - <code>Markdown is based on - <a href="https://github.com/nhnent/tui.editor" target="_blank">tui.editor</a> ,Simply encapsulated in Vue. - <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/feature/component/markdown-editor.html"> + <a href="https://github.com/nhnent/tui.editor" target="_blank">tui.editor</a> ,simply wrapped with Vue. + <a + target="_blank" + href="https://panjiachen.github.io/vue-element-admin-site/feature/component/markdown-editor.html" + > Documentation </a> </code> <div class="editor-container"> - <el-tag class="tag-title">Basic:</el-tag> - <markdown-editor v-model="content" height="300px" /> + <el-tag class="tag-title"> + Basic: + </el-tag> + <markdown-editor v-model="content1" height="300px" /> </div> <div class="editor-container"> - <el-tag class="tag-title">Markdown Mode:</el-tag> - <markdown-editor ref="markdownEditor" v-model="content" :options="{hideModeSwitch:true,previewStyle:'tab'}" height="200px" /> + <el-tag class="tag-title"> + Markdown Mode: + </el-tag> + <markdown-editor ref="markdownEditor" v-model="content2" :options="{hideModeSwitch:true,previewStyle:'tab'}" height="200px" /> </div> <div class="editor-container"> - <el-tag class="tag-title">Customize Toolbar:</el-tag> - <markdown-editor - ref="markdownEditor" - v-model="content" - :options="{ toolbarItems: ['heading','bold','italic']}" + <el-tag class="tag-title"> + Customize Toolbar: + </el-tag> + <markdown-editor v-model="content3" :options="{ toolbarItems: ['heading','bold','italic']}" /> + </div> + + <div class="editor-container"> + <el-tag class="tag-title"> + I18n: + </el-tag> + <el-alert + :closable="false" + title="You can change the language of the admin system to see the effect" + type="success" /> + <markdown-editor ref="markdownEditor" v-model="content4" :language="language" height="300px" /> </div> - <div class="editor-container"> - <el-tag class="tag-title">I18n:</el-tag> - <el-alert :closable="false" title="You can change the language of the admin system to see the effect" type="success" /> - <markdown-editor v-model="content" :language="language" height="300px" /> - </div> - - <el-button style="margin-top:80px;" type="primary" icon="el-icon-document" @click="getHtml">Get HTML</el-button> - <!-- eslint-disable-next-line --> + <el-button style="margin-top:80px;" type="primary" icon="el-icon-document" @click="getHtml"> + Get HTML + </el-button> <div v-html="html" /> - </div> </template> @@ -55,7 +65,10 @@ export default { components: { MarkdownEditor }, data() { return { - content: content, + content1: content, + content2: content, + content3: content, + content4: content, html: '', languageTypeList: { 'en': 'en_US', diff --git a/src/views/components-demo/mixin.vue b/src/views/components-demo/mixin.vue index 08bca0a2..18e9ef88 100644 --- a/src/views/components-demo/mixin.vue +++ b/src/views/components-demo/mixin.vue @@ -7,22 +7,34 @@ </div> <div style="margin-bottom:50px;"> <el-col :span="4" class="text-center"> - <router-link class="pan-btn blue-btn" to="/documentation/index">Documentation</router-link> + <router-link class="pan-btn blue-btn" to="/documentation/index"> + Documentation + </router-link> </el-col> <el-col :span="4" class="text-center"> - <router-link class="pan-btn light-blue-btn" to="/icon/index">Icons</router-link> + <router-link class="pan-btn light-blue-btn" to="/icon/index"> + Icons + </router-link> </el-col> <el-col :span="4" class="text-center"> - <router-link class="pan-btn pink-btn" to="/excel/export-excel">Excel</router-link> + <router-link class="pan-btn pink-btn" to="/excel/export-excel"> + Excel + </router-link> </el-col> <el-col :span="4" class="text-center"> - <router-link class="pan-btn green-btn" to="/table/complex-table">Table</router-link> + <router-link class="pan-btn green-btn" to="/table/complex-table"> + Table + </router-link> </el-col> <el-col :span="4" class="text-center"> - <router-link class="pan-btn tiffany-btn" to="/example/create">Form</router-link> + <router-link class="pan-btn tiffany-btn" to="/example/create"> + Form + </router-link> </el-col> <el-col :span="4" class="text-center"> - <router-link class="pan-btn yellow-btn" to="/theme/index">Theme</router-link> + <router-link class="pan-btn yellow-btn" to="/theme/index"> + Theme + </router-link> </el-col> </div> </el-card> @@ -37,7 +49,9 @@ <div style="height:100px;"> <el-form :model="demo" :rules="demoRules"> <el-form-item prop="title"> - <md-input v-model="demo.title" icon="search" name="title" placeholder="输入标题">标题</md-input> + <md-input v-model="demo.title" icon="search" name="title" placeholder="输入标题"> + 标题 + </md-input> </el-form-item> </el-form> </div> @@ -63,7 +77,9 @@ <span>水波纹 waves v-directive</span> </div> <div class="component-item"> - <el-button v-waves type="primary">水波纹效果</el-button> + <el-button v-waves type="primary"> + 水波纹效果 + </el-button> </div> </el-card> </el-col> diff --git a/src/views/components-demo/sticky.vue b/src/views/components-demo/sticky.vue index c49b089d..b1e6c89e 100644 --- a/src/views/components-demo/sticky.vue +++ b/src/views/components-demo/sticky.vue @@ -1,6 +1,6 @@ <template> <div> - <sticky class-name="sub-navbar"> + <sticky :z-index="10" class-name="sub-navbar"> <el-dropdown trigger="click"> <el-button plain> Platform<i class="el-icon-caret-bottom el-icon--right" /> @@ -20,7 +20,9 @@ </el-button> <el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:300px"> <el-input v-model="url" placeholder="Please enter the content"> - <template slot="prepend">Url</template> + <template slot="prepend"> + Url + </template> </el-input> </el-dropdown-menu> </el-dropdown> diff --git a/src/views/components-demo/tinymce.vue b/src/views/components-demo/tinymce.vue index 22e72647..e1d72d1f 100644 --- a/src/views/components-demo/tinymce.vue +++ b/src/views/components-demo/tinymce.vue @@ -7,7 +7,6 @@ <div> <tinymce v-model="content" :height="300" /> </div> - <!-- eslint-disable-next-line --> <div class="editor-content" v-html="content" /> </div> </template> diff --git a/src/views/dashboard/admin/components/BoxCard.vue b/src/views/dashboard/admin/components/BoxCard.vue index 0ab38b1b..dff8462a 100644 --- a/src/views/dashboard/admin/components/BoxCard.vue +++ b/src/views/dashboard/admin/components/BoxCard.vue @@ -61,14 +61,14 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" > +<style lang="scss" > .box-card-component{ .el-card__header { padding: 0px!important; } } </style> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .box-card-component { .box-card-header { position: relative; diff --git a/src/views/dashboard/admin/components/PanelGroup.vue b/src/views/dashboard/admin/components/PanelGroup.vue index 61c237cb..34a6709b 100644 --- a/src/views/dashboard/admin/components/PanelGroup.vue +++ b/src/views/dashboard/admin/components/PanelGroup.vue @@ -6,7 +6,9 @@ <svg-icon icon-class="peoples" class-name="card-panel-icon" /> </div> <div class="card-panel-description"> - <div class="card-panel-text">New Visits</div> + <div class="card-panel-text"> + New Visits + </div> <count-to :start-val="0" :end-val="102400" :duration="2600" class="card-panel-num" /> </div> </div> @@ -17,7 +19,9 @@ <svg-icon icon-class="message" class-name="card-panel-icon" /> </div> <div class="card-panel-description"> - <div class="card-panel-text">Messages</div> + <div class="card-panel-text"> + Messages + </div> <count-to :start-val="0" :end-val="81212" :duration="3000" class="card-panel-num" /> </div> </div> @@ -28,7 +32,9 @@ <svg-icon icon-class="money" class-name="card-panel-icon" /> </div> <div class="card-panel-description"> - <div class="card-panel-text">Purchases</div> + <div class="card-panel-text"> + Purchases + </div> <count-to :start-val="0" :end-val="9280" :duration="3200" class="card-panel-num" /> </div> </div> @@ -39,7 +45,9 @@ <svg-icon icon-class="shopping" class-name="card-panel-icon" /> </div> <div class="card-panel-description"> - <div class="card-panel-text">Shoppings</div> + <div class="card-panel-text"> + Shoppings + </div> <count-to :start-val="0" :end-val="13600" :duration="3600" class="card-panel-num" /> </div> </div> @@ -62,7 +70,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .panel-group { margin-top: 18px; .card-panel-col{ diff --git a/src/views/dashboard/admin/components/TransactionTable.vue b/src/views/dashboard/admin/components/TransactionTable.vue index f2b217d9..3eb8cb6c 100644 --- a/src/views/dashboard/admin/components/TransactionTable.vue +++ b/src/views/dashboard/admin/components/TransactionTable.vue @@ -21,7 +21,7 @@ </template> <script> -import { fetchList } from '@/api/transaction' +import { transactionList } from '@/api/remoteSearch' export default { filters: { @@ -46,7 +46,7 @@ export default { }, methods: { fetchData() { - fetchList().then(response => { + transactionList().then(response => { this.list = response.data.items.slice(0, 8) }) } diff --git a/src/views/dashboard/admin/index.vue b/src/views/dashboard/admin/index.vue index 85dcc186..f06689ae 100644 --- a/src/views/dashboard/admin/index.vue +++ b/src/views/dashboard/admin/index.vue @@ -1,6 +1,5 @@ <template> <div class="dashboard-editor-container"> - <github-corner style="position: absolute; top: 0px; border: 0; right: 0;" /> <panel-group @handleSetLineChartData="handleSetLineChartData" /> @@ -38,7 +37,6 @@ <box-card /> </el-col> </el-row> - </div> </template> @@ -98,7 +96,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .dashboard-editor-container { padding: 32px; background-color: rgb(240, 242, 245); diff --git a/src/views/dashboard/editor/index.vue b/src/views/dashboard/editor/index.vue index 7775ce39..9723bcce 100644 --- a/src/views/dashboard/editor/index.vue +++ b/src/views/dashboard/editor/index.vue @@ -40,7 +40,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .emptyGif { display: block; width: 45%; diff --git a/src/views/documentation/index.vue b/src/views/documentation/index.vue index 5004e82b..2fed7398 100644 --- a/src/views/documentation/index.vue +++ b/src/views/documentation/index.vue @@ -29,7 +29,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .documentation-container { margin: 50px; .document-btn { diff --git a/src/views/errorPage/401.vue b/src/views/errorPage/401.vue index 24420126..032e808f 100644 --- a/src/views/errorPage/401.vue +++ b/src/views/errorPage/401.vue @@ -1,18 +1,26 @@ <template> <div class="errPage-container"> - <el-button icon="arrow-left" class="pan-back-btn" @click="back">返回</el-button> + <el-button icon="arrow-left" class="pan-back-btn" @click="back"> + 返回 + </el-button> <el-row> <el-col :span="12"> - <h1 class="text-jumbo text-ginormous">Oops!</h1> + <h1 class="text-jumbo text-ginormous"> + Oops! + </h1> gif来源<a href="https://zh.airbnb.com/" target="_blank">airbnb</a> 页面 <h2>你没有权限去该页面</h2> <h6>如有不满请联系你领导</h6> <ul class="list-unstyled"> <li>或者你可以去:</li> <li class="link-type"> - <router-link to="/dashboard">回首页</router-link> + <router-link to="/dashboard"> + 回首页 + </router-link> + </li> + <li class="link-type"> + <a href="https://www.taobao.com/">随便看看</a> </li> - <li class="link-type"><a href="https://www.taobao.com/">随便看看</a></li> <li><a href="#" @click.prevent="dialogVisible=true">点我看图</a></li> </ul> </el-col> @@ -50,7 +58,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .errPage-container { width: 800px; max-width: 100%; diff --git a/src/views/errorPage/404.vue b/src/views/errorPage/404.vue index 94a2b07b..66cb3eae 100644 --- a/src/views/errorPage/404.vue +++ b/src/views/errorPage/404.vue @@ -8,14 +8,22 @@ <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404"> </div> <div class="bullshit"> - <div class="bullshit__oops">OOPS!</div> + <div class="bullshit__oops"> + OOPS! + </div> <div class="bullshit__info"> 版权所有 <a class="link-type" href="https://wallstreetcn.com" target="_blank">华尔街见闻</a> </div> - <div class="bullshit__headline">{{ message }}</div> - <div class="bullshit__info">请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告</div> - <router-link to="/" class="bullshit__return-home">返回首页</router-link> + <div class="bullshit__headline"> + {{ message }} + </div> + <div class="bullshit__info"> + 请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告 + </div> + <router-link to="/" class="bullshit__return-home"> + 返回首页 + </router-link> </div> </div> </div> @@ -33,7 +41,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .wscn-http404-container{ transform: translate(-50%,-50%); position: absolute; diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 27d42ccc..55d825fe 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -1,20 +1,20 @@ <template> <div class="createPost-container"> <el-form ref="postForm" :model="postForm" :rules="rules" class="form-container"> - - <sticky :class-name="'sub-navbar '+postForm.status"> + <sticky :z-index="10" :class-name="'sub-navbar '+postForm.status"> <CommentDropdown v-model="postForm.comment_disabled" /> <PlatformDropdown v-model="postForm.platforms" /> <SourceUrlDropdown v-model="postForm.source_uri" /> <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm"> 发布 </el-button> - <el-button v-loading="loading" type="warning" @click="draftForm">草稿</el-button> + <el-button v-loading="loading" type="warning" @click="draftForm"> + 草稿 + </el-button> </sticky> <div class="createPost-main-container"> <el-row> - <Warning /> <el-col :span="24"> @@ -71,7 +71,6 @@ </el-form-item> </div> </el-form> - </div> </template> @@ -82,7 +81,7 @@ import MDinput from '@/components/MDinput' import Sticky from '@/components/Sticky' // 粘性header组件 import { validURL } from '@/utils/validate' import { fetchArticle } from '@/api/article' -import { userSearch } from '@/api/remoteSearch' +import { searchUser } from '@/api/remoteSearch' import Warning from './Warning' import { CommentDropdown, PlatformDropdown, SourceUrlDropdown } from './Dropdown' @@ -187,7 +186,7 @@ export default { setTagsViewTitle() { const title = this.lang === 'zh' ? '编辑文章' : 'Edit Article' const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` }) - this.$store.dispatch('updateVisitedView', route) + this.$store.dispatch('tagsView/updateVisitedView', route) }, submitForm() { this.postForm.display_time = parseInt(this.display_time / 1000) @@ -226,7 +225,7 @@ export default { this.postForm.status = 'draft' }, getRemoteUserList(query) { - userSearch(query).then(response => { + searchUser(query).then(response => { if (!response.data.items) return this.userListOptions = response.data.items.map(v => v.name) }) @@ -235,7 +234,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> @import "~@/styles/mixin.scss"; .createPost-container { position: relative; diff --git a/src/views/example/list.vue b/src/views/example/list.vue index e90d3443..2e7cc6c6 100644 --- a/src/views/example/list.vue +++ b/src/views/example/list.vue @@ -1,6 +1,5 @@ <template> <div class="app-container"> - <el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%"> <el-table-column align="center" label="ID" width="80"> <template slot-scope="scope"> @@ -28,13 +27,14 @@ <el-table-column class-name="status-col" label="Status" width="110"> <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> + <el-tag :type="scope.row.status | statusFilter"> + {{ scope.row.status }} + </el-tag> </template> </el-table-column> <el-table-column min-width="300px" label="Title"> <template slot-scope="scope"> - <router-link :to="'/example/edit/'+scope.row.id" class="link-type"> <span>{{ scope.row.title }}</span> </router-link> @@ -44,14 +44,15 @@ <el-table-column align="center" label="Actions" width="120"> <template slot-scope="scope"> <router-link :to="'/example/edit/'+scope.row.id"> - <el-button type="primary" size="small" icon="el-icon-edit">Edit</el-button> + <el-button type="primary" size="small" icon="el-icon-edit"> + Edit + </el-button> </router-link> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" /> - </div> </template> diff --git a/src/views/excel/components/AutoWidthOption.vue b/src/views/excel/components/AutoWidthOption.vue index 06aad430..9050e659 100644 --- a/src/views/excel/components/AutoWidthOption.vue +++ b/src/views/excel/components/AutoWidthOption.vue @@ -2,8 +2,12 @@ <div style="display:inline-block;"> <label class="radio-label">Cell Auto-Width: </label> <el-radio-group v-model="autoWidth"> - <el-radio :label="true" border>True</el-radio> - <el-radio :label="false" border>False</el-radio> + <el-radio :label="true" border> + True + </el-radio> + <el-radio :label="false" border> + False + </el-radio> </el-radio-group> </div> </template> diff --git a/src/views/excel/exportExcel.vue b/src/views/excel/exportExcel.vue index 413b8822..253f1641 100644 --- a/src/views/excel/exportExcel.vue +++ b/src/views/excel/exportExcel.vue @@ -1,12 +1,13 @@ <template> <!-- $t is vue-i18n global function to translate lang --> <div class="app-container"> - <div> <FilenameOption v-model="filename" /> <AutoWidthOption v-model="autoWidth" /> <BookTypeOption v-model="bookType" /> - <el-button :loading="downloadLoading" style="margin:0 0 20px 20px;" type="primary" icon="document" @click="handleDownload">{{ $t('excel.export') }} Excel</el-button> + <el-button :loading="downloadLoading" style="margin:0 0 20px 20px;" type="primary" icon="document" @click="handleDownload"> + {{ $t('excel.export') }} Excel + </el-button> <a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;"> <el-tag type="info">Documentation</el-tag> </a> diff --git a/src/views/excel/selectExcel.vue b/src/views/excel/selectExcel.vue index 7ee99c37..05c52f5f 100644 --- a/src/views/excel/selectExcel.vue +++ b/src/views/excel/selectExcel.vue @@ -2,7 +2,9 @@ <div class="app-container"> <!-- $t is vue-i18n global function to translate lang --> <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:340px;" prefix-icon="el-icon-document" /> - <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload">{{ $t('excel.selectedExport') }}</el-button> + <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload"> + {{ $t('excel.selectedExport') }} + </el-button> <a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;"> <el-tag type="info">Documentation</el-tag> </a> diff --git a/src/views/guide/index.vue b/src/views/guide/index.vue index 49502aef..31ca3177 100644 --- a/src/views/guide/index.vue +++ b/src/views/guide/index.vue @@ -5,7 +5,9 @@ <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js. </a> </p> - <el-button icon="el-icon-question" type="primary" @click.prevent.stop="guide">{{ $t('guide.button') }}</el-button> + <el-button icon="el-icon-question" type="primary" @click.prevent.stop="guide"> + {{ $t('guide.button') }} + </el-button> </div> </template> diff --git a/src/views/i18n-demo/index.vue b/src/views/i18n-demo/index.vue index fad364af..60c9a80e 100644 --- a/src/views/i18n-demo/index.vue +++ b/src/views/i18n-demo/index.vue @@ -7,11 +7,19 @@ </div> <div> <el-radio-group v-model="lang" size="small"> - <el-radio label="zh" border>简体中文</el-radio> - <el-radio label="en" border>English</el-radio> - <el-radio label="es" border>Español</el-radio> + <el-radio label="zh" border> + 简体中文 + </el-radio> + <el-radio label="en" border> + English + </el-radio> + <el-radio label="es" border> + Español + </el-radio> </el-radio-group> - <el-tag style="margin-top:15px;display:block;" type="info">{{ $t('i18nView.note') }}</el-tag> + <el-tag style="margin-top:15px;display:block;" type="info"> + {{ $t('i18nView.note') }} + </el-tag> </div> </el-card> @@ -31,12 +39,24 @@ </el-select> </div> <div class="block"> - <el-button class="item-btn" size="small">{{ $t('i18nView.default') }}</el-button> - <el-button class="item-btn" size="small" type="primary">{{ $t('i18nView.primary') }}</el-button> - <el-button class="item-btn" size="small" type="success">{{ $t('i18nView.success') }}</el-button> - <el-button class="item-btn" size="small" type="info">{{ $t('i18nView.info') }}</el-button> - <el-button class="item-btn" size="small" type="warning">{{ $t('i18nView.warning') }}</el-button> - <el-button class="item-btn" size="small" type="danger">{{ $t('i18nView.danger') }}</el-button> + <el-button class="item-btn" size="small"> + {{ $t('i18nView.default') }} + </el-button> + <el-button class="item-btn" size="small" type="primary"> + {{ $t('i18nView.primary') }} + </el-button> + <el-button class="item-btn" size="small" type="success"> + {{ $t('i18nView.success') }} + </el-button> + <el-button class="item-btn" size="small" type="info"> + {{ $t('i18nView.info') }} + </el-button> + <el-button class="item-btn" size="small" type="warning"> + {{ $t('i18nView.warning') }} + </el-button> + <el-button class="item-btn" size="small" type="danger"> + {{ $t('i18nView.danger') }} + </el-button> </div> </el-col> <el-col :span="12" :xs="24"> @@ -90,7 +110,7 @@ export default { }, set(lang) { this.$i18n.locale = lang - this.$store.dispatch('setLanguage', lang) + this.$store.dispatch('app/setLanguage', lang) } } }, diff --git a/src/views/layout/Layout.vue b/src/views/layout/Layout.vue deleted file mode 100644 index 4d0eaa2b..00000000 --- a/src/views/layout/Layout.vue +++ /dev/null @@ -1,71 +0,0 @@ -<template> - <div :class="classObj" class="app-wrapper"> - <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> - <sidebar class="sidebar-container" /> - <div class="main-container"> - <navbar /> - <tags-view /> - <app-main /> - </div> - </div> -</template> - -<script> -import { Navbar, Sidebar, AppMain, TagsView } from './components' -import ResizeMixin from './mixin/ResizeHandler' - -export default { - name: 'Layout', - components: { - Navbar, - Sidebar, - AppMain, - TagsView - }, - mixins: [ResizeMixin], - computed: { - sidebar() { - return this.$store.state.app.sidebar - }, - device() { - return this.$store.state.app.device - }, - classObj() { - return { - hideSidebar: !this.sidebar.opened, - openSidebar: this.sidebar.opened, - withoutAnimation: this.sidebar.withoutAnimation, - mobile: this.device === 'mobile' - } - } - }, - methods: { - handleClickOutside() { - this.$store.dispatch('closeSideBar', { withoutAnimation: false }) - } - } -} -</script> - -<style rel="stylesheet/scss" lang="scss" scoped> - @import "~@/styles/mixin.scss"; - .app-wrapper { - @include clearfix; - position: relative; - height: 100%; - width: 100%; - &.mobile.openSidebar{ - position: fixed; - top: 0; - } - } - .drawer-bg { - background: #000; - opacity: 0.3; - width: 100%; - top: 0; - height: 100%; - position: absolute; - z-index: 999; - } -</style> diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue deleted file mode 100644 index 4c4d6db4..00000000 --- a/src/views/layout/components/Sidebar/index.vue +++ /dev/null @@ -1,37 +0,0 @@ -<template> - <el-scrollbar wrap-class="scrollbar-wrapper"> - <el-menu - :default-active="$route.path" - :collapse="isCollapse" - :background-color="variables.menuBg" - :text-color="variables.menuText" - :active-text-color="variables.menuActiveText" - :collapse-transition="false" - mode="vertical" - > - <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" /> - </el-menu> - </el-scrollbar> -</template> - -<script> -import { mapGetters } from 'vuex' -import SidebarItem from './SidebarItem' -import variables from '@/styles/variables.scss' - -export default { - components: { SidebarItem }, - computed: { - ...mapGetters([ - 'permission_routes', - 'sidebar' - ]), - variables() { - return variables - }, - isCollapse() { - return !this.sidebar.opened - } - } -} -</script> diff --git a/src/views/login/authredirect.vue b/src/views/login/authredirect.vue index e749412b..69e15397 100644 --- a/src/views/login/authredirect.vue +++ b/src/views/login/authredirect.vue @@ -1,10 +1,15 @@ <script> export default { - name: 'AuthRedirect', + name: 'Authredirect', created() { const hash = window.location.search.slice(1) - window.opener.location.href = window.location.origin + '/login#' + hash - window.close() + if (window.localStorage) { + window.localStorage.setItem('x-admin-oauth-code', hash) + window.close() + } + }, + render: function(h) { + return h() // avoid warning message } } </script> diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 1d43a2ab..ac467584 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,6 +1,7 @@ <template> <div class="login-container"> <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left"> + <div class="title-container"> <h3 class="title"> {{ $t('login.title') }} @@ -27,6 +28,7 @@ <svg-icon icon-class="password" /> </span> <el-input + :key="passwordType" ref="password" v-model="loginForm.password" :type="passwordType" @@ -119,7 +121,7 @@ export default { } }, created() { - // window.addEventListener('hashchange', this.afterQRScan) + // window.addEventListener('storage', this.afterQRScan) }, mounted() { if (this.loginForm.username === '') { @@ -129,7 +131,7 @@ export default { } }, destroyed() { - // window.removeEventListener('hashchange', this.afterQRScan) + // window.removeEventListener('storage', this.afterQRScan) }, methods: { showPwd() { @@ -146,88 +148,90 @@ export default { this.$refs.loginForm.validate(valid => { if (valid) { this.loading = true - this.$store.dispatch('LoginByUsername', this.loginForm).then(() => { - this.loading = false - this.$router.push({ path: this.redirect || '/' }) - }).catch(() => { - this.loading = false - }) + this.$store.dispatch('user/login', this.loginForm) + .then(() => { + this.$router.push({ path: this.redirect || '/' }) + this.loading = false + }) + .catch(() => { + this.loading = false + }) } else { console.log('error submit!!') return false } }) - }, - afterQRScan() { - // const hash = window.location.hash.slice(1) - // const hashObj = getQueryObject(hash) - // const originUrl = window.location.origin - // history.replaceState({}, '', originUrl) - // const codeMap = { - // wechat: 'code', - // tencent: 'code' - // } - // const codeName = hashObj[codeMap[this.auth_type]] - // if (!codeName) { - // alert('第三方登录失败') - // } else { - // this.$store.dispatch('LoginByThirdparty', codeName).then(() => { - // this.$router.push({ path: '/' }) - // }) - // } } + // afterQRScan() { + // if (e.key === 'x-admin-oauth-code') { + // const code = getQueryObject(e.newValue) + // const codeMap = { + // wechat: 'code', + // tencent: 'code' + // } + // const type = codeMap[this.auth_type] + // const codeName = code[type] + // if (codeName) { + // this.$store.dispatch('LoginByThirdparty', codeName).then(() => { + // this.$router.push({ path: this.redirect || '/' }) + // }) + // } else { + // alert('第三方登录失败') + // } + // } + // } } } </script> -<style rel="stylesheet/scss" lang="scss"> - /* 修复input 背景不协调 和光标变色 */ - /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */ +<style lang="scss"> +/* 修复input 背景不协调 和光标变色 */ +/* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */ - $bg:#283443; - $light_gray:#eee; - $cursor: #fff; +$bg:#283443; +$light_gray:#fff; +$cursor: #fff; - @supports (-webkit-mask: none) and (not (cater-color: $cursor)) { - .login-container .el-input input{ - color: $cursor; - &::first-line { - color: $light_gray; - } - } +@supports (-webkit-mask: none) and (not (cater-color: $cursor)) { + .login-container .el-input input { + color: $cursor; } +} - /* reset element-ui css */ - .login-container { - .el-input { - display: inline-block; +/* reset element-ui css */ +.login-container { + .el-input { + display: inline-block; + height: 47px; + width: 85%; + + input { + background: transparent; + border: 0px; + -webkit-appearance: none; + border-radius: 0px; + padding: 12px 5px 12px 15px; + color: $light_gray; height: 47px; - width: 85%; - input { - background: transparent; - border: 0px; - -webkit-appearance: none; - border-radius: 0px; - padding: 12px 5px 12px 15px; - color: $light_gray; - height: 47px; - caret-color: $cursor; - &:-webkit-autofill { - box-shadow: 0 0 0px 1000px $bg inset !important; - -webkit-text-fill-color: $cursor !important; - } + caret-color: $cursor; + + &:-webkit-autofill { + box-shadow: 0 0 0px 1000px $bg inset !important; + -webkit-text-fill-color: $cursor !important; } } - .el-form-item { - border: 1px solid rgba(255, 255, 255, 0.1); - background: rgba(0, 0, 0, 0.1); - border-radius: 5px; - color: #454545; - } } + + .el-form-item { + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(0, 0, 0, 0.1); + border-radius: 5px; + color: #454545; + } +} </style> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> $bg:#2d3a4b; $dark_gray:#889aa4; $light_gray:#eee; @@ -237,6 +241,7 @@ $light_gray:#eee; width: 100%; background-color: $bg; overflow: hidden; + .login-form { position: relative; width: 520px; @@ -245,16 +250,19 @@ $light_gray:#eee; margin: 0 auto; overflow: hidden; } + .tips { font-size: 14px; color: #fff; margin-bottom: 10px; + span { &:first-of-type { margin-right: 16px; } } } + .svg-container { padding: 6px 5px 6px 15px; color: $dark_gray; @@ -262,8 +270,10 @@ $light_gray:#eee; width: 30px; display: inline-block; } + .title-container { position: relative; + .title { font-size: 26px; color: $light_gray; @@ -271,15 +281,17 @@ $light_gray:#eee; text-align: center; font-weight: bold; } + .set-language { color: #fff; position: absolute; top: 3px; - font-size:18px; + font-size: 18px; right: 0px; cursor: pointer; } } + .show-pwd { position: absolute; right: 10px; @@ -289,10 +301,17 @@ $light_gray:#eee; cursor: pointer; user-select: none; } + .thirdparty-button { position: absolute; right: 0; bottom: 6px; } + + @media only screen and (max-width: 470px) { + .thirdparty-button { + display: none; + } + } } </style> diff --git a/src/views/login/socialsignin.vue b/src/views/login/socialsignin.vue index 567ac553..d047b068 100644 --- a/src/views/login/socialsignin.vue +++ b/src/views/login/socialsignin.vue @@ -35,7 +35,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .social-signup-container { margin: 20px 0; .sign-btn { diff --git a/src/views/pdf/download.vue b/src/views/pdf/download.vue index b87b882d..bd0b3be2 100644 --- a/src/views/pdf/download.vue +++ b/src/views/pdf/download.vue @@ -1,12 +1,13 @@ <template> <div v-loading.fullscreen.lock="fullscreenLoading" class="main-article" element-loading-text="Efforts to generate PDF"> <div class="article__heading"> - <div class="article__heading__title"> {{ article.title }}</div> + <div class="article__heading__title"> + {{ article.title }} + </div> </div> <div style="color: #ccc;"> This article is from Evan You on <a target="_blank" href="https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf">medium</a> </div> - <!-- eslint-disable-next-line --> <div ref="content" class="node-article-content" v-html="article.content" /> </div> </template> @@ -41,7 +42,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss"> +<style lang="scss"> @mixin clearfix { &:before { display: table; diff --git a/src/views/pdf/index.vue b/src/views/pdf/index.vue index b7728152..238d4958 100644 --- a/src/views/pdf/index.vue +++ b/src/views/pdf/index.vue @@ -2,7 +2,9 @@ <div class="app-container"> <code style="margin-top:15px;">{{ $t('pdf.tips') }}</code> <router-link target="_blank" to="/pdf/download"> - <el-button type="primary">Click to download PDF</el-button> + <el-button type="primary"> + Click to download PDF + </el-button> </router-link> </div> </template> diff --git a/src/views/permission/components/SwitchRoles.vue b/src/views/permission/components/SwitchRoles.vue index c69de5a5..55297d09 100644 --- a/src/views/permission/components/SwitchRoles.vue +++ b/src/views/permission/components/SwitchRoles.vue @@ -1,6 +1,8 @@ <template> <div> - <div style="margin-bottom:15px;">{{ $t('permission.roles') }}: {{ roles }}</div> + <div style="margin-bottom:15px;"> + {{ $t('permission.roles') }}: {{ roles }} + </div> {{ $t('permission.switchRoles') }}: <el-radio-group v-model="switchRoles"> <el-radio-button label="editor" /> @@ -20,7 +22,7 @@ export default { return this.roles[0] }, set(val) { - this.$store.dispatch('ChangeRoles', val).then(() => { + this.$store.dispatch('user/changeRoles', val).then(() => { this.$emit('change') }) } diff --git a/src/views/permission/directive.vue b/src/views/permission/directive.vue index 6019fae3..013c97a3 100644 --- a/src/views/permission/directive.vue +++ b/src/views/permission/directive.vue @@ -7,7 +7,9 @@ Only <el-tag class="permission-tag" size="small">admin</el-tag> can see this </span> - <el-tag v-permission="['admin']" class="permission-sourceCode" type="info">v-permission="['admin']"</el-tag> + <el-tag v-permission="['admin']" class="permission-sourceCode" type="info"> + v-permission="['admin']" + </el-tag> </div> <div> @@ -15,7 +17,9 @@ Only <el-tag class="permission-tag" size="small">editor</el-tag> can see this </span> - <el-tag v-permission="['editor']" class="permission-sourceCode" type="info">v-permission="['editor']"</el-tag> + <el-tag v-permission="['editor']" class="permission-sourceCode" type="info"> + v-permission="['editor']" + </el-tag> </div> <div> @@ -24,7 +28,9 @@ <el-tag class="permission-tag" size="small">admin</el-tag> and <el-tag class="permission-tag" size="small">editor</el-tag> can see this </span> - <el-tag v-permission="['admin','editor']" class="permission-sourceCode" type="info">v-permission="['admin','editor']"</el-tag> + <el-tag v-permission="['admin','editor']" class="permission-sourceCode" type="info"> + v-permission="['admin','editor']" + </el-tag> </div> </div> @@ -37,17 +43,23 @@ <el-tabs type="border-card" style="width:550px;"> <el-tab-pane v-if="checkPermission(['admin'])" label="Admin"> Admin can see this - <el-tag class="permission-sourceCode" type="info">v-if="checkPermission(['admin'])"</el-tag> + <el-tag class="permission-sourceCode" type="info"> + v-if="checkPermission(['admin'])" + </el-tag> </el-tab-pane> <el-tab-pane v-if="checkPermission(['editor'])" label="Editor"> Editor can see this - <el-tag class="permission-sourceCode" type="info">v-if="checkPermission(['editor'])"</el-tag> + <el-tag class="permission-sourceCode" type="info"> + v-if="checkPermission(['editor'])" + </el-tag> </el-tab-pane> <el-tab-pane v-if="checkPermission(['admin','editor'])" label="Admin-OR-Editor"> Both admin or editor can see this - <el-tag class="permission-sourceCode" type="info">v-if="checkPermission(['admin','editor'])"</el-tag> + <el-tag class="permission-sourceCode" type="info"> + v-if="checkPermission(['admin','editor'])" + </el-tag> </el-tab-pane> </el-tabs> </div> @@ -77,7 +89,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .app-container { /deep/ .permission-alert { width: 320px; diff --git a/src/views/permission/role.vue b/src/views/permission/role.vue index 4e22e50f..3789e516 100644 --- a/src/views/permission/role.vue +++ b/src/views/permission/role.vue @@ -1,21 +1,33 @@ <template> <div class="app-container"> - <el-button type="primary" @click="handleAddRole">{{ $t('permission.addRole') }}</el-button> + <el-button type="primary" @click="handleAddRole"> + {{ $t('permission.addRole') }} + </el-button> <el-table :data="rolesList" style="width: 100%;margin-top:30px;" border> <el-table-column align="center" label="Role Key" width="220"> - <template slot-scope="scope">{{ scope.row.key }}</template> + <template slot-scope="scope"> + {{ scope.row.key }} + </template> </el-table-column> <el-table-column align="center" label="Role Name" width="220"> - <template slot-scope="scope">{{ scope.row.name }}</template> + <template slot-scope="scope"> + {{ scope.row.name }} + </template> </el-table-column> <el-table-column align="header-center" label="Description"> - <template slot-scope="scope">{{ scope.row.description }}</template> + <template slot-scope="scope"> + {{ scope.row.description }} + </template> </el-table-column> <el-table-column align="center" label="Operations"> <template slot-scope="scope"> - <el-button type="primary" size="small" @click="handleEdit(scope)">{{ $t('permission.editPermission') }}</el-button> - <el-button type="danger" size="small" @click="handleDelete(scope)">{{ $t('permission.delete') }}</el-button> + <el-button type="primary" size="small" @click="handleEdit(scope)"> + {{ $t('permission.editPermission') }} + </el-button> + <el-button type="danger" size="small" @click="handleDelete(scope)"> + {{ $t('permission.delete') }} + </el-button> </template> </el-table-column> </el-table> @@ -38,12 +50,15 @@ </el-form-item> </el-form> <div style="text-align:right;"> - <el-button type="danger" @click="dialogVisible=false">{{ $t('permission.cancel') }}</el-button> - <el-button type="primary" @click="confirmRole">{{ $t('permission.confirm') }}</el-button> + <el-button type="danger" @click="dialogVisible=false"> + {{ $t('permission.cancel') }} + </el-button> + <el-button type="primary" @click="confirmRole"> + {{ $t('permission.confirm') }} + </el-button> </div> </el-dialog> </div> - </template> <script> @@ -173,7 +188,7 @@ export default { type: 'warning' }) .then(async() => { - await deleteRole(row.id) + await deleteRole(row.key) this.rolesList.splice($index, 1) this.$message({ type: 'success', @@ -215,7 +230,7 @@ export default { } } else { const { data } = await addRole(this.role) - this.role.key = data + this.role.key = data.key this.rolesList.push(this.role) } diff --git a/src/views/qiniu/upload.vue b/src/views/qiniu/upload.vue index 5766c669..9dc9aeda 100644 --- a/src/views/qiniu/upload.vue +++ b/src/views/qiniu/upload.vue @@ -1,7 +1,9 @@ <template> <el-upload :data="dataObj" :multiple="true" :before-upload="beforeUpload" action="https://upload.qbox.me" drag> <i class="el-icon-upload" /> - <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> + <div class="el-upload__text"> + 将文件拖到此处,或<em>点击上传</em> + </div> </el-upload> </template> diff --git a/src/views/svg-icons/index.vue b/src/views/svg-icons/index.vue index 89037e13..b14d4be6 100644 --- a/src/views/svg-icons/index.vue +++ b/src/views/svg-icons/index.vue @@ -42,7 +42,7 @@ export default { } </script> -<style rel="stylesheet/scss" lang="scss" scoped> +<style lang="scss" scoped> .icons-container { margin: 10px 20px 0; overflow: hidden; diff --git a/src/views/tab/components/tabPane.vue b/src/views/tab/components/tabPane.vue index 1b6030c6..fa3076d0 100644 --- a/src/views/tab/components/tabPane.vue +++ b/src/views/tab/components/tabPane.vue @@ -1,6 +1,5 @@ <template> <el-table :data="list" border fit highlight-current-row style="width: 100%"> - <el-table-column v-loading="loading" align="center" @@ -51,7 +50,6 @@ </el-tag> </template> </el-table-column> - </el-table> </template> diff --git a/src/views/table/complexTable.vue b/src/views/table/complexTable.vue index a276df1a..0398c9d2 100644 --- a/src/views/table/complexTable.vue +++ b/src/views/table/complexTable.vue @@ -11,10 +11,18 @@ <el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> </el-select> - <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('table.search') }}</el-button> - <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate">{{ $t('table.add') }}</el-button> - <el-button v-waves :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload">{{ $t('table.export') }}</el-button> - <el-checkbox v-model="showReviewer" class="filter-item" style="margin-left:15px;" @change="tableKey=tableKey+1">{{ $t('table.reviewer') }}</el-checkbox> + <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> + {{ $t('table.search') }} + </el-button> + <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate"> + {{ $t('table.add') }} + </el-button> + <el-button v-waves :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload"> + {{ $t('table.export') }} + </el-button> + <el-checkbox v-model="showReviewer" class="filter-item" style="margin-left:15px;" @change="tableKey=tableKey+1"> + {{ $t('table.reviewer') }} + </el-checkbox> </div> <el-table @@ -27,7 +35,7 @@ style="width: 100%;" @sort-change="sortChange" > - <el-table-column :label="$t('table.id')" prop="id" sortable="custom" align="center" width="65"> + <el-table-column :label="$t('table.id')" prop="id" sortable="custom" align="center" width="80"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> </template> @@ -66,12 +74,16 @@ </el-table-column> <el-table-column :label="$t('table.status')" class-name="status-col" width="100"> <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> + <el-tag :type="scope.row.status | statusFilter"> + {{ scope.row.status }} + </el-tag> </template> </el-table-column> <el-table-column :label="$t('table.actions')" align="center" width="230" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button type="primary" size="mini" @click="handleUpdate(scope.row)">{{ $t('table.edit') }}</el-button> + <el-button type="primary" size="mini" @click="handleUpdate(scope.row)"> + {{ $t('table.edit') }} + </el-button> <el-button v-if="scope.row.status!='published'" size="mini" type="success" @click="handleModifyStatus(scope.row,'published')"> {{ $t('table.publish') }} </el-button> @@ -113,8 +125,12 @@ </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> - <el-button @click="dialogFormVisible = false">{{ $t('table.cancel') }}</el-button> - <el-button type="primary" @click="dialogStatus==='create'?createData():updateData()">{{ $t('table.confirm') }}</el-button> + <el-button @click="dialogFormVisible = false"> + {{ $t('table.cancel') }} + </el-button> + <el-button type="primary" @click="dialogStatus==='create'?createData():updateData()"> + {{ $t('table.confirm') }} + </el-button> </div> </el-dialog> @@ -127,7 +143,6 @@ <el-button type="primary" @click="dialogPvVisible = false">{{ $t('table.confirm') }}</el-button> </span> </el-dialog> - </div> </template> diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index 97c1e815..a5fa71cd 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -2,7 +2,6 @@ <div class="app-container"> <!-- Note that row-key is necessary to get a correct row order. --> <el-table ref="dragTable" v-loading="listLoading" :data="list" row-key="id" border fit highlight-current-row style="width: 100%"> - <el-table-column align="center" label="ID" width="65"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> @@ -41,7 +40,9 @@ <el-table-column class-name="status-col" label="Status" width="110"> <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> + <el-tag :type="scope.row.status | statusFilter"> + {{ scope.row.status }} + </el-tag> </template> </el-table-column> @@ -50,12 +51,14 @@ <svg-icon class="drag-handler" icon-class="drag" /> </template> </el-table-column> - </el-table> <!-- $t is vue-i18n global function to translate lang (lang in @/lang) --> - <div class="show-d">{{ $t('table.dragTips1') }} : {{ oldList }}</div> - <div class="show-d">{{ $t('table.dragTips2') }} : {{ newList }}</div> - + <div class="show-d"> + {{ $t('table.dragTips1') }} : {{ oldList }} + </div> + <div class="show-d"> + {{ $t('table.dragTips2') }} : {{ newList }} + </div> </div> </template> @@ -93,17 +96,16 @@ export default { this.getList() }, methods: { - getList() { + async getList() { this.listLoading = true - fetchList(this.listQuery).then(response => { - this.list = response.data.items - this.total = response.data.total - this.listLoading = false - this.oldList = this.list.map(v => v.id) - this.newList = this.oldList.slice() - this.$nextTick(() => { - this.setSort() - }) + const { data } = await fetchList(this.listQuery) + this.list = data.items + this.total = data.total + this.listLoading = false + this.oldList = this.list.map(v => v.id) + this.newList = this.oldList.slice() + this.$nextTick(() => { + this.setSort() }) }, setSort() { diff --git a/src/views/table/dynamicTable/fixedThead.vue b/src/views/table/dynamicTable/fixedThead.vue index e4887a06..c3deb925 100644 --- a/src/views/table/dynamicTable/fixedThead.vue +++ b/src/views/table/dynamicTable/fixedThead.vue @@ -1,11 +1,16 @@ <template> <div class="app-container"> - <div class="filter-container"> <el-checkbox-group v-model="checkboxVal"> - <el-checkbox label="apple">apple</el-checkbox> - <el-checkbox label="banana">banana</el-checkbox> - <el-checkbox label="orange">orange</el-checkbox> + <el-checkbox label="apple"> + apple + </el-checkbox> + <el-checkbox label="banana"> + banana + </el-checkbox> + <el-checkbox label="orange"> + orange + </el-checkbox> </el-checkbox-group> </div> @@ -17,7 +22,6 @@ </template> </el-table-column> </el-table> - </div> </template> diff --git a/src/views/table/dynamicTable/index.vue b/src/views/table/dynamicTable/index.vue index 56eac980..4947b4b9 100644 --- a/src/views/table/dynamicTable/index.vue +++ b/src/views/table/dynamicTable/index.vue @@ -1,9 +1,13 @@ <template> <div class="app-container"> - <div style="margin:0 0 5px 20px">{{ $t('table.dynamicTips1') }}</div> + <div style="margin:0 0 5px 20px"> + {{ $t('table.dynamicTips1') }} + </div> <fixed-thead /> - <div style="margin:30px 0 5px 20px">{{ $t('table.dynamicTips2') }}</div> + <div style="margin:30px 0 5px 20px"> + {{ $t('table.dynamicTips2') }} + </div> <unfixed-thead /> </div> </template> diff --git a/src/views/table/dynamicTable/unfixedThead.vue b/src/views/table/dynamicTable/unfixedThead.vue index d7f1bbcf..831b070a 100644 --- a/src/views/table/dynamicTable/unfixedThead.vue +++ b/src/views/table/dynamicTable/unfixedThead.vue @@ -1,11 +1,16 @@ <template> <div class="app-container"> - <div class="filter-container"> <el-checkbox-group v-model="formThead"> - <el-checkbox label="apple">apple</el-checkbox> - <el-checkbox label="banana">banana</el-checkbox> - <el-checkbox label="orange">orange</el-checkbox> + <el-checkbox label="apple"> + apple + </el-checkbox> + <el-checkbox label="banana"> + banana + </el-checkbox> + <el-checkbox label="orange"> + orange + </el-checkbox> </el-checkbox-group> </div> @@ -17,7 +22,6 @@ </template> </el-table-column> </el-table> - </div> </template> diff --git a/src/views/table/inlineEditTable.vue b/src/views/table/inlineEditTable.vue index 3f1e1611..fb19d037 100644 --- a/src/views/table/inlineEditTable.vue +++ b/src/views/table/inlineEditTable.vue @@ -1,8 +1,6 @@ <template> <div class="app-container"> - <el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%"> - <el-table-column align="center" label="ID" width="80"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> @@ -29,7 +27,9 @@ <el-table-column class-name="status-col" label="Status" width="110"> <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> + <el-tag :type="scope.row.status | statusFilter"> + {{ scope.row.status }} + </el-tag> </template> </el-table-column> @@ -37,7 +37,9 @@ <template slot-scope="scope"> <template v-if="scope.row.edit"> <el-input v-model="scope.row.title" class="edit-input" size="small" /> - <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(scope.row)">cancel</el-button> + <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(scope.row)"> + cancel + </el-button> </template> <span v-else>{{ scope.row.title }}</span> </template> @@ -45,11 +47,14 @@ <el-table-column align="center" label="Actions" width="120"> <template slot-scope="scope"> - <el-button v-if="scope.row.edit" type="success" size="small" icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)">Ok</el-button> - <el-button v-else type="primary" size="small" icon="el-icon-edit" @click="scope.row.edit=!scope.row.edit">Edit</el-button> + <el-button v-if="scope.row.edit" type="success" size="small" icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)"> + Ok + </el-button> + <el-button v-else type="primary" size="small" icon="el-icon-edit" @click="scope.row.edit=!scope.row.edit"> + Edit + </el-button> </template> </el-table-column> - </el-table> </div> </template> @@ -83,17 +88,16 @@ export default { this.getList() }, methods: { - getList() { + async getList() { this.listLoading = true - fetchList(this.listQuery).then(response => { - const items = response.data.items - this.list = items.map(v => { - this.$set(v, 'edit', false) // https://vuejs.org/v2/guide/reactivity.html - v.originalTitle = v.title // will be used when user click the cancel botton - return v - }) - this.listLoading = false + const { data } = await fetchList(this.listQuery) + const items = data.items + this.list = items.map(v => { + this.$set(v, 'edit', false) // https://vuejs.org/v2/guide/reactivity.html + v.originalTitle = v.title // will be used when user click the cancel botton + return v }) + this.listLoading = false }, cancelEdit(row) { row.title = row.originalTitle diff --git a/src/views/theme/index.vue b/src/views/theme/index.vue index 906b0b18..b67c2c67 100644 --- a/src/views/theme/index.vue +++ b/src/views/theme/index.vue @@ -14,18 +14,30 @@ </el-card> <div class="block"> - <el-button type="primary">Primary</el-button> - <el-button type="success">Success</el-button> - <el-button type="info">Info</el-button> - <el-button type="warning">Warning</el-button> - <el-button type="danger">Danger</el-button> + <el-button type="primary"> + Primary + </el-button> + <el-button type="success"> + Success + </el-button> + <el-button type="info"> + Info + </el-button> + <el-button type="warning"> + Warning + </el-button> + <el-button type="danger"> + Danger + </el-button> </div> <div class="block"> <el-button type="primary" icon="el-icon-edit" /> <el-button type="primary" icon="el-icon-share" /> <el-button type="primary" icon="el-icon-delete" /> - <el-button type="primary" icon="el-icon-search">Search</el-button> + <el-button type="primary" icon="el-icon-search"> + Search + </el-button> <el-button type="primary"> Upload <i class="el-icon-upload el-icon-right" /> @@ -40,16 +52,21 @@ <div class="block"> <el-radio-group v-model="radio"> - <el-radio :label="3">Option A</el-radio> - <el-radio :label="6">Option B</el-radio> - <el-radio :label="9">Option C</el-radio> + <el-radio :label="3"> + Option A + </el-radio> + <el-radio :label="6"> + Option B + </el-radio> + <el-radio :label="9"> + Option C + </el-radio> </el-radio-group> </div> <div class="block"> <el-slider v-model="slideValue" /> </div> - </div> </template> diff --git a/src/views/tree-table/custom/data.js b/src/views/tree-table/custom/data.js deleted file mode 100644 index 020f6247..00000000 --- a/src/views/tree-table/custom/data.js +++ /dev/null @@ -1,51 +0,0 @@ -const data = [ - { - name: '1', - timeLine: 100, - children: [ - { - name: '1-1', - timeLine: 20 - }, - { - name: '1-2', - timeLine: 60, - children: [ - { - name: '1-2-1', - timeLine: 35 - }, - { - name: '1-2-2', - timeLine: 25 - } - ] - } - ] - }, - { - name: '2', - timeLine: 80, - children: [ - { - name: '2-1', - timeLine: 30 - }, - { - name: '2-2', - timeLine: 50 - }, - { - name: '2-3', - timeLine: 60 - } - ] - }, - { - name: '3', - timeLine: 40 - } -] - -export default data - diff --git a/src/views/tree-table/custom/index.vue b/src/views/tree-table/custom/index.vue deleted file mode 100644 index 9c4930a2..00000000 --- a/src/views/tree-table/custom/index.vue +++ /dev/null @@ -1,158 +0,0 @@ -<template> - <div> - <div class="app-container"> - - <el-button type="primary" size="small" style="margin:0 0 20px 0;"> - <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> - </el-button> - - <tree-table - ref="TreeTable" - :data="tableData" - :default-expand-all="true" - :columns="columns" - border - default-children="children" - @selection-change="selectChange" - > - - <template slot="selection"> - <el-table-column type="selection" align="center" width="55" /> - </template> - - <template slot="pre-column"> - <el-table-column type="expand" width="55"> - <template> - <el-tag type="info"> - Here is just a placeholder slot, you can display anything. - </el-tag> - </template> - </el-table-column> - </template> - - <template slot="timeline" slot-scope="{scope}"> - - <el-tooltip :content="scope.row.timeLine+'ms'" effect="dark" placement="left"> - <div class="processContainer"> - <div - :style="{ width:(scope.row.timeLine||0) * 3+'px', - background:scope.row.timeLine>50?'rgba(233,0,0,.5)':'rgba(0,0,233,0.5)', - marginLeft:scope.row._level * 50+'px' }" - class="process" - > - <span style="display:inline-block" /> - </div> - </div> - </el-tooltip> - - </template> - - <template slot="append" slot-scope="{scope}"> - <el-button - size="mini" - type="primary" - @click="addMenuItem(scope.row,'brother')" - >Append Brother - </el-button> - <el-button - size="mini" - type="primary" - @click="addMenuItem(scope.row,'children')" - >Append Child - </el-button> - </template> - <template slot="operation" slot-scope="{scope}"> - <el-button size="mini" type="success" @click="editItem(scope.row)">Edit</el-button> - <el-button size="mini" type="danger" @click="deleteItem(scope.row)">Delete</el-button> - </template> - </tree-table> - </div> - - <el-dialog :visible.sync="dialogFormVisible" title="Edit"> - <el-form :model="tempItem" label-width="100px" style="width:600px"> - <el-form-item label="Name"> - <el-input v-model.trim="tempItem.name" placeholder="Name" /> - </el-form-item> - </el-form> - <span slot="footer" class="dialog-footer"> - <el-button @click="dialogFormVisible = false">Cancel</el-button> - <el-button type="primary" @click="updateItem">Confirm</el-button> - </span> - </el-dialog> - - </div> -</template> - -<script> -import TreeTable from '@/components/TreeTable' -import data from './data.js' - -export default { - components: { TreeTable }, - data() { - return { - tableData: [], - tempItem: {}, - dialogFormVisible: false, - columns: [ - { - label: 'Name', - key: 'name', - expand: true - }, - { - label: 'Timeline', - key: 'timeline' - }, - { - label: 'Append', - key: 'append', - width: 300 - }, - { - label: 'Operation', - key: 'operation', - width: 160 - } - ] - } - }, - created() { - this.getData() - }, - methods: { - getData() { - this.tableData = data - }, - editItem(row) { - this.tempItem = Object.assign({}, row) - this.dialogFormVisible = true - }, - async updateItem() { - await this.$refs.TreeTable.updateTreeNode(this.tempItem) - this.dialogFormVisible = false - }, - addMenuItem(row, type) { - if (type === 'children') { - this.$refs.TreeTable.addChild(row, { name: 'child', timeLine: this.randomNum() }) - } - - if (type === 'brother') { - this.$refs.TreeTable.addBrother(row, { name: 'brother', timeLine: this.randomNum() }) - } - }, - deleteItem(row) { - this.$refs.TreeTable.delete(row) - }, - selectChange(val) { - console.log(val) - }, - randomNum() { - // return 1~100 - const max = 100 - const min = 1 - return Math.floor(Math.random() * (max - min + 1) + min) - } - } -} -</script> diff --git a/src/views/tree-table/data.js b/src/views/tree-table/data.js deleted file mode 100644 index 67b0137a..00000000 --- a/src/views/tree-table/data.js +++ /dev/null @@ -1,80 +0,0 @@ - -const data = [ - { - id: 0, - event: 'Event-0', - timeLine: 50 - }, - { - id: 1, - event: 'Event-1', - timeLine: 100, - children: [ - { - id: 2, - event: 'Event-2', - timeLine: 10 - - }, - { - id: 3, - event: 'Event-3', - timeLine: 90, - children: [ - { - id: 4, - event: 'Event-4', - timeLine: 5 - - }, - { - id: 5, - event: 'Event-5', - timeLine: 10 - - }, - { - id: 6, - event: 'Event-6', - timeLine: 75, - - children: [ - { - id: 7, - event: 'Event-7', - timeLine: 50, - - children: [ - { - id: 71, - event: 'Event-7-1', - timeLine: 25 - - }, - { - id: 72, - event: 'Event-7-2', - timeLine: 5 - - }, - { - id: 73, - event: 'Event-7-3', - timeLine: 20 - } - ] - }, - { - id: 8, - event: 'Event-8', - timeLine: 25 - } - ] - } - ] - } - ] - } -] - -export default data diff --git a/src/views/tree-table/index.vue b/src/views/tree-table/index.vue deleted file mode 100644 index ade9f4f3..00000000 --- a/src/views/tree-table/index.vue +++ /dev/null @@ -1,128 +0,0 @@ -<template> - <div class="app-container"> - - <div style="margin-bottom:20px;"> - - <el-button type="primary" size="small" class="option-item"> - <a href="https://github.com/PanJiaChen/vue-element-admin/tree/master/src/components/TreeTable" target="_blank">Documentation</a> - </el-button> - - <div class="option-item"> - <el-tag>Expand All</el-tag> - <el-switch - v-model="defaultExpandAll" - active-color="#13ce66" - inactive-color="#ff4949" - @change="reset" - /> - </div> - - <div class="option-item"> - <el-tag>Show Checkbox</el-tag> - <el-switch - v-model="showCheckbox" - active-color="#13ce66" - inactive-color="#ff4949" - /> - </div> - - </div> - - <tree-table :key="key" :default-expand-all="defaultExpandAll" :data="data" :columns="columns" border> - <template slot="scope" slot-scope="{scope}"> - <el-tag>level: {{ scope.row._level }}</el-tag> - <el-tag>expand: {{ scope.row._expand }}</el-tag> - <el-tag>select: {{ scope.row._select }}</el-tag> - </template> - <template slot="operation" slot-scope="{scope}"> - <el-button type="primary" size="" @click="click(scope)">Click</el-button> - </template> - </tree-table> - - </div> -</template> - -<script> -import treeTable from '@/components/TreeTable' -import data from './data' - -export default { - name: 'TreeTableDemo', - components: { treeTable }, - data() { - return { - defaultExpandAll: false, - showCheckbox: true, - key: 1, - columns: [ - { - label: 'Checkbox', - checkbox: true - }, - { - label: '', - key: 'id', - expand: true - }, - { - label: 'Event', - key: 'event', - width: 200, - align: 'left' - }, - { - label: 'Scope', - key: 'scope' - }, - { - label: 'Operation', - key: 'operation' - } - ], - data: data - } - }, - watch: { - showCheckbox(val) { - if (val) { - this.columns.unshift({ - label: 'Checkbox', - checkbox: true - }) - } else { - this.columns.shift() - } - this.reset() - } - }, - methods: { - reset() { - ++this.key - }, - click(scope) { - console.log(scope) - - const row = scope.row - const message = Object.keys(row) - .map(i => { - return `<p>${i}: ${row[i]}</p>` - }) - .join('') - - this.$notify({ - title: 'Success', - dangerouslyUseHTMLString: true, - message: message, - type: 'success' - }) - } - } -} -</script> - -<style scoped> -.option-item{ - display: inline-block; - margin-right: 15px; -} -</style> diff --git a/src/views/zip/index.vue b/src/views/zip/index.vue index 11ce77b7..ed7e8af2 100644 --- a/src/views/zip/index.vue +++ b/src/views/zip/index.vue @@ -2,7 +2,9 @@ <div class="app-container"> <!-- $t is vue-i18n global function to translate lang --> <el-input v-model="filename" :placeholder="$t('zip.placeholder')" style="width:300px;" prefix-icon="el-icon-document" /> - <el-button :loading="downloadLoading" style="margin-bottom:20px;" type="primary" icon="document" @click="handleDownload">{{ $t('zip.export') }} zip</el-button> + <el-button :loading="downloadLoading" style="margin-bottom:20px;" type="primary" icon="document" @click="handleDownload"> + {{ $t('zip.export') }} zip + </el-button> <el-table v-loading="listLoading" :data="list" element-loading-text="拼命加载中" border fit highlight-current-row> <el-table-column align="center" label="ID" width="95"> <template slot-scope="scope"> @@ -51,12 +53,11 @@ export default { this.fetchData() }, methods: { - fetchData() { + async fetchData() { this.listLoading = true - fetchList().then(response => { - this.list = response.data.items - this.listLoading = false - }) + const { data } = await fetchList() + this.list = data.items + this.listLoading = false }, handleDownload() { this.downloadLoading = true diff --git a/tests/unit/.eslintrc.js b/tests/unit/.eslintrc.js new file mode 100644 index 00000000..958d51ba --- /dev/null +++ b/tests/unit/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + jest: true + } +} diff --git a/tests/unit/components/Hamburger.spec.js b/tests/unit/components/Hamburger.spec.js new file mode 100644 index 00000000..01ea303a --- /dev/null +++ b/tests/unit/components/Hamburger.spec.js @@ -0,0 +1,18 @@ +import { shallowMount } from '@vue/test-utils' +import Hamburger from '@/components/Hamburger/index.vue' +describe('Hamburger.vue', () => { + it('toggle click', () => { + const wrapper = shallowMount(Hamburger) + const mockFn = jest.fn() + wrapper.vm.$on('toggleClick', mockFn) + wrapper.find('.hamburger').trigger('click') + expect(mockFn).toBeCalled() + }) + it('prop isActive', () => { + const wrapper = shallowMount(Hamburger) + wrapper.setProps({ isActive: true }) + expect(wrapper.contains('.is-active')).toBe(true) + wrapper.setProps({ isActive: false }) + expect(wrapper.contains('.is-active')).toBe(false) + }) +}) diff --git a/tests/unit/components/SvgIcon.spec.js b/tests/unit/components/SvgIcon.spec.js new file mode 100644 index 00000000..31467a9f --- /dev/null +++ b/tests/unit/components/SvgIcon.spec.js @@ -0,0 +1,22 @@ +import { shallowMount } from '@vue/test-utils' +import SvgIcon from '@/components/SvgIcon/index.vue' +describe('SvgIcon.vue', () => { + it('iconClass', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.find('use').attributes().href).toBe('#icon-test') + }) + it('className', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.classes().length).toBe(1) + wrapper.setProps({ className: 'test' }) + expect(wrapper.classes().includes('test')).toBe(true) + }) +}) diff --git a/tests/unit/utils/formatTime.spec.js b/tests/unit/utils/formatTime.spec.js new file mode 100644 index 00000000..d07e414f --- /dev/null +++ b/tests/unit/utils/formatTime.spec.js @@ -0,0 +1,29 @@ +import { formatTime } from '@/utils/index.js' +describe('Utils:formatTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + const retrofit = 5 * 1000 + + it('ten digits timestamp', () => { + expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分') + }) + it('test now', () => { + expect(formatTime(+new Date() - 1)).toBe('刚刚') + }) + it('less two minute', () => { + expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前') + }) + it('less two hour', () => { + expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前') + }) + it('less one day', () => { + expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前') + }) + it('more than one day', () => { + expect(formatTime(d)).toBe('7月13日17时54分') + }) + it('format', () => { + expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) +}) diff --git a/tests/unit/utils/parseTime.spec.js b/tests/unit/utils/parseTime.spec.js new file mode 100644 index 00000000..77ecb9d5 --- /dev/null +++ b/tests/unit/utils/parseTime.spec.js @@ -0,0 +1,27 @@ +import { parseTime } from '@/utils/index.js' +describe('Utils:parseTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + it('timestamp', () => { + expect(parseTime(d)).toBe('2018-07-13 17:54:01') + }) + it('ten digits timestamp', () => { + expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') + }) + it('new Date', () => { + expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') + }) + it('format', () => { + expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) + it('get the day of the week', () => { + expect(parseTime(d, '{a}')).toBe('五') // 星期五 + }) + it('get the day of the week', () => { + expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 + }) + it('empty argument', () => { + expect(parseTime()).toBeNull() + }) +}) diff --git a/tests/unit/utils/validate.spec.js b/tests/unit/utils/validate.spec.js new file mode 100644 index 00000000..ef2efe61 --- /dev/null +++ b/tests/unit/utils/validate.spec.js @@ -0,0 +1,28 @@ +import { validUsername, validURL, validLowerCase, validUpperCase, validAlphabets } from '@/utils/validate.js' +describe('Utils:validate', () => { + it('validUsername', () => { + expect(validUsername('admin')).toBe(true) + expect(validUsername('editor')).toBe(true) + expect(validUsername('xxxx')).toBe(false) + }) + it('validURL', () => { + expect(validURL('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(validURL('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(validURL('github.com/PanJiaChen/vue-element-admin')).toBe(false) + }) + it('validLowerCase', () => { + expect(validLowerCase('abc')).toBe(true) + expect(validLowerCase('Abc')).toBe(false) + expect(validLowerCase('123abc')).toBe(false) + }) + it('validUpperCase', () => { + expect(validUpperCase('ABC')).toBe(true) + expect(validUpperCase('Abc')).toBe(false) + expect(validUpperCase('123ABC')).toBe(false) + }) + it('validAlphabets', () => { + expect(validAlphabets('ABC')).toBe(true) + expect(validAlphabets('Abc')).toBe(true) + expect(validAlphabets('123aBC')).toBe(false) + }) +}) diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 00000000..7b9d2dbb --- /dev/null +++ b/vue.config.js @@ -0,0 +1,147 @@ +'use strict' +const path = require('path') +const pkg = require('./package.json') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const name = pkg.name || 'vue-element-admin' // page title +const port = 9527 // dev port + +// All configuration item explanations can be find in https://cli.vuejs.org/config/ +module.exports = { + /** + * You will need to set publicPath if you plan to deploy your site under a sub path, + * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/, + * then publicPath should be set to "/bar/". + * In most cases please use '/' !!! + * Detail: https://cli.vuejs.org/config/#publicpath + */ + publicPath: '/', + outputDir: 'dist', + assetsDir: 'static', + lintOnSave: process.env.NODE_ENV === 'development' ? 'error' : false, + productionSourceMap: false, + devServer: { + port: port, + open: true, + overlay: { + warnings: false, + errors: true + }, + proxy: { + // change xxx-api/login => mock/login + // detail: https://cli.vuejs.org/config/#devserver-proxy + [process.env.VUE_APP_BASE_API]: { + target: `http://localhost:${port}/mock`, + changeOrigin: true, + pathRewrite: { + ['^' + process.env.VUE_APP_BASE_API]: '' + } + } + }, + after(app) { + require('@babel/register') + const bodyParser = require('body-parser') + + // parse app.body + // http://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const { default: mocks } = require('./mock') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + } + } + }, + configureWebpack: { + // provide the app's title in webpack's name field, so that + // it can be accessed in index.html to inject the correct title. + name: name, + resolve: { + alias: { + '@': resolve('src') + } + } + }, + chainWebpack(config) { + config.plugins.delete('preload') // TODO: need test + config.plugins.delete('prefetch') // TODO: need test + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + // set preserveWhitespace + config.module + .rule('vue') + .use('vue-loader') + .loader('vue-loader') + .tap(options => { + options.compilerOptions.preserveWhitespace = true + return options + }) + .end() + + config + .when(process.env.NODE_ENV === 'development', + config => config.devtool('cheap-source-map') + ) + + config + .when(process.env.NODE_ENV !== 'development', + config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + config + .optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app + test: /[\\/]node_modules[\\/]element-ui[\\/]/ + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + config.optimization.runtimeChunk('single') + } + ) + } +} From 26d1bf09fd7e1c2663ad761b67dda9d1262edf5a Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 1 Apr 2019 17:37:37 +0800 Subject: [PATCH 090/202] fix[Mock]: fixed mock bug --- mock/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mock/index.js b/mock/index.js index 15e07afa..7d9609ab 100644 --- a/mock/index.js +++ b/mock/index.js @@ -11,7 +11,10 @@ export function mockXHR() { Mock.XHR.prototype.send = function() { if (this.custom.xhr) { this.custom.xhr.withCredentials = this.withCredentials || false - this.custom.xhr.responseType = this.responseType + + if (this.responseType) { + this.custom.xhr.responseType = this.responseType + } } this.proxy_send(...arguments) } From a8c6e11ee66e5c9902a09bddf6d8aecccd9866ad Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 2 Apr 2019 10:39:26 +0800 Subject: [PATCH 091/202] fix[Css]: fixed github-corner css bug --- src/views/dashboard/admin/index.vue | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/views/dashboard/admin/index.vue b/src/views/dashboard/admin/index.vue index f06689ae..a766f04a 100644 --- a/src/views/dashboard/admin/index.vue +++ b/src/views/dashboard/admin/index.vue @@ -1,6 +1,6 @@ <template> <div class="dashboard-editor-container"> - <github-corner style="position: absolute; top: 0px; border: 0; right: 0;" /> + <github-corner class="github-corner" /> <panel-group @handleSetLineChartData="handleSetLineChartData" /> @@ -100,6 +100,15 @@ export default { .dashboard-editor-container { padding: 32px; background-color: rgb(240, 242, 245); + position: relative; + + .github-corner { + position: absolute; + top: 0px; + border: 0; + right: 0; + } + .chart-wrapper { background: #fff; padding: 16px 16px 0; From 55fa5acb85abcc763b1882a425d0baad29edf3e3 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 2 Apr 2019 16:32:51 +0800 Subject: [PATCH 092/202] perf: optimize the code of el-table slot-scope --- src/components/ErrorLog/index.vue | 8 +++--- .../admin/components/TransactionTable.vue | 6 ++--- src/views/example/list.vue | 12 ++++----- src/views/tab/components/tabPane.vue | 12 ++++----- src/views/table/complexTable.vue | 26 +++++++++---------- src/views/table/dragTable.vue | 6 ++--- src/views/table/inlineEditTable.vue | 22 ++++++++-------- 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/components/ErrorLog/index.vue b/src/components/ErrorLog/index.vue index 198e4916..9cc43886 100644 --- a/src/components/ErrorLog/index.vue +++ b/src/components/ErrorLog/index.vue @@ -9,25 +9,25 @@ <el-dialog :visible.sync="dialogTableVisible" title="Error Log" width="80%"> <el-table :data="errorLogs" border> <el-table-column label="Message"> - <template slot-scope="scope"> + <template slot-scope="{row}"> <div> <span class="message-title">Msg:</span> <el-tag type="danger"> - {{ scope.row.err.message }} + {{ row.err.message }} </el-tag> </div> <br> <div> <span class="message-title" style="padding-right: 10px;">Info: </span> <el-tag type="warning"> - {{ scope.row.vm.$vnode.tag }} error in {{ scope.row.info }} + {{ row.vm.$vnode.tag }} error in {{ row.info }} </el-tag> </div> <br> <div> <span class="message-title" style="padding-right: 16px;">Url: </span> <el-tag type="success"> - {{ scope.row.url }} + {{ row.url }} </el-tag> </div> </template> diff --git a/src/views/dashboard/admin/components/TransactionTable.vue b/src/views/dashboard/admin/components/TransactionTable.vue index 3eb8cb6c..68ab4792 100644 --- a/src/views/dashboard/admin/components/TransactionTable.vue +++ b/src/views/dashboard/admin/components/TransactionTable.vue @@ -11,9 +11,9 @@ </template> </el-table-column> <el-table-column label="Status" width="100" align="center"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> - {{ scope.row.status }} + <template slot-scope="{row}"> + <el-tag :type="row.status | statusFilter"> + {{ row.status }} </el-tag> </template> </el-table-column> diff --git a/src/views/example/list.vue b/src/views/example/list.vue index 2e7cc6c6..7cdc4ac0 100644 --- a/src/views/example/list.vue +++ b/src/views/example/list.vue @@ -26,17 +26,17 @@ </el-table-column> <el-table-column class-name="status-col" label="Status" width="110"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> - {{ scope.row.status }} + <template slot-scope="{row}"> + <el-tag :type="row.status | statusFilter"> + {{ row.status }} </el-tag> </template> </el-table-column> <el-table-column min-width="300px" label="Title"> - <template slot-scope="scope"> - <router-link :to="'/example/edit/'+scope.row.id" class="link-type"> - <span>{{ scope.row.title }}</span> + <template slot-scope="{row}"> + <router-link :to="'/example/edit/'+row.id" class="link-type"> + <span>{{ row.title }}</span> </router-link> </template> </el-table-column> diff --git a/src/views/tab/components/tabPane.vue b/src/views/tab/components/tabPane.vue index fa3076d0..3fb1439e 100644 --- a/src/views/tab/components/tabPane.vue +++ b/src/views/tab/components/tabPane.vue @@ -19,9 +19,9 @@ </el-table-column> <el-table-column min-width="300px" label="Title"> - <template slot-scope="scope"> - <span>{{ scope.row.title }}</span> - <el-tag>{{ scope.row.type }}</el-tag> + <template slot-scope="{row}"> + <span>{{ row.title }}</span> + <el-tag>{{ row.type }}</el-tag> </template> </el-table-column> @@ -44,9 +44,9 @@ </el-table-column> <el-table-column class-name="status-col" label="Status" width="110"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> - {{ scope.row.status }} + <template slot-scope="{row}"> + <el-tag :type="row.status | statusFilter"> + {{ row.status }} </el-tag> </template> </el-table-column> diff --git a/src/views/table/complexTable.vue b/src/views/table/complexTable.vue index 0398c9d2..bfe577b1 100644 --- a/src/views/table/complexTable.vue +++ b/src/views/table/complexTable.vue @@ -46,9 +46,9 @@ </template> </el-table-column> <el-table-column :label="$t('table.title')" min-width="150px"> - <template slot-scope="scope"> - <span class="link-type" @click="handleUpdate(scope.row)">{{ scope.row.title }}</span> - <el-tag>{{ scope.row.type | typeFilter }}</el-tag> + <template slot-scope="{row}"> + <span class="link-type" @click="handleUpdate(row)">{{ row.title }}</span> + <el-tag>{{ row.type | typeFilter }}</el-tag> </template> </el-table-column> <el-table-column :label="$t('table.author')" width="110px" align="center"> @@ -67,30 +67,30 @@ </template> </el-table-column> <el-table-column :label="$t('table.readings')" align="center" width="95"> - <template slot-scope="scope"> - <span v-if="scope.row.pageviews" class="link-type" @click="handleFetchPv(scope.row.pageviews)">{{ scope.row.pageviews }}</span> + <template slot-scope="{row}"> + <span v-if="row.pageviews" class="link-type" @click="handleFetchPv(row.pageviews)">{{ row.pageviews }}</span> <span v-else>0</span> </template> </el-table-column> <el-table-column :label="$t('table.status')" class-name="status-col" width="100"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> - {{ scope.row.status }} + <template slot-scope="{row}"> + <el-tag :type="row.status | statusFilter"> + {{ row.status }} </el-tag> </template> </el-table-column> <el-table-column :label="$t('table.actions')" align="center" width="230" class-name="small-padding fixed-width"> - <template slot-scope="scope"> - <el-button type="primary" size="mini" @click="handleUpdate(scope.row)"> + <template slot-scope="{row}"> + <el-button type="primary" size="mini" @click="handleUpdate(row)"> {{ $t('table.edit') }} </el-button> - <el-button v-if="scope.row.status!='published'" size="mini" type="success" @click="handleModifyStatus(scope.row,'published')"> + <el-button v-if="row.status!='published'" size="mini" type="success" @click="handleModifyStatus(row,'published')"> {{ $t('table.publish') }} </el-button> - <el-button v-if="scope.row.status!='draft'" size="mini" @click="handleModifyStatus(scope.row,'draft')"> + <el-button v-if="row.status!='draft'" size="mini" @click="handleModifyStatus(row,'draft')"> {{ $t('table.draft') }} </el-button> - <el-button v-if="scope.row.status!='deleted'" size="mini" type="danger" @click="handleModifyStatus(scope.row,'deleted')"> + <el-button v-if="row.status!='deleted'" size="mini" type="danger" @click="handleModifyStatus(row,'deleted')"> {{ $t('table.delete') }} </el-button> </template> diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index a5fa71cd..50077c6c 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -39,9 +39,9 @@ </el-table-column> <el-table-column class-name="status-col" label="Status" width="110"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> - {{ scope.row.status }} + <template slot-scope="{row}"> + <el-tag :type="row.status | statusFilter"> + {{ row.status }} </el-tag> </template> </el-table-column> diff --git a/src/views/table/inlineEditTable.vue b/src/views/table/inlineEditTable.vue index fb19d037..f739a144 100644 --- a/src/views/table/inlineEditTable.vue +++ b/src/views/table/inlineEditTable.vue @@ -26,31 +26,31 @@ </el-table-column> <el-table-column class-name="status-col" label="Status" width="110"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter"> - {{ scope.row.status }} + <template slot-scope="{row}"> + <el-tag :type="row.status | statusFilter"> + {{ row.status }} </el-tag> </template> </el-table-column> <el-table-column min-width="300px" label="Title"> - <template slot-scope="scope"> - <template v-if="scope.row.edit"> - <el-input v-model="scope.row.title" class="edit-input" size="small" /> - <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(scope.row)"> + <template slot-scope="{row}"> + <template v-if="row.edit"> + <el-input v-model="row.title" class="edit-input" size="small" /> + <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(row)"> cancel </el-button> </template> - <span v-else>{{ scope.row.title }}</span> + <span v-else>{{ row.title }}</span> </template> </el-table-column> <el-table-column align="center" label="Actions" width="120"> - <template slot-scope="scope"> - <el-button v-if="scope.row.edit" type="success" size="small" icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)"> + <template slot-scope="{row}"> + <el-button v-if="row.edit" type="success" size="small" icon="el-icon-circle-check-outline" @click="confirmEdit(row)"> Ok </el-button> - <el-button v-else type="primary" size="small" icon="el-icon-edit" @click="scope.row.edit=!scope.row.edit"> + <el-button v-else type="primary" size="small" icon="el-icon-edit" @click="row.edit=!row.edit"> Edit </el-button> </template> From a1708e9b68837c6bacad6702650d57063637cff0 Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Wed, 3 Apr 2019 13:40:24 +0800 Subject: [PATCH 093/202] perf: select demo add default-first-option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 其实这个属性还是看作者写菜单模糊搜索下拉框时候发现的,觉得体验非常棒。虽然文章模块这里只是一个示例,但是我觉得还是加上比较好。 --- src/views/example/components/ArticleDetail.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 55d825fe..2213e927 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -28,7 +28,7 @@ <el-row> <el-col :span="8"> <el-form-item label-width="45px" label="作者:" class="postInfo-container-item"> - <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable remote placeholder="搜索用户"> + <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable default-first-option remote placeholder="搜索用户"> <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item" /> </el-select> </el-form-item> From 4ad51be2db63204cb8ef92e76edd4ecb04896843 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 3 Apr 2019 14:23:44 +0800 Subject: [PATCH 094/202] chore: add issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 30 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 7 ++++++ .github/ISSUE_TEMPLATE/question.md | 14 +++++++++++ 3 files changed, 51 insertions(+) create mode 100755 .github/ISSUE_TEMPLATE/bug_report.md create mode 100755 .github/ISSUE_TEMPLATE/feature_request.md create mode 100755 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100755 index 00000000..c5b951f5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug report(报告问题) +about: Create a report to help us improve +--- +<!-- + 注意:为更好的解决你的问题,请参考模板提供完整信息,准确描述问题,信息不全的 issue 将被关闭。 + Note: In order to better solve your problem, please refer to the template to provide complete information, accurately describe the problem, and the incomplete information issue will be closed. +--> +## Bug report(问题描述) + +#### Steps to reproduce(问题复现步骤) +<!-- +1. [xxx] +2. [xxx] +3. [xxxx] +--> + +#### Screenshot or Gif(截图或动态图) + + +#### Link to minimal reproduction (最小可在线还原demo) + +<!-- +Please only use Codepen, JSFiddle, CodeSandbox or a github repo +--> + +#### Other relevant information(格外信息) +- Your OS: +- Node.js version: +- vue-element-admin version: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100755 index 00000000..c33d10d4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,7 @@ +--- +name: Feature Request(新功能建议) +about: Suggest an idea for this project +--- + +## Feature request(新功能建议) + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100755 index 00000000..96be4532 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,14 @@ +--- +name: Question(提问) +about: Asking questions about use +--- + +## Question(提问) + +<!-- + 提问之前,请确定你已经过自己的努力,尝试解决过这个问题。 + 若是代码相关问题,请不要只截图,请提供在线 demo,以便节约彼此的时间。 + + Before asking a question, please make sure that you have tried your best to solve this problem. + If it's a code-related issue, please don't just take screenshots. Please provide an online demo to save each other's time. +--> From cba0b789d08df365c3820f995675d431b310f0a3 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 3 Apr 2019 14:28:03 +0800 Subject: [PATCH 095/202] chore: update issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c5b951f5..1a114bc0 100755 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,8 +4,11 @@ about: Create a report to help us improve --- <!-- 注意:为更好的解决你的问题,请参考模板提供完整信息,准确描述问题,信息不全的 issue 将被关闭。 + Note: In order to better solve your problem, please refer to the template to provide complete information, accurately describe the problem, and the incomplete information issue will be closed. --> + + ## Bug report(问题描述) #### Steps to reproduce(问题复现步骤) @@ -18,7 +21,7 @@ about: Create a report to help us improve #### Screenshot or Gif(截图或动态图) -#### Link to minimal reproduction (最小可在线还原demo) +#### Link to minimal reproduction(最小可在线还原demo) <!-- Please only use Codepen, JSFiddle, CodeSandbox or a github repo From 25414f1fd90ac7686b3a2866b5ae0defd6294022 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 3 Apr 2019 17:52:30 +0800 Subject: [PATCH 096/202] fix[Guide]: fixed guide demo bug --- src/layout/components/Navbar.vue | 10 ++++---- src/layout/components/TagsView/index.vue | 2 +- src/views/guide/defineSteps.js | 32 ++++++++++++------------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index b0ee54c1..69bea6ac 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,19 +1,19 @@ <template> <div class="navbar"> - <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> + <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> - <breadcrumb class="breadcrumb-container" /> + <breadcrumb id="breadcrumb-container" class="breadcrumb-container" /> <div class="right-menu"> <template v-if="device!=='mobile'"> - <search class="right-menu-item" /> + <search class="right-menu-item header-search" /> <error-log class="errLog-container right-menu-item hover-effect" /> - <screenfull class="right-menu-item hover-effect" /> + <screenfull id="screenfull" class="right-menu-item hover-effect" /> <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom"> - <size-select class="right-menu-item hover-effect" /> + <size-select id="size-select" class="right-menu-item hover-effect" /> </el-tooltip> <lang-select class="right-menu-item hover-effect" /> diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index bdddaba6..2b6a77f3 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -1,5 +1,5 @@ <template> - <div class="tags-view-container"> + <div id="tags-view-container" class="tags-view-container"> <scroll-pane ref="scrollPane" class="tags-view-wrapper"> <router-link v-for="tag in visitedViews" diff --git a/src/views/guide/defineSteps.js b/src/views/guide/defineSteps.js index 405a3f72..283c672e 100644 --- a/src/views/guide/defineSteps.js +++ b/src/views/guide/defineSteps.js @@ -1,6 +1,6 @@ const steps = [ { - element: '.hamburger-container', + element: '#hamburger-container', popover: { title: 'Hamburger', description: 'Open && Close sidebar', @@ -8,7 +8,7 @@ const steps = [ } }, { - element: '.breadcrumb-container', + element: '#breadcrumb-container', popover: { title: 'Breadcrumb', description: 'Indicate the current page location', @@ -16,31 +16,31 @@ const steps = [ } }, { - element: '.screenfull', + element: '#header-search', + popover: { + title: 'Page Search', + description: 'Page search, quick navigation', + position: 'left' + } + }, + { + element: '#screenfull', popover: { title: 'Screenfull', - description: 'Bring the page into fullscreen', + description: 'Set the page into fullscreen', position: 'left' } }, { - element: '.international-icon', + element: '#size-select', popover: { - title: 'Switch language', - description: 'Switch the system language', + title: 'Switch Size', + description: 'Switch the system size', position: 'left' } }, { - element: '.theme-switch', - popover: { - title: 'Theme Switch', - description: 'Custom switch system theme', - position: 'left' - } - }, - { - element: '.tags-view-container', + element: '#tags-view-container', popover: { title: 'Tags view', description: 'The history of the page you visited', From 184125bdd369bf3c2dec4b182ae42993dfb5b7bc Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 3 Apr 2019 18:19:35 +0800 Subject: [PATCH 097/202] fix[Guide]: fixed missing component id --- src/layout/components/Navbar.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 69bea6ac..d544f079 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -6,7 +6,7 @@ <div class="right-menu"> <template v-if="device!=='mobile'"> - <search class="right-menu-item header-search" /> + <search id="header-search" class="right-menu-item" /> <error-log class="errLog-container right-menu-item hover-effect" /> From 43115e5538533ca82ebc9044931127dce729f9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 4 Apr 2019 12:58:37 +0800 Subject: [PATCH 098/202] perf: optimize page view name (#1835) --- mock/role/routes.js | 2 +- src/router/index.js | 2 +- src/views/login/{authredirect.vue => authRedirect.vue} | 2 +- src/views/login/index.vue | 2 +- src/views/login/{socialsignin.vue => socialSignin.vue} | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename src/views/login/{authredirect.vue => authRedirect.vue} (92%) rename src/views/login/{socialsignin.vue => socialSignin.vue} (100%) diff --git a/mock/role/routes.js b/mock/role/routes.js index d8eaf42a..14413d48 100644 --- a/mock/role/routes.js +++ b/mock/role/routes.js @@ -19,7 +19,7 @@ export const constantRoutes = [ }, { path: '/auth-redirect', - component: 'views/login/authredirect', + component: 'views/login/authRedirect', hidden: true }, { diff --git a/src/router/index.js b/src/router/index.js index a883d398..22dad190 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -57,7 +57,7 @@ export const constantRoutes = [ }, { path: '/auth-redirect', - component: () => import('@/views/login/authredirect'), + component: () => import('@/views/login/authRedirect'), hidden: true }, { diff --git a/src/views/login/authredirect.vue b/src/views/login/authRedirect.vue similarity index 92% rename from src/views/login/authredirect.vue rename to src/views/login/authRedirect.vue index 69e15397..7df89342 100644 --- a/src/views/login/authredirect.vue +++ b/src/views/login/authRedirect.vue @@ -1,6 +1,6 @@ <script> export default { - name: 'Authredirect', + name: 'AuthRedirect', created() { const hash = window.location.search.slice(1) if (window.localStorage) { diff --git a/src/views/login/index.vue b/src/views/login/index.vue index ac467584..979cfcb4 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -77,7 +77,7 @@ <script> import { validUsername } from '@/utils/validate' import LangSelect from '@/components/LangSelect' -import SocialSign from './socialsignin' +import SocialSign from './socialSignin' export default { name: 'Login', diff --git a/src/views/login/socialsignin.vue b/src/views/login/socialSignin.vue similarity index 100% rename from src/views/login/socialsignin.vue rename to src/views/login/socialSignin.vue From c923726464505213608bd8e334b768a72777b612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 4 Apr 2019 13:07:18 +0800 Subject: [PATCH 099/202] fix[TagsView]: fixed z-index bug (#1836) --- src/layout/components/TagsView/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index 2b6a77f3..f06f5156 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -243,7 +243,7 @@ export default { .contextmenu { margin: 0; background: #fff; - z-index: 100; + z-index: 3000; position: absolute; list-style-type: none; padding: 5px 0; From e363c7a77b50036e8c22125a9a889a707a859cdc Mon Sep 17 00:00:00 2001 From: Estelle00 <530908773@qq.com> Date: Thu, 4 Apr 2019 14:37:01 +0800 Subject: [PATCH 100/202] feature[Vuex]: auto import vuex modules(#1815) --- src/lang/index.js | 15 ++++++++++++++- src/store/index.js | 28 ++++++++++++++-------------- src/store/modules/app.js | 3 ++- src/store/modules/errorLog.js | 1 - src/store/modules/tagsView.js | 1 - 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/lang/index.js b/src/lang/index.js index 7c9c8af6..c443f41b 100644 --- a/src/lang/index.js +++ b/src/lang/index.js @@ -24,11 +24,24 @@ const messages = { ...elementEsLocale } } +export function getLanguage() { + const chooseLanguage = Cookies.get('language') + if (chooseLanguage) return chooseLanguage + // if has not choose language + const language = (navigator.language || navigator.browserLanguage).toLowerCase() + const locales = Object.keys(messages) + for (const locale of locales) { + if (language.indexOf(locale) > -1) { + return locale + } + } + return 'en' +} const i18n = new VueI18n({ // set locale // options: en | zh | es - locale: Cookies.get('language') || 'en', + locale: getLanguage(), // set locale messages messages }) diff --git a/src/store/index.js b/src/store/index.js index 4842ea7e..70736d3a 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,24 +1,24 @@ import Vue from 'vue' import Vuex from 'vuex' -import app from './modules/app' -import errorLog from './modules/errorLog' -import permission from './modules/permission' -import tagsView from './modules/tagsView' -import settings from './modules/settings' -import user from './modules/user' import getters from './getters' Vue.use(Vuex) +// https://webpack.js.org/guides/dependency-management/#requirecontext +const modulesFiles = require.context('./modules', false, /\.js$/) + +// you do not need `import app from './modules/app'` +// it will auto require all vuex module from modules file +const modules = modulesFiles.keys().reduce((modules, modulePath) => { + // set './app.js' => 'app' + const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') + const value = modulesFiles(modulePath) + modules[moduleName] = value.default + return modules +}, {}) + const store = new Vuex.Store({ - modules: { - app, - errorLog, - permission, - tagsView, - settings, - user - }, + modules, getters }) diff --git a/src/store/modules/app.js b/src/store/modules/app.js index 84875dd6..73616469 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -1,4 +1,5 @@ import Cookies from 'js-cookie' +import { getLanguage } from '@/lang/index' const state = { sidebar: { @@ -6,7 +7,7 @@ const state = { withoutAnimation: false }, device: 'desktop', - language: Cookies.get('language') || 'en', + language: getLanguage(), size: Cookies.get('size') || 'medium' } diff --git a/src/store/modules/errorLog.js b/src/store/modules/errorLog.js index c97d452a..8e3db060 100644 --- a/src/store/modules/errorLog.js +++ b/src/store/modules/errorLog.js @@ -1,4 +1,3 @@ - const state = { logs: [] } diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js index 5cbe32f3..3e2c1703 100644 --- a/src/store/modules/tagsView.js +++ b/src/store/modules/tagsView.js @@ -1,4 +1,3 @@ - const state = { visitedViews: [], cachedViews: [] From 0d40222b6420a4b4177067345b50ed8140982061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 4 Apr 2019 16:21:45 +0800 Subject: [PATCH 101/202] fix[Drag]: fixed drag bug in firefox (#1841) --- src/components/DndList/index.vue | 7 ++++++- src/components/Kanban/index.vue | 8 ++++++++ src/views/table/dragTable.vue | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/DndList/index.vue b/src/components/DndList/index.vue index a4643c0a..23ca006e 100644 --- a/src/components/DndList/index.vue +++ b/src/components/DndList/index.vue @@ -2,7 +2,7 @@ <div class="dndList"> <div :style="{width:width1}" class="dndList-list"> <h3>{{ list1Title }}</h3> - <draggable :list="list1" group="article" class="dragArea"> + <draggable :set-data="setData" :list="list1" group="article" class="dragArea"> <div v-for="element in list1" :key="element.id" class="list-complete-item"> <div class="list-complete-item-handle"> {{ element.id }}[{{ element.author }}] {{ element.title }} @@ -94,6 +94,11 @@ export default { if (this.isNotInList1(ele)) { this.list1.push(ele) } + }, + setData(dataTransfer) { + // to avoid Firefox bug + // Detail see : https://github.com/RubaXa/Sortable/issues/1012 + dataTransfer.setData('Text', '') } } } diff --git a/src/components/Kanban/index.vue b/src/components/Kanban/index.vue index 1171b5b8..c2cb4691 100644 --- a/src/components/Kanban/index.vue +++ b/src/components/Kanban/index.vue @@ -7,6 +7,7 @@ :list="list" v-bind="$attrs" class="board-column-content" + :set-data="setData" > <div v-for="element in list" :key="element.id" class="board-item"> {{ element.name }} {{ element.id }} @@ -39,6 +40,13 @@ export default { return [] } } + }, + methods: { + setData(dataTransfer) { + // to avoid Firefox bug + // Detail see : https://github.com/RubaXa/Sortable/issues/1012 + dataTransfer.setData('Text', '') + } } } </script> diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index 50077c6c..7abbd932 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -113,9 +113,9 @@ export default { this.sortable = Sortable.create(el, { ghostClass: 'sortable-ghost', // Class name for the drop placeholder, setData: function(dataTransfer) { - dataTransfer.setData('Text', '') // to avoid Firefox bug // Detail see : https://github.com/RubaXa/Sortable/issues/1012 + dataTransfer.setData('Text', '') }, onEnd: evt => { const targetRow = this.list.splice(evt.oldIndex, 1)[0] From 770753eff2127cc3f67a4f42be761411763d2805 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 4 Apr 2019 17:43:12 +0800 Subject: [PATCH 102/202] fix[request.js]: fixed missing return --- src/utils/request.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/request.js b/src/utils/request.js index a9b8c18f..b043c933 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -23,7 +23,7 @@ service.interceptors.request.use( error => { // Do something with request error console.log(error) // for debug - Promise.reject(error) + return Promise.reject(error) } ) From 7492e2097f189897eab207f96a79bf5b665df53a Mon Sep 17 00:00:00 2001 From: anson <ansonhorse@users.noreply.github.com> Date: Thu, 4 Apr 2019 17:51:45 +0800 Subject: [PATCH 103/202] fix[ErrorLog]: fixed error log dialog z-index bug (#1844) https://github.com/PanJiaChen/vue-element-admin/issues/1830 --- src/components/ErrorLog/index.vue | 2 +- src/settings.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ErrorLog/index.vue b/src/components/ErrorLog/index.vue index 9cc43886..7ffa573b 100644 --- a/src/components/ErrorLog/index.vue +++ b/src/components/ErrorLog/index.vue @@ -6,7 +6,7 @@ </el-button> </el-badge> - <el-dialog :visible.sync="dialogTableVisible" title="Error Log" width="80%"> + <el-dialog :visible.sync="dialogTableVisible" title="Error Log" width="80%" append-to-body> <el-table :data="errorLogs" border> <el-table-column label="Message"> <template slot-scope="{row}"> diff --git a/src/settings.js b/src/settings.js index d6300efc..e7ad4e1d 100644 --- a/src/settings.js +++ b/src/settings.js @@ -28,10 +28,10 @@ export default { sidebarLogo: false, /** - * @type {string | array} 'production' | ['production','development'] + * @type {string | array} 'production' | ['production', 'development'] * @description Need show err logs component. * The default is only used in the production env - * If you want to also use it in dev, you can pass ['production','development'] + * If you want to also use it in dev, you can pass ['production', 'development'] */ errorLog: 'production' } From f11839c8a480865a66b64812ecb49c6d02023da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Sun, 7 Apr 2019 23:10:14 +0800 Subject: [PATCH 104/202] docs: refine i18n (#1848) --- src/lang/en.js | 20 ++++++------- src/lang/es.js | 2 -- src/lang/zh.js | 28 +++++++++---------- src/views/excel/components/FilenameOption.vue | 2 +- src/views/excel/selectExcel.vue | 2 +- .../permission/components/SwitchRoles.vue | 4 +-- src/views/table/dragTable.vue | 4 +-- src/views/zip/index.vue | 2 +- 8 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/lang/en.js b/src/lang/en.js index ef4548e7..490ac206 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -1,7 +1,6 @@ export default { route: { dashboard: 'Dashboard', - introduction: 'Introduction', documentation: 'Documentation', guide: 'Guide', permission: 'Permission', @@ -10,7 +9,6 @@ export default { directivePermission: 'Directive Permission', icons: 'Icons', components: 'Components', - componentIndex: 'Introduction', tinymce: 'Tinymce', markdown: 'Markdown', jsonEditor: 'JSON Editor', @@ -19,9 +17,9 @@ export default { avatarUpload: 'Avatar Upload', dropzone: 'Dropzone', sticky: 'Sticky', - countTo: 'CountTo', + countTo: 'Count To', componentMixin: 'Mixin', - backToTop: 'BackToTop', + backToTop: 'Back To Top', dragDialog: 'Drag Dialog', dragSelect: 'Drag Select', dragKanban: 'Drag Kanban', @@ -74,7 +72,7 @@ export default { }, login: { title: 'Login Form', - logIn: 'Log in', + logIn: 'Login', username: 'Username', password: 'Password', any: 'any', @@ -87,10 +85,10 @@ export default { }, permission: { addRole: 'New Role', - editPermission: 'Edit Permission', + editPermission: 'Edit', roles: 'Your roles', switchRoles: 'Switch roles', - tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.', + tips: 'In some cases, using v-permission will have no effect. For example: Element-UI el-tab or el-table-column and other scenes that dynamically render dom. You can only do this with v-if.', delete: 'Delete', confirm: 'Confirm', cancel: 'Cancel' @@ -101,7 +99,7 @@ export default { }, components: { documentation: 'Documentation', - tinymceTips: 'Rich text editor is a core part of management system, but at the same time is a place with lots of problems. In the process of selecting rich texts, I also walked a lot of detours. The common rich text editors in the market are basically used, and the finally chose Tinymce. See documentation for more detailed rich text editor comparisons and introductions.', + tinymceTips: 'Rich text is a core feature of the management backend, but at the same time it is a place with lots of pits. In the process of selecting rich texts, I also took a lot of detours. The common rich texts on the market have been basically used, and I finally chose Tinymce. See the more detailed rich text comparison and introduction.', dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.', stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.', backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner', @@ -142,14 +140,14 @@ export default { excel: { export: 'Export', selectedExport: 'Export Selected Items', - placeholder: 'Please enter the file name(default excel-list)' + placeholder: 'Please enter the file name (default excel-list)' }, zip: { export: 'Export', - placeholder: 'Please enter the file name(default file)' + placeholder: 'Please enter the file name (default file)' }, pdf: { - tips: 'Here we use window.print() to implement the feature of downloading pdf.' + tips: 'Here we use window.print() to implement the feature of downloading PDF.' }, theme: { change: 'Change Theme', diff --git a/src/lang/es.js b/src/lang/es.js index 89a9e9d3..a8f69831 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -1,7 +1,6 @@ export default { route: { dashboard: 'Panel de control', - introduction: 'Introducción', documentation: 'Documentación', guide: 'Guía', permission: 'Permisos', @@ -10,7 +9,6 @@ export default { directivePermission: 'Permisos de la directiva', icons: 'Iconos', components: 'Componentes', - componentIndex: 'Introducción', tinymce: 'Tinymce', markdown: 'Markdown', jsonEditor: 'Editor JSON', diff --git a/src/lang/zh.js b/src/lang/zh.js index 702725cd..4394cc70 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -1,7 +1,6 @@ export default { route: { dashboard: '首页', - introduction: '简述', documentation: '文档', guide: '引导页', permission: '权限测试页', @@ -10,16 +9,15 @@ export default { directivePermission: '指令权限', icons: '图标', components: '组件', - componentIndex: '介绍', tinymce: '富文本编辑器', markdown: 'Markdown', - jsonEditor: 'JSON编辑器', + jsonEditor: 'JSON 编辑器', dndList: '列表拖拽', splitPane: 'Splitpane', avatarUpload: '头像上传', dropzone: 'Dropzone', sticky: 'Sticky', - countTo: 'CountTo', + countTo: 'Count To', componentMixin: '小组件', backToTop: '返回顶部', dragDialog: '拖拽 Dialog', @@ -32,17 +30,17 @@ export default { example: '综合实例', nested: '路由嵌套', menu1: '菜单1', - 'menu1-1': '菜单1-1', - 'menu1-2': '菜单1-2', - 'menu1-2-1': '菜单1-2-1', - 'menu1-2-2': '菜单1-2-2', - 'menu1-3': '菜单1-3', - menu2: '菜单2', + 'menu1-1': '菜单 1-1', + 'menu1-2': '菜单 1-2', + 'menu1-2-1': '菜单 1-2-1', + 'menu1-2-2': '菜单 1-2-2', + 'menu1-3': '菜单 1-3', + menu2: '菜单 2', Table: 'Table', - dynamicTable: '动态Table', - dragTable: '拖拽Table', - inlineEditTable: 'Table内编辑', - complexTable: '综合Table', + dynamicTable: '动态 Table', + dragTable: '拖拽 Table', + inlineEditTable: 'Table 内编辑', + complexTable: '综合 Table', tab: 'Tab', form: '表单', createArticle: '创建文章', @@ -90,7 +88,7 @@ export default { editPermission: '编辑权限', roles: '你的权限', switchRoles: '切换权限', - tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。', + tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 el-tab 或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。', delete: '删除', confirm: '确定', cancel: '取消' diff --git a/src/views/excel/components/FilenameOption.vue b/src/views/excel/components/FilenameOption.vue index b578d65c..c8e0530d 100644 --- a/src/views/excel/components/FilenameOption.vue +++ b/src/views/excel/components/FilenameOption.vue @@ -2,7 +2,7 @@ <div style="display:inline-block;"> <!-- $t is vue-i18n global function to translate lang --> <label class="radio-label" style="padding-left:0;">Filename: </label> - <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:340px;" prefix-icon="el-icon-document" /> + <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:350px;" prefix-icon="el-icon-document" /> </div> </template> diff --git a/src/views/excel/selectExcel.vue b/src/views/excel/selectExcel.vue index 05c52f5f..09866e13 100644 --- a/src/views/excel/selectExcel.vue +++ b/src/views/excel/selectExcel.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> <!-- $t is vue-i18n global function to translate lang --> - <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:340px;" prefix-icon="el-icon-document" /> + <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:350px;" prefix-icon="el-icon-document" /> <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload"> {{ $t('excel.selectedExport') }} </el-button> diff --git a/src/views/permission/components/SwitchRoles.vue b/src/views/permission/components/SwitchRoles.vue index 55297d09..de1176ad 100644 --- a/src/views/permission/components/SwitchRoles.vue +++ b/src/views/permission/components/SwitchRoles.vue @@ -1,9 +1,9 @@ <template> <div> <div style="margin-bottom:15px;"> - {{ $t('permission.roles') }}: {{ roles }} + {{ $t('permission.roles') }}: {{ roles }} </div> - {{ $t('permission.switchRoles') }}: + {{ $t('permission.switchRoles') }}: <el-radio-group v-model="switchRoles"> <el-radio-button label="editor" /> <el-radio-button label="admin" /> diff --git a/src/views/table/dragTable.vue b/src/views/table/dragTable.vue index 7abbd932..56b0ae6d 100644 --- a/src/views/table/dragTable.vue +++ b/src/views/table/dragTable.vue @@ -54,10 +54,10 @@ </el-table> <!-- $t is vue-i18n global function to translate lang (lang in @/lang) --> <div class="show-d"> - {{ $t('table.dragTips1') }} : {{ oldList }} + <el-tag style="margin-right:12px;">{{ $t('table.dragTips1') }} :</el-tag> {{ oldList }} </div> <div class="show-d"> - {{ $t('table.dragTips2') }} : {{ newList }} + <el-tag>{{ $t('table.dragTips2') }} :</el-tag> {{ newList }} </div> </div> </template> diff --git a/src/views/zip/index.vue b/src/views/zip/index.vue index ed7e8af2..564d0407 100644 --- a/src/views/zip/index.vue +++ b/src/views/zip/index.vue @@ -3,7 +3,7 @@ <!-- $t is vue-i18n global function to translate lang --> <el-input v-model="filename" :placeholder="$t('zip.placeholder')" style="width:300px;" prefix-icon="el-icon-document" /> <el-button :loading="downloadLoading" style="margin-bottom:20px;" type="primary" icon="document" @click="handleDownload"> - {{ $t('zip.export') }} zip + {{ $t('zip.export') }} Zip </el-button> <el-table v-loading="listLoading" :data="list" element-loading-text="拼命加载中" border fit highlight-current-row> <el-table-column align="center" label="ID" width="95"> From 90b7c2fbde8401f8f3f11d0d34128259f50a8767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 8 Apr 2019 11:01:24 +0800 Subject: [PATCH 105/202] feature[Mock]: mock-server support hot reload (#1850) https://github.com/PanJiaChen/vue-element-admin/issues/1849 --- mock/index.js | 21 +++++++++--- mock/mock-server.js | 79 +++++++++++++++++++++++++++++++++++++++++++++ mock/mocks.js | 12 ------- package.json | 1 + vue.config.js | 17 +--------- 5 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 mock/mock-server.js delete mode 100644 mock/mocks.js diff --git a/mock/index.js b/mock/index.js index 7d9609ab..08cdc471 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,11 +1,23 @@ import Mock from 'mockjs' -import mocks from './mocks' import { param2Obj } from '../src/utils' -const MOCK_API_BASE = '/mock' +import user from './user' +import role from './role' +import article from './article' +import search from './remoteSearch' +const mocks = [ + ...user, + ...role, + ...article, + ...search +] + +// for front mock +// please use it cautiously, it will redefine XMLHttpRequest, +// which will cause many of your third-party libraries to be invalidated(like progress event). export function mockXHR() { - // 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题 + // mock patch // https://github.com/nuysoft/Mock/issues/300 Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { @@ -42,9 +54,10 @@ export function mockXHR() { } } +// for mock server const responseFake = (url, type, respond) => { return { - url: new RegExp(`${MOCK_API_BASE}${url}`), + url: new RegExp(`/mock${url}`), type: type || 'get', response(req, res) { res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond)) diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 00000000..99346afb --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,79 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') + +function registerRoutes(app) { + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + } + return { + mockRoutesLength: Object.keys(mocks).length + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes('/mock')) { + delete require.cache[require.resolve(i)] + } + }) +} + +function getPath(path) { + var match = path.toString() + .replace('\\/?', '') + .replace('(?=\\/|$)', '$') + .match(/^\/\^((?:\\[.*+?^${}()|[\]\\\/]|[^.*+?^${}()|[\]\\\/])*)\$\//) + return match + ? match[1].replace(/\\(.)/g, '$1').split('/') + : path.toString() +} + +function getMockRoutesIndex(app) { + for (let index = 0; index <= app._router.stack.length; index++) { + const r = app._router.stack[index] + if (r.route && r.route.path) { + const path = getPath(r.route.path) + if (path.includes('mock')) { + return index + } + } + } +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // http://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const { mockRoutesLength } = registerRoutes(app) + + // watch files, hot reload mock server + chokidar.watch(('./mock'), { + ignored: 'mock/mock-server.js', + persistent: true, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + // find mock routes stack index + const index = getMockRoutesIndex(app) + + // remove mock routes stack + app._router.stack.splice(index, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + registerRoutes(app) + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } + }) +} diff --git a/mock/mocks.js b/mock/mocks.js deleted file mode 100644 index 84a25ddc..00000000 --- a/mock/mocks.js +++ /dev/null @@ -1,12 +0,0 @@ -import user from './user' -import role from './role' -import article from './article' -import search from './remoteSearch' - -export default [ - ...user, - ...role, - ...article, - ...search -] - diff --git a/package.json b/package.json index 12bf3ffc..f8f98543 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "babel-eslint": "10.0.1", "babel-jest": "23.6.0", "chalk": "2.4.2", + "chokidar": "2.1.5", "connect": "3.6.6", "eslint": "5.15.3", "eslint-plugin-vue": "5.2.2", diff --git a/vue.config.js b/vue.config.js index 7b9d2dbb..d3a08991 100644 --- a/vue.config.js +++ b/vue.config.js @@ -41,22 +41,7 @@ module.exports = { } } }, - after(app) { - require('@babel/register') - const bodyParser = require('body-parser') - - // parse app.body - // http://expressjs.com/en/4x/api.html#req.body - app.use(bodyParser.json()) - app.use(bodyParser.urlencoded({ - extended: true - })) - - const { default: mocks } = require('./mock') - for (const mock of mocks) { - app[mock.type](mock.url, mock.response) - } - } + after: require('./mock/mock-server.js') }, configureWebpack: { // provide the app's title in webpack's name field, so that From 083a4ada9db5fc9de9988d1b1a959dc17dd8bcd8 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 8 Apr 2019 11:08:06 +0800 Subject: [PATCH 106/202] perf[request.js]: optimize error message --- src/utils/request.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/request.js b/src/utils/request.js index b043c933..d2422c46 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -43,7 +43,7 @@ service.interceptors.response.use( const res = response.data if (res.code !== 20000) { Message({ - message: res.message, + message: res.message || 'error', type: 'error', duration: 5 * 1000 }) @@ -61,7 +61,7 @@ service.interceptors.response.use( }) }) } - return Promise.reject('error') + return Promise.reject(res.message || 'error') } else { return res } From 79e2a604af37236b7aefa4ace8679b7aa424491b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 8 Apr 2019 12:58:33 +0800 Subject: [PATCH 107/202] feature[Sidebar]: add activeMenu option (#1833) --- src/layout/components/Sidebar/index.vue | 11 ++++++- src/router/index.js | 40 ++++++++++++------------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index f02a4819..773cd5c8 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -3,7 +3,7 @@ <logo v-if="showLogo" :collapse="isCollapse" /> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu - :default-active="$route.path" + :default-active="activeMenu" :collapse="isCollapse" :background-color="variables.menuBg" :text-color="variables.menuText" @@ -30,6 +30,15 @@ export default { 'permission_routes', 'sidebar' ]), + activeMenu() { + const route = this.$route + const { meta, path } = route + // if set path, the sidebar will highlight the path you set + if (meta.activeMenu) { + return meta.activeMenu + } + return path + }, showLogo() { return this.$store.state.settings.sidebarLogo }, diff --git a/src/router/index.js b/src/router/index.js index 22dad190..c9117e5b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -12,32 +12,32 @@ import chartsRouter from './modules/charts' import tableRouter from './modules/table' import nestedRouter from './modules/nested' -/** note: sub-menu only appear when children.length>=1 - * detail see https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html - **/ - /** -* hidden: true if `hidden:true` will not show in the sidebar(default is false) -* alwaysShow: true if set true, will always show the root menu, whatever its child routes length -* if not set alwaysShow, only more than one route under the children -* it will becomes nested mode, otherwise not show the root menu -* redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb -* name:'router-name' the name is used by <keep-alive> (must set!!!) -* meta : { - roles: ['admin','editor'] will control the page roles (you can set multiple roles) - title: 'title' the name show in sub-menu and breadcrumb (recommend set) + * Note: sub-menu only appear when route children.length >= 1 + * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html + * + * hidden: true if set true, item will not show in the sidebar(default is false) + * alwaysShow: true if set true, will always show the root menu + * if not set alwaysShow, when item has more than one children route, + * it will becomes nested mode, otherwise not show the root menu + * redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb + * name:'router-name' the name is used by <keep-alive> (must set!!!) + * meta : { + roles: ['admin','editor'] control the page roles (you can set multiple roles) + title: 'title' the name show in sidebar and breadcrumb (recommend set) icon: 'svg-name' the icon show in the sidebar - noCache: true if true, the page will no be cached(default is false) - breadcrumb: false if false, the item will hidden in breadcrumb(default is true) - affix: true if true, the tag will affix in the tags-view + noCache: true if set true, the page will no be cached(default is false) + affix: true if set true, the tag will affix in the tags-view + breadcrumb: false if set false, the item will hidden in breadcrumb(default is true) + activeMenu: '/example/list' if set path, the sidebar will highlight the path you set } -**/ + */ /** * constantRoutes * a base page that does not have permission requirements * all roles can be accessed - * */ + */ export const constantRoutes = [ { path: '/redirect', @@ -113,7 +113,7 @@ export const constantRoutes = [ /** * asyncRoutes * the routes that need to be dynamically loaded based on user roles -*/ + */ export const asyncRoutes = [ { path: '/permission', @@ -195,7 +195,7 @@ export const asyncRoutes = [ path: 'edit/:id(\\d+)', component: () => import('@/views/example/edit'), name: 'EditArticle', - meta: { title: 'editArticle', noCache: true }, + meta: { title: 'editArticle', noCache: true, activeMenu: '/example/list' }, hidden: true }, { From e3b6602bbf14503c98a79002ce0452f0833bfdaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 8 Apr 2019 13:02:41 +0800 Subject: [PATCH 108/202] fix[Sidebar]: fixed sidebar scrollbar bug (#1853) --- src/styles/sidebar.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 5911eb85..e0accb83 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -28,10 +28,6 @@ .scrollbar-wrapper { overflow-x: hidden !important; - - .el-scrollbar__view { - height: 100%; - } } .el-scrollbar__bar.is-vertical { From 0358667a736cf179baaf23a466f053df1d819ece Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Mon, 8 Apr 2019 14:13:07 +0800 Subject: [PATCH 109/202] perf[Login]: password input add caps tooltip (#1845) --- src/views/login/index.vue | 53 ++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 979cfcb4..b9cba35f 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -23,24 +23,28 @@ /> </el-form-item> - <el-form-item prop="password"> - <span class="svg-container"> - <svg-icon icon-class="password" /> - </span> - <el-input - :key="passwordType" - ref="password" - v-model="loginForm.password" - :type="passwordType" - :placeholder="$t('login.password')" - name="password" - auto-complete="on" - @keyup.enter.native="handleLogin" - /> - <span class="show-pwd" @click="showPwd"> - <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> - </span> - </el-form-item> + <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual> + <el-form-item prop="password"> + <span class="svg-container"> + <svg-icon icon-class="password" /> + </span> + <el-input + :key="passwordType" + ref="password" + v-model="loginForm.password" + :type="passwordType" + :placeholder="$t('login.password')" + name="password" + auto-complete="on" + @keyup.native="checkCapslock" + @blur="capsTooltip = false" + @keyup.enter.native="handleLogin" + /> + <span class="show-pwd" @click="showPwd"> + <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> + </span> + </el-form-item> + </el-tooltip> <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin"> {{ $t('login.logIn') }} @@ -107,6 +111,7 @@ export default { password: [{ required: true, trigger: 'blur', validator: validatePassword }] }, passwordType: 'password', + capsTooltip: false, loading: false, showDialog: false, redirect: undefined @@ -134,6 +139,18 @@ export default { // window.removeEventListener('storage', this.afterQRScan) }, methods: { + checkCapslock({ shiftKey, key } = {}) { + if (key && key.length === 1) { + if (shiftKey && (key >= 'a' && key <= 'z') || !shiftKey && (key >= 'A' && key <= 'Z')) { + this.capsTooltip = true + } else { + this.capsTooltip = false + } + } + if (key === 'CapsLock' && this.capsTooltip === true) { + this.capsTooltip = false + } + }, showPwd() { if (this.passwordType === 'password') { this.passwordType = '' From afb62edc58b61cc190ff07214c4ac37486c80850 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 8 Apr 2019 18:10:41 +0800 Subject: [PATCH 110/202] fix[Sidebar]: fixed sidebar background css bug --- src/styles/sidebar.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index e0accb83..525a65b9 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -12,6 +12,7 @@ .sidebar-container { transition: width 0.28s; width: $sideBarWidth !important; + background-color: $menuBg; height: 100%; position: fixed; font-size: 0px; From c833cb6efabdef7f2d1241d1b204e2701f8a04c1 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 8 Apr 2019 21:45:10 +0800 Subject: [PATCH 111/202] perf[Chore]: optimization.splitChunks adapt cnpm module name --- build/index.js | 2 +- vue.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/index.js b/build/index.js index baf3807a..0c57de2a 100644 --- a/build/index.js +++ b/build/index.js @@ -26,7 +26,7 @@ if (process.env.npm_config_preview || rawArgv.includes('--preview')) { app.listen(port, function () { console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) if (report) { - console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}/report.html`)) + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) } }) diff --git a/vue.config.js b/vue.config.js index d3a08991..d5fede2b 100644 --- a/vue.config.js +++ b/vue.config.js @@ -114,7 +114,7 @@ module.exports = { elementUI: { name: 'chunk-elementUI', // split elementUI into a single package priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app - test: /[\\/]node_modules[\\/]element-ui[\\/]/ + test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm }, commons: { name: 'chunk-commons', From 342b7b428a7e87951a03228bc2ee750cbb551eb9 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 8 Apr 2019 22:05:10 +0800 Subject: [PATCH 112/202] fix[Chore]: add @vue/cli-plugin-eslint --- package.json | 1 + vue.config.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f8f98543..1b59855b 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "@babel/core": "7.0.0", "@babel/register": "7.0.0", "@vue/cli-plugin-babel": "3.5.3", + "@vue/cli-plugin-eslint": "3.5.1", "@vue/cli-plugin-unit-jest": "3.5.3", "@vue/cli-service": "3.5.3", "@vue/test-utils": "1.0.0-beta.29", diff --git a/vue.config.js b/vue.config.js index d5fede2b..cbd79510 100644 --- a/vue.config.js +++ b/vue.config.js @@ -21,7 +21,7 @@ module.exports = { publicPath: '/', outputDir: 'dist', assetsDir: 'static', - lintOnSave: process.env.NODE_ENV === 'development' ? 'error' : false, + lintOnSave: process.env.NODE_ENV === 'development', productionSourceMap: false, devServer: { port: port, From 8f45dbe328fd032b4914f6b4f6d4be63975f96b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 9 Apr 2019 09:58:08 +0800 Subject: [PATCH 113/202] feature[Icons]: add element-ui icons demo (#1865) --- src/views/svg-icons/element-icon.json | 1 + src/views/svg-icons/index.vue | 64 ++++++++++++++++++--------- src/views/svg-icons/requireIcons.js | 1 - 3 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 src/views/svg-icons/element-icon.json diff --git a/src/views/svg-icons/element-icon.json b/src/views/svg-icons/element-icon.json new file mode 100644 index 00000000..15072a4c --- /dev/null +++ b/src/views/svg-icons/element-icon.json @@ -0,0 +1 @@ +["info","error","success","warning","question","back","arrow-left","arrow-down","arrow-right","arrow-up","caret-left","caret-bottom","caret-top","caret-right","d-arrow-left","d-arrow-right","minus","plus","remove","circle-plus","remove-outline","circle-plus-outline","close","check","circle-close","circle-check","circle-close-outline","circle-check-outline","zoom-out","zoom-in","d-caret","sort","sort-down","sort-up","tickets","document","goods","sold-out","news","message","date","printer","time","bell","mobile-phone","service","view","menu","more","more-outline","star-on","star-off","location","location-outline","phone","phone-outline","picture","picture-outline","delete","search","edit","edit-outline","rank","refresh","share","setting","upload","upload2","download","loading"] diff --git a/src/views/svg-icons/index.vue b/src/views/svg-icons/index.vue index b14d4be6..665b1d03 100644 --- a/src/views/svg-icons/index.vue +++ b/src/views/svg-icons/index.vue @@ -4,37 +4,57 @@ <a href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/icon.html" target="_blank">Add and use </a> </p> - <div class="icons-wrapper"> - <div v-for="item of iconsMap" :key="item" @click="handleClipboard(generateIconCode(item),$event)"> - <el-tooltip placement="top"> - <div slot="content"> - {{ generateIconCode(item) }} - </div> - <div class="icon-item"> - <svg-icon :icon-class="item" class-name="disabled" /> - <span>{{ item }}</span> - </div> - </el-tooltip> - </div> - </div> + <el-tabs type="border-card"> + <el-tab-pane label="Icons"> + <div v-for="item of iconsMap" :key="item" @click="handleClipboard(generateIconCode(item),$event)"> + <el-tooltip placement="top"> + <div slot="content"> + {{ generateIconCode(item) }} + </div> + <div class="icon-item"> + <svg-icon :icon-class="item" class-name="disabled" /> + <span>{{ item }}</span> + </div> + </el-tooltip> + </div> + </el-tab-pane> + <el-tab-pane label="Element-UI Icons"> + <div v-for="item of elementIcons" :key="item" @click="handleClipboard(generateElementIconCode(item),$event)"> + <el-tooltip placement="top"> + <div slot="content"> + {{ generateElementIconCode(item) }} + </div> + <div class="icon-item"> + <i :class="'el-icon-' + item" /> + <span>{{ item }}</span> + </div> + </el-tooltip> + </div> + </el-tab-pane> + </el-tabs> </div> </template> <script> -import icons from './requireIcons' import clipboard from '@/utils/clipboard' +import icons from './requireIcons' +import elementIcons from './element-icon.json' export default { name: 'Icons', data() { return { - iconsMap: icons + iconsMap: icons, + elementIcons: elementIcons } }, methods: { generateIconCode(symbol) { return `<svg-icon icon-class="${symbol}" />` }, + generateElementIconCode(symbol) { + return `<i class="el-icon-${symbol}" />` + }, handleClipboard(text, event) { clipboard(text, event) } @@ -46,25 +66,25 @@ export default { .icons-container { margin: 10px 20px 0; overflow: hidden; - .icons-wrapper { - margin: 0 auto; - } + .icon-item { margin: 20px; - height: 110px; + height: 85px; text-align: center; - width: 110px; + width: 100px; float: left; font-size: 30px; color: #24292e; cursor: pointer; } + span { display: block; - font-size: 24px; + font-size: 16px; margin-top: 10px; } - .disabled{ + + .disabled { pointer-events: none; } } diff --git a/src/views/svg-icons/requireIcons.js b/src/views/svg-icons/requireIcons.js index 83a33955..56edb9f1 100644 --- a/src/views/svg-icons/requireIcons.js +++ b/src/views/svg-icons/requireIcons.js @@ -1,4 +1,3 @@ - const req = require.context('../../icons/svg', false, /\.svg$/) const requireAll = requireContext => requireContext.keys() From b627d3d0ba887962f73585d5f9d41745d017f2c8 Mon Sep 17 00:00:00 2001 From: derrick <1145390845@qq.com> Date: Tue, 9 Apr 2019 12:56:57 +0800 Subject: [PATCH 114/202] fix[TagsView]: fixed close last page bug(#1866) --- src/layout/components/TagsView/index.vue | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index f06f5156..19d3083f 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -145,7 +145,7 @@ export default { closeSelectedTag(view) { this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => { if (this.isActive(view)) { - this.toLastView(visitedViews) + this.toLastView(visitedViews, view) } }) }, @@ -160,16 +160,22 @@ export default { if (this.affixTags.some(tag => tag.path === view.path)) { return } - this.toLastView(visitedViews) + this.toLastView(visitedViews, view) }) }, - toLastView(visitedViews) { + toLastView(visitedViews, view) { const latestView = visitedViews.slice(-1)[0] if (latestView) { this.$router.push(latestView) } else { - // You can set another route - this.$router.push('/') + // now the default is to redirect to the home page if there is no tags-view, + // you can adjust it according to your needs. + if (view.name === 'Dashboard') { + // to reload home page + this.$router.replace({ path: '/redirect' + view.fullPath }) + } else { + this.$router.push('/') + } } }, openMenu(tag, e) { From dbee6ff707479967c8d843fd89b040b6e7828fb0 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 9 Apr 2019 14:25:14 +0800 Subject: [PATCH 115/202] refactor[mock-server]: refactor mock-server #1860 --- mock/mock-server.js | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/mock/mock-server.js b/mock/mock-server.js index 99346afb..af7e67ee 100644 --- a/mock/mock-server.js +++ b/mock/mock-server.js @@ -3,12 +3,16 @@ const bodyParser = require('body-parser') const chalk = require('chalk') function registerRoutes(app) { + let mockStartIndex const { default: mocks } = require('./index.js') for (const mock of mocks) { app[mock.type](mock.url, mock.response) + mockStartIndex = app._router.stack.length } + const mockRoutesLength = Object.keys(mocks).length return { - mockRoutesLength: Object.keys(mocks).length + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockStartIndex - mockRoutesLength } } @@ -20,28 +24,6 @@ function unregisterRoutes() { }) } -function getPath(path) { - var match = path.toString() - .replace('\\/?', '') - .replace('(?=\\/|$)', '$') - .match(/^\/\^((?:\\[.*+?^${}()|[\]\\\/]|[^.*+?^${}()|[\]\\\/])*)\$\//) - return match - ? match[1].replace(/\\(.)/g, '$1').split('/') - : path.toString() -} - -function getMockRoutesIndex(app) { - for (let index = 0; index <= app._router.stack.length; index++) { - const r = app._router.stack[index] - if (r.route && r.route.path) { - const path = getPath(r.route.path) - if (path.includes('mock')) { - return index - } - } - } -} - module.exports = app => { // es6 polyfill require('@babel/register') @@ -53,7 +35,9 @@ module.exports = app => { extended: true })) - const { mockRoutesLength } = registerRoutes(app) + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex // watch files, hot reload mock server chokidar.watch(('./mock'), { @@ -62,16 +46,15 @@ module.exports = app => { ignoreInitial: true }).on('all', (event, path) => { if (event === 'change' || event === 'add') { - // find mock routes stack index - const index = getMockRoutesIndex(app) - // remove mock routes stack - app._router.stack.splice(index, mockRoutesLength) + app._router.stack.splice(mockStartIndex, mockRoutesLength) // clear routes cache unregisterRoutes() - registerRoutes(app) + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) } From 9cba45e97135833a430a2803c2bf325fd6b85c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Wed, 10 Apr 2019 10:12:16 +0800 Subject: [PATCH 116/202] fix[Sidebar]: fixed external link bug (#1870) --- src/layout/components/Sidebar/SidebarItem.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue index 8c9c4328..b4422cf8 100644 --- a/src/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -86,6 +86,9 @@ export default { if (isExternal(routePath)) { return routePath } + if (isExternal(this.basePath)) { + return this.basePath + } return path.resolve(this.basePath, routePath) }, From aa9d48905f9f12e292038f8eeb0b27c003ae61f7 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 10 Apr 2019 15:54:47 +0800 Subject: [PATCH 117/202] [release] 4.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b59855b..72e92927 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-admin", - "version": "4.0.0", + "version": "4.0.1", "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", From 035c7d78f18b23d33ffadf47d97da91c00e1f2fe Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 11 Apr 2019 09:42:44 +0800 Subject: [PATCH 118/202] docs: change some http links to https --- .editorconfig | 2 +- README.md | 10 +++++----- README.zh-CN.md | 8 ++++---- mock/mock-server.js | 2 +- src/views/components-demo/splitpane.vue | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.editorconfig b/.editorconfig index ea6e20f5..3454886e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# http://editorconfig.org +# https://editorconfig.org root = true [*] diff --git a/README.md b/README.md index 48599a7e..b8b8447d 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,11 @@ English | [简体中文](./README.zh-CN.md) ## Introduction -[vue-element-admin](http://panjiachen.github.io/vue-element-admin) is a production-ready front-end solution for admin interfaces. It based on [vue](https://github.com/vuejs/vue) and use the UI Toolkit [element-ui](https://github.com/ElemeFE/element). +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) is a production-ready front-end solution for admin interfaces. It based on [vue](https://github.com/vuejs/vue) and use the UI Toolkit [element-ui](https://github.com/ElemeFE/element). It is a magical vue admin based on the newest development stack of vue, built-in i18n solution, typical templates for enterprise applications, lots of awesome features. It helps you build a large complex Single-Page Applications. I believe whatever your needs are, this project will help you. -- [Preview](http://panjiachen.github.io/vue-element-admin) +- [Preview](https://panjiachen.github.io/vue-element-admin) - [Documentation](https://panjiachen.github.io/vue-element-admin-site/) @@ -56,7 +56,7 @@ It is a magical vue admin based on the newest development stack of vue, built-in ## Preparation -You need to install [node](http://nodejs.org/) and [git](https://git-scm.com/) locally. The project is based on [ES2015+](http://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), all request data is simulated using [Mock.js](https://github.com/nuysoft/Mock). +You need to install [node](https://nodejs.org/) and [git](https://git-scm.com/) locally. The project is based on [ES2015+](https://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), all request data is simulated using [Mock.js](https://github.com/nuysoft/Mock). Understanding and learning this knowledge in advance will greatly help the use of this project. <p align="center"> @@ -187,7 +187,7 @@ Detailed changes for each release are documented in the [release notes](https:// ## Online Demo -[Preview](http://panjiachen.github.io/vue-element-admin) +[Preview](https://panjiachen.github.io/vue-element-admin) ## Donate @@ -203,7 +203,7 @@ If you find this project useful, you can buy author a glass of juice :tropical_d Modern browsers and Internet Explorer 10+. -| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Safari | | --------- | --------- | --------- | --------- | | IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions diff --git a/README.zh-CN.md b/README.zh-CN.md index e0ec09bb..21d1eb7b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -30,9 +30,9 @@ ## 简介 -[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台前端解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element-ui](https://github.com/ElemeFE/element)实现。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) 是一个后台前端解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element-ui](https://github.com/ElemeFE/element)实现。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。 -- [在线预览](http://panjiachen.github.io/vue-element-admin) +- [在线预览](https://panjiachen.github.io/vue-element-admin) - [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/) @@ -204,7 +204,7 @@ Detailed changes for each release are documented in the [release notes](https:// ## Online Demo -[在线 Demo](http://panjiachen.github.io/vue-element-admin) +[在线 Demo](https://panjiachen.github.io/vue-element-admin) ## Donate @@ -221,7 +221,7 @@ Detailed changes for each release are documented in the [release notes](https:// Modern browsers and Internet Explorer 10+. -| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Safari | | --------- | --------- | --------- | --------- | | IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions diff --git a/mock/mock-server.js b/mock/mock-server.js index af7e67ee..fcb931ad 100644 --- a/mock/mock-server.js +++ b/mock/mock-server.js @@ -29,7 +29,7 @@ module.exports = app => { require('@babel/register') // parse app.body - // http://expressjs.com/en/4x/api.html#req.body + // https://expressjs.com/en/4x/api.html#req.body app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true diff --git a/src/views/components-demo/splitpane.vue b/src/views/components-demo/splitpane.vue index 72b62014..4259abea 100644 --- a/src/views/components-demo/splitpane.vue +++ b/src/views/components-demo/splitpane.vue @@ -1,7 +1,7 @@ <template> <div class="components-container"> <code><strong>SplitPane</strong> If you've used - <a href="http://codepen.io/" target="_blank"> codepen</a>, + <a href="https://codepen.io/" target="_blank"> codepen</a>, <a href="https://jsfiddle.net/" target="_blank"> jsfiddle </a>will not be unfamiliar. <a href="https://github.com/PanJiaChen/vue-split-pane" target="_blank"> Github repository</a> </code> From 5dd98ea47f9cb25d42b408c2d9b3175285c6fd80 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 11 Apr 2019 10:00:21 +0800 Subject: [PATCH 119/202] perf[mock-server]: optimize variable name --- mock/mock-server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mock/mock-server.js b/mock/mock-server.js index fcb931ad..b29b7c3f 100644 --- a/mock/mock-server.js +++ b/mock/mock-server.js @@ -3,16 +3,16 @@ const bodyParser = require('body-parser') const chalk = require('chalk') function registerRoutes(app) { - let mockStartIndex + let mockLastIndex const { default: mocks } = require('./index.js') for (const mock of mocks) { app[mock.type](mock.url, mock.response) - mockStartIndex = app._router.stack.length + mockLastIndex = app._router.stack.length } const mockRoutesLength = Object.keys(mocks).length return { mockRoutesLength: mockRoutesLength, - mockStartIndex: mockStartIndex - mockRoutesLength + mockStartIndex: mockLastIndex - mockRoutesLength } } From 43ae8520b3ca1c97bf77bab8c1c4499df425df24 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 11 Apr 2019 10:06:02 +0800 Subject: [PATCH 120/202] docs: update readme --- README.md | 2 +- README.zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b8b8447d..01034b51 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ It is a magical vue admin based on the newest development stack of vue, built-in - Desktop: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour)) -**The current version is `4.0-beta`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version - stable version, you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)** +**The current version is `v4.0+` build on `vue-cli`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), it does not rely on `vue-cli'** **This project does not support low version browsers (e.g. IE). Please add polyfill by yourself.** diff --git a/README.zh-CN.md b/README.zh-CN.md index 21d1eb7b..0e15d8a4 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -50,7 +50,7 @@ - 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescript 版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) -**目前版本为 `4.0-beta`,若发现问题,欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本-稳定版,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)** +**目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若发现问题,欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0),它不依赖 `vue-cli`** **该项目不支持低版本浏览器(如 ie),有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** From d0651ad2f23da312f0ec59011812966db668b6ce Mon Sep 17 00:00:00 2001 From: Tuan Duong <bacduong@gmail.com> Date: Thu, 11 Apr 2019 11:41:36 +0900 Subject: [PATCH 121/202] perf: add jsdoc for utils and format some code (#1883) --- src/components/Charts/keyboard.vue | 191 +++++++++++++-------------- src/components/DragSelect/index.vue | 4 +- src/filters/index.js | 20 ++- src/layout/components/index.js | 4 +- src/layout/index.vue | 12 +- src/utils/index.js | 123 +++++++++++------ src/utils/openWindow.js | 1 - src/utils/scrollTo.js | 10 +- src/utils/validate.js | 37 +++++- src/views/components-demo/sticky.vue | 2 +- src/views/tab/index.vue | 2 +- 11 files changed, 250 insertions(+), 156 deletions(-) diff --git a/src/components/Charts/keyboard.vue b/src/components/Charts/keyboard.vue index 3f061bd0..0b258f36 100644 --- a/src/components/Charts/keyboard.vue +++ b/src/components/Charts/keyboard.vue @@ -53,103 +53,102 @@ export default { data.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5) data2.push((Math.sin(i / 5) * (i / 5 + 10) + i / 6) * 3) } - this.chart.setOption( - { - backgroundColor: '#08263a', - grid: { - left: '5%', - right: '5%' - }, - xAxis: [{ - show: false, - data: xAxisData - }, { - show: false, - data: xAxisData - }], - visualMap: { - show: false, - min: 0, - max: 50, - dimension: 0, - inRange: { - color: ['#4a657a', '#308e92', '#b1cfa5', '#f5d69f', '#f5898b', '#ef5055'] - } - }, - yAxis: { - axisLine: { - show: false - }, - axisLabel: { - textStyle: { - color: '#4a657a' - } - }, - splitLine: { - show: true, - lineStyle: { - color: '#08263f' - } - }, - axisTick: { - show: false - } - }, - series: [{ - name: 'back', - type: 'bar', - data: data2, - z: 1, - itemStyle: { - normal: { - opacity: 0.4, - barBorderRadius: 5, - shadowBlur: 3, - shadowColor: '#111' - } - } - }, { - name: 'Simulate Shadow', - type: 'line', - data, - z: 2, - showSymbol: false, - animationDelay: 0, - animationEasing: 'linear', - animationDuration: 1200, - lineStyle: { - normal: { - color: 'transparent' - } - }, - areaStyle: { - normal: { - color: '#08263a', - shadowBlur: 50, - shadowColor: '#000' - } - } - }, { - name: 'front', - type: 'bar', - data, - xAxisIndex: 1, - z: 3, - itemStyle: { - normal: { - barBorderRadius: 5 - } - } - }], - animationEasing: 'elasticOut', - animationEasingUpdate: 'elasticOut', - animationDelay(idx) { - return idx * 20 - }, - animationDelayUpdate(idx) { - return idx * 20 + this.chart.setOption({ + backgroundColor: '#08263a', + grid: { + left: '5%', + right: '5%' + }, + xAxis: [{ + show: false, + data: xAxisData + }, { + show: false, + data: xAxisData + }], + visualMap: { + show: false, + min: 0, + max: 50, + dimension: 0, + inRange: { + color: ['#4a657a', '#308e92', '#b1cfa5', '#f5d69f', '#f5898b', '#ef5055'] } - }) + }, + yAxis: { + axisLine: { + show: false + }, + axisLabel: { + textStyle: { + color: '#4a657a' + } + }, + splitLine: { + show: true, + lineStyle: { + color: '#08263f' + } + }, + axisTick: { + show: false + } + }, + series: [{ + name: 'back', + type: 'bar', + data: data2, + z: 1, + itemStyle: { + normal: { + opacity: 0.4, + barBorderRadius: 5, + shadowBlur: 3, + shadowColor: '#111' + } + } + }, { + name: 'Simulate Shadow', + type: 'line', + data, + z: 2, + showSymbol: false, + animationDelay: 0, + animationEasing: 'linear', + animationDuration: 1200, + lineStyle: { + normal: { + color: 'transparent' + } + }, + areaStyle: { + normal: { + color: '#08263a', + shadowBlur: 50, + shadowColor: '#000' + } + } + }, { + name: 'front', + type: 'bar', + data, + xAxisIndex: 1, + z: 3, + itemStyle: { + normal: { + barBorderRadius: 5 + } + } + }], + animationEasing: 'elasticOut', + animationEasingUpdate: 'elasticOut', + animationDelay(idx) { + return idx * 20 + }, + animationDelayUpdate(idx) { + return idx * 20 + } + }) } } } diff --git a/src/components/DragSelect/index.vue b/src/components/DragSelect/index.vue index 4a2e6300..28256a8b 100644 --- a/src/components/DragSelect/index.vue +++ b/src/components/DragSelect/index.vue @@ -49,13 +49,13 @@ export default { </script> <style scoped> -.drag-select >>> .sortable-ghost{ +.drag-select >>> .sortable-ghost { opacity: .8; color: #fff!important; background: #42b983!important; } -.drag-select >>> .el-tag{ +.drag-select >>> .el-tag { cursor: pointer; } </style> diff --git a/src/filters/index.js b/src/filters/index.js index b164513a..86e768d8 100644 --- a/src/filters/index.js +++ b/src/filters/index.js @@ -1,6 +1,12 @@ // set function parseTime,formatTime to filter export { parseTime, formatTime } from '@/utils' +/** + * Show plural label if time is plural number + * @param {number} time + * @param {string} label + * @return {string} + */ function pluralize(time, label) { if (time === 1) { return time + label @@ -8,6 +14,9 @@ function pluralize(time, label) { return time + label + 's' } +/** + * @param {number} time + */ export function timeAgo(time) { const between = Date.now() / 1000 - Number(time) if (between < 3600) { @@ -19,7 +28,12 @@ export function timeAgo(time) { } } -/* 数字 格式化*/ +/** + * Number formatting + * like 10000 => 10k + * @param {number} num + * @param {number} digits + */ export function numberFormatter(num, digits) { const si = [ { value: 1E18, symbol: 'E' }, @@ -37,6 +51,10 @@ export function numberFormatter(num, digits) { return num.toString() } +/** + * 10000 => "10,000" + * @param {number} num + */ export function toThousandFilter(num) { return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ',')) } diff --git a/src/layout/components/index.js b/src/layout/components/index.js index e9f79ddd..104bd3ac 100644 --- a/src/layout/components/index.js +++ b/src/layout/components/index.js @@ -1,5 +1,5 @@ +export { default as AppMain } from './AppMain' export { default as Navbar } from './Navbar' +export { default as Settings } from './Settings' export { default as Sidebar } from './Sidebar/index.vue' export { default as TagsView } from './TagsView/index.vue' -export { default as AppMain } from './AppMain' -export { default as Settings } from './Settings' diff --git a/src/layout/index.vue b/src/layout/index.vue index ec6df90c..965bcd1b 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -17,19 +17,19 @@ <script> import RightPanel from '@/components/RightPanel' -import { Navbar, Sidebar, AppMain, TagsView, Settings } from './components' +import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components' import ResizeMixin from './mixin/ResizeHandler' import { mapState } from 'vuex' export default { name: 'Layout', components: { - RightPanel, - Navbar, - Sidebar, AppMain, - TagsView, - Settings + Navbar, + RightPanel, + Settings, + Sidebar, + TagsView }, mixins: [ResizeMixin], computed: { diff --git a/src/utils/index.js b/src/utils/index.js index bfff4dda..c0ee5026 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -2,6 +2,12 @@ * Created by jiachenpan on 16/11/18. */ +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string} + */ export function parseTime(time, cFormat) { if (arguments.length === 0) { return null @@ -40,6 +46,11 @@ export function parseTime(time, cFormat) { return time_str } +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ export function formatTime(time, option) { if (('' + time).length === 10) { time = parseInt(time) * 1000 @@ -78,7 +89,10 @@ export function formatTime(time, option) { } } -// 格式化时间 +/** + * @param {string} url + * @returns {Object} + */ export function getQueryObject(url) { url = url == null ? window.location.href : url const search = url.substring(url.lastIndexOf('?') + 1) @@ -95,7 +109,7 @@ export function getQueryObject(url) { } /** - * @param {Sting} input value + * @param {string} input value * @returns {number} output value */ export function byteLength(str) { @@ -110,6 +124,10 @@ export function byteLength(str) { return s } +/** + * @param {Array} actual + * @returns {Array} + */ export function cleanArray(actual) { const newArray = [] for (let i = 0; i < actual.length; i++) { @@ -120,6 +138,10 @@ export function cleanArray(actual) { return newArray } +/** + * @param {Object} json + * @returns {Array} + */ export function param(json) { if (!json) return '' return cleanArray( @@ -130,6 +152,10 @@ export function param(json) { ).join('&') } +/** + * @param {string} url + * @returns {Object} + */ export function param2Obj(url) { const search = url.split('?')[1] if (!search) { @@ -146,16 +172,23 @@ export function param2Obj(url) { ) } +/** + * @param {string} val + * @returns {string} + */ export function html2Text(val) { const div = document.createElement('div') div.innerHTML = val return div.textContent || div.innerText } +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ export function objectMerge(target, source) { - /* Merges two objects, - giving the last one precedence */ - if (typeof target !== 'object') { target = {} } @@ -173,6 +206,10 @@ export function objectMerge(target, source) { return target } +/** + * @param {HTMLElement} element + * @param {string} className + */ export function toggleClass(element, className) { if (!element || !className) { return @@ -189,45 +226,10 @@ export function toggleClass(element, className) { element.className = classString } -export const pickerOptions = [ - { - text: '今天', - onClick(picker) { - const end = new Date() - const start = new Date(new Date().toDateString()) - end.setTime(start.getTime()) - picker.$emit('pick', [start, end]) - } - }, - { - text: '最近一周', - onClick(picker) { - const end = new Date(new Date().toDateString()) - const start = new Date() - start.setTime(end.getTime() - 3600 * 1000 * 24 * 7) - picker.$emit('pick', [start, end]) - } - }, - { - text: '最近一个月', - onClick(picker) { - const end = new Date(new Date().toDateString()) - const start = new Date() - start.setTime(start.getTime() - 3600 * 1000 * 24 * 30) - picker.$emit('pick', [start, end]) - } - }, - { - text: '最近三个月', - onClick(picker) { - const end = new Date(new Date().toDateString()) - const start = new Date() - start.setTime(start.getTime() - 3600 * 1000 * 24 * 90) - picker.$emit('pick', [start, end]) - } - } -] - +/** + * @param {string} type + * @returns {Date} + */ export function getTime(type) { if (type === 'start') { return new Date().getTime() - 3600 * 1000 * 24 * 90 @@ -236,6 +238,12 @@ export function getTime(type) { } } +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ export function debounce(func, wait, immediate) { let timeout, args, context, timestamp, result @@ -275,6 +283,8 @@ export function debounce(func, wait, immediate) { * This is just a simple version of deep copy * Has a lot of edge cases bug * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} */ export function deepClone(source) { if (!source && typeof source !== 'object') { @@ -291,22 +301,47 @@ export function deepClone(source) { return targetObj } +/** + * @param {Array} arr + * @returns {Array} + */ export function uniqueArr(arr) { return Array.from(new Set(arr)) } +/** + * @returns {string} + */ export function createUniqueString() { const timestamp = +new Date() + '' const randomNum = parseInt((1 + Math.random()) * 65536) + '' return (+(randomNum + timestamp)).toString(32) } +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ export function hasClass(ele, cls) { return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) } + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ export function addClass(ele, cls) { if (!hasClass(ele, cls)) ele.className += ' ' + cls } + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ export function removeClass(ele, cls) { if (hasClass(ele, cls)) { const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') diff --git a/src/utils/openWindow.js b/src/utils/openWindow.js index b63dfbb4..657bd190 100644 --- a/src/utils/openWindow.js +++ b/src/utils/openWindow.js @@ -5,7 +5,6 @@ * @param {Number} w * @param {Number} h */ - export default function openWindow(url, title, w, h) { // Fixes dual-screen position Most browsers Firefox const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left diff --git a/src/utils/scrollTo.js b/src/utils/scrollTo.js index 8affede6..c5d8e04e 100644 --- a/src/utils/scrollTo.js +++ b/src/utils/scrollTo.js @@ -12,7 +12,10 @@ var requestAnimFrame = (function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } })() -// because it's so fucking difficult to detect the scrolling element, just move them all +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ function move(amount) { document.documentElement.scrollTop = amount document.body.parentNode.scrollTop = amount @@ -23,6 +26,11 @@ function position() { return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop } +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ export function scrollTo(to, duration, callback) { const start = position() const change = to - start diff --git a/src/utils/validate.js b/src/utils/validate.js index ba93d1c3..e04f292e 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,41 +1,72 @@ /** * Created by jiachenpan on 16/11/18. */ - +/** + * @param {string} path + * @returns {Boolean} + */ export function isExternal(path) { return /^(https?:|mailto:|tel:)/.test(path) } +/** + * @param {string} str + * @returns {Boolean} + */ export function validUsername(str) { const valid_map = ['admin', 'editor'] return valid_map.indexOf(str.trim()) >= 0 } +/** + * @param {string} url + * @returns {Boolean} + */ export function validURL(url) { const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ return reg.test(url) } +/** + * @param {string} str + * @returns {Boolean} + */ export function validLowerCase(str) { const reg = /^[a-z]+$/ return reg.test(str) } +/** + * @param {string} str + * @returns {Boolean} + */ export function validUpperCase(str) { const reg = /^[A-Z]+$/ return reg.test(str) } +/** + * @param {string} str + * @returns {Boolean} + */ export function validAlphabets(str) { const reg = /^[A-Za-z]+$/ return reg.test(str) } +/** + * @param {string} email + * @returns {Boolean} + */ export function validEmail(email) { const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return reg.test(email) } +/** + * @param {string} str + * @returns {Boolean} + */ export function isString(str) { if (typeof str === 'string' || str instanceof String) { return true @@ -43,6 +74,10 @@ export function isString(str) { return false } +/** + * @param {Array} arg + * @returns {Boolean} + */ export function isArray(arg) { if (typeof Array.isArray === 'undefined') { return Object.prototype.toString.call(arg) === '[object Array]' diff --git a/src/views/components-demo/sticky.vue b/src/views/components-demo/sticky.vue index b1e6c89e..db86cb2d 100644 --- a/src/views/components-demo/sticky.vue +++ b/src/views/components-demo/sticky.vue @@ -28,7 +28,7 @@ </el-dropdown> <div class="time-container"> - <el-date-picker v-model="time" :picker-options="pickerOptions" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Release time" /> + <el-date-picker v-model="time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Release time" /> </div> <el-button style="margin-left: 10px;" type="success"> diff --git a/src/views/tab/index.vue b/src/views/tab/index.vue index cce15d8a..85a96347 100644 --- a/src/views/tab/index.vue +++ b/src/views/tab/index.vue @@ -39,7 +39,7 @@ export default { </script> <style scoped> - .tab-container{ + .tab-container { margin: 30px; } </style> From a6be6af46db8ae9887c84237d28ec122b6bcf6ca Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 12 Apr 2019 10:53:12 +0800 Subject: [PATCH 122/202] perf: set private property names for vue https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential --- src/components/Charts/mixins/resize.js | 12 +++++++----- src/layout/mixin/ResizeHandler.js | 14 ++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/components/Charts/mixins/resize.js b/src/components/Charts/mixins/resize.js index c4c432f4..dccaf1a8 100644 --- a/src/components/Charts/mixins/resize.js +++ b/src/components/Charts/mixins/resize.js @@ -3,7 +3,7 @@ import { debounce } from '@/utils' export default { data() { return { - sidebarElm: null + $_sidebarElm: null } }, mounted() { @@ -14,16 +14,18 @@ export default { }, 100) window.addEventListener('resize', this.__resizeHandler) - this.sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.sidebarElm && this.sidebarElm.addEventListener('transitionend', this.sidebarResizeHandler) + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) }, beforeDestroy() { window.removeEventListener('resize', this.__resizeHandler) - this.sidebarElm && this.sidebarElm.removeEventListener('transitionend', this.sidebarResizeHandler) + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) }, methods: { - sidebarResizeHandler(e) { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { if (e.propertyName === 'width') { this.__resizeHandler() } diff --git a/src/layout/mixin/ResizeHandler.js b/src/layout/mixin/ResizeHandler.js index 65879d16..e8d0df8c 100644 --- a/src/layout/mixin/ResizeHandler.js +++ b/src/layout/mixin/ResizeHandler.js @@ -12,26 +12,28 @@ export default { } }, beforeMount() { - window.addEventListener('resize', this.resizeHandler) + window.addEventListener('resize', this.$_resizeHandler) }, beforeDestroy() { - window.removeEventListener('resize', this.resizeHandler) + window.removeEventListener('resize', this.$_resizeHandler) }, mounted() { - const isMobile = this.isMobile() + const isMobile = this.$_isMobile() if (isMobile) { store.dispatch('app/toggleDevice', 'mobile') store.dispatch('app/closeSideBar', { withoutAnimation: true }) } }, methods: { - isMobile() { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { const rect = body.getBoundingClientRect() return rect.width - 1 < WIDTH }, - resizeHandler() { + $_resizeHandler() { if (!document.hidden) { - const isMobile = this.isMobile() + const isMobile = this.$_isMobile() store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') if (isMobile) { From fdea6c684ab438b4505e0b0d68b24d16040667b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 12 Apr 2019 17:13:27 +0800 Subject: [PATCH 123/202] refactor: standardized files name (#1884) style-guide: https://panjiachen.github.io/vue-element-admin-site/guide/advanced/style-guide.html#style-guide --- mock/index.js | 2 +- mock/{remoteSearch.js => remote-search.js} | 0 mock/role/routes.js | 40 +++++++++---------- src/api/{remoteSearch.js => remote-search.js} | 0 .../Charts/{keyboard.vue => Keyboard.vue} | 0 .../Charts/{lineMarker.vue => LineMarker.vue} | 0 .../Charts/{mixChart.vue => MixChart.vue} | 0 .../{defaultOptions.js => default-options.js} | 0 src/components/MarkdownEditor/index.vue | 2 +- src/components/Pagination/index.vue | 2 +- .../{dropdownMenu.vue => DropdownMenu.vue} | 0 .../{editorImage.vue => EditorImage.vue} | 0 src/components/Tinymce/index.vue | 2 +- .../{singleImage.vue => SingleImage.vue} | 0 .../{singleImage2.vue => SingleImage2.vue} | 0 .../{singleImage3.vue => SingleImage3.vue} | 0 .../{el-dragDialog => el-drag-dialog}/drag.js | 0 .../index.js | 0 src/main.js | 2 +- src/router/index.js | 20 +++++----- src/router/modules/charts.js | 4 +- src/router/modules/components.js | 20 +++++----- src/router/modules/table.js | 8 ++-- src/utils/{errorLog.js => error-log.js} | 0 src/utils/{openWindow.js => open-window.js} | 0 src/utils/{scrollTo.js => scroll-to.js} | 0 src/views/charts/keyboard.vue | 2 +- src/views/charts/line.vue | 2 +- .../charts/{mixChart.vue => mix-chart.vue} | 2 +- .../{avatarUpload.vue => avatar-upload.vue} | 0 .../{backToTop.vue => back-to-top.vue} | 0 .../{countTo.vue => count-to.vue} | 0 .../{dndList.vue => dnd-list.vue} | 0 .../{dragDialog.vue => drag-dialog.vue} | 2 +- .../{dragKanban.vue => drag-kanban.vue} | 0 .../{dragSelect.vue => drag-select.vue} | 0 .../{jsonEditor.vue => json-editor.vue} | 0 src/views/components-demo/mixin.vue | 2 +- .../{splitpane.vue => split-pane.vue} | 0 .../admin/components/TransactionTable.vue | 2 +- src/views/documentation/index.vue | 2 +- .../components/ErrorTestA.vue} | 0 .../components/ErrorTestB.vue} | 0 src/views/{errorLog => error-log}/index.vue | 10 ++--- src/views/{errorPage => error-page}/401.vue | 0 src/views/{errorPage => error-page}/404.vue | 0 .../example/components/ArticleDetail.vue | 4 +- .../{exportExcel.vue => export-excel.vue} | 0 .../{mergeHeader.vue => merge-header.vue} | 0 .../{selectExcel.vue => select-excel.vue} | 0 .../{uploadExcel.vue => upload-excel.vue} | 0 src/views/guide/index.vue | 5 +-- src/views/guide/{defineSteps.js => steps.js} | 0 .../{authRedirect.vue => auth-redirect.vue} | 0 .../SocialSignin.vue} | 2 +- src/views/login/index.vue | 2 +- src/views/svg-icons/index.vue | 2 +- .../{requireIcons.js => require-icons.js} | 0 .../components/{tabPane.vue => TabPane.vue} | 0 src/views/tab/index.vue | 2 +- .../{complexTable.vue => complex-table.vue} | 0 .../table/{dragTable.vue => drag-table.vue} | 0 .../components/FixedThead.vue} | 0 .../components/UnfixedThead.vue} | 0 .../{dynamicTable => dynamic-table}/index.vue | 6 +-- ...ineEditTable.vue => inline-edit-table.vue} | 0 66 files changed, 74 insertions(+), 75 deletions(-) rename mock/{remoteSearch.js => remote-search.js} (100%) rename src/api/{remoteSearch.js => remote-search.js} (100%) rename src/components/Charts/{keyboard.vue => Keyboard.vue} (100%) rename src/components/Charts/{lineMarker.vue => LineMarker.vue} (100%) rename src/components/Charts/{mixChart.vue => MixChart.vue} (100%) rename src/components/MarkdownEditor/{defaultOptions.js => default-options.js} (100%) rename src/components/Share/{dropdownMenu.vue => DropdownMenu.vue} (100%) rename src/components/Tinymce/components/{editorImage.vue => EditorImage.vue} (100%) rename src/components/Upload/{singleImage.vue => SingleImage.vue} (100%) rename src/components/Upload/{singleImage2.vue => SingleImage2.vue} (100%) rename src/components/Upload/{singleImage3.vue => SingleImage3.vue} (100%) rename src/directive/{el-dragDialog => el-drag-dialog}/drag.js (100%) rename src/directive/{el-dragDialog => el-drag-dialog}/index.js (100%) rename src/utils/{errorLog.js => error-log.js} (100%) rename src/utils/{openWindow.js => open-window.js} (100%) rename src/utils/{scrollTo.js => scroll-to.js} (100%) rename src/views/charts/{mixChart.vue => mix-chart.vue} (86%) rename src/views/components-demo/{avatarUpload.vue => avatar-upload.vue} (100%) rename src/views/components-demo/{backToTop.vue => back-to-top.vue} (100%) rename src/views/components-demo/{countTo.vue => count-to.vue} (100%) rename src/views/components-demo/{dndList.vue => dnd-list.vue} (100%) rename src/views/components-demo/{dragDialog.vue => drag-dialog.vue} (95%) rename src/views/components-demo/{dragKanban.vue => drag-kanban.vue} (100%) rename src/views/components-demo/{dragSelect.vue => drag-select.vue} (100%) rename src/views/components-demo/{jsonEditor.vue => json-editor.vue} (100%) rename src/views/components-demo/{splitpane.vue => split-pane.vue} (100%) rename src/views/{errorLog/errorTestA.vue => error-log/components/ErrorTestA.vue} (100%) rename src/views/{errorLog/errorTestB.vue => error-log/components/ErrorTestB.vue} (100%) rename src/views/{errorLog => error-log}/index.vue (81%) rename src/views/{errorPage => error-page}/401.vue (100%) rename src/views/{errorPage => error-page}/404.vue (100%) rename src/views/excel/{exportExcel.vue => export-excel.vue} (100%) rename src/views/excel/{mergeHeader.vue => merge-header.vue} (100%) rename src/views/excel/{selectExcel.vue => select-excel.vue} (100%) rename src/views/excel/{uploadExcel.vue => upload-excel.vue} (100%) rename src/views/guide/{defineSteps.js => steps.js} (100%) rename src/views/login/{authRedirect.vue => auth-redirect.vue} (100%) rename src/views/login/{socialSignin.vue => components/SocialSignin.vue} (97%) rename src/views/svg-icons/{requireIcons.js => require-icons.js} (100%) rename src/views/tab/components/{tabPane.vue => TabPane.vue} (100%) rename src/views/table/{complexTable.vue => complex-table.vue} (100%) rename src/views/table/{dragTable.vue => drag-table.vue} (100%) rename src/views/table/{dynamicTable/fixedThead.vue => dynamic-table/components/FixedThead.vue} (100%) rename src/views/table/{dynamicTable/unfixedThead.vue => dynamic-table/components/UnfixedThead.vue} (100%) rename src/views/table/{dynamicTable => dynamic-table}/index.vue (70%) rename src/views/table/{inlineEditTable.vue => inline-edit-table.vue} (100%) diff --git a/mock/index.js b/mock/index.js index 08cdc471..6907e861 100644 --- a/mock/index.js +++ b/mock/index.js @@ -4,7 +4,7 @@ import { param2Obj } from '../src/utils' import user from './user' import role from './role' import article from './article' -import search from './remoteSearch' +import search from './remote-search' const mocks = [ ...user, diff --git a/mock/remoteSearch.js b/mock/remote-search.js similarity index 100% rename from mock/remoteSearch.js rename to mock/remote-search.js diff --git a/mock/role/routes.js b/mock/role/routes.js index 14413d48..62a09d01 100644 --- a/mock/role/routes.js +++ b/mock/role/routes.js @@ -19,17 +19,17 @@ export const constantRoutes = [ }, { path: '/auth-redirect', - component: 'views/login/authRedirect', + component: 'views/login/auth-redirect', hidden: true }, { path: '/404', - component: 'views/errorPage/404', + component: 'views/error-page/404', hidden: true }, { path: '/401', - component: 'views/errorPage/401', + component: 'views/error-page/401', hidden: true }, { @@ -150,19 +150,19 @@ export const asyncRoutes = [ }, { path: 'json-editor', - component: 'views/components-demo/jsonEditor', + component: 'views/components-demo/json-editor', name: 'JsonEditorDemo', meta: { title: 'jsonEditor' } }, { - path: 'splitpane', - component: 'views/components-demo/splitpane', + path: 'split-pane', + component: 'views/components-demo/split-pane', name: 'SplitpaneDemo', meta: { title: 'splitPane' } }, { path: 'avatar-upload', - component: 'views/components-demo/avatarUpload', + component: 'views/components-demo/avatar-upload', name: 'AvatarUploadDemo', meta: { title: 'avatarUpload' } }, @@ -180,7 +180,7 @@ export const asyncRoutes = [ }, { path: 'count-to', - component: 'views/components-demo/countTo', + component: 'views/components-demo/count-to', name: 'CountToDemo', meta: { title: 'countTo' } }, @@ -192,31 +192,31 @@ export const asyncRoutes = [ }, { path: 'back-to-top', - component: 'views/components-demo/backToTop', + component: 'views/components-demo/back-to-top', name: 'BackToTopDemo', meta: { title: 'backToTop' } }, { path: 'drag-dialog', - component: 'views/components-demo/dragDialog', + component: 'views/components-demo/drag-dialog', name: 'DragDialogDemo', meta: { title: 'dragDialog' } }, { path: 'drag-select', - component: 'views/components-demo/dragSelect', + component: 'views/components-demo/drag-select', name: 'DragSelectDemo', meta: { title: 'dragSelect' } }, { path: 'dnd-list', - component: 'views/components-demo/dndList', + component: 'views/components-demo/dnd-list', name: 'DndListDemo', meta: { title: 'dndList' } }, { path: 'drag-kanban', - component: 'views/components-demo/dragKanban', + component: 'views/components-demo/drag-kanban', name: 'DragKanbanDemo', meta: { title: 'dragKanban' } } @@ -370,13 +370,13 @@ export const asyncRoutes = [ children: [ { path: '401', - component: 'views/errorPage/401', + component: 'views/error-page/401', name: 'Page401', meta: { title: 'page401', noCache: true } }, { path: '404', - component: 'views/errorPage/404', + component: 'views/error-page/404', name: 'Page404', meta: { title: 'page404', noCache: true } } @@ -390,7 +390,7 @@ export const asyncRoutes = [ children: [ { path: 'log', - component: 'views/errorLog/index', + component: 'views/error-log/index', name: 'ErrorLog', meta: { title: 'errorLog', icon: 'bug' } } @@ -409,25 +409,25 @@ export const asyncRoutes = [ children: [ { path: 'export-excel', - component: 'views/excel/exportExcel', + component: 'views/excel/export-excel', name: 'ExportExcel', meta: { title: 'exportExcel' } }, { path: 'export-selected-excel', - component: 'views/excel/selectExcel', + component: 'views/excel/select-excel', name: 'SelectExcel', meta: { title: 'selectExcel' } }, { path: 'export-merge-header', - component: 'views/excel/mergeHeader', + component: 'views/excel/merge-header', name: 'MergeHeader', meta: { title: 'mergeHeader' } }, { path: 'upload-excel', - component: 'views/excel/uploadExcel', + component: 'views/excel/upload-excel', name: 'UploadExcel', meta: { title: 'uploadExcel' } } diff --git a/src/api/remoteSearch.js b/src/api/remote-search.js similarity index 100% rename from src/api/remoteSearch.js rename to src/api/remote-search.js diff --git a/src/components/Charts/keyboard.vue b/src/components/Charts/Keyboard.vue similarity index 100% rename from src/components/Charts/keyboard.vue rename to src/components/Charts/Keyboard.vue diff --git a/src/components/Charts/lineMarker.vue b/src/components/Charts/LineMarker.vue similarity index 100% rename from src/components/Charts/lineMarker.vue rename to src/components/Charts/LineMarker.vue diff --git a/src/components/Charts/mixChart.vue b/src/components/Charts/MixChart.vue similarity index 100% rename from src/components/Charts/mixChart.vue rename to src/components/Charts/MixChart.vue diff --git a/src/components/MarkdownEditor/defaultOptions.js b/src/components/MarkdownEditor/default-options.js similarity index 100% rename from src/components/MarkdownEditor/defaultOptions.js rename to src/components/MarkdownEditor/default-options.js diff --git a/src/components/MarkdownEditor/index.vue b/src/components/MarkdownEditor/index.vue index 9ed7a584..3d6794b5 100644 --- a/src/components/MarkdownEditor/index.vue +++ b/src/components/MarkdownEditor/index.vue @@ -9,7 +9,7 @@ import 'tui-editor/dist/tui-editor.css' // editor ui import 'tui-editor/dist/tui-editor-contents.css' // editor content import Editor from 'tui-editor' -import defaultOptions from './defaultOptions' +import defaultOptions from './default-options' export default { name: 'MarddownEditor', diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue index a4962964..c815e132 100644 --- a/src/components/Pagination/index.vue +++ b/src/components/Pagination/index.vue @@ -15,7 +15,7 @@ </template> <script> -import { scrollTo } from '@/utils/scrollTo' +import { scrollTo } from '@/utils/scroll-to' export default { name: 'Pagination', diff --git a/src/components/Share/dropdownMenu.vue b/src/components/Share/DropdownMenu.vue similarity index 100% rename from src/components/Share/dropdownMenu.vue rename to src/components/Share/DropdownMenu.vue diff --git a/src/components/Tinymce/components/editorImage.vue b/src/components/Tinymce/components/EditorImage.vue similarity index 100% rename from src/components/Tinymce/components/editorImage.vue rename to src/components/Tinymce/components/EditorImage.vue diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index 3d6dba2b..a05c3b9c 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -8,7 +8,7 @@ </template> <script> -import editorImage from './components/editorImage' +import editorImage from './components/EditorImage' import plugins from './plugins' import toolbar from './toolbar' diff --git a/src/components/Upload/singleImage.vue b/src/components/Upload/SingleImage.vue similarity index 100% rename from src/components/Upload/singleImage.vue rename to src/components/Upload/SingleImage.vue diff --git a/src/components/Upload/singleImage2.vue b/src/components/Upload/SingleImage2.vue similarity index 100% rename from src/components/Upload/singleImage2.vue rename to src/components/Upload/SingleImage2.vue diff --git a/src/components/Upload/singleImage3.vue b/src/components/Upload/SingleImage3.vue similarity index 100% rename from src/components/Upload/singleImage3.vue rename to src/components/Upload/SingleImage3.vue diff --git a/src/directive/el-dragDialog/drag.js b/src/directive/el-drag-dialog/drag.js similarity index 100% rename from src/directive/el-dragDialog/drag.js rename to src/directive/el-drag-dialog/drag.js diff --git a/src/directive/el-dragDialog/index.js b/src/directive/el-drag-dialog/index.js similarity index 100% rename from src/directive/el-dragDialog/index.js rename to src/directive/el-drag-dialog/index.js diff --git a/src/main.js b/src/main.js index 375a6b6e..3135b8a8 100644 --- a/src/main.js +++ b/src/main.js @@ -16,7 +16,7 @@ import router from './router' import i18n from './lang' // Internationalization import './icons' // icon import './permission' // permission control -import './utils/errorLog' // error log +import './utils/error-log' // error log import * as filters from './filters' // global filters diff --git a/src/router/index.js b/src/router/index.js index c9117e5b..393e8e88 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -57,17 +57,17 @@ export const constantRoutes = [ }, { path: '/auth-redirect', - component: () => import('@/views/login/authRedirect'), + component: () => import('@/views/login/auth-redirect'), hidden: true }, { path: '/404', - component: () => import('@/views/errorPage/404'), + component: () => import('@/views/error-page/404'), hidden: true }, { path: '/401', - component: () => import('@/views/errorPage/401'), + component: () => import('@/views/error-page/401'), hidden: true }, { @@ -232,13 +232,13 @@ export const asyncRoutes = [ children: [ { path: '401', - component: () => import('@/views/errorPage/401'), + component: () => import('@/views/error-page/401'), name: 'Page401', meta: { title: 'page401', noCache: true } }, { path: '404', - component: () => import('@/views/errorPage/404'), + component: () => import('@/views/error-page/404'), name: 'Page404', meta: { title: 'page404', noCache: true } } @@ -252,7 +252,7 @@ export const asyncRoutes = [ children: [ { path: 'log', - component: () => import('@/views/errorLog/index'), + component: () => import('@/views/error-log/index'), name: 'ErrorLog', meta: { title: 'errorLog', icon: 'bug' } } @@ -271,25 +271,25 @@ export const asyncRoutes = [ children: [ { path: 'export-excel', - component: () => import('@/views/excel/exportExcel'), + component: () => import('@/views/excel/export-excel'), name: 'ExportExcel', meta: { title: 'exportExcel' } }, { path: 'export-selected-excel', - component: () => import('@/views/excel/selectExcel'), + component: () => import('@/views/excel/select-excel'), name: 'SelectExcel', meta: { title: 'selectExcel' } }, { path: 'export-merge-header', - component: () => import('@/views/excel/mergeHeader'), + component: () => import('@/views/excel/merge-header'), name: 'MergeHeader', meta: { title: 'mergeHeader' } }, { path: 'upload-excel', - component: () => import('@/views/excel/uploadExcel'), + component: () => import('@/views/excel/upload-excel'), name: 'UploadExcel', meta: { title: 'uploadExcel' } } diff --git a/src/router/modules/charts.js b/src/router/modules/charts.js index 7293490e..5797ba04 100644 --- a/src/router/modules/charts.js +++ b/src/router/modules/charts.js @@ -25,8 +25,8 @@ const chartsRouter = { meta: { title: 'lineChart', noCache: true } }, { - path: 'mixchart', - component: () => import('@/views/charts/mixChart'), + path: 'mix-chart', + component: () => import('@/views/charts/mix-chart'), name: 'MixChart', meta: { title: 'mixChart', noCache: true } } diff --git a/src/router/modules/components.js b/src/router/modules/components.js index 889c371d..75b161eb 100644 --- a/src/router/modules/components.js +++ b/src/router/modules/components.js @@ -26,19 +26,19 @@ const componentsRouter = { }, { path: 'json-editor', - component: () => import('@/views/components-demo/jsonEditor'), + component: () => import('@/views/components-demo/json-editor'), name: 'JsonEditorDemo', meta: { title: 'jsonEditor' } }, { - path: 'splitpane', - component: () => import('@/views/components-demo/splitpane'), + path: 'split-pane', + component: () => import('@/views/components-demo/split-pane'), name: 'SplitpaneDemo', meta: { title: 'splitPane' } }, { path: 'avatar-upload', - component: () => import('@/views/components-demo/avatarUpload'), + component: () => import('@/views/components-demo/avatar-upload'), name: 'AvatarUploadDemo', meta: { title: 'avatarUpload' } }, @@ -56,7 +56,7 @@ const componentsRouter = { }, { path: 'count-to', - component: () => import('@/views/components-demo/countTo'), + component: () => import('@/views/components-demo/count-to'), name: 'CountToDemo', meta: { title: 'countTo' } }, @@ -68,31 +68,31 @@ const componentsRouter = { }, { path: 'back-to-top', - component: () => import('@/views/components-demo/backToTop'), + component: () => import('@/views/components-demo/back-to-top'), name: 'BackToTopDemo', meta: { title: 'backToTop' } }, { path: 'drag-dialog', - component: () => import('@/views/components-demo/dragDialog'), + component: () => import('@/views/components-demo/drag-dialog'), name: 'DragDialogDemo', meta: { title: 'dragDialog' } }, { path: 'drag-select', - component: () => import('@/views/components-demo/dragSelect'), + component: () => import('@/views/components-demo/drag-select'), name: 'DragSelectDemo', meta: { title: 'dragSelect' } }, { path: 'dnd-list', - component: () => import('@/views/components-demo/dndList'), + component: () => import('@/views/components-demo/dnd-list'), name: 'DndListDemo', meta: { title: 'dndList' } }, { path: 'drag-kanban', - component: () => import('@/views/components-demo/dragKanban'), + component: () => import('@/views/components-demo/drag-kanban'), name: 'DragKanbanDemo', meta: { title: 'dragKanban' } } diff --git a/src/router/modules/table.js b/src/router/modules/table.js index b54fb42d..59f0da1d 100644 --- a/src/router/modules/table.js +++ b/src/router/modules/table.js @@ -14,25 +14,25 @@ const tableRouter = { children: [ { path: 'dynamic-table', - component: () => import('@/views/table/dynamicTable/index'), + component: () => import('@/views/table/dynamic-table/index'), name: 'DynamicTable', meta: { title: 'dynamicTable' } }, { path: 'drag-table', - component: () => import('@/views/table/dragTable'), + component: () => import('@/views/table/drag-table'), name: 'DragTable', meta: { title: 'dragTable' } }, { path: 'inline-edit-table', - component: () => import('@/views/table/inlineEditTable'), + component: () => import('@/views/table/inline-edit-table'), name: 'InlineEditTable', meta: { title: 'inlineEditTable' } }, { path: 'complex-table', - component: () => import('@/views/table/complexTable'), + component: () => import('@/views/table/complex-table'), name: 'ComplexTable', meta: { title: 'complexTable' } } diff --git a/src/utils/errorLog.js b/src/utils/error-log.js similarity index 100% rename from src/utils/errorLog.js rename to src/utils/error-log.js diff --git a/src/utils/openWindow.js b/src/utils/open-window.js similarity index 100% rename from src/utils/openWindow.js rename to src/utils/open-window.js diff --git a/src/utils/scrollTo.js b/src/utils/scroll-to.js similarity index 100% rename from src/utils/scrollTo.js rename to src/utils/scroll-to.js diff --git a/src/views/charts/keyboard.vue b/src/views/charts/keyboard.vue index 3c158fcc..917f8eeb 100644 --- a/src/views/charts/keyboard.vue +++ b/src/views/charts/keyboard.vue @@ -5,7 +5,7 @@ </template> <script> -import Chart from '@/components/Charts/keyboard' +import Chart from '@/components/Charts/Keyboard' export default { name: 'KeyboardChart', diff --git a/src/views/charts/line.vue b/src/views/charts/line.vue index daa181fa..fea1497e 100644 --- a/src/views/charts/line.vue +++ b/src/views/charts/line.vue @@ -5,7 +5,7 @@ </template> <script> -import Chart from '@/components/Charts/lineMarker' +import Chart from '@/components/Charts/LineMarker' export default { name: 'LineChart', diff --git a/src/views/charts/mixChart.vue b/src/views/charts/mix-chart.vue similarity index 86% rename from src/views/charts/mixChart.vue rename to src/views/charts/mix-chart.vue index d41e655b..c57db75a 100644 --- a/src/views/charts/mixChart.vue +++ b/src/views/charts/mix-chart.vue @@ -5,7 +5,7 @@ </template> <script> -import Chart from '@/components/Charts/mixChart' +import Chart from '@/components/Charts/MixChart' export default { name: 'MixChart', diff --git a/src/views/components-demo/avatarUpload.vue b/src/views/components-demo/avatar-upload.vue similarity index 100% rename from src/views/components-demo/avatarUpload.vue rename to src/views/components-demo/avatar-upload.vue diff --git a/src/views/components-demo/backToTop.vue b/src/views/components-demo/back-to-top.vue similarity index 100% rename from src/views/components-demo/backToTop.vue rename to src/views/components-demo/back-to-top.vue diff --git a/src/views/components-demo/countTo.vue b/src/views/components-demo/count-to.vue similarity index 100% rename from src/views/components-demo/countTo.vue rename to src/views/components-demo/count-to.vue diff --git a/src/views/components-demo/dndList.vue b/src/views/components-demo/dnd-list.vue similarity index 100% rename from src/views/components-demo/dndList.vue rename to src/views/components-demo/dnd-list.vue diff --git a/src/views/components-demo/dragDialog.vue b/src/views/components-demo/drag-dialog.vue similarity index 95% rename from src/views/components-demo/dragDialog.vue rename to src/views/components-demo/drag-dialog.vue index 3c985552..c815b282 100644 --- a/src/views/components-demo/dragDialog.vue +++ b/src/views/components-demo/drag-dialog.vue @@ -17,7 +17,7 @@ </template> <script> -import elDragDialog from '@/directive/el-dragDialog' // base on element-ui +import elDragDialog from '@/directive/el-drag-dialog' // base on element-ui export default { name: 'DragDialogDemo', diff --git a/src/views/components-demo/dragKanban.vue b/src/views/components-demo/drag-kanban.vue similarity index 100% rename from src/views/components-demo/dragKanban.vue rename to src/views/components-demo/drag-kanban.vue diff --git a/src/views/components-demo/dragSelect.vue b/src/views/components-demo/drag-select.vue similarity index 100% rename from src/views/components-demo/dragSelect.vue rename to src/views/components-demo/drag-select.vue diff --git a/src/views/components-demo/jsonEditor.vue b/src/views/components-demo/json-editor.vue similarity index 100% rename from src/views/components-demo/jsonEditor.vue rename to src/views/components-demo/json-editor.vue diff --git a/src/views/components-demo/mixin.vue b/src/views/components-demo/mixin.vue index 18e9ef88..19b7a543 100644 --- a/src/views/components-demo/mixin.vue +++ b/src/views/components-demo/mixin.vue @@ -115,7 +115,7 @@ import PanThumb from '@/components/PanThumb' import MdInput from '@/components/MDinput' import Mallki from '@/components/TextHoverEffect/Mallki' -import DropdownMenu from '@/components/Share/dropdownMenu' +import DropdownMenu from '@/components/Share/DropdownMenu' import waves from '@/directive/waves/index.js' // 水波纹指令 export default { diff --git a/src/views/components-demo/splitpane.vue b/src/views/components-demo/split-pane.vue similarity index 100% rename from src/views/components-demo/splitpane.vue rename to src/views/components-demo/split-pane.vue diff --git a/src/views/dashboard/admin/components/TransactionTable.vue b/src/views/dashboard/admin/components/TransactionTable.vue index 68ab4792..d07b0edf 100644 --- a/src/views/dashboard/admin/components/TransactionTable.vue +++ b/src/views/dashboard/admin/components/TransactionTable.vue @@ -21,7 +21,7 @@ </template> <script> -import { transactionList } from '@/api/remoteSearch' +import { transactionList } from '@/api/remote-search' export default { filters: { diff --git a/src/views/documentation/index.vue b/src/views/documentation/index.vue index 2fed7398..4e05d03f 100644 --- a/src/views/documentation/index.vue +++ b/src/views/documentation/index.vue @@ -7,7 +7,7 @@ </div> </template> <script> -import DropdownMenu from '@/components/Share/dropdownMenu' +import DropdownMenu from '@/components/Share/DropdownMenu' export default { name: 'Documentation', diff --git a/src/views/errorLog/errorTestA.vue b/src/views/error-log/components/ErrorTestA.vue similarity index 100% rename from src/views/errorLog/errorTestA.vue rename to src/views/error-log/components/ErrorTestA.vue diff --git a/src/views/errorLog/errorTestB.vue b/src/views/error-log/components/ErrorTestB.vue similarity index 100% rename from src/views/errorLog/errorTestB.vue rename to src/views/error-log/components/ErrorTestB.vue diff --git a/src/views/errorLog/index.vue b/src/views/error-log/index.vue similarity index 81% rename from src/views/errorLog/index.vue rename to src/views/error-log/index.vue index 8cbe18e2..a0be8fc0 100644 --- a/src/views/errorLog/index.vue +++ b/src/views/error-log/index.vue @@ -1,7 +1,7 @@ <template> <div class="errPage-container"> - <errorA /> - <errorB /> + <ErrorA /> + <ErrorB /> <!-- $t is vue-i18n global function to translate lang --> <h3>{{ $t('errorLog.tips') }}</h3> <code> @@ -17,12 +17,12 @@ </template> <script> -import errorA from './errorTestA' -import errorB from './errorTestB' +import ErrorA from './components/ErrorTestA' +import ErrorB from './components/ErrorTestB' export default { name: 'ErrorLog', - components: { errorA, errorB } + components: { ErrorA, ErrorB } } </script> diff --git a/src/views/errorPage/401.vue b/src/views/error-page/401.vue similarity index 100% rename from src/views/errorPage/401.vue rename to src/views/error-page/401.vue diff --git a/src/views/errorPage/404.vue b/src/views/error-page/404.vue similarity index 100% rename from src/views/errorPage/404.vue rename to src/views/error-page/404.vue diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 2213e927..58574ab0 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -76,12 +76,12 @@ <script> import Tinymce from '@/components/Tinymce' -import Upload from '@/components/Upload/singleImage3' +import Upload from '@/components/Upload/SingleImage3' import MDinput from '@/components/MDinput' import Sticky from '@/components/Sticky' // 粘性header组件 import { validURL } from '@/utils/validate' import { fetchArticle } from '@/api/article' -import { searchUser } from '@/api/remoteSearch' +import { searchUser } from '@/api/remote-search' import Warning from './Warning' import { CommentDropdown, PlatformDropdown, SourceUrlDropdown } from './Dropdown' diff --git a/src/views/excel/exportExcel.vue b/src/views/excel/export-excel.vue similarity index 100% rename from src/views/excel/exportExcel.vue rename to src/views/excel/export-excel.vue diff --git a/src/views/excel/mergeHeader.vue b/src/views/excel/merge-header.vue similarity index 100% rename from src/views/excel/mergeHeader.vue rename to src/views/excel/merge-header.vue diff --git a/src/views/excel/selectExcel.vue b/src/views/excel/select-excel.vue similarity index 100% rename from src/views/excel/selectExcel.vue rename to src/views/excel/select-excel.vue diff --git a/src/views/excel/uploadExcel.vue b/src/views/excel/upload-excel.vue similarity index 100% rename from src/views/excel/uploadExcel.vue rename to src/views/excel/upload-excel.vue diff --git a/src/views/guide/index.vue b/src/views/guide/index.vue index 31ca3177..46165803 100644 --- a/src/views/guide/index.vue +++ b/src/views/guide/index.vue @@ -2,8 +2,7 @@ <div class="app-container"> <p class="warn-content"> {{ $t('guide.description') }} - <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js. - </a> + <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js.</a> </p> <el-button icon="el-icon-question" type="primary" @click.prevent.stop="guide"> {{ $t('guide.button') }} @@ -14,7 +13,7 @@ <script> import Driver from 'driver.js' // import driver.js import 'driver.js/dist/driver.min.css' // import driver.js css -import steps from './defineSteps' +import steps from './steps' export default { name: 'Guide', diff --git a/src/views/guide/defineSteps.js b/src/views/guide/steps.js similarity index 100% rename from src/views/guide/defineSteps.js rename to src/views/guide/steps.js diff --git a/src/views/login/authRedirect.vue b/src/views/login/auth-redirect.vue similarity index 100% rename from src/views/login/authRedirect.vue rename to src/views/login/auth-redirect.vue diff --git a/src/views/login/socialSignin.vue b/src/views/login/components/SocialSignin.vue similarity index 97% rename from src/views/login/socialSignin.vue rename to src/views/login/components/SocialSignin.vue index d047b068..cbfb15d2 100644 --- a/src/views/login/socialSignin.vue +++ b/src/views/login/components/SocialSignin.vue @@ -10,7 +10,7 @@ </template> <script> -// import openWindow from '@/utils/openWindow' +// import openWindow from '@/utils/open-window' export default { name: 'SocialSignin', diff --git a/src/views/login/index.vue b/src/views/login/index.vue index b9cba35f..9bff21a3 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -81,7 +81,7 @@ <script> import { validUsername } from '@/utils/validate' import LangSelect from '@/components/LangSelect' -import SocialSign from './socialSignin' +import SocialSign from './components/SocialSignin' export default { name: 'Login', diff --git a/src/views/svg-icons/index.vue b/src/views/svg-icons/index.vue index 665b1d03..9733bc3a 100644 --- a/src/views/svg-icons/index.vue +++ b/src/views/svg-icons/index.vue @@ -37,7 +37,7 @@ <script> import clipboard from '@/utils/clipboard' -import icons from './requireIcons' +import icons from './require-icons' import elementIcons from './element-icon.json' export default { diff --git a/src/views/svg-icons/requireIcons.js b/src/views/svg-icons/require-icons.js similarity index 100% rename from src/views/svg-icons/requireIcons.js rename to src/views/svg-icons/require-icons.js diff --git a/src/views/tab/components/tabPane.vue b/src/views/tab/components/TabPane.vue similarity index 100% rename from src/views/tab/components/tabPane.vue rename to src/views/tab/components/TabPane.vue diff --git a/src/views/tab/index.vue b/src/views/tab/index.vue index 85a96347..e5746580 100644 --- a/src/views/tab/index.vue +++ b/src/views/tab/index.vue @@ -13,7 +13,7 @@ </template> <script> -import tabPane from './components/tabPane' +import tabPane from './components/TabPane' export default { name: 'Tab', diff --git a/src/views/table/complexTable.vue b/src/views/table/complex-table.vue similarity index 100% rename from src/views/table/complexTable.vue rename to src/views/table/complex-table.vue diff --git a/src/views/table/dragTable.vue b/src/views/table/drag-table.vue similarity index 100% rename from src/views/table/dragTable.vue rename to src/views/table/drag-table.vue diff --git a/src/views/table/dynamicTable/fixedThead.vue b/src/views/table/dynamic-table/components/FixedThead.vue similarity index 100% rename from src/views/table/dynamicTable/fixedThead.vue rename to src/views/table/dynamic-table/components/FixedThead.vue diff --git a/src/views/table/dynamicTable/unfixedThead.vue b/src/views/table/dynamic-table/components/UnfixedThead.vue similarity index 100% rename from src/views/table/dynamicTable/unfixedThead.vue rename to src/views/table/dynamic-table/components/UnfixedThead.vue diff --git a/src/views/table/dynamicTable/index.vue b/src/views/table/dynamic-table/index.vue similarity index 70% rename from src/views/table/dynamicTable/index.vue rename to src/views/table/dynamic-table/index.vue index 4947b4b9..b1a6a6d5 100644 --- a/src/views/table/dynamicTable/index.vue +++ b/src/views/table/dynamic-table/index.vue @@ -13,12 +13,12 @@ </template> <script> -import fixedThead from './fixedThead' -import unfixedThead from './unfixedThead' +import FixedThead from './components/FixedThead' +import UnfixedThead from './components/UnfixedThead' export default { name: 'DynamicTable', - components: { fixedThead, unfixedThead } + components: { FixedThead, UnfixedThead } } </script> diff --git a/src/views/table/inlineEditTable.vue b/src/views/table/inline-edit-table.vue similarity index 100% rename from src/views/table/inlineEditTable.vue rename to src/views/table/inline-edit-table.vue From 14580da5b31384f407f8d7db6f687081816907a1 Mon Sep 17 00:00:00 2001 From: linfei <linfeimy@gmail.com> Date: Mon, 15 Apr 2019 10:31:06 +0800 Subject: [PATCH 124/202] perf[Breadcrumb]: revise the breadcrumb navigation of permission and zip (#1908) --- src/router/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/router/index.js b/src/router/index.js index 393e8e88..d04a64be 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -118,8 +118,9 @@ export const asyncRoutes = [ { path: '/permission', component: Layout, - redirect: '/permission/index', + redirect: '/permission/page', alwaysShow: true, // will always show the root menu + name: 'Permission', meta: { title: 'permission', icon: 'lock', @@ -301,6 +302,7 @@ export const asyncRoutes = [ component: Layout, redirect: '/zip/download', alwaysShow: true, + name: 'Zip', meta: { title: 'zip', icon: 'zip' }, children: [ { From 26d0f40df21fa5e5583a20cb3df14ae9d475bb3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E7=A9=BA?= <ren8179@126.com> Date: Mon, 15 Apr 2019 11:58:43 +0800 Subject: [PATCH 125/202] feature: change page title when route change (#1910) --- src/components/ThemePicker/index.vue | 14 ++++++++++++-- src/permission.js | 4 ++++ src/settings.js | 6 ++---- src/store/modules/settings.js | 6 ++++-- src/utils/get-page-title.js | 13 +++++++++++++ vue.config.js | 4 ++-- 6 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 src/utils/get-page-title.js diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index 0a556248..90c03311 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -11,16 +11,26 @@ const version = require('element-ui/package.json').version // element-ui version from node_modules const ORIGINAL_THEME = '#409EFF' // default color -import defaultSettings from '@/settings' export default { data() { return { chalk: '', // content of theme-chalk css - theme: defaultSettings.theme + theme: '' + } + }, + computed: { + defaultTheme() { + return this.$store.state.settings.theme } }, watch: { + defaultTheme: { + handler: function(val, oldVal) { + this.theme = val + }, + immediate: true + }, async theme(val) { const oldVal = this.chalk ? this.theme : ORIGINAL_THEME if (typeof val !== 'string') return diff --git a/src/permission.js b/src/permission.js index 7cc2a5cf..750aeab6 100644 --- a/src/permission.js +++ b/src/permission.js @@ -4,6 +4,7 @@ import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style import { getToken } from '@/utils/auth' // get token from cookie +import getPageTitle from '@/utils/get-page-title' NProgress.configure({ showSpinner: false }) // NProgress Configuration @@ -13,6 +14,9 @@ router.beforeEach(async(to, from, next) => { // start progress bar NProgress.start() + // set page title + document.title = getPageTitle(to.meta.title) + // determine whether the user has logged in const hasToken = getToken() diff --git a/src/settings.js b/src/settings.js index e7ad4e1d..1ebc7f29 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1,7 +1,5 @@ -import variables from '@/styles/element-variables.scss' - -export default { - theme: variables.theme, +module.exports = { + title: 'Vue Element Admin', /** * @type {boolean} true | false diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index 8522a5aa..e389af79 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -1,8 +1,10 @@ +import variables from '@/styles/element-variables.scss' import defaultSettings from '@/settings' -const { showSettings, tagsView, fixedHeader, sidebarLogo, theme } = defaultSettings + +const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings const state = { - theme: theme, + theme: variables.theme, showSettings: showSettings, tagsView: tagsView, fixedHeader: fixedHeader, diff --git a/src/utils/get-page-title.js b/src/utils/get-page-title.js new file mode 100644 index 00000000..4b6604cd --- /dev/null +++ b/src/utils/get-page-title.js @@ -0,0 +1,13 @@ +import defaultSettings from '@/settings' +import i18n from '@/lang' + +const title = defaultSettings.title || 'Vue Element Admin' + +export default function getPageTitle(key) { + const hasKey = i18n.te(`route.${key}`) + if (hasKey) { + const pageName = i18n.t(`route.${key}`) + return `${pageName} - ${title}` + } + return `${title}` +} diff --git a/vue.config.js b/vue.config.js index cbd79510..0306b27c 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,12 +1,12 @@ 'use strict' const path = require('path') -const pkg = require('./package.json') +const defaultSettings = require('./src/settings.js') function resolve(dir) { return path.join(__dirname, dir) } -const name = pkg.name || 'vue-element-admin' // page title +const name = defaultSettings.title || 'vue Element Admin' // page title const port = 9527 // dev port // All configuration item explanations can be find in https://cli.vuejs.org/config/ From be7ec4c0ff8c462ab0e45e1bab640bd2e72767b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 16 Apr 2019 11:20:13 +0800 Subject: [PATCH 126/202] docs: improve code comments (#1911) --- mock/article.js | 2 +- src/components/BackToTop/index.vue | 7 +--- src/components/JsonEditor/index.vue | 4 +-- src/components/Kanban/index.vue | 1 + src/components/ThemePicker/index.vue | 1 - .../Tinymce/components/EditorImage.vue | 10 +++--- src/components/Upload/SingleImage.vue | 1 - src/directive/el-table/adaptive.js | 1 - src/directive/el-table/index.js | 1 - src/directive/permission/permission.js | 1 - src/filters/index.js | 2 +- src/lang/en.js | 3 ++ src/lang/es.js | 3 ++ src/lang/zh.js | 3 ++ src/main.js | 18 ++++++---- src/router/modules/components.js | 2 +- src/router/modules/nested.js | 2 +- src/router/modules/table.js | 2 +- src/store/modules/permission.js | 4 +-- src/styles/element-ui.scss | 2 +- src/styles/index.scss | 28 +++++---------- src/styles/sidebar.scss | 6 ++-- src/styles/transition.scss | 8 ++--- src/styles/variables.scss | 4 +-- src/utils/error-log.js | 4 +-- src/utils/request.js | 36 ++++++++++--------- src/views/components-demo/avatar-upload.vue | 4 +-- src/views/components-demo/back-to-top.vue | 8 ++--- src/views/components-demo/count-to.vue | 8 ++--- src/views/components-demo/dnd-list.vue | 4 +-- src/views/components-demo/dropzone.vue | 4 +-- src/views/components-demo/json-editor.vue | 4 +-- src/views/components-demo/markdown.vue | 4 +-- src/views/components-demo/split-pane.vue | 4 +-- src/views/components-demo/sticky.vue | 2 +- src/views/components-demo/tinymce.vue | 4 +-- src/views/error-log/index.vue | 4 +-- .../example/components/ArticleDetail.vue | 20 +++++------ .../example/components/Dropdown/Comment.vue | 6 ++-- .../example/components/Dropdown/Platform.vue | 2 +- .../example/components/Dropdown/SourceUrl.vue | 6 ++-- src/views/example/components/Warning.vue | 9 +++-- src/views/guide/index.vue | 4 +-- src/views/pdf/index.vue | 2 +- src/views/permission/directive.vue | 4 +-- src/views/svg-icons/index.vue | 4 +-- src/views/table/complex-table.vue | 6 ++-- src/views/theme/index.vue | 2 +- vue.config.js | 1 + 49 files changed, 134 insertions(+), 138 deletions(-) diff --git a/mock/article.js b/mock/article.js index 45b75296..bc236eb9 100644 --- a/mock/article.js +++ b/mock/article.js @@ -3,7 +3,7 @@ import Mock from 'mockjs' const List = [] const count = 100 -const baseContent = '<p>我是测试数据我是测试数据</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>' +const baseContent = '<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>' const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3' for (let i = 0; i < count; i++) { diff --git a/src/components/BackToTop/index.vue b/src/components/BackToTop/index.vue index c094037f..36522f4a 100644 --- a/src/components/BackToTop/index.vue +++ b/src/components/BackToTop/index.vue @@ -1,12 +1,7 @@ <template> <transition :name="transitionName"> <div v-show="visible" :style="customStyle" class="back-to-ceiling" @click="backToTop"> - <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height: 16px; width: 16px;"> - <title>回到顶部</title> - <g> - <path d="M12.036 15.59c0 .55-.453.995-.997.995H5.032c-.55 0-.997-.445-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29c.39-.39 1.026-.385 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" fill-rule="evenodd" /> - </g> - </svg> + <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height:16px;width:16px"><path d="M12.036 15.59a1 1 0 0 1-.997.995H5.032a.996.996 0 0 1-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29a1.003 1.003 0 0 1 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" /></svg> </div> </transition> </template> diff --git a/src/components/JsonEditor/index.vue b/src/components/JsonEditor/index.vue index 81715f5d..07b282e4 100644 --- a/src/components/JsonEditor/index.vue +++ b/src/components/JsonEditor/index.vue @@ -25,8 +25,8 @@ export default { }, watch: { value(value) { - const editor_value = this.jsonEditor.getValue() - if (value !== editor_value) { + const editorValue = this.jsonEditor.getValue() + if (value !== editorValue) { this.jsonEditor.setValue(JSON.stringify(this.value, null, 2)) } } diff --git a/src/components/Kanban/index.vue b/src/components/Kanban/index.vue index c2cb4691..82f7dd7e 100644 --- a/src/components/Kanban/index.vue +++ b/src/components/Kanban/index.vue @@ -15,6 +15,7 @@ </draggable> </div> </template> + <script> import draggable from 'vuedraggable' diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index 90c03311..3879c5ad 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -8,7 +8,6 @@ </template> <script> - const version = require('element-ui/package.json').version // element-ui version from node_modules const ORIGINAL_THEME = '#409EFF' // default color diff --git a/src/components/Tinymce/components/EditorImage.vue b/src/components/Tinymce/components/EditorImage.vue index b3a4a2be..d4a98e84 100644 --- a/src/components/Tinymce/components/EditorImage.vue +++ b/src/components/Tinymce/components/EditorImage.vue @@ -1,7 +1,7 @@ <template> <div class="upload-container"> <el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true"> - 上传图片 + upload </el-button> <el-dialog :visible.sync="dialogVisible"> <el-upload @@ -16,14 +16,14 @@ list-type="picture-card" > <el-button size="small" type="primary"> - 点击上传 + Click upload </el-button> </el-upload> <el-button @click="dialogVisible = false"> - 取 消 + Cancel </el-button> <el-button type="primary" @click="handleSubmit"> - 确 定 + Confirm </el-button> </el-dialog> </div> @@ -54,7 +54,7 @@ export default { handleSubmit() { const arr = Object.keys(this.listObj).map(v => this.listObj[v]) if (!this.checkAllSuccess()) { - this.$message('请等待所有图片上传成功 或 出现了网络问题,请刷新页面重新上传!') + this.$message('Please wait for all images to be uploaded successfully. If there is a network problem, please refresh the page and upload again!') return } this.$emit('successCBK', arr) diff --git a/src/components/Upload/SingleImage.vue b/src/components/Upload/SingleImage.vue index ecec20a9..d16bbf37 100644 --- a/src/components/Upload/SingleImage.vue +++ b/src/components/Upload/SingleImage.vue @@ -26,7 +26,6 @@ </template> <script> -// 预览效果见付费文章 import { getToken } from '@/api/qiniu' export default { diff --git a/src/directive/el-table/adaptive.js b/src/directive/el-table/adaptive.js index 3fa29c91..8beacff1 100644 --- a/src/directive/el-table/adaptive.js +++ b/src/directive/el-table/adaptive.js @@ -1,4 +1,3 @@ - import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' /** diff --git a/src/directive/el-table/index.js b/src/directive/el-table/index.js index d4cf406d..d3d45150 100644 --- a/src/directive/el-table/index.js +++ b/src/directive/el-table/index.js @@ -1,4 +1,3 @@ - import adaptive from './adaptive' const install = function(Vue) { diff --git a/src/directive/permission/permission.js b/src/directive/permission/permission.js index 1fc8f136..b27f24da 100644 --- a/src/directive/permission/permission.js +++ b/src/directive/permission/permission.js @@ -1,4 +1,3 @@ - import store from '@/store' export default { diff --git a/src/filters/index.js b/src/filters/index.js index 86e768d8..051000c1 100644 --- a/src/filters/index.js +++ b/src/filters/index.js @@ -1,4 +1,4 @@ -// set function parseTime,formatTime to filter +// import parseTime, formatTime and set to filter export { parseTime, formatTime } from '@/utils' /** diff --git a/src/lang/en.js b/src/lang/en.js index 490ac206..426d3d26 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -132,6 +132,9 @@ export default { cancel: 'Cancel', confirm: 'Confirm' }, + example: { + warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details' + }, errorLog: { tips: 'Please click the bug icon in the upper right corner', description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.', diff --git a/src/lang/es.js b/src/lang/es.js index a8f69831..50b96037 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -132,6 +132,9 @@ export default { cancel: 'Cancelar', confirm: 'Confirmar' }, + example: { + warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details' + }, errorLog: { tips: 'Please click the bug icon in the upper right corner', description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.', diff --git a/src/lang/zh.js b/src/lang/zh.js index 4394cc70..2055c5ab 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -132,6 +132,9 @@ export default { cancel: '取 消', confirm: '确 定' }, + example: { + warning: '创建和编辑页面是不能被 keep-alive 缓存的,因为keep-alive 的 include 目前不支持根据路由来缓存,所以目前都是基于 component name 来进行缓存的。如果你想类似的实现缓存效果,可以使用 localStorage 等浏览器缓存方案。或者不要使用 keep-alive 的 include,直接缓存所有页面。详情见' + }, errorLog: { tips: '请点击右上角bug小图标', description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。', diff --git a/src/main.js b/src/main.js index 3135b8a8..41298d0c 100644 --- a/src/main.js +++ b/src/main.js @@ -2,7 +2,7 @@ import Vue from 'vue' import Cookies from 'js-cookie' -import 'normalize.css/normalize.css' // A modern alternative to CSS resets +import 'normalize.css/normalize.css' // a modern alternative to CSS resets import Element from 'element-ui' import './styles/element-variables.scss' @@ -13,24 +13,28 @@ import App from './App' import store from './store' import router from './router' -import i18n from './lang' // Internationalization +import i18n from './lang' // internationalization import './icons' // icon import './permission' // permission control import './utils/error-log' // error log import * as filters from './filters' // global filters -import { mockXHR } from '../mock' // simulation data - -// mock api in github pages site build -if (process.env.NODE_ENV === 'production') { mockXHR() } +/** + * If you don't want to use mock-server + * you want to use mockjs for request interception + * you can execute: + * + * import { mockXHR } from '../mock' + * mockXHR() + */ Vue.use(Element, { size: Cookies.get('size') || 'medium', // set element-ui default size i18n: (key, value) => i18n.t(key, value) }) -// register global utility filters. +// register global utility filters Object.keys(filters).forEach(key => { Vue.filter(key, filters[key]) }) diff --git a/src/router/modules/components.js b/src/router/modules/components.js index 75b161eb..0d8055bd 100644 --- a/src/router/modules/components.js +++ b/src/router/modules/components.js @@ -1,4 +1,4 @@ -/** When your routing table is too long, you can split it into small modules**/ +/** When your routing table is too long, you can split it into small modules **/ import Layout from '@/layout' diff --git a/src/router/modules/nested.js b/src/router/modules/nested.js index ee165c8c..c52664c9 100644 --- a/src/router/modules/nested.js +++ b/src/router/modules/nested.js @@ -1,4 +1,4 @@ -/** When your routing table is too long, you can split it into small modules**/ +/** When your routing table is too long, you can split it into small modules **/ import Layout from '@/layout' diff --git a/src/router/modules/table.js b/src/router/modules/table.js index 59f0da1d..d8e50302 100644 --- a/src/router/modules/table.js +++ b/src/router/modules/table.js @@ -1,4 +1,4 @@ -/** When your routing table is too long, you can split it into small modules**/ +/** When your routing table is too long, you can split it into small modules **/ import Layout from '@/layout' diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 820ca46b..bd35252c 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -1,7 +1,7 @@ import { asyncRoutes, constantRoutes } from '@/router' /** - * 通过meta.role判断是否与当前用户权限匹配 + * Use meta.role to determine if the current user has permission * @param roles * @param route */ @@ -14,7 +14,7 @@ function hasPermission(roles, route) { } /** - * 递归过滤异步路由表,返回符合用户角色权限的路由表 + * Filter asynchronous routing tables by recursion * @param routes asyncRoutes * @param roles */ diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss index 494dcfa4..9422dd18 100644 --- a/src/styles/element-ui.scss +++ b/src/styles/element-ui.scss @@ -1,4 +1,4 @@ -//覆盖一些element-ui样式 +// cover some element-ui styles .el-breadcrumb__inner, .el-breadcrumb__inner a { diff --git a/src/styles/index.scss b/src/styles/index.scss index 93f2157e..96095ef6 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -96,14 +96,18 @@ div:focus { } } -code { +aside { background: #eef1f6; - padding: 15px 16px; + padding: 8px 24px; margin-bottom: 20px; + border-radius: 2px; display: block; - line-height: 36px; - font-size: 15px; - font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; a { color: #337ab7; @@ -115,20 +119,6 @@ code { } } -.warn-content { - background: rgba(66, 185, 131, .1); - border-radius: 2px; - padding: 16px; - padding: 1rem; - line-height: 1.6rem; - word-spacing: .05rem; - - a { - color: #42b983; - font-weight: 600; - } -} - //main-container全局样式 .app-container { padding: 20px; diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 525a65b9..e55f8656 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -1,6 +1,5 @@ #app { - // 主体区域 Main container .main-container { min-height: 100%; transition: margin-left .28s; @@ -8,7 +7,6 @@ position: relative; } - // 侧边栏 Sidebar container .sidebar-container { transition: width 0.28s; width: $sideBarWidth !important; @@ -22,7 +20,7 @@ z-index: 1001; overflow: hidden; - //reset element-ui css + // reset element-ui css .horizontal-collapse-transition { transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; } @@ -149,7 +147,7 @@ min-width: $sideBarWidth !important; } - // 适配移动端, Mobile responsive + // mobile responsive .mobile { .main-container { margin-left: 0px; diff --git a/src/styles/transition.scss b/src/styles/transition.scss index 7b5e4bfd..4cb27cc8 100644 --- a/src/styles/transition.scss +++ b/src/styles/transition.scss @@ -1,6 +1,6 @@ -//global transition css +// global transition css -/*fade*/ +/* fade */ .fade-enter-active, .fade-leave-active { transition: opacity 0.28s; @@ -11,7 +11,7 @@ opacity: 0; } -/*fade-transform*/ +/* fade-transform */ .fade-transform-leave-active, .fade-transform-enter-active { transition: all .5s; @@ -27,7 +27,7 @@ transform: translateX(30px); } -/*breadcrumb transition*/ +/* breadcrumb transition */ .breadcrumb-enter-active, .breadcrumb-leave-active { transition: all .5s; diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 98d7b672..a19c27c1 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -8,10 +8,10 @@ $tiffany: #4AB7BD; $yellow:#FEC171; $panGreen: #30B08F; -//sidebar +// sidebar $menuText:#bfcbd9; $menuActiveText:#409EFF; -$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 +$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951 $menuBg:#304156; $menuHover:#263445; diff --git a/src/utils/error-log.js b/src/utils/error-log.js index c508c789..a7f5b55f 100644 --- a/src/utils/error-log.js +++ b/src/utils/error-log.js @@ -4,10 +4,10 @@ import { isString, isArray } from '@/utils/validate' import settings from '@/settings' // you can set in settings.js -// errorLog:'production' | ['production','development'] +// errorLog:'production' | ['production', 'development'] const { errorLog: needErrorLog } = settings -function checkNeed(arg) { +function checkNeed() { const env = process.env.NODE_ENV if (isString(needErrorLog)) { return env === needErrorLog diff --git a/src/utils/request.js b/src/utils/request.js index d2422c46..d3c25c00 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -5,23 +5,25 @@ import { getToken } from '@/utils/auth' // create an axios instance const service = axios.create({ - baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url - withCredentials: true, // 跨域请求时发送 cookies + baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url + withCredentials: true, // send cookies when cross-domain requests timeout: 5000 // request timeout }) // request interceptor service.interceptors.request.use( config => { - // Do something before request is sent + // do something before request is sent + if (store.getters.token) { - // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改 + // let each request carry token --['X-Token'] as a custom key. + // please modify it according to the actual situation. config.headers['X-Token'] = getToken() } return config }, error => { - // Do something with request error + // do something with request error console.log(error) // for debug return Promise.reject(error) } @@ -33,31 +35,33 @@ service.interceptors.response.use( * If you want to get information such as headers or status * Please return response => response */ + /** - * 下面的注释为通过在response里,自定义code来标示请求状态 - * 当code返回如下情况则说明权限有问题,登出并返回到登录页 - * 如想通过 XMLHttpRequest 来状态码标识 逻辑可写在下面error中 - * 以下代码均为样例,请结合自生需求加以修改,若不需要,则可删除 + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code. */ response => { const res = response.data + + // if the custom code is not 20000, it is judged as an error. if (res.code !== 20000) { Message({ message: res.message || 'error', type: 'error', duration: 5 * 1000 }) - // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; + + // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; if (res.code === 50008 || res.code === 50012 || res.code === 50014) { - // 请自行在引入 MessageBox - // import { Message, MessageBox } from 'element-ui' - MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { - confirmButtonText: '重新登录', - cancelButtonText: '取消', + // to re-login + MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', { + confirmButtonText: 'Re-Login', + cancelButtonText: 'Cancel', type: 'warning' }).then(() => { store.dispatch('user/resetToken').then(() => { - location.reload() // 为了重新实例化vue-router对象 避免bug + location.reload() }) }) } diff --git a/src/views/components-demo/avatar-upload.vue b/src/views/components-demo/avatar-upload.vue index c40ef4a4..fae36ad8 100644 --- a/src/views/components-demo/avatar-upload.vue +++ b/src/views/components-demo/avatar-upload.vue @@ -1,9 +1,9 @@ <template> <div class="components-container"> - <code>This is based on + <aside>This is based on <a class="link-type" href="//github.com/dai-siki/vue-image-crop-upload"> vue-image-crop-upload</a>. {{ $t('components.imageUploadTips') }} - </code> + </aside> <pan-thumb :image="image" /> diff --git a/src/views/components-demo/back-to-top.vue b/src/views/components-demo/back-to-top.vue index 1404f574..58d9d75c 100644 --- a/src/views/components-demo/back-to-top.vue +++ b/src/views/components-demo/back-to-top.vue @@ -1,7 +1,7 @@ <template> <div class="components-container"> - <code>{{ $t('components.backToTopTips1') }}</code> - <code>{{ $t('components.backToTopTips2') }}</code> + <aside>{{ $t('components.backToTopTips1') }}</aside> + <aside>{{ $t('components.backToTopTips2') }}</aside> <div class="placeholder-container"> <div>placeholder</div> <div>placeholder</div> @@ -113,8 +113,7 @@ <div>placeholder</div> <div>placeholder</div> </div> - <!--可自定义按钮的样式、show/hide临界点、返回的位置 --> - <!--如需文字提示,可在外部添加element的<el-tooltip></el-tooltip>元素 --> + <!-- you can add element-ui's tooltip --> <el-tooltip placement="top" content="tooltip"> <back-to-top :custom-style="myBackToTopStyle" :visibility-height="300" :back-position="50" transition-name="fade" /> </el-tooltip> @@ -129,6 +128,7 @@ export default { components: { BackToTop }, data() { return { + // customizable button style, show/hide critical point, return position myBackToTopStyle: { right: '50px', bottom: '50px', diff --git a/src/views/components-demo/count-to.vue b/src/views/components-demo/count-to.vue index 9fae2694..70681df6 100644 --- a/src/views/components-demo/count-to.vue +++ b/src/views/components-demo/count-to.vue @@ -1,8 +1,8 @@ <template> <div class="components-container"> - <p class="warn-content"> + <aside> <a href="https://github.com/PanJiaChen/vue-countTo" target="_blank">countTo-component</a> - </p> + </aside> <count-to ref="example" :start-val="_startVal" @@ -45,9 +45,9 @@ <input v-model="setSuffix" name="suffixInput"> </label> </div> - <code><count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}' + <aside><count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{ _duration }}' :decimals='{{ _decimals }}' :separator='{{ _separator }}' :prefix='{{ _prefix }}' :suffix='{{ _suffix }}' - :autoplay=false></code> + :autoplay=false></aside> </div> </template> diff --git a/src/views/components-demo/dnd-list.vue b/src/views/components-demo/dnd-list.vue index 0e4c215a..e299fa68 100644 --- a/src/views/components-demo/dnd-list.vue +++ b/src/views/components-demo/dnd-list.vue @@ -1,8 +1,8 @@ <template> <div class="components-container"> - <code>drag-list base on + <aside>drag-list base on <a href="https://github.com/SortableJS/Vue.Draggable" target="_blank">Vue.Draggable</a> - </code> + </aside> <div class="editor-container"> <dnd-list :list1="list1" :list2="list2" list1-title="List" list2-title="Article pool" /> </div> diff --git a/src/views/components-demo/dropzone.vue b/src/views/components-demo/dropzone.vue index 62e9fdad..cdfc71b1 100644 --- a/src/views/components-demo/dropzone.vue +++ b/src/views/components-demo/dropzone.vue @@ -1,9 +1,9 @@ <template> <div class="components-container"> - <code> + <aside> Based on <a class="link-type" href="https://github.com/rowanwins/vue-dropzone"> dropzone </a>. {{ $t('components.dropzoneTips') }} - </code> + </aside> <div class="editor-container"> <dropzone id="myVueDropzone" url="https://httpbin.org/post" @dropzone-removedFile="dropzoneR" @dropzone-success="dropzoneS" /> </div> diff --git a/src/views/components-demo/json-editor.vue b/src/views/components-demo/json-editor.vue index 01fed710..85bf3834 100644 --- a/src/views/components-demo/json-editor.vue +++ b/src/views/components-demo/json-editor.vue @@ -1,10 +1,10 @@ <template> <div class="components-container"> - <code>Json-Editor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a>. Lint + <aside>Json-Editor is base on <a href="https://github.com/codemirror/CodeMirror" target="_blank">CodeMirrorr</a>. Lint base on <a href="https://github.com/codemirror/CodeMirror/blob/master/addon/lint/json-lint.js" target="_blank" - >json-lint</a>.</code> + >json-lint</a>.</aside> <div class="editor-container"> <json-editor ref="jsonEditor" v-model="value" /> </div> diff --git a/src/views/components-demo/markdown.vue b/src/views/components-demo/markdown.vue index 8483a470..876db002 100644 --- a/src/views/components-demo/markdown.vue +++ b/src/views/components-demo/markdown.vue @@ -1,13 +1,13 @@ <template> <div class="components-container"> - <code>Markdown is based on + <aside>Markdown is based on <a href="https://github.com/nhnent/tui.editor" target="_blank">tui.editor</a> ,simply wrapped with Vue. <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/feature/component/markdown-editor.html" > Documentation </a> - </code> + </aside> <div class="editor-container"> <el-tag class="tag-title"> diff --git a/src/views/components-demo/split-pane.vue b/src/views/components-demo/split-pane.vue index 4259abea..7dba353f 100644 --- a/src/views/components-demo/split-pane.vue +++ b/src/views/components-demo/split-pane.vue @@ -1,10 +1,10 @@ <template> <div class="components-container"> - <code><strong>SplitPane</strong> If you've used + <aside><strong>SplitPane</strong> If you've used <a href="https://codepen.io/" target="_blank"> codepen</a>, <a href="https://jsfiddle.net/" target="_blank"> jsfiddle </a>will not be unfamiliar. <a href="https://github.com/PanJiaChen/vue-split-pane" target="_blank"> Github repository</a> - </code> + </aside> <split-pane split="vertical" @resize="resize"> <template slot="paneL"> <div class="left-container" /> diff --git a/src/views/components-demo/sticky.vue b/src/views/components-demo/sticky.vue index db86cb2d..de86e1a1 100644 --- a/src/views/components-demo/sticky.vue +++ b/src/views/components-demo/sticky.vue @@ -37,7 +37,7 @@ </sticky> <div class="components-container"> - <code>Sticky header, {{ $t('components.stickyTips') }}</code> + <aside>Sticky header, {{ $t('components.stickyTips') }}</aside> <div>placeholder</div> <div>placeholder</div> <div>placeholder</div> diff --git a/src/views/components-demo/tinymce.vue b/src/views/components-demo/tinymce.vue index e1d72d1f..7900a294 100644 --- a/src/views/components-demo/tinymce.vue +++ b/src/views/components-demo/tinymce.vue @@ -1,9 +1,9 @@ <template> <div class="components-container"> - <code> + <aside> {{ $t('components.tinymceTips') }} <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/component/rich-editor.html"> {{ $t('components.documentation') }}</a> - </code> + </aside> <div> <tinymce v-model="content" :height="300" /> </div> diff --git a/src/views/error-log/index.vue b/src/views/error-log/index.vue index a0be8fc0..102b2e5b 100644 --- a/src/views/error-log/index.vue +++ b/src/views/error-log/index.vue @@ -4,12 +4,12 @@ <ErrorB /> <!-- $t is vue-i18n global function to translate lang --> <h3>{{ $t('errorLog.tips') }}</h3> - <code> + <aside> {{ $t('errorLog.description') }} <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/error.html"> {{ $t('errorLog.documentation') }} </a> - </code> + </aside> <a href="#"> <img src="https://wpimg.wallstcn.com/360e4842-4db5-42d0-b078-f9a84a825546.gif"> </a> diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 58574ab0..b1aa8df6 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -6,10 +6,10 @@ <PlatformDropdown v-model="postForm.platforms" /> <SourceUrlDropdown v-model="postForm.source_uri" /> <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm"> - 发布 + Publush </el-button> <el-button v-loading="loading" type="warning" @click="draftForm"> - 草稿 + Draft </el-button> </sticky> @@ -20,28 +20,28 @@ <el-col :span="24"> <el-form-item style="margin-bottom: 40px;" prop="title"> <MDinput v-model="postForm.title" :maxlength="100" name="name" required> - 标题 + Title </MDinput> </el-form-item> <div class="postInfo-container"> <el-row> <el-col :span="8"> - <el-form-item label-width="45px" label="作者:" class="postInfo-container-item"> - <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable default-first-option remote placeholder="搜索用户"> + <el-form-item label-width="60px" label="Author:" class="postInfo-container-item"> + <el-select v-model="postForm.author" :remote-method="getRemoteUserList" filterable default-first-option remote placeholder="Search user"> <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item" /> </el-select> </el-form-item> </el-col> <el-col :span="10"> - <el-form-item label-width="80px" label="发布时间:" class="postInfo-container-item"> - <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间" /> + <el-form-item label-width="120px" label="Publush Time:" class="postInfo-container-item"> + <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Select date and time" /> </el-form-item> </el-col> <el-col :span="6"> - <el-form-item label-width="60px" label="重要性:" class="postInfo-container-item"> + <el-form-item label-width="90px" label="Importance:" class="postInfo-container-item"> <el-rate v-model="postForm.importance" :max="3" @@ -57,8 +57,8 @@ </el-col> </el-row> - <el-form-item style="margin-bottom: 40px;" label-width="45px" label="摘要:"> - <el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="请输入内容" /> + <el-form-item style="margin-bottom: 40px;" label-width="70px" label="Summary:"> + <el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="Please enter the content" /> <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span> </el-form-item> diff --git a/src/views/example/components/Dropdown/Comment.vue b/src/views/example/components/Dropdown/Comment.vue index 26509611..d34b2b90 100644 --- a/src/views/example/components/Dropdown/Comment.vue +++ b/src/views/example/components/Dropdown/Comment.vue @@ -1,17 +1,17 @@ <template> <el-dropdown :show-timeout="100" trigger="click"> <el-button plain> - {{ !comment_disabled?'评论已打开':'评论已关闭' }} + {{ !comment_disabled?'Comment: opened':'Comment: closed' }} <i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-padding"> <el-dropdown-item> <el-radio-group v-model="comment_disabled" style="padding: 10px;"> <el-radio :label="true"> - 关闭评论 + Close comment </el-radio> <el-radio :label="false"> - 打开评论 + Open comment </el-radio> </el-radio-group> </el-dropdown-item> diff --git a/src/views/example/components/Dropdown/Platform.vue b/src/views/example/components/Dropdown/Platform.vue index 98fcaf28..0a527264 100644 --- a/src/views/example/components/Dropdown/Platform.vue +++ b/src/views/example/components/Dropdown/Platform.vue @@ -1,7 +1,7 @@ <template> <el-dropdown :hide-on-click="false" :show-timeout="100" trigger="click"> <el-button plain> - 平台({{ platforms.length }}) + Platfroms({{ platforms.length }}) <i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-border"> diff --git a/src/views/example/components/Dropdown/SourceUrl.vue b/src/views/example/components/Dropdown/SourceUrl.vue index 21a58907..8f47485a 100644 --- a/src/views/example/components/Dropdown/SourceUrl.vue +++ b/src/views/example/components/Dropdown/SourceUrl.vue @@ -1,14 +1,14 @@ <template> <el-dropdown :show-timeout="100" trigger="click"> <el-button plain> - 外链 + Link <i class="el-icon-caret-bottom el-icon--right" /> </el-button> <el-dropdown-menu slot="dropdown" class="no-padding no-border" style="width:400px"> <el-form-item label-width="0px" style="margin-bottom: 0px" prop="source_uri"> - <el-input v-model="source_uri" placeholder="请输入内容"> + <el-input v-model="source_uri" placeholder="Please enter the content"> <template slot="prepend"> - 填写url + URL </template> </el-input> </el-form-item> diff --git a/src/views/example/components/Warning.vue b/src/views/example/components/Warning.vue index bee172d4..d24fe291 100644 --- a/src/views/example/components/Warning.vue +++ b/src/views/example/components/Warning.vue @@ -1,11 +1,10 @@ <template> - <p class="warn-content"> - 创建和编辑页面是不能被keep-alive 缓存的,因为keep-alive 的include 目前不支持根据路由来缓存,所以目前都是基于component name 来缓存的,如果你想要实现缓存的效果,可以使用localstorage 等浏览器缓存方案。或者不要使用keep-alive - 的include,直接缓存所有页面。详情见 + <aside> + {{ $t('example.warning') }} <a href="https://panjiachen.github.io/vue-element-admin-site/guide/essentials/tags-view.html" target="_blank" - >文档</a> - </p> + >Document</a> + </aside> </template> diff --git a/src/views/guide/index.vue b/src/views/guide/index.vue index 46165803..636ca275 100644 --- a/src/views/guide/index.vue +++ b/src/views/guide/index.vue @@ -1,9 +1,9 @@ <template> <div class="app-container"> - <p class="warn-content"> + <aside> {{ $t('guide.description') }} <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js.</a> - </p> + </aside> <el-button icon="el-icon-question" type="primary" @click.prevent.stop="guide"> {{ $t('guide.button') }} </el-button> diff --git a/src/views/pdf/index.vue b/src/views/pdf/index.vue index 238d4958..b875295f 100644 --- a/src/views/pdf/index.vue +++ b/src/views/pdf/index.vue @@ -1,6 +1,6 @@ <template> <div class="app-container"> - <code style="margin-top:15px;">{{ $t('pdf.tips') }}</code> + <aside style="margin-top:15px;">{{ $t('pdf.tips') }}</aside> <router-link target="_blank" to="/pdf/download"> <el-button type="primary"> Click to download PDF diff --git a/src/views/permission/directive.vue b/src/views/permission/directive.vue index 013c97a3..b3ef8c37 100644 --- a/src/views/permission/directive.vue +++ b/src/views/permission/directive.vue @@ -35,10 +35,10 @@ </div> <div :key="'checkPermission'+key" style="margin-top:60px;"> - <code> + <aside> {{ $t('permission.tips') }} <br> e.g. - </code> + </aside> <el-tabs type="border-card" style="width:550px;"> <el-tab-pane v-if="checkPermission(['admin'])" label="Admin"> diff --git a/src/views/svg-icons/index.vue b/src/views/svg-icons/index.vue index 9733bc3a..2715b5ea 100644 --- a/src/views/svg-icons/index.vue +++ b/src/views/svg-icons/index.vue @@ -1,9 +1,9 @@ <template> <div class="icons-container"> - <p class="warn-content"> + <aside> <a href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/icon.html" target="_blank">Add and use </a> - </p> + </aside> <el-tabs type="border-card"> <el-tab-pane label="Icons"> <div v-for="item of iconsMap" :key="item" @click="handleClipboard(generateIconCode(item),$event)"> diff --git a/src/views/table/complex-table.vue b/src/views/table/complex-table.vue index bfe577b1..43b00e80 100644 --- a/src/views/table/complex-table.vue +++ b/src/views/table/complex-table.vue @@ -148,9 +148,9 @@ <script> import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article' -import waves from '@/directive/waves' // Waves directive +import waves from '@/directive/waves' // waves directive import { parseTime } from '@/utils' -import Pagination from '@/components/Pagination' // Secondary package based on el-pagination +import Pagination from '@/components/Pagination' // secondary package based on el-pagination const calendarTypeOptions = [ { key: 'CN', display_name: 'China' }, @@ -159,7 +159,7 @@ const calendarTypeOptions = [ { key: 'EU', display_name: 'Eurozone' } ] -// arr to obj ,such as { CN : "China", US : "USA" } +// arr to obj, such as { CN : "China", US : "USA" } const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => { acc[cur.key] = cur.display_name return acc diff --git a/src/views/theme/index.vue b/src/views/theme/index.vue index b67c2c67..bfa5953b 100644 --- a/src/views/theme/index.vue +++ b/src/views/theme/index.vue @@ -9,7 +9,7 @@ <div class="box-item"> <span class="field-label">{{ $t('theme.change') }} : </span> <el-switch v-model="theme" /> - <code style="margin-top:15px;">{{ $t('theme.tips') }}</code> + <aside style="margin-top:15px;">{{ $t('theme.tips') }}</aside> </div> </el-card> diff --git a/vue.config.js b/vue.config.js index 0306b27c..bae56d78 100644 --- a/vue.config.js +++ b/vue.config.js @@ -86,6 +86,7 @@ module.exports = { .end() config + // https://webpack.js.org/configuration/devtool/#development .when(process.env.NODE_ENV === 'development', config => config.devtool('cheap-source-map') ) From 9ecec0970f4e3462e377af5ffcd5bb25e69ec24c Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 16 Apr 2019 11:51:12 +0800 Subject: [PATCH 127/202] perf: add functional to template --- src/views/example/components/Warning.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/views/example/components/Warning.vue b/src/views/example/components/Warning.vue index d24fe291..4073f984 100644 --- a/src/views/example/components/Warning.vue +++ b/src/views/example/components/Warning.vue @@ -1,4 +1,4 @@ -<template> +<template functional> <aside> {{ $t('example.warning') }} <a @@ -7,4 +7,3 @@ >Document</a> </aside> </template> - From 067a2910d45c0dd7f4eec4043aeb23c9e631150c Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 16 Apr 2019 13:28:57 +0800 Subject: [PATCH 128/202] Revert "perf: add functional to template" This reverts commit 9ecec0970f4e3462e377af5ffcd5bb25e69ec24c. --- src/views/example/components/Warning.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/example/components/Warning.vue b/src/views/example/components/Warning.vue index 4073f984..d24fe291 100644 --- a/src/views/example/components/Warning.vue +++ b/src/views/example/components/Warning.vue @@ -1,4 +1,4 @@ -<template functional> +<template> <aside> {{ $t('example.warning') }} <a @@ -7,3 +7,4 @@ >Document</a> </aside> </template> + From 4ee334ad833abe52bd57ca08c12b5848a5a173ed Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 16 Apr 2019 13:51:14 +0800 Subject: [PATCH 129/202] perf[Breadcrumb]: set noredirect => noRedirect --- mock/role/routes.js | 12 ++++++------ src/components/Breadcrumb/index.vue | 3 ++- src/components/HeaderSearch/index.vue | 2 +- src/router/index.js | 7 ++----- src/router/modules/charts.js | 2 +- src/router/modules/components.js | 2 +- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/mock/role/routes.js b/mock/role/routes.js index 62a09d01..5bb6c741 100644 --- a/mock/role/routes.js +++ b/mock/role/routes.js @@ -129,7 +129,7 @@ export const asyncRoutes = [ { path: '/components', component: 'layout/Layout', - redirect: 'noredirect', + redirect: 'noRedirect', name: 'ComponentDemo', meta: { title: 'components', @@ -225,7 +225,7 @@ export const asyncRoutes = [ { path: '/charts', component: 'layout/Layout', - redirect: 'noredirect', + redirect: 'noRedirect', name: 'Charts', meta: { title: 'charts', @@ -361,7 +361,7 @@ export const asyncRoutes = [ { path: '/error', component: 'layout/Layout', - redirect: 'noredirect', + redirect: 'noRedirect', name: 'ErrorPages', meta: { title: 'errorPages', @@ -386,7 +386,7 @@ export const asyncRoutes = [ { path: '/error-log', component: 'layout/Layout', - redirect: 'noredirect', + redirect: 'noRedirect', children: [ { path: 'log', @@ -472,7 +472,7 @@ export const asyncRoutes = [ { path: '/theme', component: 'layout/Layout', - redirect: 'noredirect', + redirect: 'noRedirect', children: [ { path: 'index', @@ -486,7 +486,7 @@ export const asyncRoutes = [ { path: '/clipboard', component: 'layout/Layout', - redirect: 'noredirect', + redirect: 'noRedirect', children: [ { path: 'index', diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index ff93ff45..1ea13031 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -2,7 +2,7 @@ <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> - <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ + <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ generateTitle(item.meta.title) }}</span> <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> </el-breadcrumb-item> @@ -31,6 +31,7 @@ export default { methods: { generateTitle, getBreadcrumb() { + // only show routes with name let matched = this.$route.matched.filter(item => item.name) const first = matched[0] diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 6668ad5c..90eea067 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -121,7 +121,7 @@ export default { data.title = [...data.title, i18ntitle] - if (router.redirect !== 'noredirect') { + if (router.redirect !== 'noRedirect') { // only push the routes with title // special case: need to exclude parent router without redirect res.push(data) diff --git a/src/router/index.js b/src/router/index.js index d04a64be..0c5973da 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -20,7 +20,7 @@ import nestedRouter from './modules/nested' * alwaysShow: true if set true, will always show the root menu * if not set alwaysShow, when item has more than one children route, * it will becomes nested mode, otherwise not show the root menu - * redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb + * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb * name:'router-name' the name is used by <keep-alive> (must set!!!) * meta : { roles: ['admin','editor'] control the page roles (you can set multiple roles) @@ -224,7 +224,7 @@ export const asyncRoutes = [ { path: '/error', component: Layout, - redirect: 'noredirect', + redirect: 'noRedirect', name: 'ErrorPages', meta: { title: 'errorPages', @@ -249,7 +249,6 @@ export const asyncRoutes = [ { path: '/error-log', component: Layout, - redirect: 'noredirect', children: [ { path: 'log', @@ -336,7 +335,6 @@ export const asyncRoutes = [ { path: '/theme', component: Layout, - redirect: 'noredirect', children: [ { path: 'index', @@ -350,7 +348,6 @@ export const asyncRoutes = [ { path: '/clipboard', component: Layout, - redirect: 'noredirect', children: [ { path: 'index', diff --git a/src/router/modules/charts.js b/src/router/modules/charts.js index 5797ba04..59ebf188 100644 --- a/src/router/modules/charts.js +++ b/src/router/modules/charts.js @@ -5,7 +5,7 @@ import Layout from '@/layout' const chartsRouter = { path: '/charts', component: Layout, - redirect: 'noredirect', + redirect: 'noRedirect', name: 'Charts', meta: { title: 'charts', diff --git a/src/router/modules/components.js b/src/router/modules/components.js index 0d8055bd..b7407e25 100644 --- a/src/router/modules/components.js +++ b/src/router/modules/components.js @@ -5,7 +5,7 @@ import Layout from '@/layout' const componentsRouter = { path: '/components', component: Layout, - redirect: 'noredirect', + redirect: 'noRedirect', name: 'ComponentDemo', meta: { title: 'components', From 3678bd18fb2f68a1efdd2f063520629c4b3b2a97 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 16 Apr 2019 14:18:50 +0800 Subject: [PATCH 130/202] perf[Breadcrumb]: refine getBreadcrumb function --- src/components/Breadcrumb/index.vue | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 1ea13031..b89d8da6 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -31,16 +31,23 @@ export default { methods: { generateTitle, getBreadcrumb() { - // only show routes with name - let matched = this.$route.matched.filter(item => item.name) - + // only show routes with meta.title + let matched = this.$route.matched.filter(item => item.meta && item.meta.title) const first = matched[0] - if (first && first.name.trim().toLocaleLowerCase() !== 'Dashboard'.toLocaleLowerCase()) { + + if (!this.isDashboard(first)) { matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched) } this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) }, + isDashboard(route) { + const name = route && route.name + if (!name) { + return false + } + return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase() + }, pathCompile(path) { // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561 const { params } = this.$route From 952da3287983728e164c45c8364cfef4353774eb Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 16 Apr 2019 14:46:05 +0800 Subject: [PATCH 131/202] perf[element-ui.scss]: refine default style --- src/styles/element-ui.scss | 22 +++++++------------ .../example/components/ArticleDetail.vue | 19 ++++++++++++++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss index 9422dd18..9581d56a 100644 --- a/src/styles/element-ui.scss +++ b/src/styles/element-ui.scss @@ -46,7 +46,7 @@ } } -//暂时性解决dialog 问题 https://github.com/ElemeFE/element/issues/2461 +// to fixed https://github.com/ElemeFE/element/issues/2461 .el-dialog { transform: none; left: 0; @@ -54,18 +54,7 @@ margin: 0 auto; } -//文章页textarea修改样式 -.article-textarea { - textarea { - padding-right: 40px; - resize: none; - border: none; - border-radius: 0px; - border-bottom: 1px solid #bfcbd9; - } -} - -//element ui upload +// refine element ui upload .upload-container { .el-upload { width: 100%; @@ -77,9 +66,14 @@ } } -//dropdown +// dropdown .el-dropdown-menu { a { display: block } } + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index b1aa8df6..55d2972a 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -59,7 +59,7 @@ <el-form-item style="margin-bottom: 40px;" label-width="70px" label="Summary:"> <el-input v-model="postForm.content_short" :rows="1" type="textarea" class="article-textarea" autosize placeholder="Please enter the content" /> - <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span> + <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}words</span> </el-form-item> <el-form-item prop="content" style="margin-bottom: 30px;"> @@ -236,24 +236,39 @@ export default { <style lang="scss" scoped> @import "~@/styles/mixin.scss"; + .createPost-container { position: relative; + .createPost-main-container { padding: 40px 45px 20px 50px; + .postInfo-container { position: relative; @include clearfix; margin-bottom: 10px; + .postInfo-container-item { float: left; } } } + .word-counter { width: 40px; position: absolute; - right: -10px; + right: 10px; top: 0px; } } + +.article-textarea /deep/ { + textarea { + padding-right: 40px; + resize: none; + border: none; + border-radius: 0px; + border-bottom: 1px solid #bfcbd9; + } +} </style> From c00564617e8c58868d96a645f527864a3a5cc6aa Mon Sep 17 00:00:00 2001 From: yuntao1997 <510835147@qq.com> Date: Tue, 16 Apr 2019 14:56:07 +0800 Subject: [PATCH 132/202] fix[adaptive.js]: fixed v-el-height-adaptive-table directive bug (#1924) --- src/directive/el-table/adaptive.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/directive/el-table/adaptive.js b/src/directive/el-table/adaptive.js index 8beacff1..d229e9fd 100644 --- a/src/directive/el-table/adaptive.js +++ b/src/directive/el-table/adaptive.js @@ -4,7 +4,7 @@ import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/re * How to use * <el-table height="100px" v-el-height-adaptive-table="{bottomOffset: 30}">...</el-table> * el-table height is must be set - * bottomOffset: 30(default) // The height of the table from the bottom of the page. + * bottomOffset: 30(default) // The height of the table from the bottom of the page. */ const doResize = (el, binding, vnode) => { @@ -29,13 +29,13 @@ export default { el.resizeListener = () => { doResize(el, binding, vnode) } - - addResizeListener(el, el.resizeListener) + // parameter 1 is must be "Element" type + addResizeListener(window.document.body, el.resizeListener) }, inserted(el, binding, vnode) { doResize(el, binding, vnode) }, unbind(el) { - removeResizeListener(el, el.resizeListener) + removeResizeListener(window.document.body, el.resizeListener) } } From 6a08c79bfb405aeb4163ae468f0f64393cd2d354 Mon Sep 17 00:00:00 2001 From: Tuan Duong <bacduong@gmail.com> Date: Wed, 17 Apr 2019 00:01:24 +0700 Subject: [PATCH 133/202] Change views/icons path - Icons view includes 2 small views: svg-icons and element-icons --- src/router/index.js | 2 +- src/views/icons/element-icons.js | 74 +++++++++++++++++++ src/views/{svg-icons => icons}/index.vue | 10 +-- .../require-icons.js => icons/svg-icons.js} | 4 +- src/views/svg-icons/element-icon.json | 1 - 5 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 src/views/icons/element-icons.js rename src/views/{svg-icons => icons}/index.vue (90%) rename src/views/{svg-icons/require-icons.js => icons/svg-icons.js} (72%) delete mode 100644 src/views/svg-icons/element-icon.json diff --git a/src/router/index.js b/src/router/index.js index 0c5973da..34afd5c5 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -163,7 +163,7 @@ export const asyncRoutes = [ children: [ { path: 'index', - component: () => import('@/views/svg-icons/index'), + component: () => import('@/views/icons/index'), name: 'Icons', meta: { title: 'icons', icon: 'icon', noCache: true } } diff --git a/src/views/icons/element-icons.js b/src/views/icons/element-icons.js new file mode 100644 index 00000000..df722010 --- /dev/null +++ b/src/views/icons/element-icons.js @@ -0,0 +1,74 @@ +const elementIcons = [ + 'info', + 'error', + 'success', + 'warning', + 'question', + 'back', + 'arrow-left', + 'arrow-down', + 'arrow-right', + 'arrow-up', + 'caret-left', + 'caret-bottom', + 'caret-top', + 'caret-right', + 'd-arrow-left', + 'd-arrow-right', + 'minus', + 'plus', + 'remove', + 'circle-plus', + 'remove-outline', + 'circle-plus-outline', + 'close', + 'check', + 'circle-close', + 'circle-check', + 'circle-close-outline', + 'circle-check-outline', + 'zoom-out', + 'zoom-in', + 'd-caret', + 'sort', + 'sort-down', + 'sort-up', + 'tickets', + 'document', + 'goods', + 'sold-out', + 'news', + 'message', + 'date', + 'printer', + 'time', + 'bell', + 'mobile-phone', + 'service', + 'view', + 'menu', + 'more', + 'more-outline', + 'star-on', + 'star-off', + 'location', + 'location-outline', + 'phone', + 'phone-outline', + 'picture', + 'picture-outline', + 'delete', + 'search', + 'edit', + 'edit-outline', + 'rank', + 'refresh', + 'share', + 'setting', + 'upload', + 'upload2', + 'download', + 'loading' +] + +export default elementIcons diff --git a/src/views/svg-icons/index.vue b/src/views/icons/index.vue similarity index 90% rename from src/views/svg-icons/index.vue rename to src/views/icons/index.vue index 2715b5ea..3677afd6 100644 --- a/src/views/svg-icons/index.vue +++ b/src/views/icons/index.vue @@ -6,7 +6,7 @@ </aside> <el-tabs type="border-card"> <el-tab-pane label="Icons"> - <div v-for="item of iconsMap" :key="item" @click="handleClipboard(generateIconCode(item),$event)"> + <div v-for="item of svgIcons" :key="item" @click="handleClipboard(generateIconCode(item),$event)"> <el-tooltip placement="top"> <div slot="content"> {{ generateIconCode(item) }} @@ -37,15 +37,15 @@ <script> import clipboard from '@/utils/clipboard' -import icons from './require-icons' -import elementIcons from './element-icon.json' +import svgIcons from './svg-icons' +import elementIcons from './element-icons' export default { name: 'Icons', data() { return { - iconsMap: icons, - elementIcons: elementIcons + svgIcons, + elementIcons } }, methods: { diff --git a/src/views/svg-icons/require-icons.js b/src/views/icons/svg-icons.js similarity index 72% rename from src/views/svg-icons/require-icons.js rename to src/views/icons/svg-icons.js index 56edb9f1..1e3c66d2 100644 --- a/src/views/svg-icons/require-icons.js +++ b/src/views/icons/svg-icons.js @@ -3,8 +3,8 @@ const requireAll = requireContext => requireContext.keys() const re = /\.\/(.*)\.svg/ -const icons = requireAll(req).map(i => { +const svgIcons = requireAll(req).map(i => { return i.match(re)[1] }) -export default icons +export default svgIcons diff --git a/src/views/svg-icons/element-icon.json b/src/views/svg-icons/element-icon.json deleted file mode 100644 index 15072a4c..00000000 --- a/src/views/svg-icons/element-icon.json +++ /dev/null @@ -1 +0,0 @@ -["info","error","success","warning","question","back","arrow-left","arrow-down","arrow-right","arrow-up","caret-left","caret-bottom","caret-top","caret-right","d-arrow-left","d-arrow-right","minus","plus","remove","circle-plus","remove-outline","circle-plus-outline","close","check","circle-close","circle-check","circle-close-outline","circle-check-outline","zoom-out","zoom-in","d-caret","sort","sort-down","sort-up","tickets","document","goods","sold-out","news","message","date","printer","time","bell","mobile-phone","service","view","menu","more","more-outline","star-on","star-off","location","location-outline","phone","phone-outline","picture","picture-outline","delete","search","edit","edit-outline","rank","refresh","share","setting","upload","upload2","download","loading"] From 154b75b47c90ed5be6e1e5129bdcd9bf8715becc Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 17 Apr 2019 11:09:16 +0800 Subject: [PATCH 134/202] perf[Sidebar]: add unique-opened option --- src/layout/components/Sidebar/index.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index 773cd5c8..fb014a23 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -7,6 +7,7 @@ :collapse="isCollapse" :background-color="variables.menuBg" :text-color="variables.menuText" + :unique-opened="false" :active-text-color="variables.menuActiveText" :collapse-transition="false" mode="vertical" From 3f71147385cc8bcc7e3826ce5a6493b0bf1fb862 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 17 Apr 2019 11:45:12 +0800 Subject: [PATCH 135/202] tweak --- mock/role/routes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/role/routes.js b/mock/role/routes.js index 5bb6c741..2d3613e7 100644 --- a/mock/role/routes.js +++ b/mock/role/routes.js @@ -119,7 +119,7 @@ export const asyncRoutes = [ children: [ { path: 'index', - component: 'views/svg-icons/index', + component: 'views/icons/index', name: 'Icons', meta: { title: 'icons', icon: 'icon', noCache: true } } From 50d09574099f39b71ac37739ff7c07ec568f2160 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 18 Apr 2019 18:16:13 +0800 Subject: [PATCH 136/202] perf: optimize some small details --- src/api/user.js | 1 - src/layout/components/Navbar.vue | 4 +++- src/store/getters.js | 1 - src/store/modules/permission.js | 2 +- src/utils/validate.js | 1 + src/views/error-page/404.vue | 23 +++++++---------------- vue.config.js | 2 +- 7 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/api/user.js b/src/api/user.js index a8052005..de69f707 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -22,4 +22,3 @@ export function logout() { method: 'post' }) } - diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index d544f079..51972166 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -36,6 +36,9 @@ {{ $t('navbar.github') }} </el-dropdown-item> </a> + <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/"> + <el-dropdown-item>Docs</el-dropdown-item> + </a> <el-dropdown-item divided> <span style="display:block;" @click="logout">{{ $t('navbar.logOut') }}</span> </el-dropdown-item> @@ -68,7 +71,6 @@ export default { computed: { ...mapGetters([ 'sidebar', - 'name', 'avatar', 'device' ]) diff --git a/src/store/getters.js b/src/store/getters.js index 3fb5b068..313210a0 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -11,7 +11,6 @@ const getters = { introduction: state => state.user.introduction, roles: state => state.user.roles, permission_routes: state => state.permission.routes, - addRoutes: state => state.permission.addRoutes, errorLogs: state => state.errorLog.logs } export default getters diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index bd35252c..aeb5ee53 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -51,7 +51,7 @@ const actions = { return new Promise(resolve => { let accessedRoutes if (roles.includes('admin')) { - accessedRoutes = asyncRoutes + accessedRoutes = asyncRoutes || [] } else { accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) } diff --git a/src/utils/validate.js b/src/utils/validate.js index e04f292e..e81672bb 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,6 +1,7 @@ /** * Created by jiachenpan on 16/11/18. */ + /** * @param {string} path * @returns {Boolean} diff --git a/src/views/error-page/404.vue b/src/views/error-page/404.vue index 66cb3eae..1791f55a 100644 --- a/src/views/error-page/404.vue +++ b/src/views/error-page/404.vue @@ -8,22 +8,13 @@ <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404"> </div> <div class="bullshit"> - <div class="bullshit__oops"> - OOPS! + <div class="bullshit__oops">OOPS!</div> + <div class="bullshit__info">All rights reserved + <a style="color:#20a0ff" href="https://wallstreetcn.com" target="_blank">wallstreetcn</a> </div> - <div class="bullshit__info"> - 版权所有 - <a class="link-type" href="https://wallstreetcn.com" target="_blank">华尔街见闻</a> - </div> - <div class="bullshit__headline"> - {{ message }} - </div> - <div class="bullshit__info"> - 请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告 - </div> - <router-link to="/" class="bullshit__return-home"> - 返回首页 - </router-link> + <div class="bullshit__headline">{{ message }}</div> + <div class="bullshit__info">Please check that the URL you entered is correct, or click the button below to return to the homepage.</div> + <a href="" class="bullshit__return-home">Back to home</a> </div> </div> </div> @@ -35,7 +26,7 @@ export default { name: 'Page404', computed: { message() { - return '网管说这个页面你不能进......' + return 'The webmaster said that you can not enter this page...' } } } diff --git a/vue.config.js b/vue.config.js index bae56d78..7fa00992 100644 --- a/vue.config.js +++ b/vue.config.js @@ -86,7 +86,7 @@ module.exports = { .end() config - // https://webpack.js.org/configuration/devtool/#development + // https://webpack.js.org/configuration/devtool/#development .when(process.env.NODE_ENV === 'development', config => config.devtool('cheap-source-map') ) From ea91066b18e3989da206de41206016732b432b80 Mon Sep 17 00:00:00 2001 From: dingangang <dingangang@vip.qq.copm> Date: Thu, 18 Apr 2019 18:36:20 +0800 Subject: [PATCH 137/202] fix[mock]: fixed mock-server hot reload bug in windows (#1939) --- mock/mock-server.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mock/mock-server.js b/mock/mock-server.js index b29b7c3f..ccce04d2 100644 --- a/mock/mock-server.js +++ b/mock/mock-server.js @@ -1,6 +1,9 @@ const chokidar = require('chokidar') const bodyParser = require('body-parser') const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') function registerRoutes(app) { let mockLastIndex @@ -18,7 +21,7 @@ function registerRoutes(app) { function unregisterRoutes() { Object.keys(require.cache).forEach(i => { - if (i.includes('/mock')) { + if (i.includes(mockDir)) { delete require.cache[require.resolve(i)] } }) @@ -40,9 +43,8 @@ module.exports = app => { var mockStartIndex = mockRoutes.mockStartIndex // watch files, hot reload mock server - chokidar.watch(('./mock'), { - ignored: 'mock/mock-server.js', - persistent: true, + chokidar.watch(mockDir, { + ignored: /mock-server/, ignoreInitial: true }).on('all', (event, path) => { if (event === 'change' || event === 'add') { From 7ca42be6036b755a4f9dc89891a3f77a184281f0 Mon Sep 17 00:00:00 2001 From: toruksmakto <42709228+toruksmakto@users.noreply.github.com> Date: Thu, 18 Apr 2019 19:54:34 +0800 Subject: [PATCH 138/202] perf[login.vue]: add tabindex for login form (#1933) --- src/views/login/index.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 9bff21a3..27f11ef5 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -19,6 +19,7 @@ :placeholder="$t('login.username')" name="username" type="text" + tabindex="1" auto-complete="on" /> </el-form-item> @@ -35,6 +36,7 @@ :type="passwordType" :placeholder="$t('login.password')" name="password" + tabindex="2" auto-complete="on" @keyup.native="checkCapslock" @blur="capsTooltip = false" From 7dc9e681bf4906234556812730d30a944d7050bc Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 19 Apr 2019 17:24:15 +0800 Subject: [PATCH 139/202] docs: update readme --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 0e15d8a4..0af0838d 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -161,7 +161,7 @@ cd vue-element-admin # 安装依赖 npm install -# 建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题 +# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npm.taobao.org # 启动服务 From 120c78622d32641f9816db76b7f90a0d40ba9d83 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 19 Apr 2019 17:24:40 +0800 Subject: [PATCH 140/202] perf[jest]: clear jest test cache --- jest.config.js | 7 ++----- package.json | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/jest.config.js b/jest.config.js index 1ce813e1..143cdc86 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,12 +1,9 @@ module.exports = { - verbose: true, moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], - transformIgnorePatterns: [ - 'node_modules/(?!(babel-jest|jest-vue-preprocessor)/)' - ], transform: { '^.+\\.vue$': 'vue-jest', - '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', '^.+\\.jsx?$': 'babel-jest' }, moduleNameMapper: { diff --git a/package.json b/package.json index 72e92927..6802c9b5 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build:stage": "vue-cli-service build --mode staging", "preview": "node build/index.js --preview", "lint": "eslint --ext .js,.vue src", - "test:unit": "vue-cli-service test:unit", + "test:unit": "jest --clearCache && vue-cli-service test:unit", "test:ci": "npm run lint && npm run test:unit", "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", "new": "plop" From d8dbf92b4714cd4f222d546413b6e15c63685e33 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 19 Apr 2019 17:25:11 +0800 Subject: [PATCH 141/202] tweak --- src/views/login/components/SocialSignin.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/login/components/SocialSignin.vue b/src/views/login/components/SocialSignin.vue index cbfb15d2..e9bf4f21 100644 --- a/src/views/login/components/SocialSignin.vue +++ b/src/views/login/components/SocialSignin.vue @@ -1,10 +1,12 @@ <template> <div class="social-signup-container"> <div class="sign-btn" @click="wechatHandleClick('wechat')"> - <span class="wx-svg-container"><svg-icon icon-class="wechat" class="icon" /></span> 微信 + <span class="wx-svg-container"><svg-icon icon-class="wechat" class="icon" /></span> + WeChat </div> <div class="sign-btn" @click="tencentHandleClick('tencent')"> - <span class="qq-svg-container"><svg-icon icon-class="qq" class="icon" /></span> QQ + <span class="qq-svg-container"><svg-icon icon-class="qq" class="icon" /></span> + QQ </div> </div> </template> From f0ca1735d384e2779de3bda2091d3c327e133f20 Mon Sep 17 00:00:00 2001 From: anson <ansonhorse@users.noreply.github.com> Date: Tue, 23 Apr 2019 10:09:15 +0800 Subject: [PATCH 142/202] perf[Tinymce]: add width prop (#1951) --- src/components/Sticky/index.vue | 6 +++--- src/components/Tinymce/index.vue | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/Sticky/index.vue b/src/components/Sticky/index.vue index fa165bc7..97ce0e96 100644 --- a/src/components/Sticky/index.vue +++ b/src/components/Sticky/index.vue @@ -40,14 +40,14 @@ export default { mounted() { this.height = this.$el.getBoundingClientRect().height window.addEventListener('scroll', this.handleScroll) - window.addEventListener('resize', this.handleReize) + window.addEventListener('resize', this.handleResize) }, activated() { this.handleScroll() }, destroyed() { window.removeEventListener('scroll', this.handleScroll) - window.removeEventListener('resize', this.handleReize) + window.removeEventListener('resize', this.handleResize) }, methods: { sticky() { @@ -81,7 +81,7 @@ export default { } this.handleReset() }, - handleReize() { + handleResize() { if (this.isSticky) { this.width = this.$el.getBoundingClientRect().width + 'px' } diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index a05c3b9c..1e1c4ab5 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -38,9 +38,14 @@ export default { default: 'file edit insert view format table' }, height: { - type: Number, + type: [Number, String], required: false, default: 360 + }, + width: { + type: [Number, String], + required: false, + default: 'auto' } }, data() { @@ -91,6 +96,7 @@ export default { language: this.language, selector: `#${this.tinymceId}`, height: this.height, + width: this.width, body_class: 'panel-body ', object_resizing: false, toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar, From 3625f920411a831b60b1d650107e37b0517c3db0 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 23 Apr 2019 11:25:53 +0800 Subject: [PATCH 143/202] fix[Tinymce]: fixed width bug --- src/components/Tinymce/index.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index 1e1c4ab5..284851e5 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -1,5 +1,5 @@ <template> - <div :class="{fullscreen:fullscreen}" class="tinymce-container editor-container"> + <div :class="{fullscreen:fullscreen}" class="tinymce-container" :style="{width:containerWidth}"> <textarea :id="tinymceId" class="tinymce-textarea" /> <div class="editor-custom-btn-container"> <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" /> @@ -63,6 +63,13 @@ export default { computed: { language() { return this.languageTypeList[this.$store.getters.language] + }, + containerWidth() { + const width = this.width + if (/^[\d]+(\.[\d]+)?$/.test(width)) { // matches `100`, `'100'` + return `${width}px` + } + return width } }, watch: { @@ -96,7 +103,6 @@ export default { language: this.language, selector: `#${this.tinymceId}`, height: this.height, - width: this.width, body_class: 'panel-body ', object_resizing: false, toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar, From f9f51986e611fc2b14b2bff32344cf68208d5bd8 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 25 Apr 2019 14:55:17 +0800 Subject: [PATCH 144/202] perf: remove redundant svg --- src/icons/svg/guide 2.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/icons/svg/guide 2.svg diff --git a/src/icons/svg/guide 2.svg b/src/icons/svg/guide 2.svg deleted file mode 100644 index d053bd73..00000000 --- a/src/icons/svg/guide 2.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="1000" height="1000" xmlns="http://www.w3.org/2000/svg"><path d="M11.576 547.9l282.848 126.404 409.285-383.26 137.057-128.341L361.234 714.22l362.77 146.362c8.742 3.327 18.733-1.33 21.855-10.644v-.666L999.985.374 10.327 514.636c-8.742 4.657-11.864 15.302-8.117 24.616 2.497 3.991 5.62 7.318 9.366 8.648zM360.61 999.626l141.112-161.663-141.112-61.206v222.869z"/></svg> \ No newline at end of file From c58e2078bc06a22d1d71c8eb6ea532bf2248ad9f Mon Sep 17 00:00:00 2001 From: Tuan Duong <bacduong@gmail.com> Date: Thu, 25 Apr 2019 16:45:46 +0700 Subject: [PATCH 145/202] feature[profile]: add profile page (#1953) --- src/filters/index.js | 8 + src/icons/svg/education.svg | 1 + src/icons/svg/skill.svg | 1 + src/lang/en.js | 6 +- src/lang/es.js | 6 +- src/lang/zh.js | 6 +- src/layout/components/Navbar.vue | 5 + src/router/index.js | 14 ++ src/views/profile/components/Account.vue | 38 +++++ src/views/profile/components/Activity.vue | 185 ++++++++++++++++++++++ src/views/profile/components/Timeline.vue | 43 +++++ src/views/profile/components/UserCard.vue | 134 ++++++++++++++++ src/views/profile/index.vue | 70 ++++++++ 13 files changed, 511 insertions(+), 6 deletions(-) create mode 100644 src/icons/svg/education.svg create mode 100644 src/icons/svg/skill.svg create mode 100644 src/views/profile/components/Account.vue create mode 100644 src/views/profile/components/Activity.vue create mode 100644 src/views/profile/components/Timeline.vue create mode 100644 src/views/profile/components/UserCard.vue create mode 100644 src/views/profile/index.vue diff --git a/src/filters/index.js b/src/filters/index.js index 051000c1..f6a28488 100644 --- a/src/filters/index.js +++ b/src/filters/index.js @@ -58,3 +58,11 @@ export function numberFormatter(num, digits) { export function toThousandFilter(num) { return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ',')) } + +/** + * Upper case first char + * @param {String} string + */ +export function uppercaseFirst(string) { + return string.charAt(0).toUpperCase() + string.slice(1) +} diff --git a/src/icons/svg/education.svg b/src/icons/svg/education.svg new file mode 100644 index 00000000..7bfb01d1 --- /dev/null +++ b/src/icons/svg/education.svg @@ -0,0 +1 @@ +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg> \ No newline at end of file diff --git a/src/icons/svg/skill.svg b/src/icons/svg/skill.svg new file mode 100644 index 00000000..a3b73121 --- /dev/null +++ b/src/icons/svg/skill.svg @@ -0,0 +1 @@ +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M31.652 93.206h33.401c1.44 2.418 3.077 4.663 4.93 6.692h-38.33v-6.692zm0-10.586h28.914a44.8 44.8 0 0 1-1.264-6.688h-27.65v6.688zm0-17.27H59.39c.288-2.286.714-4.532 1.34-6.687H31.65v6.687h.003zm53.913 44.84v5.85c0 2.798-2.095 5.075-4.667 5.075h-70.07c-2.576 0-4.663-2.277-4.663-5.075V31.26l23.22-20.96v22.25H17.16v6.688h18.39V6.688h45.348c2.576 0 4.667 2.277 4.667 5.066v20.009c1.987-.675 4.053-1.128 6.17-1.445v-18.56C91.738 5.28 86.874 0 80.902 0H31.15L0 28.118v87.917c0 6.48 4.859 11.759 10.832 11.759h70.07c5.974 0 10.837-5.27 10.837-11.759v-4.41c-2.117-.312-4.183-.765-6.17-1.435h-.004zM23.279 58.667h-7.96v6.688h7.96v-6.688zm-7.956 41.23h7.96v-6.691h-7.96v6.692zm7.956-23.96h-7.96v6.687h7.96v-6.688zm89.718-15.042l-4.896-4.07-12.447 17.613-11.19-9.305-3.762 5.311 16.091 13.38 16.204-22.929zM128 70.978c0-18.632-13.97-33.782-31.147-33.782-17.168 0-31.135 15.155-31.135 33.782 0 18.628 13.97 33.783 31.135 33.783 17.172 0 31.143-15.15 31.143-33.783H128zm-6.17 0c0 14.933-11.203 27.1-24.981 27.1-13.77 0-24.987-12.158-24.987-27.1 0-14.941 11.195-27.099 24.987-27.099 13.778 0 24.982 12.158 24.982 27.1z"/></svg> \ No newline at end of file diff --git a/src/lang/en.js b/src/lang/en.js index 426d3d26..ae221ba8 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -61,12 +61,14 @@ export default { theme: 'Theme', clipboardDemo: 'Clipboard', i18n: 'I18n', - externalLink: 'External Link' + externalLink: 'External Link', + profile: 'Profile' }, navbar: { - logOut: 'Log Out', dashboard: 'Dashboard', github: 'Github', + logOut: 'Log Out', + profile: 'Profile', theme: 'Theme', size: 'Global Size' }, diff --git a/src/lang/es.js b/src/lang/es.js index 50b96037..8187bfe7 100755 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -61,14 +61,16 @@ export default { theme: 'Tema', clipboardDemo: 'Clipboard', i18n: 'I18n', - externalLink: 'Enlace externo' + externalLink: 'Enlace externo', + profile: 'Profile' }, navbar: { logOut: 'Salir', dashboard: 'Panel de control', github: 'Github', theme: 'Tema', - size: 'Tamaño global' + size: 'Tamaño global', + profile: 'Profile' }, login: { title: 'Formulario de acceso', diff --git a/src/lang/zh.js b/src/lang/zh.js index 2055c5ab..dee804d2 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -61,12 +61,14 @@ export default { theme: '换肤', clipboardDemo: 'Clipboard', i18n: '国际化', - externalLink: '外链' + externalLink: '外链', + profile: '个人中心' }, navbar: { - logOut: '退出登录', dashboard: '首页', github: '项目地址', + logOut: '退出登录', + profile: '个人中心', theme: '换肤', size: '布局大小' }, diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 51972166..9d5c6658 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -26,6 +26,11 @@ <i class="el-icon-caret-bottom" /> </div> <el-dropdown-menu slot="dropdown"> + <router-link to="/profile/index"> + <el-dropdown-item> + {{ $t('navbar.profile') }} + </el-dropdown-item> + </router-link> <router-link to="/"> <el-dropdown-item> {{ $t('navbar.dashboard') }} diff --git a/src/router/index.js b/src/router/index.js index 34afd5c5..d1dfda90 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -107,6 +107,20 @@ export const constantRoutes = [ meta: { title: 'guide', icon: 'guide', noCache: true } } ] + }, + { + path: '/profile', + component: Layout, + redirect: '/profile/index', + hidden: true, + children: [ + { + path: 'index', + component: () => import('@/views/profile/index'), + name: 'Profile', + meta: { title: 'profile', icon: 'user', noCache: true } + } + ] } ] diff --git a/src/views/profile/components/Account.vue b/src/views/profile/components/Account.vue new file mode 100644 index 00000000..9f2e3865 --- /dev/null +++ b/src/views/profile/components/Account.vue @@ -0,0 +1,38 @@ +<template> + <el-form> + <el-form-item label="Name"> + <el-input v-model.trim="user.name" /> + </el-form-item> + <el-form-item label="Email"> + <el-input v-model.trim="user.email" /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="submit">Update</el-button> + </el-form-item> + </el-form> +</template> + +<script> +export default { + props: { + user: { + type: Object, + default: () => { + return { + name: '', + email: '' + } + } + } + }, + methods: { + submit() { + this.$message({ + message: 'User information has been updated successfully', + type: 'success', + duration: 5 * 1000 + }) + } + } +} +</script> diff --git a/src/views/profile/components/Activity.vue b/src/views/profile/components/Activity.vue new file mode 100644 index 00000000..dd5db3a5 --- /dev/null +++ b/src/views/profile/components/Activity.vue @@ -0,0 +1,185 @@ +<template> + <div class="user-activity"> + <div class="post"> + <div class="user-block"> + <img class="img-circle" :src="'https://wpimg.wallstcn.com/57ed425a-c71e-4201-9428-68760c0537c4.jpg'+avatarPrefix"> + <span class="username text-muted">Iron Man</span> + <span class="description">Shared publicly - 7:30 PM today</span> + </div> + <p> + Lorem ipsum represents a long-held tradition for designers, + typographers and the like. Some people hate it and argue for + its demise, but others ignore the hate as they create awesome + tools to help create filler text for everyone from bacon lovers + to Charlie Sheen fans. + </p> + <ul class="list-inline"> + <li> + <span class="link-black text-sm"> + <i class="el-icon-share" /> + Share + </span> + </li> + <li> + <span class="link-black text-sm"> + <svg-icon icon-class="like" /> + Like + </span> + </li> + </ul> + </div> + <div class="post"> + <div class="user-block"> + <img class="img-circle" :src="'https://wpimg.wallstcn.com/9e2a5d0a-bd5b-457f-ac8e-86554616c87b.jpg'+avatarPrefix"> + <span class="username text-muted">Captain American</span> + <span class="description">Sent you a message - yesterday</span> + </div> + <p> + Lorem ipsum represents a long-held tradition for designers, + typographers and the like. Some people hate it and argue for + its demise, but others ignore the hate as they create awesome + tools to help create filler text for everyone from bacon lovers + to Charlie Sheen fans. + </p> + <ul class="list-inline"> + <li> + <span class="link-black text-sm"> + <i class="el-icon-share" /> + Share + </span> + </li> + <li> + <span class="link-black text-sm"> + <svg-icon icon-class="like" /> + Like + </span> + </li> + </ul> + </div> + <div class="post"> + <div class="user-block"> + <img class="img-circle" :src="'https://wpimg.wallstcn.com/fb57f689-e1ab-443c-af12-8d4066e202e2.jpg'+avatarPrefix"> + <span class="username">Spider Man</span> + <span class="description">Posted 4 photos - 2 days ago</span> + </div> + <div class="user-images"> + <el-carousel :interval="6000" type="card" height="220px"> + <el-carousel-item v-for="item in carouselImages" :key="item"> + <img :src="item+carouselPrefix" class="image"> + </el-carousel-item> + </el-carousel> + </div> + <ul class="list-inline"> + <li><span class="link-black text-sm"><i class="el-icon-share" /> Share</span></li> + <li> + <span class="link-black text-sm"> + <svg-icon icon-class="like" /> Like</span> + </li> + </ul> + </div> + </div> +</template> + +<script> +const avatarPrefix = '?imageView2/1/w/80/h/80' +const carouselPrefix = '?imageView2/2/h/440' + +export default { + data() { + return { + carouselImages: [ + 'https://wpimg.wallstcn.com/9679ffb0-9e0b-4451-9916-e21992218054.jpg', + 'https://wpimg.wallstcn.com/bcce3734-0837-4b9f-9261-351ef384f75a.jpg', + 'https://wpimg.wallstcn.com/d1d7b033-d75e-4cd6-ae39-fcd5f1c0a7c5.jpg', + 'https://wpimg.wallstcn.com/50530061-851b-4ca5-9dc5-2fead928a939.jpg' + ], + avatarPrefix, + carouselPrefix + } + } +} +</script> + +<style lang="scss" scoped> +.user-activity { + .user-block { + + .username, + .description { + display: block; + margin-left: 50px; + padding: 2px 0; + } + + .username{ + font-size: 16px; + color: #000; + } + + :after { + clear: both; + } + + .img-circle { + border-radius: 50%; + width: 40px; + height: 40px; + float: left; + } + + span { + font-weight: 500; + font-size: 12px; + } + } + + .post { + font-size: 14px; + border-bottom: 1px solid #d2d6de; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; + + .image { + width: 100%; + height: 100%; + + } + + .user-images { + padding-top: 20px; + } + } + + .list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; + + li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; + font-size: 13px; + } + + .link-black { + + &:hover, + &:focus { + color: #999; + } + } + } + +} + +.box-center { + margin: 0 auto; + display: table; +} + +.text-muted { + color: #777; +} +</style> diff --git a/src/views/profile/components/Timeline.vue b/src/views/profile/components/Timeline.vue new file mode 100644 index 00000000..ba90b3d2 --- /dev/null +++ b/src/views/profile/components/Timeline.vue @@ -0,0 +1,43 @@ +<template> + <div class="block"> + <el-timeline> + <el-timeline-item v-for="(item,index) of timeline" :key="index" :timestamp="item.timestamp" placement="top"> + <el-card> + <h4>{{ item.title }}</h4> + <p>{{ item.content }}</p> + </el-card> + </el-timeline-item> + </el-timeline> + </div> +</template> + +<script> +export default { + data() { + return { + timeline: [ + { + timestamp: '2019/4/20', + title: 'Update Github template', + content: 'PanJiaChen committed 2019/4/20 20:46' + }, + { + timestamp: '2019/4/21', + title: 'Update Github template', + content: 'PanJiaChen committed 2019/4/21 20:46' + }, + { + timestamp: '2019/4/22', + title: 'Build Template', + content: 'PanJiaChen committed 2019/4/22 20:46' + }, + { + timestamp: '2019/4/23', + title: 'Release New Version', + content: 'PanJiaChen committed 2019/4/23 20:46' + } + ] + } + } +} +</script> diff --git a/src/views/profile/components/UserCard.vue b/src/views/profile/components/UserCard.vue new file mode 100644 index 00000000..a8d27513 --- /dev/null +++ b/src/views/profile/components/UserCard.vue @@ -0,0 +1,134 @@ +<template> + <el-card> + <div slot="header" class="clearfix"> + <span>About me</span> + </div> + + <div class="user-profile"> + <div class="box-center"> + <pan-thumb :image="user.avatar" :height="'100px'" :width="'100px'" :hoverable="false"> + <div>Hello</div> + {{ user.role }} + </pan-thumb> + </div> + <div class="box-center"> + <div class="user-name text-center">{{ user.name }}</div> + <div class="user-role text-center text-muted">{{ user.role | uppercaseFirst }}</div> + </div> + </div> + + <div class="user-bio"> + <div class="user-education user-bio-section"> + <div class="user-bio-section-header"><svg-icon icon-class="education" /><span>Education</span></div> + <div class="user-bio-section-body"> + <div class="text-muted"> + JS in Computer Science from the University of Technology + </div> + </div> + </div> + + <div class="user-skills user-bio-section"> + <div class="user-bio-section-header"><svg-icon icon-class="skill" /><span>Skills</span></div> + <div class="user-bio-section-body"> + <div class="progress-item"> + <span>Vue</span> + <el-progress :percentage="70" /> + </div> + <div class="progress-item"> + <span>JavaScript</span> + <el-progress :percentage="18" /> + </div> + <div class="progress-item"> + <span>Css</span> + <el-progress :percentage="12" /> + </div> + <div class="progress-item"> + <span>ESLint</span> + <el-progress :percentage="100" status="success" /> + </div> + </div> + </div> + </div> + </el-card> +</template> + +<script> +import PanThumb from '@/components/PanThumb' + +export default { + components: { PanThumb }, + props: { + user: { + type: Object, + default: () => { + return { + name: '', + email: '', + avatar: '', + roles: '' + } + } + } + } +} +</script> + +<style lang="scss" scoped> + .box-center { + margin: 0 auto; + display: table; + } + + .text-muted { + color: #777; + } + + .user-profile { + .user-name { + font-weight: bold; + } + + .box-center { + padding-top: 10px; + } + + .user-role { + padding-top: 10px; + font-weight: 400; + font-size: 14px; + } + + .box-social { + padding-top: 30px; + + .el-table { + border-top: 1px solid #dfe6ec; + } + } + + .user-follow { + padding-top: 20px; + } + } + + .user-bio { + margin-top: 20px; + color: #606266; + + span { + padding-left: 4px; + } + + .user-bio-section { + font-size: 14px; + padding: 15px 0; + + .user-bio-section-header { + border-bottom: 1px solid #dfe6ec; + padding-bottom: 10px; + margin-bottom: 10px; + font-weight: bold; + } + } + } +</style> diff --git a/src/views/profile/index.vue b/src/views/profile/index.vue new file mode 100644 index 00000000..e54bc718 --- /dev/null +++ b/src/views/profile/index.vue @@ -0,0 +1,70 @@ +<template> + <div class="app-container"> + <div v-if="user"> + <el-row :gutter="20"> + + <el-col :span="6"> + <user-card :user="user" /> + </el-col> + + <el-col :span="18"> + <el-card> + + <el-tabs v-model="activeTab"> + <el-tab-pane label="Activity" name="activity"> + <activity /> + </el-tab-pane> + <el-tab-pane label="Timeline" name="timeline"> + <timeline /> + </el-tab-pane> + <el-tab-pane label="Account" name="account"> + <account :user="user" /> + </el-tab-pane> + </el-tabs> + + </el-card> + </el-col> + + </el-row> + </div> + </div> +</template> + +<script> +import { mapGetters } from 'vuex' +import UserCard from './components/UserCard' +import Activity from './components/Activity' +import Timeline from './components/Timeline' +import Account from './components/Account' + +export default { + name: 'Profile', + components: { UserCard, Activity, Timeline, Account }, + data() { + return { + user: {}, + activeTab: 'activity' + } + }, + computed: { + ...mapGetters([ + 'name', + 'avatar', + 'roles' + ]) + }, + created() { + this.getUser() + }, + methods: { + getUser() { + this.user = { + name: this.name, + role: this.roles.join(' | '), + email: 'admin@test.com', + avatar: this.avatar + } + } + } +} +</script> From f24b64392e70bcfbfb6f60e72dc9d9b552d99220 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 26 Apr 2019 17:56:33 +0800 Subject: [PATCH 146/202] chore: set ci node version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 16574d97..f4be7a08 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js -node_js: stable +node_js: 10 script: npm run test notifications: email: false From d4be15d9d9173667c3289c7d0bf991e5a8bc9cd8 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 28 Apr 2019 14:51:11 +0800 Subject: [PATCH 147/202] perf: dashboard add cache --- mock/role/routes.js | 2 +- src/router/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mock/role/routes.js b/mock/role/routes.js index 2d3613e7..c4654566 100644 --- a/mock/role/routes.js +++ b/mock/role/routes.js @@ -41,7 +41,7 @@ export const constantRoutes = [ path: 'dashboard', component: 'views/dashboard/index', name: 'Dashboard', - meta: { title: 'dashboard', icon: 'dashboard', noCache: true, affix: true } + meta: { title: 'dashboard', icon: 'dashboard', affix: true } } ] }, diff --git a/src/router/index.js b/src/router/index.js index d1dfda90..6a60eedc 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -79,7 +79,7 @@ export const constantRoutes = [ path: 'dashboard', component: () => import('@/views/dashboard/index'), name: 'Dashboard', - meta: { title: 'dashboard', icon: 'dashboard', noCache: true, affix: true } + meta: { title: 'dashboard', icon: 'dashboard', affix: true } } ] }, From 9c28b1dd924fe0a2d8541759569fda046fb62eb7 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 28 Apr 2019 17:53:07 +0800 Subject: [PATCH 148/202] fix[Mock]: add error handling --- mock/mock-server.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mock/mock-server.js b/mock/mock-server.js index ccce04d2..4c4cb2af 100644 --- a/mock/mock-server.js +++ b/mock/mock-server.js @@ -48,17 +48,21 @@ module.exports = app => { ignoreInitial: true }).on('all', (event, path) => { if (event === 'change' || event === 'add') { - // remove mock routes stack - app._router.stack.splice(mockStartIndex, mockRoutesLength) + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) - // clear routes cache - unregisterRoutes() + // clear routes cache + unregisterRoutes() - const mockRoutes = registerRoutes(app) - mockRoutesLength = mockRoutes.mockRoutesLength - mockStartIndex = mockRoutes.mockStartIndex + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex - console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } } }) } From 9e318f80ba25885373e9965474a6c9c4d205a932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 30 Apr 2019 16:39:42 +0800 Subject: [PATCH 149/202] perf[Tinymce]: import tinymce from cdn (#1996) --- public/index.html | 5 +- public/static/tinymce4.7.5/langs/zh_CN.js | 230 ------------------ .../plugins/codesample/css/prism.css | 138 ----------- .../plugins/emoticons/img/smiley-cool.gif | Bin 354 -> 0 bytes .../plugins/emoticons/img/smiley-cry.gif | Bin 329 -> 0 bytes .../emoticons/img/smiley-embarassed.gif | Bin 331 -> 0 bytes .../emoticons/img/smiley-foot-in-mouth.gif | Bin 342 -> 0 bytes .../plugins/emoticons/img/smiley-frown.gif | Bin 340 -> 0 bytes .../plugins/emoticons/img/smiley-innocent.gif | Bin 336 -> 0 bytes .../plugins/emoticons/img/smiley-kiss.gif | Bin 338 -> 0 bytes .../plugins/emoticons/img/smiley-laughing.gif | Bin 343 -> 0 bytes .../emoticons/img/smiley-money-mouth.gif | Bin 321 -> 0 bytes .../plugins/emoticons/img/smiley-sealed.gif | Bin 323 -> 0 bytes .../plugins/emoticons/img/smiley-smile.gif | Bin 344 -> 0 bytes .../emoticons/img/smiley-surprised.gif | Bin 338 -> 0 bytes .../emoticons/img/smiley-tongue-out.gif | Bin 328 -> 0 bytes .../emoticons/img/smiley-undecided.gif | Bin 337 -> 0 bytes .../plugins/emoticons/img/smiley-wink.gif | Bin 350 -> 0 bytes .../plugins/emoticons/img/smiley-yell.gif | Bin 336 -> 0 bytes .../plugins/visualblocks/css/visualblocks.css | 154 ------------ .../skins/lightgray/content.inline.min.css | 1 - .../skins/lightgray/content.min.css | 1 - .../skins/lightgray/fonts/tinymce-mobile.woff | Bin 4624 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.eot | Bin 9492 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 ----- .../skins/lightgray/fonts/tinymce-small.ttf | Bin 9304 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 9380 -> 0 bytes .../skins/lightgray/fonts/tinymce.eot | Bin 18808 -> 0 bytes .../skins/lightgray/fonts/tinymce.svg | 131 ---------- .../skins/lightgray/fonts/tinymce.ttf | Bin 18644 -> 0 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 18720 -> 0 bytes .../skins/lightgray/img/anchor.gif | Bin 53 -> 0 bytes .../skins/lightgray/img/loader.gif | Bin 2608 -> 0 bytes .../skins/lightgray/img/object.gif | Bin 152 -> 0 bytes .../skins/lightgray/img/trans.gif | Bin 43 -> 0 bytes .../tinymce4.7.5/skins/lightgray/skin.min.css | 1 - .../skins/lightgray/skin.min.css.map | 1 - public/static/tinymce4.7.5/tinymce.min.js | 2 - src/components/Tinymce/index.vue | 6 + vue.config.js | 10 + 40 files changed, 20 insertions(+), 723 deletions(-) delete mode 100755 public/static/tinymce4.7.5/langs/zh_CN.js delete mode 100755 public/static/tinymce4.7.5/plugins/codesample/css/prism.css delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif delete mode 100755 public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif delete mode 100755 public/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/content.inline.min.css delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/content.min.css delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/img/loader.gif delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/img/object.gif delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/img/trans.gif delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/skin.min.css delete mode 100755 public/static/tinymce4.7.5/skins/lightgray/skin.min.css.map delete mode 100755 public/static/tinymce4.7.5/tinymce.min.js diff --git a/public/index.html b/public/index.html index a2fac6d6..9bb2d7fc 100644 --- a/public/index.html +++ b/public/index.html @@ -9,7 +9,10 @@ <title><%= webpackConfig.name %></title> </head> <body> - <script src="<%= BASE_URL %>static/tinymce4.7.5/tinymce.min.js"></script> + <!-- import cdn js --> + <% for(var js of htmlWebpackPlugin.options.cdn.js) { %> + <script src="<%=js%>"></script> + <% } %> <div id="app"></div> <!-- built files will be auto injected --> </body> diff --git a/public/static/tinymce4.7.5/langs/zh_CN.js b/public/static/tinymce4.7.5/langs/zh_CN.js deleted file mode 100755 index e11f322c..00000000 --- a/public/static/tinymce4.7.5/langs/zh_CN.js +++ /dev/null @@ -1,230 +0,0 @@ -tinymce.addI18n('zh_CN',{ -"Cut": "\u526a\u5207", -"Heading 5": "\u6807\u98985", -"Header 2": "\u6807\u98982", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002", -"Heading 4": "\u6807\u98984", -"Div": "Div\u533a\u5757", -"Heading 2": "\u6807\u98982", -"Paste": "\u7c98\u8d34", -"Close": "\u5173\u95ed", -"Font Family": "\u5b57\u4f53", -"Pre": "\u9884\u683c\u5f0f\u6587\u672c", -"Align right": "\u53f3\u5bf9\u9f50", -"New document": "\u65b0\u6587\u6863", -"Blockquote": "\u5f15\u7528", -"Numbered list": "\u7f16\u53f7\u5217\u8868", -"Heading 1": "\u6807\u98981", -"Headings": "\u6807\u9898", -"Increase indent": "\u589e\u52a0\u7f29\u8fdb", -"Formats": "\u683c\u5f0f", -"Headers": "\u6807\u9898", -"Select all": "\u5168\u9009", -"Header 3": "\u6807\u98983", -"Blocks": "\u533a\u5757", -"Undo": "\u64a4\u6d88", -"Strikethrough": "\u5220\u9664\u7ebf", -"Bullet list": "\u9879\u76ee\u7b26\u53f7", -"Header 1": "\u6807\u98981", -"Superscript": "\u4e0a\u6807", -"Clear formatting": "\u6e05\u9664\u683c\u5f0f", -"Font Sizes": "\u5b57\u53f7", -"Subscript": "\u4e0b\u6807", -"Header 6": "\u6807\u98986", -"Redo": "\u91cd\u590d", -"Paragraph": "\u6bb5\u843d", -"Ok": "\u786e\u5b9a", -"Bold": "\u7c97\u4f53", -"Code": "\u4ee3\u7801", -"Italic": "\u659c\u4f53", -"Align center": "\u5c45\u4e2d", -"Header 5": "\u6807\u98985", -"Heading 6": "\u6807\u98986", -"Heading 3": "\u6807\u98983", -"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", -"Header 4": "\u6807\u98984", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", -"Underline": "\u4e0b\u5212\u7ebf", -"Cancel": "\u53d6\u6d88", -"Justify": "\u4e24\u7aef\u5bf9\u9f50", -"Inline": "\u6587\u672c", -"Copy": "\u590d\u5236", -"Align left": "\u5de6\u5bf9\u9f50", -"Visual aids": "\u7f51\u683c\u7ebf", -"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", -"Square": "\u65b9\u5757", -"Default": "\u9ed8\u8ba4", -"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", -"Circle": "\u7a7a\u5fc3\u5706", -"Disc": "\u5b9e\u5fc3\u5706", -"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", -"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", -"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", -"Name": "\u540d\u79f0", -"Anchor": "\u951a\u70b9", -"Id": "\u6807\u8bc6\u7b26", -"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", -"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", -"Special character": "\u7279\u6b8a\u7b26\u53f7", -"Source code": "\u6e90\u4ee3\u7801", -"Language": "\u8bed\u8a00", -"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", -"B": "B", -"R": "R", -"G": "G", -"Color": "\u989c\u8272", -"Right to left": "\u4ece\u53f3\u5230\u5de6", -"Left to right": "\u4ece\u5de6\u5230\u53f3", -"Emoticons": "\u8868\u60c5", -"Robots": "\u673a\u5668\u4eba", -"Document properties": "\u6587\u6863\u5c5e\u6027", -"Title": "\u6807\u9898", -"Keywords": "\u5173\u952e\u8bcd", -"Encoding": "\u7f16\u7801", -"Description": "\u63cf\u8ff0", -"Author": "\u4f5c\u8005", -"Fullscreen": "\u5168\u5c4f", -"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", -"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", -"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", -"General": "\u666e\u901a", -"Advanced": "\u9ad8\u7ea7", -"Source": "\u5730\u5740", -"Border": "\u8fb9\u6846", -"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", -"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", -"Image description": "\u56fe\u7247\u63cf\u8ff0", -"Style": "\u6837\u5f0f", -"Dimensions": "\u5927\u5c0f", -"Insert image": "\u63d2\u5165\u56fe\u7247", -"Image": "\u56fe\u7247", -"Zoom in": "\u653e\u5927", -"Contrast": "\u5bf9\u6bd4\u5ea6", -"Back": "\u540e\u9000", -"Gamma": "\u4f3d\u9a6c\u503c", -"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", -"Resize": "\u8c03\u6574\u5927\u5c0f", -"Sharpen": "\u9510\u5316", -"Zoom out": "\u7f29\u5c0f", -"Image options": "\u56fe\u7247\u9009\u9879", -"Apply": "\u5e94\u7528", -"Brightness": "\u4eae\u5ea6", -"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", -"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", -"Edit image": "\u7f16\u8f91\u56fe\u7247", -"Color levels": "\u989c\u8272\u5c42\u6b21", -"Crop": "\u88c1\u526a", -"Orientation": "\u65b9\u5411", -"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", -"Invert": "\u53cd\u8f6c", -"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", -"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", -"Remove link": "\u5220\u9664\u94fe\u63a5", -"Url": "\u5730\u5740", -"Text to display": "\u663e\u793a\u6587\u5b57", -"Anchors": "\u951a\u70b9", -"Insert link": "\u63d2\u5165\u94fe\u63a5", -"Link": "\u94fe\u63a5", -"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", -"None": "\u65e0", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", -"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", -"Target": "\u6253\u5f00\u65b9\u5f0f", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", -"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", -"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", -"Media": "\u5a92\u4f53", -"Alternative source": "\u955c\u50cf", -"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", -"Insert video": "\u63d2\u5165\u89c6\u9891", -"Poster": "\u5c01\u9762", -"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", -"Embed": "\u5185\u5d4c", -"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", -"Page break": "\u5206\u9875\u7b26", -"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", -"Preview": "\u9884\u89c8", -"Print": "\u6253\u5370", -"Save": "\u4fdd\u5b58", -"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", -"Replace": "\u66ff\u6362", -"Next": "\u4e0b\u4e00\u4e2a", -"Whole words": "\u5168\u5b57\u5339\u914d", -"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", -"Replace with": "\u66ff\u6362\u4e3a", -"Find": "\u67e5\u627e", -"Replace all": "\u5168\u90e8\u66ff\u6362", -"Match case": "\u533a\u5206\u5927\u5c0f\u5199", -"Prev": "\u4e0a\u4e00\u4e2a", -"Spellcheck": "\u62fc\u5199\u68c0\u67e5", -"Finish": "\u5b8c\u6210", -"Ignore all": "\u5168\u90e8\u5ffd\u7565", -"Ignore": "\u5ffd\u7565", -"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", -"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", -"Rows": "\u884c", -"Height": "\u9ad8", -"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", -"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", -"Border color": "\u8fb9\u6846\u989c\u8272", -"Column group": "\u5217\u7ec4", -"Row": "\u884c", -"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", -"Split cell": "\u62c6\u5206\u5355\u5143\u683c", -"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", -"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", -"Row type": "\u884c\u7c7b\u578b", -"Insert table": "\u63d2\u5165\u8868\u683c", -"Body": "\u8868\u4f53", -"Caption": "\u6807\u9898", -"Footer": "\u8868\u5c3e", -"Delete row": "\u5220\u9664\u884c", -"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", -"Scope": "\u8303\u56f4", -"Delete table": "\u5220\u9664\u8868\u683c", -"H Align": "\u6c34\u5e73\u5bf9\u9f50", -"Top": "\u9876\u90e8\u5bf9\u9f50", -"Header cell": "\u8868\u5934\u5355\u5143\u683c", -"Column": "\u5217", -"Row group": "\u884c\u7ec4", -"Cell": "\u5355\u5143\u683c", -"Middle": "\u5782\u76f4\u5c45\u4e2d", -"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", -"Copy row": "\u590d\u5236\u884c", -"Row properties": "\u884c\u5c5e\u6027", -"Table properties": "\u8868\u683c\u5c5e\u6027", -"Bottom": "\u5e95\u90e8\u5bf9\u9f50", -"V Align": "\u5782\u76f4\u5bf9\u9f50", -"Header": "\u8868\u5934", -"Right": "\u53f3\u5bf9\u9f50", -"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", -"Cols": "\u5217", -"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", -"Width": "\u5bbd", -"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", -"Left": "\u5de6\u5bf9\u9f50", -"Cut row": "\u526a\u5207\u884c", -"Delete column": "\u5220\u9664\u5217", -"Center": "\u5c45\u4e2d", -"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", -"Insert template": "\u63d2\u5165\u6a21\u677f", -"Templates": "\u6a21\u677f", -"Background color": "\u80cc\u666f\u8272", -"Custom...": "\u81ea\u5b9a\u4e49...", -"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", -"No color": "\u65e0", -"Text color": "\u6587\u5b57\u989c\u8272", -"Table of Contents": "\u5185\u5bb9\u5217\u8868", -"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", -"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", -"Words: {0}": "\u5b57\u6570\uff1a{0}", -"Insert": "\u63d2\u5165", -"File": "\u6587\u4ef6", -"Edit": "\u7f16\u8f91", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", -"Tools": "\u5de5\u5177", -"View": "\u89c6\u56fe", -"Table": "\u8868\u683c", -"Format": "\u683c\u5f0f" -}); \ No newline at end of file diff --git a/public/static/tinymce4.7.5/plugins/codesample/css/prism.css b/public/static/tinymce4.7.5/plugins/codesample/css/prism.css deleted file mode 100755 index 128237fb..00000000 --- a/public/static/tinymce4.7.5/plugins/codesample/css/prism.css +++ /dev/null @@ -1,138 +0,0 @@ -/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ -/** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou - */ - -code[class*="language-"], -pre[class*="language-"] { - color: black; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - direction: ltr; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, pre[class*="language-"] ::selection, -code[class*="language-"]::selection, code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: #f5f2f0; -} - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: slategray; -} - -.token.punctuation { - color: #999; -} - -.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #905; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #690; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #a67f59; - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif deleted file mode 100755 index ba90cc36fb0415d0273d1cd206bff63fd9c91fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFIwNk%w1VG;lm0Mr!#3ke00dJfFY%i+lrhK7V(RutUQJhPY;?(XfrsZKgL z7WLQ^zPO&zzav{)SL^9nBOw~z(=orMEH5uC-P_gr`uhCnASMa|$-iRw?m_(dUwU8) zq>Kx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l<p*=3HIT}Of#RazKBq;Z@YZV4Iz0#Fnb06?MO>3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif deleted file mode 100755 index 74d897a4f6d22e814e2b054e98b8a75fb464b4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<B?|!!2MHGf4Gk9;2?q@U3tR{Vzzzx13409%2tlM00|hxd bJp}{XBh3p2-Gt%><~6+>@EpxfA0YrcPNsSu diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif deleted file mode 100755 index 963a96b8a7593b1d8bcbab073abe5ee4e539dbf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmV-R0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_E<O%#>U3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$B<?js^^gTnMs=8C02!K#=aEqQaFR z6pBm+GC@uzdU#EC4h0?_7ZwKt5f%vv7zzj_2!<RSkOKo436}{4lS7u67@C}(1%m_+ z1&^hgn~wz#bpZ=`7y=Uj023D&843#lB@6@x3J1!|$_fSq3|$Nh$PLU5&I{2a5)2&+ dN;`849os?-0Z|L<1OetM#T4=s(M}&B06V4ic~SrX diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif deleted file mode 100755 index c7cf1011dad0e7500e29a278b0d395b253871109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmV-c0jd5+Nk%w1VG;lm0Q4UKxtkou#>SR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kdc3IhA?Hvj+tA^8La0018VEC2ui01^Na06+!P;3tYuX_ljS7!u|-O)<bjtr*7$ zT@&J176)Q-futaag{0!(c%F`mWPvb3CKkn_!{urOiG{*4F_H*|3`HWLWDErJ2gy*p z5_gw^Q9S?@9yNjn4F(zs0}lW>I}TzP1q%xT4HOFwMJaO;2ml)!00<FsBL_bU2o)S0 z6$oPvIh!mG92pr;wj2)<2BUro4=xFK7{e|P3X3Z(kb=%N4>$)141pU08x3594IX?4 o5YuAA8yXz~76K1c;3^jg77WP185Rf^u}23N0sR5^q(T4yJ1sVN5dZ)H diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif deleted file mode 100755 index 716f55e161bfebb1c3d34f0b0f40c177fc82c30b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvH;Nk%w1VG;lm0MroxK_>;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01y<C4-<w5 z1_YrDr5zn|3>yk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif deleted file mode 100755 index 334d49e0e60f2997c9ba24071764f95d9e08a5cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*<p%dw5l&RW5fRqyTWvyTq>+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yo<M~i%4gt?6Fz6~Am9UtD7-RyH0HP3SJKk^yXMmPa zIvd6X(CBm;d>s!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DI<mu`1#Z$Apkp|ihYg% diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif deleted file mode 100755 index 4efd549ed31c44b1faac17ed34bb67abeb42baf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>T=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltk<iAv7k{Z2Z`pvc_hgXjpQ(sE;$1LK%<cl zILB_HNUzT|aeYk*31NL24jm1Pj2;JshKLOYi<FIzdjt-Z3NH$l9TpRW3rGzS3J|Ig z3K0!T3keh%6CNEM5fB0b7ZJA}6B#85Qy!Zb7Z(@}4jx>x9~2uL3<QX`4jKdu92-F& k2^$L&NFE+a6AK$qDbg7WL{1AC-ZjzT0r>&z-yb0WJDRY082|tP diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif deleted file mode 100755 index 82c5b182e61d32bd394acae551eff180f1eebd26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmV-d0jT~*Nk%w1VG;lm0Q4UK!lp8=s;1-69HWK?p_PpF=Pd8<?!T%|a$ZRD@LAHn zAH%B}$j8NMQxe3yo%Yxe`tnEM*t)ly6Z-o4{{3<N_BV)iTG-Xox}Pq}wrbweGI?VY z)x$ATJq`Z*S^xk5A^8La0018VEC2ui01^Na06+!Q;3tYxX_ljCNL1w(@FNIM?McQs zUCse43&6o~nWQEM1qH(4xS9}(;$WOO79K(4!YDB=4TWdnFp@G7PJ%*7a3mS?2dVM6 zI-PsI;?Yo72@41ogoT6%7!Wvf7XS(g6$={!3l#|p07WTt5eE_j0}=-jaw7&93ke<& ztPmc77&)9Q5ETu3w-r$mq=2;*8x1bOE)WSgD-;DBG&Rl-3j&G;1_v6p1PlQe7Xb_e p!hQx5)nWo01l-^P9#i8g7Y7R(uB#dg2N$wO23!pP`bvcW06U9bekA|^ diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif deleted file mode 100755 index ca2451e102722e12e131ae53ea76989acbf191e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl6Nk%w1VG;lm0Mrx!DHsO6wwjoX9Kxs~!mLsE+7oVAHu>~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(E<?eig#P!T<mOA^8LW0018VEC2ui01^Na000HP;3tYyX_jM3Zp6bd53x}yNif>c zG>66zv=rqr;2j)}gKqE$ekcSD?}0=<bQ<7u!)Q1n00<H+ZZKxh#32EQBphsaG65Va zkpjTmkyjs@6kSLVZ3P8{5rzj0C4zW{h8>WLB?AWp85)qAL<a*U1aAfwq@|<=aCH)v z4*(Si6|WTl0-h2j3Q-&j3$U*X6&G0wG!zO07rYn<2p9_&0t3V&#uK|3*v<n4(?SXX Tyx|K0-72^q=pMvQA0YrcF~)Li diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif deleted file mode 100755 index fe66220c24b4da4526818a5d68f75a06d9985a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmV-J0lfZ4Nk%w1VG;lm0Q4UKz^WI%xS#gj6sL~~h=_>d+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyBKJqy*wF8}}lA^8La0018VEC2ui01^Na06+!6;3tYxX_lj?7+U61R3gAaEg8x< zT>%mSfCwURnWQF&g=Q0ZxH1ulW`QtH0>O!5%iT_X0VBy_@EkOngU8?ye~=H!t21{= z9@Uj3a_UbE88~kh5Eq7rh!7QSBn1c?0|Off1&k^`5*QE<4-gm<K{;<6EEx|T9xkX( z8U`F%268SPbQ!cyH(M+Z5eAXJzYDnv2)q*nU0VcScnUiRg#;DT)C3n02t_Ik4G<9+ V78V#$4Gf}33K!HB7tSdm06S^%c-8;_ diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif deleted file mode 100755 index fd27edfaaa29a70a8c4563c0eab9f18c74d374fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK^)Nk%w1VG;lm0Q4UKd0-C4#>SR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UUC3IeK%0ssI2A^8La0018VEC2ui01^Na06+!R;3tYuX_ljSEE482&%+G^XK%|f zLKbCc4u{4-u|QG~LqamSTo?@JM3OKZAr!|Z2IzP@fY`=CIg$vA3qm46TowfLCt29I z6pDKuvnf~)83+sm9yW#?9s>^(89F=~2?!W44-6Ox2^vNza}fp^9v&G65pp936%Gg+ z6HpTy2o4oGoh+>l3Q)KVQwybl2oo*<4a3D469|nfEii|MH4`}p1_cZp0ssj%2>=2d q41Na?)CpS;4gvxWVpZcR76uLludD?Q1{SnP2NnVU0rZ&)0RTIit8@_n diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif deleted file mode 100755 index 0cc9bb71cca4cdeafbb248ce7e07c3708c1cbd64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>T=Nk%w1VG;lm0Q4UK`{WwN#>SnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*)c3<AWsL;wH)A^8La0018VEC2ui01^Na06+!L;3tYuX_ljSXp`hR4gtVa&1uI7 zU6#>2kA}f=futY?#YE7kxGD|7L}4&OEDw$hkm+~<00QS>F_H?J#bz?uEHnl42f5(9 z5O)`6Q9V2o5;YVLUK)Y`7!Nr+4GMq?85s%^2?`BGDRU798Vn2?1`%>22R{iO0u>bk z9tlA?nk*O<3zHJH6&Mp5qALj)E(mxM!Y&vII4dm@1Ov{`f*8pL3xPEVUI>D>1_uxa kNm?`6VH{N6Di;P13m6<67z+;u7qCYM7XkVK^`jvGJD~P?KL7v# diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif deleted file mode 100755 index 2075dc16058f1f17912167675ce5cfb9986fc71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmV-O0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);c<FSP}d3M*jVA`uh6d*t))=8CnMdwl62dyq*2^H`mwJ z)x$CM;3E1`Q~&?~A^8LW0018VEC2ui01^Na000HW;3tYyX_jM3R)^Iz)=^O^Su~t7 zO$yf(v=riDQ79xxiP7>vj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nb<UR~-feh=~dffrA={iID>mjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif deleted file mode 100755 index bef7e257303f8243c89787e7a7f9955dd1f112e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmV-X0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3<K`ugD5x<W4p!>Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif deleted file mode 100755 index 0631c7616ec8624ddeee02b633326f697ee72f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmV-k0ipg!Nk%w1VG;lm0Q4UK(ZVUl#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfF$4Fdh~IsgCwA^8La0018VEC2ui01^Na06+!X;3tYwX_ljiFp=e23$zWxW@`*G zN?2ty6iUNT!AMdPLn89<I6VNsBa$#2B^8PW0&#S{9S2uKsT@fK2H_Bi90-iU`I97Q z0E%zIqENUr1Xc(f2MYrXHi;Vy0}u}!Iy?;k2OcpH3myjm4Mr(+69yat0vrYtb0Y{q z2O3Qt4;lwTI-o2K1Rfax9u5ky5e%q<2M-n*2^lU94lWM|kSi@QiitH3IS2;18v+g& wHWv;88y<lO650S7F$tszn0E%~Di{V71hK9J6b2ZzNDyEMKrq0+R3QKWI|*@ij{pDw diff --git a/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif b/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif deleted file mode 100755 index 648e6e879123fe49beebbc1f3635141864a79a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryG8O{K#>IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|<CF_(maCZTAu39B_R)y$%~g`mSpayo)VZ;Q|z z7ZnA-;Q%Nq3riXZbr%Z>a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp<uzFPh diff --git a/public/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css b/public/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css deleted file mode 100755 index 96e4d7c5..00000000 --- a/public/static/tinymce4.7.5/plugins/visualblocks/css/visualblocks.css +++ /dev/null @@ -1,154 +0,0 @@ -.mce-visualblocks p { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); - background-repeat: no-repeat; -} - -.mce-visualblocks h1 { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks h2 { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks h3 { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); - background-repeat: no-repeat; -} - -.mce-visualblocks h4 { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks h5 { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks h6 { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks div:not([data-mce-bogus]) { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); - background-repeat: no-repeat; -} - -.mce-visualblocks section { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); - background-repeat: no-repeat; -} - -.mce-visualblocks article { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); - background-repeat: no-repeat; -} - -.mce-visualblocks blockquote { - padding-top: 10px; - border: 1px dashed #BBB; - background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); - background-repeat: no-repeat; -} - -.mce-visualblocks address { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); - background-repeat: no-repeat; -} - -.mce-visualblocks pre { - padding-top: 10px; - border: 1px dashed #BBB; - margin-left: 3px; - background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks figure { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); - background-repeat: no-repeat; -} - -.mce-visualblocks hgroup { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); - background-repeat: no-repeat; -} - -.mce-visualblocks aside { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); - background-repeat: no-repeat; -} - -.mce-visualblocks figcaption { - border: 1px dashed #BBB; -} - -.mce-visualblocks ul { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks ol { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); - background-repeat: no-repeat; -} - -.mce-visualblocks dl { - padding-top: 10px; - border: 1px dashed #BBB; - margin: 0 0 1em 3px; - background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); - background-repeat: no-repeat; -} diff --git a/public/static/tinymce4.7.5/skins/lightgray/content.inline.min.css b/public/static/tinymce4.7.5/skins/lightgray/content.inline.min.css deleted file mode 100755 index 7b45d339..00000000 --- a/public/static/tinymce4.7.5/skins/lightgray/content.inline.min.css +++ /dev/null @@ -1 +0,0 @@ -.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2}.mce-content-body{line-height:1.3} \ No newline at end of file diff --git a/public/static/tinymce4.7.5/skins/lightgray/content.min.css b/public/static/tinymce4.7.5/skins/lightgray/content.min.css deleted file mode 100755 index bad168cf..00000000 --- a/public/static/tinymce4.7.5/skins/lightgray/content.min.css +++ /dev/null @@ -1 +0,0 @@ -body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;line-height:1.3;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2} a {color: #1478F0;} diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff deleted file mode 100755 index 1e3be038a607cb7c2544ed8ae3d6621f77bf4c38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4624 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 diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot deleted file mode 100755 index b144ba0bd949de3c0f87abdd78b517067169884f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9492 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 a@gt-tewA|!qxK@v&x`Qu4XoB(um1(SgK0(p diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg deleted file mode 100755 index b4ee6f40..00000000 --- a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata>Generated by IcoMoon</metadata> -<defs> -<font id="tinymce-small" horiz-adv-x="1024"> -<font-face units-per-em="1024" ascent="960" descent="-64" /> -<missing-glyph horiz-adv-x="1024" /> -<glyph unicode=" " horiz-adv-x="512" d="" /> -<glyph unicode="" glyph-name="save" d="M960 80v591.938l-223.938 224.062h-592.062c-44.182 0-80-35.816-80-80v-736c0-44.184 35.818-80 80-80h736c44.184 0 80 35.816 80 80zM576 768h64v-192h-64v192zM704 128h-384v255.882c0.034 0.042 0.076 0.082 0.116 0.118h383.77c0.040-0.036 0.082-0.076 0.116-0.118l-0.002-255.882zM832 128h-64v256c0 35.2-28.8 64-64 64h-384c-35.2 0-64-28.8-64-64v-256h-64v640h64v-192c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v171.010l128-128.072v-490.938z" /> -<glyph unicode="" glyph-name="newdocument" d="M850.746 717.254l-133.492 133.49c-24.888 24.892-74.054 45.256-109.254 45.256h-416c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v544c0 35.2-20.366 84.364-45.254 109.254zM805.49 672.002c6.792-6.796 13.792-19.162 18.894-32.002h-184.384v184.386c12.84-5.1 25.204-12.1 32-18.896l133.49-133.488zM831.884 64h-639.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h383.886v-256h256v-511.884c-0.034-0.040-0.076-0.082-0.116-0.116z" /> -<glyph unicode="" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" /> -<glyph unicode="" glyph-name="alignleft" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h576v-128h-576zM64 192h576v-128h-576z" /> -<glyph unicode="" glyph-name="aligncenter" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM256 576h512v-128h-512zM256 192h512v-128h-512z" /> -<glyph unicode="" glyph-name="alignright" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM384 576h576v-128h-576zM384 192h576v-128h-576z" /> -<glyph unicode="" glyph-name="alignjustify" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h896v-128h-896zM64 192h896v-128h-896z" /> -<glyph unicode="" glyph-name="cut" d="M864.408 289.868c-46.47 46.47-106.938 68.004-161.082 62.806l-63.326 63.326 192 192c0 0 128 128 0 256l-320-320-320 320c-128-128 0-256 0-256l192-192-63.326-63.326c-54.144 5.198-114.61-16.338-161.080-62.806-74.98-74.98-85.112-186.418-22.626-248.9 62.482-62.482 173.92-52.354 248.9 22.626 46.47 46.468 68.002 106.938 62.806 161.080l63.326 63.326 63.328-63.328c-5.196-54.144 16.336-114.61 62.806-161.078 74.978-74.98 186.418-85.112 248.898-22.626 62.488 62.482 52.356 173.918-22.624 248.9zM353.124 201.422c-2.212-24.332-15.020-49.826-35.14-69.946-22.212-22.214-51.080-35.476-77.218-35.476-10.524 0-25.298 2.228-35.916 12.848-21.406 21.404-17.376 73.132 22.626 113.136 22.212 22.214 51.080 35.476 77.218 35.476 10.524 0 25.298-2.228 35.916-12.848 13.112-13.11 13.47-32.688 12.514-43.19zM512 352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zM819.152 108.848c-10.62-10.62-25.392-12.848-35.916-12.848-26.138 0-55.006 13.262-77.218 35.476-20.122 20.12-32.928 45.614-35.138 69.946-0.958 10.502-0.6 30.080 12.514 43.192 10.618 10.622 25.39 12.848 35.916 12.848 26.136 0 55.006-13.262 77.216-35.474 40.004-40.008 44.032-91.736 22.626-113.14z" /> -<glyph unicode="" glyph-name="paste" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h384l192 192v384h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM704 90.51v101.49h101.49l-101.49-101.49zM832 256h-192v-192h-256v448h448v-256z" /> -<glyph unicode="" glyph-name="searchreplace" d="M888 576h-56v256h64v64h-320v-64h64v-256h-256v256h64v64h-320v-64h64v-256h-56c-39.6 0-72-32.4-72-72v-432c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v312h128v-312c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v432c0 39.6-32.4 72-72 72zM348 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM860 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32z" /> -<glyph unicode="" glyph-name="bullist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM128 768c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 448c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 128c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64z" /> -<glyph unicode="" glyph-name="numlist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM320 430v146h-64v320h-128v-64h64v-256h-64v-64h128v-50l-128-60v-146h128v-64h-128v-64h128v-64h-128v-64h192v320h-128v50z" /> -<glyph unicode="" glyph-name="indent" d="M64 768h896v-128h-896zM384 384h576v-128h-576zM384 576h576v-128h-576zM64 192h896v-128h-896zM64 576l224-160-224-160z" /> -<glyph unicode="" glyph-name="outdent" d="M64 768h896v-128h-896zM64 384h576v-128h-576zM64 576h576v-128h-576zM64 192h896v-128h-896zM960 576l-224-160 224-160z" /> -<glyph unicode="" glyph-name="blockquote" d="M256.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.954-10.578-19.034-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498zM768.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.956-10.578-19.036-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498z" /> -<glyph unicode="" glyph-name="undo" d="M704 0c59 199 134.906 455.266-256 446.096v-222.096l-336.002 336 336.002 336v-217.326c468.092 12.2 544-358.674 256-678.674z" /> -<glyph unicode="" glyph-name="redo" d="M576 678.674v217.326l336.002-336-336.002-336v222.096c-390.906 9.17-315-247.096-256-446.096-288 320-212.092 690.874 256 678.674z" /> -<glyph unicode="" glyph-name="unlink" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM352 250c-9.724 0-19.45 3.71-26.87 11.128-14.84 14.84-14.84 38.898 0 53.738l320 320c14.84 14.84 38.896 14.84 53.736 0 14.844-14.84 14.844-38.9 0-53.74l-320-320c-7.416-7.416-17.142-11.126-26.866-11.126z" /> -<glyph unicode="" glyph-name="link" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM800 122c-9.724 0-19.45 3.708-26.87 11.13l-128 127.998c-14.844 14.84-14.844 38.898 0 53.738 14.84 14.844 38.896 14.844 53.736 0l128-128c14.844-14.84 14.844-38.896 0-53.736-7.416-7.422-17.142-11.13-26.866-11.13zM608 0c-17.674 0-32 14.326-32 32v128c0 17.674 14.326 32 32 32s32-14.326 32-32v-128c0-17.674-14.326-32-32-32zM928 320h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32h128c17.674 0 32-14.326 32-32s-14.326-32-32-32zM224 774c9.724 0 19.45-3.708 26.87-11.13l128-128c14.842-14.84 14.842-38.898 0-53.738-14.84-14.844-38.898-14.844-53.738 0l-128 128c-14.842 14.84-14.842 38.898 0 53.738 7.418 7.422 17.144 11.13 26.868 11.13zM416 896c17.674 0 32-14.326 32-32v-128c0-17.674-14.326-32-32-32s-32 14.326-32 32v128c0 17.674 14.326 32 32 32zM96 576h128c17.674 0 32-14.326 32-32s-14.326-32-32-32h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32z" /> -<glyph unicode="" glyph-name="bookmark" d="M256 896v-896l256 256 256-256v896h-512zM704 170.51l-192 192-192-192v661.49h384v-661.49z" /> -<glyph unicode="" glyph-name="image" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM896 128.116c-0.012-0.014-0.030-0.028-0.042-0.042l-191.958 319.926-160-128-224 288-191.968-479.916c-0.010 0.010-0.022 0.022-0.032 0.032v639.77c0.034 0.040 0.076 0.082 0.114 0.114h767.77c0.040-0.034 0.082-0.076 0.116-0.116v-639.768zM640 608c0-53.019 42.981-96 96-96s96 42.981 96 96c0 53.019-42.981 96-96 96s-96-42.981-96-96z" /> -<glyph unicode="" glyph-name="media" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM256 128h-128v128h128v-128zM256 384h-128v128h128v-128zM256 640h-128v128h128v-128zM704 128h-384v640h384v-640zM896 128h-128v128h128v-128zM896 384h-128v128h128v-128zM896 640h-128v128h128v-128zM384 640v-384l288 192z" /> -<glyph unicode="" glyph-name="help" d="M448 256h128v-128h-128v128zM704 704c35.346 0 64-28.654 64-64v-166l-228-154h-92v64l192 128v64h-320v128h384zM512 896c-119.666 0-232.166-46.6-316.784-131.216-84.614-84.618-131.216-197.118-131.216-316.784 0-119.664 46.602-232.168 131.216-316.784 84.618-84.616 197.118-131.216 316.784-131.216 119.664 0 232.168 46.6 316.784 131.216s131.216 197.12 131.216 316.784c0 119.666-46.6 232.166-131.216 316.784-84.616 84.616-197.12 131.216-316.784 131.216z" /> -<glyph unicode="" glyph-name="code" d="M416 256l-192 192 192 192-64 64-256-256 256-256zM672 704l-64-64 192-192-192-192 64-64 256 256z" /> -<glyph unicode="" glyph-name="insertdatetime" d="M77.798 655.376l81.414-50.882c50.802 81.114 128.788 143.454 221.208 174.246l-30.366 91.094c-113.748-37.898-209.728-114.626-272.256-214.458zM673.946 869.834l-30.366-91.094c92.422-30.792 170.404-93.132 221.208-174.248l81.412 50.882c-62.526 99.834-158.506 176.562-272.254 214.46zM607.974 255.992c-4.808 0-9.692 1.090-14.286 3.386l-145.688 72.844v211.778c0 17.672 14.328 32 32 32s32-14.328 32-32v-172.222l110.31-55.156c15.806-7.902 22.214-27.124 14.31-42.932-5.604-11.214-16.908-17.696-28.646-17.698zM512 768c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384zM512 96c-159.058 0-288 128.942-288 288s128.942 288 288 288c159.058 0 288-128.942 288-288s-128.942-288-288-288z" /> -<glyph unicode="" glyph-name="preview" d="M64 504.254c45.318 49.92 97.162 92.36 153.272 125.124 90.332 52.744 192.246 80.622 294.728 80.622 102.48 0 204.396-27.878 294.726-80.624 56.112-32.764 107.956-75.204 153.274-125.124v117.432c-33.010 28.118-68.124 53.14-104.868 74.594-105.006 61.314-223.658 93.722-343.132 93.722s-238.128-32.408-343.134-93.72c-36.742-21.454-71.856-46.478-104.866-74.596v-117.43zM512 640c-183.196 0-345.838-100.556-448-256 102.162-155.448 264.804-256 448-256s345.838 100.552 448 256c-102.162 155.444-264.804 256-448 256zM512 448c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.348 28.654 64 64 64s64-28.652 64-64zM728.066 263.338c-67.434-39.374-140.128-59.338-216.066-59.338s-148.632 19.964-216.066 59.338c-51.554 30.104-98.616 71.31-138.114 120.662 39.498 49.35 86.56 90.558 138.116 120.66 13.276 7.752 26.758 14.74 40.426 20.982-10.512-23.742-16.362-50.008-16.362-77.642 0-106.040 85.962-192 192-192 106.040 0 192 85.96 192 192 0 27.634-5.85 53.9-16.36 77.642 13.668-6.244 27.15-13.23 40.426-20.982 51.554-30.102 98.616-71.31 138.116-120.66-39.498-49.352-86.56-90.558-138.116-120.662z" /> -<glyph unicode="" glyph-name="forecolor" d="M651.168 676.166c-24.612 81.962-28.876 91.834-107.168 91.834h-64c-79.618 0-82.664-10.152-108.418-96 0-0.002 0-0.002-0.002-0.004l-143.998-479.996h113.636l57.6 192h226.366l57.6-192h113.63l-145.246 484.166zM437.218 512l38.4 136c10.086 33.618 36.38 30 36.38 30s26.294 3.618 36.38-30h0.004l38.4-136h-149.564z" /> -<glyph unicode="" glyph-name="table" d="M64 768v-704h896v704h-896zM384 320v128h256v-128h-256zM640 256v-128h-256v128h256zM640 640v-128h-256v128h256zM320 640v-128h-192v128h192zM128 448h192v-128h-192v128zM704 448h192v-128h-192v128zM704 512v128h192v-128h-192zM128 256h192v-128h-192v128zM704 128v128h192v-128h-192z" /> -<glyph unicode="" glyph-name="hr" d="M64 512h896v-128h-896z" /> -<glyph unicode="" glyph-name="removeformat" d="M64 192h512v-128h-512v128zM768 768h-220.558l-183.766-512h-132.288l183.762 512h-223.15v128h576v-128zM929.774 64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774-62.226-62.226z" /> -<glyph unicode="" glyph-name="subscript" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" /> -<glyph unicode="" glyph-name="superscript" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" /> -<glyph unicode="" glyph-name="charmap" d="M704 128v37.004c151.348 61.628 256 193.82 256 346.996 0 212.078-200.576 384-448 384s-448-171.922-448-384c0-153.176 104.654-285.368 256-346.996v-37.004h-192l-64 96v-224h320v222.812c-100.9 51.362-170.666 161.54-170.666 289.188 0 176.732 133.718 320 298.666 320s298.666-143.268 298.666-320c0-127.648-69.766-237.826-170.666-289.188v-222.812h320v224l-64-96h-192z" /> -<glyph unicode="" glyph-name="emoticons" d="M512 820c99.366 0 192.782-38.694 263.042-108.956s108.958-163.678 108.958-263.044-38.696-192.782-108.958-263.042-163.676-108.958-263.042-108.958-192.782 38.696-263.044 108.958-108.956 163.676-108.956 263.042 38.694 192.782 108.956 263.044 163.678 108.956 263.044 108.956zM512 896c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM320 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM576 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM512 304c-101.84 0-192.56 36.874-251.166 94.328 23.126-117.608 126.778-206.328 251.166-206.328s228.040 88.72 251.168 206.328c-58.608-57.454-149.328-94.328-251.168-94.328z" /> -<glyph unicode="" glyph-name="print" d="M256 832h512v-128h-512v128zM896 640h-768c-35.2 0-64-28.8-64-64v-256c0-35.2 28.796-64 64-64h128v-192h512v192h128c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM704 128h-384v256h384v-256zM910.4 544c0-25.626-20.774-46.4-46.398-46.4s-46.402 20.774-46.402 46.4 20.778 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" /> -<glyph unicode="" glyph-name="fullscreen" d="M480 576l-192 192 128 128h-352v-352l128 128 192-192zM640 480l192 192 128-128v352h-352l128-128-192-192zM544 320l192-192-128-128h352v352l-128-128-192 192zM384 416l-192-192-128 128v-352h352l-128 128 192 192z" /> -<glyph unicode="" glyph-name="spellcheck" d="M960 832v64h-192c-35.202 0-64-28.8-64-64v-320c0-15.856 5.858-30.402 15.496-41.614l-303.496-260.386-142 148-82-70 224-288 416 448h128v64h-192v320h192zM256 448h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192h128v-192zM128 704v128h128v-128h-128zM640 512v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64zM448 832h128v-128h-128v128zM448 640h128v-128h-128v128z" /> -<glyph unicode="" glyph-name="nonbreaking" d="M448 448h-128v128h128v128h128v-128h128v-128h-128v-128h-128v128zM960 384v-320h-896v320h128v-192h640v192h128z" /> -<glyph unicode="" glyph-name="template" d="M512 576h128v-64h-128zM512 192h128v-64h-128zM576 384h128v-64h-128zM768 384v-192h-64v-64h128v256zM384 384h128v-64h-128zM320 192h128v-64h-128zM320 576h128v-64h-128zM192 768v-256h64v192h64v64zM704 512h128v256h-64v-192h-64zM64 896v-896h896v896h-896zM896 64h-768v768h768v-768zM192 384v-256h64v192h64v64zM576 768h128v-64h-128zM384 768h128v-64h-128z" /> -<glyph unicode="" glyph-name="pagebreak" d="M816 896l16-384h-640l16 384h32l16-320h512l16 320h32zM208 0l-16 320h640l-16-320h-32l-16 256h-512l-16-256h-32zM64 448h128v-64h-128zM256 448h128v-64h-128zM448 448h128v-64h-128zM640 448h128v-64h-128zM832 448h128v-64h-128z" /> -<glyph unicode="" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" /> -<glyph unicode="" glyph-name="bold" d="M625.442 465.818c48.074 38.15 78.558 94.856 78.558 158.182 0 114.876-100.29 208-224 208h-224v-768h288c123.712 0 224 93.124 224 208 0 88.196-59.118 163.562-142.558 193.818zM384 656c0 26.51 21.49 48 48 48h67.204c42.414 0 76.796-42.98 76.796-96s-34.382-96-76.796-96h-115.204v144zM547.2 192h-115.2c-26.51 0-48 21.49-48 48v144h163.2c42.418 0 76.8-42.98 76.8-96s-34.382-96-76.8-96z" /> -<glyph unicode="" glyph-name="italic" d="M832 832v-64h-144l-256-640h144v-64h-448v64h144l256 640h-144v64h448z" /> -<glyph unicode="" glyph-name="underline" d="M192 128h576v-64h-576v64zM640 832v-384c0-31.312-14.7-61.624-41.39-85.352-30.942-27.502-73.068-42.648-118.61-42.648-45.544 0-87.668 15.146-118.608 42.648-26.692 23.728-41.392 54.040-41.392 85.352v384h-128v-384c0-141.382 128.942-256 288-256s288 114.618 288 256v384h-128z" /> -<glyph unicode="" glyph-name="strikethrough" d="M960 448h-265.876c-50.078 35.42-114.43 54.86-182.124 54.86-89.206 0-164.572 50.242-164.572 109.712s75.366 109.714 164.572 109.714c75.058 0 140.308-35.576 159.12-82.286h113.016c-7.93 50.644-37.58 97.968-84.058 132.826-50.88 38.16-117.676 59.174-188.078 59.174-70.404 0-137.196-21.014-188.074-59.174-54.788-41.090-86.212-99.502-86.212-160.254s31.424-119.164 86.212-160.254c1.956-1.466 3.942-2.898 5.946-4.316h-265.872v-64h512.532c58.208-17.106 100.042-56.27 100.042-100.572 0-59.468-75.368-109.71-164.572-109.71-75.060 0-140.308 35.574-159.118 82.286h-113.016c7.93-50.64 37.582-97.968 84.060-132.826 50.876-38.164 117.668-59.18 188.072-59.18 70.402 0 137.198 21.016 188.074 59.174 54.79 41.090 86.208 99.502 86.208 160.254 0 35.298-10.654 69.792-30.294 100.572h204.012v64z" /> -<glyph unicode="" glyph-name="visualchars" d="M384 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448z" /> -<glyph unicode="" glyph-name="ltr" d="M448 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM64 64l224 192-224 192z" /> -<glyph unicode="" glyph-name="rtl" d="M320 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM960 448l-224-192 224-192z" /> -<glyph unicode="" glyph-name="copy" d="M832 640h-192v64l-192 192h-384v-704h384v-192h576v448l-192 192zM832 549.49l101.49-101.49h-101.49v101.49zM448 805.49l101.49-101.49h-101.49v101.49zM128 832h256v-192h192v-384h-448v576zM960 64h-448v128h128v384h128v-192h192v-320z" /> -<glyph unicode="" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" /> -<glyph unicode="" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM840.34 256h87.66l32 448h-896l64-640h356.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM874.996 110.25l-134.496 110.692c17.454 28.922 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l110.692-134.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM576 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" /> -<glyph unicode="" glyph-name="pastetext" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h576v576h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM832 64h-448v448h448v-448zM448 448v-128h32l32 64h64v-192h-48v-64h160v64h-48v192h64l32-64h32v128z" /> -<glyph unicode="" glyph-name="codesample" d="M200.015 577.994v103.994c0 43.077 34.919 77.997 77.997 77.997h26v103.994h-26c-100.51 0-181.991-81.481-181.991-181.991v-103.994c0-43.077-34.919-77.997-77.997-77.997h-26v-103.994h26c43.077 0 77.997-34.919 77.997-77.997v-103.994c0-100.509 81.481-181.991 181.991-181.991h26v103.994h-26c-43.077 0-77.997 34.919-77.997 77.997v103.994c0 50.927-20.928 96.961-54.642 129.994 33.714 33.032 54.642 79.065 54.642 129.994zM823.985 577.994v103.994c0 43.077-34.919 77.997-77.997 77.997h-26v103.994h26c100.509 0 181.991-81.481 181.991-181.991v-103.994c0-43.077 34.919-77.997 77.997-77.997h26v-103.994h-26c-43.077 0-77.997-34.919-77.997-77.997v-103.994c0-100.509-81.482-181.991-181.991-181.991h-26v103.994h26c43.077 0 77.997 34.919 77.997 77.997v103.994c0 50.927 20.928 96.961 54.642 129.994-33.714 33.032-54.642 79.065-54.642 129.994zM615.997 603.277c0-57.435-46.56-103.994-103.994-103.994s-103.994 46.56-103.994 103.994c0 57.435 46.56 103.994 103.994 103.994s103.994-46.56 103.994-103.994zM512 448.717c-57.435 0-103.994-46.56-103.994-103.994 0-55.841 26-100.107 105.747-103.875-23.715-33.413-59.437-46.608-105.747-50.94v-61.747c0 0 207.991-18.144 207.991 216.561-0.202 57.437-46.56 103.996-103.994 103.996z" /> -</font></defs></svg> \ No newline at end of file diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf deleted file mode 100755 index a983e2dc4cb30880fffe00e1f0879be4d95eb4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9304 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 V|H?UnQG1YRcKGiNtkxZ`{{_U;RE_`u diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff deleted file mode 100755 index d8962df76e50488c6520c0dadf3220080aaae9fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9380 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 diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot deleted file mode 100755 index 5336c38ff5206392d145d4feb00cd19b10e5614d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18808 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 M7B?A~<rSa*3w+Ta=>Px# diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg deleted file mode 100755 index 9fa215f3..00000000 --- a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.svg +++ /dev/null @@ -1,131 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata>Generated by IcoMoon</metadata> -<defs> -<font id="tinymce" horiz-adv-x="1024"> -<font-face units-per-em="1024" ascent="960" descent="-64" /> -<missing-glyph horiz-adv-x="1024" /> -<glyph unicode=" " horiz-adv-x="512" d="" /> -<glyph unicode="" glyph-name="save" d="M896 960h-896v-1024h1024v896l-128 128zM512 832h128v-256h-128v256zM896 64h-768v768h64v-320h576v320h74.978l53.022-53.018v-714.982z" /> -<glyph unicode="" glyph-name="newdocument" d="M903.432 760.57l-142.864 142.862c-31.112 31.112-92.568 56.568-136.568 56.568h-480c-44 0-80-36-80-80v-864c0-44 36-80 80-80h736c44 0 80 36 80 80v608c0 44-25.456 105.458-56.568 136.57zM858.178 715.314c3.13-3.13 6.25-6.974 9.28-11.314h-163.458v163.456c4.34-3.030 8.184-6.15 11.314-9.28l142.864-142.862zM896 16c0-8.672-7.328-16-16-16h-736c-8.672 0-16 7.328-16 16v864c0 8.672 7.328 16 16 16h480c4.832 0 10.254-0.61 16-1.704v-254.296h254.296c1.094-5.746 1.704-11.166 1.704-16v-608z" /> -<glyph unicode="" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" /> -<glyph unicode="" glyph-name="alignleft" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" /> -<glyph unicode="" glyph-name="aligncenter" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" /> -<glyph unicode="" glyph-name="alignright" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" /> -<glyph unicode="" glyph-name="alignjustify" d="M0 896h1024v-128h-1024zM0 704h1024v-128h-1024zM0 512h1024v-128h-1024zM0 320h1024v-128h-1024zM0 128h1024v-128h-1024z" /> -<glyph unicode="" glyph-name="cut" d="M890.774 250.846c-45.654 45.556-103.728 69.072-157.946 69.072h-29.112l-63.904 64.008 255.62 256.038c63.904 64.010 63.904 192.028 0 256.038l-383.43-384.056-383.432 384.054c-63.904-64.008-63.904-192.028 0-256.038l255.622-256.034-63.906-64.008h-29.114c-54.22 0-112.292-23.518-157.948-69.076-81.622-81.442-92.65-202.484-24.63-270.35 29.97-29.902 70.288-44.494 112.996-44.494 54.216 0 112.29 23.514 157.946 69.072 53.584 53.464 76.742 124 67.084 185.348l65.384 65.488 65.376-65.488c-9.656-61.348 13.506-131.882 67.084-185.348 45.662-45.558 103.732-69.072 157.948-69.072 42.708 0 83.024 14.592 112.994 44.496 68.020 67.866 56.988 188.908-24.632 270.35zM353.024 114.462c-7.698-17.882-19.010-34.346-33.626-48.926-14.636-14.604-31.172-25.918-49.148-33.624-16.132-6.916-32.96-10.568-48.662-10.568-15.146 0-36.612 3.402-52.862 19.612-16.136 16.104-19.52 37.318-19.52 52.288 0 15.542 3.642 32.21 10.526 48.212 7.7 17.884 19.014 34.346 33.626 48.926 14.634 14.606 31.172 25.914 49.15 33.624 16.134 6.914 32.96 10.568 48.664 10.568 15.146 0 36.612-3.4 52.858-19.614 16.134-16.098 19.522-37.316 19.522-52.284 0.002-15.542-3.638-32.216-10.528-48.214zM512.004 293.404c-49.914 0-90.376 40.532-90.376 90.526 0 49.992 40.462 90.52 90.376 90.52s90.372-40.528 90.372-90.52c0-49.998-40.46-90.526-90.372-90.526zM855.272 40.958c-16.248-16.208-37.712-19.612-52.86-19.612-15.704 0-32.53 3.652-48.666 10.568-17.972 7.706-34.508 19.020-49.142 33.624-14.614 14.58-25.926 31.042-33.626 48.926-6.886 15.998-10.526 32.672-10.526 48.212 0 14.966 3.384 36.188 19.52 52.286 16.246 16.208 37.712 19.614 52.86 19.614 15.7 0 32.53-3.654 48.66-10.568 17.978-7.708 34.516-19.018 49.15-33.624 14.61-14.58 25.924-31.042 33.626-48.926 6.884-15.998 10.526-32.67 10.526-48.212-0.002-14.97-3.39-36.186-19.522-52.288z" /> -<glyph unicode="" glyph-name="paste" d="M832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h448l192 192v512h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM832 26.51v101.49h101.49l-101.49-101.49zM960 192h-192v-192h-320v576h512v-384z" /> -<glyph unicode="" glyph-name="searchreplace" d="M64 960h384v-64h-384zM576 960h384v-64h-384zM952 640h-56v256h-256v-256h-256v256h-256v-256h-56c-39.6 0-72-32.4-72-72v-560c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v376h128v-376c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v560c0 39.6-32.4 72-72 72zM348 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM924 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32z" /> -<glyph unicode="" glyph-name="bullist" d="M384 896h640v-128h-640v128zM384 512h640v-128h-640v128zM384 128h640v-128h-640v128zM0 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 448c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 64c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128z" /> -<glyph unicode="" glyph-name="numlist" d="M384 128h640v-128h-640zM384 512h640v-128h-640zM384 896h640v-128h-640zM192 960v-256h-64v192h-64v64zM128 434v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM256 256v-320h-192v64h128v64h-128v64h128v64h-128v64z" /> -<glyph unicode="" glyph-name="indent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM0 256v384l256-192z" /> -<glyph unicode="" glyph-name="outdent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM256 640v-384l-256 192z" /> -<glyph unicode="" glyph-name="blockquote" d="M225 512c123.712 0 224-100.29 224-224 0-123.712-100.288-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.634-11.636-22.252-24.016-31.83-37.020 11.438 1.8 23.16 2.746 35.104 2.746zM801 512c123.71 0 224-100.29 224-224 0-123.712-100.29-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.636-11.636-22.254-24.016-31.832-37.020 11.44 1.8 23.16 2.746 35.106 2.746z" /> -<glyph unicode="" glyph-name="undo" d="M761.862-64c113.726 206.032 132.888 520.306-313.862 509.824v-253.824l-384 384 384 384v-248.372c534.962 13.942 594.57-472.214 313.862-775.628z" /> -<glyph unicode="" glyph-name="redo" d="M576 711.628v248.372l384-384-384-384v253.824c-446.75 10.482-427.588-303.792-313.86-509.824-280.712 303.414-221.1 789.57 313.86 775.628z" /> -<glyph unicode="" glyph-name="link" d="M320 256c17.6-17.6 47.274-16.726 65.942 1.942l316.118 316.116c18.668 18.668 19.54 48.342 1.94 65.942s-47.274 16.726-65.942-1.942l-316.116-316.116c-18.668-18.668-19.542-48.342-1.942-65.942zM476.888 284.888c4.56-9.050 6.99-19.16 6.99-29.696 0-17.616-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.382 99.382c-12.248 12.248-18.992 28.694-18.992 46.308s6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994 10.536 0 20.644-2.43 29.696-6.99l65.338 65.338c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-60.67-60.67-60.67-159.948 0-220.618l99.382-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c55.82 55.82 60.238 144.298 13.344 205.344l-65.34-65.34zM978.498 815.116l-99.382 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994s34.060-6.746 46.308-18.994l99.382-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c60.67 60.666 60.67 159.944 0 220.614z" /> -<glyph unicode="" glyph-name="unlink" d="M476.888 284.886c4.56-9.048 6.99-19.158 6.99-29.696 0-17.616-6.744-34.058-18.992-46.308l-163.38-163.38c-12.248-12.248-28.696-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.38 99.38c-12.248 12.25-18.992 28.696-18.992 46.308s6.744 34.060 18.992 46.308l163.38 163.382c12.248 12.246 28.696 18.992 46.308 18.992 10.538 0 20.644-2.43 29.696-6.988l65.338 65.336c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.38-163.382c-60.67-60.67-60.67-159.95 0-220.618l99.38-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.38 163.38c55.82 55.82 60.238 144.298 13.344 205.346l-65.34-65.338zM978.496 815.116l-99.38 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.97-15.166-110.306-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.246 12.248 28.694 18.994 46.306 18.994 17.616 0 34.060-6.746 46.308-18.994l99.38-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.38-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.504l163.38 163.38c60.672 60.666 60.672 159.944 0 220.614zM233.368 681.376l-191.994 191.994 45.256 45.256 191.994-191.994zM384 960h64v-192h-64zM0 576h192v-64h-192zM790.632 214.624l191.996-191.996-45.256-45.256-191.996 191.996zM576 128h64v-192h-64zM832 384h192v-64h-192z" /> -<glyph unicode="" glyph-name="anchor" d="M192 960v-1024l320 320 320-320v1024h-640zM768 90.51l-256 256-256-256v805.49h512v-805.49z" /> -<glyph unicode="" glyph-name="image" d="M0 832v-832h1024v832h-1024zM960 64h-896v704h896v-704zM704 608c0 53.019 42.981 96 96 96s96-42.981 96-96c0-53.019-42.981-96-96-96s-96 42.981-96 96zM896 128h-768l192 512 256-320 128 96z" /> -<glyph unicode="" glyph-name="media" d="M0 832v-768h1024v768h-1024zM192 128h-128v128h128v-128zM192 384h-128v128h128v-128zM192 640h-128v128h128v-128zM768 128h-512v640h512v-640zM960 128h-128v128h128v-128zM960 384h-128v128h128v-128zM960 640h-128v128h128v-128zM384 640v-384l256 192z" /> -<glyph unicode="" glyph-name="help" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" /> -<glyph unicode="" glyph-name="code" d="M320 704l-256-256 256-256h128l-256 256 256 256zM704 704h-128l256-256-256-256h128l256 256z" /> -<glyph unicode="" glyph-name="inserttime" d="M512 768c-212.076 0-384-171.922-384-384s171.922-384 384-384c212.074 0 384 171.922 384 384s-171.926 384-384 384zM715.644 180.354c-54.392-54.396-126.716-84.354-203.644-84.354s-149.25 29.958-203.646 84.354c-54.396 54.394-84.354 126.718-84.354 203.646s29.958 149.25 84.354 203.646c54.396 54.396 126.718 84.354 203.646 84.354s149.252-29.958 203.642-84.354c54.402-54.396 84.358-126.718 84.358-203.646s-29.958-149.252-84.356-203.646zM325.93 756.138l-42.94 85.878c-98.874-49.536-179.47-130.132-229.006-229.008l85.876-42.94c40.248 80.336 105.732 145.822 186.070 186.070zM884.134 570.070l85.878 42.938c-49.532 98.876-130.126 179.472-229.004 229.008l-42.944-85.878c80.338-40.248 145.824-105.732 186.070-186.068zM512 576h-64v-192c0-10.11 4.7-19.11 12.022-24.972l-0.012-0.016 160-128 39.976 49.976-147.986 118.39v176.622z" /> -<glyph unicode="" glyph-name="preview" d="M512 640c-209.368 0-395.244-100.556-512-256 116.756-155.446 302.632-256 512-256s395.244 100.554 512 256c-116.756 155.444-302.632 256-512 256zM448 512c35.346 0 64-28.654 64-64s-28.654-64-64-64-64 28.654-64 64 28.654 64 64 64zM773.616 254.704c-39.648-20.258-81.652-35.862-124.846-46.376-44.488-10.836-90.502-16.328-136.77-16.328-46.266 0-92.282 5.492-136.768 16.324-43.194 10.518-85.198 26.122-124.846 46.376-63.020 32.202-120.222 76.41-167.64 129.298 47.418 52.888 104.62 97.1 167.64 129.298 32.336 16.522 66.242 29.946 101.082 40.040-19.888-30.242-31.468-66.434-31.468-105.336 0-106.040 85.962-192 192-192s192 85.96 192 192c0 38.902-11.582 75.094-31.466 105.34 34.838-10.096 68.744-23.52 101.082-40.042 63.022-32.198 120.218-76.408 167.638-129.298-47.42-52.886-104.618-97.1-167.638-129.296zM860.918 716.278c-108.72 55.554-226.112 83.722-348.918 83.722s-240.198-28.168-348.918-83.722c-58.772-30.032-113.732-67.904-163.082-112.076v-109.206c55.338 58.566 120.694 107.754 192.194 144.29 99.62 50.904 207.218 76.714 319.806 76.714s220.186-25.81 319.804-76.716c71.502-36.536 136.858-85.724 192.196-144.29v109.206c-49.35 44.174-104.308 82.046-163.082 112.078z" /> -<glyph unicode="" glyph-name="forecolor" d="M322.018 128l57.6 192h264.764l57.6-192h113.632l-191.996 640h-223.236l-192-640h113.636zM475.618 640h72.764l57.6-192h-187.964l57.6 192z" /> -<glyph unicode="" glyph-name="table" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" /> -<glyph unicode="" glyph-name="hr" d="M0 512h1024v-128h-1024z" /> -<glyph unicode="" glyph-name="removeformat" d="M0 64h576v-128h-576zM192 960h704v-128h-704zM277.388 128l204.688 784.164 123.85-32.328-196.25-751.836zM929.774-64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774z" /> -<glyph unicode="" glyph-name="sub" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" /> -<glyph unicode="" glyph-name="sup" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" /> -<glyph unicode="" glyph-name="charmap" d="M704 64h256l64 128v-256h-384v214.214c131.112 56.484 224 197.162 224 361.786 0 214.432-157.598 382.266-352 382.266-194.406 0-352-167.832-352-382.266 0-164.624 92.886-305.302 224-361.786v-214.214h-384v256l64-128h256v32.59c-187.63 66.46-320 227.402-320 415.41 0 247.424 229.23 448 512 448s512-200.576 512-448c0-188.008-132.37-348.95-320-415.41v-32.59z" /> -<glyph unicode="" glyph-name="emoticons" d="M512 960c-282.77 0-512-229.228-512-512 0-282.77 229.228-512 512-512 282.77 0 512 229.23 512 512 0 282.772-229.23 512-512 512zM512 16c-238.586 0-432 193.412-432 432 0 238.586 193.414 432 432 432 238.59 0 432-193.414 432-432 0-238.588-193.41-432-432-432zM384 640c0-35.346-28.654-64-64-64s-64 28.654-64 64 28.654 64 64 64 64-28.654 64-64zM768 640c0-35.346-28.652-64-64-64s-64 28.654-64 64 28.652 64 64 64 64-28.654 64-64zM512 308c141.074 0 262.688 57.532 318.462 123.192-20.872-171.22-156.288-303.192-318.462-303.192-162.118 0-297.498 132.026-318.444 303.168 55.786-65.646 177.386-123.168 318.444-123.168z" /> -<glyph unicode="" glyph-name="print" d="M256 896h512v-128h-512zM960 704h-896c-35.2 0-64-28.8-64-64v-320c0-35.2 28.796-64 64-64h192v-256h512v256h192c35.2 0 64 28.8 64 64v320c0 35.2-28.8 64-64 64zM704 64h-384v320h384v-320zM974.4 608c0-25.626-20.774-46.4-46.398-46.4-25.626 0-46.402 20.774-46.402 46.4s20.776 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" /> -<glyph unicode="" glyph-name="fullscreen" d="M1024 960v-384l-138.26 138.26-212-212-107.48 107.48 212 212-138.26 138.26zM245.74 821.74l212-212-107.48-107.48-212 212-138.26-138.26v384h384zM885.74 181.74l138.26 138.26v-384h-384l138.26 138.26-212 212 107.48 107.48zM457.74 286.26l-212-212 138.26-138.26h-384v384l138.26-138.26 212 212z" /> -<glyph unicode="" glyph-name="spellchecker" d="M128 704h128v-192h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192zM128 896h128v-128h-128v128zM960 896v64h-192c-35.202 0-64-28.8-64-64v-320c0-35.2 28.798-64 64-64h192v64h-192v320h192zM640 800v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64zM576 576h-128v128h128v-128zM576 768h-128v128h128v-128zM832 384l-416-448-224 288 82 70 142-148 352 302z" /> -<glyph unicode="" glyph-name="nonbreaking" d="M448 384h-192v128h192v192h128v-192h192v-128h-192v-192h-128zM1024 320v-384h-1024v384h128v-256h768v256z" /> -<glyph unicode="" glyph-name="template" d="M384 768h128v-64h-128zM576 768h128v-64h-128zM896 768v-256h-192v64h128v128h-64v64zM320 576h128v-64h-128zM512 576h128v-64h-128zM192 704v-128h64v-64h-128v256h192v-64zM384 384h128v-64h-128zM576 384h128v-64h-128zM896 384v-256h-192v64h128v128h-64v64zM320 192h128v-64h-128zM512 192h128v-64h-128zM192 320v-128h64v-64h-128v256h192v-64zM960 896h-896v-896h896v896zM1024 960v0-1024h-1024v1024h1024z" /> -<glyph unicode="" glyph-name="pagebreak" d="M0 448h128v-64h-128zM192 448h192v-64h-192zM448 448h128v-64h-128zM640 448h192v-64h-192zM896 448h128v-64h-128zM880 960l16-448h-768l16 448h32l16-384h640l16 384zM144-64l-16 384h768l-16-384h-32l-16 320h-640l-16-320z" /> -<glyph unicode="" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" /> -<glyph unicode="" glyph-name="bold" d="M707.88 475.348c37.498 44.542 60.12 102.008 60.12 164.652 0 141.16-114.842 256-256 256h-320v-896h384c141.158 0 256 114.842 256 256 0 92.956-49.798 174.496-124.12 219.348zM384 768h101.5c55.968 0 101.5-57.42 101.5-128s-45.532-128-101.5-128h-101.5v256zM543 128h-159v256h159c58.45 0 106-57.42 106-128s-47.55-128-106-128z" /> -<glyph unicode="" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" /> -<glyph unicode="" glyph-name="underline" d="M704 896h128v-416c0-159.058-143.268-288-320-288-176.73 0-320 128.942-320 288v416h128v-416c0-40.166 18.238-78.704 51.354-108.506 36.896-33.204 86.846-51.494 140.646-51.494s103.75 18.29 140.646 51.494c33.116 29.802 51.354 68.34 51.354 108.506v416zM192 128h640v-128h-640z" /> -<glyph unicode="" glyph-name="strikethrough" d="M731.42 442.964c63.92-47.938 100.58-116.086 100.58-186.964s-36.66-139.026-100.58-186.964c-59.358-44.518-137.284-69.036-219.42-69.036-82.138 0-160.062 24.518-219.42 69.036-63.92 47.938-100.58 116.086-100.58 186.964h128c0-69.382 87.926-128 192-128s192 58.618 192 128c0 69.382-87.926 128-192 128-82.138 0-160.062 24.518-219.42 69.036-63.92 47.94-100.58 116.086-100.58 186.964s36.66 139.024 100.58 186.964c59.358 44.518 137.282 69.036 219.42 69.036 82.136 0 160.062-24.518 219.42-69.036 63.92-47.94 100.58-116.086 100.58-186.964h-128c0 69.382-87.926 128-192 128s-192-58.618-192-128c0-69.382 87.926-128 192-128 82.136 0 160.062-24.518 219.42-69.036zM0 448h1024v-64h-1024z" /> -<glyph unicode="" glyph-name="visualchars" d="M384 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224z" /> -<glyph unicode="" glyph-name="ltr" d="M448 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM64 512l256-224-256-224z" /> -<glyph unicode="" glyph-name="rtl" d="M256 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM960 64l-256 224 256 224z" /> -<glyph unicode="" glyph-name="copy" d="M832 704h-192v64l-192 192h-448v-768h384v-256h640v576l-192 192zM832 613.49l101.49-101.49h-101.49v101.49zM448 869.49l101.49-101.49h-101.49v101.49zM64 896h320v-192h192v-448h-512v640zM960 0h-512v192h192v448h128v-192h192v-448z" /> -<glyph unicode="" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" /> -<glyph unicode="" glyph-name="checkbox" d="M128 416l288-288 480 480-128 128-352-352-160 160z" /> -<glyph unicode="" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM904.34 256h74.86l44.8 448h-1024l64-640h484.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM1002.996 46.25l-198.496 174.692c17.454 28.92 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l174.692-198.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM640 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" /> -<glyph unicode="" glyph-name="pastetext" d="M512 448v-128h32l32 64h64v-256h-48v-64h224v64h-48v256h64l32-64h32v128zM832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h640v704h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM960 0h-512v576h512v-576z" /> -<glyph unicode="" glyph-name="gamma" d="M483.2 320l-147.2 336c-9.6 25.6-19.2 44.8-25.6 54.4s-16 12.8-25.6 12.8c-16 0-25.6-3.2-28.8-3.2v70.4c9.6 6.4 25.6 6.4 38.4 9.6 32 0 57.6-6.4 73.6-22.4 6.4-6.4 12.8-16 19.2-25.6 6.4-12.8 12.8-25.6 16-41.6l121.6-291.2 150.4 371.2h92.8l-198.4-470.4v-224h-86.4v224zM0 960v-1024h1024v1024h-1024zM960 0h-896v896h896v-896z" /> -<glyph unicode="" glyph-name="orientation" d="M627.2 80h-579.2v396.8h579.2v-396.8zM553.6 406.4h-435.2v-256h435.2v256zM259.2 732.8c176 176 457.6 176 633.6 0s176-457.6 0-633.6c-121.6-121.6-297.6-160-454.4-108.8 121.6-28.8 262.4 9.6 361.6 108.8 150.4 150.4 160 384 22.4 521.6-121.6 121.6-320 128-470.4 19.2l86.4-86.4-294.4-22.4 22.4 294.4 92.8-92.8z" /> -<glyph unicode="" glyph-name="invert" d="M892.8-22.4l-89.6 89.6c-70.4-80-172.8-131.2-288-131.2-208 0-380.8 166.4-384 377.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4v0c0 0 0 0 0 3.2 0 0 0 3.2 0 3.2 3.2 105.6 48 211.2 105.6 304l-192 192 44.8 44.8 182.4-182.4c0 0 0 0 0 0l569.6-569.6c0 0 0 0 0 0l99.2-99.2-48-44.8zM896 326.4c0 0 0 0 0 0 0 3.2 0 6.4 0 6.4-9.6 316.8-384 627.2-384 627.2s-108.8-89.6-208-220.8l70.4-70.4c6.4 9.6 16 22.4 22.4 32 41.6 51.2 83.2 96 115.2 128v0c32-32 73.6-76.8 115.2-128 108.8-137.6 169.6-265.6 172.8-371.2 0 0 0-3.2 0-3.2v0 0c0-3.2 0-3.2 0-6.4s0-3.2 0-3.2v0 0c0-22.4-3.2-41.6-9.6-64l76.8-76.8c16 41.6 28.8 89.6 28.8 137.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4z" /> -<glyph unicode="" glyph-name="codesample" d="M199.995 578.002v104.002c0 43.078 34.923 78.001 78.001 78.001h26v104.002h-26c-100.518 0-182.003-81.485-182.003-182.003v-104.002c0-43.078-34.923-78.001-78.001-78.001h-26v-104.002h26c43.078 0 78.001-34.923 78.001-78.001v-104.002c0-100.515 81.485-182.003 182.003-182.003h26v104.002h-26c-43.078 0-78.001 34.923-78.001 78.001v104.002c0 50.931-20.928 96.966-54.646 130.002 33.716 33.036 54.646 79.072 54.646 130.002zM824.005 578.002v104.002c0 43.078-34.923 78.001-78.001 78.001h-26v104.002h26c100.515 0 182.003-81.485 182.003-182.003v-104.002c0-43.078 34.923-78.001 78.001-78.001h26v-104.002h-26c-43.078 0-78.001-34.923-78.001-78.001v-104.002c0-100.515-81.488-182.003-182.003-182.003h-26v104.002h26c43.078 0 78.001 34.923 78.001 78.001v104.002c0 50.931 20.928 96.966 54.646 130.002-33.716 33.036-54.646 79.072-54.646 130.002zM616.002 603.285c0-57.439-46.562-104.002-104.002-104.002s-104.002 46.562-104.002 104.002c0 57.439 46.562 104.002 104.002 104.002s104.002-46.562 104.002-104.002zM512 448.717c-57.439 0-104.002-46.562-104.002-104.002 0-55.845 26-100.115 105.752-103.88-23.719-33.417-59.441-46.612-105.752-50.944v-61.751c0 0 208.003-18.144 208.003 216.577-0.202 57.441-46.56 104.004-104.002 104.004z" /> -<glyph unicode="" glyph-name="tablerowprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" /> -<glyph unicode="" glyph-name="tablecellprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" /> -<glyph unicode="" glyph-name="table2" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-896v192h896v-192z" /> -<glyph unicode="" glyph-name="tablemergecells" d="M0 896v-896h1024v896h-1024zM384 64v448h576v-448h-576zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192z" /> -<glyph unicode="" glyph-name="tableinsertcolbefore" d="M320 188.8v182.4h-182.4v89.6h182.4v182.4h86.4v-182.4h185.6v-89.6h-185.6v-182.4zM0 896v-896h1024v896h-1024zM640 64h-576v704h576v-704zM960 64h-256v192h256v-192zM960 320h-256v192h256v-192zM960 576h-256v192h256v-192z" /> -<glyph unicode="" glyph-name="tableinsertcolafter" d="M704 643.2v-182.4h182.4v-89.6h-182.4v-182.4h-86.4v182.4h-185.6v89.6h185.6v182.4zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v704h576v-704z" /> -<glyph unicode="" glyph-name="tableinsertrowbefore" d="M691.2 508.8h-144v-144h-70.4v144h-144v67.2h144v144h70.4v-144h144zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM640 64h-256v192h256v-192zM960 64h-256v192h256v-192zM960 316.8h-896v451.2h896v-451.2z" /> -<glyph unicode="" glyph-name="tableinsertrowafter" d="M332.8 323.2h144v144h70.4v-144h144v-67.2h-144v-144h-70.4v144h-144zM0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM64 768h256v-192h-256v192zM960 64h-896v451.2h896v-451.2zM960 576h-256v192h256v-192z" /> -<glyph unicode="" glyph-name="tablesplitcells" d="M0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v448h576v-448zM960 576h-256v192h256v-192zM864 156.8l-60.8-60.8-131.2 131.2-131.2-131.2-60.8 60.8 131.2 131.2-131.2 131.2 60.8 60.8 131.2-131.2 131.2 131.2 60.8-60.8-131.2-131.2z" /> -<glyph unicode="" glyph-name="tabledelete" d="M0 896h1024v-896h-1024v896zM60.8 768v-704h899.2v704h-899.2zM809.6 211.2l-96-96-204.8 204.8-204.8-204.8-96 96 204.8 204.8-204.8 204.8 96 96 204.8-204.8 204.8 204.8 96-96-204.8-204.8z" /> -<glyph unicode="" glyph-name="tableleftheader" d="M0 896v-832h1024v832h-1024zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM640 640h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-256v192h256v-192z" /> -<glyph unicode="" glyph-name="tabletopheader" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192z" /> -<glyph unicode="" glyph-name="tabledeleterow" d="M886.4 572.8l-156.8-156.8 160-160-76.8-76.8-160 160-156.8-156.8-76.8 73.6 160 160-163.2 163.2 76.8 76.8 163.2-163.2 156.8 156.8 73.6-76.8zM0 896v-896h1024v896h-1024zM960 576h-22.4l-64-64h86.4v-192h-89.6l64-64h25.6v-192h-896v192h310.4l64 64h-374.4v192h371.2l-64 64h-307.2v192h896v-192z" /> -<glyph unicode="" glyph-name="tabledeletecol" d="M320 499.2l64-64v-12.8l-64-64v140.8zM640 422.4l64-64v137.6l-64-64v-9.6zM1024 896v-896h-1024v896h1024zM960 768h-256v-51.2l-12.8 12.8-51.2-51.2v89.6h-256v-89.6l-51.2 51.2-12.8-12.8v51.2h-256v-704h256v118.4l35.2-35.2 28.8 28.8v-115.2h256v115.2l48-48 16 16v-83.2h256v707.2zM672 662.4l-156.8-156.8-163.2 163.2-76.8-76.8 163.2-163.2-156.8-156.8 76.8-76.8 156.8 156.8 160-160 76.8 76.8-160 160 156.8 156.8-76.8 76.8z" /> -<glyph unicode="" glyph-name="a11y" d="M960 704v64l-448-128-448 128v-64l320-128v-256l-128-448h64l192 448 192-448h64l-128 448v256zM416 800q0 40 28 68t68 28 68-28 28-68-28-68-68-28-68 28-28 68z" /> -<glyph unicode="" glyph-name="toc" d="M0 896h128v-128h-128v128zM192 896h832v-128h-832v128zM0 512h128v-128h-128v128zM192 512h832v-128h-832v128zM0 128h128v-128h-128v128zM192 128h832v-128h-832v128zM192 704h128v-128h-128v128zM384 704h640v-128h-640v128zM192 320h128v-128h-128v128zM384 320h640v-128h-640v128z" /> -<glyph unicode="" glyph-name="fill" d="M521.6 915.2l-67.2-67.2-86.4 86.4-86.4-86.4 86.4-86.4-368-368 432-432 518.4 518.4-428.8 435.2zM435.2 134.4l-262.4 262.4 35.2 35.2 576 51.2-348.8-348.8zM953.6 409.6c-6.4-6.4-16-16-28.8-32-28.8-32-41.6-64-41.6-89.6v0 0 0 0 0 0 0c0-16 6.4-35.2 22.4-48 12.8-12.8 32-22.4 48-22.4s35.2 6.4 48 22.4 22.4 32 22.4 48v0 0 0 0 0 0 0c0 25.6-12.8 54.4-41.6 89.6-9.6 16-22.4 25.6-28.8 32v0z" /> -<glyph unicode="" glyph-name="borderwidth" d="M0 265.6h1024v-128h-1024v128zM0 32h1024v-64h-1024v64zM0 566.4h1024v-192h-1024v192zM0 928h1024v-256h-1024v256z" /> -<glyph unicode="" glyph-name="line" d="M739.2 627.2l-502.4-502.4h-185.6v185.6l502.4 502.4 185.6-185.6zM803.2 688l-185.6 185.6 67.2 67.2c22.4 22.4 54.4 22.4 76.8 0l108.8-108.8c22.4-22.4 22.4-54.4 0-76.8l-67.2-67.2zM41.6 48h940.8v-112h-940.8v112z" /> -<glyph unicode="" glyph-name="count" d="M0 480h1024v-64h-1024v64zM304 912v-339.2h-67.2v272h-67.2v67.2zM444.8 694.4v-54.4h134.4v-67.2h-201.6v153.6l134.4 64v54.4h-134.4v67.2h201.6v-153.6zM854.4 912v-339.2h-204.8v67.2h137.6v67.2h-137.6v70.4h137.6v67.2h-137.6v67.2zM115.2 166.4c3.2 57.6 38.4 83.2 108.8 83.2 38.4 0 67.2-9.6 86.4-25.6s25.6-35.2 25.6-70.4v-112c0-25.6 0-28.8 9.6-41.6h-73.6c-3.2 9.6-3.2 9.6-6.4 19.2-22.4-19.2-41.6-25.6-70.4-25.6-54.4 0-89.6 32-89.6 76.8s28.8 70.4 99.2 80l38.4 6.4c16 3.2 22.4 6.4 22.4 16 0 12.8-12.8 22.4-38.4 22.4s-41.6-9.6-44.8-28.8h-67.2zM262.4 115.2c-6.4-3.2-12.8-6.4-25.6-6.4l-25.6-6.4c-25.6-6.4-38.4-16-38.4-28.8 0-16 12.8-25.6 35.2-25.6s41.6 9.6 54.4 32v35.2zM390.4 336h73.6v-112c22.4 16 41.6 22.4 67.2 22.4 64 0 105.6-51.2 105.6-124.8 0-76.8-44.8-134.4-108.8-134.4-32 0-48 9.6-67.2 35.2v-28.8h-70.4v342.4zM460.8 121.6c0-41.6 22.4-70.4 51.2-70.4s51.2 28.8 51.2 70.4c0 44.8-19.2 70.4-51.2 70.4-28.8 0-51.2-28.8-51.2-70.4zM851.2 153.6c-3.2 22.4-19.2 35.2-44.8 35.2-32 0-51.2-25.6-51.2-70.4 0-48 19.2-73.6 51.2-73.6 25.6 0 41.6 12.8 44.8 41.6l70.4-3.2c-9.6-60.8-54.4-96-118.4-96-73.6 0-121.6 51.2-121.6 128 0 80 48 131.2 124.8 131.2 64 0 108.8-35.2 112-96h-67.2z" /> -<glyph unicode="" glyph-name="reload" d="M889.68 793.68c-93.608 102.216-228.154 166.32-377.68 166.32-282.77 0-512-229.23-512-512h96c0 229.75 186.25 416 416 416 123.020 0 233.542-53.418 309.696-138.306l-149.696-149.694h352v352l-134.32-134.32zM928 448c0-229.75-186.25-416-416-416-123.020 0-233.542 53.418-309.694 138.306l149.694 149.694h-352v-352l134.32 134.32c93.608-102.216 228.154-166.32 377.68-166.32 282.77 0 512 229.23 512 512h-96z" /> -<glyph unicode="" glyph-name="translate" d="M553.6 304l-118.4 118.4c80 89.6 137.6 195.2 172.8 304h137.6v92.8h-326.4v92.8h-92.8v-92.8h-326.4v-92.8h518.4c-32-89.6-80-176-147.2-249.6-44.8 48-80 99.2-108.8 156.8h-92.8c35.2-76.8 80-147.2 137.6-211.2l-236.8-233.6 67.2-67.2 233.6 233.6 144-144c3.2 0 38.4 92.8 38.4 92.8zM816 540.8h-92.8l-208-560h92.8l51.2 140.8h220.8l51.2-140.8h92.8l-208 560zM691.2 214.4l76.8 201.6 76.8-201.6h-153.6z" /> -<glyph unicode="" glyph-name="drag" d="M576 896h128v-128h-128v128zM576 640h128v-128h-128v128zM320 640h128v-128h-128v128zM576 384h128v-128h-128v128zM320 384h128v-128h-128v128zM320 128h128v-128h-128v128zM576 128h128v-128h-128v128zM320 896h128v-128h-128v128z" /> -<glyph unicode="" glyph-name="home" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" /> -<glyph unicode="" glyph-name="books" d="M576.234 670.73l242.712 81.432 203.584-606.784-242.712-81.432zM0 64h256v704h-256v-704zM64 640h128v-64h-128v64zM320 64h256v704h-256v-704zM384 640h128v-64h-128v64z" /> -<glyph unicode="" glyph-name="upload" d="M839.432 760.57c27.492-27.492 50.554-78.672 55.552-120.57h-318.984v318.984c41.898-4.998 93.076-28.060 120.568-55.552l142.864-142.862zM512 576v384h-368c-44 0-80-36-80-80v-864c0-44 36-80 80-80h672c44 0 80 36 80 80v560h-384zM576 192v-192h-192v192h-160l256 256 256-256h-160z" /> -<glyph unicode="" glyph-name="editimage" d="M768 416v-352h-640v640h352l128 128h-512c-52.8 0-96-43.2-96-96v-704c0-52.8 43.2-96 96-96h704c52.798 0 96 43.2 96 96v512l-128-128zM864 960l-608-608v-160h160l608 608c0 96-64 160-160 160zM416 320l-48 48 480 480 48-48-480-480z" /> -<glyph unicode="" glyph-name="bubble" d="M928 896h-832c-52.8 0-96-43.2-96-96v-512c0-52.8 43.2-96 96-96h160v-256l307.2 256h364.8c52.8 0 96 43.2 96 96v512c0 52.8-43.2 96-96 96zM896 320h-379.142l-196.858-174.714v174.714h-192v448h768v-448z" /> -<glyph unicode="" glyph-name="user" d="M622.826 257.264c-22.11 3.518-22.614 64.314-22.614 64.314s64.968 64.316 79.128 150.802c38.090 0 61.618 91.946 23.522 124.296 1.59 34.054 48.96 267.324-190.862 267.324s-192.45-233.27-190.864-267.324c-38.094-32.35-14.57-124.296 23.522-124.296 14.158-86.486 79.128-150.802 79.128-150.802s-0.504-60.796-22.614-64.314c-71.22-11.332-337.172-128.634-337.172-257.264h896c0 128.63-265.952 245.932-337.174 257.264z" /> -<glyph unicode="" glyph-name="lock" d="M592 512h-16v192c0 105.87-86.13 192-192 192h-128c-105.87 0-192-86.13-192-192v-192h-16c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h544c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48zM192 704c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-192h-256v192z" /> -<glyph unicode="" glyph-name="unlock" d="M768 896c105.87 0 192-86.13 192-192v-192h-128v192c0 35.29-28.71 64-64 64h-128c-35.29 0-64-28.71-64-64v-192h16c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48h-544c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h400v192c0 105.87 86.13 192 192 192h128z" /> -<glyph unicode="" glyph-name="settings" d="M448 832v16c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576zM256 704v128h128v-128h-128zM832 528c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-576v-128h576v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h192v128h-192v16zM640 384v128h128v-128h-128zM448 208c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576v16zM256 64v128h128v-128h-128z" /> -<glyph unicode="" glyph-name="remove2" d="M192-64h640l64 704h-768zM640 832v128h-256v-128h-320v-192l64 64h768l64-64v192h-320zM576 832h-128v64h128v-64z" /> -<glyph unicode="" glyph-name="menu" d="M384 896h256v-256h-256zM384 576h256v-256h-256zM384 256h256v-256h-256z" /> -<glyph unicode="" glyph-name="warning" d="M1009.956 44.24l-437.074 871.112c-16.742 29.766-38.812 44.648-60.882 44.648s-44.14-14.882-60.884-44.648l-437.074-871.112c-33.486-59.532-5-108.24 63.304-108.24h869.308c68.302 0 96.792 48.708 63.302 108.24zM512 64c-35.346 0-64 28.654-64 64 0 35.348 28.654 64 64 64 35.348 0 64-28.652 64-64 0-35.346-28.652-64-64-64zM556 256h-88l-20 256c0 35.346 28.654 64 64 64s64-28.654 64-64l-20-256z" /> -<glyph unicode="" glyph-name="question" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" /> -<glyph unicode="" glyph-name="pluscircle" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384zM768 384h-192v-192h-128v192h-192v128h192v192h128v-192h192z" /> -<glyph unicode="" glyph-name="info" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM448 768h128v-128h-128v128zM640 128h-256v64h64v256h-64v64h192v-320h64v-64z" /> -<glyph unicode="" glyph-name="notice" d="M1024 224l-288 736h-448l-288-288v-448l288-288h448l288 288v448l-288 288zM576 128h-128v128h128v-128zM576 384h-128v384h128v-384z" /> -<glyph unicode="" glyph-name="drop" d="M864.626 486.838c-65.754 183.44-205.11 348.15-352.626 473.162-147.516-125.012-286.87-289.722-352.626-473.162-40.664-113.436-44.682-236.562 12.584-345.4 65.846-125.14 198.632-205.438 340.042-205.438s274.196 80.298 340.040 205.44c57.27 108.838 53.25 231.962 12.586 345.398zM738.764 201.044c-43.802-83.252-132.812-137.044-226.764-137.044-55.12 0-108.524 18.536-152.112 50.652 13.242-1.724 26.632-2.652 40.112-2.652 117.426 0 228.668 67.214 283.402 171.242 44.878 85.292 40.978 173.848 23.882 244.338 14.558-28.15 26.906-56.198 36.848-83.932 22.606-63.062 40.024-156.34-5.368-242.604z" /> -<glyph unicode="" glyph-name="minus" d="M0 544v-192c0-17.672 14.328-32 32-32h960c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32h-960c-17.672 0-32-14.328-32-32z" /> -<glyph unicode="" glyph-name="plus" d="M992 576h-352v352c0 17.672-14.328 32-32 32h-192c-17.672 0-32-14.328-32-32v-352h-352c-17.672 0-32-14.328-32-32v-192c0-17.672 14.328-32 32-32h352v-352c0-17.672 14.328-32 32-32h192c17.672 0 32 14.328 32 32v352h352c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32z" /> -<glyph unicode="" glyph-name="arrowup" d="M0 320l192-192 320 320 320-320 192 192-511.998 512z" /> -<glyph unicode="" glyph-name="arrowright" d="M384 960l-192-192 320-320-320-320 192-192 512 512z" /> -<glyph unicode="" glyph-name="arrowdown" d="M1024 576l-192 192-320-320-320 320-192-192 512-511.998z" /> -<glyph unicode="" glyph-name="arrowup2" d="M768 320l-256 256-256-256z" /> -<glyph unicode="" glyph-name="arrowdown2" d="M256 576l256-256 256 256z" /> -<glyph unicode="" glyph-name="menu2" d="M256 704l256-256 256 256zM255.996 384.004l256-256 256 256z" /> -<glyph unicode="" glyph-name="newtab" d="M704 384l128 128v-512h-768v768h512l-128-128h-256v-512h512zM960 896v-352l-130.744 130.744-354.746-354.744h-90.51v90.512l354.744 354.744-130.744 130.744z" /> -<glyph unicode="" glyph-name="rotateleft" d="M607.998 831.986c-212.070 0-383.986-171.916-383.986-383.986h-191.994l246.848-246.848 246.848 246.848h-191.994c0 151.478 122.798 274.276 274.276 274.276 151.48 0 274.276-122.798 274.276-274.276 0-151.48-122.796-274.276-274.276-274.276v-109.71c212.070 0 383.986 171.916 383.986 383.986s-171.916 383.986-383.986 383.986z" /> -<glyph unicode="" glyph-name="rotateright" d="M416.002 831.986c212.070 0 383.986-171.916 383.986-383.986h191.994l-246.848-246.848-246.848 246.848h191.994c0 151.478-122.798 274.276-274.276 274.276-151.48 0-274.276-122.798-274.276-274.276 0-151.48 122.796-274.276 274.276-274.276v-109.71c-212.070 0-383.986 171.916-383.986 383.986s171.916 383.986 383.986 383.986z" /> -<glyph unicode="" glyph-name="flipv" d="M0 576h1024v384zM1024 0v384h-1024z" /> -<glyph unicode="" glyph-name="fliph" d="M576 960v-1024h384zM0-64h384v1024z" /> -<glyph unicode="" glyph-name="zoomin" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM448 768h-128v-128h-128v-128h128v-128h128v128h128v128h-128z" /> -<glyph unicode="" glyph-name="zoomout" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM192 640h384v-128h-384z" /> -<glyph unicode="" glyph-name="sharpen" d="M768 832h-512l-256-256 512-576 512 576-256 256zM512 181.334v2.666h-2.37l-14.222 16h16.592v16h-30.814l-14.222 16h45.036v16h-59.258l-14.222 16h73.48v16h-87.704l-14.222 16h101.926v16h-116.148l-14.222 16h130.37v16h-144.592l-14.222 16h158.814v16h-173.038l-14.222 16h187.26v16h-201.482l-14.222 16h215.704v16h-229.926l-14.222 16h244.148v16h-258.372l-14.222 16h272.594v16h-286.816l-14.222 16h301.038v16h-315.26l-14.222 16h329.482v16h-343.706l-7.344 8.262 139.072 139.072h211.978v-3.334h215.314l16-16h-231.314v-16h247.314l16-16h-263.314v-16h279.314l16-16h-295.314v-16h311.314l16-16h-327.314v-16h343.312l7.738-7.738-351.050-394.928z" /> -<glyph unicode="" glyph-name="options" d="M64 768h896v-192h-896zM64 512h896v-192h-896zM64 256h896v-192h-896z" /> -<glyph unicode="" glyph-name="sun" d="M512 128c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64s-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM512 768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64s64-28.654 64-64v-64c0-35.346-28.654-64-64-64zM960 512c35.346 0 64-28.654 64-64s-28.654-64-64-64h-64c-35.348 0-64 28.654-64 64s28.652 64 64 64h64zM192 448c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64s28.654 64 64 64h64c35.346 0 64-28.654 64-64zM828.784 221.726l45.256-45.258c24.992-24.99 24.992-65.516 0-90.508-24.994-24.992-65.518-24.992-90.51 0l-45.256 45.256c-24.992 24.99-24.992 65.516 0 90.51 24.994 24.992 65.518 24.992 90.51 0zM195.216 674.274l-45.256 45.256c-24.994 24.994-24.994 65.516 0 90.51s65.516 24.994 90.51 0l45.256-45.256c24.994-24.994 24.994-65.516 0-90.51s-65.516-24.994-90.51 0zM828.784 674.274c-24.992-24.992-65.516-24.992-90.51 0-24.992 24.994-24.992 65.516 0 90.51l45.256 45.254c24.992 24.994 65.516 24.994 90.51 0 24.992-24.994 24.992-65.516 0-90.51l-45.256-45.254zM195.216 221.726c24.992 24.992 65.518 24.992 90.508 0 24.994-24.994 24.994-65.52 0-90.51l-45.254-45.256c-24.994-24.992-65.516-24.992-90.51 0s-24.994 65.518 0 90.508l45.256 45.258zM512 704c-141.384 0-256-114.616-256-256 0-141.382 114.616-256 256-256 141.382 0 256 114.618 256 256 0 141.384-114.616 256-256 256zM512 288c-88.366 0-160 71.634-160 160s71.634 160 160 160 160-71.634 160-160-71.634-160-160-160z" /> -<glyph unicode="" glyph-name="moon" d="M715.812 895.52c-60.25 34.784-124.618 55.904-189.572 64.48 122.936-160.082 144.768-384.762 37.574-570.42-107.2-185.67-312.688-279.112-512.788-252.68 39.898-51.958 90.376-97.146 150.628-131.934 245.908-141.974 560.37-57.72 702.344 188.198 141.988 245.924 57.732 560.372-188.186 702.356z" /> -<glyph unicode="" glyph-name="contrast" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM128 448c0 212.078 171.922 384 384 384v-768c-212.078 0-384 171.922-384 384z" /> -<glyph unicode="" glyph-name="remove22" d="M893.254 738.746l-90.508 90.508-290.746-290.744-290.746 290.744-90.508-90.506 290.746-290.748-290.746-290.746 90.508-90.508 290.746 290.746 290.746-290.746 90.508 90.51-290.744 290.744z" /> -<glyph unicode="" glyph-name="arrowleft" d="M672-64l192 192-320 320 320 320-192 192-512-512z" /> -<glyph unicode="" glyph-name="resize2" d="M0 896v-384c0-35.346 28.654-64 64-64s64 28.654 64 64v229.488l677.488-677.488h-229.488c-35.346 0-64-28.652-64-64 0-35.346 28.654-64 64-64h384c35.346 0 64 28.654 64 64v384c0 35.348-28.654 64-64 64s-64-28.652-64-64v-229.488l-677.488 677.488h229.488c35.346 0 64 28.654 64 64s-28.652 64-64 64h-384c-35.346 0-64-28.654-64-64z" /> -<glyph unicode="" glyph-name="crop" d="M832 704l192 192-64 64-192-192h-448v192h-128v-192h-192v-128h192v-512h512v-192h128v192h192v128h-192v448zM320 640h320l-320-320v320zM384 256l320 320v-320h-320z" /> -</font></defs></svg> \ No newline at end of file diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf deleted file mode 100755 index 61a48a511c224a81c89a7fb1d8101f9f16fbfd13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18644 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 J80A&3{|o!94>$k- diff --git a/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff b/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff deleted file mode 100755 index aace5d9c5c14e60c934cdb1a146fe468730eb4e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18720 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 diff --git a/public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif b/public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif deleted file mode 100755 index 606348c7f53dba169a9aca7279a2a973f4b07bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53 zcmZ?wbhEHbWM^P!XkcUjg8%>jEB<5wG8q|kKzxu40~1eAV&{y5e`l1KFoiKNSOWkz C+YCGa diff --git a/public/static/tinymce4.7.5/skins/lightgray/img/loader.gif b/public/static/tinymce4.7.5/skins/lightgray/img/loader.gif deleted file mode 100755 index c69e937232b24ea30f01c68bbd2ebc798dcecfcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 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 T)6_**#cgp_+?JL9(ew3BlNF>u diff --git a/public/static/tinymce4.7.5/skins/lightgray/img/object.gif b/public/static/tinymce4.7.5/skins/lightgray/img/object.gif deleted file mode 100755 index cccd7f023fb80908cb33bb7d9604236cd21b7ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmV;J0B8S4Nk%w1VG#fg0J9GO<>lo+KR<78Z?v?uS65g4{r%Y3*xlXT%F4>`@9+2b z_ww@cot>Tk|Nk>HGXMYpA^8LW000jFEC2ui01*HU000C<(8)=wd#<&tyXIMjHBV`d zBSi|xsj3(;nD0kQ0aJq8eLH~x02P|t2!_J&Wqb%0io?#xD<upxn@Dup`7Ge3XH0HH G0028|K14A9 diff --git a/public/static/tinymce4.7.5/skins/lightgray/img/trans.gif b/public/static/tinymce4.7.5/skins/lightgray/img/trans.gif deleted file mode 100755 index 388486517fa8da13ebd150e8f65d5096c3e10c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x diff --git a/public/static/tinymce4.7.5/skins/lightgray/skin.min.css b/public/static/tinymce4.7.5/skins/lightgray/skin.min.css deleted file mode 100755 index 4ad815bf..00000000 --- a/public/static/tinymce4.7.5/skins/lightgray/skin.min.css +++ /dev/null @@ -1 +0,0 @@ -.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#595959;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2)}.mce-statusbar>.mce-container-body{display:flex;padding-right:16px}.mce-statusbar>.mce-container-body .mce-path{flex:1}.mce-wordcount{font-size:inherit;text-transform:uppercase;padding:8px 0}div.mce-edit-area{background:#FFF;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative;font-size:11px}.mce-fullscreen .mce-resizehandle{display:none}.mce-statusbar .mce-flow-layout-item{margin:0}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid #c5c5c5;width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:white}.mce-grid td.mce-grid-cell div{border:1px solid #c5c5c5;width:15px;height:15px;margin:0;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#91bbe9}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#91bbe9}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#c5c5c5;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#91bbe9;background:#bdd6f2}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#8b8b8b}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-container b{font-weight:bold}.mce-container p{margin-bottom:5px}.mce-container a{cursor:pointer;color:#2276d2}.mce-container a:hover{text-decoration:underline}.mce-container ul{margin-left:15px}.mce-container .mce-table-striped{border-collapse:collapse;margin:10px}.mce-container .mce-table-striped thead>tr{background-color:#fafafa}.mce-container .mce-table-striped thead>tr th{font-weight:bold}.mce-container .mce-table-striped td,.mce-container .mce-table-striped th{padding:5px}.mce-container .mce-table-striped tr:nth-child(even){background-color:#fafafa}.mce-container .mce-table-striped tbody>tr:hover{background-color:#e1e1e1}.mce-branding{font-size:inherit;text-transform:uppercase;white-space:pre;padding:8px 0}.mce-branding a{font-size:inherit;color:inherit}.mce-top-part{position:relative}.mce-top-part::before{content:'';position:absolute;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);top:0;right:0;bottom:0;left:0;pointer-events:none}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-rtl .mce-statusbar>.mce-container-body>*:last-child{padding-right:0;padding-left:10px}.mce-rtl .mce-path{text-align:right;padding-right:16px}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.5;filter:alpha(opacity=50);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#2276d2}.mce-croprect-handle-move:focus{outline:1px solid #2276d2}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:#c5c5c5;border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:#c5c5c5;border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#fff;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#fff;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:#c5c5c5;border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#fff;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:#c5c5c5;border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#fff;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-edit-aria-container>.mce-container-body{display:flex}.mce-edit-aria-container>.mce-container-body .mce-edit-area{flex:1}.mce-edit-aria-container>.mce-container-body .mce-sidebar>.mce-container-body{display:flex;align-items:stretch;height:100%}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel{min-width:250px;max-width:250px;position:relative}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel>.mce-container-body{position:absolute;width:100%;height:100%;overflow:auto;top:0;left:0}.mce-sidebar-toolbar{border:0 solid #c5c5c5;border-left-width:1px}.mce-sidebar-toolbar .mce-btn{border-left:0;border-right:0}.mce-sidebar-toolbar .mce-btn.mce-active,.mce-sidebar-toolbar .mce-btn.mce-active:hover{background-color:#555c66}.mce-sidebar-toolbar .mce-btn.mce-active button,.mce-sidebar-toolbar .mce-btn.mce-active:hover button,.mce-sidebar-toolbar .mce-btn.mce-active button i,.mce-sidebar-toolbar .mce-btn.mce-active:hover button i{color:white;text-shadow:1px 1px none}.mce-sidebar-panel{border:0 solid #c5c5c5;border-left-width:1px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #f3f3f3;border:0 solid #c5c5c5;background-color:#fff}.mce-floatpanel{position:absolute;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2)}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);top:0;left:0;background:#FFF;border:1px solid #c5c5c5;border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#c5c5c5;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#FFF}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#FFF}#mce-modal-block.mce-in{opacity:.5;filter:alpha(opacity=50);zoom:1}.mce-window-move{cursor:move}.mce-window{-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#FFF;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#9b9b9b}.mce-close:hover i{color:#bdbdbd}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#FFF;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#e2e4e7}.mce-window .mce-btn:hover{border-color:#c5c5c5}.mce-window .mce-btn:focus{border-color:#2276d2}.mce-window-body .mce-btn,.mce-foot .mce-btn{border-color:#c5c5c5}.mce-foot .mce-btn.mce-primary{border-color:transparent}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1;margin-top:1px}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-inner{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#595959}.mce-bar{display:block;width:0;height:100%;background-color:#dfdfdf;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#fff;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#c5c5c5;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0;box-sizing:border-box}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ECB}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#595959}.mce-notification .mce-progress .mce-bar-container{border-color:#c5c5c5}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#595959}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ECB}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#9b9b9b;cursor:pointer}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b3b3b3;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);background:white;display:inline-block;*display:inline;*zoom:1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-btn:hover,.mce-btn:active{background:white;color:#595959;border-color:#e2e4e7}.mce-btn:focus{background:white;color:#595959;border-color:#e2e4e7}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover,.mce-btn.mce-active:focus,.mce-btn.mce-active:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#555c66;color:white;border-color:transparent}.mce-btn.mce-active button,.mce-btn.mce-active:hover button,.mce-btn.mce-active i,.mce-btn.mce-active:hover i{color:white}.mce-btn:hover .mce-caret{border-top-color:#b5bcc2}.mce-btn.mce-active .mce-caret,.mce-btn.mce-active:hover .mce-caret{border-top-color:white}.mce-btn button{padding:4px 6px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#595959;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:white;border:1px solid transparent;border-color:transparent;background-color:#2276d2}.mce-primary:hover,.mce-primary:focus{background-color:#1e6abc;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#1e6abc;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-primary button,.mce-primary button i{color:white;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #b5bcc2;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #b5bcc2;border-top:0}.mce-btn-flat{border:0;background:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-toolbar .mce-btn-group{margin:0;padding:2px 0}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:0;margin-left:2px}.mce-btn-group{margin-left:2px}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:white;text-indent:-10em;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#595959;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid #2276d2;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#bdbdbd}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#bdbdbd}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid black;background:white;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal;font-size:inherit}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#595959;font-size:inherit;text-transform:uppercase}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#555c66;color:white}.mce-path .mce-divider{display:inline;font-size:inherit}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid #c5c5c5;width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #e2e4e7}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar{border:1px solid #e2e4e7}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-menubar .mce-menubtn button span{color:#595959}.mce-menubar .mce-caret{border-top-color:#b5bcc2}.mce-menubar .mce-active .mce-caret,.mce-menubar .mce-menubtn:hover .mce-caret{border-top-color:#b5bcc2}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#e2e4e7;background:white;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-menubar .mce-menubtn.mce-active{border-bottom:none;z-index:65537}div.mce-menubtn.mce-opened{border-bottom-color:white;z-index:65537}.mce-menubtn button{color:#595959}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-rtl .mce-menubtn.mce-fixed-width span{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 4px 6px 4px;clear:both;font-weight:normal;line-height:20px;color:#595959;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-caret{margin-top:4px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #595959}.mce-menu-item .mce-menu-shortcut{display:inline-block;padding:0 10px 0 20px;color:#aaa}.mce-menu-item .mce-ico{padding-right:4px}.mce-menu-item:hover,.mce-menu-item:focus{background:#ededee}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:#aaa}.mce-menu-item:hover .mce-text,.mce-menu-item:focus .mce-text,.mce-menu-item:hover .mce-ico,.mce-menu-item:focus .mce-ico{color:#595959}.mce-menu-item.mce-selected{background:#ededee}.mce-menu-item.mce-selected .mce-text,.mce-menu-item.mce-selected .mce-ico{color:#595959}.mce-menu-item.mce-active.mce-menu-item-normal{background:#555c66}.mce-menu-item.mce-active.mce-menu-item-normal .mce-text,.mce-menu-item.mce-active.mce-menu-item-normal .mce-ico{color:white}.mce-menu-item.mce-active.mce-menu-item-checkbox .mce-ico{visibility:visible}.mce-menu-item.mce-disabled,.mce-menu-item.mce-disabled:hover{background:white}.mce-menu-item.mce-disabled:focus,.mce-menu-item.mce-disabled:hover:focus{background:#ededee}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled:hover .mce-text,.mce-menu-item.mce-disabled .mce-ico,.mce-menu-item.mce-disabled:hover .mce-ico{color:#aaa}.mce-menu-item.mce-menu-item-preview.mce-active{border-left:5px solid #555c66;background:white}.mce-menu-item.mce-menu-item-preview.mce-active .mce-text,.mce-menu-item.mce-menu-item-preview.mce-active .mce-ico{color:#595959}.mce-menu-item.mce-menu-item-preview.mce-active:hover{background:#ededee}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:#595959}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #595959;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:#595959}.mce-rtl .mce-menu-item .mce-ico{padding-right:0;padding-left:4px}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:180px;background:white;border:1px solid #c5c9cf;border:1px solid #e2e4e7;z-index:1002;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);max-height:500px;overflow:auto;overflow-x:hidden}.mce-menu.mce-animate{opacity:.01;transform:rotateY(10deg) rotateX(-10deg);transform-origin:left top}.mce-menu.mce-menu-align .mce-menu-shortcut,.mce-menu.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block}.mce-menu.mce-in.mce-animate{opacity:1;transform:rotateY(0) rotateX(0);transition:opacity .075s ease,transform .1s ease}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-rtl .mce-menu-item .mce-ico{padding-right:0;padding-left:4px}.mce-rtl.mce-menu-align .mce-caret,.mce-rtl .mce-menu-shortcut{right:auto;left:0}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#595959}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #c5c5c5;background:#fff;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #c5c5c5;background:#e6e6e6;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{border-color:#2276d2}.mce-spacer{visibility:hidden}.mce-splitbtn:hover .mce-open{border-left:1px solid #e2e4e7}.mce-splitbtn .mce-open{border-left:1px solid transparent;padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open:focus{border-left:1px solid #e2e4e7}.mce-splitbtn .mce-open:hover,.mce-splitbtn .mce-open:active{border-left:1px solid #e2e4e7}.mce-splitbtn.mce-active:hover .mce-open{border-left:1px solid white}.mce-splitbtn.mce-opened{border-color:#e2e4e7}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#fff}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#fff;padding:8px 15px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#FDFDFD}.mce-tab.mce-active{background:#FDFDFD;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-tab:focus{color:#2276d2}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#595959}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#2276d2;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#bdbdbd}.mce-rtl .mce-textbox{text-align:right;direction:rtl}.mce-dropzone{border:3px dashed gray;text-align:center}.mce-dropzone span{text-transform:uppercase;display:inline-block;vertical-align:middle}.mce-dropzone:after{content:"";height:100%;display:inline-block;vertical-align:middle}.mce-dropzone.mce-disabled{opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-dropzone.mce-disabled.mce-dragenter{cursor:not-allowed}.mce-browsebutton{position:relative;overflow:hidden}.mce-browsebutton button{position:relative;z-index:1}.mce-browsebutton input{opacity:0;filter:alpha(opacity=0);zoom:1;position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#595959}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e915"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\e93c"}.mce-i-drop:before{content:"\e935"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-fill:before{content:"\e902"}.mce-i-borderwidth:before{content:"\e903"}.mce-i-line:before{content:"\e904"}.mce-i-count:before{content:"\e905"}.mce-i-translate:before{content:"\e907"}.mce-i-drag:before{content:"\e908"}.mce-i-home:before{content:"\e90b"}.mce-i-upload:before{content:"\e914"}.mce-i-bubble:before{content:"\e91c"}.mce-i-user:before{content:"\e91d"}.mce-i-lock:before{content:"\e926"}.mce-i-unlock:before{content:"\e927"}.mce-i-settings:before{content:"\e928"}.mce-i-remove2:before{content:"\e92a"}.mce-i-menu:before{content:"\e92d"}.mce-i-warning:before{content:"\e930"}.mce-i-question:before{content:"\e931"}.mce-i-pluscircle:before{content:"\e932"}.mce-i-info:before{content:"\e933"}.mce-i-notice:before{content:"\e934"}.mce-i-arrowup:before{content:"\e93b"}.mce-i-arrowdown:before{content:"\e93d"}.mce-i-arrowup2:before{content:"\e93f"}.mce-i-arrowdown2:before{content:"\e940"}.mce-i-menu2:before{content:"\e941"}.mce-i-newtab:before{content:"\e961"}.mce-i-a11y:before{content:"\e900"}.mce-i-plus:before{content:"\e93a"}.mce-i-insert:before{content:"\e93a"}.mce-i-minus:before{content:"\e939"}.mce-i-books:before{content:"\e911"}.mce-i-reload:before{content:"\e906"}.mce-i-toc:before{content:"\e901"}.mce-i-checkmark:before{content:"\e033"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-insert{font-size:14px}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#BBB}.mce-rtl .mce-filepicker input{direction:ltr}/*# sourceMappingURL=skin.min.css.map */ \ No newline at end of file diff --git a/public/static/tinymce4.7.5/skins/lightgray/skin.min.css.map b/public/static/tinymce4.7.5/skins/lightgray/skin.min.css.map deleted file mode 100755 index c8763dcc..00000000 --- a/public/static/tinymce4.7.5/skins/lightgray/skin.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["./src/skins/lightgray/main/less/desktop/Reset.less","./src/skins/lightgray/main/less/desktop/Variables.less","./src/skins/lightgray/main/less/desktop/Mixins.less","./src/skins/lightgray/main/less/desktop/Animations.less","./src/skins/lightgray/main/less/desktop/TinyMCE.less","./src/skins/lightgray/main/less/desktop/CropRect.less","./src/skins/lightgray/main/less/desktop/ImagePanel.less","./src/skins/lightgray/main/less/desktop/Arrows.less","./src/skins/lightgray/main/less/desktop/Sidebar.less","./src/skins/lightgray/main/less/desktop/Container.less","./src/skins/lightgray/main/less/desktop/Scrollable.less","./src/skins/lightgray/main/less/desktop/Panel.less","./src/skins/lightgray/main/less/desktop/FloatPanel.less","./src/skins/lightgray/main/less/desktop/Window.less","./src/skins/lightgray/main/less/desktop/ToolTip.less","./src/skins/lightgray/main/less/desktop/Progress.less","./src/skins/lightgray/main/less/desktop/Notification.less","./src/skins/lightgray/main/less/desktop/AbsoluteLayout.less","./src/skins/lightgray/main/less/desktop/Button.less","./src/skins/lightgray/main/less/desktop/ButtonGroup.less","./src/skins/lightgray/main/less/desktop/Checkbox.less","./src/skins/lightgray/main/less/desktop/ComboBox.less","./src/skins/lightgray/main/less/desktop/ColorBox.less","./src/skins/lightgray/main/less/desktop/ColorButton.less","./src/skins/lightgray/main/less/desktop/ColorPicker.less","./src/skins/lightgray/main/less/desktop/Path.less","./src/skins/lightgray/main/less/desktop/FieldSet.less","./src/skins/lightgray/main/less/desktop/FitLayout.less","./src/skins/lightgray/main/less/desktop/FlowLayout.less","./src/skins/lightgray/main/less/desktop/Iframe.less","./src/skins/lightgray/main/less/desktop/InfoBox.less","./src/skins/lightgray/main/less/desktop/Label.less","./src/skins/lightgray/main/less/desktop/MenuBar.less","./src/skins/lightgray/main/less/desktop/MenuButton.less","./src/skins/lightgray/main/less/desktop/MenuItem.less","./src/skins/lightgray/main/less/desktop/Throbber.less","./src/skins/lightgray/main/less/desktop/Menu.less","./src/skins/lightgray/main/less/desktop/ListBox.less","./src/skins/lightgray/main/less/desktop/ResizeHandle.less","./src/skins/lightgray/main/less/desktop/SelectBox.less","./src/skins/lightgray/main/less/desktop/Slider.less","./src/skins/lightgray/main/less/desktop/Spacer.less","./src/skins/lightgray/main/less/desktop/SplitButton.less","./src/skins/lightgray/main/less/desktop/StackLayout.less","./src/skins/lightgray/main/less/desktop/TabPanel.less","./src/skins/lightgray/main/less/desktop/TextBox.less","./src/skins/lightgray/main/less/desktop/DropZone.less","./src/skins/lightgray/main/less/desktop/BrowseButton.less","./src/skins/lightgray/main/less/desktop/Icons.less","./src/skins/lightgray/main/less/desktop/FilePicker.less"],"names":[],"mappings":"AAEA,CAAC,GAAS,WAAY,CAAC,GAAS,UAAW,GAAG,CAAC,GAAS,QAAS,CAAC,GAAS,OAAQ,GAAG,CAAC,GAAS,OAC9F,QAAA,CAAW,SAAA,CAAY,QAAA,CAAW,SAAA,CAClC,kBAAA,CAAqB,sBAAA,CACrB,oBAAA,CAAuB,aAAA,CACvB,YCU+B,2CDV/B,CACA,cAAA,CAAuB,gBAAA,CAAmB,UAAA,CAC1C,eAAA,CAAkB,UAAA,CAAa,WAAA,CAC/B,kBAAA,CAAqB,cAAA,CACrB,uCAAA,CACA,kBAAA,CAAqB,kBAAA,CACrB,eAAA,CACA,2BAAA,CACA,8BAAA,CACA,sBAAA,CACA,aAAA,CACA,eAGF,CAAC,GAAS,OAAQ,QAChB,0BAAA,CACA,6BAAA,CACA,sBAGF,CAAC,GAAS,UAAW,EAAC,eACpB,qBAAA,CACA,wBAAA,CACA,mBAAA,CACA,iBEyBF,WACE,oBAAA,CACA,wBAAA,CACA,oBAAA,CACA,qBAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,aC7DF,CAAC,GAAS,MACR,SAAA,CDqCA,sCAAA,CACA,+BCnCA,CAJD,GAAS,KAIP,CAAC,GAAS,IACT,UCPJ,CAAC,GAAS,SAER,kBAAA,YACA,kBAGF,CAAC,GAAS,YACR,QAAA,CAAW,SAAA,CAAY,QAAA,CACvB,eAAA,CACA,WAAA,CACA,YAGF,GAAG,CAAC,GAAS,YACX,cAAA,CACA,KAAA,CAAQ,MAAA,CACR,UAAA,CACA,YAGF,CAAC,GAAS,SACR,aAAA,CFaA,+CAAA,CACA,4CAAA,CACA,wCEVF,CAAC,GAAS,UAAW,EAAG,GAAS,gBAC/B,YAAA,CACA,mBAFF,CAAC,GAAS,UAAW,EAAG,GAAS,eAI/B,EAAC,GAAS,MACR,OAIJ,CAAC,GAAS,WACR,iBAAA,CACA,wBAAA,CACA,cAGF,GAAG,CAAC,GAAS,WACX,eAAA,CACA,YAGF,CAAC,GAAS,WACR,kBAGF,CAAC,GAAS,UAAW,EAAC,GAAS,gBAC7B,iBAAA,CACA,eAGF,CAAC,GAAS,WAAY,EAAC,GAAS,cAC9B,aAGF,CAAC,GAAS,UAAW,EAAC,GAAS,kBAC7B,SAKF,CAAC,GAAS,SACR,yBAGF,CAAC,GAAS,QAAS,IACjB,cAAA,CACA,wBAAA,CACA,UAAA,CACA,WAAA,CACA,gBAAA,CACA,iBAAA,CACA,qBAAA,CACA,YAGF,CAAC,GAAS,QAAS,GAAG,KACpB,kBAGF,CAAC,GAAS,QAAS,GAAE,OACnB,iBAGF,CAAC,GAAS,KAAM,GAAE,CAAC,GAAS,UAAW,KACrC,wBAAA,CACA,UAAA,CAAa,WAAA,CACb,QAAA,CACA,eAEA,CAND,GAAS,KAAM,GAAE,CAAC,GAAS,UAAW,IAMpC,OACC,qBAGF,CAVD,GAAS,KAAM,GAAE,CAAC,GAAS,UAAW,IAUpC,WACC,mBAIJ,CAAC,GAAS,MACR,kBAAA,CACA,yBAFF,CAAC,GAAS,KAIR,GACE,aAAA,CACA,6BAEA,CARH,GAAS,KAIR,EAIG,OAAQ,CARZ,GAAS,KAIR,EAIY,OACR,qBAKN,CAAC,GAAS,aACR,mBADF,CAAC,GAAS,YAGR,GACE,oBAAA,CACA,UAAA,CAAa,YALjB,CAAC,GAAS,YAQR,EAAC,OARH,CAAC,GAAS,YAQC,EAAC,CAAC,GAAS,QAClB,oBAAA,CACA,mBAIJ,CAAC,GAAS,aACR,kBAGF,GAAG,CAAC,GAAS,gBACX,WAGF,CAAC,GAAS,eAAgB,KACxB,iBAAA,CACA,qBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,cAGF,CAAC,GAAS,WACR,YAAa,gCASf,CAAC,GAAS,YAAa,EAAC,GAAS,kBAC/B,gBAKF,CAAC,GAAS,UAAW,GACnB,iBAGF,CAAC,GAAS,UAAW,GACnB,kBAGF,CAAC,GAAS,UAAW,GACnB,cAAA,CACA,cACA,CAHD,GAAS,UAAW,EAGlB,OACC,0BAIJ,CAAC,GAAS,UAAW,IACnB,iBAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,wBAAA,CACA,YAFF,CAAC,GAAS,UAAW,EAAC,GAAS,cAG7B,MAAM,IACJ,yBAJJ,CAAC,GAAS,UAAW,EAAC,GAAS,cAG7B,MAAM,GAEJ,IACE,iBANN,CAAC,GAAS,UAAW,EAAC,GAAS,cAS7B,IATF,CAAC,GAAS,UAAW,EAAC,GAAS,cASzB,IACF,YAVJ,CAAC,GAAS,UAAW,EAAC,GAAS,cAY7B,GAAE,UAAU,OACV,yBAbJ,CAAC,GAAS,UAAW,EAAC,GAAS,cAe7B,MAAM,GAAI,OACR,yBAIJ,CAAC,GAAS,UACR,iBAAA,CACA,wBAAA,CACA,eAAA,CACA,cAJF,CAAC,GAAS,SAMR,GACE,iBAAA,CACA,cAIJ,CAAC,GAAS,UACR,kBAGF,CAAC,GAAS,SAAS,SAEjB,QAAS,EAAT,CACA,iBAAA,CF7LA,+CAAA,CACA,4CAAA,CACA,uCAAA,CE6LA,KAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,oBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,WACvB,MAAA,CACA,WAGF,CAAC,GAAS,IACR,EAAC,GAAS,UAAW,EAAG,GAAS,eAC/B,EAAG,YACD,eAAA,CACA,kBAJN,CAAC,GAAS,IAQR,EAAC,GAAS,MACR,gBAAA,CACA,mBCvPJ,CAAC,GAAS,oBACR,iBAAA,CACA,KAAA,CACA,OAGF,CAAC,GAAS,iBACR,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,UAAA,CAAa,WAAA,CACb,uBAGF,CAAC,GAAS,oBACR,wBAAA,CACA,oBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,oBACR,wBAAA,CACA,qBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,oBACR,wBAAA,CACA,uBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,oBACR,wBAAA,CACA,sBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,sBACR,iBAAA,CACA,WAAA,CACA,SAGF,CAAC,GAAS,gBH9CR,UAAA,CAEA,wBAAA,CACA,MAAA,CG6CA,iBAAA,CACA,iBAGF,CAAC,GAAS,gBAAgB,OACxB,qBAGF,CAAC,GAAS,qBAAqB,OAC7B,0BC1DF,CAAC,GAAS,YACR,aAAA,CACA,iBAGF,CAAC,GAAS,eACR,iBAAA,CACA,eAAgB,sGAGlB,CAAC,GAAS,WAAY,KACpB,kBAGF,CAAC,GAAS,UAAU,CAAC,GAAS,IAAK,EAAC,GAAS,KAC3C,aAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,gBAAA,CACA,cAAA,CACA,YCrBF,CAAC,GAAS,UACR,gBAGF,CAAC,GAAS,YACR,iBAGF,CAAC,GAAS,MAAM,QAChB,CAAC,GAAS,MAAM,OACd,iBAAA,CACA,QAAA,CACA,aAAA,CACA,OAAA,CACA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,QAAS,GAGX,CAAC,GAAS,MAAM,CAAC,GAAS,SAAS,QACjC,QAAA,CACA,2BAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QACnC,WAAA,CACA,wBAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,SAAS,OACjC,QAAA,CACA,wBAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OACnC,WAAA,CACA,qBAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QACrC,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OACnC,SAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QACnC,SAEF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OACnC,SAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,QACtC,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,OACpC,SAAA,CACA,SAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,QACpC,UAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,OACpC,UAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QAC1E,SAAA,CACA,OAAA,CACA,0BAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OAC1E,SAAA,CACA,OAAA,CACA,uBAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,YAC/D,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,QAC3E,UAAA,CACA,OAAA,CACA,yBAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,OAC3E,UAAA,CACA,OAAA,CACA,sBAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,aAC/D,kBC/GF,CAAC,GAAS,oBAAqB,EAAG,GAAS,gBACzC,aADF,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAGzC,EAAC,GAAS,WACR,OAJJ,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAOzC,EAAC,GAAS,QAAS,EAAG,GAAS,gBAC7B,YAAA,CACA,mBAAA,CACA,YAVJ,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAazC,EAAC,GAAS,eACR,eAAA,CACA,eAAA,CACA,kBAhBJ,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAazC,EAAC,GAAS,cAKR,EAAG,GAAS,gBACV,iBAAA,CACA,UAAA,CAAa,WAAA,CACb,aAAA,CACA,KAAA,CAAQ,OAKd,CAAC,GAAS,iBACR,sBAAA,CACA,sBAFF,CAAC,GAAS,gBAIR,EAAC,GAAS,KACR,aAAA,CACA,eANJ,CAAC,GAAS,gBASR,EAAC,GAAS,IAAI,CAAC,GAAS,QAT1B,CAAC,GAAS,gBASyB,EAAC,GAAS,IAAI,CAAC,GAAS,OAAO,OAC9D,yBAVJ,CAAC,GAAS,gBASR,EAAC,GAAS,IAAI,CAAC,GAAS,OAGtB,QAZJ,CAAC,GAAS,gBASyB,EAAC,GAAS,IAAI,CAAC,GAAS,OAAO,MAG9D,QAZJ,CAAC,GAAS,gBASR,EAAC,GAAS,IAAI,CAAC,GAAS,OAGd,OAAO,GAZnB,CAAC,GAAS,gBASyB,EAAC,GAAS,IAAI,CAAC,GAAS,OAAO,MAGtD,OAAO,GACb,WAAA,CACA,yBAKN,CAAC,GAAS,eACR,sBAAA,CACA,sBChDF,CAAC,GAAS,WAAY,CAAC,GAAS,gBAC9B,cAGF,CAAC,GAAS,YACR,gBCLF,CAAC,GAAS,WACR,iBAAA,CACA,SAAA,CACA,WAAA,CACA,OAAA,CACA,SAAA,CRJA,UAAA,CAEA,wBAAA,CACA,OQKF,CAAC,GAAS,aACR,QAAA,CACA,UAAA,CACA,QAAA,CACA,UAAA,CACA,UAAA,CACA,WAGF,CAAC,GAAS,iBACR,iBAAA,CACA,qBAAA,CACA,qBAAA,CACA,+BAAA,CACA,SAAA,CACA,YAIF,CAAC,GAAS,YAAa,EAAC,GAAS,iBAC/B,UAAA,CACA,WAGF,CAAC,GAAS,UAAU,OAAQ,CAAC,GAAS,UAAU,CAAC,GAAS,QACxD,qBAAA,CRjCA,UAAA,CAEA,wBAAA,CACA,OQmCF,CAAC,GAAS,QACR,kBCxCF,CAAC,GAAS,OACR,sBAAA,CACA,sBAAA,CACA,sBCHF,CAAC,GAAS,YACR,iBAAA,CV+BA,+CAAA,CACA,4CAAA,CACA,wCU7BF,CAAC,GAAS,WAAW,CAAC,GAAS,OAC7B,eAKF,CAAC,GAAS,WAAY,EAAC,GAAS,OAChC,CAAC,GAAS,WAAY,EAAC,GAAS,MAAM,OACpC,iBAAA,CACA,aAAA,CACA,OAAA,CACA,QAAA,CACA,wBAAA,CACA,mBAGF,CAAC,GAAS,WAAY,EAAC,GAAS,OAC9B,kBAGF,CAAC,GAAS,WAAY,EAAC,GAAS,MAAM,OACpC,iBAAA,CACA,QAAS,GAGX,CAAC,GAAS,WAAW,CAAC,GAAS,SVmB7B,OAAQ,2DAAR,CACA,sBAAA,CAlBA,+CAAA,CACA,4CAAA,CACA,uCAAA,CUAA,KAAA,CACA,MAAA,CACA,eAAA,CACA,wBAAA,CACA,kCAEA,CAVD,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,QACT,eAAA,CACA,cAEA,CAdH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAIP,EAAG,GAAS,OACZ,QAAA,CACA,iBAAA,CACA,kBAAA,CACA,2BAAA,CACA,oCAAA,CACA,UAEA,CAtBL,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAIP,EAAG,GAAS,MAQX,OACC,OAAA,CACA,iBAAA,CACA,kBAAA,CACA,yBAIJ,CA9BH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAoBR,CAAC,GAAS,OAAS,kBACpB,CA/BH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAqBR,CAAC,GAAS,MAAO,EAAG,GAAS,OAAS,UAEvC,CAjCH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAuBR,CAAC,GAAS,KAAO,iBAClB,CAlCH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAwBR,CAAC,GAAS,IAAK,EAAG,GAAS,OAAS,UAAA,CAAa,UChEtD,CAAC,GAAS,YACR,QAAA,CAAW,SAAA,CAAY,QAAA,CACvB,eAAA,CACA,YAGF,GAAG,CAAC,GAAS,YACX,cAAA,CACA,KAAA,CAAQ,OAGV,CAAC,GAAS,aXVR,SAAA,CAEA,uBAAA,CACA,MAAA,CWSA,cAAA,CACA,MAAA,CAAS,KAAA,CACT,UAAA,CAAa,WAAA,CACb,gBAGF,CAAC,GAAS,YAAY,CAAC,GAAS,IXlB9B,UAAA,CAEA,wBAAA,CACA,OWmBF,CAAC,GAAS,aACR,YAGF,CAAC,GAAS,QXKR,+CAAA,CACA,4CAAA,CACA,uCAAA,CAeA,OAAQ,2DAAR,CACA,sBAAA,CWnBA,eAAA,CACA,cAAA,CACA,KAAA,CAAQ,MAAA,CACR,SAAA,CACA,UAAW,SAAX,CACA,yDAGF,CAAC,GAAS,OAAO,CAAC,GAAS,IACzB,UAAW,QAAX,CACA,UAGF,CAAC,GAAS,aACR,gBAAA,CACA,+BAAA,CACA,kBAGF,CAAC,GAAS,YAAa,EAAC,GAAS,OAC/B,iBAAA,CACA,OAAA,CACA,KAAA,CACA,WAAA,CACA,UAAA,CACA,iBAAA,CACA,eAPF,CAAC,GAAS,YAAa,EAAC,GAAS,MAS/B,GACE,cAIJ,CAAC,GAAS,MAAM,MAAO,GACrB,cAGF,CAAC,GAAS,YAAa,EAAC,GAAS,OAC/B,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,iCAAA,CACA,mBAGF,CAAC,GAAS,OAAQ,EAAC,GAAS,gBAC1B,cAGF,CAAC,GAAS,MACR,aAAA,CACA,qBAAA,CACA,6BAIF,CAAC,GAAS,YAAa,EAAC,GAAS,OAC/B,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,WAAA,CACA,SAAA,CACA,YAGF,CAAC,GAAS,OAAQ,QAChB,UAAA,CACA,YAOF,CAAC,GAAS,YAAa,EAAC,GAAS,SAC/B,qBAGF,CAAC,GAAS,OACR,EAAC,GAAS,IAAI,OACZ,qBAFJ,CAAC,GAAS,OAKR,EAAC,GAAS,IAAI,OACZ,qBAIJ,CAAC,GAAS,YAAa,EAAC,GAAS,KAAM,CAAC,GAAS,KAAM,EAAC,GAAS,KAC/D,qBAGF,CAAC,GAAS,KAAM,EAAC,GAAS,IAAI,CAAC,GAAS,SACtC,yBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,OAC9C,iBAAA,CACA,UAAA,CACA,UAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,OAC9C,SAAA,CACA,QAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,OAC9C,aAAA,CACA,iBC7IF,CAAC,GAAS,SACR,iBAAA,CACA,WAAA,CZDA,UAAA,CAEA,wBAAA,CACA,MAAA,CYAA,eAGF,CAAC,GAAS,eACR,cAAA,CACA,qBAAA,CACA,WAAA,CACA,eAAA,CACA,uBAAA,CACA,iBAAA,CACA,mBAOF,CAAC,GAAS,eZWR,uBAAA,CACA,oBAAA,CACA,gBYTF,CAAC,GAAS,eACR,iBAAA,CACA,OAAA,CACA,QAAA,CACA,aAAA,CACA,uBAGF,CAAC,GAAS,iBACR,yBAGF,CAAC,GAAS,iBACR,sBAGF,CAAC,GAAS,iBACR,uBAGF,CAAC,GAAS,iBACR,wBAGF,CAAC,GAAS,YAAa,CAAC,GAAS,YAC/B,kBAGF,CAAC,GAAS,YAAa,CAAC,GAAS,YAC/B,iBAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,KAAA,CACA,QAAA,CACA,gBAAA,CACA,yBAAA,CACA,eAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,KAAA,CACA,SAAA,CACA,yBAAA,CACA,eAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,KAAA,CACA,UAAA,CACA,yBAAA,CACA,eAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,QAAA,CACA,QAAA,CACA,gBAAA,CACA,sBAAA,CACA,kBAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,QAAA,CACA,SAAA,CACA,sBAAA,CACA,kBAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,QAAA,CACA,UAAA,CACA,sBAAA,CACA,kBAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,OAAA,CACA,OAAA,CACA,eAAA,CACA,uBAAA,CACA,iBAAA,CACA,4BAAA,CACA,gCAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,MAAA,CACA,OAAA,CACA,eAAA,CACA,wBAAA,CACA,gBAAA,CACA,4BAAA,CACA,gCClIF,CAAC,GAAS,UACR,oBAAA,CACA,iBAAA,CACA,YAGF,CAAC,GAAS,SAAU,EAAC,GAAS,eAC5B,oBAAA,CACA,WAAA,CACA,WAAA,CACA,gBAAA,CACA,qBAAA,CACA,gBAIF,CAAC,GAAS,SAAU,EAAC,GAAS,MAC5B,oBAAA,CACA,eAAA,CACA,kBAAA,CACA,cAAA,CACA,UAAA,CACA,cAGF,CAAC,GAAS,KACR,aAAA,CACA,OAAA,CACA,WAAA,CACA,wBAAA,CbSA,iCAAA,CACA,0BcvCF,CAAC,GAAS,cACR,iBAAA,CACA,qBAAA,CACA,WAAA,CACA,cAAA,CACA,gBAAA,CACA,kBAAA,CACA,oBAAA,CACA,wDAAA,CACA,SAAA,CACA,sBAGF,CAAC,GAAS,aAAa,CAAC,GAAS,IAC/B,UAGF,CAAC,GAAS,sBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,mBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,sBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,oBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,aAAa,CAAC,GAAS,WAC/B,mBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,KAChC,eAGF,CAAC,GAAS,oBdSR,oBAAA,CACA,wBAAA,CACA,oBAAA,CACA,qBAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,YAAA,CcdA,oBAAA,CACA,cAAA,CACA,sBAAA,CACA,iBAAA,CACA,kBAAA,CACA,cAGF,CAAC,GAAS,mBAAoB,GAC5B,yBAAA,CACA,eAGF,CAAC,GAAS,aAAc,EAAC,GAAS,UAChC,iBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,MACpD,eAGF,CAAC,GAAS,aAAc,GAAG,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,MAC/E,cAGF,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,eACpD,qBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KAC7E,yBAGF,CAAC,GAAS,qBAAsB,GAAG,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,MAC/F,cAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,eAC5D,qBAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KACrF,yBAGF,CAAC,GAAS,kBAAmB,GAAG,CAAC,GAAS,kBAAmB,EAAC,GAAS,SAAU,EAAC,GAAS,MACzF,cAGF,CAAC,GAAS,kBAAmB,EAAC,GAAS,SAAU,EAAC,GAAS,eACzD,qBAGF,CAAC,GAAS,kBAAmB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KAClF,yBAGF,CAAC,GAAS,qBAAsB,GAAG,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,MAC/F,cAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,eAC5D,qBAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KACrF,yBAGF,CAAC,GAAS,mBAAoB,GAAG,CAAC,GAAS,mBAAoB,EAAC,GAAS,SAAU,EAAC,GAAS,MAC3F,cAGF,CAAC,GAAS,mBAAoB,EAAC,GAAS,SAAU,EAAC,GAAS,eAC1D,qBAGF,CAAC,GAAS,mBAAoB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KACnF,yBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,OAChC,iBAAA,CACA,OAAA,CACA,SAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,aAAA,CACA,eCxIF,CAAC,GAAS,YACR,kBAGF,IAAK,EAAC,GAAS,iBAAkB,CAAC,GAAS,SACzC,kBAGF,CAAC,GAAS,SACR,SAAA,CAAY,WAGd,CAAC,GAAS,eAAe,CAAC,GAAS,YACjC,gBCbF,CAAC,GAAS,KACR,wBAAA,CACA,4DAAA,CACA,iBAAA,CACA,4CAAA,CACA,gBAAA,ChBsCA,oBAAA,CACA,eAAA,CACA,OAAA,CAbA,uBAAA,CACA,oBAAA,CACA,gBgBvBA,CAXD,GAAS,IAWP,OAAQ,CAXV,GAAS,IAWE,QACR,gBAAA,CACA,aAAA,CACA,qBAGF,CAjBD,GAAS,IAiBP,OACC,gBAAA,CACA,aAAA,CACA,qBAGF,CAvBD,GAAS,IAuBP,CAAC,GAAS,SAAU,QAAQ,CAvB9B,GAAS,IAuBsB,CAAC,GAAS,SAAS,MAAO,QACtD,cAAA,ChBQF,uBAAA,CACA,oBAAA,CACA,eAAA,CAjCA,UAAA,CAEA,wBAAA,CACA,OgByBA,CA7BD,GAAS,IA6BP,CAAC,GAAS,QACX,CA9BD,GAAS,IA8BP,CAAC,GAAS,OAAO,OAClB,CA/BD,GAAS,IA+BP,CAAC,GAAS,OAAO,OAClB,CAhCD,GAAS,IAgCP,CAAC,GAAS,OAAO,QhBAlB,uBAAA,CACA,oBAAA,CACA,eAAA,CgBAE,kBAAA,CACA,WAAA,CACA,yBAGF,CAvCD,GAAS,IAuCP,CAAC,GAAS,OAAQ,QAAQ,CAvC5B,GAAS,IAuCoB,CAAC,GAAS,OAAO,MAAO,QACpD,CAxCD,GAAS,IAwCP,CAAC,GAAS,OAAQ,GAAG,CAxCvB,GAAS,IAwCe,CAAC,GAAS,OAAO,MAAO,GAC7C,YAGF,CA5CD,GAAS,IA4CP,MAAO,EAAC,GAAS,OAChB,yBAGF,CAhDD,GAAS,IAgDP,CAAC,GAAS,OAAQ,EAAC,GAAS,OAAQ,CAhDtC,GAAS,IAgD8B,CAAC,GAAS,OAAO,MAAO,EAAC,GAAS,OACtE,uBAIJ,CAAC,GAAS,IAAK,QACb,eAAA,CACA,cAAA,CACA,gBAAA,CACA,iBAAA,CACA,cAAA,CACA,aAAA,CACA,iBAAA,CAGA,gBAAA,CACA,wBACA,CAZD,GAAS,IAAK,OAYZ,mBACC,QAAA,CACA,UAIJ,CAAC,GAAS,IAAK,GACb,yBAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,cAC1B,eAGF,CAAC,GAAS,SACR,WAAA,CACA,4BAAA,CACA,wBAAA,CACA,yBAEA,CAND,GAAS,QAMP,OAAQ,CANV,GAAS,QAME,OACR,wBAAA,CACA,yBAGF,CAXD,GAAS,QAWP,CAAC,GAAS,SAAU,QAAQ,CAX9B,GAAS,QAWsB,CAAC,GAAS,SAAS,MAAO,QACtD,cAAA,ChB3DF,uBAAA,CACA,oBAAA,CACA,eAAA,CAjCA,UAAA,CAEA,wBAAA,CACA,OgB4FA,CAjBD,GAAS,QAiBP,CAAC,GAAS,QAAS,CAjBrB,GAAS,QAiBa,CAAC,GAAS,OAAO,OAAQ,CAjB/C,GAAS,QAiBuC,IAAI,eAAqB,QACtE,wBAAA,ChBjEF,uBAAA,CACA,oBAAA,CACA,gBgBoEF,CAAC,GAAS,QAAS,QAAQ,CAAC,GAAS,QAAS,OAAO,GACnD,WAAA,CACA,yBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,KACvB,iBAAA,CACA,mBAAA,CACA,cAGF,CAAC,GAAS,UAAW,QACnB,gBAAA,CACA,cAAA,CACA,mBAIF,CAAC,GAAS,UAAW,GACnB,eAGF,CAAC,GAAS,UAAW,QACnB,eAAA,CACA,cAAA,CACA,oBAGF,CAAC,GAAS,UAAW,GACnB,gBAAA,CACA,kBAAA,CACA,kBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,OACvB,cAAA,CACA,cAGF,CAAC,GAAS,UAAW,EAAC,GAAS,OAC7B,cAAA,CACA,cAGF,CAAC,GAAS,OhBvGR,oBAAA,CACA,eAAA,CACA,OAAA,CgBuGA,OAAA,CAAU,QAAA,CACV,kBAAA,CACA,4BAAA,CACA,kCAAA,CACA,iCAAA,CACA,QAAS,GAGX,CAAC,GAAS,SAAU,EAAC,GAAS,OAC5B,sBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,IACxB,+BAAA,CACA,aAGF,CAAC,GAAS,UACR,QAAA,CACA,sBAAA,ChBvIA,uBAAA,CACA,oBAAA,CACA,eAAA,CgBwIA,YAGF,CAAC,GAAS,SAAS,OAAQ,CAAC,GAAS,SAAS,CAAC,GAAS,QAAS,CAAC,GAAS,SAAS,OAAQ,CAAC,GAAS,SAAS,QAC7G,QAAA,CACA,kBAAA,CACA,WAAA,ChBhJA,uBAAA,CACA,oBAAA,CACA,gBgBkJF,CAAC,GAAS,aAAc,EAAC,GAAS,KAChC,kBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,IAAK,QAC5B,cC3LF,CAAC,GAAS,QAAS,EAAC,GAAS,WAC3B,QAAA,CACA,cAWF,CAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,gBAAA,CACA,QAAA,CAEA,gBAcF,CAAC,GAAS,UAAU,IAAI,eACtB,6BAAA,CACA,cAAA,CACA,gBAGF,CAAC,GAAS,WAGR,gBAYF,CAAC,GAAS,UAAW,EAAC,GAAS,IAAI,CAAC,GAAS,kBAC3C,SAKF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAW,EAAC,GAAS,KAC5C,aAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAW,EAAC,GAAS,OAC5C,eAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,IAAI,eACrC,gBAAA,CACA,8BAAA,CACA,iBAAA,CACA,iBCvEF,CAAC,GAAS,UACR,eAGF,CAAC,CAAC,GAAS,YACT,gBAAA,CACA,wBAAA,ClB0BA,uBAAA,CACA,oBAAA,CACA,eAAA,CkBzBA,sBAAA,CACA,iBAAA,CACA,gBAGF,CAAC,GAAS,QAAS,EAAC,CAAC,GAAS,YAC5B,aAAA,CACA,cAAA,CACA,gBAAA,CACA,cAGF,CAAC,GAAS,SAAS,MAAO,EAAC,CAAC,GAAS,YAAa,CAAC,GAAS,SAAS,CAAC,GAAS,MAAO,EAAC,CAAC,GAAS,YAC/F,wBAAA,ClBUA,uBAAA,CACA,oBAAA,CACA,gBkBRF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,GAAS,OAAQ,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,CAAC,GAAS,YACzG,cAGF,CAAC,GAAS,SAAU,EAAC,GAAS,OAC5B,sBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,UACvB,aAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,CAAC,GAAS,YACxB,iBC1CF,CAAC,GAAS,UACR,iBAAA,CnB0CA,oBAAA,CACA,eAAA,CACA,OAAA,CAbA,uBAAA,CACA,oBAAA,CACA,eAAA,CmB7BA,aAGF,CAAC,GAAS,SAAU,OAClB,wBAAA,CACA,0BAAA,CACA,YAGF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,OACrC,cAOF,CAAC,GAAS,SAAU,EAAC,GAAS,KAC5B,wBAAA,CACA,aAAA,CAEA,SAGF,CAAC,GAAS,SAAU,QAClB,iBAAA,CACA,iBAGF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,GAAS,IAAK,QACpD,cAAA,CnBHA,uBAAA,CACA,oBAAA,CACA,eAAA,CAjCA,UAAA,CAEA,wBAAA,CACA,OmBoCF,CAAC,GAAS,SAAU,EAAC,GAAS,QAC5B,iBAAA,CACA,SAAA,CACA,OAAA,CACA,gBAAA,CACA,eAAA,CACA,cAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,eAGF,CAAC,GAAS,SAAS,CAAC,GAAS,WAAY,OACvC,mBAGF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,GAAS,QAC/C,WAGF,CAAC,GAAS,SAAU,EAAC,GAAS,OAAO,CAAC,GAAS,WAC7C,cAGF,CAAC,GAAS,SAAU,EAAC,GAAS,OAAO,CAAC,GAAS,aAC7C,cAGF,CAAC,GAAS,KAAK,CAAC,GAAS,eACvB,YAAA,CACA,YAAA,CACA,iBAHF,CAAC,GAAS,KAAK,CAAC,GAAS,cAKvB,EAAC,GAAS,WACR,uBAAA,CACA,eAPJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAUvB,EAAC,GAAS,eACR,UAXJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAcvB,EAAC,GAAS,MACR,eAfJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAkBvB,EAAC,GAAS,gBAlBZ,CAAC,GAAS,KAAK,CAAC,GAAS,cAkBI,EAAC,GAAS,eAAgB,GACnD,eAnBJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAsBvB,EAAC,GAAS,KAAM,GACd,eC5FJ,CAAC,GAAS,SAAU,GAClB,wBAAA,CACA,UAAA,CAAa,YCFf,CAAC,GAAS,YAAa,EAAC,GAAS,KAC/B,kBAGF,CAAC,GAAS,kBACR,WAQF,CAAC,GAAS,YAAa,EAAC,GAAS,SAC/B,iBAAA,CACA,aAAA,CACA,iBAAA,CACA,QAAA,CACA,OAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CACA,UAAA,CACA,gBAGF,CAAC,GAAS,YAAY,CAAC,GAAS,UAAW,EAAC,GAAS,SACnD,iBAAA,CACA,eAAA,CACA,WAmBF,CAAC,GAAS,IAAK,EAAC,GAAS,aACvB,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,SAC9C,aAAA,CACA,eAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAY,CAAC,GAAS,UAAW,EAAC,GAAS,SAClE,aAAA,CACA,eAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,MAC9C,gBAAA,CACA,iBAAA,CACA,cCpEF,CAAC,GAAS,aACR,iBAAA,CACA,WAAA,CACA,aAGF,CAAC,GAAS,gBACR,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,SAAA,CACA,WAAA,CACA,wBAAA,CACA,gBAAA,CACA,gBAGF,CAAC,GAAS,qBACR,WAGF,CAAC,GAAS,sBAAuB,CAAC,GAAS,sBACzC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,KAAA,CACA,OAGF,CAAC,GAAS,sBACR,OAAQ,yEAAwE,uBAAuB,YAAvG,CACA,WAAY,6GAAZ,CACA,WAAY,qDAGd,CAAC,GAAS,sBACR,OAAQ,yEAAwE,yBAAyB,UAAzG,CACA,WAAY,6GAAZ,CACA,WAAY,gDAGd,CAAC,GAAS,uBACR,eAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CACA,sBAAA,CACA,kBAGF,CAAC,GAAS,uBACR,iBAAA,CACA,UAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAGF,CAAC,GAAS,eACR,iBAAA,CACA,KAAA,CAAQ,OAAA,CACR,UAAA,CACA,WAAA,CACA,wBAAA,CACA,iBAGF,CAAC,GAAS,sBACR,eAAA,CACA,iBAAA,CACA,KAAA,CACA,SAAA,CACA,UAAA,CACA,sBAAA,CACA,gBAAA,CACA,UAAA,CACA,YC5EF,CAAC,GAAS,MvB2CR,oBAAA,CACA,eAAA,CACA,OAAA,CuB3CA,WAAA,CACA,kBAAA,CACA,kBAGF,CAAC,GAAS,KAAM,EAAC,GAAS,KACxB,oBAAA,CACA,kBAGF,CAAC,GAAS,KAAM,EAAC,GAAS,WACxB,qBAGF,CAAC,GAAS,WvB2BR,oBAAA,CACA,eAAA,CACA,OAAA,CuB3BA,cAAA,CACA,aAAA,CACA,iBAAA,CACA,yBAGF,CAAC,GAAS,UAAU,OAClB,0BAGF,CAAC,GAAS,UAAU,OAClB,kBAAA,CACA,YAGF,CAAC,GAAS,KAAM,EAAC,GAAS,SACxB,cAAA,CACA,kBAGF,CAAC,GAAS,SAAU,EAAC,GAAS,WAC5B,WAKF,CAAC,GAAS,IAAK,EAAC,GAAS,MACvB,cC7CF,CAAC,GAAS,UACR,uBAIF,CAAC,GAAS,SAAU,EAAG,GAAS,gBAC9B,iBAGF,CAAC,GAAS,gBACR,eAAA,CACA,oBCXF,CAAC,GAAS,YzB2CR,oBAAA,CACA,eAAA,CACA,QyBzCF,CAAC,GAAS,iBACR,kBCLF,CAAC,GAAS,kB1B2CR,oBAAA,CACA,eAAA,CACA,Q0BzCF,CAAC,GAAS,kBACR,qBAGF,CAAC,GAAS,iBAAiB,CAAC,GAAS,MACnC,iBAGF,CAAC,GAAS,aACR,mBAGF,CAAC,GAAS,eAAgB,EAAC,GAAS,aAClC,mBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,aACvB,gBAAA,CACA,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,kBACvB,qBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,iBAAiB,CAAC,GAAS,MAClD,gBChCF,CAAC,GAAS,QACR,sBAAA,CACA,UAAA,CAAa,YCFf,CAAC,GAAS,S5B2CR,oBAAA,CACA,eAAA,CACA,OAAA,C4B3CA,4CAAA,CACA,eAAA,CACA,qBAJF,CAAC,GAAS,QAMR,KACE,aAAA,CACA,WARJ,CAAC,GAAS,QAMR,IAIE,QACE,iBAAA,CACA,OAAA,CAAU,SAAA,CACV,cAAA,CACA,eAAA,CACA,aAfN,CAAC,GAAS,QAMR,IAYE,OAAM,OACJ,0BAKN,CAAC,GAAS,QAAQ,CAAC,GAAS,SAC1B,KACE,kBAFJ,CAAC,GAAS,QAAQ,CAAC,GAAS,SAK1B,QACE,cAIJ,CAAC,GAAS,QAAQ,CAAC,GAAS,SAC1B,kBAAA,CACA,qBAFF,CAAC,GAAS,QAAQ,CAAC,GAAS,QAI1B,KACE,cAIJ,CAAC,GAAS,QAAQ,CAAC,GAAS,SAC1B,kBAAA,CACA,qBAFF,CAAC,GAAS,QAAQ,CAAC,GAAS,QAI1B,KACE,cAIJ,CAAC,GAAS,QAAQ,CAAC,GAAS,OAC1B,kBAAA,CACA,qBAFF,CAAC,GAAS,QAAQ,CAAC,GAAS,MAI1B,KACE,cAMJ,CAAC,GAAS,IAAK,EAAC,GAAS,QACvB,KACE,gBAAA,CACA,cClEJ,CAAC,GAAS,O7B2CR,oBAAA,CACA,eAAA,CACA,OAAA,C6B3CA,4CAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YACxB,cAGF,CAAC,GAAS,MAAM,CAAC,GAAS,UACxB,WAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WACxB,qBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,SACxB,cAGF,CAAC,GAAS,MAAM,CAAC,GAAS,SACxB,cAGF,CAAC,GAAS,MAAM,CAAC,GAAS,OACxB,cAKF,CAAC,GAAS,IAAK,EAAC,GAAS,OACvB,gBAAA,CACA,cClCF,CAAC,GAAS,SACR,yBAGF,CAAC,GAAS,QAAS,EAAC,GAAS,SAC3B,wBAAA,CACA,sBAAA,C9B0BA,uBAAA,CACA,oBAAA,CACA,eAAA,C8BzBA,YAGF,CAAC,GAAS,QAAS,EAAC,GAAS,QAAS,OAAO,MAC3C,cAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,yBAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,EAAC,GAAS,OAD0B,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,MACzE,EAAC,GAAS,OACR,yBAIJ,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,OAAQ,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,CAAC,GAAS,QAAS,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,OACxI,oBAAA,CACA,gBAAA,CACA,WAAA,C9BGA,uBAAA,CACA,oBAAA,CACA,gB8BDF,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,CAAC,GAAS,QAC7C,kBAAA,CACA,cCnCF,GAAG,CAAC,GAAS,QAAQ,CAAC,GAAS,QAC7B,yBAAA,CACA,cAGF,CAAC,GAAS,QAAS,QACjB,cAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,UAAW,MACrC,eAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,YAAa,MACvC,oBAAA,CACA,iBAAA,CACA,sBAAA,CACA,WAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,YAAY,CAAC,GAAS,UAAW,MAC3D,WAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,gBAKF,CAAC,GAAS,IACR,EAAC,GAAS,QAAS,QACjB,aAAA,CACA,iBAHJ,CAAC,GAAS,IAMR,EAAC,GAAS,QAAQ,CAAC,GAAS,YAAa,MACvC,aAAA,CACA,iBCtCJ,CAAC,GAAS,WACR,aAAA,CACA,uBAAA,CACA,UAAA,CACA,kBAAA,CACA,gBAAA,CACA,aAAA,CACA,kBAAA,CACA,cAAA,CACA,kBAAA,CACA,iCAAA,CACA,kBAXF,CAAC,GAAS,UAaR,EAAC,GAAS,OACR,cAAA,CACA,gBAAA,CACA,gCAAA,CACA,mCAAA,CACA,8BAlBJ,CAAC,GAAS,UAqBR,EAAC,GAAS,eACR,oBAAA,CACA,qBAAA,CACA,WAxBJ,CAAC,GAAS,UA2BR,EAAC,GAAS,KACR,kBAGF,CA/BD,GAAS,UA+BP,OAAQ,CA/BV,GAAS,UA+BE,OACR,mBADF,CA/BD,GAAS,UA+BP,MAGC,EAAC,GAAS,eAHH,CA/BV,GAAS,UA+BE,MAGR,EAAC,GAAS,eACR,WAJJ,CA/BD,GAAS,UA+BP,MAOC,EAAC,GAAS,MAPH,CA/BV,GAAS,UA+BE,MAOR,EAAC,GAAS,MAPZ,CA/BD,GAAS,UA+BP,MAOkB,EAAC,GAAS,KAPpB,CA/BV,GAAS,UA+BE,MAOS,EAAC,GAAS,KACzB,cAIJ,CA3CD,GAAS,UA2CP,CAAC,GAAS,UACT,mBADF,CA3CD,GAAS,UA2CP,CAAC,GAAS,SAGT,EAAC,GAAS,MAHZ,CA3CD,GAAS,UA2CP,CAAC,GAAS,SAGQ,EAAC,GAAS,KACzB,cAIJ,CAnDD,GAAS,UAmDP,CAAC,GAAS,OAAO,CAAC,GAAS,kBAC1B,mBADF,CAnDD,GAAS,UAmDP,CAAC,GAAS,OAAO,CAAC,GAAS,iBAG1B,EAAC,GAAS,MAHZ,CAnDD,GAAS,UAmDP,CAAC,GAAS,OAAO,CAAC,GAAS,iBAGT,EAAC,GAAS,KACzB,YAIJ,CA3DD,GAAS,UA2DP,CAAC,GAAS,OAAO,CAAC,GAAS,mBAC1B,EAAC,GAAS,KACR,mBAIJ,CAjED,GAAS,UAiEP,CAAC,GAAS,UAAW,CAjEvB,GAAS,UAiEe,CAAC,GAAS,SAAS,OACxC,iBAEA,CApEH,GAAS,UAiEP,CAAC,GAAS,SAGR,OAAD,CApEH,GAAS,UAiEe,CAAC,GAAS,SAAS,MAGvC,OACC,mBAJJ,CAjED,GAAS,UAiEP,CAAC,GAAS,SAOT,EAAC,GAAS,MAPU,CAjEvB,GAAS,UAiEe,CAAC,GAAS,SAAS,MAOxC,EAAC,GAAS,MAPZ,CAjED,GAAS,UAiEP,CAAC,GAAS,SAOQ,EAAC,GAAS,KAPP,CAjEvB,GAAS,UAiEe,CAAC,GAAS,SAAS,MAOvB,EAAC,GAAS,KACzB,WAIJ,CA7ED,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,QACrC,6BAAA,CACA,iBAFF,CA7ED,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,OAIrC,EAAC,GAAS,MAJZ,CA7ED,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,OAIpB,EAAC,GAAS,KACzB,cAGF,CArFH,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,OAQpC,OACC,mBAKN,CAAC,GAAS,gBACR,UAAA,CACA,eAAA,CACA,sBAAA,CACA,mBAJF,CAAC,GAAS,eAMR,GACE,WAIJ,CAAC,GAAS,oBACR,aAAA,CACA,sBAAA,CACA,kBAAA,CACA,gBAGF,CAAC,GAAS,UAAU,MAAO,GAAG,CAAC,GAAS,UAAU,CAAC,GAAS,SAAU,GAAG,CAAC,GAAS,UAAU,MAAO,GAClG,cAGF,GAAG,CAAC,GAAS,KAAM,EAAC,GAAS,eAAgB,CAAC,GAAS,cAAc,OACnE,QAAA,CACA,SAAA,CACA,UAAA,CACA,cAAA,CACA,eAAA,CACA,sBAAA,CACA,uCAAA,CACA,cAAA,CACA,YAGF,GAAG,CAAC,GAAS,KAAM,EAAC,GAAS,UAAW,GACtC,iBAGF,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAIhC,CAAC,GAAS,KAAK,CAAC,GAAS,KACvB,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,WACvB,gBAAA,CACA,aAAA,CACA,0BAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAW,EAAC,GAAS,OAC5C,eAAA,CACA,cAAA,CACA,8BAAA,CACA,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,CAAC,GAAS,SAAU,EAAC,GAAS,OAAQ,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,MAAO,EAAC,GAAS,OAAQ,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,MAAO,EAAC,GAAS,OACvL,6BAAA,CACA,2BAGF,CAAC,GAAS,IACR,EAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,eAAA,CACA,iBCpKJ,CAAC,GAAS,UACR,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,UAAA,CAAa,WAAA,CjCFb,UAAA,CAEA,wBAAA,CACA,MAAA,CiCCA,oBlCyO6C,0CkCtO/C,CAAC,GAAS,iBACR,eAAA,CACA,YAGF,CAAC,GAAS,KAAM,EAAC,GAAS,iBACxB,WAAA,CACA,wBCfF,CAAC,GAAS,MACR,iBAAA,CACA,MAAA,CAAS,KAAA,ClC+CT,OAAQ,2DAAR,CACA,sBAAA,CkC9CA,YAAA,CACA,mBAAA,CACA,eAAA,CACA,eAAA,CACA,gBAAA,CACA,wBAAA,CACA,wBAAA,CACA,YAAA,ClCqBA,+CAAA,CACA,4CAAA,CACA,uCAAA,CkCpBA,gBAAA,CACA,aAAA,CACA,kBAEA,CAlBD,GAAS,KAkBP,CAAC,GAAS,SACT,WAAA,CACA,UAAW,eAAe,eAA1B,CACA,0BAGF,CAxBD,GAAS,KAwBP,CAAC,GAAS,WACT,EAAC,GAAS,eADZ,CAxBD,GAAS,KAwBP,CAAC,GAAS,WACiB,EAAC,GAAS,OAClC,iBAAA,CACA,QAKN,CAAC,GAAS,KAAM,GACd,aAGF,CAAC,GAAS,eAAgB,GACxB,qBAIA,CADD,GAAS,KAAK,CAAC,GAAS,GACtB,CAAC,GAAS,SACT,SAAA,CACA,UAAW,WAAW,UAAtB,CACA,iDAIJ,CAAC,GAAS,gBAAkB,qBAC5B,CAAC,GAAS,gBAAkB,oBAC5B,CAAC,GAAS,gBAAkB,oBAC5B,CAAC,GAAS,gBAAkB,mBAI5B,CAAC,GAAS,IACR,EAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,eAAA,CACA,iBAGF,CAND,GAAS,IAMP,CAAC,GAAS,WAAY,EAAC,GAAS,OANnC,CAAC,GAAS,IAMiC,EAAC,GAAS,eACjD,UAAA,CACA,OC/DJ,CAAC,GAAS,QAAS,QACjB,eAAA,CACA,kBAAA,CACA,kBAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,iBAAA,CACA,eAAA,CACA,SAAA,CACA,QAKF,CAAC,GAAS,IAAK,EAAC,GAAS,QAAS,EAAC,GAAS,OAC1C,UAAA,CACA,SAGF,CAAC,GAAS,IAAK,EAAC,GAAS,QAAS,QAChC,kBAAA,CACA,kBCxBF,CAAC,GAAS,eAAgB,EAAC,GAAS,cAClC,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,SAGF,CAAC,GAAS,eAAgB,EAAC,GAAS,mBAClC,iBAGF,CAAC,CAAC,GAAS,UACT,cCdF,CAAC,GAAS,WACR,eAAA,CACA,yBCFF,CAAC,GAAS,QAER,wBAAA,CACA,eAAA,CACA,WAAA,CACA,WAAA,CACA,iBAAA,CACA,cAGF,CAAC,GAAS,OAAO,CAAC,GAAS,UACzB,UAAA,CACA,aAGF,CAAC,GAAS,eAER,wBAAA,CACA,kBAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,gBAAA,CACA,gBAGF,CAAC,GAAS,cAAc,OACtB,qBC7BF,CAAC,GAAS,QACR,kBCAA,CADD,GAAS,SACP,MAAO,EAAC,GAAS,MAChB,8BAFJ,CAAC,GAAS,SAKR,EAAC,GAAS,MACR,iCAAA,CACA,iBAAA,CACA,iBARJ,CAAC,GAAS,SAWR,EAAC,GAAS,KAAK,OACb,8BAZJ,CAAC,GAAS,SAeR,EAAC,GAAS,KAAK,OAfjB,CAAC,GAAS,SAee,EAAC,GAAS,KAAK,QACpC,8BAGF,CAnBD,GAAS,SAmBP,CAAC,GAAS,OAAO,MAAO,EAAC,GAAS,MACjC,4BAGF,CAvBD,GAAS,SAuBP,CAAC,GAAS,QACT,qBAIJ,CAAC,GAAS,SAAS,CAAC,GAAS,UAAW,EAAC,GAAS,MAChD,oBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,UACvB,aAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,SAAU,QACjC,iBAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,SAAU,EAAC,GAAS,MAC3C,cC7CF,CAAC,GAAS,mBACR,cCDF,CAAC,GAAS,MACR,aAAA,CACA,gCAGF,CAAC,GAAS,MACV,CAAC,GAAS,KAAM,EAAG,GAAS,gBAC1B,gBAGF,CAAC,GAAS,K1CiCR,oBAAA,CACA,eAAA,CACA,OAAA,C0CjCA,wBAAA,CACA,sBAAA,CACA,eAAA,CACA,gBAAA,CACA,4CAAA,CACA,WAAA,CACA,eAGF,CAAC,GAAS,IAAI,OACZ,mBAGF,CAAC,GAAS,IAAI,CAAC,GAAS,QACtB,kBAAA,CACA,+BAAA,CACA,kBAAA,CACA,YAIF,CAAC,GAAS,IAAI,OACZ,cAKF,CAAC,GAAS,IAAK,EAAC,GAAS,MACvB,gBAAA,CACA,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,KACvB,uBC7CF,CAAC,GAAS,SACR,eAAA,CACA,wBAAA,C3C8BA,uBAAA,CACA,oBAAA,CACA,eAAA,C2C7BA,oBAAA,C3CiCA,2DAAA,CACA,mDAAA,C2ChCA,WAAA,CACA,WAAA,CACA,mBAAA,CACA,oBAAA,CACA,gBAAA,CACA,cAGF,CAAC,GAAS,QAAQ,OAAQ,CAAC,GAAS,QAAQ,CAAC,GAAS,OACpD,oBAAA,C3CgBA,uBAAA,CACA,oBAAA,CACA,gB2CdF,CAAC,GAAS,YAAa,EAAC,GAAS,SAC/B,WAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,WAC1B,WAAA,CACA,YAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,UAC1B,cAKF,CAAC,GAAS,IAAK,EAAC,GAAS,SACvB,gBAAA,CACA,cCrCF,CAAC,GAAS,UACR,sBAAA,CACA,kBAEA,CAJD,GAAS,SAIN,MACA,wBAAA,CACA,oBAAA,CACA,sBAGF,CAVD,GAAS,SAUP,OACC,QAAQ,EAAR,CACA,WAAA,CACA,oBAAA,CACA,sBAGF,CAjBD,GAAS,SAiBP,CAAC,GAAS,U5ChBX,UAAA,CAEA,wBAAA,CACA,O4CgBE,CApBH,GAAS,SAiBP,CAAC,GAAS,SAGR,CAAC,GAAS,WACT,mBCrBN,CAAC,GAAS,cACR,iBAAA,CACA,gBAEA,CAJD,GAAS,aAIN,QACA,iBAAA,CACA,UAGF,CATD,GAAS,aASN,O7CRF,SAAA,CAEA,uBAAA,CACA,MAAA,C6COE,iBAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,WAAA,CACA,UChBJ,WACE,YAAa,SAAb,CACA,QAAQ,oBAAR,CACA,QAAQ,4BAA4B,OAAO,yBACrC,sBAAsB,OAAO,YAC7B,qBAAqB,OAAO,gBAC5B,6BAA6B,OAAO,MAH1C,CAIA,kBAAA,CACA,kBAGF,WACE,YAAa,eAAb,CACA,QAAQ,0BAAR,CACA,QAAQ,kCAAkC,OAAO,yBAC3C,4BAA4B,OAAO,YACnC,2BAA2B,OAAO,gBAClC,mCAAmC,OAAO,MAHhD,CAIA,kBAAA,CACA,kBAGF,CAAC,GAAS,KACR,YAAa,eAAb,CACA,iBAAA,CACA,kBAAA,CACA,mBAAA,CACA,cAAA,CACA,gBAAA,CACA,UAAA,CACA,uBAAA,CACA,kCAAA,CACA,iCAAA,CAEA,oBAAA,CACA,oCAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,cAGF,CAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,YAAa,sBAGf,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,gBAAgB,QAAiB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,KAAK,QAA4B,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,gBAAgB,QAAiB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,gBAAgB,QAAiB,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,kBAAkB,QAAe,QAAS,QACpD,CAAC,GAAS,uBAAuB,QAAU,QAAS,QACpD,CAAC,GAAS,sBAAsB,QAAW,QAAS,QACpD,CAAC,GAAS,uBAAuB,QAAU,QAAS,QACpD,CAAC,GAAS,sBAAsB,QAAW,QAAS,QACpD,CAAC,GAAS,kBAAkB,QAAe,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,kBAAkB,QAAe,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAS,CAAC,GAAS,WAAW,QACjD,QAAS,QAGX,CAAC,GAAS,UAA2B,eACrC,CAAC,GAAS,YAA2B,kBACrC,CAAC,CAAC,GAAS,aAA0B,gBAAA,CAAmB,gBCjLxD,CAAC,GAAS,IAAK,EAAC,GAAS,WAAY,OACnC"} \ No newline at end of file diff --git a/public/static/tinymce4.7.5/tinymce.min.js b/public/static/tinymce4.7.5/tinymce.min.js deleted file mode 100755 index d7fcac80..00000000 --- a/public/static/tinymce4.7.5/tinymce.min.js +++ /dev/null @@ -1,2 +0,0 @@ -// 4.7.5 (2018-01-22) -!function(){"use strict";var e,t,n,r,o,i,a,s,u,c,l,f,d,m,p,g,h,v=function(e){return function(){return e}},y={noop:function(){},noarg:function(e){return function(){return e()}},compose:function(e,t){return function(){return e(t.apply(null,arguments))}},constant:v,identity:function(e){return e},tripleEquals:function(e,t){return e===t},curry:function(e){for(var t=new Array(arguments.length-1),n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];var o=t.concat(n);return e.apply(null,o)}},not:function(e){return function(){return!e.apply(null,arguments)}},die:function(e){return function(){throw new Error(e)}},apply:function(e){return e()},call:function(e){e()},never:v(!1),always:v(!0)},b=y.never,C=y.always,x=function(){return w},w=(r={fold:function(e,t){return e()},is:b,isSome:b,isNone:C,getOr:n=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},or:n,orThunk:t,map:x,ap:x,each:function(){},bind:x,flatten:x,exists:b,forall:C,filter:x,equals:e=function(e){return e.isNone()},equals_:e,toArray:function(){return[]},toString:y.constant("none()")},Object.freeze&&Object.freeze(r),r),N=function(e){var t=function(){return e},n=function(){return o},r=function(t){return t(e)},o={fold:function(t,n){return n(e)},is:function(t){return e===t},isSome:C,isNone:b,getOr:t,getOrThunk:t,getOrDie:t,or:n,orThunk:n,map:function(t){return N(t(e))},ap:function(t){return t.fold(x,function(t){return N(t(e))})},each:function(t){t(e)},bind:r,flatten:t,exists:r,forall:r,filter:function(t){return t(e)?o:w},equals:function(t){return t.is(e)},equals_:function(t,n){return t.fold(b,function(t){return n(e,t)})},toArray:function(){return[e]},toString:function(){return"some("+e+")"}};return o},E={some:N,none:x,from:function(e){return null===e||e===undefined?w:N(e)}},S=(o=Array.prototype.indexOf)===undefined?function(e,t){return D(e,t)}:function(e,t){return o.call(e,t)},k=function(e,t){return S(e,t)>-1},T=function(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++){var i=e[o];r[o]=t(i,o,e)}return r},A=function(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n,e)},_=function(e,t){for(var n=e.length-1;n>=0;n--)t(e[n],n,e)},B=function(e,t){for(var n=[],r=0,o=e.length;r<o;r++){var i=e[r];t(i,r,e)&&n.push(i)}return n},R=function(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n,e))return E.some(n);return E.none()},D=function(e,t){for(var n=0,r=e.length;n<r;++n)if(e[n]===t)return n;return-1},O=Array.prototype.push,P=function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!Array.prototype.isPrototypeOf(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);O.apply(t,e[n])}return t},I=function(e,t){for(var n=0,r=e.length;n<r;++n)if(!0!==t(e[n],n,e))return!1;return!0},L=Array.prototype.slice,M={map:T,each:A,eachr:_,partition:function(e,t){for(var n=[],r=[],o=0,i=e.length;o<i;o++){var a=e[o];(t(a,o,e)?n:r).push(a)}return{pass:n,fail:r}},filter:B,groupBy:function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;i<a;i++){var s=e[i],u=t(s);u!==n&&(r.push(o),o=[]),n=u,o.push(s)}return 0!==o.length&&r.push(o),r},indexOf:function(e,t){var n=S(e,t);return-1===n?E.none():E.some(n)},foldr:function(e,t,n){return _(e,function(e){n=t(n,e)}),n},foldl:function(e,t,n){return A(e,function(e){n=t(n,e)}),n},find:function(e,t){for(var n=0,r=e.length;n<r;n++){var o=e[n];if(t(o,n,e))return E.some(o)}return E.none()},findIndex:R,flatten:P,bind:function(e,t){var n=T(e,t);return P(n)},forall:I,exists:function(e,t){return R(e,t).isSome()},contains:k,equal:function(e,t){return e.length===t.length&&I(e,function(e,n){return e===t[n]})},reverse:function(e){var t=L.call(e,0);return t.reverse(),t},chunk:function(e,t){for(var n=[],r=0;r<e.length;r+=t){var o=e.slice(r,r+t);n.push(o)}return n},difference:function(e,t){return B(e,function(e){return!k(t,e)})},mapToObject:function(e,t){for(var n={},r=0,o=e.length;r<o;r++){var i=e[r];n[String(i)]=t(i,r)}return n},pure:function(e){return[e]},sort:function(e,t){var n=L.call(e,0);return n.sort(t),n},range:function(e,t){for(var n=[],r=0;r<e;r++)n.push(t(r));return n},head:function(e){return 0===e.length?E.none():E.some(e[0])},last:function(e){return 0===e.length?E.none():E.some(e[e.length-1])}},F="undefined"!=typeof window?window:Function("return this;")(),z=function(e,t){for(var n=t!==undefined&&null!==t?t:F,r=0;r<e.length&&n!==undefined&&null!==n;++r)n=n[e[r]];return n},U=function(e,t){var n=e.split(".");return z(n,t)},V=function(e,t){var n=U(e,t);if(n===undefined||null===n)throw e+" not available on this browser";return n},H=function(){return V("URL")},q=function(e){return H().createObjectURL(e)},j=function(e){H().revokeObjectURL(e)},$=navigator,W=$.userAgent,K=function(e){return"matchMedia"in window&&matchMedia(e).matches};d=/Android/.test(W),a=(a=!(i=/WebKit/.test(W))&&/MSIE/gi.test(W)&&/Explorer/gi.test($.appName))&&/MSIE (\w+)\./.exec(W)[1],s=-1!==W.indexOf("Trident/")&&(-1!==W.indexOf("rv:")||-1!==$.appName.indexOf("Netscape"))&&11,u=-1!==W.indexOf("Edge/")&&!a&&!s&&12,a=a||s||u,c=!i&&!s&&/Gecko/.test(W),l=-1!==W.indexOf("Mac"),f=/(iPad|iPhone)/.test(W),m="FormData"in window&&"FileReader"in window&&"URL"in window&&!!q,p=K("only screen and (max-device-width: 480px)")&&(d||f),g=K("only screen and (min-width: 800px)")&&(d||f),h=-1!==W.indexOf("Windows Phone"),u&&(i=!1);var X,Y,G,J,Q,Z,ee,te,ne,re,oe,ie,ae,se,ue,ce,le,fe,de,me={opera:!1,webkit:i,ie:a,gecko:c,mac:l,iOS:f,android:d,contentEditable:!f||m||parseInt(W.match(/AppleWebKit\/(\d*)/)[1],10)>=534,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:8!==a,range:window.getSelection&&"Range"in window,documentMode:a&&!u?document.documentMode||7:10,fileApi:m,ceFalse:!1===a||a>8,cacheSuffix:"",container:null,overrideViewPort:null,experimentalShadowDom:!1,canHaveCSP:!1===a||a>11,desktop:!p&&!g,windowsPhone:h},pe=window.Promise?window.Promise:function(){function e(e,t){return function(){e.apply(t,arguments)}}var t=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},n=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],u(t,e(i,this),e(a,this))},r=n.immediateFn||"function"==typeof setImmediate&&setImmediate||function(e){setTimeout(e,1)};function o(e){var t=this;null!==this._state?r(function(){var n=t._state?e.onFulfilled:e.onRejected;if(null!==n){var r;try{r=n(t._value)}catch(o){return void e.reject(o)}e.resolve(r)}else(t._state?e.resolve:e.reject)(t._value)}):this._deferreds.push(e)}function i(t){try{if(t===this)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if("function"==typeof n)return void u(e(n,t),e(i,this),e(a,this))}this._state=!0,this._value=t,s.call(this)}catch(r){a.call(this,r)}}function a(e){this._state=!1,this._value=e,s.call(this)}function s(){for(var e=0,t=this._deferreds.length;e<t;e++)o.call(this,this._deferreds[e]);this._deferreds=null}function u(e,t,n){var r=!1;try{e(function(e){r||(r=!0,t(e))},function(e){r||(r=!0,n(e))})}catch(o){if(r)return;r=!0,n(o)}}return n.prototype["catch"]=function(e){return this.then(null,e)},n.prototype.then=function(e,t){var r=this;return new n(function(n,i){o.call(r,new function(e,t,n,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r}(e,t,n,i))})},n.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&t(arguments[0])?arguments[0]:arguments);return new n(function(t,n){if(0===e.length)return t([]);var r=e.length;function o(i,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(e){o(i,e)},n)}e[i]=a,0==--r&&t(e)}catch(u){n(u)}}for(var i=0;i<e.length;i++)o(i,e[i])})},n.resolve=function(e){return e&&"object"==typeof e&&e.constructor===n?e:new n(function(t){t(e)})},n.reject=function(e){return new n(function(t,n){n(e)})},n.race=function(e){return new n(function(t,n){for(var r=0,o=e.length;r<o;r++)e[r].then(t,n)})},n}(),ge=function(e,t){return"number"!=typeof t&&(t=0),setTimeout(e,t)},he=function(e,t){return"number"!=typeof t&&(t=1),setInterval(e,t)},ve=function(e,t){var n,r;return(r=function(){var r=arguments;clearTimeout(n),n=ge(function(){e.apply(this,r)},t)}).stop=function(){clearTimeout(n)},r},ye={requestAnimationFrame:function(e,t){X?X.then(e):X=new pe(function(e){t||(t=document.body),function(e,t){var n,r=window.requestAnimationFrame,o=["ms","moz","webkit"];for(n=0;n<o.length&&!r;n++)r=window[o[n]+"RequestAnimationFrame"];r||(r=function(e){window.setTimeout(e,0)}),r(e,t)}(e,t)}).then(e)},setTimeout:ge,setInterval:he,setEditorTimeout:function(e,t,n){return ge(function(){e.removed||t()},n)},setEditorInterval:function(e,t,n){var r;return r=he(function(){e.removed?clearInterval(r):t()},n)},debounce:ve,throttle:ve,clearInterval:function(e){return clearInterval(e)},clearTimeout:function(e){return clearTimeout(e)}},be=/^(?:mouse|contextmenu)|click/,Ce={keyLocation:1,layerX:1,layerY:1,returnValue:1,webkitMovementX:1,webkitMovementY:1,keyIdentifier:1},xe=function(){return!1},we=function(){return!0},Ne=function(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r||!1):e.attachEvent&&e.attachEvent("on"+t,n)},Ee=function(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r||!1):e.detachEvent&&e.detachEvent("on"+t,n)},Se=function(e,t){var n,r,o,i,a,s,u=t||{};for(n in e)Ce[n]||(u[n]=e[n]);if(u.target||(u.target=u.srcElement||document),me.experimentalShadowDom&&(u.target=(r=e,o=u.target,a=o,(i=r.path)&&i.length>0&&(a=i[0]),r.deepPath&&(i=r.deepPath())&&i.length>0&&(a=i[0]),a)),e&&be.test(e.type)&&e.pageX===undefined&&e.clientX!==undefined){var c=u.target.ownerDocument||document,l=c.documentElement,f=c.body;u.pageX=e.clientX+(l&&l.scrollLeft||f&&f.scrollLeft||0)-(l&&l.clientLeft||f&&f.clientLeft||0),u.pageY=e.clientY+(l&&l.scrollTop||f&&f.scrollTop||0)-(l&&l.clientTop||f&&f.clientTop||0)}return u.preventDefault=function(){u.isDefaultPrevented=we,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},u.stopPropagation=function(){u.isPropagationStopped=we,e&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)},u.stopImmediatePropagation=function(){u.isImmediatePropagationStopped=we,u.stopPropagation()},0==((s=u).isDefaultPrevented===we||s.isDefaultPrevented===xe)&&(u.isDefaultPrevented=xe,u.isPropagationStopped=xe,u.isImmediatePropagationStopped=xe),"undefined"==typeof u.metaKey&&(u.metaKey=!1),u},ke=function(e,t,n){var r=e.document,o={type:"ready"};if(n.domLoaded)t(o);else{var i=function(){return"complete"===r.readyState||"interactive"===r.readyState&&r.body},a=function(){n.domLoaded||(n.domLoaded=!0,t(o))},s=function(){i()&&(Ee(r,"readystatechange",s),a())},u=function(){try{r.documentElement.doScroll("left")}catch(e){return void ye.setTimeout(u)}a()};!r.addEventListener||me.ie&&me.ie<11?(Ne(r,"readystatechange",s),r.documentElement.doScroll&&e.self===e.top&&u()):i()?a():Ne(e,"DOMContentLoaded",a),Ne(e,"load",a)}},Te=function(){var e,t,n,r,o,i=this,a={};t="mce-data-"+(+new Date).toString(32),r="onmouseenter"in document.documentElement,n="onfocusin"in document.documentElement,o={mouseenter:"mouseover",mouseleave:"mouseout"},e=1,i.domLoaded=!1,i.events=a;var s=function(e,t){var n,r,o,i,s=a[t];if(n=s&&s[e.type])for(r=0,o=n.length;r<o;r++)if((i=n[r])&&!1===i.func.call(i.scope,e)&&e.preventDefault(),e.isImmediatePropagationStopped())return};i.bind=function(u,c,l,f){var d,m,p,g,h,v,y,b=window,C=function(e){s(Se(e||b.event),d)};if(u&&3!==u.nodeType&&8!==u.nodeType){for(u[t]?d=u[t]:(d=e++,u[t]=d,a[d]={}),f=f||u,p=(c=c.split(" ")).length;p--;)v=C,h=y=!1,"DOMContentLoaded"===(g=c[p])&&(g="ready"),i.domLoaded&&"ready"===g&&"complete"===u.readyState?l.call(f,Se({type:g})):(r||(h=o[g])&&(v=function(e){var t,n;if(t=e.currentTarget,(n=e.relatedTarget)&&t.contains)n=t.contains(n);else for(;n&&n!==t;)n=n.parentNode;n||((e=Se(e||b.event)).type="mouseout"===e.type?"mouseleave":"mouseenter",e.target=t,s(e,d))}),n||"focusin"!==g&&"focusout"!==g||(y=!0,h="focusin"===g?"focus":"blur",v=function(e){(e=Se(e||b.event)).type="focus"===e.type?"focusin":"focusout",s(e,d)}),(m=a[d][g])?"ready"===g&&i.domLoaded?l({type:g}):m.push({func:l,scope:f}):(a[d][g]=m=[{func:l,scope:f}],m.fakeName=h,m.capture=y,m.nativeHandler=v,"ready"===g?ke(u,v,i):Ne(u,h||g,v,y)));return u=m=0,l}},i.unbind=function(e,n,r){var o,s,u,c,l,f;if(!e||3===e.nodeType||8===e.nodeType)return i;if(o=e[t]){if(f=a[o],n){for(u=(n=n.split(" ")).length;u--;)if(s=f[l=n[u]]){if(r)for(c=s.length;c--;)if(s[c].func===r){var d=s.nativeHandler,m=s.fakeName,p=s.capture;(s=s.slice(0,c).concat(s.slice(c+1))).nativeHandler=d,s.fakeName=m,s.capture=p,f[l]=s}r&&0!==s.length||(delete f[l],Ee(e,s.fakeName||l,s.nativeHandler,s.capture))}}else{for(l in f)s=f[l],Ee(e,s.fakeName||l,s.nativeHandler,s.capture);f={}}for(l in f)return i;delete a[o];try{delete e[t]}catch(g){e[t]=null}}return i},i.fire=function(e,n,r){var o;if(!e||3===e.nodeType||8===e.nodeType)return i;(r=Se(null,r)).type=n,r.target=e;do{(o=e[t])&&s(r,o),e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow}while(e&&!r.isPropagationStopped());return i},i.clean=function(e){var n,r,o=i.unbind;if(!e||3===e.nodeType||8===e.nodeType)return i;if(e[t]&&o(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName)for(o(e),n=(r=e.getElementsByTagName("*")).length;n--;)(e=r[n])[t]&&o(e);return i},i.destroy=function(){a={}},i.cancel=function(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}};(Te.Event=new Te).bind(window,"ready",function(){});var Ae="sizzle"+-new Date,_e=window.document,Be=0,Re=0,De=ft(),Oe=ft(),Pe=ft(),Ie=function(e,t){return e===t&&(ie=!0),0},Le=typeof undefined,Me=1<<31,Fe={}.hasOwnProperty,ze=[],Ue=ze.pop,Ve=ze.push,He=ze.push,qe=ze.slice,je=ze.indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(this[t]===e)return t;return-1},$e="[\\x20\\t\\r\\n\\f]",We="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",Ke="\\["+$e+"*("+We+")(?:"+$e+"*([*^$|!~]?=)"+$e+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+We+"))|)"+$e+"*\\]",Xe=":("+We+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+Ke+")*)|.*)\\)|)",Ye=new RegExp("^"+$e+"+|((?:^|[^\\\\])(?:\\\\.)*)"+$e+"+$","g"),Ge=new RegExp("^"+$e+"*,"+$e+"*"),Je=new RegExp("^"+$e+"*([>+~]|"+$e+")"+$e+"*"),Qe=new RegExp("="+$e+"*([^\\]'\"]*?)"+$e+"*\\]","g"),Ze=new RegExp(Xe),et=new RegExp("^"+We+"$"),tt={ID:new RegExp("^#("+We+")"),CLASS:new RegExp("^\\.("+We+")"),TAG:new RegExp("^("+We+"|[*])"),ATTR:new RegExp("^"+Ke),PSEUDO:new RegExp("^"+Xe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+$e+"*(even|odd|(([+-]|)(\\d*)n|)"+$e+"*(?:([+-]|)"+$e+"*(\\d+)|))"+$e+"*\\)|)","i"),bool:new RegExp("^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$","i"),needsContext:new RegExp("^"+$e+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+$e+"*((?:-\\d)?\\d*)"+$e+"*\\)|)(?=[^-]|$)","i")},nt=/^(?:input|select|textarea|button)$/i,rt=/^h\d$/i,ot=/^[^{]+\{\s*\[native \w/,it=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,at=/[+~]/,st=/'|\\/g,ut=new RegExp("\\\\([\\da-f]{1,6}"+$e+"?|("+$e+")|.)","ig"),ct=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{He.apply(ze=qe.call(_e.childNodes),_e.childNodes),ze[_e.childNodes.length].nodeType}catch(yC){He={apply:ze.length?function(e,t){Ve.apply(e,qe.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}var lt=function(e,t,n,r){var o,i,a,s,u,c,l,f,d,m;if((t?t.ownerDocument||t:_e)!==se&&ae(t),t=t||se,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(ce&&!r){if(o=it.exec(e))if(a=o[1]){if(9===s){if(!(i=t.getElementById(a))||!i.parentNode)return n;if(i.id===a)return n.push(i),n}else if(t.ownerDocument&&(i=t.ownerDocument.getElementById(a))&&de(t,i)&&i.id===a)return n.push(i),n}else{if(o[2])return He.apply(n,t.getElementsByTagName(e)),n;if((a=o[3])&&G.getElementsByClassName)return He.apply(n,t.getElementsByClassName(a)),n}if(G.qsa&&(!le||!le.test(e))){if(f=l=Ae,d=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(c=ee(e),(l=t.getAttribute("id"))?f=l.replace(st,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",u=c.length;u--;)c[u]=f+bt(c[u]);d=at.test(e)&&vt(t.parentNode)||t,m=c.join(",")}if(m)try{return He.apply(n,d.querySelectorAll(m)),n}catch(p){}finally{l||t.removeAttribute("id")}}}return ne(e.replace(Ye,"$1"),t,n,r)};function ft(){var e=[];return function t(n,r){return e.push(n+" ")>J.cacheLength&&delete t[e.shift()],t[n+" "]=r}}function dt(e){return e[Ae]=!0,e}function mt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||Me)-(~e.sourceIndex||Me);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function gt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return dt(function(t){return t=+t,dt(function(n,r){for(var o,i=e([],n.length,t),a=i.length;a--;)n[o=i[a]]&&(n[o]=!(r[o]=n[o]))})})}function vt(e){return e&&typeof e.getElementsByTagName!==Le&&e}for(Y in G=lt.support={},Z=lt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},ae=lt.setDocument=function(e){var t,n=e?e.ownerDocument||e:_e,r=n.defaultView;return n!==se&&9===n.nodeType&&n.documentElement?(se=n,ue=n.documentElement,ce=!Z(n),r&&r!==function(e){try{return e.top}catch(t){}return null}(r)&&(r.addEventListener?r.addEventListener("unload",function(){ae()},!1):r.attachEvent&&r.attachEvent("onunload",function(){ae()})),G.attributes=!0,G.getElementsByTagName=!0,G.getElementsByClassName=ot.test(n.getElementsByClassName),G.getById=!0,J.find.ID=function(e,t){if(typeof t.getElementById!==Le&&ce){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},J.filter.ID=function(e){var t=e.replace(ut,ct);return function(e){return e.getAttribute("id")===t}},J.find.TAG=G.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==Le)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},J.find.CLASS=G.getElementsByClassName&&function(e,t){if(ce)return t.getElementsByClassName(e)},fe=[],le=[],G.disconnectedMatch=!0,le=le.length&&new RegExp(le.join("|")),fe=fe.length&&new RegExp(fe.join("|")),t=ot.test(ue.compareDocumentPosition),de=t||ot.test(ue.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Ie=t?function(e,t){if(e===t)return ie=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!G.sortDetached&&t.compareDocumentPosition(e)===r?e===n||e.ownerDocument===_e&&de(_e,e)?-1:t===n||t.ownerDocument===_e&&de(_e,t)?1:oe?je.call(oe,e)-je.call(oe,t):0:4&r?-1:1)}:function(e,t){if(e===t)return ie=!0,0;var r,o=0,i=e.parentNode,a=t.parentNode,s=[e],u=[t];if(!i||!a)return e===n?-1:t===n?1:i?-1:a?1:oe?je.call(oe,e)-je.call(oe,t):0;if(i===a)return mt(e,t);for(r=e;r=r.parentNode;)s.unshift(r);for(r=t;r=r.parentNode;)u.unshift(r);for(;s[o]===u[o];)o++;return o?mt(s[o],u[o]):s[o]===_e?-1:u[o]===_e?1:0},n):se},lt.matches=function(e,t){return lt(e,null,null,t)},lt.matchesSelector=function(e,t){if((e.ownerDocument||e)!==se&&ae(e),t=t.replace(Qe,"='$1']"),G.matchesSelector&&ce&&(!fe||!fe.test(t))&&(!le||!le.test(t)))try{var n=(void 0).call(e,t);if(n||G.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(yC){}return lt(t,se,null,[e]).length>0},lt.contains=function(e,t){return(e.ownerDocument||e)!==se&&ae(e),de(e,t)},lt.attr=function(e,t){(e.ownerDocument||e)!==se&&ae(e);var n=J.attrHandle[t.toLowerCase()],r=n&&Fe.call(J.attrHandle,t.toLowerCase())?n(e,t,!ce):undefined;return r!==undefined?r:G.attributes||!ce?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},lt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},lt.uniqueSort=function(e){var t,n=[],r=0,o=0;if(ie=!G.detectDuplicates,oe=!G.sortStable&&e.slice(0),e.sort(Ie),ie){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return oe=null,e},Q=lt.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=Q(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=Q(t);return n},(J=lt.selectors={cacheLength:50,createPseudo:dt,match:tt,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ut,ct),e[3]=(e[3]||e[4]||e[5]||"").replace(ut,ct),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||lt.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&<.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return tt.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Ze.test(n)&&(t=ee(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ut,ct).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=De[e+" "];return t||(t=new RegExp("(^|"+$e+")"+e+"("+$e+"|$)"))&&De(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==Le&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var o=lt.attr(r,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&o.indexOf(n)>-1:"$="===t?n&&o.slice(-n.length)===n:"~="===t?(" "+o+" ").indexOf(n)>-1:"|="===t&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,d,m,p,g=i!==a?"nextSibling":"previousSibling",h=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s;if(h){if(i){for(;g;){for(f=t;f=f[g];)if(s?f.nodeName.toLowerCase()===v:1===f.nodeType)return!1;p=g="only"===e&&!p&&"nextSibling"}return!0}if(p=[a?h.firstChild:h.lastChild],a&&y){for(m=(c=(l=h[Ae]||(h[Ae]={}))[e]||[])[0]===Be&&c[1],d=c[0]===Be&&c[2],f=m&&h.childNodes[m];f=++m&&f&&f[g]||(d=m=0)||p.pop();)if(1===f.nodeType&&++d&&f===t){l[e]=[Be,m,d];break}}else if(y&&(c=(t[Ae]||(t[Ae]={}))[e])&&c[0]===Be)d=c[1];else for(;(f=++m&&f&&f[g]||(d=m=0)||p.pop())&&((s?f.nodeName.toLowerCase()!==v:1!==f.nodeType)||!++d||(y&&((f[Ae]||(f[Ae]={}))[e]=[Be,d]),f!==t)););return(d-=o)===r||d%r==0&&d/r>=0}}},PSEUDO:function(e,t){var n,r=J.pseudos[e]||J.setFilters[e.toLowerCase()]||lt.error("unsupported pseudo: "+e);return r[Ae]?r(t):r.length>1?(n=[e,e,"",t],J.setFilters.hasOwnProperty(e.toLowerCase())?dt(function(e,n){for(var o,i=r(e,t),a=i.length;a--;)e[o=je.call(e,i[a])]=!(n[o]=i[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:dt(function(e){var t=[],n=[],r=te(e.replace(Ye,"$1"));return r[Ae]?dt(function(e,t,n,o){for(var i,a=r(e,null,o,[]),s=e.length;s--;)(i=a[s])&&(e[s]=!(t[s]=i))}):function(e,o,i){return t[0]=e,r(t,null,i,n),!n.pop()}}),has:dt(function(e){return function(t){return lt(e,t).length>0}}),contains:dt(function(e){return e=e.replace(ut,ct),function(t){return(t.textContent||t.innerText||Q(t)).indexOf(e)>-1}}),lang:dt(function(e){return et.test(e||"")||lt.error("unsupported lang: "+e),e=e.replace(ut,ct).toLowerCase(),function(t){var n;do{if(n=ce?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(e){var t=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===ue},focus:function(e){return e===se.activeElement&&(!se.hasFocus||se.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!J.pseudos.empty(e)},header:function(e){return rt.test(e.nodeName)},input:function(e){return nt.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[n<0?n+t:n]}),even:ht(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ht(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=J.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})J.pseudos[Y]=pt(Y);for(Y in{submit:!0,reset:!0})J.pseudos[Y]=gt(Y);function yt(){}function bt(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function Ct(e,t,n){var r=t.dir,o=n&&"parentNode"===r,i=Re++;return t.first?function(t,n,i){for(;t=t[r];)if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,a){var s,u,c=[Be,i];if(a){for(;t=t[r];)if((1===t.nodeType||o)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||o){if((s=(u=t[Ae]||(t[Ae]={}))[r])&&s[0]===Be&&s[1]===i)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function xt(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function wt(e,t,n,r,o){for(var i,a=[],s=0,u=e.length,c=null!=t;s<u;s++)(i=e[s])&&(n&&!n(i,r,o)||(a.push(i),c&&t.push(s)));return a}function Nt(e,t,n,r,o,i){return r&&!r[Ae]&&(r=Nt(r)),o&&!o[Ae]&&(o=Nt(o,i)),dt(function(i,a,s,u){var c,l,f,d=[],m=[],p=a.length,g=i||function(e,t,n){for(var r=0,o=t.length;r<o;r++)lt(e,t[r],n);return n}(t||"*",s.nodeType?[s]:s,[]),h=!e||!i&&t?g:wt(g,d,e,s,u),v=n?o||(i?e:p||r)?[]:a:h;if(n&&n(h,v,s,u),r)for(c=wt(v,m),r(c,[],s,u),l=c.length;l--;)(f=c[l])&&(v[m[l]]=!(h[m[l]]=f));if(i){if(o||e){if(o){for(c=[],l=v.length;l--;)(f=v[l])&&c.push(h[l]=f);o(null,v=[],c,u)}for(l=v.length;l--;)(f=v[l])&&(c=o?je.call(i,f):d[l])>-1&&(i[c]=!(a[c]=f))}}else v=wt(v===a?v.splice(p,v.length):v),o?o(null,a,v,u):He.apply(a,v)})}function Et(e){for(var t,n,r,o=e.length,i=J.relative[e[0].type],a=i||J.relative[" "],s=i?1:0,u=Ct(function(e){return e===t},a,!0),c=Ct(function(e){return je.call(t,e)>-1},a,!0),l=[function(e,n,r){return!i&&(r||n!==re)||((t=n).nodeType?u(e,n,r):c(e,n,r))}];s<o;s++)if(n=J.relative[e[s].type])l=[Ct(xt(l),n)];else{if((n=J.filter[e[s].type].apply(null,e[s].matches))[Ae]){for(r=++s;r<o&&!J.relative[e[r].type];r++);return Nt(s>1&&xt(l),s>1&&bt(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(Ye,"$1"),n,s<r&&Et(e.slice(s,r)),r<o&&Et(e=e.slice(r)),r<o&&bt(e))}l.push(n)}return xt(l)}yt.prototype=J.filters=J.pseudos,J.setFilters=new yt,ee=lt.tokenize=function(e,t){var n,r,o,i,a,s,u,c=Oe[e+" "];if(c)return t?0:c.slice(0);for(a=e,s=[],u=J.preFilter;a;){for(i in n&&!(r=Ge.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(o=[])),n=!1,(r=Je.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(Ye," ")}),a=a.slice(n.length)),J.filter)!(r=tt[i].exec(a))||u[i]&&!(r=u[i](r))||(n=r.shift(),o.push({value:n,type:i,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?lt.error(e):Oe(e,s).slice(0)},te=lt.compile=function(e,t){var n,r,o,i,a,s,u=[],c=[],l=Pe[e+" "];if(!l){for(t||(t=ee(e)),n=t.length;n--;)(l=Et(t[n]))[Ae]?u.push(l):c.push(l);(l=Pe(e,(r=c,i=(o=u).length>0,a=r.length>0,s=function(e,t,n,s,u){var c,l,f,d=0,m="0",p=e&&[],g=[],h=re,v=e||a&&J.find.TAG("*",u),y=Be+=null==h?1:Math.random()||.1,b=v.length;for(u&&(re=t!==se&&t);m!==b&&null!=(c=v[m]);m++){if(a&&c){for(l=0;f=r[l++];)if(f(c,t,n)){s.push(c);break}u&&(Be=y)}i&&((c=!f&&c)&&d--,e&&p.push(c))}if(d+=m,i&&m!==d){for(l=0;f=o[l++];)f(p,g,t,n);if(e){if(d>0)for(;m--;)p[m]||g[m]||(g[m]=Ue.call(s));g=wt(g)}He.apply(s,g),u&&!e&&g.length>0&&d+o.length>1&<.uniqueSort(s)}return u&&(Be=y,re=h),p},i?dt(s):s))).selector=e}return l},ne=lt.select=function(e,t,n,r){var o,i,a,s,u,c="function"==typeof e&&e,l=!r&&ee(e=c.selector||e);if(n=n||[],1===l.length){if((i=l[0]=l[0].slice(0)).length>2&&"ID"===(a=i[0]).type&&G.getById&&9===t.nodeType&&ce&&J.relative[i[1].type]){if(!(t=(J.find.ID(a.matches[0].replace(ut,ct),t)||[])[0]))return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=tt.needsContext.test(e)?0:i.length;o--&&(a=i[o],!J.relative[s=a.type]);)if((u=J.find[s])&&(r=u(a.matches[0].replace(ut,ct),at.test(i[0].type)&&vt(t.parentNode)||t))){if(i.splice(o,1),!(e=r.length&&bt(i)))return He.apply(n,r),n;break}}return(c||te(e,l))(r,t,!ce,n,at.test(e)&&vt(t.parentNode)||t),n},G.sortStable=Ae.split("").sort(Ie).join("")===Ae,G.detectDuplicates=!!ie,ae(),G.sortDetached=!0;var St=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},kt=function(e,t,n){var r,o;if(!e)return 0;if(n=n||e,e.length!==undefined){for(r=0,o=e.length;r<o;r++)if(!1===t.call(n,e[r],r,e))return 0}else for(r in e)if(e.hasOwnProperty(r)&&!1===t.call(n,e[r],r,e))return 0;return 1},Tt=function(e,t,n){var r,o;for(r=0,o=e.length;r<o;r++)if(t.call(n,e[r],r,e))return r;return-1},At={isArray:St,toArray:function(e){var t,n,r=e;if(!St(e))for(r=[],t=0,n=e.length;t<n;t++)r[t]=e[t];return r},each:kt,map:function(e,t){var n=[];return kt(e,function(r,o){n.push(t(r,o,e))}),n},filter:function(e,t){var n=[];return kt(e,function(r,o){t&&!t(r,o,e)||n.push(r)}),n},indexOf:function(e,t){var n,r;if(e)for(n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},reduce:function(e,t,n,r){var o=0;for(arguments.length<3&&(n=e[0]);o<e.length;o++)n=t.call(r,n,e[o],o);return n},findIndex:Tt,find:function(e,t,n){var r=Tt(e,t,n);return-1!==r?e[r]:undefined},last:function(e){return e[e.length-1]}},_t=/^\s*|\s*$/g,Bt=function(e){return null===e||e===undefined?"":(""+e).replace(_t,"")},Rt=function(e,t){return t?!("array"!==t||!At.isArray(e))||typeof e===t:e!==undefined},Dt=function(e,t,n,r){r=r||this,e&&(n&&(e=e[n]),At.each(e,function(e,o){if(!1===t.call(r,e,o,n))return!1;Dt(e,t,n,r)}))},Ot={trim:Bt,isArray:At.isArray,is:Rt,toArray:At.toArray,makeMap:function(e,t,n){var r;for(e=e||[],t=t||",","string"==typeof e&&(e=e.split(t)),n=n||{},r=e.length;r--;)n[e[r]]={};return n},each:At.each,map:At.map,grep:At.filter,inArray:At.indexOf,hasOwn:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},extend:function(e,t){for(var n,r,o,i=[],a=2;a<arguments.length;a++)i[a-2]=arguments[a];var s,u=arguments;for(n=1,r=u.length;n<r;n++)for(o in t=u[n])t.hasOwnProperty(o)&&(s=t[o])!==undefined&&(e[o]=s);return e},create:function(e,t,n){var r,o,i,a,s,u=this,c=0;if(e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e),i=e[3].match(/(^|\.)(\w+)$/i)[2],!(o=u.createNS(e[3].replace(/\.\w+$/,""),n))[i]){if("static"===e[2])return o[i]=t,void(this.onCreate&&this.onCreate(e[2],e[3],o[i]));t[i]||(t[i]=function(){},c=1),o[i]=t[i],u.extend(o[i].prototype,t),e[5]&&(r=u.resolve(e[5]).prototype,a=e[5].match(/\.(\w+)$/i)[1],s=o[i],o[i]=c?function(){return r[a].apply(this,arguments)}:function(){return this.parent=r[a],s.apply(this,arguments)},o[i].prototype[i]=o[i],u.each(r,function(e,t){o[i].prototype[t]=r[t]}),u.each(t,function(e,t){r[t]?o[i].prototype[t]=function(){return this.parent=r[t],e.apply(this,arguments)}:t!==i&&(o[i].prototype[t]=e)})),u.each(t["static"],function(e,t){o[i][t]=e})}},walk:Dt,createNS:function(e,t){var n,r;for(t=t||window,e=e.split("."),n=0;n<e.length;n++)t[r=e[n]]||(t[r]={}),t=t[r];return t},resolve:function(e,t){var n,r;for(t=t||window,n=0,r=(e=e.split(".")).length;n<r&&(t=t[e[n]]);n++);return t},explode:function(e,t){return!e||Rt(e,"array")?e:At.map(e.split(t||","),Bt)},_addCacheSuffix:function(e){var t=me.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},Pt=document,It=Array.prototype.push,Lt=Array.prototype.slice,Mt=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,Ft=Te.Event,zt=Ot.makeMap("children,contents,next,prev"),Ut=function(e){return void 0!==e},Vt=function(e){return"string"==typeof e},Ht=function(e,t){var n,r,o;for(o=(t=t||Pt).createElement("div"),n=t.createDocumentFragment(),o.innerHTML=e;r=o.firstChild;)n.appendChild(r);return n},qt=function(e,t,n,r){var o;if(Vt(t))t=Ht(t,rn(e[0]));else if(t.length&&!t.nodeType){if(t=Qt.makeArray(t),r)for(o=t.length-1;o>=0;o--)qt(e,t[o],n,r);else for(o=0;o<t.length;o++)qt(e,t[o],n,r);return e}if(t.nodeType)for(o=e.length;o--;)n.call(e[o],t);return e},jt=function(e,t){return e&&t&&-1!==(" "+e.className+" ").indexOf(" "+t+" ")},$t=function(e,t,n){var r,o;return t=Qt(t)[0],e.each(function(){var e=this;n&&r===e.parentNode?o.appendChild(e):(r=e.parentNode,o=t.cloneNode(!1),e.parentNode.insertBefore(o,e),o.appendChild(e))}),e},Wt=Ot.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),Kt=Ot.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),Xt={"for":"htmlFor","class":"className",readonly:"readOnly"},Yt={"float":"cssFloat"},Gt={},Jt={},Qt=function(e,t){return new Qt.fn.init(e,t)},Zt=/^\s*|\s*$/g,en=function(e){return null===e||e===undefined?"":(""+e).replace(Zt,"")},tn=function(e,t){var n,r,o,i;if(e)if((n=e.length)===undefined){for(r in e)if(e.hasOwnProperty(r)&&(i=e[r],!1===t.call(i,r,i)))break}else for(o=0;o<n&&(i=e[o],!1!==t.call(i,o,i));o++);return e},nn=function(e,t){var n=[];return tn(e,function(e,r){t(r,e)&&n.push(r)}),n},rn=function(e){return e?9===e.nodeType?e:e.ownerDocument:Pt};Qt.fn=Qt.prototype={constructor:Qt,selector:"",context:null,length:0,init:function(e,t){var n,r,o=this;if(!e)return o;if(e.nodeType)return o.context=o[0]=e,o.length=1,o;if(t&&t.nodeType)o.context=t;else{if(t)return Qt(e).attr(t);o.context=t=document}if(Vt(e)){if(o.selector=e,!(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Mt.exec(e)))return Qt(t).find(e);if(n[1])for(r=Ht(e,rn(t)).firstChild;r;)It.call(o,r),r=r.nextSibling;else{if(!(r=rn(t).getElementById(n[2])))return o;if(r.id!==n[2])return o.find(e);o.length=1,o[0]=r}}else this.add(e,!1);return o},toArray:function(){return Ot.toArray(this)},add:function(e,t){var n,r,o=this;if(Vt(e))return o.add(Qt(e));if(!1!==t)for(n=Qt.unique(o.toArray().concat(Qt.makeArray(e))),o.length=n.length,r=0;r<n.length;r++)o[r]=n[r];else It.apply(o,Qt.makeArray(e));return o},attr:function(e,t){var n,r=this;if("object"==typeof e)tn(e,function(e,t){r.attr(e,t)});else{if(!Ut(t)){if(r[0]&&1===r[0].nodeType){if((n=Gt[e])&&n.get)return n.get(r[0],e);if(Kt[e])return r.prop(e)?e:undefined;null===(t=r[0].getAttribute(e,2))&&(t=undefined)}return t}this.each(function(){var n;if(1===this.nodeType){if((n=Gt[e])&&n.set)return void n.set(this,t);null===t?this.removeAttribute(e,2):this.setAttribute(e,t,2)}})}return r},removeAttr:function(e){return this.attr(e,null)},prop:function(e,t){var n=this;if("object"==typeof(e=Xt[e]||e))tn(e,function(e,t){n.prop(e,t)});else{if(!Ut(t))return n[0]&&n[0].nodeType&&e in n[0]?n[0][e]:t;this.each(function(){1===this.nodeType&&(this[e]=t)})}return n},css:function(e,t){var n,r,o=this,i=function(e){return e.replace(/-(\D)/g,function(e,t){return t.toUpperCase()})},a=function(e){return e.replace(/[A-Z]/g,function(e){return"-"+e})};if("object"==typeof e)tn(e,function(e,t){o.css(e,t)});else if(Ut(t))e=i(e),"number"!=typeof t||Wt[e]||(t=t.toString()+"px"),o.each(function(){var n=this.style;if((r=Jt[e])&&r.set)r.set(this,t);else{try{this.style[Yt[e]||e]=t}catch(o){}null!==t&&""!==t||(n.removeProperty?n.removeProperty(a(e)):n.removeAttribute(e))}});else{if(n=o[0],(r=Jt[e])&&r.get)return r.get(n);if(n.ownerDocument.defaultView)try{return n.ownerDocument.defaultView.getComputedStyle(n,null).getPropertyValue(a(e))}catch(s){return undefined}else if(n.currentStyle)return n.currentStyle[i(e)]}return o},remove:function(){for(var e,t=this.length;t--;)e=this[t],Ft.clean(e),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var e,t=this.length;t--;)for(e=this[t];e.firstChild;)e.removeChild(e.firstChild);return this},html:function(e){var t,n=this;if(Ut(e)){t=n.length;try{for(;t--;)n[t].innerHTML=e}catch(r){Qt(n[t]).empty().append(e)}return n}return n[0]?n[0].innerHTML:""},text:function(e){var t,n=this;if(Ut(e)){for(t=n.length;t--;)"innerText"in n[t]?n[t].innerText=e:n[0].textContent=e;return n}return n[0]?n[0].innerText||n[0].textContent:""},append:function(){return qt(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.appendChild(e)})},prepend:function(){return qt(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.insertBefore(e,this.firstChild)},!0)},before:function(){return this[0]&&this[0].parentNode?qt(this,arguments,function(e){this.parentNode.insertBefore(e,this)}):this},after:function(){return this[0]&&this[0].parentNode?qt(this,arguments,function(e){this.parentNode.insertBefore(e,this.nextSibling)},!0):this},appendTo:function(e){return Qt(e).append(this),this},prependTo:function(e){return Qt(e).prepend(this),this},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){return $t(this,e)},wrapAll:function(e){return $t(this,e,!0)},wrapInner:function(e){return this.each(function(){Qt(this).contents().wrapAll(e)}),this},unwrap:function(){return this.parent().each(function(){Qt(this).replaceWith(this.childNodes)})},clone:function(){var e=[];return this.each(function(){e.push(this.cloneNode(!0))}),Qt(e)},addClass:function(e){return this.toggleClass(e,!0)},removeClass:function(e){return this.toggleClass(e,!1)},toggleClass:function(e,t){var n=this;return"string"!=typeof e?n:(-1!==e.indexOf(" ")?tn(e.split(" "),function(){n.toggleClass(this,t)}):n.each(function(n,r){var o,i;(i=jt(r,e))!==t&&(o=r.className,i?r.className=en((" "+o+" ").replace(" "+e+" "," ")):r.className+=o?" "+e:e)}),n)},hasClass:function(e){return jt(this[0],e)},each:function(e){return tn(this,e)},on:function(e,t){return this.each(function(){Ft.bind(this,e,t)})},off:function(e,t){return this.each(function(){Ft.unbind(this,e,t)})},trigger:function(e){return this.each(function(){"object"==typeof e?Ft.fire(this,e.type,e):Ft.fire(this,e)})},show:function(){return this.css("display","")},hide:function(){return this.css("display","none")},slice:function(){return new Qt(Lt.apply(this,arguments))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},find:function(e){var t,n,r=[];for(t=0,n=this.length;t<n;t++)Qt.find(e,this[t],r);return Qt(r)},filter:function(e){return Qt("function"==typeof e?nn(this.toArray(),function(t,n){return e(n,t)}):Qt.filter(e,this.toArray()))},closest:function(e){var t=[];return e instanceof Qt&&(e=e[0]),this.each(function(n,r){for(;r;){if("string"==typeof e&&Qt(r).is(e)){t.push(r);break}if(r===e){t.push(r);break}r=r.parentNode}}),Qt(t)},offset:function(e){var t,n,r,o,i=0,a=0;return e?this.css(e):((t=this[0])&&(r=(n=t.ownerDocument).documentElement,t.getBoundingClientRect&&(i=(o=t.getBoundingClientRect()).left+(r.scrollLeft||n.body.scrollLeft)-r.clientLeft,a=o.top+(r.scrollTop||n.body.scrollTop)-r.clientTop)),{left:i,top:a})},push:It,sort:[].sort,splice:[].splice},Ot.extend(Qt,{extend:Ot.extend,makeArray:function(e){return(t=e)&&t===t.window||e.nodeType?[e]:Ot.toArray(e);var t},inArray:function(e,t){var n;if(t.indexOf)return t.indexOf(e);for(n=t.length;n--;)if(t[n]===e)return n;return-1},isArray:Ot.isArray,each:tn,trim:en,grep:nn,find:lt,expr:lt.selectors,unique:lt.uniqueSort,text:lt.getText,contains:lt.contains,filter:function(e,t,n){var r=t.length;for(n&&(e=":not("+e+")");r--;)1!==t[r].nodeType&&t.splice(r,1);return t=1===t.length?Qt.find.matchesSelector(t[0],e)?[t[0]]:[]:Qt.find.matches(e,t)}});var on=function(e,t,n){var r=[],o=e[t];for("string"!=typeof n&&n instanceof Qt&&(n=n[0]);o&&9!==o.nodeType;){if(n!==undefined){if(o===n)break;if("string"==typeof n&&Qt(o).is(n))break}1===o.nodeType&&r.push(o),o=o[t]}return r},an=function(e,t,n,r){var o=[];for(r instanceof Qt&&(r=r[0]);e;e=e[t])if(!n||e.nodeType===n){if(r!==undefined){if(e===r)break;if("string"==typeof r&&Qt(e).is(r))break}o.push(e)}return o},sn=function(e,t,n){for(e=e[t];e;e=e[t])if(e.nodeType===n)return e;return null};tn({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return on(e,"parentNode")},next:function(e){return sn(e,"nextSibling",1)},prev:function(e){return sn(e,"previousSibling",1)},children:function(e){return an(e.firstChild,"nextSibling",1)},contents:function(e){return Ot.toArray(("iframe"===e.nodeName?e.contentDocument||e.contentWindow.document:e).childNodes)}},function(e,t){Qt.fn[e]=function(n){var r=[];return this.each(function(){var e=t.call(r,this,n,r);e&&(Qt.isArray(e)?r.push.apply(r,e):r.push(e))}),this.length>1&&(zt[e]||(r=Qt.unique(r)),0===e.indexOf("parents")&&(r=r.reverse())),r=Qt(r),n?r.filter(n):r}}),tn({parentsUntil:function(e,t){return on(e,"parentNode",t)},nextUntil:function(e,t){return an(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return an(e,"previousSibling",1,t).slice(1)}},function(e,t){Qt.fn[e]=function(n,r){var o=[];return this.each(function(){var e=t.call(o,this,n,o);e&&(Qt.isArray(e)?o.push.apply(o,e):o.push(e))}),this.length>1&&(o=Qt.unique(o),0!==e.indexOf("parents")&&"prevUntil"!==e||(o=o.reverse())),o=Qt(o),r?o.filter(r):o}}),Qt.fn.is=function(e){return!!e&&this.filter(e).length>0},Qt.fn.init.prototype=Qt.fn,Qt.overrideDefaults=function(e){var t,n=function(r,o){return t=t||e(),0===arguments.length&&(r=t.element),o||(o=t.context),new n.fn.init(r,o)};return Qt.extend(n,this),n};var un=function(e,t,n){tn(n,function(n,r){e[n]=e[n]||{},e[n][t]=r})};me.ie&&me.ie<8&&(un(Gt,"get",{maxlength:function(e){var t=e.maxLength;return 2147483647===t?undefined:t},size:function(e){var t=e.size;return 20===t?undefined:t},"class":function(e){return e.className},style:function(e){var t=e.style.cssText;return 0===t.length?undefined:t}}),un(Gt,"set",{"class":function(e,t){e.className=t},style:function(e,t){e.style.cssText=t}})),me.ie&&me.ie<9&&(Yt["float"]="styleFloat",un(Jt,"set",{opacity:function(e,t){var n=e.style;null===t||""===t?n.removeAttribute("filter"):(n.zoom=1,n.filter="alpha(opacity="+100*t+")")}})),Qt.attrHooks=Gt,Qt.cssHooks=Jt;var cn,ln,fn,dn,mn=function(e){var t,n=!1;return function(){return n||(n=!0,t=e.apply(null,arguments)),t}},pn=function(e,t){var n=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(r.test(t))return r}return undefined}(e,t);if(!n)return{major:0,minor:0};var r=function(e){return Number(t.replace(n,"$"+e))};return hn(r(1),r(2))},gn=function(){return hn(0,0)},hn=function(e,t){return{major:e,minor:t}},vn={nu:hn,detect:function(e,t){var n=String(t).toLowerCase();return 0===e.length?gn():pn(e,n)},unknown:gn},yn="Firefox",bn=function(e,t){return function(){return t===e}},Cn=function(e){var t=e.current;return{current:t,version:e.version,isEdge:bn("Edge",t),isChrome:bn("Chrome",t),isIE:bn("IE",t),isOpera:bn("Opera",t),isFirefox:bn(yn,t),isSafari:bn("Safari",t)}},xn={unknown:function(){return Cn({current:undefined,version:vn.unknown()})},nu:Cn,edge:y.constant("Edge"),chrome:y.constant("Chrome"),ie:y.constant("IE"),opera:y.constant("Opera"),firefox:y.constant(yn),safari:y.constant("Safari")},wn="Windows",Nn="Android",En="Solaris",Sn="FreeBSD",kn=function(e,t){return function(){return t===e}},Tn=function(e){var t=e.current;return{current:t,version:e.version,isWindows:kn(wn,t),isiOS:kn("iOS",t),isAndroid:kn(Nn,t),isOSX:kn("OSX",t),isLinux:kn("Linux",t),isSolaris:kn(En,t),isFreeBSD:kn(Sn,t)}},An={unknown:function(){return Tn({current:undefined,version:vn.unknown()})},nu:Tn,windows:y.constant(wn),ios:y.constant("iOS"),android:y.constant(Nn),linux:y.constant("Linux"),osx:y.constant("OSX"),solaris:y.constant(En),freebsd:y.constant(Sn)},_n=function(e,t){var n=String(t).toLowerCase();return M.find(e,function(e){return e.search(n)})},Bn=function(e,t){return _n(e,t).map(function(e){var n=vn.detect(e.versionRegexes,t);return{current:e.name,version:n}})},Rn=function(e,t){return _n(e,t).map(function(e){var n=vn.detect(e.versionRegexes,t);return{current:e.name,version:n}})},Dn=function(e,t){return-1!==e.indexOf(t)},On=function(e){return e.replace(/^\s+|\s+$/g,"")},Pn=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,In=function(e){return function(t){return Dn(t,e)}},Ln=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return Dn(e,"edge/")&&Dn(e,"chrome")&&Dn(e,"safari")&&Dn(e,"applewebkit")}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Pn],search:function(e){return Dn(e,"chrome")&&!Dn(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return Dn(e,"msie")||Dn(e,"trident")}},{name:"Opera",versionRegexes:[Pn,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:In("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:In("firefox")},{name:"Safari",versionRegexes:[Pn,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(Dn(e,"safari")||Dn(e,"mobile/"))&&Dn(e,"applewebkit")}}],Mn=[{name:"Windows",search:In("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return Dn(e,"iphone")||Dn(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:In("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:In("os x"),versionRegexes:[/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:In("linux"),versionRegexes:[]},{name:"Solaris",search:In("sunos"),versionRegexes:[]},{name:"FreeBSD",search:In("freebsd"),versionRegexes:[]}],Fn={browsers:y.constant(Ln),oses:y.constant(Mn)},zn=function(e){var t,n,r,o,i,a,s,u,c,l,f,d=Fn.browsers(),m=Fn.oses(),p=Bn(d,e).fold(xn.unknown,xn.nu),g=Rn(m,e).fold(An.unknown,An.nu);return{browser:p,os:g,deviceType:(n=p,r=e,o=(t=g).isiOS()&&!0===/ipad/i.test(r),i=t.isiOS()&&!o,a=t.isAndroid()&&3===t.version.major,s=t.isAndroid()&&4===t.version.major,u=o||a||s&&!0===/mobile/i.test(r),c=t.isiOS()||t.isAndroid(),l=c&&!u,f=n.isSafari()&&t.isiOS()&&!1===/safari/i.test(r),{isiPad:y.constant(o),isiPhone:y.constant(i),isTablet:y.constant(u),isPhone:y.constant(l),isTouch:y.constant(c),isAndroid:t.isAndroid,isiOS:t.isiOS,isWebView:y.constant(f)})}},Un={detect:mn(function(){var e=navigator.userAgent;return zn(e)})},Vn=function(e){if(null===e||e===undefined)throw new Error("Node cannot be null or undefined");return{dom:y.constant(e)}},Hn={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1)throw console.error("HTML does not have a single root node",e),"HTML must have a single root node";return Vn(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return Vn(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return Vn(n)},fromDom:Vn,fromPoint:function(e,t,n){return E.from(e.dom().elementFromPoint(t,n)).map(Vn)}},qn=8,jn=9,$n=1,Wn=3,Kn=function(e){return e.dom().nodeName.toLowerCase()},Xn=function(e){return e.dom().nodeType},Yn=function(e){return function(t){return Xn(t)===e}},Gn=Yn($n),Jn=Yn(Wn),Qn=Yn(jn),Zn={name:Kn,type:Xn,value:function(e){return e.dom().nodeValue},isElement:Gn,isText:Jn,isDocument:Qn,isComment:function(e){return Xn(e)===qn||"#comment"===Kn(e)}},er=function(e){return function(t){return function(e){if(null===e)return"null";var t=typeof e;return"object"===t&&Array.prototype.isPrototypeOf(e)?"array":"object"===t&&String.prototype.isPrototypeOf(e)?"string":t}(t)===e}},tr={isString:er("string"),isObject:er("object"),isArray:er("array"),isNull:er("null"),isBoolean:er("boolean"),isUndefined:er("undefined"),isFunction:er("function"),isNumber:er("number")},nr=(cn=Object.keys)===undefined?function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t}:cn,rr=function(e,t){for(var n=nr(e),r=0,o=n.length;r<o;r++){var i=n[r];t(e[i],i,e)}},or=function(e,t){var n={};return rr(e,function(r,o){var i=t(r,o,e);n[i.k]=i.v}),n},ir=function(e,t){var n=[];return rr(e,function(e,r){n.push(t(e,r))}),n},ar=function(e){return ir(e,function(e){return e})},sr={bifilter:function(e,t){var n={},r={};return rr(e,function(e,o){(t(e,o)?n:r)[o]=e}),{t:n,f:r}},each:rr,map:function(e,t){return or(e,function(e,n,r){return{k:n,v:t(e,n,r)}})},mapToArray:ir,tupleMap:or,find:function(e,t){for(var n=nr(e),r=0,o=n.length;r<o;r++){var i=n[r],a=e[i];if(t(a,i,e))return E.some(a)}return E.none()},keys:nr,values:ar,size:function(e){return ar(e).length}},ur=function(e,t,n){if(!(tr.isString(n)||tr.isBoolean(n)||tr.isNumber(n)))throw console.error("Invalid call to Attr.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")},cr=function(e,t,n){ur(e.dom(),t,n)},lr=function(e,t){var n=e.dom().getAttribute(t);return null===n?undefined:n},fr=function(e,t){var n=e.dom();return!(!n||!n.hasAttribute)&&n.hasAttribute(t)},dr={clone:function(e){return M.foldl(e.dom().attributes,function(e,t){return e[t.name]=t.value,e},{})},set:cr,setAll:function(e,t){var n=e.dom();sr.each(t,function(e,t){ur(n,t,e)})},get:lr,has:fr,remove:function(e,t){e.dom().removeAttribute(t)},hasNone:function(e){var t=e.dom().attributes;return t===undefined||null===t||0===t.length},transfer:function(e,t,n){Zn.isElement(e)&&Zn.isElement(t)&&M.each(n,function(n){var r,o,i;o=t,fr(r=e,i=n)&&!fr(o,i)&&cr(o,i,lr(r,i))})}},mr=mn(function(){return pr(Hn.fromDom(document))}),pr=function(e){var t=e.dom().body;if(null===t||t===undefined)throw"Body is not available yet";return Hn.fromDom(t)},gr={body:mr,getBody:pr,inBody:function(e){var t=Zn.isText(e)?e.dom().parentNode:e.dom();return t!==undefined&&null!==t&&t.ownerDocument.body.contains(t)}},hr=function(e){return e.style!==undefined},vr=function(e,t,n){if(!tr.isString(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);hr(e)&&e.style.setProperty(t,n)},yr=function(e,t){return hr(e)?e.style.getPropertyValue(t):""},br=function(e,t){var n=e.dom();sr.each(t,function(e,t){vr(n,t,e)})},Cr=function(e,t){var n=e.dom(),r=window.getComputedStyle(n).getPropertyValue(t),o=""!==r||gr.inBody(e)?r:yr(n,t);return null===o?undefined:o},xr=function(){var e=arguments;return function(){for(var t=new Array(arguments.length),n=0;n<t.length;n++)t[n]=arguments[n];if(e.length!==t.length)throw new Error('Wrong number of arguments to struct. Expected "['+e.length+']", got '+t.length+" arguments");var r={};return M.each(e,function(e,n){r[e]=y.constant(t[n])}),r}},wr=function(e,t){var n=[],r=function(e){return n.push(e),t(e)},o=t(e);do{o=o.bind(r)}while(o.isSome());return n},Nr=function(){return V("Node")},Er=function(e,t,n){return 0!=(e.compareDocumentPosition(t)&n)},Sr=function(e,t){return Er(e,t,Nr().DOCUMENT_POSITION_CONTAINED_BY)},kr=$n,Tr=jn,Ar=function(e){return e.nodeType!==kr&&e.nodeType!==Tr||0===e.childElementCount},_r={all:function(e,t){var n=t===undefined?document:t.dom();return Ar(n)?[]:M.map(n.querySelectorAll(e),Hn.fromDom)},is:function(e,t){var n=e.dom();if(n.nodeType!==kr)return!1;if(n.matches!==undefined)return n.matches(t);if(n.msMatchesSelector!==undefined)return n.msMatchesSelector(t);if(n.webkitMatchesSelector!==undefined)return n.webkitMatchesSelector(t);if(n.mozMatchesSelector!==undefined)return n.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")},one:function(e,t){var n=t===undefined?document:t.dom();return Ar(n)?E.none():E.from(n.querySelector(e)).map(Hn.fromDom)}},Br=function(e,t){return e.dom()===t.dom()},Rr=Un.detect().browser.isIE()?function(e,t){return Sr(e.dom(),t.dom())}:function(e,t){var n=e.dom(),r=t.dom();return n!==r&&n.contains(r)},Dr={eq:Br,isEqualNode:function(e,t){return e.dom().isEqualNode(t.dom())},member:function(e,t){return M.exists(t,y.curry(Br,e))},contains:Rr,is:_r.is},Or=function(e){return Hn.fromDom(e.dom().ownerDocument)},Pr=function(e){var t=e.dom();return E.from(t.parentNode).map(Hn.fromDom)},Ir=function(e){var t=e.dom();return E.from(t.previousSibling).map(Hn.fromDom)},Lr=function(e){var t=e.dom();return E.from(t.nextSibling).map(Hn.fromDom)},Mr=function(e){var t=e.dom();return M.map(t.childNodes,Hn.fromDom)},Fr=function(e,t){var n=e.dom().childNodes;return E.from(n[t]).map(Hn.fromDom)},zr=xr("element","offset"),Ur={owner:Or,defaultView:function(e){var t=e.dom().ownerDocument.defaultView;return Hn.fromDom(t)},documentElement:function(e){var t=Or(e);return Hn.fromDom(t.dom().documentElement)},parent:Pr,findIndex:function(e){return Pr(e).bind(function(t){var n=Mr(t);return M.findIndex(n,function(t){return Dr.eq(e,t)})})},parents:function(e,t){for(var n=tr.isFunction(t)?t:y.constant(!1),r=e.dom(),o=[];null!==r.parentNode&&r.parentNode!==undefined;){var i=r.parentNode,a=Hn.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o},siblings:function(e){return Pr(e).map(Mr).map(function(t){return M.filter(t,function(t){return!Dr.eq(e,t)})}).getOr([])},prevSibling:Ir,offsetParent:function(e){var t=e.dom();return E.from(t.offsetParent).map(Hn.fromDom)},prevSiblings:function(e){return M.reverse(wr(e,Ir))},nextSibling:Lr,nextSiblings:function(e){return wr(e,Lr)},children:Mr,child:Fr,firstChild:function(e){return Fr(e,0)},lastChild:function(e){return Fr(e,e.dom().childNodes.length-1)},childNodesCount:function(e){return e.dom().childNodes.length},hasChildNodes:function(e){return e.dom().hasChildNodes()},leaf:function(e,t){var n=Mr(e);return n.length>0&&t<n.length?zr(n[t],0):zr(e,t)}},Vr=Un.detect().browser,Hr=function(e){return M.find(e,Zn.isElement)},qr=function(e,t,n){var r,o,i,a=0,s=0,u=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===Cr(Hn.fromDom(e),"position"))return{x:a=(o=t.getBoundingClientRect()).left+(u.documentElement.scrollLeft||e.scrollLeft)-u.documentElement.clientLeft,y:s=o.top+(u.documentElement.scrollTop||e.scrollTop)-u.documentElement.clientTop};for(r=t;r&&r!==n&&r.nodeType;)a+=r.offsetLeft||0,s+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!==n&&r.nodeType;)a-=r.scrollLeft||0,s-=r.scrollTop||0,r=r.parentNode;s+=(i=Hn.fromDom(t),Vr.isFirefox()&&"table"===Zn.name(i)?Hr(Ur.children(i)).filter(function(e){return"caption"===Zn.name(e)}).bind(function(e){return Hr(Ur.nextSiblings(e)).map(function(t){var n=t.dom().offsetTop,r=e.dom().offsetTop,o=e.dom().offsetHeight;return n<=r?-o:0})}).getOr(0):0)}return{x:a,y:s}},jr=function(e){var t=E.none(),n=[],r=function(e){o()?a(e):n.push(e)},o=function(){return t.isSome()},i=function(e){M.each(e,a)},a=function(e){t.each(function(t){setTimeout(function(){e(t)},0)})};return e(function(e){t=E.some(e),i(n),n=[]}),{get:r,map:function(e){return jr(function(t){r(function(n){t(e(n))})})},isReady:o}},$r={nu:jr,pure:function(e){return jr(function(t){t(e)})}},Wr=function(e){return function(){var t=Array.prototype.slice.call(arguments),n=this;setTimeout(function(){e.apply(n,t)},0)}},Kr=function(e){var t=function(t){e(Wr(t))};return{map:function(e){return Kr(function(n){t(function(t){var r=e(t);n(r)})})},bind:function(e){return Kr(function(n){t(function(t){e(t).get(n)})})},anonBind:function(e){return Kr(function(n){t(function(t){e.get(n)})})},toLazy:function(){return $r.nu(t)},get:t}},Xr={nu:Kr,pure:function(e){return Kr(function(t){t(e)})}},Yr=function(e,t){return t(function(t){var n=[],r=0;0===e.length?t([]):M.each(e,function(o,i){var a;o.get((a=i,function(o){n[a]=o,++r>=e.length&&t(n)}))})})},Gr=function(e){return Yr(e,Xr.nu)},Jr=Gr,Qr=function(e){return{is:function(t){return e===t},isValue:y.constant(!0),isError:y.constant(!1),getOr:y.constant(e),getOrThunk:y.constant(e),getOrDie:y.constant(e),or:function(t){return Qr(e)},orThunk:function(t){return Qr(e)},fold:function(t,n){return n(e)},map:function(t){return Qr(t(e))},each:function(t){t(e)},bind:function(t){return t(e)},exists:function(t){return t(e)},forall:function(t){return t(e)},toOption:function(){return E.some(e)}}},Zr=function(e){return{is:y.constant(!1),isValue:y.constant(!1),isError:y.constant(!0),getOr:y.identity,getOrThunk:function(e){return e()},getOrDie:function(){return y.die(e)()},or:function(e){return e},orThunk:function(e){return e()},fold:function(t,n){return t(e)},map:function(t){return Zr(e)},each:y.noop,bind:function(t){return Zr(e)},exists:y.constant(!1),forall:y.constant(!0),toOption:E.none}},eo={value:Qr,error:Zr},to=function(e,t){var n=e,r=function(e,n,r,o){var i,a;if(e){if(!o&&e[n])return e[n];if(e!==t){if(i=e[r])return i;for(a=e.parentNode;a&&a!==t;a=a.parentNode)if(i=a[r])return i}}};this.current=function(){return n},this.next=function(e){return n=r(n,"firstChild","nextSibling",e)},this.prev=function(e){return n=r(n,"lastChild","previousSibling",e)},this.prev2=function(e){return n=function(e,n,r,o){var i,a,s;if(e){if(i=e[r],t&&i===t)return;if(i){if(!o)for(s=i[n];s;s=s[n])if(!s[n])return s;return i}if((a=e.parentNode)&&a!==t)return a}}(n,"lastChild","previousSibling",e)}},no=function(e){var t;return function(n){return(t=t||M.mapToObject(e,y.constant(!0))).hasOwnProperty(Zn.name(n))}},ro=no(["h1","h2","h3","h4","h5","h6"]),oo=no(["article","aside","details","div","dt","figcaption","footer","form","fieldset","header","hgroup","html","main","nav","section","summary","body","p","dl","multicol","dd","figure","address","center","blockquote","h1","h2","h3","h4","h5","h6","listing","xmp","pre","plaintext","menu","dir","ul","ol","li","hr","table","tbody","thead","tfoot","th","tr","td","caption"]),io={isBlock:oo,isInline:function(e){return Zn.isElement(e)&&!oo(e)},isHeading:ro,isTextBlock:no(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),isList:no(["ul","ol","dl"]),isListItem:no(["li","dd","dt"]),isVoid:no(["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param","embed","source","wbr","track"]),isTableSection:no(["thead","tbody","tfoot"]),isTableCell:no(["td","th"]),isBr:function(e){return Zn.isElement(e)&&"br"===Zn.name(e)}},ao=function(e){return function(t){return!!t&&t.nodeType===e}},so=ao(1),uo=function(e){var t=e.toLowerCase().split(" ");return function(e){var n,r;if(e&&e.nodeType)for(r=e.nodeName.toLowerCase(),n=0;n<t.length;n++)if(r===t[n])return!0;return!1}},co=function(e){return function(t){if(so(t)){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1}},lo=ao(3),fo=ao(8),mo=ao(9),po=uo("br"),go=co("true"),ho=co("false"),vo={isText:lo,isElement:so,isComment:fo,isDocument:mo,isBr:po,isContentEditableTrue:go,isContentEditableFalse:ho,matchNodeNames:uo,hasPropValue:function(e,t){return function(n){return so(n)&&n[e]===t}},hasAttribute:function(e,t){return function(t){return so(t)&&t.hasAttribute(e)}},hasAttributeValue:function(e,t){return function(n){return so(n)&&n.getAttribute(e)===t}},matchStyleValues:function(e,t){var n=t.toLowerCase().split(" ");return function(t){var r;if(so(t))for(r=0;r<n.length;r++)if(t.ownerDocument.defaultView.getComputedStyle(t,null).getPropertyValue(e)===n[r])return!0;return!1}},isBogus:function(e){return so(e)&&e.hasAttribute("data-mce-bogus")}},yo=function(e){return e&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")},bo=function(e,t){var n,r=t.childNodes;if(!vo.isElement(t)||!yo(t)){for(n=r.length-1;n>=0;n--)bo(e,r[n]);if(!1===vo.isDocument(t)){if(vo.isText(t)&&t.nodeValue.length>0){var o=Ot.trim(t.nodeValue).length;if(e.isBlock(t.parentNode)||o>0)return;if(0===o&&(a=(i=t).previousSibling&&"SPAN"===i.previousSibling.nodeName,s=i.nextSibling&&"SPAN"===i.nextSibling.nodeName,a&&s))return}else if(vo.isElement(t)&&(1===(r=t.childNodes).length&&yo(r[0])&&t.parentNode.insertBefore(r[0],t),r.length||io.isVoid(Hn.fromDom(t))))return;e.remove(t)}var i,a,s;return t}},Co={trimNode:bo},xo=Ot.makeMap,wo=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,No=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Eo=/[<>&\"\']/g,So=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,ko={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};fn={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},dn={"<":"<",">":">","&":"&",""":'"',"'":"'"};var To=function(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)r=String.fromCharCode(parseInt(e[n],t)),fn[r]||(o="&"+e[n+1]+";",i[r]=o,i[o]=r);return i}};ln=To("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);var Ao={encodeRaw:function(e,t){return e.replace(t?wo:No,function(e){return fn[e]||e})},encodeAllRaw:function(e){return(""+e).replace(Eo,function(e){return fn[e]||e})},encodeNumeric:function(e,t){return e.replace(t?wo:No,function(e){return e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":fn[e]||"&#"+e.charCodeAt(0)+";"})},encodeNamed:function(e,t,n){return n=n||ln,e.replace(t?wo:No,function(e){return fn[e]||n[e]||e})},getEncodeFunc:function(e,t){return t=To(t)||ln,(e=xo(e.replace(/\+/g,","))).named&&e.numeric?function(e,n){return e.replace(n?wo:No,function(e){return fn[e]!==undefined?fn[e]:t[e]!==undefined?t[e]:e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";"})}:e.named?t?function(e,n){return Ao.encodeNamed(e,n,t)}:Ao.encodeNamed:e.numeric?Ao.encodeNumeric:Ao.encodeRaw},decode:function(e){return e.replace(So,function(e,t){return t?(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))>65535?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):ko[t]||String.fromCharCode(t):dn[e]||ln[e]||(n=e,(r=Hn.fromTag("div").dom()).innerHTML=n,r.textContent||r.innerText||n);var n,r})}},_o={},Bo={},Ro=Ot.makeMap,Do=Ot.each,Oo=Ot.extend,Po=Ot.explode,Io=Ot.inArray,Lo=function(e,t){return(e=Ot.trim(e))?e.split(t||" "):[]},Mo=function(e,t){var n;return e&&(n={},"string"==typeof e&&(e={"*":e}),Do(e,function(e,r){n[r]=n[r.toUpperCase()]="map"===t?Ro(e,/[, ]/):Po(e,/[, ]/)})),n},Fo=function(e){var t,n,r,o,i,a,s,u,c,l,f,d,m,p,g,h,v,y,b,C,x,w,N,E={},S={},k={},T=[],A={},_={},B=function(t,n,r){var o=e[t];return o?o=Ro(o,/[, ]/,Ro(o.toUpperCase(),/[, ]/)):(o=_o[t])||(o=Ro(n," ",Ro(n.toUpperCase()," ")),o=Oo(o,r),_o[t]=o),o};p=(e=e||{}).schema,x={},w=function(e,t,n){var r,o,i,a=function(e,t){var n,r,o={};for(n=0,r=e.length;n<r;n++)o[e[n]]=t||{};return o};for(n=n||[],t=t||"","string"==typeof n&&(n=Lo(n)),r=(e=Lo(e)).length;r--;)i={attributes:a(o=Lo([g,t].join(" "))),attributesOrder:o,children:a(n,Bo)},x[e[r]]=i},N=function(e,t){var n,r,o,i;for(n=(e=Lo(e)).length,t=Lo(t);n--;)for(r=x[e[n]],o=0,i=t.length;o<i;o++)r.attributes[t[o]]={},r.attributesOrder.push(t[o])},r=_o[p]?_o[p]:(g="id accesskey class dir lang style tabindex title role",h="address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul",v="a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment","html4"!==p&&(g+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",h+=" article aside details dialog figure header footer hgroup section nav",v+=" audio canvas command datalist mark meter output picture progress time wbr video ruby bdi keygen"),"html5-strict"!==p&&(g+=" xml:lang",v=[v,C="acronym applet basefont big font strike tt"].join(" "),Do(Lo(C),function(e){w(e,"",v)}),h=[h,b="center dir isindex noframes"].join(" "),y=[h,v].join(" "),Do(Lo(b),function(e){w(e,"",y)})),y=y||[h,v].join(" "),w("html","manifest","head body"),w("head","","base command link meta noscript script style title"),w("title hr noscript br"),w("base","href target"),w("link","href rel media hreflang type sizes hreflang"),w("meta","name http-equiv content charset"),w("style","media type scoped"),w("script","src async defer type charset"),w("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",y),w("address dt dd div caption","",y),w("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",v),w("blockquote","cite",y),w("ol","reversed start type","li"),w("ul","","li"),w("li","value",y),w("dl","","dt dd"),w("a","href target rel media hreflang type",v),w("q","cite",v),w("ins del","cite datetime",y),w("img","src sizes srcset alt usemap ismap width height"),w("iframe","src name width height",y),w("embed","src type width height"),w("object","data type typemustmatch name usemap form width height",[y,"param"].join(" ")),w("param","name value"),w("map","name",[y,"area"].join(" ")),w("area","alt coords shape href target rel media hreflang type"),w("table","border","caption colgroup thead tfoot tbody tr"+("html4"===p?" col":"")),w("colgroup","span","col"),w("col","span"),w("tbody thead tfoot","","tr"),w("tr","","td th"),w("td","colspan rowspan headers",y),w("th","colspan rowspan headers scope abbr",y),w("form","accept-charset action autocomplete enctype method name novalidate target",y),w("fieldset","disabled form name",[y,"legend"].join(" ")),w("label","form for",v),w("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),w("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===p?y:v),w("select","disabled form multiple name required size","option optgroup"),w("optgroup","disabled label","option"),w("option","disabled label selected value"),w("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),w("menu","type label",[y,"li"].join(" ")),w("noscript","",y),"html4"!==p&&(w("wbr"),w("ruby","",[v,"rt rp"].join(" ")),w("figcaption","",y),w("mark rt rp summary bdi","",v),w("canvas","width height",y),w("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[y,"track source"].join(" ")),w("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[y,"track source"].join(" ")),w("picture","","img source"),w("source","src srcset type media sizes"),w("track","kind src srclang label default"),w("datalist","",[v,"option"].join(" ")),w("article section nav aside header footer","",y),w("hgroup","","h1 h2 h3 h4 h5 h6"),w("figure","",[y,"figcaption"].join(" ")),w("time","datetime",v),w("dialog","open",y),w("command","type label icon disabled checked radiogroup command"),w("output","for form name",v),w("progress","value max",v),w("meter","value min max low high optimum",v),w("details","open",[y,"summary"].join(" ")),w("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!==p&&(N("script","language xml:space"),N("style","xml:space"),N("object","declare classid code codebase codetype archive standby align border hspace vspace"),N("embed","align name hspace vspace"),N("param","valuetype type"),N("a","charset name rev shape coords"),N("br","clear"),N("applet","codebase archive code object alt name width height align hspace vspace"),N("img","name longdesc align border hspace vspace"),N("iframe","longdesc frameborder marginwidth marginheight scrolling align"),N("font basefont","size color face"),N("input","usemap align"),N("select","onchange"),N("textarea"),N("h1 h2 h3 h4 h5 h6 div p legend caption","align"),N("ul","type compact"),N("li","type"),N("ol dl menu dir","compact"),N("pre","width xml:space"),N("hr","align noshade size width"),N("isindex","prompt"),N("table","summary width frame rules cellspacing cellpadding align bgcolor"),N("col","width align char charoff valign"),N("colgroup","width align char charoff valign"),N("thead","align char charoff valign"),N("tr","align char charoff valign bgcolor"),N("th","axis align char charoff valign nowrap bgcolor width height"),N("form","accept"),N("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),N("tfoot","align char charoff valign"),N("tbody","align char charoff valign"),N("area","nohref"),N("body","background bgcolor text link vlink alink")),"html4"!==p&&(N("input button select textarea","autofocus"),N("input textarea","placeholder"),N("a","download"),N("link script img","crossorigin"),N("iframe","sandbox seamless allowfullscreen")),Do(Lo("a form meter progress dfn"),function(e){x[e]&&delete x[e].children[e]}),delete x.caption.children.table,delete x.script,_o[p]=x,x),!1===e.verify_html&&(e.valid_elements="*[*]"),t=Mo(e.valid_styles),n=Mo(e.invalid_styles,"map"),u=Mo(e.valid_classes,"map"),o=B("whitespace_elements","pre script noscript style textarea video audio iframe object code"),i=B("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),a=B("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),s=B("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls"),l=B("non_empty_elements","td th iframe video audio object script pre code",a),f=B("move_caret_before_on_enter_elements","table",l),d=B("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside nav figure"),c=B("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption",d),m=B("text_inline_elements","span strong b em i font strike u var cite dfn code mark q sup sub samp"),Do((e.special||"script noscript noframes noembed title style textarea xmp").split(" "),function(e){_[e]=new RegExp("</"+e+"[^>]*>","gi")});var R=function(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")},D=function(e){var t,n,r,o,i,a,s,u,c,l,f,d,m,p,g,h,v,y,b,C=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/,x=/^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,w=/[*?+]/;if(e)for(e=Lo(e,","),S["@"]&&(h=S["@"].attributes,v=S["@"].attributesOrder),t=0,n=e.length;t<n;t++)if(i=C.exec(e[t])){if(p=i[1],c=i[2],g=i[3],u=i[5],a={attributes:d={},attributesOrder:m=[]},"#"===p&&(a.paddEmpty=!0),"-"===p&&(a.removeEmpty=!0),"!"===i[4]&&(a.removeEmptyAttrs=!0),h){for(y in h)d[y]=h[y];m.push.apply(m,v)}if(u)for(r=0,o=(u=Lo(u,"|")).length;r<o;r++)if(i=x.exec(u[r])){if(s={},f=i[1],l=i[2].replace(/[\\:]:/g,":"),p=i[3],b=i[4],"!"===f&&(a.attributesRequired=a.attributesRequired||[],a.attributesRequired.push(l),s.required=!0),"-"===f){delete d[l],m.splice(Io(m,l),1);continue}p&&("="===p&&(a.attributesDefault=a.attributesDefault||[],a.attributesDefault.push({name:l,value:b}),s.defaultValue=b),":"===p&&(a.attributesForced=a.attributesForced||[],a.attributesForced.push({name:l,value:b}),s.forcedValue=b),"<"===p&&(s.validValues=Ro(b,"?"))),w.test(l)?(a.attributePatterns=a.attributePatterns||[],s.pattern=R(l),a.attributePatterns.push(s)):(d[l]||m.push(l),d[l]=s)}h||"@"!==c||(h=d,v=m),g&&(a.outputName=c,S[g]=a),w.test(c)?(a.pattern=R(c),T.push(a)):S[c]=a}},O=function(e){S={},T=[],D(e),Do(r,function(e,t){k[t]=e.children})},P=function(e){var t=/^(~)?(.+)$/;e&&(_o.text_block_elements=_o.block_elements=null,Do(Lo(e,","),function(e){var n=t.exec(e),r="~"===n[1],o=r?"span":"div",i=n[2];if(k[i]=k[o],A[i]=o,r||(c[i.toUpperCase()]={},c[i]={}),!S[i]){var a=S[o];delete(a=Oo({},a)).removeEmptyAttrs,delete a.removeEmpty,S[i]=a}Do(k,function(e,t){e[o]&&(k[t]=e=Oo({},k[t]),e[i]=e[o])})}))},I=function(t){var n=/^([+\-]?)(\w+)\[([^\]]+)\]$/;_o[e.schema]=null,t&&Do(Lo(t,","),function(e){var t,r,o=n.exec(e);o&&(r=o[1],t=r?k[o[2]]:k[o[2]]={"#comment":{}},t=k[o[2]],Do(Lo(o[3],"|"),function(e){"-"===r?delete t[e]:t[e]={}}))})},L=function(e){var t,n=S[e];if(n)return n;for(t=T.length;t--;)if((n=T[t]).pattern.test(e))return n};return e.valid_elements?O(e.valid_elements):(Do(r,function(e,t){S[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},k[t]=e.children}),"html5"!==e.schema&&Do(Lo("strong/b em/i"),function(e){e=Lo(e,"/"),S[e[1]].outputName=e[0]}),Do(Lo("ol ul sub sup blockquote span font a table tbody tr strong em b i"),function(e){S[e]&&(S[e].removeEmpty=!0)}),Do(Lo("p h1 h2 h3 h4 h5 h6 th td pre div address caption li"),function(e){S[e].paddEmpty=!0}),Do(Lo("span"),function(e){S[e].removeEmptyAttrs=!0})),P(e.custom_elements),I(e.valid_children),D(e.extended_valid_elements),I("+ol[ul|ol],+ul[ul|ol]"),Do({dd:"dl",dt:"dl",li:"ul ol",td:"tr",th:"tr",tr:"tbody thead tfoot",tbody:"table",thead:"table",tfoot:"table",legend:"fieldset",area:"map",param:"video audio object"},function(e,t){S[t]&&(S[t].parentsRequired=Lo(e))}),e.invalid_elements&&Do(Po(e.invalid_elements),function(e){S[e]&&delete S[e]}),L("span")||D("span[!data-mce-type|*]"),E.children=k,E.getValidStyles=function(){return t},E.getInvalidStyles=function(){return n},E.getValidClasses=function(){return u},E.getBoolAttrs=function(){return s},E.getBlockElements=function(){return c},E.getTextBlockElements=function(){return d},E.getTextInlineElements=function(){return m},E.getShortEndedElements=function(){return a},E.getSelfClosingElements=function(){return i},E.getNonEmptyElements=function(){return l},E.getMoveCaretBeforeOnEnterElements=function(){return f},E.getWhiteSpaceElements=function(){return o},E.getSpecialElements=function(){return _},E.isValidChild=function(e,t){var n=k[e.toLowerCase()];return!(!n||!n[t.toLowerCase()])},E.isValid=function(e,t){var n,r,o=L(e);if(o){if(!t)return!0;if(o.attributes[t])return!0;if(n=o.attributePatterns)for(r=n.length;r--;)if(n[r].pattern.test(e))return!0}return!1},E.getElementRule=L,E.getCustomElements=function(){return A},E.addValidElements=D,E.setValidElements=O,E.addCustomElements=P,E.addValidChildren=I,E.elements=S,E},zo=function(e,t){var n,r,o,i,a=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,s=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,u=/\s*([^:]+):\s*([^;]+);?/g,c=/\s+$/,l={},f="\ufeff";for(e=e||{},t&&(o=t.getValidStyles(),i=t.getInvalidStyles()),r=("\\\" \\' \\; \\: ; : "+f).split(" "),n=0;n<r.length;n++)l[r[n]]=f+n,l[f+n]=r[n];var d=function(e,t,n,r){var o=function(e){return(e=parseInt(e,10).toString(16)).length>1?e:"0"+e};return"#"+o(t)+o(n)+o(r)};return{toHex:function(e){return e.replace(a,d)},parse:function(t){var r,o,i,m,p,g,h,v,y={},b=e.url_converter,C=e.url_converter_scope||this,x=function(e,t,r){var o,i,a,s;if((o=y[e+"-top"+t])&&(i=y[e+"-right"+t])&&(a=y[e+"-bottom"+t])&&(s=y[e+"-left"+t])){var u=[o,i,a,s];for(n=u.length-1;n--&&u[n]===u[n+1];);n>-1&&r||(y[e+t]=-1===n?u[0]:u.join(" "),delete y[e+"-top"+t],delete y[e+"-right"+t],delete y[e+"-bottom"+t],delete y[e+"-left"+t])}},w=function(e){var t,n=y[e];if(n){for(t=(n=n.split(" ")).length;t--;)if(n[t]!==n[0])return!1;return y[e]=n[0],!0}},N=function(e){return m=!0,l[e]},E=function(e,t){return m&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return l[e]})),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e},S=function(e){return String.fromCharCode(parseInt(e.slice(1),16))},k=function(e){return e.replace(/\\[0-9a-f]+/gi,S)},T=function(t,n,r,o,i,a){if(i=i||a)return"'"+(i=E(i)).replace(/\'/g,"\\'")+"'";if(n=E(n||r||o),!e.allow_script_urls){var s=n.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(s))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(s))return""}return b&&(n=b.call(C,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"};if(t){for(t=(t=t.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,N).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,N)});r=u.exec(t);)if(u.lastIndex=r.index+r[0].length,o=r[1].replace(c,"").toLowerCase(),i=r[2].replace(c,""),o&&i){if(o=k(o),i=k(i),-1!==o.indexOf(f)||-1!==o.indexOf('"'))continue;if(!e.allow_script_urls&&("behavior"===o||/expression\s*\(|\/\*|\*\//.test(i)))continue;"font-weight"===o&&"700"===i?i="bold":"color"!==o&&"background-color"!==o||(i=i.toLowerCase()),i=(i=i.replace(a,d)).replace(s,T),y[o]=m?E(i,!0):i}x("border","",!0),x("border","-width"),x("border","-color"),x("border","-style"),x("padding",""),x("margin",""),p="border",h="border-style",v="border-color",w(g="border-width")&&w(h)&&w(v)&&(y[p]=y[g]+" "+y[h]+" "+y[v],delete y[g],delete y[h],delete y[v]),"medium none"===y.border&&delete y.border,"none"===y["border-image"]&&delete y["border-image"]}return y},serialize:function(e,t){var n,r,a,s,u,c="",l=function(t){var n,r,i,a;if(n=o[t])for(r=0,i=n.length;r<i;r++)t=n[r],(a=e[t])&&(c+=(c.length>0?" ":"")+t+": "+a+";")};if(t&&o)l("*"),l(t);else for(n in e)!(r=e[n])||i&&(a=n,s=t,u=void 0,(u=i["*"])&&u[a]||(u=i[s])&&u[a])||(c+=(c.length>0?" ":"")+n+": "+r+";");return c}}},Uo=Ot.each,Vo=Ot.is,Ho=Ot.grep,qo=me.ie,jo=/^([a-z0-9],?)+$/i,$o=/^[ \t\r\n]*$/,Wo=function(e,t){var n=t.attr("style");(n=e.serializeStyle(e.parseStyle(n),t[0].nodeName))||(n=null),t.attr("data-mce-style",n)},Ko=function(e,t){var n,r,o=0;if(e)for(n=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)r=e.nodeType,(!t||3!==r||r!==n&&e.nodeValue.length)&&(o++,n=r);return o},Xo=function(e,t){var n,r,o,i,a,s,u=this;u.doc=e,u.win=window,u.files={},u.counter=0,u.stdMode=!qo||e.documentMode>=8,u.boxModel=!qo||"CSS1Compat"===e.compatMode||u.stdMode,u.styleSheetLoader=function(e,t){var n,r=0,o={};n=(t=t||{}).maxLoadTime||5e3;var i=function(t){e.getElementsByTagName("head")[0].appendChild(t)},a=function(t,a,s){var u,c,l,f,d=function(){for(var e=f.passed,t=e.length;t--;)e[t]();f.status=2,f.passed=[],f.failed=[]},m=function(){for(var e=f.failed,t=e.length;t--;)e[t]();f.status=3,f.passed=[],f.failed=[]},p=function(e,t){e()||((new Date).getTime()-l<n?ye.setTimeout(t):m())},g=function(){p(function(){for(var t,n,r=e.styleSheets,o=r.length;o--;)if((n=(t=r[o]).ownerNode?t.ownerNode:t.owningElement)&&n.id===u.id)return d(),!0},g)},h=function(){p(function(){try{var e=c.sheet.cssRules;return d(),!!e}catch(t){}},h)};if(t=Ot._addCacheSuffix(t),o[t]?f=o[t]:(f={passed:[],failed:[]},o[t]=f),a&&f.passed.push(a),s&&f.failed.push(s),1!==f.status)if(2!==f.status)if(3!==f.status){if(f.status=1,(u=e.createElement("link")).rel="stylesheet",u.type="text/css",u.id="u"+r++,u.async=!1,u.defer=!1,l=(new Date).getTime(),"onload"in u&&!((v=navigator.userAgent.match(/WebKit\/(\d*)/))&&parseInt(v[1],10)<536))u.onload=g,u.onerror=m;else{if(navigator.userAgent.indexOf("Firefox")>0)return(c=e.createElement("style")).textContent='@import "'+t+'"',h(),void i(c);g()}var v;i(u),u.href=t}else m();else d()},s=function(e){return Xr.nu(function(t){a(e,y.compose(t,y.constant(eo.value(e))),y.compose(t,y.constant(eo.error(e))))})},u=function(e){return e.fold(y.identity,y.identity)};return{load:a,loadAll:function(e,t,n){Jr(M.map(e,s)).get(function(e){var r=M.partition(e,function(e){return e.isValue()});r.fail.length>0?n(r.fail.map(u)):t(r.pass.map(u))})}}}(e),u.boundEvents=[],u.settings=t=t||{},u.schema=t.schema?t.schema:Fo({}),u.styles=zo({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),u.fixDoc(e),u.events=t.ownEvents?new Te(t.proxy):Te.Event,u.attrHooks=(r=u,a={},s=(o=t).keep_values,i={set:function(e,t,n){o.url_converter&&(t=o.url_converter.call(o.url_converter_scope||r,t,n,e[0])),e.attr("data-mce-"+n,t).attr(n,t)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}},a={style:{set:function(e,t){null===t||"object"!=typeof t?(s&&e.attr("data-mce-style",t),e.attr("style",t)):e.css(t)},get:function(e){var t=e.attr("data-mce-style")||e.attr("style");return t=r.serializeStyle(r.parseStyle(t),e[0].nodeName)}}},s&&(a.href=a.src=i),a),n=u.schema.getBlockElements(),u.$=Qt.overrideDefaults(function(){return{context:e,element:u.getRoot()}}),u.isBlock=function(e){if(!e)return!1;var t=e.nodeType;return t?!(1!==t||!n[e.nodeName]):!!n[e]}};Xo.prototype={$$:function(e){return"string"==typeof e&&(e=this.get(e)),this.$(e)},root:null,fixDoc:function(e){},clone:function(e,t){var n,r,o=this;return!qo||1!==e.nodeType||t?e.cloneNode(t):(r=o.doc,t?n.firstChild:(n=r.createElement(e.nodeName),Uo(o.getAttribs(e),function(t){o.setAttrib(n,t.nodeName,o.getAttrib(e,t.nodeName))}),n))},getRoot:function(){return this.settings.root_element||this.doc.body},getViewPort:function(e){var t,n;return t=(e=e||this.win).document,n=this.boxModel?t.documentElement:t.body,{x:e.pageXOffset||n.scrollLeft,y:e.pageYOffset||n.scrollTop,w:e.innerWidth||n.clientWidth,h:e.innerHeight||n.clientHeight}},getRect:function(e){var t,n;return e=this.get(e),t=this.getPos(e),n=this.getSize(e),{x:t.x,y:t.y,w:n.w,h:n.h}},getSize:function(e){var t,n;return e=this.get(e),t=this.getStyle(e,"width"),n=this.getStyle(e,"height"),-1===t.indexOf("px")&&(t=0),-1===n.indexOf("px")&&(n=0),{w:parseInt(t,10)||e.offsetWidth||e.clientWidth,h:parseInt(n,10)||e.offsetHeight||e.clientHeight}},getParent:function(e,t,n){return this.getParents(e,t,n,!1)},getParents:function(e,t,n,r){var o,i=this,a=[];for(e=i.get(e),r=r===undefined,n=n||("BODY"!==i.getRoot().nodeName?i.getRoot().parentNode:null),Vo(t,"string")&&(o=t,t="*"===t?function(e){return 1===e.nodeType}:function(e){return i.is(e,o)});e&&e!==n&&e.nodeType&&9!==e.nodeType;){if(!t||t(e)){if(!r)return e;a.push(e)}e=e.parentNode}return r?a:null},get:function(e){var t;return e&&this.doc&&"string"==typeof e&&(t=e,(e=this.doc.getElementById(e))&&e.id!==t)?this.doc.getElementsByName(t)[1]:e},getNext:function(e,t){return this._findSib(e,t,"nextSibling")},getPrev:function(e,t){return this._findSib(e,t,"previousSibling")},select:function(e,t){return lt(e,this.get(t)||this.settings.root_element||this.doc,[])},is:function(e,t){var n;if(!e)return!1;if(e.length===undefined){if("*"===t)return 1===e.nodeType;if(jo.test(t)){for(t=t.toLowerCase().split(/,/),e=e.nodeName.toLowerCase(),n=t.length-1;n>=0;n--)if(t[n]===e)return!0;return!1}}if(e.nodeType&&1!==e.nodeType)return!1;var r=e.nodeType?[e]:e;return lt(t,r[0].ownerDocument||r[0],null,r).length>0},add:function(e,t,n,r,o){var i=this;return this.run(e,function(e){var a;return a=Vo(t,"string")?i.doc.createElement(t):t,i.setAttribs(a,n),r&&(r.nodeType?a.appendChild(r):i.setHTML(a,r)),o?a:e.appendChild(a)})},create:function(e,t,n){return this.add(this.doc.createElement(e),e,t,n,1)},createHTML:function(e,t,n){var r,o="";for(r in o+="<"+e,t)t.hasOwnProperty(r)&&null!==t[r]&&"undefined"!=typeof t[r]&&(o+=" "+r+'="'+this.encode(t[r])+'"');return void 0!==n?o+">"+n+"</"+e+">":o+" />"},createFragment:function(e){var t,n,r,o=this.doc;for(r=o.createElement("div"),t=o.createDocumentFragment(),e&&(r.innerHTML=e);n=r.firstChild;)t.appendChild(n);return t},remove:function(e,t){return e=this.$$(e),t?e.each(function(){for(var e;e=this.firstChild;)3===e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}).remove():e.remove(),e.length>1?e.toArray():e[0]},setStyle:function(e,t,n){e=this.$$(e).css(t,n),this.settings.update_styles&&Wo(this,e)},getStyle:function(e,t,n){return e=this.$$(e),n?e.css(t):("float"===(t=t.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}))&&(t=me.ie&&me.ie<12?"styleFloat":"cssFloat"),e[0]&&e[0].style?e[0].style[t]:undefined)},setStyles:function(e,t){e=this.$$(e).css(t),this.settings.update_styles&&Wo(this,e)},removeAllAttribs:function(e){return this.run(e,function(e){var t,n=e.attributes;for(t=n.length-1;t>=0;t--)e.removeAttributeNode(n.item(t))})},setAttrib:function(e,t,n){var r,o,i=this.settings;""===n&&(n=null),r=(e=this.$$(e)).attr(t),e.length&&((o=this.attrHooks[t])&&o.set?o.set(e,n,t):e.attr(t,n),r!==n&&i.onSetAttrib&&i.onSetAttrib({attrElm:e,attrName:t,attrValue:n}))},setAttribs:function(e,t){var n=this;n.$$(e).each(function(e,r){Uo(t,function(e,t){n.setAttrib(r,t,e)})})},getAttrib:function(e,t,n){var r,o;return(e=this.$$(e)).length&&(o=(r=this.attrHooks[t])&&r.get?r.get(e,t):e.attr(t)),void 0===o&&(o=n||""),o},getPos:function(e,t){return qr(this.doc.body,this.get(e),t)},parseStyle:function(e){return this.styles.parse(e)},serializeStyle:function(e,t){return this.styles.serialize(e,t)},addStyle:function(e){var t,n,r=this.doc;if(this!==Xo.DOM&&r===document){var o=Xo.DOM.addedStyles;if((o=o||[])[e])return;o[e]=!0,Xo.DOM.addedStyles=o}(n=r.getElementById("mceDefaultStyles"))||((n=r.createElement("style")).id="mceDefaultStyles",n.type="text/css",(t=r.getElementsByTagName("head")[0]).firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)),n.styleSheet?n.styleSheet.cssText+=e:n.appendChild(r.createTextNode(e))},loadCSS:function(e){var t,n=this,r=n.doc;n===Xo.DOM||r!==document?(e||(e=""),t=r.getElementsByTagName("head")[0],Uo(e.split(","),function(e){var o;e=Ot._addCacheSuffix(e),n.files[e]||(n.files[e]=!0,o=n.create("link",{rel:"stylesheet",href:e}),qo&&r.documentMode&&r.recalc&&(o.onload=function(){r.recalc&&r.recalc(),o.onload=null}),t.appendChild(o))})):Xo.DOM.loadCSS(e)},addClass:function(e,t){this.$$(e).addClass(t)},removeClass:function(e,t){this.toggleClass(e,t,!1)},hasClass:function(e,t){return this.$$(e).hasClass(t)},toggleClass:function(e,t,n){this.$$(e).toggleClass(t,n).each(function(){""===this.className&&Qt(this).attr("class",null)})},show:function(e){this.$$(e).show()},hide:function(e){this.$$(e).hide()},isHidden:function(e){return"none"===this.$$(e).css("display")},uniqueId:function(e){return(e||"mce_")+this.counter++},setHTML:function(e,t){e=this.$$(e),qo?e.each(function(e,n){if(!1!==n.canHaveHTML){for(;n.firstChild;)n.removeChild(n.firstChild);try{n.innerHTML="<br>"+t,n.removeChild(n.firstChild)}catch(r){Qt("<div></div>").html("<br>"+t).contents().slice(1).appendTo(n)}return t}}):e.html(t)},getOuterHTML:function(e){return 1===(e=this.get(e)).nodeType&&"outerHTML"in e?e.outerHTML:Qt("<div></div>").append(Qt(e).clone()).html()},setOuterHTML:function(e,t){var n=this;n.$$(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}n.remove(Qt(this).html(t),!0)})},decode:Ao.decode,encode:Ao.encodeAllRaw,insertAfter:function(e,t){return t=this.get(t),this.run(e,function(e){var n,r;return n=t.parentNode,(r=t.nextSibling)?n.insertBefore(e,r):n.appendChild(e),e})},replace:function(e,t,n){return this.run(t,function(t){return Vo(t,"array")&&(e=e.cloneNode(!0)),n&&Uo(Ho(t.childNodes),function(t){e.appendChild(t)}),t.parentNode.replaceChild(e,t)})},rename:function(e,t){var n,r=this;return e.nodeName!==t.toUpperCase()&&(n=r.create(t),Uo(r.getAttribs(e),function(t){r.setAttrib(n,t.nodeName,r.getAttrib(e,t.nodeName))}),r.replace(n,e,1)),n||e},findCommonAncestor:function(e,t){for(var n,r=e;r;){for(n=t;n&&r!==n;)n=n.parentNode;if(r===n)break;r=r.parentNode}return!r&&e.ownerDocument?e.ownerDocument.documentElement:r},toHex:function(e){return this.styles.toHex(Ot.trim(e))},run:function(e,t,n){var r,o=this;return"string"==typeof e&&(e=o.get(e)),!!e&&(n=n||this,e.nodeType||!e.length&&0!==e.length?t.call(n,e):(r=[],Uo(e,function(e,i){e&&("string"==typeof e&&(e=o.get(e)),r.push(t.call(n,e,i)))}),r))},getAttribs:function(e){var t;return(e=this.get(e))?qo?(t=[],"OBJECT"===e.nodeName?e.attributes:("OPTION"===e.nodeName&&this.getAttrib(e,"selected")&&t.push({specified:1,nodeName:"selected"}),e.cloneNode(!1).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(e){t.push({specified:1,nodeName:e})}),t)):e.attributes:[]},isEmpty:function(e,t){var n,r,o,i,a,s,u=0;if(e=e.firstChild){a=new to(e,e.parentNode),t=t||(this.schema?this.schema.getNonEmptyElements():null),i=this.schema?this.schema.getWhiteSpaceElements():{};do{if(1===(o=e.nodeType)){var c=e.getAttribute("data-mce-bogus");if(c){e=a.next("all"===c);continue}if(s=e.nodeName.toLowerCase(),t&&t[s]){if("br"===s){u++,e=a.next();continue}return!1}for(n=(r=this.getAttribs(e)).length;n--;)if("name"===(s=r[n].nodeName)||"data-mce-bookmark"===s)return!1}if(8===o)return!1;if(3===o&&!$o.test(e.nodeValue))return!1;if(3===o&&e.parentNode&&i[e.parentNode.nodeName]&&$o.test(e.nodeValue))return!1;e=a.next()}while(e)}return u<=1},createRng:function(){return this.doc.createRange()},nodeIndex:Ko,split:function(e,t,n){var r,o,i,a=this.createRng();if(e&&t)return a.setStart(e.parentNode,this.nodeIndex(e)),a.setEnd(t.parentNode,this.nodeIndex(t)),r=a.extractContents(),(a=this.createRng()).setStart(t.parentNode,this.nodeIndex(t)+1),a.setEnd(e.parentNode,this.nodeIndex(e)+1),o=a.extractContents(),(i=e.parentNode).insertBefore(Co.trimNode(this,r),e),n?i.insertBefore(n,e):i.insertBefore(t,e),i.insertBefore(Co.trimNode(this,o),e),this.remove(e),n||t},bind:function(e,t,n,r){if(Ot.isArray(e)){for(var o=e.length;o--;)e[o]=this.bind(e[o],t,n,r);return e}return!this.settings.collect||e!==this.doc&&e!==this.win||this.boundEvents.push([e,t,n,r]),this.events.bind(e,t,n,r||this)},unbind:function(e,t,n){var r;if(Ot.isArray(e)){for(r=e.length;r--;)e[r]=this.unbind(e[r],t,n);return e}if(this.boundEvents&&(e===this.doc||e===this.win))for(r=this.boundEvents.length;r--;){var o=this.boundEvents[r];e!==o[0]||t&&t!==o[1]||n&&n!==o[2]||this.events.unbind(o[0],o[1],o[2])}return this.events.unbind(e,t,n)},fire:function(e,t,n){return this.events.fire(e,t,n)},getContentEditable:function(e){var t;return e&&1===e.nodeType?(t=e.getAttribute("data-mce-contenteditable"))&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null:null},getContentEditableParent:function(e){for(var t=this.getRoot(),n=null;e&&e!==t&&null===(n=this.getContentEditable(e));e=e.parentNode);return n},destroy:function(){if(this.boundEvents){for(var e=this.boundEvents.length;e--;){var t=this.boundEvents[e];this.events.unbind(t[0],t[1],t[2])}this.boundEvents=null}lt.setDocument&<.setDocument(),this.win=this.doc=this.root=this.events=this.frag=null},isChildOf:function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},_findSib:function(e,t,n){var r=this,o=t;if(e)for("string"==typeof o&&(o=function(e){return r.is(e,t)}),e=e[n];e;e=e[n])if(o(e))return e;return null}},Xo.DOM=new Xo(document),Xo.nodeIndex=Ko;var Yo=Xo.DOM,Go=Ot.each,Jo=Ot.grep,Qo=function(e){return"function"==typeof e},Zo=function(){var e={},t=[],n={},r=[],o=0;this.isDone=function(t){return 2===e[t]},this.markDone=function(t){e[t]=2},this.add=this.load=function(r,o,i,a){e[r]===undefined&&(t.push(r),e[r]=0),o&&(n[r]||(n[r]=[]),n[r].push({success:o,failure:a,scope:i||this}))},this.remove=function(t){delete e[t],delete n[t]},this.loadQueue=function(e,n,r){this.loadScripts(t,e,n,r)},this.loadScripts=function(t,i,a,s){var u,c=[],l=function(e,t){Go(n[t],function(t){Qo(t[e])&&t[e].call(t.scope)}),n[t]=undefined};r.push({success:i,failure:s,scope:a||this}),(u=function(){var n=Jo(t);if(t.length=0,Go(n,function(t){var n,r,i,a,s,f,d;2!==e[t]?3!==e[t]?1!==e[t]&&(e[t]=1,o++,n=t,r=function(){e[t]=2,o--,l("success",t),u()},i=function(){e[t]=3,o--,c.push(t),l("failure",t),u()},d=function(){f.remove(s),a&&(a.onreadystatechange=a.onload=a=null),r()},s=(f=Yo).uniqueId(),(a=document.createElement("script")).id=s,a.type="text/javascript",a.src=Ot._addCacheSuffix(n),"onreadystatechange"in a?a.onreadystatechange=function(){/loaded|complete/.test(a.readyState)&&d()}:a.onload=d,a.onerror=function(){Qo(i)?i():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+n)},(document.getElementsByTagName("head")[0]||document.body).appendChild(a)):l("failure",t):l("success",t)}),!o){var i=r.slice(0);r.length=0,Go(i,function(e){0===c.length?Qo(e.success)&&e.success.call(e.scope):Qo(e.failure)&&e.failure.call(e.scope,c)})}})()}};Zo.ScriptLoader=new Zo;var ei=Ot.each,ti=function(){this.items=[],this.urls={},this.lookup={},this._listeners=[]};ti.prototype={get:function(e){return this.lookup[e]?this.lookup[e].instance:undefined},dependencies:function(e){var t;return this.lookup[e]&&(t=this.lookup[e].dependencies),t||[]},requireLangPack:function(e,t){var n=ti.language;if(n&&!1!==ti.languageLoad){if(t)if(-1!==(t=","+t+",").indexOf(","+n.substr(0,2)+","))n=n.substr(0,2);else if(-1===t.indexOf(","+n+","))return;Zo.ScriptLoader.add(this.urls[e]+"/langs/"+n+".js")}},add:function(e,t,n){this.items.push(t),this.lookup[e]={instance:t,dependencies:n};var r=M.partition(this._listeners,function(t){return t.name===e});return this._listeners=r.fail,ei(r.pass,function(e){e.callback()}),t},remove:function(e){delete this.urls[e],delete this.lookup[e]},createUrl:function(e,t){return"object"==typeof t?t:{prefix:e.prefix,resource:t,suffix:e.suffix}},addComponents:function(e,t){var n=this.urls[e];ei(t,function(e){Zo.ScriptLoader.add(n+"/"+e)})},load:function(e,t,n,r,o){var i=this,a=t,s=function(){var o=i.dependencies(e);ei(o,function(e){var n=i.createUrl(t,e);i.load(n.resource,n,undefined,undefined)}),n&&(r?n.call(r):n.call(Zo))};i.urls[e]||("object"==typeof t&&(a=t.prefix+t.resource+t.suffix),0!==a.indexOf("/")&&-1===a.indexOf("://")&&(a=ti.baseURL+"/"+a),i.urls[e]=a.substring(0,a.lastIndexOf("/")),i.lookup[e]?s():Zo.ScriptLoader.add(a,s,r,o))},waitFor:function(e,t){this.lookup.hasOwnProperty(e)?t():this._listeners.push({name:e,callback:t})}},ti.PluginManager=new ti,ti.ThemeManager=new ti;var ni="\ufeff",ri=function(e){return e===ni},oi=ni,ii=function(e){return e.replace(new RegExp(ni,"g"),"")},ai=vo.isElement,si=vo.isText,ui=function(e){return si(e)&&(e=e.parentNode),ai(e)&&e.hasAttribute("data-mce-caret")},ci=function(e){return si(e)&&ri(e.data)},li=function(e){return ui(e)||ci(e)},fi=function(e){return si(e)&&e.data[0]===oi},di=function(e){return si(e)&&e.data[e.data.length-1]===oi},mi={isCaretContainer:li,isCaretContainerBlock:ui,isCaretContainerInline:ci,showCaretContainerBlock:function(e){return e&&e.hasAttribute("data-mce-caret")?(t=e.getElementsByTagName("br"),n=t[t.length-1],vo.isBogus(n)&&n.parentNode.removeChild(n),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("_moz_abspos"),e):null;var t,n},insertInline:function(e,t){var n,r,o;if(r=e.ownerDocument.createTextNode(oi),o=e.parentNode,t){if(n=e.previousSibling,si(n)){if(li(n))return n;if(di(n))return n.splitText(n.data.length-1)}o.insertBefore(r,e)}else{if(n=e.nextSibling,si(n)){if(li(n))return n;if(fi(n))return n.splitText(1),n}e.nextSibling?o.insertBefore(r,e.nextSibling):o.appendChild(r)}return r},prependInline:function(e){if(vo.isText(e)){var t=e.data;return t.length>0&&t.charAt(0)!==oi&&e.insertData(0,oi),e}return null},appendInline:function(e){if(vo.isText(e)){var t=e.data;return t.length>0&&t.charAt(t.length-1)!==oi&&e.insertData(t.length,oi),e}return null},isBeforeInline:function(e){return e&&vo.isText(e.container())&&e.container().data.charAt(e.offset())===oi},isAfterInline:function(e){return e&&vo.isText(e.container())&&e.container().data.charAt(e.offset()-1)===oi},insertBlock:function(e,t,n){var r,o,i;return(r=t.ownerDocument.createElement(e)).setAttribute("data-mce-caret",n?"before":"after"),r.setAttribute("data-mce-bogus","all"),r.appendChild(((i=document.createElement("br")).setAttribute("data-mce-bogus","1"),i)),o=t.parentNode,n?o.insertBefore(r,t):t.nextSibling?o.insertBefore(r,t.nextSibling):o.appendChild(r),r},hasContent:function(e){return e.firstChild!==e.lastChild||!vo.isBr(e.firstChild)},startsWithCaretContainer:fi,endsWithCaretContainer:di},pi=vo.isContentEditableTrue,gi=vo.isContentEditableFalse,hi=vo.isBr,vi=vo.isText,yi=vo.matchNodeNames("script style textarea"),bi=vo.matchNodeNames("img input textarea hr iframe video audio object"),Ci=vo.matchNodeNames("table"),xi=mi.isCaretContainer,wi=function(e){return!xi(e)&&(vi(e)?!yi(e.parentNode):bi(e)||hi(e)||Ci(e)||gi(e))},Ni=function(e,t){for(e=e.parentNode;e&&e!==t;e=e.parentNode){if(gi(e))return!1;if(pi(e))return!0}return!0},Ei=wi,Si=function(e){return bi(e)||!!gi(t=e)&&!0!==At.reduce(t.getElementsByTagName("*"),function(e,t){return e||pi(t)},!1);var t},ki=function(e,t){return wi(e)&&Ni(e,t)},Ti=Math.round,Ai=function(e){return e?{left:Ti(e.left),top:Ti(e.top),bottom:Ti(e.bottom),right:Ti(e.right),width:Ti(e.width),height:Ti(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}},_i=function(e,t,n){return e>=0&&e<=Math.min(t.height,n.height)/2},Bi=function(e,t){return e.bottom-e.height/2<t.top||!(e.top>t.bottom)&&_i(t.top-e.bottom,e,t)},Ri=function(e,t){return e.top>t.bottom||!(e.bottom<t.top)&&_i(t.bottom-e.top,e,t)},Di=Ai,Oi=function(e,t){return e=Ai(e),t?e.right=e.left:(e.left=e.left+e.width,e.right=e.left),e.width=0,e},Pi=function(e,t){return e.left===t.left&&e.top===t.top&&e.bottom===t.bottom&&e.right===t.right},Ii=Bi,Li=Ri,Mi=function(e,t,n){return t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom},Fi=function(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null},zi=function(e,t){return 1===e.nodeType&&e.hasChildNodes()&&(t>=e.childNodes.length&&(t=e.childNodes.length-1),e=e.childNodes[t]),e},Ui=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]"),Vi=function(e){return"string"==typeof e&&e.charCodeAt(0)>=768&&Ui.test(e)},Hi=[].slice,qi=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=Hi.call(arguments);return r.length-1>=e.length?e.apply(this,r.slice(1)):function(){var e=r.concat([].slice.call(arguments));return qi.apply(this,e)}},ji={constant:function(e){return function(){return e}},negate:function(e){return function(t){return!e(t)}},and:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=Hi.call(arguments);return function(e){for(var t=0;t<n.length;t++)if(!n[t](e))return!1;return!0}},or:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=Hi.call(arguments);return function(e){for(var t=0;t<n.length;t++)if(n[t](e))return!0;return!1}},curry:qi,compose:function(e,t){return function(n){return e(t(n))}},noop:function(){}},$i=vo.isElement,Wi=Ei,Ki=vo.matchStyleValues("display","block table"),Xi=vo.matchStyleValues("float","left right"),Yi=ji.and($i,Wi,ji.negate(Xi)),Gi=ji.negate(vo.matchStyleValues("white-space","pre pre-line pre-wrap")),Ji=vo.isText,Qi=vo.isBr,Zi=Xo.nodeIndex,ea=zi,ta=function(e){return"createRange"in e?e.createRange():Xo.DOM.createRng()},na=function(e){return e&&/[\r\n\t ]/.test(e)},ra=function(e){var t,n=e.startContainer,r=e.startOffset;return!!(na(e.toString())&&Gi(n.parentNode)&&(t=n.data,na(t[r-1])||na(t[r+1])))},oa=function(e){var t,n,r=[],o=function(e){var t,n,r,o,i,a,s,u;return t=(n=e.getClientRects()).length>0?Di(n[0]):Di(e.getBoundingClientRect()),Qi(e)&&0===t.left?(i=(r=e).ownerDocument,a=ta(i),s=i.createTextNode("\xa0"),(u=r.parentNode).insertBefore(s,r),a.setStart(s,0),a.setEnd(s,1),o=Di(a.getBoundingClientRect()),u.removeChild(s),o):t},i=function(e,t){return(e=Oi(e,t)).width=1,e.right=e.left+1,e},a=function(e){0!==e.height&&(r.length>0&&Pi(e,r[r.length-1])||r.push(e))},s=function(e,t){var n=ta(e.ownerDocument);if(t<e.data.length){if(Vi(e.data[t]))return r;if(Vi(e.data[t-1])&&(n.setStart(e,t),n.setEnd(e,t+1),!ra(n)))return a(i(o(n),!1)),r}t>0&&(n.setStart(e,t-1),n.setEnd(e,t),ra(n)||a(i(o(n),!1))),t<e.data.length&&(n.setStart(e,t),n.setEnd(e,t+1),ra(n)||a(i(o(n),!0)))};if(Ji(e.container()))return s(e.container(),e.offset()),r;if($i(e.container()))if(e.isAtEnd())n=ea(e.container(),e.offset()),Ji(n)&&s(n,n.data.length),Yi(n)&&!Qi(n)&&a(i(o(n),!1));else{if(n=ea(e.container(),e.offset()),Ji(n)&&s(n,0),Yi(n)&&e.isAtEnd())return a(i(o(n),!1)),r;t=ea(e.container(),e.offset()-1),Yi(t)&&!Qi(t)&&(Ki(t)||Ki(n)||!Yi(n))&&a(i(o(t),!1)),Yi(n)&&a(i(o(n),!0))}return r},ia=function(e,t,n){var r=function(){return n||(n=oa(new ia(e,t))),n};return{container:ji.constant(e),offset:ji.constant(t),toRange:function(){var n;return(n=ta(e.ownerDocument)).setStart(e,t),n.setEnd(e,t),n},getClientRects:r,isVisible:function(){return r().length>0},isAtStart:function(){return Ji(e),0===t},isAtEnd:function(){return Ji(e)?t>=e.data.length:t>=e.childNodes.length},isEqual:function(n){return n&&e===n.container()&&t===n.offset()},getNode:function(n){return ea(e,n?t-1:t)}}};ia.fromRangeStart=function(e){return new ia(e.startContainer,e.startOffset)},ia.fromRangeEnd=function(e){return new ia(e.endContainer,e.endOffset)},ia.after=function(e){return new ia(e.parentNode,Zi(e)+1)},ia.before=function(e){return new ia(e.parentNode,Zi(e))},ia.isAtStart=function(e){return!!e&&e.isAtStart()},ia.isAtEnd=function(e){return!!e&&e.isAtEnd()},ia.isTextPosition=function(e){return!!e&&vo.isText(e.container())};var aa,sa,ua,ca,la,fa=vo.isContentEditableTrue,da=vo.isContentEditableFalse,ma=vo.matchStyleValues("display","block table table-cell table-caption list-item"),pa=mi.isCaretContainer,ga=mi.isCaretContainerBlock,ha=ji.curry,va=vo.isElement,ya=Ei,ba=function(e){return e>0},Ca=function(e){return e<0},xa=function(e,t){for(var n;n=e(t);)if(!ga(n))return n;return null},wa=function(e,t){for(e=e.parentNode;e&&e!==t;e=e.parentNode)if(fa(e))return e;return t},Na=function(e,t){for(;e&&e!==t;){if(ma(e))return e;e=e.parentNode}return null},Ea=function(e,t){var n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n},Sa=function(e,t,n){var r,o,i,a;for(o=e?"previousSibling":"nextSibling";n&&n!==t;){if(r=n[o],pa(r)&&(r=r[o]),da(r)){if(a=n,Na(r,i=t)===Na(a,i))return r;break}if(ya(r))break;n=n.parentNode}return null},ka=ha(Ea,!0),Ta=ha(Ea,!1),Aa=function(e,t){return da((n=e,(r=t)?(o=r.container(),i=r.offset(),va(o)?o.childNodes[i+n]:null):null));var n,r,o,i},_a={isForwards:ba,isBackwards:Ca,findNode:function(e,t,n,r,o){var i=new to(e,r);if(Ca(t)){if((da(e)||ga(e))&&n(e=xa(i.prev,!0)))return e;for(;e=xa(i.prev,o);)if(n(e))return e}if(ba(t)){if((da(e)||ga(e))&&n(e=xa(i.next,!0)))return e;for(;e=xa(i.next,o);)if(n(e))return e}return null},getEditingHost:wa,getParentBlock:Na,isInSameBlock:function(e,t,n){return Na(e.container(),n)===Na(t.container(),n)},isInSameEditingHost:function(e,t,n){return wa(e.container(),n)===wa(t.container(),n)},isBeforeContentEditableFalse:ha(Aa,0),isAfterContentEditableFalse:ha(Aa,-1),normalizeRange:function(e,t,n){var r,o,i,a,s=ha(Sa,!0,t),u=ha(Sa,!1,t);if(o=n.startContainer,i=n.startOffset,mi.isCaretContainerBlock(o)){if(va(o)||(o=o.parentNode),"before"===(a=o.getAttribute("data-mce-caret"))&&(r=o.nextSibling,da(r)))return ka(r);if("after"===a&&(r=o.previousSibling,da(r)))return Ta(r)}if(!n.collapsed)return n;if(vo.isText(o)){if(pa(o)){if(1===e){if(r=u(o))return ka(r);if(r=s(o))return Ta(r)}if(-1===e){if(r=s(o))return Ta(r);if(r=u(o))return ka(r)}return n}if(mi.endsWithCaretContainer(o)&&i>=o.data.length-1)return 1===e&&(r=u(o))?ka(r):n;if(mi.startsWithCaretContainer(o)&&i<=1)return-1===e&&(r=s(o))?Ta(r):n;if(i===o.data.length)return(r=u(o))?ka(r):n;if(0===i)return(r=s(o))?Ta(r):n}return n}},Ba=vo.isContentEditableFalse,Ra=vo.isText,Da=vo.isElement,Oa=vo.isBr,Pa=_a.isForwards,Ia=_a.isBackwards,La=Ei,Ma=Si,Fa=ki,za=function(e,t){return e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null},Ua=function(e,t){if(Pa(e)){if(La(t.previousSibling)&&!Ra(t.previousSibling))return ia.before(t);if(Ra(t))return ia(t,0)}if(Ia(e)){if(La(t.nextSibling)&&!Ra(t.nextSibling))return ia.after(t);if(Ra(t))return ia(t,t.data.length)}return Ia(e)?Oa(t)?ia.before(t):ia.after(t):ia.before(t)},Va=function(e,t,n){var r,o,i,a,s,u,c,l,f,d;if(!Da(n)||!t)return null;if(t.isEqual(ia.after(n))&&n.lastChild){if(c=ia.after(n.lastChild),Ia(e)&&La(n.lastChild)&&Da(n.lastChild))return Oa(n.lastChild)?ia.before(n.lastChild):c}else c=t;if(r=c.container(),o=c.offset(),Ra(r)){if(Ia(e)&&o>0)return ia(r,--o);if(Pa(e)&&o<r.length)return ia(r,++o);i=r}else{if(Ia(e)&&o>0&&(a=za(r,o-1),La(a)))return!Ma(a)&&(s=_a.findNode(a,e,Fa,a))?Ra(s)?ia(s,s.data.length):ia.after(s):Ra(a)?ia(a,a.data.length):ia.before(a);if(Pa(e)&&o<r.childNodes.length&&(a=za(r,o),La(a)))return l=a,f=n,vo.isBr(l)&&(d=Va(1,ia.after(l),f))&&!_a.isInSameBlock(ia.before(l),ia.before(d),f)?Va(e,ia.after(a),n):!Ma(a)&&(s=_a.findNode(a,e,Fa,a))?Ra(s)?ia(s,0):ia.before(s):Ra(a)?ia(a,0):ia.after(a);i=c.getNode()}return(Pa(e)&&c.isAtEnd()||Ia(e)&&c.isAtStart())&&(i=_a.findNode(i,e,ji.constant(!0),n,!0),Fa(i,n))?Ua(e,i):(a=_a.findNode(i,e,Fa,n),!(u=At.last(At.filter(function(e,t){for(var n=[];e&&e!==t;)n.push(e),e=e.parentNode;return n}(r,n),Ba)))||a&&u.contains(a)?a?Ua(e,a):null:c=Pa(e)?ia.after(u):ia.before(u))},Ha=function(e){return{next:function(t){return Va(1,t,e)},prev:function(t){return Va(-1,t,e)}}},qa=function(e){return Ot.grep(e.childNodes,function(e){return"LI"===e.nodeName})},ja=function(e){return e&&e.firstChild&&e.firstChild===e.lastChild&&("\xa0"===(t=e.firstChild).data||vo.isBr(t));var t},$a=function(e){return e.length>0&&(!(t=e[e.length-1]).firstChild||ja(t))?e.slice(0,-1):e;var t},Wa=function(e,t){var n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null},Ka=function(e,t){var n=ia.after(e),r=Ha(t).prev(n);return r?r.toRange():null},Xa=function(e,t,n){var r,o,i,a,s=e.parentNode;return Ot.each(t,function(t){s.insertBefore(t,e)}),r=e,o=n,i=ia.before(r),(a=Ha(o).next(i))?a.toRange():null},Ya=function(e,t){var n,r,o,i,a,s,u=t.firstChild,c=t.lastChild;return u&&"meta"===u.name&&(u=u.next),c&&"mce_marker"===c.attr("id")&&(c=c.prev),r=c,s=(n=e).getNonEmptyElements(),r&&(r.isEmpty(s)||(o=r,n.getBlockElements()[o.name]&&(a=o).firstChild&&a.firstChild===a.lastChild&&("br"===(i=o.firstChild).name||"\xa0"===i.value)))&&(c=c.prev),!(!u||u!==c||"ul"!==u.name&&"ol"!==u.name)},Ga=function(e,t,n,r){var o,i,a,s,u,c,l,f,d,m,p,g,h,v,y,b,C,x,w,N=(o=t,i=r,c=e.serialize(i),l=o.createFragment(c),s=(a=l).firstChild,u=a.lastChild,s&&"META"===s.nodeName&&s.parentNode.removeChild(s),u&&"mce_marker"===u.id&&u.parentNode.removeChild(u),a),E=Wa(t,n.startContainer),S=$a(qa(N.firstChild)),k=t.getRoot(),T=function(e){var r=ia.fromRangeStart(n),o=Ha(t.getRoot()),i=1===e?o.prev(r):o.next(r);return!i||Wa(t,i.getNode())!==E};return T(1)?Xa(E,S,k):T(2)?(f=E,d=S,m=k,t.insertAfter(d.reverse(),f),Ka(d[0],m)):(g=S,h=k,v=p=E,b=(y=n).cloneRange(),C=y.cloneRange(),b.setStartBefore(v),C.setEndAfter(v),x=[b.cloneContents(),C.cloneContents()],(w=p.parentNode).insertBefore(x[0],p),Ot.each(g,function(e){w.insertBefore(e,p)}),w.insertBefore(x[1],p),w.removeChild(p),Ka(g[g.length-1],h))},Ja=function(e,t){return!!Wa(e,t)},Qa=vo.isText,Za=vo.isBogus,es=Xo.nodeIndex,ts=function(e){var t=e.parentNode;return Za(t)?ts(t):t},ns=function(e){return e?At.reduce(e.childNodes,function(e,t){return Za(t)&&"BR"!==t.nodeName?e=e.concat(ns(t)):e.push(t),e},[]):[]},rs=function(e){return function(t){return e===t}},os=function(e){var t,n,r,o;return(Qa(e)?"text()":e.nodeName.toLowerCase())+"["+(n=ns(ts(t=e)),r=At.findIndex(n,rs(t),t),n=n.slice(0,r+1),o=At.reduce(n,function(e,t,r){return Qa(t)&&Qa(n[r-1])&&e++,e},0),n=At.filter(n,vo.matchNodeNames(t.nodeName)),(r=At.findIndex(n,rs(t),t))-o)+"]"},is=function(e,t){var n,r,o,i,a,s=[];return n=t.container(),r=t.offset(),Qa(n)?o=function(e,t){for(;(e=e.previousSibling)&&Qa(e);)t+=e.data.length;return t}(n,r):(r>=(i=n.childNodes).length?(o="after",r=i.length-1):o="before",n=i[r]),s.push(os(n)),a=function(e,t,n){var r=[];for(t=t.parentNode;!(t===e||n&&n(t));t=t.parentNode)r.push(t);return r}(e,n),a=At.filter(a,ji.negate(vo.isBogus)),(s=s.concat(At.map(a,function(e){return os(e)}))).reverse().join("/")+","+o},as=function(e,t){var n,r,o;return t?(t=(n=t.split(","))[0].split("/"),o=n.length>1?n[1]:"before",(r=At.reduce(t,function(e,t){return(t=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t))?("text()"===t[1]&&(t[1]="#text"),n=e,r=t[1],o=parseInt(t[2],10),i=ns(n),i=At.filter(i,function(e,t){return!Qa(e)||!Qa(i[t-1])}),(i=At.filter(i,vo.matchNodeNames(r)))[o]):null;var n,r,o,i},e))?Qa(r)?function(e,t){for(var n,r=e,o=0;Qa(r);){if(n=r.data.length,t>=o&&t<=o+n){e=r,t-=o;break}if(!Qa(r.nextSibling)){e=r,t=n;break}o+=n,r=r.nextSibling}return t>e.data.length&&(t=e.data.length),new ia(e,t)}(r,parseInt(o,10)):(o="after"===o?es(r)+1:es(r),new ia(r.parentNode,o)):null):null},ss=vo.isContentEditableFalse,us=function(e,t,n,r,o){var i,a=r[o?"startContainer":"endContainer"],s=r[o?"startOffset":"endOffset"],u=[],c=0,l=e.getRoot();for(vo.isText(a)?u.push(n?function(e,t,n){var r,o;for(o=e(t.data.slice(0,n)).length,r=t.previousSibling;r&&vo.isText(r);r=r.previousSibling)o+=e(r.data).length;return o}(t,a,s):s):(s>=(i=a.childNodes).length&&i.length&&(c=1,s=Math.max(0,i.length-1)),u.push(e.nodeIndex(i[s],n)+c));a&&a!==l;a=a.parentNode)u.push(e.nodeIndex(a,n));return u},cs=function(e){vo.isText(e)&&0===e.data.length&&e.parentNode.removeChild(e)},ls=function(e,t,n){var r=0;return Ot.each(e.select(t),function(e){if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void r++}),r},fs=function(e,t){var n,r,o,i=t?"start":"end";n=e[i+"Container"],r=e[i+"Offset"],vo.isElement(n)&&"TR"===n.nodeName&&(n=(o=n.childNodes)[Math.min(t?r:r-1,o.length-1)])&&(r=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,r))},ds=function(e){return fs(e,!0),fs(e,!1),e},ms=function(e,t){var n;if(vo.isElement(e)&&(e=zi(e,t),ss(e)))return e;if(mi.isCaretContainer(e)){if(vo.isText(e)&&mi.isCaretContainerBlock(e)&&(e=e.parentNode),n=e.previousSibling,ss(n))return n;if(n=e.nextSibling,ss(n))return n}},ps=function(e,t,n){var r,o,i,a,s,u,c,l=n.getNode(),f=l?l.nodeName:null,d=n.getRng();return ss(l)||"IMG"===f?{name:f,index:ls(n.dom,f,l)}:(l=ms((r=d).startContainer,r.startOffset)||ms(r.endContainer,r.endOffset))?{name:f=l.tagName,index:ls(n.dom,f,l)}:(o=e,a=t,s=d,u=(i=n).dom,(c={}).start=us(u,o,a,s,!0),i.isCollapsed()||(c.end=us(u,o,a,s,!1)),c)},gs={getBookmark:function(e,t,n){return 2===t?ps(ii,n,e):3===t?(o=(r=e).getRng(),{start:is(r.dom.getRoot(),ia.fromRangeStart(o)),end:is(r.dom.getRoot(),ia.fromRangeEnd(o))}):t?{rng:e.getRng()}:function(e){var t=e.dom,n=e.getRng(),r=t.uniqueId(),o=e.isCollapsed(),i="overflow:hidden;line-height:0px",a=e.getNode(),s=a.nodeName;if("IMG"===s)return{name:s,index:ls(t,s,a)};var u=ds(n.cloneRange());if(!o){u.collapse(!1);var c=t.create("span",{"data-mce-type":"bookmark",id:r+"_end",style:i},"");u.insertNode(c),cs(c.nextSibling)}(n=ds(n)).collapse(!0);var l=t.create("span",{"data-mce-type":"bookmark",id:r+"_start",style:i},"");return n.insertNode(l),cs(l.previousSibling),e.moveToBookmark({id:r,keep:1}),{id:r}}(e);var r,o},getUndoBookmark:y.curry(ps,y.identity,!0)},hs=function(e,t){for(var n=[],r=0;r<e.length;r++){var o=e[r];if(!o.isSome())return E.none();n.push(o.getOrDie())}return E.some(t.apply(null,n))},vs=function(e,t){return!e.isBlock(t)||t.innerHTML||me.ie||(t.innerHTML='<br data-mce-bogus="1" />'),t},ys=function(e,t,n,r){var o,i,a,s,u=n[t?"start":"end"],c=e.getRoot();if(u){for(a=u[0],i=c,o=u.length-1;o>=1;o--){if(s=i.childNodes,u[o]>s.length-1)return;i=s[u[o]]}3===i.nodeType&&(a=Math.min(u[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(u[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return!0},bs=function(e,t,n){var r,o,i,a,s,u,c=e.get(n.id+"_"+t),l=n.keep;if(c){if(r=c.parentNode,l?(r=c.firstChild,o=1):o=e.nodeIndex(c),s=r,u=o,!l){for(a=c.previousSibling,i=c.nextSibling,Ot.each(Ot.grep(c.childNodes),function(e){vo.isText(e)&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))});c=e.get(n.id+"_"+t);)e.remove(c,1);a&&i&&a.nodeType===i.nodeType&&vo.isText(a)&&!me.opera&&(o=a.nodeValue.length,a.appendData(i.nodeValue),e.remove(i),s=a,u=o)}return E.some(ia(s,u))}return E.none()},Cs=function(e,t){var n,r,o,i,a,s,u,c,l,f,d,m,p,g,h,v=e.dom;if(t){if(Ot.isArray(t.start))return g=t,h=(p=v).createRng(),ys(p,!0,g,h)&&ys(p,!1,g,h)?E.some(h):E.none();if("string"==typeof t.start)return E.some((f=t,d=(l=v).createRng(),m=as(l.getRoot(),f.start),d.setStart(m.container(),m.offset()),m=as(l.getRoot(),f.end),d.setEnd(m.container(),m.offset()),d));if(t.id)return u=bs(o=v,"start",i=t),c=bs(o,"end",i),hs([u,(a=c,s=u,a.isSome()?a:s)],function(e,t){var n=o.createRng();return n.setStart(vs(o,e.container()),e.offset()),n.setEnd(vs(o,t.container()),t.offset()),n});if(t.name)return n=v,r=t,E.from(n.select(r.name)[r.index]).map(function(e){var t=n.createRng();return t.selectNode(e),t});if(t.rng)return E.some(t.rng)}return E.none()},xs={getBookmark:function(e,t,n){return gs.getBookmark(e,t,n)},moveToBookmark:function(e,t){Cs(e,t).each(function(t){e.setRng(t)})},isBookmarkNode:function(e){return vo.isElement(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")}},ws=Ot.each,Ns=function(e){this.compare=function(t,n){if(t.nodeName!==n.nodeName)return!1;var r=function(t){var n={};return ws(e.getAttribs(t),function(r){var o=r.nodeName.toLowerCase();0!==o.indexOf("_")&&"style"!==o&&0!==o.indexOf("data-")&&(n[o]=e.getAttrib(t,o))}),n},o=function(e,t){var n,r;for(r in e)if(e.hasOwnProperty(r)){if(void 0===(n=t[r]))return!1;if(e[r]!==n)return!1;delete t[r]}for(r in t)if(t.hasOwnProperty(r))return!1;return!0};return!(!o(r(t),r(n))||!o(e.parseStyle(e.getAttrib(t,"style")),e.parseStyle(e.getAttrib(n,"style")))||xs.isBookmarkNode(t)||xs.isBookmarkNode(n))}},Es=function(e,t){Ur.parent(e).each(function(n){n.dom().insertBefore(t.dom(),e.dom())})},Ss=function(e,t){e.dom().appendChild(t.dom())},ks={before:Es,after:function(e,t){Ur.nextSibling(e).fold(function(){Ur.parent(e).each(function(e){Ss(e,t)})},function(e){Es(e,t)})},prepend:function(e,t){Ur.firstChild(e).fold(function(){Ss(e,t)},function(n){e.dom().insertBefore(t.dom(),n.dom())})},append:Ss,appendAt:function(e,t,n){Ur.child(e,n).fold(function(){Ss(e,t)},function(e){Es(e,t)})},wrap:function(e,t){Es(e,t),Ss(t,e)}},Ts=function(e,t){M.each(t,function(t){ks.before(e,t)})},As=function(e,t){M.each(t,function(t){ks.append(e,t)})},_s=function(e){var t=e.dom();null!==t.parentNode&&t.parentNode.removeChild(t)},Bs={empty:function(e){e.dom().textContent="",M.each(Ur.children(e),function(e){_s(e)})},remove:_s,unwrap:function(e){var t=Ur.children(e);t.length>0&&Ts(e,t),_s(e)}},Rs=(aa=Zn.isText,sa="text",ua=function(e){return aa(e)?E.from(e.dom().nodeValue):E.none()},ca=Un.detect().browser,{get:function(e){if(!aa(e))throw new Error("Can only get "+sa+" value of a "+sa+" node");return la(e).getOr("")},getOption:la=ca.isIE()&&10===ca.version.major?function(e){try{return ua(e)}catch(yC){return E.none()}}:ua,set:function(e,t){if(!aa(e))throw new Error("Can only set raw "+sa+" value of a "+sa+" node");e.dom().nodeValue=t}}),Ds=function(e){return Rs.get(e)},Os=function(e,t){return _r.all(t,e)},Ps=function(e){var t=Os(e,"br"),n=M.filter(function(e){for(var t=[],n=e.dom();n;)t.push(Hn.fromDom(n)),n=n.lastChild;return t}(e).slice(-1),io.isBr);t.length===n.length&&M.each(n,Bs.remove)},Is=function(e){Bs.empty(e),ks.append(e,Hn.fromHtml('<br data-mce-bogus="1">'))},Ls=function(e){Ur.lastChild(e).each(function(t){Ur.prevSibling(t).each(function(n){io.isBlock(e)&&io.isBr(t)&&io.isBlock(n)&&Bs.remove(t)})})},Ms=Ot.makeMap,Fs=function(e){var t,n,r,o,i,a=[];return t=(e=e||{}).indent,n=Ms(e.indent_before||""),r=Ms(e.indent_after||""),o=Ao.getEncodeFunc(e.entity_encoding||"raw",e.entities),i="html"===e.element_format,{start:function(e,s,u){var c,l,f,d;if(t&&n[e]&&a.length>0&&(d=a[a.length-1]).length>0&&"\n"!==d&&a.push("\n"),a.push("<",e),s)for(c=0,l=s.length;c<l;c++)f=s[c],a.push(" ",f.name,'="',o(f.value,!0),'"');a[a.length]=!u||i?">":" />",u&&t&&r[e]&&a.length>0&&(d=a[a.length-1]).length>0&&"\n"!==d&&a.push("\n")},end:function(e){var n;a.push("</",e,">"),t&&r[e]&&a.length>0&&(n=a[a.length-1]).length>0&&"\n"!==n&&a.push("\n")},text:function(e,t){e.length>0&&(a[a.length]=t?e:o(e))},cdata:function(e){a.push("<![CDATA[",e,"]]>")},comment:function(e){a.push("\x3c!--",e,"--\x3e")},pi:function(e,n){n?a.push("<?",e," ",o(n),"?>"):a.push("<?",e,"?>"),t&&a.push("\n")},doctype:function(e){a.push("<!DOCTYPE",e,">",t?"\n":"")},reset:function(){a.length=0},getContent:function(){return a.join("").replace(/\n$/,"")}}},zs=function(e,t){var n={},r=Fs(e);return(e=e||{}).validate=!("validate"in e)||e.validate,n.schema=t=t||Fo(),n.writer=r,n.serialize=function(n){var o,i;i=e.validate,o={3:function(e){r.text(e.value,e.raw)},8:function(e){r.comment(e.value)},7:function(e){r.pi(e.name,e.value)},10:function(e){r.doctype(e.value)},4:function(e){r.cdata(e.value)},11:function(e){if(e=e.firstChild)do{a(e)}while(e=e.next)}},r.reset();var a=function(e){var n,s,u,c,l,f,d,m,p,g=o[e.type];if(g)g(e);else{if(n=e.name,s=e.shortEnded,u=e.attributes,i&&u&&u.length>1&&((f=[]).map={},p=t.getElementRule(e.name))){for(d=0,m=p.attributesOrder.length;d<m;d++)(c=p.attributesOrder[d])in u.map&&(l=u.map[c],f.map[c]=l,f.push({name:c,value:l}));for(d=0,m=u.length;d<m;d++)(c=u[d].name)in f.map||(l=u.map[c],f.map[c]=l,f.push({name:c,value:l}));u=f}if(r.start(e.name,u,s),!s){if(e=e.firstChild)do{a(e)}while(e=e.next);r.end(n)}}};return 1!==n.type||e.inner?o[11](n):a(n),r.getContent()},n},Us=function(e){return ia.isTextPosition(e)?0===e.offset():Ei(e.getNode())},Vs=function(e){return ia.isTextPosition(e)?e.offset()===e.container().data.length:Ei(e.getNode(!0))},Hs=function(e,t){return!ia.isTextPosition(e)&&!ia.isTextPosition(t)&&e.getNode()===t.getNode(!0)},qs=function(e,t,n){return e?!Hs(t,n)&&(r=t,!(!ia.isTextPosition(r)&&vo.isBr(r.getNode())))&&Vs(t)&&Us(n):!Hs(n,t)&&Us(t)&&Vs(n);var r},js=function(e,t,n){var r=Ha(t);return E.from(e?r.next(n):r.prev(n))},$s=function(e,t){var n,r,o,i,a,s=e?t.firstChild:t.lastChild;return vo.isText(s)?E.some(new ia(s,e?0:s.data.length)):s?Ei(s)?E.some(e?ia.before(s):(a=s,vo.isBr(a)?ia.before(a):ia.after(a))):(r=t,o=s,i=(n=e)?ia.before(o):ia.after(o),js(n,r,i)):E.none()},Ws={fromPosition:js,nextPosition:y.curry(js,!0),prevPosition:y.curry(js,!1),navigate:function(e,t,n){return js(e,t,n).bind(function(r){return _a.isInSameBlock(n,r,t)&&qs(e,n,r)?js(e,t,r):E.some(r)})},positionIn:$s,firstPositionIn:y.curry($s,!0),lastPositionIn:y.curry($s,!1)},Ks=function(e){var t=ia.fromRangeStart(e),n=ia.fromRangeEnd(e),r=e.commonAncestorContainer;return Ws.fromPosition(!1,r,n).map(function(o){return!_a.isInSameBlock(t,n,r)&&_a.isInSameBlock(t,o,r)?(i=t.container(),a=t.offset(),s=o.container(),u=o.offset(),(c=document.createRange()).setStart(i,a),c.setEnd(s,u),c):e;var i,a,s,u,c}).getOr(e)},Xs=function(e){return(t=e).collapsed?t:Ks(t);var t},Ys=vo.matchNodeNames("td th"),Gs=function(e,t,n){var r,o,i,a,s,u,c,l,f,d,m,p,g=e.schema.getTextInlineElements(),h=e.selection,v=e.dom;if(/^ | $/.test(t)&&(t=function(e){var t,n,r;t=h.getRng(),n=t.startContainer,r=t.startOffset;var o=function(e){return n[e]&&3===n[e].nodeType};return 3===n.nodeType&&(r>0?e=e.replace(/^ /," "):o("previousSibling")||(e=e.replace(/^ /," ")),r<n.length?e=e.replace(/ (<br>|)$/," "):o("nextSibling")||(e=e.replace(/( | )(<br>|)$/," "))),e}(t)),r=e.parser,p=n.merge,o=zs({validate:e.settings.validate},e.schema),m='<span id="mce_marker" data-mce-type="bookmark">​</span>',u={content:t,format:"html",selection:!0,paste:n.paste},(u=e.fire("BeforeSetContent",u)).isDefaultPrevented())e.fire("SetContent",{content:u.content,format:"html",selection:!0,paste:n.paste});else{-1===(t=u.content).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,m);var y,b,C,x,w=(l=h.getRng()).startContainer||(l.parentElement?l.parentElement():null),N=e.getBody();w===N&&h.isCollapsed()&&v.isBlock(N.firstChild)&&(y=N.firstChild)&&!e.schema.getShortEndedElements()[y.nodeName]&&v.isEmpty(N.firstChild)&&((l=v.createRng()).setStart(N.firstChild,0),l.setEnd(N.firstChild,0),h.setRng(l)),h.isCollapsed()||(e.selection.setRng(Xs(e.selection.getRng())),e.getDoc().execCommand("Delete",!1,null),C=(b=h.getRng()).startContainer,x=b.startOffset,3===C.nodeType&&b.collapsed&&("\xa0"===C.data[x]?(C.deleteData(x,1),/[\u00a0| ]$/.test(t)||(t+=" ")):"\xa0"===C.data[x-1]&&(C.deleteData(x-1,1),/[\u00a0| ]$/.test(t)||(t=" "+t))));var S,k,T,A={context:(i=h.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0};if(s=r.parse(t,A),!0===n.paste&&Ya(e.schema,s)&&Ja(v,i))return l=Ga(o,v,e.selection.getRng(!0),s),e.selection.setRng(l),void e.fire("SetContent",u);if(function(e){for(var t=e;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")}(s),"mce_marker"===(f=s.lastChild).attr("id"))for(c=f,f=f.prev;f;f=f.walk(!0))if(3===f.type||!v.isBlock(f.name)){e.schema.isValidChild(f.parent.name,"span")&&f.parent.insert(c,f,"br"===f.name);break}if(e._selectionOverrides.showBlockCaretContainer(i),A.invalid){for(h.setContent(m),i=h.getNode(),a=e.getBody(),9===i.nodeType?i=f=a:f=i;f!==a;)i=f,f=f.parentNode;t=i===a?a.innerHTML:v.getOuterHTML(i),t=o.serialize(r.parse(t.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return o.serialize(s)}))),i===a?v.setHTML(a,t):v.setOuterHTML(i,t)}else t=o.serialize(s),function(e,t,n){if("all"===n.getAttribute("data-mce-bogus"))n.parentNode.insertBefore(e.dom.createFragment(t),n);else{var r=n.firstChild,o=n.lastChild;!r||r===o&&"BR"===r.nodeName?e.dom.setHTML(n,t):e.selection.setContent(t)}}(e,t,i);!function(){if(p){var t=e.getBody(),n=new Ns(v);Ot.each(v.select("*[data-mce-fragment]"),function(e){for(var r=e.parentNode;r&&r!==t;r=r.parentNode)g[e.nodeName.toLowerCase()]&&n.compare(r,e)&&v.remove(e,!0)})}}(),function(t){var n,r,o;if(t){if(h.scrollIntoView(t),n=function(t){for(var n=e.getBody();t&&t!==n;t=t.parentNode)if("false"===e.dom.getContentEditable(t))return t;return null}(t))return v.remove(t),void h.select(n);l=v.createRng(),(f=t.previousSibling)&&3===f.nodeType?(l.setStart(f,f.nodeValue.length),me.ie||(d=t.nextSibling)&&3===d.nodeType&&(f.appendData(d.data),d.parentNode.removeChild(d))):(l.setStartBefore(t),l.setEndBefore(t)),r=v.getParent(t,v.isBlock),v.remove(t),r&&v.isEmpty(r)&&(e.$(r).empty(),l.setStart(r,0),l.setEnd(r,0),Ys(r)||r.getAttribute("data-mce-fragment")||!(o=function(t){var n=ia.fromRangeStart(t);if(n=Ha(e.getBody()).next(n))return n.toRange()}(l))?v.add(r,v.create("br",{"data-mce-bogus":"1"})):(l=o,v.remove(r))),h.setRng(l)}}(v.get("mce_marker")),S=e.getBody(),Ot.each(S.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),k=e.dom,T=e.selection.getStart(),E.from(k.getParent(T,"td,th")).map(Hn.fromDom).each(Ls),e.fire("SetContent",u),e.addVisual()}},Js=function(e,t){var n,r,o="string"!=typeof(n=t)?(r=Ot.extend({paste:n.paste,data:{paste:n.paste}},n),{content:n.content,details:r}):{content:n,details:{}};Gs(e,o.content,o.details)},Qs=function(e,t,n,r,o){return e(n,r)?E.some(n):tr.isFunction(o)&&o(n)?E.none():t(n,r,o)},Zs=function(e,t,n){for(var r=e.dom(),o=tr.isFunction(n)?n:y.constant(!1);r.parentNode;){r=r.parentNode;var i=Hn.fromDom(r);if(t(i))return E.some(i);if(o(i))break}return E.none()},eu=function(e,t){return M.find(e.dom().childNodes,y.compose(t,Hn.fromDom)).map(Hn.fromDom)},tu=function(e,t){var n=function(e){for(var r=0;r<e.childNodes.length;r++){if(t(Hn.fromDom(e.childNodes[r])))return E.some(Hn.fromDom(e.childNodes[r]));var o=n(e.childNodes[r]);if(o.isSome())return o}return E.none()};return n(e.dom())},nu={first:function(e){return tu(gr.body(),e)},ancestor:Zs,closest:function(e,t,n){return Qs(function(e){return t(e)},Zs,e,t,n)},sibling:function(e,t){var n=e.dom();return n.parentNode?eu(Hn.fromDom(n.parentNode),function(n){return!Dr.eq(e,n)&&t(n)}):E.none()},child:eu,descendant:tu},ru=xr("sections","settings"),ou=Un.detect().deviceType.isTouch(),iu=["lists","autolink","autosave"],au={theme:"mobile"},su=function(e){var t=tr.isArray(e)?e.join(" "):e,n=M.map(tr.isString(t)?t.split(" "):[],On);return M.filter(n,function(e){return e.length>0})},uu=function(e,t){return e.sections().hasOwnProperty(t)},cu=function(e,t,n,r){var o,i,a=su(n.forced_plugins),s=su(r.plugins),u=e&&uu(t,"mobile")?(o=s,M.filter(o,y.curry(M.contains,iu))):s,c=(i=u,[].concat(su(a)).concat(su(i)));return Ot.extend(r,{plugins:c.join(" ")})},lu=function(e,t,n,r){var o,i,a,s,u,c,l,f,d,m,p,g,h,v=(o=["mobile"],i=r,a=sr.bifilter(i,function(e,t){return M.contains(o,t)}),ru(a.t,a.f)),y=Ot.extend(t,n,v.settings(),(p=e,h=(g=v).settings().inline,p&&uu(g,"mobile")&&!h?(l="mobile",f=au,d=v.sections(),m=d.hasOwnProperty(l)?d[l]:{},Ot.extend({},f,m)):{}),{validate:!0,content_editable:v.settings().inline,external_plugins:(s=n,u=v.settings(),c=u.external_plugins?u.external_plugins:{},s&&s.external_plugins?Ot.extend({},s.external_plugins,c):c)});return cu(e,v,n,y)},fu=function(e,t,n){return E.from(t.settings[n]).filter(e)},du=y.curry(fu,tr.isString),mu=function(e,t,n,r){var o,i,a=t in e.settings?e.settings[t]:n;return"hash"===r?(i={},"string"==typeof(o=a)?M.each(o.indexOf("=")>0?o.split(/[;,](?![^=;,]*(?:[;,]|$))/):o.split(","),function(e){(e=e.split("=")).length>1?i[Ot.trim(e[0])]=Ot.trim(e[1]):i[Ot.trim(e[0])]=Ot.trim(e)}):i=o,i):"string"===r?fu(tr.isString,e,t).getOr(n):"number"===r?fu(tr.isNumber,e,t).getOr(n):"boolean"===r?fu(tr.isBoolean,e,t).getOr(n):"object"===r?fu(tr.isObject,e,t).getOr(n):"array"===r?fu(tr.isArray,e,t).getOr(n):"function"===r?fu(tr.isFunction,e,t).getOr(n):a},pu=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,gu=function(e){return pu.test(e)},hu=function(e,t){var n=t.container(),r=t.offset();return e?mi.isCaretContainerInline(n)?vo.isText(n.nextSibling)?new ia(n.nextSibling,0):ia.after(n):mi.isBeforeInline(t)?new ia(n,r+1):t:mi.isCaretContainerInline(n)?vo.isText(n.previousSibling)?new ia(n.previousSibling,n.previousSibling.data.length):ia.before(n):mi.isAfterInline(t)?new ia(n,r-1):t},vu={isInlineTarget:function(e,t){var n=du(e,"inline_boundaries_selector").getOr("a[href],code");return _r.is(Hn.fromDom(t),n)},findRootInline:function(e,t,n){var r,o,i,a=(r=e,o=t,i=n,M.filter(Xo.DOM.getParents(i.container(),"*",o),r));return E.from(a[a.length-1])},isRtl:function(e){return"rtl"===Xo.DOM.getStyle(e,"direction",!0)||gu(e.textContent)},isAtZwsp:function(e){return mi.isBeforeInline(e)||mi.isAfterInline(e)},normalizePosition:hu,normalizeForwards:y.curry(hu,!0),normalizeBackwards:y.curry(hu,!1),hasSameParentBlock:function(e,t,n){var r=_a.getParentBlock(t,e),o=_a.getParentBlock(n,e);return r&&r===o}},yu=function(e,t){return Dr.contains(e,t)?nu.closest(t,function(e){return io.isTextBlock(e)||io.isListItem(e)},(n=e,function(e){return Dr.eq(n,Hn.fromDom(e.dom().parentNode))})):E.none();var n},bu=function(e){var t,n,r;e.dom.isEmpty(e.getBody())&&(e.setContent(""),n=(t=e).getBody(),r=n.firstChild&&t.dom.isBlock(n.firstChild)?n.firstChild:n,t.selection.setCursorLocation(r,0))},Cu=function(e,t,n){return hs([Ws.firstPositionIn(n),Ws.lastPositionIn(n)],function(r,o){var i=vu.normalizePosition(!0,r),a=vu.normalizePosition(!1,o),s=vu.normalizePosition(!1,t);return e?Ws.nextPosition(n,s).map(function(e){return e.isEqual(a)&&t.isEqual(i)}).getOr(!1):Ws.prevPosition(n,s).map(function(e){return e.isEqual(i)&&t.isEqual(a)}).getOr(!1)}).getOr(!0)},xu=function(e,t,n){return nu.ancestor(e,function(e){return _r.is(e,t)},n)},wu=xu,Nu=function(e,t){return _r.one(t,e)},Eu=function(e,t,n){return Qs(_r.is,xu,e,t,n)},Su=function(e,t,n){return wu(e,t,n).isSome()},ku=function(e,t){return vo.isText(t)&&/^[ \t\r\n]*$/.test(t.data)&&!1===(n=e,r=t,o=Hn.fromDom(n),i=Hn.fromDom(r),Su(i,"pre,code",y.curry(Dr.eq,o)));var n,r,o,i},Tu=function(e,t){return Ei(t)&&!1===ku(e,t)||(n=t,vo.isElement(n)&&"A"===n.nodeName&&n.hasAttribute("name"))||Au(t);var n},Au=vo.hasAttribute("data-mce-bookmark"),_u=vo.hasAttribute("data-mce-bogus"),Bu=vo.hasAttributeValue("data-mce-bogus","all"),Ru=function(e){return function(e){var t,n,r=0;if(Tu(e,e))return!1;if(!(n=e.firstChild))return!0;t=new to(n,e);do{if(Bu(n))n=t.next(!0);else if(_u(n))n=t.next();else if(vo.isBr(n))r++,n=t.next();else{if(Tu(e,n))return!1;n=t.next()}}while(n);return r<=1}(e.dom())},Du=xr("block","position"),Ou=xr("from","to"),Pu=function(e,t){var n=Hn.fromDom(e),r=Hn.fromDom(t.container());return yu(n,r).map(function(e){return Du(e,t)})},Iu=function(e,t,n){var r=Pu(e,ia.fromRangeStart(n)),o=r.bind(function(n){return Ws.fromPosition(t,e,n.position()).bind(function(n){return Pu(e,n).map(function(n){return r=e,o=t,i=n,vo.isBr(i.position().getNode())&&!1===Ru(i.block())?Ws.positionIn(!1,i.block().dom()).bind(function(e){return e.isEqual(i.position())?Ws.fromPosition(o,r,e).bind(function(e){return Pu(r,e)}):E.some(i)}).getOr(i):i;var r,o,i})})});return hs([r,o],Ou).filter(function(e){return r=e,!1===Dr.eq(r.from().block(),r.to().block())&&(n=e,Ur.parent(n.from().block()).bind(function(e){return Ur.parent(n.to().block()).filter(function(t){return Dr.eq(e,t)})}).isSome())&&(t=e,!1===vo.isContentEditableFalse(t.from().block())&&!1===vo.isContentEditableFalse(t.to().block()));var t,n,r})},Lu=function(e,t,n){return n.collapsed?Iu(e,t,n):E.none()},Mu=function(e,t,n){return Dr.contains(t,e)?Ur.parents(e,function(e){return n(e)||Dr.eq(e,t)}).slice(0,-1):[]},Fu=function(e,t){return Mu(e,t,y.constant(!1))},zu=Fu,Uu=function(e,t){return[e].concat(Fu(e,t))},Vu=function(e){var t,n,r=(t=e,n=Ur.children(t),M.findIndex(n,io.isBlock).fold(function(){return n},function(e){return n.slice(0,e)}));return M.each(r,function(e){Bs.remove(e)}),r},Hu=function(e,t){Ws.positionIn(e,t.dom()).each(function(e){var t=e.getNode();vo.isBr(t)&&Bs.remove(Hn.fromDom(t))})},qu=function(e,t){var n=Uu(t,e);return M.find(n.reverse(),Ru).each(Bs.remove)},ju=function(e,t){return Dr.contains(t,e)?Ur.parent(e).bind(function(n){return Dr.eq(n,t)?E.some(e):(r=t,o=e,i=Ur.parents(o,function(e){return Dr.eq(e,r)}),E.from(i[i.length-2]));var r,o,i}):E.none()},$u=function(e,t,n){if(Ru(n))return Bs.remove(n),Ru(t)&&Is(t),Ws.firstPositionIn(t.dom());Hu(!0,t),Hu(!1,n);var r=Vu(t);return ju(t,n).fold(function(){qu(e,t);var o=Ws.lastPositionIn(n.dom());return M.each(r,function(e){ks.append(n,e)}),o},function(o){var i=Ws.prevPosition(n.dom(),ia.before(o.dom()));return M.each(r,function(e){ks.before(o,e)}),qu(e,t),i})},Wu=function(e,t,n,r){return t?$u(e,r,n):$u(e,n,r)},Ku=function(e,t){var n,r=Hn.fromDom(e.getBody());return(n=Lu(r.dom(),t,e.selection.getRng()).bind(function(e){return Wu(r,t,e.from().block(),e.to().block())})).each(function(t){e.selection.setRng(t.toRange())}),n.isSome()},Xu=function(e,t){var n=Hn.fromDom(t),r=y.curry(Dr.eq,e);return nu.ancestor(n,io.isTableCell,r).isSome()},Yu=function(e,t){var n,r,o=Ws.prevPosition(e.dom(),ia.fromRangeStart(t)).isNone(),i=Ws.nextPosition(e.dom(),ia.fromRangeEnd(t)).isNone();return!(Xu(n=e,(r=t).startContainer)||Xu(n,r.endContainer))&&o&&i},Gu=function(e){var t,n,r,o,i=Hn.fromDom(e.getBody()),a=e.selection.getRng();return Yu(i,a)?((o=e).setContent(""),o.selection.setCursorLocation(),!0):(t=i,n=e.selection,r=n.getRng(),hs([yu(t,Hn.fromDom(r.startContainer)),yu(t,Hn.fromDom(r.endContainer))],function(e,o){return!1===Dr.eq(e,o)&&(r.deleteContents(),Wu(t,!0,e,o).each(function(e){n.setRng(e.toRange())}),!0)}).getOr(!1))},Ju=function(e,t){return!e.selection.isCollapsed()&&Gu(e)},Qu=function(e){if(!tr.isArray(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");var t=[],n={};return M.each(e,function(r,o){var i=sr.keys(r);if(1!==i.length)throw new Error("one and only one name per case");var a=i[0],s=r[a];if(n[a]!==undefined)throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!tr.isArray(s))throw new Error("case arguments must be an array");t.push(a),n[a]=function(){var n=arguments.length;if(n!==s.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+s.length+" ("+s+"), got "+n);for(var r=new Array(n),i=0;i<r.length;i++)r[i]=arguments[i];return{fold:function(){if(arguments.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+arguments.length);return arguments[o].apply(null,r)},match:function(e){var n=sr.keys(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!M.forall(t,function(e){return M.contains(n,e)}))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,r)},log:function(e){console.log(e,{constructors:t,constructor:a,params:r})}}}}),n},Zu=Qu([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),ec=function(e,t,n,r){var o=r.getNode(!1===t);return yu(Hn.fromDom(e),Hn.fromDom(n.getNode())).map(function(e){return Ru(e)?Zu.remove(e.dom()):Zu.moveToElement(o)}).orThunk(function(){return E.some(Zu.moveToElement(o))})},tc=function(e,t,n){return Ws.fromPosition(t,e,n).bind(function(r){return t&&vo.isContentEditableFalse(r.getNode())?ec(e,t,n,r):!1===t&&vo.isContentEditableFalse(r.getNode(!0))?ec(e,t,n,r):t&&_a.isAfterContentEditableFalse(n)?E.some(Zu.moveToPosition(r)):!1===t&&_a.isBeforeContentEditableFalse(n)?E.some(Zu.moveToPosition(r)):E.none()})},nc=function(e,t,n){return i=t,a=n.getNode(!1===i),s=i?"after":"before",vo.isElement(a)&&a.getAttribute("data-mce-caret")===s?(r=t,o=n.getNode(!1===t),r&&vo.isContentEditableFalse(o.nextSibling)?E.some(Zu.moveToElement(o.nextSibling)):!1===r&&vo.isContentEditableFalse(o.previousSibling)?E.some(Zu.moveToElement(o.previousSibling)):E.none()).fold(function(){return tc(e,t,n)},E.some):tc(e,t,n).bind(function(t){return r=e,o=n,t.fold(function(e){return E.some(Zu.remove(e))},function(e){return E.some(Zu.moveToElement(e))},function(e){return _a.isInSameBlock(o,e,r)?E.none():E.some(Zu.moveToPosition(e))});var r,o});var r,o,i,a,s},rc=function(e,t,n){var r=_a.normalizeRange(t?1:-1,e,n),o=ia.fromRangeStart(r);return!1===t&&_a.isAfterContentEditableFalse(o)?E.some(Zu.remove(o.getNode(!0))):t&&_a.isBeforeContentEditableFalse(o)?E.some(Zu.remove(o.getNode())):nc(e,t,o)},oc=function(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===ia.isTextPosition(n)&&o===r.parentNode&&i>ia.before(r).offset()?new ia(t.container(),t.offset()-1):t;var n,r,o,i},ic=function(e){return Ei(e.previousSibling)?E.some((t=e.previousSibling,vo.isText(t)?new ia(t,t.data.length):ia.after(t))):e.previousSibling?Ws.lastPositionIn(e.previousSibling):E.none();var t},ac=function(e){return Ei(e.nextSibling)?E.some((t=e.nextSibling,vo.isText(t)?new ia(t,0):ia.before(t))):e.nextSibling?Ws.firstPositionIn(e.nextSibling):E.none();var t},sc=function(e,t){return ic(t).orThunk(function(){return ac(t)}).orThunk(function(){return n=e,r=t,o=ia.before(r.previousSibling?r.previousSibling:r.parentNode),Ws.prevPosition(n,o).fold(function(){return Ws.nextPosition(n,ia.after(r))},E.some);var n,r,o})},uc=function(e,t){return ac(t).orThunk(function(){return ic(t)}).orThunk(function(){return n=e,r=t,Ws.nextPosition(n,ia.after(r)).fold(function(){return Ws.prevPosition(n,ia.before(r))},E.some);var n,r})},cc=function(e,t,n){return(r=e,o=t,i=n,r?uc(o,i):sc(o,i)).map(y.curry(oc,n));var r,o,i},lc=function(e,t,n){n.fold(function(){e.focus()},function(n){e.selection.setRng(n.toRange(),t)})},fc=function(e,t){return t&&e.schema.getBlockElements().hasOwnProperty(Zn.name(t))},dc=function(e){if(Ru(e)){var t=Hn.fromHtml('<br data-mce-bogus="1">');return Bs.empty(e),ks.append(e,t),E.some(ia.before(t.dom()))}return E.none()},mc=function(e,t,n){var r,o,i,a=cc(t,e.getBody(),n.dom()),s=nu.ancestor(n,y.curry(fc,e),(r=e.getBody(),function(e){return e.dom()===r})),u=(o=n,i=a,hs([Ur.prevSibling(o),Ur.nextSibling(o),i],function(e,t,n){var r,i=e.dom(),a=t.dom();return vo.isText(i)&&vo.isText(a)?(r=i.data.length,i.appendData(a.data),Bs.remove(t),Bs.remove(o),n.container()===a?new ia(i,r):n):(Bs.remove(o),n)}).orThunk(function(){return Bs.remove(o),i}));e.dom.isEmpty(e.getBody())?(e.setContent(""),e.selection.setCursorLocation()):s.bind(dc).fold(function(){lc(e,t,u)},function(n){lc(e,t,E.some(n))})},pc=function(e,t){return rc(e.getBody(),t,e.selection.getRng()).map(function(n){return n.fold((a=e,s=t,function(e){return a._selectionOverrides.hideFakeCaret(),mc(a,s,Hn.fromDom(e)),!0}),(o=e,i=t,function(e){var t=i?ia.before(e):ia.after(e);return o.selection.setRng(t.toRange()),!0}),(r=e,function(e){return r.selection.setRng(e.toRange()),!0}));var r,o,i,a,s}).getOr(!1)},gc=function(e,t){var n,r=e.selection.getNode();return!!vo.isContentEditableFalse(r)&&(n=Hn.fromDom(e.getBody()),M.each(Os(n,".mce-offscreen-selection"),Bs.remove),mc(e,t,Hn.fromDom(e.selection.getNode())),bu(e),!0)},hc=function(e,t){return e.selection.isCollapsed()?pc(e,t):gc(e,t)},vc=function(e){var t,n=function(e,t){for(;t&&t!==e;){if(vo.isContentEditableTrue(t)||vo.isContentEditableFalse(t))return t;t=t.parentNode}return null}(e.getBody(),e.selection.getNode());return vo.isContentEditableTrue(n)&&e.dom.isBlock(n)&&e.dom.isEmpty(n)&&(t=e.dom.create("br",{"data-mce-bogus":"1"}),e.dom.setHTML(n,""),n.appendChild(t),e.selection.setRng(ia.before(t).toRange())),!0},yc=vo.isText,bc=function(e){return yc(e)&&e.data[0]===oi},Cc=function(e){return yc(e)&&e.data[e.data.length-1]===oi},xc=function(e){return e.ownerDocument.createTextNode(oi)},wc=function(e,t){return e?function(e){if(yc(e.previousSibling))return Cc(e.previousSibling)?e.previousSibling:(e.previousSibling.appendData(oi),e.previousSibling);if(yc(e))return bc(e)?e:(e.insertData(0,oi),e);var t=xc(e);return e.parentNode.insertBefore(t,e),t}(t):function(e){if(yc(e.nextSibling))return bc(e.nextSibling)?e.nextSibling:(e.nextSibling.insertData(0,oi),e.nextSibling);if(yc(e))return Cc(e)?e:(e.appendData(oi),e);var t=xc(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t}(t)},Nc={insertInline:wc,insertInlineBefore:y.curry(wc,!0),insertInlineAfter:y.curry(wc,!1)},Ec=vo.isElement,Sc=vo.isText,kc=function(e){var t=e.parentNode;t&&t.removeChild(e)},Tc=function(e,t){0===t.length?kc(e):e.nodeValue=t},Ac=function(e){var t=ii(e);return{count:e.length-t.length,text:t}},_c=function(e,t){return Dc(e),t},Bc=function(e,t){return t.container()===e?(r=t,o=Ac((n=e).data.substr(0,r.offset())),i=Ac(n.data.substr(r.offset())),(a=o.text+i.text).length>0?(Tc(n,a),new ia(n,r.offset()-o.count)):r):_c(e,t);var n,r,o,i,a},Rc=function(e,t){return t.container()===e.parentNode?(n=e,o=(r=t).container(),i=M.indexOf(o.childNodes,n).map(function(e){return e<r.offset()?new ia(o,r.offset()-1):r}).getOr(r),Dc(n),i):_c(e,t);var n,r,o,i},Dc=function(e){if(Ec(e)&&mi.isCaretContainer(e)&&(mi.hasContent(e)?e.removeAttribute("data-mce-caret"):kc(e)),Sc(e)){var t=ii(function(e){try{return e.nodeValue}catch(t){return""}}(e));Tc(e,t)}},Oc={removeAndReposition:function(e,t){return ia.isTextPosition(t)?Bc(e,t):Rc(e,t)},remove:Dc},Pc=function(e,t){return vo.isText(e.container())?Nc.insertInline(t,e.container()):Nc.insertInline(t,e.getNode())},Ic=function(e,t){var n=t.get();return n&&e.container()===n&&mi.isCaretContainerInline(n)},Lc=function(e,t){return t.fold(function(t){Oc.remove(e.get());var n=Nc.insertInlineBefore(t);return e.set(n),E.some(new ia(n,n.length-1))},function(t){return Ws.firstPositionIn(t).map(function(t){if(Ic(t,e))return new ia(e.get(),1);Oc.remove(e.get());var n=Pc(t,!0);return e.set(n),new ia(n,1)})},function(t){return Ws.lastPositionIn(t).map(function(t){if(Ic(t,e))return new ia(e.get(),e.get().length-1);Oc.remove(e.get());var n=Pc(t,!1);return e.set(n),new ia(n,n.length-1)})},function(t){Oc.remove(e.get());var n=Nc.insertInlineAfter(t);return e.set(n),E.some(new ia(n,1))})},Mc=function(e){return e&&/^(IMG)$/.test(e.nodeName)},Fc=function(e){return e&&3===e.nodeType&&/^([\t \r\n]+|)$/.test(e.nodeValue)},zc=function(e,t,n){return"color"!==n&&"backgroundColor"!==n||(t=e.toHex(t)),"fontWeight"===n&&700===t&&(t="bold"),"fontFamily"===n&&(t=t.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),""+t},Uc={isInlineBlock:Mc,moveStart:function(e,t,n){var r,o,i,a=n.startContainer,s=n.startOffset;if((n.startContainer!==n.endContainer||!Mc(n.startContainer.childNodes[n.startOffset]))&&(3===a.nodeType&&s>=a.nodeValue.length&&(s=e.nodeIndex(a),a=a.parentNode),1===a.nodeType))for(s<(i=a.childNodes).length?(a=i[s],r=new to(a,e.getParent(a,e.isBlock))):(a=i[i.length-1],(r=new to(a,e.getParent(a,e.isBlock))).next(!0)),o=r.current();o;o=r.next())if(3===o.nodeType&&!Fc(o))return n.setStart(o,0),void t.setRng(n)},getNonWhiteSpaceSibling:function(e,t,n){if(e)for(t=t?"nextSibling":"previousSibling",e=n?e:e[t];e;e=e[t])if(1===e.nodeType||!Fc(e))return e},isTextBlock:function(e,t){return t.nodeType&&(t=t.nodeName),!!e.schema.getTextBlockElements()[t.toLowerCase()]},isValid:function(e,t,n){return e.schema.isValidChild(t,n)},isWhiteSpaceNode:Fc,replaceVars:function(e,t){return"string"!=typeof e?e=e(t):t&&(e=e.replace(/%(\w+)/g,function(e,n){return t[n]||e})),e},isEq:function(e,t){return e=e||"",t=t||"",e=""+(e.nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()===t.toLowerCase()},normalizeStyleValue:zc,getStyle:function(e,t,n){return zc(e,e.getStyle(t,n),n)},getTextDecoration:function(e,t){var n;return e.getParent(t,function(t){return(n=e.getStyle(t,"text-decoration"))&&"none"!==n}),n},getParents:function(e,t,n){return e.getParents(t,n,e.getRoot())}},Vc=xs.isBookmarkNode,Hc=Uc.getParents,qc=Uc.isWhiteSpaceNode,jc=Uc.isTextBlock,$c=function(e,t){for(void 0===t&&(t=3===e.nodeType?e.length:e.childNodes.length);e&&e.hasChildNodes();)(e=e.childNodes[t])&&(t=3===e.nodeType?e.length:e.childNodes.length);return{node:e,offset:t}},Wc=function(e,t){for(var n=t;n;){if(1===n.nodeType&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t},Kc=function(e,t,n,r){var o,i,a=n.nodeValue;return void 0===r&&(r=e?a.length:0),e?-1===(o=(o=a.lastIndexOf(" ",r))>(i=a.lastIndexOf("\xa0",r))?o:i)||t||o++:(o=a.indexOf(" ",r),i=a.indexOf("\xa0",r),o=-1!==o&&(-1===i||o<i)?o:i),o},Xc=function(e,t,n,r,o,i){var a,s,u,c;if(3===n.nodeType){if(-1!==(u=Kc(o,i,n,r)))return{container:n,offset:u};c=n}for(a=new to(n,e.getParent(n,e.isBlock)||t);s=a[o?"prev":"next"]();)if(3===s.nodeType){if(c=s,-1!==(u=Kc(o,i,s)))return{container:s,offset:u}}else if(e.isBlock(s))break;if(c)return{container:c,offset:r=o?0:c.length}},Yc=function(e,t,n,r,o){var i,a,s,u;for(3===r.nodeType&&0===r.nodeValue.length&&r[o]&&(r=r[o]),i=Hc(e,r),a=0;a<i.length;a++)for(s=0;s<t.length;s++)if(!("collapsed"in(u=t[s])&&u.collapsed!==n.collapsed)&&e.is(i[a],u.selector))return i[a];return r},Gc=function(e,t,n,r){var o,i=e.dom,a=i.getRoot();if(t[0].wrapper||(o=i.getParent(n,t[0].block,a)),!o){var s=i.getParent(n,"LI,TD,TH");o=i.getParent(3===n.nodeType?n.parentNode:n,function(t){return t!==a&&jc(e,t)},s)}if(o&&t[0].wrapper&&(o=Hc(i,o,"ul,ol").reverse()[0]||o),!o)for(o=n;o[r]&&!i.isBlock(o[r])&&(o=o[r],!Uc.isEq(o,"br")););return o||n},Jc=function(e,t,n,r,o,i,a){var s,u,c,l,f,d;if(s=u=a?n:o,l=a?"previousSibling":"nextSibling",f=e.getRoot(),3===s.nodeType&&!qc(s)&&(a?r>0:i<s.nodeValue.length))return s;for(;;){if(!t[0].block_expand&&e.isBlock(u))return u;for(c=u[l];c;c=c[l])if(!Vc(c)&&!qc(c)&&("BR"!==(d=c).nodeName||!d.getAttribute("data-mce-bogus")||d.nextSibling))return u;if(u===f||u.parentNode===f){s=u;break}u=u.parentNode}return s},Qc=function(e,t,n,r){var o,i=t.startContainer,a=t.startOffset,s=t.endContainer,u=t.endOffset,c=e.dom;return 1===i.nodeType&&i.hasChildNodes()&&3===(i=zi(i,a)).nodeType&&(a=0),1===s.nodeType&&s.hasChildNodes()&&3===(s=zi(s,t.collapsed?u:u-1)).nodeType&&(u=s.nodeValue.length),i=Wc(c,i),s=Wc(c,s),(Vc(i.parentNode)||Vc(i))&&3===(i=(i=Vc(i)?i:i.parentNode).nextSibling||i).nodeType&&(a=0),(Vc(s.parentNode)||Vc(s))&&3===(s=(s=Vc(s)?s:s.parentNode).previousSibling||s).nodeType&&(u=s.length),n[0].inline&&(t.collapsed&&((o=Xc(c,e.getBody(),i,a,!0,r))&&(i=o.container,a=o.offset),(o=Xc(c,e.getBody(),s,u,!1,r))&&(s=o.container,u=o.offset)),s=r?s:function(e,t){var n=$c(e,t);if(n.node){for(;n.node&&0===n.offset&&n.node.previousSibling;)n=$c(n.node.previousSibling);n.node&&n.offset>0&&3===n.node.nodeType&&" "===n.node.nodeValue.charAt(n.offset-1)&&n.offset>1&&(e=n.node).splitText(n.offset-1)}return e}(s,u)),(n[0].inline||n[0].block_expand)&&(n[0].inline&&3===i.nodeType&&0!==a||(i=Jc(c,n,i,a,s,u,!0)),n[0].inline&&3===s.nodeType&&u!==s.nodeValue.length||(s=Jc(c,n,i,a,s,u,!1))),n[0].selector&&!1!==n[0].expand&&!n[0].inline&&(i=Yc(c,n,t,i,"previousSibling"),s=Yc(c,n,t,s,"nextSibling")),(n[0].block||n[0].selector)&&(i=Gc(e,n,i,"previousSibling"),s=Gc(e,n,s,"nextSibling"),n[0].block&&(c.isBlock(i)||(i=Jc(c,n,i,a,s,u,!0)),c.isBlock(s)||(s=Jc(c,n,i,a,s,u,!1)))),1===i.nodeType&&(a=c.nodeIndex(i),i=i.parentNode),1===s.nodeType&&(u=c.nodeIndex(s)+1,s=s.parentNode),{startContainer:i,startOffset:a,endContainer:s,endOffset:u}},Zc=Uc.isEq,el=function(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o<r.length;o++)if(!1===r[o].inherit&&e.dom.is(t,r[o].selector))return!0;return!1},tl=function(e,t,n,r){var o=e.dom.getRoot();return t!==o&&(t=e.dom.getParent(t,function(t){return!!el(e,t,n)||t.parentNode===o||!!ol(e,t,n,r,!0)}),ol(e,t,n,r))},nl=function(e,t,n){return!!Zc(t,n.inline)||!!Zc(t,n.block)||(n.selector?1===t.nodeType&&e.is(t,n.selector):void 0)},rl=function(e,t,n,r,o,i){var a,s,u,c=n[r];if(n.onmatch)return n.onmatch(t,n,r);if(c)if("undefined"==typeof c.length){for(a in c)if(c.hasOwnProperty(a)){if(s="attributes"===r?e.getAttrib(t,a):Uc.getStyle(e,t,a),o&&!s&&!n.exact)return;if((!o||n.exact)&&!Zc(s,Uc.normalizeStyleValue(e,Uc.replaceVars(c[a],i),a)))return}}else for(u=0;u<c.length;u++)if("attributes"===r?e.getAttrib(t,c[u]):Uc.getStyle(e,t,c[u]))return n;return n},ol=function(e,t,n,r,o){var i,a,s,u,c=e.formatter.get(n),l=e.dom;if(c&&t)for(a=0;a<c.length;a++)if(i=c[a],nl(e.dom,t,i)&&rl(l,t,i,"attributes",o,r)&&rl(l,t,i,"styles",o,r)){if(u=i.classes)for(s=0;s<u.length;s++)if(!e.dom.hasClass(t,u[s]))return;return i}},il={matchNode:ol,matchName:nl,match:function(e,t,n,r){var o;return r?tl(e,r,t,n):(r=e.selection.getNode(),!!tl(e,r,t,n)||!((o=e.selection.getStart())===r||!tl(e,o,t,n)))},matchAll:function(e,t,n){var r,o=[],i={};return r=e.selection.getStart(),e.dom.getParent(r,function(r){var a,s;for(a=0;a<t.length;a++)s=t[a],!i[s]&&ol(e,r,s,n)&&(i[s]=!0,o.push(s))},e.dom.getRoot()),o},canApply:function(e,t){var n,r,o,i,a,s=e.formatter.get(t),u=e.dom;if(s)for(n=e.selection.getStart(),r=Uc.getParents(u,n),i=s.length-1;i>=0;i--){if(!(a=s[i].selector)||s[i].defaultBlock)return!0;for(o=r.length-1;o>=0;o--)if(u.is(r[o],a))return!0}return!1},matchesUnInheritedFormatSelector:el},al=function(e,t){return e.splitText(t)},sl={split:function(e){var t=e.startContainer,n=e.startOffset,r=e.endContainer,o=e.endOffset;return t===r&&vo.isText(t)?n>0&&n<t.nodeValue.length&&(t=(r=al(t,n)).previousSibling,o>n?(t=r=al(r,o-=n).previousSibling,o=r.nodeValue.length,n=0):o=0):(vo.isText(t)&&n>0&&n<t.nodeValue.length&&(t=al(t,n),n=0),vo.isText(r)&&o>0&&o<r.nodeValue.length&&(o=(r=al(r,o).previousSibling).nodeValue.length)),{startContainer:t,startOffset:n,endContainer:r,endOffset:o}}},ul=oi,cl="_mce_caret",ll=function(e){return 1===e.nodeType&&e.id===cl},fl=function(e){return function(e){for(var t=[];e;){if(3===e.nodeType&&e.nodeValue!==ul||e.childNodes.length>1)return[];1===e.nodeType&&t.push(e),e=e.firstChild}return t}(e).length>0},dl=function(e){var t;if(e)for(e=(t=new to(e,e)).current();e;e=t.next())if(3===e.nodeType)return e;return null},ml=function(e){var t=Hn.fromTag("span");return dr.setAll(t,{id:cl,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&ks.append(t,Hn.fromText(ul)),t},pl=function(e,t){for(;t&&t!==e;){if(t.id===cl)return t;t=t.parentNode}return null},gl=function(e,t,n,r){var o,i,a,s;o=t.getRng(!0),i=e.getParent(n,e.isBlock),fl(n)?(!1!==r&&(o.setStartBefore(n),o.setEndBefore(n)),e.remove(n)):((s=dl(n))&&s.nodeValue.charAt(0)===ul&&s.deleteData(0,1),a=s,o.startContainer===a&&o.startOffset>0&&o.setStart(a,o.startOffset-1),o.endContainer===a&&o.endOffset>0&&o.setEnd(a,o.endOffset-1),e.remove(n,!0)),i&&e.isEmpty(i)&&Is(Hn.fromDom(i)),t.setRng(o)},hl=function(e,t,n,r,o){if(r)gl(t,n,r,o);else if(!(r=pl(e,n.getStart())))for(;r=t.get(cl);)gl(t,n,r,!1)},vl=function(e,t,n){var r=e.dom,o=r.getParent(n,ji.curry(Uc.isTextBlock,e));o&&r.isEmpty(o)?n.parentNode.replaceChild(t,n):(Ps(Hn.fromDom(n)),r.isEmpty(n)?n.parentNode.replaceChild(t,n):r.insertAfter(t,n))},yl=function(e,t){return e.appendChild(t),t},bl=function(e,t){var n=M.foldr(e,function(e,t){return yl(e,t.cloneNode(!1))},t);return yl(n,n.ownerDocument.createTextNode(ul))},Cl=function(e){var t=e.dom,n=e.selection,r=e.getBody();e.on("mouseup keydown",function(e){var o,i,a,s;o=r,i=t,a=n,s=e.keyCode,hl(o,i,a,null,!1),8===s&&a.isCollapsed()&&a.getStart().innerHTML===ul&&hl(o,i,a,pl(o,a.getStart())),37!==s&&39!==s||hl(o,i,a,pl(o,a.getStart()))})},xl=function(e,t,n){var r,o,i,a,s,u,c=e.selection;a=(r=c.getRng(!0)).startOffset,u=r.startContainer.nodeValue,(o=pl(e.getBody(),c.getStart()))&&(i=dl(o));var l,f,d=/[^\s\u00a0\u00ad\u200b\ufeff]/;u&&a>0&&a<u.length&&d.test(u.charAt(a))&&d.test(u.charAt(a-1))?(s=c.getBookmark(),r.collapse(!0),r=Qc(e,r,e.formatter.get(t)),r=sl.split(r),e.formatter.apply(t,n,r),c.moveToBookmark(s)):(o&&i.nodeValue===ul?e.formatter.apply(t,n,o):(l=e.getDoc(),f=ml(!0).dom(),i=(o=l.importNode(f,!0)).firstChild,r.insertNode(o),a=1,e.formatter.apply(t,n,o)),c.setCursorLocation(i,a))},wl=function(e,t,n,r){var o,i,a,s,u,c,l,f=e.dom,d=e.selection,m=[],p=d.getRng();for(o=p.startContainer,i=p.startOffset,u=o,3===o.nodeType&&(i!==o.nodeValue.length&&(s=!0),u=u.parentNode);u;){if(il.matchNode(e,u,t,n,r)){c=u;break}u.nextSibling&&(s=!0),m.push(u),u=u.parentNode}if(c)if(s){a=d.getBookmark(),p.collapse(!0);var g=Qc(e,p,e.formatter.get(t),!0);g=sl.split(g),e.formatter.remove(t,n,g),d.moveToBookmark(a)}else{l=pl(e.getBody(),c);var h=ml(!1).dom(),v=bl(m,h);vl(e,h,l||c),gl(f,d,l,!1),d.setCursorLocation(v,1),f.isEmpty(c)&&f.remove(c)}},Nl=ll,El=pl,Sl=function(e,t){var n=ml(!1),r=bl(t,n.dom());return ks.before(Hn.fromDom(e),n),Bs.remove(Hn.fromDom(e)),ia(r,0)},kl=function(e,t){return e.schema.getTextInlineElements().hasOwnProperty(Zn.name(t))&&!ll(t.dom())&&!vo.isBogus(t.dom())},Tl=function(e,t){for(var n=0;n<e.length;n++){var r=e[n].apply(null,t);if(r.isSome())return r}return E.none()},Al=Qu([{before:["element"]},{start:["element"]},{end:["element"]},{after:["element"]}]),_l=function(e,t){var n=_a.getParentBlock(t,e);return n||e},Bl=function(e,t,n){var r=vu.normalizeForwards(n),o=_l(t,r.container());return vu.findRootInline(e,o,r).fold(function(){return Ws.nextPosition(o,r).bind(y.curry(vu.findRootInline,e,o)).map(function(e){return Al.before(e)})},E.none)},Rl=function(e,t){return null===El(e,t)},Dl=function(e,t,n){return vu.findRootInline(e,t,n).filter(y.curry(Rl,t))},Ol=function(e,t,n){var r=vu.normalizeBackwards(n);return Dl(e,t,r).bind(function(e){return Ws.prevPosition(e,r).isNone()?E.some(Al.start(e)):E.none()})},Pl=function(e,t,n){var r=vu.normalizeForwards(n);return Dl(e,t,r).bind(function(e){return Ws.nextPosition(e,r).isNone()?E.some(Al.end(e)):E.none()})},Il=function(e,t,n){var r=vu.normalizeBackwards(n),o=_l(t,r.container());return vu.findRootInline(e,o,r).fold(function(){return Ws.prevPosition(o,r).bind(y.curry(vu.findRootInline,e,o)).map(function(e){return Al.after(e)})},E.none)},Ll=function(e){return!1===vu.isRtl(Fl(e))},Ml=function(e,t,n){return Tl([Bl,Ol,Pl,Il],[e,t,n]).filter(Ll)},Fl=function(e){return e.fold(y.identity,y.identity,y.identity,y.identity)},zl=function(e){return e.fold(y.constant("before"),y.constant("start"),y.constant("end"),y.constant("after"))},Ul=function(e){return e.fold(Al.before,Al.before,Al.after,Al.after)},Vl=function(e,t,n,r,o,i){return hs([vu.findRootInline(t,n,r),vu.findRootInline(t,n,o)],function(t,r){return t!==r&&vu.hasSameParentBlock(n,t,r)?Al.after(e?t:r):i}).getOr(i)},Hl=function(e,t){return e.fold(y.constant(!0),function(e){return r=t,!(zl(n=e)===zl(r)&&Fl(n)===Fl(r));var n,r})},ql=function(e,t){return e?t.fold(y.compose(E.some,Al.start),E.none,y.compose(E.some,Al.after),E.none):t.fold(E.none,y.compose(E.some,Al.before),E.none,y.compose(E.some,Al.end))},jl=function(e,t,n,r){var o=vu.normalizePosition(e,r),i=Ml(t,n,o);return Ml(t,n,o).bind(y.curry(ql,e)).orThunk(function(){return o=e,a=t,s=n,u=i,c=r,l=vu.normalizePosition(o,c),Ws.fromPosition(o,s,l).map(y.curry(vu.normalizePosition,o)).fold(function(){return u.map(Ul)},function(e){return Ml(a,s,e).map(y.curry(Vl,o,a,s,l,e)).filter(y.curry(Hl,u))}).filter(Ll);var o,a,s,u,c,l})},$l=Ml,Wl=jl,Kl=(y.curry(jl,!1),y.curry(jl,!0),Ul),Xl=function(e){return e.fold(Al.start,Al.start,Al.end,Al.end)},Yl=function(e){var t=e,n=function(){return t};return{get:n,set:function(e){t=e},clone:function(){return Yl(n())}}},Gl=function(e){return tr.isFunction(e.selection.getSel().modify)},Jl=function(e,t,n){var r=e?1:-1;return t.setRng(ia(n.container(),n.offset()+r).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0},Ql=function(e,t){var n=t.selection.getRng(),r=e?ia.fromRangeEnd(n):ia.fromRangeStart(n);return!!Gl(t)&&(e&&mi.isBeforeInline(r)?Jl(!0,t.selection,r):!(e||!mi.isAfterInline(r))&&Jl(!1,t.selection,r))},Zl=function(e,t){var n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)},ef=function(e){return!1!==e.settings.inline_boundaries},tf=function(e,t){e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")},nf=function(e,t,n){return Lc(t,n).map(function(t){return Zl(e,t),n})},rf=function(e,t,n){return function(){return!!ef(t)&&Ql(e,t)}},of={move:function(e,t,n){return function(){return!!ef(e)&&(r=e,o=t,i=n,a=r.getBody(),s=ia.fromRangeStart(r.selection.getRng()),u=y.curry(vu.isInlineTarget,r),Wl(i,u,a,s).bind(function(e){return nf(r,o,e)})).isSome();var r,o,i,a,s,u}},moveNextWord:y.curry(rf,!0),movePrevWord:y.curry(rf,!1),setupSelectedState:function(e){var t=new Yl(null),n=y.curry(vu.isInlineTarget,e);return e.on("NodeChange",function(r){var o,i,a,s,u;ef(e)&&(o=n,i=e.dom,a=r.parents,s=M.filter(i.select('*[data-mce-selected="inline-boundary"]'),o),u=M.filter(a,o),M.each(M.difference(s,u),y.curry(tf,!1)),M.each(M.difference(u,s),y.curry(tf,!0)),function(e,t){if(e.selection.isCollapsed()&&!0!==e.composing&&t.get()){var n=ia.fromRangeStart(e.selection.getRng());ia.isTextPosition(n)&&!1===vu.isAtZwsp(n)&&(Zl(e,Oc.removeAndReposition(t.get(),n)),t.set(null))}}(e,t),function(e,t,n,r){if(t.selection.isCollapsed()){var o=M.filter(r,e);M.each(o,function(r){var o=ia.fromRangeStart(t.selection.getRng());$l(e,t.getBody(),o).bind(function(e){return nf(t,n,e)})})}}(n,e,t,r.parents))}),t},setCaretPosition:Zl},af=function(e,t){return function(n){return Lc(t,n).map(function(t){return of.setCaretPosition(e,t),!0}).getOr(!1)}},sf=function(e,t,n,r){var o=e.getBody(),i=y.curry(vu.isInlineTarget,e);e.undoManager.ignore(function(){var a,s,u;e.selection.setRng((a=n,s=r,(u=document.createRange()).setStart(a.container(),a.offset()),u.setEnd(s.container(),s.offset()),u)),e.execCommand("Delete"),$l(i,o,ia.fromRangeStart(e.selection.getRng())).map(Xl).map(af(e,t))}),e.nodeChanged()},uf=function(e,t,n,r){var o,i,a=(o=e.getBody(),i=r.container(),_a.getParentBlock(i,o)||o),s=y.curry(vu.isInlineTarget,e),u=$l(s,a,r);return u.bind(function(e){return n?e.fold(y.constant(E.some(Xl(e))),E.none,y.constant(E.some(Kl(e))),E.none):e.fold(E.none,y.constant(E.some(Kl(e))),E.none,y.constant(E.some(Xl(e))))}).map(af(e,t)).getOrThunk(function(){var o=Ws.navigate(n,a,r),i=o.bind(function(e){return $l(s,a,e)});return u.isSome()&&i.isSome()?vu.findRootInline(s,a,r).map(function(t){return r=t,!!hs([Ws.firstPositionIn(r),Ws.lastPositionIn(r)],function(e,t){var n=vu.normalizePosition(!0,e),o=vu.normalizePosition(!1,t);return Ws.nextPosition(r,n).map(function(e){return e.isEqual(o)}).getOr(!0)}).getOr(!0)&&(mc(e,n,Hn.fromDom(t)),!0);var r}).getOr(!1):i.bind(function(i){return o.map(function(o){return n?sf(e,t,r,o):sf(e,t,o,r),!0})}).getOr(!1)})},cf=function(e,t,n){if(e.selection.isCollapsed()&&!1!==e.settings.inline_boundaries){var r=ia.fromRangeStart(e.selection.getRng());return uf(e,t,n,r)}return!1},lf=xr("start","end"),ff=xr("rng","table","cells"),df=Qu([{removeTable:["element"]},{emptyCells:["cells"]}]),mf=function(e,t){return Eu(Hn.fromDom(e),"td,th",t)},pf=function(e,t){return wu(e,"table",t)},gf=function(e){return!1===Dr.eq(e.start(),e.end())},hf=function(e,t){return(n=e,r=t,pf(n.start(),r).bind(function(e){return pf(n.end(),r).bind(function(t){return Dr.eq(e,t)?E.some(e):E.none()})})).bind(function(t){var n=Os(t,"td,th");return ff(e,t,n)});var n,r},vf=function(e,t){var n,r,o=y.curry(Dr.eq,e);return(n=t,r=o,hs([mf(n.startContainer,r),mf(n.endContainer,r)],lf).filter(gf)).map(function(e){return hf(e,o)})},yf=function(e,t){return M.findIndex(e,function(e){return Dr.eq(e,t)})},bf=function(e){return(t=e,hs([yf(t.cells(),t.rng().start()),yf(t.cells(),t.rng().end())],function(e,n){return t.cells().slice(e,n+1)})).bind(function(t){var n=e.cells();return t.length===n.length?df.removeTable(e.table()):df.emptyCells(t)});var t},Cf=function(e,t){return vf(e,t).map(bf)},xf=function(e){var t=[];if(e)for(var n=0;n<e.rangeCount;n++)t.push(e.getRangeAt(n));return t},wf=xf,Nf=function(e){return M.bind(e,function(e){var t=Fi(e);return t?[Hn.fromDom(t)]:[]})},Ef=function(e){return xf(e).length>1},Sf=function(e){return M.filter(Nf(e),io.isTableCell)},kf=function(e){return Os(e,"td[data-mce-selected],th[data-mce-selected]")},Tf=function(e,t){var n=kf(t),r=Sf(e);return n.length>0?n:r},Af=Tf,_f=function(e){return Tf(wf(e.selection.getSel()),Hn.fromDom(e.getBody()))},Bf=function(e,t){return M.each(t,Is),e.selection.setCursorLocation(t[0].dom(),0),!0},Rf=function(e,t){return mc(e,!1,t),!0},Df=function(e,t,n,r){return Pf(t,r).fold(function(){return r=e,Cf(t,n).map(function(e){return e.fold(y.curry(Rf,r),y.curry(Bf,r))});var r},function(t){return If(e,t)}).getOr(!1)},Of=function(e,t){return M.find(Uu(t,e),io.isTableCell)},Pf=function(e,t){return M.find(Uu(t,e),function(e){return"caption"===Zn.name(e)})},If=function(e,t){return Is(t),e.selection.setCursorLocation(t.dom(),0),E.some(!0)},Lf=function(e,t,n,r,o){return Ws.navigate(n,e.getBody(),o).bind(function(i){return u=r,c=n,l=o,f=i,Ws.firstPositionIn(u.dom()).bind(function(e){return Ws.lastPositionIn(u.dom()).map(function(t){return c?l.isEqual(e)&&f.isEqual(t):l.isEqual(t)&&f.isEqual(e)})}).getOr(!0)?If(e,r):(a=r,s=i,Pf(t,Hn.fromDom(s.getNode())).map(function(e){return!1===Dr.eq(e,a)}));var a,s,u,c,l,f}).or(E.some(!0))},Mf=function(e,t,n,r){var o=ia.fromRangeStart(e.selection.getRng());return Of(n,r).bind(function(r){return Ru(r)?If(e,r):(i=e,a=n,s=t,u=r,c=o,Ws.navigate(s,i.getBody(),c).bind(function(e){return Of(a,Hn.fromDom(e.getNode())).map(function(e){return!1===Dr.eq(e,u)})}));var i,a,s,u,c})},Ff=function(e,t,n){var r=Hn.fromDom(e.getBody());return Pf(r,n).fold(function(){return Mf(e,t,r,n)},function(n){return o=e,i=t,a=r,s=n,u=ia.fromRangeStart(o.selection.getRng()),Ru(s)?If(o,s):Lf(o,a,i,s,u);var o,i,a,s,u}).getOr(!1)},zf=function(e,t){var n,r,o,i,a,s=Hn.fromDom(e.selection.getStart(!0));return e.selection.isCollapsed()?Ff(e,t,s):(n=e,r=s,o=Hn.fromDom(n.getBody()),i=n.selection.getRng(),0!==(a=_f(n)).length?Bf(n,a):Df(n,o,i,r))},Uf=function(e,t){e.getDoc().execCommand(t,!1,null)},Vf=function(e){hc(e,!1)||cf(e,!1)||Ku(e,!1)||zf(e)||Ju(e,!1)||(Uf(e,"Delete"),bu(e))},Hf=function(e){hc(e,!0)||cf(e,!0)||Ku(e,!0)||zf(e)||Ju(e,!0)||Uf(e,"ForwardDelete")},qf=function(e,t){return e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset},jf=xr("container","offset"),$f=function(e,t,n){return null!==function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(e,t,n)},Wf=function(e,t,n){return $f(e,t,function(e){return e.nodeName===n})},Kf=function(e){return e&&"TABLE"===e.nodeName},Xf=function(e,t,n){for(var r=new to(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());t=r[n?"prev":"next"]();)if(vo.isBr(t))return!0},Yf=function(e,t,n,r,o){var i,a,s,u,c,l,f=e.getRoot(),d=e.schema.getNonEmptyElements();if(s=e.getParent(o.parentNode,e.isBlock)||f,r&&vo.isBr(o)&&t&&e.isEmpty(s))return E.some(jf(o.parentNode,e.nodeIndex(o)));for(i=new to(o,s);u=i[r?"prev":"next"]();){if("false"===e.getContentEditableParent(u)||(c=u,l=f,mi.isCaretContainer(c)&&!1===$f(c,l,Nl)))return E.none();if(vo.isText(u)&&u.nodeValue.length>0)return!1===Wf(u,f,"A")?E.some(jf(u,r?u.nodeValue.length:0)):E.none();if(e.isBlock(u)||d[u.nodeName.toLowerCase()])return E.none();a=u}return n&&a?E.some(jf(a,0)):E.none()},Gf=function(e,t,n,r){var o,i,a,s,u,c,l,f,d,m,p=e.getRoot(),g=!1;if(o=r[(n?"start":"end")+"Container"],i=r[(n?"start":"end")+"Offset"],l=vo.isElement(o)&&i===o.childNodes.length,u=e.schema.getNonEmptyElements(),c=n,mi.isCaretContainer(o))return E.none();if(vo.isElement(o)&&i>o.childNodes.length-1&&(c=!1),vo.isDocument(o)&&(o=p,i=0),o===p){if(c&&(s=o.childNodes[i>0?i-1:0])){if(mi.isCaretContainer(s))return E.none();if(u[s.nodeName]||Kf(s))return E.none()}if(o.hasChildNodes()){if(i=Math.min(!c&&i>0?i-1:i,o.childNodes.length-1),o=o.childNodes[i],i=vo.isText(o)&&l?o.data.length:0,!t&&o===p.lastChild&&Kf(o))return E.none();if(function(e,t){for(;t&&t!==e;){if(vo.isContentEditableFalse(t))return!0;t=t.parentNode}return!1}(p,o)||mi.isCaretContainer(o))return E.none();if(o.hasChildNodes()&&!1===Kf(o)){s=o,a=new to(o,p);do{if(vo.isContentEditableFalse(s)||mi.isCaretContainer(s)){g=!1;break}if(vo.isText(s)&&s.nodeValue.length>0){i=c?0:s.nodeValue.length,o=s,g=!0;break}if(u[s.nodeName.toLowerCase()]&&(!(f=s)||!/^(TD|TH|CAPTION)$/.test(f.nodeName))){i=e.nodeIndex(s),o=s.parentNode,"IMG"!==s.nodeName&&"PRE"!==s.nodeName||c||i++,g=!0;break}}while(s=c?a.next():a.prev())}}}return t&&(vo.isText(o)&&0===i&&Yf(e,l,t,!0,o).each(function(e){o=e.container(),i=e.offset(),g=!0}),vo.isElement(o)&&((s=o.childNodes[i])||(s=o.childNodes[i-1]),!s||!vo.isBr(s)||(m="A",(d=s).previousSibling&&d.previousSibling.nodeName===m)||Xf(e,s,!1)||Xf(e,s,!0)||Yf(e,l,t,!0,s).each(function(e){o=e.container(),i=e.offset(),g=!0}))),c&&!t&&vo.isText(o)&&i===o.nodeValue.length&&Yf(e,l,t,!1,o).each(function(e){o=e.container(),i=e.offset(),g=!0}),g?E.some(jf(o,i)):E.none()},Jf={normalize:function(e,t){var n=t.collapsed,r=t.cloneRange();return Gf(e,n,!0,r).each(function(e){r.setStart(e.container(),e.offset())}),n||Gf(e,n,!1,r).each(function(e){r.setEnd(e.container(),e.offset())}),n&&r.collapse(!0),qf(t,r)?E.none():E.some(r)}},Qf=function(e,t,n){var r=e.create("span",{}," ");n.parentNode.insertBefore(r,n),t.scrollIntoView(r),e.remove(r)},Zf=function(e,t,n,r){var o=e.createRng();r?(o.setStartBefore(n),o.setEndBefore(n)):(o.setStartAfter(n),o.setEndAfter(n)),t.setRng(o)},ed=function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();Jf.normalize(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var s=a.startOffset,u=a.startContainer;if(1===u.nodeType&&u.hasChildNodes()){var c=s>u.childNodes.length-1;u=u.childNodes[Math.min(s,u.childNodes.length-1)]||u,s=c&&3===u.nodeType?u.nodeValue.length:0}var l=i.getParent(u,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=t&&t.ctrlKey;"LI"!==d||m||(l=f),u&&3===u.nodeType&&s>=u.nodeValue.length&&(function(e,t,n){for(var r,o=new to(t,n),i=e.getNonEmptyElements();r=o.next();)if(i[r.nodeName.toLowerCase()]||r.length>0)return!0}(e.schema,u,l)||(n=i.create("br"),a.insertNode(n),a.setStartAfter(n),a.setEndAfter(n),r=!0)),n=i.create("br"),a.insertNode(n),Qf(i,o,n),Zf(i,o,n,r),e.undoManager.add()},td=function(e,t){var n=Hn.fromTag("br");ks.before(Hn.fromDom(t),n),e.undoManager.add()},nd=function(e,t){rd(e.getBody(),t)||ks.after(Hn.fromDom(t),Hn.fromTag("br"));var n=Hn.fromTag("br");ks.after(Hn.fromDom(t),n),Qf(e.dom,e.selection,n.dom()),Zf(e.dom,e.selection,n.dom(),!1),e.undoManager.add()},rd=function(e,t){return n=ia.after(t),!!vo.isBr(n.getNode())||Ws.nextPosition(e,ia.after(t)).map(function(e){return vo.isBr(e.getNode())}).getOr(!1);var n},od=function(e){return e&&"A"===e.nodeName&&"href"in e},id=function(e){return e.fold(y.constant(!1),od,od,y.constant(!1))},ad=function(e,t){t.fold(y.noop,y.curry(td,e),y.curry(nd,e),y.noop)},sd=function(e,t){var n,r,o,i=(n=e,r=y.curry(vu.isInlineTarget,n),o=ia.fromRangeStart(n.selection.getRng()),$l(r,n.getBody(),o).filter(id));i.isSome()?i.each(y.curry(ad,e)):ed(e,t)},ud=Qu([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),cd=(ud.before,ud.on,ud.after,function(e){return e.fold(y.identity,y.identity,y.identity)}),ld=Qu([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),fd=xr("start","soffset","finish","foffset"),dd={domRange:ld.domRange,relative:ld.relative,exact:ld.exact,exactFromRange:function(e){return ld.exact(e.start(),e.soffset(),e.finish(),e.foffset())},range:fd,getWin:function(e){var t=e.match({domRange:function(e){return Hn.fromDom(e.startContainer)},relative:function(e,t){return cd(e)},exact:function(e,t,n,r){return e}});return Ur.defaultView(t)}},md=Un.detect().browser,pd=function(e,t){var n=Zn.isText(t)?Ds(t).length:Ur.children(t).length+1;return e>n?n:e<0?0:e},gd=function(e){return dd.range(e.start(),pd(e.soffset(),e.start()),e.finish(),pd(e.foffset(),e.finish()))},hd=function(e,t){return Dr.contains(e,t)||Dr.eq(e,t)},vd=function(e){return function(t){return hd(e,t.start())&&hd(e,t.finish())}},yd=function(e){return!0===e.inline||md.isIE()},bd=function(e){return dd.range(Hn.fromDom(e.startContainer),e.startOffset,Hn.fromDom(e.endContainer),e.endOffset)},Cd=function(e){var t=e.getSelection();return(t&&0!==t.rangeCount?E.from(t.getRangeAt(0)):E.none()).map(bd)},xd=function(e){var t=Ur.defaultView(e);return Cd(t.dom()).filter(vd(e))},wd=function(e,t){return E.from(t).filter(vd(e)).map(gd)},Nd=function(e){var t=document.createRange();return t.setStart(e.start().dom(),e.soffset()),t.setEnd(e.finish().dom(),e.foffset()),E.some(t)},Ed=function(e){return(e.bookmark?e.bookmark:E.none()).bind(y.curry(wd,Hn.fromDom(e.getBody()))).bind(Nd)},Sd=function(e){var t=yd(e)?xd(Hn.fromDom(e.getBody())):E.none();e.bookmark=t.isSome()?t:e.bookmark},kd=function(e){Ed(e).each(function(t){e.selection.setRng(t)})},Td=Ed,Ad=Ot.each,_d=Ot.extend,Bd=Ot.map,Rd=Ot.inArray,Dd=Ot.explode,Od=function(e){var t,n,r,o,i={state:{},exec:{},value:{}},a=e.settings;e.on("PreInit",function(){t=e.dom,n=e.selection,a=e.settings,r=e.formatter});var s=function(t){var n;if(!e.quirks.isHidden()&&!e.removed){if(t=t.toLowerCase(),n=i.state[t])return n(t);try{return e.getDoc().queryCommandState(t)}catch(r){}return!1}},u=function(e,t){t=t||"exec",Ad(e,function(e,n){Ad(n.toLowerCase().split(","),function(n){i[t][n]=e})})};_d(this,{execCommand:function(t,n,r,o){var a,s,u=!1;if(!e.removed){if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(t)||o&&o.skip_focus?kd(e):e.focus(),(o=e.fire("BeforeExecCommand",{command:t,ui:n,value:r})).isDefaultPrevented())return!1;if(s=t.toLowerCase(),a=i.exec[s])return a(s,n,r),e.fire("ExecCommand",{command:t,ui:n,value:r}),!0;if(Ad(e.plugins,function(o){if(o.execCommand&&o.execCommand(t,n,r))return e.fire("ExecCommand",{command:t,ui:n,value:r}),u=!0,!1}),u)return u;if(e.theme&&e.theme.execCommand&&e.theme.execCommand(t,n,r))return e.fire("ExecCommand",{command:t,ui:n,value:r}),!0;try{u=e.getDoc().execCommand(t,n,r)}catch(c){}return!!u&&(e.fire("ExecCommand",{command:t,ui:n,value:r}),!0)}},queryCommandState:s,queryCommandValue:function(t){var n;if(!e.quirks.isHidden()&&!e.removed){if(t=t.toLowerCase(),n=i.value[t])return n(t);try{return e.getDoc().queryCommandValue(t)}catch(r){}}},queryCommandSupported:function(t){if(t=t.toLowerCase(),i.exec[t])return!0;try{return e.getDoc().queryCommandSupported(t)}catch(n){}return!1},addCommands:u,addCommand:function(t,n,r){t=t.toLowerCase(),i.exec[t]=function(t,o,i,a){return n.call(r||e,o,i,a)}},addQueryStateHandler:function(t,n,r){t=t.toLowerCase(),i.state[t]=function(){return n.call(r||e)}},addQueryValueHandler:function(t,n,r){t=t.toLowerCase(),i.value[t]=function(){return n.call(r||e)}},hasCustomCommand:function(e){return e=e.toLowerCase(),!!i.exec[e]}});var c=function(t,n,r){return n===undefined&&(n=!1),r===undefined&&(r=null),e.getDoc().execCommand(t,n,r)},l=function(e){return r.match(e)},f=function(t,n){r.toggle(t,n?{value:n}:undefined),e.nodeChanged()},d=function(e){o=n.getBookmark(e)},m=function(){n.moveToBookmark(o)};u({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){e.undoManager.add()},"Cut,Copy,Paste":function(t){var n,r=e.getDoc();try{c(t)}catch(i){n=!0}if("paste"!==t||r.queryCommandEnabled(t)||(n=!0),n||!r.queryCommandSupported(t)){var o=e.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");me.mac&&(o=o.replace(/Ctrl\+/g,"\u2318+")),e.notificationManager.open({text:o,type:"error"})}},unlink:function(){if(n.isCollapsed()){var t=e.dom.getParent(e.selection.getStart(),"a");t&&e.dom.remove(t,!0)}else r.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"===t&&(t="justify"),Ad("left,center,right,justify".split(","),function(e){t!==e&&r.remove("align"+e)}),"none"!==t&&f("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var r,o;c(e),(r=t.getParent(n.getNode(),"ol,ul"))&&(o=r.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(o.nodeName)&&(d(),t.split(o,r),m()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){f(e)},"ForeColor,HiliteColor,FontName":function(e,t,n){f(e,n)},FontSize:function(e,t,n){var r,o;n>=1&&n<=7&&(o=Dd(a.font_size_style_values),n=(r=Dd(a.font_size_classes))?r[n-1]||n:o[n-1]||n),f(e,n)},RemoveFormat:function(e){r.remove(e)},mceBlockQuote:function(){f("blockquote")},FormatBlock:function(e,t,n){return f(n||"p")},mceCleanup:function(){var t=n.getBookmark();e.setContent(e.getContent({cleanup:!0}),{cleanup:!0}),n.moveToBookmark(t)},mceRemoveNode:function(t,r,o){var i=o||n.getNode();i!==e.getBody()&&(d(),e.dom.remove(i,!0),m())},mceSelectNodeDepth:function(r,o,i){var a=0;t.getParent(n.getNode(),function(e){if(1===e.nodeType&&a++===i)return n.select(e),!1},e.getBody())},mceSelectNode:function(e,t,r){n.select(r)},mceInsertContent:function(t,n,r){Js(e,r)},mceInsertRawHTML:function(t,r,o){n.setContent("tiny_mce_marker"),e.setContent(e.getContent().replace(/tiny_mce_marker/g,function(){return o}))},mceToggleFormat:function(e,t,n){f(n)},mceSetContent:function(t,n,r){e.setContent(r)},"Indent,Outdent":function(o){var i,u,l;i=a.indentation,u=/[a-z%]+$/i.exec(i),i=parseInt(i,10),s("InsertUnorderedList")||s("InsertOrderedList")?c(o):(a.forced_root_block||t.getParent(n.getNode(),t.isBlock)||r.apply("div"),Ad(n.getSelectedBlocks(),function(n){if("false"!==t.getContentEditable(n)&&"LI"!==n.nodeName){var r=e.getParam("indent_use_margin",!1)?"margin":"padding";r="TABLE"===n.nodeName?"margin":r,r+="rtl"===t.getStyle(n,"direction",!0)?"Right":"Left","outdent"===o?(l=Math.max(0,parseInt(n.style[r]||0,10)-i),t.setStyle(n,r,l?l+u:"")):(l=parseInt(n.style[r]||0,10)+i+u,t.setStyle(n,r,l))}}))},mceRepaint:function(){},InsertHorizontalRule:function(){e.execCommand("mceInsertContent",!1,"<hr />")},mceToggleVisualAid:function(){e.hasVisual=!e.hasVisual,e.addVisual()},mceReplaceContent:function(t,r,o){e.execCommand("mceInsertContent",!1,o.replace(/\{\$selection\}/g,n.getContent({format:"text"})))},mceInsertLink:function(e,o,i){var a;"string"==typeof i&&(i={href:i}),a=t.getParent(n.getNode(),"a"),i.href=i.href.replace(" ","%20"),a&&i.href||r.remove("link"),i.href&&r.apply("link",i,a)},selectAll:function(){var e=t.getParent(n.getStart(),vo.isContentEditableTrue);if(e){var r=t.createRng();r.selectNodeContents(e),n.setRng(r)}},"delete":function(){Vf(e)},forwardDelete:function(){Hf(e)},mceNewDocument:function(){e.setContent("")},InsertLineBreak:function(t,n,r){return sd(e,r),!0}}),u({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(e){var o="align"+e.substring(7),i=n.isCollapsed()?[t.getParent(n.getNode(),t.isBlock)]:n.getSelectedBlocks(),a=Bd(i,function(e){return!!r.matchNode(e,o)});return-1!==Rd(a,!0)},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return l(e)},mceBlockQuote:function(){return l("blockquote")},Outdent:function(){var e;if(a.inline_styles){if((e=t.getParent(n.getStart(),t.isBlock))&&parseInt(e.style.paddingLeft,10)>0)return!0;if((e=t.getParent(n.getEnd(),t.isBlock))&&parseInt(e.style.paddingLeft,10)>0)return!0}return s("InsertUnorderedList")||s("InsertOrderedList")||!a.inline_styles&&!!t.getParent(n.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(e){var r=t.getParent(n.getNode(),"ul,ol");return r&&("insertunorderedlist"===e&&"UL"===r.tagName||"insertorderedlist"===e&&"OL"===r.tagName)}},"state"),u({"FontSize,FontName":function(e){var r,o=0;return(r=t.getParent(n.getNode(),"span"))&&(o="fontsize"===e?r.style.fontSize:r.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()),o}},"value"),u({Undo:function(){e.undoManager.undo()},Redo:function(){e.undoManager.redo()}})},Pd=Ot.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend"," "),Id=function(e){var t,n,r=this,o={},i=function(){return!1},a=function(){return!0};t=(e=e||{}).scope||r,n=e.toggleEvent||i;var s=function(e,t,a,s){var u,c,l;if(!1===t&&(t=i),t)for(t={func:t},s&&Ot.extend(t,s),l=(c=e.toLowerCase().split(" ")).length;l--;)e=c[l],(u=o[e])||(u=o[e]=[],n(e,!0)),a?u.unshift(t):u.push(t);return r},u=function(e,t){var i,a,s,u,c;if(e)for(i=(u=e.toLowerCase().split(" ")).length;i--;){if(e=u[i],a=o[e],!e){for(s in o)n(s,!1),delete o[s];return r}if(a){if(t)for(c=a.length;c--;)a[c].func===t&&(a=a.slice(0,c).concat(a.slice(c+1)),o[e]=a);else a.length=0;a.length||(n(e,!1),delete o[e])}}else{for(e in o)n(e,!1);o={}}return r};r.fire=function(n,r){var s,c,l,f;if(n=n.toLowerCase(),(r=r||{}).type=n,r.target||(r.target=t),r.preventDefault||(r.preventDefault=function(){r.isDefaultPrevented=a},r.stopPropagation=function(){r.isPropagationStopped=a},r.stopImmediatePropagation=function(){r.isImmediatePropagationStopped=a},r.isDefaultPrevented=i,r.isPropagationStopped=i,r.isImmediatePropagationStopped=i),e.beforeFire&&e.beforeFire(r),s=o[n])for(c=0,l=s.length;c<l;c++){if((f=s[c]).once&&u(n,f.func),r.isImmediatePropagationStopped())return r.stopPropagation(),r;if(!1===f.func.call(t,r))return r.preventDefault(),r}return r},r.on=s,r.off=u,r.once=function(e,t,n){return s(e,t,n,{once:!0})},r.has=function(e){return e=e.toLowerCase(),!(!o[e]||0===o[e].length)}};Id.isNative=function(e){return!!Pd[e.toLowerCase()]};var Ld,Md=function(e){return e._eventDispatcher||(e._eventDispatcher=new Id({scope:e,toggleEvent:function(t,n){Id.isNative(t)&&e.toggleNativeEvent&&e.toggleNativeEvent(t,n)}})),e._eventDispatcher},Fd={fire:function(e,t,n){if(this.removed&&"remove"!==e)return t;if(t=Md(this).fire(e,t,n),!1!==n&&this.parent)for(var r=this.parent();r&&!t.isPropagationStopped();)r.fire(e,t,!1),r=r.parent();return t},on:function(e,t,n){return Md(this).on(e,t,n)},off:function(e,t){return Md(this).off(e,t)},once:function(e,t){return Md(this).once(e,t)},hasEventListeners:function(e){return Md(this).has(e)}},zd=Xo.DOM,Ud=function(e,t){return"selectionchange"===t?e.getDoc():!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t)?e.getDoc().documentElement:e.settings.event_root?(e.eventRoot||(e.eventRoot=zd.select(e.settings.event_root)[0]),e.eventRoot):e.getBody()},Vd=function(e,t){var n,r,o=function(e){return!e.hidden&&!e.readonly};if(e.delegates||(e.delegates={}),!e.delegates[t]&&!e.removed)if(n=Ud(e,t),e.settings.event_root){if(Ld||(Ld={},e.editorManager.on("removeEditor",function(){var t;if(!e.editorManager.activeEditor&&Ld){for(t in Ld)e.dom.unbind(Ud(e,t));Ld=null}})),Ld[t])return;r=function(n){for(var r=n.target,i=e.editorManager.get(),a=i.length;a--;){var s=i[a].getBody();(s===r||zd.isChildOf(r,s))&&o(i[a])&&i[a].fire(t,n)}},Ld[t]=r,zd.bind(n,t,r)}else r=function(n){o(e)&&e.fire(t,n)},zd.bind(n,t,r),e.delegates[t]=r},Hd={bindPendingEventDelegates:function(){var e=this;Ot.each(e._pendingNativeEvents,function(t){Vd(e,t)})},toggleNativeEvent:function(e,t){var n=this;"focus"!==e&&"blur"!==e&&(t?n.initialized?Vd(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(Ud(n,e),e,n.delegates[e]),delete n.delegates[e]))},unbindAllNativeEvents:function(){var e,t=this;if(t.delegates){for(e in t.delegates)t.dom.unbind(Ud(t,e),e,t.delegates[e]);delete t.delegates}t.inline||(t.getBody().onload=null,t.dom.unbind(t.getWin()),t.dom.unbind(t.getDoc())),t.dom.unbind(t.getBody()),t.dom.unbind(t.getContainer())}},qd=Hd=Ot.extend({},Fd,Hd),jd=function(e,t,n){try{e.getDoc().execCommand(t,!1,n)}catch(r){}},$d=function(e,t){var n,r,o;e._clickBlocker&&(e._clickBlocker.unbind(),e._clickBlocker=null),t?(e._clickBlocker=(r=(n=e).getBody(),o=function(e){n.dom.getParents(e.target,"a").length>0&&e.preventDefault()},n.dom.bind(r,"click",o),{unbind:function(){n.dom.unbind(r,"click",o)}}),e.selection.controlSelection.hideResizeRect(),e.readonly=!0,e.getBody().contentEditable=!1):(e.readonly=!1,e.getBody().contentEditable=!0,jd(e,"StyleWithCSS",!1),jd(e,"enableInlineTableEditing",!1),jd(e,"enableObjectResizing",!1),e.focus(),e.nodeChanged())},Wd=function(e,t){var n=e.readonly?"readonly":"design";t!==n&&(e.initialized?$d(e,"readonly"===t):e.on("init",function(){$d(e,"readonly"===t)}),e.fire("SwitchMode",{mode:t}))},Kd=Ot.each,Xd=Ot.explode,Yd={f9:120,f10:121,f11:122},Gd=Ot.makeMap("alt,ctrl,shift,meta,access"),Jd=function(e){var t={},n=[],r=function(e){var t,n,r={};for(n in Kd(Xd(e,"+"),function(e){e in Gd?r[e]=!0:/^[0-9]{2,}$/.test(e)?r.keyCode=parseInt(e,10):(r.charCode=e.charCodeAt(0),r.keyCode=Yd[e]||e.toUpperCase().charCodeAt(0))}),t=[r.keyCode],Gd)r[n]?t.push(n):r[n]=!1;return r.id=t.join(","),r.access&&(r.alt=!0,me.mac?r.ctrl=!0:r.shift=!0),r.meta&&(me.mac?r.meta=!0:(r.ctrl=!0,r.meta=!1)),r},o=function(t,n,o,i){var a;return(a=Ot.map(Xd(t,">"),r))[a.length-1]=Ot.extend(a[a.length-1],{func:o,scope:i||e}),Ot.extend(a[0],{desc:e.translate(n),subpatterns:a.slice(1)})},i=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},a=function(e){return e.func?e.func.call(e.scope):null};e.on("keyup keypress keydown",function(e){var r,o;((o=e).altKey||o.ctrlKey||o.metaKey||"keydown"===(r=e).type&&r.keyCode>=112&&r.keyCode<=123)&&!e.isDefaultPrevented()&&(Kd(t,function(t){if(i(e,t))return n=t.subpatterns.slice(0),"keydown"===e.type&&a(t),!0}),i(e,n[0])&&(1===n.length&&"keydown"===e.type&&a(n[0]),n.shift()))}),this.add=function(n,r,i,a){var s;return s=i,"string"==typeof i?i=function(){e.execCommand(s,!1,null)}:Ot.isArray(s)&&(i=function(){e.execCommand(s[0],s[1],s[2])}),Kd(Xd(Ot.trim(n.toLowerCase())),function(e){var n=o(e,r,i,a);t[n.id]=n}),!0},this.remove=function(e){var n=o(e);return!!t[n.id]&&(delete t[n.id],!0)}},Qd=Ot.each,Zd=function(e,t,n){var r,o,i,a,s=1;for(a=e.getShortEndedElements(),(i=/<([!?\/])?([A-Za-z0-9\-_\:\.]+)((?:\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g).lastIndex=r=n;o=i.exec(t);){if(r=i.lastIndex,"/"===o[1])s--;else if(!o[1]){if(o[2]in a)continue;s++}if(0===s)break}return r},em=function(e,t){var n=this,r=function(){};e=e||{},n.schema=t=t||Fo(),!1!==e.fix_self_closing&&(e.fix_self_closing=!0),Qd("comment cdata text start end pi doctype".split(" "),function(t){t&&(n[t]=e[t]||r)}),n.parse=function(n){var r,o,i,a,s,u,c,l,f,d,m,p,g,h,v,y,b,C,x,w,N,E,S,k,T,A,_,B,R,D=this,O=0,P=[],I=0,L=Ao.decode,M=Ot.makeMap("src,href,data,background,formaction,poster"),F=/((java|vb)script|mhtml):/i,z=/^data:/i,U=function(e){var t,n;for(t=P.length;t--&&P[t].name!==e;);if(t>=0){for(n=P.length-1;n>=t;n--)(e=P[n]).valid&&D.end(e.name);P.length=t}},V=function(t,n,r,o,i){var s,u,c;if(r=(n=n.toLowerCase())in m?n:L(r||o||i||""),g&&!l&&0==(0===(c=n).indexOf("data-")||0===c.indexOf("aria-"))){if(!(s=C[n])&&x){for(u=x.length;u--&&!(s=x[u]).pattern.test(n););-1===u&&(s=null)}if(!s)return;if(s.validValues&&!(r in s.validValues))return}if(M[n]&&!e.allow_script_urls){var f=r.replace(/[\s\u0000-\u001F]+/g,"");try{f=decodeURIComponent(f)}catch(d){f=unescape(f)}if(F.test(f))return;if(!e.allow_html_data_urls&&z.test(f)&&!/^data:image\//i.test(f))return}l&&(n in M||0===n.indexOf("on"))||(a.map[n]=r,a.push({name:n,value:r}))};for(T=new RegExp("<(?:(?:!--([\\w\\W]*?)--\x3e)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),A=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,d=t.getShortEndedElements(),k=e.self_closing_elements||t.getSelfClosingElements(),m=t.getBoolAttrs(),g=e.validate,f=e.remove_internals,R=e.fix_self_closing,_=t.getSpecialElements(),S=n+">";r=T.exec(S);){if(O<r.index&&D.text(L(n.substr(O,r.index-O))),o=r[6])":"===(o=o.toLowerCase()).charAt(0)&&(o=o.substr(1)),U(o);else if(o=r[7]){if(r.index+r[0].length>n.length){D.text(L(n.substr(r.index))),O=r.index+r[0].length;continue}if(":"===(o=o.toLowerCase()).charAt(0)&&(o=o.substr(1)),p=o in d,R&&k[o]&&P.length>0&&P[P.length-1].name===o&&U(o),!g||(h=t.getElementRule(o))){if(v=!0,g&&(C=h.attributes,x=h.attributePatterns),(b=r[8])?((l=-1!==b.indexOf("data-mce-type"))&&f&&(v=!1),(a=[]).map={},b.replace(A,V)):(a=[]).map={},g&&!l){if(w=h.attributesRequired,N=h.attributesDefault,E=h.attributesForced,h.removeEmptyAttrs&&!a.length&&(v=!1),E)for(s=E.length;s--;)c=(y=E[s]).name,"{$uid}"===(B=y.value)&&(B="mce_"+I++),a.map[c]=B,a.push({name:c,value:B});if(N)for(s=N.length;s--;)(c=(y=N[s]).name)in a.map||("{$uid}"===(B=y.value)&&(B="mce_"+I++),a.map[c]=B,a.push({name:c,value:B}));if(w){for(s=w.length;s--&&!(w[s]in a.map););-1===s&&(v=!1)}if(y=a.map["data-mce-bogus"]){if("all"===y){O=Zd(t,n,T.lastIndex),T.lastIndex=O;continue}v=!1}}v&&D.start(o,a,p)}else v=!1;if(i=_[o]){i.lastIndex=O=r.index+r[0].length,(r=i.exec(n))?(v&&(u=n.substr(O,r.index-O)),O=r.index+r[0].length):(u=n.substr(O),O=n.length),v&&(u.length>0&&D.text(u,!0),D.end(o)),T.lastIndex=O;continue}p||(b&&b.indexOf("/")===b.length-1?v&&D.end(o):P.push({name:o,valid:v}))}else(o=r[1])?(">"===o.charAt(0)&&(o=" "+o),e.allow_conditional_comments||"[if"!==o.substr(0,3).toLowerCase()||(o=" "+o),D.comment(o)):(o=r[2])?D.cdata(o.replace(/<!--|-->/g,"")):(o=r[3])?D.doctype(o):(o=r[4])&&D.pi(o,r[5]);O=r.index+r[0].length}for(O<n.length&&D.text(L(n.substr(O))),s=P.length-1;s>=0;s--)(o=P[s]).valid&&D.end(o.name)}};em.findEndTag=Zd;var tm,nm,rm=function(e,t){var n,r,o,i,a,s,u,c,l=t,f=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,d=e.schema;for(s=e.getTempAttrs(),u=l,c=new RegExp(["\\s?("+s.join("|")+')="[^"]+"'].join("|"),"gi"),l=u.replace(c,""),a=d.getShortEndedElements();i=f.exec(l);)r=f.lastIndex,o=i[0].length,n=a[i[1]]?r:em.findEndTag(d,l,r),l=l.substring(0,r-o)+l.substring(n),f.lastIndex=r-o;return l},om=function(e,t){return ii(rm(e,t))},im=rm,am=function(e){var t=e!==undefined?e.dom():document;return E.from(t.activeElement).map(Hn.fromDom)},sm=function(e){var t=Ur.owner(e).dom();return e.dom()===t.activeElement},um=function(e){return am(Ur.owner(e)).filter(function(t){return e.dom().contains(t.dom())})},cm=function(e,t){return(n=t,n.collapsed?E.from(zi(n.startContainer,n.startOffset)).map(Hn.fromDom):E.none()).bind(function(t){return io.isTableSection(t)?E.some(t):!1===Dr.contains(e,t)?E.some(e):E.none()});var n},lm=function(e,t){cm(Hn.fromDom(e.getBody()),t).bind(function(e){return Ws.firstPositionIn(e.dom())}).fold(function(){e.selection.normalize()},function(t){e.selection.setRng(t.toRange())})},fm=function(e){if(e.setActive)try{e.setActive()}catch(t){e.focus()}else e.focus()},dm=function(e){var t,n=e.getBody();return n&&(t=Hn.fromDom(n),sm(t)||um(t).isSome())},mm=function(e){return e.inline?dm(e):(t=e).iframeElement&&sm(Hn.fromDom(t.iframeElement));var t},pm=function(e){e.editorManager.setActive(e)},gm=function(e,t){e.removed||(t?pm(e):function(e){var t,n,r,o=e.selection,i=e.settings.content_editable,a=e.getBody(),s=o.getRng();if(e.quirks.refreshContentEditable(),n=e,r=o.getNode(),t=n.dom.getParent(r,function(e){return"true"===n.dom.getContentEditable(e)}),e.$.contains(a,t))return fm(t),lm(e,s),void pm(e);e.bookmark!==undefined&&!1===mm(e)&&Td(e).each(function(t){e.selection.setRng(t),s=t}),i||(me.opera||fm(a),e.getWin().focus()),(me.gecko||i)&&(fm(a),lm(e,s)),pm(e)}(e))},hm=mm,vm=function(e,t){return t.dom()[e]},ym=function(e,t){return parseInt(Cr(t,e),10)},bm=y.curry(vm,"clientWidth"),Cm=y.curry(vm,"clientHeight"),xm=y.curry(ym,"margin-top"),wm=y.curry(ym,"margin-left"),Nm=function(e,t,n){var r,o,i,a,s,u,c,l,f,d,m=Hn.fromDom(e.getBody()),p=e.inline?m:Ur.documentElement(m),g=(r=e.inline,i=t,a=n,s=(o=p).dom().getBoundingClientRect(),{x:i-(r?s.left+o.dom().clientLeft+wm(o):0),y:a-(r?s.top+o.dom().clientTop+xm(o):0)});return c=g.x,l=g.y,f=bm(u=p),d=Cm(u),c>=0&&l>=0&&c<=f&&l<=d},Em=function(e){var t,n=e.inline?e.getBody():e.getContentAreaContainer();return(t=n,E.from(t).map(Hn.fromDom)).map(function(e){return Dr.contains(Ur.owner(e),e)}).getOr(!1)},Sm=function(e){var t,n=[],r=function(){var t,n=e.theme;return n&&n.getNotificationManagerImpl?n.getNotificationManagerImpl():{open:t=function(){throw new Error("Theme did not provide a NotificationManager implementation.")},close:t,reposition:t,getArgs:t}},o=function(){n.length>0&&r().reposition(n)},i=function(e){M.findIndex(n,function(t){return t===e}).each(function(e){n.splice(e,1)})},a=function(t){if(!e.removed&&Em(e))return M.find(n,function(e){return n=r().getArgs(e),o=t,!(n.type!==o.type||n.text!==o.text||n.progressBar||n.timeout||o.progressBar||o.timeout);var n,o}).getOrThunk(function(){e.editorManager.setActive(e);var a,s=r().open(t,function(){i(s),o()});return a=s,n.push(a),o(),s})};return(t=e).on("SkinLoaded",function(){var e=t.settings.service_message;e&&a({text:e,type:"warning",timeout:0,icon:""})}),t.on("ResizeEditor ResizeWindow",function(){ye.requestAnimationFrame(o)}),t.on("remove",function(){M.each(n,function(e){r().close(e)})}),{open:a,close:function(){E.from(n[0]).each(function(e){r().close(e),i(e),o()})},getNotifications:function(){return n}}},km=function(e){var t=[],n=function(){var t,n=e.theme;return n&&n.getWindowManagerImpl?n.getWindowManagerImpl():{open:t=function(){throw new Error("Theme did not provide a WindowManager implementation.")},alert:t,confirm:t,close:t,getParams:t,setParams:t}},r=function(e,t){return function(){return t?t.apply(e,arguments):undefined}},o=function(n){var r;t.push(n),r=n,e.fire("OpenWindow",{win:r})},i=function(n){M.findIndex(t,function(e){return e===n}).each(function(r){var o;t.splice(r,1),o=n,e.fire("CloseWindow",{win:o}),0===t.length&&e.focus()})},a=function(){return E.from(t[t.length-1])};return e.on("remove",function(){M.each(t.slice(0),function(e){n().close(e)})}),{windows:t,open:function(t,r){e.editorManager.setActive(e),Sd(e);var a=n().open(t,r,i);return o(a),a},alert:function(e,t,a){var s=n().alert(e,r(a||this,t),i);o(s)},confirm:function(e,t,a){var s=n().confirm(e,r(a||this,t),i);o(s)},close:function(){a().each(function(e){n().close(e),i(e)})},getParams:function(){return a().map(n().getParams).getOr(null)},setParams:function(e){a().each(function(t){n().setParams(t,e)})},getWindows:function(){return t}}},Tm=ti.PluginManager,Am=function(e,t){var n=function(e,t){for(var n in Tm.urls)if(Tm.urls[n]+"/plugin"+t+".js"===e)return n;return null}(t,e.suffix);return n?"Failed to load plugin: "+n+" from url "+t:"Failed to load plugin url: "+t},_m=function(e,t){e.notificationManager.open({type:"error",text:t})},Bm=function(e,t){e._skinLoaded?_m(e,t):e.on("SkinLoaded",function(){_m(e,t)})},Rm=function(e,t){Bm(e,Am(e,t))},Dm=function(e,t){Bm(e,"Failed to upload image: "+t)},Om=Bm,Pm=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=window.console;r&&(r.error?r.error.apply(r,arguments):r.log.apply(r,arguments))},Im=ti.PluginManager,Lm=ti.ThemeManager,Mm=function(){return new(V("XMLHttpRequest"))},Fm=function(e,t){var n={},r=function(e,n,r,o){var i,a;(i=new Mm).open("POST",t.url),i.withCredentials=t.credentials,i.upload.onprogress=function(e){o(e.loaded/e.total*100)},i.onerror=function(){r("Image upload failed due to a XHR Transport error. Code: "+i.status)},i.onload=function(){var e,o,a;i.status<200||i.status>=300?r("HTTP Error: "+i.status):(e=JSON.parse(i.responseText))&&"string"==typeof e.location?n((o=t.basePath,a=e.location,o?o.replace(/\/$/,"")+"/"+a.replace(/^\//,""):a)):r("Invalid JSON: "+i.responseText)},(a=new FormData).append("file",e.blob(),e.filename()),i.send(a)},o=function(e,t){return{url:t,blobInfo:e,status:!0}},i=function(e,t){return{url:"",blobInfo:e,status:!1,error:t}},a=function(e,t){Ot.each(n[e],function(e){e(t)}),delete n[e]},s=function(r,s){return r=Ot.grep(r,function(t){return!e.isUploaded(t.blobUri())}),pe.all(Ot.map(r,function(r){return e.isPending(r.blobUri())?(f=r.blobUri(),new pe(function(e){n[f]=n[f]||[],n[f].push(e)})):(u=r,c=t.handler,l=s,e.markPending(u.blobUri()),new pe(function(t){var n;try{var r=function(){n&&n.close()};c(u,function(n){r(),e.markUploaded(u.blobUri(),n),a(u.blobUri(),o(u,n)),t(o(u,n))},function(n){r(),e.removeFailed(u.blobUri()),a(u.blobUri(),i(u,n)),t(i(u,n))},function(e){e<0||e>100||(n||(n=l()),n.progressBar.value(e))})}catch(s){t(i(u,s.message))}}));var u,c,l,f}))};return t=Ot.extend({credentials:!1,handler:r},t),{upload:function(e,n){return t.url||t.handler!==r?s(e,n):new pe(function(e){e([])})}}},zm=function(e,t){return new(V("Blob"))(e,t)},Um=function(e){return V("atob")(e)},Vm=function(e){var t,n;return e=decodeURIComponent(e).split(","),(n=/data:([^;]+)/.exec(e[0]))&&(t=n[1]),{type:t,data:e[1]}},Hm=function(e){return new pe(function(t){var n,r,o;e=Vm(e);try{n=Um(e.data)}catch(yC){return void t(new zm([]))}for(r=new function(e){return new(V("Uint8Array"))(e)}(n.length),o=0;o<r.length;o++)r[o]=n.charCodeAt(o);t(new zm([r],{type:e.type}))})},qm=function(e){return 0===e.indexOf("blob:")?(t=e,new pe(function(e,n){var r=function(){n("Cannot convert "+t+" to Blob. Resource might not exist or is inaccessible.")};try{var o=new Mm;o.open("GET",t,!0),o.responseType="blob",o.onload=function(){200===this.status?e(this.response):r()},o.onerror=r,o.send()}catch(i){r()}})):0===e.indexOf("data:")?Hm(e):null;var t},jm=function(e){return new pe(function(t){var n=new function(){return new(V("FileReader"))};n.onloadend=function(){t(n.result)},n.readAsDataURL(e)})},$m=Vm,Wm=0,Km=function(e){return(e||"blobid")+Wm++},Xm=function(e,t){var n={};return{findAll:function(r,o){var i,a,s;return o||(o=ji.constant(!0)),i=At.filter((s=r)?s.getElementsByTagName("img"):[],function(t){var n=t.src;return!!me.fileApi&&!t.hasAttribute("data-mce-bogus")&&!t.hasAttribute("data-mce-placeholder")&&!(!n||n===me.transparentSrc)&&(0===n.indexOf("blob:")?!e.isUploaded(n):0===n.indexOf("data:")&&o(t))}),a=At.map(i,function(e){var r;return n[e.src]?new pe(function(t){n[e.src].then(function(n){if("string"==typeof n)return n;t({image:e,blobInfo:n.blobInfo})})}):(r=new pe(function(n,r){var o,i,a,s,u,c;o=t,a=n,s=r,0!==(i=e).src.indexOf("blob:")?(u=$m(i.src).data,(c=o.findFirst(function(e){return e.base64()===u}))?a({image:i,blobInfo:c}):qm(i.src).then(function(e){c=o.create(Km(),e,u),o.add(c),a({image:i,blobInfo:c})},function(e){s(e)})):(c=o.getByUri(i.src))?a({image:i,blobInfo:c}):qm(i.src).then(function(e){jm(e).then(function(t){u=$m(t).data,c=o.create(Km(),e,u),o.add(c),a({image:i,blobInfo:c})})},function(e){s(e)})}).then(function(e){return delete n[e.image.src],e})["catch"](function(t){return delete n[e.src],t}),n[e.src]=r,r)}),pe.all(a)}}},Ym=0,Gm=function(e){return e+Ym+++(t=function(){return Math.round(4294967295*Math.random()).toString(36)},"s"+(new Date).getTime().toString(36)+t()+t()+t());var t},Jm=function(e){var t,n,r,o,i,a,s,u,c,l,f=(t=[],n=ji.constant,r=function(e){var t,r,o;if(!e.blob||!e.base64)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");return t=e.id||Gm("blobid"),r=e.name||t,{id:n(t),name:n(r),filename:n(r+"."+(o=e.blob.type,{"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png"}[o.toLowerCase()]||"dat")),blob:n(e.blob),base64:n(e.base64),blobUri:n(e.blobUri||q(e.blob)),uri:n(e.uri)}},{create:function(e,t,n,o){return r("object"==typeof e?e:{id:e,name:o,blob:t,base64:n})},add:function(e){o(e.id())||t.push(e)},get:o=function(e){return i(function(t){return t.id()===e})},getByUri:function(e){return i(function(t){return t.blobUri()===e})},findFirst:i=function(e){return At.filter(t,e)[0]},removeByUri:function(e){t=At.filter(t,function(t){return t.blobUri()!==e||(j(t.blobUri()),!1)})},destroy:function(){At.each(t,function(e){j(e.blobUri())}),t=[]}}),d=e.settings,m=(u={},c=function(e,t){return{status:e,resultUri:t}},{hasBlobUri:l=function(e){return e in u},getResultUri:function(e){var t=u[e];return t?t.resultUri:null},isPending:function(e){return!!l(e)&&1===u[e].status},isUploaded:function(e){return!!l(e)&&2===u[e].status},markPending:function(e){u[e]=c(1,null)},markUploaded:function(e,t){u[e]=c(2,t)},removeFailed:function(e){delete u[e]},destroy:function(){u={}}}),p=function(t){return function(n){return e.selection?t(n):[]}},g=function(e,t,n){var r=0;do{-1!==(r=e.indexOf(t,r))&&(e=e.substring(0,r)+n+e.substr(r+t.length),r+=n.length-t.length+1)}while(-1!==r);return e},h=function(e,t,n){return e=g(e,'src="'+t+'"','src="'+n+'"'),e=g(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')},v=function(t,n){At.each(e.undoManager.data,function(e){"fragmented"===e.type?e.fragments=At.map(e.fragments,function(e){return h(e,t,n)}):e.content=h(e.content,t,n)})},y=function(){return e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0})},b=function(t,n){f.removeByUri(t.src),v(t.src,n),e.$(t).attr({src:d.images_reuse_filename?n+"?"+(new Date).getTime():n,"data-mce-src":e.convertURL(n,"src")})},C=function(t){return a||(a=Fm(m,{url:d.images_upload_url,basePath:d.images_upload_base_path,credentials:d.images_upload_credentials,handler:d.images_upload_handler})),N().then(p(function(n){var r;return r=At.map(n,function(e){return e.blobInfo}),a.upload(r,y).then(p(function(r){var o=At.map(r,function(t,r){var o=n[r].image;return t.status&&!1!==e.settings.images_replace_blob_uris?b(o,t.url):t.error&&Dm(e,t.error),{element:o,status:t.status}});return t&&t(o),o}))}))},x=function(e){if(!1!==d.automatic_uploads)return C(e)},w=function(e){return!d.images_dataimg_filter||d.images_dataimg_filter(e)},N=function(){return s||(s=Xm(m,f)),s.findAll(e.getBody(),w).then(p(function(t){return t=At.filter(t,function(t){return"string"!=typeof t||(Om(e,t),!1)}),At.each(t,function(e){v(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),t}))},E=function(t){return t.replace(/src="(blob:[^"]+)"/g,function(t,n){var r=m.getResultUri(n);if(r)return'src="'+r+'"';var o=f.getByUri(n);return o||(o=At.reduce(e.editorManager.get(),function(e,t){return e||t.editorUpload&&t.editorUpload.blobCache.getByUri(n)},null)),o?'src="data:'+o.blob().type+";base64,"+o.base64()+'"':t})};return e.on("setContent",function(){!1!==e.settings.automatic_uploads?x():N()}),e.on("RawSaveContent",function(e){e.content=E(e.content)}),e.on("getContent",function(e){e.source_view||"raw"===e.format||(e.content=E(e.content))}),e.on("PostRender",function(){e.parser.addNodeFilter("img",function(e){At.each(e,function(e){var t=e.attr("src");if(!f.getByUri(t)){var n=m.getResultUri(t);n&&e.attr("src",n)}})})}),{blobCache:f,uploadImages:C,uploadImagesAuto:x,scanForImages:N,destroy:function(){f.destroy(),m.destroy(),s=a=null}}},Qm=function(e,t){return e.hasOwnProperty(t.nodeName)},Zm=function(e){var t,n,r,o,i,a,s,u,c,l,f,d=e.settings,m=e.dom,p=e.selection,g=e.schema,h=g.getBlockElements(),v=p.getStart(),y=e.getBody();if(f=d.forced_root_block,v&&vo.isElement(v)&&f&&(l=y.nodeName.toLowerCase(),g.isValidChild(l,f.toLowerCase())&&(b=h,C=y,x=v,!M.exists(zu(Hn.fromDom(x),Hn.fromDom(C)),function(e){return Qm(b,e.dom())})))){var b,C,x,w,N;for(n=(t=p.getRng()).startContainer,r=t.startOffset,o=t.endContainer,i=t.endOffset,c=hm(e),v=y.firstChild;v;)if(w=h,N=v,vo.isText(N)||vo.isElement(N)&&!Qm(w,N)&&!xs.isBookmarkNode(N)){if(vo.isText(v)&&0===v.nodeValue.length){s=v,v=v.nextSibling,m.remove(s);continue}a||(a=m.create(f,e.settings.forced_root_block_attrs),v.parentNode.insertBefore(a,v),u=!0),s=v,v=v.nextSibling,a.appendChild(s)}else a=null,v=v.nextSibling;u&&c&&(t.setStart(n,r),t.setEnd(o,i),p.setRng(t),e.nodeChanged())}},ep=function(e){e.settings.forced_root_block&&e.on("NodeChange",y.curry(Zm,e))},tp=function(e){var t,n=[];"onselectionchange"in e.getDoc()||e.on("NodeChange Click MouseUp KeyUp Focus",function(n){var r,o;o={startContainer:(r=e.selection.getRng()).startContainer,startOffset:r.startOffset,endContainer:r.endContainer,endOffset:r.endOffset},"nodechange"!==n.type&&qf(o,t)||e.fire("SelectionChange"),t=o}),e.on("contextmenu",function(){e.fire("SelectionChange")}),e.on("SelectionChange",function(){var t=e.selection.getStart(!0);!t||!me.range&&e.selection.isCollapsed()||!function(t){var r,o;if((o=e.$(t).parentsUntil(e.getBody()).add(t)).length===n.length){for(r=o.length;r>=0&&o[r]===n[r];r--);if(-1===r)return n=o,!0}return n=o,!1}(t)&&e.dom.isChildOf(t,e.getBody())&&e.nodeChanged({selectionChange:!0})}),e.on("MouseUp",function(t){t.isDefaultPrevented()||("IMG"===e.selection.getNode().nodeName?ye.setEditorTimeout(e,function(){e.nodeChanged()}):e.nodeChanged())}),this.nodeChanged=function(t){var n,r,o,i=e.selection;e.initialized&&i&&!e.settings.disable_nodechange&&!e.readonly&&(o=e.getBody(),(n=i.getStart(!0)||o).ownerDocument===e.getDoc()&&e.dom.isChildOf(n,o)||(n=o),r=[],e.dom.getParent(n,function(e){if(e===o)return!0;r.push(e)}),(t=t||{}).element=n,t.parents=r,e.fire("NodeChange",t))}},np=function(e){var t,n,r,o;return o=e.getBoundingClientRect(),n=(t=e.ownerDocument).documentElement,r=t.defaultView,{top:o.top+r.pageYOffset-n.clientTop,left:o.left+r.pageXOffset-n.clientLeft}},rp=function(e,t){return n=(s=e).inline?np(s.getBody()):{left:0,top:0},a=(i=e).getBody(),r=i.inline?{left:a.scrollLeft,top:a.scrollTop}:{left:0,top:0},{pageX:(o=function(e,t){if(t.target.ownerDocument!==e.getDoc()){var n=np(e.getContentAreaContainer()),r=(i=(o=e).getBody(),a=o.getDoc().documentElement,s={left:i.scrollLeft,top:i.scrollTop},u={left:i.scrollLeft||a.scrollLeft,top:i.scrollTop||a.scrollTop},o.inline?s:u);return{left:t.pageX-n.left+r.left,top:t.pageY-n.top+r.top}}var o,i,a,s,u;return{left:t.pageX,top:t.pageY}}(e,t)).left-n.left+r.left,pageY:o.top-n.top+r.top};var n,r,o,i,a,s},op=vo.isContentEditableFalse,ip=vo.isContentEditableTrue,ap=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},sp=function(e,t){return function(n){if(0===n.button){var r=At.find(t.dom.getParents(n.target),ji.or(op,ip));if(s=t.getBody(),op(u=r)&&u!==s){var o=t.dom.getPos(r),i=t.getBody(),a=t.getDoc().documentElement;e.element=r,e.screenX=n.screenX,e.screenY=n.screenY,e.maxX=(t.inline?i.scrollWidth:a.offsetWidth)-2,e.maxY=(t.inline?i.scrollHeight:a.offsetHeight)-2,e.relX=n.pageX-o.x,e.relY=n.pageY-o.y,e.width=r.offsetWidth,e.height=r.offsetHeight,e.ghost=function(e,t,n,r){var o=t.cloneNode(!0);e.dom.setStyles(o,{width:n,height:r}),e.dom.setAttrib(o,"data-mce-selected",null);var i=e.dom.create("div",{"class":"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return e.dom.setStyles(i,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:r}),e.dom.setStyles(o,{margin:0,boxSizing:"border-box"}),i.appendChild(o),i}(t,r,e.width,e.height)}}var s,u}},up=function(e,t){return function(n){if(e.dragging&&(s=t,l=t.selection,f=l.getSel().getRangeAt(0).startContainer,u=3===f.nodeType?f.parentNode:f,c=e.element,u!==c&&!s.dom.isChildOf(u,c)&&!op(u))){var r=(i=e.element,(a=i.cloneNode(!0)).removeAttribute("data-mce-selected"),a),o=t.fire("drop",{targetClone:r,clientX:n.clientX,clientY:n.clientY});o.isDefaultPrevented()||(r=o.targetClone,t.undoManager.transact(function(){ap(e.element),t.insertContent(t.dom.getOuterHTML(r)),t._selectionOverrides.hideFakeCaret()}))}var i,a,s,u,c,l,f;cp(e)}},cp=function(e){e.dragging=!1,e.element=null,ap(e.ghost)},lp=function(e){var t,n,r,o,i,a,s,u,c,l,f,d={};t=Xo.DOM,a=document,n=sp(d,e),s=d,u=e,c=ye.throttle(function(e,t){u._selectionOverrides.hideFakeCaret(),u.selection.placeCaretAt(e,t)},0),r=function(e){var t,n,r,o,i,a,l,f,d,m,p,g,h=Math.max(Math.abs(e.screenX-s.screenX),Math.abs(e.screenY-s.screenY));if(s.element&&!s.dragging&&h>10){if(u.fire("dragstart",{target:s.element}).isDefaultPrevented())return;s.dragging=!0,u.focus()}if(s.dragging){var v=(p=s,{pageX:(g=rp(u,e)).pageX-p.relX,pageY:g.pageY+5});d=s.ghost,m=u.getBody(),d.parentNode!==m&&m.appendChild(d),t=s.ghost,n=v,r=s.width,o=s.height,i=s.maxX,a=s.maxY,l=0,f=0,t.style.left=n.pageX+"px",t.style.top=n.pageY+"px",n.pageX+r>i&&(l=n.pageX+r-i),n.pageY+o>a&&(f=n.pageY+o-a),t.style.width=r-l+"px",t.style.height=o-f+"px",c(e.clientX,e.clientY)}},o=up(d,e),l=d,f=e,i=function(){cp(l),l.dragging&&f.fire("dragend")},e.on("mousedown",n),e.on("mousemove",r),e.on("mouseup",o),t.bind(a,"mousemove",r),t.bind(a,"mouseup",i),e.on("remove",function(){t.unbind(a,"mousemove",r),t.unbind(a,"mouseup",i)})},fp=function(e){var t;lp(e),(t=e).on("drop",function(e){var n="undefined"!=typeof e.clientX?t.getDoc().elementFromPoint(e.clientX,e.clientY):null;(op(n)||op(t.dom.getContentEditableParent(n)))&&e.preventDefault()})},dp=vo.isContentEditableFalse,mp=function(e,t){var n,r,o=null,i=function(){!function(){var t,n,r,o,i;for(t=Qt("*[contentEditable=false]",e),o=0;o<t.length;o++)r=(n=t[o]).previousSibling,mi.endsWithCaretContainer(r)&&(1===(i=r.data).length?r.parentNode.removeChild(r):r.deleteData(i.length-1,1)),r=n.nextSibling,mi.startsWithCaretContainer(r)&&(1===(i=r.data).length?r.parentNode.removeChild(r):r.deleteData(0,1))}(),r&&(Oc.remove(r),r=null),o&&(o.remove(),o=null),clearInterval(n)},a=function(){n=ye.setInterval(function(){e.ownerDocument.activeElement===e?Qt("div.mce-visual-caret",e).toggleClass("mce-visual-caret-hidden"):Qt("div.mce-visual-caret",e).addClass("mce-visual-caret-hidden")},500)};return{show:function(n,s){var u,c,l,f,d,m,p,g,h,v,y;return i(),(l=s)&&/^(TD|TH)$/i.test(l.nodeName)?null:t(s)?(r=mi.insertBlock("p",s,n),d=n,y=Oi((f=s).getBoundingClientRect(),d),"BODY"===e.tagName?(m=e.ownerDocument.documentElement,p=e.scrollLeft||m.scrollLeft,g=e.scrollTop||m.scrollTop):(v=e.getBoundingClientRect(),p=e.scrollLeft-v.left,g=e.scrollTop-v.top),y.left+=p,y.right+=p,y.top+=g,y.bottom+=g,y.width=1,(h=f.offsetWidth-f.clientWidth)>0&&(d&&(h*=-1),y.left+=h,y.right+=h),u=y,Qt(r).css("top",u.top),o=Qt('<div class="mce-visual-caret" data-mce-bogus="all"></div>').css(u).appendTo(e),n&&o.addClass("mce-visual-caret-before"),a(),(c=s.ownerDocument.createRange()).setStart(r,0),c.setEnd(r,0),c):(r=mi.insertInline(s,n),c=s.ownerDocument.createRange(),dp(r.nextSibling)?(c.setStart(r,0),c.setEnd(r,0)):(c.setStart(r,1),c.setEnd(r,1)),c)},hide:i,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},destroy:function(){ye.clearInterval(n)}}},pp=function(e){var t=function(t){return At.map(t,function(t){return(t=Di(t)).node=e,t})};if(At.isArray(e))return At.reduce(e,function(e,t){return e.concat(pp(t))},[]);if(vo.isElement(e))return t(e.getClientRects());if(vo.isText(e)){var n=e.ownerDocument.createRange();return n.setStart(e,0),n.setEnd(e,e.data.length),t(n.getClientRects())}},gp={getClientRects:pp},hp=vo.isContentEditableFalse,vp=_a.findNode,yp=ji.curry,bp=function(e,t){return Math.abs(e.left-t)},Cp=function(e,t){return Math.abs(e.right-t)},xp=function(e,t){var n=function(e,t){return e>=t.left&&e<=t.right};return At.reduce(e,function(e,r){var o,i;return o=Math.min(bp(e,t),Cp(e,t)),i=Math.min(bp(r,t),Cp(r,t)),n(t,r)?r:n(t,e)?e:i===o&&hp(r.node)?r:i<o?r:e})},wp=function(e,t,n,r){for(;r=vp(r,e,ki,t);)if(n(r))return},Np=function(e,t){var n=[],r=function(e,r){var o;return o=At.filter(gp.getClientRects(r),function(n){return!e(n,t)}),n=n.concat(o),0===o.length};return n.push(t),wp(-1,e,yp(r,Ii),t.node),wp(1,e,yp(r,Li),t.node),n},Ep=xp,Sp=function(e,t,n){var r,o,i,a,s;return r=gp.getClientRects((i=e,At.filter(At.toArray(i.getElementsByTagName("*")),hp))),r=At.filter(r,function(e){return n>=e.top&&n<=e.bottom}),(o=xp(r,t))&&(o=xp(Np(e,o),t))&&hp(o.node)?(s=t,{node:(a=o).node,before:bp(a,s)<Cp(a,s)}):null},kp=function(e,t,n){return!n.collapsed&&M.foldl(n.getClientRects(),function(n,r){return n||Mi(r,e,t)},!1)},Tp=function(e,t){var n=null;return{cancel:function(){null!==n&&(clearTimeout(n),n=null)},throttle:function(){var r=arguments;null===n&&(n=setTimeout(function(){e.apply(null,r),n=null,r=null},t))}}},Ap=vo.isContentEditableTrue,_p=vo.isContentEditableFalse,Bp=function(e,t,n,r){return t._selectionOverrides.showCaret(e,n,r)},Rp=function(e,t){var n,r;return t=_a.normalizeRange(1,e.getBody(),t),n=ia.fromRangeStart(t),_p(n.getNode())?Bp(1,e,n.getNode(),!n.isAtEnd()):_p(n.getNode(!0))?Bp(1,e,n.getNode(!0),!1):(r=e.dom.getParent(n.getNode(),ji.or(_p,Ap)),_p(r)?Bp(1,e,r,!1):null)},Dp=Bp,Op=function(e,t){var n,r;return e.fire("BeforeObjectSelected",{target:t}).isDefaultPrevented()?null:((r=(n=t).ownerDocument.createRange()).selectNode(n),r)},Pp=Rp,Ip=function(e,t){return t&&t.collapsed&&Rp(e,t)||t},Lp=function(e){var t=Tp(function(){if(!e.removed){var t=Ip(e,e.selection.getRng());e.selection.setRng(t)}},0);e.on("focus",function(){t.throttle()}),e.on("blur",function(){t.cancel()})},Mp={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(e){return e.shiftKey||e.ctrlKey||e.altKey||this.metaKeyPressed(e)},metaKeyPressed:function(e){return me.mac?e.metaKey:e.ctrlKey&&!e.altKey}},Fp=vo.isContentEditableTrue,zp=vo.isContentEditableFalse,Up=_a.isAfterContentEditableFalse,Vp=_a.isBeforeContentEditableFalse,Hp=function(e){var t,n,r,o=e.getBody(),i=mp(e.getBody(),function(t){return e.dom.isBlock(t)}),a="sel-"+e.dom.uniqueId(),s=function(t){t&&e.selection.setRng(t)},u=function(){return e.selection.getRng()},c=function(t,n){e.selection.scrollIntoView(t,n)},l=function(t,n,r){return e.fire("ShowCaret",{target:n,direction:t,before:r}).isDefaultPrevented()?null:(c(n,-1===t),i.show(r,n))},f=function(e,t){return t=_a.normalizeRange(e,o,t),-1===e?ia.fromRangeStart(t):ia.fromRangeEnd(t)},d=function(e){return mi.isCaretContainer(e)||mi.startsWithCaretContainer(e)||mi.endsWithCaretContainer(e)},m=function(e){return d(e.startContainer)||d(e.endContainer)},p=function(n,r){var o,i,s,u,c,d,p,g,v,y,b=e.$,C=e.dom;if(!n)return null;if(n.collapsed){if(!m(n))if(!1===r){if(g=f(-1,n),zp(g.getNode(!0)))return l(-1,g.getNode(!0),!1);if(zp(g.getNode()))return l(-1,g.getNode(),!g.isAtEnd())}else{if(g=f(1,n),zp(g.getNode()))return l(1,g.getNode(),!g.isAtEnd());if(zp(g.getNode(!0)))return l(1,g.getNode(!0),!1)}return null}return u=n.startContainer,c=n.startOffset,d=n.endOffset,3===u.nodeType&&0===c&&zp(u.parentNode)&&(u=u.parentNode,c=C.nodeIndex(u),u=u.parentNode),1!==u.nodeType?null:(d===c+1&&(o=u.childNodes[c]),zp(o)?(v=y=o.cloneNode(!0),(p=e.fire("ObjectSelected",{target:o,targetClone:v})).isDefaultPrevented()?null:(i=Nu(Hn.fromDom(e.getBody()),"#"+a).fold(function(){return b([])},function(e){return b([e.dom()])}),v=p.targetClone,0===i.length&&(i=b('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>').attr("id",a)).appendTo(e.getBody()),n=e.dom.createRng(),v===y&&me.ie?(i.empty().append('<p style="font-size: 0" data-mce-bogus="all">\xa0</p>').append(v),n.setStartAfter(i[0].firstChild.firstChild),n.setEndAfter(v)):(i.empty().append("\xa0").append(v).append("\xa0"),n.setStart(i[0].firstChild,1),n.setEnd(i[0].lastChild,0)),i.css({top:C.getPos(o,e.getBody()).y}),i[0].focus(),(s=e.selection.getSel()).removeAllRanges(),s.addRange(n),M.each(Os(Hn.fromDom(e.getBody()),"*[data-mce-selected]"),function(e){dr.remove(e,"data-mce-selected")}),o.setAttribute("data-mce-selected","1"),t=o,h(),n)):null)},g=function(){t&&(t.removeAttribute("data-mce-selected"),Nu(Hn.fromDom(e.getBody()),"#"+a).each(Bs.remove),t=null)},h=function(){i.hide()};return me.ceFalse&&(function(){var n=function(t){for(var n=e.getBody();t&&t!==n;){if(Fp(t)||zp(t))return t;t=t.parentNode}return null};e.on("mouseup",function(t){var n=u();n.collapsed&&Nm(e,t.clientX,t.clientY)&&s(Pp(e,n))}),e.on("click",function(t){var r;(r=n(t.target))&&(zp(r)&&(t.preventDefault(),e.focus()),Fp(r)&&e.dom.isChildOf(r,e.selection.getNode())&&g())}),e.on("blur NewBlock",function(){g()});var r,i,c=function(t,n){var r,o,i=e.dom.getParent(t,e.dom.isBlock),a=e.dom.getParent(n,e.dom.isBlock);return i&&(r=i,o=a,!(e.dom.getParent(r,e.dom.isBlock)===e.dom.getParent(o,e.dom.isBlock)))&&function(e){var t=Ha(e);if(!e.firstChild)return!1;var n=ia.before(e.firstChild),r=t.next(n);return r&&!Vp(r)&&!Up(r)}(i)};i=!1,(r=e).on("touchstart",function(){i=!1}),r.on("touchmove",function(){i=!0}),r.on("touchend",function(e){var t=n(e.target);zp(t)&&(i||(e.preventDefault(),p(Op(r,t))))}),e.on("mousedown",function(t){var r;if(!1!==Nm(e,t.clientX,t.clientY))if(r=n(t.target))zp(r)?(t.preventDefault(),p(Op(e,r))):(g(),Fp(r)&&t.shiftKey||kp(t.clientX,t.clientY,e.selection.getRng())||e.selection.placeCaretAt(t.clientX,t.clientY));else{g(),h();var i=Sp(o,t.clientX,t.clientY);i&&(c(t.target,i.node)||(t.preventDefault(),e.getBody().focus(),s(l(1,i.node,i.before))))}}),e.on("keypress",function(t){Mp.modifierPressed(t)||(t.keyCode,zp(e.selection.getNode())&&t.preventDefault())}),e.on("getSelectionRange",function(e){var n=e.range;if(t){if(!t.parentNode)return void(t=null);(n=n.cloneRange()).selectNode(t),e.range=n}}),e.on("setSelectionRange",function(e){var t;(t=p(e.range,e.forward))&&(e.range=t)}),e.on("AfterSetSelectionRange",function(t){var n,r=t.range;m(r)||h(),n=r.startContainer.parentNode,e.dom.hasClass(n,"mce-offscreen-selection")||g()}),e.on("copy",function(t){var n,r=t.clipboardData;if(!t.isDefaultPrevented()&&t.clipboardData&&!me.ie){var o=(n=e.dom.get(a))?n.getElementsByTagName("*")[0]:n;o&&(t.preventDefault(),r.clearData(),r.setData("text/html",o.outerHTML),r.setData("text/plain",o.outerText))}}),fp(e),Lp(e)}(),n=e.contentStyles,r=".mce-content-body",n.push(i.getCss()),n.push(r+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+r+" *[contentEditable=false] {cursor: default;}"+r+" *[contentEditable=true] {cursor: text;}")),{showCaret:l,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(mi.showCaretContainerBlock(e),s(u()),c(e[0]))},hideFakeCaret:h,destroy:function(){i.destroy(),t=null}}},qp=0,jp=2,$p=1,Wp=function(e,t){var n=e.length+t.length+2,r=new Array(n),o=new Array(n),i=function(n,r,o,a,u){var c=s(n,r,o,a);if(null===c||c.start===r&&c.diag===r-a||c.end===n&&c.diag===n-o)for(var l=n,f=o;l<r||f<a;)l<r&&f<a&&e[l]===t[f]?(u.push([0,e[l]]),++l,++f):r-n>a-o?(u.push([2,e[l]]),++l):(u.push([1,t[f]]),++f);else{i(n,c.start,o,c.start-c.diag,u);for(var d=c.start;d<c.end;++d)u.push([0,e[d]]);i(c.end,r,c.end-c.diag,a,u)}},a=function(n,r,o,i){for(var a=n;a-r<i&&a<o&&e[a]===t[a-r];)++a;return{start:n,end:a,diag:r}},s=function(n,i,s,u){var c=i-n,l=u-s;if(0===c||0===l)return null;var f,d,m,p,g,h=c-l,v=l+c,y=(v%2==0?v:v+1)/2;for(r[1+y]=n,o[1+y]=i+1,f=0;f<=y;++f){for(d=-f;d<=f;d+=2){for(m=d+y,d===-f||d!==f&&r[m-1]<r[m+1]?r[m]=r[m+1]:r[m]=r[m-1]+1,g=(p=r[m])-n+s-d;p<i&&g<u&&e[p]===t[g];)r[m]=++p,++g;if(h%2!=0&&h-f<=d&&d<=h+f&&o[m-h]<=r[m])return a(o[m-h],d+n-s,i,u)}for(d=h-f;d<=h+f;d+=2){for(m=d+y-h,d===h-f||d!==h+f&&o[m+1]<=o[m-1]?o[m]=o[m+1]-1:o[m]=o[m-1],g=(p=o[m]-1)-n+s-d;p>=n&&g>=s&&e[p]===t[g];)o[m]=p--,g--;if(h%2==0&&-f<=d&&d<=f&&o[m]<=r[m+h])return a(o[m],d+n-s,i,u)}}},u=[];return i(0,e.length,0,t.length,u),u},Kp=function(e){return 1===e.nodeType?e.outerHTML:3===e.nodeType?Ao.encodeRaw(e.data,!1):8===e.nodeType?"\x3c!--"+e.data+"--\x3e":""},Xp=function(e,t,n){var r=function(e){var t,n,r;for(r=document.createElement("div"),t=document.createDocumentFragment(),e&&(r.innerHTML=e);n=r.firstChild;)t.appendChild(n);return t}(t);if(e.hasChildNodes()&&n<e.childNodes.length){var o=e.childNodes[n];o.parentNode.insertBefore(r,o)}else e.appendChild(r)},Yp=function(e){return At.filter(At.map(e.childNodes,Kp),function(e){return e.length>0})},Gp=function(e,t){var n,r,o,i=At.map(t.childNodes,Kp);return n=Wp(i,e),r=t,o=0,At.each(n,function(e){e[0]===qp?o++:e[0]===$p?(Xp(r,e[1],o),o++):e[0]===jp&&function(e,t){if(e.hasChildNodes()&&t<e.childNodes.length){var n=e.childNodes[t];n.parentNode.removeChild(n)}}(r,o)}),t},Jp=function(e){return{type:"fragmented",fragments:e,content:"",bookmark:null,beforeBookmark:null}},Qp=function(e){return{type:"complete",fragments:null,content:e,bookmark:null,beforeBookmark:null}},Zp=function(e){return"fragmented"===e.type?e.fragments.join(""):e.content},eg=function(e){var t,n,r;return t=Yp(e.getBody()),-1!==(n=(r=M.bind(t,function(t){var n=im(e.serializer,t);return n.length>0?[n]:[]})).join("")).indexOf("</iframe>")?Jp(r):Qp(n)},tg=function(e,t,n){"fragmented"===t.type?Gp(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw"}),e.selection.moveToBookmark(n?t.beforeBookmark:t.bookmark)},ng=function(e,t){return!!e&&!!t&&Zp(e)===Zp(t)},rg=function(e){var t,n,r=this,o=0,i=[],a=0,s=function(){return 0===a},u=function(e){s()&&(r.typing=e)},c=function(t){e.setDirty(t)},l=function(e){u(!1),r.add({},e)},f=function(){r.typing&&(u(!1),r.add())};return e.on("init",function(){r.add()}),e.on("BeforeExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&(f(),r.beforeChange())}),e.on("ExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&l(e)}),e.on("ObjectResizeStart Cut",function(){r.beforeChange()}),e.on("SaveContent ObjectResized blur",l),e.on("DragEnd",l),e.on("KeyUp",function(t){var o=t.keyCode;t.isDefaultPrevented()||((o>=33&&o<=36||o>=37&&o<=40||45===o||t.ctrlKey)&&(l(),e.nodeChanged()),46!==o&&8!==o||e.nodeChanged(),n&&r.typing&&!1===ng(eg(e),i[0])&&(!1===e.isDirty()&&(c(!0),e.fire("change",{level:i[0],lastLevel:null})),e.fire("TypingUndo"),n=!1,e.nodeChanged()))}),e.on("KeyDown",function(e){var t=e.keyCode;if(!e.isDefaultPrevented())if(t>=33&&t<=36||t>=37&&t<=40||45===t)r.typing&&l(e);else{var o=e.ctrlKey&&!e.altKey||e.metaKey;!(t<16||t>20)||224===t||91===t||r.typing||o||(r.beforeChange(),u(!0),r.add({},e),n=!0)}}),e.on("MouseDown",function(e){r.typing&&l(e)}),e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo"),e.on("AddUndo Undo Redo ClearUndos",function(t){t.isDefaultPrevented()||e.nodeChanged()}),r={data:i,typing:!1,beforeChange:function(){s()&&(t=gs.getUndoBookmark(e.selection))},add:function(n,r){var a,u,l,f=e.settings;if(l=eg(e),n=n||{},n=Ot.extend(n,l),!1===s()||e.removed)return null;if(u=i[o],e.fire("BeforeAddUndo",{level:n,lastLevel:u,originalEvent:r}).isDefaultPrevented())return null;if(u&&ng(u,n))return null;if(i[o]&&(i[o].beforeBookmark=t),f.custom_undo_redo_levels&&i.length>f.custom_undo_redo_levels){for(a=0;a<i.length-1;a++)i[a]=i[a+1];i.length--,o=i.length}n.bookmark=gs.getUndoBookmark(e.selection),o<i.length-1&&(i.length=o+1),i.push(n),o=i.length-1;var d={level:n,lastLevel:u,originalEvent:r};return e.fire("AddUndo",d),o>0&&(c(!0),e.fire("change",d)),n},undo:function(){var t;return r.typing&&(r.add(),r.typing=!1,u(!1)),o>0&&(t=i[--o],tg(e,t,!0),c(!0),e.fire("undo",{level:t})),t},redo:function(){var t;return o<i.length-1&&(t=i[++o],tg(e,t,!1),c(!0),e.fire("redo",{level:t})),t},clear:function(){i=[],o=0,r.typing=!1,r.data=i,e.fire("ClearUndos")},hasUndo:function(){return o>0||r.typing&&i[0]&&!ng(eg(e),i[0])},hasRedo:function(){return o<i.length-1&&!r.typing},transact:function(e){return f(),r.beforeChange(),r.ignore(e),r.add()},ignore:function(e){try{a++,e()}finally{a--}},extra:function(t,n){var a,s;r.transact(t)&&(s=i[o].bookmark,a=i[o-1],tg(e,a,!0),r.transact(n)&&(i[o-1].beforeBookmark=s))}}},og={},ig=At.filter,ag=At.each;nm=function(e){var t,n,r=e.selection.getRng();t=vo.matchNodeNames("pre"),r.collapsed||(n=e.selection.getSelectedBlocks(),ag(ig(ig(n,t),function(e){return t(e.previousSibling)&&-1!==At.indexOf(n,e.previousSibling)}),function(e){var t,n;t=e.previousSibling,Qt(n=e).remove(),Qt(t).append("<br><br>").append(n.childNodes)}))},og[tm="pre"]||(og[tm]=[]),og[tm].push(nm);var sg=function(e,t){ag(og[e],function(e){e(t)})},ug=Ot.each,cg={walk:function(e,t,n){var r,o,i,a,s,u,c,l=t.startContainer,f=t.startOffset,d=t.endContainer,m=t.endOffset;if((c=e.select("td[data-mce-selected],th[data-mce-selected]")).length>0)ug(c,function(e){n([e])});else{var p,g,h,v=function(e){var t;return 3===(t=e[0]).nodeType&&t===l&&f>=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===m&&e.length>0&&t===d&&3===t.nodeType&&e.splice(e.length-1,1),e},y=function(e,t,n){for(var r=[];e&&e!==n;e=e[t])r.push(e);return r},b=function(e,t){do{if(e.parentNode===t)return e;e=e.parentNode}while(e)},C=function(e,t,r){var o=r?"nextSibling":"previousSibling";for(s=(a=e).parentNode;a&&a!==t;a=s)s=a.parentNode,(u=y(a===e?a:a[o],o)).length&&(r||u.reverse(),n(v(u)))};if(1===l.nodeType&&l.hasChildNodes()&&(l=l.childNodes[f]),1===d.nodeType&&d.hasChildNodes()&&(g=m,h=(p=d).childNodes,--g>h.length-1?g=h.length-1:g<0&&(g=0),d=h[g]||p),l===d)return n(v([l]));for(r=e.findCommonAncestor(l,d),a=l;a;a=a.parentNode){if(a===d)return C(l,r,!0);if(a===r)break}for(a=d;a;a=a.parentNode){if(a===l)return C(d,r);if(a===r)break}o=b(l,r)||l,i=b(d,r)||d,C(l,o,!0),(u=y(o===l?o:o.nextSibling,"nextSibling",i===d?i.nextSibling:i)).length&&n(v(u)),C(d,i)}}},lg=/^(src|href|style)$/,fg=Ot.each,dg=Uc.isEq,mg=function(e){return/^(TH|TD)$/.test(e.nodeName)},pg=function(e,t,n){var r,o,i;return r=t[n?"startContainer":"endContainer"],o=t[n?"startOffset":"endOffset"],vo.isElement(r)&&(i=r.childNodes.length-1,!n&&o&&o--,r=r.childNodes[o>i?i:o]),vo.isText(r)&&n&&o>=r.nodeValue.length&&(r=new to(r,e.getBody()).next()||r),vo.isText(r)&&!n&&0===o&&(r=new to(r,e.getBody()).prev()||r),r},gg=function(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o},hg=function(e,t,n,r){return!(t=Uc.getNonWhiteSpaceSibling(t,n,r))||"BR"===t.nodeName||e.isBlock(t)},vg=function(e,t,n,r,o){var i,a,s,u,c,l,f,d,m,p,g,h,v,y,b,C=e.dom;if(l=C,!(dg(f=r,(d=t).inline)||dg(f,d.block)||(d.selector?vo.isElement(f)&&l.is(f,d.selector):void 0)||(u=r,c=t,c.links&&"A"===u.tagName)))return!1;if("all"!==t.remove)for(fg(t.styles,function(e,i){e=Uc.normalizeStyleValue(C,Uc.replaceVars(e,n),i),"number"==typeof i&&(i=e,o=0),(t.remove_similar||!o||dg(Uc.getStyle(C,o,i),e))&&C.setStyle(r,i,""),s=1}),s&&""===C.getAttrib(r,"style")&&(r.removeAttribute("style"),r.removeAttribute("data-mce-style")),fg(t.attributes,function(e,t){var i;if(e=Uc.replaceVars(e,n),"number"==typeof t&&(t=e,o=0),!o||dg(C.getAttrib(o,t),e)){if("class"===t&&(e=C.getAttrib(r,t))&&(i="",fg(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(i+=(i?" ":"")+e)}),i))return void C.setAttrib(r,t,i);"class"===t&&r.removeAttribute("className"),lg.test(t)&&r.removeAttribute("data-mce-"+t),r.removeAttribute(t)}}),fg(t.classes,function(e){e=Uc.replaceVars(e,n),o&&!C.hasClass(o,e)||C.removeClass(r,e)}),a=C.getAttribs(r),i=0;i<a.length;i++){var x=a[i].nodeName;if(0!==x.indexOf("_")&&0!==x.indexOf("data-"))return!1}return"none"!==t.remove?(m=e,g=t,v=(p=r).parentNode,y=m.dom,b=m.settings.forced_root_block,g.block&&(b?v===y.getRoot()&&(g.list_block&&dg(p,g.list_block)||fg(Ot.grep(p.childNodes),function(e){Uc.isValid(m,b,e.nodeName.toLowerCase())?h?h.appendChild(e):(h=gg(y,e,b),y.setAttribs(h,m.settings.forced_root_block_attrs)):h=0})):y.isBlock(p)&&!y.isBlock(v)&&(hg(y,p,!1)||hg(y,p.firstChild,!0,1)||p.insertBefore(y.create("br"),p.firstChild),hg(y,p,!0)||hg(y,p.lastChild,!1,1)||p.appendChild(y.create("br")))),g.selector&&g.inline&&!dg(g.inline,p)||y.remove(p,1),!0):void 0},yg=vg,bg=function(e,t,n,r,o){var i,a,s=e.formatter.get(t),u=s[0],c=!0,l=e.dom,f=e.selection,d=function(r){var i,a,c,l,f,d,m=(i=e,a=r,c=t,l=n,f=o,fg(Uc.getParents(i.dom,a.parentNode).reverse(),function(e){var t;d||"_start"===e.id||"_end"===e.id||(t=il.matchNode(i,e,c,l,f))&&!1!==t.split&&(d=e)}),d);return function(e,t,n,r,o,i,a,s){var u,c,l,f,d,m,p=e.dom;if(n){for(m=n.parentNode,u=r.parentNode;u&&u!==m;u=u.parentNode){for(c=p.clone(u,!1),d=0;d<t.length;d++)if(vg(e,t[d],s,c,c)){c=0;break}c&&(l&&c.appendChild(l),f||(f=c),l=c)}!i||a.mixed&&p.isBlock(n)||(r=p.split(n,r)),l&&(o.parentNode.insertBefore(l,o),f.appendChild(o))}return r}(e,s,m,r,r,!0,u,n)},m=function(t){var r,o,i,a,f;if(vo.isElement(t)&&l.getContentEditable(t)&&(a=c,c="true"===l.getContentEditable(t),f=!0),r=Ot.grep(t.childNodes),c&&!f)for(o=0,i=s.length;o<i&&!vg(e,s[o],n,t,t);o++);if(u.deep&&r.length){for(o=0,i=r.length;o<i;o++)m(r[o]);f&&(c=a)}},p=function(e){var t=l.get(e?"_start":"_end"),n=t[e?"firstChild":"lastChild"];return xs.isBookmarkNode(n)&&(n=n[e?"firstChild":"lastChild"]),vo.isText(n)&&0===n.data.length&&(n=e?t.previousSibling||t.nextSibling:t.nextSibling||t.previousSibling),l.remove(t,!0),n},g=function(t){var n,r,o=t.commonAncestorContainer;if(t=Qc(e,t,s,!0),u.split){if((n=pg(e,t,!0))!==(r=pg(e,t))){if(/^(TR|TH|TD)$/.test(n.nodeName)&&n.firstChild&&(n="TR"===n.nodeName?n.firstChild.firstChild||n:n.firstChild||n),o&&/^T(HEAD|BODY|FOOT|R)$/.test(o.nodeName)&&mg(r)&&r.firstChild&&(r=r.firstChild||r),l.isChildOf(n,r)&&n!==r&&!l.isBlock(r)&&!mg(n)&&!mg(r))return n=gg(l,n,"span",{id:"_start","data-mce-type":"bookmark"}),d(n),void(n=p(!0));n=gg(l,n,"span",{id:"_start","data-mce-type":"bookmark"}),r=gg(l,r,"span",{id:"_end","data-mce-type":"bookmark"}),d(n),d(r),n=p(!0),r=p()}else n=r=d(n);t.startContainer=n.parentNode?n.parentNode:n,t.startOffset=l.nodeIndex(n),t.endContainer=r.parentNode?r.parentNode:r,t.endOffset=l.nodeIndex(r)+1}cg.walk(l,t,function(t){fg(t,function(t){m(t),vo.isElement(t)&&"underline"===e.dom.getStyle(t,"text-decoration")&&t.parentNode&&"underline"===Uc.getTextDecoration(l,t.parentNode)&&vg(e,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:"underline"}},null,t)})})};if(r)r.nodeType?((a=l.createRng()).setStartBefore(r),a.setEndAfter(r),g(a)):g(r);else if("false"!==l.getContentEditable(f.getNode()))f.isCollapsed()&&u.inline&&!l.select("td[data-mce-selected],th[data-mce-selected]").length?wl(e,t,n,o):(i=f.getBookmark(),g(f.getRng()),f.moveToBookmark(i),u.inline&&il.match(e,t,n,f.getStart())&&Uc.moveStart(l,f,f.getRng()),e.nodeChanged());else{r=f.getNode();for(var h=0,v=s.length;h<v&&(!s[h].ceFalseOverride||!vg(e,s[h],n,r,r));h++);}},Cg=Ot.each,xg=function(e){return e&&1===e.nodeType&&!xs.isBookmarkNode(e)&&!Nl(e)&&!vo.isBogus(e)},wg=function(e,t){var n;for(n=e;n;n=n[t]){if(3===n.nodeType&&0!==n.nodeValue.length)return e;if(1===n.nodeType&&!xs.isBookmarkNode(n))return n}return e},Ng=function(e,t,n){var r,o,i=new Ns(e);if(t&&n&&(t=wg(t,"previousSibling"),n=wg(n,"nextSibling"),i.compare(t,n))){for(r=t.nextSibling;r&&r!==n;)o=r,r=r.nextSibling,t.appendChild(o);return e.remove(n),Ot.each(Ot.grep(n.childNodes),function(e){t.appendChild(e)}),t}return n},Eg=function(e,t,n){Cg(e.childNodes,function(e){xg(e)&&(t(e)&&n(e),e.hasChildNodes()&&Eg(e,t,n))})},Sg=function(e,t){return y.curry(function(t,n){return!(!n||!Uc.getStyle(e,n,t))},t)},kg=function(e,t,n){return y.curry(function(t,n,r){e.setStyle(r,t,n),""===r.getAttribute("style")&&r.removeAttribute("style"),Tg(e,r)},t,n)},Tg=function(e,t){"SPAN"===t.nodeName&&0===e.getAttribs(t).length&&e.remove(t,!0)},Ag=function(e,t){var n;1===t.nodeType&&t.parentNode&&1===t.parentNode.nodeType&&(n=Uc.getTextDecoration(e,t.parentNode),e.getStyle(t,"color")&&n?e.setStyle(t,"text-decoration",n):e.getStyle(t,"text-decoration")===n&&e.setStyle(t,"text-decoration",null))},_g=function(e,t,n,r){Cg(t,function(t){Cg(e.dom.select(t.inline,r),function(r){xg(r)&&yg(e,t,n,r,t.exact?r:null)}),function(e,t,n){if(t.clear_child_styles){var r=t.links?"*:not(a)":"*";Cg(e.select(r,n),function(n){xg(n)&&Cg(t.styles,function(t,r){e.setStyle(n,r,"")})})}}(e.dom,t,r)})},Bg=function(e,t,n,r){(t.styles.color||t.styles.textDecoration)&&(Ot.walk(r,y.curry(Ag,e),"childNodes"),Ag(e,r))},Rg=function(e,t,n,r){t.styles&&t.styles.backgroundColor&&Eg(r,Sg(e,"fontSize"),kg(e,"backgroundColor",Uc.replaceVars(t.styles.backgroundColor,n)))},Dg=function(e,t,n,r){"sub"!==t.inline&&"sup"!==t.inline||(Eg(r,Sg(e,"fontSize"),kg(e,"fontSize","")),e.remove(e.select("sup"===t.inline?"sub":"sup",r),!0))},Og=function(e,t,n,r){r&&!1!==t.merge_siblings&&(r=Ng(e,Uc.getNonWhiteSpaceSibling(r),r),r=Ng(e,r,Uc.getNonWhiteSpaceSibling(r,!0)))},Pg=function(e,t,n,r,o){il.matchNode(e,o.parentNode,n,r)&&yg(e,t,r,o)||t.merge_with_parents&&e.dom.getParent(o.parentNode,function(i){if(il.matchNode(e,i,n,r))return yg(e,t,r,o),!0})},Ig=Ot.each,Lg=function(e,t,n,r){var o,i,a=e.formatter.get(t),s=a[0],u=!r&&e.selection.isCollapsed(),c=e.dom,l=e.selection,f=function(e,t){if(t=t||s,e){if(t.onformat&&t.onformat(e,t,n,r),Ig(t.styles,function(t,r){c.setStyle(e,r,Uc.replaceVars(t,n))}),t.styles){var o=c.getAttrib(e,"style");o&&e.setAttribute("data-mce-style",o)}Ig(t.attributes,function(t,r){c.setAttrib(e,r,Uc.replaceVars(t,n))}),Ig(t.classes,function(t){t=Uc.replaceVars(t,n),c.hasClass(e,t)||c.addClass(e,t)})}},d=function(e,t){var n=!1;return!!s.selector&&(Ig(e,function(e){if(!("collapsed"in e&&e.collapsed!==u))return c.is(t,e.selector)&&!Nl(t)?(f(t,e),n=!0,!1):void 0}),n)},m=function(r,o,i,u){var c,l,m=[],p=!0;c=s.inline||s.block,l=r.create(c),f(l),cg.walk(r,o,function(o){var i,g=function(o){var h,v,y,b;if(b=p,h=o.nodeName.toLowerCase(),v=o.parentNode.nodeName.toLowerCase(),1===o.nodeType&&r.getContentEditable(o)&&(b=p,p="true"===r.getContentEditable(o),y=!0),Uc.isEq(h,"br"))return i=0,void(s.block&&r.remove(o));if(s.wrapper&&il.matchNode(e,o,t,n))i=0;else{if(p&&!y&&s.block&&!s.wrapper&&Uc.isTextBlock(e,h)&&Uc.isValid(e,v,c))return o=r.rename(o,c),f(o),m.push(o),void(i=0);if(s.selector){var C=d(a,o);if(!s.inline||C)return void(i=0)}!p||y||!Uc.isValid(e,c,h)||!Uc.isValid(e,v,c)||!u&&3===o.nodeType&&1===o.nodeValue.length&&65279===o.nodeValue.charCodeAt(0)||Nl(o)||s.inline&&r.isBlock(o)?(i=0,Ig(Ot.grep(o.childNodes),g),y&&(p=b),i=0):(i||(i=r.clone(l,!1),o.parentNode.insertBefore(i,o),m.push(i)),i.appendChild(o))}};Ig(o,g)}),!0===s.links&&Ig(m,function(e){var t=function(e){"A"===e.nodeName&&f(e,s),Ig(Ot.grep(e.childNodes),t)};t(e)}),Ig(m,function(o){var i,u,c,l,d,p=function(e){var t=!1;return Ig(e.childNodes,function(e){if((n=e)&&1===n.nodeType&&!xs.isBookmarkNode(n)&&!Nl(n)&&!vo.isBogus(n))return t=e,!1;var n}),t};u=0,Ig(o.childNodes,function(e){Uc.isWhiteSpaceNode(e)||xs.isBookmarkNode(e)||u++}),i=u,!(m.length>1)&&r.isBlock(o)||0!==i?(s.inline||s.wrapper)&&(s.exact||1!==i||((l=p(c=o))&&!xs.isBookmarkNode(l)&&il.matchName(r,l,s)&&(d=r.clone(l,!1),f(d),r.replace(d,c,!0),r.remove(l,1)),o=d||c),_g(e,a,n,o),Pg(e,s,t,n,o),Rg(r,s,n,o),Dg(r,s,n,o),Og(r,s,n,o)):r.remove(o,1)})};if("false"!==c.getContentEditable(l.getNode())){if(s){if(r)r.nodeType?d(a,r)||((i=c.createRng()).setStartBefore(r),i.setEndAfter(r),m(c,Qc(e,i,a),0,!0)):m(c,r,0,!0);else if(u&&s.inline&&!c.select("td[data-mce-selected],th[data-mce-selected]").length)xl(e,t,n);else{var p=e.selection.getNode();e.settings.forced_root_block||!a[0].defaultBlock||c.getParent(p,c.isBlock)||Lg(e,a[0].defaultBlock),e.selection.setRng(Xs(e.selection.getRng())),o=l.getBookmark(),m(c,Qc(e,l.getRng(),a)),s.styles&&Bg(c,s,n,p),l.moveToBookmark(o),Uc.moveStart(c,l,l.getRng()),e.nodeChanged()}sg(t,e)}}else{r=l.getNode();for(var g=0,h=a.length;g<h;g++)if(a[g].ceFalseOverride&&c.is(r,a[g].selector))return void f(r,a[g])}},Mg={applyFormat:Lg},Fg=Ot.each,zg=function(e,t,n,r,o){var i,a,s,u,c,l,f,d;null===t.get()&&(a=e,s={},(i=t).set({}),a.on("NodeChange",function(e){var t=Uc.getParents(a.dom,e.element),n={};t=Ot.grep(t,function(e){return 1===e.nodeType&&!e.getAttribute("data-mce-bogus")}),Fg(i.get(),function(e,r){Fg(t,function(o){return a.formatter.matchNode(o,r,{},e.similar)?(s[r]||(Fg(e,function(e){e(!0,{node:o,format:r,parents:t})}),s[r]=e),n[r]=e,!1):!il.matchesUnInheritedFormatSelector(a,o,r)&&void 0})}),Fg(s,function(r,o){n[o]||(delete s[o],Fg(r,function(n){n(!1,{node:e.element,format:o,parents:t})}))})})),c=n,l=r,f=o,d=(u=t).get(),Fg(c.split(","),function(e){d[e]||(d[e]=[],d[e].similar=f),d[e].push(l)}),u.set(d)},Ug=function(e){var t={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",styles:{fontSize:"%value"},clear_child_styles:!0},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(){return!0},onformat:function(t,n,r){Ot.each(r,function(n,r){e.setAttrib(t,r,n)})}},removeformat:[{selector:"b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]};return Ot.each("p h1 h2 h3 h4 h5 h6 div address pre div dt dd samp".split(/\s/),function(e){t[e]={block:e,remove:"all"}}),t},Vg=Ot.each,Hg=Xo.DOM,qg=function(e,t){var n,r,o,i=t&&t.schema||Fo({}),a=function(e){var t,n,o;return r="string"==typeof e?{name:e,classes:[],attrs:{}}:e,t=Hg.create(r.name),n=t,(o=r).classes.length&&Hg.addClass(n,o.classes.join(" ")),Hg.setAttribs(n,o.attrs),t},s=function(e,t,n){var r,o,u,c,l,f,d,m,p=t.length>0&&t[0],g=p&&p.name;if(l=g,f="string"!=typeof(c=e)?c.nodeName.toLowerCase():c,d=i.getElementRule(f),u=!(!(m=d&&d.parentsRequired)||!m.length)&&(l&&-1!==Ot.inArray(m,l)?l:m[0]))g===u?(o=t[0],t=t.slice(1)):o=u;else if(p)o=t[0],t=t.slice(1);else if(!n)return e;return o&&(r=a(o)).appendChild(e),n&&(r||(r=Hg.create("div")).appendChild(e),Ot.each(n,function(t){var n=a(t);r.insertBefore(n,e)})),s(r,t,o&&o.siblings)};return e&&e.length?(r=e[0],n=a(r),(o=Hg.create("div")).appendChild(s(n,e.slice(1),r.siblings)),o):""},jg=function(e){var t,n={classes:[],attrs:{}};return"*"!==(e=n.selector=Ot.trim(e))&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,function(e,t,r,o,i){switch(t){case"#":n.attrs.id=r;break;case".":n.classes.push(r);break;case":":-1!==Ot.inArray("checked disabled enabled read-only required".split(" "),r)&&(n.attrs[r]=r)}if("["===o){var a=i.match(/([\w\-]+)(?:\=\"([^\"]+))?/);a&&(n.attrs[a[1]]=a[2])}return""})),n.name=t||"div",n},$g=function(e){return e&&"string"==typeof e?(e=(e=e.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),Ot.map(e.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=Ot.map(e.split(/(?:~\+|~|\+)/),jg),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[]},Wg=function(e,t){var n,r,o,i,a,s,u="";if(!1===(s=e.settings.preview_styles))return"";"string"!=typeof s&&(s="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow");var c=function(e){return e.replace(/%(\w+)/g,"")};if("string"==typeof t){if(!(t=e.formatter.get(t)))return;t=t[0]}return"preview"in t&&!1===(s=t.preview)?"":(n=t.block||t.inline||"span",(i=$g(t.selector)).length?(i[0].name||(i[0].name=n),n=t.selector,r=qg(i,e)):r=qg([n],e),o=Hg.select(n,r)[0]||r.firstChild,Vg(t.styles,function(e,t){(e=c(e))&&Hg.setStyle(o,t,e)}),Vg(t.attributes,function(e,t){(e=c(e))&&Hg.setAttrib(o,t,e)}),Vg(t.classes,function(e){e=c(e),Hg.hasClass(o,e)||Hg.addClass(o,e)}),e.fire("PreviewFormats"),Hg.setStyles(r,{position:"absolute",left:-65535}),e.getBody().appendChild(r),a=Hg.getStyle(e.getBody(),"fontSize",!0),a=/px$/.test(a)?parseInt(a,10):0,Vg(s.split(" "),function(t){var n=Hg.getStyle(o,t,!0);if(!("background-color"===t&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(n)&&(n=Hg.getStyle(e.getBody(),t,!0),"#ffffff"===Hg.toHex(n).toLowerCase())||"color"===t&&"#000000"===Hg.toHex(n).toLowerCase())){if("font-size"===t&&/em|%$/.test(n)){if(0===a)return;n=(n=parseFloat(n)/(/%$/.test(n)?100:1))*a+"px"}"border"===t&&n&&(u+="padding:0 2px;"),u+=t+":"+n+";"}}),e.fire("AfterPreviewFormats"),Hg.remove(r),u)},Kg=function(e,t,n,r,o){var i=t.get(n);!il.match(e,n,r,o)||"toggle"in i[0]&&!i[0].toggle?Mg.applyFormat(e,n,r,o):bg(e,n,r,o)},Xg=function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])},Yg=function(e){var t,n,r,o=(n={},(r=function(e,t){e&&("string"!=typeof e?Ot.each(e,function(e,t){r(t,e)}):(t=t.length?t:[t],Ot.each(t,function(e){"undefined"==typeof e.deep&&(e.deep=!e.selector),"undefined"==typeof e.split&&(e.split=!e.selector||e.inline),"undefined"==typeof e.remove&&e.selector&&!e.inline&&(e.remove="none"),e.selector&&e.inline&&(e.mixed=!0,e.block_expand=!0),"string"==typeof e.classes&&(e.classes=e.classes.split(/\s+/))}),n[e]=t))})(Ug((t=e).dom)),r(t.settings.formats),{get:function(e){return e?n[e]:n},register:r,unregister:function(e){return e&&n[e]&&delete n[e],n}}),i=Yl(null);return Xg(e),Cl(e),{get:o.get,register:o.register,unregister:o.unregister,apply:y.curry(Mg.applyFormat,e),remove:y.curry(bg,e),toggle:y.curry(Kg,e,o),match:y.curry(il.match,e),matchAll:y.curry(il.matchAll,e),matchNode:y.curry(il.matchNode,e),canApply:y.curry(il.canApply,e),formatChanged:y.curry(zg,e,i),getCssText:y.curry(Wg,e)}},Gg=function(e){return function(){for(var t=new Array(arguments.length),n=0;n<t.length;n++)t[n]=arguments[n];if(0===t.length)throw new Error("Can't merge zero objects");for(var r={},o=0;o<t.length;o++){var i=t[o];for(var a in i)i.hasOwnProperty(a)&&(r[a]=e(r[a],i[a]))}return r}},Jg=Gg(function(e,t){return tr.isObject(e)&&tr.isObject(t)?Jg(e,t):t}),Qg=Gg(function(e,t){return t}),Zg={deepMerge:Jg,merge:Qg},eh=function(e,t){return e.fire("PreProcess",t)},th=function(e,t){return e.fire("PostProcess",t)},nh=function(e,t,n){e.addAttributeFilter("data-mce-tabindex",function(e,t){for(var n,r=e.length;r--;)(n=e[r]).attr("tabindex",n.attributes.map["data-mce-tabindex"]),n.attr(t,null)}),e.addAttributeFilter("src,href,style",function(e,r){for(var o,i,a=e.length,s="data-mce-"+r,u=t.url_converter,c=t.url_converter_scope;a--;)(i=(o=e[a]).attributes.map[s])!==undefined?(o.attr(r,i.length>0?i:null),o.attr(s,null)):(i=o.attributes.map[r],"style"===r?i=n.serializeStyle(n.parseStyle(i),o.name):u&&(i=u.call(c,i,r,o.name)),o.attr(r,i.length>0?i:null))}),e.addAttributeFilter("class",function(e){for(var t,n,r=e.length;r--;)(n=(t=e[r]).attr("class"))&&(n=t.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),t.attr("class",n.length>0?n:null))}),e.addAttributeFilter("data-mce-type",function(e,t,n){for(var r,o=e.length;o--;)"bookmark"!==(r=e[o]).attributes.map["data-mce-type"]||n.cleanup||r.remove()}),e.addNodeFilter("noscript",function(e){for(var t,n=e.length;n--;)(t=e[n].firstChild)&&(t.value=Ao.decode(t.value))}),e.addNodeFilter("script,style",function(e,n){for(var r,o,i,a=e.length,s=function(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")};a--;)o=(r=e[a]).firstChild?r.firstChild.value:"","script"===n?((i=r.attr("type"))&&r.attr("type","mce-no/type"===i?null:i.replace(/^mce\-/,"")),"xhtml"===t.element_format&&o.length>0&&(r.firstChild.value="// <![CDATA[\n"+s(o)+"\n// ]]>")):"xhtml"===t.element_format&&o.length>0&&(r.firstChild.value="\x3c!--\n"+s(o)+"\n--\x3e")}),e.addNodeFilter("#comment",function(e){for(var t,n=e.length;n--;)0===(t=e[n]).value.indexOf("[CDATA[")?(t.name="#cdata",t.type=4,t.value=t.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===t.value.indexOf("mce:protected ")&&(t.name="#text",t.type=3,t.raw=!0,t.value=unescape(t.value).substr(14))}),e.addNodeFilter("xml:namespace,input",function(e,t){for(var n,r=e.length;r--;)7===(n=e[r]).type?n.remove():1===n.type&&("input"!==t||"type"in n.attributes.map||n.attr("type","text"))}),e.addAttributeFilter("data-mce-type",function(t){M.each(t,function(t){"format-caret"===t.attr("data-mce-type")&&(t.isEmpty(e.schema.getNonEmptyElements())?t.remove():t.unwrap())})}),e.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)})},rh=function(e){var t,n,r=function(e){return e&&"br"===e.name};r(t=e.lastChild)&&r(n=t.prev)&&(t.remove(),n.remove())},oh=function(e,t,n){return f=n,(l=e)&&l.hasEventListeners("PreProcess")&&!f.no_events?(o=t,i=n,c=(r=e).dom,o=o.cloneNode(!0),(a=document.implementation).createHTMLDocument&&(s=a.createHTMLDocument(""),Ot.each("BODY"===o.nodeName?o.childNodes:[o],function(e){s.body.appendChild(s.importNode(e,!0))}),o="BODY"!==o.nodeName?s.body.firstChild:s.body,u=c.doc,c.doc=s),eh(r,Zg.merge(i,{node:o})),u&&(c.doc=u),o):t;var r,o,i,a,s,u,c,l,f},ih=function(e,t,n){e.addNodeFilter("font",function(e){M.each(e,function(e){var r,o,i=t.parse(e.attr("style")),a=e.attr("color"),s=e.attr("face"),u=e.attr("size");a&&(i.color=a),s&&(i["font-family"]=s),u&&(i["font-size"]=n[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",t.serialize(i)),r=e,o=["color","face","size"],M.each(o,function(e){r.attr(e,null)})})})},ah=function(e,t){var n,r=zo();t.convert_fonts_to_spans&&ih(e,r,Ot.explode(t.font_size_legacy_values)),n=r,e.addNodeFilter("strike",function(e){M.each(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})},sh=function(e,t){t.inline_styles&&ah(e,t)},uh=/^[ \t\r\n]*$/,ch={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},lh=function(e,t,n){var r,o,i=n?"lastChild":"firstChild",a=n?"prev":"next";if(e[i])return e[i];if(e!==t){if(r=e[a])return r;for(o=e.parent;o&&o!==t;o=o.parent)if(r=o[a])return r}},fh=function(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})};fh.prototype={replace:function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},attr:function(e,t){var n,r;if("string"!=typeof e){for(r in e)this.attr(r,e[r]);return this}if(n=this.attributes){if(t!==undefined){if(null===t){if(e in n.map)for(delete n.map[e],r=n.length;r--;)if(n[r].name===e)return n=n.splice(r,1),this;return this}if(e in n.map){for(r=n.length;r--;)if(n[r].name===e){n[r].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,this}return n.map[e]}},clone:function(){var e,t,n,r,o,i=new fh(this.name,this.type);if(n=this.attributes){for((o=[]).map={},e=0,t=n.length;e<t;e++)"id"!==(r=n[e]).name&&(o[o.length]={name:r.name,value:r.value},o.map[r.name]=r.value);i.attributes=o}return i.value=this.value,i.shortEnded=this.shortEnded,i},wrap:function(e){return this.parent.insert(e,this),e.append(this),this},unwrap:function(){var e,t;for(e=this.firstChild;e;)t=e.next,this.insert(e,this,!0),e=t;this.remove()},remove:function(){var e=this.parent,t=this.next,n=this.prev;return e&&(e.firstChild===this?(e.firstChild=t,t&&(t.prev=null)):n.next=t,e.lastChild===this?(e.lastChild=n,n&&(n.next=null)):t.prev=n,this.parent=this.next=this.prev=null),this},append:function(e){var t;return e.parent&&e.remove(),(t=this.lastChild)?(t.next=e,e.prev=t,this.lastChild=e):this.lastChild=this.firstChild=e,e.parent=this,e},insert:function(e,t,n){var r;return e.parent&&e.remove(),r=t.parent||this,n?(t===r.firstChild?r.firstChild=e:t.prev.next=e,e.prev=t.prev,e.next=t,t.prev=e):(t===r.lastChild?r.lastChild=e:t.next.prev=e,e.next=t.next,e.prev=t,t.next=e),e.parent=r,e},getAll:function(e){var t,n=[];for(t=this.firstChild;t;t=lh(t,this))t.name===e&&n.push(t);return n},empty:function(){var e,t,n;if(this.firstChild){for(e=[],n=this.firstChild;n;n=lh(n,this))e.push(n);for(t=e.length;t--;)(n=e[t]).parent=n.firstChild=n.lastChild=n.next=n.prev=null}return this.firstChild=this.lastChild=null,this},isEmpty:function(e,t,n){var r,o,i=this.firstChild;if(t=t||{},i)do{if(1===i.type){if(i.attributes.map["data-mce-bogus"])continue;if(e[i.name])return!1;for(r=i.attributes.length;r--;)if("name"===(o=i.attributes[r].name)||0===o.indexOf("data-mce-bookmark"))return!1}if(8===i.type)return!1;if(3===i.type&&!uh.test(i.value))return!1;if(3===i.type&&i.parent&&t[i.parent.name]&&uh.test(i.value))return!1;if(n&&n(i))return!1}while(i=lh(i,this));return!0},walk:function(e){return lh(this,null,e)}},fh.create=function(e,t){var n,r;if(n=new fh(e,ch[e]||1),t)for(r in t)n.attr(r,t[r]);return n};var dh=Ot.makeMap,mh=Ot.each,ph=Ot.explode,gh=Ot.extend,hh=function(e,t,n,r){(e.padd_empty_with_br||t.insert)&&n[r.name]?r.empty().append(new fh("br","1")).shortEnded=!0:r.empty().append(new fh("#text","3")).value="\xa0"},vh=function(e,t){return e&&e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.name===t},yh=function(e,t,n,r){return r.isEmpty(t,n,function(t){return n=t,(r=e.getElementRule(n.name))&&r.paddEmpty;var n,r})},bh=function(e,t){var n={},r={},o=[],i={},a={};return(e=e||{}).validate=!("validate"in e)||e.validate,e.root_name=e.root_name||"body",n.schema=t=t||Fo(),n.filterNode=function(e){var t,n,s;n in r&&((s=i[n])?s.push(e):i[n]=[e]),t=o.length;for(;t--;)(n=o[t].name)in e.attributes.map&&((s=a[n])?s.push(e):a[n]=[e]);return e},n.addNodeFilter=function(e,t){mh(ph(e),function(e){var n=r[e];n||(r[e]=n=[]),n.push(t)})},n.addAttributeFilter=function(e,t){mh(ph(e),function(e){var n;for(n=0;n<o.length;n++)if(o[n].name===e)return void o[n].callbacks.push(t);o.push({name:e,callbacks:[t]})})},n.parse=function(s,u){var c,l,f,d,m,p,g,h,v,y,b,C,x,w,N,E,S,k,T,A,_,B=[];u=u||{},i={},a={},C=gh(dh("script,style,head,html,body,title,meta,param"),t.getBlockElements()),A=t.getNonEmptyElements(),T=t.children,b=e.validate,_="forced_root_block"in u?u.forced_root_block:e.forced_root_block,k=t.getWhiteSpaceElements(),x=/^[ \t\r\n]+/,N=/[ \t\r\n]+$/,E=/[ \t\r\n]+/g,S=/^[ \t\r\n]+$/;var R=function(e,t){var n,o=new fh(e,t);return e in r&&((n=i[e])?n.push(o):i[e]=[o]),o},D=function(e){var n,r,o,i,a=t.getBlockElements();for(n=e.prev;n&&3===n.type;){if((o=n.value.replace(N,"")).length>0)return void(n.value=o);if(r=n.next){if(3===r.type&&r.value.length){n=n.prev;continue}if(!a[r.name]&&"script"!==r.name&&"style"!==r.name){n=n.prev;continue}}i=n.prev,n.remove(),n=i}};if(c=new em({validate:b,allow_script_urls:e.allow_script_urls,allow_conditional_comments:e.allow_conditional_comments,self_closing_elements:function(e){var t,n={};for(t in e)"li"!==t&&"p"!==t&&(n[t]=e[t]);return n}(t.getSelfClosingElements()),cdata:function(e){f.append(R("#cdata",4)).value=e},text:function(e,t){var n;w||(e=e.replace(E," "),f.lastChild&&C[f.lastChild.name]&&(e=e.replace(x,""))),0!==e.length&&((n=R("#text",3)).raw=!!t,f.append(n).value=e)},comment:function(e){f.append(R("#comment",8)).value=e},pi:function(e,t){f.append(R(e,7)).value=t,D(f)},doctype:function(e){f.append(R("#doctype",10)).value=e,D(f)},start:function(e,n,r){var i,s,u,c,l;if(u=b?t.getElementRule(e):{}){for((i=R(u.outputName||e,1)).attributes=n,i.shortEnded=r,f.append(i),(l=T[f.name])&&T[i.name]&&!l[i.name]&&B.push(i),s=o.length;s--;)(c=o[s].name)in n.map&&((v=a[c])?v.push(i):a[c]=[i]);C[e]&&D(i),r||(f=i),!w&&k[e]&&(w=!0)}},end:function(n){var r,o,i,a,s,c;if(o=b?t.getElementRule(n):{}){if(C[n]&&!w){if((r=f.firstChild)&&3===r.type)if((i=r.value.replace(x,"")).length>0)r.value=i,r=r.next;else for(a=r.next,r.remove(),r=a;r&&3===r.type;)i=r.value,a=r.next,(0===i.length||S.test(i))&&(r.remove(),r=a),r=a;if((r=f.lastChild)&&3===r.type)if((i=r.value.replace(N,"")).length>0)r.value=i,r=r.prev;else for(a=r.prev,r.remove(),r=a;r&&3===r.type;)i=r.value,a=r.prev,(0===i.length||S.test(i))&&(r.remove(),r=a),r=a}if(w&&k[n]&&(w=!1),o.removeEmpty&&yh(t,A,k,f)&&!f.attributes.map.name&&!f.attributes.map.id)return s=f.parent,C[f.name]?f.empty().remove():f.unwrap(),void(f=s);o.paddEmpty&&(vh(c=f,"#text")&&"\xa0"===c.firstChild.value||yh(t,A,k,f))&&hh(e,u,C,f),f=f.parent}}},t),l=f=new fh(u.context||e.root_name,11),c.parse(s),b&&B.length&&(u.context?u.invalid=!0:function(e){var r,o,i,a,s,u,c,l,f,d,m,p,g,h,v,y;for(p=dh("tr,td,th,tbody,thead,tfoot,table"),d=t.getNonEmptyElements(),m=t.getWhiteSpaceElements(),g=t.getTextBlockElements(),h=t.getSpecialElements(),r=0;r<e.length;r++)if((o=e[r]).parent&&!o.fixed)if(g[o.name]&&"li"===o.parent.name){for(v=o.next;v&&g[v.name];)v.name="li",v.fixed=!0,o.parent.insert(v,o.parent),v=v.next;o.unwrap(o)}else{for(a=[o],i=o.parent;i&&!t.isValidChild(i.name,o.name)&&!p[i.name];i=i.parent)a.push(i);if(i&&a.length>1){for(a.reverse(),s=u=n.filterNode(a[0].clone()),f=0;f<a.length-1;f++){for(t.isValidChild(u.name,a[f].name)?(c=n.filterNode(a[f].clone()),u.append(c)):c=u,l=a[f].firstChild;l&&l!==a[f+1];)y=l.next,c.append(l),l=y;u=c}yh(t,d,m,s)?i.insert(o,a[0],!0):(i.insert(s,a[0],!0),i.insert(o,s)),i=a[0],(yh(t,d,m,i)||vh(i,"br"))&&i.empty().remove()}else if(o.parent){if("li"===o.name){if((v=o.prev)&&("ul"===v.name||"ul"===v.name)){v.append(o);continue}if((v=o.next)&&("ul"===v.name||"ul"===v.name)){v.insert(o,v.firstChild,!0);continue}o.wrap(n.filterNode(new fh("ul",1)));continue}t.isValidChild(o.parent.name,"div")&&t.isValidChild("div",o.name)?o.wrap(n.filterNode(new fh("div",1))):h[o.name]?o.empty().remove():o.unwrap()}}}(B)),_&&("body"===l.name||u.isRootContent)&&function(){var n,r,o=l.firstChild,i=function(e){e&&((o=e.firstChild)&&3===o.type&&(o.value=o.value.replace(x,"")),(o=e.lastChild)&&3===o.type&&(o.value=o.value.replace(N,"")))};if(t.isValidChild(l.name,_.toLowerCase())){for(;o;)n=o.next,3===o.type||1===o.type&&"p"!==o.name&&!C[o.name]&&!o.attr("data-mce-type")?r?r.append(o):((r=R(_,1)).attr(e.forced_root_block_attrs),l.insert(r,o),r.append(o)):(i(r),r=null),o=n;i(r)}}(),!u.invalid){for(y in i){for(v=r[y],g=(d=i[y]).length;g--;)d[g].parent||d.splice(g,1);for(m=0,p=v.length;m<p;m++)v[m](d,y,u)}for(m=0,p=o.length;m<p;m++)if((v=o[m]).name in a){for(g=(d=a[v.name]).length;g--;)d[g].parent||d.splice(g,1);for(g=0,h=v.callbacks.length;g<h;g++)v.callbacks[g](d,v.name,u)}}return l},e.remove_trailing_brs&&n.addNodeFilter("br",function(n,r,o){var i,a,s,u,c,l,f,d,m=n.length,p=gh({},t.getBlockElements()),g=t.getNonEmptyElements(),h=t.getNonEmptyElements();for(p.body=1,i=0;i<m;i++)if(s=(a=n[i]).parent,p[a.parent.name]&&a===s.lastChild){for(c=a.prev;c;){if("span"!==(l=c.name)||"bookmark"!==c.attr("data-mce-type")){if("br"!==l)break;if("br"===l){a=null;break}}c=c.prev}a&&(a.remove(),yh(t,g,h,s)&&(f=t.getElementRule(s.name))&&(f.removeEmpty?s.remove():f.paddEmpty&&hh(e,o,p,s)))}else{for(u=a;s&&s.firstChild===u&&s.lastChild===u&&(u=s,!p[s.name]);)s=s.parent;u===s&&!0!==e.padd_empty_with_br&&((d=new fh("#text",3)).value="\xa0",a.replace(d))}}),n.addAttributeFilter("href",function(t){var n,r,o,i=t.length;if(!e.allow_unsafe_link_target)for(;i--;)"a"===(n=t[i]).name&&"_blank"===n.attr("target")&&n.attr("rel",(r=n.attr("rel"),o=r?Ot.trim(r):"",/\b(noopener)\b/g.test(o)?o:o.split(" ").filter(function(e){return e.length>0}).concat(["noopener"]).sort().join(" ")))}),e.allow_html_in_named_anchor||n.addAttributeFilter("id,name",function(e){for(var t,n,r,o,i=e.length;i--;)if("a"===(o=e[i]).name&&o.firstChild&&!o.attr("href")){r=o.parent,t=o.lastChild;do{n=t.prev,r.insert(t,o),t=n}while(t)}}),e.fix_list_elements&&n.addNodeFilter("ul,ol",function(e){for(var t,n,r=e.length;r--;)if("ul"===(n=(t=e[r]).parent).name||"ol"===n.name)if(t.prev&&"li"===t.prev.name)t.prev.append(t);else{var o=new fh("li",1);o.attr("style","list-style-type: none"),t.wrap(o)}}),e.validate&&t.getValidClasses()&&n.addAttributeFilter("class",function(e){for(var n,r,o,i,a,s,u,c=e.length,l=t.getValidClasses();c--;){for(r=(n=e[c]).attr("class").split(" "),a="",o=0;o<r.length;o++)i=r[o],u=!1,(s=l["*"])&&s[i]&&(u=!0),s=l[n.name],!u&&s&&s[i]&&(u=!0),u&&(a&&(a+=" "),a+=i);a.length||(a=null),n.attr("class",a)}}),sh(n,e),n},Ch=function(e,t,n){-1===Ot.inArray(t,n)&&(e.addAttributeFilter(n,function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),t.push(n))},xh=function(e,t,n,r,o){var i,a,s,u,c=(i=r,zs(t,n).serialize(i));return a=e,u=c,!(s=o).no_events&&a?th(a,Zg.merge(s,{content:u})).content:u},wh=function(e,t){var n,r,o,i=["data-mce-selected"];return n=t&&t.dom?t.dom:Xo.DOM,r=t&&t.schema?t.schema:Fo(e),e.entity_encoding=e.entity_encoding||"named",e.remove_trailing_brs=!("remove_trailing_brs"in e)||e.remove_trailing_brs,o=bh(e,r),nh(o,e,n),{schema:r,addNodeFilter:o.addNodeFilter,addAttributeFilter:o.addAttributeFilter,serialize:function(i,a){var s,u,c,l,f,d,m,p,g,h=Zg.merge({format:"html"},a||{}),v=oh(t,i,h),y=(s=n,u=v,l=ii((c=h).getInner?u.innerHTML:s.getOuterHTML(u)),c.selection?l:Ot.trim(l)),b=(f=o,d=y,p=(m=h).selection?Zg.merge({forced_root_block:!1},m):m,g=f.parse(d,p),rh(g),g);return"tree"===h.format?b:xh(t,e,r,b,h)},addRules:function(e){r.addValidElements(e)},setRules:function(e){r.setValidElements(e)},addTempAttr:y.curry(Ch,o,i),getTempAttrs:function(){return i}}},Nh=function(e,t){var n=wh(e,t);return{schema:n.schema,addNodeFilter:n.addNodeFilter,addAttributeFilter:n.addAttributeFilter,serialize:n.serialize,addRules:n.addRules,setRules:n.setRules,addTempAttr:n.addTempAttr,getTempAttrs:n.getTempAttrs}},Eh=function(e,t){var n;t.hasAttribute("data-mce-caret")&&(mi.showCaretContainerBlock(t),(n=e).selection.setRng(n.selection.getRng()),e.selection.scrollIntoView(t))},Sh=function(e,t){var n,r=(n=e,Nu(Hn.fromDom(n.getBody()),"*[data-mce-caret]").fold(y.constant(null),function(e){return e.dom()}));if(r)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void Eh(e,r)):void(mi.hasContent(r)&&Eh(e,r))},kh=function(e){e.on("keyup compositionstart",y.curry(Sh,e))};function Th(e){return{getBookmark:y.curry(xs.getBookmark,e),moveToBookmark:y.curry(xs.moveToBookmark,e)}}(Th||(Th={})).isBookmarkNode=xs.isBookmarkNode;var Ah=Th,_h=vo.isContentEditableFalse,Bh=vo.isContentEditableTrue,Rh=function(e,t){var n,r,o,i,a,s,u,c,l,f,d,m,p,g,h,v,y,b=t.dom,C=Ot.each,x=t.getDoc(),w=document,N=Math.abs,E=Math.round,S=t.getBody();i={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};var k=".mce-content-body";t.contentStyles.push(k+" div.mce-resizehandle {position: absolute;border: 1px solid black;box-sizing: content-box;background: #FFF;width: 7px;height: 7px;z-index: 10000}"+k+" .mce-resizehandle:hover {background: #000}"+k+" img[data-mce-selected],"+k+" hr[data-mce-selected] {outline: 1px solid black;resize: none}"+k+" .mce-clonedresizable {position: absolute;"+(me.gecko?"":"outline: 1px dashed black;")+"opacity: .5;filter: alpha(opacity=50);z-index: 10000}"+k+" .mce-resize-helper {background: #555;background: rgba(0,0,0,0.75);border-radius: 3px;border: 1px;color: white;display: none;font-family: sans-serif;font-size: 12px;white-space: nowrap;line-height: 14px;margin: 5px 10px;padding: 5px;position: absolute;z-index: 10001}");var T=function(e){return e&&("IMG"===e.nodeName||t.dom.is(e,"figure.image"))},A=function(e){var n,r,o=e.target;n=e,r=t.selection.getRng(),!T(n.target)||kp(n.clientX,n.clientY,r)||e.isDefaultPrevented()||(e.preventDefault(),t.selection.select(o))},_=function(e){return t.dom.is(e,"figure.image")?e.querySelector("img"):e},B=function(e){var n=t.settings.object_resizing;return!1!==n&&!me.iOS&&("string"!=typeof n&&(n="table,img,figure.image,div"),"false"!==e.getAttribute("data-mce-resize")&&e!==t.getBody()&&_r.is(Hn.fromDom(e),n))},R=function(e){var i,C,x,w;i=e.screenX-s,C=e.screenY-u,g=i*a[2]+f,h=C*a[3]+d,g=g<5?5:g,h=h<5?5:h,(T(n)&&!1!==t.settings.resize_img_proportional?!Mp.modifierPressed(e):Mp.modifierPressed(e)||T(n)&&a[2]*a[3]!=0)&&(N(i)>N(C)?(h=E(g*m),g=E(h/m)):(g=E(h/m),h=E(g*m))),b.setStyles(_(r),{width:g,height:h}),x=a.startPos.x+i,w=a.startPos.y+C,x=x>0?x:0,w=w>0?w:0,b.setStyles(o,{left:x,top:w,display:"block"}),o.innerHTML=g+" × "+h,a[2]<0&&r.clientWidth<=g&&b.setStyle(r,"left",c+(f-g)),a[3]<0&&r.clientHeight<=h&&b.setStyle(r,"top",l+(d-h)),(i=S.scrollWidth-v)+(C=S.scrollHeight-y)!=0&&b.setStyles(o,{left:x-i,top:w-C}),p||(t.fire("ObjectResizeStart",{target:n,width:f,height:d}),p=!0)},D=function(){p=!1;var e=function(e,r){r&&(n.style[e]||!t.schema.isValid(n.nodeName.toLowerCase(),e)?b.setStyle(_(n),e,r):b.setAttrib(_(n),e,r))};e("width",g),e("height",h),b.unbind(x,"mousemove",R),b.unbind(x,"mouseup",D),w!==x&&(b.unbind(w,"mousemove",R),b.unbind(w,"mouseup",D)),b.remove(r),b.remove(o),O(n),t.fire("ObjectResized",{target:n,width:g,height:h}),b.setAttrib(n,"style",b.getAttrib(n,"style")),t.nodeChanged()},O=function(e){var p,N,E,k,T;P(),M(),p=b.getPos(e,S),c=p.x,l=p.y,T=e.getBoundingClientRect(),N=T.width||T.right-T.left,E=T.height||T.bottom-T.top,n!==e&&(n=e,g=h=0),k=t.fire("ObjectSelected",{target:e}),B(e)&&!k.isDefaultPrevented()?C(i,function(e,t){var i;(i=b.get("mceResizeHandle"+t))&&b.remove(i),i=b.add(S,"div",{id:"mceResizeHandle"+t,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+t+"-resize; margin:0; padding:0"}),me.ie&&(i.contentEditable=!1),b.bind(i,"mousedown",function(t){var i;t.stopImmediatePropagation(),t.preventDefault(),s=(i=t).screenX,u=i.screenY,f=_(n).clientWidth,d=_(n).clientHeight,m=d/f,a=e,e.startPos={x:N*e[0]+c,y:E*e[1]+l},v=S.scrollWidth,y=S.scrollHeight,r=n.cloneNode(!0),b.addClass(r,"mce-clonedresizable"),b.setAttrib(r,"data-mce-bogus","all"),r.contentEditable=!1,r.unSelectabe=!0,b.setStyles(r,{left:c,top:l,margin:0}),r.removeAttribute("data-mce-selected"),S.appendChild(r),b.bind(x,"mousemove",R),b.bind(x,"mouseup",D),w!==x&&(b.bind(w,"mousemove",R),b.bind(w,"mouseup",D)),o=b.add(S,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},f+" × "+d)}),e.elm=i,b.setStyles(i,{left:N*e[0]+c-i.offsetWidth/2,top:E*e[1]+l-i.offsetHeight/2})}):P(),n.setAttribute("data-mce-selected","1")},P=function(){var e,t;for(e in M(),n&&n.removeAttribute("data-mce-selected"),i)(t=b.get("mceResizeHandle"+e))&&(b.unbind(t),b.remove(t))},I=function(n){var r,o=function(e,t){if(e)do{if(e===t)return!0}while(e=e.parentNode)};p||t.removed||(C(b.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute("data-mce-selected")}),r="mousedown"===n.type?n.target:e.getNode(),o(r=b.$(r).closest("table,img,figure.image,hr")[0],S)&&(F(),o(e.getStart(!0),r)&&o(e.getEnd(!0),r))?O(r):P())},L=function(e){return _h(function(e,t){for(;t&&t!==e;){if(Bh(t)||_h(t))return t;t=t.parentNode}return null}(t.getBody(),e))},M=function(){for(var e in i){var t=i[e];t.elm&&(b.unbind(t.elm),delete t.elm)}},F=function(){try{t.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(e){}};return t.on("init",function(){F(),me.ie&&me.ie>=11&&(t.on("mousedown click",function(e){var n=e.target,r=n.nodeName;p||!/^(TABLE|IMG|HR)$/.test(r)||L(n)||(2!==e.button&&t.selection.select(n,"TABLE"===r),"mousedown"===e.type&&t.nodeChanged())}),t.dom.bind(S,"mscontrolselect",function(e){var n=function(e){ye.setEditorTimeout(t,function(){t.selection.select(e)})};if(L(e.target))return e.preventDefault(),void n(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&n(e.target))}));var e=ye.throttle(function(e){t.composing||I(e)});t.on("nodechange ResizeEditor ResizeWindow drop",e),t.on("keyup compositionend",function(t){n&&"TABLE"===n.nodeName&&e(t)}),t.on("hide blur",P),t.on("contextmenu",A)}),t.on("remove",M),{isResizable:B,showResizeRect:O,hideResizeRect:P,updateResizeRect:I,destroy:function(){n=r=null}}},Dh=function(e){for(var t=0,n=0,r=e;r&&r.nodeType;)t+=r.offsetLeft||0,n+=r.offsetTop||0,r=r.offsetParent;return{x:t,y:n}},Oh=function(e,t,n){var r,o,i,a,s,u=e.dom,c=u.getRoot(),l=0;if(s={elm:t,alignToTop:n},e.fire("scrollIntoView",s),!s.isDefaultPrevented()&&vo.isElement(t)){if(!1===n&&(l=t.offsetHeight),"BODY"!==c.nodeName){var f=e.selection.getScrollContainer();if(f)return r=Dh(t).y-Dh(f).y+l,a=f.clientHeight,void((r<(i=f.scrollTop)||r+25>i+a)&&(f.scrollTop=r<i?r:r-a+25))}o=u.getViewPort(e.getWin()),r=u.getPos(t).y+l,i=o.y,a=o.h,(r<o.y||r+25>i+a)&&e.getWin().scrollTo(0,r<i?r:r-a+25)}},Ph=function(e){return vo.isContentEditableTrue(e)||vo.isContentEditableFalse(e)},Ih=function(e,t,n){var r,o,i,a,s,u=n;if(u.caretPositionFromPoint)(o=u.caretPositionFromPoint(e,t))&&((r=n.createRange()).setStart(o.offsetNode,o.offset),r.collapse(!0));else if(n.caretRangeFromPoint)r=n.caretRangeFromPoint(e,t);else if(u.body.createTextRange){r=u.body.createTextRange();try{r.moveToPoint(e,t),r.collapse(!0)}catch(c){r=function(e,t,n){var r,o,i;if(r=n.elementFromPoint(e,t),o=n.body.createTextRange(),r&&"HTML"!==r.tagName||(r=n.body),o.moveToElementText(r),(i=(i=Ot.toArray(o.getClientRects())).sort(function(e,n){return(e=Math.abs(Math.max(e.top-t,e.bottom-t)))-(n=Math.abs(Math.max(n.top-t,n.bottom-t)))})).length>0){t=(i[0].bottom+i[0].top)/2;try{return o.moveToPoint(e,t),o.collapse(!0),o}catch(a){}}return null}(e,t,n)}return i=r,a=n.body,s=i&&i.parentElement?i.parentElement():null,vo.isContentEditableFalse(function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(s,a,Ph))?null:i}return r},Lh=function(e,t){return M.map(t,function(t){var n=e.fire("GetSelectionRange",{range:t});return n.range!==t?n.range:t})},Mh=function(e,t){return Hn.fromDom(e.dom().cloneNode(t))},Fh=function(e){return Mh(e,!0)},zh=function(e){return Mh(e,!1)},Uh=Fh,Vh=function(e,t){var n=(t||document).createDocumentFragment();return M.each(e,function(e){n.appendChild(e.dom())}),Hn.fromDom(n)},Hh=function(e){return Ur.firstChild(e).fold(y.constant([e]),function(t){return[e].concat(Hh(t))})},qh=function(e){return Ur.lastChild(e).fold(y.constant([e]),function(t){return"br"===Zn.name(t)?Ur.prevSibling(t).map(function(t){return[e].concat(qh(t))}).getOr([]):[e].concat(qh(t))})},jh=function(e,t){return hs([(i=t,a=i.startContainer,s=i.startOffset,vo.isText(a)?0===s?E.some(Hn.fromDom(a)):E.none():E.from(a.childNodes[s]).map(Hn.fromDom)),(n=t,r=n.endContainer,o=n.endOffset,vo.isText(r)?o===r.data.length?E.some(Hn.fromDom(r)):E.none():E.from(r.childNodes[o-1]).map(Hn.fromDom))],function(t,n){var r=M.find(Hh(e),y.curry(Dr.eq,t)),o=M.find(qh(e),y.curry(Dr.eq,n));return r.isSome()&&o.isSome()}).getOr(!1);var n,r,o,i,a,s},$h=function(e,t,n,r){var o=n,i=new to(n,o),a=e.schema.getNonEmptyElements();do{if(3===n.nodeType&&0!==Ot.trim(n.nodeValue).length)return void(r?t.setStart(n,0):t.setEnd(n,n.nodeValue.length));if(a[n.nodeName]&&!/^(TD|TH)$/.test(n.nodeName))return void(r?t.setStartBefore(n):"BR"===n.nodeName?t.setEndBefore(n):t.setEndAfter(n));if(me.ie&&me.ie<11&&e.isBlock(n)&&e.isEmpty(n))return void(r?t.setStart(n,0):t.setEnd(n,0))}while(n=r?i.next():i.prev());"BODY"===o.nodeName&&(r?t.setStart(o,0):t.setEnd(o,o.childNodes.length))},Wh=xr("element","width","rows"),Kh=xr("element","cells"),Xh=xr("x","y"),Yh=function(e,t){var n=parseInt(dr.get(e,t),10);return isNaN(n)?1:n},Gh=function(e){return M.foldl(e,function(e,t){return t.cells().length>e?t.cells().length:e},0)},Jh=function(e,t){for(var n=e.rows(),r=0;r<n.length;r++)for(var o=n[r].cells(),i=0;i<o.length;i++)if(Dr.eq(o[i],t))return E.some(Xh(i,r));return E.none()},Qh=function(e,t,n,r,o){for(var i=[],a=e.rows(),s=n;s<=o;s++){var u=a[s].cells(),c=t<r?u.slice(t,r+1):u.slice(r,t+1);i.push(Kh(a[s].element(),c))}return i},Zh=function(e){var t=Wh(zh(e),0,[]);return M.each(Os(e,"tr"),function(e,n){M.each(Os(e,"td,th"),function(r,o){!function(e,t,n,r,o){for(var i=Yh(o,"rowspan"),a=Yh(o,"colspan"),s=e.rows(),u=n;u<n+i;u++){s[u]||(s[u]=Kh(Uh(r),[]));for(var c=t;c<t+a;c++)s[u].cells()[c]=u===n&&c===t?o:zh(o)}}(t,function(e,t,n){for(;r=t,o=n,i=void 0,((i=e.rows())[o]?i[o].cells():[])[r];)t++;var r,o,i;return t}(t,o,n),n,e,r)})}),Wh(t.element(),Gh(t.rows()),t.rows())},ev=function(e){return t=e,i=e,n=M.map(i.rows(),function(e){var t=M.map(e.cells(),function(e){var t=Uh(e);return dr.remove(t,"colspan"),dr.remove(t,"rowspan"),t}),n=zh(e.element());return As(n,t),n}),r=zh(t.element()),o=Hn.fromTag("tbody"),As(o,n),ks.append(r,o),r;var t,n,r,o,i},tv=function(e,t,n){return Jh(e,t).bind(function(t){return Jh(e,n).map(function(n){return r=e,i=n,a=(o=t).x(),s=o.y(),u=i.x(),c=i.y(),l=s<c?Qh(r,a,s,u,c):Qh(r,a,c,u,s),Wh(r.element(),Gh(l),l);var r,o,i,a,s,u,c,l})})},nv=function(e,t){return M.find(e,function(e){return"li"===Zn.name(e)&&jh(e,t)}).fold(y.constant([]),function(t){return(n=e,M.find(n,function(e){return"ul"===Zn.name(e)||"ol"===Zn.name(e)})).map(function(e){return[Hn.fromTag("li"),Hn.fromTag(Zn.name(e))]}).getOr([]);var n})},rv=function(e,t){var n,r=Hn.fromDom(t.commonAncestorContainer),o=Uu(r,e),i=M.filter(o,function(e){return io.isInline(e)||io.isHeading(e)}),a=nv(o,t),s=i.concat(a.length?a:(n=r,io.isListItem(n)?Ur.parent(n).filter(io.isList).fold(y.constant([]),function(e){return[n,e]}):io.isList(n)?[n]:[]));return M.map(s,zh)},ov=function(){return Vh([])},iv=function(e,t){return n=Hn.fromDom(t.cloneContents()),r=rv(e,t),o=M.foldl(r,function(e,t){return ks.append(t,e),t},n),r.length>0?Vh([o]):o;var n,r,o},av=function(e,t){return(n=e,r=t[0],wu(r,"table",y.curry(Dr.eq,n))).bind(function(e){var n=t[0],r=t[t.length-1],o=Zh(e);return tv(o,n,r).map(function(e){return Vh([ev(e)])})}).getOrThunk(ov);var n,r},sv=function(e,t){var n,r,o=Af(t,e);return o.length>0?av(e,o):(n=e,(r=t).length>0&&r[0].collapsed?ov():iv(n,r[0]))},uv=function(e,t){var n,r=e.selection.getRng(),o=e.dom.create("body"),i=e.selection.getSel(),a=Lh(e,wf(i));if((t=t||{}).get=!0,t.format=t.format||"html",t.selection=!0,(t=e.fire("BeforeGetContent",t)).isDefaultPrevented())return e.fire("GetContent",t),t.content;if("text"===t.format)return e.selection.isCollapsed()?"":ii(r.text||(i.toString?i.toString():""));r.cloneContents?(n=t.contextual?sv(Hn.fromDom(e.getBody()),a).dom():r.cloneContents())&&o.appendChild(n):r.item!==undefined||r.htmlText!==undefined?(o.innerHTML="<br>"+(r.item?r.item(0).outerHTML:r.htmlText),o.removeChild(o.firstChild)):o.innerHTML=r.toString(),t.getInner=!0;var s=e.selection.serializer.serialize(o,t);return"tree"===t.format?s:(t.content=e.selection.isCollapsed()?"":s,e.fire("GetContent",t),t.content)},cv=function(e,t,n){var r,o,i,a=e.selection.getRng(),s=e.getDoc();if((n=n||{format:"html"}).set=!0,n.selection=!0,n.content=t,n.no_events||!(n=e.fire("BeforeSetContent",n)).isDefaultPrevented()){if(t=n.content,a.insertNode){t+='<span id="__caret">_</span>',a.startContainer===s&&a.endContainer===s?s.body.innerHTML=t:(a.deleteContents(),0===s.body.childNodes.length?s.body.innerHTML=t:a.createContextualFragment?a.insertNode(a.createContextualFragment(t)):(o=s.createDocumentFragment(),i=s.createElement("div"),o.appendChild(i),i.outerHTML=t,a.insertNode(o))),r=e.dom.get("__caret"),(a=s.createRange()).setStartBefore(r),a.setEndBefore(r),e.selection.setRng(a),e.dom.remove("__caret");try{e.selection.setRng(a)}catch(u){}}else a.item&&(s.execCommand("Delete",!1,null),a=e.getRng()),/^\s+/.test(t)?(a.pasteHTML('<span id="__mce_tmp">_</span>'+t),e.dom.remove("__mce_tmp")):a.pasteHTML(t);n.no_events||e.fire("SetContent",n)}else e.fire("SetContent",n)},lv=function(e,t,n,r,o){var i=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return E.from(i).map(Hn.fromDom).map(function(e){return r&&t.collapsed?e:Ur.child(e,o(e,a)).getOr(e)}).bind(function(e){return Zn.isElement(e)?E.some(e):Ur.parent(e)}).map(function(e){return e.dom()}).getOr(e)},fv=function(e,t,n){return lv(e,t,!0,n,function(e,t){return Math.min(Ur.childNodesCount(e),t)})},dv=function(e,t,n){return lv(e,t,!1,n,function(e,t){return t>0?t-1:t})},mv=function(e,t){for(var n=e;e&&vo.isText(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n},pv=Ot.each,gv=function(e){return!!e.select},hv=function(e){return!(!e||!e.ownerDocument)&&Dr.contains(Hn.fromDom(e.ownerDocument),Hn.fromDom(e))},vv=function(e,t,n,r){var o,i,a,s,u,c=function(e,t){return cv(r,e,t)},l=function(e){var t=d();t.collapse(!!e),m(t)},f=function(){return t.getSelection?t.getSelection():t.document.selection},d=function(){var n,o,i,u,c=function(e,t,n){try{return t.compareBoundaryPoints(e,n)}catch(r){return-1}};if(!t)return null;if(void 0===(u=t.document)||null===u)return null;if(r.bookmark!==undefined&&!1===hm(r)){var l=Td(r);if(l.isSome())return l.map(function(e){return Lh(r,[e])[0]}).getOr(u.createRange())}try{(n=f())&&(o=n.rangeCount>0?n.getRangeAt(0):n.createRange?n.createRange():u.createRange())}catch(d){}return(o=Lh(r,[o])[0])||(o=u.createRange?u.createRange():u.body.createTextRange()),o.setStart&&9===o.startContainer.nodeType&&o.collapsed&&(i=e.getRoot(),o.setStart(i,0),o.setEnd(i,0)),a&&s&&(0===c(o.START_TO_START,o,a)&&0===c(o.END_TO_END,o,a)?o=s:(a=null,s=null)),o},m=function(e,t){var n,o;if((i=e)&&(gv(i)||hv(i.startContainer)&&hv(i.endContainer))){var i,u=gv(e)?e:null;if(u){s=null;try{u.select()}catch(c){}}else{if(n=f(),e=r.fire("SetSelectionRange",{range:e,forward:t}).range,n){s=e;try{n.removeAllRanges(),n.addRange(e)}catch(c){}!1===t&&n.extend&&(n.collapse(e.endContainer,e.endOffset),n.extend(e.startContainer,e.startOffset)),a=n.rangeCount>0?n.getRangeAt(0):null}e.collapsed||e.startContainer!==e.endContainer||!n.setBaseAndExtent||me.ie||e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(o=e.startContainer.childNodes[e.startOffset])&&"IMG"===o.tagName&&(n.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),n.anchorNode===e.startContainer&&n.focusNode===e.endContainer||n.setBaseAndExtent(o,0,o,1)),r.fire("AfterSetSelectionRange",{range:e,forward:t})}}},p=function(){var t,n,r=f();return!(r&&r.anchorNode&&r.focusNode)||((t=e.createRng()).setStart(r.anchorNode,r.anchorOffset),t.collapse(!0),(n=e.createRng()).setStart(r.focusNode,r.focusOffset),n.collapse(!0),t.compareBoundaryPoints(t.START_TO_START,n)<=0)},g={bookmarkManager:null,controlSelection:null,dom:e,win:t,serializer:n,editor:r,collapse:l,setCursorLocation:function(t,n){var o=e.createRng();t?(o.setStart(t,n),o.setEnd(t,n),m(o),l(!1)):($h(e,o,r.getBody(),!0),m(o))},getContent:function(e){return uv(r,e)},setContent:c,getBookmark:function(e,t){return o.getBookmark(e,t)},moveToBookmark:function(e){return o.moveToBookmark(e)},select:function(t,n){var r,o,i;return(r=e,o=t,i=n,E.from(o).map(function(e){var t=r.nodeIndex(e),n=r.createRng();return n.setStart(e.parentNode,t),n.setEnd(e.parentNode,t+1),i&&($h(r,n,e,!0),$h(r,n,e,!1)),n})).each(m),t},isCollapsed:function(){var e=d(),t=f();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isForward:p,setNode:function(t){return c(e.getOuterHTML(t)),t},getNode:function(){return e=r.getBody(),(t=d())?(o=t.startContainer,i=t.endContainer,a=t.startOffset,s=t.endOffset,n=t.commonAncestorContainer,!t.collapsed&&(o===i&&s-a<2&&o.hasChildNodes()&&(n=o.childNodes[a]),3===o.nodeType&&3===i.nodeType&&(o=o.length===a?mv(o.nextSibling,!0):o.parentNode,i=0===s?mv(i.previousSibling,!1):i.parentNode,o&&o===i))?o:n&&3===n.nodeType?n.parentNode:n):e;var e,t,n,o,i,a,s},getSel:f,setRng:m,getRng:d,getStart:function(e){return fv(r.getBody(),d(),e)},getEnd:function(e){return dv(r.getBody(),d(),e)},getSelectedBlocks:function(t,n){return function(e,t,n,r){var o,i,a=[];if(i=e.getRoot(),n=e.getParent(n||fv(i,t,!1),e.isBlock),r=e.getParent(r||dv(i,t,!1),e.isBlock),n&&n!==i&&a.push(n),n&&r&&n!==r){o=n;for(var s=new to(n,i);(o=s.next())&&o!==r;)e.isBlock(o)&&a.push(o)}return r&&n!==r&&r!==i&&a.push(r),a}(e,d(),t,n)},normalize:function(){var t=d();if(!Ef(f())){var n=Jf.normalize(e,t);return n.each(function(e){m(e,p())}),n.getOr(t)}return t},selectorChanged:function(t,n){var o;return u||(u={},o={},r.on("NodeChange",function(t){var n=t.element,r=e.getParents(n,null,e.getRoot()),i={};pv(u,function(t,n){pv(r,function(a){if(e.is(a,n))return o[n]||(pv(t,function(e){e(!0,{node:a,selector:n,parents:r})}),o[n]=t),i[n]=t,!1})}),pv(o,function(e,t){i[t]||(delete o[t],pv(e,function(e){e(!1,{node:n,selector:t,parents:r})}))})})),u[t]||(u[t]=[]),u[t].push(n),g},getScrollContainer:function(){for(var t,n=e.getRoot();n&&"BODY"!==n.nodeName;){if(n.scrollHeight>n.clientHeight){t=n;break}n=n.parentNode}return t},scrollIntoView:function(e,t){return Oh(r,e,t)},placeCaretAt:function(e,t){return m(Ih(e,t,r.getDoc()))},getBoundingClientRect:function(){var e=d();return e.collapsed?ia.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){t=null,i.destroy()}};return o=Ah(g),i=Rh(g,r),g.bookmarkManager=o,g.controlSelection=i,g},yv=ji.curry,bv=function(e,t,n,r,o,i){var a,s,u=0,c=[],l=function(r){var i,a,l;for(l=gp.getClientRects(r),-1===e&&(l=l.reverse()),i=0;i<l.length;i++)if(a=l[i],!n(a,s)){if(c.length>0&&t(a,At.last(c))&&u++,a.line=u,o(a))return!0;c.push(a)}};return(s=At.last(i.getClientRects()))?(l(a=i.getNode()),function(e,t,n,r){for(;r=_a.findNode(r,e,ki,t);)if(n(r))return}(e,r,l,a),c):c},Cv={upUntil:yv(bv,-1,Ii,Li),downUntil:yv(bv,1,Li,Ii),positionsUntil:function(e,t,n,r){var o,i,a,s,u,c,l=Ha(t),f=[],d=0,m=function(e){return At.last(e.getClientRects())};1===e?(o=l.next,i=Li,a=Ii,s=ia.after(r)):(o=l.prev,i=Ii,a=Li,s=ia.before(r)),c=m(s);do{if(s.isVisible()&&!a(u=m(s),c)){if(f.length>0&&i(u,At.last(f))&&d++,(u=Di(u)).position=s,u.line=d,n(u))return f;f.push(u)}}while(s=o(s));return f},isAboveLine:yv(function(e,t){return t.line>e}),isLine:yv(function(e,t){return t.line===e})},xv=vo.isContentEditableFalse,wv=Fi,Nv=_a.isAfterContentEditableFalse,Ev=_a.isBeforeContentEditableFalse,Sv=function(e,t){for(;t=e(t);)if(t.isVisible())return t;return t},kv=function(e,t,n){return n=_a.normalizeRange(e,t,n),-1===e?ia.fromRangeStart(n):ia.fromRangeEnd(n)},Tv=function(e,t,n,r,o){var i,a,s,u,c,l,f,d;return!o.collapsed&&(i=wv(o),xv(i))?Dp(e,t,i,-1===e):(c=o,u=mi.isCaretContainerBlock(c.startContainer),r(a=kv(e,t.getBody(),o))?Op(t,a.getNode(-1===e)):(a=n(a))?r(a)?Dp(e,t,a.getNode(-1===e),1===e):r(s=n(a))&&(l=a,f=s,!(d=_a.isInSameBlock(l,f))&&vo.isBr(l.getNode())||d)?Dp(e,t,s.getNode(-1===e),1===e):u?Ip(t,a.toRange()):null:u?o:null)},Av=function(e,t,n){var r,o,i,a,s=Ha(e.getBody()),u=ji.curry(Sv,s.next),c=ji.curry(Sv,s.prev);if(n.collapsed&&e.settings.forced_root_block){if(!(r=e.dom.getParent(n.startContainer,"PRE")))return;(1===t?u(ia.fromRangeStart(n)):c(ia.fromRangeStart(n)))||(a=(i=e).dom.create(i.settings.forced_root_block),(!me.ie||me.ie>=11)&&(a.innerHTML='<br data-mce-bogus="1">'),o=a,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse())}},_v=function(e,t){var n,r=t?1:-1,o=t?Cv.downUntil:Cv.upUntil,i=e.selection.getRng();return(n=function(e,t,n,r){var o,i,a,s,u,c,l,f,d;if(d=wv(r),o=kv(e,t.getBody(),r),i=n(t.getBody(),Cv.isAboveLine(1),o),a=At.filter(i,Cv.isLine(1)),u=At.last(o.getClientRects()),Ev(o)&&(d=o.getNode()),Nv(o)&&(d=o.getNode(!0)),!u)return null;if(c=u.left,(s=Ep(a,c))&&xv(s.node))return l=Math.abs(c-s.left),f=Math.abs(c-s.right),Dp(e,t,s.node,l<f);if(d){var m=Cv.positionsUntil(e,t.getBody(),Cv.isAboveLine(1),d);if(s=Ep(At.filter(m,Cv.isLine(1)),c))return Ip(t,s.position.toRange());if(s=At.last(At.filter(m,Cv.isLine(0))))return Ip(t,s.position.toRange())}}(r,e,o,i))?n:(n=Av(e,r,i))||null},Bv=function(e,t){return function(){var n,r,o,i,a,s,u,c,l,f,d=(r=t,i=Ha((n=e).getBody()),a=ji.curry(Sv,i.next),s=ji.curry(Sv,i.prev),u=r?1:-1,c=r?a:s,l=r?Ev:Nv,f=n.selection.getRng(),(o=Tv(u,n,c,l,f))?o:(o=Av(n,u,f))||null);return!!d&&(e.selection.setRng(d),!0)}},Rv=function(e,t){return function(){var n=_v(e,t);return!!n&&(e.selection.setRng(n),!0)}},Dv=function(e,t){return M.bind((n=e,M.map(n,function(e){return Zg.merge({shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0,action:y.noop},e)})),function(e){return n=e,(r=t).keyCode===n.keyCode&&r.shiftKey===n.shiftKey&&r.altKey===n.altKey&&r.ctrlKey===n.ctrlKey&&r.metaKey===n.metaKey?[e]:[];var n,r});var n},Ov=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,r)}},Pv=function(e,t){return M.find(Dv(e,t),function(e){return e.action()})},Iv=function(e,t){e.on("keydown",function(n){var r,o,i,a;!1===n.isDefaultPrevented()&&(r=e,o=t,i=n,a=Un.detect().os,Pv([{keyCode:Mp.RIGHT,action:Bv(r,!0)},{keyCode:Mp.LEFT,action:Bv(r,!1)},{keyCode:Mp.UP,action:Rv(r,!1)},{keyCode:Mp.DOWN,action:Rv(r,!0)},{keyCode:Mp.RIGHT,action:of.move(r,o,!0)},{keyCode:Mp.LEFT,action:of.move(r,o,!1)},{keyCode:Mp.RIGHT,ctrlKey:!a.isOSX(),altKey:a.isOSX(),action:of.moveNextWord(r,o)},{keyCode:Mp.LEFT,ctrlKey:!a.isOSX(),altKey:a.isOSX(),action:of.movePrevWord(r,o)}],i).each(function(e){i.preventDefault()}))})},Lv=function(e){return 1===Ur.children(e).length},Mv=function(e,t){var n,r=Hn.fromDom(e.getBody()),o=Hn.fromDom(e.selection.getStart()),i=M.filter((n=Uu(o,r),M.findIndex(n,io.isBlock).fold(y.constant(n),function(e){return n.slice(0,e)})),Lv);return M.last(i).map(function(n){var r=ia.fromRangeStart(e.selection.getRng());return!!Cu(t,r,n.dom())&&(function(e,t,n,r){var o=y.curry(kl,t),i=M.map(M.filter(r,o),function(e){return e.dom()});if(0===i.length)mc(t,e,n);else{var a=Sl(n.dom(),i);t.selection.setRng(a.toRange())}}(t,e,n,i),!0)}).getOr(!1)},Fv=function(e,t){return!!e.selection.isCollapsed()&&Mv(e,t)},zv=function(e,t){e.on("keydown",function(n){var r,o,i;!1===n.isDefaultPrevented()&&(r=e,o=t,i=n,Pv([{keyCode:Mp.BACKSPACE,action:Ov(hc,r,!1)},{keyCode:Mp.DELETE,action:Ov(hc,r,!0)},{keyCode:Mp.BACKSPACE,action:Ov(cf,r,o,!1)},{keyCode:Mp.DELETE,action:Ov(cf,r,o,!0)},{keyCode:Mp.BACKSPACE,action:Ov(Ju,r,!1)},{keyCode:Mp.DELETE,action:Ov(Ju,r,!0)},{keyCode:Mp.BACKSPACE,action:Ov(Ku,r,!1)},{keyCode:Mp.DELETE,action:Ov(Ku,r,!0)},{keyCode:Mp.BACKSPACE,action:Ov(zf,r,!1)},{keyCode:Mp.DELETE,action:Ov(zf,r,!0)},{keyCode:Mp.BACKSPACE,action:Ov(Fv,r,!1)},{keyCode:Mp.DELETE,action:Ov(Fv,r,!0)}],i).each(function(e){i.preventDefault()}))}),e.on("keyup",function(t){var n,r;!1===t.isDefaultPrevented()&&(n=e,r=t,Pv([{keyCode:Mp.BACKSPACE,action:Ov(vc,n)},{keyCode:Mp.DELETE,action:Ov(vc,n)}],r))})},Uv=function(e,t,n){var r=e.getParam(t,n);if(-1!==r.indexOf("=")){var o=e.getParam(t,"","hash");return o.hasOwnProperty(e.id)?o[e.id]:n}return r},Vv=function(e){return e.getParam("iframe_attrs",{})},Hv=function(e){return e.getParam("doctype","<!DOCTYPE html>")},qv=function(e){return e.getParam("document_base_url","")},jv=function(e){return Uv(e,"body_id","tinymce")},$v=function(e){return Uv(e,"body_class","")},Wv=function(e){return e.getParam("content_security_policy","")},Kv=function(e){return e.getParam("br_in_pre",!0)},Xv=function(e){if(e.getParam("force_p_newlines",!1))return"p";var t=e.getParam("forced_root_block","p");return!1===t?"":t},Yv=function(e){return e.getParam("forced_root_block_attrs",{})},Gv=function(e){return e.getParam("br_newline_selector",".mce-toc h2,figcaption,caption")},Jv=function(e){return e.getParam("no_newline_selector","")},Qv=function(e){return e.getParam("keep_styles",!0)},Zv=function(e){return e.getParam("end_container_on_empty_block",!1)},ey=function(e){return E.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock))},ty=function(e,t){var n,r,o,i=t,a=e.dom,s=e.schema.getMoveCaretBeforeOnEnterElements();if(t){if(/^(LI|DT|DD)$/.test(t.nodeName)){var u=function(e){for(;e;){if(1===e.nodeType||3===e.nodeType&&e.data&&/[\r\n\s]/.test(e.data))return e;e=e.nextSibling}}(t.firstChild);u&&/^(UL|OL|DL)$/.test(u.nodeName)&&t.insertBefore(a.doc.createTextNode("\xa0"),t.firstChild)}if(o=a.createRng(),t.normalize(),t.hasChildNodes()){for(n=new to(t,t);r=n.current();){if(vo.isText(r)){o.setStart(r,0),o.setEnd(r,0);break}if(s[r.nodeName.toLowerCase()]){o.setStartBefore(r),o.setEndBefore(r);break}i=r,r=n.next()}r||(o.setStart(i,0),o.setEnd(i,0))}else vo.isBr(t)?t.nextSibling&&a.isBlock(t.nextSibling)?(o.setStartBefore(t),o.setEndBefore(t)):(o.setStartAfter(t),o.setEndAfter(t)):(o.setStart(t,0),o.setEnd(t,0));e.selection.setRng(o),a.remove(void 0),e.selection.scrollIntoView(t)}},ny=function(e,t){var n,r,o=e.getRoot();for(n=t;n!==o&&"false"!==e.getContentEditable(n);)"true"===e.getContentEditable(n)&&(r=n),n=n.parentNode;return n!==o?r:o},ry=ey,oy=function(e){return ey(e).fold(y.constant(""),function(e){return e.nodeName.toUpperCase()})},iy=function(e){return ey(e).filter(function(e){return io.isListItem(Hn.fromDom(e))}).isSome()},ay=function(e,t){return e&&e.parentNode&&e.parentNode.nodeName===t},sy=function(e){return e&&/^(OL|UL|LI)$/.test(e.nodeName)},uy=function(e){var t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e},cy=function(e,t,n){for(var r=e[n?"firstChild":"lastChild"];r&&!vo.isElement(r);)r=r[n?"nextSibling":"previousSibling"];return r===t},ly=function(e,t,n,r,o){var i=e.dom,a=e.selection.getRng();if(n!==e.getBody()){var s;sy(s=n)&&sy(s.parentNode)&&(o="LI");var u,c,l=o?t(o):i.create("BR");if(cy(n,r,!0)&&cy(n,r,!1))ay(n,"LI")?i.insertAfter(l,uy(n)):i.replace(l,n);else if(cy(n,r,!0))ay(n,"LI")?(i.insertAfter(l,uy(n)),l.appendChild(i.doc.createTextNode(" ")),l.appendChild(n)):n.parentNode.insertBefore(l,n);else if(cy(n,r,!1))i.insertAfter(l,uy(n));else{n=uy(n);var f=a.cloneRange();f.setStartAfter(r),f.setEndAfter(n);var d=f.extractContents();"LI"===o&&(c="LI",(u=d).firstChild&&u.firstChild.nodeName===c)?(l=d.firstChild,i.insertAfter(d,n)):(i.insertAfter(d,n),i.insertAfter(l,n))}i.remove(r),ty(e,l)}},fy=function(e){e.innerHTML='<br data-mce-bogus="1">'},dy=function(e,t){return e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t},my=function(e,t){return t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t)},py=function(e,t,n){return!1===vo.isText(t)?n:e?1===n&&t.data.charAt(n-1)===oi?0:n:n===t.data.length-1&&t.data.charAt(n)===oi?t.data.length:n},gy=function(e,t){var n,r,o=e.getRoot();for(n=t;n!==o&&"false"!==e.getContentEditable(n);)"true"===e.getContentEditable(n)&&(r=n),n=n.parentNode;return n!==o?r:o},hy=function(e,t){var n=Xv(e);n&&n.toLowerCase()===t.tagName.toLowerCase()&&e.dom.setAttribs(t,Yv(e))},vy=function(e,t){var n,r,o,i,a,s,u,c,l,f,d,m,p,g,h,v,y,b,C=e.dom,x=e.schema,w=x.getNonEmptyElements(),N=e.selection.getRng(),E=function(t){var n,i,s,u=o,c=x.getTextInlineElements();if(t||"TABLE"===f||"HR"===f?(n=C.create(t||m),hy(e,n)):n=a.cloneNode(!1),s=n,!1===Qv(e))C.setAttrib(n,"style",null),C.setAttrib(n,"class",null);else do{if(c[u.nodeName]){if(Nl(u))continue;i=u.cloneNode(!1),C.setAttrib(i,"id",""),n.hasChildNodes()?(i.appendChild(n.firstChild),n.appendChild(i)):(s=i,n.appendChild(i))}}while((u=u.parentNode)&&u!==r);return fy(s),n},S=function(e){var t,n,r,s;if(s=py(e,o,i),vo.isText(o)&&(e?s>0:s<o.nodeValue.length))return!1;if(o.parentNode===a&&p&&!e)return!0;if(e&&vo.isElement(o)&&o===a.firstChild)return!0;if(dy(o,"TABLE")||dy(o,"HR"))return p&&!e||!p&&e;for(t=new to(o,a),vo.isText(o)&&(e&&0===s?t.prev():e||s!==o.nodeValue.length||t.next());n=t.current();){if(vo.isElement(n)){if(!n.getAttribute("data-mce-bogus")&&(r=n.nodeName.toLowerCase(),w[r]&&"br"!==r))return!1}else if(vo.isText(n)&&!/^[ \t\r\n]*$/.test(n.nodeValue))return!1;e?t.prev():t.next()}return!0},k=function(){u=/^(H[1-6]|PRE|FIGURE)$/.test(f)&&"HGROUP"!==d?E(m):E(),Zv(e)&&my(C,l)&&C.isEmpty(a)?u=C.split(l,a):C.insertAfter(u,a),ty(e,u)};Jf.normalize(C,N).each(function(e){N.setStart(e.startContainer,e.startOffset),N.setEnd(e.endContainer,e.endOffset)}),o=N.startContainer,i=N.startOffset,m=Xv(e),s=t.shiftKey,vo.isElement(o)&&o.hasChildNodes()&&(p=i>o.childNodes.length-1,o=o.childNodes[Math.min(i,o.childNodes.length-1)]||o,i=p&&vo.isText(o)?o.nodeValue.length:0),(r=gy(C,o))&&((m&&!s||!m&&s)&&(o=function(e,t,n,r,o){var i,a,s,u,c,l,f,d=t||"P",m=e.dom,p=gy(m,r);if(!(a=m.getParent(r,m.isBlock))||!my(m,a)){if(l=(a=a||p)===e.getBody()||(f=a)&&/^(TD|TH|CAPTION)$/.test(f.nodeName)?a.nodeName.toLowerCase():a.parentNode.nodeName.toLowerCase(),!a.hasChildNodes())return i=m.create(d),hy(e,i),a.appendChild(i),n.setStart(i,0),n.setEnd(i,0),i;for(u=r;u.parentNode!==a;)u=u.parentNode;for(;u&&!m.isBlock(u);)s=u,u=u.previousSibling;if(s&&e.schema.isValidChild(l,d.toLowerCase())){for(i=m.create(d),hy(e,i),s.parentNode.insertBefore(i,s),u=s;u&&!m.isBlock(u);)c=u.nextSibling,i.appendChild(u),u=c;n.setStart(r,o),n.setEnd(r,o)}}return r}(e,m,N,o,i)),a=C.getParent(o,C.isBlock),l=a?C.getParent(a.parentNode,C.isBlock):null,f=a?a.nodeName.toUpperCase():"","LI"!==(d=l?l.nodeName.toUpperCase():"")||t.ctrlKey||(a=l,l=l.parentNode,f=d),/^(LI|DT|DD)$/.test(f)&&C.isEmpty(a)?ly(e,E,l,a,m):m&&a===e.getBody()||(m=m||"P",mi.isCaretContainerBlock(a)?(u=mi.showCaretContainerBlock(a),C.isEmpty(a)&&fy(a),ty(e,u)):S()?k():S(!0)?(u=a.parentNode.insertBefore(E(),a),ty(e,dy(a,"HR")?u:a)):((n=(y=N,b=y.cloneRange(),b.setStart(y.startContainer,py(!0,y.startContainer,y.startOffset)),b.setEnd(y.endContainer,py(!1,y.endContainer,y.endOffset)),b).cloneRange()).setEndAfter(a),function(e){do{vo.isText(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild}while(e)}(c=n.extractContents()),u=c.firstChild,C.insertAfter(c,a),function(e,t,n){var r,o=n,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;vo.isElement(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(r=i.length;r--;)!(o=i[r]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(a=o)&&"A"===a.nodeName&&0===Ot.trim(ii(a.innerText||a.textContent)).length&&e.remove(o);var a}}(C,w,u),g=C,(h=a).normalize(),(v=h.lastChild)&&!/^(left|right)$/gi.test(g.getStyle(v,"float",!0))||g.add(h,"br"),C.isEmpty(a)&&fy(a),u.normalize(),C.isEmpty(u)?(C.remove(u),k()):ty(e,u)),C.setAttrib(u,"id",""),e.fire("NewBlock",{newBlock:u})))},yy=function(e,t){return ry(e).filter(function(e){return t.length>0&&_r.is(Hn.fromDom(e),t)}).isSome()},by=function(e){return yy(e,Gv(e))},Cy=function(e){return yy(e,Jv(e))},xy=Qu([{br:[]},{block:[]},{none:[]}]),wy=function(e,t){return Cy(e)},Ny=function(e){return function(t,n){return""===Xv(t)===e}},Ey=function(e){return function(t,n){return iy(t)===e}},Sy=function(e){return function(t,n){return"PRE"===oy(t)===e}},ky=function(e){return function(t,n){return Kv(t)===e}},Ty=function(e,t){return by(e)},Ay=function(e,t){return t},_y=function(e){var t=Xv(e),n=ny(e.dom,e.selection.getStart());return n&&e.schema.isValidChild(n.nodeName,t||"P")},By=function(e,t){return function(n,r){return M.foldl(e,function(e,t){return e&&t(n,r)},!0)?E.some(t):E.none()}},Ry=function(e,t){return Tl([By([wy],xy.none()),By([Sy(!0),ky(!1),Ay],xy.br()),By([Sy(!0),ky(!1)],xy.block()),By([Sy(!0),ky(!0),Ay],xy.block()),By([Sy(!0),ky(!0)],xy.br()),By([Ey(!0),Ay],xy.br()),By([Ey(!0)],xy.block()),By([Ny(!0),Ay,_y],xy.block()),By([Ny(!0)],xy.br()),By([Ty],xy.br()),By([Ny(!1),Ay],xy.br()),By([_y],xy.block())],[e,t.shiftKey]).getOr(xy.none())},Dy=function(e,t){Ry(e,t).fold(function(){sd(e,t)},function(){vy(e,t)},y.noop)},Oy=function(e){e.on("keydown",function(t){var n,r,o;t.keyCode===Mp.ENTER&&(n=e,(r=t).isDefaultPrevented()||(r.preventDefault(),(o=n.undoManager).typing&&(o.typing=!1,o.add()),n.undoManager.transact(function(){!1===n.selection.isCollapsed()&&n.execCommand("Delete"),Dy(n,r)})))})},Py=function(e,t,n){return s=t,!(!Iy(n)||!vo.isText(s.container())||(r=e,i=(o=t).container(),a=o.offset(),i.insertData(a,"\xa0"),r.selection.setCursorLocation(i,a+1),0));var r,o,i,a,s},Iy=function(e){return e.fold(y.constant(!1),y.constant(!0),y.constant(!0),y.constant(!1))},Ly=function(e){return!!e.selection.isCollapsed()&&(t=e,n=y.curry(vu.isInlineTarget,t),r=ia.fromRangeStart(t.selection.getRng()),$l(n,t.getBody(),r).map(y.curry(Py,t,r)).getOr(!1));var t,n,r},My=function(e){e.on("keydown",function(t){var n,r;!1===t.isDefaultPrevented()&&(n=e,r=t,Pv([{keyCode:Mp.SPACEBAR,action:Ov(Ly,n)}],r).each(function(e){r.preventDefault()}))})},Fy=function(e){var t=of.setupSelectedState(e);Iv(e,t),zv(e,t),Oy(e),My(e)},zy=function(e){var t,n,r,o=Ot.each,i=Mp.BACKSPACE,a=Mp.DELETE,s=e.dom,u=e.selection,c=e.settings,l=e.parser,f=me.gecko,d=me.ie,m=me.webkit,p="data:text/mce-internal,",g=d?"Text":"URL",h=function(t,n){try{e.getDoc().execCommand(t,!1,n)}catch(r){}},v=function(e){return e.isDefaultPrevented()},y=function(){e.shortcuts.add("meta+a",null,"SelectAll")},b=function(){e.on("keydown",function(e){if(!v(e)&&e.keyCode===i&&u.isCollapsed()&&0===u.getRng().startOffset){var t=u.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})},C=function(){e.inline||(e.contentStyles.push("body {min-height: 150px}"),e.on("click",function(t){var n;if("HTML"===t.target.nodeName){if(me.ie>11)return void e.getBody().focus();n=e.selection.getRng(),e.getBody().focus(),e.selection.setRng(n),e.selection.normalize(),e.nodeChanged()}}))};return e.on("keydown",function(t){var n,r,o,i,a;if(!v(t)&&t.keyCode===Mp.BACKSPACE&&(r=(n=u.getRng()).startContainer,o=n.startOffset,i=s.getRoot(),a=r,n.collapsed&&0===o)){for(;a&&a.parentNode&&a.parentNode.firstChild===a&&a.parentNode!==i;)a=a.parentNode;"BLOCKQUOTE"===a.tagName&&(e.formatter.toggle("blockquote",null,a),(n=s.createRng()).setStart(r,0),n.setEnd(r,0),u.setRng(n))}}),t=function(e){var t=s.create("body"),n=e.cloneContents();return t.appendChild(n),u.serializer.serialize(t,{format:"html"})},e.on("keydown",function(n){var r,o,u,c,l,f=n.keyCode;if(!v(n)&&(f===a||f===i)){if(r=e.selection.isCollapsed(),o=e.getBody(),r&&!s.isEmpty(o))return;if(!r&&(u=e.selection.getRng(),c=t(u),(l=s.createRng()).selectNode(e.getBody()),c!==t(l)))return;n.preventDefault(),e.setContent(""),o.firstChild&&s.isBlock(o.firstChild)?e.selection.setCursorLocation(o.firstChild,0):e.selection.setCursorLocation(o,0),e.nodeChanged()}}),me.windowsPhone||e.on("keyup focusin mouseup",function(e){Mp.modifierPressed(e)||u.normalize()},!0),m&&(e.settings.content_editable||s.bind(e.getDoc(),"mousedown mouseup",function(t){var n;if(t.target===e.getDoc().documentElement)if(n=u.getRng(),e.getBody().focus(),"mousedown"===t.type){if(mi.isCaretContainer(n.startContainer))return;u.placeCaretAt(t.clientX,t.clientY)}else u.setRng(n)}),e.on("click",function(t){var n=t.target;/^(IMG|HR)$/.test(n.nodeName)&&"false"!==s.getContentEditableParent(n)&&(t.preventDefault(),e.selection.select(n),e.nodeChanged()),"A"===n.nodeName&&s.hasClass(n,"mce-item-anchor")&&(t.preventDefault(),u.select(n))}),c.forced_root_block&&e.on("init",function(){h("DefaultParagraphSeparator",c.forced_root_block)}),e.on("init",function(){e.dom.bind(e.getBody(),"submit",function(e){e.preventDefault()})}),b(),l.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()}),me.iOS?(e.inline||e.on("keydown",function(){document.activeElement===document.body&&e.getWin().focus()}),C(),e.on("click",function(e){var t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)}),e.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")):y()),me.ie>=11&&(C(),b()),me.ie&&(y(),h("AutoUrlDetect",!1),e.on("dragstart",function(t){var n,r,o;(n=t).dataTransfer&&(e.selection.isCollapsed()&&"IMG"===n.target.tagName&&u.select(n.target),(r=e.selection.getContent()).length>0&&(o=p+escape(e.id)+","+escape(r),n.dataTransfer.setData(g,o)))}),e.on("drop",function(t){if(!v(t)){var n=(a=t).dataTransfer&&(s=a.dataTransfer.getData(g))&&s.indexOf(p)>=0?(s=s.substr(p.length).split(","),{id:unescape(s[0]),html:unescape(s[1])}):null;if(n&&n.id!==e.id){t.preventDefault();var r=Ih(t.x,t.y,e.getDoc());u.setRng(r),o=n.html,i=!0,e.queryCommandSupported("mceInsertClipboardContent")?e.execCommand("mceInsertClipboardContent",!1,{content:o,internal:i}):e.execCommand("mceInsertContent",!1,o)}}var o,i,a,s})),f&&(e.on("keydown",function(t){if(!v(t)&&t.keyCode===i){if(!e.getBody().getElementsByTagName("hr").length)return;if(u.isCollapsed()&&0===u.getRng().startOffset){var n=u.getNode(),r=n.previousSibling;if("HR"===n.nodeName)return s.remove(n),void t.preventDefault();r&&r.nodeName&&"hr"===r.nodeName.toLowerCase()&&(s.remove(r),t.preventDefault())}}}),Range.prototype.getClientRects||e.on("mousedown",function(t){if(!v(t)&&"HTML"===t.target.nodeName){var n=e.getBody();n.blur(),ye.setEditorTimeout(e,function(){n.focus()})}}),n=function(){var t=s.getAttribs(u.getStart().cloneNode(!1));return function(){var n=u.getStart();n!==e.getBody()&&(s.setAttrib(n,"style",null),o(t,function(e){n.setAttributeNode(e.cloneNode(!0))}))}},r=function(){return!u.isCollapsed()&&s.getParent(u.getStart(),s.isBlock)!==s.getParent(u.getEnd(),s.isBlock)},e.on("keypress",function(t){var o;if(!v(t)&&(8===t.keyCode||46===t.keyCode)&&r())return o=n(),e.getDoc().execCommand("delete",!1,null),o(),t.preventDefault(),!1}),s.bind(e.getDoc(),"cut",function(t){var o;!v(t)&&r()&&(o=n(),ye.setEditorTimeout(e,function(){o()}))}),c.readonly||e.on("BeforeExecCommand MouseDown",function(){h("StyleWithCSS",!1),h("enableInlineTableEditing",!1),c.object_resizing||h("enableObjectResizing",!1)}),e.on("SetContent ExecCommand",function(e){"setcontent"!==e.type&&"mceInsertLink"!==e.command||o(s.select("a"),function(e){var t=e.parentNode,n=s.getRoot();if(t.lastChild===e){for(;t&&!s.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}s.add(t,"br",{"data-mce-bogus":1})}})}),e.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"),me.mac&&e.on("keydown",function(t){!Mp.metaKeyPressed(t)||t.shiftKey||37!==t.keyCode&&39!==t.keyCode||(t.preventDefault(),e.selection.getSel().modify("move",37===t.keyCode?"backward":"forward","lineboundary"))}),b()),{refreshContentEditable:function(){},isHidden:function(){var t;return!f||e.removed?0:!(t=e.selection.getSel())||!t.rangeCount||0===t.rangeCount}}},Uy=Xo.DOM,Vy=function(e){var t;e.bindPendingEventDelegates(),e.initialized=!0,e.fire("init"),e.focus(!0),e.nodeChanged({initial:!0}),e.execCallback("init_instance_callback",e),(t=e).settings.auto_focus&&ye.setEditorTimeout(t,function(){var e;(e=!0===t.settings.auto_focus?t:t.editorManager.get(t.settings.auto_focus)).destroyed||e.focus()},100)},Hy=function(e,t){var n,r,o,i,a,s,u,c,l,f=e.settings,d=e.getElement(),m=e.getDoc();f.inline||(e.getElement().style.visibility=e.orgVisibility),t||f.content_editable||(m.open(),m.write(e.iframeHTML),m.close()),f.content_editable&&(e.on("remove",function(){var e=this.getBody();Uy.removeClass(e,"mce-content-body"),Uy.removeClass(e,"mce-edit-focus"),Uy.setAttrib(e,"contentEditable",null)}),Uy.addClass(d,"mce-content-body"),e.contentDocument=m=f.content_document||document,e.contentWindow=f.content_window||window,e.bodyElement=d,f.content_document=f.content_window=null,f.root_name=d.nodeName.toLowerCase()),(n=e.getBody()).disabled=!0,e.readonly=f.readonly,e.readonly||(e.inline&&"static"===Uy.getStyle(n,"position",!0)&&(n.style.position="relative"),n.contentEditable=e.getParam("content_editable_state",!0)),n.disabled=!1,e.editorUpload=Jm(e),e.schema=Fo(f),e.dom=new Xo(m,{keep_values:!0,url_converter:e.convertURL,url_converter_scope:e,hex_colors:f.force_hex_style_colors,class_filter:f.class_filter,update_styles:!0,root_element:e.inline?e.getBody():null,collect:f.content_editable,schema:e.schema,onSetAttrib:function(t){e.fire("SetAttrib",t)}}),e.parser=((i=bh((o=e).settings,o.schema)).addAttributeFilter("src,href,style,tabindex",function(e,t){for(var n,r,i,a=e.length,s=o.dom;a--;)if(r=(n=e[a]).attr(t),i="data-mce-"+t,!n.attributes.map[i]){if(0===r.indexOf("data:")||0===r.indexOf("blob:"))continue;"style"===t?((r=s.serializeStyle(s.parseStyle(r),n.name)).length||(r=null),n.attr(i,r),n.attr(t,r)):"tabindex"===t?(n.attr(i,r),n.attr(t,null)):n.attr(i,o.convertURL(r,t,n.name))}}),i.addNodeFilter("script",function(e){for(var t,n,r=e.length;r--;)0!==(n=(t=e[r]).attr("type")||"no/type").indexOf("mce-")&&t.attr("type","mce-"+n)}),i.addNodeFilter("#cdata",function(e){for(var t,n=e.length;n--;)(t=e[n]).type=8,t.name="#comment",t.value="[CDATA["+t.value+"]]"}),i.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t,n=e.length,r=o.schema.getNonEmptyElements();n--;)(t=e[n]).isEmpty(r)&&0===t.getAll("br").length&&(t.append(new fh("br",1)).shortEnded=!0)}),i),e.serializer=Nh(f,e),e.selection=vv(e.dom,e.getWin(),e.serializer,e),e.formatter=Yg(e),e.undoManager=rg(e),e._nodeChangeDispatcher=new tp(e),e._selectionOverrides=Hp(e),kh(e),Fy(e),ep(e),e.fire("PreInit"),f.browser_spellcheck||f.gecko_spellcheck||(m.body.spellcheck=!1,Uy.setAttrib(n,"spellcheck","false")),e.quirks=zy(e),e.fire("PostRender"),f.directionality&&(n.dir=f.directionality),f.nowrap&&(n.style.whiteSpace="nowrap"),f.protect&&e.on("BeforeSetContent",function(e){Ot.each(f.protect,function(t){e.content=e.content.replace(t,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})})}),e.on("SetContent",function(){e.addVisual(e.getBody())}),f.padd_empty_editor&&e.on("PostProcess",function(e){e.content=e.content.replace(/^(<p[^>]*>( | |\s|\u00a0|<br \/>|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")}),e.load({initial:!0,format:"html"}),e.startContent=e.getContent({format:"raw"}),e.on("compositionstart compositionend",function(t){e.composing="compositionstart"===t.type}),e.contentStyles.length>0&&(r="",Ot.each(e.contentStyles,function(e){r+=e+"\r\n"}),e.dom.addStyle(r)),(a=e,a.inline?Uy.styleSheetLoader:a.dom.styleSheetLoader).loadAll(e.contentCSS,function(t){Vy(e)},function(t){Vy(e)}),f.content_style&&(s=e,u=f.content_style,c=Hn.fromDom(s.getDoc().head),l=Hn.fromTag("style"),dr.set(l,"type","text/css"),ks.append(l,Hn.fromText(u)),ks.append(c,l))},qy=Xo.DOM,jy=function(e,t){var n,r,o,i,a,s,u,c=e.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),l=(n=e.id,r=c,o=t.height,i=Vv(e),u=Hn.fromTag("iframe"),dr.setAll(u,i),dr.setAll(u,{id:n+"_ifr",frameBorder:"0",allowTransparency:"true",title:r}),br(u,{width:"100%",height:(a=o,s="number"==typeof a?a+"px":a,s||""),display:"block"}),u).dom();l.onload=function(){l.onload=null,e.fire("load")};var f,d,m,p,g=function(e,t){if(document.domain!==window.location.hostname&&me.ie&&me.ie<12){var n=Gm("mce");e[n]=function(){Hy(e)};var r='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+e.id+'");document.write(ed.iframeHTML);document.close();ed.'+n+"(true);})()";return qy.setAttrib(t,"src",r),!0}return!1}(e,l);return e.contentAreaContainer=t.iframeContainer,e.iframeElement=l,e.iframeHTML=(p=Hv(f=e)+"<html><head>",qv(f)!==f.documentBaseUrl&&(p+='<base href="'+f.documentBaseURI.getURI()+'" />'),p+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />',d=jv(f),m=$v(f),Wv(f)&&(p+='<meta http-equiv="Content-Security-Policy" content="'+Wv(f)+'" />'),p+='</head><body id="'+d+'" class="mce-content-body '+m+'" data-id="'+f.id+'"><br></body></html>'),qy.add(t.iframeContainer,l),g},$y=function(e,t){var n=jy(e,t);t.editorContainer&&(qy.get(t.editorContainer).style.display=e.orgDisplay,e.hidden=qy.isHidden(t.editorContainer)),e.getElement().style.display="none",qy.setAttrib(e.id,"aria-hidden",!0),n||Hy(e)},Wy=Xo.DOM,Ky=function(e,t,n){var r,o,i=Im.get(n);if(r=Im.urls[n]||e.documentBaseUrl.replace(/\/$/,""),n=Ot.trim(n),i&&-1===Ot.inArray(t,n)){if(Ot.each(Im.dependencies(n),function(n){Ky(e,t,n)}),e.plugins[n])return;o=new i(e,r,e.$),e.plugins[n]=o,o.init&&(o.init(e,r),t.push(n))}},Xy=function(e){return e.replace(/^\-/,"")},Yy=function(e){return{editorContainer:e,iframeContainer:e}},Gy=function(e){var t,n,r=e.getElement();return e.inline?Yy(null):(t=r,n=Wy.create("div"),Wy.insertAfter(n,t),Yy(n))},Jy=function(e){var t,n,r,o,i,a,s,u,c,l,f,d=e.settings,m=e.getElement();return e.orgDisplay=m.style.display,tr.isString(d.theme)?(l=(o=e).settings,f=o.getElement(),i=l.width||Wy.getStyle(f,"width")||"100%",a=l.height||Wy.getStyle(f,"height")||f.offsetHeight,s=l.min_height||100,(u=/^[0-9\.]+(|px)$/i).test(""+i)&&(i=Math.max(parseInt(i,10),100)),u.test(""+a)&&(a=Math.max(parseInt(a,10),s)),c=o.theme.renderUI({targetNode:f,width:i,height:a,deltaWidth:l.delta_width,deltaHeight:l.delta_height}),l.content_editable||(a=(c.iframeHeight||a)+("number"==typeof a?c.deltaHeight||0:""))<s&&(a=s),c.height=a,c):tr.isFunction(d.theme)?(r=(t=e).getElement(),(n=t.settings.theme(t,r)).editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||t.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||t.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:r.offsetHeight,n):Gy(e)},Qy=function(e){var t,n,r,o,i,a,s=e.settings,u=e.getElement();return e.rtl=s.rtl_ui||e.editorManager.i18n.rtl,e.editorManager.i18n.setCode(s.language),s.aria_label=s.aria_label||Wy.getAttrib(u,"aria-label",e.getLang("aria.rich_text_area")),e.fire("ScriptsLoaded"),o=(n=e).settings.theme,tr.isString(o)?(n.settings.theme=Xy(o),r=Lm.get(o),n.theme=new r(n,Lm.urls[o]),n.theme.init&&n.theme.init(n,Lm.urls[o]||n.documentBaseUrl.replace(/\/$/,""),n.$)):n.theme={},i=e,a=[],Ot.each(i.settings.plugins.split(/[ ,]/),function(e){Ky(i,a,Xy(e))}),t=Jy(e),e.editorContainer=t.editorContainer?t.editorContainer:null,s.content_css&&Ot.each(Ot.explode(s.content_css),function(t){e.contentCSS.push(e.documentBaseURI.toAbsolute(t))}),s.content_editable?Hy(e):$y(e,t)},Zy=Xo.DOM,eb=function(e){return"-"===e.charAt(0)},tb=function(e,t){var n=Zo.ScriptLoader;!function(e,t,n,r){var o=t.settings,i=o.theme;if(tr.isString(i)){if(!eb(i)&&!Lm.urls.hasOwnProperty(i)){var a=o.theme_url;a?Lm.load(i,t.documentBaseURI.toAbsolute(a)):Lm.load(i,"themes/"+i+"/theme"+n+".js")}e.loadQueue(function(){Lm.waitFor(i,r)})}else r()}(n,e,t,function(){var r,o,i,a,s;r=n,(i=(o=e).settings).language&&"en"!==i.language&&!i.language_url&&(i.language_url=o.editorManager.baseURL+"/langs/"+i.language+".js"),i.language_url&&!o.editorManager.i18n.data[i.language]&&r.add(i.language_url),a=e.settings,s=t,Ot.isArray(a.plugins)&&(a.plugins=a.plugins.join(" ")),Ot.each(a.external_plugins,function(e,t){Im.load(t,e),a.plugins+=" "+t}),Ot.each(a.plugins.split(/[ ,]/),function(e){if((e=Ot.trim(e))&&!Im.urls[e])if(eb(e)){e=e.substr(1,e.length);var t=Im.dependencies(e);Ot.each(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+s+".js"};e=Im.createUrl(t,e),Im.load(e.resource,e)})}else Im.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+s+".js"})}),n.loadQueue(function(){e.removed||Qy(e)},e,function(t){Rm(e,t[0]),e.removed||Qy(e)})})},nb=function(e){var t=e.settings,n=e.id,r=function(){Zy.unbind(window,"ready",r),e.render()};if(Te.Event.domLoaded){if(e.getElement()&&me.contentEditable){t.inline?e.inline=!0:(e.orgVisibility=e.getElement().style.visibility,e.getElement().style.visibility="hidden");var o=e.getElement().form||Zy.getParent(n,"form");o&&(e.formElement=o,t.hidden_input&&!/TEXTAREA|INPUT/i.test(e.getElement().nodeName)&&(Zy.insertAfter(Zy.create("input",{type:"hidden",name:n}),n),e.hasHiddenInput=!0),e.formEventDelegate=function(t){e.fire(t.type,t)},Zy.bind(o,"submit reset",e.formEventDelegate),e.on("reset",function(){e.setContent(e.startContent,{format:"raw"})}),!t.submit_patch||o.submit.nodeType||o.submit.length||o._mceOldSubmit||(o._mceOldSubmit=o.submit,o.submit=function(){return e.editorManager.triggerSave(),e.setDirty(!1),o._mceOldSubmit(o)})),e.windowManager=km(e),e.notificationManager=Sm(e),"xml"===t.encoding&&e.on("GetContent",function(e){e.save&&(e.content=Zy.encode(e.content))}),t.add_form_submit_trigger&&e.on("submit",function(){e.initialized&&e.save()}),t.add_unload_trigger&&(e._beforeUnload=function(){!e.initialized||e.destroyed||e.isHidden()||e.save({format:"raw",no_events:!0,set_dirty:!1})},e.editorManager.on("BeforeUnload",e._beforeUnload)),e.editorManager.add(e),tb(e,e.suffix)}}else Zy.bind(window,"ready",r)},rb=function(e,t,n){var r=e.sidebars?e.sidebars:[];r.push({name:t,settings:n}),e.sidebars=r},ob=Ot.each,ib=Ot.trim,ab="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),sb={ftp:21,http:80,https:443,mailto:25},ub=function(e,t){var n,r,o=this;if(e=ib(e),n=(t=o.settings=t||{}).base_uri,/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e))o.source=e;else{var i=0===e.indexOf("//");0!==e.indexOf("/")||i||(e=(n&&n.protocol||"http")+"://mce_host"+e),/^[\w\-]*:?\/\//.test(e)||(r=t.base_uri?t.base_uri.path:new ub(document.location.href).directory,""==t.base_uri.protocol?e="//mce_host"+o.toAbsPath(r,e):(e=/([^#?]*)([#?]?.*)/.exec(e),e=(n&&n.protocol||"http")+"://mce_host"+o.toAbsPath(r,e[1])+e[2])),e=e.replace(/@@/g,"(mce_at)"),e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e),ob(ab,function(t,n){var r=e[n];r&&(r=r.replace(/\(mce_at\)/g,"@@")),o[t]=r}),n&&(o.protocol||(o.protocol=n.protocol),o.userInfo||(o.userInfo=n.userInfo),o.port||"mce_host"!==o.host||(o.port=n.port),o.host&&"mce_host"!==o.host||(o.host=n.host),o.source=""),i&&(o.protocol="")}};ub.prototype={setPath:function(e){e=/^(.*?)\/?(\w+)?$/.exec(e),this.path=e[0],this.directory=e[1],this.file=e[2],this.source="",this.getURI()},toRelative:function(e){var t;if("./"===e)return e;if("mce_host"!==(e=new ub(e,{base_uri:this})).host&&this.host!==e.host&&e.host||this.port!==e.port||this.protocol!==e.protocol&&""!==e.protocol)return e.getURI();var n=this.getURI(),r=e.getURI();return n===r||"/"===n.charAt(n.length-1)&&n.substr(0,n.length-1)===r?n:(t=this.toRelPath(this.path,e.path),e.query&&(t+="?"+e.query),e.anchor&&(t+="#"+e.anchor),t)},toAbsolute:function(e,t){return(e=new ub(e,{base_uri:this})).getURI(t&&this.isSameOrigin(e))},isSameOrigin:function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=sb[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},toRelPath:function(e,t){var n,r,o,i=0,a="";if(e=(e=e.substring(0,e.lastIndexOf("/"))).split("/"),n=t.split("/"),e.length>=n.length)for(r=0,o=e.length;r<o;r++)if(r>=n.length||e[r]!==n[r]){i=r+1;break}if(e.length<n.length)for(r=0,o=n.length;r<o;r++)if(r>=e.length||e[r]!==n[r]){i=r+1;break}if(1===i)return t;for(r=0,o=e.length-(i-1);r<o;r++)a+="../";for(r=i-1,o=n.length;r<o;r++)a+=r!==i-1?"/"+n[r]:n[r];return a},toAbsPath:function(e,t){var n,r,o,i=0,a=[];for(r=/\/$/.test(t)?"/":"",e=e.split("/"),t=t.split("/"),ob(e,function(e){e&&a.push(e)}),e=a,n=t.length-1,a=[];n>=0;n--)0!==t[n].length&&"."!==t[n]&&(".."!==t[n]?i>0?i--:a.push(t[n]):i++);return 0!==(o=(n=e.length-i)<=0?a.reverse().join("/"):e.slice(0,n).join("/")+"/"+a.reverse().join("/")).indexOf("/")&&(o="/"+o),r&&o.lastIndexOf("/")!==o.length-1&&(o+=r),o},getURI:function(e){var t,n=this;return n.source&&!e||(t="",e||(n.protocol?t+=n.protocol+"://":t+="//",n.userInfo&&(t+=n.userInfo+"@"),n.host&&(t+=n.host),n.port&&(t+=":"+n.port)),n.path&&(t+=n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),n.source=t),n.source}},ub.parseDataUri=function(e){var t,n;return e=decodeURIComponent(e).split(","),(n=/data:([^;]+)/.exec(e[0]))&&(t=n[1]),{type:t,data:e[1]}},ub.getDocumentBaseUrl=function(e){var t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t};var cb=Xo.DOM,lb=Ot.extend,fb=Ot.each,db=Ot.trim,mb=Ot.resolve,pb=me.ie,gb=function(e,t,n){var r,o,i,a,s,u,c,l,f,d=this;r=d.documentBaseUrl=n.documentBaseURL,o=n.baseURI,i=d,a=e,s=r,u=n.defaultSettings,c=t,f={id:a,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:s,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"<!DOCTYPE html>",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:(l=i).convertURL,url_converter_scope:l,ie7_compat:!0},t=lu(ou,f,u,c),d.settings=t,ti.language=t.language||"en",ti.languageLoad=t.language_load,ti.baseURL=n.baseURL,d.id=e,d.setDirty(!1),d.plugins={},d.documentBaseURI=new ub(t.document_base_url,{base_uri:o}),d.baseURI=o,d.contentCSS=[],d.contentStyles=[],d.shortcuts=new Jd(d),d.loadedCSS={},d.editorCommands=new Od(d),d.suffix=n.suffix,d.editorManager=n,d.inline=t.inline,d.buttons={},d.menuItems={},t.cache_suffix&&(me.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),!1===t.override_viewport&&(me.overrideViewPort=!1),n.fire("SetupEditor",d),d.execCallback("setup",d),d.$=Qt.overrideDefaults(function(){return{context:d.inline?d.getBody():d.getDoc(),element:d.getBody()}})};lb(gb.prototype={render:function(){nb(this)},focus:function(e){gm(this,e)},execCallback:function(e){var t,n=this.settings[e];if(n)return this.callbackLookup&&(t=this.callbackLookup[e])&&(n=t.func,t=t.scope),"string"==typeof n&&(t=(t=n.replace(/\.\w+$/,""))?mb(t):0,n=mb(n),this.callbackLookup=this.callbackLookup||{},this.callbackLookup[e]={func:n,scope:t}),n.apply(t||this,Array.prototype.slice.call(arguments,1))},translate:function(e){if(e&&Ot.is(e,"string")){var t=this.settings.language||"en",n=this.editorManager.i18n;e=n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"})}return this.editorManager.translate(e)},getLang:function(e,t){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(t!==undefined?t:"{#"+e+"}")},getParam:function(e,t,n){return mu(this,e,t,n)},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.stateSelector&&"undefined"==typeof t.active&&(t.active=!1),t.text||t.icon||(t.icon=e),n.buttons=n.buttons,t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addSidebar:function(e,t){return rb(this,e,t)},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems,n.menuItems[e]=t},addContextToolbar:function(e,t){var n,r=this;r.contextToolbars=r.contextToolbars||[],"string"==typeof e&&(n=e,e=function(e){return r.dom.is(e,n)}),r.contextToolbars.push({id:Gm("mcet"),predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){this.hidden&&(this.hidden=!1,this.inline?this.getBody().contentEditable=!0:(cb.show(this.getContainer()),cb.hide(this.id)),this.load(),this.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(pb&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(cb.hide(e.getContainer()),cb.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var t,n=this.getElement();return this.removed?"":n?((e=e||{}).load=!0,t=this.setContent(n.value!==undefined?n.value:n.innerHTML,e),e.element=n,e.no_events||this.fire("LoadContent",e),e.element=n=null,t):void 0},save:function(e){var t,n,r=this,o=r.getElement();if(o&&r.initialized&&!r.removed)return(e=e||{}).save=!0,e.element=o,e.content=r.getContent(e),e.no_events||r.fire("SaveContent",e),"raw"===e.format&&r.fire("RawSaveContent",e),t=e.content,/TEXTAREA|INPUT/i.test(o.nodeName)?o.value=t:(r.inline||(o.innerHTML=t),(n=cb.getParent(r.id,"form"))&&fb(n.elements,function(e){if(e.name===r.id)return e.value=t,!1})),e.element=o=null,!1!==e.set_dirty&&r.setDirty(!1),t},setContent:function(e,t){var n,r,o=this,i=o.getBody();return(t=t||{}).format=t.format||"html",t.set=!0,t.content=e,t.no_events||o.fire("BeforeSetContent",t),0===(e=t.content).length||/^\s+$/.test(e)?(r=pb&&pb<11?"":'<br data-mce-bogus="1">',"TABLE"===i.nodeName?e="<tr><td>"+r+"</td></tr>":/^(UL|OL)$/.test(i.nodeName)&&(e="<li>"+r+"</li>"),(n=o.settings.forced_root_block)&&o.schema.isValidChild(i.nodeName.toLowerCase(),n.toLowerCase())?(e=r,e=o.dom.createHTML(n,o.settings.forced_root_block_attrs,e)):pb||e||(e='<br data-mce-bogus="1">'),o.dom.setHTML(i,e),o.fire("SetContent",t)):("raw"!==t.format&&(e=zs({validate:o.validate},o.schema).serialize(o.parser.parse(e,{isRootContent:!0,insert:!0}))),t.content=db(e),o.dom.setHTML(i,t.content),t.no_events||o.fire("SetContent",t)),t.content},getContent:function(e){var t,n=this.getBody();if(this.removed)return"";if((e=e||{}).format=e.format||"html",e.get=!0,e.getInner=!0,e.no_events||this.fire("BeforeGetContent",e),"raw"===e.format)t=Ot.trim(om(this.serializer,n.innerHTML));else if("text"===e.format)t=n.innerText||n.textContent;else{if("tree"===e.format)return this.serializer.serialize(n,e);t=this.serializer.serialize(n,e)}return"text"!==e.format?e.content=db(t):e.content=t,e.no_events||this.fire("GetContent",e),e.content},insertContent:function(e,t){t&&(e=lb({content:e},t)),this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},setDirty:function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.fire("dirty")},setMode:function(e){Wd(this,e)},getContainer:function(){return this.container||(this.container=cb.get(this.editorContainer||this.id+"_parent")),this.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=cb.get(this.id)),this.targetElm},getWin:function(){var e;return this.contentWindow||(e=this.iframeElement)&&(this.contentWindow=e.contentWindow),this.contentWindow},getDoc:function(){var e;return this.contentDocument||(e=this.getWin())&&(this.contentDocument=e.document),this.contentDocument},getBody:function(){var e=this.getDoc();return this.bodyElement||(e?e.body:null)},convertURL:function(e,t,n){var r=this.settings;return r.urlconverter_callback?this.execCallback("urlconverter_callback",e,n,!0,t):!r.convert_urls||n&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length?e:r.relative_urls?this.documentBaseURI.toRelative(e):e=this.documentBaseURI.toAbsolute(e,r.remove_script_host)},addVisual:function(e){var t,n=this,r=n.settings,o=n.dom;e=e||n.getBody(),n.hasVisual===undefined&&(n.hasVisual=r.visual),fb(o.select("table,a",e),function(e){var i;switch(e.nodeName){case"TABLE":return t=r.visual_table_class||"mce-item-table",void((i=o.getAttrib(e,"border"))&&"0"!==i||!n.hasVisual?o.removeClass(e,t):o.addClass(e,t));case"A":return void(o.getAttrib(e,"href",!1)||(i=o.getAttrib(e,"name")||e.id,t=r.visual_anchor_class||"mce-item-anchor",i&&n.hasVisual?o.addClass(e,t):o.removeClass(e,t)))}}),n.fire("VisualAid",{element:e,hasVisual:n.hasVisual})},remove:function(){var e=this;e.removed||(e.save(),e.removed=1,e.unbindAllNativeEvents(),e.hasHiddenInput&&cb.remove(e.getElement().nextSibling),e.inline||(pb&&pb<10&&e.getDoc().execCommand("SelectAll",!1,null),cb.setStyle(e.id,"display",e.orgDisplay),e.getBody().onload=null),e.fire("remove"),e.editorManager.remove(e),cb.remove(e.getContainer()),e._selectionOverrides.destroy(),e.editorUpload.destroy(),e.destroy())},destroy:function(e){var t,n=this;n.destroyed||(e||n.removed?(e||(n.editorManager.off("beforeunload",n._beforeUnload),n.theme&&n.theme.destroy&&n.theme.destroy(),n.selection.destroy(),n.dom.destroy()),(t=n.formElement)&&(t._mceOldSubmit&&(t.submit=t._mceOldSubmit,t._mceOldSubmit=null),cb.unbind(t,"submit reset",n.formEventDelegate)),n.contentAreaContainer=n.formElement=n.container=n.editorContainer=null,n.bodyElement=n.contentDocument=n.contentWindow=null,n.iframeElement=n.targetElm=null,n.selection&&(n.selection=n.selection.win=n.selection.dom=n.selection.dom.doc=null),n.destroyed=1):n.remove())},uploadImages:function(e){return this.editorUpload.uploadImages(e)},_scanForImages:function(){return this.editorUpload.scanForImages()}},qd);var hb,vb,yb,bb={isEditorUIElement:function(e){return-1!==e.className.toString().indexOf("mce-")}},Cb=function(e,t){var n,r,o=Un.detect().browser;o.isIE()||o.isEdge()?(r=e).on("focusout",function(){Sd(r)}):(n=t,e.on("mouseup touchend",function(e){n.throttle()})),e.on("keyup nodechange",function(t){var n;"nodechange"===(n=t).type&&n.selectionChange||Sd(e)})},xb=function(e){var t,n,r,o=Tp(function(){Sd(e)},0);e.inline&&(t=e,n=o,r=function(){n.throttle()},Xo.DOM.bind(document,"mouseup",r),t.on("remove",function(){Xo.DOM.unbind(document,"mouseup",r)})),e.on("init",function(){Cb(e,o)}),e.on("remove",function(){o.cancel()})},wb=Xo.DOM,Nb=function(e){return bb.isEditorUIElement(e)},Eb=function(e,t){var n=e?e.settings.custom_ui_selector:"";return null!==wb.getParent(t,function(t){return Nb(t)||!!n&&e.dom.is(t,n)})},Sb=function(e,t){var n=t.editor;xb(n),n.on("focusin",function(){var t=e.focusedEditor;t!==this&&(t&&t.fire("blur",{focusedEditor:this}),e.setActive(this),e.focusedEditor=this,this.fire("focus",{blurredEditor:t}),this.focus(!0))}),n.on("focusout",function(){var t=this;ye.setEditorTimeout(t,function(){var n=e.focusedEditor;Eb(t,function(){try{return document.activeElement}catch(e){return document.body}}())||n!==t||(t.fire("blur",{focusedEditor:null}),e.focusedEditor=null)})}),hb||(hb=function(t){var n,r=e.activeEditor;n=t.target,r&&n.ownerDocument===document&&(n===document.body||Eb(r,n)||e.focusedEditor!==r||(r.fire("blur",{focusedEditor:null}),e.focusedEditor=null))},wb.bind(document,"focusin",hb))},kb=function(e,t){e.focusedEditor===t.editor&&(e.focusedEditor=null),e.activeEditor||(wb.unbind(document,"focusin",hb),hb=null)},Tb=function(e){e.on("AddEditor",y.curry(Sb,e)),e.on("RemoveEditor",y.curry(kb,e))},Ab={},_b="en",Bb={setCode:function(e){e&&(_b=e,this.rtl=!!this.data[e]&&"rtl"===this.data[e]._dir)},getCode:function(){return _b},rtl:!1,add:function(e,t){var n=Ab[e];for(var r in n||(Ab[e]=n={}),t)n[r]=t[r];this.setCode(e)},translate:function(e){var t=Ab[_b]||{},n=function(e){return Ot.is(e,"function")?Object.prototype.toString.call(e):r(e)?"":""+e},r=function(e){return""===e||null===e||Ot.is(e,"undefined")},o=function(e){return e=n(e),Ot.hasOwn(t,e)?n(t[e]):e};if(r(e))return"";if(Ot.is(e,"object")&&Ot.hasOwn(e,"raw"))return n(e.raw);if(Ot.is(e,"array")){var i=e.slice(1);e=o(e[0]).replace(/\{([0-9]+)\}/g,function(e,t){return Ot.hasOwn(i,t)?n(i[t]):e})}return o(e).replace(/{context:\w+}$/,"")},data:Ab},Rb=Xo.DOM,Db=Ot.explode,Ob=Ot.each,Pb=Ot.extend,Ib=0,Lb=!1,Mb=[],Fb=[],zb=function(e){Ob(yb.get(),function(t){"scroll"===e.type?t.fire("ScrollWindow",e):t.fire("ResizeWindow",e)})},Ub=function(e){e!==Lb&&(e?Qt(window).on("resize scroll",zb):Qt(window).off("resize scroll",zb),Lb=e)},Vb=function(e){var t=Fb;delete Mb[e.id];for(var n=0;n<Mb.length;n++)if(Mb[n]===e){Mb.splice(n,1);break}return Fb=M.filter(Fb,function(t){return e!==t}),yb.activeEditor===e&&(yb.activeEditor=Fb.length>0?Fb[0]:null),yb.focusedEditor===e&&(yb.focusedEditor=null),t.length!==Fb.length};Pb(yb={defaultSettings:{},$:Qt,majorVersion:"4",minorVersion:"7.5",releaseDate:"2018-01-22",editors:Mb,i18n:Bb,activeEditor:null,settings:{},setup:function(){var e,t,n,r,o="";if(t=ub.getDocumentBaseUrl(document.location),/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),n=window.tinymce||window.tinyMCEPreInit)e=n.base||n.baseURL,o=n.suffix;else{for(var i=document.getElementsByTagName("script"),a=0;a<i.length;a++){var s=(r=i[a].src).substring(r.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(r)){-1!==s.indexOf(".min")&&(o=".min"),e=r.substring(0,r.lastIndexOf("/"));break}}!e&&document.currentScript&&(-1!==(r=document.currentScript.src).indexOf(".min")&&(o=".min"),e=r.substring(0,r.lastIndexOf("/")))}this.baseURL=new ub(t).toAbsolute(e),this.documentBaseURL=t,this.baseURI=new ub(this.baseURL),this.suffix=o,Tb(this)},overrideDefaults:function(e){var t,n;(t=e.base_url)&&(this.baseURL=new ub(this.documentBaseURL).toAbsolute(t.replace(/\/+$/,"")),this.baseURI=new ub(this.baseURL)),n=e.suffix,e.suffix&&(this.suffix=n),this.defaultSettings=e;var r=e.plugin_base_urls;for(var o in r)ti.PluginManager.urls[o]=r[o]},init:function(e){var t,n,r=this;n=Ot.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var o=function(e){var t=e.id;return t||(t=(t=e.name)&&!Rb.get(t)?e.name:Rb.uniqueId(),e.setAttribute("id",t)),t},i=function(e,t){return t.constructor===RegExp?t.test(e.className):Rb.hasClass(e,t)},a=function(e){t=e},s=function(){var t,u=0,c=[],l=function(e,n,o){var i=new gb(e,n,r);c.push(i),i.on("init",function(){++u===t.length&&a(c)}),i.targetElm=i.targetElm||o,i.render()};Rb.unbind(window,"ready",s),function(t){var n=e[t];n&&n.apply(r,Array.prototype.slice.call(arguments,2))}("onpageload"),t=Qt.unique(function(e){var t,n=[];if(me.ie&&me.ie<11)return Pm("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/"),[];if(e.types)return Ob(e.types,function(e){n=n.concat(Rb.select(e.selector))}),n;if(e.selector)return Rb.select(e.selector);if(e.target)return[e.target];switch(e.mode){case"exact":(t=e.elements||"").length>0&&Ob(Db(t),function(e){var t;(t=Rb.get(e))?n.push(t):Ob(document.forms,function(t){Ob(t.elements,function(t){t.name===e&&(e="mce_editor_"+Ib++,Rb.setAttrib(t,"id",e),n.push(t))})})});break;case"textareas":case"specific_textareas":Ob(Rb.select("textarea"),function(t){e.editor_deselector&&i(t,e.editor_deselector)||e.editor_selector&&!i(t,e.editor_selector)||n.push(t)})}return n}(e)),e.types?Ob(e.types,function(n){Ot.each(t,function(t){return!Rb.is(t,n.selector)||(l(o(t),Pb({},e,n),t),!1)})}):(Ot.each(t,function(e){var t;(t=r.get(e.id))&&t.initialized&&!(t.getContainer()||t.getBody()).parentNode&&(Vb(t),t.unbindAllNativeEvents(),t.destroy(!0),t.removed=!0,t=null)}),0===(t=Ot.grep(t,function(e){return!r.get(e.id)})).length?a([]):Ob(t,function(t){var r;r=t,e.inline&&r.tagName.toLowerCase()in n?Pm("Could not initialize inline editor on invalid inline target element",t):l(o(t),e,t)}))};return r.settings=e,Rb.bind(window,"ready",s),new pe(function(e){t?e(t):a=function(t){e(t)}})},get:function(e){return 0===arguments.length?Fb.slice(0):tr.isString(e)?M.find(Fb,function(t){return t.id===e}).getOr(null):tr.isNumber(e)&&Fb[e]?Fb[e]:null},add:function(e){var t=this;return Mb[e.id]===e?e:(null===t.get(e.id)&&("length"!==e.id&&(Mb[e.id]=e),Mb.push(e),Fb.push(e)),Ub(!0),t.activeEditor=e,t.fire("AddEditor",{editor:e}),vb||(vb=function(){t.fire("BeforeUnload")},Rb.bind(window,"beforeunload",vb)),e)},createEditor:function(e,t){return this.add(new gb(e,t,this))},remove:function(e){var t,n,r=this;if(e)return tr.isString(e)?(e=e.selector||e,void Ob(Rb.select(e),function(e){(n=r.get(e.id))&&r.remove(n)})):(n=e,tr.isNull(r.get(n.id))?null:(Vb(n)&&r.fire("RemoveEditor",{editor:n}),0===Fb.length&&Rb.unbind(window,"beforeunload",vb),n.remove(),Ub(Fb.length>0),n));for(t=Fb.length-1;t>=0;t--)r.remove(Fb[t])},execCommand:function(e,t,n){var r=this.get(n);switch(e){case"mceAddEditor":return this.get(n)||new gb(n,this.settings,this).render(),!0;case"mceRemoveEditor":return r&&r.remove(),!0;case"mceToggleEditor":return r?(r.isHidden()?r.show():r.hide(),!0):(this.execCommand("mceAddEditor",0,n),!0)}return!!this.activeEditor&&this.activeEditor.execCommand(e,t,n)},triggerSave:function(){Ob(Fb,function(e){e.save()})},addI18n:function(e,t){Bb.add(e,t)},translate:function(e){return Bb.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!==e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},Fd),yb.setup();var Hb,qb=yb;function jb(e){return{walk:function(t,n){return cg.walk(e,t,n)},split:sl.split,normalize:function(t){return Jf.normalize(e,t).fold(y.constant(!1),function(e){return t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0})}}}(Hb=jb||(jb={})).compareRanges=qf,Hb.getCaretRangeFromPoint=Ih,Hb.getSelectedNode=Fi,Hb.getNode=zi;var $b,Wb,Kb=jb,Xb=Math.min,Yb=Math.max,Gb=Math.round,Jb=function(e,t,n){var r,o,i,a,s,u;return r=t.x,o=t.y,i=e.w,a=e.h,s=t.w,u=t.h,"b"===(n=(n||"").split(""))[0]&&(o+=u),"r"===n[1]&&(r+=s),"c"===n[0]&&(o+=Gb(u/2)),"c"===n[1]&&(r+=Gb(s/2)),"b"===n[3]&&(o-=a),"r"===n[4]&&(r-=i),"c"===n[3]&&(o-=Gb(a/2)),"c"===n[4]&&(r-=Gb(i/2)),Qb(r,o,i,a)},Qb=function(e,t,n,r){return{x:e,y:t,w:n,h:r}},Zb={inflate:function(e,t,n){return Qb(e.x-t,e.y-n,e.w+2*t,e.h+2*n)},relativePosition:Jb,findBestRelativePosition:function(e,t,n,r){var o,i;for(i=0;i<r.length;i++)if((o=Jb(e,t,r[i])).x>=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n,r,o,i;return n=Yb(e.x,t.x),r=Yb(e.y,t.y),o=Xb(e.x+e.w,t.x+t.w),i=Xb(e.y+e.h,t.y+t.h),o-n<0||i-r<0?null:Qb(n,r,o-n,i-r)},clamp:function(e,t,n){var r,o,i,a,s,u,c,l,f,d;return s=e.x,u=e.y,c=e.x+e.w,l=e.y+e.h,f=t.x+t.w,d=t.y+t.h,r=Yb(0,t.x-s),o=Yb(0,t.y-u),i=Yb(0,c-f),a=Yb(0,l-d),s+=r,u+=o,n&&(c+=r,l+=o,s-=i,u-=a),Qb(s,u,(c-=i)-s,(l-=a)-u)},create:Qb,fromClientRect:function(e){return Qb(e.left,e.top,e.width,e.height)}},eC={},tC={add:function(e,t){eC[e.toLowerCase()]=t},has:function(e){return!!eC[e.toLowerCase()]},get:function(e){var t=e.toLowerCase(),n=eC.hasOwnProperty(t)?eC[t]:null;if(null===n)throw new Error("Could not find module for type: "+e);return n},create:function(e,t){var n;if("string"==typeof e?(t=t||{}).type=e:e=(t=e).type,e=e.toLowerCase(),!(n=eC[e]))throw new Error("Could not find control by type: "+e);return(n=new n(t)).type=e,n}},nC=Ot.each,rC=Ot.extend,oC=function(){};oC.extend=$b=function(e){var t,n,r,o=this.prototype,i=function(){var e,t,n;if(!Wb&&(this.init&&this.init.apply(this,arguments),t=this.Mixins))for(e=t.length;e--;)(n=t[e]).init&&n.init.apply(this,arguments)},a=function(){return this},s=function(e,t){return function(){var n,r=this._super;return this._super=o[e],n=t.apply(this,arguments),this._super=r,n}};for(n in Wb=!0,t=new this,Wb=!1,e.Mixins&&(nC(e.Mixins,function(t){for(var n in t)"init"!==n&&(e[n]=t[n])}),o.Mixins&&(e.Mixins=o.Mixins.concat(e.Mixins))),e.Methods&&nC(e.Methods.split(","),function(t){e[t]=a}),e.Properties&&nC(e.Properties.split(","),function(t){var n="_"+t;e[t]=function(e){return e!==undefined?(this[n]=e,this):this[n]}}),e.Statics&&nC(e.Statics,function(e,t){i[t]=e}),e.Defaults&&o.Defaults&&(e.Defaults=rC({},o.Defaults,e.Defaults)),e)"function"==typeof(r=e[n])&&o[n]?t[n]=s(n,r):t[n]=r;return i.prototype=t,i.constructor=i,i.extend=$b,i};var iC=Math.min,aC=Math.max,sC=Math.round,uC=function(e,t){var n,r,o,i;if(t=t||'"',null===e)return"null";if("string"==(o=typeof e))return r="\bb\tt\nn\ff\rr\"\"''\\\\",t+e.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,o){return'"'===t&&"'"===e?e:(n=r.indexOf(o))+1?"\\"+r.charAt(n+1):(e=o.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e)})+t;if("object"===o){if(e.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(e)){for(n=0,r="[";n<e.length;n++)r+=(n>0?",":"")+uC(e[n],t);return r+"]"}for(i in r="{",e)e.hasOwnProperty(i)&&(r+="function"!=typeof e[i]?(r.length>1?","+t:t)+i+t+":"+uC(e[i],t):"");return r+"}"}return""+e},cC={serialize:uC,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}},lC={callbacks:{},count:0,send:function(e){var t=this,n=Xo.DOM,r=e.count!==undefined?e.count:t.count,o="tinymce_jsonp_"+r;t.callbacks[r]=function(i){n.remove(o),delete t.callbacks[r],e.callback(i)},n.add(n.doc.body,"script",{id:o,src:e.url,type:"text/javascript"}),t.count++}},fC={send:function(e){var t,n=0,r=function(){!e.async||4===t.readyState||n++>1e4?(e.success&&n<1e4&&200===t.status?e.success.call(e.success_scope,""+t.responseText,t,e):e.error&&e.error.call(e.error_scope,n>1e4?"TIMED_OUT":"GENERAL",t,e),t=null):setTimeout(r,10)};if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=!1!==e.async,e.data=e.data||"",fC.fire("beforeInitialize",{settings:e}),t=new Mm){if(t.overrideMimeType&&t.overrideMimeType(e.content_type),t.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(t.withCredentials=!0),e.content_type&&t.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&Ot.each(e.requestheaders,function(e){t.setRequestHeader(e.key,e.value)}),t.setRequestHeader("X-Requested-With","XMLHttpRequest"),(t=fC.fire("beforeSend",{xhr:t,settings:e}).xhr).send(e.data),!e.async)return r();setTimeout(r,10)}}};Ot.extend(fC,Fd);var dC=Ot.extend,mC=function(e){this.settings=dC({},e),this.count=0};mC.sendRPC=function(e){return(new mC).send(e)},mC.prototype={send:function(e){var t=e.error,n=e.success;(e=dC(this.settings,e)).success=function(r,o){void 0===(r=cC.parse(r))&&(r={error:"JSON Parse error."}),r.error?t.call(e.error_scope||e.scope,r.error,o):n.call(e.success_scope||e.scope,r.result)},e.error=function(n,r){t&&t.call(e.error_scope||e.scope,n,r)},e.data=cC.serialize({id:e.id||"c"+this.count++,method:e.method,params:e.params}),e.content_type="application/json",fC.send(e)}};var pC,gC=window.localStorage,hC=qb,vC={geom:{Rect:Zb},util:{Promise:pe,Delay:ye,Tools:Ot,VK:Mp,URI:ub,Class:oC,EventDispatcher:Id,Observable:Fd,I18n:Bb,XHR:fC,JSON:cC,JSONRequest:mC,JSONP:lC,LocalStorage:gC,Color:function(e){var t={},n=0,r=0,o=0,i=function(e){var i;return"object"==typeof e?"r"in e?(n=e.r,r=e.g,o=e.b):"v"in e&&function(e,t,i){var a,s,u,c;if(e=(parseInt(e,10)||0)%360,t=parseInt(t,10)/100,i=parseInt(i,10)/100,t=aC(0,iC(t,1)),i=aC(0,iC(i,1)),0!==t){switch(a=e/60,u=(s=i*t)*(1-Math.abs(a%2-1)),c=i-s,Math.floor(a)){case 0:n=s,r=u,o=0;break;case 1:n=u,r=s,o=0;break;case 2:n=0,r=s,o=u;break;case 3:n=0,r=u,o=s;break;case 4:n=u,r=0,o=s;break;case 5:n=s,r=0,o=u;break;default:n=r=o=0}n=sC(255*(n+c)),r=sC(255*(r+c)),o=sC(255*(o+c))}else n=r=o=sC(255*i)}(e.h,e.s,e.v):(i=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(n=parseInt(i[1],10),r=parseInt(i[2],10),o=parseInt(i[3],10)):(i=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(n=parseInt(i[1],16),r=parseInt(i[2],16),o=parseInt(i[3],16)):(i=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(n=parseInt(i[1]+i[1],16),r=parseInt(i[2]+i[2],16),o=parseInt(i[3]+i[3],16)),n=n<0?0:n>255?255:n,r=r<0?0:r>255?255:r,o=o<0?0:o>255?255:o,t};return e&&i(e),t.toRgb=function(){return{r:n,g:r,b:o}},t.toHsv=function(){return e=n,t=r,i=o,s=0,(u=iC(e/=255,iC(t/=255,i/=255)))===(c=aC(e,aC(t,i)))?{h:0,s:0,v:100*(s=u)}:(a=(c-u)/c,s=c,{h:sC(60*((e===u?3:i===u?1:5)-(e===u?t-i:i===u?e-t:i-e)/(c-u))),s:sC(100*a),v:sC(100*s)});var e,t,i,a,s,u,c},t.toHex=function(){var e=function(e){return(e=parseInt(e,10).toString(16)).length>1?e:"0"+e};return"#"+e(n)+e(r)+e(o)},t.parse=i,t}},dom:{EventUtils:Te,Sizzle:lt,DomQuery:Qt,TreeWalker:to,DOMUtils:Xo,ScriptLoader:Zo,RangeUtils:Kb,Serializer:Nh,ControlSelection:Rh,BookmarkManager:Ah,Selection:vv,Event:Te.Event},html:{Styles:zo,Entities:Ao,Node:fh,Schema:Fo,SaxParser:em,DomParser:bh,Writer:Fs,Serializer:zs},ui:{Factory:tC},Env:me,AddOnManager:ti,Formatter:Yg,UndoManager:rg,EditorCommands:Od,WindowManager:km,NotificationManager:Sm,EditorObservable:qd,Shortcuts:Jd,Editor:gb,FocusManager:bb,EditorManager:qb,DOM:Xo.DOM,ScriptLoader:Zo.ScriptLoader,PluginManager:ti.PluginManager,ThemeManager:ti.ThemeManager,trim:Ot.trim,isArray:Ot.isArray,is:Ot.is,toArray:Ot.toArray,makeMap:Ot.makeMap,each:Ot.each,map:Ot.map,grep:Ot.grep,inArray:Ot.inArray,extend:Ot.extend,create:Ot.create,walk:Ot.walk,createNS:Ot.createNS,resolve:Ot.resolve,explode:Ot.explode,_addCacheSuffix:Ot._addCacheSuffix,isOpera:me.opera,isWebKit:me.webkit,isIE:me.ie,isGecko:me.gecko,isMac:me.mac};hC=Ot.extend(hC,vC),pC=hC,window.tinymce=pC,window.tinyMCE=pC}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n="[-'\\.\u2018\u2019\u2024\ufe52\uff07\uff0e]",t="[:\xb7\xb7\u05f4\u2027\ufe13\ufe55\uff1a]",r="[+*/,;;\u0589\u060c\u060d\u066c\u07f8\u2044\ufe10\ufe14\ufe50\ufe54\uff0c\uff1b]",E="[0-9\u0660-\u0669\u066b\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\uaa50-\uaa59\uabf0-\uabf9]",T="\\r",u="\\n",i="[\x0B\f\x85\u2028\u2029]",o="[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f\u109a-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b6-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u192b\u1930-\u193b\u19b0-\u19c0\u19c8\u19c9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f\u1b00-\u1b04\u1b34-\u1b44\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1baa\u1be6-\u1bf3\u1c24-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe3-\uabea\uabec\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]",c="[\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200e\u200f\u202a-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb]",a="[\u3031-\u3035\u309b\u309c\u30a0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff9d]",R="[=_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f\u2200-\u22ff<>]",f="[!-#%-*,-\\/:;?@\\[-\\]_{}\xa1\xab\xb7\xbb\xbf;\xb7\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\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1361-\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\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u3008\u3009\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30\u2e31\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\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]",A={characterIndices:{ALETTER:0,MIDNUMLET:1,MIDLETTER:2,MIDNUM:3,NUMERIC:4,CR:5,LF:6,NEWLINE:7,EXTEND:8,FORMAT:9,KATAKANA:10,EXTENDNUMLET:11,AT:12,OTHER:13},SETS:[new RegExp("[A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f3\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u10a0-\u10c5\u10d0-\u10fa\u10fc\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1a00-\u1a16\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bc0-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2d00-\u2d25\u2d30-\u2d65\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005\u303b\u303c\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790\ua791\ua7a0-\ua7a9\ua7fa-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]"),new RegExp(n),new RegExp(t),new RegExp(r),new RegExp(E),new RegExp(T),new RegExp(u),new RegExp(i),new RegExp(o),new RegExp(c),new RegExp(a),new RegExp(R),new RegExp("@")],EMPTY_STRING:"",PUNCTUATION:new RegExp("^"+f+"$"),WHITESPACE:/^\s+$/},N=function(e,n,t){var r,E;if(!e)return 0;if(t=t||e,e.length!==undefined){for(r=0,E=e.length;r<E;r++)if(!1===n.call(t,e[r],r,e))return 0}else for(r in e)if(e.hasOwnProperty(r)&&!1===n.call(t,e[r],r,e))return 0;return 1},s=function(e,n){var t=[];return N(e,function(r,E){t.push(n(r,E,e))}),t},l=A.SETS,M=A.characterIndices.OTHER,d=function(e){var n,t,r=M,E=l.length;for(n=0;n<E;++n)if((t=l[n])&&t.test(e)){r=n;break}return r},I=function(e){var n,t,r=(n=d,t={},function(e){if(t[e])return t[e];var r=n(e);return t[e]=r,r});return s(e.split(""),r)},L=A.characterIndices,g=function(e,n){var t,r,E=e[n],T=e[n+1];return!(n<0||n>e.length-1&&0!==n||E===L.ALETTER&&T===L.ALETTER||(r=e[n+2],E===L.ALETTER&&(T===L.MIDLETTER||T===L.MIDNUMLET||T===L.AT)&&r===L.ALETTER||(t=e[n-1],(E===L.MIDLETTER||E===L.MIDNUMLET||T===L.AT)&&T===L.ALETTER&&t===L.ALETTER||!(E!==L.NUMERIC&&E!==L.ALETTER||T!==L.NUMERIC&&T!==L.ALETTER)||(E===L.MIDNUM||E===L.MIDNUMLET)&&T===L.NUMERIC&&t===L.NUMERIC||E===L.NUMERIC&&(T===L.MIDNUM||T===L.MIDNUMLET)&&r===L.NUMERIC||E===L.EXTEND||E===L.FORMAT||t===L.EXTEND||t===L.FORMAT||T===L.EXTEND||T===L.FORMAT||E===L.CR&&T===L.LF||E!==L.NEWLINE&&E!==L.CR&&E!==L.LF&&T!==L.NEWLINE&&T!==L.CR&&T!==L.LF&&(E===L.KATAKANA&&T===L.KATAKANA||T===L.EXTENDNUMLET&&(E===L.ALETTER||E===L.NUMERIC||E===L.KATAKANA||E===L.EXTENDNUMLET)||E===L.EXTENDNUMLET&&(T===L.ALETTER||T===L.NUMERIC||T===L.KATAKANA)||E===L.AT))))},p=A.EMPTY_STRING,U=A.WHITESPACE,w=A.PUNCTUATION,h=function(e,n,t){var r=function(e,n){var t;for(t=n;t<e.length;++t){var r=e.charAt(t);if(U.test(r))break}return t}(n,t+1),E=n.substring(t+1,r);return"://"===E.substr(0,3)?{word:e+E,index:r}:{word:e,index:t}},v=function(e,n){return function(e,n){var t,r,E,T,u=0,i=I(e),o=i.length,c=[],a=[];for(n||(n={}),n.ignoreCase&&(e=e.toLowerCase()),r=n.includePunctuation,E=n.includeWhitespace;u<o;++u)if(t=e.charAt(u),c.push(t),g(i,u)){if((c=c.join(p))&&(E||!U.test(c))&&(r||!w.test(c)))if("http"===(T=c)||"https"===T){var R=h(c,e,u);a.push(R.word),u=R.index}else a.push(c);c=[]}return a}(e.replace(/\ufeff/g,""),n)},x=function(e){return v((n=e,n.removed?"":n.getBody().innerText)).length;var n},C=function(e){return{getCount:function(){return x(e)}}},D=tinymce.util.Tools.resolve("tinymce.util.Delay"),m=tinymce.util.Tools.resolve("tinymce.util.I18n"),y=function(e){var n=function(e){return m.translate(["{0} words",x(e)])},t=function(){e.theme.panel.find("#wordcount").text(n(e))};e.on("init",function(){var r=e.theme.panel&&e.theme.panel.find("#statusbar")[0],E=D.debounce(t,300);r&&D.setEditorTimeout(e,function(){r.insert({type:"label",name:"wordcount",text:n(e),classes:"wordcount",disabled:e.settings.readonly},0),e.on("setcontent beforeaddundo undo redo keyup",E)},0)})};e.add("wordcount",function(e){return y(e),C(e)})}();!function(){"use strict";var n,e,t,r,o=function(n){var e=n,t=function(){return e};return{get:t,set:function(n){e=n},clone:function(){return o(t())}}},u=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return{isEnabled:function(){return n.get()}}},c=function(n,e){return n.fire("VisualChars",{state:e})},a={"\xa0":"nbsp","\xad":"shy"},f=function(n,e){var t,r="";for(t in n)r+=t;return new RegExp("["+r+"]",e?"g":"")},l=function(n){var e,t="";for(e in n)t&&(t+=","),t+="span.mce-"+n[e];return t},s={charMap:a,regExp:f(a),regExpGlobal:f(a,!0),selector:l(a),charMapToRegExp:f,charMapToSelector:l},d=function(n){return function(){return n}},m={noop:function(){},noarg:function(n){return function(){return n()}},compose:function(n,e){return function(){return n(e.apply(null,arguments))}},constant:d,identity:function(n){return n},tripleEquals:function(n,e){return n===e},curry:function(n){for(var e=new Array(arguments.length-1),t=1;t<arguments.length;t++)e[t-1]=arguments[t];return function(){for(var t=new Array(arguments.length),r=0;r<t.length;r++)t[r]=arguments[r];var o=e.concat(t);return n.apply(null,o)}},not:function(n){return function(){return!n.apply(null,arguments)}},die:function(n){return function(){throw new Error(n)}},apply:function(n){return n()},call:function(n){n()},never:d(!1),always:d(!0)},p=m.never,h=m.always,v=function(){return g},g=(r={fold:function(n,e){return n()},is:p,isSome:p,isNone:h,getOr:t=function(n){return n},getOrThunk:e=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},or:t,orThunk:e,map:v,ap:v,each:function(){},bind:v,flatten:v,exists:p,forall:h,filter:v,equals:n=function(n){return n.isNone()},equals_:n,toArray:function(){return[]},toString:m.constant("none()")},Object.freeze&&Object.freeze(r),r),y=function(n){var e=function(){return n},t=function(){return o},r=function(e){return e(n)},o={fold:function(e,t){return t(n)},is:function(e){return n===e},isSome:h,isNone:p,getOr:e,getOrThunk:e,getOrDie:e,or:t,orThunk:t,map:function(e){return y(e(n))},ap:function(e){return e.fold(v,function(e){return y(e(n))})},each:function(e){e(n)},bind:r,flatten:e,exists:r,forall:r,filter:function(e){return e(n)?o:g},equals:function(e){return e.is(n)},equals_:function(e,t){return e.fold(p,function(e){return t(n,e)})},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},T={some:y,none:v,from:function(n){return null===n||n===undefined?g:y(n)}},w=(Array.prototype.indexOf,undefined,function(n,e){for(var t=n.length,r=new Array(t),o=0;o<t;o++){var u=n[o];r[o]=e(u,o,n)}return r}),x=function(n,e){for(var t=0,r=n.length;t<r;t++)e(n[t],t,n)},E=(Array.prototype.push,Array.prototype.slice,w),b=x,k=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:m.constant(n)}},N={fromHtml:function(n,e){var t=(e||document).createElement("div");if(t.innerHTML=n,!t.hasChildNodes()||t.childNodes.length>1)throw console.error("HTML does not have a single root node",n),"HTML must have a single root node";return k(t.childNodes[0])},fromTag:function(n,e){var t=(e||document).createElement(n);return k(t)},fromText:function(n,e){var t=(e||document).createTextNode(n);return k(t)},fromDom:k,fromPoint:function(n,e,t){return T.from(n.dom().elementFromPoint(e,t)).map(k)}},C=8,M=9,D=3,O=function(n){return n.dom().nodeName.toLowerCase()},A=function(n){return n.dom().nodeType},S=function(n){return function(e){return A(e)===n}},B=S(1),P=S(D),V=S(M),q={name:O,type:A,value:function(n){return n.dom().nodeValue},isElement:B,isText:P,isDocument:V,isComment:function(n){return A(n)===C||"#comment"===O(n)}},H=function(n){return'<span data-mce-bogus="1" class="mce-'+s.charMap[n]+'">'+n+"</span>"},L=function(n,e){var t=[],r=n.dom(),o=E(r.childNodes,N.fromDom);return b(o,function(n){e(n)&&(t=t.concat([n])),t=t.concat(L(n,e))}),t},R={isMatch:function(n){return q.isText(n)&&q.value(n)!==undefined&&s.regExp.test(q.value(n))},filterDescendants:L,findParentElm:function(n,e){for(;n.parentNode;){if(n.parentNode===e)return n;n=n.parentNode}},replaceWithSpans:function(n){return n.replace(s.regExpGlobal,H)}},_=function(n,e){var t,r,o=R.filterDescendants(N.fromDom(e),R.isMatch);b(o,function(e){var o=R.replaceWithSpans(q.value(e));for(r=n.dom.create("div",null,o);t=r.lastChild;)n.dom.insertAfter(t,e.dom());n.dom.remove(e.dom())})},j=function(n,e){var t=n.dom.select(s.selector,e);b(t,function(e){n.dom.remove(e,1)})},z=_,G=j,W=function(n){var e=n.getBody(),t=n.selection.getBookmark(),r=R.findParentElm(n.selection.getNode(),e);r=r!==undefined?r:e,j(n,r),_(n,r),n.selection.moveToBookmark(t)},F=function(n,e){var t,r=n.getBody(),o=n.selection;e.set(!e.get()),c(n,e.get()),t=o.getBookmark(),!0===e.get()?z(n,r):G(n,r),o.moveToBookmark(t)},I=function(n,e){n.addCommand("mceVisualChars",function(){F(n,e)})},J=tinymce.util.Tools.resolve("tinymce.util.Delay"),K=function(n,e){var t=J.debounce(function(){W(n)},300);!1!==n.settings.forced_root_block&&n.on("keydown",function(r){!0===e.get()&&(13===r.keyCode?W(n):t())})},Q=function(n){return function(e){var t=e.control;n.on("VisualChars",function(n){t.active(n.state)})}};u.add("visualchars",function(n){var e,t=o(!1);return I(n,t),(e=n).addButton("visualchars",{active:!1,title:"Show invisible characters",cmd:"mceVisualChars",onPostRender:Q(e)}),e.addMenuItem("visualchars",{text:"Show invisible characters",cmd:"mceVisualChars",onPostRender:Q(e),selectable:!0,context:"view",prependToContext:!0}),K(n,t),i(t)})}();!function(){"use strict";var e=function(t){var n=t,o=function(){return n};return{get:o,set:function(e){n=e},clone:function(){return e(o())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e,t){e.fire("VisualBlocks",{state:t})},o=function(e){return e.getParam("visualblocks_default_state",!1)},s=function(e){return e.settings.visualblocks_content_css},i=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=i.DOM.uniqueId(),u=function(e,t){var n=c.toArray(e.getElementsByTagName("link"));if(0===c.grep(n,function(e){return e.id===l}).length){var o=i.DOM.create("link",{id:l,rel:"stylesheet",href:t});e.getElementsByTagName("head")[0].appendChild(o)}},a=function(e,t,o){var i=e.dom,c=s(e);u(e.getDoc(),c||t+"/css/visualblocks.css"),i.toggleClass(e.getBody(),"mce-visualblocks"),o.set(!o.get()),n(e,o.get())},r=function(e,t,n){e.addCommand("mceVisualBlocks",function(){a(e,t,n)})},m=function(e,t,n){e.on("PreviewFormats AfterPreviewFormats",function(t){n.get()&&e.dom.toggleClass(e.getBody(),"mce-visualblocks","afterpreviewformats"===t.type)}),e.on("init",function(){o(e)&&a(e,t,n)}),e.on("remove",function(){e.dom.removeClass(e.getBody(),"mce-visualblocks")})},f=function(e,t){return function(n){var o=n.control;o.active(t.get()),e.on("VisualBlocks",function(e){o.active(e.state)})}},d=function(e,t){e.addButton("visualblocks",{active:!1,title:"Show blocks",cmd:"mceVisualBlocks",onPostRender:f(e,t)}),e.addMenuItem("visualblocks",{text:"Show blocks",cmd:"mceVisualBlocks",onPostRender:f(e,t),selectable:!0,context:"view",prependToContext:!0})};t.add("visualblocks",function(t,n){var o=e(!1);r(t,n,o),d(t,o),m(t,n,o)})}();!function(){"use strict";var t=function(e){var n=e,r=function(){return n};return{get:r,set:function(t){n=t},clone:function(){return t(r())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(t){return{setPatterns:function(e){t.set(e)},getPatterns:function(){return t.get()}}},r=[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"***",end:"***",format:["bold","italic"]},{start:"#",format:"h1"},{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:"1. ",cmd:"InsertOrderedList"},{start:"* ",cmd:"InsertUnorderedList"},{start:"- ",cmd:"InsertUnorderedList"}],a=function(t){return t.textpattern_patterns!==undefined?t.textpattern_patterns:r},o=tinymce.util.Tools.resolve("tinymce.util.Delay"),i=tinymce.util.Tools.resolve("tinymce.util.VK"),s=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(t,e){for(var n=0;n<t.length;n++)if(0===e.indexOf(t[n].start)&&(!t[n].end||e.lastIndexOf(t[n].end)===e.length-t[n].end.length))return t[n]},f=function(t,e,n,r){var a,o,i,s,l,d,f=t.sort(function(t,e){return t.start.length>e.start.length?-1:t.start.length<e.start.length?1:0});for(o=0;o<f.length;o++)if((a=f[o]).end!==undefined&&(s=a,l=n,d=r,e.substr(l-s.end.length-d,s.end.length)===s.end)&&n-r-(i=a).end.length-i.start.length>0)return a},c=function(t,e,n){if(!1!==e.collapsed){var r=e.startContainer,a=r.data,o=!0===n?1:0;if(3===r.nodeType){var i=f(t,a,e.startOffset,o);if(i!==undefined){var s=a.lastIndexOf(i.end,e.startOffset-o),l=a.lastIndexOf(i.start,s-i.end.length);if(s=a.indexOf(i.end,l+i.start.length),-1!==l){var c=document.createRange();c.setStart(r,l),c.setEnd(r,s+i.end.length);var u=d(t,c.toString());if(!(i===undefined||u!==i||r.data.length<=i.start.length+i.end.length))return{pattern:i,startOffset:l,endOffset:s}}}}}},u=function(t,e,n){var r=t.selection.getRng(!0),a=c(e,r,n);if(a)return function(t,e,n,r){var a=l.isArray(n.pattern.format)?n.pattern.format:[n.pattern.format];if(0!==l.grep(a,function(e){var n=t.formatter.get(e);return n&&n[0].inline}).length)return t.undoManager.transact(function(){var r,o,i,s;r=e,o=n.pattern,i=n.endOffset,s=n.startOffset,(r=s>0?r.splitText(s):r).splitText(i-s+o.end.length),r.deleteData(0,o.start.length),r.deleteData(r.data.length-o.end.length,o.end.length),e=r,a.forEach(function(n){t.formatter.apply(n,{},e)})}),e}(t,r.startContainer,a)},g={patternFromRng:c,applyInlineFormatSpace:function(t,e){return u(t,e,!0)},applyInlineFormatEnter:function(t,e){return u(t,e,!1)},applyBlockFormat:function(t,e){var n,r,a,o,i,f,c,u,g,h,m;if(n=t.selection,r=t.dom,n.isCollapsed()&&(c=r.getParent(n.getStart(),"p"))){for(g=new s(c,c);i=g.next();)if(3===i.nodeType){o=i;break}if(o){if(!(u=d(e,o.data)))return;if(a=(h=n.getRng(!0)).startContainer,m=h.startOffset,o===a&&(m=Math.max(0,m-u.start.length)),l.trim(o.data).length===u.start.length)return;u.format&&(f=t.formatter.get(u.format))&&f[0].block&&(o.deleteData(0,u.start.length),t.formatter.apply(u.format,{},o),h.setStart(a,m),h.collapse(!0),n.setRng(h)),u.cmd&&t.undoManager.transact(function(){o.deleteData(0,u.start.length),t.execCommand(u.cmd)})}}}},h=function(t,e,n){for(var r=0;r<t.length;r++)if(n(t[r],e))return!0},m={handleEnter:function(t,e){var n,r;(n=g.applyInlineFormatEnter(t,e))&&((r=t.dom.createRng()).setStart(n,n.data.length),r.setEnd(n,n.data.length),t.selection.setRng(r)),g.applyBlockFormat(t,e)},handleInlineKey:function(t,e){var n,r,a,o,i;(n=g.applyInlineFormatSpace(t,e))&&(i=t.dom,r=n.data.slice(-1),/[\u00a0 ]/.test(r)&&(n.deleteData(n.data.length-1,1),a=i.doc.createTextNode(r),i.insertAfter(a,n.parentNode),(o=i.createRng()).setStart(a,1),o.setEnd(a,1),t.selection.setRng(o)))},checkCharCode:function(t,e){return h(t,e,function(t,e){return t.charCodeAt(0)===e.charCode})},checkKeyCode:function(t,e){return h(t,e,function(t,e){return t===e.keyCode&&!1===i.modifierPressed(e)})}},p=function(t,e){var n=[",",".",";",":","!","?"],r=[32];t.on("keydown",function(n){13!==n.keyCode||i.modifierPressed(n)||m.handleEnter(t,e.get())},!0),t.on("keyup",function(n){m.checkKeyCode(r,n)&&m.handleInlineKey(t,e.get())}),t.on("keypress",function(r){m.checkCharCode(n,r)&&o.setEditorTimeout(t,function(){m.handleInlineKey(t,e.get())})})};e.add("textpattern",function(e){var r=t(a(e.settings));return p(e,r),n(r)})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(t,e){var o;return t.dom.getParents(t.selection.getStart(),function(t){var r;(r=t.style["forecolor"===e?"color":"background-color"])&&(o=r)}),o},o=function(t){var e,o=[];for(e=0;e<t.length;e+=2)o.push({text:t[e+1],color:"#"+t[e]});return o},r=function(t,e,o){t.undoManager.transact(function(){t.focus(),t.formatter.apply(e,{value:o}),t.nodeChanged()})},n=function(t,e){t.undoManager.transact(function(){t.focus(),t.formatter.remove(e,{value:null},null,!0),t.nodeChanged()})},a=function(t){t.addCommand("mceApplyTextcolor",function(e,o){r(t,e,o)}),t.addCommand("mceRemoveTextcolor",function(e){n(t,e)})},l=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=["000000","Black","993300","Burnt orange","333300","Dark olive","003300","Dark green","003366","Dark azure","000080","Navy Blue","333399","Indigo","333333","Very dark gray","800000","Maroon","FF6600","Orange","808000","Olive","008000","Green","008080","Teal","0000FF","Blue","666699","Grayish blue","808080","Gray","FF0000","Red","FF9900","Amber","99CC00","Yellow green","339966","Sea green","33CCCC","Turquoise","3366FF","Royal blue","800080","Purple","999999","Medium gray","FF00FF","Magenta","FFCC00","Gold","FFFF00","Yellow","00FF00","Lime","00FFFF","Aqua","00CCFF","Sky blue","993366","Red violet","FFFFFF","White","FF99CC","Pink","FFCC99","Peach","FFFF99","Light yellow","CCFFCC","Pale green","CCFFFF","Pale cyan","99CCFF","Light sky blue","CC99FF","Plum"],u=function(t){return t.getParam("textcolor_map",i)},m=function(t){return t.getParam("textcolor_rows",5)},s=function(t){return t.getParam("textcolor_cols",8)},d=function(t){return t.getParam("color_picker_callback",null)},f=function(t){return t.getParam("forecolor_map",u(t))},g=function(t){return t.getParam("backcolor_map",u(t))},F=function(t){return t.getParam("forecolor_rows",m(t))},b=function(t){return t.getParam("backcolor_rows",m(t))},p=function(t){return t.getParam("forecolor_cols",s(t))},C=function(t){return t.getParam("backcolor_cols",s(t))},y=d,v=function(t){return"function"==typeof d(t)},h=tinymce.util.Tools.resolve("tinymce.util.I18n"),P=function(t,e,r,n){var a,c,i,u,m,s,d,f=0,g=l.DOM.uniqueId("mcearia"),F=function(t,e){var o="transparent"===t;return'<td class="mce-grid-cell'+(o?" mce-colorbtn-trans":"")+'"><div id="'+g+"-"+f+++'" data-mce-color="'+(t||"")+'" role="option" tabIndex="-1" style="'+(t?"background-color: "+t:"")+'" title="'+h.translate(e)+'">'+(o?"×":"")+"</div></td>"};for((a=o(r)).push({text:h.translate("No color"),color:"transparent"}),i='<table class="mce-grid mce-grid-border mce-colorbutton-grid" role="list" cellspacing="0"><tbody>',u=a.length-1,s=0;s<e;s++){for(i+="<tr>",m=0;m<t;m++)i+=(d=s*t+m)>u?"<td></td>":F((c=a[d]).color,c.text);i+="</tr>"}if(n){for(i+='<tr><td colspan="'+t+'" class="mce-custom-color-btn"><div id="'+g+'-c" class="mce-widget mce-btn mce-btn-small mce-btn-flat" role="button" tabindex="-1" aria-labelledby="'+g+'-c" style="width: 100%"><button type="button" role="presentation" tabindex="-1">'+h.translate("Custom...")+"</button></div></td></tr>",i+="<tr>",m=0;m<t;m++)i+=F("","Custom color");i+="</tr>"}return i+="</tbody></table>"},k=function(t,e){t.style.background=e,t.setAttribute("data-mce-color",e)},x=function(t){return function(e){var o=e.control;o._color?t.execCommand("mceApplyTextcolor",o.settings.format,o._color):t.execCommand("mceRemoveTextcolor",o.settings.format)}},T=function(t,o){return function(r){var n,a=this.parent(),i=e(t,a.settings.format),u=function(e){a.hidePanel(),a.color(e),t.execCommand("mceApplyTextcolor",a.settings.format,e)};l.DOM.getParent(r.target,".mce-custom-color-btn")&&(a.hidePanel(),y(t).call(t,function(t){var e,r,n,l=a.panel.getEl().getElementsByTagName("table")[0];for(e=c.map(l.rows[l.rows.length-1].childNodes,function(t){return t.firstChild}),n=0;n<e.length&&(r=e[n]).getAttribute("data-mce-color");n++);if(n===o)for(n=0;n<o-1;n++)k(e[n],e[n+1].getAttribute("data-mce-color"));k(r,t),u(t)},i)),(n=r.target.getAttribute("data-mce-color"))?(this.lastId&&l.DOM.get(this.lastId).setAttribute("aria-selected",!1),r.target.setAttribute("aria-selected",!0),this.lastId=r.target.id,"transparent"===n?(a.hidePanel(),a.resetColor(),t.execCommand("mceRemoveTextcolor",a.settings.format)):u(n)):null!==n&&a.hidePanel()}},_=function(t,e){return function(){var o=e?p(t):C(t),r=e?F(t):b(t),n=e?f(t):g(t),a=v(t);return P(o,r,n,a)}},A=function(t){t.addButton("forecolor",{type:"colorbutton",tooltip:"Text color",format:"forecolor",panel:{role:"application",ariaRemember:!0,html:_(t,!0),onclick:T(t,p(t))},onclick:x(t)}),t.addButton("backcolor",{type:"colorbutton",tooltip:"Background color",format:"hilitecolor",panel:{role:"application",ariaRemember:!0,html:_(t,!1),onclick:T(t,C(t))},onclick:x(t)})};t.add("textcolor",function(t){a(t),A(t)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e){return function(){return e}},n=function(e){for(var t=new Array(arguments.length-1),n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){for(var n=new Array(arguments.length),a=0;a<n.length;a++)n[a]=arguments[a];var r=t.concat(n);return e.apply(null,r)}},a=(t(!1),t(!0),tinymce.util.Tools.resolve("tinymce.util.Tools")),r=tinymce.util.Tools.resolve("tinymce.util.XHR"),l=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=function(e){return e.getParam("template_cdate_classes","cdate")},o=function(e){return e.getParam("template_mdate_classes","mdate")},i=function(e){return e.getParam("template_selected_content_classes","selcontent")},s=function(e){return e.getParam("template_preview_replace_values")},u=function(e){return e.getParam("template_replace_values")},p=function(e){return e.templates},m=function(e){return e.getParam("template_cdate_format",e.getLang("template.cdate_format"))},d=function(e){return e.getParam("template_mdate_format",e.getLang("template.mdate_format"))},f=function(e){return e.getParam("template_popup_width",600)},g=function(e){return Math.min(l.DOM.getViewPort().h,e.getParam("template_popup_height",500))},h=function(e,t){if((e=""+e).length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e},y=function(e,t,n){var a="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),r="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),c="January February March April May June July August September October November December".split(" ");return n=n||new Date,t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",h(n.getMonth()+1,2))).replace("%d",h(n.getDate(),2))).replace("%H",""+h(n.getHours(),2))).replace("%M",""+h(n.getMinutes(),2))).replace("%S",""+h(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(c[n.getMonth()]))).replace("%b",""+e.translate(l[n.getMonth()]))).replace("%A",""+e.translate(r[n.getDay()]))).replace("%a",""+e.translate(a[n.getDay()]))).replace("%%","%")},v=function(e,t,n){return a.each(n,function(e,n){"function"==typeof e&&(e=e(n)),t=t.replace(new RegExp("\\{\\$"+n+"\\}","g"),e)}),t},M=function(e,t){var n=e.dom,r=u(e);a.each(n.select("*",t),function(e){a.each(r,function(t,a){n.hasClass(e,a)&&"function"==typeof r[a]&&r[a](e)})})},_=function(e,t){return new RegExp("\\b"+t+"\\b","g").test(e.className)},b=function(e,t){return function(){var n=p(e);"function"!=typeof n?"string"==typeof n?r.send({url:n,success:function(e){t(JSON.parse(e))}}):t(n):n(t)}},T=v,x=M,P=function(e,t,n){var r,l,s=e.dom,p=e.selection.getContent();n=v(0,n,u(e)),r=s.create("div",null,n),(l=s.select(".mceTmpl",r))&&l.length>0&&(r=s.create("div",null)).appendChild(l[0].cloneNode(!0)),a.each(s.select("*",r),function(t){_(t,c(e).replace(/\s+/g,"|"))&&(t.innerHTML=y(e,m(e))),_(t,o(e).replace(/\s+/g,"|"))&&(t.innerHTML=y(e,d(e))),_(t,i(e).replace(/\s+/g,"|"))&&(t.innerHTML=p)}),M(e,r),e.execCommand("mceInsertContent",!1,r.innerHTML),e.addVisual()},S=function(e){e.addCommand("mceInsertTemplate",n(P,e))},w=function(e){e.on("PreProcess",function(t){var n=e.dom,r=d(e);a.each(n.select("div",t.node),function(t){n.hasClass(t,"mceTmpl")&&(a.each(n.select("*",t),function(t){n.hasClass(t,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(t.innerHTML=y(e,r))}),x(e,t))})})},D=function(e,t,n){if(-1===n.indexOf("<html>")){var r="";a.each(e.contentCSS,function(t){r+='<link type="text/css" rel="stylesheet" href="'+e.documentBaseURI.toAbsolute(t)+'">'});var l=e.settings.body_class||"";-1!==l.indexOf("=")&&(l=(l=e.getParam("body_class","","hash"))[e.id]||""),n="<!DOCTYPE html><html><head>"+r+'</head><body class="'+l+'">'+n+"</body></html>"}n=T(e,n,s(e));var c=t.find("iframe")[0].getEl().contentWindow.document;c.open(),c.write(n),c.close()},H=function(e,t){var n,l,c=[];if(t&&0!==t.length)a.each(t,function(e){c.push({selected:!c.length,text:e.title,value:{url:e.url,content:e.content,description:e.description}})}),(n=e.windowManager.open({title:"Insert template",layout:"flex",direction:"column",align:"stretch",padding:15,spacing:10,items:[{type:"form",flex:0,padding:0,items:[{type:"container",label:"Templates",items:{type:"listbox",label:"Templates",name:"template",values:c,onselect:function(t){var a=t.control.value();a.url?r.send({url:a.url,success:function(t){D(e,n,l=t)}}):(l=a.content,D(e,n,l)),n.find("#description")[0].text(t.control.value().description)}}}]},{type:"label",name:"description",label:"Description",text:"\xa0"},{type:"iframe",flex:1,border:1}],onsubmit:function(){P(e,!1,l)},minWidth:f(e),minHeight:g(e)})).find("listbox")[0].fire("select");else{var o=e.translate("No templates defined.");e.notificationManager.open({text:o,type:"info"})}},C=function(e){return function(t){H(e,t)}},A=function(e){e.addButton("template",{title:"Insert template",onclick:b(e.settings,C(e))}),e.addMenuItem("template",{text:"Template",onclick:b(e.settings,C(e)),icon:"template",context:"insert"})};e.add("template",function(e){A(e),S(e),w(e)})}();!function(){"use strict";var n,t,e,r,o,i,u,a,c,l,s,f=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=function(n){return function(){return n}},m={noop:function(){},noarg:function(n){return function(){return n()}},compose:function(n,t){return function(){return n(t.apply(null,arguments))}},constant:d,identity:function(n){return n},tripleEquals:function(n,t){return n===t},curry:function(n){for(var t=new Array(arguments.length-1),e=1;e<arguments.length;e++)t[e-1]=arguments[e];return function(){for(var e=new Array(arguments.length),r=0;r<e.length;r++)e[r]=arguments[r];var o=t.concat(e);return n.apply(null,o)}},not:function(n){return function(){return!n.apply(null,arguments)}},die:function(n){return function(){throw new Error(n)}},apply:function(n){return n()},call:function(n){n()},never:d(!1),always:d(!0)},g=m.never,p=m.always,h=function(){return v},v=(r={fold:function(n,t){return n()},is:g,isSome:g,isNone:p,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},or:e,orThunk:t,map:h,ap:h,each:function(){},bind:h,flatten:h,exists:g,forall:p,filter:h,equals:n=function(n){return n.isNone()},equals_:n,toArray:function(){return[]},toString:m.constant("none()")},Object.freeze&&Object.freeze(r),r),b=function(n){var t=function(){return n},e=function(){return o},r=function(t){return t(n)},o={fold:function(t,e){return e(n)},is:function(t){return n===t},isSome:p,isNone:g,getOr:t,getOrThunk:t,getOrDie:t,or:e,orThunk:e,map:function(t){return b(t(n))},ap:function(t){return t.fold(h,function(t){return b(t(n))})},each:function(t){t(n)},bind:r,flatten:t,exists:r,forall:r,filter:function(t){return t(n)?o:v},equals:function(t){return t.is(n)},equals_:function(t,e){return t.fold(g,function(t){return e(n,t)})},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},w={some:b,none:h,from:function(n){return null===n||n===undefined?v:b(n)}},y=(o=Array.prototype.indexOf)===undefined?function(n,t){return A(n,t)}:function(n,t){return o.call(n,t)},x=function(n,t){return y(n,t)>-1},C=function(n,t){for(var e=n.length,r=new Array(e),o=0;o<e;o++){var i=n[o];r[o]=t(i,o,n)}return r},S=function(n,t){for(var e=0,r=n.length;e<r;e++)t(n[e],e,n)},R=function(n,t){for(var e=n.length-1;e>=0;e--)t(n[e],e,n)},T=function(n,t){for(var e=[],r=0,o=n.length;r<o;r++){var i=n[r];t(i,r,n)&&e.push(i)}return e},D=function(n,t){for(var e=0,r=n.length;e<r;e++)if(t(n[e],e,n))return w.some(e);return w.none()},A=function(n,t){for(var e=0,r=n.length;e<r;++e)if(n[e]===t)return e;return-1},k=Array.prototype.push,N=function(n){for(var t=[],e=0,r=n.length;e<r;++e){if(!Array.prototype.isPrototypeOf(n[e]))throw new Error("Arr.flatten item "+e+" was not an array, input: "+n);k.apply(t,n[e])}return t},O=function(n,t){for(var e=0,r=n.length;e<r;++e)if(!0!==t(n[e],e,n))return!1;return!0},E=Array.prototype.slice,B={map:C,each:S,eachr:R,partition:function(n,t){for(var e=[],r=[],o=0,i=n.length;o<i;o++){var u=n[o];(t(u,o,n)?e:r).push(u)}return{pass:e,fail:r}},filter:T,groupBy:function(n,t){if(0===n.length)return[];for(var e=t(n[0]),r=[],o=[],i=0,u=n.length;i<u;i++){var a=n[i],c=t(a);c!==e&&(r.push(o),o=[]),e=c,o.push(a)}return 0!==o.length&&r.push(o),r},indexOf:function(n,t){var e=y(n,t);return-1===e?w.none():w.some(e)},foldr:function(n,t,e){return R(n,function(n){e=t(e,n)}),e},foldl:function(n,t,e){return S(n,function(n){e=t(e,n)}),e},find:function(n,t){for(var e=0,r=n.length;e<r;e++){var o=n[e];if(t(o,e,n))return w.some(o)}return w.none()},findIndex:D,flatten:N,bind:function(n,t){var e=C(n,t);return N(e)},forall:O,exists:function(n,t){return D(n,t).isSome()},contains:x,equal:function(n,t){return n.length===t.length&&O(n,function(n,e){return n===t[e]})},reverse:function(n){var t=E.call(n,0);return t.reverse(),t},chunk:function(n,t){for(var e=[],r=0;r<n.length;r+=t){var o=n.slice(r,r+t);e.push(o)}return e},difference:function(n,t){return T(n,function(n){return!x(t,n)})},mapToObject:function(n,t){for(var e={},r=0,o=n.length;r<o;r++){var i=n[r];e[String(i)]=t(i,r)}return e},pure:function(n){return[n]},sort:function(n,t){var e=E.call(n,0);return e.sort(t),e},range:function(n,t){for(var e=[],r=0;r<n;r++)e.push(t(r));return e},head:function(n){return 0===n.length?w.none():w.some(n[0])},last:function(n){return 0===n.length?w.none():w.some(n[n.length-1])}},I=(i=Object.keys)===undefined?function(n){var t=[];for(var e in n)n.hasOwnProperty(e)&&t.push(e);return t}:i,P=function(n,t){for(var e=I(n),r=0,o=e.length;r<o;r++){var i=e[r];t(n[i],i,n)}},W=function(n,t){var e={};return P(n,function(r,o){var i=t(r,o,n);e[i.k]=i.v}),e},_=function(n,t){var e=[];return P(n,function(n,r){e.push(t(n,r))}),e},M=function(n){return _(n,function(n){return n})},L={bifilter:function(n,t){var e={},r={};return P(n,function(n,o){(t(n,o)?e:r)[o]=n}),{t:e,f:r}},each:P,map:function(n,t){return W(n,function(n,e,r){return{k:e,v:t(n,e,r)}})},mapToArray:_,tupleMap:W,find:function(n,t){for(var e=I(n),r=0,o=e.length;r<o;r++){var i=e[r],u=n[i];if(t(u,i,n))return w.some(u)}return w.none()},keys:I,values:M,size:function(n){return M(n).length}},q=function(n){return function(t){return function(n){if(null===n)return"null";var t=typeof n;return"object"===t&&Array.prototype.isPrototypeOf(n)?"array":"object"===t&&String.prototype.isPrototypeOf(n)?"string":t}(t)===n}},z={isString:q("string"),isObject:q("object"),isArray:q("array"),isNull:q("null"),isBoolean:q("boolean"),isUndefined:q("undefined"),isFunction:q("function"),isNumber:q("number")},F=function(n){return n.slice(0).sort()},j=function(n,t){throw new Error("All required keys ("+F(n).join(", ")+") were not specified. Specified keys were: "+F(t).join(", ")+".")},H=function(n){throw new Error("Unsupported keys for object: "+F(n).join(", "))},V=function(n,t){if(!z.isArray(t))throw new Error("The "+n+" fields must be an array. Was: "+t+".");B.each(t,function(t){if(!z.isString(t))throw new Error("The value "+t+" in the "+n+" fields was not a string.")})},U=function(n,t){throw new Error("All values need to be of type: "+t+". Keys ("+F(n).join(", ")+") were not.")},G=function(n){var t=F(n);B.find(t,function(n,e){return e<t.length-1&&n===t[e+1]}).each(function(n){throw new Error("The field: "+n+" occurs more than once in the combined fields: ["+t.join(", ")+"].")})},X={immutable:function(){var n=arguments;return function(){for(var t=new Array(arguments.length),e=0;e<t.length;e++)t[e]=arguments[e];if(n.length!==t.length)throw new Error('Wrong number of arguments to struct. Expected "['+n.length+']", got '+t.length+" arguments");var r={};return B.each(n,function(n,e){r[n]=m.constant(t[e])}),r}},immutableBag:function(n,t){var e=n.concat(t);if(0===e.length)throw new Error("You must specify at least one required or optional field.");return V("required",n),V("optional",t),G(e),function(r){var o=L.keys(r);B.forall(n,function(n){return B.contains(o,n)})||j(n,o);var i=B.filter(o,function(n){return!B.contains(e,n)});i.length>0&&H(i);var u={};return B.each(n,function(n){u[n]=m.constant(r[n])}),B.each(t,function(n){u[n]=m.constant(Object.prototype.hasOwnProperty.call(r,n)?w.some(r[n]):w.none())}),u}}},Y=X.immutable("width","height"),$=X.immutable("rows","columns"),K=X.immutable("row","column"),J=X.immutable("x","y"),Q=X.immutable("element","rowspan","colspan"),Z=X.immutable("element","rowspan","colspan","isNew"),nn={dimensions:Y,grid:$,address:K,coords:J,extended:X.immutable("element","rowspan","colspan","row","column"),detail:Q,detailnew:Z,rowdata:X.immutable("element","cells","section"),elementnew:X.immutable("element","isNew"),rowdatanew:X.immutable("element","cells","section","isNew"),rowcells:X.immutable("cells","section"),rowdetails:X.immutable("details","section"),bounds:X.immutable("startRow","startCol","finishRow","finishCol")},tn=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:m.constant(n)}},en={fromHtml:function(n,t){var e=(t||document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||e.childNodes.length>1)throw console.error("HTML does not have a single root node",n),"HTML must have a single root node";return tn(e.childNodes[0])},fromTag:function(n,t){var e=(t||document).createElement(n);return tn(e)},fromText:function(n,t){var e=(t||document).createTextNode(n);return tn(e)},fromDom:tn,fromPoint:function(n,t,e){return w.from(n.dom().elementFromPoint(t,e)).map(tn)}},rn=8,on=9,un=1,an=3,cn=un,ln=on,sn=function(n){return n.nodeType!==cn&&n.nodeType!==ln||0===n.childElementCount},fn={all:function(n,t){var e=t===undefined?document:t.dom();return sn(e)?[]:B.map(e.querySelectorAll(n),en.fromDom)},is:function(n,t){var e=n.dom();if(e.nodeType!==cn)return!1;if(e.matches!==undefined)return e.matches(t);if(e.msMatchesSelector!==undefined)return e.msMatchesSelector(t);if(e.webkitMatchesSelector!==undefined)return e.webkitMatchesSelector(t);if(e.mozMatchesSelector!==undefined)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")},one:function(n,t){var e=t===undefined?document:t.dom();return sn(e)?w.none():w.from(e.querySelector(n)).map(en.fromDom)}},dn=function(n,t){var e=[],r=function(n){return e.push(n),t(n)},o=t(n);do{o=o.bind(r)}while(o.isSome());return e},mn="undefined"!=typeof window?window:Function("return this;")(),gn=function(n,t){for(var e=t!==undefined&&null!==t?t:mn,r=0;r<n.length&&e!==undefined&&null!==e;++r)e=e[n[r]];return e},pn=function(n,t){var e=n.split(".");return gn(e,t)},hn=function(n,t){var e=pn(n,t);if(e===undefined||null===e)throw n+" not available on this browser";return e},vn=function(){return hn("Node")},bn=function(n,t,e){return 0!=(n.compareDocumentPosition(t)&e)},wn=function(n,t){return bn(n,t,vn().DOCUMENT_POSITION_CONTAINED_BY)},yn=function(n){var t,e=!1;return function(){return e||(e=!0,t=n.apply(null,arguments)),t}},xn=function(n,t){var e=function(n,t){for(var e=0;e<n.length;e++){var r=n[e];if(r.test(t))return r}return undefined}(n,t);if(!e)return{major:0,minor:0};var r=function(n){return Number(t.replace(e,"$"+n))};return Sn(r(1),r(2))},Cn=function(){return Sn(0,0)},Sn=function(n,t){return{major:n,minor:t}},Rn={nu:Sn,detect:function(n,t){var e=String(t).toLowerCase();return 0===n.length?Cn():xn(n,e)},unknown:Cn},Tn="Firefox",Dn=function(n,t){return function(){return t===n}},An=function(n){var t=n.current;return{current:t,version:n.version,isEdge:Dn("Edge",t),isChrome:Dn("Chrome",t),isIE:Dn("IE",t),isOpera:Dn("Opera",t),isFirefox:Dn(Tn,t),isSafari:Dn("Safari",t)}},kn={unknown:function(){return An({current:undefined,version:Rn.unknown()})},nu:An,edge:m.constant("Edge"),chrome:m.constant("Chrome"),ie:m.constant("IE"),opera:m.constant("Opera"),firefox:m.constant(Tn),safari:m.constant("Safari")},Nn="Windows",On="Android",En="Solaris",Bn="FreeBSD",In=function(n,t){return function(){return t===n}},Pn=function(n){var t=n.current;return{current:t,version:n.version,isWindows:In(Nn,t),isiOS:In("iOS",t),isAndroid:In(On,t),isOSX:In("OSX",t),isLinux:In("Linux",t),isSolaris:In(En,t),isFreeBSD:In(Bn,t)}},Wn={unknown:function(){return Pn({current:undefined,version:Rn.unknown()})},nu:Pn,windows:m.constant(Nn),ios:m.constant("iOS"),android:m.constant(On),linux:m.constant("Linux"),osx:m.constant("OSX"),solaris:m.constant(En),freebsd:m.constant(Bn)},_n=function(n,t){var e=String(t).toLowerCase();return B.find(n,function(n){return n.search(e)})},Mn=function(n,t){return _n(n,t).map(function(n){var e=Rn.detect(n.versionRegexes,t);return{current:n.name,version:e}})},Ln=function(n,t){return _n(n,t).map(function(n){var e=Rn.detect(n.versionRegexes,t);return{current:n.name,version:e}})},qn=function(n,t){return t+n},zn=function(n,t){return n+t},Fn=function(n,t){return n.substring(t)},jn=function(n,t){return n.substring(0,n.length-t)},Hn=function(n){return""===n?w.none():w.some(n.substr(0,1))},Vn=function(n){return""===n?w.none():w.some(n.substring(1))},Un=function(n,t,e){return""===t||!(n.length<t.length)&&n.substr(e,e+t.length)===t},Gn=function(n,t){return Un(n,t,0)},Xn=function(n,t){return Un(n,t,n.length-t.length)},Yn={supplant:function(n,t){return n.replace(/\${([^{}]*)}/g,function(n,e){var r,o=t[e];return"string"==(r=typeof o)||"number"===r?o:n})},startsWith:Gn,removeLeading:function(n,t){return Gn(n,t)?Fn(n,t.length):n},removeTrailing:function(n,t){return Xn(n,t)?jn(n,t.length):n},ensureLeading:function(n,t){return Gn(n,t)?n:qn(n,t)},ensureTrailing:function(n,t){return Xn(n,t)?n:zn(n,t)},endsWith:Xn,contains:function(n,t){return-1!==n.indexOf(t)},trim:function(n){return n.replace(/^\s+|\s+$/g,"")},lTrim:function(n){return n.replace(/^\s+/g,"")},rTrim:function(n){return n.replace(/\s+$/g,"")},capitalize:function(n){return Hn(n).bind(function(t){return Vn(n).map(function(n){return t.toUpperCase()+n})}).getOr(n)}},$n=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Kn=function(n){return function(t){return Yn.contains(t,n)}},Jn=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(n){return Yn.contains(n,"edge/")&&Yn.contains(n,"chrome")&&Yn.contains(n,"safari")&&Yn.contains(n,"applewebkit")}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,$n],search:function(n){return Yn.contains(n,"chrome")&&!Yn.contains(n,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(n){return Yn.contains(n,"msie")||Yn.contains(n,"trident")}},{name:"Opera",versionRegexes:[$n,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Kn("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Kn("firefox")},{name:"Safari",versionRegexes:[$n,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(n){return(Yn.contains(n,"safari")||Yn.contains(n,"mobile/"))&&Yn.contains(n,"applewebkit")}}],Qn=[{name:"Windows",search:Kn("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(n){return Yn.contains(n,"iphone")||Yn.contains(n,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Kn("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Kn("os x"),versionRegexes:[/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Kn("linux"),versionRegexes:[]},{name:"Solaris",search:Kn("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Kn("freebsd"),versionRegexes:[]}],Zn={browsers:m.constant(Jn),oses:m.constant(Qn)},nt=function(n){var t,e,r,o,i,u,a,c,l,s,f,d=Zn.browsers(),g=Zn.oses(),p=Mn(d,n).fold(kn.unknown,kn.nu),h=Ln(g,n).fold(Wn.unknown,Wn.nu);return{browser:p,os:h,deviceType:(e=p,r=n,o=(t=h).isiOS()&&!0===/ipad/i.test(r),i=t.isiOS()&&!o,u=t.isAndroid()&&3===t.version.major,a=t.isAndroid()&&4===t.version.major,c=o||u||a&&!0===/mobile/i.test(r),l=t.isiOS()||t.isAndroid(),s=l&&!c,f=e.isSafari()&&t.isiOS()&&!1===/safari/i.test(r),{isiPad:m.constant(o),isiPhone:m.constant(i),isTablet:m.constant(c),isPhone:m.constant(s),isTouch:m.constant(l),isAndroid:t.isAndroid,isiOS:t.isiOS,isWebView:m.constant(f)})}},tt={detect:yn(function(){var n=navigator.userAgent;return nt(n)})},et=function(n,t){return n.dom()===t.dom()},rt=tt.detect().browser.isIE()?function(n,t){return wn(n.dom(),t.dom())}:function(n,t){var e=n.dom(),r=t.dom();return e!==r&&e.contains(r)},ot={eq:et,isEqualNode:function(n,t){return n.dom().isEqualNode(t.dom())},member:function(n,t){return B.exists(t,m.curry(et,n))},contains:rt,is:fn.is},it=function(n){return en.fromDom(n.dom().ownerDocument)},ut=function(n){var t=n.dom();return w.from(t.parentNode).map(en.fromDom)},at=function(n){var t=n.dom();return w.from(t.previousSibling).map(en.fromDom)},ct=function(n){var t=n.dom();return w.from(t.nextSibling).map(en.fromDom)},lt=function(n){var t=n.dom();return B.map(t.childNodes,en.fromDom)},st=function(n,t){var e=n.dom().childNodes;return w.from(e[t]).map(en.fromDom)},ft=X.immutable("element","offset"),dt={owner:it,defaultView:function(n){var t=n.dom().ownerDocument.defaultView;return en.fromDom(t)},documentElement:function(n){var t=it(n);return en.fromDom(t.dom().documentElement)},parent:ut,findIndex:function(n){return ut(n).bind(function(t){var e=lt(t);return B.findIndex(e,function(t){return ot.eq(n,t)})})},parents:function(n,t){for(var e=z.isFunction(t)?t:m.constant(!1),r=n.dom(),o=[];null!==r.parentNode&&r.parentNode!==undefined;){var i=r.parentNode,u=en.fromDom(i);if(o.push(u),!0===e(u))break;r=i}return o},siblings:function(n){return ut(n).map(lt).map(function(t){return B.filter(t,function(t){return!ot.eq(n,t)})}).getOr([])},prevSibling:at,offsetParent:function(n){var t=n.dom();return w.from(t.offsetParent).map(en.fromDom)},prevSiblings:function(n){return B.reverse(dn(n,at))},nextSibling:ct,nextSiblings:function(n){return dn(n,ct)},children:lt,child:st,firstChild:function(n){return st(n,0)},lastChild:function(n){return st(n,n.dom().childNodes.length-1)},childNodesCount:function(n){return n.dom().childNodes.length},hasChildNodes:function(n){return n.dom().hasChildNodes()},leaf:function(n,t){var e=lt(n);return e.length>0&&t<e.length?ft(e[t],0):ft(n,t)}},mt=function(n,t,e){return B.bind(dt.children(n),function(n){return fn.is(n,t)?e(n)?[n]:[]:mt(n,t,e)})},gt={firstLayer:function(n,t){return mt(n,t,m.constant(!0))},filterFirstLayer:mt},pt=function(n){return n.dom().nodeName.toLowerCase()},ht=function(n){return n.dom().nodeType},vt=function(n){return function(t){return ht(t)===n}},bt=vt(un),wt=vt(an),yt=vt(on),xt={name:pt,type:ht,value:function(n){return n.dom().nodeValue},isElement:bt,isText:wt,isDocument:yt,isComment:function(n){return ht(n)===rn||"#comment"===pt(n)}},Ct=function(n,t,e){if(!(z.isString(e)||z.isBoolean(e)||z.isNumber(e)))throw console.error("Invalid call to Attr.set. Key ",t,":: Value ",e,":: Element ",n),new Error("Attribute value was not simple");n.setAttribute(t,e+"")},St=function(n,t,e){Ct(n.dom(),t,e)},Rt=function(n,t){var e=n.dom().getAttribute(t);return null===e?undefined:e},Tt=function(n,t){var e=n.dom();return!(!e||!e.hasAttribute)&&e.hasAttribute(t)},Dt={clone:function(n){return B.foldl(n.dom().attributes,function(n,t){return n[t.name]=t.value,n},{})},set:St,setAll:function(n,t){var e=n.dom();L.each(t,function(n,t){Ct(e,t,n)})},get:Rt,has:Tt,remove:function(n,t){n.dom().removeAttribute(t)},hasNone:function(n){var t=n.dom().attributes;return t===undefined||null===t||0===t.length},transfer:function(n,t,e){xt.isElement(n)&&xt.isElement(t)&&B.each(e,function(e){var r,o,i;o=t,Tt(r=n,i=e)&&!Tt(o,i)&&St(o,i,Rt(r,i))})}},At=yn(function(){return kt(en.fromDom(document))}),kt=function(n){var t=n.dom().body;if(null===t||t===undefined)throw"Body is not available yet";return en.fromDom(t)},Nt={body:At,getBody:kt,inBody:function(n){var t=xt.isText(n)?n.dom().parentNode:n.dom();return t!==undefined&&null!==t&&t.ownerDocument.body.contains(t)}},Ot=function(n,t){var e=[];return B.each(dt.children(n),function(n){t(n)&&(e=e.concat([n])),e=e.concat(Ot(n,t))}),e},Et={all:function(n){return Ot(Nt.body(),n)},ancestors:function(n,t,e){return B.filter(dt.parents(n,e),t)},siblings:function(n,t){return B.filter(dt.siblings(n),t)},children:function(n,t){return B.filter(dt.children(n),t)},descendants:Ot},Bt={all:function(n){return fn.all(n)},ancestors:function(n,t,e){return Et.ancestors(n,function(n){return fn.is(n,t)},e)},siblings:function(n,t){return Et.siblings(n,function(n){return fn.is(n,t)})},children:function(n,t){return Et.children(n,function(n){return fn.is(n,t)})},descendants:function(n,t){return fn.all(t,n)}},It=function(n,t,e,r,o){return n(e,r)?w.some(e):z.isFunction(o)&&o(e)?w.none():t(e,r,o)},Pt=function(n,t,e){for(var r=n.dom(),o=z.isFunction(e)?e:m.constant(!1);r.parentNode;){r=r.parentNode;var i=en.fromDom(r);if(t(i))return w.some(i);if(o(i))break}return w.none()},Wt=function(n,t){return B.find(n.dom().childNodes,m.compose(t,en.fromDom)).map(en.fromDom)},_t=function(n,t){var e=function(n){for(var r=0;r<n.childNodes.length;r++){if(t(en.fromDom(n.childNodes[r])))return w.some(en.fromDom(n.childNodes[r]));var o=e(n.childNodes[r]);if(o.isSome())return o}return w.none()};return e(n.dom())},Mt={first:function(n){return _t(Nt.body(),n)},ancestor:Pt,closest:function(n,t,e){return It(function(n){return t(n)},Pt,n,t,e)},sibling:function(n,t){var e=n.dom();return e.parentNode?Wt(en.fromDom(e.parentNode),function(e){return!ot.eq(n,e)&&t(e)}):w.none()},child:Wt,descendant:_t},Lt=function(n,t,e){return Mt.ancestor(n,function(n){return fn.is(n,t)},e)},qt={first:function(n){return fn.one(n)},ancestor:Lt,sibling:function(n,t){return Mt.sibling(n,function(n){return fn.is(n,t)})},child:function(n,t){return Mt.child(n,function(n){return fn.is(n,t)})},descendant:function(n,t){return fn.one(t,n)},closest:function(n,t,e){return It(fn.is,Lt,n,t,e)}},zt=function(n,t,e){var r=e!==undefined?e:m.constant(!1);return r(t)?w.none():B.contains(n,xt.name(t))?w.some(t):qt.ancestor(t,n.join(","),function(n){return fn.is(n,"table")||r(n)})},Ft=function(n,t){return dt.parent(t).map(function(t){return Bt.children(t,n)})},jt=function(n,t){return zt(["td","th"],n,t)},Ht=function(n){return gt.firstLayer(n,"th,td")},Vt=(m.curry(Ft,"th,td"),function(n,t){return qt.closest(n,"table",t)}),Ut=function(n){return gt.firstLayer(n,"tr")},Gt=(m.curry(Ft,"tr"),function(n){var t=Ut(n);return B.map(t,function(n){var t=n,e=dt.parent(t).bind(function(n){var t=xt.name(n);return"tfoot"===t||"thead"===t||"tbody"===t?t:"tbody"}),r=B.map(Ht(n),function(n){var t=Dt.has(n,"rowspan")?parseInt(Dt.get(n,"rowspan"),10):1,e=Dt.has(n,"colspan")?parseInt(Dt.get(n,"colspan"),10):1;return nn.detail(n,t,e)});return nn.rowdata(t,r,e)})}),Xt=function(n,t){return B.map(n,function(n){var e=B.map(Ht(n),function(n){var t=Dt.has(n,"rowspan")?parseInt(Dt.get(n,"rowspan"),10):1,e=Dt.has(n,"colspan")?parseInt(Dt.get(n,"colspan"),10):1;return nn.detail(n,t,e)});return nn.rowdata(n,e,t.section())})},Yt=function(n,t){return n+","+t},$t=function(n,t){var e=B.bind(n.all(),function(n){return n.cells()});return B.filter(e,t)},Kt={generate:function(n){var t={},e=[],r=n.length,o=0;B.each(n,function(n,r){var i=[];B.each(n.cells(),function(n,e){for(var u=0;t[Yt(r,u)]!==undefined;)u++;for(var a=nn.extended(n.element(),n.rowspan(),n.colspan(),r,u),c=0;c<n.colspan();c++)for(var l=0;l<n.rowspan();l++){var s=u+c,f=Yt(r+l,s);t[f]=a,o=Math.max(o,s+1)}i.push(a)}),e.push(nn.rowdata(n.element(),i,n.section()))});var i=nn.grid(r,o);return{grid:m.constant(i),access:m.constant(t),all:m.constant(e)}},getAt:function(n,t,e){var r=n.access()[Yt(t,e)];return r!==undefined?w.some(r):w.none()},findItem:function(n,t,e){var r=$t(n,function(n){return e(t,n.element())});return r.length>0?w.some(r[0]):w.none()},filterItems:$t,justCells:function(n){var t=B.map(n.all(),function(n){return n.cells()});return B.flatten(t)}},Jt=function(n){return n.style!==undefined},Qt=function(n,t,e){if(!z.isString(e))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",e,":: Element ",n),new Error("CSS value must be a string: "+e);Jt(n)&&n.style.setProperty(t,e)},Zt=function(n,t){Jt(n)&&n.style.removeProperty(t)},ne=function(n,t,e){var r=n.dom();Qt(r,t,e)},te=function(n,t){return Jt(n)?n.style.getPropertyValue(t):""},ee=function(n,t){var e=n.dom(),r=te(e,t);return w.from(r).filter(function(n){return n.length>0})},re={copy:function(n,t){var e=n.dom(),r=t.dom();Jt(e)&&Jt(r)&&(r.style.cssText=e.style.cssText)},set:ne,preserve:function(n,t){var e=Dt.get(n,"style"),r=t(n);return(e===undefined?Dt.remove:Dt.set)(n,"style",e),r},setAll:function(n,t){var e=n.dom();L.each(t,function(n,t){Qt(e,t,n)})},setOptions:function(n,t){var e=n.dom();L.each(t,function(n,t){n.fold(function(){Zt(e,t)},function(n){Qt(e,t,n)})})},remove:function(n,t){var e=n.dom();Zt(e,t),Dt.has(n,"style")&&""===Yn.trim(Dt.get(n,"style"))&&Dt.remove(n,"style")},get:function(n,t){var e=n.dom(),r=window.getComputedStyle(e).getPropertyValue(t),o=""!==r||Nt.inBody(n)?r:te(e,t);return null===o?undefined:o},getRaw:ee,getAllRaw:function(n){var t={},e=n.dom();if(Jt(e))for(var r=0;r<e.style.length;r++){var o=e.style.item(r);t[o]=e.style[o]}return t},isValidValue:function(n,t,e){var r=en.fromTag(n);return ne(r,t,e),ee(r,t).isSome()},reflow:function(n){return n.dom().offsetWidth},transfer:function(n,t,e){xt.isElement(n)&&xt.isElement(t)&&B.each(e,function(e){var r,o;r=t,ee(n,o=e).each(function(n){ee(r,o).isNone()&&ne(r,o,n)})})}},oe=function(n,t){dt.parent(n).each(function(e){e.dom().insertBefore(t.dom(),n.dom())})},ie=function(n,t){n.dom().appendChild(t.dom())},ue={before:oe,after:function(n,t){dt.nextSibling(n).fold(function(){dt.parent(n).each(function(n){ie(n,t)})},function(n){oe(n,t)})},prepend:function(n,t){dt.firstChild(n).fold(function(){ie(n,t)},function(e){n.dom().insertBefore(t.dom(),e.dom())})},append:ie,appendAt:function(n,t,e){dt.child(n,e).fold(function(){ie(n,t)},function(n){oe(n,t)})},wrap:function(n,t){oe(n,t),ie(t,n)}},ae={before:function(n,t){B.each(t,function(t){ue.before(n,t)})},after:function(n,t){B.each(t,function(e,r){var o=0===r?n:t[r-1];ue.after(o,e)})},prepend:function(n,t){B.each(t.slice().reverse(),function(t){ue.prepend(n,t)})},append:function(n,t){B.each(t,function(t){ue.append(n,t)})}},ce=function(n){var t=n.dom();null!==t.parentNode&&t.parentNode.removeChild(t)},le={empty:function(n){n.dom().textContent="",B.each(dt.children(n),function(n){ce(n)})},remove:ce,unwrap:function(n){var t=dt.children(n);t.length>0&&ae.before(n,t),ce(n)}},se=X.immutable("minRow","minCol","maxRow","maxCol"),fe=function(n,t){var e,r,o,i,u,a,c,l,s,f,d=function(n){return fn.is(n.element(),t)},m=Gt(n),g=Kt.generate(m),p=(r=d,o=(e=g).grid().columns(),i=e.grid().rows(),u=o,a=0,c=0,L.each(e.access(),function(n){if(r(n)){var t=n.row(),e=t+n.rowspan()-1,o=n.column(),l=o+n.colspan()-1;t<i?i=t:e>a&&(a=e),o<u?u=o:l>c&&(c=l)}}),se(i,u,a,c)),h="th:not("+t+"),td:not("+t+")",v=gt.filterFirstLayer(n,"th,td",function(n){return fn.is(n,h)});return B.each(v,le.remove),function(n,t,e,r){for(var o,i,u,a=t.grid().columns(),c=t.grid().rows(),l=0;l<c;l++)for(var s=!1,f=0;f<a;f++)l<e.minRow()||l>e.maxRow()||f<e.minCol()||f>e.maxCol()||(Kt.getAt(t,l,f).filter(r).isNone()?(o=s,i=n[l].element(),u=en.fromTag("td"),ue.append(u,en.fromTag("br")),(o?ue.append:ue.prepend)(i,u)):s=!0)}(m,g,p,d),l=n,s=p,f=B.filter(gt.firstLayer(l,"tr"),function(n){return 0===n.dom().childElementCount}),B.each(f,le.remove),s.minCol()!==s.maxCol()&&s.minRow()!==s.maxRow()||B.each(gt.firstLayer(l,"th,td"),function(n){Dt.remove(n,"rowspan"),Dt.remove(n,"colspan")}),Dt.remove(l,"width"),Dt.remove(l,"height"),re.remove(l,"width"),re.remove(l,"height"),n},de=function(n,t){return en.fromDom(n.dom().cloneNode(t))},me=function(n){return de(n,!0)},ge=function(n,t){var e=en.fromTag(t),r=Dt.clone(n);return Dt.setAll(e,r),e},pe=function(n){return de(n,!1)},he=me,ve=function(n,t){var e=ge(n,t),r=dt.children(me(n));return ae.append(e,r),e},be=(u=xt.isText,a="text",c=function(n){return u(n)?w.from(n.dom().nodeValue):w.none()},l=tt.detect().browser,{get:function(n){if(!u(n))throw new Error("Can only get "+a+" value of a "+a+" node");return s(n).getOr("")},getOption:s=l.isIE()&&10===l.version.major?function(n){try{return c(n)}catch(t){return w.none()}}:c,set:function(n,t){if(!u(n))throw new Error("Can only set raw "+a+" value of a "+a+" node");n.dom().nodeValue=t}}),we={get:function(n){return be.get(n)},getOption:function(n){return be.getOption(n)},set:function(n,t){be.set(n,t)}},ye=function(n){return"img"===xt.name(n)?1:we.getOption(n).fold(function(){return dt.children(n).length},function(n){return n.length})},xe=["img","br"],Ce=ye,Se=function(n){return we.getOption(n).filter(function(n){return 0!==n.trim().length||n.indexOf("\xa0")>-1}).isSome()||B.contains(xe,xt.name(n))},Re=function(n,t){var e=function(n){for(var r=dt.children(n),o=r.length-1;o>=0;o--){var i=r[o];if(t(i))return w.some(i);var u=e(i);if(u.isSome())return u}return w.none()};return e(n)},Te={first:function(n){return Mt.descendant(n,Se)},last:function(n){return Re(n,Se)}},De=function(){var n=en.fromTag("td");return ue.append(n,en.fromTag("br")),n},Ae=function(n,t,e){var r=ve(n,t);return L.each(e,function(n,t){null===n?Dt.remove(r,t):Dt.set(r,t,n)}),r},ke=function(n){return n},Ne=function(n){return function(){return en.fromTag("tr",n.dom())}},Oe=function(n,t,e){return{row:Ne(t),cell:function(t){var r,o,i,u=dt.owner(t.element()),a=en.fromTag(xt.name(t.element()),u.dom()),c=e.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),l=c.length>0?(r=t.element(),o=a,i=c,Te.first(r).map(function(n){var t=i.join(","),e=Bt.ancestors(n,t,function(n){return ot.eq(n,r)});return B.foldr(e,function(n,t){var e=pe(t);return ue.append(n,e),e},o)}).getOr(o)):a;return ue.append(l,en.fromTag("br")),re.copy(t.element(),a),re.remove(a,"height"),1!==t.colspan()&&re.remove(t.element(),"width"),n(t.element(),a),a},replace:Ae,gap:De}},Ee=function(n){return{row:Ne(n),cell:De,replace:ke,gap:De}},Be=function(n,t){var e=(t||document).createElement("div");return e.innerHTML=n,dt.children(en.fromDom(e))},Ie=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],Pe=function(){return{up:m.constant({selector:qt.ancestor,closest:qt.closest,predicate:Mt.ancestor,all:dt.parents}),down:m.constant({selector:Bt.descendants,predicate:Et.descendants}),styles:m.constant({get:re.get,getRaw:re.getRaw,set:re.set,remove:re.remove}),attrs:m.constant({get:Dt.get,set:Dt.set,remove:Dt.remove,copyTo:function(n,t){var e=Dt.clone(n);Dt.setAll(t,e)}}),insert:m.constant({before:ue.before,after:ue.after,afterAll:ae.after,append:ue.append,appendAll:ae.append,prepend:ue.prepend,wrap:ue.wrap}),remove:m.constant({unwrap:le.unwrap,remove:le.remove}),create:m.constant({nu:en.fromTag,clone:function(n){return en.fromDom(n.dom().cloneNode(!1))},text:en.fromText}),query:m.constant({comparePosition:function(n,t){return n.dom().compareDocumentPosition(t.dom())},prevSibling:dt.prevSibling,nextSibling:dt.nextSibling}),property:m.constant({children:dt.children,name:xt.name,parent:dt.parent,isText:xt.isText,isComment:xt.isComment,isElement:xt.isElement,getText:we.get,setText:we.set,isBoundary:function(n){return!!xt.isElement(n)&&("body"===xt.name(n)||B.contains(Ie,xt.name(n)))},isEmptyTag:function(n){return!!xt.isElement(n)&&B.contains(["br","img","hr","input"],xt.name(n))}}),eq:ot.eq,is:ot.is}},We=(X.immutable("left","right"),function(n,t,e,r){var o=t(n,e);return B.foldr(r,function(e,r){var o=t(n,r);return _e(n,e,o)},o)}),_e=function(n,t,e){return t.bind(function(t){return e.filter(m.curry(n.eq,t))})},Me=function(n,t,e){return e.length>0?We(n,t,(r=e)[0],r.slice(1)):w.none();var r},Le=function(n,t){return m.curry(n.eq,t)},qe=function(n,t,e,r){var o=r!==undefined?r:m.constant(!1),i=[t].concat(n.up().all(t)),u=[e].concat(n.up().all(e)),a=function(n){return B.findIndex(n,o).fold(function(){return n},function(t){return n.slice(0,t+1)})},c=a(i),l=a(u),s=B.find(c,function(t){return B.exists(l,Le(n,t))});return{firstpath:m.constant(c),secondpath:m.constant(l),shared:m.constant(s)}},ze=qe,Fe=function(n,t,e){return Me(n,t,e)},je=function(n,t,e,r){return ze(n,t,e,r)},He=Pe(),Ve=function(n,t){return Fe(He,function(t,e){return n(e)},t)},Ue=function(n,t,e){return je(He,n,t,e)},Ge=function(n,t){return t.column()>=n.startCol()&&t.column()+t.colspan()-1<=n.finishCol()&&t.row()>=n.startRow()&&t.row()+t.rowspan()-1<=n.finishRow()},Xe=function(n,t){var e=t.column(),r=t.column()+t.colspan()-1,o=t.row(),i=t.row()+t.rowspan()-1;return e<=n.finishCol()&&r>=n.startCol()&&o<=n.finishRow()&&i>=n.startRow()},Ye=function(n,t){for(var e=!0,r=m.curry(Ge,t),o=t.startRow();o<=t.finishRow();o++)for(var i=t.startCol();i<=t.finishCol();i++)e=e&&Kt.getAt(n,o,i).exists(r);return e?w.some(t):w.none()},$e=function(n,t,e){var r=Kt.findItem(n,t,ot.eq),o=Kt.findItem(n,e,ot.eq);return r.bind(function(n){return o.map(function(t){return e=n,r=t,nn.bounds(Math.min(e.row(),r.row()),Math.min(e.column(),r.column()),Math.max(e.row()+e.rowspan()-1,r.row()+r.rowspan()-1),Math.max(e.column()+e.colspan()-1,r.column()+r.colspan()-1));var e,r})})},Ke=$e,Je=function(n,t,e){return $e(n,t,e).bind(function(t){return Ye(n,t)})},Qe=function(n,t,e,r){return Kt.findItem(n,t,ot.eq).bind(function(t){var o=e>0?t.row()+t.rowspan()-1:t.row(),i=r>0?t.column()+t.colspan()-1:t.column();return Kt.getAt(n,o+e,i+r).map(function(n){return n.element()})})},Ze=function(n,t,e){return Ke(n,t,e).map(function(t){var e=Kt.filterItems(n,m.curry(Xe,t));return B.map(e,function(n){return n.element()})})},nr=function(n,t){return Kt.findItem(n,t,function(n,t){return ot.contains(t,n)}).bind(function(n){return n.element()})},tr=function(n){var t=Gt(n);return Kt.generate(t)},er=function(n,t,e){return Vt(n).bind(function(r){var o=tr(r);return Qe(o,n,t,e)})},rr=function(n,t,e){var r=tr(n);return Ze(r,t,e)},or=function(n,t,e,r,o){var i=tr(n),u=ot.eq(n,e)?t:nr(i,t),a=ot.eq(n,o)?r:nr(i,r);return Ze(i,u,a)},ir=function(n,t,e){var r=tr(n);return Je(r,t,e)},ur=function(n,t){return qt.ancestor(n,"table")},ar=X.immutableBag(["boxes","start","finish"],[]),cr=function(n,t,e){var r=function(n){return function(t){return e(t)||ot.eq(t,n)}};return ot.eq(n,t)?w.some(ar({boxes:w.some([n]),start:n,finish:t})):ur(n).bind(function(o){return ur(t).bind(function(i){if(ot.eq(o,i))return w.some(ar({boxes:rr(o,n,t),start:n,finish:t}));if(ot.contains(o,i)){var u=(a=Bt.ancestors(t,"td,th",r(o))).length>0?a[a.length-1]:t;return w.some(ar({boxes:or(o,n,o,t,i),start:n,finish:u}))}if(ot.contains(i,o)){var a,c=(a=Bt.ancestors(n,"td,th",r(i))).length>0?a[a.length-1]:n;return w.some(ar({boxes:or(i,n,o,t,i),start:n,finish:c}))}return Ue(n,t).shared().bind(function(u){return qt.closest(u,"table",e).bind(function(e){var u=Bt.ancestors(t,"td,th",r(e)),a=u.length>0?u[u.length-1]:t,c=Bt.ancestors(n,"td,th",r(e)),l=c.length>0?c[c.length-1]:n;return w.some(ar({boxes:or(e,n,o,t,i),start:l,finish:a}))})})})})},lr=cr,sr=function(n,t){var e=Bt.descendants(n,t);return e.length>0?w.some(e):w.none()},fr=function(n,t,e,r,o){return(i=n,u=o,B.find(i,function(n){return fn.is(n,u)})).bind(function(n){return er(n,t,e).bind(function(n){return e=r,qt.ancestor(t=n,"table").bind(function(n){return qt.descendant(n,e).bind(function(n){return cr(n,t).bind(function(n){return n.boxes().map(function(t){return{boxes:m.constant(t),start:m.constant(n.start()),finish:m.constant(n.finish())}})})})});var t,e})});var i,u},dr=function(n,t,e){return qt.descendant(n,t).bind(function(t){return qt.descendant(n,e).bind(function(n){return Ve(ur,[t,n]).map(function(e){return{first:m.constant(t),last:m.constant(n),table:m.constant(e)}})})})},mr=function(n,t){return sr(n,t)},gr=function(n,t,e){return dr(n,t,e).bind(function(t){var e=function(t){return ot.eq(n,t)},r=qt.ancestor(t.first(),"thead,tfoot,tbody,table",e),o=qt.ancestor(t.last(),"thead,tfoot,tbody,table",e);return r.bind(function(n){return o.bind(function(e){return ot.eq(n,e)?ir(t.table(),t.first(),t.last()):w.none()})})})},pr="data-mce-selected",hr="data-mce-first-selected",vr="data-mce-last-selected",br={selected:m.constant(pr),selectedSelector:m.constant("td[data-mce-selected],th[data-mce-selected]"),attributeSelector:m.constant("[data-mce-selected]"),firstSelected:m.constant(hr),firstSelectedSelector:m.constant("td[data-mce-first-selected],th[data-mce-first-selected]"),lastSelected:m.constant(vr),lastSelectedSelector:m.constant("td[data-mce-last-selected],th[data-mce-last-selected]")},wr=function(n){if(!z.isArray(n))throw new Error("cases must be an array");if(0===n.length)throw new Error("there must be at least one case");var t=[],e={};return B.each(n,function(r,o){var i=L.keys(r);if(1!==i.length)throw new Error("one and only one name per case");var u=i[0],a=r[u];if(e[u]!==undefined)throw new Error("duplicate key detected:"+u);if("cata"===u)throw new Error("cannot have a case named cata (sorry)");if(!z.isArray(a))throw new Error("case arguments must be an array");t.push(u),e[u]=function(){var e=arguments.length;if(e!==a.length)throw new Error("Wrong number of arguments to case "+u+". Expected "+a.length+" ("+a+"), got "+e);for(var r=new Array(e),i=0;i<r.length;i++)r[i]=arguments[i];return{fold:function(){if(arguments.length!==n.length)throw new Error("Wrong number of arguments to fold. Expected "+n.length+", got "+arguments.length);return arguments[o].apply(null,r)},match:function(n){var e=L.keys(n);if(t.length!==e.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+e.join(","));if(!B.forall(t,function(n){return B.contains(e,n)}))throw new Error("Not all branches were specified when using match. Specified: "+e.join(", ")+"\nRequired: "+t.join(", "));return n[u].apply(null,r)},log:function(n){console.log(n,{constructors:t,constructor:u,params:r})}}}}),e},yr=wr([{none:[]},{multiple:["elements"]},{single:["selection"]}]),xr={cata:function(n,t,e,r){return n.fold(t,e,r)},none:yr.none,multiple:yr.multiple,single:yr.single},Cr=function(n,t){return xr.cata(t.get(),m.constant([]),m.identity,m.constant([n]))},Sr=function(n,t){return xr.cata(t.get(),w.none,function(t,e){return 0===t.length?w.none():gr(n,br.firstSelectedSelector(),br.lastSelectedSelector()).bind(function(n){return t.length>1?w.some({bounds:m.constant(n),cells:m.constant(t)}):w.none()})},w.none)},Rr=function(n,t){var e=Cr(n,t);return e.length>0&&B.forall(e,function(n){return Dt.has(n,"rowspan")&&parseInt(Dt.get(n,"rowspan"),10)>1||Dt.has(n,"colspan")&&parseInt(Dt.get(n,"colspan"),10)>1})?w.some(e):w.none()},Tr=Cr,Dr=function(n){return{element:m.constant(n),mergable:w.none,unmergable:w.none,selection:m.constant([n])}},Ar=X.immutable("element","clipboard","generators"),kr={noMenu:Dr,forMenu:function(n,t,e){return{element:m.constant(e),mergable:m.constant(Sr(t,n)),unmergable:m.constant(Rr(e,n)),selection:m.constant(Tr(e,n))}},notCell:function(n){return Dr(n)},paste:Ar,pasteRows:function(n,t,e,r,o){return{element:m.constant(e),mergable:w.none,unmergable:w.none,selection:m.constant(Tr(e,n)),clipboard:m.constant(r),generators:m.constant(o)}}},Nr={registerEvents:function(n,t,e,r){n.on("BeforeGetContent",function(e){!0===e.selection&&xr.cata(t.get(),m.noop,function(t){var r;e.preventDefault(),(r=t,Vt(r[0]).map(he).map(function(n){return[fe(n,br.attributeSelector())]})).each(function(t){e.content=B.map(t,function(t){return e=t,n.selection.serializer.serialize(e.dom(),{});var e}).join("")})},m.noop)}),n.on("BeforeSetContent",function(t){!0===t.selection&&!0===t.paste&&w.from(n.dom.getParent(n.selection.getStart(),"th,td")).each(function(o){var i=en.fromDom(o);Vt(i).bind(function(o){var u=B.filter(Be(t.content),function(n){return"meta"!==xt.name(n)});if(1===u.length&&"table"===xt.name(u[0])){t.preventDefault();var a=en.fromDom(n.getDoc()),c=Ee(a),l=kr.paste(i,u[0],c);e.pasteCells(o,l).each(function(t){n.selection.setRng(t),n.focus(),r.clear(o)})}})})})}},Or={render:function(n,t,e,r){var o=en.fromTag("table");re.setAll(o,{"border-collapse":"collapse",width:"100%"}),Dt.set(o,"border","1");var i=en.fromTag("tbody");ue.append(o,i);for(var u=[],a=0;a<n;a++){for(var c=en.fromTag("tr"),l=0;l<t;l++){var s=a<e||l<r?en.fromTag("th"):en.fromTag("td");l<r&&Dt.set(s,"scope","row"),a<e&&Dt.set(s,"scope","col"),ue.append(s,en.fromTag("br")),re.set(s,"width",100/t+"%"),ue.append(c,s)}u.push(c)}return ae.append(i,u),o}},Er=function(n){return n.dom().innerHTML},Br=function(n){var t=en.fromTag("div"),e=en.fromDom(n.dom().cloneNode(!0));return ue.append(t,e),Er(t)},Ir=function(n,t){n.selection.select(t.dom(),!0),n.selection.collapse(!0)},Pr={insert:function(n,t,e){var r,o=Or.render(e,t,0,0);Dt.set(o,"id","__mce");var i,u,a=Br(o);return n.insertContent(a),r=n.dom.get("__mce"),n.dom.setAttrib(r,"id",null),n.$("tr",r).each(function(t,e){n.fire("newrow",{node:e}),n.$("th,td",e).each(function(t,e){n.fire("newcell",{node:e})})}),n.dom.setAttribs(r,n.settings.table_default_attributes||{}),n.dom.setStyles(r,n.settings.table_default_styles||{}),i=n,u=en.fromDom(r),qt.descendant(u,"td,th").each(m.curry(Ir,i)),r}},Wr=function(n,t){var e=function(e){var r=t(e);if(r<=0||null===r){var o=re.get(e,n);return parseFloat(o)||0}return r},r=function(n,t){return B.foldl(t,function(t,e){var r=re.get(n,e),o=r===undefined?0:parseInt(r,10);return isNaN(o)?t:t+o},0)};return{set:function(t,e){if(!z.isNumber(e)&&!e.match(/^[0-9]+$/))throw n+".set accepts only positive integer values. Value was "+e;var r=t.dom();Jt(r)&&(r.style[n]=e+"px")},get:e,getOuter:e,aggregate:r,max:function(n,t,e){var o=r(n,e);return t>o?t-o:0}}},_r=Wr("height",function(n){return Nt.inBody(n)?n.dom().getBoundingClientRect().height:n.dom().offsetHeight}),Mr=function(n){return _r.get(n)},Lr=function(n){return _r.getOuter(n)},qr=Wr("width",function(n){return n.dom().offsetWidth}),zr=function(n){return qr.get(n)},Fr=function(n){return qr.getOuter(n)},jr=tt.detect(),Hr=function(n,t,e){return r=re.get(n,t),o=e,i=parseFloat(r),isNaN(i)?o:i;var r,o,i},Vr=function(n){return jr.browser.isIE()||jr.browser.isEdge()?(e=Hr(t=n,"padding-top",0),r=Hr(t,"padding-bottom",0),o=Hr(t,"border-top-width",0),i=Hr(t,"border-bottom-width",0),u=t.dom().getBoundingClientRect().height,"border-box"===re.get(t,"box-sizing")?u:u-e-r-(o+i)):Hr(n,"height",Mr(n));var t,e,r,o,i,u},Ur=/(\d+(\.\d+)?)(\w|%)*/,Gr=/(\d+(\.\d+)?)%/,Xr=/(\d+(\.\d+)?)px|em/,Yr=function(n,t){re.set(n,"height",t+"px")},$r=function(n,t,e,r){var o,i,u,a,c,l=parseInt(n,10);return Yn.endsWith(n,"%")&&"table"!==xt.name(t)?(i=l,u=e,a=r,c=Vt(o=t).map(function(n){var t=u(n);return Math.floor(i/100*t)}).getOr(i),a(o,c),c):l},Kr=function(n){var t,e=re.getRaw(t=n,"height").getOrThunk(function(){return Vr(t)+"px"});return e?$r(e,n,Mr,Yr):Mr(n)},Jr=function(n,t){return Dt.has(n,t)?parseInt(Dt.get(n,t),10):1},Qr=function(n){return re.getRaw(n,"width").fold(function(){return w.from(Dt.get(n,"width"))},function(n){return w.some(n)})},Zr=function(n,t){return n/t.pixelWidth()*100},no={percentageBasedSizeRegex:m.constant(Gr),pixelBasedSizeRegex:m.constant(Xr),setPixelWidth:function(n,t){re.set(n,"width",t+"px")},setPercentageWidth:function(n,t){re.set(n,"width",t+"%")},setHeight:Yr,getPixelWidth:function(n,t){return Qr(n).fold(function(){var t=zr(n);return parseInt(t,10)},function(e){return function(n,t,e){if(Xr.test(t)){var r=Xr.exec(t);return parseInt(r[1],10)}if(Gr.test(t)){var o=Gr.exec(t),i=parseFloat(o[1]);return i/100*e.pixelWidth()}var u=zr(n);return parseInt(u,10)}(n,e,t)})},getPercentageWidth:function(n,t){return Qr(n).fold(function(){var e=zr(n),r=parseInt(e,10);return Zr(r,t)},function(e){return function(n,t,e){if(Gr.test(t)){var r=Gr.exec(t);return parseFloat(r[1])}var o=zr(n),i=parseInt(o,10);return Zr(i,e)}(n,e,t)})},getGenericWidth:function(n){return Qr(n).bind(function(n){if(Ur.test(n)){var t=Ur.exec(n);return w.some({width:m.constant(t[1]),unit:m.constant(t[3])})}return w.none()})},setGenericWidth:function(n,t,e){re.set(n,"width",t+e)},getHeight:function(n){return e="rowspan",Kr(t=n)/Jr(t,e);var t,e},getRawWidth:Qr},to=function(n,t){no.getGenericWidth(n).each(function(e){var r=e.width()/2;no.setGenericWidth(n,r,e.unit()),no.setGenericWidth(t,r,e.unit())})},eo=function(n,t){var e=t||en.fromDom(document.documentElement);return Mt.ancestor(n,m.curry(ot.eq,e)).isSome()},ro=function(n){var t=n.dom();return t===t.window?n:xt.isDocument(n)?t.defaultView||t.parentWindow:null},oo=function(n,t){return{left:m.constant(n),top:m.constant(t),translate:function(e,r){return oo(n+e,t+r)}}},io=function(n,t){return n!==undefined?n:t!==undefined?t:0},uo=function(n){var t,e=n.dom(),r=e.ownerDocument,o=r.body,i=en.fromDom(r.documentElement);return o===e?oo(o.offsetLeft,o.offsetTop):eo(n,i)?(t=e.getBoundingClientRect(),oo(t.left,t.top)):oo(0,0)},ao=function(n){var t=n.dom().ownerDocument,e=t.body,r=ro(en.fromDom(t)),o=t.documentElement,i=io(r.pageYOffset,o.scrollTop),u=io(r.pageXOffset,o.scrollLeft),a=io(o.clientTop,e.clientTop),c=io(o.clientLeft,e.clientLeft);return uo(n).translate(u-c,i-a)},co=X.immutable("row","y"),lo=X.immutable("col","x"),so=function(n){return ao(n).left()+Fr(n)},fo=function(n){return ao(n).left()},mo=function(n,t){return lo(n,fo(t))},go=function(n,t){return lo(n,so(t))},po=function(n){return ao(n).top()},ho=function(n,t,e){if(0===e.length)return[];var r=B.map(e.slice(1),function(t,e){return t.map(function(t){return n(e,t)})}),o=e[e.length-1].map(function(n){return t(e.length-1,n)});return r.concat([o])},vo={delta:m.identity,positions:m.curry(ho,function(n,t){return co(n,po(t))},function(n,t){return co(n,po(t)+Lr(t))}),edge:po},bo={delta:m.identity,edge:fo,positions:m.curry(ho,mo,go)},wo={height:vo,rtl:{delta:function(n,t){return-n},edge:so,positions:m.curry(ho,go,mo)},ltr:bo},yo={ltr:wo.ltr,rtl:wo.rtl},xo=function(n){var t=function(t){return n(t).isRtl()?yo.rtl:yo.ltr};return{delta:function(n,e){return t(e).delta(n,e)},edge:function(n){return t(n).edge(n)},positions:function(n,e){return t(e).positions(n,e)}}},Co=function(n){var t=Gt(n);return Kt.generate(t).grid()},So=function(n){var t=n,e=function(){return t};return{get:e,set:function(n){t=n},clone:function(){return So(e())}}},Ro=function(n,t){return To(n,t,{validate:z.isFunction,label:"function"})},To=function(n,t,e){if(0===t.length)throw new Error("You must specify at least one required field.");return V("required",t),G(t),function(r){var o=L.keys(r);B.forall(t,function(n){return B.contains(o,n)})||j(t,o),n(t,o);var i=B.filter(t,function(n){return!e.validate(r[n],n)});return i.length>0&&U(i,e.label),r}},Do=m.noop,Ao={exactly:m.curry(Ro,function(n,t){var e=B.filter(t,function(t){return!B.contains(n,t)});e.length>0&&H(e)}),ensure:m.curry(Ro,Do),ensureWith:m.curry(To,Do)},ko=function(n){var t=Dt.has(n,"colspan")?parseInt(Dt.get(n,"colspan"),10):1,e=Dt.has(n,"rowspan")?parseInt(Dt.get(n,"rowspan"),10):1;return{element:m.constant(n),colspan:m.constant(t),rowspan:m.constant(e)}},No=Ao.exactly(["cell","row","replace","gap"]),Oo=function(n,t){No(n);var e=So(w.none()),r=t!==undefined?t:ko,o=function(t){var e,o=r(t);return e=o,n.cell(e)},i=function(n){var t=o(n);return e.get().isNone()&&e.set(w.some(t)),u=w.some({item:n,replacement:t}),t},u=w.none();return{getOrInit:function(n,t){return u.fold(function(){return i(n)},function(e){return t(n,e.item)?e.replacement:i(n)})},cursor:e.get}},Eo=function(n,t){return function(e){var r=So(w.none());No(e);var o=[],i=function(i){var u=e.replace(i,t,{scope:n});return o.push({item:i,sub:u}),r.get().isNone()&&r.set(w.some(u)),u};return{replaceOrInit:function(n,t){return(e=n,r=t,B.find(o,function(n){return r(n.item,e)})).fold(function(){return i(n)},function(e){return t(n,e.item)?e.sub:i(n)});var e,r},cursor:r.get}}},Bo=function(n){No(n);var t=So(w.none());return{combine:function(e){return t.get().isNone()&&t.set(w.some(e)),function(){var t=n.cell({element:m.constant(e),colspan:m.constant(1),rowspan:m.constant(1)});return re.remove(t,"width"),re.remove(e,"width"),t}},cursor:t.get}},Io=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","table","thead","tfoot","tbody","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],Po=function(n,t){var e=n.property().name(t);return B.contains(Io,e)},Wo=function(n,t){return B.contains(["br","img","hr","input"],n.property().name(t))},_o=Po,Mo=function(n,t){var e=n.property().name(t);return B.contains(["ol","ul"],e)},Lo=Wo,qo=Pe(),zo=function(n){return _o(qo,n)},Fo=function(n){return Mo(qo,n)},jo=function(n){return Lo(qo,n)},Ho=function(n){var t,e=function(n){return"br"===xt.name(n)},r=function(n){return Te.last(n).bind(function(t){var r,o=(r=t,dt.nextSibling(r).map(function(n){return!!zo(n)||(jo(n)?"img"!==xt.name(n):void 0)}).getOr(!1));return dt.parent(t).map(function(r){return!0===o||(i=r,"li"===xt.name(i)||Mt.ancestor(i,Fo).isSome())||e(t)||zo(r)&&!ot.eq(n,r)?[]:[en.fromTag("br")];var i})}).getOr([])},o=0===(t=B.bind(n,function(n){var t,o=dt.children(n);return t=o,B.forall(t,function(n){return e(n)||xt.isText(n)&&0===we.get(n).trim().length})?[]:o.concat(r(n))})).length?[en.fromTag("br")]:t;le.empty(n[0]),ae.append(n[0],o)},Vo=function(n){return function(){for(var t=new Array(arguments.length),e=0;e<t.length;e++)t[e]=arguments[e];if(0===t.length)throw new Error("Can't merge zero objects");for(var r={},o=0;o<t.length;o++){var i=t[o];for(var u in i)i.hasOwnProperty(u)&&(r[u]=n(r[u],i[u]))}return r}},Uo=Vo(function(n,t){return z.isObject(n)&&z.isObject(t)?Uo(n,t):t}),Go=Vo(function(n,t){return t}),Xo={deepMerge:Uo,merge:Go},Yo=function(n){for(var t=[],e=function(n){t.push(n)},r=0;r<n.length;r++)n[r].each(e);return t},$o=function(n,t){for(var e=0;e<n.length;e++){var r=t(n[e],e);if(r.isSome())return r}return w.none()},Ko=function(n,t){return nn.rowcells(t,n.section())},Jo=function(n,t){return n.cells()[t]},Qo={addCell:function(n,t,e){var r=n.cells(),o=r.slice(0,t),i=r.slice(t),u=o.concat([e]).concat(i);return Ko(n,u)},setCells:Ko,mutateCell:function(n,t,e){n.cells()[t]=e},getCell:Jo,getCellElement:function(n,t){return Jo(n,t).element()},mapCells:function(n,t){var e=n.cells(),r=B.map(e,t);return nn.rowcells(r,n.section())},cellLength:function(n){return n.cells().length}},Zo=function(n,t){if(0===n.length)return 0;var e=n[0];return B.findIndex(n,function(n){return!t(e.element(),n.element())}).fold(function(){return n.length},function(n){return n})},ni=function(n,t,e,r){var o,i,u,a,c=(o=n,i=t,o[i]).cells().slice(e),l=Zo(c,r),s=(u=n,a=e,B.map(u,function(n){return Qo.getCell(n,a)})).slice(t),f=Zo(s,r);return{colspan:m.constant(l),rowspan:m.constant(f)}},ti=function(n,t){var e=B.map(n,function(n,t){return B.map(n.cells(),function(n,t){return!1})});return B.map(n,function(r,o){var i=B.bind(r.cells(),function(r,i){if(!1===e[o][i]){var u=ni(n,o,i,t);return function(n,t,r,o){for(var i=n;i<n+r;i++)for(var u=t;u<t+o;u++)e[i][u]=!0}(o,i,u.rowspan(),u.colspan()),[nn.detailnew(r.element(),u.rowspan(),u.colspan(),r.isNew())]}return[]});return nn.rowdetails(i,r.section())})},ei=function(n,t,e){for(var r=[],o=0;o<n.grid().rows();o++){for(var i=[],u=0;u<n.grid().columns();u++){var a=Kt.getAt(n,o,u).map(function(n){return nn.elementnew(n.element(),e)}).getOrThunk(function(){return nn.elementnew(t.gap(),!0)});i.push(a)}var c=nn.rowcells(i,n.all()[o].section());r.push(c)}return r},ri=function(n,t,e,r){e===r?Dt.remove(n,t):Dt.set(n,t,e)},oi=function(n,t){var e=[],r=[],o=function(t,o){t.length>0?function(t,o){var i=qt.child(n,o).getOrThunk(function(){var t=en.fromTag(o,dt.owner(n).dom());return ue.append(n,t),t});le.empty(i);var u=B.map(t,function(n){n.isNew()&&e.push(n.element());var t=n.element();return le.empty(t),B.each(n.cells(),function(n){n.isNew()&&r.push(n.element()),ri(n.element(),"colspan",n.colspan(),1),ri(n.element(),"rowspan",n.rowspan(),1),ue.append(t,n.element())}),t});ae.append(i,u)}(t,o):qt.child(n,o).bind(le.remove)},i=[],u=[],a=[];return B.each(t,function(n){switch(n.section()){case"thead":i.push(n);break;case"tbody":u.push(n);break;case"tfoot":a.push(n)}}),o(i,"thead"),o(u,"tbody"),o(a,"tfoot"),{newRows:m.constant(e),newCells:m.constant(r)}},ii=function(n){return B.map(n,function(n){var t=pe(n.element());return B.each(n.cells(),function(n){var e=he(n.element());ri(e,"colspan",n.colspan(),1),ri(e,"rowspan",n.rowspan(),1),ue.append(t,e)}),t})},ui=function(n,t){for(var e=[],r=0;r<n;r++)e.push(t(r));return e},ai=function(n,t){for(var e=[],r=n;r<t;r++)e.push(r);return e},ci=function(n,t){if(t<0||t>=n.length-1)return w.none();var e=n[t].fold(function(){var e=B.reverse(n.slice(0,t));return $o(e,function(n,t){return n.map(function(n){return{value:n,delta:t+1}})})},function(n){return w.some({value:n,delta:0})}),r=n[t+1].fold(function(){var e=n.slice(t+1);return $o(e,function(n,t){return n.map(function(n){return{value:n,delta:t+1}})})},function(n){return w.some({value:n,delta:1})});return e.bind(function(n){return r.map(function(t){var e=t.delta+n.delta;return Math.abs(t.value-n.value)/e})})},li=function(n,t,e){var r=n();return B.find(r,t).orThunk(function(){return w.from(r[0]).orThunk(e)}).map(function(n){return n.element()})},si=function(n){var t=n.grid(),e=ai(0,t.columns()),r=ai(0,t.rows());return B.map(e,function(t){return li(function(){return B.bind(r,function(e){return Kt.getAt(n,e,t).filter(function(n){return n.column()===t}).fold(m.constant([]),function(n){return[n]})})},function(n){return 1===n.colspan()},function(){return Kt.getAt(n,0,t)})})},fi=function(n){var t=n.grid(),e=ai(0,t.rows()),r=ai(0,t.columns());return B.map(e,function(t){return li(function(){return B.bind(r,function(e){return Kt.getAt(n,t,e).filter(function(n){return n.row()===t}).fold(m.constant([]),function(n){return[n]})})},function(n){return 1===n.rowspan()},function(){return Kt.getAt(n,t,0)})})},di=function(n,t,e,r,o){var i=en.fromTag("div");return re.setAll(i,{position:"absolute",left:t-r/2+"px",top:e+"px",height:o+"px",width:r+"px"}),Dt.setAll(i,{"data-column":n,role:"presentation"}),i},mi=function(n,t,e,r,o){var i=en.fromTag("div");return re.setAll(i,{position:"absolute",left:t+"px",top:e-o/2+"px",height:o+"px",width:r+"px"}),Dt.setAll(i,{"data-row":n,role:"presentation"}),i},gi=function(n){var t=n.replace(/\./g,"-");return{resolve:function(n){return t+"-"+n}}},pi={resolve:gi("ephox-snooker").resolve},hi=function(n,t){var e=Dt.get(n,t);return e===undefined||""===e?[]:e.split(" ")},vi=hi,bi=function(n,t,e){var r=hi(n,t).concat([e]);Dt.set(n,t,r.join(" "))},wi=function(n,t,e){var r=B.filter(hi(n,t),function(n){return n!==e});r.length>0?Dt.set(n,t,r.join(" ")):Dt.remove(n,t)},yi=function(n){return vi(n,"class")},xi=function(n,t){return bi(n,"class",t)},Ci=function(n,t){return wi(n,"class",t)},Si=yi,Ri=xi,Ti=Ci,Di=function(n,t){B.contains(yi(n),t)?Ci(n,t):xi(n,t)},Ai=function(n){return n.dom().classList!==undefined},ki=function(n,t){return Ai(n)&&n.dom().classList.contains(t)},Ni={add:function(n,t){Ai(n)?n.dom().classList.add(t):Ri(n,t)},remove:function(n,t){var e;Ai(n)?n.dom().classList.remove(t):Ti(n,t),0===(Ai(e=n)?e.dom().classList:Si(e)).length&&Dt.remove(e,"class")},toggle:function(n,t){return Ai(n)?n.dom().classList.toggle(t):Di(n,t)},toggler:function(n,t){var e,r,o,i,u,a,c=Ai(n),l=n.dom().classList;return e=function(){c?l.remove(t):Ti(n,t)},r=function(){c?l.add(t):Ri(n,t)},o=ki(n,t),i=o||!1,{on:u=function(){r(),i=!0},off:a=function(){e(),i=!1},toggle:function(){(i?a:u)()},isOn:function(){return i}}},has:ki},Oi=pi.resolve("resizer-bar"),Ei=pi.resolve("resizer-rows"),Bi=pi.resolve("resizer-cols"),Ii=function(n){var t=Bt.descendants(n.parent(),"."+Oi);B.each(t,le.remove)},Pi=function(n,t,e){var r=n.origin();B.each(t,function(t,o){t.each(function(t){var o=e(r,t);Ni.add(o,Oi),ue.append(n.parent(),o)})})},Wi=function(n,t,e,r,o,i){var u,a,c,l,s=ao(t),f=e.length>0?o.positions(e,t):[];u=n,a=f,c=s,l=Fr(t),Pi(u,a,function(n,t){var e=mi(t.row(),c.left()-n.left(),t.y()-n.top(),l,7);return Ni.add(e,Ei),e});var d,m,g,p,h=r.length>0?i.positions(r,t):[];d=n,m=h,g=s,p=Lr(t),Pi(d,m,function(n,t){var e=di(t.col(),t.x()-n.left(),g.top()-n.top(),7,p);return Ni.add(e,Bi),e})},_i=function(n,t){var e=Bt.descendants(n.parent(),"."+Oi);B.each(e,t)},Mi=function(n,t,e,r){Ii(n);var o=Gt(t),i=Kt.generate(o),u=fi(i),a=si(i);Wi(n,t,u,a,e,r)},Li=function(n){_i(n,function(n){re.set(n,"display","none")})},qi=function(n){_i(n,function(n){re.set(n,"display","block")})},zi=Ii,Fi=function(n){return Ni.has(n,Ei)},ji=function(n){return Ni.has(n,Bi)},Hi=function(n,t){return B.map(n,function(n){var e,r=(e=n.details(),$o(e,function(n){return dt.parent(n.element()).map(function(n){var t=dt.parent(n).isNone();return nn.elementnew(n,t)})}).getOrThunk(function(){return nn.elementnew(t.row(),!0)}));return nn.rowdatanew(r.element(),n.details(),n.section(),r.isNew())})},Vi=function(n,t){var e=ti(n,ot.eq);return Hi(e,t)},Ui=function(n,t){var e=B.flatten(B.map(n.all(),function(n){return n.cells()}));return B.find(e,function(n){return ot.eq(t,n.element())})},Gi=function(n,t,e,r,o){return function(i,u,a,c,l){var s=Gt(u),f=Kt.generate(s);return t(f,a).map(function(t){var e=ei(f,c,!1),r=n(e,t,ot.eq,o(c)),i=Vi(r.grid(),c);return{grid:m.constant(i),cursor:r.cursor}}).fold(function(){return w.none()},function(n){var t=oi(u,n.grid());return e(u,n.grid(),l),r(u),Mi(i,u,wo.height,l),w.some({cursor:n.cursor,newRows:t.newRows,newCells:t.newCells})})}},Xi=Vi,Yi=function(n,t){return jt(t.element()).bind(function(t){return Ui(n,t)})},$i=function(n,t){var e=B.map(t.selection(),function(t){return jt(t).bind(function(t){return Ui(n,t)})}),r=Yo(e);return r.length>0?w.some(r):w.none()},Ki=function(n,t){return jt(t.element()).bind(function(e){return Ui(n,e).map(function(n){return Xo.merge(n,{generators:t.generators,clipboard:t.clipboard})})})},Ji=function(n,t){var e=B.map(t.selection(),function(t){return jt(t).bind(function(t){return Ui(n,t)})}),r=Yo(e);return r.length>0?w.some(Xo.merge({cells:r},{generators:t.generators,clipboard:t.clipboard})):w.none()},Qi=function(n,t){return t.mergable()},Zi=function(n,t){return t.unmergable()},nu=function(n){return{is:function(t){return n===t},isValue:m.constant(!0),isError:m.constant(!1),getOr:m.constant(n),getOrThunk:m.constant(n),getOrDie:m.constant(n),or:function(t){return nu(n)},orThunk:function(t){return nu(n)},fold:function(t,e){return e(n)},map:function(t){return nu(t(n))},each:function(t){t(n)},bind:function(t){return t(n)},exists:function(t){return t(n)},forall:function(t){return t(n)},toOption:function(){return w.some(n)}}},tu=function(n){return{is:m.constant(!1),isValue:m.constant(!1),isError:m.constant(!0),getOr:m.identity,getOrThunk:function(n){return n()},getOrDie:function(){return m.die(n)()},or:function(n){return n},orThunk:function(n){return n()},fold:function(t,e){return t(n)},map:function(t){return tu(n)},each:m.noop,bind:function(t){return tu(n)},exists:m.constant(!1),forall:m.constant(!0),toOption:w.none}},eu={value:nu,error:tu},ru=function(n,t){return B.map(n,function(){return nn.elementnew(t.cell(),!0)})},ou=function(n,t,e){return n.concat(ui(t,function(t){return Qo.setCells(n[n.length-1],ru(n[n.length-1].cells(),e))}))},iu=function(n,t,e){return B.map(n,function(n){return Qo.setCells(n,n.cells().concat(ru(ai(0,t),e)))})},uu=function(n,t,e){if(n.row()>=t.length||n.column()>Qo.cellLength(t[0]))return eu.error("invalid start address out of table bounds, row: "+n.row()+", column: "+n.column());var r=t.slice(n.row()),o=r[0].cells().slice(n.column()),i=Qo.cellLength(e[0]),u=e.length;return eu.value({rowDelta:m.constant(r.length-u),colDelta:m.constant(o.length-i)})},au=function(n,t){var e=Qo.cellLength(n[0]),r=Qo.cellLength(t[0]);return{rowDelta:m.constant(0),colDelta:m.constant(e-r)}},cu=function(n,t,e){var r=t.colDelta()<0?iu:m.identity;return(t.rowDelta()<0?ou:m.identity)(r(n,Math.abs(t.colDelta()),e),Math.abs(t.rowDelta()),e)},lu=function(n,t,e,r){if(0===n.length)return n;for(var o=t.startRow();o<=t.finishRow();o++)for(var i=t.startCol();i<=t.finishCol();i++)Qo.mutateCell(n[o],i,nn.elementnew(r(),!1));return n},su=function(n,t,e,r){for(var o=!0,i=0;i<n.length;i++)for(var u=0;u<Qo.cellLength(n[0]);u++){var a=e(Qo.getCellElement(n[i],u),t);!0===a&&!1===o?Qo.mutateCell(n[i],u,nn.elementnew(r(),!0)):!0===a&&(o=!1)}return n},fu=function(n,t,e,r){if(t>0&&t<n.length){var o=n[t-1].cells(),i=(u=o,a=e,B.foldl(u,function(n,t){return B.exists(n,function(n){return a(n.element(),t.element())})?n:n.concat([t])},[]));B.each(i,function(o){for(var i=w.none(),u=t;u<n.length;u++)for(var a=0;a<Qo.cellLength(n[0]);a++){var c=n[u].cells()[a];e(c.element(),o.element())&&(i.isNone()&&(i=w.some(r())),i.each(function(t){Qo.mutateCell(n[u],a,nn.elementnew(t,!0))}))}})}var u,a;return n},du=function(n,t,e,r,o){return uu(n,t,e).map(function(i){var u=cu(t,i,r);return function(n,t,e,r,o){for(var i,u,a,c,l,s,f,d=n.row(),g=n.column(),p=d+e.length,h=g+Qo.cellLength(e[0]),v=d;v<p;v++)for(var b=g;b<h;b++){i=t,u=v,a=b,c=o,l=void 0,s=void 0,l=Qo.getCell(i[u],a),s=m.curry(c,l.element()),f=i[u],i.length>1&&Qo.cellLength(f)>1&&(a>0&&s(Qo.getCellElement(f,a-1))||a<f.length-1&&s(Qo.getCellElement(f,a+1))||u>0&&s(Qo.getCellElement(i[u-1],a))||u<i.length-1&&s(Qo.getCellElement(i[u+1],a)))&&su(t,Qo.getCellElement(t[v],b),o,r.cell);var w=Qo.getCellElement(e[v-d],b-g),y=r.replace(w);Qo.mutateCell(t[v],b,nn.elementnew(y,!0))}return t}(n,u,e,r,o)})},mu=function(n,t,e,r,o){fu(t,n,o,r.cell);var i=au(e,t),u=cu(e,i,r),a=au(t,u),c=cu(t,a,r);return c.slice(0,n).concat(u).concat(c.slice(n,c.length))},gu=function(n,t,e,r,o){var i=n.slice(0,t),u=n.slice(t),a=Qo.mapCells(n[e],function(e,i){return t>0&&t<n.length&&r(Qo.getCellElement(n[t-1],i),Qo.getCellElement(n[t],i))?Qo.getCell(n[t],i):nn.elementnew(o(e.element(),r),!0)});return i.concat([a]).concat(u)},pu=function(n,t,e,r,o){return B.map(n,function(n){var i=t>0&&t<Qo.cellLength(n)&&r(Qo.getCellElement(n,t-1),Qo.getCellElement(n,t))?Qo.getCell(n,t):nn.elementnew(o(Qo.getCellElement(n,e),r),!0);return Qo.addCell(n,t,i)})},hu=function(n,t,e,r,o){var i=e+1;return B.map(n,function(n,u){var a=u===t?nn.elementnew(o(Qo.getCellElement(n,e),r),!0):Qo.getCell(n,e);return Qo.addCell(n,i,a)})},vu=function(n,t,e,r,o){var i=t+1,u=n.slice(0,i),a=n.slice(i),c=Qo.mapCells(n[t],function(n,t){return t===e?nn.elementnew(o(n.element(),r),!0):n});return u.concat([c]).concat(a)},bu=function(n,t,e){return n.slice(0,t).concat(n.slice(e+1))},wu=function(n,t,e){var r=B.map(n,function(n){var r=n.cells().slice(0,t).concat(n.cells().slice(e+1));return nn.rowcells(r,n.section())});return B.filter(r,function(n){return n.cells().length>0})},yu=function(n,t,e,r){return B.map(n,function(n){return Qo.mapCells(n,function(n){return o=n,B.exists(t,function(n){return e(o.element(),n.element())})?nn.elementnew(r(n.element(),e),!0):n;var o})})},xu=function(n,t,e,r){return Qo.getCellElement(n[t],e)!==undefined&&t>0&&r(Qo.getCellElement(n[t-1],e),Qo.getCellElement(n[t],e))},Cu=function(n,t,e){return t>0&&e(Qo.getCellElement(n,t-1),Qo.getCellElement(n,t))},Su=function(n,t,e,r){var o=B.bind(n,function(r,o){return xu(n,o,t,e)||Cu(r,t,e)?[]:[Qo.getCell(r,t)]});return yu(n,o,e,r)},Ru=function(n,t,e,r){var o=n[t],i=B.bind(o.cells(),function(r,i){return xu(n,t,i,e)||Cu(o,i,e)?[]:[r]});return yu(n,i,e,r)},Tu=function(n){return{fold:n}},Du=function(){return Tu(function(n,t,e,r,o){return n()})},Au=function(n){return Tu(function(t,e,r,o,i){return e(n)})},ku=function(n,t){return Tu(function(e,r,o,i,u){return o(n,t)})},Nu=function(n,t,e){return Tu(function(r,o,i,u,a){return u(n,t,e)})},Ou=function(n,t){return Tu(function(e,r,o,i,u){return u(n,t)})},Eu=function(n,t,e,r){var o,i,u=n.slice(0),a=(i=t,0===(o=n).length?Du():1===o.length?Au(0):0===i?ku(0,1):i===o.length-1?Ou(i-1,i):i>0&&i<o.length-1?Nu(i-1,i,i+1):Du()),c=function(n){return B.map(n,m.constant(0))},l=m.constant(c(u)),s=function(n,t){if(e>=0){var o=Math.max(r.minCellWidth(),u[t]-e);return c(u.slice(0,n)).concat([e,o-u[t]]).concat(c(u.slice(t+1)))}var i=Math.max(r.minCellWidth(),u[n]+e),a=u[n]-i;return c(u.slice(0,n)).concat([i-u[n],a]).concat(c(u.slice(t+1)))},f=s;return a.fold(l,function(n){return r.singleColumnWidth(u[n],e)},f,function(n,t,e){return s(t,e)},function(n,t){if(e>=0)return c(u.slice(0,t)).concat([e]);var o=Math.max(r.minCellWidth(),u[t]+e);return c(u.slice(0,t)).concat([o-u[t]])})},Bu=function(n,t){return Dt.has(n,t)&&parseInt(Dt.get(n,t),10)>1},Iu={hasColspan:function(n){return Bu(n,"colspan")},hasRowspan:function(n){return Bu(n,"rowspan")},minWidth:m.constant(10),minHeight:m.constant(10),getInt:function(n,t){return parseInt(re.get(n,t),10)}},Pu=function(n,t,e){return re.getRaw(n,t).fold(function(){return e(n)+"px"},function(n){return n})},Wu=function(n){return Pu(n,"width",no.getPixelWidth)},_u=function(n){return Pu(n,"height",no.getHeight)},Mu=function(n,t,e,r,o){var i=si(n),u=B.map(i,function(n){return n.map(t.edge)});return B.map(i,function(n,t){return n.filter(m.not(Iu.hasColspan)).fold(function(){var n=ci(u,t);return r(n)},function(n){return e(n,o)})})},Lu=function(n){return n.map(function(n){return n+"px"}).getOr("")},qu=function(n,t,e,r){var o=fi(n),i=B.map(o,function(n){return n.map(t.edge)});return B.map(o,function(n,t){return n.filter(m.not(Iu.hasRowspan)).fold(function(){var n=ci(i,t);return r(n)},function(n){return e(n)})})},zu={getRawWidths:function(n,t){return Mu(n,t,Wu,Lu)},getPixelWidths:function(n,t,e){return Mu(n,t,no.getPixelWidth,function(n){return n.getOrThunk(e.minCellWidth)},e)},getPercentageWidths:function(n,t,e){return Mu(n,t,no.getPercentageWidth,function(n){return n.fold(function(){return e.minCellWidth()},function(n){return n/e.pixelWidth()*100})},e)},getPixelHeights:function(n,t){return qu(n,t,no.getHeight,function(n){return n.getOrThunk(Iu.minHeight)})},getRawHeights:function(n,t){return qu(n,t,_u,Lu)}},Fu=function(n,t,e){for(var r=0,o=n;o<t;o++)r+=e[o]!==undefined?e[o]:0;return r},ju=function(n,t){var e=Kt.justCells(n);return B.map(e,function(n){var e=Fu(n.column(),n.column()+n.colspan(),t);return{element:n.element,width:m.constant(e),colspan:n.colspan}})},Hu=function(n,t){var e=Kt.justCells(n);return B.map(e,function(n){var e=Fu(n.row(),n.row()+n.rowspan(),t);return{element:n.element,height:m.constant(e),rowspan:n.rowspan}})},Vu=function(n,t){return B.map(n.all(),function(n,e){return{element:n.element,height:m.constant(t[e])}})},Uu=function(n){var t=parseInt(n,10),e=m.identity;return{width:m.constant(t),pixelWidth:m.constant(t),getWidths:zu.getPixelWidths,getCellDelta:e,singleColumnWidth:function(n,t){return[Math.max(Iu.minWidth(),n+t)-n]},minCellWidth:Iu.minWidth,setElementWidth:no.setPixelWidth,setTableWidth:function(n,t,e){var r=B.foldr(t,function(n,t){return n+t},0);no.setPixelWidth(n,r)}}},Gu=function(n,t){if(no.percentageBasedSizeRegex().test(t)){var e=no.percentageBasedSizeRegex().exec(t);return o=e[1],i=n,u=parseFloat(o),a=zr(i),{width:m.constant(u),pixelWidth:m.constant(a),getWidths:zu.getPercentageWidths,getCellDelta:function(n){return n/a*100},singleColumnWidth:function(n,t){return[100-n]},minCellWidth:function(){return Iu.minWidth()/a*100},setElementWidth:no.setPercentageWidth,setTableWidth:function(n,t,e){var r=u+e;no.setPercentageWidth(n,r)}}}if(no.pixelBasedSizeRegex().test(t)){var r=no.pixelBasedSizeRegex().exec(t);return Uu(r[1])}var o,i,u,a,c=zr(n);return Uu(c)},Xu=function(n){return no.getRawWidth(n).fold(function(){var t=zr(n);return Uu(t)},function(t){return Gu(n,t)})},Yu=function(n){return Kt.generate(n)},$u=function(n){var t=Gt(n);return Yu(t)},Ku=function(n,t,e,r){var o=Xu(n),i=o.getCellDelta(t),u=$u(n),a=o.getWidths(u,r,o),c=Eu(a,e,i,o),l=B.map(c,function(n,t){return n+a[t]}),s=ju(u,l);B.each(s,function(n){o.setElementWidth(n.element(),n.width())}),e===u.grid().columns()-1&&o.setTableWidth(n,l,i)},Ju=function(n,t,e,r){var o=$u(n),i=zu.getPixelHeights(o,r),u=B.map(i,function(n,r){return e===r?Math.max(t+n,Iu.minHeight()):n}),a=Hu(o,u),c=Vu(o,u);B.each(c,function(n){no.setHeight(n.element(),n.height())}),B.each(a,function(n){no.setHeight(n.element(),n.height())});var l,s=(l=u,B.foldr(l,function(n,t){return n+t},0));no.setHeight(n,s)},Qu=function(n,t,e){var r=Xu(n),o=Yu(t),i=r.getWidths(o,e,r),u=ju(o,i);B.each(u,function(n){r.setElementWidth(n.element(),n.width())});var a=B.foldr(i,function(n,t){return t+n},0);u.length>0&&r.setElementWidth(n,a)},Zu=function(n){0===Ht(n).length&&le.remove(n)},na=X.immutable("grid","cursor"),ta=function(n,t,e){return ea(n,t,e).orThunk(function(){return ea(n,0,0)})},ea=function(n,t,e){return w.from(n[t]).bind(function(n){return w.from(n.cells()[e]).bind(function(n){return w.from(n.element())})})},ra=function(n,t,e){return na(n,ea(n,t,e))},oa=function(n){return B.foldl(n,function(n,t){return B.exists(n,function(n){return n.row()===t.row()})?n:n.concat([t])},[]).sort(function(n,t){return n.row()-t.row()})},ia=function(n){return B.foldl(n,function(n,t){return B.exists(n,function(n){return n.column()===t.column()})?n:n.concat([t])},[]).sort(function(n,t){return n.column()-t.column()})},ua=function(n,t,e){var r=Xt(n,e),o=Kt.generate(r);return ei(o,t,!0)},aa=Qu,ca={insertRowBefore:Gi(function(n,t,e,r){var o=t.row(),i=t.row(),u=gu(n,i,o,e,r.getOrInit);return ra(u,i,t.column())},Yi,m.noop,m.noop,Oo),insertRowsBefore:Gi(function(n,t,e,r){var o=t[0].row(),i=t[0].row(),u=oa(t),a=B.foldl(u,function(n,t){return gu(n,i,o,e,r.getOrInit)},n);return ra(a,i,t[0].column())},$i,m.noop,m.noop,Oo),insertRowAfter:Gi(function(n,t,e,r){var o=t.row(),i=t.row()+t.rowspan(),u=gu(n,i,o,e,r.getOrInit);return ra(u,i,t.column())},Yi,m.noop,m.noop,Oo),insertRowsAfter:Gi(function(n,t,e,r){var o=oa(t),i=o[o.length-1].row(),u=o[o.length-1].row()+o[o.length-1].rowspan(),a=B.foldl(o,function(n,t){return gu(n,u,i,e,r.getOrInit)},n);return ra(a,u,t[0].column())},$i,m.noop,m.noop,Oo),insertColumnBefore:Gi(function(n,t,e,r){var o=t.column(),i=t.column(),u=pu(n,i,o,e,r.getOrInit);return ra(u,t.row(),i)},Yi,aa,m.noop,Oo),insertColumnsBefore:Gi(function(n,t,e,r){var o=ia(t),i=o[0].column(),u=o[0].column(),a=B.foldl(o,function(n,t){return pu(n,u,i,e,r.getOrInit)},n);return ra(a,t[0].row(),u)},$i,aa,m.noop,Oo),insertColumnAfter:Gi(function(n,t,e,r){var o=t.column(),i=t.column()+t.colspan(),u=pu(n,i,o,e,r.getOrInit);return ra(u,t.row(),i)},Yi,aa,m.noop,Oo),insertColumnsAfter:Gi(function(n,t,e,r){var o=t[t.length-1].column(),i=t[t.length-1].column()+t[t.length-1].colspan(),u=ia(t),a=B.foldl(u,function(n,t){return pu(n,i,o,e,r.getOrInit)},n);return ra(a,t[0].row(),i)},$i,aa,m.noop,Oo),splitCellIntoColumns:Gi(function(n,t,e,r){var o=hu(n,t.row(),t.column(),e,r.getOrInit);return ra(o,t.row(),t.column())},Yi,aa,m.noop,Oo),splitCellIntoRows:Gi(function(n,t,e,r){var o=vu(n,t.row(),t.column(),e,r.getOrInit);return ra(o,t.row(),t.column())},Yi,m.noop,m.noop,Oo),eraseColumns:Gi(function(n,t,e,r){var o=ia(t),i=wu(n,o[0].column(),o[o.length-1].column()),u=ta(i,t[0].row(),t[0].column());return na(i,u)},$i,aa,Zu,Oo),eraseRows:Gi(function(n,t,e,r){var o=oa(t),i=bu(n,o[0].row(),o[o.length-1].row()),u=ta(i,t[0].row(),t[0].column());return na(i,u)},$i,m.noop,Zu,Oo),makeColumnHeader:Gi(function(n,t,e,r){var o=Su(n,t.column(),e,r.replaceOrInit);return ra(o,t.row(),t.column())},Yi,m.noop,m.noop,Eo("row","th")),unmakeColumnHeader:Gi(function(n,t,e,r){var o=Su(n,t.column(),e,r.replaceOrInit);return ra(o,t.row(),t.column())},Yi,m.noop,m.noop,Eo(null,"td")),makeRowHeader:Gi(function(n,t,e,r){var o=Ru(n,t.row(),e,r.replaceOrInit);return ra(o,t.row(),t.column())},Yi,m.noop,m.noop,Eo("col","th")),unmakeRowHeader:Gi(function(n,t,e,r){var o=Ru(n,t.row(),e,r.replaceOrInit);return ra(o,t.row(),t.column())},Yi,m.noop,m.noop,Eo(null,"td")),mergeCells:Gi(function(n,t,e,r){var o=t.cells();Ho(o);var i=lu(n,t.bounds(),e,m.constant(o[0]));return na(i,w.from(o[0]))},Qi,m.noop,m.noop,Bo),unmergeCells:Gi(function(n,t,e,r){var o=B.foldr(t,function(n,t){return su(n,t,e,r.combine(t))},n);return na(o,w.from(t[0]))},Zi,aa,m.noop,Bo),pasteCells:Gi(function(n,t,e,r){var o,i,u,a,c=(o=t.clipboard(),i=t.generators(),u=Gt(o),a=Kt.generate(u),ei(a,i,!0)),l=nn.address(t.row(),t.column());return du(l,n,c,t.generators(),e).fold(function(){return na(n,w.some(t.element()))},function(n){var e=ta(n,t.row(),t.column());return na(n,e)})},Ki,aa,m.noop,Oo),pasteRowsBefore:Gi(function(n,t,e,r){var o=n[t.cells[0].row()],i=t.cells[0].row(),u=ua(t.clipboard(),t.generators(),o),a=mu(i,n,u,t.generators(),e),c=ta(a,t.cells[0].row(),t.cells[0].column());return na(a,c)},Ji,m.noop,m.noop,Oo),pasteRowsAfter:Gi(function(n,t,e,r){var o=n[t.cells[0].row()],i=t.cells[t.cells.length-1].row()+t.cells[t.cells.length-1].rowspan(),u=ua(t.clipboard(),t.generators(),o),a=mu(i,n,u,t.generators(),e),c=ta(a,t.cells[0].row(),t.cells[0].column());return na(a,c)},Ji,m.noop,m.noop,Oo)},la=function(n){return en.fromDom(n.getBody())},sa={getBody:la,getIsRoot:function(n){return function(t){return ot.eq(t,la(n))}},addSizeSuffix:function(n){return/^[0-9]+$/.test(n)&&(n+="px"),n},removePxSuffix:function(n){return n?n.replace(/px$/,""):""}},fa=function(n){return"rtl"===re.get(n,"direction")?"rtl":"ltr"},da={onDirection:function(n,t){return function(e){return"rtl"===fa(e)?t:n}},getDirection:fa},ma={isRtl:m.constant(!1)},ga={isRtl:m.constant(!0)},pa=function(n){return"rtl"===da.getDirection(n)?ga:ma},ha=function(n,t){var e,r=function(n){return"table"===xt.name(sa.getBody(n))};!1!==n.settings.table_clone_elements&&("string"==typeof n.settings.table_clone_elements?e=n.settings.table_clone_elements.split(/[ ,]/):Array.isArray(n.settings.table_clone_elements)&&(e=n.settings.table_clone_elements));var o=w.from(e),i=function(t,e,r,i){return function(u,a){var c=Bt.descendants(u,"td[data-mce-style],th[data-mce-style]");B.each(c,function(n){Dt.remove(n,"data-mce-style")});var l=i(),s=en.fromDom(n.getDoc()),f=xo(pa),d=Oe(r,s,o);return e(u)?t(l,u,a,d,f).bind(function(t){return B.each(t.newRows(),function(t){var e;e=t,n.fire("newrow",{node:e.dom()}),e.dom()}),B.each(t.newCells(),function(t){var e;e=t,n.fire("newcell",{node:e.dom()}),e.dom()}),t.cursor().map(function(t){var e=n.dom.createRng();return e.setStart(t.dom(),0),e.setEnd(t.dom(),0),e})}):w.none()}};return{deleteRow:i(ca.eraseRows,function(t){var e=Co(t);return!1===r(n)||e.rows()>1},m.noop,t),deleteColumn:i(ca.eraseColumns,function(t){var e=Co(t);return!1===r(n)||e.columns()>1},m.noop,t),insertRowsBefore:i(ca.insertRowsBefore,m.always,m.noop,t),insertRowsAfter:i(ca.insertRowsAfter,m.always,m.noop,t),insertColumnsBefore:i(ca.insertColumnsBefore,m.always,to,t),insertColumnsAfter:i(ca.insertColumnsAfter,m.always,to,t),mergeCells:i(ca.mergeCells,m.always,m.noop,t),unmergeCells:i(ca.unmergeCells,m.always,m.noop,t),pasteRowsBefore:i(ca.pasteRowsBefore,m.always,m.noop,t),pasteRowsAfter:i(ca.pasteRowsAfter,m.always,m.noop,t),pasteCells:i(ca.pasteCells,m.always,m.noop,t)}},va=function(n,t,e){var r=Gt(n),o=Kt.generate(r);return $i(o,t).map(function(n){var t=ei(o,e,!1).slice(n[0].row(),n[n.length-1].row()+n[n.length-1].rowspan()),r=Xi(t,e);return ii(r)})},ba=tinymce.util.Tools.resolve("tinymce.util.Tools"),wa=tinymce.util.Tools.resolve("tinymce.Env"),ya={applyAlign:function(n,t,e){e&&n.formatter.apply("align"+e,{},t)},applyVAlign:function(n,t,e){e&&n.formatter.apply("valign"+e,{},t)},unApplyAlign:function(n,t){ba.each("left center right".split(" "),function(e){n.formatter.remove("align"+e,{},t)})},unApplyVAlign:function(n,t){ba.each("top middle bottom".split(" "),function(e){n.formatter.remove("valign"+e,{},t)})},getTDTHOverallStyle:function(n,t,e){var r;return r=function(t,r){for(var o=0;o<r.length;o++){var i=n.getStyle(r[o],e);if(void 0===t&&(t=i),t!==i)return""}return t}(r,n.select("td,th",t))}},xa=function(n,t){var e=n.dom,r=t.control.rootControl,o=r.toJSON(),i=e.parseStyle(o.style);"style"===t.control.name()?(r.find("#borderStyle").value(i["border-style"]||"")[0].fire("select"),r.find("#borderColor").value(i["border-color"]||"")[0].fire("change"),r.find("#backgroundColor").value(i["background-color"]||"")[0].fire("change"),r.find("#width").value(i.width||"").fire("change"),r.find("#height").value(i.height||"").fire("change")):(i["border-style"]=o.borderStyle,i["border-color"]=o.borderColor,i["background-color"]=o.backgroundColor,i.width=o.width?sa.addSizeSuffix(o.width):"",i.height=o.height?sa.addSizeSuffix(o.height):""),r.find("#style").value(e.serializeStyle(e.parseStyle(e.serializeStyle(i))))},Ca={createStyleForm:function(n){var t=function(){var t=n.settings.color_picker_callback;if(t)return function(e){return t.call(n,function(n){e.control.value(n).fire("change")},e.control.value())}};return{title:"Advanced",type:"form",defaults:{onchange:m.curry(xa,n)},items:[{label:"Style",name:"style",type:"textbox"},{type:"form",padding:0,formItemDefaults:{layout:"grid",alignH:["start","right"]},defaults:{size:7},items:[{label:"Border style",type:"listbox",name:"borderStyle",width:90,onselect:m.curry(xa,n),values:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]},{label:"Border color",type:"colorbox",name:"borderColor",onaction:t()},{label:"Background color",type:"colorbox",name:"backgroundColor",onaction:t()}]}]}},buildListItems:function(n,t,e){var r=function(n,e){return e=e||[],ba.each(n,function(n){var o={text:n.text||n.title};n.menu?o.menu=r(n.menu):(o.value=n.value,t&&t(o)),e.push(o)}),e};return r(n,e||[])},updateStyleField:xa,extractAdvancedStyles:function(n,t){var e=n.parseStyle(n.getAttrib(t,"style")),r={};return e["border-style"]&&(r.borderStyle=e["border-style"]),e["border-color"]&&(r.borderColor=e["border-color"]),e["background-color"]&&(r.backgroundColor=e["background-color"]),r.style=n.serializeStyle(e),r}};function Sa(n,t,e,r){if("TD"===t.tagName||"TH"===t.tagName)n.setStyle(t,e,r);else if(t.children)for(var o=0;o<t.children.length;o++)Sa(n,t.children[o],e,r)}var Ra=function(n,t,e){var r,o,i=n.dom;Ca.updateStyleField(n,e),!1===(o=e.control.rootControl.toJSON())["class"]&&delete o["class"],n.undoManager.transact(function(){t||(t=Pr.insert(n,o.cols||1,o.rows||1)),function(n,t,e){var r=n.dom,o={},i={};if(o["class"]=e["class"],i.height=sa.addSizeSuffix(e.height),r.getAttrib(t,"width")&&!n.settings.table_style_by_css?o.width=sa.removePxSuffix(e.width):i.width=sa.addSizeSuffix(e.width),n.settings.table_style_by_css?(i["border-width"]=sa.addSizeSuffix(e.border),i["border-spacing"]=sa.addSizeSuffix(e.cellspacing),ba.extend(o,{"data-mce-border-color":e.borderColor,"data-mce-cell-padding":e.cellpadding,"data-mce-border":e.border})):ba.extend(o,{border:e.border,cellpadding:e.cellpadding,cellspacing:e.cellspacing}),n.settings.table_style_by_css&&t.children)for(var u=0;u<t.children.length;u++)Sa(r,t.children[u],{"border-width":sa.addSizeSuffix(e.border),"border-color":e.borderColor,padding:sa.addSizeSuffix(e.cellpadding)});e.style?ba.extend(i,r.parseStyle(e.style)):i=ba.extend({},r.parseStyle(r.getAttrib(t,"style")),i),o.style=r.serializeStyle(i),r.setAttribs(t,o)}(n,t,o),(r=i.select("caption",t)[0])&&!o.caption&&i.remove(r),!r&&o.caption&&((r=i.create("caption")).innerHTML=wa.ie?"\xa0":'<br data-mce-bogus="1"/>',t.insertBefore(r,t.firstChild)),ya.unApplyAlign(n,t),o.align&&ya.applyAlign(n,t,o.align),n.focus(),n.addVisual()})},Ta=function(n,t){var e,r,o,i,u,a,c,l,s,f=n.dom,d={};!0===t?(e=f.getParent(n.selection.getStart(),"table"))&&(c=e,l=(a=n).dom,s={width:l.getStyle(c,"width")||l.getAttrib(c,"width"),height:l.getStyle(c,"height")||l.getAttrib(c,"height"),cellspacing:l.getStyle(c,"border-spacing")||l.getAttrib(c,"cellspacing"),cellpadding:l.getAttrib(c,"data-mce-cell-padding")||l.getAttrib(c,"cellpadding")||ya.getTDTHOverallStyle(a.dom,c,"padding"),border:l.getAttrib(c,"data-mce-border")||l.getAttrib(c,"border")||ya.getTDTHOverallStyle(a.dom,c,"border"),borderColor:l.getAttrib(c,"data-mce-border-color"),caption:!!l.select("caption",c)[0],"class":l.getAttrib(c,"class")},ba.each("left center right".split(" "),function(n){a.formatter.matchNode(c,"align"+n)&&(s.align=n)}),!1!==a.settings.table_advtab&&ba.extend(s,Ca.extractAdvancedStyles(l,c)),d=s):(r={label:"Cols",name:"cols"},o={label:"Rows",name:"rows"}),n.settings.table_class_list&&(d["class"]&&(d["class"]=d["class"].replace(/\s*mce\-item\-table\s*/g,"")),i={name:"class",type:"listbox",label:"Class",values:Ca.buildListItems(n.settings.table_class_list,function(t){t.value&&(t.textStyle=function(){return n.formatter.getCssText({block:"table",classes:[t.value]})})})}),u={type:"form",layout:"flex",direction:"column",labelGapCalc:"children",padding:0,items:[{type:"form",labelGapCalc:!1,padding:0,layout:"grid",columns:2,defaults:{type:"textbox",maxWidth:50},items:!1!==n.settings.table_appearance_options?[r,o,{label:"Width",name:"width",onchange:m.curry(Ca.updateStyleField,n)},{label:"Height",name:"height",onchange:m.curry(Ca.updateStyleField,n)},{label:"Cell spacing",name:"cellspacing"},{label:"Cell padding",name:"cellpadding"},{label:"Border",name:"border"},{label:"Caption",name:"caption",type:"checkbox"}]:[r,o,{label:"Width",name:"width",onchange:m.curry(Ca.updateStyleField,n)},{label:"Height",name:"height",onchange:m.curry(Ca.updateStyleField,n)}]},{label:"Alignment",name:"align",type:"listbox",text:"None",values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},i]},!1!==n.settings.table_advtab?n.windowManager.open({title:"Table properties",data:d,bodyType:"tabpanel",body:[{title:"General",type:"form",items:u},Ca.createStyleForm(n)],onsubmit:m.curry(Ra,n,e)}):n.windowManager.open({title:"Table properties",data:d,body:u,onsubmit:m.curry(Ra,n,e)})},Da=function(n,t,e){var r=n.getParent(t,"table"),o=t.parentNode,i=n.select(e,r)[0];i||(i=n.create(e),r.firstChild?"CAPTION"===r.firstChild.nodeName?n.insertAfter(i,r.firstChild):r.insertBefore(i,r.firstChild):r.appendChild(i)),i.appendChild(t),o.hasChildNodes()||n.remove(o)};function Aa(n,t,e){var r,o=n.dom;function i(n,t,e){e&&o.setAttrib(n,t,e)}Ca.updateStyleField(n,e),r=e.control.rootControl.toJSON(),n.undoManager.transact(function(){ba.each(t,function(e){var u,a,c;i(e,"scope",r.scope),i(e,"style",r.style),i(e,"class",r["class"]),u=e,a="height",(c=sa.addSizeSuffix(r.height))&&o.setStyle(u,a,c),r.type!==e.parentNode.nodeName.toLowerCase()&&Da(n.dom,e,r.type),1===t.length&&ya.unApplyAlign(n,e),r.align&&ya.applyAlign(n,e,r.align)}),n.focus()})}var ka=function(n){var t,e,r,o,i,u,a,c,l,s,f=n.dom,d=[];t=f.getParent(n.selection.getStart(),"table"),e=f.getParent(n.selection.getStart(),"td,th"),ba.each(t.rows,function(n){ba.each(n.cells,function(t){if(f.getAttrib(t,"data-mce-selected")||t===e)return d.push(n),!1})}),(r=d[0])&&(d.length>1?i={height:"",scope:"","class":"",align:"",type:r.parentNode.nodeName.toLowerCase()}:(c=r,l=(a=n).dom,(s={height:l.getStyle(c,"height")||l.getAttrib(c,"height"),scope:l.getAttrib(c,"scope"),"class":l.getAttrib(c,"class")}).type=c.parentNode.nodeName.toLowerCase(),ba.each("left center right".split(" "),function(n){a.formatter.matchNode(c,"align"+n)&&(s.align=n)}),!1!==a.settings.table_row_advtab&&ba.extend(s,Ca.extractAdvancedStyles(l,c)),i=s),n.settings.table_row_class_list&&(o={name:"class",type:"listbox",label:"Class",values:Ca.buildListItems(n.settings.table_row_class_list,function(t){t.value&&(t.textStyle=function(){return n.formatter.getCssText({block:"tr",classes:[t.value]})})})}),u={type:"form",columns:2,padding:0,defaults:{type:"textbox"},items:[{type:"listbox",name:"type",label:"Row type",text:"Header",maxWidth:null,values:[{text:"Header",value:"thead"},{text:"Body",value:"tbody"},{text:"Footer",value:"tfoot"}]},{type:"listbox",name:"align",label:"Alignment",text:"None",maxWidth:null,values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"Height",name:"height"},o]},!1!==n.settings.table_row_advtab?n.windowManager.open({title:"Row properties",data:i,bodyType:"tabpanel",body:[{title:"General",type:"form",items:u},Ca.createStyleForm(n)],onsubmit:m.curry(Aa,n,d)}):n.windowManager.open({title:"Row properties",data:i,body:u,onsubmit:m.curry(Aa,n,d)}))},Na=function(n,t,e){var r,o=n.dom;function i(n,t,e){e&&o.setAttrib(n,t,e)}function u(n,t,e){e&&o.setStyle(n,t,e)}Ca.updateStyleField(n,e),r=e.control.rootControl.toJSON(),n.undoManager.transact(function(){ba.each(t,function(e){var a,c;i(e,"scope",r.scope),1===t.length?i(e,"style",r.style):(a=e,c=r.style,a.style.cssText+=";"+c),i(e,"class",r["class"]),u(e,"width",sa.addSizeSuffix(r.width)),u(e,"height",sa.addSizeSuffix(r.height)),r.type&&e.nodeName.toLowerCase()!==r.type&&(e=o.rename(e,r.type)),1===t.length&&(ya.unApplyAlign(n,e),ya.unApplyVAlign(n,e)),r.align&&ya.applyAlign(n,e,r.align),r.valign&&ya.applyVAlign(n,e,r.valign)}),n.focus()})},Oa=function(n){var t,e,r,o=[];if(o=n.dom.select("td[data-mce-selected],th[data-mce-selected]"),t=n.dom.getParent(n.selection.getStart(),"td,th"),!o.length&&t&&o.push(t),t=t||o[0]){var i,u,a,c;o.length>1?e={width:"",height:"",scope:"","class":"",align:"",style:"",type:t.nodeName.toLowerCase()}:(u=t,a=(i=n).dom,(c={width:a.getStyle(u,"width")||a.getAttrib(u,"width"),height:a.getStyle(u,"height")||a.getAttrib(u,"height"),scope:a.getAttrib(u,"scope"),"class":a.getAttrib(u,"class")}).type=u.nodeName.toLowerCase(),ba.each("left center right".split(" "),function(n){i.formatter.matchNode(u,"align"+n)&&(c.align=n)}),ba.each("top middle bottom".split(" "),function(n){i.formatter.matchNode(u,"valign"+n)&&(c.valign=n)}),!1!==i.settings.table_cell_advtab&&ba.extend(c,Ca.extractAdvancedStyles(a,u)),e=c),n.settings.table_cell_class_list&&(r={name:"class",type:"listbox",label:"Class",values:Ca.buildListItems(n.settings.table_cell_class_list,function(t){t.value&&(t.textStyle=function(){return n.formatter.getCssText({block:"td",classes:[t.value]})})})});var l={type:"form",layout:"flex",direction:"column",labelGapCalc:"children",padding:0,items:[{type:"form",layout:"grid",columns:2,labelGapCalc:!1,padding:0,defaults:{type:"textbox",maxWidth:50},items:[{label:"Width",name:"width",onchange:m.curry(Ca.updateStyleField,n)},{label:"Height",name:"height",onchange:m.curry(Ca.updateStyleField,n)},{label:"Cell type",name:"type",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"Cell",value:"td"},{text:"Header cell",value:"th"}]},{label:"Scope",name:"scope",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Row",value:"row"},{text:"Column",value:"col"},{text:"Row group",value:"rowgroup"},{text:"Column group",value:"colgroup"}]},{label:"H Align",name:"align",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"V Align",name:"valign",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Top",value:"top"},{text:"Middle",value:"middle"},{text:"Bottom",value:"bottom"}]}]},r]};!1!==n.settings.table_cell_advtab?n.windowManager.open({title:"Cell properties",bodyType:"tabpanel",data:e,body:[{title:"General",type:"form",items:l},Ca.createStyleForm(n)],onsubmit:m.curry(Na,n,o)}):n.windowManager.open({title:"Cell properties",data:e,body:l,onsubmit:m.curry(Na,n,o)})}},Ea=ba.each,Ba=w.none(),Ia={registerCommands:function(n,t,e,r){var o=sa.getIsRoot(n),i=function(){return en.fromDom(n.dom.getParent(n.selection.getStart(),"th,td"))},u=function(n){return Vt(n,o)},a=function(t){var o=i();u(o).each(function(i){var u=kr.forMenu(r,i,o);t(i,u).each(function(t){n.selection.setRng(t),n.focus(),e.clear(i)})})},c=function(t){var e=i();return u(e).bind(function(t){var o=en.fromDom(n.getDoc()),i=kr.forMenu(r,t,e),u=Oe(m.noop,o,w.none());return va(t,i,u)})},l=function(t){Ba.each(function(o){var a=B.map(o,function(n){return he(n)}),c=i();u(c).bind(function(o){var i=en.fromDom(n.getDoc()),u=Ee(i),l=kr.pasteRows(r,o,c,a,u);t(o,l).each(function(t){n.selection.setRng(t),n.focus(),e.clear(o)})})})};Ea({mceTableSplitCells:function(){a(t.unmergeCells)},mceTableMergeCells:function(){a(t.mergeCells)},mceTableInsertRowBefore:function(){a(t.insertRowsBefore)},mceTableInsertRowAfter:function(){a(t.insertRowsAfter)},mceTableInsertColBefore:function(){a(t.insertColumnsBefore)},mceTableInsertColAfter:function(){a(t.insertColumnsAfter)},mceTableDeleteCol:function(){a(t.deleteColumn)},mceTableDeleteRow:function(){a(t.deleteRow)},mceTableCutRow:function(n){Ba=c(),a(t.deleteRow)},mceTableCopyRow:function(n){Ba=c()},mceTablePasteRowBefore:function(n){l(t.pasteRowsBefore)},mceTablePasteRowAfter:function(n){l(t.pasteRowsAfter)},mceTableDelete:function(){var t=en.fromDom(n.dom.getParent(n.selection.getStart(),"th,td"));Vt(t,o).filter(m.not(o)).each(function(t){var e=en.fromText("");ue.after(t,e),le.remove(t);var r=n.dom.createRng();r.setStart(e.dom(),0),r.setEnd(e.dom(),0),n.selection.setRng(r)})}},function(t,e){n.addCommand(e,t)}),Ea({mceInsertTable:m.curry(Ta,n),mceTableProps:m.curry(Ta,n,!0),mceTableRowProps:m.curry(ka,n),mceTableCellProps:m.curry(Oa,n)},function(t,e){n.addCommand(e,function(n,e){t(e)})})},getClipboardRows:function(){return Ba.fold(function(){},function(n){return B.map(n,function(n){return n.dom()})})},setClipboardRows:function(n){var t=B.map(n,en.fromDom);Ba=w.from(t)}},Pa=function(n){var t=w.from(n.dom().documentElement).map(en.fromDom).getOr(n);return{parent:m.constant(t),view:m.constant(n),origin:m.constant(oo(0,0))}},Wa=function(n,t){return{parent:m.constant(t),view:m.constant(n),origin:m.constant(oo(0,0))}},_a=function(n){var t=X.immutable.apply(null,n),e=[];return{bind:function(n){if(n===undefined)throw"Event bind error: undefined handler";e.push(n)},unbind:function(n){e=B.filter(e,function(t){return t!==n})},trigger:function(){var n=t.apply(null,arguments);B.each(e,function(t){t(n)})}}},Ma=function(n){return{registry:L.map(n,function(n){return{bind:n.bind,unbind:n.unbind}}),trigger:L.map(n,function(n){return n.trigger})}},La={mode:Ao.exactly(["compare","extract","mutate","sink"]),sink:Ao.exactly(["element","start","stop","destroy"]),api:Ao.exactly(["forceDrop","drop","move","delayDrop"])},qa={resolve:gi("ephox-dragster").resolve},za=function(n,t){return function(e){if(n(e)){var r,o,i,u,a,c,l,s=en.fromDom(e.target),f=function(){e.stopPropagation()},d=function(){e.preventDefault()},g=m.compose(d,f),p=(r=s,o=e.clientX,i=e.clientY,u=f,a=d,c=g,l=e,{target:m.constant(r),x:m.constant(o),y:m.constant(i),stop:u,prevent:a,kill:c,raw:m.constant(l)});t(p)}}},Fa=function(n,t,e,r,o){var i=za(e,r);return n.dom().addEventListener(t,i,o),{unbind:m.curry(ja,n,t,i,o)}},ja=function(n,t,e,r){n.dom().removeEventListener(t,e,r)},Ha=function(n,t,e,r){return Fa(n,t,e,r,!1)},Va=m.constant(!0),Ua=function(n,t,e){return Ha(n,t,Va,e)},Ga=La.mode({compare:function(n,t){return oo(t.left()-n.left(),t.top()-n.top())},extract:function(n){return w.some(oo(n.x(),n.y()))},sink:function(n,t){var e,r,o,i=(e=t,r=Xo.merge({layerClass:qa.resolve("blocker")},e),o=en.fromTag("div"),Dt.set(o,"role","presentation"),re.setAll(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),Ni.add(o,qa.resolve("blocker")),Ni.add(o,r.layerClass),{element:function(){return o},destroy:function(){le.remove(o)}}),u=Ua(i.element(),"mousedown",n.forceDrop),a=Ua(i.element(),"mouseup",n.drop),c=Ua(i.element(),"mousemove",n.move),l=Ua(i.element(),"mouseout",n.delayDrop);return La.sink({element:i.element,start:function(n){ue.append(n,i.element())},stop:function(){le.remove(i.element())},destroy:function(){i.destroy(),a.unbind(),c.unbind(),l.unbind(),u.unbind()}})},mutate:function(n,t){n.mutate(t.left(),t.top())}}),Xa=function(){var n=w.none(),t=Ma({move:_a(["info"])});return{onEvent:function(e,r){r.extract(e).each(function(e){var o,i,u;(o=r,i=e,u=n.map(function(n){return o.compare(n,i)}),n=w.some(i),u).each(function(n){t.trigger.move(n)})})},reset:function(){n=w.none()},events:t.registry}},Ya=function(){var n={onEvent:function(n,t){},reset:m.noop},t=Xa(),e=n;return{on:function(){e.reset(),e=t},off:function(){e.reset(),e=n},isOn:function(){return e===t},onEvent:function(n,t){e.onEvent(n,t)},events:t.events}},$a=function(n,t){var e=null;return{cancel:function(){null!==e&&(clearTimeout(e),e=null)},throttle:function(){var r=arguments;null!==e&&clearTimeout(e),e=setTimeout(function(){n.apply(null,r),e=null,r=null},t)}}},Ka=function(n,t,e){var r=!1,o=Ma({start:_a([]),stop:_a([])}),i=Ya(),u=function(){l.stop(),i.isOn()&&(i.off(),o.trigger.stop())},a=$a(u,200);i.events.move.bind(function(e){t.mutate(n,e.info())});var c=function(n){return function(){var t=Array.prototype.slice.call(arguments,0);if(r)return n.apply(null,t)}},l=t.sink(La.api({forceDrop:u,drop:c(u),move:c(function(n,e){a.cancel(),i.onEvent(n,t)}),delayDrop:c(a.throttle)}),e);return{element:l.element,go:function(n){l.start(n),i.on(),o.trigger.start()},on:function(){r=!0},off:function(){r=!1},destroy:function(){l.destroy()},events:o.registry}},Ja=function(n,t){var e=t!==undefined?t:{},r=e.mode!==undefined?e.mode:Ga;return Ka(n,r,t)},Qa=function(){var n,t=Ma({drag:_a(["xDelta","yDelta","target"])}),e=w.none(),r={mutate:function(t,e){n.trigger.drag(t,e)},events:(n=Ma({drag:_a(["xDelta","yDelta"])})).registry};return r.events.drag.bind(function(n){e.each(function(e){t.trigger.drag(n.xDelta(),n.yDelta(),e)})}),{assign:function(n){e=w.some(n)},get:function(){return e},mutate:r.mutate,events:t.registry}},Za=function(n,t,e){return qt.ancestor(n,t,e).isSome()},nc=pi.resolve("resizer-bar-dragging"),tc=function(n,t){var e=wo.height,r=function(n,t,e){var r=Qa(),o=Ja(r,{}),i=w.none(),u=function(n,t){return w.from(Dt.get(n,t))};r.events.drag.bind(function(n){u(n.target(),"data-row").each(function(t){var e=Iu.getInt(n.target(),"top");re.set(n.target(),"top",e+n.yDelta()+"px")}),u(n.target(),"data-column").each(function(t){var e=Iu.getInt(n.target(),"left");re.set(n.target(),"left",e+n.xDelta()+"px")})});var a=function(n,t){return Iu.getInt(n,t)-parseInt(Dt.get(n,"data-initial-"+t),10)};o.events.stop.bind(function(){r.get().each(function(r){i.each(function(o){u(r,"data-row").each(function(n){var t=a(r,"top");Dt.remove(r,"data-initial-top"),d.trigger.adjustHeight(o,t,parseInt(n,10))}),u(r,"data-column").each(function(n){var t=a(r,"left");Dt.remove(r,"data-initial-left"),d.trigger.adjustWidth(o,t,parseInt(n,10))}),Mi(n,o,e,t)})})});var c=function(t,e){d.trigger.startAdjust(),r.assign(t),Dt.set(t,"data-initial-"+e,parseInt(re.get(t,e),10)),Ni.add(t,nc),re.set(t,"opacity","0.2"),o.go(n.parent())},l=Ua(n.parent(),"mousedown",function(n){Fi(n.target())&&c(n.target(),"top"),ji(n.target())&&c(n.target(),"left")}),s=function(t){return ot.eq(t,n.view())},f=Ua(n.view(),"mouseover",function(r){"table"===xt.name(r.target())||Za(r.target(),"table",s)?(i="table"===xt.name(r.target())?w.some(r.target()):qt.ancestor(r.target(),"table",s)).each(function(r){Mi(n,r,e,t)}):Nt.inBody(r.target())&&zi(n)}),d=Ma({adjustHeight:_a(["table","delta","row"]),adjustWidth:_a(["table","delta","column"]),startAdjust:_a([])});return{destroy:function(){l.unbind(),f.unbind(),o.destroy(),zi(n)},refresh:function(r){Mi(n,r,e,t)},on:o.on,off:o.off,hideBars:m.curry(Li,n),showBars:m.curry(qi,n),events:d.registry}}(n,t,e),o=Ma({beforeResize:_a(["table"]),afterResize:_a(["table"]),startDrag:_a([])});return r.events.adjustHeight.bind(function(n){o.trigger.beforeResize(n.table());var t=e.delta(n.delta(),n.table());Ju(n.table(),t,n.row(),e),o.trigger.afterResize(n.table())}),r.events.startAdjust.bind(function(n){o.trigger.startDrag()}),r.events.adjustWidth.bind(function(n){o.trigger.beforeResize(n.table());var e=t.delta(n.delta(),n.table());Ku(n.table(),e,n.column(),t),o.trigger.afterResize(n.table())}),{on:r.on,off:r.off,hideBars:r.hideBars,showBars:r.showBars,destroy:r.destroy,events:o.registry}},ec=function(n,t){return n.inline?Wa(sa.getBody(n),(e=en.fromTag("div"),re.setAll(e,{position:"static",height:"0",width:"0",padding:"0",margin:"0",border:"0"}),ue.append(Nt.body(),e),e)):Pa(en.fromDom(n.getDoc()));var e},rc=function(n,t){n.inline&&le.remove(t.parent())},oc=function(n){var t,e,r=w.none(),o=w.none(),i=w.none(),u=/(\d+(\.\d+)?)%/,a=function(n){return"TABLE"===n.nodeName};return n.on("init",function(){var t=xo(pa),e=ec(n);if(i=w.some(e),n.settings.object_resizing&&!1!==n.settings.table_resize_bars&&(!0===n.settings.object_resizing||"table"===n.settings.object_resizing)){var u=tc(e,t);u.on(),u.events.startDrag.bind(function(t){r=w.some(n.selection.getRng())}),u.events.afterResize.bind(function(t){var e=t.table(),o=Bt.descendants(e,"td[data-mce-style],th[data-mce-style]");B.each(o,function(n){Dt.remove(n,"data-mce-style")}),r.each(function(t){n.selection.setRng(t),n.focus()}),n.undoManager.add()}),o=w.some(u)}}),n.on("ObjectResizeStart",function(r){var o;a(r.target)&&(t=r.width,o=r.target,e=n.dom.getStyle(o,"width")||n.dom.getAttrib(o,"width"))}),n.on("ObjectResized",function(r){if(a(r.target)){var o=r.target;if(u.test(e)){var i=parseFloat(u.exec(e)[1]),c=r.width*i/t;n.dom.setStyle(o,"width",c+"%")}else{var l=[];ba.each(o.rows,function(t){ba.each(t.cells,function(t){var e=n.dom.getStyle(t,"width",!0);l.push({cell:t,width:e})})}),ba.each(l,function(t){n.dom.setStyle(t.cell,"width",t.width),n.dom.setAttrib(t.cell,"width",null)})}}}),{lazyResize:function(){return o},lazyWire:function(){return i.getOr(Pa(en.fromDom(n.getBody())))},destroy:function(){o.each(function(n){n.destroy()}),i.each(function(t){rc(n,t)})}}},ic=function(n){return{fold:n}},uc=function(n){return ic(function(t,e,r,o){return t(n)})},ac=function(n){return ic(function(t,e,r,o){return e(n)})},cc=function(n,t){return ic(function(e,r,o,i){return o(n,t)})},lc=function(n){return ic(function(t,e,r,o){return o(n)})},sc=function(n,t){return Vt(n,t).bind(function(t){var e=Ht(t);return B.findIndex(e,function(t){return ot.eq(n,t)}).map(function(n){return{index:m.constant(n),all:m.constant(e)}})})},fc=function(n,t){return sc(n,t).fold(function(){return uc(n)},function(t){return t.index()+1<t.all().length?cc(n,t.all()[t.index()+1]):lc(n)})},dc=function(n,t){return sc(n,t).fold(function(){return uc()},function(t){return t.index()-1>=0?cc(n,t.all()[t.index()-1]):ac(n)})},mc=wr([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),gc={before:mc.before,on:mc.on,after:mc.after,cata:function(n,t,e,r){return n.fold(t,e,r)},getStart:function(n){return n.fold(m.identity,m.identity,m.identity)}},pc=wr([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),hc=X.immutable("start","soffset","finish","foffset"),vc={domRange:pc.domRange,relative:pc.relative,exact:pc.exact,exactFromRange:function(n){return pc.exact(n.start(),n.soffset(),n.finish(),n.foffset())},range:hc,getWin:function(n){var t=n.match({domRange:function(n){return en.fromDom(n.startContainer)},relative:function(n,t){return gc.getStart(n)},exact:function(n,t,e,r){return n}});return dt.defaultView(t)}},bc=function(n,t,e,r){var o=dt.owner(n).dom().createRange();return o.setStart(n.dom(),t),o.setEnd(e.dom(),r),o},wc=function(n,t,e,r){var o=bc(n,t,e,r),i=ot.eq(n,e)&&t===r;return o.collapsed&&!i},yc=function(n,t){n.selectNodeContents(t.dom())},xc=function(n){n.deleteContents()},Cc=function(n){return{left:m.constant(n.left),top:m.constant(n.top),right:m.constant(n.right),bottom:m.constant(n.bottom),width:m.constant(n.width),height:m.constant(n.height)}},Sc={create:function(n){return n.document.createRange()},replaceWith:function(n,t){xc(n),n.insertNode(t.dom())},selectNodeContents:function(n,t){var e=n.document.createRange();return yc(e,t),e},selectNodeContentsUsing:yc,relativeToNative:function(n,t,e){var r,o,i=n.document.createRange();return r=i,t.fold(function(n){r.setStartBefore(n.dom())},function(n,t){r.setStart(n.dom(),t)},function(n){r.setStartAfter(n.dom())}),o=i,e.fold(function(n){o.setEndBefore(n.dom())},function(n,t){o.setEnd(n.dom(),t)},function(n){o.setEndAfter(n.dom())}),i},exactToNative:function(n,t,e,r,o){var i=n.document.createRange();return i.setStart(t.dom(),e),i.setEnd(r.dom(),o),i},deleteContents:xc,cloneFragment:function(n){var t=n.cloneContents();return en.fromDom(t)},getFirstRect:function(n){var t=n.getClientRects(),e=t.length>0?t[0]:n.getBoundingClientRect();return e.width>0||e.height>0?w.some(e).map(Cc):w.none()},getBounds:function(n){var t=n.getBoundingClientRect();return t.width>0||t.height>0?w.some(t).map(Cc):w.none()},isWithin:function(n,t){return t.compareBoundaryPoints(n.END_TO_START,n)<1&&t.compareBoundaryPoints(n.START_TO_END,n)>-1},toString:function(n){return n.toString()}},Rc=wr([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),Tc=function(n,t,e){return t(en.fromDom(e.startContainer),e.startOffset,en.fromDom(e.endContainer),e.endOffset)},Dc=function(n,t){var e,r,o,i=(e=n,t.match({domRange:function(n){return{ltr:m.constant(n),rtl:w.none}},relative:function(n,t){return{ltr:yn(function(){return Sc.relativeToNative(e,n,t)}),rtl:yn(function(){return w.some(Sc.relativeToNative(e,t,n))})}},exact:function(n,t,r,o){return{ltr:yn(function(){return Sc.exactToNative(e,n,t,r,o)}),rtl:yn(function(){return w.some(Sc.exactToNative(e,r,o,n,t))})}}}));return(o=(r=i).ltr()).collapsed?r.rtl().filter(function(n){return!1===n.collapsed}).map(function(n){return Rc.rtl(en.fromDom(n.endContainer),n.endOffset,en.fromDom(n.startContainer),n.startOffset)}).getOrThunk(function(){return Tc(0,Rc.ltr,o)}):Tc(0,Rc.ltr,o)},Ac=(Rc.ltr,Rc.rtl,Dc),kc=function(n,t){return Dc(n,t).match({ltr:function(t,e,r,o){var i=n.document.createRange();return i.setStart(t.dom(),e),i.setEnd(r.dom(),o),i},rtl:function(t,e,r,o){var i=n.document.createRange();return i.setStart(r.dom(),o),i.setEnd(t.dom(),e),i}})},Nc=function(n,t,e){return t>=n.left&&t<=n.right&&e>=n.top&&e<=n.bottom},Oc=function(n,t,e,r,o){if(0===o)return 0;if(t===r)return o-1;for(var i=r,u=1;u<o;u++){var a=n(u),c=Math.abs(t-a.left);if(e>a.bottom);else{if(e<a.top||c>i)return u-1;i=c}}return 0},Ec={locate:function(n,t,e,r){var o=n.dom().createRange();o.selectNode(t.dom());var i=o.getClientRects();return $o(i,function(n){return Nc(n,e,r)?w.some(n):w.none()}).map(function(o){return i=n,a=e,c=r,l=o,s=function(n){var t=i.dom().createRange();return t.setStart(u.dom(),n),t.collapse(!0),t},f=we.get(u=t).length,d=Oc(function(n){return s(n).getBoundingClientRect()},a,c,l.right,f),s(d);var i,u,a,c,l,s,f,d})}},Bc=function(n,t,e,r){var o=n.dom().createRange(),i=dt.children(t);return $o(i,function(t){return o.selectNode(t.dom()),Nc(o.getBoundingClientRect(),e,r)?Ic(n,t,e,r):w.none()})},Ic=function(n,t,e,r){return(xt.isText(t)?Ec.locate:Bc)(n,t,e,r)},Pc=function(n,t,e,r){var o=n.dom().createRange();o.selectNode(t.dom());var i=o.getBoundingClientRect(),u=Math.max(i.left,Math.min(i.right,e)),a=Math.max(i.top,Math.min(i.bottom,r));return Ic(n,t,u,a)},Wc=function(n,t){return t-n.left<n.right-t},_c=function(n,t,e){var r=n.dom().createRange();return r.selectNode(t.dom()),r.collapse(e),r},Mc=function(n,t,e){var r=n.dom().createRange();r.selectNode(t.dom());var o=r.getBoundingClientRect(),i=Wc(o,e);return(!0===i?Te.first:Te.last)(t).map(function(t){return _c(n,t,i)})},Lc=function(n,t,e){var r=t.dom().getBoundingClientRect(),o=Wc(r,e);return w.some(_c(n,t,o))},qc=function(n,t,e){return(0===dt.children(t).length?Lc:Mc)(n,t,e)},zc=document.caretPositionFromPoint?function(n,t,e){return w.from(n.dom().caretPositionFromPoint(t,e)).bind(function(t){if(null===t.offsetNode)return w.none();var e=n.dom().createRange();return e.setStart(t.offsetNode,t.offset),e.collapse(),w.some(e)})}:document.caretRangeFromPoint?function(n,t,e){return w.from(n.dom().caretRangeFromPoint(t,e))}:function(n,t,e){return en.fromPoint(n,t,e).bind(function(r){var o=function(){return qc(n,r,t)};return 0===dt.children(r).length?o():function(n,t,e,r){var o=n.dom().createRange();o.selectNode(t.dom());var i=o.getBoundingClientRect(),u=Math.max(i.left,Math.min(i.right,e)),a=Math.max(i.top,Math.min(i.bottom,r));return Pc(n,t,u,a)}(n,r,t,e).orThunk(o)})},Fc=function(n,t,e){var r=en.fromDom(n.document);return zc(r,t,e).map(function(n){return vc.range(en.fromDom(n.startContainer),n.startOffset,en.fromDom(n.endContainer),n.endOffset)})},jc=function(n,t){var e=xt.name(n);return"input"===e?gc.after(n):B.contains(["br","img"],e)?0===t?gc.before(n):gc.after(n):gc.on(n,t)},Hc=function(n,t){var e=n.fold(gc.before,jc,gc.after),r=t.fold(gc.before,jc,gc.after);return vc.relative(e,r)},Vc=function(n,t,e,r){var o=jc(n,t),i=jc(e,r);return vc.relative(o,i)},Uc=function(n){return n.match({domRange:function(n){var t=en.fromDom(n.startContainer),e=en.fromDom(n.endContainer);return Vc(t,n.startOffset,e,n.endOffset)},relative:Hc,exact:Vc})},Gc=Hc,Xc=Vc,Yc=function(n,t){w.from(n.getSelection()).each(function(n){n.removeAllRanges(),n.addRange(t)})},$c=function(n,t,e,r,o){var i=Sc.exactToNative(n,t,e,r,o);Yc(n,i)},Kc=function(n,t){return Ac(n,t).match({ltr:function(t,e,r,o){$c(n,t,e,r,o)},rtl:function(t,e,r,o){var i=n.getSelection();i.extend?(i.collapse(t.dom(),e),i.extend(r.dom(),o)):$c(n,r,o,t,e)}})},Jc=function(n){var t=en.fromDom(n.anchorNode),e=en.fromDom(n.focusNode);return wc(t,n.anchorOffset,e,n.focusOffset)?w.some(vc.range(en.fromDom(n.anchorNode),n.anchorOffset,en.fromDom(n.focusNode),n.focusOffset)):function(n){if(n.rangeCount>0){var t=n.getRangeAt(0),e=n.getRangeAt(n.rangeCount-1);return w.some(vc.range(en.fromDom(t.startContainer),t.startOffset,en.fromDom(e.endContainer),e.endOffset))}return w.none()}(n)},Qc=function(n){var t=n.getSelection();return t.rangeCount>0?Jc(t):w.none()},Zc=function(n,t,e,r,o){var i=Xc(t,e,r,o);Kc(n,i)},nl=function(n){return Qc(n).map(function(n){return vc.exact(n.start(),n.soffset(),n.finish(),n.foffset())})},tl=function(n,t,e){var r=Gc(t,e);Kc(n,r)},el=function(n){var t=vc.getWin(n).dom(),e=function(n,e,r,o){return Sc.exactToNative(t,n,e,r,o)},r=Uc(n);return Ac(t,r).match({ltr:e,rtl:e})},rl=function(n,t){var e=Sc.selectNodeContents(n,t);Yc(n,e)},ol=function(n){n.getSelection().removeAllRanges()},il=function(n,t){var e=kc(n,t);return Sc.getFirstRect(e)},ul=function(n,t,e){return Fc(n,t,e)},al=tinymce.util.Tools.resolve("tinymce.util.VK"),cl=function(n,t,e,r){return fl(n,t,fc(e),r)},ll=function(n,t,e,r){return fl(n,t,dc(e),r)},sl=function(n,t){var e=vc.exact(t,0,t,0);return el(e)},fl=function(n,t,e,r,o){return e.fold(w.none,w.none,function(n,t){return Te.first(t).map(function(n){return sl(0,n)})},function(e){return Vt(e,t).bind(function(t){var o,i=kr.noMenu(e);return n.undoManager.transact(function(){r.insertRowsAfter(t,i)}),o=Bt.descendants(t,"tr"),B.last(o).bind(function(n){return qt.descendant(n,"td,th").map(function(n){return sl(0,n)})})})})},dl=["table","li","dl"],ml={handle:function(n,t,e,r){if(n.keyCode===al.TAB){var o=sa.getBody(t),i=function(n){var t=xt.name(n);return ot.eq(n,o)||B.contains(dl,t)},u=t.selection.getRng();if(u.collapsed){var a=en.fromDom(u.startContainer);jt(a,i).each(function(o){n.preventDefault(),(n.shiftKey?ll:cl)(t,i,o,e,r).each(function(n){t.selection.setRng(n)})})}}}},gl={response:X.immutable("selection","kill")},pl=function(n){return function(t){return t===n}},hl=pl(38),vl=pl(40),bl={ltr:{isBackward:pl(37),isForward:pl(39)},rtl:{isBackward:pl(39),isForward:pl(37)},isUp:hl,isDown:vl,isNavigation:function(n){return n>=37&&n<=40}},wl=function(n,t){var e=kc(n,t);return{start:m.constant(en.fromDom(e.startContainer)),soffset:m.constant(e.startOffset),finish:m.constant(en.fromDom(e.endContainer)),foffset:m.constant(e.endOffset)}},yl=function(n,t,e,r){return{start:m.constant(gc.on(n,t)),finish:m.constant(gc.on(e,r))}},xl=(tt.detect().browser.isSafari(),function(n){var t=n!==undefined?n.dom():document,e=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return oo(e,r)}),Cl=xl,Sl=function(n,t,e){(e!==undefined?e.dom():document).defaultView.scrollBy(n,t)},Rl=function(n){return{elementFromPoint:function(t,e){return w.from(n.document.elementFromPoint(t,e)).map(en.fromDom)},getRect:function(n){return n.dom().getBoundingClientRect()},getRangedRect:function(t,e,r,o){var i=vc.exact(t,e,r,o);return il(n,i).map(function(n){return L.map(n,m.apply)})},getSelection:function(){return nl(n).map(function(t){return wl(n,t)})},fromSitus:function(t){var e=vc.relative(t.start(),t.finish());return wl(n,e)},situsFromPoint:function(t,e){return ul(n,t,e).map(function(n){return{start:m.constant(gc.on(n.start(),n.soffset())),finish:m.constant(gc.on(n.finish(),n.foffset()))}})},clearSelection:function(){ol(n)},setSelection:function(t){Zc(n,t.start(),t.soffset(),t.finish(),t.foffset())},setRelativeSelection:function(t,e){tl(n,t,e)},selectContents:function(t){rl(n,t)},getInnerHeight:function(){return n.innerHeight},getScrollY:function(){return Cl(en.fromDom(n.document)).top()},scrollBy:function(t,e){Sl(t,e,en.fromDom(n.document))}}},Tl=function(n,t,e,r,o){if(!ot.eq(e,r))return lr(e,r,t).bind(function(t){var r=t.boxes().getOr([]);return r.length>0?(o(n,r,t.start(),t.finish()),w.some(gl.response(w.some(yl(e,0,e,Ce(e))),!0))):w.none()})},Dl={sync:function(n,t,e,r,o,i,u){return ot.eq(e,o)&&r===i?w.none():qt.closest(e,"td,th",t).bind(function(e){return qt.closest(o,"td,th",t).bind(function(r){return Tl(n,t,e,r,u)})})},detect:Tl,update:function(n,t,e,r,o){return fr(r,n,t,o.firstSelectedSelector(),o.lastSelectedSelector()).map(function(n){return o.clear(e),o.selectRange(e,n.boxes(),n.start(),n.finish()),n.boxes()})}},Al=X.immutableBag(["left","top","right","bottom"],[]),kl={nu:Al,moveUp:function(n,t){return Al({left:n.left(),top:n.top()-t,right:n.right(),bottom:n.bottom()-t})},moveDown:function(n,t){return Al({left:n.left(),top:n.top()+t,right:n.right(),bottom:n.bottom()+t})},moveBottomTo:function(n,t){var e=n.bottom()-n.top();return Al({left:n.left(),top:t-e,right:n.right(),bottom:t})},moveTopTo:function(n,t){var e=n.bottom()-n.top();return Al({left:n.left(),top:t,right:n.right(),bottom:t+e})},getTop:function(n){return n.top()},getBottom:function(n){return n.bottom()},translate:function(n,t,e){return Al({left:n.left()+t,top:n.top()+e,right:n.right()+t,bottom:n.bottom()+e})},toString:function(n){return"("+n.left()+", "+n.top()+") -> ("+n.right()+", "+n.bottom()+")"}},Nl=function(n){return kl.nu({left:n.left,top:n.top,right:n.right,bottom:n.bottom})},Ol=function(n,t){return w.some(n.getRect(t))},El=function(n,t,e){return xt.isElement(t)?Ol(n,t).map(Nl):xt.isText(t)?(r=n,o=t,i=e,i>=0&&i<Ce(o)?r.getRangedRect(o,i,o,i+1):i>0?r.getRangedRect(o,i-1,o,i):w.none()).map(Nl):w.none();var r,o,i},Bl=function(n,t){return xt.isElement(t)?Ol(n,t).map(Nl):xt.isText(t)?n.getRangedRect(t,0,t,Ce(t)).map(Nl):w.none()},Il=X.immutable("item","mode"),Pl=function(n,t,e,r){var o=r!==undefined?r:Wl;return n.property().parent(t).map(function(n){return Il(n,o)})},Wl=function(n,t,e,r){var o=r!==undefined?r:_l;return e.sibling(n,t).map(function(n){return Il(n,o)})},_l=function(n,t,e,r){var o=r!==undefined?r:_l,i=n.property().children(t);return e.first(i).map(function(n){return Il(n,o)})},Ml=[{current:Pl,next:Wl,fallback:w.none()},{current:Wl,next:_l,fallback:w.some(Pl)},{current:_l,next:_l,fallback:w.some(Wl)}],Ll=function(n,t,e,r,o){return o=o!==undefined?o:Ml,B.find(o,function(n){return n.current===e}).bind(function(e){return e.current(n,t,r,e.next).orThunk(function(){return e.fallback.bind(function(e){return Ll(n,t,e,r)})})})},ql={backtrack:Pl,sidestep:Wl,advance:_l,go:Ll},zl={left:function(){return{sibling:function(n,t){return n.query().prevSibling(t)},first:function(n){return n.length>0?w.some(n[n.length-1]):w.none()}}},right:function(){return{sibling:function(n,t){return n.query().nextSibling(t)},first:function(n){return n.length>0?w.some(n[0]):w.none()}}}},Fl=function(n,t,e,r,o,i){return ql.go(n,t,r,o).bind(function(t){return i(t.item())?w.none():e(t.item())?w.some(t.item()):Fl(n,t.item(),e,t.mode(),o,i)})},jl=function(n,t,e,r){return Fl(n,t,e,ql.sidestep,zl.left(),r)},Hl=function(n,t,e,r){return Fl(n,t,e,ql.sidestep,zl.right(),r)},Vl=function(n,t){return 0===n.property().children(t).length},Ul=function(n,t,e,r){return jl(n,t,e,r)},Gl=function(n,t,e,r){return Hl(n,t,e,r)},Xl={before:function(n,t,e){return Ul(n,t,m.curry(Vl,n),e)},after:function(n,t,e){return Gl(n,t,m.curry(Vl,n),e)},seekLeft:Ul,seekRight:Gl,walkers:function(){return{left:zl.left,right:zl.right}},walk:function(n,t,e,r,o){return ql.go(n,t,e,r,o)},backtrack:ql.backtrack,sidestep:ql.sidestep,advance:ql.advance},Yl=Pe(),$l={gather:function(n,t,e){return Xl.gather(Yl,n,t,e)},before:function(n,t){return Xl.before(Yl,n,t)},after:function(n,t){return Xl.after(Yl,n,t)},seekLeft:function(n,t,e){return Xl.seekLeft(Yl,n,t,e)},seekRight:function(n,t,e){return Xl.seekRight(Yl,n,t,e)},walkers:function(){return Xl.walkers()},walk:function(n,t,e,r){return Xl.walk(Yl,n,t,e,r)}},Kl=wr([{none:[]},{retry:["caret"]}]),Jl=function(n,t,e){return Mt.closest(t,zo).fold(m.constant(!1),function(t){return Bl(n,t).exists(function(n){return r=n,(t=e).left()<r.left()||Math.abs(r.right()-t.left())<1||t.left()>r.right();var t,r})})},Ql={point:kl.getTop,adjuster:function(n,t,e,r,o){var i=kl.moveUp(o,5);return Math.abs(e.top()-r.top())<1?Kl.retry(i):e.bottom()<o.top()?Kl.retry(i):e.bottom()===o.top()?Kl.retry(kl.moveUp(o,1)):Jl(n,t,o)?Kl.retry(kl.translate(i,5,0)):Kl.none()},move:kl.moveUp,gather:$l.before},Zl={point:kl.getBottom,adjuster:function(n,t,e,r,o){var i=kl.moveDown(o,5);return Math.abs(e.bottom()-r.bottom())<1?Kl.retry(i):e.top()>o.bottom()?Kl.retry(i):e.top()===o.bottom()?Kl.retry(kl.moveDown(o,1)):Jl(n,t,o)?Kl.retry(kl.translate(i,5,0)):Kl.none()},move:kl.moveDown,gather:$l.after},ns=function(n,t,e,r,o){return 0===o?w.some(r):(c=n,l=r.left(),s=t.point(r),c.elementFromPoint(l,s).filter(function(n){return"table"===xt.name(n)}).isSome()?(u=r,a=o-1,ns(n,i=t,e,i.move(u,5),a)):n.situsFromPoint(r.left(),t.point(r)).bind(function(i){return i.start().fold(w.none,function(i,u){return Bl(n,i,u).bind(function(u){return t.adjuster(n,i,u,e,r).fold(w.none,function(r){return ns(n,t,e,r,o-1)})}).orThunk(function(){return w.some(r)})},w.none)}));var i,u,a,c,l,s},ts=function(n,t,e){var r,o,i,u=n.move(e,5),a=ns(t,n,e,u,100).getOr(u);return(r=n,o=a,i=t,r.point(o)>i.getInnerHeight()?w.some(r.point(o)-i.getInnerHeight()):r.point(o)<0?w.some(-r.point(o)):w.none()).fold(function(){return t.situsFromPoint(a.left(),n.point(a))},function(e){return t.scrollBy(0,e),t.situsFromPoint(a.left(),n.point(a)-e)})},es={tryUp:m.curry(ts,Ql),tryDown:m.curry(ts,Zl),ieTryUp:function(n,t){return n.situsFromPoint(t.left(),t.top()-5)},ieTryDown:function(n,t){return n.situsFromPoint(t.left(),t.bottom()+5)},getJumpSize:m.constant(5)},rs=wr([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),os=function(n){return qt.closest(n,"tr")},is={verify:function(n,t,e,r,o,i,u){return qt.closest(r,"td,th",u).bind(function(e){return qt.closest(t,"td,th",u).map(function(t){return ot.eq(e,t)?ot.eq(r,e)&&Ce(e)===o?i(t):rs.none("in same cell"):Ve(os,[e,t]).fold(function(){return o=t,u=e,a=(r=n).getRect(o),(c=r.getRect(u)).right>a.left&&c.left<a.right?rs.success():i(t);var r,o,u,a,c},function(n){return i(t)})})}).getOr(rs.none("default"))},cata:function(n,t,e,r,o){return n.fold(t,e,r,o)},adt:rs},us={point:X.immutable("element","offset"),delta:X.immutable("element","deltaOffset"),range:X.immutable("element","start","finish"),points:X.immutable("begin","end"),text:X.immutable("element","text")},as=(X.immutable("ancestor","descendants","element","index"),X.immutable("parent","children","element","index")),cs=function(n,t){return B.findIndex(n,m.curry(ot.eq,t))},ls=function(n){return dt.parent(n).bind(function(t){var e=dt.children(t);return cs(e,n).map(function(r){return as(t,e,n,r)})})},ss=function(n){return"br"===xt.name(n)},fs=function(n,t,e){return t(n,e).bind(function(n){return xt.isText(n)&&0===we.get(n).trim().length?fs(n,t,e):w.some(n)})},ds=function(n,t,e,r){return(o=t,i=e,dt.child(o,i).filter(ss).orThunk(function(){return dt.child(o,i-1).filter(ss)})).bind(function(t){return r.traverse(t).fold(function(){return fs(t,r.gather,n).map(r.relative)},function(n){return ls(n).map(function(n){return gc.on(n.parent(),n.index())})})});var o,i},ms=function(n,t,e,r){var o,i,u;return(ss(t)?(o=n,i=t,(u=r).traverse(i).orThunk(function(){return fs(i,u.gather,o)}).map(u.relative)):ds(n,t,e,r)).map(function(n){return{start:m.constant(n),finish:m.constant(n)}})},gs=function(n){return is.cata(n,function(n){return w.none("BR ADT: none")},function(){return w.none()},function(n){return w.some(us.point(n,0))},function(n){return w.some(us.point(n,Ce(n)))})},ps=tt.detect(),hs=function(n,t,e,r,o,i){return 0===i?w.none():ws(n,t,e,r,o).bind(function(u){var a=n.fromSitus(u),c=is.verify(n,e,r,a.finish(),a.foffset(),o.failure,t);return is.cata(c,function(){return w.none()},function(){return w.some(u)},function(u){return ot.eq(e,u)&&0===r?vs(n,e,r,kl.moveUp,o):hs(n,t,u,0,o,i-1)},function(u){return ot.eq(e,u)&&r===Ce(u)?vs(n,e,r,kl.moveDown,o):hs(n,t,u,Ce(u),o,i-1)})})},vs=function(n,t,e,r,o){return El(n,t,e).bind(function(t){return bs(n,o,r(t,es.getJumpSize()))})},bs=function(n,t,e){return ps.browser.isChrome()||ps.browser.isSafari()||ps.browser.isFirefox()||ps.browser.isEdge()?t.otherRetry(n,e):ps.browser.isIE()?t.ieRetry(n,e):w.none()},ws=function(n,t,e,r,o){return El(n,e,r).bind(function(t){return bs(n,o,t)})},ys=function(n,t,e){return(r=n,o=t,i=e,r.getSelection().bind(function(n){return ms(o,n.finish(),n.foffset(),i).fold(function(){return w.some(us.point(n.finish(),n.foffset()))},function(t){var e=r.fromSitus(t),u=is.verify(r,n.finish(),n.foffset(),e.finish(),e.foffset(),i.failure,o);return gs(u)})})).bind(function(r){return hs(n,t,r.element(),r.offset(),e,20).map(n.fromSitus)});var r,o,i},xs=function(n,t,e){return Mt.ancestor(n,t,e).isSome()},Cs=tt.detect(),Ss=function(n,t,e,r,o){return qt.closest(r,"td,th",t).bind(function(r){return qt.closest(r,"table",t).bind(function(i){return u=i,xs(o,function(n){return dt.parent(n).exists(function(n){return ot.eq(n,u)})})?ys(n,t,e).bind(function(n){return qt.closest(n.finish(),"td,th",t).map(function(t){return{start:m.constant(r),finish:m.constant(t),range:m.constant(n)}})}):w.none();var u})})},Rs=function(n,t,e,r,o,i){return Cs.browser.isIE()?w.none():i(r,t).orThunk(function(){return Ss(n,t,e,r,o).map(function(n){var t=n.range();return gl.response(w.some(yl(t.start(),t.soffset(),t.finish(),t.foffset())),!0)})})},Ts=function(n,t,e,r,o,i,u){return Ss(n,e,r,o,i).bind(function(n){return Dl.detect(t,e,n.start(),n.finish(),u)})},Ds=function(n,t){return qt.closest(n,"tr",t).bind(function(n){return qt.closest(n,"table",t).bind(function(e){var r=Bt.descendants(e,"tr");return ot.eq(n,r[0])?$l.seekLeft(e,function(n){return Te.last(n).isSome()},t).map(function(n){var t=Ce(n);return gl.response(w.some(yl(n,t,n,t)),!0)}):w.none()})})},As=function(n,t){return qt.closest(n,"tr",t).bind(function(n){return qt.closest(n,"table",t).bind(function(e){var r=Bt.descendants(e,"tr");return ot.eq(n,r[r.length-1])?$l.seekRight(e,function(n){return Te.first(n).isSome()},t).map(function(n){return gl.response(w.some(yl(n,0,n,0)),!0)}):w.none()})})},ks=function(n,t){return qt.closest(n,"td,th",t)},Ns={down:{traverse:dt.nextSibling,gather:$l.after,relative:gc.before,otherRetry:es.tryDown,ieRetry:es.ieTryDown,failure:is.adt.failedDown},up:{traverse:dt.prevSibling,gather:$l.before,relative:gc.before,otherRetry:es.tryUp,ieRetry:es.ieTryUp,failure:is.adt.failedUp}},Os=X.immutable("rows","cols"),Es=function(n,t,e,r){var o,i,u,a,c,l,s=Rl(n),f=(o=s,i=t,u=e,a=r,c=w.none(),l=function(){c=w.none()},{mousedown:function(n){a.clear(i),c=ks(n.target(),u)},mouseover:function(n){c.each(function(t){a.clear(i),ks(n.target(),u).each(function(n){lr(t,n,u).each(function(e){var r=e.boxes().getOr([]);(r.length>1||1===r.length&&!ot.eq(t,n))&&(a.selectRange(i,r,e.start(),e.finish()),o.selectContents(n))})})})},mouseup:function(){c.each(l)}});return{mousedown:f.mousedown,mouseover:f.mouseover,mouseup:f.mouseup}},Bs=function(n,t,e,r){var o=Rl(n),i=function(){return r.clear(t),w.none()};return{keydown:function(n,u,a,c,l,s){var f=n.raw().which,d=!0===n.raw().shiftKey;return sr(t,r.selectedSelector()).fold(function(){return bl.isDown(f)&&d?m.curry(Ts,o,t,e,Ns.down,c,u,r.selectRange):bl.isUp(f)&&d?m.curry(Ts,o,t,e,Ns.up,c,u,r.selectRange):bl.isDown(f)?m.curry(Rs,o,e,Ns.down,c,u,As):bl.isUp(f)?m.curry(Rs,o,e,Ns.up,c,u,Ds):w.none},function(n){var e=function(e){return function(){return $o(e,function(e){return Dl.update(e.rows(),e.cols(),t,n,r)}).fold(function(){return dr(t,r.firstSelectedSelector(),r.lastSelectedSelector()).map(function(n){var e=bl.isDown(f)||s.isForward(f)?gc.after:gc.before;return o.setRelativeSelection(gc.on(n.first(),0),e(n.table())),r.clear(t),gl.response(w.none(),!0)})},function(n){return w.some(gl.response(w.none(),!0))})}};return bl.isDown(f)&&d?e([Os(1,0)]):bl.isUp(f)&&d?e([Os(-1,0)]):s.isBackward(f)&&d?e([Os(0,-1),Os(-1,0)]):s.isForward(f)&&d?e([Os(0,1),Os(1,0)]):bl.isNavigation(f)&&!1===d?i:w.none})()},keyup:function(n,o,i,u,a){return sr(t,r.selectedSelector()).fold(function(){var c=n.raw().which;return 0==(!0===n.raw().shiftKey)?w.none():bl.isNavigation(c)?Dl.sync(t,e,o,i,u,a,r.selectRange):w.none()},w.none)}}},Is=function(n){var t=function(t){Dt.remove(t,n.selected()),Dt.remove(t,n.firstSelected()),Dt.remove(t,n.lastSelected())},e=function(t){Dt.set(t,n.selected(),"1")},r=function(e){var r=Bt.descendants(e,n.selectedSelector());B.each(r,t)};return{clear:r,selectRange:function(t,o,i,u){r(t),B.each(o,e),Dt.set(i,n.firstSelected(),"1"),Dt.set(u,n.lastSelected(),"1")},selectedSelector:n.selectedSelector,firstSelectedSelector:n.firstSelectedSelector,lastSelectedSelector:n.lastSelectedSelector}},Ps=function(n,t){var e=X.immutableBag(["mousedown","mouseover","mouseup","keyup","keydown"],[]),r=w.none(),o=Is(br);return n.on("init",function(i){var u=n.getWin(),a=sa.getBody(n),c=sa.getIsRoot(n),l=Es(u,a,c,o),s=Bs(u,a,c,o),f=function(t,e){e.kill()&&t.kill(),e.selection().each(function(t){var e=vc.relative(t.start(),t.finish()),r=kc(u,e);n.selection.setRng(r)})},d=function(t){var e=h(t);if(e.raw().shiftKey&&bl.isNavigation(e.raw().which)){var r=n.selection.getRng(),o=en.fromDom(r.startContainer),i=en.fromDom(r.endContainer);s.keyup(e,o,r.startOffset,i,r.endOffset).each(function(n){f(e,n)})}},g=function(n){return!(Dt.has(n,"data-mce-bogus")||"br"===xt.name(n)||xt.isText(n)&&0===we.get(n).length)},p=function(e){var r,o,i=h(e);t().each(function(n){n.hideBars()}),40===e.which&&(r=en.fromDom(n.getBody()),o=function(n){return dt.prevSibling(n).bind(function(n){return g(n)?w.some(n):o(n)})},dt.lastChild(r).bind(function(n){return g(n)?w.some(n):o(n)})).each(function(t){"table"===xt.name(t)&&(n.settings.forced_root_block?n.dom.add(n.getBody(),n.settings.forced_root_block,n.settings.forced_root_block_attrs,"<br/>"):n.dom.add(n.getBody(),"br"))});var u=n.selection.getRng(),a=en.fromDom(n.selection.getStart()),c=en.fromDom(u.startContainer),l=en.fromDom(u.endContainer),d=pa(a).isRtl()?bl.rtl:bl.ltr;s.keydown(i,c,u.startOffset,l,u.endOffset,d).each(function(n){f(i,n)}),t().each(function(n){n.showBars()})},h=function(n){var t=en.fromDom(n.target),e=function(){n.stopPropagation()},r=function(){n.preventDefault()},o=m.compose(r,e);return{target:m.constant(t),x:m.constant(n.x),y:m.constant(n.y),stop:e,prevent:r,kill:o,raw:m.constant(n)}},v=function(n){return 0===n.button},b=function(n){v(n)&&l.mousedown(h(n))},y=function(n){var t;((t=n).buttons===undefined||0!=(1&t.buttons))&&l.mouseover(h(n))},x=function(n){v&&l.mouseup(h(n))};n.on("mousedown",b),n.on("mouseover",y),n.on("mouseup",x),n.on("keyup",d),n.on("keydown",p),n.on("nodechange",function(){var t=n.selection,e=en.fromDom(t.getStart()),r=en.fromDom(t.getEnd()),i=Vt(e),u=Vt(r);i.bind(function(n){return u.bind(function(t){return ot.eq(n,t)?w.some(!0):w.none()})}).fold(function(){o.clear(a)},m.noop)}),r=w.some(e({mousedown:b,mouseover:y,mouseup:x,keyup:d,keydown:p}))}),{clear:o.clear,destroy:function(){r.each(function(n){})}}},Ws=function(n){return{get:function(){var t=sa.getBody(n);return mr(t,br.selectedSelector()).fold(function(){return n.selection.getStart()===undefined?xr.none():xr.single(n.selection)},function(n){return xr.multiple(n)})}}},_s=ba.each,Ms={addButtons:function(n){var t=[];function e(t){return function(){n.execCommand(t)}}_s("inserttable tableprops deletetable | cell row column".split(" "),function(e){"|"===e?t.push({text:"-"}):t.push(n.menuItems[e])}),n.addButton("table",{type:"menubutton",title:"Table",menu:t}),n.addButton("tableprops",{title:"Table properties",onclick:m.curry(Ta,n,!0),icon:"table"}),n.addButton("tabledelete",{title:"Delete table",onclick:e("mceTableDelete")}),n.addButton("tablecellprops",{title:"Cell properties",onclick:e("mceTableCellProps")}),n.addButton("tablemergecells",{title:"Merge cells",onclick:e("mceTableMergeCells")}),n.addButton("tablesplitcells",{title:"Split cell",onclick:e("mceTableSplitCells")}),n.addButton("tableinsertrowbefore",{title:"Insert row before",onclick:e("mceTableInsertRowBefore")}),n.addButton("tableinsertrowafter",{title:"Insert row after",onclick:e("mceTableInsertRowAfter")}),n.addButton("tabledeleterow",{title:"Delete row",onclick:e("mceTableDeleteRow")}),n.addButton("tablerowprops",{title:"Row properties",onclick:e("mceTableRowProps")}),n.addButton("tablecutrow",{title:"Cut row",onclick:e("mceTableCutRow")}),n.addButton("tablecopyrow",{title:"Copy row",onclick:e("mceTableCopyRow")}),n.addButton("tablepasterowbefore",{title:"Paste row before",onclick:e("mceTablePasteRowBefore")}),n.addButton("tablepasterowafter",{title:"Paste row after",onclick:e("mceTablePasteRowAfter")}),n.addButton("tableinsertcolbefore",{title:"Insert column before",onclick:e("mceTableInsertColBefore")}),n.addButton("tableinsertcolafter",{title:"Insert column after",onclick:e("mceTableInsertColAfter")}),n.addButton("tabledeletecol",{title:"Delete column",onclick:e("mceTableDeleteCol")})},addToolbars:function(n){var t=n.settings.table_toolbar;""!==t&&!1!==t&&(t||(t="tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"),n.addContextToolbar(function(t){return n.dom.is(t,"table")&&n.getBody().contains(t)},t))}},Ls={addMenuItems:function(n,t){var e=w.none(),r=[],o=[],i=[],u=[],a=function(n){n.disabled(!0)},c=function(n){n.disabled(!1)},l=function(){var n=this;r.push(n),e.fold(function(){a(n)},function(t){c(n)})},s=function(){var n=this;o.push(n),e.fold(function(){a(n)},function(t){c(n)})};n.on("init",function(){n.on("nodechange",function(l){var s=w.from(n.dom.getParent(n.selection.getStart(),"th,td"));(e=s.bind(function(n){var e=en.fromDom(n);return Vt(e).map(function(n){return kr.forMenu(t,n,e)})})).fold(function(){B.each(r,a),B.each(o,a),B.each(i,a),B.each(u,a)},function(n){B.each(r,c),B.each(o,c),B.each(i,function(t){t.disabled(n.mergable().isNone())}),B.each(u,function(t){t.disabled(n.unmergable().isNone())})})})});var f=function(n,t,e,r){var o,i,u,a,c,l=r.getEl().getElementsByTagName("table")[0],s=r.isRtl()||"tl-tr"===r.parent().rel;for(l.nextSibling.innerHTML=t+1+" x "+(e+1),s&&(t=9-t),i=0;i<10;i++)for(o=0;o<10;o++)a=l.rows[i].childNodes[o].firstChild,c=(s?o>=t:o<=t)&&i<=e,n.dom.toggleClass(a,"mce-active",c),c&&(u=a);return u.parentNode},d=!1===n.settings.table_grid?{text:"Table",icon:"table",context:"table",onclick:m.curry(Ta,n)}:{text:"Table",icon:"table",context:"table",ariaHideMenu:!0,onclick:function(t){t.aria&&(this.parent().hideAll(),t.stopImmediatePropagation(),Ta(n))},onshow:function(){f(n,0,0,this.menu.items()[0])},onhide:function(){var t=this.menu.items()[0].getEl().getElementsByTagName("a");n.dom.removeClass(t,"mce-active"),n.dom.addClass(t[0],"mce-active")},menu:[{type:"container",html:function(){var n="";n='<table role="grid" class="mce-grid mce-grid-border" aria-readonly="true">';for(var t=0;t<10;t++){n+="<tr>";for(var e=0;e<10;e++)n+='<td role="gridcell" tabindex="-1"><a id="mcegrid'+(10*t+e)+'" href="#" data-mce-x="'+e+'" data-mce-y="'+t+'"></a></td>';n+="</tr>"}return n+="</table>",n+='<div class="mce-text-center" role="presentation">1 x 1</div>'}(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(t){var e,r,o=t.target;"A"===o.tagName.toUpperCase()&&(e=parseInt(o.getAttribute("data-mce-x"),10),r=parseInt(o.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"===this.parent().rel)&&(e=9-e),e===this.lastX&&r===this.lastY||(f(n,e,r,t.control),this.lastX=e,this.lastY=r))},onclick:function(t){var e=this;"A"===t.target.tagName.toUpperCase()&&(t.preventDefault(),t.stopPropagation(),e.parent().cancel(),n.undoManager.transact(function(){Pr.insert(n,e.lastX+1,e.lastY+1)}),n.addVisual())}}]};function g(t){return function(){n.execCommand(t)}}var p={text:"Table properties",context:"table",onPostRender:l,onclick:m.curry(Ta,n,!0)},h={text:"Delete table",context:"table",onPostRender:l,cmd:"mceTableDelete"},v={text:"Row",context:"table",menu:[{text:"Insert row before",onclick:g("mceTableInsertRowBefore"),onPostRender:s},{text:"Insert row after",onclick:g("mceTableInsertRowAfter"),onPostRender:s},{text:"Delete row",onclick:g("mceTableDeleteRow"),onPostRender:s},{text:"Row properties",onclick:g("mceTableRowProps"),onPostRender:s},{text:"-"},{text:"Cut row",onclick:g("mceTableCutRow"),onPostRender:s},{text:"Copy row",onclick:g("mceTableCopyRow"),onPostRender:s},{text:"Paste row before",onclick:g("mceTablePasteRowBefore"),onPostRender:s},{text:"Paste row after",onclick:g("mceTablePasteRowAfter"),onPostRender:s}]},b={text:"Column",context:"table",menu:[{text:"Insert column before",onclick:g("mceTableInsertColBefore"),onPostRender:s},{text:"Insert column after",onclick:g("mceTableInsertColAfter"),onPostRender:s},{text:"Delete column",onclick:g("mceTableDeleteCol"),onPostRender:s}]},y={separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:g("mceTableCellProps"),onPostRender:s},{text:"Merge cells",onclick:g("mceTableMergeCells"),onPostRender:function(){var n=this;i.push(n),e.fold(function(){a(n)},function(t){n.disabled(t.mergable().isNone())})}},{text:"Split cell",onclick:g("mceTableSplitCells"),onPostRender:function(){var n=this;u.push(n),e.fold(function(){a(n)},function(t){n.disabled(t.unmergable().isNone())})}}]};n.addMenuItem("inserttable",d),n.addMenuItem("tableprops",p),n.addMenuItem("deletetable",h),n.addMenuItem("row",v),n.addMenuItem("column",b),n.addMenuItem("cell",y)}};f.add("table",function(n){var t=oc(n),e=Ps(n,t.lazyResize),r=ha(n,t.lazyWire),o=Ws(n);Ia.registerCommands(n,r,e,o),Nr.registerEvents(n,o,r,e),Ls.addMenuItems(n,o),Ms.addButtons(n),Ms.addToolbars(n),n.on("PreInit",function(){n.serializer.addTempAttr(br.firstSelected()),n.serializer.addTempAttr(br.lastSelected())}),!1!==n.settings.table_tab_navigation&&n.on("keydown",function(e){ml.handle(e,n,r,t.lazyWire)}),n.on("remove",function(){t.destroy(),e.destroy()}),this.insertTable=function(t,e){return Pr.insert(n,t,e)},this.setClipboardRows=Ia.setClipboardRows,this.getClipboardRows=Ia.getClipboardRows})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=tinymce.util.Tools.resolve("tinymce.EditorManager"),i=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Delay"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=tinymce.util.Tools.resolve("tinymce.util.VK"),r={getTabFocus:function(e){return e.getParam("tab_focus",e.getParam("tabfocus_elements",":prev,:next"))}},c=t.DOM,s=function(e){e.keyCode!==u.TAB||e.ctrlKey||e.altKey||e.metaKey||e.preventDefault()},a=function(e){function t(t){var s,a,y,f;if(!(t.keyCode!==u.TAB||t.ctrlKey||t.altKey||t.metaKey||t.isDefaultPrevented())&&(1===(y=l.explode(r.getTabFocus(e))).length&&(y[1]=y[0],y[0]=":prev"),a=t.shiftKey?":prev"===y[0]?m(-1):c.get(y[0]):":next"===y[1]?m(1):c.get(y[1]))){var d=n.get(a.id||a.name);a.id&&d?d.focus():o.setTimeout(function(){i.webkit||window.focus(),a.focus()},10),t.preventDefault()}function m(i){function o(e){return/INPUT|TEXTAREA|BUTTON/.test(e.tagName)&&n.get(t.id)&&-1!==e.tabIndex&&function i(e){return"BODY"===e.nodeName||"hidden"!==e.type&&"none"!==e.style.display&&"hidden"!==e.style.visibility&&i(e.parentNode)}(e)}if(a=c.select(":input:enabled,*[tabindex]:not(iframe)"),l.each(a,function(t,n){if(t.id===e.id)return s=n,!1}),i>0){for(f=s+1;f<a.length;f++)if(o(a[f]))return a[f]}else for(f=s-1;f>=0;f--)if(o(a[f]))return a[f];return null}}e.on("init",function(){e.inline&&c.setAttrib(e.getBody(),"tabIndex",null),e.on("keyup",s),i.gecko?e.on("keypress keydown",t):e.on("keydown",t)})};e.add("tabfocus",function(e){a(e)})}();!function(){"use strict";var e=function(t){var n=t,r=function(){return n};return{get:r,set:function(e){n=e},clone:function(){return e(r())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e){return!(!/(^|[ ,])tinymcespellchecker([, ]|$)/.test(e.settings.plugins)||!t.get("tinymcespellchecker")||("undefined"!=typeof window.console&&window.console.log&&window.console.log("Spell Checker Pro is incompatible with Spell Checker plugin! Remove 'spellchecker' from the 'plugins' option."),0))},r=function(e){return e.getParam("spellchecker_languages","English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr_FR,German=de,Italian=it,Polish=pl,Portuguese=pt_BR,Spanish=es,Swedish=sv")},o=function(e){var t=e.getParam("language","en");return e.getParam("spellchecker_language",t)},i=function(e){return e.getParam("spellchecker_rpc_url")},c=function(e){return e.getParam("spellchecker_callback")},a=function(e){var t=new RegExp('[^\\s!"#$%&()*+,-./:;<=>?@[\\]^_{|}`\xa7\xa9\xab\xae\xb1\xb6\xb7\xb8\xbb\xbc\xbd\xbe\xbf\xd7\xf7\xa4\u201d\u201c\u201e\xa0\u2002\u2003\u2009]+',"g");return e.getParam("spellchecker_wordchar_pattern",t)},l=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=tinymce.util.Tools.resolve("tinymce.util.URI"),u=tinymce.util.Tools.resolve("tinymce.util.XHR"),d=function(e){return e.fire("SpellcheckStart")},f=function(e){return e.fire("SpellcheckEnd")};function h(e){return e&&1===e.nodeType&&"false"===e.contentEditable}var g,m=function(e,t){var n,r,o,i,c,a=[],l=t.dom;function s(e,t){if(!e[0])throw new Error("findAndReplaceDOMText cannot handle zero-length matches");return{start:e.index,end:e.index+e[0].length,text:e[0],data:t}}function u(t){var n=e.getElementsByTagName("*"),r=[];t="number"==typeof t?""+t:null;for(var o=0;o<n.length;o++){var i=n[o],c=i.getAttribute("data-mce-index");null!==c&&c.length&&-1!==i.className.indexOf("mce-spellchecker-word")&&(c!==t&&null!==t||r.push(i))}return r}function d(e){for(var t=a.length;t--;)if(a[t]===e)return t;return-1}function f(e){for(var t=0,n=a.length;t<n&&!1!==e(a[t],t);t++);return this}function g(e){var t,n,r=u(e?d(e):null);for(t=r.length;t--;)(n=r[t]).parentNode.insertBefore(n.firstChild,n),n.parentNode.removeChild(n);return this}function m(e){var n=u(d(e)),r=t.dom.createRng();return r.setStartBefore(n[0]),r.setEndAfter(n[n.length-1]),r}return o=t.schema.getBlockElements(),i=t.schema.getWhiteSpaceElements(),c=t.schema.getShortEndedElements(),{text:r=function p(e){var t;if(3===e.nodeType)return e.data;if(i[e.nodeName]&&!o[e.nodeName])return"";if(h(e))return"\n";if(t="",(o[e.nodeName]||c[e.nodeName])&&(t+="\n"),e=e.firstChild)do{t+=p(e)}while(e=e.nextSibling);return t}(e),matches:a,each:f,filter:function(e){var t=[];return f(function(n,r){e(n,r)&&t.push(n)}),a=t,this},reset:function(){return a.splice(0,a.length),g(),this},matchFromElement:function(e){return a[e.getAttribute("data-mce-index")]},elementFromMatch:function(e){return u(d(e))[0]},find:function(e,t){if(r&&e.global)for(;n=e.exec(r);)a.push(s(n,t));return this},add:function(e,t,n){return a.push({start:e,end:e+t,text:r.substr(e,t),data:n}),this},wrap:function(t){return a.length&&function(e,t,n){var r,a,l,s,u,d=[],f=0,g=e,m=0;(t=t.slice(0)).sort(function(e,t){return e.start-t.start}),u=t.shift();e:for(;;){if((o[g.nodeName]||c[g.nodeName]||h(g))&&f++,3===g.nodeType&&(!a&&g.length+f>=u.end?(a=g,s=u.end-f):r&&d.push(g),!r&&g.length+f>u.start&&(r=g,l=u.start-f),f+=g.length),r&&a){if(g=n({startNode:r,startNodeIndex:l,endNode:a,endNodeIndex:s,innerNodes:d,match:u.text,matchIndex:m}),f-=a.length-s,r=null,a=null,d=[],m++,!(u=t.shift()))break}else if(i[g.nodeName]&&!o[g.nodeName]||!g.firstChild){if(g.nextSibling){g=g.nextSibling;continue}}else if(!h(g)){g=g.firstChild;continue}for(;;){if(g.nextSibling){g=g.nextSibling;break}if(g.parentNode===e)break e;g=g.parentNode}}}(e,a,function(e){function t(t,n){var r=a[n];r.stencil||(r.stencil=e(r));var o=r.stencil.cloneNode(!1);return o.setAttribute("data-mce-index",n),t&&o.appendChild(l.doc.createTextNode(t)),o}return function(e){var n,r,o,i=e.startNode,c=e.endNode,a=e.matchIndex,s=l.doc;if(i===c){var u=i;o=u.parentNode,e.startNodeIndex>0&&(n=s.createTextNode(u.data.substring(0,e.startNodeIndex)),o.insertBefore(n,u));var d=t(e.match,a);return o.insertBefore(d,u),e.endNodeIndex<u.length&&(r=s.createTextNode(u.data.substring(e.endNodeIndex)),o.insertBefore(r,u)),u.parentNode.removeChild(u),d}n=s.createTextNode(i.data.substring(0,e.startNodeIndex)),r=s.createTextNode(c.data.substring(e.endNodeIndex));for(var f=t(i.data.substring(e.startNodeIndex),a),h=[],g=0,m=e.innerNodes.length;g<m;++g){var p=e.innerNodes[g],v=t(p.data,a);p.parentNode.replaceChild(v,p),h.push(v)}var x=t(c.data.substring(0,e.endNodeIndex),a);return(o=i.parentNode).insertBefore(n,i),o.insertBefore(f,i),o.removeChild(i),(o=c.parentNode).insertBefore(x,c),o.insertBefore(r,c),o.removeChild(c),x}}(t)),this},unwrap:g,replace:function(e,n){var r=m(e);return r.deleteContents(),n.length>0&&r.insertNode(t.dom.doc.createTextNode(n)),r},rangeFromMatch:m,indexOf:d}},p=function(e,t){if(!t.get()){var n=m(e.getBody(),e);t.set(n)}return t.get()},v=function(e,t,n,r,o,a,d){var f,h,g,m=c(e);(m||(f=e,h=t,g=n,function(e,t,n,r){var o={method:e,lang:g.get()},c="";o["addToDictionary"===e?"word":"text"]=t,l.each(o,function(e,t){c&&(c+="&"),c+=t+"="+encodeURIComponent(e)}),u.send({url:new s(h).toAbsolute(i(f)),type:"post",content_type:"application/x-www-form-urlencoded",data:c,success:function(e){if(e=JSON.parse(e))e.error?r(e.error):n(e);else{var t=f.translate("Server response wasn't proper JSON.");r(t)}},error:function(){var e=f.translate("The spelling service was not found: (")+i(f)+f.translate(")");r(e)}})})).call(e.plugins.spellchecker,r,o,a,d)},x=function(e,t,n){e.dom.select("span.mce-spellchecker-word").length||N(e,t,n)},N=function(e,t,n){if(p(e,n).reset(),n.set(null),t.get())return t.set(!1),f(e),!0},k=function(e){var t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t},y=function(e,t,n,r,o){var i,c;if(o.words?(c=!!o.dictionary,i=o.words):i=o,e.setProgressState(!1),function(e){for(var t in e)return!1;return!0}(i)){var l=e.translate("No misspellings found.");return e.notificationManager.open({text:l,type:"info"}),void t.set(!1)}r.set({suggestions:i,hasDictionarySupport:c}),p(e,n).find(a(e)).filter(function(e){return!!i[e.text]}).wrap(function(t){return e.dom.create("span",{"class":"mce-spellchecker-word","data-mce-bogus":1,"data-mce-word":t.text})}),t.set(!0),d(e)},S={spellcheck:function(e,t,n,r,o,i){N(e,n,r)||(e.setProgressState(!0),v(e,t,i,"spellcheck",p(e,r).text,function(t){y(e,n,r,o,t)},function(t){e.notificationManager.open({text:t,type:"error"}),e.setProgressState(!1),N(e,n,r)}),e.focus())},checkIfFinished:x,addToDictionary:function(e,t,n,r,o,i){e.setProgressState(!0),v(e,t,"addToDictionary",o,function(){e.setProgressState(!1),e.dom.remove(i,!0),x(e,n,r)},function(t){e.notificationManager.open({text:t,type:"error"}),e.setProgressState(!1)})},ignoreWord:function(e,t,n,r,o,i){e.selection.collapse(),i?l.each(e.dom.select("span.mce-spellchecker-word"),function(t){t.getAttribute("data-mce-word")===r&&e.dom.remove(t,!0)}):e.dom.remove(o,!0),x(e,t,n)},findSpansByIndex:function(e,t){var n,r=[];if((n=l.toArray(e.getBody().getElementsByTagName("span"))).length)for(var o=0;o<n.length;o++){var i=k(n[o]);null!==i&&i.length&&i===t.toString()&&r.push(n[o])}return r},getElmIndex:k,markErrors:y},w=function(e,t,n,r,i){return{getTextMatcher:function(){return r.get()},getWordCharPattern:function(){return a(e)},markErrors:function(o){S.markErrors(e,t,r,n,o)},getLanguage:function(){return o(e)}}},b=function(e,t,n,r,o,i){e.addCommand("mceSpellCheck",function(){S.spellcheck(e,t,n,r,o,i)})},T=function(e,t,n,i,c,a){var s,u,d,f,h=(d=e,s=l.map(r(d).split(","),function(e){return{name:(e=e.split("="))[0],value:e[1]}}),u=[],l.each(s,function(e){u.push({selectable:!0,text:e.name,data:e.value})}),u),g=function(){S.spellcheck(e,t,n,i,a,c)},m={tooltip:"Spellcheck",onclick:g,onPostRender:function(t){var r=t.control;e.on("SpellcheckStart SpellcheckEnd",function(){r.active(n.get())})}};h.length>1&&(m.type="splitbutton",m.menu=h,m.onshow=(f=e,function(e){var t=o(f);e.control.items().each(function(e){e.active(e.settings.data===t)})}),m.onselect=function(e){c.set(e.control.settings.data)}),e.addButton("spellchecker",m),e.addMenuItem("spellchecker",{text:"Spellcheck",context:"tools",onclick:g,selectable:!0,onPostRender:function(){var t=this;t.active(n.get()),e.on("SpellcheckStart SpellcheckEnd",function(){t.active(n.get())})}})},I=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),E=tinymce.util.Tools.resolve("tinymce.ui.Factory"),P=function(e,t,n,r,o){e.on("click",function(i){var c=i.target;if("mce-spellchecker-word"===c.className){i.preventDefault();var a=S.findSpansByIndex(e,S.getElmIndex(c));if(a.length>0){var s=e.dom.createRng();s.setStartBefore(a[0]),s.setEndAfter(a[a.length-1]),e.selection.setRng(s),function(e,t,n,r,o,i,c){var a=[],s=n.get().suggestions[i];l.each(s,function(t){a.push({text:t,onclick:function(){e.insertContent(e.dom.encode(t)),e.dom.remove(c),S.checkIfFinished(e,r,o)}})}),a.push({text:"-"}),n.get().hasDictionarySupport&&a.push({text:"Add to Dictionary",onclick:function(){S.addToDictionary(e,t,r,o,i,c)}}),a.push.apply(a,[{text:"Ignore",onclick:function(){S.ignoreWord(e,r,o,i,c)}},{text:"Ignore all",onclick:function(){S.ignoreWord(e,r,o,i,c,!0)}}]),(g=E.create("menu",{items:a,context:"contextmenu",onautohide:function(e){-1!==e.target.className.indexOf("spellchecker")&&e.preventDefault()},onhide:function(){g.remove(),g=null}})).renderTo(document.body);var u=I.DOM.getPos(e.getContentAreaContainer()),d=e.dom.getPos(c[0]),f=e.dom.getRoot();"BODY"===f.nodeName?(d.x-=f.ownerDocument.documentElement.scrollLeft||f.scrollLeft,d.y-=f.ownerDocument.documentElement.scrollTop||f.scrollTop):(d.x-=f.scrollLeft,d.y-=f.scrollTop),u.x+=d.x,u.y+=d.y,g.moveTo(u.x,u.y+c[0].offsetHeight)}(e,t,n,r,o,c.getAttribute("data-mce-word"),a)}}})};t.add("spellchecker",function(t,r){if(!1===n(t)){var i=e(!1),c=e(o(t)),a=e(null),l=e({});return T(t,r,i,a,c,l),P(t,r,l,i,a),b(t,r,i,a,l,c),w(t,i,l,a,r)}})}();!function(){"use strict";var e=function(t){var n=t,r=function(){return n};return{get:r,set:function(e){n=e},clone:function(){return e(r())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");function r(e){return e&&1===e.nodeType&&"false"===e.contentEditable}var a={findAndReplaceDOMText:function(e,t,n,a,i){var o,d,c,l,s,u,f=[],p=0;function g(e,t){if(t=t||0,!e[0])throw new Error("findAndReplaceDOMText cannot handle zero-length matches");var n=e.index;if(t>0){var r=e[t];if(!r)throw new Error("Invalid capture group");n+=e[0].indexOf(r),e[0]=r}return[n,n+e[0].length,[e[0]]]}if(c=t.ownerDocument,l=i.getBlockElements(),s=i.getWhiteSpaceElements(),u=i.getShortEndedElements(),d=function h(e){var t;if(3===e.nodeType)return e.data;if(s[e.nodeName]&&!l[e.nodeName])return"";if(t="",r(e))return"\n";if((l[e.nodeName]||u[e.nodeName])&&(t+="\n"),e=e.firstChild)do{t+=h(e)}while(e=e.nextSibling);return t}(t)){if(e.global)for(;o=e.exec(d);)f.push(g(o,a));else o=d.match(e),f.push(g(o,a));return f.length&&(p=f.length,function(e,t,n){var a,i,o,d,c=[],f=0,p=e,g=t.shift(),h=0;e:for(;;){if((l[p.nodeName]||u[p.nodeName]||r(p))&&f++,3===p.nodeType&&(!i&&p.length+f>=g[1]?(i=p,d=g[1]-f):a&&c.push(p),!a&&p.length+f>g[0]&&(a=p,o=g[0]-f),f+=p.length),a&&i){if(p=n({startNode:a,startNodeIndex:o,endNode:i,endNodeIndex:d,innerNodes:c,match:g[2],matchIndex:h}),f-=i.length-d,a=null,i=null,c=[],h++,!(g=t.shift()))break}else if(s[p.nodeName]&&!l[p.nodeName]||!p.firstChild){if(p.nextSibling){p=p.nextSibling;continue}}else if(!r(p)){p=p.firstChild;continue}for(;;){if(p.nextSibling){p=p.nextSibling;break}if(p.parentNode===e)break e;p=p.parentNode}}}(t,f,function(e){var t;if("function"!=typeof e){var n=e.nodeType?e:c.createElement(e);t=function(e,t){var r=n.cloneNode(!1);return r.setAttribute("data-mce-index",t),e&&r.appendChild(c.createTextNode(e)),r}}else t=e;return function(e){var n,r,a,i=e.startNode,o=e.endNode,d=e.matchIndex;if(i===o){var l=i;a=l.parentNode,e.startNodeIndex>0&&(n=c.createTextNode(l.data.substring(0,e.startNodeIndex)),a.insertBefore(n,l));var s=t(e.match[0],d);return a.insertBefore(s,l),e.endNodeIndex<l.length&&(r=c.createTextNode(l.data.substring(e.endNodeIndex)),a.insertBefore(r,l)),l.parentNode.removeChild(l),s}n=c.createTextNode(i.data.substring(0,e.startNodeIndex)),r=c.createTextNode(o.data.substring(e.endNodeIndex));for(var u=t(i.data.substring(e.startNodeIndex),d),f=[],p=0,g=e.innerNodes.length;p<g;++p){var h=e.innerNodes[p],m=t(h.data,d);h.parentNode.replaceChild(m,h),f.push(m)}var v=t(o.data.substring(0,e.endNodeIndex),d);return(a=i.parentNode).insertBefore(n,i),a.insertBefore(u,i),a.removeChild(i),(a=o.parentNode).insertBefore(v,o),a.insertBefore(r,o),a.removeChild(o),v}}(n))),p}}},i=function(e){var t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t},o=function(e){var t=e.parentNode;e.firstChild&&t.insertBefore(e.firstChild,e),e.parentNode.removeChild(e)},d=function(e,t){var r,a=[];if((r=n.toArray(e.getBody().getElementsByTagName("span"))).length)for(var o=0;o<r.length;o++){var d=i(r[o]);null!==d&&d.length&&d===t.toString()&&a.push(r[o])}return a},c=function(e,t,n){var r=t.get(),a=e.dom;(n=!1!==n)?r++:r--,a.removeClass(d(e,t.get()),"mce-match-marker-selected");var i=d(e,r);return i.length?(a.addClass(d(e,r),"mce-match-marker-selected"),e.selection.scrollIntoView(i[0]),r):-1},l=function(e,t){var n=t.parentNode;e.remove(t),e.isEmpty(n)&&e.remove(n)},s=function(e,t){var n=c(e,t,!0);-1!==n&&t.set(n)},u=function(e,t){var n=c(e,t,!1);-1!==n&&t.set(n)},f=function(e){var t=i(e);return null!==t&&t.length>0},p=function(e,t,r){var a,d,c,l;for(d=n.toArray(e.getBody().getElementsByTagName("span")),a=0;a<d.length;a++){var s=i(d[a]);null!==s&&s.length&&(s===t.get().toString()&&(c||(c=d[a].firstChild),l=d[a].firstChild),o(d[a]))}if(c&&l){var u=e.dom.createRng();return u.setStart(c,0),u.setEnd(l,l.data.length),!1!==r&&e.selection.setRng(u),u}},g=function(e,t){return d(e,t.get()+1).length>0},h=function(e,t){return d(e,t.get()-1).length>0},m={done:p,find:function(e,t,n,r,i){n=(n=n.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")).replace(/\s/g,"\\s"),n=i?"\\b"+n+"\\b":n;var o,d,l,s,u,f=(o=e,d=t,l=new RegExp(n,r?"g":"gi"),(u=o.dom.create("span",{"data-mce-bogus":1})).className="mce-match-marker",s=o.getBody(),p(o,d,!1),a.findAndReplaceDOMText(l,s,u,!1,o.schema));return f&&(t.set(-1),t.set(c(e,t,!0))),f},next:s,prev:u,replace:function(e,t,r,a,d){var c,p,m,v,x,b,N=t.get();for(a=!1!==a,m=e.getBody(),p=n.grep(n.toArray(m.getElementsByTagName("span")),f),c=0;c<p.length;c++){var y=i(p[c]);if(v=x=parseInt(y,10),d||v===t.get()){for(r.length?(p[c].firstChild.nodeValue=r,o(p[c])):l(e.dom,p[c]);p[++c];){if((v=parseInt(i(p[c]),10))!==x){c--;break}l(e.dom,p[c])}a&&N--}else x>t.get()&&p[c].setAttribute("data-mce-index",x-1)}return t.set(N),a?(b=g(e,t),s(e,t)):(b=h(e,t),u(e,t)),!d&&b},hasNext:g,hasPrev:h},v=function(e,t){return{done:function(n){return m.done(e,t,n)},find:function(n,r,a){return m.find(e,t,n,r,a)},next:function(){return m.next(e,t)},prev:function(){return m.prev(e,t)},replace:function(n,r,a){return m.replace(e,t,n,r,a)}}},x=function(e,t){var r,a={};function i(){d.statusbar.find("#next").disabled(!1===m.hasNext(e,t)),d.statusbar.find("#prev").disabled(!1===m.hasPrev(e,t))}function o(){e.windowManager.alert("Could not find the specified string.",function(){d.find("#find")[0].focus()})}e.undoManager.add(),r=n.trim(e.selection.getContent({format:"text"}));var d=e.windowManager.open({layout:"flex",pack:"center",align:"center",onClose:function(){e.focus(),m.done(e,t),e.undoManager.add()},onSubmit:function(n){var r,c,l,s;return n.preventDefault(),c=d.find("#case").checked(),s=d.find("#words").checked(),(l=d.find("#find").value()).length?a.text===l&&a.caseState===c&&a.wholeWord===s?m.hasNext(e,t)?(m.next(e,t),void i()):void o():((r=m.find(e,t,l,c,s))||o(),d.statusbar.items().slice(1).disabled(0===r),i(),void(a={text:l,caseState:c,wholeWord:s})):(m.done(e,t,!1),void d.statusbar.items().slice(1).disabled(!0))},buttons:[{text:"Find",subtype:"primary",onclick:function(){d.submit()}},{text:"Replace",disabled:!0,onclick:function(){m.replace(e,t,d.find("#replace").value())||(d.statusbar.items().slice(1).disabled(!0),t.set(-1),a={})}},{text:"Replace all",disabled:!0,onclick:function(){m.replace(e,t,d.find("#replace").value(),!0,!0),d.statusbar.items().slice(1).disabled(!0),a={}}},{type:"spacer",flex:1},{text:"Prev",name:"prev",disabled:!0,onclick:function(){m.prev(e,t),i()}},{text:"Next",name:"next",disabled:!0,onclick:function(){m.next(e,t),i()}}],title:"Find and replace",items:{type:"form",padding:20,labelGap:30,spacing:10,items:[{type:"textbox",name:"find",size:40,label:"Find",value:r},{type:"textbox",name:"replace",size:40,label:"Replace with"},{type:"checkbox",name:"case",text:"Match case",label:" "},{type:"checkbox",name:"words",text:"Whole words",label:" "}]}})},b=function(e,t){e.addCommand("SearchReplace",function(){x(e,t)})},N=function(e,t){return function(){x(e,t)}},y=function(e,t){e.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:N(e,t),separator:"before",context:"edit"}),e.addButton("searchreplace",{tooltip:"Find and replace",onclick:N(e,t)}),e.shortcuts.add("Meta+F","",N(e,t))};t.add("searchreplace",function(t){var n=e(-1);return b(t,n),y(t,n),v(t,n)})}();!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(n){return n.getParam("save_enablewhendirty",!0)},o=function(n){return!!n.getParam("save_onsavecallback")},c=function(n){return!!n.getParam("save_oncancelcallback")},i=function(n,e){n.notificationManager.open({text:n.translate(e),type:"error"})},r=function(n){var t;if(t=e.DOM.getParent(n.id,"form"),!a(n)||n.isDirty()){if(n.save(),o(n))return n.execCallback("save_onsavecallback",n),void n.nodeChanged();t?(n.setDirty(!1),t.onsubmit&&!t.onsubmit()||("function"==typeof t.submit?t.submit():i(n,"Error: Form submit field collision.")),n.nodeChanged()):i(n,"Error: No form element found.")}},l=function(n){var e=t.trim(n.startContent);c(n)?n.execCallback("save_oncancelcallback",n):(n.setContent(e),n.undoManager.clear(),n.nodeChanged())},d=function(n){n.addCommand("mceSave",function(){r(n)}),n.addCommand("mceCancel",function(){l(n)})},s=function(n){return function(e){var t=e.control;n.on("nodeChange dirty",function(){t.disabled(a(n)&&!n.isDirty())})}},u=function(n){n.addButton("save",{icon:"save",text:"Save",cmd:"mceSave",disabled:!0,onPostRender:s(n)}),n.addButton("cancel",{text:"Cancel",icon:!1,cmd:"mceCancel",disabled:!0,onPostRender:s(n)}),n.addShortcut("Meta+S","","mceSave")};n.add("save",function(n){u(n),d(n)})}();!function(){"use strict";var t=function(t){t.addCommand("mcePrint",function(){t.getWin().print()})},n=function(t){t.addButton("print",{title:"Print",cmd:"mcePrint"}),t.addMenuItem("print",{text:"Print",cmd:"mcePrint",icon:"print"})};tinymce.util.Tools.resolve("tinymce.PluginManager").add("print",function(i){t(i),n(i),i.addShortcut("Meta+P","","mcePrint")})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),n=function(e){return parseInt(e.getParam("plugin_preview_width","650"),10)},i=function(e){return parseInt(e.getParam("plugin_preview_height","500"),10)},o=function(e){return e.getParam("content_style","")},r=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(e){var t="",n=e.dom.encode,i=o(e);t+='<base href="'+n(e.documentBaseURI.getURI())+'">',i&&(t+='<style type="text/css">'+i+"</style>"),r.each(e.contentCSS,function(i){t+='<link type="text/css" rel="stylesheet" href="'+n(e.documentBaseURI.toAbsolute(i))+'">'});var c=e.settings.body_id||"tinymce";-1!==c.indexOf("=")&&(c=(c=e.getParam("body_id","","hash"))[e.id]||c);var a=e.settings.body_class||"";-1!==a.indexOf("=")&&(a=(a=e.getParam("body_class","","hash"))[e.id]||"");var s=e.settings.directionality?' dir="'+e.settings.directionality+'"':"";return"<!DOCTYPE html><html><head>"+t+'</head><body id="'+n(c)+'" class="mce-content-body '+n(a)+'"'+n(s)+">"+e.getContent()+'<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A") {e.preventDefault();}}}, false);<\/script> </body></html>'},a=function(e,t,n){var i=c(e);if(n)t.src="data:text/html;charset=utf-8,"+encodeURIComponent(i);else{var o=t.contentWindow.document;o.open(),o.write(i),o.close()}},s=function(e){var o=!t.ie,r='<iframe src="javascript:\'\'" frameborder="0"'+(o?' sandbox="allow-scripts"':"")+"></iframe>",c=n(e),s=i(e);e.windowManager.open({title:"Preview",width:c,height:s,html:r,buttons:{text:"Close",onclick:function(e){e.control.parent().parent().close()}},onPostRender:function(t){var n=t.control.getEl("body").firstChild;a(e,n,o)}})},d=function(e){e.addCommand("mcePreview",function(){s(e)})},l=function(e){e.addButton("preview",{title:"Preview",cmd:"mcePreview"}),e.addMenuItem("preview",{text:"Preview",cmd:"mcePreview",context:"view"})};e.add("preview",function(e){d(e),l(e)})}();!function(){"use strict";var e=function(t){var n=t,r=function(){return n};return{get:r,set:function(e){n=e},clone:function(){return e(r())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e){return!(!/(^|[ ,])powerpaste([, ]|$)/.test(e.settings.plugins)||!t.get("powerpaste")||("undefined"!=typeof window.console&&window.console.log&&window.console.log("PowerPaste is incompatible with Paste plugin! Remove 'paste' from the 'plugins' option."),0))},r=function(e,t){return{clipboard:e,quirks:t}},a={firePastePreProcess:function(e,t,n,r){return e.fire("PastePreProcess",{content:t,internal:n,wordContent:r})},firePastePostProcess:function(e,t,n,r){return e.fire("PastePostProcess",{node:t,internal:n,wordContent:r})},firePastePlainTextToggle:function(e,t){return e.fire("PastePlainTextToggle",{state:t})},firePaste:function(e,t){return e.fire("paste",{ieFake:t})}},i={shouldPlainTextInform:function(e){return e.getParam("paste_plaintext_inform",!0)},shouldBlockDrop:function(e){return e.getParam("paste_block_drop",!1)},shouldPasteDataImages:function(e){return e.getParam("paste_data_images",!1)},shouldFilterDrop:function(e){return e.getParam("paste_filter_drop",!0)},getPreProcess:function(e){return e.getParam("paste_preprocess")},getPostProcess:function(e){return e.getParam("paste_postprocess")},getWebkitStyles:function(e){return e.getParam("paste_webkit_styles")},shouldRemoveWebKitStyles:function(e){return e.getParam("paste_remove_styles_if_webkit",!0)},shouldMergeFormats:function(e){return e.getParam("paste_merge_formats",!0)},isSmartPasteEnabled:function(e){return e.getParam("smart_paste",!0)},isPasteAsTextEnabled:function(e){return e.getParam("paste_as_text",!1)},getRetainStyleProps:function(e){return e.getParam("paste_retain_style_properties")},getWordValidElements:function(e){return e.getParam("paste_word_valid_elements","-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody")},shouldConvertWordFakeLists:function(e){return e.getParam("paste_convert_word_fake_lists",!0)},shouldUseDefaultFilters:function(e){return e.getParam("paste_enable_default_filters",!0)}},o=function(e,t,n){var r,o,s;"text"===t.pasteFormat?(t.pasteFormat="html",a.firePastePlainTextToggle(e,!1)):(t.pasteFormat="text",a.firePastePlainTextToggle(e,!0),s=e,!1===n.get()&&i.shouldPlainTextInform(s)&&(o="Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.",(r=e).notificationManager.open({text:r.translate(o),type:"info"}),n.set(!0))),e.focus()},s=function(e,t,n){e.addCommand("mceTogglePlainTextPaste",function(){o(e,t,n)}),e.addCommand("mceInsertClipboardContent",function(e,n){n.content&&t.pasteHtml(n.content,n.internal),n.text&&t.pasteText(n.text)})},l=tinymce.util.Tools.resolve("tinymce.Env"),u=tinymce.util.Tools.resolve("tinymce.util.Delay"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),f=tinymce.util.Tools.resolve("tinymce.util.VK"),d="x-tinymce/html",m="\x3c!-- "+d+" --\x3e",p={mark:function(e){return m+e},unmark:function(e){return e.replace(m,"")},isMarked:function(e){return-1!==e.indexOf(m)},internalHtmlMime:function(){return d}},g=tinymce.util.Tools.resolve("tinymce.html.Entities"),v=function(e){return e.replace(/\r?\n/g,"<br>")},h=function(e,t,n){var r=e.split(/\n\n/),a=function(e,t){var n,r=[],a="<"+e;if("object"==typeof t){for(n in t)t.hasOwnProperty(n)&&r.push(n+'="'+g.encodeAllRaw(t[n])+'"');r.length&&(a+=" "+r.join(" "))}return a+">"}(t,n),i="</"+t+">",o=c.map(r,function(e){return e.split(/\n/).join("<br />")});return 1===o.length?o[0]:c.map(o,function(e){return a+e+i}).join("")},P={isPlainText:function(e){return!/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(e)},convert:function(e,t,n){return t?h(e,t,n):v(e)},toBRs:v,toBlockElements:h},y=tinymce.util.Tools.resolve("tinymce.html.DomParser"),b=tinymce.util.Tools.resolve("tinymce.html.Node"),x=tinymce.util.Tools.resolve("tinymce.html.Schema"),w=tinymce.util.Tools.resolve("tinymce.html.Serializer");function T(e,t){return c.each(t,function(t){e=t.constructor===RegExp?e.replace(t,""):e.replace(t[0],t[1])}),e}var C={filter:T,innerText:function(e){var t=x(),n=y({},t),r="",a=t.getShortEndedElements(),i=c.makeMap("script noscript style textarea video audio iframe object"," "),o=t.getBlockElements();return e=T(e,[/<!\[[^\]]+\]>/g]),function s(e){var t=e.name,n=e;if("br"!==t)if(a[t]&&(r+=" "),i[t])r+=" ";else{if(3===e.type&&(r+=e.value),!e.shortEnded&&(e=e.firstChild))do{s(e)}while(e=e.next);o[t]&&n.next&&(r+="\n","p"===t&&(r+="\n"))}else r+="\n"}(n.parse(e)),r},trimHtml:function(e){return e=T(e,[/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/gi,/<!--StartFragment-->|<!--EndFragment-->/g,[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,function(e,t,n){return t||n?"\xa0":" "}],/<br class="Apple-interchange-newline">/g,/<br>$/i])},createIdGenerator:function(e){var t=0;return function(){return e+t++}},isMsEdge:function(){return-1!==navigator.userAgent.indexOf(" Edge/")}};function _(e){var t,n;return n=[/^[IVXLMCD]{1,2}\.[ \u00a0]/,/^[ivxlmcd]{1,2}\.[ \u00a0]/,/^[a-z]{1,2}[\.\)][ \u00a0]/,/^[A-Z]{1,2}[\.\)][ \u00a0]/,/^[0-9]+\.[ \u00a0]/,/^[\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]+\.[ \u00a0]/,/^[\u58f1\u5f10\u53c2\u56db\u4f0d\u516d\u4e03\u516b\u4e5d\u62fe]+\.[ \u00a0]/],e=e.replace(/^[\u00a0 ]+/,""),c.each(n,function(n){if(n.test(e))return t=!0,!1}),t}function D(e){var t,n,r=1;function a(e){var t="";if(3===e.type)return e.value;if(e=e.firstChild)do{t+=a(e)}while(e=e.next);return t}function i(e,t){if(3===e.type&&t.test(e.value))return e.value=e.value.replace(t,""),!1;if(e=e.firstChild)do{if(!i(e,t))return!1}while(e=e.next);return!0}function o(e,a,o){var s=e._listLevel||r;s!==r&&(s<r?t&&(t=t.parent.parent):(n=t,t=null)),t&&t.name===a?t.append(e):(n=n||t,t=new b(a,1),o>1&&t.attr("start",""+o),e.wrap(t)),e.name="li",s>r&&n&&n.lastChild.append(t),r=s,function l(e){if(e._listIgnore)e.remove();else if(e=e.firstChild)do{l(e)}while(e=e.next)}(e),i(e,/^\u00a0+/),i(e,/^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/),i(e,/^\u00a0+/)}for(var s=[],l=e.firstChild;void 0!==l&&null!==l;)if(s.push(l),null!==(l=l.walk()))for(;void 0!==l&&l.parent!==e;)l=l.walk();for(var u=0;u<s.length;u++)if("p"===(e=s[u]).name&&e.firstChild){var c=a(e);if(/^[\s\u00a0]*[\u2022\u00b7\u00a7\u25CF]\s*/.test(c)){o(e,"ul");continue}if(_(c)){var f=/([0-9]+)\./.exec(c),d=1;f&&(d=parseInt(f[1],10)),o(e,"ol",d);continue}if(e._listLevel){o(e,"ul",1);continue}t=null}else n=t,t=null}function k(e,t,n,r){var a,o={},s=e.dom.parseStyle(r);return c.each(s,function(s,l){switch(l){case"mso-list":(a=/\w+ \w+([0-9]+)/i.exec(r))&&(n._listLevel=parseInt(a[1],10)),/Ignore/i.test(s)&&n.firstChild&&(n._listIgnore=!0,n.firstChild._listIgnore=!0);break;case"horiz-align":l="text-align";break;case"vert-align":l="vertical-align";break;case"font-color":case"mso-foreground":l="color";break;case"mso-background":case"mso-highlight":l="background";break;case"font-weight":case"font-style":return void("normal"!==s&&(o[l]=s));case"mso-element":if(/^(comment|comment-list)$/i.test(s))return void n.remove()}0!==l.indexOf("mso-comment")?0!==l.indexOf("mso-")&&("all"===i.getRetainStyleProps(e)||t&&t[l])&&(o[l]=s):n.remove()}),/(bold)/i.test(o["font-weight"])&&(delete o["font-weight"],n.wrap(new b("b",1))),/(italic)/i.test(o["font-style"])&&(delete o["font-style"],n.wrap(new b("i",1))),(o=e.dom.serializeStyle(o,n.name))||null}var R={preProcess:function(e,t){return i.shouldUseDefaultFilters(e)?function(e,t){var n,r;(n=i.getRetainStyleProps(e))&&(r=c.makeMap(n.split(/[, ]/))),t=C.filter(t,[/<br class="?Apple-interchange-newline"?>/gi,/<b[^>]+id="?docs-internal-[^>]*>/gi,/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\xa0"],[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(e,t){return t.length>0?t.replace(/./," ").slice(Math.floor(t.length/2)).split("").join("\xa0"):""}]]);var a=i.getWordValidElements(e),o=x({valid_elements:a,valid_children:"-li[p]"});c.each(o.elements,function(e){e.attributes["class"]||(e.attributes["class"]={},e.attributesOrder.push("class")),e.attributes.style||(e.attributes.style={},e.attributesOrder.push("style"))});var s=y({},o);s.addAttributeFilter("style",function(t){for(var n,a=t.length;a--;)(n=t[a]).attr("style",k(e,r,n,n.attr("style"))),"span"===n.name&&n.parent&&!n.attributes.length&&n.unwrap()}),s.addAttributeFilter("class",function(e){for(var t,n,r=e.length;r--;)n=(t=e[r]).attr("class"),/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(n)&&t.remove(),t.attr("class",null)}),s.addNodeFilter("del",function(e){for(var t=e.length;t--;)e[t].remove()}),s.addNodeFilter("a",function(e){for(var t,n,r,a=e.length;a--;)if(n=(t=e[a]).attr("href"),r=t.attr("name"),n&&-1!==n.indexOf("#_msocom_"))t.remove();else if(n&&0===n.indexOf("file://")&&(n=n.split("#")[1])&&(n="#"+n),n||r){if(r&&!/^_?(?:toc|edn|ftn)/i.test(r)){t.unwrap();continue}t.attr({href:n,name:r})}else t.unwrap()});var l=s.parse(t);return i.shouldConvertWordFakeLists(e)&&D(l),t=w({validate:e.settings.validate},o).serialize(l)}(e,t):t},isWordContent:function(e){return/<font face="Times New Roman"|class="?Mso|style="[^"]*\bmso-|style='[^'']*\bmso-|w:WordDocument/i.test(e)||/class="OutlineElement/.test(e)||/id="?docs\-internal\-guid\-/.test(e)}},E=function(e,t){return{content:e,cancelled:t}},F=function(e,t,n,r){var i,o,s,l,u,c,f=a.firePastePreProcess(e,t,n,r);return e.hasEventListeners("PastePostProcess")&&!f.isDefaultPrevented()?(i=e,o=f.content,s=n,l=r,u=i.dom.create("div",{style:"display:none"},o),c=a.firePastePostProcess(i,u,s,l),E(c.node.innerHTML,c.isDefaultPrevented())):E(f.content,f.isDefaultPrevented())},M={process:function(e,t,n){var r=R.isWordContent(t),a=r?R.preProcess(e,t):t;return F(e,a,n,r)}},S=function(e){return/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(e)},I=function(e){return S(e)&&/.(gif|jpe?g|png)$/.test(e)},A=function(e,t,n){return!(!1!==e.selection.isCollapsed()||!S(t)||(a=t,i=n,(r=e).undoManager.extra(function(){i(r,a)},function(){r.execCommand("mceInsertLink",!1,a)}),0));var r,a,i},O=function(e,t,n){return!!I(t)&&(a=t,i=n,(r=e).undoManager.extra(function(){i(r,a)},function(){r.insertContent('<img src="'+a+'">')}),!0);var r,a,i},B=function(e,t){return e.insertContent(t,{merge:i.shouldMergeFormats(e),paste:!0}),!0},H={isImageUrl:I,isAbsoluteUrl:S,insertContent:function(e,t){var n,r;!1===i.isSmartPasteEnabled(e)?B(e,t):(n=e,r=t,c.each([A,O,B],function(e){return!0!==e(n,r,B)}))}},N=function(e){var t,n,r,o,s,d,m=this,g=0,v=(t=e,r="%MCEPASTEBIN%",{create:function(){var e,a,i=t.dom,o=t.getBody(),s=t.dom.getViewPort(t.getWin()).y,u=20;if(n=t.selection.getRng(),t.inline&&(a=t.selection.getScrollContainer())&&a.scrollTop>0&&(s=a.scrollTop),n.getClientRects){var c=function(e){var t,r,a,o=e.startContainer;if((t=e.getClientRects()).length)return t[0];if(e.collapsed&&1===o.nodeType){for(a=o.childNodes[n.startOffset];a&&3===a.nodeType&&!a.data.length;)a=a.nextSibling;if(a)return"BR"===a.tagName&&(r=i.doc.createTextNode("\ufeff"),a.parentNode.insertBefore(r,a),(e=i.createRng()).setStartBefore(r),e.setEndAfter(r),t=e.getClientRects(),i.remove(r)),t.length?t[0]:void 0}}(n);if(c)u=s+(c.top-i.getPos(o).y);else{u=s;var f=n.startContainer;f&&(3===f.nodeType&&f.parentNode!==o&&(f=f.parentNode),1===f.nodeType&&(u=i.getPos(f,a||o).y))}}e=t.dom.add(t.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+u+"px; width: 10px; height: 10px; overflow: hidden; opacity: 0"},r),(l.ie||l.gecko)&&i.setStyle(e,"left","rtl"===i.getStyle(o,"direction",!0)?65535:-65535),i.bind(e,"beforedeactivate focusin focusout",function(e){e.stopPropagation()}),e.focus(),t.selection.select(e,!0)},remove:function(){if(o()){for(var e=void 0;e=t.dom.get("mcepastebin");)t.dom.remove(e),t.dom.unbind(e);n&&t.selection.setRng(n)}n=null},getEl:o=function(){return t.dom.get("mcepastebin")},getHtml:function(){var e,n,r,a,i,o=function(e,n){e.appendChild(n),t.dom.remove(n,!0)};for(n=c.grep(t.getBody().childNodes,function(e){return"mcepastebin"===e.id}),e=n.shift(),c.each(n,function(t){o(e,t)}),r=(a=t.dom.select("div[id=mcepastebin]",e)).length-1;r>=0;r--)i=t.dom.create("div"),e.insertBefore(i,a[r]),o(i,a[r]);return e?e.innerHTML:""},getLastRng:function(){return n},isDefault:function(){var e,t=o();return(e=t)&&"mcepastebin"===e.id&&s(t.innerHTML)},isDefaultContent:s=function(e){return e===r}}),h="data:text/mce-internal,",y=C.createIdGenerator("mceclip");function b(t,n){var r=n||p.isMarked(t),a=M.process(e,p.unmark(t),r);!1===a.cancelled&&H.insertContent(e,a.content)}function x(t){t=e.dom.encode(t).replace(/\r\n/g,"\n"),b(t=P.convert(t,e.settings.forced_root_block,e.settings.forced_root_block_attrs),!1)}function w(e){var t={};if(e){if(e.getData){var n=e.getData("Text");n&&n.length>0&&-1===n.indexOf(h)&&(t["text/plain"]=n)}if(e.types)for(var r=0;r<e.types.length;r++){var a=e.types[r];try{t[a]=e.getData(a)}catch(i){t[a]=""}}}return t}function T(e){return k(e,"text/html")||k(e,"text/plain")}function _(t,n,r){t&&(e.selection.setRng(t),t=null);var a,i,o,s,l,u,c=n.result,f=-1!==(i=(a=c).indexOf(","))?a.substr(i+1):null,d=y(),m=e.settings.images_reuse_filename&&r.name?(o=r.name,(s=o.match(/([\s\S]+?)\.(?:jpeg|jpg|png|gif)$/i))?e.dom.encode(s[1]):null):d,p=new Image;if(p.src=c,l=e.settings,u=p,!l.images_dataimg_filter||l.images_dataimg_filter(u)){var g,v=e.editorUpload.blobCache,h=void 0;(g=v.findFirst(function(e){return e.base64()===f}))?h=g:(h=v.create(d,r,f,m),v.add(h)),b('<img src="'+h.blobUri()+'">',!1)}else b('<img src="'+c+'">',!1)}function D(t,n){var r=t.clipboardData||t.dataTransfer;function a(e){var r,a,i,o=!1;if(e)for(r=0;r<e.length;r++)if(a=e[r],/^image\/(jpeg|png|gif|bmp)$/.test(a.type)){var s=a.getAsFile?a.getAsFile():a;(i=new window.FileReader).onload=_.bind(null,n,i,s),i.readAsDataURL(s),t.preventDefault(),o=!0}return o}if(e.settings.paste_data_images&&r)return a(r.items)||a(r.files)}function k(e,t){return t in e&&e[t].length>0}function R(e){return f.metaKeyPressed(e)&&86===e.keyCode||e.shiftKey&&45===e.keyCode}function E(){function t(t,n,r,a){var i,o;k(t,"text/html")?i=t["text/html"]:(i=v.getHtml(),a=a||p.isMarked(i),v.isDefaultContent(i)&&(r=!0)),i=C.trimHtml(i),v.remove(),o=!1===a&&P.isPlainText(i),i.length&&!o||(r=!0),r&&(i=k(t,"text/plain")&&o?t["text/plain"]:C.innerText(i)),v.isDefaultContent(i)?n||e.windowManager.alert("Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents."):r?x(i):b(i,a)}e.on("keydown",function(t){function n(e){R(e)&&!e.isDefaultPrevented()&&v.remove()}if(R(t)&&!t.isDefaultPrevented()){if((d=t.shiftKey&&86===t.keyCode)&&l.webkit&&-1!==navigator.userAgent.indexOf("Version/"))return;if(t.stopImmediatePropagation(),g=(new Date).getTime(),l.ie&&d)return t.preventDefault(),void a.firePaste(e,!0);v.remove(),v.create(),e.once("keyup",n),e.once("paste",function(){e.off("keyup",n)})}}),e.on("paste",function(n){var r,a,i=(new Date).getTime(),o=(r=w(n.clipboardData||e.getDoc().dataTransfer),C.isMsEdge()?c.extend(r,{"text/html":""}):r),s=(new Date).getTime()-i,f=(new Date).getTime()-g-s<1e3,h="text"===m.pasteFormat||d,P=k(o,p.internalHtmlMime());d=!1,n.isDefaultPrevented()||(a=n.clipboardData,-1!==navigator.userAgent.indexOf("Android")&&a&&a.items&&0===a.items.length)?v.remove():T(o)||!D(n,v.getLastRng()||e.selection.getRng())?(f||n.preventDefault(),!l.ie||f&&!n.ieFake||k(o,"text/html")||(v.create(),e.dom.bind(v.getEl(),"paste",function(e){e.stopPropagation()}),e.getDoc().execCommand("Paste",!1,null),o["text/html"]=v.getHtml()),k(o,"text/html")?(n.preventDefault(),P||(P=p.isMarked(o["text/html"])),t(o,f,h,P)):u.setEditorTimeout(e,function(){t(o,f,h,P)},0)):v.remove()})}m.pasteFormat=i.isPasteAsTextEnabled(e)?"text":"html",m.pasteHtml=b,m.pasteText=x,m.pasteImageData=D,m.getDataTransferItems=w,m.hasHtmlOrText=T,m.hasContentType=k,e.on("preInit",function(){var t;E(),e.parser.addNodeFilter("img",function(n,r,a){function i(e){e.attr("data-mce-object")||t===l.transparentSrc||e.remove()}if(!e.settings.paste_data_images&&(s=a).data&&!0===s.data.paste)for(var o=n.length;o--;)(t=n[o].attributes.map.src)&&(0===t.indexOf("webkit-fake-url")?i(n[o]):e.settings.allow_html_data_urls||0!==t.indexOf("data:")||i(n[o]));var s})})},L=function(){},$=function(e,t,n){if(r=e,!1!==l.iOS||r===undefined||"function"!=typeof r.setData||!0===C.isMsEdge())return!1;try{return e.clearData(),e.setData("text/html",t),e.setData("text/plain",n),e.setData(p.internalHtmlMime(),t),!0}catch(a){return!1}var r},W=function(e,t,n,r){$(e.clipboardData,t.html,t.text)?(e.preventDefault(),r()):n(t.html,r)},j=function(e){return function(t,n){var r=p.mark(t),a=e.dom.create("div",{contenteditable:"false","data-mce-bogus":"all"}),i=e.dom.create("div",{contenteditable:"true"},r);e.dom.setStyles(a,{position:"fixed",left:"-3000px",width:"1000px",overflow:"hidden"}),a.appendChild(i),e.dom.add(e.getBody(),a);var o=e.selection.getRng();i.focus();var s=e.dom.createRng();s.selectNodeContents(i),e.selection.setRng(s),setTimeout(function(){a.parentNode.removeChild(a),e.selection.setRng(o),n()},0)}},U=function(e){return{html:e.selection.getContent({contextual:!0}),text:e.selection.getContent({format:"text"})}},V=function(e){var t,n;e.on("cut",(t=e,function(e){!1===t.selection.isCollapsed()&&W(e,U(t),j(t),function(){setTimeout(function(){t.execCommand("Delete")},0)})})),e.on("copy",(n=e,function(e){!1===n.selection.isCollapsed()&&W(e,U(n),j(n),L)}))},z=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),K=function(e,t){return z.getCaretRangeFromPoint(t.clientX,t.clientY,e.getDoc())},G=function(e,t){e.focus(),e.selection.setRng(t)},X=function(e,t,n){i.shouldBlockDrop(e)&&e.on("dragend dragover draggesture dragdrop drop drag",function(e){e.preventDefault(),e.stopPropagation()}),i.shouldPasteDataImages(e)||e.on("drop",function(e){var t=e.dataTransfer;t&&t.files&&t.files.length>0&&e.preventDefault()}),e.on("drop",function(r){var a,o;if(o=K(e,r),!r.isDefaultPrevented()&&!n.get()){a=t.getDataTransferItems(r.dataTransfer);var s,l=t.hasContentType(a,p.internalHtmlMime());if((t.hasHtmlOrText(a)&&(!(s=a["text/plain"])||0!==s.indexOf("file://"))||!t.pasteImageData(r,o))&&o&&i.shouldFilterDrop(e)){var c=a["mce-internal"]||a["text/html"]||a["text/plain"];c&&(r.preventDefault(),u.setEditorTimeout(e,function(){e.undoManager.transact(function(){a["mce-internal"]&&e.execCommand("Delete"),G(e,o),c=C.trimHtml(c),a["text/html"]?t.pasteHtml(c,l):t.pasteText(c)})}))}}}),e.on("dragstart",function(e){n.set(!0)}),e.on("dragover dragend",function(t){i.shouldPasteDataImages(e)&&!1===n.get()&&(t.preventDefault(),G(e,K(e,t))),"dragend"===t.type&&n.set(!1)})},q=function(e){var t=e.plugins.paste,n=i.getPreProcess(e);n&&e.on("PastePreProcess",function(e){n.call(t,t,e)});var r=i.getPostProcess(e);r&&e.on("PastePostProcess",function(e){r.call(t,t,e)})};function Y(e,t){e.on("PastePreProcess",function(n){n.content=t(e,n.content,n.internal,n.wordContent)})}function Z(e,t){if(!R.isWordContent(t))return t;var n=[];c.each(e.schema.getBlockElements(),function(e,t){n.push(t)});var r=new RegExp("(?:<br> [\\s\\r\\n]+|<br>)*(<\\/?("+n.join("|")+")[^>]*>)(?:<br> [\\s\\r\\n]+|<br>)*","g");return t=C.filter(t,[[r,"$1"]]),t=C.filter(t,[[/<br><br>/g,"<BR><BR>"],[/<br>/g," "],[/<BR><BR>/g,"<br>"]])}function J(e,t,n,r){if(r||n)return t;var a=i.getWebkitStyles(e);if(!1===i.shouldRemoveWebKitStyles(e)||"all"===a)return t;if(a&&(a=a.split(/[, ]/)),a){var o=e.dom,s=e.selection.getNode();t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,function(e,t,n,r){var i=o.parseStyle(o.decode(n),"span"),l={};if("none"===a)return t+r;for(var u=0;u<a.length;u++){var c=i[a[u]],f=o.getStyle(s,a[u],!0);/color/.test(a[u])&&(c=o.toHex(c),f=o.toHex(f)),f!==c&&(l[a[u]]=c)}return(l=o.serializeStyle(l,"span"))?t+' style="'+l+'"'+r:t+r})}else t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return t=t.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,function(e,t,n,r){return t+' style="'+n+'"'+r})}function Q(e,t){e.$("a",t).find("font,u").each(function(t,n){e.dom.remove(n,!0)})}var ee=function(e){var t,n;l.webkit&&Y(e,J),l.ie&&(Y(e,Z),n=Q,(t=e).on("PastePostProcess",function(e){n(t,e.node)}))},te=function(e){return function(){return e}},ne=function(e){for(var t=new Array(arguments.length-1),n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];var a=t.concat(n);return e.apply(null,a)}},re=(te(!1),te(!0),function(e,t){var n=ne((te(!1),te(!0),function(e,t,n){var r=n.control;r.active("text"===t.pasteFormat),e.on("PastePlainTextToggle",function(e){r.active(e.state)})}),e,t);e.addButton("pastetext",{active:!1,icon:"pastetext",tooltip:"Paste as text",cmd:"mceTogglePlainTextPaste",onPostRender:n}),e.addMenuItem("pastetext",{text:"Paste as text",selectable:!0,active:t.pasteFormat,cmd:"mceTogglePlainTextPaste",onPostRender:n})}),ae=e(!1);t.add("paste",function(t){if(!1===n(t)){var a=new N(t),i=ee(t),o=e(!1);return re(t,a),s(t,a,ae),q(t),V(t),X(t,a,o),r(a,i)}})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env"),n=function(e){return e.getParam("pagebreak_separator","\x3c!-- pagebreak --\x3e")},t=function(e){return e.getParam("pagebreak_split_block",!1)},r=function(){return"mce-pagebreak"},c=function(){return'<img src="'+a.transparentSrc+'" class="mce-pagebreak" data-mce-resize="false" data-mce-placeholder />'},o=function(e){var a=n(e),r=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(e){return"\\"+e}),"gi");e.on("BeforeSetContent",function(e){e.content=e.content.replace(r,c())}),e.on("PreInit",function(){e.serializer.addNodeFilter("img",function(n){for(var r,c,o=n.length;o--;)if((c=(r=n[o]).attr("class"))&&-1!==c.indexOf("mce-pagebreak")){var i=r.parent;if(e.schema.getBlockElements()[i.name]&&t(e)){i.type=3,i.value=a,i.raw=!0,r.remove();continue}r.type=3,r.value=a,r.raw=!0}})})},i=c,g=r,u=function(e){e.addCommand("mcePageBreak",function(){e.settings.pagebreak_split_block?e.insertContent("<p>"+i()+"</p>"):e.insertContent(i())})},m=function(e){e.on("ResolveName",function(a){"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,g())&&(a.name="pagebreak")})},s=function(e){e.addButton("pagebreak",{title:"Page break",cmd:"mcePageBreak"}),e.addMenuItem("pagebreak",{text:"Page break",icon:"pagebreak",cmd:"mcePageBreak",context:"insert"})};e.add("pagebreak",function(e){u(e),s(e),o(e),m(e)})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(t){return t.getParam("noneditable_noneditable_class","mceNonEditable")},r=function(t){return t.getParam("noneditable_editable_class","mceEditable")},a=function(t){var n=t.getParam("noneditable_regexp",[]);return n&&n.constructor===RegExp?[n]:n},i=function(t){return function(n){return-1!==(" "+n.attr("class")+" ").indexOf(t)}},o=function(t,n,e){return function(r){var a=arguments,i=a[a.length-2],o=i>0?n.charAt(i-1):"";if('"'===o)return r;if(">"===o){var c=n.lastIndexOf("<",i);if(-1!==c&&-1!==n.substring(c,i).indexOf('contenteditable="false"'))return r}return'<span class="'+e+'" data-mce-content="'+t.dom.encode(a[0])+'">'+t.dom.encode("string"==typeof a[1]?a[1]:a[0])+"</span>"}},c=function(t){var c,l,u="contenteditable";c=" "+n.trim(r(t))+" ",l=" "+n.trim(e(t))+" ";var f=i(c),s=i(l),d=a(t);t.on("PreInit",function(){d.length>0&&t.on("BeforeSetContent",function(n){!function(t,n,r){var a=n.length,i=r.content;if("raw"!==r.format){for(;a--;)i=i.replace(n[a],o(t,i,e(t)));r.content=i}}(t,d,n)}),t.parser.addAttributeFilter("class",function(t){for(var n,e=t.length;e--;)n=t[e],f(n)?n.attr(u,"true"):s(n)&&n.attr(u,"false")}),t.serializer.addAttributeFilter(u,function(t){for(var n,e=t.length;e--;)n=t[e],(f(n)||s(n))&&(d.length>0&&n.attr("data-mce-content")?(n.name="#text",n.type=3,n.raw=!0,n.value=n.attr("data-mce-content")):n.attr(u,null))})})};t.add("noneditable",function(t){c(t)})}();!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(n,e){var t,a=(t=n).plugins.visualchars&&t.plugins.visualchars.isEnabled()?'<span class="mce-nbsp"> </span>':" ";n.insertContent(function(n,e){for(var t="",a=0;a<e;a++)t+=n;return t}(a,e)),n.dom.setAttrib(n.dom.select("span.mce-nbsp"),"data-mce-bogus","1")},t=function(n){n.addCommand("mceNonBreaking",function(){e(n,1)})},a=tinymce.util.Tools.resolve("tinymce.util.VK"),i=function(n){var e=n.getParam("nonbreaking_force_tab",0);return"boolean"==typeof e?!0===e?3:0:e},o=function(n){var t=i(n);t>0&&n.on("keydown",function(i){if(i.keyCode===a.TAB&&!i.isDefaultPrevented()){if(i.shiftKey)return;i.preventDefault(),i.stopImmediatePropagation(),e(n,t)}})},r=function(n){n.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),n.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"})};n.add("nonbreaking",function(n){t(n),r(n),o(n)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(e){return e.getParam("media_scripts")},a=function(e){return e.getParam("audio_template_callback")},o=function(e){return e.getParam("video_template_callback")},n=function(e){return e.getParam("media_live_embeds",!0)},c=function(e){return e.getParam("media_filter_html",!0)},s=function(e){return e.getParam("media_url_resolver")},u=function(e){return e.getParam("media_alt_source",!0)},l=function(e){return e.getParam("media_poster",!0)},m=function(e){return e.getParam("media_dimensions",!0)},d=tinymce.util.Tools.resolve("tinymce.html.SaxParser"),h=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),p=function(e,t){if(e)for(var r=0;r<e.length;r++)if(-1!==t.indexOf(e[r].filter))return e[r]},f=function(e){return function(t){return t?t.style[e].replace(/px$/,""):""}},g=function(e){return function(t,r){var i;t&&(t.style[e]=/^[0-9.]+$/.test(i=r)?i+"px":i)}},w={getMaxWidth:f("maxWidth"),getMaxHeight:f("maxHeight"),setMaxWidth:g("maxWidth"),setMaxHeight:g("maxHeight")},v=h.DOM,b=function(e){return v.getAttrib(e,"data-ephox-embed-iri")},y=function(e,t){return s=t,u=v.createFragment(s),""!==b(u.firstChild)?(n=t,c=v.createFragment(n).firstChild,{type:"ephox-embed-iri",source1:b(c),source2:"",poster:"",width:w.getMaxWidth(c),height:w.getMaxHeight(c)}):(i=e,a=t,o={},new d({validate:!1,allow_conditional_comments:!0,special:"script,noscript",start:function(e,t){if(o.source1||"param"!==e||(o.source1=t.map.movie),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(o.type||(o.type=e),o=r.extend(t.map,o)),"script"===e){var a=p(i,t.map.src);if(!a)return;o={type:"script",source1:t.map.src,width:a.width,height:a.height}}"source"===e&&(o.source1?o.source2||(o.source2=t.map.src):o.source1=t.map.src),"img"!==e||o.poster||(o.poster=t.map.src)}}).parse(a),o.source1=o.source1||o.src||o.data,o.source2=o.source2||"",o.poster=o.poster||"",o);var i,a,o,n,c,s,u},x=tinymce.util.Tools.resolve("tinymce.util.Promise"),j=function(e){var t={mp3:"audio/mpeg",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"}[e.toLowerCase().split(".").pop()];return t||""},M=tinymce.util.Tools.resolve("tinymce.html.Writer"),_=tinymce.util.Tools.resolve("tinymce.html.Schema"),C=h.DOM,S=function(e,t){var r,i,a,o;for(r in t)if(a=""+t[r],e.map[r])for(i=e.length;i--;)(o=e[i]).name===r&&(a?(e.map[r]=a,o.value=a):(delete e.map[r],e.splice(i,1)));else a&&(e.push({name:r,value:a}),e.map[r]=a)},k=function(e,t){var r,i,a=C.createFragment(e).firstChild;return w.setMaxWidth(a,t.width),w.setMaxHeight(a,t.height),r=a.outerHTML,i=M(),new d(i).parse(r),i.getContent()},A=function(e,t,r){return u=e,l=C.createFragment(u),""!==C.getAttrib(l.firstChild,"data-ephox-embed-iri")?k(e,t):(i=e,a=t,o=r,c=M(),s=0,new d({validate:!1,allow_conditional_comments:!0,special:"script,noscript",comment:function(e){c.comment(e)},cdata:function(e){c.cdata(e)},text:function(e,t){c.text(e,t)},start:function(e,t,r){switch(e){case"video":case"object":case"embed":case"img":case"iframe":a.height!==undefined&&a.width!==undefined&&S(t,{width:a.width,height:a.height})}if(o)switch(e){case"video":S(t,{poster:a.poster,src:""}),a.source2&&S(t,{src:""});break;case"iframe":S(t,{src:a.source1});break;case"source":if(++s<=2&&(S(t,{src:a["source"+s],type:a["source"+s+"mime"]}),!a["source"+s]))return;break;case"img":if(!a.poster)return;n=!0}c.start(e,t,r)},end:function(e){if("video"===e&&o)for(var t=1;t<=2;t++)if(a["source"+t]){var r=[];r.map={},s<t&&(S(r,{src:a["source"+t],type:a["source"+t+"mime"]}),c.start("source",r,!0))}if(a.poster&&"object"===e&&o&&!n){var i=[];i.map={},S(i,{src:a.poster,width:a.width,height:a.height}),c.start("img",i,!0)}c.end(e)}},_({})).parse(i),c.getContent());var i,a,o,n,c,s,u,l},F=[{regex:/youtu\.be\/([\w\-.]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$2",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\-_]+(?:\?.+)?)/i,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowfullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$2?title=0&byline=0",allowfullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'//maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"//www.dailymotion.com/embed/video/$1",allowFullscreen:!0},{regex:/dai\.ly\/([^_]+)/,type:"iframe",w:480,h:270,url:"//www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],N=function(e,t){var n=r.extend({},t);if(!n.source1&&(r.extend(n,y(i(e),n.embed)),!n.source1))return"";if(n.source2||(n.source2=""),n.poster||(n.poster=""),n.source1=e.convertURL(n.source1,"source"),n.source2=e.convertURL(n.source2,"source"),n.source1mime=j(n.source1),n.source2mime=j(n.source2),n.poster=e.convertURL(n.poster,"poster"),r.each(F,function(e){var t,r,i=e.regex.exec(n.source1);if(i){for(r=e.url,t=0;i[t];t++)r=r.replace("$"+t,function(){return i[t]});n.source1=r,n.type=e.type,n.allowFullscreen=e.allowFullscreen,n.width=n.width||e.w,n.height=n.height||e.h}}),n.embed)return A(n.embed,n,!0);var c=p(i(e),n.source1);c&&(n.type="script",n.width=c.width,n.height=c.height);var s,u,l,m,d,h,f,g,w=a(e),v=o(e);return n.width=n.width||300,n.height=n.height||150,r.each(n,function(t,r){n[r]=e.dom.encode(t)}),"iframe"===n.type?(g=(f=n).allowFullscreen?' allowFullscreen="1"':"",'<iframe src="'+f.source1+'" width="'+f.width+'" height="'+f.height+'"'+g+"></iframe>"):"application/x-shockwave-flash"===n.source1mime?(h='<object data="'+(d=n).source1+'" width="'+d.width+'" height="'+d.height+'" type="application/x-shockwave-flash">',d.poster&&(h+='<img src="'+d.poster+'" width="'+d.width+'" height="'+d.height+'" />'),h+="</object>"):-1!==n.source1mime.indexOf("audio")?(l=n,(m=w)?m(l):'<audio controls="controls" src="'+l.source1+'">'+(l.source2?'\n<source src="'+l.source2+'"'+(l.source2mime?' type="'+l.source2mime+'"':"")+" />\n":"")+"</audio>"):"script"===n.type?'<script src="'+n.source1+'"><\/script>':(s=n,(u=v)?u(s):'<video width="'+s.width+'" height="'+s.height+'"'+(s.poster?' poster="'+s.poster+'"':"")+' controls="controls">\n<source src="'+s.source1+'"'+(s.source1mime?' type="'+s.source1mime+'"':"")+" />\n"+(s.source2?'<source src="'+s.source2+'"'+(s.source2mime?' type="'+s.source2mime+'"':"")+" />\n":"")+"</video>")},O={},P=function(e){return function(t){return N(e,t)}},T=function(e,t){var r,i,a,o,n,c=s(e);return c?(a=t,o=P(e),n=c,new x(function(e,t){var r=function(t){return t.html&&(O[a.source1]=t),e({url:a.source1,html:t.html?t.html:o(a)})};O[a.source1]?r(O[a.source1]):n({url:a.source1},r,t)})):(r=t,i=P(e),new x(function(e){e({html:i(r),url:r.source1})}))},z=function(e){return O.hasOwnProperty(e)},$=function(e,t){e.state.set("oldVal",e.value()),t.state.set("oldVal",t.value())},L=function(e,t){var r=e.find("#width")[0],i=e.find("#height")[0],a=e.find("#constrain")[0];r&&i&&a&&t(r,i,a.checked())},H=function(e,t,r){var i=e.state.get("oldVal"),a=t.state.get("oldVal"),o=e.value(),n=t.value();r&&i&&a&&o&&n&&(o!==i?(n=Math.round(o/i*n),isNaN(n)||t.value(n)):(o=Math.round(n/a*o),isNaN(o)||e.value(o))),$(e,t)},W=function(e){L(e,H)},J=function(e){var t=function(){e(function(e){W(e)})};return{type:"container",label:"Dimensions",layout:"flex",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:5,onchange:t,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:5,onchange:t,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}},R=function(e){L(e,$)},D=W,E=t.ie&&t.ie<=8?"onChange":"onInput",I=function(e){return function(t){var r=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:r})}},U=function(e,t){return function(a){var o=a.html,n=e.find("#embed")[0],c=r.extend(y(i(t),o),{source1:a.url});e.fromJSON(c),n&&(n.value(o),D(e))}},V=function(e,t){var r=e.dom.select("img[data-mce-object]");e.insertContent(t),function(e,t){var r,i,a=e.dom.select("img[data-mce-object]");for(r=0;r<t.length;r++)for(i=a.length-1;i>=0;i--)t[r]===a[i]&&a.splice(i,1);e.selection.select(a[0])}(e,r),e.nodeChanged()},B=function(e){var t,a,o,n,c,s=[{name:"source1",type:"filepicker",filetype:"media",size:40,autofocus:!0,label:"Source",onpaste:function(){setTimeout(function(){T(e,t.toJSON()).then(U(t,e))["catch"](I(e))},1)},onchange:function(i){var a,o;T(e,t.toJSON()).then(U(t,e))["catch"](I(e)),a=t,o=i.meta,r.each(o,function(e,t){a.find("#"+t).value(e)})},onbeforecall:function(e){e.meta=t.toJSON()}}],d=[];if(u(e)&&d.push({name:"source2",type:"filepicker",filetype:"media",size:40,label:"Alternative source"}),l(e)&&d.push({name:"poster",type:"filepicker",filetype:"image",size:40,label:"Poster"}),m(e)){var h=J(function(e){e(t),a=t.toJSON(),t.find("#embed").value(A(a.embed,a))});s.push(h)}n=(o=e).selection.getNode(),c=n.getAttribute("data-ephox-embed-iri"),a=c?{source1:c,"data-ephox-embed-iri":c,width:w.getMaxWidth(n),height:w.getMaxHeight(n)}:n.getAttribute("data-mce-object")?y(i(o),o.serializer.serialize(n,{selection:!0})):{};var p={id:"mcemediasource",type:"textbox",flex:1,name:"embed",value:function(e){var t=e.selection.getNode();if(t.getAttribute("data-mce-object")||t.getAttribute("data-ephox-embed-iri"))return e.selection.getContent()}(e),multiline:!0,rows:5,label:"Source"};p[E]=function(){a=r.extend({},y(i(e),this.value())),this.parent().parent().fromJSON(a)},t=e.windowManager.open({title:"Insert/edit media",data:a,bodyType:"tabpanel",body:[{title:"General",type:"form",items:s},{title:"Embed",type:"container",layout:"flex",direction:"column",align:"stretch",padding:10,spacing:10,items:[{type:"label",text:"Paste your embed code below:",forId:"mcemediasource"},p]},{title:"Advanced",type:"form",items:d}],onSubmit:function(){var r,i;D(t),r=e,(i=t.toJSON()).embed=A(i.embed,i),i.embed&&z(i.source1)?V(r,i.embed):T(r,i).then(function(e){V(r,e.html)})["catch"](I(r))}}),R(t)},G=function(e){return{showDialog:function(){B(e)}}},q=function(e){e.addCommand("mceMedia",function(){B(e)})},K=tinymce.util.Tools.resolve("tinymce.html.Node"),Q=function(e,t){if(!1===c(e))return t;var r,i=M();return new d({validate:!1,allow_conditional_comments:!1,special:"script,noscript",comment:function(e){i.comment(e)},cdata:function(e){i.cdata(e)},text:function(e,t){i.text(e,t)},start:function(t,a,o){if(r=!0,"script"!==t&&"noscript"!==t){for(var n=0;n<a.length;n++){if(0===a[n].name.indexOf("on"))return;"style"===a[n].name&&(a[n].value=e.dom.serializeStyle(e.dom.parseStyle(a[n].value),t))}i.start(t,a,o),r=!1}},end:function(e){r||i.end(e)}},_({})).parse(t),i.getContent()},X=function(e,r){var i,a=r.name;return(i=new K("img",1)).shortEnded=!0,Z(e,r,i),i.attr({width:r.attr("width")||"300",height:r.attr("height")||("audio"===a?"30":"150"),style:r.attr("style"),src:t.transparentSrc,"data-mce-object":a,"class":"mce-object mce-object-"+a}),i},Y=function(e,t){var r,i,a,o=t.name;return(r=new K("span",1)).attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":o,"class":"mce-preview-object mce-object-"+o}),Z(e,t,r),(i=new K(o,1)).attr({src:t.attr("src"),allowfullscreen:t.attr("allowfullscreen"),width:t.attr("width")||"300",height:t.attr("height")||("audio"===o?"30":"150"),frameborder:"0"}),(a=new K("span",1)).attr("class","mce-shim"),r.append(i),r.append(a),r},Z=function(e,t,r){var i,a,o,n,c;for(n=(o=t.attributes).length;n--;)i=o[n].name,a=o[n].value,"width"!==i&&"height"!==i&&"style"!==i&&("data"!==i&&"src"!==i||(a=e.convertURL(a,i)),r.attr("data-mce-p-"+i,a));(c=t.firstChild&&t.firstChild.value)&&(r.attr("data-mce-html",escape(Q(e,c))),r.firstChild=null)},ee=function(e){for(;e=e.parent;)if(e.attr("data-ephox-embed-iri"))return!0;return!1},te=function(e){return function(r){for(var a,o,c=r.length;c--;)(a=r[c]).parent&&(a.parent.attr("data-mce-object")||("script"!==a.name||(o=p(i(e),a.attr("src"))))&&(o&&(o.width&&a.attr("width",o.width.toString()),o.height&&a.attr("height",o.height.toString())),"iframe"===a.name&&n(e)&&t.ceFalse?ee(a)||a.replace(Y(e,a)):ee(a)||a.replace(X(e,a))))}},re=function(e){e.on("preInit",function(){var t=e.schema.getSpecialElements();r.each("video audio iframe object".split(" "),function(e){t[e]=new RegExp("</"+e+"[^>]*>","gi")});var i=e.schema.getBoolAttrs();r.each("webkitallowfullscreen mozallowfullscreen allowfullscreen".split(" "),function(e){i[e]={}}),e.parser.addNodeFilter("iframe,video,audio,object,embed,script",te(e)),e.serializer.addAttributeFilter("data-mce-object",function(t,r){for(var i,a,o,n,c,s,u,l,m=t.length;m--;)if((i=t[m]).parent){for(u=i.attr(r),a=new K(u,1),"audio"!==u&&"script"!==u&&((l=i.attr("class"))&&-1!==l.indexOf("mce-preview-object")?a.attr({width:i.firstChild.attr("width"),height:i.firstChild.attr("height")}):a.attr({width:i.attr("width"),height:i.attr("height")})),a.attr({style:i.attr("style")}),o=(n=i.attributes).length;o--;){var d=n[o].name;0===d.indexOf("data-mce-p-")&&a.attr(d.substr(11),n[o].value)}"script"===u&&a.attr("type","text/javascript"),(c=i.attr("data-mce-html"))&&((s=new K("#text",3)).raw=!0,s.value=Q(e,unescape(c)),a.append(s)),i.replace(a)}})}),e.on("setContent",function(){e.$("span.mce-preview-object").each(function(t,r){var i=e.$(r);0===i.find("span.mce-shim",r).length&&i.append('<span class="mce-shim"></span>')})})},ie=function(e){e.on("ResolveName",function(e){var t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)})},ae=function(e){e.on("click keyup",function(){var t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")}),e.on("ObjectSelected",function(e){var t=e.target.getAttribute("data-mce-object");"audio"!==t&&"script"!==t||e.preventDefault()}),e.on("objectResized",function(e){var t,r=e.target;r.getAttribute("data-mce-object")&&(t=r.getAttribute("data-mce-html"))&&(t=unescape(t),r.setAttribute("data-mce-html",escape(A(t,{width:e.width,height:e.height}))))})},oe=function(e){e.addButton("media",{tooltip:"Insert/edit media",cmd:"mceMedia",stateSelector:["img[data-mce-object]","span[data-mce-object]","div[data-ephox-embed-iri]"]}),e.addMenuItem("media",{icon:"media",text:"Media",cmd:"mceMedia",context:"insert",prependToContext:!0})};e.add("media",function(e){return q(e),oe(e),ie(e),re(e),ae(e),G(e)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),n=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),o=tinymce.util.Tools.resolve("tinymce.util.VK"),r=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),s=function(e){return e&&"BR"===e.nodeName},d=function(e){return e&&3===e.nodeType},l=function(e){return e&&/^(OL|UL|DL)$/.test(e.nodeName)},c=function(e){return e&&/^(LI|DT|DD)$/.test(e.nodeName)},f=function(e){return e&&/^(TH|TD)$/.test(e.nodeName)},u=s,m=function(e){return e.parentNode.firstChild===e},g=function(e){return e.parentNode.lastChild===e},p=function(e,t){return t&&!!e.schema.getTextBlockElements()[t.nodeName]},v=function(e,t){return e&&e.nodeName in t},h=function(e,t){return!!s(t)&&!(!e.isBlock(t.nextSibling)||s(t.previousSibling))},C=function(e,t,n){var o=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&o},y=function(e,t){return e.isChildOf(t,e.getRoot())},N=function(e,n){var o=t.getNode(e,n);return c(e)&&d(o)?{container:o,offset:n>=e.childNodes.length?o.data.length:0}:{container:e,offset:n}},L=function(e){var t=e.cloneRange(),n=N(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);var o=N(e.endContainer,e.endOffset);return t.setEnd(o.container,o.offset),t},S=a.DOM,b=function(e){var t={},n=function(n){var o,r,i;r=e[n?"startContainer":"endContainer"],i=e[n?"startOffset":"endOffset"],1===r.nodeType&&(o=S.create("span",{"data-mce-type":"bookmark"}),r.hasChildNodes()?(i=Math.min(i,r.childNodes.length-1),n?r.insertBefore(o,r.childNodes[i]):S.insertAfter(o,r.childNodes[i])):r.appendChild(o),r=o,i=0),t[n?"startContainer":"endContainer"]=r,t[n?"startOffset":"endOffset"]=i};return n(!0),e.collapsed||n(),t},D=function(e){function t(t){var n,o,r;n=r=e[t?"startContainer":"endContainer"],o=e[t?"startOffset":"endOffset"],n&&(1===n.nodeType&&(o=function(e){for(var t=e.parentNode.firstChild,n=0;t;){if(t===e)return n;1===t.nodeType&&"bookmark"===t.getAttribute("data-mce-type")||n++,t=t.nextSibling}return-1}(n),n=n.parentNode,S.remove(r),!n.hasChildNodes()&&S.isBlock(n)&&n.appendChild(S.create("br"))),e[t?"startContainer":"endContainer"]=n,e[t?"startOffset":"endOffset"]=o)}t(!0),t();var n=S.createRng();return n.setStart(e.startContainer,e.startOffset),e.endContainer&&n.setEnd(e.endContainer,e.endOffset),L(n)},k=a.DOM,T=function(e,t){var n,o=t.parentNode;"LI"===o.nodeName&&o.firstChild===t&&((n=o.previousSibling)&&"LI"===n.nodeName?(n.appendChild(t),C(e,o)&&k.remove(o)):k.setStyle(o,"listStyleType","none")),l(o)&&(n=o.previousSibling)&&"LI"===n.nodeName&&n.appendChild(t)},I=function(e,t){i.each(i.grep(e.select("ol,ul",t)),function(t){T(e,t)})},B=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),R=function(e){var t=e.selection.getStart(!0);return e.dom.getParent(t,"OL,UL,DL",O(e,t))},O=function(e,t){var n=e.dom.getParents(t,"TD,TH");return n.length>0?n[0]:e.getBody()},E={getParentList:R,getSelectedSubLists:function(e){var t,n,o,r=R(e),a=e.selection.getSelectedBlocks();return o=a,(n=r)&&1===o.length&&o[0]===n?(t=r,i.grep(t.querySelectorAll("ol,ul,dl"),function(e){return l(e)})):i.grep(a,function(e){return l(e)&&r!==e})},getSelectedListItems:function(e){var t,n,o,r=e.selection.getSelectedBlocks();return i.grep((t=e,n=r,o=i.map(n,function(e){var n=t.dom.getParent(e,"li,dd,dt",O(t,e));return n||e}),B.unique(o)),function(e){return c(e)})},getClosestListRootElm:O},A=tinymce.util.Tools.resolve("tinymce.Env"),P=a.DOM,x=function(e,t,n){var o,r,i,a=P.createFragment(),s=e.schema.getBlockElements();if(e.settings.forced_root_block&&(n=n||e.settings.forced_root_block),n&&((r=P.create(n)).tagName===e.settings.forced_root_block&&P.setAttribs(r,e.settings.forced_root_block_attrs),v(t.firstChild,s)||a.appendChild(r)),t)for(;o=t.firstChild;){var d=o.nodeName;i||"SPAN"===d&&"bookmark"===o.getAttribute("data-mce-type")||(i=!0),v(o,s)?(a.appendChild(o),r=null):n?(r||(r=P.create(n),a.appendChild(r)),r.appendChild(o)):a.appendChild(o)}return e.settings.forced_root_block?i||A.ie&&!(A.ie>10)||r.appendChild(P.create("br",{"data-mce-bogus":"1"})):a.appendChild(P.create("br")),a},_=a.DOM,M=function(e,t,n,o){var r,a,s,d,l;for(s=_.select('span[data-mce-type="bookmark"]',t),o=o||x(e,n),(r=_.createRng()).setStartAfter(n),r.setEndAfter(t),d=(a=r.extractContents()).firstChild;d;d=d.firstChild)if("LI"===d.nodeName&&e.dom.isEmpty(d)){_.remove(d);break}e.dom.isEmpty(a)||_.insertAfter(a,t),_.insertAfter(o,t),C(e.dom,n.parentNode)&&(l=n.parentNode,i.each(s,function(e){l.parentNode.insertBefore(e,n.parentNode)}),_.remove(l)),_.remove(n),C(e.dom,t)&&_.remove(t)},U=a.DOM,H=function(e,t){C(e,t)&&U.remove(t)},$=function(e,t){var n,o=t.parentNode,r=o.parentNode;return!(o!==e.getBody()&&("DD"===t.nodeName?(U.rename(t,"DT"),0):m(t)&&g(t)?("LI"===r.nodeName?(U.insertAfter(t,r),H(e.dom,r),U.remove(o)):l(r)?U.remove(o,!0):(r.insertBefore(x(e,t),o),U.remove(o)),0):m(t)?("LI"===r.nodeName?(U.insertAfter(t,r),t.appendChild(o),H(e.dom,r)):l(r)?r.insertBefore(t,o):(r.insertBefore(x(e,t),o),U.remove(t)),0):g(t)?("LI"===r.nodeName?U.insertAfter(t,r):l(r)?U.insertAfter(t,o):(U.insertAfter(x(e,t),o),U.remove(t)),0):("LI"===r.nodeName?(o=r,n=x(e,t,"LI")):n=l(r)?x(e,t,"LI"):x(e,t),M(e,o,t,n),I(e.dom,o.parentNode),0)))},w=$,K=function(e){var t=E.getSelectedListItems(e);if(t.length){var n=b(e.selection.getRng(!0)),o=void 0,r=void 0,i=E.getClosestListRootElm(e,e.selection.getStart(!0));for(o=t.length;o--;)for(var a=t[o].parentNode;a&&a!==i;){for(r=t.length;r--;)if(t[r]===a){t.splice(o,1);break}a=a.parentNode}for(o=0;o<t.length&&($(e,t[o])||0!==o);o++);return e.selection.setRng(D(n)),e.nodeChanged(),!0}},Q=function(e,t){i.each(t,function(t,n){e.setAttribute(n,t)})},W=function(e,t,n){var o,r,a,s,d,l,c;o=e,r=t,s=(a=n)["list-style-type"]?a["list-style-type"]:null,o.setStyle(r,"list-style-type",s),d=e,Q(l=t,(c=n)["list-attributes"]),i.each(d.select("li",l),function(e){Q(e,c["list-item-attributes"])})},j=function(e,t,n,o){var r,i;for(r=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"],1===r.nodeType&&(r=r.childNodes[Math.min(i,r.childNodes.length-1)]||r),!n&&u(r.nextSibling)&&(r=r.nextSibling);r.parentNode!==o;){if(p(e,r))return r;if(/^(TD|TH)$/.test(r.parentNode.nodeName))return r;r=r.parentNode}return r},q=function(e,t,n){var o,a=e.selection.getRng(!0),s="LI",d=E.getClosestListRootElm(e,e.selection.getStart(!0)),c=e.dom;n=n||{},"false"!==c.getContentEditable(e.selection.getNode())&&("DL"===(t=t.toUpperCase())&&(s="DT"),o=b(a),i.each(function(e,t,n){for(var o,a=[],s=e.dom,d=j(e,t,!0,n),l=j(e,t,!1,n),c=[],f=d;f&&(c.push(f),f!==l);f=f.nextSibling);return i.each(c,function(t){if(p(e,t))return a.push(t),void(o=null);if(s.isBlock(t)||u(t))return u(t)&&s.remove(t),void(o=null);var i=t.nextSibling;r.isBookmarkNode(t)&&(p(e,i)||!i&&t.parentNode===n)?o=null:(o||(o=s.create("p"),t.parentNode.insertBefore(o,t),a.push(o)),o.appendChild(t))}),a}(e,a,d),function(o){var r,i,a,d,f,u;(i=o.previousSibling)&&l(i)&&i.nodeName===t&&(a=i,d=n,f=c.getStyle(a,"list-style-type"),u=d?d["list-style-type"]:"",f===(u=null===u?"":u))?(r=i,o=c.rename(o,s),i.appendChild(o)):(r=c.create(t),o.parentNode.insertBefore(r,o),r.appendChild(o),o=c.rename(o,s)),W(c,r,n),z(e.dom,r)}),e.selection.setRng(D(o)))},F=function(e){var t=b(e.selection.getRng(!0)),n=E.getClosestListRootElm(e,e.selection.getStart(!0)),o=E.getSelectedListItems(e),r=i.grep(o,function(t){return e.dom.isEmpty(t)});o=i.grep(o,function(t){return!e.dom.isEmpty(t)}),i.each(r,function(t){C(e.dom,t)&&w(e,t)}),i.each(o,function(t){var o,r;if(t.parentNode!==e.getBody()){for(o=t;o&&o!==n;o=o.parentNode)l(o)&&(r=o);M(e,r,t),I(e.dom,r.parentNode)}}),e.selection.setRng(D(t))},V=function(e,t,n){return d=n,(s=t)&&d&&l(s)&&s.nodeName===d.nodeName&&(i=t,a=n,(r=e).getStyle(i,"list-style-type",!0)===r.getStyle(a,"list-style-type",!0))&&(o=n,t.className===o.className);var o,r,i,a,s,d},z=function(e,t){var n,o;if(n=t.nextSibling,V(e,t,n)){for(;o=n.firstChild;)t.appendChild(o);e.remove(n)}if(n=t.previousSibling,V(e,t,n)){for(;o=n.lastChild;)t.insertBefore(o,t.firstChild);e.remove(n)}},G=function(e,t,n,o,r){if(t.nodeName!==o||J(r)){var a=b(e.selection.getRng(!0));i.each([t].concat(n),function(t){!function(e,t,n,o){if(t.nodeName!==n){var r=e.rename(t,n);W(e,r,o)}else W(e,t,o)}(e.dom,t,o,r)}),e.selection.setRng(D(a))}else F(e)},J=function(e){return"list-style-type"in e},X={toggleList:function(e,t,n){var o=E.getParentList(e),r=E.getSelectedSubLists(e);n=n||{},o&&r.length>0?G(e,o,r,t,n):function(e,t,n,o){if(t!==e.getBody())if(t)if(t.nodeName!==n||J(o)){var r=b(e.selection.getRng(!0));W(e.dom,t,o),z(e.dom,e.dom.rename(t,n)),e.selection.setRng(D(r))}else F(e);else q(e,n,o)}(e,o,t,n)},removeList:F,mergeWithAdjacentLists:z},Y=function(e,o,r,i){var a,s,d=o.startContainer,l=o.startOffset;if(3===d.nodeType&&(r?l<d.data.length:l>0))return d;for(a=e.schema.getNonEmptyElements(),1===d.nodeType&&(d=t.getNode(d,l)),s=new n(d,i),r&&h(e.dom,d)&&s.next();d=s[r?"next":"prev2"]();){if("LI"===d.nodeName&&!d.hasChildNodes())return d;if(a[d.nodeName])return d;if(3===d.nodeType&&d.data.length>0)return d}},Z=function(e,t){var n=t.childNodes;return 1===n.length&&!l(n[0])&&e.isBlock(n[0])},ee=function(e,t,n){var o,r,i,a;if(r=Z(e,n)?n.firstChild:n,Z(i=e,a=t)&&i.remove(a.firstChild,!0),!C(e,t,!0))for(;o=t.firstChild;)r.appendChild(o)},te=function(e,t,n){var o,r,i=t.parentNode;y(e,t)&&y(e,n)&&(l(n.lastChild)&&(r=n.lastChild),i===n.lastChild&&u(i.previousSibling)&&e.remove(i.previousSibling),(o=n.lastChild)&&u(o)&&t.hasChildNodes()&&e.remove(o),C(e,n,!0)&&e.$(n).empty(),ee(e,t,n),r&&n.appendChild(r),e.remove(t),C(e,i)&&i!==e.getRoot()&&e.remove(i))},ne=function(e,t,n,o){var r,i,a,s=e.dom;if(s.isEmpty(o))i=n,a=o,(r=e).dom.$(a).empty(),te(r.dom,i,a),r.selection.setCursorLocation(a);else{var d=b(t);te(s,n,o),e.selection.setRng(D(d))}},oe=function(e,t){var n,o,r,i=e.dom,a=e.selection,s=a.getStart(),d=E.getClosestListRootElm(e,s),l=i.getParent(a.getStart(),"LI",d);if(l){if((n=l.parentNode)===e.getBody()&&C(i,n))return!0;if(o=L(a.getRng(!0)),(r=i.getParent(Y(e,o,t,d),"LI",d))&&r!==l)return t?ne(e,o,r,l):function(e,t,n,o){var r=b(t);te(e.dom,n,o);var i=D(r);e.selection.setRng(i)}(e,o,l,r),!0;if(!r&&!t&&X.removeList(e))return!0}return!1},re=function(e,t){return oe(e,t)||function(e,t){var n=e.dom,o=e.selection.getStart(),r=E.getClosestListRootElm(e,o),i=n.getParent(o,n.isBlock,r);if(i&&n.isEmpty(i)){var a=L(e.selection.getRng(!0)),s=n.getParent(Y(e,a,t,r),"LI",r);if(s)return e.undoManager.transact(function(){var o,a,d,l;a=i,d=r,l=(o=n).getParent(a.parentNode,o.isBlock,d),o.remove(a),l&&o.isEmpty(l)&&o.remove(l),X.mergeWithAdjacentLists(n,s.parentNode),e.selection.select(s,!0),e.selection.collapse(t)}),!0}return!1}(e,t)},ie=function(e,t){return e.selection.isCollapsed()?re(e,t):(o=(n=e).selection.getStart(),r=E.getClosestListRootElm(n,o),!!(n.dom.getParent(o,"LI,DT,DD",r)||E.getSelectedListItems(n).length>0)&&(n.undoManager.transact(function(){n.execCommand("Delete"),I(n.dom,n.getBody())}),!0));var n,o,r},ae=function(e){e.on("keydown",function(t){t.keyCode===o.BACKSPACE?ie(e,!1)&&t.preventDefault():t.keyCode===o.DELETE&&ie(e,!0)&&t.preventDefault()})},se=ie,de=function(e){return{backspaceDelete:function(t){se(e,t)}}},le=a.DOM,ce=function(e,t){var n;if(l(e)){for(;n=e.firstChild;)t.appendChild(n);le.remove(e)}},fe=function(e){var t,n,o,r,i=E.getSelectedListItems(e);if(i.length){for(var a=b(e.selection.getRng(!0)),s=0;s<i.length&&(t=i[s],n=void 0,o=void 0,r=void 0,("DT"===t.nodeName?(le.rename(t,"DD"),1):(n=t.previousSibling)&&l(n)?(n.appendChild(t),1):n&&"LI"===n.nodeName&&l(n.lastChild)?(n.lastChild.appendChild(t),ce(t.lastChild,n.lastChild),1):(n=t.nextSibling)&&l(n)?(n.insertBefore(t,n.firstChild),1):(n=t.previousSibling)&&"LI"===n.nodeName&&(o=le.create(t.parentNode.nodeName),(r=le.getStyle(t.parentNode,"listStyleType"))&&le.setStyle(o,"listStyleType",r),n.appendChild(o),o.appendChild(t),ce(t.lastChild,o),1))||0!==s);s++);return e.selection.setRng(D(a)),e.nodeChanged(),!0}},ue=function(e,t){return function(){var n=e.dom.getParent(e.selection.getStart(),"UL,OL,DL");return n&&n.nodeName===t}},me=function(e){e.on("BeforeExecCommand",function(t){var n,o=t.command.toLowerCase();if("indent"===o?fe(e)&&(n=!0):"outdent"===o&&K(e)&&(n=!0),n)return e.fire("ExecCommand",{command:t.command}),t.preventDefault(),!0}),e.addCommand("InsertUnorderedList",function(t,n){X.toggleList(e,"UL",n)}),e.addCommand("InsertOrderedList",function(t,n){X.toggleList(e,"OL",n)}),e.addCommand("InsertDefinitionList",function(t,n){X.toggleList(e,"DL",n)}),e.addQueryStateHandler("InsertUnorderedList",ue(e,"UL")),e.addQueryStateHandler("InsertOrderedList",ue(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",ue(e,"DL"))},ge=function(e){return e.getParam("lists_indent_on_tab",!0)},pe=function(e){var t;ge(e)&&(t=e).on("keydown",function(e){e.keyCode!==o.TAB||o.metaKeyPressed(e)||t.dom.getParent(t.selection.getStart(),"LI,DT,DD")&&(e.preventDefault(),e.shiftKey?K(t):fe(t))}),ae(e)},ve=function(e,t){return function(n){var o=n.control;e.on("NodeChange",function(e){var n=function(e,t){for(var n=0;n<e.length;n++)if(t(e[n]))return n;return-1}(e.parents,f),r=-1!==n?e.parents.slice(0,n):e.parents,a=i.grep(r,l);o.active(a.length>0&&a[0].nodeName===t)})}},he=function(e){var t,n,o,r;n="advlist",o=(t=e).settings.plugins?t.settings.plugins:"",-1===i.inArray(o.split(/[ ,]/),n)&&(e.addButton("numlist",{active:!1,title:"Numbered list",cmd:"InsertOrderedList",onPostRender:ve(e,"OL")}),e.addButton("bullist",{active:!1,title:"Bullet list",cmd:"InsertUnorderedList",onPostRender:ve(e,"UL")})),e.addButton("indent",{icon:"indent",title:"Increase indent",cmd:"Indent",onPostRender:(r=e,function(e){var t=e.control;r.on("nodechange",function(){var e=E.getSelectedListItems(r),n=e.length>0&&m(e[0]);t.disabled(n)})})})};e.add("lists",function(e){return pe(e),he(e),me(e),de(e)})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.VK"),n=function(t){return t.target_list},o=function(t){return t.rel_list},i=function(t){return t.link_class_list},r=function(t){return"boolean"==typeof t.link_assume_external_targets&&t.link_assume_external_targets},a=function(t){return"boolean"==typeof t.link_context_toolbar&&t.link_context_toolbar},l=function(t){return t.link_list},u=function(t){return"string"==typeof t.default_link_target},c=function(t){return t.default_link_target},s=n,f=function(t,e){t.settings.target_list=e},d=function(t){return!1!==n(t)},m=o,v=function(t){return o(t)!==undefined},g=i,h=function(t){return i(t)!==undefined},x=function(t){return!1!==t.link_title},p=function(t){return"boolean"==typeof t.allow_unsafe_link_target&&t.allow_unsafe_link_target},y=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),k=tinymce.util.Tools.resolve("tinymce.Env"),b=function(t){if(!k.ie||k.ie>10){var e=document.createElement("a");e.target="_blank",e.href=t,e.rel="noreferrer noopener";var n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),r=e,a=n,document.body.appendChild(r),r.dispatchEvent(a),document.body.removeChild(r)}else{var o=window.open("","_blank");if(o){o.opener=null;var i=o.document;i.open(),i.write('<meta http-equiv="refresh" content="0; url='+y.DOM.encode(t)+'">'),i.close()}}var r,a},_=tinymce.util.Tools.resolve("tinymce.util.Tools"),w=function(t,e){var n,o,i=["noopener"],r=t?t.split(/\s+/):[],a=function(t){return t.filter(function(t){return-1===_.inArray(i,t)})};return(r=e?(n=a(n=r)).length?n.concat(i):i:a(r)).length?(o=r,_.trim(o.sort().join(" "))):null},T=function(t,e){return e=e||t.selection.getNode(),M(e)?t.dom.select("a[href]",e)[0]:t.dom.getParent(e,"a[href]")},C=function(t){return t&&"A"===t.nodeName&&t.href},M=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},O=function(t,e){var n,o;(o=t.dom.select("img",e)[0])&&(n=t.dom.getParents(o,"a[href]",e)[0])&&(n.parentNode.insertBefore(o,n),t.dom.remove(n))},N=function(t,e,n){var o,i;(i=t.dom.select("img",e)[0])&&(o=t.dom.create("a",n),i.parentNode.insertBefore(o,i),o.appendChild(i))},R=function(t,e){return function(n){t.undoManager.transact(function(){var o=t.selection.getNode(),i=T(t,o),r={href:n.href,target:n.target?n.target:null,rel:n.rel?n.rel:null,"class":n["class"]?n["class"]:null,title:n.title?n.title:null};v(t.settings)||!1!==p(t.settings)||(r.rel=w(r.rel,"_blank"===r.target)),n.href===e.href&&(e.attach(),e={}),i?(t.focus(),n.hasOwnProperty("text")&&("innerText"in i?i.innerText=n.text:i.textContent=n.text),t.dom.setAttribs(i,r),t.selection.select(i),t.undoManager.add()):M(o)?N(t,o,r):n.hasOwnProperty("text")?t.insertContent(t.dom.createHTML("a",r,t.dom.encode(n.text))):t.execCommand("mceInsertLink",!1,r)})}},A=function(t){return function(){t.undoManager.transact(function(){var e=t.selection.getNode();M(e)?O(t,e):t.execCommand("unlink")})}},L=C,P=function(t){return _.grep(t,C).length>0},E=function(t){return!(/</.test(t)&&(!/^<a [^>]+>[^<]+<\/a>$/.test(t)||-1===t.indexOf("href=")))},K=T,S=function(t,e){var n=e?e.innerText||e.textContent:t.getContent({format:"text"});return n.replace(/\uFEFF/g,"")},U=w,D=tinymce.util.Tools.resolve("tinymce.util.Delay"),I=tinymce.util.Tools.resolve("tinymce.util.XHR"),B={},F=function(t,e,n){var o=function(t,n){return n=n||[],_.each(t,function(t){var i={text:t.text||t.title};t.menu?i.menu=o(t.menu):(i.value=t.value,e&&e(i)),n.push(i)}),n};return o(t,n||[])},q=function(t,e,n){var o=t.selection.getRng();D.setEditorTimeout(t,function(){t.windowManager.confirm(e,function(e){t.selection.setRng(o),n(e)})})},V=function(t,e){var n,o,i,a,l,y,k,b,w,T,C,M={},O=t.selection,N=t.dom,L=function(t){var e=i.find("#text");(!e.value()||t.lastControl&&e.value()===t.lastControl.text())&&e.value(t.control.text()),i.find("#href").value(t.control.value())},P=function(){o||!a||M.text||this.parent().parent().find("#text")[0].value(this.value())};a=E(O.getContent()),n=K(t),M.text=o=S(t.selection,n),M.href=n?N.getAttrib(n,"href"):"",n?M.target=N.getAttrib(n,"target"):u(t.settings)&&(M.target=c(t.settings)),(C=N.getAttrib(n,"rel"))&&(M.rel=C),(C=N.getAttrib(n,"class"))&&(M["class"]=C),(C=N.getAttrib(n,"title"))&&(M.title=C),a&&(l={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){M.text=this.value()}}),e&&(y={type:"listbox",label:"Link list",values:F(e,function(e){e.value=t.convertURL(e.value||e.url,"href")},[{text:"None",value:""}]),onselect:L,value:t.convertURL(M.href,"href"),onPostRender:function(){y=this}}),d(t.settings)&&(s(t.settings)===undefined&&f(t,[{text:"None",value:""},{text:"New window",value:"_blank"}]),b={name:"target",type:"listbox",label:"Target",values:F(s(t.settings))}),v(t.settings)&&(k={name:"rel",type:"listbox",label:"Rel",values:F(m(t.settings),function(e){!1===p(t.settings)&&(e.value=U(e.value,"_blank"===M.target))})}),h(t.settings)&&(w={name:"class",type:"listbox",label:"Class",values:F(g(t.settings),function(e){e.value&&(e.textStyle=function(){return t.formatter.getCssText({inline:"a",classes:[e.value]})})})}),x(t.settings)&&(T={name:"title",type:"textbox",label:"Title",value:M.title}),i=t.windowManager.open({title:"Insert link",data:M,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:function(e){var n=e.meta||{};y&&y.value(t.convertURL(this.value(),"href")),_.each(e.meta,function(t,e){var n=i.find("#"+e);"text"===e?0===o.length&&(n.value(t),M.text=t):n.value(t)}),n.attach&&(B={href:this.value(),attach:n.attach}),n.text||P.call(this)},onkeyup:P,onbeforecall:function(t){t.meta=i.toJSON()}},l,T,function(e){var n=[];if(_.each(t.dom.select("a:not([href])"),function(t){var o=t.name||t.id;o&&n.push({text:o,value:"#"+o,selected:-1!==e.indexOf("#"+o)})}),n.length)return n.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:n,onselect:L}}(M.href),y,k,b,w],onSubmit:function(e){var n=r(t.settings),i=R(t,B),l=A(t),u=_.extend({},M,e.data),c=u.href;c?(a&&u.text!==o||delete u.text,c.indexOf("@")>0&&-1===c.indexOf("//")&&-1===c.indexOf("mailto:")?q(t,"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(t){t&&(u.href="mailto:"+c),i(u)}):!0===n&&!/^\w+:/i.test(c)||!1===n&&/^\s*www[\.|\d\.]/i.test(c)?q(t,"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(t){t&&(u.href="http://"+c),i(u)}):i(u)):l()}})},z=function(t){var e,n,o;n=V,"string"==typeof(o=l((e=t).settings))?I.send({url:o,success:function(t){n(e,JSON.parse(t))}}):"function"==typeof o?o(function(t){n(e,t)}):n(e,o)},H=function(t,e){return t.dom.getParent(e,"a[href]")},J=function(t){return H(t,t.selection.getStart())},$=function(t,e){if(e){var n=(i=e).getAttribute("data-mce-href")||i.getAttribute("href");if(/^#/.test(n)){var o=t.$(n);o.length&&t.selection.scrollIntoView(o[0],!0)}else b(e.href)}var i},j=function(t){return function(){z(t)}},G=function(t){return function(){$(t,J(t))}},X=function(t){return function(e){var n,o,i,r,l;return!!(a(t.settings)&&(r=t,l=r.plugins.contextmenu,!l||!l.isContextMenuVisible())&&L(e)&&3===(i=(o=(n=t.selection).getRng()).startContainer).nodeType&&n.isCollapsed()&&o.startOffset>0&&o.startOffset<i.data.length)}},Q=function(t){t.on("click",function(n){var o=H(t,n.target);o&&e.metaKeyPressed(n)&&(n.preventDefault(),$(t,o))}),t.on("keydown",function(e){var n,o=J(t);o&&13===e.keyCode&&!0===(n=e).altKey&&!1===n.shiftKey&&!1===n.ctrlKey&&!1===n.metaKey&&(e.preventDefault(),$(t,o))})},W=function(t){return function(){var e=this;t.on("nodechange",function(n){e.active(!t.readonly&&!!K(t,n.element))})}},Y=function(t){return function(){var e=this,n=function(t){P(t.parents)?e.show():e.hide()};P(t.dom.getParents(t.selection.getStart()))||e.hide(),t.on("nodechange",n),e.on("remove",function(){t.off("nodechange",n)})}},Z=function(t){t.addCommand("mceLink",j(t))},tt=function(t){t.addShortcut("Meta+K","",j(t))},et=function(t){t.addButton("link",{active:!1,icon:"link",tooltip:"Insert/edit link",onclick:j(t),onpostrender:W(t)}),t.addButton("unlink",{active:!1,icon:"unlink",tooltip:"Remove link",onclick:A(t),onpostrender:W(t)}),t.addContextToolbar&&t.addButton("openlink",{icon:"newtab",tooltip:"Open link",onclick:G(t)})},nt=function(t){t.addMenuItem("openlink",{text:"Open link",icon:"newtab",onclick:G(t),onPostRender:Y(t),prependToContext:!0}),t.addMenuItem("link",{icon:"link",text:"Link",shortcut:"Meta+K",onclick:j(t),stateSelector:"a[href]",context:"insert",prependToContext:!0})},ot=function(t){t.addContextToolbar&&t.addContextToolbar(X(t),"openlink | link unlink")};t.add("link",function(t){et(t),nt(t),ot(t),Q(t),Z(t),tt(t)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(e){e.settings.inline_styles=!1,e.on("init",function(){var n,i,a,o;n=e,i="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",a=t.explode(n.settings.font_size_style_values),o=n.schema,n.formatter.register({alignleft:{selector:i,attributes:{align:"left"}},aligncenter:{selector:i,attributes:{align:"center"}},alignright:{selector:i,attributes:{align:"right"}},alignjustify:{selector:i,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(e){return t.inArray(a,e.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}}),t.each("b,i,u,strike".split(","),function(e){o.addValidElements(e+"[*]")}),o.getElementRule("font")||o.addValidElements("font[face|size|color|style]"),t.each(i.split(","),function(e){var t=o.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})},i=function(e){e.addButton("fontsizeselect",function(){var t=[],n=e.settings.fontsizeFormats||"8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7";return e.$.each(n.split(" "),function(e,n){var i=n,a=n,o=n.split("=");o.length>1&&(i=o[0],a=o[1]),t.push({text:i,value:a})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:t,fixedWidth:!0,onPostRender:function(){var t=this;e.on("NodeChange",function(){var n;(n=e.dom.getParent(e.selection.getNode(),"font"))?t.value(n.size):t.value("")})},onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addButton("fontselect",function(){var t=[],n=function(e){for(var t=(e=e.replace(/;$/,"").split(";")).length;t--;)e[t]=e[t].split("=");return e}(e.settings.font_formats||"Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats");return e.$.each(n,function(e,n){t.push({text:{raw:n[0]},value:n[1],textStyle:-1===n[1].indexOf("dings")?"font-family:"+n[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:t,fixedWidth:!0,onPostRender:function(){var t=this;e.on("NodeChange",function(){var n;(n=e.dom.getParent(e.selection.getNode(),"font"))?t.value(n.face):t.value("")})},onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}})};e.add("legacyoutput",function(e){n(e),i(e)})}();!function(){"use strict";var e=function(t){var n=t,r=function(){return n};return{get:r,set:function(e){n=e},clone:function(){return e(r())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},r=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},a=function(e){return e.getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d"))},i=n,o=r,u=function(e){var t=r(e);return t.length>0?t[0]:n(e)},c=function(e){return e.getParam("insertdatetime_element",!1)},l="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),m="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),s="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),d="January February March April May June July August September October November December".split(" "),p=function(e,t){if((e=""+e).length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e},f=function(e,t,n){return n=n||new Date,t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",p(n.getMonth()+1,2))).replace("%d",p(n.getDate(),2))).replace("%H",""+p(n.getHours(),2))).replace("%M",""+p(n.getMinutes(),2))).replace("%S",""+p(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(d[n.getMonth()]))).replace("%b",""+e.translate(s[n.getMonth()]))).replace("%A",""+e.translate(m[n.getDay()]))).replace("%a",""+e.translate(l[n.getDay()]))).replace("%%","%")},g=function(e,t){if(c(e)){var n=f(e,t),r=void 0;r=/%[HMSIp]/.test(t)?f(e,"%Y-%m-%dT%H:%M"):f(e,"%Y-%m-%d");var a=e.dom.getParent(e.selection.getStart(),"time");a?(o=a,u=r,l=n,m=(i=e).dom.create("time",{datetime:u},l),o.parentNode.insertBefore(m,o),i.dom.remove(o),i.selection.select(m,!0),i.selection.collapse(!1)):e.insertContent('<time datetime="'+r+'">'+n+"</time>")}else e.insertContent(f(e,t));var i,o,u,l,m},y=f,M=function(e){e.addCommand("mceInsertDate",function(){g(e,a(e))}),e.addCommand("mceInsertTime",function(){g(e,i(e))})},v=tinymce.util.Tools.resolve("tinymce.util.Tools"),S=function(e,t){var n,r,a,i=(r=t,a=o(n=e),v.map(a,function(e){return{text:y(n,e),onclick:function(){r.set(e),g(n,e)}}}));e.addButton("insertdatetime",{type:"splitbutton",title:"Insert date/time",menu:i,onclick:function(){var n=t.get();g(e,n||u(e))}}),e.addMenuItem("insertdatetime",{icon:"date",text:"Date/time",menu:i,context:"insert"})};t.add("insertdatetime",function(t){var n=e(null);M(t),S(t,n)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=tinymce.util.Tools.resolve("tinymce.EditorManager"),r=tinymce.util.Tools.resolve("tinymce.Env"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(e){return e.getParam("importcss_merge_classes")},o=function(e){return e.getParam("importcss_exclusive")},s=function(e){return e.getParam("importcss_selector_converter")},u=function(e){return e.getParam("importcss_selector_filter")},l=function(e){return e.getParam("importcss_groups")},a=function(e){return e.getParam("importcss_append")},f=function(e){return e.getParam("importcss_file_filter")},m=function(e){var t=r.cacheSuffix;return"string"==typeof e&&(e=e.replace("?"+t,"").replace("&"+t,"")),e},g=function(e,t){var r=e.settings,i=!1!==r.skin&&(r.skin||"lightgray");return!!i&&t===(r.skin_url?e.documentBaseURI.toAbsolute(r.skin_url):n.baseURL+"/skins/"+i)+"/content"+(e.inline?".inline":"")+".min.css"},p=function(e){return"string"==typeof e?function(t){return-1!==t.indexOf(e)}:e instanceof RegExp?function(t){return e.test(t)}:e},v=function(e,t,n){var r=[],c={};i.each(e.contentCSS,function(e){c[e]=!0}),n||(n=function(e,t){return t||c[e]});try{i.each(t.styleSheets,function(t){!function c(t,o){var s,u=t.href;if((u=m(u))&&n(u,o)&&!g(e,u)){i.each(t.imports,function(e){c(e,!0)});try{s=t.cssRules||t.rules}catch(l){}i.each(s,function(e){e.styleSheet?c(e.styleSheet,!0):e.selectorText&&i.each(e.selectorText.split(","),function(e){r.push(i.trim(e))})})}}(t)})}catch(o){}return r},h=function(e,t){var n,r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(r){var o=r[1],s=r[2].substr(1).split(".").join(" "),u=i.makeMap("a,img");return r[1]?(n={title:t},e.schema.getTextBlockElements()[o]?n.block=o:e.schema.getBlockElements()[o]||u[o.toLowerCase()]?n.selector=o:n.inline=o):r[2]&&(n={inline:"span",title:t.substr(1),classes:s}),!1!==c(e)?n.classes=s:n.attributes={"class":s},n}},d=function(e,t){return null===t||!1!==o(e)},y=h,_=function(e){e.on("renderFormatsMenu",function(n){var r,c={},o=p(u(e)),m=n.control,g=(r=l(e),i.map(r,function(e){return i.extend({},e,{original:e,selectors:{},filter:p(e.filter),item:{text:e.title,menu:[]}})})),y=function(n,r){if(_=n,T=c,!(d(e,x=r)?_ in T:_ in x.selectors)){p=n,y=c,d(e,v=r)?y[p]=!0:v.selectors[p]=!0;var o=(l=e,a=e.plugins.importcss,f=n,((g=r)&&g.selector_converter?g.selector_converter:s(l)?s(l):function(){return h(l,f)}).call(a,f,g));if(o){var u=o.name||t.DOM.uniqueId();return e.formatter.register(u,o),i.extend({},m.settings.itemDefaults,{text:o.title,format:u})}}var l,a,f,g,p,v,y,_,x,T;return null};a(e)||m.items().remove(),i.each(v(e,n.doc||e.getDoc(),p(f(e))),function(e){if(-1===e.indexOf(".mce-")&&(!o||o(e))){var t=(r=g,c=e,i.grep(r,function(e){return!e.filter||e.filter(c)}));if(t.length>0)i.each(t,function(t){var n=y(e,t);n&&t.item.menu.push(n)});else{var n=y(e,null);n&&m.add(n)}}var r,c}),i.each(g,function(e){e.item.menu.length>0&&m.add(e.item)}),n.control.renderNew()})},x=function(e){return{convertSelectorToFormat:function(t){return y(e,t)}}};e.add("importcss",function(e){return _(e),x(e)})}();!function(){"use strict";var t=function(e){var n=e,o=function(){return n};return{get:o,set:function(t){n=t},clone:function(){return t(o())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");function o(t,e){return i(document.createElement("canvas"),t,e)}function r(t){return t.getContext("2d")}function i(t,e,n){return t.width=e,t.height=n,t}var a,u,c,l,s={create:o,clone:function(t){var e;return r(e=o(t.width,t.height)).drawImage(t,0,0),e},resize:i,get2dContext:r,get3dContext:function(t){var e=null;try{e=t.getContext("webgl")||t.getContext("experimental-webgl")}catch(n){}return e||(e=null),e}},f={getWidth:function(t){return t.naturalWidth||t.width},getHeight:function(t){return t.naturalHeight||t.height}},d=window.Promise?window.Promise:function(){var t=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],c(t,n(i,this),n(a,this))},e=t.immediateFn||"function"==typeof setImmediate&&setImmediate||function(t){setTimeout(t,1)};function n(t,e){return function(){t.apply(e,arguments)}}var o=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function r(t){var n=this;null!==this._state?e(function(){var e=n._state?t.onFulfilled:t.onRejected;if(null!==e){var o;try{o=e(n._value)}catch(r){return void t.reject(r)}t.resolve(o)}else(n._state?t.resolve:t.reject)(n._value)}):this._deferreds.push(t)}function i(t){try{if(t===this)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var e=t.then;if("function"==typeof e)return void c(n(e,t),n(i,this),n(a,this))}this._state=!0,this._value=t,u.call(this)}catch(o){a.call(this,o)}}function a(t){this._state=!1,this._value=t,u.call(this)}function u(){for(var t=0,e=this._deferreds.length;t<e;t++)r.call(this,this._deferreds[t]);this._deferreds=null}function c(t,e,n){var o=!1;try{t(function(t){o||(o=!0,e(t))},function(t){o||(o=!0,n(t))})}catch(r){if(o)return;o=!0,n(r)}}return t.prototype["catch"]=function(t){return this.then(null,t)},t.prototype.then=function(e,n){var o=this;return new t(function(t,i){r.call(o,new function(t,e,n,o){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.resolve=n,this.reject=o}(e,n,t,i))})},t.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&o(arguments[0])?arguments[0]:arguments);return new t(function(t,n){if(0===e.length)return t([]);var o=e.length;function r(i,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var u=a.then;if("function"==typeof u)return void u.call(a,function(t){r(i,t)},n)}e[i]=a,0==--o&&t(e)}catch(c){n(c)}}for(var i=0;i<e.length;i++)r(i,e[i])})},t.resolve=function(e){return e&&"object"==typeof e&&e.constructor===t?e:new t(function(t){t(e)})},t.reject=function(e){return new t(function(t,n){n(e)})},t.race=function(e){return new t(function(t,n){for(var o=0,r=e.length;o<r;o++)e[o].then(t,n)})},t}(),h=function(t){return function(){return t}},p={noop:function(){},noarg:function(t){return function(){return t()}},compose:function(t,e){return function(){return t(e.apply(null,arguments))}},constant:h,identity:function(t){return t},tripleEquals:function(t,e){return t===e},curry:function(t){for(var e=new Array(arguments.length-1),n=1;n<arguments.length;n++)e[n-1]=arguments[n];return function(){for(var n=new Array(arguments.length),o=0;o<n.length;o++)n[o]=arguments[o];var r=e.concat(n);return t.apply(null,r)}},not:function(t){return function(){return!t.apply(null,arguments)}},die:function(t){return function(){throw new Error(t)}},apply:function(t){return t()},call:function(t){t()},never:h(!1),always:h(!0)},m=p.never,g=p.always,v=function(){return y},y=(l={fold:function(t,e){return t()},is:m,isSome:m,isNone:g,getOr:c=function(t){return t},getOrThunk:u=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},or:c,orThunk:u,map:v,ap:v,each:function(){},bind:v,flatten:v,exists:m,forall:g,filter:v,equals:a=function(t){return t.isNone()},equals_:a,toArray:function(){return[]},toString:p.constant("none()")},Object.freeze&&Object.freeze(l),l),b=function(t){var e=function(){return t},n=function(){return r},o=function(e){return e(t)},r={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:g,isNone:m,getOr:e,getOrThunk:e,getOrDie:e,or:n,orThunk:n,map:function(e){return b(e(t))},ap:function(e){return e.fold(v,function(e){return b(e(t))})},each:function(e){e(t)},bind:o,flatten:e,exists:o,forall:o,filter:function(e){return e(t)?r:y},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(m,function(e){return n(t,e)})},toArray:function(){return[t]},toString:function(){return"some("+t+")"}};return r},w={some:b,none:v,from:function(t){return null===t||t===undefined?y:b(t)}},x="undefined"!=typeof window?window:Function("return this;")(),R=function(t,e){for(var n=e!==undefined&&null!==e?e:x,o=0;o<t.length&&n!==undefined&&null!==n;++o)n=n[t[o]];return n},I=function(t,e){var n=t.split(".");return R(n,e)},T=function(t,e){var n=I(t,e);if(n===undefined||null===n)throw t+" not available on this browser";return n},k=function(t,e){return new(T("Blob"))(t,e)},C=function(){return new(T("FileReader"))},B=function(t){return new(T("Uint8Array"))(t)},U={atob:function(t){return T("atob")(t)},requestAnimationFrame:function(t){T("requestAnimationFrame")(t)}};function M(t){return new d(function(e,n){var o=URL.createObjectURL(t),r=new Image,i=function(){r.removeEventListener("load",a),r.removeEventListener("error",u)};function a(){i(),e(r)}function u(){i(),n("Unable to load data of type "+t.type+": "+o)}r.addEventListener("load",a),r.addEventListener("error",u),r.src=o,r.complete&&a()})}function j(t){return new d(function(e){var n=new XMLHttpRequest;n.open("GET",t,!0),n.responseType="blob",n.onload=function(){200==this.status&&e(this.response)},n.send()})}function A(t){var e=t.split(","),n=/data:([^;]+)/.exec(e[0]);if(!n)return w.none();for(var o=n[1],r=e[1],i=U.atob(r),a=i.length,u=Math.ceil(a/1024),c=new Array(u),l=0;l<u;++l){for(var s=1024*l,f=Math.min(s+1024,a),d=new Array(f-s),h=s,p=0;h<f;++p,++h)d[p]=i[h].charCodeAt(0);c[l]=B(d)}return w.some(k(c,{type:o}))}function z(t){return new d(function(e,n){A(t).fold(function(){n("uri is not base64: "+t)},e)})}function E(t){return new d(function(e){var n=new C;n.onloadend=function(){e(n.result)},n.readAsDataURL(t)})}var S={blobToImage:M,imageToBlob:function(t){return(e=t,new d(function(t){e.complete?t(e):e.addEventListener("load",function n(){e.removeEventListener("load",n),t(e)})})).then(function(t){var e=t.src;return 0===e.indexOf("blob:")?j(e):0===e.indexOf("data:")?z(e):j(e)});var e},blobToDataUri:E,blobToBase64:function(t){return E(t).then(function(t){return t.split(",")[1]})},dataUriToBlobSync:A,canvasToBlob:function(t,e,n){return e=e||"image/png",HTMLCanvasElement.prototype.toBlob?new d(function(o){t.toBlob(function(t){o(t)},e,n)}):z(t.toDataURL(e,n))},canvasToDataURL:function(t,e,n){return e=e||"image/png",t.then(function(t){return t.toDataURL(e,n)})},blobToCanvas:function(t){return M(t).then(function(t){var e,n;return e=t,URL.revokeObjectURL(e.src),n=s.create(f.getWidth(t),f.getHeight(t)),s.get2dContext(n).drawImage(t,0,0),n})},uriToBlob:function(t){return 0===t.indexOf("blob:")?j(t):0===t.indexOf("data:")?z(t):null}},L=function(t){return S.blobToImage(t)},H=function(t){return S.imageToBlob(t)};function O(t,e,n){var o=e.type;function r(e,n){return t.then(function(t){return S.canvasToDataURL(t,e,n)})}return{getType:p.constant(o),toBlob:function(){return d.resolve(e)},toDataURL:function(){return n},toBase64:function(){return n.split(",")[1]},toAdjustedBlob:function(e,n){return t.then(function(t){return S.canvasToBlob(t,e,n)})},toAdjustedDataURL:r,toAdjustedBase64:function(t,e){return r(t,e).then(function(t){return t.split(",")[1]})},toCanvas:function(){return t.then(s.clone)}}}function _(t){return S.blobToDataUri(t).then(function(e){return O(S.blobToCanvas(t),t,e)})}var D={fromBlob:_,fromCanvas:function(t,e){return S.canvasToBlob(t,e).then(function(e){return O(d.resolve(t),e,t.toDataURL())})},fromImage:function(t){return S.imageToBlob(t).then(function(t){return _(t)})},fromBlobAndUrlSync:function(t,e){return O(S.blobToCanvas(t),t,e)}};function F(t,e,n){return(t=parseFloat(t))>n?t=n:t<e&&(t=e),t}var P=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10];function W(t,e){var n,o,r,i,a=[],u=new Array(10);for(n=0;n<5;n++){for(o=0;o<5;o++)a[o]=e[o+5*n];for(o=0;o<5;o++){for(i=0,r=0;r<5;r++)i+=t[o+5*r]*a[r];u[o+5*n]=i}}return u}function q(t,e){return e=F(e,0,1),t.map(function(t,n){return n%6==0?t=1-(1-t)*e:t*=e,F(t,0,1)})}var V={identity:function(){return[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1]},adjust:q,multiply:W,adjustContrast:function(t,e){var n;return e=F(e,-1,1),W(t,[(n=(e*=100)<0?127+e/100*127:127*(n=0==(n=e%1)?P[e]:P[Math.floor(e)]*(1-n)+P[Math.floor(e)+1]*n)+127)/127,0,0,0,.5*(127-n),0,n/127,0,0,.5*(127-n),0,0,n/127,0,.5*(127-n),0,0,0,1,0,0,0,0,0,1])},adjustBrightness:function(t,e){return W(t,[1,0,0,0,e=F(255*e,-255,255),0,1,0,0,e,0,0,1,0,e,0,0,0,1,0,0,0,0,0,1])},adjustSaturation:function(t,e){var n,o,r;return W(t,[(o=.3086)*(1-(n=1+((e=F(e,-1,1))>0?3*e:e)))+n,(r=.6094)*(1-n),.082*(1-n),0,0,o*(1-n),r*(1-n)+n,.082*(1-n),0,0,o*(1-n),r*(1-n),.082*(1-n)+n,0,0,0,0,0,1,0,0,0,0,0,1])},adjustHue:function(t,e){var n,o,r,i,a;return e=F(e,-180,180)/180*Math.PI,n=Math.cos(e),o=Math.sin(e),W(t,[(r=.213)+.787*n+o*-r,(i=.715)+n*-i+o*-i,(a=.072)+n*-a+.928*o,0,0,r+n*-r+.143*o,i+n*(1-i)+.14*o,a+n*-a+-.283*o,0,0,r+n*-r+-.787*o,i+n*-i+o*i,a+.928*n+o*a,0,0,0,0,0,1,0,0,0,0,0,1])},adjustColors:function(t,e,n,o){return W(t,[e=F(e,0,2),0,0,0,0,0,n=F(n,0,2),0,0,0,0,0,o=F(o,0,2),0,0,0,0,0,1,0,0,0,0,0,1])},adjustSepia:function(t,e){return W(t,q([.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0,0,0,0,0,1],e=F(e,0,1)))},adjustGrayscale:function(t,e){return W(t,q([.33,.34,.33,0,0,.33,.34,.33,0,0,.33,.34,.33,0,0,0,0,0,1,0,0,0,0,0,1],e=F(e,0,1)))}};function N(t,e){return t.toCanvas().then(function(n){return o=n,r=t.getType(),i=e,u=s.get2dContext(o),a=function(t,e){var n,o,r,i,a,u=t.data,c=e[0],l=e[1],s=e[2],f=e[3],d=e[4],h=e[5],p=e[6],m=e[7],g=e[8],v=e[9],y=e[10],b=e[11],w=e[12],x=e[13],R=e[14],I=e[15],T=e[16],k=e[17],C=e[18],B=e[19];for(a=0;a<u.length;a+=4)n=u[a],o=u[a+1],r=u[a+2],i=u[a+3],u[a]=n*c+o*l+r*s+i*f+d,u[a+1]=n*h+o*p+r*m+i*g+v,u[a+2]=n*y+o*b+r*w+i*x+R,u[a+3]=n*I+o*T+r*k+i*C+B;return t}(u.getImageData(0,0,o.width,o.height),i),u.putImageData(a,0,0),D.fromCanvas(o,r);var o,r,i,a,u})}function X(t,e){return t.toCanvas().then(function(n){return o=n,r=t.getType(),i=e,c=s.get2dContext(o),a=c.getImageData(0,0,o.width,o.height),u=c.getImageData(0,0,o.width,o.height),u=function(t,e,n){var o,r,i,a,u,c,l,s,f,d,h,p,m,g,v,y,b;function w(t,e,n){return t>n?t=n:t<e&&(t=e),t}for(i=Math.round(Math.sqrt(n.length)),a=Math.floor(i/2),o=t.data,r=e.data,y=t.width,b=t.height,c=0;c<b;c++)for(u=0;u<y;u++){for(l=s=f=0,h=0;h<i;h++)for(d=0;d<i;d++)p=w(u+d-a,0,y-1),m=w(c+h-a,0,b-1),g=4*(m*y+p),v=n[h*i+d],l+=o[g]*v,s+=o[g+1]*v,f+=o[g+2]*v;r[g=4*(c*y+u)]=w(l,0,255),r[g+1]=w(s,0,255),r[g+2]=w(f,0,255)}return e}(a,u,i),c.putImageData(u,0,0),D.fromCanvas(o,r);var o,r,i,a,u,c})}function $(t){return function(e,n){return e.toCanvas().then(function(o){return function(e,n,o){var r,i,a=s.get2dContext(e),u=new Array(256);for(i=0;i<u.length;i++)u[i]=t(i,o);return r=function(t,e){var n,o=t.data;for(n=0;n<o.length;n+=4)o[n]=e[o[n]],o[n+1]=e[o[n+1]],o[n+2]=e[o[n+2]];return t}(a.getImageData(0,0,e.width,e.height),u),a.putImageData(r,0,0),D.fromCanvas(e,n)}(o,e.getType(),n)})}}function G(t){return function(e,n){return N(e,t(V.identity(),n))}}function Y(t){return function(e){return X(e,t)}}var J,K={invert:(J=[-1,0,0,0,255,0,-1,0,0,255,0,0,-1,0,255,0,0,0,1,0],function(t){return N(t,J)}),brightness:G(V.adjustBrightness),hue:G(V.adjustHue),saturate:G(V.adjustSaturation),contrast:G(V.adjustContrast),grayscale:G(V.adjustGrayscale),sepia:G(V.adjustSepia),colorize:function(t,e,n,o){return N(t,V.adjustColors(V.identity(),e,n,o))},sharpen:Y([0,-1,0,-1,5,-1,0,-1,0]),emboss:Y([-2,-1,0,-1,1,1,0,1,2]),gamma:$(function(t,e){return 255*Math.pow(t/255,1-e)}),exposure:$(function(t,e){return 255*(1-Math.exp(-t/255*e))}),colorFilter:N,convoluteFilter:X},Z={scale:function te(t,e,n){var o=f.getWidth(t),r=f.getHeight(t),i=e/o,a=n/r,u=!1;(i<.5||i>2)&&(i=i<.5?.5:2,u=!0),(a<.5||a>2)&&(a=a<.5?.5:2,u=!0);var c,l,h,p=(c=t,l=i,h=a,new d(function(t){var e=f.getWidth(c),n=f.getHeight(c),o=Math.floor(e*l),r=Math.floor(n*h),i=s.create(o,r),a=s.get2dContext(i);a.drawImage(c,0,0,e,n,0,0,o,r),t(i)}));return u?p.then(function(t){return te(t,e,n)}):p}},Q={rotate:function(t,e){return t.toCanvas().then(function(n){return o=n,r=t.getType(),i=e,a=s.create(o.width,o.height),u=s.get2dContext(a),c=0,l=0,90!=(i=i<0?360+i:i)&&270!=i||s.resize(a,a.height,a.width),90!=i&&180!=i||(c=a.width),270!=i&&180!=i||(l=a.height),u.translate(c,l),u.rotate(i*Math.PI/180),u.drawImage(o,0,0),D.fromCanvas(a,r);var o,r,i,a,u,c,l})},flip:function(t,e){return t.toCanvas().then(function(n){return o=n,r=t.getType(),i=e,a=s.create(o.width,o.height),u=s.get2dContext(a),"v"==i?(u.scale(1,-1),u.drawImage(o,0,-a.height)):(u.scale(-1,1),u.drawImage(o,-a.width,0)),D.fromCanvas(a,r);var o,r,i,a,u})},crop:function(t,e,n,o,r){return t.toCanvas().then(function(i){return a=i,u=t.getType(),c=e,l=n,f=o,d=r,h=s.create(f,d),s.get2dContext(h).drawImage(a,-c,-l),D.fromCanvas(h,u);var a,u,c,l,f,d,h})},resize:function(t,e,n){return t.toCanvas().then(function(o){return Z.scale(o,e,n).then(function(e){return D.fromCanvas(e,t.getType())})})}},tt={invert:function(t){return K.invert(t)},sharpen:function(t){return K.sharpen(t)},emboss:function(t){return K.emboss(t)},brightness:function(t,e){return K.brightness(t,e)},hue:function(t,e){return K.hue(t,e)},saturate:function(t,e){return K.saturate(t,e)},contrast:function(t,e){return K.contrast(t,e)},grayscale:function(t,e){return K.grayscale(t,e)},sepia:function(t,e){return K.sepia(t,e)},colorize:function(t,e,n,o){return K.colorize(t,e,n,o)},gamma:function(t,e){return K.gamma(t,e)},exposure:function(t,e){return K.exposure(t,e)},flip:function(t,e){return Q.flip(t,e)},crop:function(t,e,n,o,r){return Q.crop(t,e,n,o,r)},resize:function(t,e,n){return Q.resize(t,e,n)},rotate:function(t,e){return Q.rotate(t,e)}},et=function(t){return t.toBlob()},nt={blobToImageResult:function(t){return D.fromBlob(t)},fromBlobAndUrlSync:function(t,e){return D.fromBlobAndUrlSync(t,e)},imageToImageResult:function(t){return D.fromImage(t)},imageResultToBlob:function(t,e,n){return e===undefined&&n===undefined?et(t):t.toAdjustedBlob(e,n)},imageResultToOriginalBlob:et,imageResultToDataURL:function(t){return t.toDataURL()}},ot=function(){return T("URL")},rt={createObjectURL:function(t){return ot().createObjectURL(t)},revokeObjectURL:function(t){ot().revokeObjectURL(t)}},it=tinymce.util.Tools.resolve("tinymce.util.Delay"),at=tinymce.util.Tools.resolve("tinymce.util.Promise"),ut=tinymce.util.Tools.resolve("tinymce.util.URI"),ct=function(t){return t.getParam("imagetools_toolbar","rotateleft rotateright | flipv fliph | crop editimage imageoptions")},lt=function(t){return t.getParam("imagetools_proxy")},st={getImageSize:function(t){var e,n;function o(t){return/^[0-9\.]+px$/.test(t)}return e=t.style.width,n=t.style.height,e||n?o(e)&&o(n)?{w:parseInt(e,10),h:parseInt(n,10)}:null:(e=t.width,n=t.height,e&&n?{w:parseInt(e,10),h:parseInt(n,10)}:null)},setImageSize:function(t,e){var n,o;e&&(n=t.style.width,o=t.style.height,(n||o)&&(t.style.width=e.w+"px",t.style.height=e.h+"px",t.removeAttribute("data-mce-style")),n=t.width,o=t.height,(n||o)&&(t.setAttribute("width",e.w),t.setAttribute("height",e.h)))},getNaturalImageSize:function(t){return{w:t.naturalWidth,h:t.naturalHeight}}},ft=(Array.prototype.indexOf,undefined,Array.prototype.push,Array.prototype.slice,function(t,e){for(var n=0,o=t.length;n<o;n++){var r=t[n];if(e(r,n,t))return w.some(r)}return w.none()}),dt=function(t){return null!==t&&t!==undefined},ht={traverse:function(t,e){var n;return n=e.reduce(function(t,e){return dt(t)?t[e]:undefined},t),dt(n)?n:null},readBlob:function(t){return new at(function(e){var n=new C;n.onload=function(t){var n=t.target;e(n.result)},n.readAsText(t)})},requestUrlAsBlob:function(t,e){return new at(function(o){var r;(r=new function(){return new(T("XMLHttpRequest"))}).onreadystatechange=function(){4===r.readyState&&o({status:r.status,blob:this.response})},r.open("GET",t,!0),n.each(e,function(t,e){r.setRequestHeader(e,t)}),r.responseType="blob",r.send()})},parseJson:function(t){var e;try{e=JSON.parse(t)}catch(n){}return e}},pt=[{code:404,message:"Could not find Image Proxy"},{code:403,message:"Rejected request"},{code:0,message:"Incorrect Image Proxy URL"}],mt=[{type:"key_missing",message:"The request did not include an api key."},{type:"key_not_found",message:"The provided api key could not be found."},{type:"domain_not_trusted",message:"The api key is not valid for the request origins."}],gt=function(t){return"ImageProxy HTTP error: "+ft(pt,function(e){return t===e.code}).fold(p.constant("Unknown ImageProxy error"),function(t){return t.message})},vt=function(t){var e=gt(t);return at.reject(e)},yt=function(t){return ft(mt,function(e){return e.type===t}).fold(p.constant("Unknown service error"),function(t){return t.message})},bt=function(t,e){return ht.readBlob(e).then(function(t){var e,n,o,r=(e=t,n=ht.parseJson(e),"ImageProxy Service error: "+((o=ht.traverse(n,["error","type"]))?yt(o):"Invalid JSON in service error message"));return at.reject(r)})},wt={handleServiceErrorResponse:function(t,e){return 400===(n=t)||403===n||500===n?bt(0,e):vt(t);var n},handleHttpError:vt,getHttpErrorMsg:gt,getServiceErrorMsg:yt},xt=function(t,e){return ht.requestUrlAsBlob((n=t,o=e,r=-1===n.indexOf("?")?"?":"&",/[?&]apiKey=/.test(n)||!o?n:n+r+"apiKey="+encodeURIComponent(o)),{"Content-Type":"application/json;charset=UTF-8","tiny-api-key":e}).then(function(t){return t.status<200||t.status>=300?wt.handleServiceErrorResponse(t.status,t.blob):at.resolve(t.blob)});var n,o,r},Rt=function(t,e){return e?xt(t,e):(n=t,ht.requestUrlAsBlob(n,{}).then(function(t){return t.status<200||t.status>=300?wt.handleHttpError(t.status):at.resolve(t.blob)}));var n},It=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),Tt=tinymce.util.Tools.resolve("tinymce.ui.Factory"),kt=function(){var t=[],e=-1;function n(){return e>0}function o(){return-1!==e&&e<t.length-1}return{data:t,add:function(n){var o;return o=t.splice(++e),t.push(n),{state:n,removed:o}},undo:function(){if(n())return t[--e]},redo:function(){if(o())return t[++e]},canUndo:n,canRedo:o}},Ct=tinymce.util.Tools.resolve("tinymce.geom.Rect"),Bt=function(t){return new at(function(e){var n=function(){t.removeEventListener("load",n),e(t)};t.complete?e(t):t.addEventListener("load",n)})},Ut=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),Mt=tinymce.util.Tools.resolve("tinymce.util.Observable"),jt=tinymce.util.Tools.resolve("tinymce.util.VK"),At=0,zt=function(t,e,o,r,i){var a,u,c,l,s="mce-",f=s+"crid-"+At++;function d(t,e){return{x:e.x-t.x,y:e.y-t.y,w:e.w,h:e.h}}function h(e,n,r,i){var u,c,l,s,f;u=n.x,c=n.y,l=n.w,s=n.h,u+=r*e.deltaX,c+=i*e.deltaY,l+=r*e.deltaW,s+=i*e.deltaH,l<20&&(l=20),s<20&&(s=20),f=t=Ct.clamp({x:u,y:c,w:l,h:s},o,"move"===e.name),f=d(o,f),a.fire("updateRect",{rect:f}),g(f)}function p(t){function o(t,e){e.h<0&&(e.h=0),e.w<0&&(e.w=0),Ut("#"+f+"-"+t,r).css({left:e.x,top:e.y,width:e.w,height:e.h})}n.each(u,function(e){Ut("#"+f+"-"+e.name,r).css({left:t.w*e.xMul+t.x,top:t.h*e.yMul+t.y})}),o("top",{x:e.x,y:e.y,w:e.w,h:t.y-e.y}),o("right",{x:t.x+t.w,y:t.y,w:e.w-t.x-t.w+e.x,h:t.h}),o("bottom",{x:e.x,y:t.y+t.h,w:e.w,h:e.h-t.y-t.h+e.y}),o("left",{x:e.x,y:t.y,w:t.x-e.x,h:t.h}),o("move",t)}function m(e){p(t=e)}function g(t){var e,n;m((e=o,{x:(n=t).x+e.x,y:n.y+e.y,w:n.w,h:n.h}))}return u=[{name:"move",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:0,deltaH:0,label:"Crop Mask"},{name:"nw",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:-1,deltaH:-1,label:"Top Left Crop Handle"},{name:"ne",xMul:1,yMul:0,deltaX:0,deltaY:1,deltaW:1,deltaH:-1,label:"Top Right Crop Handle"},{name:"sw",xMul:0,yMul:1,deltaX:1,deltaY:0,deltaW:-1,deltaH:1,label:"Bottom Left Crop Handle"},{name:"se",xMul:1,yMul:1,deltaX:0,deltaY:0,deltaW:1,deltaH:1,label:"Bottom Right Crop Handle"}],l=["top","right","bottom","left"],Ut('<div id="'+f+'" class="'+s+'croprect-container" role="grid" aria-dropeffect="execute">').appendTo(r),n.each(l,function(t){Ut("#"+f,r).append('<div id="'+f+"-"+t+'"class="'+s+'croprect-block" style="display: none" data-mce-bogus="all">')}),n.each(u,function(t){Ut("#"+f,r).append('<div id="'+f+"-"+t.name+'" class="'+s+"croprect-handle "+s+"croprect-handle-"+t.name+'"style="display: none" data-mce-bogus="all" role="gridcell" tabindex="-1" aria-label="'+t.label+'" aria-grabbed="false">')}),c=n.map(u,function(e){var n;return new(Tt.get("DragHelper"))(f,{document:r.ownerDocument,handle:f+"-"+e.name,start:function(){n=t},drag:function(t){h(e,n,t.deltaX,t.deltaY)}})}),p(t),Ut(r).on("focusin focusout",function(t){Ut(t.target).attr("aria-grabbed","focus"===t.type)}),Ut(r).on("keydown",function(e){var o;function r(t,e,n,r,i){t.stopPropagation(),t.preventDefault(),h(o,n,r,i)}switch(n.each(u,function(t){if(e.target.id===f+"-"+t.name)return o=t,!1}),e.keyCode){case jt.LEFT:r(e,0,t,-10,0);break;case jt.RIGHT:r(e,0,t,10,0);break;case jt.UP:r(e,0,t,0,-10);break;case jt.DOWN:r(e,0,t,0,10);break;case jt.ENTER:case jt.SPACEBAR:e.preventDefault(),i()}}),a=n.extend({toggleVisibility:function(t){var e;e=n.map(u,function(t){return"#"+f+"-"+t.name}).concat(n.map(l,function(t){return"#"+f+"-"+t})).join(","),t?Ut(e,r).show():Ut(e,r).hide()},setClampRect:function(e){o=e,p(t)},setRect:m,getInnerRect:function(){return d(o,t)},setInnerRect:g,setViewPortRect:function(n){e=n,p(t)},destroy:function(){n.each(c,function(t){t.destroy()}),c=[]}},Mt)},Et={create:function(t){return new(Tt.get("Control").extend({Defaults:{classes:"imagepanel"},selection:function(t){return arguments.length?(this.state.set("rect",t),this):this.state.get("rect")},imageSize:function(){var t=this.state.get("viewRect");return{w:t.w,h:t.h}},toggleCropRect:function(t){this.state.set("cropEnabled",t)},imageSrc:function(t){var e=this,n=new Image;n.src=t,Bt(n).then(function(){var t,o,r=e.state.get("viewRect");if((o=e.$el.find("img"))[0])o.replaceWith(n);else{var i=document.createElement("div");i.className="mce-imagepanel-bg",e.getEl().appendChild(i),e.getEl().appendChild(n)}t={x:0,y:0,w:n.naturalWidth,h:n.naturalHeight},e.state.set("viewRect",t),e.state.set("rect",Ct.inflate(t,-20,-20)),r&&r.w===t.w&&r.h===t.h||e.zoomFit(),e.repaintImage(),e.fire("load")})},zoom:function(t){return arguments.length?(this.state.set("zoom",t),this):this.state.get("zoom")},postRender:function(){return this.imageSrc(this.settings.imageSrc),this._super()},zoomFit:function(){var t,e,n,o,r,i;t=this.$el.find("img"),e=this.getEl().clientWidth,n=this.getEl().clientHeight,o=t[0].naturalWidth,r=t[0].naturalHeight,(i=Math.min((e-10)/o,(n-10)/r))>=1&&(i=1),this.zoom(i)},repaintImage:function(){var t,e,n,o,r,i,a,u,c,l,s;s=this.getEl(),c=this.zoom(),l=this.state.get("rect"),a=this.$el.find("img"),u=this.$el.find(".mce-imagepanel-bg"),r=s.offsetWidth,i=s.offsetHeight,n=a[0].naturalWidth*c,o=a[0].naturalHeight*c,t=Math.max(0,r/2-n/2),e=Math.max(0,i/2-o/2),a.css({left:t,top:e,width:n,height:o}),u.css({left:t,top:e,width:n,height:o}),this.cropRect&&(this.cropRect.setRect({x:l.x*c+t,y:l.y*c+e,w:l.w*c,h:l.h*c}),this.cropRect.setClampRect({x:t,y:e,w:n,h:o}),this.cropRect.setViewPortRect({x:0,y:0,w:r,h:i}))},bindStates:function(){var t=this;t.state.on("change:cropEnabled",function(e){t.cropRect.toggleVisibility(e.value),t.repaintImage()}),t.state.on("change:zoom",function(){t.repaintImage()}),t.state.on("change:rect",function(e){var n,o=e.value;t.cropRect||(n=o,t.cropRect=zt(n,t.state.get("viewRect"),t.state.get("viewRect"),t.getEl(),function(){t.fire("crop")}),t.cropRect.on("updateRect",function(e){var n=e.rect,o=t.zoom();n={x:Math.round(n.x/o),y:Math.round(n.y/o),w:Math.round(n.w/o),h:Math.round(n.h/o)},t.state.set("rect",n)}),t.on("remove",t.cropRect.destroy)),t.cropRect.setRect(o)})}}))(t)}};function St(t){return{blob:t,url:rt.createObjectURL(t)}}function Lt(t){t&&rt.revokeObjectURL(t.url)}function Ht(t){n.each(t,Lt)}function Ot(t,e,o,r){var i,a,u,c,l,s,f,d,h,p,m,g,v,y,b,w,x,R,I,T,k,C,B,U,M,j,A,z=kt();function E(t){var e,n,o,r;e=i.find("#w")[0],n=i.find("#h")[0],o=parseInt(e.value(),10),r=parseInt(n.value(),10),i.find("#constrain")[0].checked()&&U&&M&&o&&r&&("w"===t.control.settings.name?(r=Math.round(o*j),n.value(r)):(o=Math.round(r*A),e.value(o))),U=o,M=r}function S(t){return Math.round(100*t)+"%"}function L(){i.find("#undo").disabled(!z.canUndo()),i.find("#redo").disabled(!z.canRedo()),i.statusbar.find("#save").disabled(!z.canUndo())}function H(){i.find("#undo").disabled(!0),i.find("#redo").disabled(!0)}function O(t){t&&d.imageSrc(t.url)}function _(t){return function(){var e=n.grep(B,function(e){return e.settings.name!==t});n.each(e,function(t){t.hide()}),t.show(),t.focus()}}function D(t){O(c=St(t))}function F(t){O(e=St(t)),Ht(z.add(e).removed),L()}function P(){var t=d.selection();nt.blobToImageResult(e.blob).then(function(e){tt.crop(e,t.x,t.y,t.w,t.h).then(X).then(function(t){F(t),q()})})}var W=function(t){var n=[].slice.call(arguments,1);return function(){var o=c||e;nt.blobToImageResult(o.blob).then(function(e){t.apply(this,[e].concat(n)).then(X).then(D)})}};function q(){O(e),Lt(c),_(a)(),L()}function V(){c?(F(c.blob),q()):function e(n,o){c?o():setTimeout(function(){n-- >0?e(n,o):t.windowManager.alert("Error: failed to apply image operation.")},10)}(100,V)}function N(t){return Tt.create("Form",{layout:"flex",direction:"row",labelGap:5,border:"0 0 1 0",align:"center",pack:"center",padding:"0 10 0 10",spacing:5,flex:0,minHeight:60,defaults:{classes:"imagetool",type:"button"},items:t})}var X=function(t){return t.toBlob()};function $(t,n){return N([{text:"Back",onclick:q},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:V}]).hide().on("show",function(){H(),nt.blobToImageResult(e.blob).then(function(t){return n(t)}).then(X).then(function(t){var e=St(t);O(e),Lt(c),c=e})})}function G(t,n,o,r,i){return N([{text:"Back",onclick:q},{type:"spacer",flex:1},{type:"slider",flex:1,ondragend:function(t){var o;o=t.value,nt.blobToImageResult(e.blob).then(function(t){return n(t,o)}).then(X).then(function(t){var e=St(t);O(e),Lt(c),c=e})},minValue:r,maxValue:i,value:o,previewFilter:S},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:V}]).hide().on("show",function(){this.find("slider").value(o),H()})}l=N([{text:"Back",onclick:q},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:P}]).hide().on("show hide",function(t){d.toggleCropRect("show"===t.type)}).on("show",H),s=N([{text:"Back",onclick:q},{type:"spacer",flex:1},{type:"textbox",name:"w",label:"Width",size:4,onkeyup:E},{type:"textbox",name:"h",label:"Height",size:4,onkeyup:E},{type:"checkbox",name:"constrain",text:"Constrain proportions",checked:!0,onchange:function(t){!0===t.control.value()&&(j=M/U,A=U/M)}},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:"submit"}]).hide().on("submit",function(t){var n=parseInt(i.find("#w").value(),10),o=parseInt(i.find("#h").value(),10);t.preventDefault(),function(t){for(var n=[],o=1;o<arguments.length;o++)n[o-1]=arguments[o];var r=[].slice.call(arguments,1);return function(){nt.blobToImageResult(e.blob).then(function(e){t.apply(this,[e].concat(r)).then(X).then(F)})}}(tt.resize,n,o)(),q()}).on("show",H),f=N([{text:"Back",onclick:q},{type:"spacer",flex:1},{icon:"fliph",tooltip:"Flip horizontally",onclick:W(tt.flip,"h")},{icon:"flipv",tooltip:"Flip vertically",onclick:W(tt.flip,"v")},{icon:"rotateleft",tooltip:"Rotate counterclockwise",onclick:W(tt.rotate,-90)},{icon:"rotateright",tooltip:"Rotate clockwise",onclick:W(tt.rotate,90)},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:V}]).hide().on("show",H),m=$(0,tt.invert),I=$(0,tt.sharpen),T=$(0,tt.emboss),g=G(0,tt.brightness,0,-1,1),v=G(0,tt.hue,180,0,360),y=G(0,tt.saturate,0,-1,1),b=G(0,tt.contrast,0,-1,1),w=G(0,tt.grayscale,0,0,1),x=G(0,tt.sepia,0,0,1),R=function(t,n){function o(){var t,o,r;t=i.find("#r")[0].value(),o=i.find("#g")[0].value(),r=i.find("#b")[0].value(),nt.blobToImageResult(e.blob).then(function(e){return n(e,t,o,r)}).then(X).then(function(t){var e=St(t);O(e),Lt(c),c=e})}return N([{text:"Back",onclick:q},{type:"spacer",flex:1},{type:"slider",label:"R",name:"r",minValue:0,value:1,maxValue:2,ondragend:o,previewFilter:S},{type:"slider",label:"G",name:"g",minValue:0,value:1,maxValue:2,ondragend:o,previewFilter:S},{type:"slider",label:"B",name:"b",minValue:0,value:1,maxValue:2,ondragend:o,previewFilter:S},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:V}]).hide().on("show",function(){i.find("#r,#g,#b").value(1),H()})}(0,tt.colorize),k=G(0,tt.gamma,0,-1,1),C=G(0,tt.exposure,1,0,2),u=N([{text:"Back",onclick:q},{type:"spacer",flex:1},{text:"hue",icon:"hue",onclick:_(v)},{text:"saturate",icon:"saturate",onclick:_(y)},{text:"sepia",icon:"sepia",onclick:_(x)},{text:"emboss",icon:"emboss",onclick:_(T)},{text:"exposure",icon:"exposure",onclick:_(C)},{type:"spacer",flex:1}]).hide(),a=N([{tooltip:"Crop",icon:"crop",onclick:_(l)},{tooltip:"Resize",icon:"resize2",onclick:_(s)},{tooltip:"Orientation",icon:"orientation",onclick:_(f)},{tooltip:"Brightness",icon:"sun",onclick:_(g)},{tooltip:"Sharpen",icon:"sharpen",onclick:_(I)},{tooltip:"Contrast",icon:"contrast",onclick:_(b)},{tooltip:"Color levels",icon:"drop",onclick:_(R)},{tooltip:"Gamma",icon:"gamma",onclick:_(k)},{tooltip:"Invert",icon:"invert",onclick:_(m)}]),d=Et.create({flex:1,imageSrc:e.url}),h=Tt.create("Container",{layout:"flex",direction:"column",border:"0 1 0 0",padding:5,spacing:5,items:[{type:"button",icon:"undo",tooltip:"Undo",name:"undo",onclick:function(){O(e=z.undo()),L()}},{type:"button",icon:"redo",tooltip:"Redo",name:"redo",onclick:function(){O(e=z.redo()),L()}},{type:"button",icon:"zoomin",tooltip:"Zoom in",onclick:function(){var t=d.zoom();t<2&&(t+=.1),d.zoom(t)}},{type:"button",icon:"zoomout",tooltip:"Zoom out",onclick:function(){var t=d.zoom();t>.1&&(t-=.1),d.zoom(t)}}]}),p=Tt.create("Container",{type:"container",layout:"flex",direction:"row",align:"stretch",flex:1,items:[h,d]}),B=[a,l,s,f,u,m,g,v,y,b,w,x,R,I,T,k,C],(i=t.windowManager.open({layout:"flex",direction:"column",align:"stretch",minWidth:Math.min(It.DOM.getViewPort().w,800),minHeight:Math.min(It.DOM.getViewPort().h,650),title:"Edit image",items:B.concat([p]),buttons:[{text:"Save",name:"save",subtype:"primary",onclick:function(){o(e.blob),i.close()}},{text:"Cancel",onclick:"close"}]})).on("close",function(){r(),Ht(z.data),z=null,c=null}),z.add(e),L(),d.on("load",function(){U=d.imageSize().w,M=d.imageSize().h,j=M/U,A=U/M,i.find("#w").value(U),i.find("#h").value(M)}),d.on("crop",P)}var _t={edit:function(t,e){return new at(function(n,o){return e.toBlob().then(function(e){Ot(t,St(e),n,o)})})}},Dt=0,Ft=function(t,e){t.notificationManager.open({text:e,type:"error"})},Pt=function(t){return t.selection.getNode()},Wt=function(t,e){var n=e.src;return 0===n.indexOf("data:")||0===n.indexOf("blob:")||new ut(n).host===t.documentBaseURI.host},qt=function(t,e){return-1!==n.inArray(t.settings.imagetools_cors_hosts,new ut(e.src).host)},Vt=function(t){var e,n,o,r,i,a;return(e=t.editorUpload.blobCache.getByUri(Pt(t).src))?at.resolve(e.blob()):(n=t,o=Pt(t),a=o.src,qt(n,o)?Rt(o.src,null):Wt(n,o)?H(o):(a=lt(n),a+=(-1===a.indexOf("?")?"?":"&")+"url="+encodeURIComponent(o.src),r=(i=n).settings.api_key||i.settings.imagetools_api_key,Rt(a,r)))},Nt=function(t,e){var n=it.setEditorTimeout(t,function(){t.editorUpload.uploadImagesAuto()},t.settings.images_upload_timeout||3e4);e.set(n)},Xt=function(t){clearTimeout(t.get())},$t=function(t,e,n,o){return e.toBlob().then(function(r){var i,a,u,c,l,s,f;return u=t.editorUpload.blobCache,i=(l=Pt(t)).src,t.settings.images_reuse_filename&&((c=u.getByUri(i))?(i=c.uri(),a=c.name()):(s=t,a=(f=i.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i))?s.dom.encode(f[1]):null)),c=u.create({id:"imagetools"+Dt++,blob:r,base64:e.toBase64(),uri:i,name:a}),u.add(c),t.undoManager.transact(function(){t.$(l).on("load",function e(){t.$(l).off("load",e),t.nodeChanged(),n?t.editorUpload.uploadImagesAuto():(Xt(o),Nt(t,o))}),t.$(l).attr({src:c.blobUri()}).removeAttr("data-mce-src")}),c})},Gt=function(t,e,n){return function(){return t._scanForImages().then(p.curry(Vt,t)).then(nt.blobToImageResult).then(n).then(function(n){return $t(t,n,!1,e)},function(e){Ft(t,e)})}},Yt={rotate:function(t,e,n){return function(){return Gt(t,e,function(e){var o=st.getImageSize(Pt(t));return o&&st.setImageSize(Pt(t),{w:o.h,h:o.w}),tt.rotate(e,n)})()}},flip:function(t,e,n){return function(){return Gt(t,e,function(t){return tt.flip(t,n)})()}},editImageDialog:function(t,e){return function(){var n=Pt(t),o=st.getNaturalImageSize(n),r=function(t){return new at(function(e){L(t).then(function(r){var i=st.getNaturalImageSize(r);o.w===i.w&&o.h===i.h||st.getImageSize(n)&&st.setImageSize(n,i),rt.revokeObjectURL(r.src),e(t)})})};Vt(t).then(nt.blobToImageResult).then(p.curry(function(t,n){return _t.edit(t,n).then(r).then(nt.blobToImageResult).then(function(n){return $t(t,n,!0,e)},function(){})},t),function(e){Ft(t,e)})}},isEditableImage:function(t,e){return t.dom.is(e,"img:not([data-mce-object],[data-mce-placeholder])")&&(Wt(t,e)||qt(t,e)||t.settings.imagetools_proxy)},cancelTimedUpload:Xt},Jt=function(t,e){n.each({mceImageRotateLeft:Yt.rotate(t,e,-90),mceImageRotateRight:Yt.rotate(t,e,90),mceImageFlipVertical:Yt.flip(t,e,"v"),mceImageFlipHorizontal:Yt.flip(t,e,"h"),mceEditImage:Yt.editImageDialog(t,e)},function(e,n){t.addCommand(n,e)})},Kt=function(t,e,n){t.on("NodeChange",function(o){var r=n.get();r&&r.src!==o.element.src&&(Yt.cancelTimedUpload(e),t.editorUpload.uploadImagesAuto(),n.set(null)),Yt.isEditableImage(t,o.element)&&n.set(o.element)})},Zt=function(t){t.addButton("rotateleft",{title:"Rotate counterclockwise",cmd:"mceImageRotateLeft"}),t.addButton("rotateright",{title:"Rotate clockwise",cmd:"mceImageRotateRight"}),t.addButton("flipv",{title:"Flip vertically",cmd:"mceImageFlipVertical"}),t.addButton("fliph",{title:"Flip horizontally",cmd:"mceImageFlipHorizontal"}),t.addButton("editimage",{title:"Edit image",cmd:"mceEditImage"}),t.addButton("imageoptions",{title:"Image options",icon:"options",cmd:"mceImage"})},Qt=function(t){t.addContextToolbar(p.curry(Yt.isEditableImage,t),ct(t))};e.add("imagetools",function(e){var n=t(0),o=t(null);Jt(e,n),Zt(e),Qt(e),Kt(e,n,o)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),n={hasDimensions:function(e){return!1!==e.settings.image_dimensions},hasAdvTab:function(e){return!0===e.settings.image_advtab},getPrependUrl:function(e){return e.getParam("image_prepend_url","")},getClassList:function(e){return e.getParam("image_class_list")},hasDescription:function(e){return!1!==e.settings.image_description},hasImageTitle:function(e){return!0===e.settings.image_title},hasImageCaption:function(e){return!0===e.settings.image_caption},getImageList:function(e){return e.getParam("image_list",!1)},hasUploadUrl:function(e){return e.getParam("images_upload_url",!1)},hasUploadHandler:function(e){return e.getParam("images_upload_handler",!1)},getUploadUrl:function(e){return e.getParam("images_upload_url")},getUploadHandler:function(e){return e.getParam("images_upload_handler")},getUploadBasePath:function(e){return e.getParam("images_upload_base_path")},getUploadCredentials:function(e){return e.getParam("images_upload_credentials")}},a="undefined"!=typeof window?window:Function("return this;")(),i=function(e,t){for(var n=t!==undefined&&null!==t?t:a,i=0;i<e.length&&n!==undefined&&null!==n;++i)n=n[e[i]];return n},r=function(e,t){var n=e.split(".");return i(n,t)},o=function(e,t){var n=r(e,t);if(n===undefined||null===n)throw e+" not available on this browser";return n},l=function(){return new(o("FileReader"))},s=tinymce.util.Tools.resolve("tinymce.util.Promise"),c=tinymce.util.Tools.resolve("tinymce.util.XHR"),u=function(e,t){return Math.max(parseInt(e,10),parseInt(t,10))},g={getImageSize:function(e,t){var n=document.createElement("img");function a(e,a){n.parentNode&&n.parentNode.removeChild(n),t({width:e,height:a})}n.onload=function(){a(u(n.width,n.clientWidth),u(n.height,n.clientHeight))},n.onerror=function(){a(0,0)};var i=n.style;i.visibility="hidden",i.position="fixed",i.bottom=i.left="0px",i.width=i.height="auto",document.body.appendChild(n),n.src=e},buildListItems:function(e,n,a){return function i(e,a){return a=a||[],t.each(e,function(e){var t={text:e.text||e.title};e.menu?t.menu=i(e.menu):(t.value=e.value,n(t)),a.push(t)}),a}(e,a||[])},removePixelSuffix:function(e){return e&&(e=e.replace(/px$/,"")),e},addPixelSuffix:function(e){return e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e},mergeMargins:function(e){if(e.margin){var t=e.margin.split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e},createImageList:function(e,t){var a=n.getImageList(e);"string"==typeof a?c.send({url:a,success:function(e){t(JSON.parse(e))}}):"function"==typeof a?a(t):t(a)},waitLoadImage:function(e,t,a){function i(){a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())}a.onload=function(){t.width||t.height||!n.hasDimensions(e)||e.dom.setAttribs(a,{width:a.clientWidth,height:a.clientHeight}),i()},a.onerror=i},blobToDataUri:function(e){return new s(function(t,n){var a=new l;a.onload=function(){t(a.result)},a.onerror=function(){n(l.error.message)},a.readAsDataURL(e)})}},d={makeTab:function(e,t){return{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:(a=e,function(e){var t=a.dom,i=e.control.rootControl;if(n.hasAdvTab(a)){var r=i.toJSON(),o=t.parseStyle(r.style);i.find("#vspace").value(""),i.find("#hspace").value(""),((o=g.mergeMargins(o))["margin-top"]&&o["margin-bottom"]||o["margin-right"]&&o["margin-left"])&&(o["margin-top"]===o["margin-bottom"]?i.find("#vspace").value(g.removePixelSuffix(o["margin-top"])):i.find("#vspace").value(""),o["margin-right"]===o["margin-left"]?i.find("#hspace").value(g.removePixelSuffix(o["margin-right"])):i.find("#hspace").value("")),o["border-width"]&&i.find("#border").value(g.removePixelSuffix(o["border-width"])),i.find("#style").value(t.serializeStyle(t.parseStyle(t.serializeStyle(o))))}})},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:function(n){t(e,n.control.rootControl)}},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]};var a}},m=function(e,t){e.state.set("oldVal",e.value()),t.state.set("oldVal",t.value())},f=function(e,t){var n=e.find("#width")[0],a=e.find("#height")[0],i=e.find("#constrain")[0];n&&a&&i&&t(n,a,i.checked())},p=function(e,t,n){var a=e.state.get("oldVal"),i=t.state.get("oldVal"),r=e.value(),o=t.value();n&&a&&i&&r&&o&&(r!==a?(o=Math.round(r/a*o),isNaN(o)||t.value(o)):(r=Math.round(o/i*r),isNaN(r)||e.value(r))),m(e,t)},h=function(e){f(e,p)},b={createUi:function(){var e=function(e){h(e.control.rootControl)};return{type:"container",label:"Dimensions",layout:"flex",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:5,onchange:e,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:5,onchange:e,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}},syncSize:function(e){f(e,m)},updateSize:h},v=function(e){e.meta=e.control.rootControl.toJSON()},y=function(e,a){var i=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:function(a){var i,r,o,l,s,c,u,d,m;r=e,c=(i=a).meta||{},u=i.control,d=u.rootControl,(m=d.find("#image-list")[0])&&m.value(r.convertURL(u.value(),"src")),t.each(c,function(e,t){d.find("#"+t).value(e)}),c.width||c.height||(o=r.convertURL(u.value(),"src"),l=n.getPrependUrl(r),s=new RegExp("^(?:[a-z]+:)?//","i"),l&&!s.test(o)&&o.substring(0,l.length)!==l&&(o=l+o),u.value(o),g.getImageSize(r.documentBaseURI.toAbsolute(u.value()),function(e){e.width&&e.height&&n.hasDimensions(r)&&(d.find("#width").value(e.width),d.find("#height").value(e.height),b.updateSize(d))}))},onbeforecall:v},a];return n.hasDescription(e)&&i.push({name:"alt",type:"textbox",label:"Image description"}),n.hasImageTitle(e)&&i.push({name:"title",type:"textbox",label:"Image Title"}),n.hasDimensions(e)&&i.push(b.createUi()),n.getClassList(e)&&i.push({name:"class",type:"listbox",label:"Class",values:g.buildListItems(n.getClassList(e),function(t){t.value&&(t.textStyle=function(){return e.formatter.getCssText({inline:"img",classes:[t.value]})})})}),n.hasImageCaption(e)&&i.push({name:"caption",type:"checkbox",label:"Caption"}),i},x={makeTab:function(e,t){return{title:"General",type:"form",items:y(e,t)}},getGeneralItems:y},w=function(){return o("URL")},S=function(e){return w().createObjectURL(e)},U=function(e){w().revokeObjectURL(e)},T=tinymce.util.Tools.resolve("tinymce.ui.Factory"),C=function(){},I=function(e){var n=function(t,n,a,i){var r,l;(r=new function(){return new(o("XMLHttpRequest"))}).open("POST",e.url),r.withCredentials=e.credentials,r.upload.onprogress=function(e){i(e.loaded/e.total*100)},r.onerror=function(){a("Image upload failed due to a XHR Transport error. Code: "+r.status)},r.onload=function(){var t,i,o;r.status<200||r.status>=300?a("HTTP Error: "+r.status):(t=JSON.parse(r.responseText))&&"string"==typeof t.location?n((i=e.basePath,o=t.location,i?i.replace(/\/$/,"")+"/"+o.replace(/^\//,""):o)):a("Invalid JSON: "+r.responseText)},(l=new FormData).append("file",t.blob(),t.filename()),r.send(l)};return e=t.extend({credentials:!1,handler:n},e),{upload:function(t){return e.url||e.handler!==n?(a=t,i=e.handler,new s(function(e,t){try{i(a,e,t,C)}catch(n){t(n.message)}})):s.reject("Upload url missing from the settings.");var a,i}}},P=function(e){return function(t){var a=T.get("Throbber"),i=t.control.rootControl,r=new a(i.getEl()),o=t.control.value(),l=S(o),s=I({url:n.getUploadUrl(e),basePath:n.getUploadBasePath(e),credentials:n.getUploadCredentials(e),handler:n.getUploadHandler(e)}),c=function(){r.hide(),U(l)};return r.show(),g.blobToDataUri(o).then(function(t){var n=e.editorUpload.blobCache.create({blob:o,blobUri:l,name:o.name?o.name.replace(/\.[^\.]+$/,""):null,base64:t.split(",")[1]});return s.upload(n).then(function(e){var t=i.find("#src");return t.value(e),i.find("tabpanel")[0].activateTab(0),t.fire("change"),c(),e})})["catch"](function(t){e.windowManager.alert(t),c()})}},L=".jpg,.jpeg,.png,.gif",_={makeTab:function(e){return{title:"Upload",type:"form",layout:"flex",direction:"column",align:"stretch",padding:"20 20 20 20",items:[{type:"container",layout:"flex",direction:"column",align:"center",spacing:10,items:[{text:"Browse for an image",type:"browsebutton",accept:L,onchange:P(e)},{text:"OR",type:"label"}]},{text:"Drop an image here",type:"dropzone",accept:L,height:100,onchange:P(e)}]}}},N=function(e){var a=function(e,t){if(n.hasAdvTab(e)){var a=e.dom,i=t.toJSON(),r=a.parseStyle(i.style);r=g.mergeMargins(r),i.vspace&&(r["margin-top"]=r["margin-bottom"]=g.addPixelSuffix(i.vspace)),i.hspace&&(r["margin-left"]=r["margin-right"]=g.addPixelSuffix(i.hspace)),i.border&&(r["border-width"]=g.addPixelSuffix(i.border)),t.find("#style").value(a.serializeStyle(a.parseStyle(a.serializeStyle(r))))}};function i(i){var r,o,l,s,c={},u=e.dom;function m(){var n,i;b.updateSize(r),a(e,r),(c=t.extend(c,r.toJSON())).alt||(c.alt=""),c.title||(c.title=""),""===c.width&&(c.width=null),""===c.height&&(c.height=null),c.style||(c.style=null),c={src:c.src,alt:c.alt,title:c.title,width:c.width,height:c.height,style:c.style,caption:c.caption,"class":c["class"]},e.undoManager.transact(function(){if(c.src){if(""===c.title&&(c.title=null),o?u.setAttribs(o,c):(c.id="__mcenew",e.focus(),e.selection.setContent(u.createHTML("img",c)),o=u.get("__mcenew"),u.setAttrib(o,"id",null)),e.editorUpload.uploadImagesAuto(),!1===c.caption&&u.is(o.parentNode,"figure.image")&&(n=o.parentNode,u.insertAfter(o,n),u.remove(n)),!0!==c.caption)g.waitLoadImage(e,c,o);else if(!u.is(o.parentNode,"figure.image")){i=o,o=o.cloneNode(!0),(n=u.create("figure",{"class":"image"})).appendChild(o),n.appendChild(u.create("figcaption",{contentEditable:!0},"Caption")),n.contentEditable=!1;var t=u.getParent(i,function(t){return e.schema.getTextBlockElements()[t.nodeName]});t?u.split(t,i,n):u.replace(n,i),e.selection.select(n)}}else if(o){var a=u.is(o.parentNode,"figure.image")?o.parentNode:o;u.remove(a),e.focus(),e.nodeChanged(),u.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})}if(o=e.selection.getNode(),(l=u.getParent(o,"figure.image"))&&(o=u.select("img",l)[0]),o&&("IMG"!==o.nodeName||o.getAttribute("data-mce-object")||o.getAttribute("data-mce-placeholder"))&&(o=null),o&&(c={src:u.getAttrib(o,"src"),alt:u.getAttrib(o,"alt"),title:u.getAttrib(o,"title"),"class":u.getAttrib(o,"class"),width:u.getAttrib(o,"width"),height:u.getAttrib(o,"height"),caption:!!l}),i&&(s={type:"listbox",label:"Image list",name:"image-list",values:g.buildListItems(i,function(t){t.value=e.convertURL(t.value||t.url,"src")},[{text:"None",value:""}]),value:c.src&&e.convertURL(c.src,"src"),onselect:function(e){var t=r.find("#alt");(!t.value()||e.lastControl&&t.value()===e.lastControl.text())&&t.value(e.control.text()),r.find("#src").value(e.control.value()).fire("change")},onPostRender:function(){s=this}}),n.hasAdvTab(e)||n.hasUploadUrl(e)||n.hasUploadHandler(e)){var f=[x.makeTab(e,s)];n.hasAdvTab(e)&&(o&&(o.style.marginLeft&&o.style.marginRight&&o.style.marginLeft===o.style.marginRight&&(c.hspace=g.removePixelSuffix(o.style.marginLeft)),o.style.marginTop&&o.style.marginBottom&&o.style.marginTop===o.style.marginBottom&&(c.vspace=g.removePixelSuffix(o.style.marginTop)),o.style.borderWidth&&(c.border=g.removePixelSuffix(o.style.borderWidth)),c.style=e.dom.serializeStyle(e.dom.parseStyle(e.dom.getAttrib(o,"style")))),f.push(d.makeTab(e,a))),(n.hasUploadUrl(e)||n.hasUploadHandler(e))&&f.push(_.makeTab(e)),r=e.windowManager.open({title:"Insert/edit image",data:c,bodyType:"tabpanel",body:f,onSubmit:m})}else r=e.windowManager.open({title:"Insert/edit image",data:c,body:x.getGeneralItems(e,s),onSubmit:m});b.syncSize(r)}return{open:function(){g.createImageList(e,i)}}},A=function(e){e.addCommand("mceImage",N(e).open)},k=function(e){return function(n){for(var a,i,r=n.length,o=function(t){t.attr("contenteditable",e?"true":null)};r--;)a=n[r],(i=a.attr("class"))&&/\bimage\b/.test(i)&&(a.attr("contenteditable",e?"false":null),t.each(a.getAll("figcaption"),o))}},z=function(e){e.on("preInit",function(){e.parser.addNodeFilter("figure",k(!0)),e.serializer.addNodeFilter("figure",k(!1))})},R=function(e){e.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:N(e).open,stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),e.addMenuItem("image",{icon:"image",text:"Image",onclick:N(e).open,context:"insert",prependToContext:!0})};e.add("image",function(e){z(e),R(e),A(e)})}();!function(){"use strict";var n=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"<hr />")})},t=function(n){n.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),n.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})};tinymce.util.Tools.resolve("tinymce.PluginManager").add("hr",function(o){n(o),t(o)})}();!function(){"use strict";var e=function(t){var n=t,i=function(){return n};return{get:i,set:function(e){n=e},clone:function(){return e(i())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e){return{isFullscreen:function(){return null!==e.get()}}},i=function(e,t){e.fire("FullscreenStateChanged",{state:t})},r=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils").DOM,l=function(e,t){var n,l,o,c,s,u,d=document.body,a=document.documentElement,h=t.get(),f=function(){var e,t,n,i;r.setStyle(o,"height",(n=window,i=document.body,i.offsetWidth&&(e=i.offsetWidth,t=i.offsetHeight),n.innerWidth&&n.innerHeight&&(e=n.innerWidth,t=n.innerHeight),{w:e,h:t}).h-(l.clientHeight-o.clientHeight))},m=function(){r.unbind(window,"resize",f)};if(n=(l=e.getContainer()).style,c=(o=e.getContentAreaContainer().firstChild).style,h)c.width=h.iframeWidth,c.height=h.iframeHeight,h.containerWidth&&(n.width=h.containerWidth),h.containerHeight&&(n.height=h.containerHeight),r.removeClass(d,"mce-fullscreen"),r.removeClass(a,"mce-fullscreen"),r.removeClass(l,"mce-fullscreen"),s=h.scrollPos,window.scrollTo(s.x,s.y),r.unbind(window,"resize",h.resizeHandler),e.off("remove",h.removeHandler),t.set(null),i(e,!1);else{var g={scrollPos:(u=r.getViewPort(),{x:u.x,y:u.y}),containerWidth:n.width,containerHeight:n.height,iframeWidth:c.width,iframeHeight:c.height,resizeHandler:f,removeHandler:m};c.width=c.height="100%",n.width=n.height="",r.addClass(d,"mce-fullscreen"),r.addClass(a,"mce-fullscreen"),r.addClass(l,"mce-fullscreen"),r.bind(window,"resize",f),e.on("remove",m),f(),t.set(g),i(e,!0)}},o=function(e,t){e.addCommand("mceFullScreen",function(){l(e,t)})},c=function(e){return function(t){var n=t.control;e.on("FullscreenStateChanged",function(e){n.active(e.state)})}},s=function(e){e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,cmd:"mceFullScreen",onPostRender:c(e),context:"view"}),e.addButton("fullscreen",{active:!1,tooltip:"Fullscreen",cmd:"mceFullScreen",onPostRender:c(e)})};t.add("fullscreen",function(t){var i=e(null);return o(t,i),s(t),t.addShortcut("Ctrl+Shift+F","","mceFullScreen"),n(i)})}();!function(){"use strict";var e=function(t){var n=t,l=function(){return n};return{get:l,set:function(e){n=e},clone:function(){return e(l())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=tinymce.util.Tools.resolve("tinymce.html.DomParser"),i=tinymce.util.Tools.resolve("tinymce.html.Node"),r=tinymce.util.Tools.resolve("tinymce.html.Serializer"),o=function(e){return e.getParam("fullpage_hide_in_source_view")},a=function(e){return e.getParam("fullpage_default_xml_pi")},c=function(e){return e.getParam("fullpage_default_encoding")},s=function(e){return e.getParam("fullpage_default_font_family")},u=function(e){return e.getParam("fullpage_default_font_size")},d=function(e){return e.getParam("fullpage_default_text_color")},f=function(e){return e.getParam("fullpage_default_title")},g=function(e){return e.getParam("fullpage_default_doctype","<!DOCTYPE html>")},m=function(e){return l({validate:!1,root_name:"#document"}).parse(e)},h=m,p=function(e,t){var l,i,r=m(t),o={};function a(e,t){return e.attr(t)||""}return o.fontface=s(e),o.fontsize=u(e),7===(l=r.firstChild).type&&(o.xml_pi=!0,(i=/encoding="([^"]+)"/.exec(l.value))&&(o.docencoding=i[1])),(l=r.getAll("#doctype")[0])&&(o.doctype="<!DOCTYPE"+l.value+">"),(l=r.getAll("title")[0])&&l.firstChild&&(o.title=l.firstChild.value),n.each(r.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?o[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(o.docencoding=t[1])}),(l=r.getAll("html")[0])&&(o.langcode=a(l,"lang")||a(l,"xml:lang")),o.stylesheets=[],n.each(r.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&o.stylesheets.push(e.attr("href"))}),(l=r.getAll("body")[0])&&(o.langdir=a(l,"dir"),o.style=a(l,"style"),o.visited_color=a(l,"vlink"),o.link_color=a(l,"link"),o.active_color=a(l,"alink")),o},y=function(e,t,l){var o,a,c,s,u,d=e.dom;function f(e,t,n){e.attr(t,n||undefined)}function g(e){a.firstChild?a.insert(e,a.firstChild):a.append(e)}o=m(l),(a=o.getAll("head")[0])||(s=o.getAll("html")[0],a=new i("head",1),s.firstChild?s.insert(a,s.firstChild,!0):s.append(a)),s=o.firstChild,t.xml_pi?(u='version="1.0"',t.docencoding&&(u+=' encoding="'+t.docencoding+'"'),7!==s.type&&(s=new i("xml",7),o.insert(s,o.firstChild,!0)),s.value=u):s&&7===s.type&&s.remove(),s=o.getAll("#doctype")[0],t.doctype?(s||(s=new i("#doctype",10),t.xml_pi?o.insert(s,o.firstChild):g(s)),s.value=t.doctype.substring(9,t.doctype.length-1)):s&&s.remove(),s=null,n.each(o.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(s=e)}),t.docencoding?(s||((s=new i("meta",1)).attr("http-equiv","Content-Type"),s.shortEnded=!0,g(s)),s.attr("content","text/html; charset="+t.docencoding)):s&&s.remove(),s=o.getAll("title")[0],t.title?(s?s.empty():g(s=new i("title",1)),s.append(new i("#text",3)).value=t.title):s&&s.remove(),n.each("keywords,description,author,copyright,robots".split(","),function(e){var n,l,r=o.getAll("meta"),a=t[e];for(n=0;n<r.length;n++)if((l=r[n]).attr("name")===e)return void(a?l.attr("content",a):l.remove());a&&((s=new i("meta",1)).attr("name",e),s.attr("content",a),s.shortEnded=!0,g(s))});var h={};return n.each(o.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&(h[e.attr("href")]=e)}),n.each(t.stylesheets,function(e){h[e]||((s=new i("link",1)).attr({rel:"stylesheet",text:"text/css",href:e}),s.shortEnded=!0,g(s)),delete h[e]}),n.each(h,function(e){e.remove()}),(s=o.getAll("body")[0])&&(f(s,"dir",t.langdir),f(s,"style",t.style),f(s,"vlink",t.visited_color),f(s,"link",t.link_color),f(s,"alink",t.active_color),d.setAttribs(e.getBody(),{style:t.style,dir:t.dir,vLink:t.visited_color,link:t.link_color,aLink:t.active_color})),(s=o.getAll("html")[0])&&(f(s,"lang",t.langcode),f(s,"xml:lang",t.langcode)),a.firstChild||a.remove(),(c=r({validate:!1,indent:!0,apply_source_formatting:!0,indent_before:"head,html,body,meta,title,script,link,style",indent_after:"head,html,body,meta,title,script,link,style"}).serialize(o)).substring(0,c.indexOf("</body>"))},v=function(e,t){var l=p(e,t.get());e.windowManager.open({title:"Document properties",data:l,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(i){var r=y(e,n.extend(l,i.data),t.get());t.set(r)}})},_=function(e,t){e.addCommand("mceFullPageProperties",function(){v(e,t)})},b=function(e,t){return n.each(e,function(e){t=t.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),t},x=function(e){return e.replace(/<!--mce:protected ([\s\S]*?)-->/g,function(e,t){return unescape(t)})},k=n.each,C=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},A=function(e){var t,n="",l="";if(a(e)){var i=c(e);n+='<?xml version="1.0" encoding="'+(i||"ISO-8859-1")+'" ?>\n'}return n+=g(e),n+="\n<html>\n<head>\n",(t=f(e))&&(n+="<title>"+t+"</title>\n"),(t=c(e))&&(n+='<meta http-equiv="Content-Type" content="text/html; charset='+t+'" />\n'),(t=s(e))&&(l+="font-family: "+t+";"),(t=u(e))&&(l+="font-size: "+t+";"),(t=d(e))&&(l+="color: "+t+";"),n+="</head>\n<body"+(l?' style="'+l+'"':"")+">\n"},w=function(e,t,l){e.on("BeforeSetContent",function(i){!function(e,t,l,i){var r,a,c,s,u,d="",f=e.dom;if(!(i.selection||(c=b(e.settings.protect,i.content),"raw"===i.format&&t.get()||i.source_view&&o(e)))){0!==c.length||i.source_view||(c=n.trim(t.get())+"\n"+n.trim(c)+"\n"+n.trim(l.get())),-1!==(r=(c=c.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("<body"))?(r=c.indexOf(">",r),t.set(C(c.substring(0,r+1))),-1===(a=c.indexOf("</body",r))&&(a=c.length),i.content=n.trim(c.substring(r+1,a)),l.set(C(c.substring(a)))):(t.set(A(e)),l.set("\n</body>\n</html>")),s=h(t.get()),k(s.getAll("style"),function(e){e.firstChild&&(d+=e.firstChild.value)}),(u=s.getAll("body")[0])&&f.setAttribs(e.getBody(),{style:u.attr("style")||"",dir:u.attr("dir")||"",vLink:u.attr("vlink")||"",link:u.attr("link")||"",aLink:u.attr("alink")||""}),f.remove("fullpage_styles");var g=e.getDoc().getElementsByTagName("head")[0];d&&(f.add(g,"style",{id:"fullpage_styles"},d),(u=f.get("fullpage_styles")).styleSheet&&(u.styleSheet.cssText=d));var m={};n.each(g.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),n.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||f.add(g,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),n.each(m,function(e){e.parentNode.removeChild(e)})}}(e,t,l,i)}),e.on("GetContent",function(i){var r,a,c,s;r=e,a=t.get(),c=l.get(),(s=i).selection||s.source_view&&o(r)||(s.content=x(n.trim(a)+"\n"+n.trim(s.content)+"\n"+n.trim(c)))})},P=function(e){e.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),e.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"})};t.add("fullpage",function(t){var n=e(""),l=e("");_(t,n),P(t),w(t,n,l)})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]],o=function(t){var o;return o='<table role="list" class="mce-grid">',e.each(i,function(i){o+="<tr>",e.each(i,function(e){var i=t+"/img/smiley-"+e+".gif";o+='<td><a href="#" data-mce-url="'+i+'" data-mce-alt="'+e+'" tabindex="-1" role="option" aria-label="'+e+'"><img src="'+i+'" style="width: 18px; height: 18px" role="presentation" /></a></td>'}),o+="</tr>"}),o+="</table>"},n=function(t,e){var i=o(e);t.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:i,onclick:function(e){var i,o,n,a=t.dom.getParent(e.target,"a");a&&(i=t,o=a.getAttribute("data-mce-url"),n=a.getAttribute("data-mce-alt"),i.insertContent(i.dom.createHTML("img",{src:o,alt:n})),this.hide())}},tooltip:"Emoticons"})};t.add("emoticons",function(t,e){n(t,e)})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(t,i){var n,o=t.dom,c=t.selection.getSelectedBlocks();c.length&&(n=o.getAttrib(c[0],"dir"),e.each(c,function(t){o.getParent(t.parentNode,'*[dir="'+i+'"]',o.getRoot())||o.setAttrib(t,"dir",n!==i?i:null)}),t.nodeChanged())},n=function(t){t.addCommand("mceDirectionLTR",function(){i(t,"ltr")}),t.addCommand("mceDirectionRTL",function(){i(t,"rtl")})},o=function(t){var i=[];return e.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(e){i.push(e+"[dir="+t+"]")}),i.join(",")},c=function(t){t.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:o("ltr")}),t.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:o("rtl")})};t.add("directionality",function(t){n(t),c(t)})}();!function(){"use strict";var t=function(n){var e=n,o=function(){return e};return{get:o,set:function(t){e=t},clone:function(){return t(o())}}},n=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(t){return{isContextMenuVisible:function(){return t.get()}}},o=function(t){return t.settings.contextmenu_never_use_native},r=function(t){return t.getParam("contextmenu","link openlink image inserttable | cell row column deletetable")},i=tinymce.util.Tools.resolve("tinymce.Env"),u=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=function(t,n){return{x:t,y:n}},l=function(t,n,e){return c(t.x+n,t.y+e)},s=function(t,n){if(t&&"static"!==u.DOM.getStyle(t,"position",!0)){var e=u.DOM.getPos(t),o=e.x-t.scrollLeft,r=e.y-t.scrollTop;return l(n,-o,-r)}return l(n,0,0)},a=function(t){return i.container},f=function(t,n){if(t.inline)return s(a(),c((f=n).pageX,f.pageY));var e,o,r,i,f,m=(e=t.getContentAreaContainer(),o=c((i=n).clientX,i.clientY),r=u.DOM.getPos(e),l(o,r.x,r.y));return s(a(),m)},m=tinymce.util.Tools.resolve("tinymce.ui.Factory"),v=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,n,e,o){null===o.get()?o.set(function(t,n){var e,o,i=[];o=r(t),v.each(o.split(/[ ,]/),function(n){var e=t.menuItems[n];"|"===n&&(e={text:n}),e&&(e.shortcut="",i.push(e))});for(var u=0;u<i.length;u++)"|"===i[u].text&&(0!==u&&u!==i.length-1||i.splice(u,1));return(e=m.create("menu",{items:i,context:"contextmenu",classes:"contextmenu"}).renderTo()).on("hide",function(t){t.control===this&&n.set(!1)}),t.on("remove",function(){e.remove(),e=null}),e}(t,e)):o.get().show(),o.get().moveTo(n.x,n.y),e.set(!0)},y=function(t,n,e){t.on("contextmenu",function(r){var i;i=t,(!r.ctrlKey||o(i))&&(r.preventDefault(),g(t,f(t,r),n,e))})};n.add("contextmenu",function(n){var o=t(null),r=t(!1);return y(n,r,o),e(r)})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Color"),i=function(e,n){e.find("#preview")[0].getEl().style.background=n},t=function(e,t){var l=n(t),a=l.toRgb();e.fromJSON({r:a.r,g:a.g,b:a.b,hex:l.toHex().substr(1)}),i(e,l.toHex())},l=function(e,n,l){var a=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:l,onchange:function(){var e=this.rgb();a&&(a.find("#r").value(e.r),a.find("#g").value(e.g),a.find("#b").value(e.b),a.find("#hex").value(this.value().substr(1)),i(a,this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,n,i=a.find("colorpicker")[0];if(e=this.name(),n=this.value(),"hex"===e)return t(a,n="#"+n),void i.value(n);n={r:a.find("#r").value(),g:a.find("#g").value(),b:a.find("#b").value()},i.value(n),t(a,n)}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){n("#"+a.toJSON().hex)}});t(a,l)};e.add("colorpicker",function(e){e.settings.color_picker_callback||(e.settings.color_picker_callback=function(n,i){l(e,n,i)})})}();!function(){"use strict";var e=function(t){var a=t,n=function(){return a};return{get:n,set:function(e){a=e},clone:function(){return e(n())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=function(e){return e.settings.codesample_content_css},i=function(e){return e.settings.codesample_languages},r=function(e){return Math.min(a.DOM.getViewPort().w,e.getParam("codesample_dialog_width",800))},s=function(e){return Math.min(a.DOM.getViewPort().w,e.getParam("codesample_dialog_height",650))},o={},l=void 0!==o?o:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},c=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=l.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){switch(t.util.type(e)){case"Object":var a={};for(var n in e)e.hasOwnProperty(n)&&(a[n]=t.util.clone(e[n]));return a;case"Array":return e.map&&e.map(function(e){return t.util.clone(e)})}return e}},languages:{extend:function(e,a){var n=t.util.clone(t.languages[e]);for(var i in a)n[i]=a[i];return n},insertBefore:function(e,a,n,i){var r=(i=i||t.languages)[e];if(2===arguments.length){for(var s in n=arguments[1])n.hasOwnProperty(s)&&(r[s]=n[s]);return r}var o={};for(var l in r)if(r.hasOwnProperty(l)){if(l===a)for(var s in n)n.hasOwnProperty(s)&&(o[s]=n[s]);o[l]=r[l]}return t.languages.DFS(t.languages,function(t,a){a===i[e]&&t!==e&&(this[t]=o)}),i[e]=o},DFS:function(e,a,n){for(var i in e)e.hasOwnProperty(i)&&(a.call(e,i,e[i],n||i),"Object"===t.util.type(e[i])?t.languages.DFS(e[i],a):"Array"===t.util.type(e[i])&&t.languages.DFS(e[i],a,i))}},plugins:{},highlightAll:function(e,a){for(var n=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'),i=0,r=void 0;r=n[i++];)t.highlightElement(r,!0===e,a)},highlightElement:function(a,n,i){for(var r,s,o=a;o&&!e.test(o.className);)o=o.parentNode;o&&(r=(o.className.match(e)||[,""])[1],s=t.languages[r]),a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+r,o=a.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+r);var c=a.textContent,u={element:a,language:r,grammar:s,code:c};if(c&&s)if(t.hooks.run("before-highlight",u),n&&l.Worker){var g=new Worker(t.filename);g.onmessage=function(e){u.highlightedCode=e.data,t.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,i&&i.call(u.element),t.hooks.run("after-highlight",u),t.hooks.run("complete",u)},g.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=t.highlight(u.code,u.grammar,u.language),t.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,i&&i.call(a),t.hooks.run("after-highlight",u),t.hooks.run("complete",u);else t.hooks.run("complete",u)},highlight:function(e,n,i){var r=t.tokenize(e,n);return a.stringify(t.util.encode(r),i)},tokenize:function(e,a,n){var i=t.Token,r=[e],s=a.rest;if(s){for(var o in s)a[o]=s[o];delete a.rest}e:for(var o in a)if(a.hasOwnProperty(o)&&a[o]){var l=a[o];l="Array"===t.util.type(l)?l:[l];for(var c=0;c<l.length;++c){var u=l[c],g=u.inside,d=!!u.lookbehind,p=0,f=u.alias;u=u.pattern||u;for(var h=0;h<r.length;h++){var m=r[h];if(r.length>e.length)break e;if(!(m instanceof i)){u.lastIndex=0;var b=u.exec(m);if(b){d&&(p=b[1].length);var y=b.index-1+p,v=y+(b=b[0].slice(p)).length,k=m.slice(0,y+1),w=m.slice(v+1),x=[h,1];k&&x.push(k);var S=new i(o,g?t.tokenize(b,g):b,f);x.push(S),w&&x.push(w),Array.prototype.splice.apply(r,x)}}}}}return r},hooks:{all:{},add:function(e,a){var n=t.hooks.all;n[e]=n[e]||[],n[e].push(a)},run:function(e,a){var n=t.hooks.all[e];if(n&&n.length)for(var i=0,r=void 0;r=n[i++];)r(a)}}},a=t.Token=function(e,t,a){this.type=e,this.content=t,this.alias=a};if(a.stringify=function(e,n,i){if("string"==typeof e)return e;if("Array"===t.util.type(e))return e.map(function(t){return a.stringify(t,n,e)}).join("");var r={type:e.type,content:a.stringify(e.content,n,i),tag:"span",classes:["token",e.type],attributes:{},language:n,parent:i};if("comment"===r.type&&(r.attributes.spellcheck="true"),e.alias){var s="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(r.classes,s)}t.hooks.run("wrap",r);var o="";for(var l in r.attributes)o+=(o?" ":"")+l+'="'+(r.attributes[l]||"")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'" '+o+">"+r.content+"</"+r.tag+">"},!l.document)return l.addEventListener?(l.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,i=a.code,r=a.immediateClose;l.postMessage(t.highlight(i,t.languages[n],n)),r&&l.close()},!1),l.Prism):l.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=c),"undefined"!=typeof global&&(global.Prism=c),c.languages.markup={comment:/<!--[\w\W]*?-->/,prolog:/<\?[\w\W]+?\?>/,doctype:/<!DOCTYPE[\w\W]+?>/,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},c.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),c.languages.xml=c.languages.markup,c.languages.html=c.languages.markup,c.languages.mathml=c.languages.markup,c.languages.svg=c.languages.markup,c.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},c.languages.css.atrule.inside.rest=c.util.clone(c.languages.css),c.languages.markup&&(c.languages.insertBefore("markup","tag",{style:{pattern:/<style[\w\W]*?>[\w\W]*?<\/style>/i,inside:{tag:{pattern:/<style[\w\W]*?>|<\/style>/i,inside:c.languages.markup.tag.inside},rest:c.languages.css},alias:"language-css"}}),c.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:c.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:c.languages.css}},alias:"language-css"}},c.languages.markup.tag)),c.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},c.languages.javascript=c.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),c.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),c.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:c.languages.javascript}},string:/[\s\S]+/}}}),c.languages.markup&&c.languages.insertBefore("markup","tag",{script:{pattern:/<script[\w\W]*?>[\w\W]*?<\/script>/i,inside:{tag:{pattern:/<script[\w\W]*?>|<\/script>/i,inside:c.languages.markup.tag.inside},rest:c.languages.javascript},alias:"language-javascript"}}),c.languages.js=c.languages.javascript,c.languages.c=c.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),c.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete c.languages.c["class-name"],delete c.languages.c["boolean"],c.languages.csharp=c.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),c.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),c.languages.cpp=c.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),c.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),c.languages.java=c.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),c.languages.php=c.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),c.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),c.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),c.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),c.languages.markup&&(c.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(t){return e.tokenStack.push(t),"{{{PHP"+e.tokenStack.length+"}}}"}))}),c.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),c.hooks.add("after-highlight",function(e){if("php"===e.language){for(var t=0,a=void 0;a=e.tokenStack[t];t++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(t+1)+"}}}",c.highlight(a,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),c.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'<span class="token php">$1</span>'))}),c.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:c.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),c.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(e){e.languages.ruby=e.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var t={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:t}},{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:t}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:t}}]}(c);var u={isCodeSample:function(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")},trimArg:function(e){return function(t,a){return e(a)}}},g=function(e){var t=e.selection.getNode();return u.isCodeSample(t)?t:null},d=g,p=function(e,t,n){e.undoManager.transact(function(){var i=g(e);n=a.DOM.encode(n),i?(e.dom.setAttrib(i,"class","language-"+t),i.innerHTML=n,c.highlightElement(i),e.selection.select(i)):(e.insertContent('<pre id="__new" class="language-'+t+'">'+n+"</pre>"),e.selection.select(e.$("#__new").removeAttr("id")[0]))})},f=function(e){var t=g(e);return t?t.textContent:""},h=function(e){var t=i(e);return t||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}]},m=function(e){var t,a=d(e);return a&&(t=a.className.match(/language-(\w+)/))?t[1]:""},b=function(e){var t=r(e),a=s(e),n=m(e),i=h(e),o=f(e);e.windowManager.open({title:"Insert/Edit code sample",minWidth:t,minHeight:a,layout:"flex",direction:"column",align:"stretch",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:n,values:i},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:o,autofocus:!0}],onSubmit:function(t){p(e,t.data.language,t.data.code)}})},y=function(e){e.addCommand("codesample",function(){var t=e.selection.getNode();e.selection.isCollapsed()||u.isCodeSample(t)?b(e):e.formatter.toggle("code")})},v=function(e){var t=e.$;e.on("PreProcess",function(e){t("pre[contenteditable=false]",e.node).filter(u.trimArg(u.isCodeSample)).each(function(e,a){var n=t(a),i=a.textContent;n.attr("class",t.trim(n.attr("class"))),n.removeAttr("contentEditable"),n.empty().append(t("<code></code>").each(function(){this.textContent=i}))})}),e.on("SetContent",function(){var a=t("pre").filter(u.trimArg(u.isCodeSample)).filter(function(e,t){return"false"!==t.contentEditable});a.length&&e.undoManager.transact(function(){a.each(function(a,n){t(n).find("br").each(function(t,a){a.parentNode.replaceChild(e.getDoc().createTextNode("\n"),a)}),n.contentEditable=!1,n.innerHTML=e.dom.encode(n.textContent),c.highlightElement(n),n.className=t.trim(n.className)})})})},k=function(e,t,a,i){var r,s=n(e);e.inline&&a.get()||!e.inline&&i.get()||(e.inline?a.set(!0):i.set(!0),!1!==s&&(r=e.dom.create("link",{rel:"stylesheet",href:s||t+"/css/prism.css"}),e.getDoc().getElementsByTagName("head")[0].appendChild(r)))},w=function(e){e.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),e.addMenuItem("codesample",{cmd:"codesample",text:"Code sample",icon:"codesample"})},x=e(!1);t.add("codesample",function(t,a){var n=e(!1);v(t),w(t),y(t),t.on("init",function(){k(t,a,x,n)}),t.on("dblclick",function(e){u.isCodeSample(e.target)&&b(t)})})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),e=function(t){return t.getParam("code_dialog_width",600)},o=function(t){return t.getParam("code_dialog_height",Math.min(n.DOM.getViewPort().h-200,500))},i=function(t,n){t.focus(),t.undoManager.transact(function(){t.setContent(n)}),t.selection.setCursorLocation(),t.nodeChanged()},c=function(t){return t.getContent({source_view:!0})},d=function(t){var n=e(t),d=o(t);t.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:n,minHeight:d,spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(n){i(t,n.data.code)}}).find("#code").value(c(t))},u=function(t){t.addCommand("mceCodeEditor",function(){d(t)})},a=function(t){t.addButton("code",{icon:"code",tooltip:"Source code",onclick:function(){d(t)}}),t.addMenuItem("code",{icon:"code",text:"Source code",onclick:function(){d(t)}})};t.add("code",function(t){return u(t),a(t),{}})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e,t){return e.fire("insertCustomChar",{chr:t})},a=function(e,a){var i=t(e,a).chr;e.execCommand("mceInsertContent",!1,i)},i=tinymce.util.Tools.resolve("tinymce.util.Tools"),r=function(e){return e.settings.charmap},n=function(e){return e.settings.charmap_append},o=i.isArray,l=function(e){return o(e)?[].concat((t=e,i.grep(t,function(e){return o(e)&&2===e.length}))):"function"==typeof e?e():[];var t},c=function(e){return function(e,t){var a=r(e);a&&(t=l(a));var i=n(e);return i?[].concat(t).concat(l(i)):t}(e,[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]])},s=function(e){return{getCharMap:function(){return c(e)},insertChar:function(t){a(e,t)}}},u=function(e){var t,a,i,r=Math.min(e.length,25),n=Math.ceil(e.length/r);for(t='<table role="presentation" cellspacing="0" class="mce-charmap"><tbody>',i=0;i<n;i++){for(t+="<tr>",a=0;a<r;a++){var o=i*r+a;if(o<e.length){var l=e[o],c=parseInt(l[0],10),s=l?String.fromCharCode(c):" ";t+='<td title="'+l[1]+'"><div tabindex="-1" title="'+l[1]+'" role="button" data-chr="'+c+'">'+s+"</div></td>"}else t+="<td />"}t+="</tr>"}return t+="</tbody></table>"},d=function(e){for(;e;){if("TD"===e.nodeName)return e;e=e.parentNode}},m=function(e){var t,i={type:"container",html:u(c(e)),onclick:function(i){var r=i.target;if(/^(TD|DIV)$/.test(r.nodeName)){var n=d(r).firstChild;if(n&&n.hasAttribute("data-chr")){var o=n.getAttribute("data-chr"),l=parseInt(o,10);isNaN(l)||a(e,String.fromCharCode(l)),i.ctrlKey||t.close()}}},onmouseover:function(e){var a=d(e.target);a&&a.firstChild?(t.find("#preview").text(a.firstChild.firstChild.data),t.find("#previewTitle").text(a.title)):(t.find("#preview").text(" "),t.find("#previewTitle").text(" "))}};t=e.windowManager.open({title:"Special character",spacing:10,padding:10,items:[i,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"spacer",minHeight:20},{type:"label",name:"previewTitle",text:" ",style:"white-space: pre-wrap;",border:1,minWidth:140}]}],buttons:[{text:"Close",onclick:function(){t.close()}}]})},g=function(e){e.addCommand("mceShowCharmap",function(){m(e)})},p=function(e){e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"})};e.add("charmap",function(e){return g(e),p(e),s(e)})}();!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(o){o=t.trim(o);var e=function(t,e){o=o.replace(t,e)};return e(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/<font>(.*?)<\/font>/gi,"$1"),e(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"),e(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"),e(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"),e(/<u>/gi,"[u]"),e(/<blockquote[^>]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/<br \/>/gi,"\n"),e(/<br\/>/gi,"\n"),e(/<br>/gi,"\n"),e(/<p>/gi,""),e(/<\/p>/gi,"\n"),e(/ |\u00a0/gi," "),e(/"/gi,'"'),e(/</gi,"<"),e(/>/gi,">"),e(/&/gi,"&"),o},i=function(o){o=t.trim(o);var e=function(t,e){o=o.replace(t,e)};return e(/\n/gi,"<br />"),e(/\[b\]/gi,"<strong>"),e(/\[\/b\]/gi,"</strong>"),e(/\[i\]/gi,"<em>"),e(/\[\/i\]/gi,"</em>"),e(/\[u\]/gi,"<u>"),e(/\[\/u\]/gi,"</u>"),e(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>'),e(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>'),e(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />'),e(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>'),e(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span> '),e(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span> '),o};o.add("bbcode",function(){return{init:function(o){o.on("beforeSetContent",function(o){o.content=i(o.content)}),o.on("postProcess",function(o){o.set&&(o.content=i(o.content)),o.get&&(o.content=e(o.content))})}}})}();!function(){"use strict";var t=function(e){var r=e,n=function(){return r};return{get:n,set:function(t){r=t},clone:function(){return t(n())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),n=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(t){return t.fire("RestoreDraft")},o=function(t){return t.fire("StoreDraft")},i=function(t){return t.fire("RemoveDraft")},s=function(t,e){return((t=/^(\d+)([ms]?)$/.exec(""+(t||e)))[2]?{s:1e3,m:6e4}[t[2]]:1)*parseInt(t,10)},u=function(t){return t.getParam("autosave_ask_before_unload",!0)},f=function(t){var e=t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-");return e=(e=(e=(e=e.replace(/\{path\}/g,document.location.pathname)).replace(/\{query\}/g,document.location.search)).replace(/\{hash\}/g,document.location.hash)).replace(/\{id\}/g,t.id)},c=function(t){return s(t.settings.autosave_interval,"30s")},l=function(t){return s(t.settings.autosave_retention,"20m")},m=function(t,e){var r=t.settings.forced_root_block;return""===(e=n.trim(void 0===e?t.getBody().innerHTML:e))||new RegExp("^<"+r+"[^>]*>((\xa0| |[ \t]|<br[^>]*>)+?|)</"+r+">|<br>$","i").test(e)},v=function(t){var e=parseInt(r.getItem(f(t)+"time"),10)||0;return!((new Date).getTime()-e>l(t)&&(d(t,!1),1))},d=function(t,e){var n=f(t);r.removeItem(n+"draft"),r.removeItem(n+"time"),!1!==e&&i(t)},D=function(t){var e=f(t);!m(t)&&t.isDirty()&&(r.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),r.setItem(e+"time",(new Date).getTime().toString()),o(t))},g=function(t){var e=f(t);v(t)&&(t.setContent(r.getItem(e+"draft"),{format:"raw"}),a(t))},y={isEmpty:m,hasDraft:v,removeDraft:d,storeDraft:D,restoreDraft:g,startStoreDraft:function(t,e){var r=c(t);e.get()||(setInterval(function(){t.removed||D(t)},r),e.set(!0))},restoreLastDraft:function(t){t.undoManager.transact(function(){g(t),d(t)}),t.focus()}},p=function(t,e){return function(){var r=Array.prototype.slice.call(arguments);return t.apply(null,[e].concat(r))}},h=function(t){return{hasDraft:p(y.hasDraft,t),storeDraft:p(y.storeDraft,t),restoreDraft:p(y.restoreDraft,t),removeDraft:p(y.removeDraft,t),isEmpty:p(y.isEmpty,t)}},_=tinymce.util.Tools.resolve("tinymce.EditorManager");_._beforeUnloadHandler=function(){var t;return n.each(_.get(),function(e){e.plugins.autosave&&e.plugins.autosave.storeDraft(),!t&&e.isDirty()&&u(e)&&(t=e.translate("You have unsaved changes are you sure you want to navigate away?"))}),t};var b=function(t){window.onbeforeunload=_._beforeUnloadHandler},I=function(t,e){return function(r){var n=r.control;n.disabled(!y.hasDraft(t)),t.on("StoreDraft RestoreDraft RemoveDraft",function(){n.disabled(!y.hasDraft(t))}),y.startStoreDraft(t,e)}},w=function(t,e){t.addButton("restoredraft",{title:"Restore last draft",onclick:function(){y.restoreLastDraft(t)},onPostRender:I(t,e)}),t.addMenuItem("restoredraft",{text:"Restore last draft",onclick:function(){y.restoreLastDraft(t)},onPostRender:I(t,e),context:"file"})};e.add("autosave",function(e){var r=t(!1);return b(e),w(e,r),h(e)})}();!function(){"use strict";var t=function(e){var n=e,i=function(){return n};return{get:i,set:function(t){n=t},clone:function(){return t(i())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.Env"),i=tinymce.util.Tools.resolve("tinymce.util.Delay"),o=function(t){return parseInt(t.getParam("autoresize_min_height",t.getElement().offsetHeight),10)},r=function(t){return parseInt(t.getParam("autoresize_max_height",0),10)},a=function(t){return t.getParam("autoresize_overflow_padding",1)},u=function(t){return t.getParam("autoresize_bottom_margin",50)},s=function(t){return t.getParam("autoresize_on_init",!0)},l=function(t,e,n,o,r){i.setEditorTimeout(t,function(){c(t,e),n--?l(t,e,n,o,r):r&&r()},o)},g=function(t,e){var n=t.getBody();n&&(n.style.overflowY=e?"":"hidden",e||(n.scrollTop=0))},c=function(t,e){var i,a,u,s,l,f,d,m,p,y,h,v=t.dom;if(a=t.getDoc())if((S=t).plugins.fullscreen&&S.plugins.fullscreen.isFullscreen())g(t,!0);else{var S;u=a.body,s=o(t),f=v.getStyle(u,"margin-top",!0),d=v.getStyle(u,"margin-bottom",!0),m=v.getStyle(u,"padding-top",!0),p=v.getStyle(u,"padding-bottom",!0),y=v.getStyle(u,"border-top-width",!0),h=v.getStyle(u,"border-bottom-width",!0),l=u.offsetHeight+parseInt(f,10)+parseInt(d,10)+parseInt(m,10)+parseInt(p,10)+parseInt(y,10)+parseInt(h,10),(isNaN(l)||l<=0)&&(l=n.ie?u.scrollHeight:n.webkit&&0===u.clientHeight?0:u.offsetHeight),l>o(t)&&(s=l);var _=r(t);_&&l>_?(s=_,g(t,!0)):g(t,!1),s!==e.get()&&(i=s-e.get(),v.setStyle(t.iframeElement,"height",s+"px"),e.set(s),n.webkit&&i<0&&c(t,e))}},f={setup:function(t,e){t.on("init",function(){var e,n,i=t.dom;e=a(t),n=u(t),!1!==e&&i.setStyles(t.getBody(),{paddingLeft:e,paddingRight:e}),!1!==n&&i.setStyles(t.getBody(),{paddingBottom:n})}),t.on("nodechange setcontent keyup FullscreenStateChanged",function(n){c(t,e)}),s(t)&&t.on("init",function(){l(t,e,20,100,function(){l(t,e,5,1e3)})})},resize:c},d=function(t,e){t.addCommand("mceAutoResize",function(){f.resize(t,e)})};e.add("autoresize",function(e){if(!e.inline){var n=t(0);d(e,n),f.setup(e,n)}})}();!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),n=function(e){return e.getParam("autolink_pattern",/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i)},i=function(e){return e.getParam("default_link_target","")},o=function(e,t){if(t<0&&(t=0),3===e.nodeType){var n=e.data.length;t>n&&(t=n)}return t},r=function(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setStart(t,o(t,n)):e.setStartBefore(t)},a=function(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setEnd(t,o(t,n)):e.setEndAfter(t)},d=function(e,t,o){var d,f,s,l,c,u,g,h,C,m,y=n(e),k=i(e);if("A"!==e.selection.getNode().tagName){if((d=e.selection.getRng(!0).cloneRange()).startOffset<5){if(!(h=d.endContainer.previousSibling)){if(!d.endContainer.firstChild||!d.endContainer.firstChild.nextSibling)return;h=d.endContainer.firstChild.nextSibling}if(C=h.length,r(d,h,C),a(d,h,C),d.endOffset<5)return;f=d.endOffset,l=h}else{if(3!==(l=d.endContainer).nodeType&&l.firstChild){for(;3!==l.nodeType&&l.firstChild;)l=l.firstChild;3===l.nodeType&&(r(d,l,0),a(d,l,l.nodeValue.length))}f=1===d.endOffset?2:d.endOffset-1-t}s=f;do{r(d,l,f>=2?f-2:0),a(d,l,f>=1?f-1:0),f-=1,m=d.toString()}while(" "!==m&&""!==m&&160!==m.charCodeAt(0)&&f-2>=0&&m!==o);var p;(p=d.toString())===o||" "===p||160===p.charCodeAt(0)?(r(d,l,f),a(d,l,s),f+=1):0===d.startOffset?(r(d,l,0),a(d,l,s)):(r(d,l,f),a(d,l,s)),"."===(u=d.toString()).charAt(u.length-1)&&a(d,l,s-1),(g=(u=d.toString().trim()).match(y))&&("www."===g[1]?g[1]="http://www.":/@$/.test(g[1])&&!/^mailto:/.test(g[1])&&(g[1]="mailto:"+g[1]),c=e.selection.getBookmark(),e.selection.setRng(d),e.execCommand("createlink",!1,g[1]+g[2]),k&&e.dom.setAttrib(e.selection.getNode(),"target",k),e.selection.moveToBookmark(c),e.nodeChanged())}},f=function(e){var n;e.on("keydown",function(t){13!==t.keyCode||d(e,-1,"")}),t.ie?e.on("focus",function(){if(!n){n=!0;try{e.execCommand("AutoUrlDetect",!1,!0)}catch(t){}}}):(e.on("keypress",function(t){41!==t.keyCode||d(e,-1,"(")}),e.on("keyup",function(t){32!==t.keyCode||d(e,0,"")}))};e.add("autolink",function(e){f(e)})}();!function(){"use strict";var t=function(t){return/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)},e=function(t){var e=t.selection.getNode();return"A"===e.tagName&&""===t.dom.getAttrib(e,"href")?e.id||e.name:""},n=function(t,e){var n=t.selection.getNode();"A"===n.tagName&&""===t.dom.getAttrib(n,"href")?(n.removeAttribute("name"),n.id=e):(t.focus(),t.selection.collapse(!0),t.execCommand("mceInsertContent",!1,t.dom.createHTML("a",{id:e})))},o=function(o){var r=e(o);o.windowManager.open({title:"Anchor",body:{type:"textbox",name:"id",size:40,label:"Id",value:r},onsubmit:function(e){var r,a,i=e.data.id;r=o,(t(a=i)?(n(r,a),0):(r.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),1))&&e.preventDefault()}})},r=function(t){t.addCommand("mceAnchor",function(){o(t)})},a=function(t){return function(e){for(var n=0;n<e.length;n++)(o=e[n]).attr("href")||!o.attr("id")&&!o.attr("name")||o.firstChild||e[n].attr("contenteditable",t);var o}},i=function(t){t.on("PreInit",function(){t.parser.addNodeFilter("a",a("false")),t.serializer.addNodeFilter("a",a(null))})},c=function(t){t.addButton("anchor",{icon:"anchor",tooltip:"Anchor",cmd:"mceAnchor",stateSelector:"a:not([href])"}),t.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",cmd:"mceAnchor"})};tinymce.util.Tools.resolve("tinymce.PluginManager").add("anchor",function(t){i(t),r(t),c(t)})}();!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(t,e,n){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===n?null:{"list-style-type":n})},r=function(t){t.addCommand("ApplyUnorderedListStyle",function(e,r){n(t,"UL",r["list-style-type"])}),t.addCommand("ApplyOrderedListStyle",function(e,r){n(t,"OL",r["list-style-type"])})},o=function(t){var e=t.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");return e?e.split(/[ ,]/):[]},i=function(t){var e=t.getParam("advlist_bullet_styles","default,circle,disc,square");return e?e.split(/[ ,]/):[]},l=function(t){return t&&/^(TH|TD)$/.test(t.nodeName)},a=function(t){return function(e){return e&&/^(OL|UL|DL)$/.test(e.nodeName)&&(r=e,(n=t).$.contains(n.getBody(),r));var n,r}},s=function(t){var e=t.dom.getParent(t.selection.getNode(),"ol,ul");return t.dom.getStyle(e,"listStyleType")||""},u=function(t){return e.map(t,function(t){return{text:t.replace(/\-/g," ").replace(/\b\w/g,function(t){return t.toUpperCase()}),data:"default"===t?"":t}})},c=function(t,n){return function(r){var o=r.control;t.on("NodeChange",function(r){var i=function(t,e){for(var n=0;n<t.length;n++)if(e(t[n]))return n;return-1}(r.parents,l),s=-1!==i?r.parents.slice(0,i):r.parents,u=e.grep(s,a(t));o.active(u.length>0&&u[0].nodeName===n)})}},d=function(t,e,r,o,i,l){var a;t.addButton(e,{active:!1,type:"splitbutton",tooltip:r,menu:u(l),onPostRender:c(t,i),onshow:(a=t,function(t){var e=s(a);t.control.items().each(function(t){t.active(t.settings.data===e)})}),onselect:function(e){n(t,i,e.control.settings.data)},onclick:function(){t.execCommand(o)}})},p=function(t,e,n,r,o,i){var l,a,s,u,p;i.length>0?d(t,e,n,r,o,i):(a=e,s=n,u=r,p=o,(l=t).addButton(a,{active:!1,type:"button",tooltip:s,onPostRender:c(l,p),onclick:function(){l.execCommand(u)}}))},f=function(t){p(t,"numlist","Numbered list","InsertOrderedList","OL",o(t)),p(t,"bullist","Bullet list","InsertUnorderedList","UL",i(t))};t.add("advlist",function(t){var n,o,i;o="lists",i=(n=t).settings.plugins?n.settings.plugins:"",-1!==e.inArray(i.split(/[ ,]/),o)&&(f(t),r(t))})}();!function(){"use strict";var e,t,n,i,r,o=tinymce.util.Tools.resolve("tinymce.ThemeManager"),s=tinymce.util.Tools.resolve("tinymce.EditorManager"),a=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=function(e){return!1!==u(e)},u=function(e){return e.getParam("menubar")},c=function(e){return e.getParam("toolbar_items_size")},d=function(e){return e.getParam("menu")},f=function(e){return!1===e.settings.skin},h=function(e){var t=e.getParam("resize","vertical");return!1===t?"none":"both"===t?"both":"vertical"},m=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),g=tinymce.util.Tools.resolve("tinymce.ui.Factory"),p=tinymce.util.Tools.resolve("tinymce.util.I18n"),v=function(e){return e.fire("SkinLoaded")},b=function(e){return e.fire("ResizeEditor")},y=function(e){return e.fire("BeforeRenderUI")},x=function(e,t){return function(){var n=e.find(t)[0];n&&n.focus(!0)}},w=function(e,t){e.shortcuts.add("Alt+F9","",x(t,"menubar")),e.shortcuts.add("Alt+F10,F10","",x(t,"toolbar")),e.shortcuts.add("Alt+F11","",x(t,"elementpath")),t.on("cancel",function(){e.focus()})},_=tinymce.util.Tools.resolve("tinymce.Env"),R=tinymce.util.Tools.resolve("tinymce.geom.Rect"),C=tinymce.util.Tools.resolve("tinymce.util.Delay"),k=function(e){return function(){return e}},E={noop:function(){},noarg:function(e){return function(){return e()}},compose:function(e,t){return function(){return e(t.apply(null,arguments))}},constant:k,identity:function(e){return e},tripleEquals:function(e,t){return e===t},curry:function(e){for(var t=new Array(arguments.length-1),n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){for(var n=new Array(arguments.length),i=0;i<n.length;i++)n[i]=arguments[i];var r=t.concat(n);return e.apply(null,r)}},not:function(e){return function(){return!e.apply(null,arguments)}},die:function(e){return function(){throw new Error(e)}},apply:function(e){return e()},call:function(e){e()},never:k(!1),always:k(!0)},H=E.never,S=E.always,M=function(){return T},T=(i={fold:function(e,t){return e()},is:H,isSome:H,isNone:S,getOr:n=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},or:n,orThunk:t,map:M,ap:M,each:function(){},bind:M,flatten:M,exists:H,forall:S,filter:M,equals:e=function(e){return e.isNone()},equals_:e,toArray:function(){return[]},toString:E.constant("none()")},Object.freeze&&Object.freeze(i),i),P=function(e){var t=function(){return e},n=function(){return r},i=function(t){return t(e)},r={fold:function(t,n){return n(e)},is:function(t){return e===t},isSome:S,isNone:H,getOr:t,getOrThunk:t,getOrDie:t,or:n,orThunk:n,map:function(t){return P(t(e))},ap:function(t){return t.fold(M,function(t){return P(t(e))})},each:function(t){t(e)},bind:i,flatten:t,exists:i,forall:i,filter:function(t){return t(e)?r:T},equals:function(t){return t.is(e)},equals_:function(t,n){return t.fold(H,function(t){return n(e,t)})},toArray:function(){return[e]},toString:function(){return"some("+e+")"}};return r},W={some:P,none:M,from:function(e){return null===e||e===undefined?T:P(e)}},D=function(){var e=_.container;if(e&&"static"!==m.DOM.getStyle(e,"position",!0)){var t=m.DOM.getPos(e),n=e.scrollLeft-t.x,i=e.scrollTop-t.y;return W.some({x:n,y:i})}return W.none()},N=function(e,t,n){var i,r=[];if(t)return a.each(t.split(/[ ,]/),function(t){var o,s=function(){var n=e.selection;t.settings.stateSelector&&n.selectorChanged(t.settings.stateSelector,function(e){t.active(e)},!0),t.settings.disabledStateSelector&&n.selectorChanged(t.settings.disabledStateSelector,function(e){t.disabled(e)})};"|"===t?i=null:(i||(i={type:"buttongroup",items:[]},r.push(i)),e.buttons[t]&&(o=t,"function"==typeof(t=e.buttons[o])&&(t=t()),t.type=t.type||"button",t.size=n,t=g.create(t),i.items.push(t),e.initialized?s():e.on("init",s)))}),{type:"toolbar",layout:"flow",items:r}},A=N,B=function(e,t){var n,i,r=[];if(a.each(!1===(i=(n=e).getParam("toolbar"))?[]:a.isArray(i)?a.grep(i,function(e){return e.length>0}):function(e,t){for(var n=[],i=1;i<10;i++){var r=e["toolbar"+i];if(!r)break;n.push(r)}var o=e.toolbar?[e.toolbar]:[t];return n.length>0?n:o}(n.settings,"undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image"),function(n){var i;(i=n)&&r.push(N(e,i,t))}),r.length)return{type:"panel",layout:"stack",classes:"toolbar-grp",ariaRoot:!0,ariaRemember:!0,items:r}},O=m.DOM,z=function(e){return{left:e.x,top:e.y,width:e.w,height:e.h,right:e.x+e.w,bottom:e.y+e.h}},L=function(e,t){e.moveTo(t.left,t.top)},I=function(e,t,n,i,r,o){return o=z({x:t,y:n,w:o.w,h:o.h}),e&&(o=e({elementRect:z(i),contentAreaRect:z(r),panelRect:o})),o},F=function(e){var t,n=function(){return e.contextToolbars||[]},i=function(t,n){var i,r,o,s,l,u,c,d=e.getParam("inline_toolbar_position_handler");if(!e.removed){if(!t||!t.toolbar.panel)return f=e,void a.each(f.contextToolbars,function(e){e.panel&&e.panel.hide()});var f,h,m,g,p;c=["bc-tc","tc-bc","tl-bl","bl-tl","tr-br","br-tr"],l=t.toolbar.panel,n&&l.show(),h=t.element,m=O.getPos(e.getContentAreaContainer()),g=e.dom.getRect(h),"BODY"===(p=e.dom.getRoot()).nodeName&&(g.x-=p.ownerDocument.documentElement.scrollLeft||p.scrollLeft,g.y-=p.ownerDocument.documentElement.scrollTop||p.scrollTop),g.x+=m.x,g.y+=m.y,o=g,r=O.getRect(l.getEl()),s=O.getRect(e.getContentAreaContainer()||e.getBody());var v,b,y,x=D().getOr({x:0,y:0});if(o.x+=x.x,o.y+=x.y,r.x+=x.x,r.y+=x.y,s.x+=x.x,s.y+=x.y,"inline"!==O.getStyle(t.element,"display",!0)){var w=t.element.getBoundingClientRect();o.w=w.width,o.h=w.height}e.inline||(s.w=e.getDoc().documentElement.offsetWidth),e.selection.controlSelection.isResizable(t.element)&&o.w<25&&(o=R.inflate(o,0,8)),i=R.findBestRelativePosition(r,o,s,c),o=R.clamp(o,s),i?(u=R.relativePosition(r,o,i),L(l,I(d,u.x,u.y,o,s,r))):(s.h+=r.h,(o=R.intersect(s,o))?(i=R.findBestRelativePosition(r,o,s,["bc-tc","bl-tl","br-tr"]))?(u=R.relativePosition(r,o,i),L(l,I(d,u.x,u.y,o,s,r))):L(l,I(d,o.x,o.y,o,s,r)):l.hide()),v=l,y=function(e,t){return e===t},b=(b=i)?b.substr(0,2):"",a.each({t:"down",b:"up"},function(e,t){v.classes.toggle("arrow-"+e,y(t,b.substr(0,1)))}),a.each({l:"left",r:"right"},function(e,t){v.classes.toggle("arrow-"+e,y(t,b.substr(1,1)))})}},r=function(t){return function(){C.requestAnimationFrame(function(){e.selection&&i(l(e.selection.getNode()),t)})}},o=function(n){var o;if(n.toolbar.panel)return n.toolbar.panel.show(),void i(n);!function(){if(!t){var n=r(!0);t=e.selection.getScrollContainer()||e.getWin(),O.bind(t,"scroll",n),O.bind(_.container,"scroll",n),e.on("remove",function(){O.unbind(t,"scroll",n),O.unbind(_.container,"scroll",n)})}}(),o=g.create({type:"floatpanel",role:"dialog",classes:"tinymce tinymce-inline arrow",ariaLabel:"Inline toolbar",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!0,border:1,items:A(e,n.toolbar.items),oncancel:function(){e.focus()}}),n.toolbar.panel=o,o.renderTo().reflow(),i(n)},s=function(){a.each(n(),function(e){e.panel&&e.panel.hide()})},l=function(t){var i,r,o,s=n();for(i=(o=e.$(t).parents().add(t)).length-1;i>=0;i--)for(r=s.length-1;r>=0;r--)if(s[r].predicate(o[i]))return{toolbar:s[r],element:o[i]};return null};e.on("click keyup setContent ObjectResized",function(t){("setcontent"!==t.type||t.selection)&&C.setEditorTimeout(e,function(){var t;(t=l(e.selection.getNode()))?(s(),o(t)):s()})}),e.on("blur hide contextmenu",s),e.on("ObjectResizeStart",function(){var t=l(e.selection.getNode());t&&t.toolbar.panel&&t.toolbar.panel.hide()}),e.on("ResizeEditor ResizeWindow",r(!0)),e.on("nodeChange",r(!1)),e.on("remove",function(){a.each(n(),function(e){e.panel&&e.panel.remove()}),e.contextToolbars={}}),e.shortcuts.add("ctrl+shift+e > ctrl+shift+p","",function(){var t=l(e.selection.getNode());t&&t.toolbar.panel&&t.toolbar.panel.items()[0].focus()})},V=(r=Array.prototype.indexOf)===undefined?function(e,t){return J(e,t)}:function(e,t){return r.call(e,t)},U=function(e,t){return V(e,t)>-1},Y=function(e,t){for(var n=e.length,i=new Array(n),r=0;r<n;r++){var o=e[r];i[r]=t(o,r,e)}return i},$=function(e,t){for(var n=0,i=e.length;n<i;n++)t(e[n],n,e)},j=function(e,t){for(var n=e.length-1;n>=0;n--)t(e[n],n,e)},q=function(e,t){for(var n=[],i=0,r=e.length;i<r;i++){var o=e[i];t(o,i,e)&&n.push(o)}return n},X=function(e,t){for(var n=0,i=e.length;n<i;n++)if(t(e[n],n,e))return W.some(n);return W.none()},J=function(e,t){for(var n=0,i=e.length;n<i;++n)if(e[n]===t)return n;return-1},G=Array.prototype.push,K=function(e){for(var t=[],n=0,i=e.length;n<i;++n){if(!Array.prototype.isPrototypeOf(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);G.apply(t,e[n])}return t},Z=function(e,t){for(var n=0,i=e.length;n<i;++n)if(!0!==t(e[n],n,e))return!1;return!0},Q=Array.prototype.slice,ee={map:Y,each:$,eachr:j,partition:function(e,t){for(var n=[],i=[],r=0,o=e.length;r<o;r++){var s=e[r];(t(s,r,e)?n:i).push(s)}return{pass:n,fail:i}},filter:q,groupBy:function(e,t){if(0===e.length)return[];for(var n=t(e[0]),i=[],r=[],o=0,s=e.length;o<s;o++){var a=e[o],l=t(a);l!==n&&(i.push(r),r=[]),n=l,r.push(a)}return 0!==r.length&&i.push(r),i},indexOf:function(e,t){var n=V(e,t);return-1===n?W.none():W.some(n)},foldr:function(e,t,n){return j(e,function(e){n=t(n,e)}),n},foldl:function(e,t,n){return $(e,function(e){n=t(n,e)}),n},find:function(e,t){for(var n=0,i=e.length;n<i;n++){var r=e[n];if(t(r,n,e))return W.some(r)}return W.none()},findIndex:X,flatten:K,bind:function(e,t){var n=Y(e,t);return K(n)},forall:Z,exists:function(e,t){return X(e,t).isSome()},contains:U,equal:function(e,t){return e.length===t.length&&Z(e,function(e,n){return e===t[n]})},reverse:function(e){var t=Q.call(e,0);return t.reverse(),t},chunk:function(e,t){for(var n=[],i=0;i<e.length;i+=t){var r=e.slice(i,i+t);n.push(r)}return n},difference:function(e,t){return q(e,function(e){return!U(t,e)})},mapToObject:function(e,t){for(var n={},i=0,r=e.length;i<r;i++){var o=e[i];n[String(o)]=t(o,i)}return n},pure:function(e){return[e]},sort:function(e,t){var n=Q.call(e,0);return n.sort(t),n},range:function(e,t){for(var n=[],i=0;i<e;i++)n.push(t(i));return n},head:function(e){return 0===e.length?W.none():W.some(e[0])},last:function(e){return 0===e.length?W.none():W.some(e[e.length-1])}},te={file:{title:"File",items:"newdocument restoredraft | preview | print"},edit:{title:"Edit",items:"undo redo | cut copy paste pastetext | selectall"},view:{title:"View",items:"code | visualaid visualchars visualblocks | spellchecker | preview fullscreen"},insert:{title:"Insert",items:"image link media template codesample inserttable | charmap hr | pagebreak nonbreaking anchor toc | insertdatetime"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript codeformat | blockformats align | removeformat"},tools:{title:"Tools",items:"spellchecker spellcheckerlanguage | a11ycheck"},table:{title:"Table"},help:{title:"Help"}},ne=function(e,t){return"|"===e?{name:"|",item:{text:"|"}}:t?{name:e,item:t}:null},ie=function(e){return e&&"|"===e.item.text},re=function(e,t,n,i){var r,o,s,l,u,c,d,f;return t?(o=t[i],l=!0):o=te[i],o&&(r={text:o.title},s=[],a.each((o.items||"").split(/[ ,]/),function(t){var n=ne(t,e[t]);n&&s.push(n)}),l||a.each(e,function(e,t){var n,r;e.context!==i||(n=s,r=t,ee.findIndex(n,function(e){return e.name===r}).isSome())||("before"===e.separator&&s.push({name:"|",item:{text:"|"}}),e.prependToContext?s.unshift(ne(t,e)):s.push(ne(t,e)),"after"===e.separator&&s.push({name:"|",item:{text:"|"}}))}),r.menu=ee.map((u=s,c=n,d=ee.filter(u,function(e){return!1===c.hasOwnProperty(e.name)}),f=ee.filter(d,function(e,t,n){return!ie(e)||!ie(n[t-1])}),ee.filter(f,function(e,t,n){return!ie(e)||t>0&&t<n.length-1})),function(e){return e.item}),!r.menu.length)?null:r},oe=function(e){for(var t,n=[],i=function(e){var t,n=[],i=d(e);if(i)for(t in i)n.push(t);else for(t in te)n.push(t);return n}(e),r=a.makeMap((t=e,t.getParam("removed_menuitems","")).split(/[ ,]/)),o=u(e),s="string"==typeof o?o.split(/[ ,]/):i,l=0;l<s.length;l++){var c=s[l],f=re(e.menuItems,d(e),r,c);f&&n.push(f)}return n},se=m.DOM,ae=function(e){return{width:e.clientWidth,height:e.clientHeight}},le=function(e,t,n){var i,r,o,s;i=e.getContainer(),r=e.getContentAreaContainer().firstChild,o=ae(i),s=ae(r),null!==t&&(t=Math.max(e.getParam("min_width",100,"number"),t),t=Math.min(e.getParam("max_width",65535,"number"),t),se.setStyle(i,"width",t+(o.width-s.width)),se.setStyle(r,"width",t)),n=Math.max(e.getParam("min_height",100,"number"),n),n=Math.min(e.getParam("max_height",65535,"number"),n),se.setStyle(r,"height",n),b(e)},ue=le,ce=function(e,t,n){var i=e.getContentAreaContainer();le(e,i.clientWidth+t,i.clientHeight+n)},de=function(e,t,n){var i,r=e.settings[n];r&&r((i=t.getEl("body"),{element:function(){return i}}))},fe=function(e,t,n){return function(i){var r,o,s,l,u,c=i.control,d=c.parents().filter("panel")[0],f=d.find("#"+t)[0],h=(r=n,o=t,a.grep(r,function(e){return e.name===o})[0]);s=t,l=d,u=n,a.each(u,function(e){var t=l.items().filter("#"+e.name)[0];t&&t.visible()&&e.name!==s&&(de(e,t,"onhide"),t.visible(!1))}),c.parent().items().each(function(e){e.active(!1)}),f&&f.visible()?(de(h,f,"onhide"),f.hide(),c.active(!1)):(f?(f.show(),de(h,f,"onshow")):(f=g.create({type:"container",name:t,layout:"stack",classes:"sidebar-panel",html:""}),d.prepend(f),de(h,f,"onrender"),de(h,f,"onshow")),c.active(!0)),b(e)}},he=function(e){return!(_.ie&&!(_.ie>=11)||!e.sidebars)&&e.sidebars.length>0},me=function(e){return{type:"panel",name:"sidebar",layout:"stack",classes:"sidebar",items:[{type:"toolbar",layout:"stack",classes:"sidebar-toolbar",items:a.map(e.sidebars,function(t){var n=t.settings;return{type:"button",icon:n.icon,image:n.image,tooltip:n.tooltip,onclick:fe(e,t.name,e.sidebars)}})}]}},ge=function(e){var t=function(){e._skinLoaded=!0,v(e)};return function(){e.initialized?t():e.on("init",t)}},pe=m.DOM,ve=function(e){return{type:"panel",name:"iframe",layout:"stack",classes:"edit-area",border:e,html:""}},be=function(e,t,n){var i,r,o,s,a;if(!1===f(e)&&n.skinUiCss?pe.styleSheetLoader.load(n.skinUiCss,ge(e)):ge(e)(),i=t.panel=g.create({type:"panel",role:"application",classes:"tinymce",style:"visibility: hidden",layout:"stack",border:1,items:[{type:"container",classes:"top-part",items:[!1===l(e)?null:{type:"menubar",border:"0 0 1 0",items:oe(e)},B(e,c(e))]},he(e)?(s=e,{type:"panel",layout:"stack",classes:"edit-aria-container",border:"1 0 0 0",items:[ve("0"),me(s)]}):ve("1 0 0 0")]}),"none"!==h(e)&&(r={type:"resizehandle",direction:h(e),onResizeStart:function(){var t=e.getContentAreaContainer().firstChild;o={width:t.clientWidth,height:t.clientHeight}},onResize:function(t){"both"===h(e)?ue(e,o.width+t.deltaX,o.height+t.deltaY):ue(e,null,o.height+t.deltaY)}}),e.getParam("statusbar",!0,"boolean")){var u=p.translate(["Powered by {0}",'<a href="https://www.tinymce.com/?utm_campaign=editor_referral&utm_medium=poweredby&utm_source=tinymce" rel="noopener" target="_blank" role="presentation" tabindex="-1">tinymce</a>']),d=e.getParam("branding",!0,"boolean")?{type:"label",classes:"branding",html:" "+u}:null;i.add({type:"panel",name:"statusbar",classes:"statusbar",layout:"flow",border:"1 0 0 0",ariaRoot:!0,items:[{type:"elementpath",editor:e},r,d]})}return y(e),e.on("SwitchMode",(a=i,function(e){a.find("*").disabled("readonly"===e.mode)})),i.renderBefore(n.targetNode).reflow(),e.getParam("readonly",!1,"boolean")&&e.setMode("readonly"),n.width&&pe.setStyle(i.getEl(),"width",n.width),e.on("remove",function(){i.remove(),i=null}),w(e,i),F(e),{iframeContainer:i.find("#iframe")[0].getEl(),editorContainer:i.getEl()}},ye=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),xe=0,we={id:function(){return"mceu_"+xe++},create:function(e,t,n){var i=document.createElement(e);return m.DOM.setAttribs(i,t),"string"==typeof n?i.innerHTML=n:a.each(n,function(e){e.nodeType&&i.appendChild(e)}),i},createFragment:function(e){return m.DOM.createFragment(e)},getWindowSize:function(){return m.DOM.getViewPort()},getSize:function(e){var t,n;if(e.getBoundingClientRect){var i=e.getBoundingClientRect();t=Math.max(i.width||i.right-i.left,e.offsetWidth),n=Math.max(i.height||i.bottom-i.bottom,e.offsetHeight)}else t=e.offsetWidth,n=e.offsetHeight;return{width:t,height:n}},getPos:function(e,t){return m.DOM.getPos(e,t||we.getContainer())},getContainer:function(){return _.container?_.container:document.body},getViewPort:function(e){return m.DOM.getViewPort(e)},get:function(e){return document.getElementById(e)},addClass:function(e,t){return m.DOM.addClass(e,t)},removeClass:function(e,t){return m.DOM.removeClass(e,t)},hasClass:function(e,t){return m.DOM.hasClass(e,t)},toggleClass:function(e,t,n){return m.DOM.toggleClass(e,t,n)},css:function(e,t,n){return m.DOM.setStyle(e,t,n)},getRuntimeStyle:function(e,t){return m.DOM.getStyle(e,t,!0)},on:function(e,t,n,i){return m.DOM.bind(e,t,n,i)},off:function(e,t,n){return m.DOM.unbind(e,t,n)},fire:function(e,t,n){return m.DOM.fire(e,t,n)},innerHtml:function(e,t){m.DOM.setHTML(e,t)}};function _e(e,t,n){var i,r,o,s,a,l,u,c,d,f;return d=we.getViewPort(),o=(r=we.getPos(t)).x,s=r.y,e.state.get("fixed")&&"static"===we.getRuntimeStyle(document.body,"position")&&(o-=d.x,s-=d.y),i=e.getEl(),a=(f=we.getSize(i)).width,l=f.height,u=(f=we.getSize(t)).width,c=f.height,"b"===(n=(n||"").split(""))[0]&&(s+=c),"r"===n[1]&&(o+=u),"c"===n[0]&&(s+=Math.round(c/2)),"c"===n[1]&&(o+=Math.round(u/2)),"b"===n[3]&&(s-=l),"r"===n[4]&&(o-=a),"c"===n[3]&&(s-=Math.round(l/2)),"c"===n[4]&&(o-=Math.round(a/2)),{x:o,y:s,w:a,h:l}}var Re={testMoveRel:function(e,t){for(var n=we.getViewPort(),i=0;i<t.length;i++){var r=_e(this,e,t[i]);if(this.state.get("fixed")){if(r.x>0&&r.x+r.w<n.w&&r.y>0&&r.y+r.h<n.h)return t[i]}else if(r.x>n.x&&r.x+r.w<n.w+n.x&&r.y>n.y&&r.y+r.h<n.h+n.y)return t[i]}return t[0]},moveRel:function(e,t){"string"!=typeof t&&(t=this.testMoveRel(e,t));var n=_e(this,e,t);return this.moveTo(n.x,n.y)},moveBy:function(e,t){var n=this.layoutRect();return this.moveTo(n.x+e,n.y+t),this},moveTo:function(e,t){var n=this;function i(e,t,n){return e<0?0:e+n>t&&(e=t-n)<0?0:e}if(n.settings.constrainToViewport){var r=we.getViewPort(window),o=n.layoutRect();e=i(e,r.w+r.x,o.w),t=i(t,r.h+r.y,o.h)}return n.state.get("rendered")?n.layoutRect({x:e,y:t}).repaint():(n.settings.x=e,n.settings.y=t),n.fire("move",{x:e,y:t}),n}},Ce=tinymce.util.Tools.resolve("tinymce.util.Class"),ke=tinymce.util.Tools.resolve("tinymce.util.EventDispatcher"),Ee=function(e){var t;if(e)return"number"==typeof e?{top:e=e||0,left:e,bottom:e,right:e}:(1===(t=(e=e.split(" ")).length)?e[1]=e[2]=e[3]=e[0]:2===t?(e[2]=e[0],e[3]=e[1]):3===t&&(e[3]=e[1]),{top:parseInt(e[0],10)||0,right:parseInt(e[1],10)||0,bottom:parseInt(e[2],10)||0,left:parseInt(e[3],10)||0})},He=function(e,t){function n(t){var n=parseFloat(function(t){var n=e.ownerDocument.defaultView;if(n){var i=n.getComputedStyle(e,null);return i?(t=t.replace(/[A-Z]/g,function(e){return"-"+e}),i.getPropertyValue(t)):null}return e.currentStyle[t]}(t));return isNaN(n)?0:n}return{top:n(t+"TopWidth"),right:n(t+"RightWidth"),bottom:n(t+"BottomWidth"),left:n(t+"LeftWidth")}};function Se(){}function Me(e){this.cls=[],this.cls._map={},this.onchange=e||Se,this.prefix=""}a.extend(Me.prototype,{add:function(e){return e&&!this.contains(e)&&(this.cls._map[e]=!0,this.cls.push(e),this._change()),this},remove:function(e){if(this.contains(e)){var t=void 0;for(t=0;t<this.cls.length&&this.cls[t]!==e;t++);this.cls.splice(t,1),delete this.cls._map[e],this._change()}return this},toggle:function(e,t){var n=this.contains(e);return n!==t&&(n?this.remove(e):this.add(e),this._change()),this},contains:function(e){return!!this.cls._map[e]},_change:function(){delete this.clsValue,this.onchange.call(this)}}),Me.prototype.toString=function(){var e;if(this.clsValue)return this.clsValue;e="";for(var t=0;t<this.cls.length;t++)t>0&&(e+=" "),e+=this.prefix+this.cls[t];return e};var Te,Pe,We,De=/^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i,Ne=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,Ae=/^\s*|\s*$/g,Be=Ce.extend({init:function(e){var t=this.match;function n(e,n,r){var o;function s(e){e&&n.push(e)}return s(function(e){if(e)return e=e.toLowerCase(),function(t){return"*"===e||t.type===e}}((o=De.exec(e.replace(Ae,"")))[1])),s(function(e){if(e)return function(t){return t._name===e}}(o[2])),s(function(e){if(e)return e=e.split("."),function(t){for(var n=e.length;n--;)if(!t.classes.contains(e[n]))return!1;return!0}}(o[3])),s(function(e,t,n){if(e)return function(i){var r=i[e]?i[e]():"";return t?"="===t?r===n:"*="===t?r.indexOf(n)>=0:"~="===t?(" "+r+" ").indexOf(" "+n+" ")>=0:"!="===t?r!==n:"^="===t?0===r.indexOf(n):"$="===t&&r.substr(r.length-n.length)===n:!!n}}(o[4],o[5],o[6])),s(function(e){var n;if(e)return(e=/(?:not\((.+)\))|(.+)/i.exec(e))[1]?(n=i(e[1],[]),function(e){return!t(e,n)}):(e=e[2],function(t,n,i){return"first"===e?0===n:"last"===e?n===i-1:"even"===e?n%2==0:"odd"===e?n%2==1:!!t[e]&&t[e]()})}(o[7])),n.pseudo=!!o[7],n.direct=r,n}function i(e,t){var r,o,s,a=[];do{if(Ne.exec(""),(o=Ne.exec(e))&&(e=o[3],a.push(o[1]),o[2])){r=o[3];break}}while(o);for(r&&i(r,t),e=[],s=0;s<a.length;s++)">"!==a[s]&&e.push(n(a[s],[],">"===a[s-1]));return t.push(e),t}this._selectors=i(e,[])},match:function(e,t){var n,i,r,o,s,a,l,u,c,d,f,h,m;for(n=0,i=(t=t||this._selectors).length;n<i;n++){for(m=e,h=0,r=(o=(s=t[n]).length)-1;r>=0;r--)for(u=s[r];m;){if(u.pseudo)for(c=d=(f=m.parent().items()).length;c--&&f[c]!==m;);for(a=0,l=u.length;a<l;a++)if(!u[a](m,c,d)){a=l+1;break}if(a===l){h++;break}if(r===o-1)break;m=m.parent()}if(h===o)return!0}return!1},find:function(e){var t,n,i=[],r=this._selectors;function o(e,t,n){var r,s,a,l,u,c=t[n];for(r=0,s=e.length;r<s;r++){for(u=e[r],a=0,l=c.length;a<l;a++)if(!c[a](u,r,s)){a=l+1;break}if(a===l)n===t.length-1?i.push(u):u.items&&o(u.items(),t,n+1);else if(c.direct)return;u.items&&o(u.items(),t,n)}}if(e.items){for(t=0,n=r.length;t<n;t++)o(e.items(),r[t],0);n>1&&(i=function(e){for(var t,n=[],i=e.length;i--;)(t=e[i]).__checked||(n.push(t),t.__checked=1);for(i=n.length;i--;)delete n[i].__checked;return n}(i))}return Te||(Te=Be.Collection),new Te(i)}}),Oe=Array.prototype.push,ze=Array.prototype.slice;We={length:0,init:function(e){e&&this.add(e)},add:function(e){return a.isArray(e)?Oe.apply(this,e):e instanceof Pe?this.add(e.toArray()):Oe.call(this,e),this},set:function(e){var t,n=this,i=n.length;for(n.length=0,n.add(e),t=n.length;t<i;t++)delete n[t];return n},filter:function(e){var t,n,i,r,o=[];for("string"==typeof e?(e=new Be(e),r=function(t){return e.match(t)}):r=e,t=0,n=this.length;t<n;t++)r(i=this[t])&&o.push(i);return new Pe(o)},slice:function(){return new Pe(ze.apply(this,arguments))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},each:function(e){return a.each(this,e),this},toArray:function(){return a.toArray(this)},indexOf:function(e){for(var t=this.length;t--&&this[t]!==e;);return t},reverse:function(){return new Pe(a.toArray(this).reverse())},hasClass:function(e){return!!this[0]&&this[0].classes.contains(e)},prop:function(e,t){var n;return t!==undefined?(this.each(function(n){n[e]&&n[e](t)}),this):(n=this[0])&&n[e]?n[e]():void 0},exec:function(e){var t=a.toArray(arguments).slice(1);return this.each(function(n){n[e]&&n[e].apply(n,t)}),this},remove:function(){for(var e=this.length;e--;)this[e].remove();return this},addClass:function(e){return this.each(function(t){t.classes.add(e)})},removeClass:function(e){return this.each(function(t){t.classes.remove(e)})}},a.each("fire on off show hide append prepend before after reflow".split(" "),function(e){We[e]=function(){var t=a.toArray(arguments);return this.each(function(n){e in n&&n[e].apply(n,t)}),this}}),a.each("text name disabled active selected checked visible parent value data".split(" "),function(e){We[e]=function(t){return this.prop(e,t)}}),Pe=Ce.extend(We),Be.Collection=Pe;var Le=Pe,Ie=function(e){this.create=e.create};Ie.create=function(e,t){return new Ie({create:function(n,i){var r,o=function(e){n.set(i,e.value)};return n.on("change:"+i,function(n){e.set(t,n.value)}),e.on("change:"+t,o),(r=n._bindings)||(r=n._bindings=[],n.on("destroy",function(){for(var e=r.length;e--;)r[e]()})),r.push(function(){e.off("change:"+t,o)}),e.get(t)}})};var Fe=tinymce.util.Tools.resolve("tinymce.util.Observable");function Ve(e){return e.nodeType>0}var Ue,Ye,$e=Ce.extend({Mixins:[Fe],init:function(e){var t,n;for(t in e=e||{})(n=e[t])instanceof Ie&&(e[t]=n.create(this,t));this.data=e},set:function(e,t){var n,i,r=this.data[e];if(t instanceof Ie&&(t=t.create(this,e)),"object"==typeof e){for(n in e)this.set(n,e[n]);return this}return function o(e,t){var n,i;if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(a.isArray(t)){if(e.length!==t.length)return!1;for(n=e.length;n--;)if(!o(e[n],t[n]))return!1}if(Ve(e)||Ve(t))return e===t;for(n in i={},t){if(!o(e[n],t[n]))return!1;i[n]=!0}for(n in e)if(!i[n]&&!o(e[n],t[n]))return!1;return!0}(r,t)||(this.data[e]=t,i={target:this,name:e,value:t,oldValue:r},this.fire("change:"+e,i),this.fire("change",i)),this},get:function(e){return this.data[e]},has:function(e){return e in this.data},bind:function(e){return Ie.create(this,e)},destroy:function(){this.fire("destroy")}}),je={},qe={add:function(e){var t=e.parent();if(t){if(!t._layout||t._layout.isNative())return;je[t._id]||(je[t._id]=t),Ue||(Ue=!0,C.requestAnimationFrame(function(){var e,t;for(e in Ue=!1,je)(t=je[e]).state.get("rendered")&&t.reflow();je={}},document.body))}},remove:function(e){je[e._id]&&delete je[e._id]}},Xe="onmousewheel"in document,Je=!1,Ge=0,Ke={Statics:{classPrefix:"mce-"},isRtl:function(){return Ye.rtl},classPrefix:"mce-",init:function(e){var t,n,i=this;function r(e){var t;for(e=e.split(" "),t=0;t<e.length;t++)i.classes.add(e[t])}i.settings=e=a.extend({},i.Defaults,e),i._id=e.id||"mceu_"+Ge++,i._aria={role:e.role},i._elmCache={},i.$=ye,i.state=new $e({visible:!0,active:!1,disabled:!1,value:""}),i.data=new $e(e.data),i.classes=new Me(function(){i.state.get("rendered")&&(i.getEl().className=this.toString())}),i.classes.prefix=i.classPrefix,(t=e.classes)&&(i.Defaults&&(n=i.Defaults.classes)&&t!==n&&r(n),r(t)),a.each("title text name visible disabled active value".split(" "),function(t){t in e&&i[t](e[t])}),i.on("click",function(){if(i.disabled())return!1}),i.settings=e,i.borderBox=Ee(e.border),i.paddingBox=Ee(e.padding),i.marginBox=Ee(e.margin),e.hidden&&i.hide()},Properties:"parent,name",getContainerElm:function(){return we.getContainer()},getParentCtrl:function(e){for(var t,n=this.getRoot().controlIdLookup;e&&n&&!(t=n[e.id]);)e=e.parentNode;return t},initLayoutRect:function(){var e,t,n,i,r,o,s,a,l,u,c=this,d=c.settings,f=c.getEl();e=c.borderBox=c.borderBox||He(f,"border"),c.paddingBox=c.paddingBox||He(f,"padding"),c.marginBox=c.marginBox||He(f,"margin"),u=we.getSize(f),a=d.minWidth,l=d.minHeight,r=a||u.width,o=l||u.height,n=d.width,i=d.height,s=void 0!==(s=d.autoResize)?s:!n&&!i,n=n||r,i=i||o;var h=e.left+e.right,m=e.top+e.bottom,g=d.maxWidth||65535,p=d.maxHeight||65535;return c._layoutRect=t={x:d.x||0,y:d.y||0,w:n,h:i,deltaW:h,deltaH:m,contentW:n-h,contentH:i-m,innerW:n-h,innerH:i-m,startMinWidth:a||0,startMinHeight:l||0,minW:Math.min(r,g),minH:Math.min(o,p),maxW:g,maxH:p,autoResize:s,scrollW:0},c._lastLayoutRect={},t},layoutRect:function(e){var t,n,i,r,o,s=this,a=s._layoutRect;return a||(a=s.initLayoutRect()),e?(i=a.deltaW,r=a.deltaH,e.x!==undefined&&(a.x=e.x),e.y!==undefined&&(a.y=e.y),e.minW!==undefined&&(a.minW=e.minW),e.minH!==undefined&&(a.minH=e.minH),(n=e.w)!==undefined&&(n=(n=n<a.minW?a.minW:n)>a.maxW?a.maxW:n,a.w=n,a.innerW=n-i),(n=e.h)!==undefined&&(n=(n=n<a.minH?a.minH:n)>a.maxH?a.maxH:n,a.h=n,a.innerH=n-r),(n=e.innerW)!==undefined&&(n=(n=n<a.minW-i?a.minW-i:n)>a.maxW-i?a.maxW-i:n,a.innerW=n,a.w=n+i),(n=e.innerH)!==undefined&&(n=(n=n<a.minH-r?a.minH-r:n)>a.maxH-r?a.maxH-r:n,a.innerH=n,a.h=n+r),e.contentW!==undefined&&(a.contentW=e.contentW),e.contentH!==undefined&&(a.contentH=e.contentH),(t=s._lastLayoutRect).x===a.x&&t.y===a.y&&t.w===a.w&&t.h===a.h||((o=Ye.repaintControls)&&o.map&&!o.map[s._id]&&(o.push(s),o.map[s._id]=!0),t.x=a.x,t.y=a.y,t.w=a.w,t.h=a.h),s):a},repaint:function(){var e,t,n,i,r,o,s,a,l,u,c=this;l=document.createRange?function(e){return e}:Math.round,e=c.getEl().style,i=c._layoutRect,a=c._lastRepaintRect||{},o=(r=c.borderBox).left+r.right,s=r.top+r.bottom,i.x!==a.x&&(e.left=l(i.x)+"px",a.x=i.x),i.y!==a.y&&(e.top=l(i.y)+"px",a.y=i.y),i.w!==a.w&&(u=l(i.w-o),e.width=(u>=0?u:0)+"px",a.w=i.w),i.h!==a.h&&(u=l(i.h-s),e.height=(u>=0?u:0)+"px",a.h=i.h),c._hasBody&&i.innerW!==a.innerW&&(u=l(i.innerW),(n=c.getEl("body"))&&((t=n.style).width=(u>=0?u:0)+"px"),a.innerW=i.innerW),c._hasBody&&i.innerH!==a.innerH&&(u=l(i.innerH),(n=n||c.getEl("body"))&&((t=t||n.style).height=(u>=0?u:0)+"px"),a.innerH=i.innerH),c._lastRepaintRect=a,c.fire("repaint",{},!1)},updateLayoutRect:function(){var e=this;e.parent()._lastRect=null,we.css(e.getEl(),{width:"",height:""}),e._layoutRect=e._lastRepaintRect=e._lastLayoutRect=null,e.initLayoutRect()},on:function(e,t){var n,i,r,o=this;return Ze(o).on(e,"string"!=typeof(n=t)?n:function(e){return i||o.parentsAndSelf().each(function(e){var t=e.settings.callbacks;if(t&&(i=t[n]))return r=e,!1}),i?i.call(r,e):(e.action=n,void this.fire("execute",e))}),o},off:function(e,t){return Ze(this).off(e,t),this},fire:function(e,t,n){if((t=t||{}).control||(t.control=this),t=Ze(this).fire(e,t),!1!==n&&this.parent)for(var i=this.parent();i&&!t.isPropagationStopped();)i.fire(e,t,!1),i=i.parent();return t},hasEventListeners:function(e){return Ze(this).has(e)},parents:function(e){var t,n=new Le;for(t=this.parent();t;t=t.parent())n.add(t);return e&&(n=n.filter(e)),n},parentsAndSelf:function(e){return new Le(this).add(this.parents(e))},next:function(){var e=this.parent().items();return e[e.indexOf(this)+1]},prev:function(){var e=this.parent().items();return e[e.indexOf(this)-1]},innerHtml:function(e){return this.$el.html(e),this},getEl:function(e){var t=e?this._id+"-"+e:this._id;return this._elmCache[t]||(this._elmCache[t]=ye("#"+t)[0]),this._elmCache[t]},show:function(){return this.visible(!0)},hide:function(){return this.visible(!1)},focus:function(){try{this.getEl().focus()}catch(e){}return this},blur:function(){return this.getEl().blur(),this},aria:function(e,t){var n=this,i=n.getEl(n.ariaTarget);return void 0===t?n._aria[e]:(n._aria[e]=t,n.state.get("rendered")&&i.setAttribute("role"===e?e:"aria-"+e,t),n)},encode:function(e,t){return!1!==t&&(e=this.translate(e)),(e||"").replace(/[&<>"]/g,function(e){return"&#"+e.charCodeAt(0)+";"})},translate:function(e){return Ye.translate?Ye.translate(e):e},before:function(e){var t=this.parent();return t&&t.insert(e,t.items().indexOf(this),!0),this},after:function(e){var t=this.parent();return t&&t.insert(e,t.items().indexOf(this)),this},remove:function(){var e,t,n=this,i=n.getEl(),r=n.parent();if(n.items){var o=n.items().toArray();for(t=o.length;t--;)o[t].remove()}r&&r.items&&(e=[],r.items().each(function(t){t!==n&&e.push(t)}),r.items().set(e),r._lastRect=null),n._eventsRoot&&n._eventsRoot===n&&ye(i).off();var s=n.getRoot().controlIdLookup;return s&&delete s[n._id],i&&i.parentNode&&i.parentNode.removeChild(i),n.state.set("rendered",!1),n.state.destroy(),n.fire("remove"),n},renderBefore:function(e){return ye(e).before(this.renderHtml()),this.postRender(),this},renderTo:function(e){return ye(e||this.getContainerElm()).append(this.renderHtml()),this.postRender(),this},preRender:function(){},render:function(){},renderHtml:function(){return'<div id="'+this._id+'" class="'+this.classes+'"></div>'},postRender:function(){var e,t,n,i,r,o=this,s=o.settings;for(i in o.$el=ye(o.getEl()),o.state.set("rendered",!0),s)0===i.indexOf("on")&&o.on(i.substr(2),s[i]);if(o._eventsRoot){for(n=o.parent();!r&&n;n=n.parent())r=n._eventsRoot;if(r)for(i in r._nativeEvents)o._nativeEvents[i]=!0}Qe(o),s.style&&(e=o.getEl())&&(e.setAttribute("style",s.style),e.style.cssText=s.style),o.settings.border&&(t=o.borderBox,o.$el.css({"border-top-width":t.top,"border-right-width":t.right,"border-bottom-width":t.bottom,"border-left-width":t.left}));var a=o.getRoot();for(var l in a.controlIdLookup||(a.controlIdLookup={}),a.controlIdLookup[o._id]=o,o._aria)o.aria(l,o._aria[l]);!1===o.state.get("visible")&&(o.getEl().style.display="none"),o.bindStates(),o.state.on("change:visible",function(e){var t,n=e.value;o.state.get("rendered")&&(o.getEl().style.display=!1===n?"none":"",o.getEl().getBoundingClientRect()),(t=o.parent())&&(t._lastRect=null),o.fire(n?"show":"hide"),qe.add(o)}),o.fire("postrender",{},!1)},bindStates:function(){},scrollIntoView:function(e){var t,n,i,r,o,s,a=this.getEl(),l=a.parentNode,u=function(e,t){var n,i,r=e;for(n=i=0;r&&r!==t&&r.nodeType;)n+=r.offsetLeft||0,i+=r.offsetTop||0,r=r.offsetParent;return{x:n,y:i}}(a,l);return t=u.x,n=u.y,i=a.offsetWidth,r=a.offsetHeight,o=l.clientWidth,s=l.clientHeight,"end"===e?(t-=o-i,n-=s-r):"center"===e&&(t-=o/2-i/2,n-=s/2-r/2),l.scrollLeft=t,l.scrollTop=n,this},getRoot:function(){for(var e,t=this,n=[];t;){if(t.rootControl){e=t.rootControl;break}n.push(t),e=t,t=t.parent()}e||(e=this);for(var i=n.length;i--;)n[i].rootControl=e;return e},reflow:function(){qe.remove(this);var e=this.parent();return e&&e._layout&&!e._layout.isNative()&&e.reflow(),this}};function Ze(e){return e._eventDispatcher||(e._eventDispatcher=new ke({scope:e,toggleEvent:function(t,n){n&&ke.isNative(t)&&(e._nativeEvents||(e._nativeEvents={}),e._nativeEvents[t]=!0,e.state.get("rendered")&&Qe(e))}})),e._eventDispatcher}function Qe(e){var t,n,i,r,o,s;function a(t){var n=e.getParentCtrl(t.target);n&&n.fire(t.type,t)}function l(){var e=r._lastHoverCtrl;e&&(e.fire("mouseleave",{target:e.getEl()}),e.parents().each(function(e){e.fire("mouseleave",{target:e.getEl()})}),r._lastHoverCtrl=null)}function u(t){var n,i,o,s=e.getParentCtrl(t.target),a=r._lastHoverCtrl,l=0;if(s!==a){if(r._lastHoverCtrl=s,(i=s.parents().toArray().reverse()).push(s),a){for((o=a.parents().toArray().reverse()).push(a),l=0;l<o.length&&i[l]===o[l];l++);for(n=o.length-1;n>=l;n--)(a=o[n]).fire("mouseleave",{target:a.getEl()})}for(n=l;n<i.length;n++)(s=i[n]).fire("mouseenter",{target:s.getEl()})}}function c(t){t.preventDefault(),"mousewheel"===t.type?(t.deltaY=-.025*t.wheelDelta,t.wheelDeltaX&&(t.deltaX=-.025*t.wheelDeltaX)):(t.deltaX=0,t.deltaY=t.detail),t=e.fire("wheel",t)}if(o=e._nativeEvents){for((i=e.parents().toArray()).unshift(e),t=0,n=i.length;!r&&t<n;t++)r=i[t]._eventsRoot;for(r||(r=i[i.length-1]||e),e._eventsRoot=r,n=t,t=0;t<n;t++)i[t]._eventsRoot=r;var d=r._delegates;for(s in d||(d=r._delegates={}),o){if(!o)return!1;"wheel"!==s||Je?("mouseenter"===s||"mouseleave"===s?r._hasMouseEnter||(ye(r.getEl()).on("mouseleave",l).on("mouseover",u),r._hasMouseEnter=1):d[s]||(ye(r.getEl()).on(s,a),d[s]=!0),o[s]=!1):Xe?ye(e.getEl()).on("mousewheel",c):ye(e.getEl()).on("DOMMouseScroll",c)}}}a.each("text title visible disabled active value".split(" "),function(e){Ke[e]=function(t){return 0===arguments.length?this.state.get(e):(void 0!==t&&this.state.set(e,t),this)}});var et=Ye=Ce.extend(Ke),tt=function(e){return!!e.getAttribute("data-mce-tabstop")},nt=function(e){var t,n,i=e.root;function r(e){return e&&1===e.nodeType}try{t=document.activeElement}catch(y){t=document.body}function o(e){return r(e=e||t)?e.getAttribute("role"):null}function s(e){for(var n,i=e||t;i=i.parentNode;)if(n=o(i))return n}function a(e){var n=t;if(r(n))return n.getAttribute("aria-"+e)}function l(e){var t=e.tagName.toUpperCase();return"INPUT"===t||"TEXTAREA"===t||"SELECT"===t}function u(e){var t=[];return function n(e){if(1===e.nodeType&&"none"!==e.style.display&&!e.disabled){var i;(l(i=e)&&!i.hidden||tt(i)||/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(o(i)))&&t.push(e);for(var r=0;r<e.childNodes.length;r++)n(e.childNodes[r])}}(e||i.getEl()),t}function c(e){var t,i;(i=(e=e||n).parents().toArray()).unshift(e);for(var r=0;r<i.length&&!(t=i[r]).settings.ariaRoot;r++);return t}function d(e,t){return e<0?e=t.length-1:e>=t.length&&(e=0),t[e]&&t[e].focus(),e}function f(e,n){var i=-1,r=c();n=n||u(r.getEl());for(var o=0;o<n.length;o++)n[o]===t&&(i=o);i+=e,r.lastAriaIndex=d(i,n)}function h(){"tablist"===s()?f(-1,u(t.parentNode)):n.parent().submenu?v():f(-1)}function m(){var e=o(),n=s();"tablist"===n?f(1,u(t.parentNode)):"menuitem"===e&&"menu"===n&&a("haspopup")?b():f(1)}function g(){f(-1)}function p(){var e=o(),t=s();"menuitem"===e&&"menubar"===t?b():"button"===e&&a("haspopup")?b({key:"down"}):f(1)}function v(){n.fire("cancel")}function b(e){e=e||{},n.fire("click",{target:t,aria:e})}return n=i.getParentCtrl(t),i.on("keydown",function(e){function i(e,n){l(t)||tt(t)||"slider"!==o(t)&&!1!==n(e)&&e.preventDefault()}if(!e.isDefaultPrevented())switch(e.keyCode){case 37:i(e,h);break;case 39:i(e,m);break;case 38:i(e,g);break;case 40:i(e,p);break;case 27:v();break;case 14:case 13:case 32:i(e,b);break;case 9:!function(e){if("tablist"===s()){var t=u(n.getEl("body"))[0];t&&t.focus()}else f(e.shiftKey?-1:1)}(e),e.preventDefault()}}),i.on("focusin",function(e){t=e.target,n=e.control}),{focusFirst:function(e){var t=c(e),n=u(t.getEl());t.settings.ariaRemember&&"lastAriaIndex"in t?d(t.lastAriaIndex,n):d(0,n)}}},it={},rt=et.extend({init:function(e){var t=this;t._super(e),(e=t.settings).fixed&&t.state.set("fixed",!0),t._items=new Le,t.isRtl()&&t.classes.add("rtl"),t.bodyClasses=new Me(function(){t.state.get("rendered")&&(t.getEl("body").className=this.toString())}),t.bodyClasses.prefix=t.classPrefix,t.classes.add("container"),t.bodyClasses.add("container-body"),e.containerCls&&t.classes.add(e.containerCls),t._layout=g.create((e.layout||"")+"layout"),t.settings.items?t.add(t.settings.items):t.add(t.render()),t._hasBody=!0},items:function(){return this._items},find:function(e){return(e=it[e]=it[e]||new Be(e)).find(this)},add:function(e){return this.items().add(this.create(e)).parent(this),this},focus:function(e){var t,n,i,r=this;if(!e||!(n=r.keyboardNav||r.parents().eq(-1)[0].keyboardNav))return i=r.find("*"),r.statusbar&&i.add(r.statusbar.items()),i.each(function(e){if(e.settings.autofocus)return t=null,!1;e.canFocus&&(t=t||e)}),t&&t.focus(),r;n.focusFirst(r)},replace:function(e,t){for(var n,i=this.items(),r=i.length;r--;)if(i[r]===e){i[r]=t;break}r>=0&&((n=t.getEl())&&n.parentNode.removeChild(n),(n=e.getEl())&&n.parentNode.removeChild(n)),t.parent(this)},create:function(e){var t,n=this,i=[];return a.isArray(e)||(e=[e]),a.each(e,function(e){e&&(e instanceof et||("string"==typeof e&&(e={type:e}),t=a.extend({},n.settings.defaults,e),e.type=t.type=t.type||e.type||n.settings.defaultType||(t.defaults?t.defaults.type:null),e=g.create(t)),i.push(e))}),i},renderNew:function(){var e=this;return e.items().each(function(t,n){var i;t.parent(e),t.state.get("rendered")||((i=e.getEl("body")).hasChildNodes()&&n<=i.childNodes.length-1?ye(i.childNodes[n]).before(t.renderHtml()):ye(i).append(t.renderHtml()),t.postRender(),qe.add(t))}),e._layout.applyClasses(e.items().filter(":visible")),e._lastRect=null,e},append:function(e){return this.add(e).renderNew()},prepend:function(e){return this.items().set(this.create(e).concat(this.items().toArray())),this.renderNew()},insert:function(e,t,n){var i,r,o;return e=this.create(e),i=this.items(),!n&&t<i.length-1&&(t+=1),t>=0&&t<i.length&&(r=i.slice(0,t).toArray(),o=i.slice(t).toArray(),i.set(r.concat(e,o))),this.renderNew()},fromJSON:function(e){for(var t in e)this.find("#"+t).value(e[t]);return this},toJSON:function(){var e={};return this.find("*").each(function(t){var n=t.name(),i=t.value();n&&void 0!==i&&(e[n]=i)}),e},renderHtml:function(){var e=this,t=e._layout,n=this.settings.role;return e.preRender(),t.preRender(e),'<div id="'+e._id+'" class="'+e.classes+'"'+(n?' role="'+this.settings.role+'"':"")+'><div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+(e.settings.html||"")+t.renderHtml(e)+"</div></div>"},postRender:function(){var e,t=this;return t.items().exec("postRender"),t._super(),t._layout.postRender(t),t.state.set("rendered",!0),t.settings.style&&t.$el.css(t.settings.style),t.settings.border&&(e=t.borderBox,t.$el.css({"border-top-width":e.top,"border-right-width":e.right,"border-bottom-width":e.bottom,"border-left-width":e.left})),t.parent()||(t.keyboardNav=nt({root:t})),t},initLayoutRect:function(){var e=this._super();return this._layout.recalc(this),e},recalc:function(){var e=this,t=e._layoutRect,n=e._lastRect;if(!n||n.w!==t.w||n.h!==t.h)return e._layout.recalc(e),t=e.layoutRect(),e._lastRect={x:t.x,y:t.y,w:t.w,h:t.h},!0},reflow:function(){var e;if(qe.remove(this),this.visible()){for(et.repaintControls=[],et.repaintControls.map={},this.recalc(),e=et.repaintControls.length;e--;)et.repaintControls[e].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),et.repaintControls=[]}return this}});function ot(e){var t,n;if(e.changedTouches)for(t="screenX screenY pageX pageY clientX clientY".split(" "),n=0;n<t.length;n++)e[t[n]]=e.changedTouches[0][t[n]]}var st,at,lt,ut,ct=function(e,t){var n,i,r,o,s,a,l,u=t.document||document;function c(){return u.getElementById(t.handle||e)}t=t||{},r=function(e){var r,d,f,h,m,g,p,v,b,y,x,w,_=(r=u,y=Math.max,d=r.documentElement,f=r.body,h=y(d.scrollWidth,f.scrollWidth),m=y(d.clientWidth,f.clientWidth),g=y(d.offsetWidth,f.offsetWidth),p=y(d.scrollHeight,f.scrollHeight),v=y(d.clientHeight,f.clientHeight),b=y(d.offsetHeight,f.offsetHeight),{width:h<g?m:h,height:p<b?v:p});ot(e),e.preventDefault(),i=e.button,x=c(),a=e.screenX,l=e.screenY,w=window.getComputedStyle?window.getComputedStyle(x,null).getPropertyValue("cursor"):x.runtimeStyle.cursor,n=ye("<div></div>").css({position:"absolute",top:0,left:0,width:_.width,height:_.height,zIndex:2147483647,opacity:1e-4,cursor:w}).appendTo(u.body),ye(u).on("mousemove touchmove",s).on("mouseup touchend",o),t.start(e)},s=function(e){if(ot(e),e.button!==i)return o(e);e.deltaX=e.screenX-a,e.deltaY=e.screenY-l,e.preventDefault(),t.drag(e)},o=function(e){ot(e),ye(u).off("mousemove touchmove",s).off("mouseup touchend",o),n.remove(),t.stop&&t.stop(e)},this.destroy=function(){ye(c()).off()},ye(c()).on("mousedown touchstart",r)},dt={init:function(){this.on("repaint",this.renderScroll)},renderScroll:function(){var e=this,t=2;function n(){var n,i,r;function o(r,o,s,a,l,u){var c,d,f,h,m,g,p,v;if(d=e.getEl("scroll"+r)){if(p=o.toLowerCase(),v=s.toLowerCase(),ye(e.getEl("absend")).css(p,e.layoutRect()[a]-1),!l)return void ye(d).css("display","none");ye(d).css("display","block"),c=e.getEl("body"),f=e.getEl("scroll"+r+"t"),h=c["client"+s]-2*t,m=(h-=n&&i?d["client"+u]:0)/c["scroll"+s],(g={})[p]=c["offset"+o]+t,g[v]=h,ye(d).css(g),(g={})[p]=c["scroll"+o]*m,g[v]=h*m,ye(f).css(g)}}r=e.getEl("body"),n=r.scrollWidth>r.clientWidth,i=r.scrollHeight>r.clientHeight,o("h","Left","Width","contentW",n,"Height"),o("v","Top","Height","contentH",i,"Width")}e.settings.autoScroll&&(e._hasScroll||(e._hasScroll=!0,function(){function n(n,i,r,o,s){var a,l=e._id+"-scroll"+n,u=e.classPrefix;ye(e.getEl()).append('<div id="'+l+'" class="'+u+"scrollbar "+u+"scrollbar-"+n+'"><div id="'+l+'t" class="'+u+'scrollbar-thumb"></div></div>'),e.draghelper=new ct(l+"t",{start:function(){a=e.getEl("body")["scroll"+i],ye("#"+l).addClass(u+"active")},drag:function(l){var u,c,d,f,h=e.layoutRect();c=h.contentW>h.innerW,d=h.contentH>h.innerH,f=e.getEl("body")["client"+r]-2*t,u=(f-=c&&d?e.getEl("scroll"+n)["client"+s]:0)/e.getEl("body")["scroll"+r],e.getEl("body")["scroll"+i]=a+l["delta"+o]/u},stop:function(){ye("#"+l).removeClass(u+"active")}})}e.classes.add("scroll"),n("v","Top","Height","Y","Width"),n("h","Left","Width","X","Height")}(),e.on("wheel",function(t){var i=e.getEl("body");i.scrollLeft+=10*(t.deltaX||0),i.scrollTop+=10*t.deltaY,n()}),ye(e.getEl("body")).on("scroll",n)),n())}},ft=rt.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[dt],renderHtml:function(){var e=this,t=e._layout,n=e.settings.html;return e.preRender(),t.preRender(e),void 0===n?n='<div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+t.renderHtml(e)+"</div>":("function"==typeof n&&(n=n.call(e)),e._hasBody=!1),'<div id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1" role="group">'+(e._preBodyHtml||"")+n+"</div>"}}),ht={resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(e,t){if(e<=1||t<=1){var n=we.getWindowSize();e=e<=1?e*n.w:e,t=t<=1?t*n.h:t}return this._layoutRect.autoResize=!1,this.layoutRect({minW:e,minH:t,w:e,h:t}).reflow()},resizeBy:function(e,t){var n=this.layoutRect();return this.resizeTo(n.w+e,n.h+t)}},mt=[],gt=[];function pt(e,t){for(;e;){if(e===t)return!0;e=e.parent()}}function vt(){st||(st=function(e){2!==e.button&&function(e){for(var t=mt.length;t--;){var n=mt[t],i=n.getParentCtrl(e.target);if(n.settings.autohide){if(i&&(pt(i,n)||n.parent()===i))continue;(e=n.fire("autohide",{target:e.target})).isDefaultPrevented()||n.hide()}}}(e)},ye(document).on("click touchstart",st))}function bt(e){var t=we.getViewPort().y;function n(t,n){for(var i,r=0;r<mt.length;r++)if(mt[r]!==e)for(i=mt[r].parent();i&&(i=i.parent());)i===e&&mt[r].fixed(t).moveBy(0,n).repaint()}e.settings.autofix&&(e.state.get("fixed")?e._autoFixY>t&&(e.fixed(!1).layoutRect({y:e._autoFixY}).repaint(),n(!1,e._autoFixY-t)):(e._autoFixY=e.layoutRect().y,e._autoFixY<t&&(e.fixed(!0).layoutRect({y:0}).repaint(),n(!0,t-e._autoFixY))))}function yt(e,t){var n,i,r=xt.zIndex||65535;if(e)gt.push(t);else for(n=gt.length;n--;)gt[n]===t&>.splice(n,1);if(gt.length)for(n=0;n<gt.length;n++)gt[n].modal&&(r++,i=gt[n]),gt[n].getEl().style.zIndex=r,gt[n].zIndex=r,r++;var o=ye("#"+t.classPrefix+"modal-block",t.getContainerElm())[0];i?ye(o).css("z-index",i.zIndex-1):o&&(o.parentNode.removeChild(o),ut=!1),xt.currentZIndex=r}var xt=ft.extend({Mixins:[Re,ht],init:function(e){var t=this;t._super(e),t._eventsRoot=t,t.classes.add("floatpanel"),e.autohide&&(vt(),function(){if(!lt){var e=document.documentElement,t=e.clientWidth,n=e.clientHeight;lt=function(){document.all&&t===e.clientWidth&&n===e.clientHeight||(t=e.clientWidth,n=e.clientHeight,xt.hideAll())},ye(window).on("resize",lt)}}(),mt.push(t)),e.autofix&&(at||(at=function(){var e;for(e=mt.length;e--;)bt(mt[e])},ye(window).on("scroll",at)),t.on("move",function(){bt(this)})),t.on("postrender show",function(e){if(e.control===t){var n,i=t.classPrefix;t.modal&&!ut&&((n=ye("#"+i+"modal-block",t.getContainerElm()))[0]||(n=ye('<div id="'+i+'modal-block" class="'+i+"reset "+i+'fade"></div>').appendTo(t.getContainerElm())),C.setTimeout(function(){n.addClass(i+"in"),ye(t.getEl()).addClass(i+"in")}),ut=!0),yt(!0,t)}}),t.on("show",function(){t.parents().each(function(e){if(e.state.get("fixed"))return t.fixed(!0),!1})}),e.popover&&(t._preBodyHtml='<div class="'+t.classPrefix+'arrow"></div>',t.classes.add("popover").add("bottom").add(t.isRtl()?"end":"start")),t.aria("label",e.ariaLabel),t.aria("labelledby",t._id),t.aria("describedby",t.describedBy||t._id+"-none")},fixed:function(e){var t=this;if(t.state.get("fixed")!==e){if(t.state.get("rendered")){var n=we.getViewPort();e?t.layoutRect().y-=n.y:t.layoutRect().y+=n.y}t.classes.toggle("fixed",e),t.state.set("fixed",e)}return t},show:function(){var e,t=this._super();for(e=mt.length;e--&&mt[e]!==this;);return-1===e&&mt.push(this),t},hide:function(){return wt(this),yt(!1,this),this._super()},hideAll:function(){xt.hideAll()},close:function(){return this.fire("close").isDefaultPrevented()||(this.remove(),yt(!1,this)),this},remove:function(){wt(this),this._super()},postRender:function(){return this.settings.bodyRole&&this.getEl("body").setAttribute("role",this.settings.bodyRole),this._super()}});function wt(e){var t;for(t=mt.length;t--;)mt[t]===e&&mt.splice(t,1);for(t=gt.length;t--;)gt[t]===e&>.splice(t,1)}xt.hideAll=function(){for(var e=mt.length;e--;){var t=mt[e];t&&t.settings.autohide&&(t.hide(),mt.splice(e,1))}};var _t,Rt=function(e){return!(!e||_.container)},Ct=function(e,t,n){var i,r,o=m.DOM,s=e.getParam("fixed_toolbar_container");s&&(r=o.select(s)[0]);var a=function(){if(i&&i.moveRel&&i.visible()&&!i._fixed){var t=e.selection.getScrollContainer(),n=e.getBody(),r=0,s=0;if(t){var a=o.getPos(n),l=o.getPos(t);r=Math.max(0,l.x-a.x),s=Math.max(0,l.y-a.y)}i.fixed(!1).moveRel(n,e.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(r,s)}},u=function(){i&&(i.show(),a(),o.addClass(e.getBody(),"mce-edit-focus"))},d=function(){i&&(i.hide(),xt.hideAll(),o.removeClass(e.getBody(),"mce-edit-focus"))},h=function(){i?i.visible()||u():(i=t.panel=g.create({type:r?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:Rt(r),fixed:Rt(r),border:1,items:[!1===l(e)?null:{type:"menubar",border:"0 0 1 0",items:oe(e)},B(e,c(e))]}),y(e),r?i.renderTo(r).reflow():i.renderTo().reflow(),w(e,i),u(),F(e),e.on("nodeChange",a),e.on("ResizeWindow",a),e.on("activate",u),e.on("deactivate",d),e.nodeChanged())};return e.settings.content_editable=!0,e.on("focus",function(){!1===f(e)&&n.skinUiCss?o.styleSheetLoader.load(n.skinUiCss,h,h):h()}),e.on("blur hide",d),e.on("remove",function(){i&&(i.remove(),i=null)}),!1===f(e)&&n.skinUiCss?o.styleSheetLoader.load(n.skinUiCss,ge(e)):ge(e)(),{}},kt=function(e,t){var n,i,r=this,o=et.classPrefix;r.show=function(s,a){function l(){n&&(ye(e).append('<div class="'+o+"throbber"+(t?" "+o+"throbber-inline":"")+'"></div>'),a&&a())}return r.hide(),n=!0,s?i=C.setTimeout(l,s):l(),r},r.hide=function(){var t=e.lastChild;return C.clearTimeout(i),t&&-1!==t.className.indexOf("throbber")&&t.parentNode.removeChild(t),n=!1,r}},Et=function(e,t){var n;e.on("ProgressState",function(e){n=n||new kt(t.panel.getEl("body")),e.state?n.show(e.time):n.hide()})},Ht=function(e,t,n){var i=function(e){var t=e.settings,n=t.skin,i=t.skin_url;if(!1!==n){var r=n||"lightgray";i=i?e.documentBaseURI.toAbsolute(i):s.baseURL+"/skins/"+r}return i}(e);return i&&(n.skinUiCss=i+"/skin.min.css",e.contentCSS.push(i+"/content"+(e.inline?".inline":"")+".min.css")),Et(e,t),e.getParam("inline",!1,"boolean")?Ct(e,t,n):be(e,t,n)},St=et.extend({Mixins:[Re],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var e=this,t=e.classPrefix;return'<div id="'+e._id+'" class="'+e.classes+'" role="presentation"><div class="'+t+'tooltip-arrow"></div><div class="'+t+'tooltip-inner">'+e.encode(e.state.get("text"))+"</div></div>"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().lastChild.innerHTML=e.encode(t.value)}),e._super()},repaint:function(){var e,t;e=this.getEl().style,t=this._layoutRect,e.left=t.x+"px",e.top=t.y+"px",e.zIndex=131070}}),Mt=et.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.canFocus=!0,e.tooltip&&!1!==Mt.tooltips&&(t.on("mouseenter",function(n){var i=t.tooltip().moveTo(-65535);if(n.control===t){var r=i.text(e.tooltip).show().testMoveRel(t.getEl(),["bc-tc","bc-tl","bc-tr"]);i.classes.toggle("tooltip-n","bc-tc"===r),i.classes.toggle("tooltip-nw","bc-tl"===r),i.classes.toggle("tooltip-ne","bc-tr"===r),i.moveRel(t.getEl(),r)}else i.hide()}),t.on("mouseleave mousedown click",function(){t.tooltip().hide()})),t.aria("label",e.ariaLabel||e.tooltip)},tooltip:function(){return _t||(_t=new St({type:"tooltip"})).renderTo(),_t},postRender:function(){var e=this,t=e.settings;e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&e.focus()},bindStates:function(){var e=this;function t(t){e.aria("disabled",t),e.classes.toggle("disabled",t)}function n(t){e.aria("pressed",t),e.classes.toggle("active",t)}return e.state.on("change:disabled",function(e){t(e.value)}),e.state.on("change:active",function(e){n(e.value)}),e.state.get("disabled")&&t(!0),e.state.get("active")&&n(!0),e._super()},remove:function(){this._super(),_t&&(_t.remove(),_t=null)}}),Tt=Mt.extend({Defaults:{value:0},init:function(e){this._super(e),this.classes.add("progress"),this.settings.filter||(this.settings.filter=function(e){return Math.round(e)})},renderHtml:function(){var e=this._id,t=this.classPrefix;return'<div id="'+e+'" class="'+this.classes+'"><div class="'+t+'bar-container"><div class="'+t+'bar"></div></div><div class="'+t+'text">0%</div></div>'},postRender:function(){return this._super(),this.value(this.settings.value),this},bindStates:function(){var e=this;function t(t){t=e.settings.filter(t),e.getEl().lastChild.innerHTML=t+"%",e.getEl().firstChild.firstChild.style.width=t+"%"}return e.state.on("change:value",function(e){t(e.value)}),t(e.state.get("value")),e._super()}}),Pt=function(e,t){e.getEl().lastChild.textContent=t+(e.progressBar?" "+e.progressBar.value()+"%":"")},Wt=et.extend({Mixins:[Re],Defaults:{classes:"widget notification"},init:function(e){var t=this;t._super(e),t.maxWidth=e.maxWidth,e.text&&t.text(e.text),e.icon&&(t.icon=e.icon),e.color&&(t.color=e.color),e.type&&t.classes.add("notification-"+e.type),e.timeout&&(e.timeout<0||e.timeout>0)&&!e.closeButton?t.closeButton=!1:(t.classes.add("has-close"),t.closeButton=!0),e.progressBar&&(t.progressBar=new Tt),t.on("click",function(e){-1!==e.target.className.indexOf(t.classPrefix+"close")&&t.close()})},renderHtml:function(){var e,t=this,n=t.classPrefix,i="",r="",o="";return t.icon&&(i='<i class="'+n+"ico "+n+"i-"+t.icon+'"></i>'),e=' style="max-width: '+t.maxWidth+"px;"+(t.color?"background-color: "+t.color+';"':'"'),t.closeButton&&(r='<button type="button" class="'+n+'close" aria-hidden="true">\xd7</button>'),t.progressBar&&(o=t.progressBar.renderHtml()),'<div id="'+t._id+'" class="'+t.classes+'"'+e+' role="presentation">'+i+'<div class="'+n+'notification-inner">'+t.state.get("text")+"</div>"+o+r+'<div style="clip: rect(1px, 1px, 1px, 1px);height: 1px;overflow: hidden;position: absolute;width: 1px;" aria-live="assertive" aria-relevant="additions" aria-atomic="true"></div></div>'},postRender:function(){var e=this;return C.setTimeout(function(){e.$el.addClass(e.classPrefix+"in"),Pt(e,e.state.get("text"))},100),e._super()},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().firstChild.innerHTML=t.value,Pt(e,t.value)}),e.progressBar&&(e.progressBar.bindStates(),e.progressBar.state.on("change:value",function(t){Pt(e,e.state.get("text"))})),e._super()},close:function(){return this.fire("close").isDefaultPrevented()||this.remove(),this},repaint:function(){var e,t;e=this.getEl().style,t=this._layoutRect,e.left=t.x+"px",e.top=t.y+"px",e.zIndex=65534}}),Dt=function(e){var t=function(e){return e.inline?e.getElement():e.getContentAreaContainer()};return{open:function(n,i){var r,o=a.extend(n,{maxWidth:(r=t(e),we.getSize(r).width)}),s=new Wt(o);return s.args=o,o.timeout>0&&(s.timer=setTimeout(function(){s.close(),i()},o.timeout)),s.on("close",function(){i()}),s.renderTo(),s},close:function(e){e.close()},reposition:function(n){var i;i=n,ee.each(i,function(e){e.moveTo(0,0)}),function(n){if(n.length>0){var i=n.slice(0,1)[0],r=t(e);i.moveRel(r,"tc-tc"),ee.each(n,function(e,t){t>0&&e.moveRel(n[t-1].getEl(),"bc-tc")})}}(n)},getArgs:function(e){return e.args}}},Nt=[],At="";function Bt(e){var t,n=ye("meta[name=viewport]")[0];!1!==_.overrideViewPort&&(n||((n=document.createElement("meta")).setAttribute("name","viewport"),document.getElementsByTagName("head")[0].appendChild(n)),(t=n.getAttribute("content"))&&void 0!==At&&(At=t),n.setAttribute("content",e?"width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0":At))}function Ot(e,t){(function(){for(var e=0;e<Nt.length;e++)if(Nt[e]._fullscreen)return!0;return!1})()&&!1===t&&ye([document.documentElement,document.body]).removeClass(e+"fullscreen")}var zt=xt.extend({modal:!0,Defaults:{border:1,layout:"flex",containerCls:"panel",role:"dialog",callbacks:{submit:function(){this.fire("submit",{data:this.toJSON()})},close:function(){this.close()}}},init:function(e){var t=this;t._super(e),t.isRtl()&&t.classes.add("rtl"),t.classes.add("window"),t.bodyClasses.add("window-body"),t.state.set("fixed",!0),e.buttons&&(t.statusbar=new ft({layout:"flex",border:"1 0 0 0",spacing:3,padding:10,align:"center",pack:t.isRtl()?"start":"end",defaults:{type:"button"},items:e.buttons}),t.statusbar.classes.add("foot"),t.statusbar.parent(t)),t.on("click",function(e){var n=t.classPrefix+"close";(we.hasClass(e.target,n)||we.hasClass(e.target.parentNode,n))&&t.close()}),t.on("cancel",function(){t.close()}),t.aria("describedby",t.describedBy||t._id+"-none"),t.aria("label",e.title),t._fullscreen=!1},recalc:function(){var e,t,n,i,r=this,o=r.statusbar;r._fullscreen&&(r.layoutRect(we.getWindowSize()),r.layoutRect().contentH=r.layoutRect().innerH),r._super(),e=r.layoutRect(),r.settings.title&&!r._fullscreen&&(t=e.headerW)>e.w&&(n=e.x-Math.max(0,t/2),r.layoutRect({w:t,x:n}),i=!0),o&&(o.layoutRect({w:r.layoutRect().innerW}).recalc(),(t=o.layoutRect().minW+e.deltaW)>e.w&&(n=e.x-Math.max(0,t-e.w),r.layoutRect({w:t,x:n}),i=!0)),i&&r.recalc()},initLayoutRect:function(){var e,t=this,n=t._super(),i=0;if(t.settings.title&&!t._fullscreen){e=t.getEl("head");var r=we.getSize(e);n.headerW=r.width,n.headerH=r.height,i+=n.headerH}t.statusbar&&(i+=t.statusbar.layoutRect().h),n.deltaH+=i,n.minH+=i,n.h+=i;var o=we.getWindowSize();return n.x=t.settings.x||Math.max(0,o.w/2-n.w/2),n.y=t.settings.y||Math.max(0,o.h/2-n.h/2),n},renderHtml:function(){var e=this,t=e._layout,n=e._id,i=e.classPrefix,r=e.settings,o="",s="",a=r.html;return e.preRender(),t.preRender(e),r.title&&(o='<div id="'+n+'-head" class="'+i+'window-head"><div id="'+n+'-title" class="'+i+'title">'+e.encode(r.title)+'</div><div id="'+n+'-dragh" class="'+i+'dragh"></div><button type="button" class="'+i+'close" aria-hidden="true"><i class="mce-ico mce-i-remove"></i></button></div>'),r.url&&(a='<iframe src="'+r.url+'" tabindex="-1"></iframe>'),void 0===a&&(a=t.renderHtml(e)),e.statusbar&&(s=e.statusbar.renderHtml()),'<div id="'+n+'" class="'+e.classes+'" hidefocus="1"><div class="'+e.classPrefix+'reset" role="application">'+o+'<div id="'+n+'-body" class="'+e.bodyClasses+'">'+a+"</div>"+s+"</div></div>"},fullscreen:function(e){var t,n,i=this,r=document.documentElement,o=i.classPrefix;if(e!==i._fullscreen)if(ye(window).on("resize",function(){var e;if(i._fullscreen)if(t)i._timer||(i._timer=C.setTimeout(function(){var e=we.getWindowSize();i.moveTo(0,0).resizeTo(e.w,e.h),i._timer=0},50));else{e=(new Date).getTime();var n=we.getWindowSize();i.moveTo(0,0).resizeTo(n.w,n.h),(new Date).getTime()-e>50&&(t=!0)}}),n=i.layoutRect(),i._fullscreen=e,e){i._initial={x:n.x,y:n.y,w:n.w,h:n.h},i.borderBox=Ee("0"),i.getEl("head").style.display="none",n.deltaH-=n.headerH+2,ye([r,document.body]).addClass(o+"fullscreen"),i.classes.add("fullscreen");var s=we.getWindowSize();i.moveTo(0,0).resizeTo(s.w,s.h)}else i.borderBox=Ee(i.settings.border),i.getEl("head").style.display="",n.deltaH+=n.headerH,ye([r,document.body]).removeClass(o+"fullscreen"),i.classes.remove("fullscreen"),i.moveTo(i._initial.x,i._initial.y).resizeTo(i._initial.w,i._initial.h);return i.reflow()},postRender:function(){var e,t=this;setTimeout(function(){t.classes.add("in"),t.fire("open")},0),t._super(),t.statusbar&&t.statusbar.postRender(),t.focus(),this.dragHelper=new ct(t._id+"-dragh",{start:function(){e={x:t.layoutRect().x,y:t.layoutRect().y}},drag:function(n){t.moveTo(e.x+n.deltaX,e.y+n.deltaY)}}),t.on("submit",function(e){e.isDefaultPrevented()||t.close()}),Nt.push(t),Bt(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e,t=this;for(t.dragHelper.destroy(),t._super(),t.statusbar&&this.statusbar.remove(),Ot(t.classPrefix,!1),e=Nt.length;e--;)Nt[e]===t&&Nt.splice(e,1);Bt(Nt.length>0)},getContentWindow:function(){var e=this.getEl().getElementsByTagName("iframe")[0];return e?e.contentWindow:null}});!function(){if(!_.desktop){var e={w:window.innerWidth,h:window.innerHeight};C.setInterval(function(){var t=window.innerWidth,n=window.innerHeight;e.w===t&&e.h===n||(e={w:t,h:n},ye(window).trigger("resize"))},100)}ye(window).on("resize",function(){var e,t,n=we.getWindowSize();for(e=0;e<Nt.length;e++)t=Nt[e].layoutRect(),Nt[e].moveTo(Nt[e].settings.x||Math.max(0,n.w/2-t.w/2),Nt[e].settings.y||Math.max(0,n.h/2-t.h/2))})}();var Lt=zt.extend({init:function(e){e={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(e)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(e){var t,n=e.callback||function(){};function i(e,t,i){return{type:"button",text:e,subtype:i?"primary":"",onClick:function(e){e.control.parents()[1].close(),n(t)}}}switch(e.buttons){case Lt.OK_CANCEL:t=[i("Ok",!0,!0),i("Cancel",!1)];break;case Lt.YES_NO:case Lt.YES_NO_CANCEL:t=[i("Yes",1,!0),i("No",0)],e.buttons===Lt.YES_NO_CANCEL&&t.push(i("Cancel",-1));break;default:t=[i("Ok",!0,!0)]}return new zt({padding:20,x:e.x,y:e.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:t,title:e.title,role:"alertdialog",items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:e.text},onPostRender:function(){this.aria("describedby",this.items()[0]._id)},onClose:e.onClose,onCancel:function(){n(!1)}}).renderTo(document.body).reflow()},alert:function(e,t){return"string"==typeof e&&(e={text:e}),e.callback=t,Lt.msgBox(e)},confirm:function(e,t){return"string"==typeof e&&(e={text:e}),e.callback=t,e.buttons=Lt.OK_CANCEL,Lt.msgBox(e)}}}),It=function(e){return{renderUI:function(t){return Ht(e,this,t)},resizeTo:function(t,n){return ue(e,t,n)},resizeBy:function(t,n){return ce(e,t,n)},getNotificationManagerImpl:function(){return Dt(e)},getWindowManagerImpl:function(){return{open:function(e,t,n){var i;return e.title=e.title||" ",e.url=e.url||e.file,e.url&&(e.width=parseInt(e.width||320,10),e.height=parseInt(e.height||240,10)),e.body&&(e.items={defaults:e.defaults,type:e.bodyType||"form",items:e.body,data:e.data,callbacks:e.commands}),e.url||e.buttons||(e.buttons=[{text:"Ok",subtype:"primary",onclick:function(){i.find("form")[0].submit()}},{text:"Cancel",onclick:function(){i.close()}}]),(i=new zt(e)).on("close",function(){n(i)}),e.data&&i.on("postRender",function(){this.find("*").each(function(t){var n=t.name();n in e.data&&t.value(e.data[n])})}),i.features=e||{},i.params=t||{},i=i.renderTo().reflow()},alert:function(e,t,n){var i;return(i=Lt.alert(e,function(){t()})).on("close",function(){n(i)}),i},confirm:function(e,t,n){var i;return(i=Lt.confirm(e,function(e){t(e)})).on("close",function(){n(i)}),i},close:function(e){e.close()},getParams:function(e){return e.params},setParams:function(e,t){e.params=t}}}}},Ft=Ce.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(e){this.settings=a.extend({},this.Defaults,e)},preRender:function(e){e.bodyClasses.add(this.settings.containerClass)},applyClasses:function(e){var t,n,i,r,o=this.settings;t=o.firstControlClass,n=o.lastControlClass,e.each(function(e){e.classes.remove(t).remove(n).add(o.controlClass),e.visible()&&(i||(i=e),r=e)}),i&&i.classes.add(t),r&&r.classes.add(n)},renderHtml:function(e){var t="";return this.applyClasses(e.items()),e.items().each(function(e){t+=e.renderHtml()}),t},recalc:function(){},postRender:function(){},isNative:function(){return!1}}),Vt=Ft.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(e){e.items().filter(":visible").each(function(e){var t=e.settings;e.layoutRect({x:t.x,y:t.y,w:t.w,h:t.h}),e.recalc&&e.recalc()})},renderHtml:function(e){return'<div id="'+e._id+'-absend" class="'+e.classPrefix+'abs-end"></div>'+this._super(e)}}),Ut=Mt.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t,n=this;n._super(e),e=n.settings,t=n.settings.size,n.on("click mousedown",function(e){e.preventDefault()}),n.on("touchstart",function(e){n.fire("click",e),e.preventDefault()}),e.subtype&&n.classes.add(e.subtype),t&&n.classes.add("btn-"+t),e.icon&&n.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e,t=this.getEl().firstChild;t&&((e=t.style).width=e.height="100%"),this._super()},renderHtml:function(){var e,t,n=this,i=n._id,r=n.classPrefix,o=n.state.get("icon"),s=n.state.get("text"),a="",l=n.settings;return(e=l.image)?(o="none","string"!=typeof e&&(e=window.getSelection?e[0]:e[1]),e=" style=\"background-image: url('"+e+"')\""):e="",s&&(n.classes.add("btn-has-text"),a='<span class="'+r+'txt">'+n.encode(s)+"</span>"),o=o?r+"ico "+r+"i-"+o:"",t="boolean"==typeof l.active?' aria-pressed="'+l.active+'"':"",'<div id="'+i+'" class="'+n.classes+'" tabindex="-1"'+t+'><button id="'+i+'-button" role="presentation" type="button" tabindex="-1">'+(o?'<i class="'+o+'"'+e+"></i>":"")+a+"</button></div>"},bindStates:function(){var e=this,t=e.$,n=e.classPrefix+"txt";function i(i){var r=t("span."+n,e.getEl());i?(r[0]||(t("button:first",e.getEl()).append('<span class="'+n+'"></span>'),r=t("span."+n,e.getEl())),r.html(e.encode(i))):r.remove(),e.classes.toggle("btn-has-text",!!i)}return e.state.on("change:text",function(e){i(e.value)}),e.state.on("change:icon",function(t){var n=t.value,r=e.classPrefix;e.settings.icon=n,n=n?r+"ico "+r+"i-"+e.settings.icon:"";var o=e.getEl().firstChild,s=o.getElementsByTagName("i")[0];n?(s&&s===o.firstChild||(s=document.createElement("i"),o.insertBefore(s,o.firstChild)),s.className=n):s&&o.removeChild(s),i(e.state.get("text"))}),e._super()}}),Yt=Ut.extend({init:function(e){e=a.extend({text:"Browse...",multiple:!1,accept:null},e),this._super(e),this.classes.add("browsebutton"),e.multiple&&this.classes.add("multiple")},postRender:function(){var e=this,t=we.create("input",{type:"file",id:e._id+"-browse",accept:e.settings.accept});e._super(),ye(t).on("change",function(t){var n=t.target.files;e.value=function(){return n.length?e.settings.multiple?n:n[0]:null},t.preventDefault(),n.length&&e.fire("change",t)}),ye(t).on("click",function(e){e.stopPropagation()}),ye(e.getEl("button")).on("click",function(e){e.stopPropagation(),t.click()}),e.getEl().appendChild(t)},remove:function(){ye(this.getEl("button")).off(),ye(this.getEl("input")).off(),this._super()}}),$t=rt.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'<div id="'+e._id+'" class="'+e.classes+'"><div id="'+e._id+'-body">'+(e.settings.html||"")+t.renderHtml(e)+"</div></div>"}}),jt=Mt.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'<div id="'+t+'" class="'+e.classes+'" unselectable="on" aria-labelledby="'+t+'-al" tabindex="-1"><i class="'+n+"ico "+n+'i-checkbox"></i><span id="'+t+'-al" class="'+n+'label">'+e.encode(e.state.get("text"))+"</span></div>"},bindStates:function(){var e=this;function t(t){e.classes.toggle("checked",t),e.aria("checked",t)}return e.state.on("change:text",function(t){e.getEl("al").firstChild.data=e.translate(t.value)}),e.state.on("change:checked change:value",function(n){e.fire("change"),t(n.value)}),e.state.on("change:icon",function(t){var n=t.value,i=e.classPrefix;if(void 0===n)return e.settings.icon;e.settings.icon=n,n=n?i+"ico "+i+"i-"+e.settings.icon:"";var r=e.getEl().firstChild,o=r.getElementsByTagName("i")[0];n?(o&&o===r.firstChild||(o=document.createElement("i"),r.insertBefore(o,r.firstChild)),o.className=n):o&&r.removeChild(o)}),e.state.get("checked")&&t(!0),e._super()}}),qt=tinymce.util.Tools.resolve("tinymce.util.VK"),Xt=Mt.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.classes.add("combobox"),t.subinput=!0,t.ariaTarget="inp",e.menu=e.menu||e.values,e.menu&&(e.icon="caret"),t.on("click",function(n){var i=n.target,r=t.getEl();if(ye.contains(r,i)||i===r)for(;i&&i!==r;)i.id&&-1!==i.id.indexOf("-open")&&(t.fire("action"),e.menu&&(t.showMenu(),n.aria&&t.menu.items()[0].focus())),i=i.parentNode}),t.on("keydown",function(e){var n;13===e.keyCode&&"INPUT"===e.target.nodeName&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){if("INPUT"===e.target.nodeName){var n=t.state.get("value"),i=e.target.value;i!==n&&(t.state.set("value",i),t.fire("autocomplete",e))}}),t.on("mouseover",function(e){var n=t.tooltip().moveTo(-65535);if(t.statusLevel()&&-1!==e.target.className.indexOf(t.classPrefix+"status")){var i=t.statusMessage()||"Ok",r=n.text(i).show().testMoveRel(e.target,["bc-tc","bc-tl","bc-tr"]);n.classes.toggle("tooltip-n","bc-tc"===r),n.classes.toggle("tooltip-nw","bc-tl"===r),n.classes.toggle("tooltip-ne","bc-tr"===r),n.moveRel(e.target,r)}})},statusLevel:function(e){return arguments.length>0&&this.state.set("statusLevel",e),this.state.get("statusLevel")},statusMessage:function(e){return arguments.length>0&&this.state.set("statusMessage",e),this.state.get("statusMessage")},showMenu:function(){var e,t=this,n=t.settings;t.menu||((e=n.menu||[]).length?e={type:"menu",items:e}:e.type=e.type||"menu",t.menu=g.create(e).parent(t).renderTo(t.getContainerElm()),t.fire("createmenu"),t.menu.reflow(),t.menu.on("cancel",function(e){e.control===t.menu&&t.focus()}),t.menu.on("show hide",function(e){e.control.items().each(function(e){e.active(e.value()===t.value())})}).fire("show"),t.menu.on("select",function(e){t.value(e.control.value())}),t.on("focusin",function(e){"INPUT"===e.target.tagName.toUpperCase()&&t.menu.hide()}),t.aria("expanded",!0)),t.menu.show(),t.menu.layoutRect({w:t.layoutRect().w}),t.menu.moveRel(t.getEl(),t.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var e,t,n=this,i=n.getEl(),r=n.getEl("open"),o=n.layoutRect(),s=0,a=i.firstChild;n.statusLevel()&&"none"!==n.statusLevel()&&(s=parseInt(we.getRuntimeStyle(a,"padding-right"),10)-parseInt(we.getRuntimeStyle(a,"padding-left"),10)),e=r?o.w-we.getSize(r).width-10:o.w-10;var l=document;return l.all&&(!l.documentMode||l.documentMode<=8)&&(t=n.layoutRect().h-2+"px"),ye(a).css({width:e-s,lineHeight:t}),n._super(),n},postRender:function(){var e=this;return ye(this.getEl("inp")).on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)}),e._super()},renderHtml:function(){var e,t,n,i=this,r=i._id,o=i.settings,s=i.classPrefix,a=i.state.get("value")||"",l="",u="";return"spellcheck"in o&&(u+=' spellcheck="'+o.spellcheck+'"'),o.maxLength&&(u+=' maxlength="'+o.maxLength+'"'),o.size&&(u+=' size="'+o.size+'"'),o.subtype&&(u+=' type="'+o.subtype+'"'),n='<i id="'+r+'-status" class="mce-status mce-ico" style="display: none"></i>',i.disabled()&&(u+=' disabled="disabled"'),(e=o.icon)&&"caret"!==e&&(e=s+"ico "+s+"i-"+o.icon),t=i.state.get("text"),(e||t)&&(l='<div id="'+r+'-open" class="'+s+"btn "+s+'open" tabIndex="-1" role="button"><button id="'+r+'-action" type="button" hidefocus="1" tabindex="-1">'+("caret"!==e?'<i class="'+e+'"></i>':'<i class="'+s+'caret"></i>')+(t?(e?" ":"")+t:"")+"</button></div>",i.classes.add("has-open")),'<div id="'+r+'" class="'+i.classes+'"><input id="'+r+'-inp" class="'+s+'textbox" value="'+i.encode(a,!1)+'" hidefocus="1"'+u+' placeholder="'+i.encode(o.placeholder)+'" />'+n+l+"</div>"},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},showAutoComplete:function(e,t){var n=this;if(0!==e.length){n.menu?n.menu.items().remove():n.menu=g.create({type:"menu",classes:"combobox-menu",layout:"flow"}).parent(n).renderTo(),a.each(e,function(e){var i,r;n.menu.add({text:e.title,url:e.previewUrl,match:t,classes:"menu-item-ellipsis",onclick:(i=e.value,r=e.title,function(){n.fire("selectitem",{title:r,value:i})})})}),n.menu.renderNew(),n.hideMenu(),n.menu.on("cancel",function(e){e.control.parent()===n.menu&&(e.stopPropagation(),n.focus(),n.hideMenu())}),n.menu.on("select",function(){n.focus()});var i=n.layoutRect().w;n.menu.layoutRect({w:i,minW:0,maxW:i}),n.menu.repaint(),n.menu.reflow(),n.menu.show(),n.menu.moveRel(n.getEl(),n.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])}else n.hideMenu()},hideMenu:function(){this.menu&&this.menu.hide()},bindStates:function(){var e=this;e.state.on("change:value",function(t){e.getEl("inp").value!==t.value&&(e.getEl("inp").value=t.value)}),e.state.on("change:disabled",function(t){e.getEl("inp").disabled=t.value}),e.state.on("change:statusLevel",function(t){var n=e.getEl("status"),i=e.classPrefix,r=t.value;we.css(n,"display","none"===r?"none":""),we.toggleClass(n,i+"i-checkmark","ok"===r),we.toggleClass(n,i+"i-warning","warn"===r),we.toggleClass(n,i+"i-error","error"===r),e.classes.toggle("has-status","none"!==r),e.repaint()}),we.on(e.getEl("status"),"mouseleave",function(){e.tooltip().hide()}),e.on("cancel",function(t){e.menu&&e.menu.visible()&&(t.stopPropagation(),e.hideMenu())});var t=function(e,t){t&&t.items().length>0&&t.items().eq(e)[0].focus()};return e.on("keydown",function(n){var i=n.keyCode;"INPUT"===n.target.nodeName&&(i===qt.DOWN?(n.preventDefault(),e.fire("autocomplete"),t(0,e.menu)):i===qt.UP&&(n.preventDefault(),t(-1,e.menu)))}),e._super()},remove:function(){ye(this.getEl("inp")).off(),this.menu&&this.menu.remove(),this._super()}}),Jt=Xt.extend({init:function(e){var t=this;e.spellcheck=!1,e.onaction&&(e.icon="none"),t._super(e),t.classes.add("colorbox"),t.on("change keyup postrender",function(){t.repaintColor(t.value())})},repaintColor:function(e){var t=this.getEl("open"),n=t?t.getElementsByTagName("i")[0]:null;if(n)try{n.style.background=e}catch(i){}},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.state.get("rendered")&&e.repaintColor(t.value)}),e._super()}}),Gt=Ut.extend({showPanel:function(){var e=this,t=e.settings;if(e.classes.add("opened"),e.panel)e.panel.show();else{var n=t.panel;n.type&&(n={layout:"grid",items:n}),n.role=n.role||"dialog",n.popover=!0,n.autohide=!0,n.ariaRoot=!0,e.panel=new xt(n).on("hide",function(){e.classes.remove("opened")}).on("cancel",function(t){t.stopPropagation(),e.focus(),e.hidePanel()}).parent(e).renderTo(e.getContainerElm()),e.panel.fire("show"),e.panel.reflow()}var i=e.panel.testMoveRel(e.getEl(),t.popoverAlign||(e.isRtl()?["bc-tc","bc-tl","bc-tr"]:["bc-tc","bc-tr","bc-tl"]));e.panel.classes.toggle("start","bc-tl"===i),e.panel.classes.toggle("end","bc-tr"===i),e.panel.moveRel(e.getEl(),i)},hidePanel:function(){this.panel&&this.panel.hide()},postRender:function(){var e=this;return e.aria("haspopup",!0),e.on("click",function(t){t.control===e&&(e.panel&&e.panel.visible()?e.hidePanel():(e.showPanel(),e.panel.focus(!!t.aria)))}),e._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}}),Kt=m.DOM,Zt=Gt.extend({init:function(e){this._super(e),this.classes.add("splitbtn"),this.classes.add("colorbutton")},color:function(e){return e?(this._color=e,this.getEl("preview").style.backgroundColor=e,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,i=e.state.get("text"),r=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"",o=e.settings.image?" style=\"background-image: url('"+e.settings.image+"')\"":"",s="";return i&&(e.classes.add("btn-has-text"),s='<span class="'+n+'txt">'+e.encode(i)+"</span>"),'<div id="'+t+'" class="'+e.classes+'" role="button" tabindex="-1" aria-haspopup="true"><button role="presentation" hidefocus="1" type="button" tabindex="-1">'+(r?'<i class="'+r+'"'+o+"></i>":"")+'<span id="'+t+'-preview" class="'+n+'preview"></span>'+s+'</button><button type="button" class="'+n+'open" hidefocus="1" tabindex="-1"> <i class="'+n+'caret"></i></button></div>'},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(n){n.aria&&"down"===n.aria.key||n.control!==e||Kt.getParent(n.target,"."+e.classPrefix+"open")||(n.stopImmediatePropagation(),t.call(e,n))}),delete e.settings.onclick,e._super()}}),Qt=tinymce.util.Tools.resolve("tinymce.util.Color"),en=Mt.extend({Defaults:{classes:"widget colorpicker"},init:function(e){this._super(e)},postRender:function(){var e,t,n,i,r,o=this,s=o.color();function a(e,t){var n,i,r=we.getPos(e);return n=t.pageX-r.x,i=t.pageY-r.y,{x:n=Math.max(0,Math.min(n/e.clientWidth,1)),y:i=Math.max(0,Math.min(i/e.clientHeight,1))}}function l(e,t){var s=(360-e.h)/360;we.css(n,{top:100*s+"%"}),t||we.css(r,{left:e.s+"%",top:100-e.v+"%"}),i.style.background=Qt({s:100,v:100,h:e.h}).toHex(),o.color().parse({s:e.s,v:e.v,h:e.h})}function u(t){var n;n=a(i,t),e.s=100*n.x,e.v=100*(1-n.y),l(e),o.fire("change")}function c(n){var i;i=a(t,n),(e=s.toHsv()).h=360*(1-i.y),l(e,!0),o.fire("change")}t=o.getEl("h"),n=o.getEl("hp"),i=o.getEl("sv"),r=o.getEl("svp"),o._repaint=function(){l(e=s.toHsv())},o._super(),o._svdraghelper=new ct(o._id+"-sv",{start:u,drag:u}),o._hdraghelper=new ct(o._id+"-h",{start:c,drag:c}),o._repaint()},rgb:function(){return this.color().toRgb()},value:function(e){if(!arguments.length)return this.color().toHex();this.color().parse(e),this._rendered&&this._repaint()},color:function(){return this._color||(this._color=Qt()),this._color},renderHtml:function(){var e,t=this._id,n=this.classPrefix,i="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000";return e='<div id="'+t+'-h" class="'+n+'colorpicker-h" style="background: -ms-linear-gradient(top,'+i+");background: linear-gradient(to bottom,"+i+');">'+function(){var e,t,r,o,s="";for(r="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",e=0,t=(o=i.split(",")).length-1;e<t;e++)s+='<div class="'+n+'colorpicker-h-chunk" style="height:'+100/t+"%;"+r+o[e]+",endColorstr="+o[e+1]+");-ms-"+r+o[e]+",endColorstr="+o[e+1]+')"></div>';return s}()+'<div id="'+t+'-hp" class="'+n+'colorpicker-h-marker"></div></div>','<div id="'+t+'" class="'+this.classes+'"><div id="'+t+'-sv" class="'+n+'colorpicker-sv"><div class="'+n+'colorpicker-overlay1"><div class="'+n+'colorpicker-overlay2"><div id="'+t+'-svp" class="'+n+'colorpicker-selector1"><div class="'+n+'colorpicker-selector2"></div></div></div></div></div>'+e+"</div>"}}),tn=Mt.extend({init:function(e){e=a.extend({height:100,text:"Drop an image here",multiple:!1,accept:null},e),this._super(e),this.classes.add("dropzone"),e.multiple&&this.classes.add("multiple")},renderHtml:function(){var e,t,n=this.settings;return e={id:this._id,hidefocus:"1"},t=we.create("div",e,"<span>"+this.translate(n.text)+"</span>"),n.height&&we.css(t,"height",n.height+"px"),n.width&&we.css(t,"width",n.width+"px"),t.className=this.classes,t.outerHTML},postRender:function(){var e=this,t=function(t){t.preventDefault(),e.classes.toggle("dragenter"),e.getEl().className=e.classes};e._super(),e.$el.on("dragover",function(e){e.preventDefault()}),e.$el.on("dragenter",t),e.$el.on("dragleave",t),e.$el.on("drop",function(t){if(t.preventDefault(),!e.state.get("disabled")){var n=function(t){var n=e.settings.accept;if("string"!=typeof n)return t;var i=new RegExp("("+n.split(/\s*,\s*/).join("|")+")$","i");return a.grep(t,function(e){return i.test(e.name)})}(t.dataTransfer.files);e.value=function(){return n.length?e.settings.multiple?n:n[0]:null},n.length&&e.fire("change",t)}})},remove:function(){this.$el.off(),this._super()}}),nn=Mt.extend({init:function(e){var t=this;e.delimiter||(e.delimiter="\xbb"),t._super(e),t.classes.add("path"),t.canFocus=!0,t.on("click",function(e){var n;(n=e.target.getAttribute("data-index"))&&t.fire("select",{value:t.row()[n],index:n})}),t.row(t.settings.row)},focus:function(){return this.getEl().firstChild.focus(),this},row:function(e){return arguments.length?(this.state.set("row",e),this):this.state.get("row")},renderHtml:function(){return'<div id="'+this._id+'" class="'+this.classes+'">'+this._getDataPathHtml(this.state.get("row"))+"</div>"},bindStates:function(){var e=this;return e.state.on("change:row",function(t){e.innerHtml(e._getDataPathHtml(t.value))}),e._super()},_getDataPathHtml:function(e){var t,n,i=e||[],r="",o=this.classPrefix;for(t=0,n=i.length;t<n;t++)r+=(t>0?'<div class="'+o+'divider" aria-hidden="true"> '+this.settings.delimiter+" </div>":"")+'<div role="button" class="'+o+"path-item"+(t===n-1?" "+o+"last":"")+'" data-index="'+t+'" tabindex="-1" id="'+this._id+"-"+t+'" aria-level="'+(t+1)+'">'+i[t].name+"</div>";return r||(r='<div class="'+o+'path-item">\xa0</div>'),r}}),rn=nn.extend({postRender:function(){var e=this,t=e.settings.editor;function n(e){if(1===e.nodeType){if("BR"===e.nodeName||e.getAttribute("data-mce-bogus"))return!0;if("bookmark"===e.getAttribute("data-mce-type"))return!0}return!1}return!1!==t.settings.elementpath&&(e.on("select",function(e){t.focus(),t.selection.select(this.row()[e.index].element),t.nodeChanged()}),t.on("nodeChange",function(i){for(var r=[],o=i.parents,s=o.length;s--;)if(1===o[s].nodeType&&!n(o[s])){var a=t.fire("ResolveName",{name:o[s].nodeName.toLowerCase(),target:o[s]});if(a.isDefaultPrevented()||r.push({name:a.name,element:o[s]}),a.isPropagationStopped())break}e.row(r)})),e._super()}}),on=rt.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.classes.add("formitem"),t.preRender(e),'<div id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1">'+(e.settings.title?'<div id="'+e._id+'-title" class="'+n+'title">'+e.settings.title+"</div>":"")+'<div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+(e.settings.html||"")+t.renderHtml(e)+"</div></div>"}}),sn=rt.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:15,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var e=this,t=e.items();e.settings.formItemDefaults||(e.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),t.each(function(t){var n,i=t.settings.label;i&&((n=new on(a.extend({items:{type:"label",id:t._id+"-l",text:i,flex:0,forId:t._id,disabled:t.disabled()}},e.settings.formItemDefaults))).type="formitem",t.aria("labelledby",t._id+"-l"),"undefined"==typeof t.settings.flex&&(t.settings.flex=1),e.replace(t,n),n.add(t))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){this._super(),this.fromJSON(this.settings.data)},bindStates:function(){var e=this;function t(){var t,n,i=0,r=[];if(!1!==e.settings.labelGapCalc)for(("children"===e.settings.labelGapCalc?e.find("formitem"):e.items()).filter("formitem").each(function(e){var t=e.items()[0],n=t.getEl().clientWidth;i=n>i?n:i,r.push(t)}),n=e.settings.labelGap||0,t=r.length;t--;)r[t].settings.minWidth=i+n}e._super(),e.on("show",t),t()}}),an=sn.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.preRender(),t.preRender(e),'<fieldset id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1">'+(e.settings.title?'<legend id="'+e._id+'-title" class="'+n+'fieldset-title">'+e.settings.title+"</legend>":"")+'<div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+(e.settings.html||"")+t.renderHtml(e)+"</div></fieldset>"}}),ln=0,un=function(e){var t=(new Date).getTime();return e+"_"+Math.floor(1e9*Math.random())+ ++ln+String(t)},cn=function(e){if(null===e||e===undefined)throw new Error("Node cannot be null or undefined");return{dom:E.constant(e)}},dn={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1)throw console.error("HTML does not have a single root node",e),"HTML must have a single root node";return cn(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return cn(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return cn(n)},fromDom:cn,fromPoint:function(e,t,n){return W.from(e.dom().elementFromPoint(t,n)).map(cn)}},fn=function(e){var t,n=!1;return function(){return n||(n=!0,t=e.apply(null,arguments)),t}},hn=8,mn=9,gn=1,pn=3,vn=function(e){return e.dom().nodeName.toLowerCase()},bn=function(e){return e.dom().nodeType},yn=function(e){return function(t){return bn(t)===e}},xn=yn(gn),wn=yn(pn),_n=yn(mn),Rn={name:vn,type:bn,value:function(e){return e.dom().nodeValue},isElement:xn,isText:wn,isDocument:_n,isComment:function(e){return bn(e)===hn||"#comment"===vn(e)}},Cn=(fn(function(){return Cn(dn.fromDom(document))}),function(e){var t=e.dom().body;if(null===t||t===undefined)throw"Body is not available yet";return dn.fromDom(t)}),kn=function(e){return function(t){return function(e){if(null===e)return"null";var t=typeof e;return"object"===t&&Array.prototype.isPrototypeOf(e)?"array":"object"===t&&String.prototype.isPrototypeOf(e)?"string":t}(t)===e}},En=(kn("string"),kn("object"),kn("array"),kn("null"),kn("boolean"),kn("undefined"),kn("function"),kn("number"),Object.keys,undefined,function(){var e=arguments;return function(){for(var t=new Array(arguments.length),n=0;n<t.length;n++)t[n]=arguments[n];if(e.length!==t.length)throw new Error('Wrong number of arguments to struct. Expected "['+e.length+']", got '+t.length+" arguments");var i={};return ee.each(e,function(e,n){i[e]=E.constant(t[n])}),i}}),Hn=("undefined"!=typeof window?window:Function("return this;")(),function(e,t){var n=function(e,t){for(var n=0;n<e.length;n++){var i=e[n];if(i.test(t))return i}return undefined}(e,t);if(!n)return{major:0,minor:0};var i=function(e){return Number(t.replace(n,"$"+e))};return Mn(i(1),i(2))}),Sn=function(){return Mn(0,0)},Mn=function(e,t){return{major:e,minor:t}},Tn={nu:Mn,detect:function(e,t){var n=String(t).toLowerCase();return 0===e.length?Sn():Hn(e,n)},unknown:Sn},Pn="Firefox",Wn=function(e,t){return function(){return t===e}},Dn=function(e){var t=e.current;return{current:t,version:e.version,isEdge:Wn("Edge",t),isChrome:Wn("Chrome",t),isIE:Wn("IE",t),isOpera:Wn("Opera",t),isFirefox:Wn(Pn,t),isSafari:Wn("Safari",t)}},Nn={unknown:function(){return Dn({current:undefined,version:Tn.unknown()})},nu:Dn,edge:E.constant("Edge"),chrome:E.constant("Chrome"),ie:E.constant("IE"),opera:E.constant("Opera"),firefox:E.constant(Pn),safari:E.constant("Safari")},An="Windows",Bn="Android",On="Solaris",zn="FreeBSD",Ln=function(e,t){return function(){return t===e}},In=function(e){var t=e.current;return{current:t,version:e.version,isWindows:Ln(An,t),isiOS:Ln("iOS",t),isAndroid:Ln(Bn,t),isOSX:Ln("OSX",t),isLinux:Ln("Linux",t),isSolaris:Ln(On,t),isFreeBSD:Ln(zn,t)}},Fn={unknown:function(){return In({current:undefined,version:Tn.unknown()})},nu:In,windows:E.constant(An),ios:E.constant("iOS"),android:E.constant(Bn),linux:E.constant("Linux"),osx:E.constant("OSX"),solaris:E.constant(On),freebsd:E.constant(zn)},Vn=function(e,t){var n=String(t).toLowerCase();return ee.find(e,function(e){return e.search(n)})},Un=function(e,t){return Vn(e,t).map(function(e){var n=Tn.detect(e.versionRegexes,t);return{current:e.name,version:n}})},Yn=function(e,t){return Vn(e,t).map(function(e){var n=Tn.detect(e.versionRegexes,t);return{current:e.name,version:n}})},$n=function(e,t){return-1!==e.indexOf(t)},jn=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,qn=function(e){return function(t){return $n(t,e)}},Xn=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return $n(e,"edge/")&&$n(e,"chrome")&&$n(e,"safari")&&$n(e,"applewebkit")}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,jn],search:function(e){return $n(e,"chrome")&&!$n(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return $n(e,"msie")||$n(e,"trident")}},{name:"Opera",versionRegexes:[jn,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:qn("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:qn("firefox")},{name:"Safari",versionRegexes:[jn,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return($n(e,"safari")||$n(e,"mobile/"))&&$n(e,"applewebkit")}}],Jn=[{name:"Windows",search:qn("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return $n(e,"iphone")||$n(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:qn("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:qn("os x"),versionRegexes:[/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:qn("linux"),versionRegexes:[]},{name:"Solaris",search:qn("sunos"),versionRegexes:[]},{name:"FreeBSD",search:qn("freebsd"),versionRegexes:[]}],Gn={browsers:E.constant(Xn),oses:E.constant(Jn)},Kn=function(e){var t,n,i,r,o,s,a,l,u,c,d,f=Gn.browsers(),h=Gn.oses(),m=Un(f,e).fold(Nn.unknown,Nn.nu),g=Yn(h,e).fold(Fn.unknown,Fn.nu);return{browser:m,os:g,deviceType:(n=m,i=e,r=(t=g).isiOS()&&!0===/ipad/i.test(i),o=t.isiOS()&&!r,s=t.isAndroid()&&3===t.version.major,a=t.isAndroid()&&4===t.version.major,l=r||s||a&&!0===/mobile/i.test(i),u=t.isiOS()||t.isAndroid(),c=u&&!l,d=n.isSafari()&&t.isiOS()&&!1===/safari/i.test(i),{isiPad:E.constant(r),isiPhone:E.constant(o),isTablet:E.constant(l),isPhone:E.constant(c),isTouch:E.constant(u),isAndroid:t.isAndroid,isiOS:t.isiOS,isWebView:E.constant(d)})}},Zn=gn,Qn=mn,ei=function(e){return e.nodeType!==Zn&&e.nodeType!==Qn||0===e.childElementCount},ti={all:function(e,t){var n=t===undefined?document:t.dom();return ei(n)?[]:ee.map(n.querySelectorAll(e),dn.fromDom)},is:function(e,t){var n=e.dom();if(n.nodeType!==Zn)return!1;if(n.matches!==undefined)return n.matches(t);if(n.msMatchesSelector!==undefined)return n.msMatchesSelector(t);if(n.webkitMatchesSelector!==undefined)return n.webkitMatchesSelector(t);if(n.mozMatchesSelector!==undefined)return n.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")},one:function(e,t){var n=t===undefined?document:t.dom();return ei(n)?W.none():W.from(n.querySelector(e)).map(dn.fromDom)}},ni=(fn(function(){var e=navigator.userAgent;return Kn(e)})().browser.isIE(),En("element","offset"),function(e,t){return ti.all(t,e)}),ii=a.trim,ri=function(e){return function(t){if(t&&1===t.nodeType){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1}},oi=ri("true"),si=ri("false"),ai=function(e,t,n,i,r){return{type:e,title:t,url:n,level:i,attach:r}},li=function(e){return e.innerText||e.textContent},ui=function(e){return(t=e)&&"A"===t.nodeName&&(t.id||t.name)&&di(e);var t},ci=function(e){return e&&/^(H[1-6])$/.test(e.nodeName)},di=function(e){return function(e){for(;e=e.parentNode;){var t=e.contentEditable;if(t&&"inherit"!==t)return oi(e)}return!1}(e)&&!si(e)},fi=function(e){return ci(e)&&di(e)},hi=function(e){var t,n,i=(t=e).id?t.id:un("h");return ai("header",li(e),"#"+i,ci(n=e)?parseInt(n.nodeName.substr(1),10):0,function(){e.id=i})},mi=function(e){var t=e.id||e.name,n=li(e);return ai("anchor",n||"#"+t,"#"+t,0,E.noop)},gi=function(e){var t,n;return t="h1,h2,h3,h4,h5,h6,a:not([href])",n=e,ee.map(ni(dn.fromDom(n),t),function(e){return e.dom()})},pi=function(e){return ii(e.title).length>0},vi=function(e){var t,n,i=gi(e);return ee.filter((n=i,ee.map(ee.filter(n,fi),hi)).concat((t=i,ee.map(ee.filter(t,ui),mi))),pi)},bi={},yi=function(e){return{title:e.title,value:{title:{raw:e.title},url:e.url,attach:e.attach}}},xi=function(e,t){return{title:e,value:{title:e,url:t,attach:E.noop}}},wi=function(e,t,n){var i=t in e?e[t]:n;return!1===i?null:i},_i=function(e,t,n,i){var r,o,s,l,u={title:"-"},c=function(e){var i=e.hasOwnProperty(n)?e[n]:[],r=ee.filter(i,function(e){return n=e,i=t,!ee.exists(i,function(e){return e.url===n});var n,i});return a.map(r,function(e){return{title:e,value:{title:e,url:e,attach:E.noop}}})},d=function(e){var n,i=ee.filter(t,function(t){return t.type===e});return n=i,a.map(n,yi)};return!1===i.typeahead_urls?[]:"file"===n?(r=[Ri(e,c(bi)),Ri(e,d("header")),Ri(e,(o=d("anchor"),s=wi(i,"anchor_top","#top"),l=wi(i,"anchor_bottom","#bottom"),null!==s&&o.unshift(xi("<top>",s)),null!==l&&o.push(xi("<bottom>",l)),o))],ee.foldl(r,function(e,t){return 0===e.length||0===t.length?e.concat(t):e.concat(u,t)},[])):Ri(e,c(bi))},Ri=function(e,t){var n=e.toLowerCase(),i=a.grep(t,function(e){return-1!==e.title.toLowerCase().indexOf(n)});return 1===i.length&&i[0].title===e?[]:i},Ci=function(e,t,n,i){var r=function(r){var o=vi(n),s=_i(r,o,i,t);e.showAutoComplete(s,r)};e.on("autocomplete",function(){r(e.value())}),e.on("selectitem",function(t){var n=t.value;e.value(n.url);var r,o=(r=n.title).raw?r.raw:r;"image"===i?e.fire("change",{meta:{alt:o,attach:n.attach}}):e.fire("change",{meta:{text:o,attach:n.attach}}),e.focus()}),e.on("click",function(t){0===e.value().length&&"INPUT"===t.target.nodeName&&r("")}),e.on("PostRender",function(){e.getRoot().on("submit",function(t){var n,r,o;t.isDefaultPrevented()||(n=e.value(),o=bi[r=i],/^https?/.test(n)&&(o?-1===ee.indexOf(o,n)&&(bi[r]=o.slice(0,5).concat(n)):bi[r]=[n]))})})},ki=function(e,t,n){var i=t.filepicker_validator_handler;i&&e.state.on("change:value",function(t){var r;0!==(r=t.value).length?i({url:r,type:n},function(t){var n,i,r,o=(i=(n=t).status,r=n.message,"valid"===i?{status:"ok",message:r}:"unknown"===i?{status:"warn",message:r}:"invalid"===i?{status:"warn",message:r}:{status:"none",message:""});e.statusMessage(o.message),e.statusLevel(o.status)}):e.statusLevel("none")})},Ei=Xt.extend({Statics:{clearHistory:function(){bi={}}},init:function(e){var t,n,i,r=this,o=window.tinymce?window.tinymce.activeEditor:s.activeEditor,l=o.settings,u=e.filetype;e.spellcheck=!1,(i=l.file_picker_types||l.file_browser_callback_types)&&(i=a.makeMap(i,/[, ]/)),i&&!i[u]||(!(n=l.file_picker_callback)||i&&!i[u]?!(n=l.file_browser_callback)||i&&!i[u]||(t=function(){n(r.getEl("inp").id,r.value(),u,window)}):t=function(){var e=r.fire("beforecall").meta;e=a.extend({filetype:u},e),n.call(o,function(e,t){r.value(e).fire("change",{meta:t})},r.value(),e)}),t&&(e.icon="browse",e.onaction=t),r._super(e),r.classes.add("filepicker"),Ci(r,l,o.getBody(),u),ki(r,l,u)}}),Hi=Vt.extend({recalc:function(e){var t=e.layoutRect(),n=e.paddingBox;e.items().filter(":visible").each(function(e){e.layoutRect({x:n.left,y:n.top,w:t.innerW-n.right-n.left,h:t.innerH-n.top-n.bottom}),e.recalc&&e.recalc()})}}),Si=Vt.extend({recalc:function(e){var t,n,i,r,o,s,a,l,u,c,d,f,h,m,g,p,v,b,y,x,w,_,R,C,k,E,H,S,M,T,P,W,D,N,A,B,O,z=[],L=Math.max,I=Math.min;for(i=e.items().filter(":visible"),r=e.layoutRect(),o=e.paddingBox,s=e.settings,f=e.isRtl()?s.direction||"row-reversed":s.direction,a=s.align,l=e.isRtl()?s.pack||"end":s.pack,u=s.spacing||0,"row-reversed"!==f&&"column-reverse"!==f||(i=i.set(i.toArray().reverse()),f=f.split("-")[0]),"column"===f?(C="y",_="h",R="minH",k="maxH",H="innerH",E="top",S="deltaH",M="contentH",N="left",W="w",T="x",P="innerW",D="minW",A="right",B="deltaW",O="contentW"):(C="x",_="w",R="minW",k="maxW",H="innerW",E="left",S="deltaW",M="contentW",N="top",W="h",T="y",P="innerH",D="minH",A="bottom",B="deltaH",O="contentH"),d=r[H]-o[E]-o[E],w=c=0,t=0,n=i.length;t<n;t++)m=(h=i[t]).layoutRect(),g=h.settings.flex,d-=t<n-1?u:0,g>0&&(c+=g,m[k]&&z.push(h),m.flex=g),d-=m[R],(p=o[N]+m[D]+o[A])>w&&(w=p);if((y={})[R]=d<0?r[R]-d+r[S]:r[H]-d+r[S],y[D]=w+r[B],y[M]=r[H]-d,y[O]=w,y.minW=I(y.minW,r.maxW),y.minH=I(y.minH,r.maxH),y.minW=L(y.minW,r.startMinWidth),y.minH=L(y.minH,r.startMinHeight),!r.autoResize||y.minW===r.minW&&y.minH===r.minH){for(b=d/c,t=0,n=z.length;t<n;t++)v=(m=(h=z[t]).layoutRect())[k],(p=m[R]+m.flex*b)>v?(d-=m[k]-m[R],c-=m.flex,m.flex=0,m.maxFlexSize=v):m.maxFlexSize=0;for(b=d/c,x=o[E],y={},0===c&&("end"===l?x=d+o[E]:"center"===l?(x=Math.round(r[H]/2-(r[H]-d)/2)+o[E])<0&&(x=o[E]):"justify"===l&&(x=o[E],u=Math.floor(d/(i.length-1)))),y[T]=o[N],t=0,n=i.length;t<n;t++)p=(m=(h=i[t]).layoutRect()).maxFlexSize||m[R],"center"===a?y[T]=Math.round(r[P]/2-m[W]/2):"stretch"===a?(y[W]=L(m[D]||0,r[P]-o[N]-o[A]),y[T]=o[N]):"end"===a&&(y[T]=r[P]-m[W]-o.top),m.flex>0&&(p+=m.flex*b),y[_]=p,y[C]=x,h.layoutRect(y),h.recalc&&h.recalc(),x+=p+u}else if(y.w=y.minW,y.h=y.minH,e.layoutRect(y),this.recalc(e),null===e._lastRect){var F=e.parent();F&&(F._lastRect=null,F.recalc())}}}),Mi=Ft.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(e){e.items().filter(":visible").each(function(e){e.recalc&&e.recalc()})},isNative:function(){return!0}}),Ti=function(e,t){return ti.one(t,e)},Pi=function(e,t){return function(){e.execCommand("mceToggleFormat",!1,t)}},Wi=function(e,t){return function(){var n=this;e.formatter?e.formatter.formatChanged(t,function(e){n.active(e)}):e.on("init",function(){e.formatter.formatChanged(t,function(e){n.active(e)})})}},Di=function(e){e.addMenuItem("align",{text:"Align",menu:[{text:"Left",icon:"alignleft",onclick:Pi(e,"alignleft")},{text:"Center",icon:"aligncenter",onclick:Pi(e,"aligncenter")},{text:"Right",icon:"alignright",onclick:Pi(e,"alignright")},{text:"Justify",icon:"alignjustify",onclick:Pi(e,"alignjustify")}]}),a.each({alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(t,n){e.addButton(n,{active:!1,tooltip:t[0],cmd:t[1],onPostRender:Wi(e,n)})})},Ni=function(e){return function(t,n){return W.from(n).map(dn.fromDom).filter(Rn.isElement).bind(function(n){return function(e,t,n){for(;n!==t;){if(n.style[e]){var i=n.style[e];return""!==i?W.some(i):W.none()}n=n.parentNode}return W.none()}(e,t,n.dom()).or((i=e,r=n.dom(),W.from(m.DOM.getStyle(r,i,!0))));var i,r}).getOr("")}},Ai={getFontSize:Ni("fontSize"),getFontFamily:E.compose(function(e){return e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")},Ni("fontFamily")),toPt:function(e,t){return/[0-9.]+px$/.test(e)?(n=72*parseInt(e,10)/96,i=t||0,r=Math.pow(10,i),Math.round(n*r)/r+"pt"):e;var n,i,r}},Bi=function(e){return e?e.split(",")[0]:""},Oi=function(e,t){return function(){var n=this;e.on("init nodeChange",function(i){var r,o,s,l=Ai.getFontFamily(e.getBody(),i.element),u=(r=t,o=l,a.each(r,function(e){e.value.toLowerCase()===o.toLowerCase()&&(s=e.value)}),a.each(r,function(e){s||Bi(e.value).toLowerCase()!==Bi(o).toLowerCase()||(s=e.value)}),s);n.value(u||null),!u&&l&&n.text(Bi(l))})}},zi=function(e){e.addButton("fontselect",function(){var t,n=(t=function(e){for(var t=(e=e.replace(/;$/,"").split(";")).length;t--;)e[t]=e[t].split("=");return e}(e.settings.font_formats||"Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats"),a.map(t,function(e){return{text:{raw:e[0]},value:e[1],textStyle:-1===e[1].indexOf("dings")?"font-family:"+e[1]:""}}));return{type:"listbox",text:"Font Family",tooltip:"Font Family",values:n,fixedWidth:!0,onPostRender:Oi(e,n),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}})},Li=function(e){zi(e)},Ii=function(e,t,n){var i;return a.each(e,function(e){e.value===n?i=n:e.value===t&&(i=t)}),i},Fi=function(e){e.addButton("fontsizeselect",function(){var t,n,i,r=(t=e.settings.fontsize_formats||"8pt 10pt 12pt 14pt 18pt 24pt 36pt",a.map(t.split(" "),function(e){var t=e,n=e,i=e.split("=");return i.length>1&&(t=i[0],n=i[1]),{text:t,value:n}}));return{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:r,fixedWidth:!0,onPostRender:(n=e,i=r,function(){var e=this;n.on("init nodeChange",function(t){var r,o,s,a;if(r=Ai.getFontSize(n.getBody(),t.element))for(s=3;!a&&s>=0;s--)o=Ai.toPt(r,s),a=Ii(i,o,r);e.value(a||null),a||e.text(o)})}),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}})},Vi=function(e){Fi(e)},Ui=function(e,t){return function(){var n,i,r,o=[];return a.each(t,function(t){o.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:t[0][0],values:o,fixedWidth:!0,onselect:function(t){if(t.control){var n=t.control.value();Pi(e,n)()}},onPostRender:(n=e,i=o,function(){var e=this;n.on("nodeChange",function(t){var o=n.formatter,s=null;a.each(t.parents,function(e){if(a.each(i,function(t){if(r?o.matchNode(e,r,{value:t.value})&&(s=t.value):o.matchNode(e,t.value)&&(s=t.value),s)return!1}),s)return!1}),e.value(s)})})}}},Yi=function(e){var t,n,i=function(e){for(var t=(e=e.replace(/;$/,"").split(";")).length;t--;)e[t]=e[t].split("=");return e}(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");e.addMenuItem("blockformats",{text:"Blocks",menu:(t=e,n=i,a.map(n,function(e){return{text:e[0],onclick:Pi(t,e[1]),textStyle:function(){return t.formatter.getCssText(e[1])}}}))}),e.addButton("formatselect",Ui(e,i))},$i=function(e,t){var n=t.length;return a.each(t,function(t){t.menu&&(t.hidden=0===$i(e,t.menu));var i=t.format;i&&(t.hidden=!e.formatter.canApply(i)),t.hidden&&n--}),n},ji=function(e,t){var n=t.items().length;return t.items().each(function(t){t.menu&&t.visible(ji(e,t.menu)>0),!t.menu&&t.settings.menu&&t.visible($i(e,t.settings.menu)>0);var i=t.settings.format;i&&t.visible(e.formatter.canApply(i)),t.visible()||n--}),n},qi=function(e){var t,n,i,r,o,s,l,u,c=(n=0,i=[],r=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}],o=function(e){var t=[];if(e)return a.each(e,function(e){var r={text:e.title,icon:e.icon};if(e.items)r.menu=o(e.items);else{var s=e.format||"custom"+n++;e.format||(e.name=s,i.push(e)),r.format=s,r.cmd=e.cmd}t.push(r)}),t},(t=e).on("init",function(){a.each(i,function(e){t.formatter.register(e.name,e)})}),{type:"menu",items:t.settings.style_formats_merge?t.settings.style_formats?o(r.concat(t.settings.style_formats)):o(r):o(t.settings.style_formats||r),onPostRender:function(e){t.fire("renderFormatsMenu",{control:e.control})},itemDefaults:{preview:!0,textStyle:function(){if(this.settings.format)return t.formatter.getCssText(this.settings.format)},onPostRender:function(){var e=this;e.parent().on("show",function(){var n,i;(n=e.settings.format)&&(e.disabled(!t.formatter.canApply(n)),e.active(t.formatter.match(n))),(i=e.settings.cmd)&&e.active(t.queryCommandState(i))})},onclick:function(){this.settings.format&&Pi(t,this.settings.format)(),this.settings.cmd&&t.execCommand(this.settings.cmd)}}});s=c,e.addMenuItem("formats",{text:"Formats",menu:s}),u=c,(l=e).addButton("styleselect",{type:"menubutton",text:"Formats",menu:u,onShowMenu:function(){l.settings.style_formats_autohide&&ji(l,this.menu)}})},Xi=function(e,t){var n,i;if("string"==typeof t)i=t.split(" ");else if(a.isArray(t))return ee.flatten(a.map(t,function(t){return Xi(e,t)}));return n=a.grep(i,function(t){return"|"===t||t in e.menuItems}),a.map(n,function(t){return"|"===t?{text:"-"}:e.menuItems[t]})},Ji=function(e){return e&&"-"===e.text},Gi=function(e){var t=ee.filter(e,function(e,t,n){return!Ji(e)||!Ji(n[t-1])});return ee.filter(t,function(e,t,n){return!Ji(e)||t>0&&t<n.length-1})},Ki=function(e){var t,n,i,r,o=e.settings.insert_button_items;return Gi(o?Xi(e,o):(t=e,n="insert",i=[{text:"-"}],r=a.grep(t.menuItems,function(e){return e.context===n}),a.each(r,function(e){"before"===e.separator&&i.push({text:"|"}),e.prependToContext?i.unshift(e):i.push(e),"after"===e.separator&&i.push({text:"|"})}),i))},Zi=function(e){var t;(t=e).addButton("insert",{type:"menubutton",icon:"insert",menu:[],oncreatemenu:function(){this.menu.add(Ki(t)),this.menu.renderNew()}})},Qi=function(e){var t,n,i;t=e,a.each({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(e,n){t.addButton(n,{active:!1,tooltip:e,onPostRender:Wi(t,n),onclick:Pi(t,n)})}),n=e,a.each({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"],removeformat:["Clear formatting","RemoveFormat"],remove:["Remove","Delete"]},function(e,t){n.addButton(t,{tooltip:e[0],cmd:e[1]})}),i=e,a.each({blockquote:["Blockquote","mceBlockQuote"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"]},function(e,t){i.addButton(t,{active:!1,tooltip:e[0],cmd:e[1],onPostRender:Wi(i,t)})})},er=function(e){var t;Qi(e),t=e,a.each({bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline","Meta+U"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"],newdocument:["New document","mceNewDocument"],cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"]},function(e,n){t.addMenuItem(n,{text:e[0],icon:n,shortcut:e[2],cmd:e[1]})}),t.addMenuItem("codeformat",{text:"Code",icon:"code",onclick:Pi(t,"code")})},tr=function(e,t){return function(){var n=this,i=function(){var n="redo"===t?"hasRedo":"hasUndo";return!!e.undoManager&&e.undoManager[n]()};n.disabled(!i()),e.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){n.disabled(e.readonly||!i())})}},nr=function(e){var t,n;(t=e).addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:tr(t,"undo"),cmd:"undo"}),t.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:tr(t,"redo"),cmd:"redo"}),(n=e).addButton("undo",{tooltip:"Undo",onPostRender:tr(n,"undo"),cmd:"undo"}),n.addButton("redo",{tooltip:"Redo",onPostRender:tr(n,"redo"),cmd:"redo"})},ir=function(e){var t,n;(t=e).addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:(n=t,function(){var e=this;n.on("VisualAid",function(t){e.active(t.hasVisual)}),e.active(n.hasVisual)}),cmd:"mceToggleVisualAid"})},rr={setup:function(e){var t;e.rtl&&(et.rtl=!0),e.on("mousedown",function(){xt.hideAll()}),(t=e).settings.ui_container&&(_.container=Ti(dn.fromDom(document.body),t.settings.ui_container).fold(E.constant(null),function(e){return e.dom()})),Mt.tooltips=!_.iOS,et.translate=function(e){return s.translate(e)},Yi(e),Di(e),er(e),nr(e),Vi(e),Li(e),qi(e),ir(e),Zi(e)}},or=Vt.extend({recalc:function(e){var t,n,i,r,o,s,a,l,u,c,d,f,h,m,g,p,v,b,y,x,w,_,R,C,k,E,H,S,M=[],T=[];t=e.settings,r=e.items().filter(":visible"),o=e.layoutRect(),i=t.columns||Math.ceil(Math.sqrt(r.length)),n=Math.ceil(r.length/i),b=t.spacingH||t.spacing||0,y=t.spacingV||t.spacing||0,x=t.alignH||t.align,w=t.alignV||t.align,p=e.paddingBox,S="reverseRows"in t?t.reverseRows:e.isRtl(),x&&"string"==typeof x&&(x=[x]),w&&"string"==typeof w&&(w=[w]);for(d=0;d<i;d++)M.push(0);for(f=0;f<n;f++)T.push(0);for(f=0;f<n;f++)for(d=0;d<i&&(c=r[f*i+d]);d++)C=(u=c.layoutRect()).minW,k=u.minH,M[d]=C>M[d]?C:M[d],T[f]=k>T[f]?k:T[f];for(E=o.innerW-p.left-p.right,_=0,d=0;d<i;d++)_+=M[d]+(d>0?b:0),E-=(d>0?b:0)+M[d];for(H=o.innerH-p.top-p.bottom,R=0,f=0;f<n;f++)R+=T[f]+(f>0?y:0),H-=(f>0?y:0)+T[f];if(_+=p.left+p.right,R+=p.top+p.bottom,(l={}).minW=_+(o.w-o.innerW),l.minH=R+(o.h-o.innerH),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH,l.minW=Math.min(l.minW,o.maxW),l.minH=Math.min(l.minH,o.maxH),l.minW=Math.max(l.minW,o.startMinWidth),l.minH=Math.max(l.minH,o.startMinHeight),!o.autoResize||l.minW===o.minW&&l.minH===o.minH){var P;o.autoResize&&((l=e.layoutRect(l)).contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH),P="start"===t.packV?0:H>0?Math.floor(H/n):0;var W=0,D=t.flexWidths;if(D)for(d=0;d<D.length;d++)W+=D[d];else W=i;var N=E/W;for(d=0;d<i;d++)M[d]+=D?D[d]*N:N;for(m=p.top,f=0;f<n;f++){for(h=p.left,a=T[f]+P,d=0;d<i&&(c=r[S?f*i+i-1-d:f*i+d]);d++)g=c.settings,u=c.layoutRect(),s=Math.max(M[d],u.startMinWidth),u.x=h,u.y=m,"center"===(v=g.alignH||(x?x[d]||x[0]:null))?u.x=h+s/2-u.w/2:"right"===v?u.x=h+s-u.w:"stretch"===v&&(u.w=s),"center"===(v=g.alignV||(w?w[d]||w[0]:null))?u.y=m+a/2-u.h/2:"bottom"===v?u.y=m+a-u.h:"stretch"===v&&(u.h=a),c.layoutRect(u),h+=s+b,c.recalc&&c.recalc();m+=a+y}}else if(l.w=l.minW,l.h=l.minH,e.layoutRect(l),this.recalc(e),null===e._lastRect){var A=e.parent();A&&(A._lastRect=null,A.recalc())}}}),sr=Mt.extend({renderHtml:function(){var e=this;return e.classes.add("iframe"),e.canFocus=!1,'<iframe id="'+e._id+'" class="'+e.classes+'" tabindex="-1" src="'+(e.settings.url||"javascript:''")+'" frameborder="0"></iframe>'},src:function(e){this.getEl().src=e},html:function(e,t){var n=this,i=this.getEl().contentWindow.document.body;return i?(i.innerHTML=e,t&&t()):C.setTimeout(function(){n.html(e)}),this}}),ar=Mt.extend({init:function(e){this._super(e),this.classes.add("widget").add("infobox"),this.canFocus=!1},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},help:function(e){this.state.set("help",e)},renderHtml:function(){var e=this,t=e.classPrefix;return'<div id="'+e._id+'" class="'+e.classes+'"><div id="'+e._id+'-body">'+e.encode(e.state.get("text"))+'<button role="button" tabindex="-1"><i class="'+t+"ico "+t+'i-help"></i></button></div></div>'},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl("body").firstChild.data=e.encode(t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e.state.on("change:help",function(t){e.classes.toggle("has-help",t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}}),lr=Mt.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("label"),t.canFocus=!1,e.multiline&&t.classes.add("autoscroll"),e.strong&&t.classes.add("strong")},initLayoutRect:function(){var e=this,t=e._super();return e.settings.multiline&&(we.getSize(e.getEl()).width>t.maxW&&(t.minW=t.maxW,e.classes.add("multiline")),e.getEl().style.width=t.minW+"px",t.startMinH=t.h=t.minH=Math.min(t.maxH,we.getSize(e.getEl()).height)),t},repaint:function(){return this.settings.multiline||(this.getEl().style.lineHeight=this.layoutRect().h+"px"),this._super()},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},renderHtml:function(){var e,t,n=this,i=n.settings.forId,r=n.settings.html?n.settings.html:n.encode(n.state.get("text"));return!i&&(t=n.settings.forName)&&(e=n.getRoot().find("#"+t)[0])&&(i=e._id),i?'<label id="'+n._id+'" class="'+n.classes+'"'+(i?' for="'+i+'"':"")+">"+r+"</label>":'<span id="'+n._id+'" class="'+n.classes+'">'+r+"</span>"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.innerHtml(e.encode(t.value)),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}}),ur=rt.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(e){this._super(e),this.classes.add("toolbar")},postRender:function(){return this.items().each(function(e){e.classes.add("toolbar-item")}),this._super()}}),cr=ur.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}}),dr=Ut.extend({init:function(e){var t=this;t._renderOpen=!0,t._super(e),e=t.settings,t.classes.add("menubtn"),e.fixedWidth&&t.classes.add("fixed-width"),t.aria("haspopup",!0),t.state.set("menu",e.menu||t.render())},showMenu:function(e){var t,n=this;if(n.menu&&n.menu.visible()&&!1!==e)return n.hideMenu();n.menu||(t=n.state.get("menu")||[],n.classes.add("opened"),t.length?t={type:"menu",animate:!0,items:t}:(t.type=t.type||"menu",t.animate=!0),t.renderTo?n.menu=t.parent(n).show().renderTo():n.menu=g.create(t).parent(n).renderTo(),n.fire("createmenu"),n.menu.reflow(),n.menu.on("cancel",function(e){e.control.parent()===n.menu&&(e.stopPropagation(),n.focus(),n.hideMenu())}),n.menu.on("select",function(){n.focus()}),n.menu.on("show hide",function(e){e.control===n.menu&&(n.activeMenu("show"===e.type),n.classes.toggle("opened","show"===e.type)),n.aria("expanded","show"===e.type)}).fire("show")),n.menu.show(),n.menu.layoutRect({w:n.layoutRect().w}),n.menu.repaint(),n.menu.moveRel(n.getEl(),n.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]),n.fire("showmenu")},hideMenu:function(){this.menu&&(this.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),this.menu.hide())},activeMenu:function(e){this.classes.toggle("active",e)},renderHtml:function(){var e,t=this,n=t._id,i=t.classPrefix,r=t.settings.icon,o=t.state.get("text"),s="";return(e=t.settings.image)?(r="none","string"!=typeof e&&(e=window.getSelection?e[0]:e[1]),e=" style=\"background-image: url('"+e+"')\""):e="",o&&(t.classes.add("btn-has-text"),s='<span class="'+i+'txt">'+t.encode(o)+"</span>"),r=t.settings.icon?i+"ico "+i+"i-"+r:"",t.aria("role",t.parent()instanceof cr?"menuitem":"button"),'<div id="'+n+'" class="'+t.classes+'" tabindex="-1" aria-labelledby="'+n+'"><button id="'+n+'-open" role="presentation" type="button" tabindex="-1">'+(r?'<i class="'+r+'"'+e+"></i>":"")+s+' <i class="'+i+'caret"></i></button></div>'},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}(t.target,e.getEl())&&(e.focus(),e.showMenu(!t.aria),t.aria&&e.menu.items().filter(":visible")[0].focus())}),e.on("mouseenter",function(t){var n,i=t.control,r=e.parent();i&&r&&i instanceof dr&&i.parent()===r&&(r.items().filter("MenuButton").each(function(e){e.hideMenu&&e!==i&&(e.menu&&e.menu.visible()&&(n=!0),e.hideMenu())}),n&&(i.focus(),i.showMenu()))}),e._super()},bindStates:function(){var e=this;return e.state.on("change:menu",function(){e.menu&&e.menu.remove(),e.menu=null}),e._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}}),fr=xt.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(e){if(e.autohide=!0,e.constrainToViewport=!0,"function"==typeof e.items&&(e.itemsFactory=e.items,e.items=[]),e.itemDefaults)for(var t=e.items,n=t.length;n--;)t[n]=a.extend({},e.itemDefaults,t[n]);this._super(e),this.classes.add("menu"),e.animate&&11!==_.ie&&this.classes.add("animate")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){this.hideAll(),this.fire("select")},load:function(){var e,t=this;function n(){t.throbber&&(t.throbber.hide(),t.throbber=null)}t.settings.itemsFactory&&(t.throbber||(t.throbber=new kt(t.getEl("body"),!0),0===t.items().length?(t.throbber.show(),t.fire("loading")):t.throbber.show(100,function(){t.items().remove(),t.fire("loading")}),t.on("hide close",n)),t.requestTime=e=(new Date).getTime(),t.settings.itemsFactory(function(i){0!==i.length?t.requestTime===e&&(t.getEl().style.width="",t.getEl("body").style.width="",n(),t.items().remove(),t.getEl("body").innerHTML="",t.add(i),t.renderNew(),t.fire("loaded")):t.hide()}))},hideAll:function(){return this.find("menuitem").exec("hideMenu"),this._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;if(n.icon||n.image||n.selectable)return e._hasIcons=!0,!1}),e.settings.itemsFactory&&e.on("postrender",function(){e.settings.itemsFactory&&e.load()}),e.on("show hide",function(t){t.control===e&&("show"===t.type?C.setTimeout(function(){e.classes.add("in")},0):e.classes.remove("in"))}),e._super()}}),hr=dr.extend({init:function(e){var t,n,i,r,o=this;o._super(e),e=o.settings,o._values=t=e.values,t&&("undefined"!=typeof e.value&&function s(t){for(var r=0;r<t.length;r++){if(n=t[r].selected||e.value===t[r].value)return i=i||t[r].text,o.state.set("value",t[r].value),!0;if(t[r].menu&&s(t[r].menu))return!0}}(t),!n&&t.length>0&&(i=t[0].text,o.state.set("value",t[0].value)),o.state.set("menu",t)),o.state.set("text",e.text||i),o.classes.add("listbox"),o.on("select",function(t){var n=t.control;r&&(t.lastControl=r),e.multiple?n.active(!n.active()):o.value(t.control.value()),r=n})},bindStates:function(){var e=this;return e.on("show",function(t){var n,i;n=t.control,i=e.value(),n instanceof fr&&n.items().each(function(e){e.hasMenus()||e.active(e.value()===i)})}),e.state.on("change:value",function(t){var n=function i(e,t){var n;if(e)for(var r=0;r<e.length;r++){if(e[r].value===t)return e[r];if(e[r].menu&&(n=i(e[r].menu,t)))return n}}(e.state.get("menu"),t.value);n?e.text(n.text):e.text(e.settings.text)}),e._super()}}),mr=Mt.extend({Defaults:{border:0,role:"menuitem"},init:function(e){var t,n=this;n._super(e),e=n.settings,n.classes.add("menu-item"),e.menu&&n.classes.add("menu-item-expand"),e.preview&&n.classes.add("menu-item-preview"),"-"!==(t=n.state.get("text"))&&"|"!==t||(n.classes.add("menu-item-sep"),n.aria("role","separator"),n.state.set("text","-")),e.selectable&&(n.aria("role","menuitemcheckbox"),n.classes.add("menu-item-checkbox"),e.icon="selected"),e.preview||e.selectable||n.classes.add("menu-item-normal"),n.on("mousedown",function(e){e.preventDefault()}),e.menu&&!e.ariaHideMenu&&n.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var e,t=this,n=t.settings,i=t.parent();if(i.items().each(function(e){e!==t&&e.hideMenu()}),n.menu){(e=t.menu)?e.show():((e=n.menu).length?e={type:"menu",animate:!0,items:e}:(e.type=e.type||"menu",e.animate=!0),i.settings.itemDefaults&&(e.itemDefaults=i.settings.itemDefaults),(e=t.menu=g.create(e).parent(t).renderTo()).reflow(),e.on("cancel",function(n){n.stopPropagation(),t.focus(),e.hide()}),e.on("show hide",function(e){e.control.items&&e.control.items().each(function(e){e.active(e.settings.selected)})}).fire("show"),e.on("hide",function(n){n.control===e&&t.classes.remove("selected")}),e.submenu=!0),e._parentMenu=i,e.classes.add("menu-sub");var r=e.testMoveRel(t.getEl(),t.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);e.moveRel(t.getEl(),r),e.rel=r,r="menu-sub-"+r,e.classes.remove(e._lastRel).add(r),e._lastRel=r,t.classes.add("selected"),t.aria("expanded",!0)}},hideMenu:function(){var e=this;return e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide(),e.aria("expanded",!1)),e},renderHtml:function(){var e,t=this,n=t._id,i=t.settings,r=t.classPrefix,o=t.state.get("text"),s=t.settings.icon,a="",l=i.shortcut,u=t.encode(i.url);function c(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function d(e){var t=i.match||"";return t?e.replace(new RegExp(c(t),"gi"),function(e){return"!mce~match["+e+"]mce~match!"}):e}function f(e){return e.replace(new RegExp(c("!mce~match["),"g"),"<b>").replace(new RegExp(c("]mce~match!"),"g"),"</b>")}return s&&t.parent().classes.add("menu-has-icons"),i.image&&(a=" style=\"background-image: url('"+i.image+"')\""),l&&(l=function(e){var t,n,i={};for(i=_.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},e=e.split("+"),t=0;t<e.length;t++)(n=i[e[t].toLowerCase()])&&(e[t]=n);return e.join("+")}(l)),s=r+"ico "+r+"i-"+(t.settings.icon||"none"),e="-"!==o?'<i class="'+s+'"'+a+"></i>\xa0":"",o=f(t.encode(d(o))),u=f(t.encode(d(u))),'<div id="'+n+'" class="'+t.classes+'" tabindex="-1">'+e+("-"!==o?'<span id="'+n+'-text" class="'+r+'text">'+o+"</span>":"")+(l?'<div id="'+n+'-shortcut" class="'+r+'menu-shortcut">'+l+"</div>":"")+(i.menu?'<div class="'+r+'caret"></div>':"")+(u?'<div class="'+r+'menu-item-link">'+u+"</div>":"")+"</div>"},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var i=e.getEl("text");i&&(i.setAttribute("style",n),e._textStyle=n)}return e.on("mouseenter click",function(n){n.control===e&&(t.menu||"click"!==n.type?(e.showMenu(),n.aria&&e.menu.focus(!0)):(e.fire("select"),C.requestAnimationFrame(function(){e.parent().hideAll()})))}),e._super(),e},hover:function(){return this.parent().items().each(function(e){e.classes.remove("selected")}),this.classes.toggle("selected",!0),this},active:function(e){return function(e,t){var n=e._textStyle;if(n){var i=e.getEl("text");i.setAttribute("style",n),t&&(i.style.color="",i.style.backgroundColor="")}}(this,e),void 0!==e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}}),gr=jt.extend({Defaults:{classes:"radio",role:"radio"}}),pr=Mt.extend({renderHtml:function(){var e=this,t=e.classPrefix;return e.classes.add("resizehandle"),"both"===e.settings.direction&&e.classes.add("resizehandle-both"),e.canFocus=!1,'<div id="'+e._id+'" class="'+e.classes+'"><i class="'+t+"ico "+t+'i-resize"></i></div>'},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new ct(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!==e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}});function vr(e){var t="";if(e)for(var n=0;n<e.length;n++)t+='<option value="'+e[n]+'">'+e[n]+"</option>";return t}var br=Mt.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options),t.on("keydown",function(e){var n;13===e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e,t=this,n="";return e=vr(t._options),t.size&&(n=' size = "'+t.size+'"'),'<select id="'+t._id+'" class="'+t.classes+'"'+n+">"+e+"</select>"},bindStates:function(){var e=this;return e.state.on("change:options",function(t){e.getEl().innerHTML=vr(t.value)}),e._super()}});function yr(e,t,n){return e<t&&(e=t),e>n&&(e=n),e}function xr(e,t,n){e.setAttribute("aria-"+t,n)}function wr(e,t){var n,i,r,o,s;"v"===e.settings.orientation?(r="top",i="height",n="h"):(r="left",i="width",n="w"),s=e.getEl("handle"),o=((e.layoutRect()[n]||100)-we.getSize(s)[i])*((t-e._minValue)/(e._maxValue-e._minValue))+"px",s.style[r]=o,s.style.height=e.layoutRect().h+"px",xr(s,"valuenow",t),xr(s,"valuetext",""+e.settings.previewFilter(t)),xr(s,"valuemin",e._minValue),xr(s,"valuemax",e._maxValue)}var _r=Mt.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"===e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this._id,t=this.classPrefix;return'<div id="'+e+'" class="'+this.classes+'"><div id="'+e+'-handle" class="'+t+'slider-handle" role="slider" tabindex="-1"></div></div>'},reset:function(){this.value(this._initValue).repaint()},postRender:function(){var e,t,n,i,r,o,s,a,l,u,c,d,f,h,m=this;e=m._minValue,t=m._maxValue,"v"===m.settings.orientation?(n="screenY",i="top",r="height",o="h"):(n="screenX",i="left",r="width",o="w"),m._super(),function(e,t){function n(n){var i,r,o;i=yr(i=(((i=m.value())+(o=e))/(t-o)+.05*n)*(t-(r=e))-r,e,t),m.value(i),m.fire("dragstart",{value:i}),m.fire("drag",{value:i}),m.fire("dragend",{value:i})}m.on("keydown",function(e){switch(e.keyCode){case 37:case 38:n(-1);break;case 39:case 40:n(1)}})}(e,t),s=e,a=t,l=m.getEl("handle"),m._dragHelper=new ct(m._id,{handle:m._id+"-handle",start:function(e){u=e[n],c=parseInt(m.getEl("handle").style[i],10),d=(m.layoutRect()[o]||100)-we.getSize(l)[r],m.fire("dragstart",{value:h})},drag:function(e){var t=e[n]-u;f=yr(c+t,0,d),l.style[i]=f+"px",h=s+f/d*(a-s),m.value(h),m.tooltip().text(""+m.settings.previewFilter(h)).show().moveRel(l,"bc tc"),m.fire("drag",{value:h})},stop:function(){m.tooltip().hide(),m.fire("dragend",{value:h})}})},repaint:function(){this._super(),wr(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){wr(e,t.value)}),e._super()}}),Rr=Mt.extend({renderHtml:function(){return this.classes.add("spacer"),this.canFocus=!1,'<div id="'+this._id+'" class="'+this.classes+'"></div>'}}),Cr=dr.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e,t,n=this.getEl(),i=this.layoutRect();return this._super(),e=n.firstChild,t=n.lastChild,ye(e).css({width:i.w-we.getSize(t).width,height:i.h-2}),ye(t).css({height:i.h-2}),this},activeMenu:function(e){ye(this.getEl().lastChild).toggleClass(this.classPrefix+"active",e)},renderHtml:function(){var e,t,n=this,i=n._id,r=n.classPrefix,o=n.state.get("icon"),s=n.state.get("text"),a=n.settings,l="";return(e=a.image)?(o="none","string"!=typeof e&&(e=window.getSelection?e[0]:e[1]),e=" style=\"background-image: url('"+e+"')\""):e="",o=a.icon?r+"ico "+r+"i-"+o:"",s&&(n.classes.add("btn-has-text"),l='<span class="'+r+'txt">'+n.encode(s)+"</span>"),t="boolean"==typeof a.active?' aria-pressed="'+a.active+'"':"",'<div id="'+i+'" class="'+n.classes+'" role="button"'+t+' tabindex="-1"><button type="button" hidefocus="1" tabindex="-1">'+(o?'<i class="'+o+'"'+e+"></i>":"")+l+'</button><button type="button" class="'+r+'open" hidefocus="1" tabindex="-1">'+(n._menuBtnText?(o?"\xa0":"")+n._menuBtnText:"")+' <i class="'+r+'caret"></i></button></div>'},postRender:function(){var e=this.settings.onclick;return this.on("click",function(t){var n=t.target;if(t.control===this)for(;n;){if(t.aria&&"down"!==t.aria.key||"BUTTON"===n.nodeName&&-1===n.className.indexOf("open"))return t.stopImmediatePropagation(),void(e&&e.call(this,t));n=n.parentNode}}),delete this.settings.onclick,this._super()}}),kr=Mi.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}}),Er=ft.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var t;this.activeTabId&&(t=this.getEl(this.activeTabId),ye(t).removeClass(this.classPrefix+"active"),t.setAttribute("aria-selected","false")),this.activeTabId="t"+e,(t=this.getEl("t"+e)).setAttribute("aria-selected","true"),ye(t).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!==n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",i=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,r){var o=e._id+"-t"+r;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='<div id="'+o+'" class="'+i+'tab" unselectable="on" role="tab" aria-controls="'+t._id+'" aria-selected="false" tabIndex="-1">'+e.encode(t.settings.title)+"</div>"}),'<div id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1"><div id="'+e._id+'-head" class="'+i+'tabs" role="tablist">'+n+'</div><div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+t.renderHtml(e)+"</div></div>"},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(n&&n.id===e._id+"-head")for(var i=n.childNodes.length;i--;)n.childNodes[i]===t.target&&e.activateTab(i)})},initLayoutRect:function(){var e,t,n,i=this;t=(t=we.getSize(i.getEl("head")).width)<0?0:t,n=0,i.items().each(function(e){t=Math.max(t,e.layoutRect().minW),n=Math.max(n,e.layoutRect().minH)}),i.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=t,e.settings.h=n,e.layoutRect({x:0,y:0,w:t,h:n})});var r=we.getSize(i.getEl("head")).height;return i.settings.minWidth=t,i.settings.minHeight=n+r,(e=i._super()).deltaH+=r,e.innerH=e.h-e.deltaH,e}}),Hr=Mt.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13===e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e,t,n,i,r,o=this,s=0;e=o.getEl().style,t=o._layoutRect,r=o._lastRepaintRect||{};var a=document;return!o.settings.multiline&&a.all&&(!a.documentMode||a.documentMode<=8)&&(e.lineHeight=t.h-s+"px"),i=(n=o.borderBox).left+n.right+8,s=n.top+n.bottom+(o.settings.multiline?8:0),t.x!==r.x&&(e.left=t.x+"px",r.x=t.x),t.y!==r.y&&(e.top=t.y+"px",r.y=t.y),t.w!==r.w&&(e.width=t.w-i+"px",r.w=t.w),t.h!==r.h&&(e.height=t.h-s+"px",r.h=t.h),o._lastRepaintRect=r,o.fire("repaint",{},!1),o},renderHtml:function(){var e,t,n=this,i=n.settings;return e={id:n._id,hidefocus:"1"},a.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(t){e[t]=i[t]}),n.disabled()&&(e.disabled="disabled"),i.subtype&&(e.type=i.subtype),(t=we.create(i.multiline?"textarea":"input",e)).value=n.state.get("value"),t.className=n.classes,t.outerHTML},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e.getEl().value=e.state.get("value"),e._super(),e.$el.on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!==t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}}),Sr=function(){return{Selector:Be,Collection:Le,ReflowQueue:qe,Control:et,Factory:g,KeyboardNavigation:nt,Container:rt,DragHelper:ct,Scrollable:dt,Panel:ft,Movable:Re,Resizable:ht,FloatPanel:xt,Window:zt,MessageBox:Lt,Tooltip:St,Widget:Mt,Progress:Tt,Notification:Wt,Layout:Ft,AbsoluteLayout:Vt,Button:Ut,ButtonGroup:$t,Checkbox:jt,ComboBox:Xt,ColorBox:Jt,PanelButton:Gt,ColorButton:Zt,ColorPicker:en,Path:nn,ElementPath:rn,FormItem:on,Form:sn,FieldSet:an,FilePicker:Ei,FitLayout:Hi,FlexLayout:Si,FlowLayout:Mi,FormatControls:rr,GridLayout:or,Iframe:sr,InfoBox:ar,Label:lr,Toolbar:ur,MenuBar:cr,MenuButton:dr,MenuItem:mr,Throbber:kt,Menu:fr,ListBox:hr,Radio:gr,ResizeHandle:pr,SelectBox:br,Slider:_r,Spacer:Rr,SplitButton:Cr,StackLayout:kr,TabPanel:Er,TextBox:Hr,DropZone:tn,BrowseButton:Yt}},Mr=function(e){e.ui?a.each(Sr(),function(t,n){e.ui[n]=t}):e.ui=Sr()};a.each(Sr(),function(e,t){g.add(t,e)}),Mr(window.tinymce?window.tinymce:{}),o.add("modern",function(e){return rr.setup(e),It(e)})}(); \ No newline at end of file diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index 284851e5..d759a91c 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -8,6 +8,10 @@ </template> <script> +/** + * docs: + * https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce + */ import editorImage from './components/EditorImage' import plugins from './plugins' import toolbar from './toolbar' @@ -101,6 +105,8 @@ export default { const _this = this window.tinymce.init({ language: this.language, + // language cnd URL, detail see https://github.com/PanJiaChen/tinymce-lang + language_url: 'https://cdn.jsdelivr.net/npm/tinymce-lang/langs/zh_CN.js', selector: `#${this.tinymceId}`, height: this.height, body_class: 'panel-body ', diff --git a/vue.config.js b/vue.config.js index 7fa00992..30d40ea6 100644 --- a/vue.config.js +++ b/vue.config.js @@ -54,6 +54,16 @@ module.exports = { } }, chainWebpack(config) { + const cdn = { + // inject tinymce into index.html + // why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one + js: ['https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.2/tinymce.min.js'] + } + config.plugin('html') + .tap(args => { + args[0].cdn = cdn + return args + }) config.plugins.delete('preload') // TODO: need test config.plugins.delete('prefetch') // TODO: need test From abac07820a5a2b0d7127fd60d5b4377bf3f6593c Mon Sep 17 00:00:00 2001 From: linzhengen <linzhengen@yahoo.co.jp> Date: Thu, 2 May 2019 14:59:31 +0900 Subject: [PATCH 150/202] feature: added ja lang (#1999) --- README.ja.md | 210 ++++++++++++++++++++++++++++ README.md | 2 +- src/components/LangSelect/index.vue | 3 + src/components/Tinymce/index.vue | 5 +- src/lang/index.js | 6 + src/lang/ja.js | 175 +++++++++++++++++++++++ src/views/i18n-demo/index.vue | 4 + src/views/i18n-demo/local.js | 20 +++ 8 files changed, 422 insertions(+), 3 deletions(-) create mode 100644 README.ja.md create mode 100644 src/lang/ja.js diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 00000000..e601291a --- /dev/null +++ b/README.ja.md @@ -0,0 +1,210 @@ +<p align="center"> + <img width="320" src="https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg"> +</p> + +<p align="center"> + <a href="https://github.com/vuejs/vue"> + <img src="https://img.shields.io/badge/vue-2.6.10-brightgreen.svg" alt="vue"> + </a> + <a href="https://github.com/ElemeFE/element"> + <img src="https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg" alt="element-ui"> + </a> + <a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow"> + <img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Build Status"> + </a> + <a href="https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE"> + <img src="https://img.shields.io/github/license/mashape/apistatus.svg" alt="license"> + </a> + <a href="https://github.com/PanJiaChen/vue-element-admin/releases"> + <img src="https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg" alt="GitHub release"> + </a> + <a href="https://gitter.im/vue-element-admin/discuss"> + <img src="https://badges.gitter.im/Join%20Chat.svg" alt="gitter"> + </a> + <a href="https://panjiachen.gitee.io/vue-element-admin-site/zh/donate"> + <img src="https://img.shields.io/badge/%24-donate-ff69b4.svg" alt="donate"> + </a> +</p> + +日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) + +## 概要 + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) は管理画面のフロントエンドのインタフェース,[vue](https://github.com/vuejs/vue) と [element-ui](https://github.com/ElemeFE/element)を使っています。i18nの多言語対応、可変ルート、権限、典型的なビジネスアプリテンプレートであり、豊富なコンポーネントを提供しています、素早くビジネス用の管理画面の現型を構築に役立ちます。 + +- [デモページ](https://panjiachen.github.io/vue-element-admin) + +- [ドキュメント](https://panjiachen.github.io/vue-element-admin-site/) + +- [Gitter](https://gitter.im/vue-element-admin/discuss) + +- [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate) + +- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) + +- おすすめシンプルテンプレート: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- デスクトップバージョン: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) +- Typescriptバージョン: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) + +**現在のバージョン `v4.0+` は `vue-cli` で構築,バグ報告は[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)のissueでお願いします。旧バージョン[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)もあります。`vue-cli`に依存しないです。** + +**低いバージョンのブラウザはサーポートしないです(例えば ie),必要があれば polyfill を追加してください。 [詳細はこちら](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** + +## 前準備 + +ローカル環境に [node](http://nodejs.org/) と [git](https://git-scm.com/)をインストールが必要です。[ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[vue-cli](https://github.com/vuejs/vue-cli) 、[axios](https://github.com/axios/axios) 和 [element-ui](https://github.com/ElemeFE/element)で開発しています。Requestは[Mock.js](https://github.com/nuysoft/Mock)のモックデータを使っています。 + +**バグ修正や新規機能追加のissue と pull requestは大歓迎です。** + + <p align="center"> + <img width="900" src="https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png"> +</p> + +## Sponsors + +Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen) + +<a href="https://flatlogic.com/admin-dashboards?from=vue-element-admin"><img width="150px" src="https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p> + +## 機能一覧 + +``` +- ログイン / ログアウト + +- Auth認証 + - ページ権限 + - 権限パーミッション + - 権限設定 + - 外部IDでログイン + +- 複数環境デプロイ + - dev sit stage prod + +- 共通機能 + - 多言語切替 + - テーマ切替 + - サイトメニュー(ルートから生成) + - Breadcrumb Navigation + - Tag Navigation + - Svg Sprite Icon + - ローカル/バックエンド モック データ + - Screenfull + +- WYSIWYG + - TinyMCE + - Markdown + - JSON + +- Excel + - エクスポート + - インポート + - リード + - Zip + +- Table + - Dynamic Table + - Drag And Drop Table + - Inline Edit Table + +- Error Page + - 401 + - 404 + +- コンポーネント + - Avatar Upload + - Back To Top + - Drag Dialog + - Drag Select + - Drag Kanban + - Drag List + - SplitPane + - Dropzone + - Sticky + - CountTo + +- Advanced Example +- Error Log +- Dashboard +- Guide Page +- ECharts +- Clipboard +- Markdown to html +``` + +## Getting started + +```bash +# clone the project +git clone https://github.com/PanJiaChen/vue-element-admin.git + +# enter the project directory +cd vue-element-admin + +# install dependency +npm install + +# develop +npm run dev +``` + +This will automatically open http://localhost:9527 + +## Build + +```bash +# build for test environment +npm run build:stage + +# build for production environment +npm run build:prod +``` + +## Advanced + +```bash +# preview the release environment effect +npm run preview + +# preview the release environment effect + static resource analysis +npm run preview -- --report + +# code format check +npm run lint + +# code format check and auto fix +npm run lint -- --fix +``` + +Refer to [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) for more information + +## Changelog + +Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases). + +## Online Demo + +[Preview](https://panjiachen.github.io/vue-element-admin) + +## Donate + +If you find this project useful, you can buy author a glass of juice :tropical_drink: + + + +[Paypal Me](https://www.paypal.me/panfree23) + +[Buy me a coffee](https://www.buymeacoffee.com/Pan) + +## Browsers support + +Modern browsers and Internet Explorer 10+. + +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions + +## License + +[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) + +Copyright (c) 2017-present PanJiaChen \ No newline at end of file diff --git a/README.md b/README.md index 01034b51..0388b0d0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ </a> </p> -English | [简体中文](./README.zh-CN.md) +English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) ## Introduction diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue index 7fe30b5d..44248418 100644 --- a/src/components/LangSelect/index.vue +++ b/src/components/LangSelect/index.vue @@ -13,6 +13,9 @@ <el-dropdown-item :disabled="language==='es'" command="es"> Español </el-dropdown-item> + <el-dropdown-item :disabled="language==='ja'" command="ja"> + 日本語 + </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </template> diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index d759a91c..e29e336a 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -60,7 +60,8 @@ export default { fullscreen: false, languageTypeList: { 'en': 'en', - 'zh': 'zh_CN' + 'zh': 'zh_CN', + 'ja': 'ja' } } }, @@ -106,7 +107,7 @@ export default { window.tinymce.init({ language: this.language, // language cnd URL, detail see https://github.com/PanJiaChen/tinymce-lang - language_url: 'https://cdn.jsdelivr.net/npm/tinymce-lang/langs/zh_CN.js', + language_url: `https://cdn.jsdelivr.net/npm/tinymce-lang/langs/${this.language}.js`, selector: `#${this.tinymceId}`, height: this.height, body_class: 'panel-body ', diff --git a/src/lang/index.js b/src/lang/index.js index c443f41b..1799ae7f 100644 --- a/src/lang/index.js +++ b/src/lang/index.js @@ -4,9 +4,11 @@ import Cookies from 'js-cookie' import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang import elementEsLocale from 'element-ui/lib/locale/lang/es'// element-ui lang +import elementJaLocale from 'element-ui/lib/locale/lang/ja'// element-ui lang import enLocale from './en' import zhLocale from './zh' import esLocale from './es' +import jaLocale from './ja' Vue.use(VueI18n) @@ -22,6 +24,10 @@ const messages = { es: { ...esLocale, ...elementEsLocale + }, + ja: { + ...jaLocale, + ...elementJaLocale } } export function getLanguage() { diff --git a/src/lang/ja.js b/src/lang/ja.js new file mode 100644 index 00000000..7dccd124 --- /dev/null +++ b/src/lang/ja.js @@ -0,0 +1,175 @@ +export default { + route: { + dashboard: 'トップ', + documentation: 'ドキュメント', + guide: 'ガイド', + permission: '権限', + rolePermission: '権限ロール', + pagePermission: 'ページ権限', + directivePermission: 'ディレクティブ権限', + icons: 'アイコン', + components: 'コンポーネント', + tinymce: 'TinyMCE', + markdown: 'Markdown', + jsonEditor: 'JSON Editor', + dndList: 'Drag-And-Drop', + splitPane: 'パネル', + avatarUpload: 'アバターアップロード', + dropzone: 'Dropzone', + sticky: 'Sticky', + countTo: 'Count To', + componentMixin: 'コンポーネントMixin', + backToTop: 'BackToTop', + dragDialog: 'Drag Dialog', + dragSelect: 'Drag Select', + dragKanban: 'Drag 看板', + charts: 'チャート', + keyboardChart: 'Keyboardチャート', + lineChart: 'Lineチャート', + mixChart: 'Mixチャート', + example: 'Example', + nested: 'Nested Routes', + menu1: 'メニュー1', + 'menu1-1': 'メニュー 1-1', + 'menu1-2': 'メニュー 1-2', + 'menu1-2-1': 'メニュー 1-2-1', + 'menu1-2-2': 'メニュー 1-2-2', + 'menu1-3': 'メニュー 1-3', + menu2: 'メニュー 2', + Table: 'Table', + dynamicTable: '可変 Table', + dragTable: 'Drag Table', + inlineEditTable: 'Inline Edit Table', + complexTable: 'Complex Table', + tab: 'Tab', + form: 'フォーム', + createArticle: '投稿作成', + editArticle: '投稿編集', + articleList: '投稿リスト', + errorPages: 'エラーページ', + page401: '401', + page404: '404', + errorLog: 'エラーログ', + excel: 'Excel', + exportExcel: '一括エクスポート', + selectExcel: '複数選択エクスポート', + mergeHeader: 'ヘッダーマージ', + uploadExcel: 'アップロード', + zip: 'Zip', + pdf: 'PDF', + exportZip: 'Export Zip', + theme: 'テーマ変更', + clipboardDemo: 'Clipboard', + i18n: '多言語', + externalLink: '外部リンク', + profile: 'プロフィール' + }, + navbar: { + dashboard: 'トップ', + github: 'GitHub', + logOut: 'ログアウト', + profile: 'プロフィール', + theme: 'テーマ変更', + size: '画面サイズ' + }, + login: { + title: 'ユーザログイン', + logIn: 'ログイン', + username: 'ユーザ名', + password: 'パスワード', + any: 'password', + thirdparty: '外部IDでログイン', + thirdpartyTips: 'ローカル環境ではログインできません。実装が必要です。' + }, + documentation: { + documentation: 'ドキュメント', + github: 'Github Link' + }, + permission: { + addRole: 'ロール追加', + editPermission: 'ロール変更', + roles: 'ロール', + switchRoles: 'ロール切替', + tips: 'v-permissionは使えない時があります。例えば: Element-UI の el-tab、 el-table-column 及び他の dom。v-ifを使う必要があります。', + delete: '削除', + confirm: '確認', + cancel: 'キャンセル' + }, + guide: { + description: 'ガイドは各機能の説明です。', + button: 'ガイドを見る' + }, + components: { + documentation: 'ドキュメント', + tinymceTips: 'tinymceは管理画面に重要な機能ですが、その同時に落とし穴がありあす。tinymceを使う道のりが大変でした。Tinymceを使う時に各自のプロジェクト状況で判断が必要です。ドキュメントはこちら', + dropzoneTips: 'Third partyのパッケージを使わず、独自の実装しています。詳細は @/components/Dropzone', + stickyTips: 'ページの指定位置へスクロールした場合、表示されます。', + backToTopTips1: 'トップへスクロールが表示されます。', + backToTopTips2: 'ボタンのスタイルはカスタマイズできます。例えば、show/hide、height、position。 またはElementのel-tooltipを使って、ツールチップを実装できます。', + imageUploadTips: 'mockjsは使えないため、カスタマイズしています。公式の最新バージョンを使ってください。' + }, + table: { + dynamicTips1: '先頭は固定、最後に追加', + dynamicTips2: '戦後に追加せず、指定列に追加', + dragTips1: 'デフォルト順番', + dragTips2: 'Drag後の順番', + title: 'タイトル', + importance: '重要', + type: 'タイプ', + remark: '評価', + search: '検索', + add: '追加', + export: 'エクスポート', + reviewer: 'レビュアー', + id: '番号', + date: '日時', + author: '作成者', + readings: '閲覧数', + status: 'ステータス', + actions: '操作', + edit: '編集', + publish: '公開', + draft: '下書き', + delete: 'キャンセル', + cancel: 'キャンセル', + confirm: '確認' + }, + example: { + warning: '新規作成と編集画面は keep-alive を使えないです。keep-alive の include はrouteのキャッシュは使えないです。そのため、component name を使ってキャッシュさせるようにします。このようなキャッシュ機能を作りたい場合,localStorageを使う手があります。もしくは keep-alive の includeを使って、全ページキャッシュする方法はあります。' + }, + errorLog: { + tips: '右上のbugアイコンをクリックしてください。', + description: '管理画面はspaを使う場合が多い、ユーザ体現向上はできますが、想定外エラーが発生する場合があります。Vueはそのエラーハンドリング機能を提供し、エラーレポートができます。', + documentation: 'ドキュメント' + }, + excel: { + export: 'エクスポート', + selectedExport: 'エクスポート対象を選択してください。', + placeholder: 'ファイル名を入力してください。' + }, + zip: { + export: 'エクスポート', + placeholder: 'ファイル名を入力してください。' + }, + pdf: { + tips: 'window.print() を使ってPDFダウンロードしています。' + }, + theme: { + change: 'テーマ切替', + documentation: 'ドキュメント', + tips: 'Tips: テーマの切り替え方法はnavbarのtheme-pickと異なります、使い方はドキュメントを確認してください。' + }, + tagsView: { + refresh: '更新', + close: '閉じる', + closeOthers: 'その他閉じる', + closeAll: 'すべて閉じる' + }, + settings: { + title: 'システムテーマ', + theme: 'テーマ色', + tagsView: 'Tags-View 開く', + fixedHeader: 'Fixed Header', + sidebarLogo: 'Sidebar Logo' + } +} diff --git a/src/views/i18n-demo/index.vue b/src/views/i18n-demo/index.vue index 60c9a80e..32cee075 100644 --- a/src/views/i18n-demo/index.vue +++ b/src/views/i18n-demo/index.vue @@ -16,6 +16,9 @@ <el-radio label="es" border> Español </el-radio> + <el-radio label="ja" border> + 日本語 + </el-radio> </el-radio-group> <el-tag style="margin-top:15px;display:block;" type="info"> {{ $t('i18nView.note') }} @@ -124,6 +127,7 @@ export default { this.$i18n.mergeLocaleMessage('en', local.en) this.$i18n.mergeLocaleMessage('zh', local.zh) this.$i18n.mergeLocaleMessage('es', local.es) + this.$i18n.mergeLocaleMessage('ja', local.ja) } this.setOptions() // set default select options }, diff --git a/src/views/i18n-demo/local.js b/src/views/i18n-demo/local.js index 9b43e605..ae38dd28 100644 --- a/src/views/i18n-demo/local.js +++ b/src/views/i18n-demo/local.js @@ -59,5 +59,25 @@ export default { two: 'Two', three: 'Three' } + }, + ja: { + i18nView: { + title: '言語切替', + note: 'vue-i18nを使っています', + datePlaceholder: '日時選択', + selectPlaceholder: '選択してください', + tableDate: '日時', + tableName: '姓名', + tableAddress: '住所', + default: 'default', + primary: 'primary', + success: 'success', + info: 'info', + warning: 'warning', + danger: 'danger', + one: '1', + two: '2', + three: '3' + } } } From 09a80688d2a891b89ae8241e6d5bac43d1d65310 Mon Sep 17 00:00:00 2001 From: dolonfly <kaixin890312@163.com> Date: Fri, 3 May 2019 14:14:37 +0800 Subject: [PATCH 151/202] fix[Example]: fixed display_time always NaN bug (#2001) --- src/views/example/components/ArticleDetail.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 55d2972a..4ef43e49 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -189,7 +189,7 @@ export default { this.$store.dispatch('tagsView/updateVisitedView', route) }, submitForm() { - this.postForm.display_time = parseInt(this.display_time / 1000) + this.postForm.display_time = parseInt(this.postForm.display_time / 1000) console.log(this.postForm) this.$refs.postForm.validate(valid => { if (valid) { From fd9ad8986cecc01876bdf72aec9c4bd7f004ae5e Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 3 May 2019 16:58:33 +0800 Subject: [PATCH 152/202] perf[Tinymce]: refine tinymce lang --- src/components/Tinymce/index.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index e29e336a..a5dd7a3f 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -61,6 +61,7 @@ export default { languageTypeList: { 'en': 'en', 'zh': 'zh_CN', + 'es': 'es_MX', 'ja': 'ja' } } @@ -107,7 +108,7 @@ export default { window.tinymce.init({ language: this.language, // language cnd URL, detail see https://github.com/PanJiaChen/tinymce-lang - language_url: `https://cdn.jsdelivr.net/npm/tinymce-lang/langs/${this.language}.js`, + language_url: this.language === 'en' ? '' : `https://cdn.jsdelivr.net/npm/tinymce-lang/langs/${this.language}.js`, selector: `#${this.tinymceId}`, height: this.height, body_class: 'panel-body ', From 90af74eb401cf66250220c39ca29ac735bd15a9e Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 3 May 2019 17:29:49 +0800 Subject: [PATCH 153/202] perf[Example]: refine example demo --- src/views/example/components/ArticleDetail.vue | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 4ef43e49..4f4dfe05 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -36,7 +36,7 @@ <el-col :span="10"> <el-form-item label-width="120px" label="Publush Time:" class="postInfo-container-item"> - <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Select date and time" /> + <el-date-picker v-model="displayTime" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Select date and time" /> </el-form-item> </el-col> @@ -154,6 +154,18 @@ export default { }, lang() { return this.$store.getters.language + }, + displayTime: { + // set and get is useful when the data + // returned by the back end api is different from the front end + // back end return => "2013-06-25 06:59:25" + // front end need timestamp => 1372114765000 + get() { + return (+new Date(this.postForm.display_time)) + }, + set(val) { + this.postForm.display_time = new Date(val) + } } }, created() { @@ -189,7 +201,6 @@ export default { this.$store.dispatch('tagsView/updateVisitedView', route) }, submitForm() { - this.postForm.display_time = parseInt(this.postForm.display_time / 1000) console.log(this.postForm) this.$refs.postForm.validate(valid => { if (valid) { From 41318aa0d932847b835f4274182eff62e7ed21f2 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 5 May 2019 15:02:27 +0800 Subject: [PATCH 154/202] docs: tips for set port --- vue.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vue.config.js b/vue.config.js index 30d40ea6..aeaeb0e4 100644 --- a/vue.config.js +++ b/vue.config.js @@ -7,6 +7,9 @@ function resolve(dir) { } const name = defaultSettings.title || 'vue Element Admin' // page title +// If your port is set to 80, +// use administrator privileges to execute the command line. +// For example, Mac: sudo npm run const port = 9527 // dev port // All configuration item explanations can be find in https://cli.vuejs.org/config/ From e8e6c7e79c2488779090f00efc5f1bbfcb04bd5b Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 5 May 2019 15:49:56 +0800 Subject: [PATCH 155/202] perf: optimize page scrolling when setting fixedHeader tweak --- src/layout/components/AppMain.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 62e6ace5..e72e4555 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -33,6 +33,8 @@ export default { .fixed-header+.app-main { padding-top: 50px; + height: 100vh; + overflow: auto; } .hasTagsView { From 00a19db299399f3243e86d58f41a623e20571bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Sun, 5 May 2019 16:49:40 +0800 Subject: [PATCH 156/202] chore: remove i18n (#1828) --- README.ja.md | 6 +- README.md | 6 +- README.zh-CN.md | 4 +- mock/role/routes.js | 110 +++++------ package.json | 1 - src/components/Breadcrumb/index.vue | 9 +- src/components/HeaderSearch/index.vue | 12 +- src/components/LangSelect/index.vue | 41 ---- src/components/Tinymce/index.vue | 14 +- src/icons/index.js | 2 +- src/lang/en.js | 175 ------------------ src/lang/es.js | 175 ------------------ src/lang/index.js | 55 ------ src/lang/ja.js | 175 ------------------ src/lang/zh.js | 175 ------------------ src/layout/components/Navbar.vue | 20 +- src/layout/components/Settings/index.vue | 10 +- src/layout/components/Sidebar/SidebarItem.vue | 9 +- src/layout/components/TagsView/index.vue | 21 +-- src/main.js | 5 +- src/router/index.js | 76 ++++---- src/router/modules/charts.js | 8 +- src/router/modules/components.js | 30 +-- src/router/modules/nested.js | 16 +- src/router/modules/table.js | 8 +- src/store/getters.js | 1 - src/store/modules/app.js | 9 - src/store/modules/user.js | 2 +- src/utils/get-page-title.js | 9 +- src/utils/i18n.js | 12 -- src/utils/index.js | 2 +- src/utils/open-window.js | 2 +- src/utils/request.js | 9 +- src/utils/validate.js | 2 +- src/views/components-demo/avatar-upload.vue | 2 +- src/views/components-demo/back-to-top.vue | 8 +- src/views/components-demo/dropzone.vue | 2 +- src/views/components-demo/markdown.vue | 2 +- src/views/components-demo/sticky.vue | 4 +- src/views/components-demo/tinymce.vue | 4 +- src/views/documentation/index.vue | 19 +- src/views/error-log/index.vue | 7 +- .../example/components/ArticleDetail.vue | 6 +- src/views/example/components/Warning.vue | 5 +- src/views/excel/components/FilenameOption.vue | 3 +- src/views/excel/export-excel.vue | 5 +- src/views/excel/select-excel.vue | 5 +- src/views/guide/index.vue | 5 +- src/views/i18n-demo/index.vue | 168 ----------------- src/views/i18n-demo/local.js | 83 --------- src/views/login/index.vue | 41 ++-- src/views/pdf/index.vue | 4 +- .../permission/components/SwitchRoles.vue | 4 +- src/views/permission/directive.vue | 2 +- src/views/permission/role.vue | 45 ++--- src/views/profile/index.vue | 2 - src/views/table/complex-table.vue | 72 +++---- src/views/table/drag-table.vue | 5 +- src/views/table/dynamic-table/index.vue | 4 +- src/views/table/inline-edit-table.vue | 24 ++- src/views/theme/index.vue | 8 +- src/views/zip/index.vue | 5 +- vue.config.js | 2 +- 63 files changed, 317 insertions(+), 1440 deletions(-) delete mode 100644 src/components/LangSelect/index.vue delete mode 100644 src/lang/en.js delete mode 100755 src/lang/es.js delete mode 100644 src/lang/index.js delete mode 100644 src/lang/ja.js delete mode 100644 src/lang/zh.js delete mode 100644 src/utils/i18n.js delete mode 100644 src/views/i18n-demo/index.vue delete mode 100644 src/views/i18n-demo/local.js diff --git a/README.ja.md b/README.ja.md index e601291a..d4ffcace 100644 --- a/README.ja.md +++ b/README.ja.md @@ -26,7 +26,7 @@ </a> </p> -日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) +日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) ## 概要 @@ -46,6 +46,8 @@ - デスクトップバージョン: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescriptバージョン: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) +**After the `v4.1.0+` version, the default master branch will not support i18n. Please use [i18n Branch](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), it will keep up with the master update** + **現在のバージョン `v4.0+` は `vue-cli` で構築,バグ報告は[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)のissueでお願いします。旧バージョン[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)もあります。`vue-cli`に依存しないです。** **低いバージョンのブラウザはサーポートしないです(例えば ie),必要があれば polyfill を追加してください。 [詳細はこちら](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** @@ -207,4 +209,4 @@ Modern browsers and Internet Explorer 10+. [MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) -Copyright (c) 2017-present PanJiaChen \ No newline at end of file +Copyright (c) 2017-present PanJiaChen diff --git a/README.md b/README.md index 0388b0d0..e6ade124 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ </a> </p> -English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) +English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) ## Introduction @@ -50,7 +50,9 @@ It is a magical vue admin based on the newest development stack of vue, built-in - Desktop: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour)) -**The current version is `v4.0+` build on `vue-cli`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), it does not rely on `vue-cli'** +**After the `v4.1.0+` version, the default master branch will not support i18n. Please use [i18n Branch](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), it will keep up with the master update** + +**The current version is `v4.0+` build on `vue-cli`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), it does not rely on `vue-cli`** **This project does not support low version browsers (e.g. IE). Please add polyfill by yourself.** diff --git a/README.zh-CN.md b/README.zh-CN.md index 0af0838d..5bb313ce 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -50,10 +50,12 @@ - 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - Typescript 版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour)) -**目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若发现问题,欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0),它不依赖 `vue-cli`** +**`v4.1.0+`版本之后默认 master 分支将不支持国际化,有需要的请使用[i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n)分支,它会和 master 保持同步更新** **该项目不支持低版本浏览器(如 ie),有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** +**目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若发现问题,欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0),它不依赖 `vue-cli`** + 群主 **[圈子](https://jianshiapp.com/circles/1209)** 群主会经常分享一些技术相关的东西,或者加入 [qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602) 或者关注 [微博](https://weibo.com/u/3423485724?is_all=1) ## 前序准备 diff --git a/mock/role/routes.js b/mock/role/routes.js index c4654566..d718919c 100644 --- a/mock/role/routes.js +++ b/mock/role/routes.js @@ -41,7 +41,7 @@ export const constantRoutes = [ path: 'dashboard', component: 'views/dashboard/index', name: 'Dashboard', - meta: { title: 'dashboard', icon: 'dashboard', affix: true } + meta: { title: 'Dashboard', icon: 'dashboard', affix: true } } ] }, @@ -53,7 +53,7 @@ export const constantRoutes = [ path: 'index', component: 'views/documentation/index', name: 'Documentation', - meta: { title: 'documentation', icon: 'documentation', affix: true } + meta: { title: 'Documentation', icon: 'documentation', affix: true } } ] }, @@ -66,7 +66,7 @@ export const constantRoutes = [ path: 'index', component: 'views/guide/index', name: 'Guide', - meta: { title: 'guide', icon: 'guide', noCache: true } + meta: { title: 'Guide', icon: 'guide', noCache: true } } ] } @@ -79,7 +79,7 @@ export const asyncRoutes = [ redirect: '/permission/index', alwaysShow: true, meta: { - title: 'permission', + title: 'Permission', icon: 'lock', roles: ['admin', 'editor'] }, @@ -89,7 +89,7 @@ export const asyncRoutes = [ component: 'views/permission/page', name: 'PagePermission', meta: { - title: 'pagePermission', + title: 'Page Permission', roles: ['admin'] } }, @@ -98,7 +98,7 @@ export const asyncRoutes = [ component: 'views/permission/directive', name: 'DirectivePermission', meta: { - title: 'directivePermission' + title: 'Directive Permission' } }, { @@ -106,7 +106,7 @@ export const asyncRoutes = [ component: 'views/permission/role', name: 'RolePermission', meta: { - title: 'rolePermission', + title: 'Role Permission', roles: ['admin'] } } @@ -121,7 +121,7 @@ export const asyncRoutes = [ path: 'index', component: 'views/icons/index', name: 'Icons', - meta: { title: 'icons', icon: 'icon', noCache: true } + meta: { title: 'Icons', icon: 'icon', noCache: true } } ] }, @@ -132,7 +132,7 @@ export const asyncRoutes = [ redirect: 'noRedirect', name: 'ComponentDemo', meta: { - title: 'components', + title: 'Components', icon: 'component' }, children: [ @@ -140,49 +140,49 @@ export const asyncRoutes = [ path: 'tinymce', component: 'views/components-demo/tinymce', name: 'TinymceDemo', - meta: { title: 'tinymce' } + meta: { title: 'Tinymce' } }, { path: 'markdown', component: 'views/components-demo/markdown', name: 'MarkdownDemo', - meta: { title: 'markdown' } + meta: { title: 'Markdown' } }, { path: 'json-editor', component: 'views/components-demo/json-editor', name: 'JsonEditorDemo', - meta: { title: 'jsonEditor' } + meta: { title: 'Json Editor' } }, { path: 'split-pane', component: 'views/components-demo/split-pane', name: 'SplitpaneDemo', - meta: { title: 'splitPane' } + meta: { title: 'SplitPane' } }, { path: 'avatar-upload', component: 'views/components-demo/avatar-upload', name: 'AvatarUploadDemo', - meta: { title: 'avatarUpload' } + meta: { title: 'Avatar Upload' } }, { path: 'dropzone', component: 'views/components-demo/dropzone', name: 'DropzoneDemo', - meta: { title: 'dropzone' } + meta: { title: 'Dropzone' } }, { path: 'sticky', component: 'views/components-demo/sticky', name: 'StickyDemo', - meta: { title: 'sticky' } + meta: { title: 'Sticky' } }, { path: 'count-to', component: 'views/components-demo/count-to', name: 'CountToDemo', - meta: { title: 'countTo' } + meta: { title: 'Count To' } }, { path: 'mixin', @@ -194,31 +194,31 @@ export const asyncRoutes = [ path: 'back-to-top', component: 'views/components-demo/back-to-top', name: 'BackToTopDemo', - meta: { title: 'backToTop' } + meta: { title: 'Back To Top' } }, { path: 'drag-dialog', component: 'views/components-demo/drag-dialog', name: 'DragDialogDemo', - meta: { title: 'dragDialog' } + meta: { title: 'Drag Dialog' } }, { path: 'drag-select', component: 'views/components-demo/drag-select', name: 'DragSelectDemo', - meta: { title: 'dragSelect' } + meta: { title: 'Drag Select' } }, { path: 'dnd-list', component: 'views/components-demo/dnd-list', name: 'DndListDemo', - meta: { title: 'dndList' } + meta: { title: 'Dnd List' } }, { path: 'drag-kanban', component: 'views/components-demo/drag-kanban', name: 'DragKanbanDemo', - meta: { title: 'dragKanban' } + meta: { title: 'Drag Kanban' } } ] }, @@ -228,7 +228,7 @@ export const asyncRoutes = [ redirect: 'noRedirect', name: 'Charts', meta: { - title: 'charts', + title: 'Charts', icon: 'chart' }, children: [ @@ -236,19 +236,19 @@ export const asyncRoutes = [ path: 'keyboard', component: 'views/charts/keyboard', name: 'KeyboardChart', - meta: { title: 'keyboardChart', noCache: true } + meta: { title: 'Keyboard Chart', noCache: true } }, { path: 'line', component: 'views/charts/line', name: 'LineChart', - meta: { title: 'lineChart', noCache: true } + meta: { title: 'Line Chart', noCache: true } }, { path: 'mixchart', component: 'views/charts/mixChart', name: 'MixChart', - meta: { title: 'mixChart', noCache: true } + meta: { title: 'Mix Chart', noCache: true } } ] }, @@ -258,7 +258,7 @@ export const asyncRoutes = [ redirect: '/nested/menu1/menu1-1', name: 'Nested', meta: { - title: 'nested', + title: 'Nested', icon: 'nested' }, children: [ @@ -266,33 +266,33 @@ export const asyncRoutes = [ path: 'menu1', component: 'views/nested/menu1/index', name: 'Menu1', - meta: { title: 'menu1' }, + meta: { title: 'Menu1' }, redirect: '/nested/menu1/menu1-1', children: [ { path: 'menu1-1', component: 'views/nested/menu1/menu1-1', name: 'Menu1-1', - meta: { title: 'menu1-1' } + meta: { title: 'Menu1-1' } }, { path: 'menu1-2', component: 'views/nested/menu1/menu1-2', name: 'Menu1-2', redirect: '/nested/menu1/menu1-2/menu1-2-1', - meta: { title: 'menu1-2' }, + meta: { title: 'Menu1-2' }, children: [ { path: 'menu1-2-1', component: 'views/nested/menu1/menu1-2/menu1-2-1', name: 'Menu1-2-1', - meta: { title: 'menu1-2-1' } + meta: { title: 'Menu1-2-1' } }, { path: 'menu1-2-2', component: 'views/nested/menu1/menu1-2/menu1-2-2', name: 'Menu1-2-2', - meta: { title: 'menu1-2-2' } + meta: { title: 'Menu1-2-2' } } ] }, @@ -300,7 +300,7 @@ export const asyncRoutes = [ path: 'menu1-3', component: 'views/nested/menu1/menu1-3', name: 'Menu1-3', - meta: { title: 'menu1-3' } + meta: { title: 'Menu1-3' } } ] }, @@ -308,7 +308,7 @@ export const asyncRoutes = [ path: 'menu2', name: 'Menu2', component: 'views/nested/menu2/index', - meta: { title: 'menu2' } + meta: { title: 'Menu2' } } ] }, @@ -319,7 +319,7 @@ export const asyncRoutes = [ redirect: '/example/list', name: 'Example', meta: { - title: 'example', + title: 'Example', icon: 'example' }, children: [ @@ -327,20 +327,20 @@ export const asyncRoutes = [ path: 'create', component: 'views/example/create', name: 'CreateArticle', - meta: { title: 'createArticle', icon: 'edit' } + meta: { title: 'Create Article', icon: 'edit' } }, { path: 'edit/:id(\\d+)', component: 'views/example/edit', name: 'EditArticle', - meta: { title: 'editArticle', noCache: true }, + meta: { title: 'Edit Article', noCache: true }, hidden: true }, { path: 'list', component: 'views/example/list', name: 'ArticleList', - meta: { title: 'articleList', icon: 'list' } + meta: { title: 'Article List', icon: 'list' } } ] }, @@ -353,7 +353,7 @@ export const asyncRoutes = [ path: 'index', component: 'views/tab/index', name: 'Tab', - meta: { title: 'tab', icon: 'tab' } + meta: { title: 'Tab', icon: 'tab' } } ] }, @@ -364,7 +364,7 @@ export const asyncRoutes = [ redirect: 'noRedirect', name: 'ErrorPages', meta: { - title: 'errorPages', + title: 'Error Pages', icon: '404' }, children: [ @@ -372,13 +372,13 @@ export const asyncRoutes = [ path: '401', component: 'views/error-page/401', name: 'Page401', - meta: { title: 'page401', noCache: true } + meta: { title: 'Page 401', noCache: true } }, { path: '404', component: 'views/error-page/404', name: 'Page404', - meta: { title: 'page404', noCache: true } + meta: { title: 'Page 404', noCache: true } } ] }, @@ -392,7 +392,7 @@ export const asyncRoutes = [ path: 'log', component: 'views/error-log/index', name: 'ErrorLog', - meta: { title: 'errorLog', icon: 'bug' } + meta: { title: 'Error Log', icon: 'bug' } } ] }, @@ -403,7 +403,7 @@ export const asyncRoutes = [ redirect: '/excel/export-excel', name: 'Excel', meta: { - title: 'excel', + title: 'Excel', icon: 'excel' }, children: [ @@ -411,25 +411,25 @@ export const asyncRoutes = [ path: 'export-excel', component: 'views/excel/export-excel', name: 'ExportExcel', - meta: { title: 'exportExcel' } + meta: { title: 'Export Excel' } }, { path: 'export-selected-excel', component: 'views/excel/select-excel', name: 'SelectExcel', - meta: { title: 'selectExcel' } + meta: { title: 'Select Excel' } }, { path: 'export-merge-header', component: 'views/excel/merge-header', name: 'MergeHeader', - meta: { title: 'mergeHeader' } + meta: { title: 'Merge Header' } }, { path: 'upload-excel', component: 'views/excel/upload-excel', name: 'UploadExcel', - meta: { title: 'uploadExcel' } + meta: { title: 'Upload Excel' } } ] }, @@ -439,13 +439,13 @@ export const asyncRoutes = [ component: 'layout/Layout', redirect: '/zip/download', alwaysShow: true, - meta: { title: 'zip', icon: 'zip' }, + meta: { title: 'Zip', icon: 'zip' }, children: [ { path: 'download', component: 'views/zip/index', name: 'ExportZip', - meta: { title: 'exportZip' } + meta: { title: 'Export Zip' } } ] }, @@ -459,7 +459,7 @@ export const asyncRoutes = [ path: 'index', component: 'views/pdf/index', name: 'PDF', - meta: { title: 'pdf', icon: 'pdf' } + meta: { title: 'PDF', icon: 'pdf' } } ] }, @@ -478,7 +478,7 @@ export const asyncRoutes = [ path: 'index', component: 'views/theme/index', name: 'Theme', - meta: { title: 'theme', icon: 'theme' } + meta: { title: 'Theme', icon: 'theme' } } ] }, @@ -492,7 +492,7 @@ export const asyncRoutes = [ path: 'index', component: 'views/clipboard/index', name: 'ClipboardDemo', - meta: { title: 'clipboardDemo', icon: 'clipboard' } + meta: { title: 'Clipboard Demo', icon: 'clipboard' } } ] }, @@ -505,7 +505,7 @@ export const asyncRoutes = [ path: 'index', component: 'views/i18n-demo/index', name: 'I18n', - meta: { title: 'i18n', icon: 'international' } + meta: { title: 'I18n', icon: 'international' } } ] }, @@ -516,7 +516,7 @@ export const asyncRoutes = [ children: [ { path: 'https://github.com/PanJiaChen/vue-element-admin', - meta: { title: 'externalLink', icon: 'link' } + meta: { title: 'External Link', icon: 'link' } } ] }, diff --git a/package.json b/package.json index 6802c9b5..f456e13c 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,6 @@ "tui-editor": "1.3.3", "vue": "2.6.10", "vue-count-to": "1.0.13", - "vue-i18n": "7.3.2", "vue-router": "3.0.2", "vue-splitpane": "1.0.4", "vuedraggable": "2.20.0", diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index b89d8da6..29f9a04c 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -2,16 +2,14 @@ <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> - <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ - generateTitle(item.meta.title) }}</span> - <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a> + <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span> + <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> </el-breadcrumb-item> </transition-group> </el-breadcrumb> </template> <script> -import { generateTitle } from '@/utils/i18n' import pathToRegexp from 'path-to-regexp' export default { @@ -29,14 +27,13 @@ export default { this.getBreadcrumb() }, methods: { - generateTitle, getBreadcrumb() { // only show routes with meta.title let matched = this.$route.matched.filter(item => item.meta && item.meta.title) const first = matched[0] if (!this.isDashboard(first)) { - matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched) + matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched) } this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 90eea067..af047168 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -22,7 +22,6 @@ // make search results more in line with expectations import Fuse from 'fuse.js' import path from 'path' -import i18n from '@/lang' export default { name: 'HeaderSearch', @@ -38,15 +37,9 @@ export default { computed: { routes() { return this.$store.getters.permission_routes - }, - lang() { - return this.$store.getters.language } }, watch: { - lang() { - this.searchPool = this.generateRoutes(this.routes) - }, routes() { this.searchPool = this.generateRoutes(this.routes) }, @@ -116,10 +109,7 @@ export default { } if (router.meta && router.meta.title) { - // generate internationalized title - const i18ntitle = i18n.t(`route.${router.meta.title}`) - - data.title = [...data.title, i18ntitle] + data.title = [...data.title, router.meta.title] if (router.redirect !== 'noRedirect') { // only push the routes with title diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue deleted file mode 100644 index 44248418..00000000 --- a/src/components/LangSelect/index.vue +++ /dev/null @@ -1,41 +0,0 @@ -<template> - <el-dropdown trigger="click" class="international" @command="handleSetLanguage"> - <div> - <svg-icon class-name="international-icon" icon-class="language" /> - </div> - <el-dropdown-menu slot="dropdown"> - <el-dropdown-item :disabled="language==='zh'" command="zh"> - 中文 - </el-dropdown-item> - <el-dropdown-item :disabled="language==='en'" command="en"> - English - </el-dropdown-item> - <el-dropdown-item :disabled="language==='es'" command="es"> - Español - </el-dropdown-item> - <el-dropdown-item :disabled="language==='ja'" command="ja"> - 日本語 - </el-dropdown-item> - </el-dropdown-menu> - </el-dropdown> -</template> - -<script> -export default { - computed: { - language() { - return this.$store.getters.language - } - }, - methods: { - handleSetLanguage(lang) { - this.$i18n.locale = lang - this.$store.dispatch('app/setLanguage', lang) - this.$message({ - message: 'Switch Language Success', - type: 'success' - }) - } - } -} -</script> diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index a5dd7a3f..62cb2c06 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -60,16 +60,11 @@ export default { fullscreen: false, languageTypeList: { 'en': 'en', - 'zh': 'zh_CN', - 'es': 'es_MX', - 'ja': 'ja' + 'zh': 'zh_CN' } } }, computed: { - language() { - return this.languageTypeList[this.$store.getters.language] - }, containerWidth() { const width = this.width if (/^[\d]+(\.[\d]+)?$/.test(width)) { // matches `100`, `'100'` @@ -84,10 +79,6 @@ export default { this.$nextTick(() => window.tinymce.get(this.tinymceId).setContent(val || '')) } - }, - language() { - this.destroyTinymce() - this.$nextTick(() => this.initTinymce()) } }, mounted() { @@ -106,9 +97,6 @@ export default { initTinymce() { const _this = this window.tinymce.init({ - language: this.language, - // language cnd URL, detail see https://github.com/PanJiaChen/tinymce-lang - language_url: this.language === 'en' ? '' : `https://cdn.jsdelivr.net/npm/tinymce-lang/langs/${this.language}.js`, selector: `#${this.tinymceId}`, height: this.height, body_class: 'panel-body ', diff --git a/src/icons/index.js b/src/icons/index.js index c1c2e792..2c6b309c 100644 --- a/src/icons/index.js +++ b/src/icons/index.js @@ -1,5 +1,5 @@ import Vue from 'vue' -import SvgIcon from '@/components/SvgIcon'// svg组件 +import SvgIcon from '@/components/SvgIcon'// svg component // register globally Vue.component('svg-icon', SvgIcon) diff --git a/src/lang/en.js b/src/lang/en.js deleted file mode 100644 index ae221ba8..00000000 --- a/src/lang/en.js +++ /dev/null @@ -1,175 +0,0 @@ -export default { - route: { - dashboard: 'Dashboard', - documentation: 'Documentation', - guide: 'Guide', - permission: 'Permission', - pagePermission: 'Page Permission', - rolePermission: 'Role Permission', - directivePermission: 'Directive Permission', - icons: 'Icons', - components: 'Components', - tinymce: 'Tinymce', - markdown: 'Markdown', - jsonEditor: 'JSON Editor', - dndList: 'Dnd List', - splitPane: 'SplitPane', - avatarUpload: 'Avatar Upload', - dropzone: 'Dropzone', - sticky: 'Sticky', - countTo: 'Count To', - componentMixin: 'Mixin', - backToTop: 'Back To Top', - dragDialog: 'Drag Dialog', - dragSelect: 'Drag Select', - dragKanban: 'Drag Kanban', - charts: 'Charts', - keyboardChart: 'Keyboard Chart', - lineChart: 'Line Chart', - mixChart: 'Mix Chart', - example: 'Example', - nested: 'Nested Routes', - menu1: 'Menu 1', - 'menu1-1': 'Menu 1-1', - 'menu1-2': 'Menu 1-2', - 'menu1-2-1': 'Menu 1-2-1', - 'menu1-2-2': 'Menu 1-2-2', - 'menu1-3': 'Menu 1-3', - menu2: 'Menu 2', - Table: 'Table', - dynamicTable: 'Dynamic Table', - dragTable: 'Drag Table', - inlineEditTable: 'Inline Edit', - complexTable: 'Complex Table', - tab: 'Tab', - form: 'Form', - createArticle: 'Create Article', - editArticle: 'Edit Article', - articleList: 'Article List', - errorPages: 'Error Pages', - page401: '401', - page404: '404', - errorLog: 'Error Log', - excel: 'Excel', - exportExcel: 'Export Excel', - selectExcel: 'Export Selected', - mergeHeader: 'Merge Header', - uploadExcel: 'Upload Excel', - zip: 'Zip', - pdf: 'PDF', - exportZip: 'Export Zip', - theme: 'Theme', - clipboardDemo: 'Clipboard', - i18n: 'I18n', - externalLink: 'External Link', - profile: 'Profile' - }, - navbar: { - dashboard: 'Dashboard', - github: 'Github', - logOut: 'Log Out', - profile: 'Profile', - theme: 'Theme', - size: 'Global Size' - }, - login: { - title: 'Login Form', - logIn: 'Login', - username: 'Username', - password: 'Password', - any: 'any', - thirdparty: 'Or connect with', - thirdpartyTips: 'Can not be simulated on local, so please combine you own business simulation! ! !' - }, - documentation: { - documentation: 'Documentation', - github: 'Github Repository' - }, - permission: { - addRole: 'New Role', - editPermission: 'Edit', - roles: 'Your roles', - switchRoles: 'Switch roles', - tips: 'In some cases, using v-permission will have no effect. For example: Element-UI el-tab or el-table-column and other scenes that dynamically render dom. You can only do this with v-if.', - delete: 'Delete', - confirm: 'Confirm', - cancel: 'Cancel' - }, - guide: { - description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ', - button: 'Show Guide' - }, - components: { - documentation: 'Documentation', - tinymceTips: 'Rich text is a core feature of the management backend, but at the same time it is a place with lots of pits. In the process of selecting rich texts, I also took a lot of detours. The common rich texts on the market have been basically used, and I finally chose Tinymce. See the more detailed rich text comparison and introduction.', - dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.', - stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.', - backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner', - backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally', - imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.' - }, - table: { - dynamicTips1: 'Fixed header, sorted by header order', - dynamicTips2: 'Not fixed header, sorted by click order', - dragTips1: 'The default order', - dragTips2: 'The after dragging order', - title: 'Title', - importance: 'Imp', - type: 'Type', - remark: 'Remark', - search: 'Search', - add: 'Add', - export: 'Export', - reviewer: 'reviewer', - id: 'ID', - date: 'Date', - author: 'Author', - readings: 'Readings', - status: 'Status', - actions: 'Actions', - edit: 'Edit', - publish: 'Publish', - draft: 'Draft', - delete: 'Delete', - cancel: 'Cancel', - confirm: 'Confirm' - }, - example: { - warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details' - }, - errorLog: { - tips: 'Please click the bug icon in the upper right corner', - description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.', - documentation: 'Document introduction' - }, - excel: { - export: 'Export', - selectedExport: 'Export Selected Items', - placeholder: 'Please enter the file name (default excel-list)' - }, - zip: { - export: 'Export', - placeholder: 'Please enter the file name (default file)' - }, - pdf: { - tips: 'Here we use window.print() to implement the feature of downloading PDF.' - }, - theme: { - change: 'Change Theme', - documentation: 'Theme documentation', - tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.' - }, - tagsView: { - refresh: 'Refresh', - close: 'Close', - closeOthers: 'Close Others', - closeAll: 'Close All' - }, - settings: { - title: 'Page style setting', - theme: 'Theme Color', - tagsView: 'Open Tags-View', - fixedHeader: 'Fixed Header', - sidebarLogo: 'Sidebar Logo' - } -} diff --git a/src/lang/es.js b/src/lang/es.js deleted file mode 100755 index 8187bfe7..00000000 --- a/src/lang/es.js +++ /dev/null @@ -1,175 +0,0 @@ -export default { - route: { - dashboard: 'Panel de control', - documentation: 'Documentación', - guide: 'Guía', - permission: 'Permisos', - rolePermission: 'Permisos de rol', - pagePermission: 'Permisos de la página', - directivePermission: 'Permisos de la directiva', - icons: 'Iconos', - components: 'Componentes', - tinymce: 'Tinymce', - markdown: 'Markdown', - jsonEditor: 'Editor JSON', - dndList: 'Lista Dnd', - splitPane: 'Panel dividido', - avatarUpload: 'Subir avatar', - dropzone: 'Subir ficheros', - sticky: 'Sticky', - countTo: 'CountTo', - componentMixin: 'Mixin', - backToTop: 'Ir arriba', - dragDialog: 'Drag Dialog', - dragSelect: 'Drag Select', - dragKanban: 'Drag Kanban', - charts: 'Gráficos', - keyboardChart: 'Keyboard Chart', - lineChart: 'Gráfico de líneas', - mixChart: 'Mix Chart', - example: 'Ejemplo', - nested: 'Rutas anidadass', - menu1: 'Menu 1', - 'menu1-1': 'Menu 1-1', - 'menu1-2': 'Menu 1-2', - 'menu1-2-1': 'Menu 1-2-1', - 'menu1-2-2': 'Menu 1-2-2', - 'menu1-3': 'Menu 1-3', - menu2: 'Menu 2', - Table: 'Tabla', - dynamicTable: 'Tabla dinámica', - dragTable: 'Arrastrar tabla', - inlineEditTable: 'Editor', - complexTable: 'Complex Table', - tab: 'Pestaña', - form: 'Formulario', - createArticle: 'Crear artículo', - editArticle: 'Editar artículo', - articleList: 'Listado de artículos', - errorPages: 'Páginas de error', - page401: '401', - page404: '404', - errorLog: 'Registro de errores', - excel: 'Excel', - exportExcel: 'Exportar a Excel', - selectExcel: 'Export seleccionado', - mergeHeader: 'Merge Header', - uploadExcel: 'Subir Excel', - zip: 'Zip', - pdf: 'PDF', - exportZip: 'Exportar a Zip', - theme: 'Tema', - clipboardDemo: 'Clipboard', - i18n: 'I18n', - externalLink: 'Enlace externo', - profile: 'Profile' - }, - navbar: { - logOut: 'Salir', - dashboard: 'Panel de control', - github: 'Github', - theme: 'Tema', - size: 'Tamaño global', - profile: 'Profile' - }, - login: { - title: 'Formulario de acceso', - logIn: 'Acceso', - username: 'Usuario', - password: 'Contraseña', - any: 'nada', - thirdparty: 'Conectar con', - thirdpartyTips: 'No se puede simular en local, así que combine su propia simulación de negocios. ! !' - }, - documentation: { - documentation: 'Documentación', - github: 'Repositorio Github' - }, - permission: { - addRole: 'Nuevo rol', - editPermission: 'Permiso de edición', - roles: 'Tus permisos', - switchRoles: 'Cambiar permisos', - tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.', - delete: 'Borrar', - confirm: 'Confirmar', - cancel: 'Cancelar' - }, - guide: { - description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ', - button: 'Ver guía' - }, - components: { - documentation: 'Documentación', - tinymceTips: 'Rich text editor is a core part of management system, but at the same time is a place with lots of problems. In the process of selecting rich texts, I also walked a lot of detours. The common rich text editors in the market are basically used, and the finally chose Tinymce. See documentation for more detailed rich text editor comparisons and introductions.', - dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.', - stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.', - backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner', - backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally', - imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.' - }, - table: { - dynamicTips1: 'Fixed header, sorted by header order', - dynamicTips2: 'Not fixed header, sorted by click order', - dragTips1: 'Orden por defecto', - dragTips2: 'The after dragging order', - title: 'Título', - importance: 'Importancia', - type: 'Tipo', - remark: 'Remark', - search: 'Buscar', - add: 'Añadir', - export: 'Exportar', - reviewer: 'reviewer', - id: 'ID', - date: 'Fecha', - author: 'Autor', - readings: 'Lector', - status: 'Estado', - actions: 'Acciones', - edit: 'Editar', - publish: 'Publicar', - draft: 'Draft', - delete: 'Eliminar', - cancel: 'Cancelar', - confirm: 'Confirmar' - }, - example: { - warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details' - }, - errorLog: { - tips: 'Please click the bug icon in the upper right corner', - description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.', - documentation: 'Documento de introducción' - }, - excel: { - export: 'Exportar', - selectedExport: 'Exportar seleccionados', - placeholder: 'Por favor escribe un nombre de fichero' - }, - zip: { - export: 'Exportar', - placeholder: 'Por favor escribe un nombre de fichero' - }, - pdf: { - tips: 'Here we use window.print() to implement the feature of downloading pdf.' - }, - theme: { - change: 'Cambiar tema', - documentation: 'Documentación del tema', - tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.' - }, - tagsView: { - refresh: 'Actualizar', - close: 'Cerrar', - closeOthers: 'Cerrar otros', - closeAll: 'Cerrar todos' - }, - settings: { - title: 'Page style setting', - theme: 'Theme Color', - tagsView: 'Open Tags-View', - fixedHeader: 'Fixed Header', - sidebarLogo: 'Sidebar Logo' - } -} diff --git a/src/lang/index.js b/src/lang/index.js deleted file mode 100644 index 1799ae7f..00000000 --- a/src/lang/index.js +++ /dev/null @@ -1,55 +0,0 @@ -import Vue from 'vue' -import VueI18n from 'vue-i18n' -import Cookies from 'js-cookie' -import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang -import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang -import elementEsLocale from 'element-ui/lib/locale/lang/es'// element-ui lang -import elementJaLocale from 'element-ui/lib/locale/lang/ja'// element-ui lang -import enLocale from './en' -import zhLocale from './zh' -import esLocale from './es' -import jaLocale from './ja' - -Vue.use(VueI18n) - -const messages = { - en: { - ...enLocale, - ...elementEnLocale - }, - zh: { - ...zhLocale, - ...elementZhLocale - }, - es: { - ...esLocale, - ...elementEsLocale - }, - ja: { - ...jaLocale, - ...elementJaLocale - } -} -export function getLanguage() { - const chooseLanguage = Cookies.get('language') - if (chooseLanguage) return chooseLanguage - - // if has not choose language - const language = (navigator.language || navigator.browserLanguage).toLowerCase() - const locales = Object.keys(messages) - for (const locale of locales) { - if (language.indexOf(locale) > -1) { - return locale - } - } - return 'en' -} -const i18n = new VueI18n({ - // set locale - // options: en | zh | es - locale: getLanguage(), - // set locale messages - messages -}) - -export default i18n diff --git a/src/lang/ja.js b/src/lang/ja.js deleted file mode 100644 index 7dccd124..00000000 --- a/src/lang/ja.js +++ /dev/null @@ -1,175 +0,0 @@ -export default { - route: { - dashboard: 'トップ', - documentation: 'ドキュメント', - guide: 'ガイド', - permission: '権限', - rolePermission: '権限ロール', - pagePermission: 'ページ権限', - directivePermission: 'ディレクティブ権限', - icons: 'アイコン', - components: 'コンポーネント', - tinymce: 'TinyMCE', - markdown: 'Markdown', - jsonEditor: 'JSON Editor', - dndList: 'Drag-And-Drop', - splitPane: 'パネル', - avatarUpload: 'アバターアップロード', - dropzone: 'Dropzone', - sticky: 'Sticky', - countTo: 'Count To', - componentMixin: 'コンポーネントMixin', - backToTop: 'BackToTop', - dragDialog: 'Drag Dialog', - dragSelect: 'Drag Select', - dragKanban: 'Drag 看板', - charts: 'チャート', - keyboardChart: 'Keyboardチャート', - lineChart: 'Lineチャート', - mixChart: 'Mixチャート', - example: 'Example', - nested: 'Nested Routes', - menu1: 'メニュー1', - 'menu1-1': 'メニュー 1-1', - 'menu1-2': 'メニュー 1-2', - 'menu1-2-1': 'メニュー 1-2-1', - 'menu1-2-2': 'メニュー 1-2-2', - 'menu1-3': 'メニュー 1-3', - menu2: 'メニュー 2', - Table: 'Table', - dynamicTable: '可変 Table', - dragTable: 'Drag Table', - inlineEditTable: 'Inline Edit Table', - complexTable: 'Complex Table', - tab: 'Tab', - form: 'フォーム', - createArticle: '投稿作成', - editArticle: '投稿編集', - articleList: '投稿リスト', - errorPages: 'エラーページ', - page401: '401', - page404: '404', - errorLog: 'エラーログ', - excel: 'Excel', - exportExcel: '一括エクスポート', - selectExcel: '複数選択エクスポート', - mergeHeader: 'ヘッダーマージ', - uploadExcel: 'アップロード', - zip: 'Zip', - pdf: 'PDF', - exportZip: 'Export Zip', - theme: 'テーマ変更', - clipboardDemo: 'Clipboard', - i18n: '多言語', - externalLink: '外部リンク', - profile: 'プロフィール' - }, - navbar: { - dashboard: 'トップ', - github: 'GitHub', - logOut: 'ログアウト', - profile: 'プロフィール', - theme: 'テーマ変更', - size: '画面サイズ' - }, - login: { - title: 'ユーザログイン', - logIn: 'ログイン', - username: 'ユーザ名', - password: 'パスワード', - any: 'password', - thirdparty: '外部IDでログイン', - thirdpartyTips: 'ローカル環境ではログインできません。実装が必要です。' - }, - documentation: { - documentation: 'ドキュメント', - github: 'Github Link' - }, - permission: { - addRole: 'ロール追加', - editPermission: 'ロール変更', - roles: 'ロール', - switchRoles: 'ロール切替', - tips: 'v-permissionは使えない時があります。例えば: Element-UI の el-tab、 el-table-column 及び他の dom。v-ifを使う必要があります。', - delete: '削除', - confirm: '確認', - cancel: 'キャンセル' - }, - guide: { - description: 'ガイドは各機能の説明です。', - button: 'ガイドを見る' - }, - components: { - documentation: 'ドキュメント', - tinymceTips: 'tinymceは管理画面に重要な機能ですが、その同時に落とし穴がありあす。tinymceを使う道のりが大変でした。Tinymceを使う時に各自のプロジェクト状況で判断が必要です。ドキュメントはこちら', - dropzoneTips: 'Third partyのパッケージを使わず、独自の実装しています。詳細は @/components/Dropzone', - stickyTips: 'ページの指定位置へスクロールした場合、表示されます。', - backToTopTips1: 'トップへスクロールが表示されます。', - backToTopTips2: 'ボタンのスタイルはカスタマイズできます。例えば、show/hide、height、position。 またはElementのel-tooltipを使って、ツールチップを実装できます。', - imageUploadTips: 'mockjsは使えないため、カスタマイズしています。公式の最新バージョンを使ってください。' - }, - table: { - dynamicTips1: '先頭は固定、最後に追加', - dynamicTips2: '戦後に追加せず、指定列に追加', - dragTips1: 'デフォルト順番', - dragTips2: 'Drag後の順番', - title: 'タイトル', - importance: '重要', - type: 'タイプ', - remark: '評価', - search: '検索', - add: '追加', - export: 'エクスポート', - reviewer: 'レビュアー', - id: '番号', - date: '日時', - author: '作成者', - readings: '閲覧数', - status: 'ステータス', - actions: '操作', - edit: '編集', - publish: '公開', - draft: '下書き', - delete: 'キャンセル', - cancel: 'キャンセル', - confirm: '確認' - }, - example: { - warning: '新規作成と編集画面は keep-alive を使えないです。keep-alive の include はrouteのキャッシュは使えないです。そのため、component name を使ってキャッシュさせるようにします。このようなキャッシュ機能を作りたい場合,localStorageを使う手があります。もしくは keep-alive の includeを使って、全ページキャッシュする方法はあります。' - }, - errorLog: { - tips: '右上のbugアイコンをクリックしてください。', - description: '管理画面はspaを使う場合が多い、ユーザ体現向上はできますが、想定外エラーが発生する場合があります。Vueはそのエラーハンドリング機能を提供し、エラーレポートができます。', - documentation: 'ドキュメント' - }, - excel: { - export: 'エクスポート', - selectedExport: 'エクスポート対象を選択してください。', - placeholder: 'ファイル名を入力してください。' - }, - zip: { - export: 'エクスポート', - placeholder: 'ファイル名を入力してください。' - }, - pdf: { - tips: 'window.print() を使ってPDFダウンロードしています。' - }, - theme: { - change: 'テーマ切替', - documentation: 'ドキュメント', - tips: 'Tips: テーマの切り替え方法はnavbarのtheme-pickと異なります、使い方はドキュメントを確認してください。' - }, - tagsView: { - refresh: '更新', - close: '閉じる', - closeOthers: 'その他閉じる', - closeAll: 'すべて閉じる' - }, - settings: { - title: 'システムテーマ', - theme: 'テーマ色', - tagsView: 'Tags-View 開く', - fixedHeader: 'Fixed Header', - sidebarLogo: 'Sidebar Logo' - } -} diff --git a/src/lang/zh.js b/src/lang/zh.js deleted file mode 100644 index dee804d2..00000000 --- a/src/lang/zh.js +++ /dev/null @@ -1,175 +0,0 @@ -export default { - route: { - dashboard: '首页', - documentation: '文档', - guide: '引导页', - permission: '权限测试页', - rolePermission: '角色权限', - pagePermission: '页面权限', - directivePermission: '指令权限', - icons: '图标', - components: '组件', - tinymce: '富文本编辑器', - markdown: 'Markdown', - jsonEditor: 'JSON 编辑器', - dndList: '列表拖拽', - splitPane: 'Splitpane', - avatarUpload: '头像上传', - dropzone: 'Dropzone', - sticky: 'Sticky', - countTo: 'Count To', - componentMixin: '小组件', - backToTop: '返回顶部', - dragDialog: '拖拽 Dialog', - dragSelect: '拖拽 Select', - dragKanban: '可拖拽看板', - charts: '图表', - keyboardChart: '键盘图表', - lineChart: '折线图', - mixChart: '混合图表', - example: '综合实例', - nested: '路由嵌套', - menu1: '菜单1', - 'menu1-1': '菜单 1-1', - 'menu1-2': '菜单 1-2', - 'menu1-2-1': '菜单 1-2-1', - 'menu1-2-2': '菜单 1-2-2', - 'menu1-3': '菜单 1-3', - menu2: '菜单 2', - Table: 'Table', - dynamicTable: '动态 Table', - dragTable: '拖拽 Table', - inlineEditTable: 'Table 内编辑', - complexTable: '综合 Table', - tab: 'Tab', - form: '表单', - createArticle: '创建文章', - editArticle: '编辑文章', - articleList: '文章列表', - errorPages: '错误页面', - page401: '401', - page404: '404', - errorLog: '错误日志', - excel: 'Excel', - exportExcel: '导出 Excel', - selectExcel: '导出 已选择项', - mergeHeader: '导出 多级表头', - uploadExcel: '上传 Excel', - zip: 'Zip', - pdf: 'PDF', - exportZip: 'Export Zip', - theme: '换肤', - clipboardDemo: 'Clipboard', - i18n: '国际化', - externalLink: '外链', - profile: '个人中心' - }, - navbar: { - dashboard: '首页', - github: '项目地址', - logOut: '退出登录', - profile: '个人中心', - theme: '换肤', - size: '布局大小' - }, - login: { - title: '系统登录', - logIn: '登录', - username: '账号', - password: '密码', - any: '随便填', - thirdparty: '第三方登录', - thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!' - }, - documentation: { - documentation: '文档', - github: 'Github 地址' - }, - permission: { - addRole: '新增角色', - editPermission: '编辑权限', - roles: '你的权限', - switchRoles: '切换权限', - tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 el-tab 或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。', - delete: '删除', - confirm: '确定', - cancel: '取消' - }, - guide: { - description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于', - button: '打开引导' - }, - components: { - documentation: '文档', - tinymceTips: '富文本是管理后台一个核心的功能,但同时又是一个有很多坑的地方。在选择富文本的过程中我也走了不少的弯路,市面上常见的富文本都基本用过了,最终权衡了一下选择了Tinymce。更详细的富文本比较和介绍见', - dropzoneTips: '由于我司业务有特殊需求,而且要传七牛 所以没用第三方,选择了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/Dropzone', - stickyTips: '当页面滚动到预设的位置会吸附在顶部', - backToTopTips1: '页面滚动到指定位置会在右下角出现返回顶部按钮', - backToTopTips2: '可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素', - imageUploadTips: '由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。' - }, - table: { - dynamicTips1: '固定表头, 按照表头顺序排序', - dynamicTips2: '不固定表头, 按照点击顺序排序', - dragTips1: '默认顺序', - dragTips2: '拖拽后顺序', - title: '标题', - importance: '重要性', - type: '类型', - remark: '点评', - search: '搜索', - add: '添加', - export: '导出', - reviewer: '审核人', - id: '序号', - date: '时间', - author: '作者', - readings: '阅读数', - status: '状态', - actions: '操作', - edit: '编辑', - publish: '发布', - draft: '草稿', - delete: '删除', - cancel: '取 消', - confirm: '确 定' - }, - example: { - warning: '创建和编辑页面是不能被 keep-alive 缓存的,因为keep-alive 的 include 目前不支持根据路由来缓存,所以目前都是基于 component name 来进行缓存的。如果你想类似的实现缓存效果,可以使用 localStorage 等浏览器缓存方案。或者不要使用 keep-alive 的 include,直接缓存所有页面。详情见' - }, - errorLog: { - tips: '请点击右上角bug小图标', - description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。', - documentation: '文档介绍' - }, - excel: { - export: '导出', - selectedExport: '导出已选择项', - placeholder: '请输入文件名(默认excel-list)' - }, - zip: { - export: '导出', - placeholder: '请输入文件名(默认file)' - }, - pdf: { - tips: '这里使用 window.print() 来实现下载pdf的功能' - }, - theme: { - change: '换肤', - documentation: '换肤文档', - tips: 'Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。' - }, - tagsView: { - refresh: '刷新', - close: '关闭', - closeOthers: '关闭其它', - closeAll: '关闭所有' - }, - settings: { - title: '系统布局配置', - theme: '主题色', - tagsView: '开启 Tags-View', - fixedHeader: '固定 Header', - sidebarLogo: '侧边栏 Logo' - } -} diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 9d5c6658..d9075a24 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -12,12 +12,10 @@ <screenfull id="screenfull" class="right-menu-item hover-effect" /> - <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom"> + <el-tooltip content="Global Size" effect="dark" placement="bottom"> <size-select id="size-select" class="right-menu-item hover-effect" /> </el-tooltip> - <lang-select class="right-menu-item hover-effect" /> - </template> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> @@ -27,25 +25,19 @@ </div> <el-dropdown-menu slot="dropdown"> <router-link to="/profile/index"> - <el-dropdown-item> - {{ $t('navbar.profile') }} - </el-dropdown-item> + <el-dropdown-item>Profile</el-dropdown-item> </router-link> <router-link to="/"> - <el-dropdown-item> - {{ $t('navbar.dashboard') }} - </el-dropdown-item> + <el-dropdown-item>Dashboard</el-dropdown-item> </router-link> <a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/"> - <el-dropdown-item> - {{ $t('navbar.github') }} - </el-dropdown-item> + <el-dropdown-item>Github</el-dropdown-item> </a> <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/"> <el-dropdown-item>Docs</el-dropdown-item> </a> <el-dropdown-item divided> - <span style="display:block;" @click="logout">{{ $t('navbar.logOut') }}</span> + <span style="display:block;" @click="logout">Log Out</span> </el-dropdown-item> </el-dropdown-menu> </el-dropdown> @@ -60,7 +52,6 @@ import Hamburger from '@/components/Hamburger' import ErrorLog from '@/components/ErrorLog' import Screenfull from '@/components/Screenfull' import SizeSelect from '@/components/SizeSelect' -import LangSelect from '@/components/LangSelect' import Search from '@/components/HeaderSearch' export default { @@ -70,7 +61,6 @@ export default { ErrorLog, Screenfull, SizeSelect, - LangSelect, Search }, computed: { diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue index 19e4e68b..32ef0189 100644 --- a/src/layout/components/Settings/index.vue +++ b/src/layout/components/Settings/index.vue @@ -1,25 +1,25 @@ <template> <div class="drawer-container"> <div> - <h3 class="drawer-title">{{ $t('settings.title') }}</h3> + <h3 class="drawer-title">Page style setting</h3> <div class="drawer-item"> - <span>{{ $t('settings.theme') }}</span> + <span>Theme Color</span> <theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" /> </div> <div class="drawer-item"> - <span>{{ $t('settings.tagsView') }}</span> + <span>Open Tags-View</span> <el-switch v-model="tagsView" class="drawer-switch" /> </div> <div class="drawer-item"> - <span>{{ $t('settings.fixedHeader') }}</span> + <span>Fixed Header</span> <el-switch v-model="fixedHeader" class="drawer-switch" /> </div> <div class="drawer-item"> - <span>{{ $t('settings.sidebarLogo') }}</span> + <span>Sidebar Logo</span> <el-switch v-model="sidebarLogo" class="drawer-switch" /> </div> diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue index b4422cf8..2d49dd87 100644 --- a/src/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -3,14 +3,14 @@ <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> - <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="generateTitle(onlyOneChild.meta.title)" /> + <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" /> </el-menu-item> </app-link> </template> <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> <template slot="title"> - <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="generateTitle(item.meta.title)" /> + <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" /> </template> <sidebar-item v-for="child in item.children" @@ -26,7 +26,6 @@ <script> import path from 'path' -import { generateTitle } from '@/utils/i18n' import { isExternal } from '@/utils/validate' import Item from './Item' import AppLink from './Link' @@ -90,9 +89,7 @@ export default { return this.basePath } return path.resolve(this.basePath, routePath) - }, - - generateTitle + } } } </script> diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index 19d3083f..24a92f1d 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -12,31 +12,21 @@ @click.middle.native="closeSelectedTag(tag)" @contextmenu.prevent.native="openMenu(tag,$event)" > - {{ generateTitle(tag.title) }} + {{ tag.title }} <span v-if="!tag.meta.affix" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> </router-link> </scroll-pane> <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> - <li @click="refreshSelectedTag(selectedTag)"> - {{ $t('tagsView.refresh') }} - </li> - <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)"> - {{ - $t('tagsView.close') }} - </li> - <li @click="closeOthersTags"> - {{ $t('tagsView.closeOthers') }} - </li> - <li @click="closeAllTags(selectedTag)"> - {{ $t('tagsView.closeAll') }} - </li> + <li @click="refreshSelectedTag(selectedTag)">Refresh</li> + <li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">Close</li> + <li @click="closeOthersTags">Close Others</li> + <li @click="closeAllTags(selectedTag)">Close All</li> </ul> </div> </template> <script> import ScrollPane from './ScrollPane' -import { generateTitle } from '@/utils/i18n' import path from 'path' export default { @@ -76,7 +66,6 @@ export default { this.addTags() }, methods: { - generateTitle, // generateTitle by vue-i18n isActive(route) { return route.path === this.$route.path }, diff --git a/src/main.js b/src/main.js index 41298d0c..205b3c84 100644 --- a/src/main.js +++ b/src/main.js @@ -13,7 +13,6 @@ import App from './App' import store from './store' import router from './router' -import i18n from './lang' // internationalization import './icons' // icon import './permission' // permission control import './utils/error-log' // error log @@ -30,8 +29,7 @@ import * as filters from './filters' // global filters */ Vue.use(Element, { - size: Cookies.get('size') || 'medium', // set element-ui default size - i18n: (key, value) => i18n.t(key, value) + size: Cookies.get('size') || 'medium' // set element-ui default size }) // register global utility filters @@ -45,6 +43,5 @@ new Vue({ el: '#app', router, store, - i18n, render: h => h(App) }) diff --git a/src/router/index.js b/src/router/index.js index 6a60eedc..fbe8ad25 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -71,15 +71,15 @@ export const constantRoutes = [ hidden: true }, { - path: '', + path: '/', component: Layout, - redirect: 'dashboard', + redirect: '/dashboard', children: [ { path: 'dashboard', component: () => import('@/views/dashboard/index'), name: 'Dashboard', - meta: { title: 'dashboard', icon: 'dashboard', affix: true } + meta: { title: 'Dashboard', icon: 'dashboard', affix: true } } ] }, @@ -91,7 +91,7 @@ export const constantRoutes = [ path: 'index', component: () => import('@/views/documentation/index'), name: 'Documentation', - meta: { title: 'documentation', icon: 'documentation', affix: true } + meta: { title: 'Documentation', icon: 'documentation', affix: true } } ] }, @@ -104,7 +104,7 @@ export const constantRoutes = [ path: 'index', component: () => import('@/views/guide/index'), name: 'Guide', - meta: { title: 'guide', icon: 'guide', noCache: true } + meta: { title: 'Guide', icon: 'guide', noCache: true } } ] }, @@ -118,7 +118,7 @@ export const constantRoutes = [ path: 'index', component: () => import('@/views/profile/index'), name: 'Profile', - meta: { title: 'profile', icon: 'user', noCache: true } + meta: { title: 'Profile', icon: 'user', noCache: true } } ] } @@ -136,7 +136,7 @@ export const asyncRoutes = [ alwaysShow: true, // will always show the root menu name: 'Permission', meta: { - title: 'permission', + title: 'Permission', icon: 'lock', roles: ['admin', 'editor'] // you can set roles in root nav }, @@ -146,7 +146,7 @@ export const asyncRoutes = [ component: () => import('@/views/permission/page'), name: 'PagePermission', meta: { - title: 'pagePermission', + title: 'Page Permission', roles: ['admin'] // or you can only set roles in sub nav } }, @@ -155,7 +155,7 @@ export const asyncRoutes = [ component: () => import('@/views/permission/directive'), name: 'DirectivePermission', meta: { - title: 'directivePermission' + title: 'Directive Permission' // if do not set roles, means: this page does not require permission } }, @@ -164,7 +164,7 @@ export const asyncRoutes = [ component: () => import('@/views/permission/role'), name: 'RolePermission', meta: { - title: 'rolePermission', + title: 'Role Permission', roles: ['admin'] } } @@ -179,7 +179,7 @@ export const asyncRoutes = [ path: 'index', component: () => import('@/views/icons/index'), name: 'Icons', - meta: { title: 'icons', icon: 'icon', noCache: true } + meta: { title: 'Icons', icon: 'icon', noCache: true } } ] }, @@ -196,7 +196,7 @@ export const asyncRoutes = [ redirect: '/example/list', name: 'Example', meta: { - title: 'example', + title: 'Example', icon: 'example' }, children: [ @@ -204,20 +204,20 @@ export const asyncRoutes = [ path: 'create', component: () => import('@/views/example/create'), name: 'CreateArticle', - meta: { title: 'createArticle', icon: 'edit' } + meta: { title: 'Create Article', icon: 'edit' } }, { path: 'edit/:id(\\d+)', component: () => import('@/views/example/edit'), name: 'EditArticle', - meta: { title: 'editArticle', noCache: true, activeMenu: '/example/list' }, + meta: { title: 'Edit Article', noCache: true, activeMenu: '/example/list' }, hidden: true }, { path: 'list', component: () => import('@/views/example/list'), name: 'ArticleList', - meta: { title: 'articleList', icon: 'list' } + meta: { title: 'Article List', icon: 'list' } } ] }, @@ -230,7 +230,7 @@ export const asyncRoutes = [ path: 'index', component: () => import('@/views/tab/index'), name: 'Tab', - meta: { title: 'tab', icon: 'tab' } + meta: { title: 'Tab', icon: 'tab' } } ] }, @@ -241,7 +241,7 @@ export const asyncRoutes = [ redirect: 'noRedirect', name: 'ErrorPages', meta: { - title: 'errorPages', + title: 'Error Pages', icon: '404' }, children: [ @@ -249,13 +249,13 @@ export const asyncRoutes = [ path: '401', component: () => import('@/views/error-page/401'), name: 'Page401', - meta: { title: 'page401', noCache: true } + meta: { title: '401', noCache: true } }, { path: '404', component: () => import('@/views/error-page/404'), name: 'Page404', - meta: { title: 'page404', noCache: true } + meta: { title: '404', noCache: true } } ] }, @@ -268,7 +268,7 @@ export const asyncRoutes = [ path: 'log', component: () => import('@/views/error-log/index'), name: 'ErrorLog', - meta: { title: 'errorLog', icon: 'bug' } + meta: { title: 'Error Log', icon: 'bug' } } ] }, @@ -279,7 +279,7 @@ export const asyncRoutes = [ redirect: '/excel/export-excel', name: 'Excel', meta: { - title: 'excel', + title: 'Excel', icon: 'excel' }, children: [ @@ -287,25 +287,25 @@ export const asyncRoutes = [ path: 'export-excel', component: () => import('@/views/excel/export-excel'), name: 'ExportExcel', - meta: { title: 'exportExcel' } + meta: { title: 'Export Excel' } }, { path: 'export-selected-excel', component: () => import('@/views/excel/select-excel'), name: 'SelectExcel', - meta: { title: 'selectExcel' } + meta: { title: 'Export Selected' } }, { path: 'export-merge-header', component: () => import('@/views/excel/merge-header'), name: 'MergeHeader', - meta: { title: 'mergeHeader' } + meta: { title: 'Merge Header' } }, { path: 'upload-excel', component: () => import('@/views/excel/upload-excel'), name: 'UploadExcel', - meta: { title: 'uploadExcel' } + meta: { title: 'Upload Excel' } } ] }, @@ -316,13 +316,13 @@ export const asyncRoutes = [ redirect: '/zip/download', alwaysShow: true, name: 'Zip', - meta: { title: 'zip', icon: 'zip' }, + meta: { title: 'Zip', icon: 'zip' }, children: [ { path: 'download', component: () => import('@/views/zip/index'), name: 'ExportZip', - meta: { title: 'exportZip' } + meta: { title: 'Export Zip' } } ] }, @@ -336,7 +336,7 @@ export const asyncRoutes = [ path: 'index', component: () => import('@/views/pdf/index'), name: 'PDF', - meta: { title: 'pdf', icon: 'pdf' } + meta: { title: 'PDF', icon: 'pdf' } } ] }, @@ -354,7 +354,7 @@ export const asyncRoutes = [ path: 'index', component: () => import('@/views/theme/index'), name: 'Theme', - meta: { title: 'theme', icon: 'theme' } + meta: { title: 'Theme', icon: 'theme' } } ] }, @@ -367,20 +367,7 @@ export const asyncRoutes = [ path: 'index', component: () => import('@/views/clipboard/index'), name: 'ClipboardDemo', - meta: { title: 'clipboardDemo', icon: 'clipboard' } - } - ] - }, - - { - path: '/i18n', - component: Layout, - children: [ - { - path: 'index', - component: () => import('@/views/i18n-demo/index'), - name: 'I18n', - meta: { title: 'i18n', icon: 'international' } + meta: { title: 'Clipboard', icon: 'clipboard' } } ] }, @@ -391,11 +378,12 @@ export const asyncRoutes = [ children: [ { path: 'https://github.com/PanJiaChen/vue-element-admin', - meta: { title: 'externalLink', icon: 'link' } + meta: { title: 'External Link', icon: 'link' } } ] }, + // 404 page must be placed at the end !!! { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/charts.js b/src/router/modules/charts.js index 59ebf188..29684dec 100644 --- a/src/router/modules/charts.js +++ b/src/router/modules/charts.js @@ -8,7 +8,7 @@ const chartsRouter = { redirect: 'noRedirect', name: 'Charts', meta: { - title: 'charts', + title: 'Charts', icon: 'chart' }, children: [ @@ -16,19 +16,19 @@ const chartsRouter = { path: 'keyboard', component: () => import('@/views/charts/keyboard'), name: 'KeyboardChart', - meta: { title: 'keyboardChart', noCache: true } + meta: { title: 'Keyboard Chart', noCache: true } }, { path: 'line', component: () => import('@/views/charts/line'), name: 'LineChart', - meta: { title: 'lineChart', noCache: true } + meta: { title: 'Line Chart', noCache: true } }, { path: 'mix-chart', component: () => import('@/views/charts/mix-chart'), name: 'MixChart', - meta: { title: 'mixChart', noCache: true } + meta: { title: 'Mix Chart', noCache: true } } ] } diff --git a/src/router/modules/components.js b/src/router/modules/components.js index b7407e25..0da96f97 100644 --- a/src/router/modules/components.js +++ b/src/router/modules/components.js @@ -8,7 +8,7 @@ const componentsRouter = { redirect: 'noRedirect', name: 'ComponentDemo', meta: { - title: 'components', + title: 'Components', icon: 'component' }, children: [ @@ -16,85 +16,85 @@ const componentsRouter = { path: 'tinymce', component: () => import('@/views/components-demo/tinymce'), name: 'TinymceDemo', - meta: { title: 'tinymce' } + meta: { title: 'Tinymce' } }, { path: 'markdown', component: () => import('@/views/components-demo/markdown'), name: 'MarkdownDemo', - meta: { title: 'markdown' } + meta: { title: 'Markdown' } }, { path: 'json-editor', component: () => import('@/views/components-demo/json-editor'), name: 'JsonEditorDemo', - meta: { title: 'jsonEditor' } + meta: { title: 'JSON Editor' } }, { path: 'split-pane', component: () => import('@/views/components-demo/split-pane'), name: 'SplitpaneDemo', - meta: { title: 'splitPane' } + meta: { title: 'SplitPane' } }, { path: 'avatar-upload', component: () => import('@/views/components-demo/avatar-upload'), name: 'AvatarUploadDemo', - meta: { title: 'avatarUpload' } + meta: { title: 'Upload' } }, { path: 'dropzone', component: () => import('@/views/components-demo/dropzone'), name: 'DropzoneDemo', - meta: { title: 'dropzone' } + meta: { title: 'Dropzone' } }, { path: 'sticky', component: () => import('@/views/components-demo/sticky'), name: 'StickyDemo', - meta: { title: 'sticky' } + meta: { title: 'Sticky' } }, { path: 'count-to', component: () => import('@/views/components-demo/count-to'), name: 'CountToDemo', - meta: { title: 'countTo' } + meta: { title: 'Count To' } }, { path: 'mixin', component: () => import('@/views/components-demo/mixin'), name: 'ComponentMixinDemo', - meta: { title: 'componentMixin' } + meta: { title: 'Component Mixin' } }, { path: 'back-to-top', component: () => import('@/views/components-demo/back-to-top'), name: 'BackToTopDemo', - meta: { title: 'backToTop' } + meta: { title: 'Back To Top' } }, { path: 'drag-dialog', component: () => import('@/views/components-demo/drag-dialog'), name: 'DragDialogDemo', - meta: { title: 'dragDialog' } + meta: { title: 'Drag Dialog' } }, { path: 'drag-select', component: () => import('@/views/components-demo/drag-select'), name: 'DragSelectDemo', - meta: { title: 'dragSelect' } + meta: { title: 'Drag Select' } }, { path: 'dnd-list', component: () => import('@/views/components-demo/dnd-list'), name: 'DndListDemo', - meta: { title: 'dndList' } + meta: { title: 'Dnd List' } }, { path: 'drag-kanban', component: () => import('@/views/components-demo/drag-kanban'), name: 'DragKanbanDemo', - meta: { title: 'dragKanban' } + meta: { title: 'Drag Kanban' } } ] } diff --git a/src/router/modules/nested.js b/src/router/modules/nested.js index c52664c9..48033ed1 100644 --- a/src/router/modules/nested.js +++ b/src/router/modules/nested.js @@ -8,7 +8,7 @@ const nestedRouter = { redirect: '/nested/menu1/menu1-1', name: 'Nested', meta: { - title: 'nested', + title: 'Nested Routes', icon: 'nested' }, children: [ @@ -16,33 +16,33 @@ const nestedRouter = { path: 'menu1', component: () => import('@/views/nested/menu1/index'), // Parent router-view name: 'Menu1', - meta: { title: 'menu1' }, + meta: { title: 'Menu 1' }, redirect: '/nested/menu1/menu1-1', children: [ { path: 'menu1-1', component: () => import('@/views/nested/menu1/menu1-1'), name: 'Menu1-1', - meta: { title: 'menu1-1' } + meta: { title: 'Menu 1-1' } }, { path: 'menu1-2', component: () => import('@/views/nested/menu1/menu1-2'), name: 'Menu1-2', redirect: '/nested/menu1/menu1-2/menu1-2-1', - meta: { title: 'menu1-2' }, + meta: { title: 'Menu 1-2' }, children: [ { path: 'menu1-2-1', component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'), name: 'Menu1-2-1', - meta: { title: 'menu1-2-1' } + meta: { title: 'Menu 1-2-1' } }, { path: 'menu1-2-2', component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'), name: 'Menu1-2-2', - meta: { title: 'menu1-2-2' } + meta: { title: 'Menu 1-2-2' } } ] }, @@ -50,7 +50,7 @@ const nestedRouter = { path: 'menu1-3', component: () => import('@/views/nested/menu1/menu1-3'), name: 'Menu1-3', - meta: { title: 'menu1-3' } + meta: { title: 'Menu 1-3' } } ] }, @@ -58,7 +58,7 @@ const nestedRouter = { path: 'menu2', name: 'Menu2', component: () => import('@/views/nested/menu2/index'), - meta: { title: 'menu2' } + meta: { title: 'Menu 2' } } ] } diff --git a/src/router/modules/table.js b/src/router/modules/table.js index d8e50302..ec28c527 100644 --- a/src/router/modules/table.js +++ b/src/router/modules/table.js @@ -16,25 +16,25 @@ const tableRouter = { path: 'dynamic-table', component: () => import('@/views/table/dynamic-table/index'), name: 'DynamicTable', - meta: { title: 'dynamicTable' } + meta: { title: 'Dynamic Table' } }, { path: 'drag-table', component: () => import('@/views/table/drag-table'), name: 'DragTable', - meta: { title: 'dragTable' } + meta: { title: 'Drag Table' } }, { path: 'inline-edit-table', component: () => import('@/views/table/inline-edit-table'), name: 'InlineEditTable', - meta: { title: 'inlineEditTable' } + meta: { title: 'Inline Edit' } }, { path: 'complex-table', component: () => import('@/views/table/complex-table'), name: 'ComplexTable', - meta: { title: 'complexTable' } + meta: { title: 'Complex Table' } } ] } diff --git a/src/store/getters.js b/src/store/getters.js index 313210a0..8fcf5a59 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -1,6 +1,5 @@ const getters = { sidebar: state => state.app.sidebar, - language: state => state.app.language, size: state => state.app.size, device: state => state.app.device, visitedViews: state => state.tagsView.visitedViews, diff --git a/src/store/modules/app.js b/src/store/modules/app.js index 73616469..45d89bb9 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -1,5 +1,4 @@ import Cookies from 'js-cookie' -import { getLanguage } from '@/lang/index' const state = { sidebar: { @@ -7,7 +6,6 @@ const state = { withoutAnimation: false }, device: 'desktop', - language: getLanguage(), size: Cookies.get('size') || 'medium' } @@ -29,10 +27,6 @@ const mutations = { TOGGLE_DEVICE: (state, device) => { state.device = device }, - SET_LANGUAGE: (state, language) => { - state.language = language - Cookies.set('language', language) - }, SET_SIZE: (state, size) => { state.size = size Cookies.set('size', size) @@ -49,9 +43,6 @@ const actions = { toggleDevice({ commit }, device) { commit('TOGGLE_DEVICE', device) }, - setLanguage({ commit }, language) { - commit('SET_LANGUAGE', language) - }, setSize({ commit }, size) { commit('SET_SIZE', size) } diff --git a/src/store/modules/user.js b/src/store/modules/user.js index f27615b0..d2b2e67a 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -97,7 +97,7 @@ const actions = { }) }, - // Dynamically modify permissions + // dynamically modify permissions changeRoles({ commit, dispatch }, role) { return new Promise(async resolve => { const token = role + '-token' diff --git a/src/utils/get-page-title.js b/src/utils/get-page-title.js index 4b6604cd..cab7fd91 100644 --- a/src/utils/get-page-title.js +++ b/src/utils/get-page-title.js @@ -1,13 +1,10 @@ import defaultSettings from '@/settings' -import i18n from '@/lang' const title = defaultSettings.title || 'Vue Element Admin' -export default function getPageTitle(key) { - const hasKey = i18n.te(`route.${key}`) - if (hasKey) { - const pageName = i18n.t(`route.${key}`) - return `${pageName} - ${title}` +export default function getPageTitle(pageTitle) { + if (pageTitle) { + return `${pageTitle} - ${title}` } return `${title}` } diff --git a/src/utils/i18n.js b/src/utils/i18n.js deleted file mode 100644 index 76be5a4e..00000000 --- a/src/utils/i18n.js +++ /dev/null @@ -1,12 +0,0 @@ -// translate router.meta.title, be used in breadcrumb sidebar tagsview -export function generateTitle(title) { - const hasKey = this.$te('route.' + title) - - if (hasKey) { - // $t :this method from vue-i18n, inject in @/lang/index.js - const translatedTitle = this.$t('route.' + title) - - return translatedTitle - } - return title -} diff --git a/src/utils/index.js b/src/utils/index.js index c0ee5026..ffb55260 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,5 +1,5 @@ /** - * Created by jiachenpan on 16/11/18. + * Created by PanJiaChen on 16/11/18. */ /** diff --git a/src/utils/open-window.js b/src/utils/open-window.js index 657bd190..1a655d77 100644 --- a/src/utils/open-window.js +++ b/src/utils/open-window.js @@ -1,5 +1,5 @@ /** - *Created by jiachenpan on 16/11/29. + *Created by PanJiaChen on 16/11/29. * @param {Sting} url * @param {Sting} title * @param {Number} w diff --git a/src/utils/request.js b/src/utils/request.js index d3c25c00..bc346a8c 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -16,8 +16,9 @@ service.interceptors.request.use( // do something before request is sent if (store.getters.token) { - // let each request carry token --['X-Token'] as a custom key. - // please modify it according to the actual situation. + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation config.headers['X-Token'] = getToken() } return config @@ -32,14 +33,14 @@ service.interceptors.request.use( // response interceptor service.interceptors.response.use( /** - * If you want to get information such as headers or status + * If you want to get http information such as headers or status * Please return response => response */ /** * Determine the request status by custom code * Here is just an example - * You can also judge the status by HTTP Status Code. + * You can also judge the status by HTTP Status Code */ response => { const res = response.data diff --git a/src/utils/validate.js b/src/utils/validate.js index e81672bb..6b3ac418 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,5 +1,5 @@ /** - * Created by jiachenpan on 16/11/18. + * Created by PanJiaChen on 16/11/18. */ /** diff --git a/src/views/components-demo/avatar-upload.vue b/src/views/components-demo/avatar-upload.vue index fae36ad8..41bb9bc7 100644 --- a/src/views/components-demo/avatar-upload.vue +++ b/src/views/components-demo/avatar-upload.vue @@ -2,7 +2,7 @@ <div class="components-container"> <aside>This is based on <a class="link-type" href="//github.com/dai-siki/vue-image-crop-upload"> vue-image-crop-upload</a>. - {{ $t('components.imageUploadTips') }} + Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version. </aside> <pan-thumb :image="image" /> diff --git a/src/views/components-demo/back-to-top.vue b/src/views/components-demo/back-to-top.vue index 58d9d75c..df5370be 100644 --- a/src/views/components-demo/back-to-top.vue +++ b/src/views/components-demo/back-to-top.vue @@ -1,7 +1,11 @@ <template> <div class="components-container"> - <aside>{{ $t('components.backToTopTips1') }}</aside> - <aside>{{ $t('components.backToTopTips2') }}</aside> + <aside> + When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner + </aside> + <aside> + You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally + </aside> <div class="placeholder-container"> <div>placeholder</div> <div>placeholder</div> diff --git a/src/views/components-demo/dropzone.vue b/src/views/components-demo/dropzone.vue index cdfc71b1..a8c10400 100644 --- a/src/views/components-demo/dropzone.vue +++ b/src/views/components-demo/dropzone.vue @@ -2,7 +2,7 @@ <div class="components-container"> <aside> Based on <a class="link-type" href="https://github.com/rowanwins/vue-dropzone"> dropzone </a>. - {{ $t('components.dropzoneTips') }} + Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone. </aside> <div class="editor-container"> <dropzone id="myVueDropzone" url="https://httpbin.org/post" @dropzone-removedFile="dropzoneR" @dropzone-success="dropzoneS" /> diff --git a/src/views/components-demo/markdown.vue b/src/views/components-demo/markdown.vue index 876db002..25cf3e37 100644 --- a/src/views/components-demo/markdown.vue +++ b/src/views/components-demo/markdown.vue @@ -79,7 +79,7 @@ export default { }, computed: { language() { - return this.languageTypeList[this.$store.getters.language] + return this.languageTypeList['en'] } }, methods: { diff --git a/src/views/components-demo/sticky.vue b/src/views/components-demo/sticky.vue index de86e1a1..f01d088a 100644 --- a/src/views/components-demo/sticky.vue +++ b/src/views/components-demo/sticky.vue @@ -37,7 +37,9 @@ </sticky> <div class="components-container"> - <aside>Sticky header, {{ $t('components.stickyTips') }}</aside> + <aside> + Sticky header, When the page is scrolled to the preset position will be sticky on the top. + </aside> <div>placeholder</div> <div>placeholder</div> <div>placeholder</div> diff --git a/src/views/components-demo/tinymce.vue b/src/views/components-demo/tinymce.vue index 7900a294..c70179fa 100644 --- a/src/views/components-demo/tinymce.vue +++ b/src/views/components-demo/tinymce.vue @@ -1,8 +1,8 @@ <template> <div class="components-container"> <aside> - {{ $t('components.tinymceTips') }} - <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/component/rich-editor.html"> {{ $t('components.documentation') }}</a> + Rich text is a core feature of the management backend, but at the same time it is a place with lots of pits. In the process of selecting rich texts, I also took a lot of detours. The common rich texts on the market have been basically used, and I finally chose Tinymce. See the more detailed rich text comparison and introduction. + <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/component/rich-editor.html">Documentation</a> </aside> <div> <tinymce v-model="content" :height="300" /> diff --git a/src/views/documentation/index.vue b/src/views/documentation/index.vue index 4e05d03f..2fa38ff4 100644 --- a/src/views/documentation/index.vue +++ b/src/views/documentation/index.vue @@ -1,11 +1,24 @@ <template> <div class="app-container documentation-container"> - <a class="document-btn" target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/">{{ $t('documentation.documentation') }}</a> - <a class="document-btn" target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">{{ $t('documentation.github') }}</a> - <a class="document-btn" target="_blank" href="https://panjiachen.gitee.io/vue-element-admin-site/zh/">国内文档</a> + <a + class="document-btn" + target="_blank" + href="https://panjiachen.github.io/vue-element-admin-site/" + >Documentation</a> + <a + class="document-btn" + target="_blank" + href="https://github.com/PanJiaChen/vue-element-admin/" + >Github Repository</a> + <a + class="document-btn" + target="_blank" + href="https://panjiachen.gitee.io/vue-element-admin-site/zh/" + >国内文档</a> <dropdown-menu :items="articleList" style="float:left;margin-left:50px;" title="系列文章" /> </div> </template> + <script> import DropdownMenu from '@/components/Share/DropdownMenu' diff --git a/src/views/error-log/index.vue b/src/views/error-log/index.vue index 102b2e5b..e999c85b 100644 --- a/src/views/error-log/index.vue +++ b/src/views/error-log/index.vue @@ -2,12 +2,11 @@ <div class="errPage-container"> <ErrorA /> <ErrorB /> - <!-- $t is vue-i18n global function to translate lang --> - <h3>{{ $t('errorLog.tips') }}</h3> + <h3>Please click the bug icon in the upper right corner</h3> <aside> - {{ $t('errorLog.description') }} + Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions. <a target="_blank" class="link-type" href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/error.html"> - {{ $t('errorLog.documentation') }} + Document introduction </a> </aside> <a href="#"> diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index 4f4dfe05..b689ae01 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -1,6 +1,7 @@ <template> <div class="createPost-container"> <el-form ref="postForm" :model="postForm" :rules="rules" class="form-container"> + <sticky :z-index="10" :class-name="'sub-navbar '+postForm.status"> <CommentDropdown v-model="postForm.comment_disabled" /> <PlatformDropdown v-model="postForm.platforms" /> @@ -152,9 +153,6 @@ export default { contentShortLength() { return this.postForm.content_short.length }, - lang() { - return this.$store.getters.language - }, displayTime: { // set and get is useful when the data // returned by the back end api is different from the front end @@ -196,7 +194,7 @@ export default { }) }, setTagsViewTitle() { - const title = this.lang === 'zh' ? '编辑文章' : 'Edit Article' + const title = 'Edit Article' const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` }) this.$store.dispatch('tagsView/updateVisitedView', route) }, diff --git a/src/views/example/components/Warning.vue b/src/views/example/components/Warning.vue index d24fe291..8d2a7e5a 100644 --- a/src/views/example/components/Warning.vue +++ b/src/views/example/components/Warning.vue @@ -1,6 +1,9 @@ <template> <aside> - {{ $t('example.warning') }} + Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support + caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching + effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all + pages directly. See details <a href="https://panjiachen.github.io/vue-element-admin-site/guide/essentials/tags-view.html" target="_blank" diff --git a/src/views/excel/components/FilenameOption.vue b/src/views/excel/components/FilenameOption.vue index c8e0530d..75092235 100644 --- a/src/views/excel/components/FilenameOption.vue +++ b/src/views/excel/components/FilenameOption.vue @@ -1,8 +1,7 @@ <template> <div style="display:inline-block;"> - <!-- $t is vue-i18n global function to translate lang --> <label class="radio-label" style="padding-left:0;">Filename: </label> - <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:350px;" prefix-icon="el-icon-document" /> + <el-input v-model="filename" placeholder="Please enter the file name (default excel-list)" style="width:345px;" prefix-icon="el-icon-document" /> </div> </template> diff --git a/src/views/excel/export-excel.vue b/src/views/excel/export-excel.vue index 253f1641..e9d8c6ab 100644 --- a/src/views/excel/export-excel.vue +++ b/src/views/excel/export-excel.vue @@ -1,12 +1,12 @@ <template> - <!-- $t is vue-i18n global function to translate lang --> <div class="app-container"> + <div> <FilenameOption v-model="filename" /> <AutoWidthOption v-model="autoWidth" /> <BookTypeOption v-model="bookType" /> <el-button :loading="downloadLoading" style="margin:0 0 20px 20px;" type="primary" icon="document" @click="handleDownload"> - {{ $t('excel.export') }} Excel + Export Excel </el-button> <a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;"> <el-tag type="info">Documentation</el-tag> @@ -51,6 +51,7 @@ import { parseTime } from '@/utils' import FilenameOption from './components/FilenameOption' import AutoWidthOption from './components/AutoWidthOption' import BookTypeOption from './components/BookTypeOption' + export default { name: 'ExportExcel', components: { FilenameOption, AutoWidthOption, BookTypeOption }, diff --git a/src/views/excel/select-excel.vue b/src/views/excel/select-excel.vue index 09866e13..e6ac34ba 100644 --- a/src/views/excel/select-excel.vue +++ b/src/views/excel/select-excel.vue @@ -1,9 +1,8 @@ <template> <div class="app-container"> - <!-- $t is vue-i18n global function to translate lang --> - <el-input v-model="filename" :placeholder="$t('excel.placeholder')" style="width:350px;" prefix-icon="el-icon-document" /> + <el-input v-model="filename" placeholder="Please enter the file name (default excel-list)" style="width:350px;" prefix-icon="el-icon-document" /> <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload"> - {{ $t('excel.selectedExport') }} + Export Selected Items </el-button> <a href="https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html" target="_blank" style="margin-left:15px;"> <el-tag type="info">Documentation</el-tag> diff --git a/src/views/guide/index.vue b/src/views/guide/index.vue index 636ca275..4897c8fb 100644 --- a/src/views/guide/index.vue +++ b/src/views/guide/index.vue @@ -1,11 +1,12 @@ <template> <div class="app-container"> <aside> - {{ $t('guide.description') }} + The guide page is useful for some people who entered the project for the first time. You can briefly introduce the + features of the project. Demo is based on <a href="https://github.com/kamranahmedse/driver.js" target="_blank">driver.js.</a> </aside> <el-button icon="el-icon-question" type="primary" @click.prevent.stop="guide"> - {{ $t('guide.button') }} + Show Guide </el-button> </div> </template> diff --git a/src/views/i18n-demo/index.vue b/src/views/i18n-demo/index.vue deleted file mode 100644 index 32cee075..00000000 --- a/src/views/i18n-demo/index.vue +++ /dev/null @@ -1,168 +0,0 @@ -<template> - <div> - <el-card class="box-card" style="margin-top:40px;"> - <div slot="header" class="clearfix"> - <svg-icon icon-class="international" /> - <span style="margin-left:10px;">{{ $t('i18nView.title') }}</span> - </div> - <div> - <el-radio-group v-model="lang" size="small"> - <el-radio label="zh" border> - 简体中文 - </el-radio> - <el-radio label="en" border> - English - </el-radio> - <el-radio label="es" border> - Español - </el-radio> - <el-radio label="ja" border> - 日本語 - </el-radio> - </el-radio-group> - <el-tag style="margin-top:15px;display:block;" type="info"> - {{ $t('i18nView.note') }} - </el-tag> - </div> - </el-card> - - <el-row :gutter="20" style="margin:100px 15px 50px;"> - <el-col :span="12" :xs="24"> - <div class="block"> - <el-date-picker v-model="date" :placeholder="$t('i18nView.datePlaceholder')" type="date" /> - </div> - <div class="block"> - <el-select v-model="value" :placeholder="$t('i18nView.selectPlaceholder')"> - <el-option - v-for="item in options" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </div> - <div class="block"> - <el-button class="item-btn" size="small"> - {{ $t('i18nView.default') }} - </el-button> - <el-button class="item-btn" size="small" type="primary"> - {{ $t('i18nView.primary') }} - </el-button> - <el-button class="item-btn" size="small" type="success"> - {{ $t('i18nView.success') }} - </el-button> - <el-button class="item-btn" size="small" type="info"> - {{ $t('i18nView.info') }} - </el-button> - <el-button class="item-btn" size="small" type="warning"> - {{ $t('i18nView.warning') }} - </el-button> - <el-button class="item-btn" size="small" type="danger"> - {{ $t('i18nView.danger') }} - </el-button> - </div> - </el-col> - <el-col :span="12" :xs="24"> - <el-table :data="tableData" fit highlight-current-row border style="width: 100%"> - <el-table-column :label="$t('i18nView.tableName')" prop="name" width="100" align="center" /> - <el-table-column :label="$t('i18nView.tableDate')" prop="date" width="120" align="center" /> - <el-table-column :label="$t('i18nView.tableAddress')" prop="address" /> - </el-table> - </el-col> - </el-row> - </div> -</template> - -<script> -import local from './local' -const viewName = 'i18nView' - -export default { - name: 'I18n', - data() { - return { - date: '', - tableData: [{ - date: '2016-05-03', - name: 'Tom', - address: 'No. 189, Grove St, Los Angeles' - }, - { - date: '2016-05-02', - name: 'Tom', - address: 'No. 189, Grove St, Los Angeles' - }, - { - date: '2016-05-04', - name: 'Tom', - address: 'No. 189, Grove St, Los Angeles' - }, - { - date: '2016-05-01', - name: 'Tom', - address: 'No. 189, Grove St, Los Angeles' - }], - options: [], - value: '' - } - }, - computed: { - lang: { - get() { - return this.$store.state.app.language - }, - set(lang) { - this.$i18n.locale = lang - this.$store.dispatch('app/setLanguage', lang) - } - } - }, - watch: { - lang() { - this.setOptions() - } - }, - created() { - if (!this.$i18n.getLocaleMessage('en')[viewName]) { - this.$i18n.mergeLocaleMessage('en', local.en) - this.$i18n.mergeLocaleMessage('zh', local.zh) - this.$i18n.mergeLocaleMessage('es', local.es) - this.$i18n.mergeLocaleMessage('ja', local.ja) - } - this.setOptions() // set default select options - }, - methods: { - setOptions() { - this.options = [ - { - value: '1', - label: this.$t('i18nView.one') - }, - { - value: '2', - label: this.$t('i18nView.two') - }, - { - value: '3', - label: this.$t('i18nView.three') - } - ] - } - } -} -</script> - -<style scoped> -.box-card { - width: 600px; - max-width: 100%; - margin: 20px auto; -} -.item-btn{ - margin-bottom: 15px; - margin-left: 0px; -} -.block { - padding: 25px; -} -</style> diff --git a/src/views/i18n-demo/local.js b/src/views/i18n-demo/local.js deleted file mode 100644 index ae38dd28..00000000 --- a/src/views/i18n-demo/local.js +++ /dev/null @@ -1,83 +0,0 @@ - -export default { - zh: { - i18nView: { - title: '切换语言', - note: '本项目国际化基于 vue-i18n', - datePlaceholder: '请选择日期', - selectPlaceholder: '请选择', - tableDate: '日期', - tableName: '姓名', - tableAddress: '地址', - default: '默认按钮', - primary: '主要按钮', - success: '成功按钮', - info: '信息按钮', - warning: '警告按钮', - danger: '危险按钮', - one: '一', - two: '二', - three: '三' - } - }, - en: { - i18nView: { - title: 'Switch Language', - note: 'The internationalization of this project is based on vue-i18n', - datePlaceholder: 'Pick a day', - selectPlaceholder: 'Select', - tableDate: 'tableDate', - tableName: 'tableName', - tableAddress: 'tableAddress', - default: 'default:', - primary: 'primary', - success: 'success', - info: 'info', - warning: 'warning', - danger: 'danger', - one: 'One', - two: 'Two', - three: 'Three' - } - }, - es: { - i18nView: { - title: 'Switch Language', - note: 'The internationalization of this project is based on vue-i18n', - datePlaceholder: 'Pick a day', - selectPlaceholder: 'Select', - tableDate: 'tableDate', - tableName: 'tableName', - tableAddress: 'tableAddress', - default: 'default:', - primary: 'primary', - success: 'success', - info: 'info', - warning: 'warning', - danger: 'danger', - one: 'One', - two: 'Two', - three: 'Three' - } - }, - ja: { - i18nView: { - title: '言語切替', - note: 'vue-i18nを使っています', - datePlaceholder: '日時選択', - selectPlaceholder: '選択してください', - tableDate: '日時', - tableName: '姓名', - tableAddress: '住所', - default: 'default', - primary: 'primary', - success: 'success', - info: 'info', - warning: 'warning', - danger: 'danger', - one: '1', - two: '2', - three: '3' - } - } -} diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 27f11ef5..fd09b6d7 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -3,10 +3,7 @@ <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left"> <div class="title-container"> - <h3 class="title"> - {{ $t('login.title') }} - </h3> - <lang-select class="set-language" /> + <h3 class="title">Login Form</h3> </div> <el-form-item prop="username"> @@ -16,7 +13,7 @@ <el-input ref="username" v-model="loginForm.username" - :placeholder="$t('login.username')" + placeholder="Username" name="username" type="text" tabindex="1" @@ -34,7 +31,7 @@ ref="password" v-model="loginForm.password" :type="passwordType" - :placeholder="$t('login.password')" + placeholder="Password" name="password" tabindex="2" auto-complete="on" @@ -48,30 +45,26 @@ </el-form-item> </el-tooltip> - <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin"> - {{ $t('login.logIn') }} - </el-button> + <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">Login</el-button> <div style="position:relative"> <div class="tips"> - <span>{{ $t('login.username') }} : admin</span> - <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> + <span>Username : admin</span> + <span>Password : any</span> </div> <div class="tips"> - <span style="margin-right:18px;"> - {{ $t('login.username') }} : editor - </span> - <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> + <span style="margin-right:18px;">Username : editor</span> + <span>Password : any</span> </div> <el-button class="thirdparty-button" type="primary" @click="showDialog=true"> - {{ $t('login.thirdparty') }} + Or connect with </el-button> </div> </el-form> - <el-dialog :title="$t('login.thirdparty')" :visible.sync="showDialog"> - {{ $t('login.thirdpartyTips') }} + <el-dialog title="Or connect with" :visible.sync="showDialog"> + Can not be simulated on local, so please combine you own business simulation! ! ! <br> <br> <br> @@ -82,12 +75,11 @@ <script> import { validUsername } from '@/utils/validate' -import LangSelect from '@/components/LangSelect' import SocialSign from './components/SocialSignin' export default { name: 'Login', - components: { LangSelect, SocialSign }, + components: { SocialSign }, data() { const validateUsername = (rule, value, callback) => { if (!validUsername(value)) { @@ -300,15 +292,6 @@ $light_gray:#eee; text-align: center; font-weight: bold; } - - .set-language { - color: #fff; - position: absolute; - top: 3px; - font-size: 18px; - right: 0px; - cursor: pointer; - } } .show-pwd { diff --git a/src/views/pdf/index.vue b/src/views/pdf/index.vue index b875295f..86278b38 100644 --- a/src/views/pdf/index.vue +++ b/src/views/pdf/index.vue @@ -1,6 +1,8 @@ <template> <div class="app-container"> - <aside style="margin-top:15px;">{{ $t('pdf.tips') }}</aside> + <aside style="margin-top:15px;"> + Here we use window.print() to implement the feature of downloading PDF. + </aside> <router-link target="_blank" to="/pdf/download"> <el-button type="primary"> Click to download PDF diff --git a/src/views/permission/components/SwitchRoles.vue b/src/views/permission/components/SwitchRoles.vue index de1176ad..9fabbe19 100644 --- a/src/views/permission/components/SwitchRoles.vue +++ b/src/views/permission/components/SwitchRoles.vue @@ -1,9 +1,9 @@ <template> <div> <div style="margin-bottom:15px;"> - {{ $t('permission.roles') }}: {{ roles }} + Your roles: {{ roles }} </div> - {{ $t('permission.switchRoles') }}: + Switch roles: <el-radio-group v-model="switchRoles"> <el-radio-button label="editor" /> <el-radio-button label="admin" /> diff --git a/src/views/permission/directive.vue b/src/views/permission/directive.vue index b3ef8c37..85478895 100644 --- a/src/views/permission/directive.vue +++ b/src/views/permission/directive.vue @@ -36,7 +36,7 @@ <div :key="'checkPermission'+key" style="margin-top:60px;"> <aside> - {{ $t('permission.tips') }} + In some cases, using v-permission will have no effect. For example: Element-UI's Tab component or el-table-column and other scenes that dynamically render dom. You can only do this with v-if. <br> e.g. </aside> diff --git a/src/views/permission/role.vue b/src/views/permission/role.vue index 3789e516..38e085e5 100644 --- a/src/views/permission/role.vue +++ b/src/views/permission/role.vue @@ -1,8 +1,6 @@ <template> <div class="app-container"> - <el-button type="primary" @click="handleAddRole"> - {{ $t('permission.addRole') }} - </el-button> + <el-button type="primary" @click="handleAddRole">New Role</el-button> <el-table :data="rolesList" style="width: 100%;margin-top:30px;" border> <el-table-column align="center" label="Role Key" width="220"> @@ -22,12 +20,8 @@ </el-table-column> <el-table-column align="center" label="Operations"> <template slot-scope="scope"> - <el-button type="primary" size="small" @click="handleEdit(scope)"> - {{ $t('permission.editPermission') }} - </el-button> - <el-button type="danger" size="small" @click="handleDelete(scope)"> - {{ $t('permission.delete') }} - </el-button> + <el-button type="primary" size="small" @click="handleEdit(scope)">Edit</el-button> + <el-button type="danger" size="small" @click="handleDelete(scope)">Delete</el-button> </template> </el-table-column> </el-table> @@ -46,16 +40,20 @@ /> </el-form-item> <el-form-item label="Menus"> - <el-tree ref="tree" :check-strictly="checkStrictly" :data="routesData" :props="defaultProps" show-checkbox node-key="path" class="permission-tree" /> + <el-tree + ref="tree" + :check-strictly="checkStrictly" + :data="routesData" + :props="defaultProps" + show-checkbox + node-key="path" + class="permission-tree" + /> </el-form-item> </el-form> <div style="text-align:right;"> - <el-button type="danger" @click="dialogVisible=false"> - {{ $t('permission.cancel') }} - </el-button> - <el-button type="primary" @click="confirmRole"> - {{ $t('permission.confirm') }} - </el-button> + <el-button type="danger" @click="dialogVisible=false">Cancel</el-button> + <el-button type="primary" @click="confirmRole">Confirm</el-button> </div> </el-dialog> </div> @@ -65,7 +63,6 @@ import path from 'path' import { deepClone } from '@/utils' import { getRoutes, getRoles, addRole, deleteRole, updateRole } from '@/api/role' -import i18n from '@/lang' const defaultRole = { key: '', @@ -103,23 +100,13 @@ export default { async getRoutes() { const res = await getRoutes() this.serviceRoutes = res.data - const routes = this.generateRoutes(res.data) - this.routes = this.i18n(routes) + this.routes = this.generateRoutes(res.data) }, async getRoles() { const res = await getRoles() this.rolesList = res.data }, - i18n(routes) { - const app = routes.map(route => { - route.title = i18n.t(`route.${route.title}`) - if (route.children) { - route.children = this.i18n(route.children) - } - return route - }) - return app - }, + // Reshape the routes structure so that it looks the same as the sidebar generateRoutes(routes, basePath = '/') { const res = [] diff --git a/src/views/profile/index.vue b/src/views/profile/index.vue index e54bc718..8069a95c 100644 --- a/src/views/profile/index.vue +++ b/src/views/profile/index.vue @@ -9,7 +9,6 @@ <el-col :span="18"> <el-card> - <el-tabs v-model="activeTab"> <el-tab-pane label="Activity" name="activity"> <activity /> @@ -21,7 +20,6 @@ <account :user="user" /> </el-tab-pane> </el-tabs> - </el-card> </el-col> diff --git a/src/views/table/complex-table.vue b/src/views/table/complex-table.vue index 43b00e80..fe266465 100644 --- a/src/views/table/complex-table.vue +++ b/src/views/table/complex-table.vue @@ -1,27 +1,27 @@ <template> <div class="app-container"> <div class="filter-container"> - <el-input v-model="listQuery.title" :placeholder="$t('table.title')" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" /> - <el-select v-model="listQuery.importance" :placeholder="$t('table.importance')" clearable style="width: 90px" class="filter-item"> + <el-input v-model="listQuery.title" placeholder="Title" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" /> + <el-select v-model="listQuery.importance" placeholder="Imp" clearable style="width: 90px" class="filter-item"> <el-option v-for="item in importanceOptions" :key="item" :label="item" :value="item" /> </el-select> - <el-select v-model="listQuery.type" :placeholder="$t('table.type')" clearable class="filter-item" style="width: 130px"> + <el-select v-model="listQuery.type" placeholder="Type" clearable class="filter-item" style="width: 130px"> <el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name+'('+item.key+')'" :value="item.key" /> </el-select> <el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> </el-select> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> - {{ $t('table.search') }} + Search </el-button> <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate"> - {{ $t('table.add') }} + Add </el-button> <el-button v-waves :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload"> - {{ $t('table.export') }} + Export </el-button> <el-checkbox v-model="showReviewer" class="filter-item" style="margin-left:15px;" @change="tableKey=tableKey+1"> - {{ $t('table.reviewer') }} + reviewer </el-checkbox> </div> @@ -35,63 +35,63 @@ style="width: 100%;" @sort-change="sortChange" > - <el-table-column :label="$t('table.id')" prop="id" sortable="custom" align="center" width="80"> + <el-table-column label="ID" prop="id" sortable="custom" align="center" width="80"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> </template> </el-table-column> - <el-table-column :label="$t('table.date')" width="150px" align="center"> + <el-table-column label="Date" width="150px" align="center"> <template slot-scope="scope"> <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span> </template> </el-table-column> - <el-table-column :label="$t('table.title')" min-width="150px"> + <el-table-column label="Title" min-width="150px"> <template slot-scope="{row}"> <span class="link-type" @click="handleUpdate(row)">{{ row.title }}</span> <el-tag>{{ row.type | typeFilter }}</el-tag> </template> </el-table-column> - <el-table-column :label="$t('table.author')" width="110px" align="center"> + <el-table-column label="Author" width="110px" align="center"> <template slot-scope="scope"> <span>{{ scope.row.author }}</span> </template> </el-table-column> - <el-table-column v-if="showReviewer" :label="$t('table.reviewer')" width="110px" align="center"> + <el-table-column v-if="showReviewer" label="Reviewer" width="110px" align="center"> <template slot-scope="scope"> <span style="color:red;">{{ scope.row.reviewer }}</span> </template> </el-table-column> - <el-table-column :label="$t('table.importance')" width="80px"> + <el-table-column label="Imp" width="80px"> <template slot-scope="scope"> <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon" /> </template> </el-table-column> - <el-table-column :label="$t('table.readings')" align="center" width="95"> + <el-table-column label="Readings" align="center" width="95"> <template slot-scope="{row}"> <span v-if="row.pageviews" class="link-type" @click="handleFetchPv(row.pageviews)">{{ row.pageviews }}</span> <span v-else>0</span> </template> </el-table-column> - <el-table-column :label="$t('table.status')" class-name="status-col" width="100"> + <el-table-column label="Status" class-name="status-col" width="100"> <template slot-scope="{row}"> <el-tag :type="row.status | statusFilter"> {{ row.status }} </el-tag> </template> </el-table-column> - <el-table-column :label="$t('table.actions')" align="center" width="230" class-name="small-padding fixed-width"> + <el-table-column label="Actions" align="center" width="230" class-name="small-padding fixed-width"> <template slot-scope="{row}"> <el-button type="primary" size="mini" @click="handleUpdate(row)"> - {{ $t('table.edit') }} + Edit </el-button> <el-button v-if="row.status!='published'" size="mini" type="success" @click="handleModifyStatus(row,'published')"> - {{ $t('table.publish') }} + Publish </el-button> <el-button v-if="row.status!='draft'" size="mini" @click="handleModifyStatus(row,'draft')"> - {{ $t('table.draft') }} + Draft </el-button> <el-button v-if="row.status!='deleted'" size="mini" type="danger" @click="handleModifyStatus(row,'deleted')"> - {{ $t('table.delete') }} + Delete </el-button> </template> </el-table-column> @@ -101,35 +101,35 @@ <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible"> <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;"> - <el-form-item :label="$t('table.type')" prop="type"> + <el-form-item label="Type" prop="type"> <el-select v-model="temp.type" class="filter-item" placeholder="Please select"> <el-option v-for="item in calendarTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" /> </el-select> </el-form-item> - <el-form-item :label="$t('table.date')" prop="timestamp"> + <el-form-item label="Date" prop="timestamp"> <el-date-picker v-model="temp.timestamp" type="datetime" placeholder="Please pick a date" /> </el-form-item> - <el-form-item :label="$t('table.title')" prop="title"> + <el-form-item label="Title" prop="title"> <el-input v-model="temp.title" /> </el-form-item> - <el-form-item :label="$t('table.status')"> + <el-form-item label="Status"> <el-select v-model="temp.status" class="filter-item" placeholder="Please select"> <el-option v-for="item in statusOptions" :key="item" :label="item" :value="item" /> </el-select> </el-form-item> - <el-form-item :label="$t('table.importance')"> + <el-form-item label="Imp"> <el-rate v-model="temp.importance" :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :max="3" style="margin-top:8px;" /> </el-form-item> - <el-form-item :label="$t('table.remark')"> + <el-form-item label="Remark"> <el-input v-model="temp.remark" :autosize="{ minRows: 2, maxRows: 4}" type="textarea" placeholder="Please input" /> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogFormVisible = false"> - {{ $t('table.cancel') }} + Cancel </el-button> <el-button type="primary" @click="dialogStatus==='create'?createData():updateData()"> - {{ $t('table.confirm') }} + Confirm </el-button> </div> </el-dialog> @@ -140,7 +140,7 @@ <el-table-column prop="pv" label="Pv" /> </el-table> <span slot="footer" class="dialog-footer"> - <el-button type="primary" @click="dialogPvVisible = false">{{ $t('table.confirm') }}</el-button> + <el-button type="primary" @click="dialogPvVisible = false">Confirm</el-button> </span> </el-dialog> </div> @@ -248,7 +248,7 @@ export default { }, handleModifyStatus(row, status) { this.$message({ - message: '操作成功', + message: '操作Success', type: 'success' }) row.status = status @@ -295,8 +295,8 @@ export default { this.list.unshift(this.temp) this.dialogFormVisible = false this.$notify({ - title: '成功', - message: '创建成功', + title: 'Success', + message: 'Created Successfully', type: 'success', duration: 2000 }) @@ -328,8 +328,8 @@ export default { } this.dialogFormVisible = false this.$notify({ - title: '成功', - message: '更新成功', + title: 'Success', + message: 'Update Successfully', type: 'success', duration: 2000 }) @@ -339,8 +339,8 @@ export default { }, handleDelete(row) { this.$notify({ - title: '成功', - message: '删除成功', + title: 'Success', + message: 'Delete Successfully', type: 'success', duration: 2000 }) diff --git a/src/views/table/drag-table.vue b/src/views/table/drag-table.vue index 56b0ae6d..954d59eb 100644 --- a/src/views/table/drag-table.vue +++ b/src/views/table/drag-table.vue @@ -52,12 +52,11 @@ </template> </el-table-column> </el-table> - <!-- $t is vue-i18n global function to translate lang (lang in @/lang) --> <div class="show-d"> - <el-tag style="margin-right:12px;">{{ $t('table.dragTips1') }} :</el-tag> {{ oldList }} + <el-tag>The default order :</el-tag> {{ oldList }} </div> <div class="show-d"> - <el-tag>{{ $t('table.dragTips2') }} :</el-tag> {{ newList }} + <el-tag>The after dragging order :</el-tag> {{ newList }} </div> </div> </template> diff --git a/src/views/table/dynamic-table/index.vue b/src/views/table/dynamic-table/index.vue index b1a6a6d5..5a4dd363 100644 --- a/src/views/table/dynamic-table/index.vue +++ b/src/views/table/dynamic-table/index.vue @@ -1,12 +1,12 @@ <template> <div class="app-container"> <div style="margin:0 0 5px 20px"> - {{ $t('table.dynamicTips1') }} + Fixed header, sorted by header order, </div> <fixed-thead /> <div style="margin:30px 0 5px 20px"> - {{ $t('table.dynamicTips2') }} + Not fixed header, sorted by click order </div> <unfixed-thead /> </div> diff --git a/src/views/table/inline-edit-table.vue b/src/views/table/inline-edit-table.vue index f739a144..63828145 100644 --- a/src/views/table/inline-edit-table.vue +++ b/src/views/table/inline-edit-table.vue @@ -37,7 +37,13 @@ <template slot-scope="{row}"> <template v-if="row.edit"> <el-input v-model="row.title" class="edit-input" size="small" /> - <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(row)"> + <el-button + class="cancel-btn" + size="small" + icon="el-icon-refresh" + type="warning" + @click="cancelEdit(row)" + > cancel </el-button> </template> @@ -47,10 +53,22 @@ <el-table-column align="center" label="Actions" width="120"> <template slot-scope="{row}"> - <el-button v-if="row.edit" type="success" size="small" icon="el-icon-circle-check-outline" @click="confirmEdit(row)"> + <el-button + v-if="row.edit" + type="success" + size="small" + icon="el-icon-circle-check-outline" + @click="confirmEdit(row)" + > Ok </el-button> - <el-button v-else type="primary" size="small" icon="el-icon-edit" @click="row.edit=!row.edit"> + <el-button + v-else + type="primary" + size="small" + icon="el-icon-edit" + @click="row.edit=!row.edit" + > Edit </el-button> </template> diff --git a/src/views/theme/index.vue b/src/views/theme/index.vue index bfa5953b..0af7711a 100644 --- a/src/views/theme/index.vue +++ b/src/views/theme/index.vue @@ -3,13 +3,15 @@ <el-card class="box-card"> <div slot="header"> <a class="link-type link-title" target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/theme.html"> - {{ $t('theme.documentation') }} + Theme documentation </a> </div> <div class="box-item"> - <span class="field-label">{{ $t('theme.change') }} : </span> + <span class="field-label">Change Theme : </span> <el-switch v-model="theme" /> - <aside style="margin-top:15px;">{{ $t('theme.tips') }}</aside> + <aside style="margin-top:15px;"> + Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details. + </aside> </div> </el-card> diff --git a/src/views/zip/index.vue b/src/views/zip/index.vue index 564d0407..4406e057 100644 --- a/src/views/zip/index.vue +++ b/src/views/zip/index.vue @@ -1,9 +1,8 @@ <template> <div class="app-container"> - <!-- $t is vue-i18n global function to translate lang --> - <el-input v-model="filename" :placeholder="$t('zip.placeholder')" style="width:300px;" prefix-icon="el-icon-document" /> + <el-input v-model="filename" placeholder="Please enter the file name (default file)" style="width:300px;" prefix-icon="el-icon-document" /> <el-button :loading="downloadLoading" style="margin-bottom:20px;" type="primary" icon="document" @click="handleDownload"> - {{ $t('zip.export') }} Zip + Export Zip </el-button> <el-table v-loading="listLoading" :data="list" element-loading-text="拼命加载中" border fit highlight-current-row> <el-table-column align="center" label="ID" width="95"> diff --git a/vue.config.js b/vue.config.js index aeaeb0e4..dcb0c248 100644 --- a/vue.config.js +++ b/vue.config.js @@ -99,7 +99,7 @@ module.exports = { .end() config - // https://webpack.js.org/configuration/devtool/#development + // https://webpack.js.org/configuration/devtool/#development .when(process.env.NODE_ENV === 'development', config => config.devtool('cheap-source-map') ) From 4dcd4fbbb1e8221e878168a19bb9b8ee791bb132 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 5 May 2019 17:04:44 +0800 Subject: [PATCH 157/202] [release] 4.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f456e13c..c9cde7ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-admin", - "version": "4.0.1", + "version": "4.1.0", "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", From 7e8a6a47599c82940b3f14015bbd106843d27b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 7 May 2019 14:08:28 +0800 Subject: [PATCH 158/202] perf[Profile]: adapt the profile page to the mobile (#2020) --- src/views/profile/components/UserCard.vue | 2 +- src/views/profile/index.vue | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/profile/components/UserCard.vue b/src/views/profile/components/UserCard.vue index a8d27513..c2ce1aa8 100644 --- a/src/views/profile/components/UserCard.vue +++ b/src/views/profile/components/UserCard.vue @@ -1,5 +1,5 @@ <template> - <el-card> + <el-card style="margin-bottom:20px;"> <div slot="header" class="clearfix"> <span>About me</span> </div> diff --git a/src/views/profile/index.vue b/src/views/profile/index.vue index 8069a95c..87e4f94f 100644 --- a/src/views/profile/index.vue +++ b/src/views/profile/index.vue @@ -3,11 +3,11 @@ <div v-if="user"> <el-row :gutter="20"> - <el-col :span="6"> + <el-col :span="6" :xs="24"> <user-card :user="user" /> </el-col> - <el-col :span="18"> + <el-col :span="18" :xs="24"> <el-card> <el-tabs v-model="activeTab"> <el-tab-pane label="Activity" name="activity"> From 2364fecbdd2972c56e03f8eb6ebb8f144a60839d Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 8 May 2019 17:50:26 +0800 Subject: [PATCH 159/202] Revert "perf: optimize page scrolling when setting fixedHeader" This reverts commit e8e6c7e79c2488779090f00efc5f1bbfcb04bd5b. --- src/layout/components/AppMain.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index e72e4555..62e6ace5 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -33,8 +33,6 @@ export default { .fixed-header+.app-main { padding-top: 50px; - height: 100vh; - overflow: auto; } .hasTagsView { From 013f4fd91b7fe6c92f05dbece197bd244180ba8f Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Wed, 8 May 2019 18:10:41 +0800 Subject: [PATCH 160/202] perf[Style]: refine fixed-header style when open el-dialog --- src/layout/components/AppMain.vue | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 62e6ace5..9e12c662 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -47,3 +47,11 @@ export default { } </style> +<style lang="scss"> +// fix css style bug in open el-dialog +.el-popup-parent--hidden { + .fixed-header { + padding-right: 15px; + } +} +</style> From 0bf339b6db44fb6f8484865f15748cbd95b0c958 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 9 May 2019 12:47:01 +0800 Subject: [PATCH 161/202] doc: add new article --- README.zh-CN.md | 1 + src/components/Share/DropdownMenu.vue | 2 +- src/views/components-demo/mixin.vue | 1 + src/views/documentation/index.vue | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 5bb313ce..fd6d770b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -68,6 +68,7 @@ - [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac) - [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35) - [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板)](https://juejin.im/post/595b4d776fb9a06bbe7dba56) +- [手摸手,带你用vue撸后台 系列五(v4.0新版本)](https://juejin.im/post/5c92ff94f265da6128275a85) - [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836) - [手摸手,带你优雅的使用 icon](https://juejin.im/post/59bb864b5188257e7a427c09) - [手摸手,带你用合理的姿势使用 webpack4(上)](https://juejin.im/post/5b56909a518825195f499806) diff --git a/src/components/Share/DropdownMenu.vue b/src/components/Share/DropdownMenu.vue index ac29bde7..8ad8e56e 100644 --- a/src/components/Share/DropdownMenu.vue +++ b/src/components/Share/DropdownMenu.vue @@ -38,7 +38,7 @@ export default { </script> <style lang="scss" > -$n: 8; //和items.length 相同 +$n: 9; //和items.length 相同 $t: .1s; .share-dropdown-menu { width: 250px; diff --git a/src/views/components-demo/mixin.vue b/src/views/components-demo/mixin.vue index 19b7a543..c64a073a 100644 --- a/src/views/components-demo/mixin.vue +++ b/src/views/components-demo/mixin.vue @@ -149,6 +149,7 @@ export default { { title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' }, { title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' }, { title: 'vue-admin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' }, + { title: 'v4.0 篇', href: 'https://juejin.im/post/5c92ff94f265da6128275a85' }, { title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' } ] } diff --git a/src/views/documentation/index.vue b/src/views/documentation/index.vue index 2fa38ff4..0f4c4d92 100644 --- a/src/views/documentation/index.vue +++ b/src/views/documentation/index.vue @@ -32,6 +32,7 @@ export default { { title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' }, { title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' }, { title: 'vue-admin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' }, + { title: 'v4.0 篇', href: 'https://juejin.im/post/5c92ff94f265da6128275a85' }, { title: '自行封装 component', href: 'https://segmentfault.com/a/1190000009090836' }, { title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' }, { title: 'webpack4(上)', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' }, From 4ef0782189004e98cf427fd5eafc908d0a14a7d6 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 10 May 2019 14:47:57 +0800 Subject: [PATCH 162/202] chore: use mockjs in production environment --- src/main.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main.js b/src/main.js index 205b3c84..ef07f389 100644 --- a/src/main.js +++ b/src/main.js @@ -21,12 +21,16 @@ import * as filters from './filters' // global filters /** * If you don't want to use mock-server - * you want to use mockjs for request interception - * you can execute: + * you want to use MockJs for mock api + * you can execute: mockXHR() * - * import { mockXHR } from '../mock' - * mockXHR() + * Currently MockJs will be used in the production environment, + * please remove it before going online! ! ! */ +import { mockXHR } from '../mock' +if (process.env.NODE_ENV === 'production') { + mockXHR() +} Vue.use(Element, { size: Cookies.get('size') || 'medium' // set element-ui default size From 0b8baeb14dba54626f8ce762af980c4579a4644e Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 10 May 2019 18:29:50 +0800 Subject: [PATCH 163/202] fix[sidebar.css]: remove redundant css --- src/styles/sidebar.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index e55f8656..3dad4c39 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -95,10 +95,6 @@ margin-left: 54px; } - .svg-icon { - margin-right: 0px; - } - .submenu-title-noDropdown { padding: 0 !important; position: relative; From 7b0d527bf90a3391c17586215f3012c9855d0176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 10 May 2019 18:39:05 +0800 Subject: [PATCH 164/202] perf[style]: refine dashboard style in mobile (#2060) --- .../dashboard/admin/components/BarChart.vue | 4 +- .../dashboard/admin/components/LineChart.vue | 5 ++- .../dashboard/admin/components/PanelGroup.vue | 39 ++++++++++++++++++- .../dashboard/admin/components/PieChart.vue | 5 ++- .../admin/components/RaddarChart.vue | 4 +- src/views/dashboard/admin/index.vue | 6 +++ 6 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/views/dashboard/admin/components/BarChart.vue b/src/views/dashboard/admin/components/BarChart.vue index fa265ef6..47e7a110 100644 --- a/src/views/dashboard/admin/components/BarChart.vue +++ b/src/views/dashboard/admin/components/BarChart.vue @@ -30,7 +30,9 @@ export default { } }, mounted() { - this.initChart() + this.$nextTick(() => { + this.initChart() + }) this.__resizeHandler = debounce(() => { if (this.chart) { this.chart.resize() diff --git a/src/views/dashboard/admin/components/LineChart.vue b/src/views/dashboard/admin/components/LineChart.vue index 2e05102d..d567f08d 100644 --- a/src/views/dashboard/admin/components/LineChart.vue +++ b/src/views/dashboard/admin/components/LineChart.vue @@ -45,7 +45,10 @@ export default { } }, mounted() { - this.initChart() + this.$nextTick(() => { + this.initChart() + }) + if (this.autoResize) { this.__resizeHandler = debounce(() => { if (this.chart) { diff --git a/src/views/dashboard/admin/components/PanelGroup.vue b/src/views/dashboard/admin/components/PanelGroup.vue index 34a6709b..589236ed 100644 --- a/src/views/dashboard/admin/components/PanelGroup.vue +++ b/src/views/dashboard/admin/components/PanelGroup.vue @@ -73,9 +73,11 @@ export default { <style lang="scss" scoped> .panel-group { margin-top: 18px; - .card-panel-col{ + + .card-panel-col { margin-bottom: 32px; } + .card-panel { height: 108px; cursor: pointer; @@ -86,35 +88,45 @@ export default { background: #fff; box-shadow: 4px 4px 40px rgba(0, 0, 0, .05); border-color: rgba(0, 0, 0, .05); + &:hover { .card-panel-icon-wrapper { color: #fff; } + .icon-people { - background: #40c9c6; + background: #40c9c6; } + .icon-message { background: #36a3f7; } + .icon-money { background: #f4516c; } + .icon-shopping { background: #34bfa3 } } + .icon-people { color: #40c9c6; } + .icon-message { color: #36a3f7; } + .icon-money { color: #f4516c; } + .icon-shopping { color: #34bfa3 } + .card-panel-icon-wrapper { float: left; margin: 14px 0 0 14px; @@ -122,25 +134,48 @@ export default { transition: all 0.38s ease-out; border-radius: 6px; } + .card-panel-icon { float: left; font-size: 48px; } + .card-panel-description { float: right; font-weight: bold; margin: 26px; margin-left: 0px; + .card-panel-text { line-height: 18px; color: rgba(0, 0, 0, 0.45); font-size: 16px; margin-bottom: 12px; } + .card-panel-num { font-size: 20px; } } } } + +@media (max-width:550px) { + .card-panel-description { + display: none; + } + + .card-panel-icon-wrapper { + float: none !important; + width: 100%; + height: 100%; + margin: 0 !important; + + .svg-icon { + display: block; + margin: 14px auto !important; + float: none !important; + } + } +} </style> diff --git a/src/views/dashboard/admin/components/PieChart.vue b/src/views/dashboard/admin/components/PieChart.vue index ff1bc52c..d5d59ff3 100644 --- a/src/views/dashboard/admin/components/PieChart.vue +++ b/src/views/dashboard/admin/components/PieChart.vue @@ -28,7 +28,9 @@ export default { } }, mounted() { - this.initChart() + this.$nextTick(() => { + this.initChart() + }) this.__resizeHandler = debounce(() => { if (this.chart) { this.chart.resize() @@ -58,7 +60,6 @@ export default { bottom: '10', data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts'] }, - calculable: true, series: [ { name: 'WEEKLY WRITE ARTICLES', diff --git a/src/views/dashboard/admin/components/RaddarChart.vue b/src/views/dashboard/admin/components/RaddarChart.vue index de70e523..cd2257b0 100644 --- a/src/views/dashboard/admin/components/RaddarChart.vue +++ b/src/views/dashboard/admin/components/RaddarChart.vue @@ -30,7 +30,9 @@ export default { } }, mounted() { - this.initChart() + this.$nextTick(() => { + this.initChart() + }) this.__resizeHandler = debounce(() => { if (this.chart) { this.chart.resize() diff --git a/src/views/dashboard/admin/index.vue b/src/views/dashboard/admin/index.vue index a766f04a..8cb557be 100644 --- a/src/views/dashboard/admin/index.vue +++ b/src/views/dashboard/admin/index.vue @@ -115,4 +115,10 @@ export default { margin-bottom: 32px; } } + +@media (max-width:1024px) { + .chart-wrapper { + padding: 8px; + } +} </style> From 3a4543478f621c87356bf1faa6ac26eaa89718bb Mon Sep 17 00:00:00 2001 From: toruksmakto <42709228+toruksmakto@users.noreply.github.com> Date: Sun, 12 May 2019 12:00:00 +0800 Subject: [PATCH 165/202] feat[ErrorLog]: add a clear button in ErrorLog component (#2065) --- src/components/ErrorLog/index.vue | 12 +++++++++++- src/store/modules/errorLog.js | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/components/ErrorLog/index.vue b/src/components/ErrorLog/index.vue index 7ffa573b..6119c037 100644 --- a/src/components/ErrorLog/index.vue +++ b/src/components/ErrorLog/index.vue @@ -6,7 +6,11 @@ </el-button> </el-badge> - <el-dialog :visible.sync="dialogTableVisible" title="Error Log" width="80%" append-to-body> + <el-dialog :visible.sync="dialogTableVisible" width="80%" append-to-body> + <div slot="title"> + <span style="padding-right: 10px;">Error Log</span> + <el-button size="mini" type="primary" icon="el-icon-delete" @click="clearAll">Clear All</el-button> + </div> <el-table :data="errorLogs" border> <el-table-column label="Message"> <template slot-scope="{row}"> @@ -54,6 +58,12 @@ export default { errorLogs() { return this.$store.getters.errorLogs } + }, + methods: { + clearAll() { + this.dialogTableVisible = false + this.$store.dispatch('errorLog/clearErrorLog') + } } } </script> diff --git a/src/store/modules/errorLog.js b/src/store/modules/errorLog.js index 8e3db060..6b01f957 100644 --- a/src/store/modules/errorLog.js +++ b/src/store/modules/errorLog.js @@ -5,12 +5,18 @@ const state = { const mutations = { ADD_ERROR_LOG: (state, log) => { state.logs.push(log) + }, + CLEAR_ERROR_LOG: (state) => { + state.logs.splice(0) } } const actions = { addErrorLog({ commit }, log) { commit('ADD_ERROR_LOG', log) + }, + clearErrorLog({ commit }) { + commit('CLEAR_ERROR_LOG') } } From 27df99791582b8a7a8cf1d35ec8a40ec2406ca33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Sun, 12 May 2019 14:01:04 +0800 Subject: [PATCH 166/202] fix[redirect]: fix redirect bug in vue-devtools (#2066) --- src/views/redirect/index.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue index bf56fbcd..64624c65 100644 --- a/src/views/redirect/index.vue +++ b/src/views/redirect/index.vue @@ -4,6 +4,7 @@ export default { const { params, query } = this.$route const { path } = params this.$router.replace({ path: '/' + path, query }) + return }, render: function(h) { return h() // avoid warning message From 2096ae1b6ec0fbe0ccf31ed56f5257208d3a71c8 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 13 May 2019 09:57:33 +0800 Subject: [PATCH 167/202] perf[Tinymce]: update tinymce cdn version --- vue.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue.config.js b/vue.config.js index dcb0c248..41a7f600 100644 --- a/vue.config.js +++ b/vue.config.js @@ -60,7 +60,7 @@ module.exports = { const cdn = { // inject tinymce into index.html // why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one - js: ['https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.2/tinymce.min.js'] + js: ['https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js'] } config.plugin('html') .tap(args => { From 45edf7b0485bc99e95b9b189d65da6717aad7e91 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 13 May 2019 17:32:53 +0800 Subject: [PATCH 168/202] fix[redirect]: fix redirect bug in vue-devtool again --- src/views/redirect/index.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue index 64624c65..db4c1d66 100644 --- a/src/views/redirect/index.vue +++ b/src/views/redirect/index.vue @@ -1,10 +1,9 @@ <script> export default { - beforeCreate() { + created() { const { params, query } = this.$route const { path } = params this.$router.replace({ path: '/' + path, query }) - return }, render: function(h) { return h() // avoid warning message From dbfcc9dc19e5ef160146a9ef87efce1ac0857240 Mon Sep 17 00:00:00 2001 From: Yamel Senih <ysenih@erpya.com> Date: Mon, 13 May 2019 23:04:03 -0400 Subject: [PATCH 169/202] docs: add support to readme for Spanish (#2070) --- README.es.md | 216 ++++++++++++++++++++++++++++++++++++++++++++++++ README.ja.md | 2 +- README.md | 2 +- README.zh-CN.md | 2 +- 4 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 README.es.md diff --git a/README.es.md b/README.es.md new file mode 100644 index 00000000..2279dd71 --- /dev/null +++ b/README.es.md @@ -0,0 +1,216 @@ +<p align="center"> + <img width="320" src="https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg"> +</p> + +<p align="center"> + <a href="https://github.com/vuejs/vue"> + <img src="https://img.shields.io/badge/vue-2.6.10-brightgreen.svg" alt="vue"> + </a> + <a href="https://github.com/ElemeFE/element"> + <img src="https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg" alt="element-ui"> + </a> + <a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow"> + <img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Estado de Construcción"> + </a> + <a href="https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE"> + <img src="https://img.shields.io/github/license/mashape/apistatus.svg" alt="Licencia"> + </a> + <a href="https://github.com/PanJiaChen/vue-element-admin/releases"> + <img src="https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg" alt="Liberación Github"> + </a> + <a href="https://gitter.im/vue-element-admin/discuss"> + <img src="https://badges.gitter.im/Join%20Chat.svg" alt="Gitter"> + </a> + <a href="https://panjiachen.github.io/vue-element-admin-site/donate"> + <img src="https://img.shields.io/badge/%24-donate-ff69b4.svg" alt="Donación"> + </a> +</p> + +Español | [English](./README.md) | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) + +## Introducción + +[vue-element-admin](https://panjiachen.github.io/vue-element-admin) es una interfáz de administración preparada para producción. Está basada en [vue](https://github.com/vuejs/vue) y usa [element-ui](https://github.com/ElemeFE/element) como conjunto de herramientas de interfáz de usuario. + +Vue Element Admin es una solución práctica basada en la nueva plataforma de desarrollo de vue, construida con soporte a i18 para el manejo de múltiples lenguajes, plantillas estándares para aplicaciones de negocio y un conjunto de asombrosas características. Esta herramienta ayuda a construir largas y complejas Aplicacones de una sola página (SPA). Creo que lo que necesites hacer, este proyecto te ayudará. + +- [Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin) + +- [Documentación](https://panjiachen.github.io/vue-element-admin-site/) + +- [Canal de Gitter](https://gitter.im/vue-element-admin/discuss) + +- [Para Donaciones](https://panjiachen.github.io/vue-element-admin-site/donate/) + +- [Enlace de Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) + +- [Canal de Gitee](https://panjiachen.gitee.io/vue-element-admin/) + +- Plantilla base recomendada para usar: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) +- Aplicación de Escritorio: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) +- Plantilla de Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Créditos: [@Armour](https://github.com/Armour)) + +**Después de la versión `v4.1.0+`, la rama por defecto master no tendrá soporte para i18n. Por favor use [i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), los cambios serán incluidos en la rama master** + +**la versión actual es `v4.0+` construida con `vue-cli`. Si encuentra algún problema, por favor coloque un [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). Si desea usar la versión anterior, puede cambiar de rama a [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), no relacionado con `vue-cli`** + +**Este proyecto no está soportado para versiones muy viejas de navegadores (e.g. IE).** + +## Preparación + +Necesita instalar [node](https://nodejs.org/) y [git](https://git-scm.com/) localmente. El proyecto es basado en [ES2015+](https://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), toda la solicitud de datos simulada se realiza a través de [Mock.js](https://github.com/nuysoft/Mock). +Entendiendo y aprendiendo esto pudiera ayudarle con su proyecto. + + <p align="center"> + <img width="900" src="https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png"> +</p> + +## Patrocinantes + +Se un patrocinante y pon tu logo en nuestro README on GitHub con un enlace directo a tu sitio web. [[Se un Patrocinante]](https://www.patreon.com/panjiachen) + +<a href="https://flatlogic.com/admin-dashboards?from=vue-element-admin"><img width="150px" src="https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png" /></a><p>Plantilla de Dashboard de administración hecha con Vue, React y Angular.</p> + +## Features + +``` +- Iniciar / Cerrar Sesión + +- Permisos de Authentication + - Página de Permisos + - Directivas de permisos + - Página de configuración de permisos + - Autenticación por dos pasos + +- Construcción Multi-entorno + - dev sit stage producción + +- Características Globales + - I18n + - Temas dinámicos + - Dynamic sidebar (soporte a rutas multi-nivel) + - Barra de rutas dinámica + - Tags-view (Tab page Support right-click operation) + - Svg Sprite + - Datos de simulación con Mock + - Pantalla completa + - Responsive Sidebar + +- Editor + - Editor de Texto Enriquecido + - Editor Markdown + - Editor JSON + +- Excel + - Exportación a Excel + - Carga de Excel + - Visualización de Excel + - Exportación como zip + +- Tabla + - Tabla Dinámica + - Tabla con Arrastrar y Soltar + - Tabla de edición en línea + +- Páginas de Error + - 401 + - 404 + +- Componentes + - Carga de Avatar + - Botón para subir al inicio + - Arrastrar y Soltar (Diaglogo) + - Arrastrar y Soltar (Seleccionar) + - Arrastrar y Soltar (Kanban) + - Arrastrar y Soltar (Lista) + - Panel de división + - Componente para soltar archivos + - Adhesión de objetos + - Contador hasta + +- Ejemplo Avanzado +- Registro de Errores +- Tablero de indicadores +- Página de Guías +- ECharts (Gráficos) +- Portapapeles +- Convertidor de Markdown a html +``` + +## Iniciando + +```bash +# clone el proyecto +git clone https://github.com/PanJiaChen/vue-element-admin.git + +# vaya al directorio clonado +cd vue-element-admin + +# instale las dependencias +npm install + +# corra el proyecto como desarrollador +npm run dev +``` + +Automáticamente se abrirá el siguiente enlace en su navegador http://localhost:9527 + +## Build + +```bash +# Construcción para entornos de prueba +npm run build:stage + +# Construcción para entornos de producción +npm run build:prod +``` + +## Avanzado + +```bash +# Vista previa con efectos de entorno +npm run preview + +# Vista previa con efectos + análisis de recursos estáticos +npm run preview -- --report + +# Chequeo de formato de código +npm run lint + +# Chequeo de formato de código y auto-corrección +npm run lint -- --fix +``` + +Vaya a [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) para mayor información + +## Registro de Cambios + +Los cambios detallados por cada liberación se encuentran en [notas de liberación](https://github.com/PanJiaChen/vue-element-admin/releases). + +## Demostración en línea + +[Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin) + +## Donación + +Si este proyecto es de mucha ayuda para ti, puedes comprarle al autor un vaso de jugo :tropical_drink: + + + +[dona por Paypal](https://www.paypal.me/panfree23) + +[Comprame un Café](https://www.buymeacoffee.com/Pan) + +## Navegadores Soportados + +Navegadores modernos e Internet Explorer 10+. + +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge| últimas 2 versiones| últimas 2 versiones| últimas 2 versiones + +## Licencia + +[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) + +Copyright (c) 2017-present PanJiaChen diff --git a/README.ja.md b/README.ja.md index d4ffcace..7b1232bc 100644 --- a/README.ja.md +++ b/README.ja.md @@ -26,7 +26,7 @@ </a> </p> -日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) +日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) | [Spanish](./README.es.md) ## 概要 diff --git a/README.md b/README.md index e6ade124..3a2b6191 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ </a> </p> -English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) +English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md) ## Introduction diff --git a/README.zh-CN.md b/README.zh-CN.md index fd6d770b..31bbe351 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -26,7 +26,7 @@ </a> </p> -简体中文 | [English](./README.md) +简体中文 | [English](./README.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md) ## 简介 From a0b2014e85d015ca6ddc544ec70c7037339ad960 Mon Sep 17 00:00:00 2001 From: Yamel Senih <yamelsenih@gmail.com> Date: Tue, 14 May 2019 21:33:36 -0400 Subject: [PATCH 170/202] docs[es]: add some translation(#2080) --- README.es.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.es.md b/README.es.md index 2279dd71..734c51c2 100644 --- a/README.es.md +++ b/README.es.md @@ -71,7 +71,7 @@ Se un patrocinante y pon tu logo en nuestro README on GitHub con un enlace direc <a href="https://flatlogic.com/admin-dashboards?from=vue-element-admin"><img width="150px" src="https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png" /></a><p>Plantilla de Dashboard de administración hecha con Vue, React y Angular.</p> -## Features +## Características ``` - Iniciar / Cerrar Sesión @@ -155,7 +155,7 @@ npm run dev Automáticamente se abrirá el siguiente enlace en su navegador http://localhost:9527 -## Build +## Construcción ```bash # Construcción para entornos de prueba @@ -181,7 +181,7 @@ npm run lint npm run lint -- --fix ``` -Vaya a [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) para mayor información +Vaya a [Documentación](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) para mayor información ## Registro de Cambios @@ -213,4 +213,4 @@ Navegadores modernos e Internet Explorer 10+. [MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) -Copyright (c) 2017-present PanJiaChen +Copyright (c) 2017-presente PanJiaChen From 36060d5dafa60440baffd7687a30b4a202f7f912 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Fri, 17 May 2019 10:20:42 +0800 Subject: [PATCH 171/202] perf[Exapme]: set page title according to article id --- src/views/example/components/ArticleDetail.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index b689ae01..bf534806 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -183,12 +183,16 @@ export default { fetchData(id) { fetchArticle(id).then(response => { this.postForm = response.data - // Just for test + + // just for test this.postForm.title += ` Article Id:${this.postForm.id}` this.postForm.content_short += ` Article Id:${this.postForm.id}` - // Set tagsview title + // set tagsview title this.setTagsViewTitle() + + // set page title + this.setPageTitle() }).catch(err => { console.log(err) }) @@ -198,6 +202,10 @@ export default { const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` }) this.$store.dispatch('tagsView/updateVisitedView', route) }, + setPageTitle() { + const title = 'Edit Article' + document.title = `${title} - ${this.postForm.id}` + }, submitForm() { console.log(this.postForm) this.$refs.postForm.validate(valid => { From 4f620c4a0d6c9dd58d489bb962df8fd22c37f37f Mon Sep 17 00:00:00 2001 From: liugq <liugq5713@gmail.com> Date: Fri, 17 May 2019 15:51:08 +0800 Subject: [PATCH 172/202] perf[RightPanel]: tidy css (#2101) --- src/components/RightPanel/index.vue | 37 ++++++++++++----------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/components/RightPanel/index.vue b/src/components/RightPanel/index.vue index 63408d8b..55e8c1e5 100644 --- a/src/components/RightPanel/index.vue +++ b/src/components/RightPanel/index.vue @@ -86,32 +86,27 @@ export default { <style lang="scss" scoped> .rightPanel-background { + position: fixed; + top: 0; + left: 0; opacity: 0; transition: opacity .3s cubic-bezier(.7, .3, .1, 1); background: rgba(0, 0, 0, .2); - width: 0; - height: 0; - top: 0; - left: 0; - position: fixed; z-index: -1; } .rightPanel { - background: #fff; - z-index: 3000; - position: fixed; - height: 100vh; width: 100%; max-width: 260px; - top: 0px; - left: 0px; + height: 100vh; + position: fixed; + top: 0; + right: 0; box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05); transition: all .25s cubic-bezier(.7, .3, .1, 1); transform: translate(100%); + background: #fff; z-index: 40000; - left: auto; - right: 0px; } .show { @@ -130,20 +125,18 @@ export default { } .handle-button { - position: absolute; - left: -48px; - border-radius: 6px 0 0 6px !important; width: 48px; height: 48px; - pointer-events: auto; - z-index: 0; - cursor: pointer; - pointer-events: auto; - font-size: 24px; + position: absolute; + left: -48px; text-align: center; + font-size: 24px; + border-radius: 6px 0 0 6px !important; + z-index: 0; + pointer-events: auto; + cursor: pointer; color: #fff; line-height: 48px; - i { font-size: 24px; line-height: 48px; From be3dfac13b07119a930d26497907c6fb23a14e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 20 May 2019 11:03:29 +0800 Subject: [PATCH 173/202] feat[SvgIcon]: support import svg from url (#2052) --- src/components/SvgIcon/index.vue | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue index 27da76cf..b07ded2a 100644 --- a/src/components/SvgIcon/index.vue +++ b/src/components/SvgIcon/index.vue @@ -1,10 +1,14 @@ <template> - <svg :class="svgClass" aria-hidden="true" v-on="$listeners"> + <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" /> + <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners"> <use :xlink:href="iconName" /> </svg> </template> <script> +// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage +import { isExternal } from '@/utils/validate' + export default { name: 'SvgIcon', props: { @@ -18,6 +22,9 @@ export default { } }, computed: { + isExternal() { + return isExternal(this.iconClass) + }, iconName() { return `#icon-${this.iconClass}` }, @@ -27,6 +34,12 @@ export default { } else { return 'svg-icon' } + }, + styleExternalIcon() { + return { + mask: `url(${this.iconClass}) no-repeat 50% 50%`, + '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%` + } } } } @@ -40,4 +53,10 @@ export default { fill: currentColor; overflow: hidden; } + +.svg-external-icon { + background-color: currentColor; + mask-size: cover!important; + display: inline-block; +} </style> From 1e598e96843c18acd9d38018d26a4247a4a0f512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 20 May 2019 11:04:17 +0800 Subject: [PATCH 174/202] fix: fixed change roles bug (#2072) --- src/store/modules/user.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/store/modules/user.js b/src/store/modules/user.js index d2b2e67a..dbc29003 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -115,6 +115,9 @@ const actions = { // dynamically add accessible routes router.addRoutes(accessRoutes) + // reset visited views and cached views + dispatch('tagsView/delAllViews', null, { root: true }) + resolve() }) } From 40431fdfc80f4f24abcef89181b3bc672ce114cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 20 May 2019 11:04:51 +0800 Subject: [PATCH 175/202] perf[Breadcrumb]: do not update breadcrumbs when go to redirect page (#2086) --- src/components/Breadcrumb/index.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 29f9a04c..e224ff73 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -19,7 +19,11 @@ export default { } }, watch: { - $route() { + $route(route) { + // if you go to the redirect page, do not update the breadcrumbs + if (route.path.startsWith('/redirect/')) { + return + } this.getBreadcrumb() } }, From d0fcbbaa28ea4ed23f2d4f0080434f59cef48491 Mon Sep 17 00:00:00 2001 From: Yamel Senih <ysenih@erpya.com> Date: Sun, 19 May 2019 23:10:30 -0400 Subject: [PATCH 176/202] perf[store]: add support to sub-modules (#2047) --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index 70736d3a..0fd83955 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -5,7 +5,7 @@ import getters from './getters' Vue.use(Vuex) // https://webpack.js.org/guides/dependency-management/#requirecontext -const modulesFiles = require.context('./modules', false, /\.js$/) +const modulesFiles = require.context('./modules', true, /\.js$/) // you do not need `import app from './modules/app'` // it will auto require all vuex module from modules file From cd30d254590e267cea5066305ae132dfaa47356c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 20 May 2019 11:21:07 +0800 Subject: [PATCH 177/202] perf[Login]: support other query (#2013) --- src/views/login/index.vue | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index fd09b6d7..d991457c 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -108,13 +108,18 @@ export default { capsTooltip: false, loading: false, showDialog: false, - redirect: undefined + redirect: undefined, + otherQuery: {} } }, watch: { $route: { handler: function(route) { - this.redirect = route.query && route.query.redirect + const query = route.query + if (query) { + this.redirect = query.redirect + this.otherQuery = this.getOtherQuery(query) + } }, immediate: true } @@ -161,7 +166,7 @@ export default { this.loading = true this.$store.dispatch('user/login', this.loginForm) .then(() => { - this.$router.push({ path: this.redirect || '/' }) + this.$router.push({ path: this.redirect || '/', query: this.otherQuery }) this.loading = false }) .catch(() => { @@ -172,6 +177,14 @@ export default { return false } }) + }, + getOtherQuery(query) { + return Object.keys(query).reduce((acc, cur) => { + if (cur !== 'redirect') { + acc[cur] = query[cur] + } + return acc + }, {}) } // afterQRScan() { // if (e.key === 'x-admin-oauth-code') { From 131b9b9eff033d6300d1820b3873c15f803514e3 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 20 May 2019 13:16:08 +0800 Subject: [PATCH 178/202] refactor[chore]: generate postcss.config.js instead of .postcssrc.js consistent with vue-cli --- .postcssrc.js | 8 -------- package.json | 3 +-- postcss.config.js | 5 +++++ 3 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 .postcssrc.js create mode 100644 postcss.config.js diff --git a/.postcssrc.js b/.postcssrc.js deleted file mode 100644 index 09948d63..00000000 --- a/.postcssrc.js +++ /dev/null @@ -1,8 +0,0 @@ -// https://github.com/michael-ciniawsky/postcss-load-config - -module.exports = { - "plugins": { - // to edit target browsers: use "browserslist" field in package.json - "autoprefixer": {} - } -} diff --git a/package.json b/package.json index c9cde7ba..49a707cf 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,6 @@ }, "browserslist": [ "> 1%", - "last 2 versions", - "not ie <= 8" + "last 2 versions" ] } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..961986e2 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} From 6770963672fd52b32245b899f6c9c83966d6f5fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Tue, 21 May 2019 10:50:10 +0800 Subject: [PATCH 179/202] perf[Tinymce]: dynamic import tinymce(#2102) --- public/index.html | 4 --- src/components/Tinymce/dynamicLoadScript.js | 39 +++++++++++++++++++++ src/components/Tinymce/index.vue | 20 +++++++++-- vue.config.js | 10 ------ 4 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 src/components/Tinymce/dynamicLoadScript.js diff --git a/public/index.html b/public/index.html index 9bb2d7fc..e9185009 100644 --- a/public/index.html +++ b/public/index.html @@ -9,10 +9,6 @@ <title><%= webpackConfig.name %></title> </head> <body> - <!-- import cdn js --> - <% for(var js of htmlWebpackPlugin.options.cdn.js) { %> - <script src="<%=js%>"></script> - <% } %> <div id="app"></div> <!-- built files will be auto injected --> </body> diff --git a/src/components/Tinymce/dynamicLoadScript.js b/src/components/Tinymce/dynamicLoadScript.js new file mode 100644 index 00000000..46a93290 --- /dev/null +++ b/src/components/Tinymce/dynamicLoadScript.js @@ -0,0 +1,39 @@ +const dynamicLoadScript = (src, callback) => { + const existingScript = document.getElementById(src) + const cb = callback || function() {} + + if (!existingScript) { + const script = document.createElement('script') + script.src = src // src url for the third-party library being loaded. + script.id = src + document.body.appendChild(script) + + const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd + onEnd(script, cb) + } + + if (existingScript && cb) cb(null, existingScript) + + function stdOnEnd(script, cb) { + script.onload = function() { + // this.onload = null here is necessary + // because even IE9 works not like others + this.onerror = this.onload = null + cb(null, script) + } + script.onerror = function() { + this.onerror = this.onload = null + cb(new Error('Failed to load ' + src), script) + } + } + + function ieOnEnd(script, cb) { + script.onreadystatechange = function() { + if (this.readyState !== 'complete' && this.readyState !== 'loaded') return + this.onreadystatechange = null + cb(null, script) // there is no way to catch loading errors in IE8 + } + } +} + +export default dynamicLoadScript diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index 62cb2c06..a46b37d6 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -15,6 +15,10 @@ import editorImage from './components/EditorImage' import plugins from './plugins' import toolbar from './toolbar' +import load from './dynamicLoadScript' + +// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one +const tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js' export default { name: 'Tinymce', @@ -82,10 +86,12 @@ export default { } }, mounted() { - this.initTinymce() + this.init() }, activated() { - this.initTinymce() + if (window.tinymce) { + this.initTinymce() + } }, deactivated() { this.destroyTinymce() @@ -94,6 +100,16 @@ export default { this.destroyTinymce() }, methods: { + init() { + // dynamic load tinymce from cdn + load(tinymceCDN, (err) => { + if (err) { + this.$message.error(err.message) + return + } + this.initTinymce() + }) + }, initTinymce() { const _this = this window.tinymce.init({ diff --git a/vue.config.js b/vue.config.js index 41a7f600..c5e31642 100644 --- a/vue.config.js +++ b/vue.config.js @@ -57,16 +57,6 @@ module.exports = { } }, chainWebpack(config) { - const cdn = { - // inject tinymce into index.html - // why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one - js: ['https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js'] - } - config.plugin('html') - .tap(args => { - args[0].cdn = cdn - return args - }) config.plugins.delete('preload') // TODO: need test config.plugins.delete('prefetch') // TODO: need test From 2f5c2eebcd063138584bee2b85cccccf034317af Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 21 May 2019 10:53:49 +0800 Subject: [PATCH 180/202] [release] 4.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49a707cf..cd1369b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-admin", - "version": "4.1.0", + "version": "4.2.0", "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", From 8ce250a44e23db0af9d3f3ea1f013cff505d1360 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 23 May 2019 10:18:50 +0800 Subject: [PATCH 181/202] perf[Style]: refine example css --- src/views/example/components/ArticleDetail.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index bf534806..ae090738 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -49,7 +49,7 @@ :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :low-threshold="1" :high-threshold="3" - style="margin-top:8px;" + style="display:inline-block" /> </el-form-item> </el-col> From 13c1ecf25ca6bb098b322280e3467511683011ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Thu, 23 May 2019 11:27:10 +0800 Subject: [PATCH 182/202] fix[Chart]: fixed chart bug in keep-alive (#2119) --- .../dashboard/admin/components/BarChart.vue | 10 +--- .../dashboard/admin/components/LineChart.vue | 36 ++---------- .../dashboard/admin/components/PieChart.vue | 10 +--- .../admin/components/RaddarChart.vue | 10 +--- .../admin/components/mixins/resize.js | 56 +++++++++++++++++++ 5 files changed, 68 insertions(+), 54 deletions(-) create mode 100644 src/views/dashboard/admin/components/mixins/resize.js diff --git a/src/views/dashboard/admin/components/BarChart.vue b/src/views/dashboard/admin/components/BarChart.vue index 47e7a110..be0af34f 100644 --- a/src/views/dashboard/admin/components/BarChart.vue +++ b/src/views/dashboard/admin/components/BarChart.vue @@ -5,11 +5,12 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' const animationDuration = 6000 export default { + mixins: [resize], props: { className: { type: String, @@ -33,18 +34,11 @@ export default { this.$nextTick(() => { this.initChart() }) - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) }, beforeDestroy() { if (!this.chart) { return } - window.removeEventListener('resize', this.__resizeHandler) this.chart.dispose() this.chart = null }, diff --git a/src/views/dashboard/admin/components/LineChart.vue b/src/views/dashboard/admin/components/LineChart.vue index d567f08d..e654168d 100644 --- a/src/views/dashboard/admin/components/LineChart.vue +++ b/src/views/dashboard/admin/components/LineChart.vue @@ -5,9 +5,10 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' export default { + mixins: [resize], props: { className: { type: String, @@ -32,8 +33,7 @@ export default { }, data() { return { - chart: null, - sidebarElm: null + chart: null } }, watch: { @@ -48,38 +48,18 @@ export default { this.$nextTick(() => { this.initChart() }) - - if (this.autoResize) { - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) - } - - // 监听侧边栏的变化 - this.sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.sidebarElm && this.sidebarElm.addEventListener('transitionend', this.sidebarResizeHandler) }, beforeDestroy() { if (!this.chart) { return } - if (this.autoResize) { - window.removeEventListener('resize', this.__resizeHandler) - } - - this.sidebarElm && this.sidebarElm.removeEventListener('transitionend', this.sidebarResizeHandler) - this.chart.dispose() this.chart = null }, methods: { - sidebarResizeHandler(e) { - if (e.propertyName === 'width') { - this.__resizeHandler() - } + initChart() { + this.chart = echarts.init(this.$el, 'macarons') + this.setOptions(this.chartData) }, setOptions({ expectedData, actualData } = {}) { this.chart.setOption({ @@ -149,10 +129,6 @@ export default { animationEasing: 'quadraticOut' }] }) - }, - initChart() { - this.chart = echarts.init(this.$el, 'macarons') - this.setOptions(this.chartData) } } } diff --git a/src/views/dashboard/admin/components/PieChart.vue b/src/views/dashboard/admin/components/PieChart.vue index d5d59ff3..4d2ef32a 100644 --- a/src/views/dashboard/admin/components/PieChart.vue +++ b/src/views/dashboard/admin/components/PieChart.vue @@ -5,9 +5,10 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' export default { + mixins: [resize], props: { className: { type: String, @@ -31,18 +32,11 @@ export default { this.$nextTick(() => { this.initChart() }) - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) }, beforeDestroy() { if (!this.chart) { return } - window.removeEventListener('resize', this.__resizeHandler) this.chart.dispose() this.chart = null }, diff --git a/src/views/dashboard/admin/components/RaddarChart.vue b/src/views/dashboard/admin/components/RaddarChart.vue index cd2257b0..6823af31 100644 --- a/src/views/dashboard/admin/components/RaddarChart.vue +++ b/src/views/dashboard/admin/components/RaddarChart.vue @@ -5,11 +5,12 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' const animationDuration = 3000 export default { + mixins: [resize], props: { className: { type: String, @@ -33,18 +34,11 @@ export default { this.$nextTick(() => { this.initChart() }) - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) }, beforeDestroy() { if (!this.chart) { return } - window.removeEventListener('resize', this.__resizeHandler) this.chart.dispose() this.chart = null }, diff --git a/src/views/dashboard/admin/components/mixins/resize.js b/src/views/dashboard/admin/components/mixins/resize.js new file mode 100644 index 00000000..bcd17bf0 --- /dev/null +++ b/src/views/dashboard/admin/components/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null + } + }, + mounted() { + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() + }, + beforeDestroy() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() + }, + // to fixed bug when cached by keep-alive + // https://github.com/PanJiaChen/vue-element-admin/issues/2116 + activated() { + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() + }, + deactivated() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_resizeHandler() { + return debounce(() => { + if (this.chart) { + this.chart.resize() + } + }, 100)() + }, + $_initResizeEvent() { + window.addEventListener('resize', this.$_resizeHandler) + }, + $_destroyResizeEvent() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + $_initSidebarResizeEvent() { + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + $_destroySidebarResizeEvent() { + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + } + } +} From ab1922ef1473ab6d38bb9bc22730ae25ccd62147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Fri, 24 May 2019 10:02:27 +0800 Subject: [PATCH 183/202] Create FUNDING.yml --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..d5408027 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +patreon: panjiachen +custom: https://panjiachen.github.io/vue-element-admin-site/donate From 6a322c9defbcbf2adffacc7141022baf4be10e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Sun, 26 May 2019 17:12:36 +0800 Subject: [PATCH 184/202] chore: set localhost => 127.0.0.1 (#2142) --- vue.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue.config.js b/vue.config.js index c5e31642..4a5cd438 100644 --- a/vue.config.js +++ b/vue.config.js @@ -37,7 +37,7 @@ module.exports = { // change xxx-api/login => mock/login // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { - target: `http://localhost:${port}/mock`, + target: `http://127.0.0.1:${port}/mock`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: '' From 2584dcce1684a17620dd69468d9719bcc70778a4 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 27 May 2019 10:37:00 +0800 Subject: [PATCH 185/202] update github ISSUE_TEMPLATE --- .github/ISSUE_TEMPLATE/question.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 96be4532..76083546 100755 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -12,3 +12,24 @@ about: Asking questions about use Before asking a question, please make sure that you have tried your best to solve this problem. If it's a code-related issue, please don't just take screenshots. Please provide an online demo to save each other's time. --> + +#### Steps to reproduce(问题复现步骤) +<!-- +1. [xxx] +2. [xxx] +3. [xxxx] +--> + +#### Screenshot or Gif(截图或动态图) + + +#### Link to minimal reproduction(最小可在线还原demo) + +<!-- +Please only use Codepen, JSFiddle, CodeSandbox or a github repo +--> + +#### Other relevant information(格外信息) +- Your OS: +- Node.js version: +- vue-element-admin version: From 5b943d71e974a81d1b5fa7c770db65ba8ebb4b1c Mon Sep 17 00:00:00 2001 From: bpzhang <bpzhang@users.noreply.github.com> Date: Mon, 27 May 2019 15:04:04 +0800 Subject: [PATCH 186/202] chore: add autoprefixer to devDependencies --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index cd1369b8..5ea4a26f 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "@vue/cli-plugin-unit-jest": "3.5.3", "@vue/cli-service": "3.5.3", "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "^9.5.1", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.0.1", "babel-jest": "23.6.0", From e28701cde4646f7224c3a8dd1a7999546bf5d20e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 27 May 2019 15:04:34 +0800 Subject: [PATCH 187/202] perf[Tinymce]: add language option (#2159) --- src/components/Tinymce/index.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue index a46b37d6..0c6174c4 100644 --- a/src/components/Tinymce/index.vue +++ b/src/components/Tinymce/index.vue @@ -64,7 +64,9 @@ export default { fullscreen: false, languageTypeList: { 'en': 'en', - 'zh': 'zh_CN' + 'zh': 'zh_CN', + 'es': 'es_MX', + 'ja': 'ja' } } }, @@ -114,6 +116,7 @@ export default { const _this = this window.tinymce.init({ selector: `#${this.tinymceId}`, + language: this.languageTypeList['en'], height: this.height, body_class: 'panel-body ', object_resizing: false, From f891202706e389e539fd15b24a9480bbb2794907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 27 May 2019 15:35:07 +0800 Subject: [PATCH 188/202] fix[Tinymce]: fixed bug when init multiple tinymces at the same time (#2152) --- src/components/Tinymce/dynamicLoadScript.js | 34 ++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/components/Tinymce/dynamicLoadScript.js b/src/components/Tinymce/dynamicLoadScript.js index 46a93290..185f58dc 100644 --- a/src/components/Tinymce/dynamicLoadScript.js +++ b/src/components/Tinymce/dynamicLoadScript.js @@ -1,3 +1,11 @@ +let callbacks = [] + +function loadedTinymce() { + // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144 + // check is successfully downloaded script + return window.tinymce +} + const dynamicLoadScript = (src, callback) => { const existingScript = document.getElementById(src) const cb = callback || function() {} @@ -7,19 +15,28 @@ const dynamicLoadScript = (src, callback) => { script.src = src // src url for the third-party library being loaded. script.id = src document.body.appendChild(script) - + callbacks.push(cb) const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd - onEnd(script, cb) + onEnd(script) } - if (existingScript && cb) cb(null, existingScript) + if (existingScript && cb) { + if (loadedTinymce()) { + cb(null, existingScript) + } else { + callbacks.push(cb) + } + } - function stdOnEnd(script, cb) { + function stdOnEnd(script) { script.onload = function() { // this.onload = null here is necessary // because even IE9 works not like others this.onerror = this.onload = null - cb(null, script) + for (const cb of callbacks) { + cb(null, script) + } + callbacks = null } script.onerror = function() { this.onerror = this.onload = null @@ -27,11 +44,14 @@ const dynamicLoadScript = (src, callback) => { } } - function ieOnEnd(script, cb) { + function ieOnEnd(script) { script.onreadystatechange = function() { if (this.readyState !== 'complete' && this.readyState !== 'loaded') return this.onreadystatechange = null - cb(null, script) // there is no way to catch loading errors in IE8 + for (const cb of callbacks) { + cb(null, script) // there is no way to catch loading errors in IE8 + } + callbacks = null } } } From e8837d161ee2a4793bdf5add1503d472857f6f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E8=A3=A4=E8=A1=A9?= <panfree23@gmail.com> Date: Mon, 27 May 2019 15:48:45 +0800 Subject: [PATCH 189/202] feat: add tab url demo (#2114) --- src/layout/components/AppMain.vue | 2 +- src/views/tab/index.vue | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 9e12c662..a8976380 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -16,7 +16,7 @@ export default { return this.$store.state.tagsView.cachedViews }, key() { - return this.$route.fullPath + return this.$route.path } } } diff --git a/src/views/tab/index.vue b/src/views/tab/index.vue index e5746580..6438a47a 100644 --- a/src/views/tab/index.vue +++ b/src/views/tab/index.vue @@ -30,6 +30,18 @@ export default { createdTimes: 0 } }, + watch: { + activeName(val) { + this.$router.push(`${this.$route.path}?tab=${val}`) + } + }, + created() { + // init the default selected tab + const tab = this.$route.query.tab + if (tab) { + this.activeName = tab + } + }, methods: { showCreatedTimes() { this.createdTimes = this.createdTimes + 1 From ac8c12c82d1ceb15d78454fbdc0fc98458393304 Mon Sep 17 00:00:00 2001 From: Serge <gaosj1993@foxmail.com> Date: Mon, 27 May 2019 16:24:47 +0800 Subject: [PATCH 190/202] perf[request.js]: refine error reject (#2160) --- src/utils/request.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/request.js b/src/utils/request.js index bc346a8c..71d5ea4b 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -48,7 +48,7 @@ service.interceptors.response.use( // if the custom code is not 20000, it is judged as an error. if (res.code !== 20000) { Message({ - message: res.message || 'error', + message: res.message || 'Error', type: 'error', duration: 5 * 1000 }) @@ -66,7 +66,7 @@ service.interceptors.response.use( }) }) } - return Promise.reject(res.message || 'error') + return Promise.reject(new Error(res.message || 'Error')) } else { return res } From 054ed40e076dc6fa6e707e7020698643b407b9f2 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Mon, 27 May 2019 16:25:37 +0800 Subject: [PATCH 191/202] [release] 4.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5ea4a26f..8fbbf88e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-admin", - "version": "4.2.0", + "version": "4.2.1", "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", "author": "Pan <panfree23@gmail.com>", "license": "MIT", From 9538d1b766ab897f0fb3cc38d05be6884be7e6e2 Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Tue, 28 May 2019 11:09:00 +0800 Subject: [PATCH 192/202] perf: default not set withCredentials --- src/utils/request.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/request.js b/src/utils/request.js index 71d5ea4b..2fb95ac0 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -6,7 +6,7 @@ import { getToken } from '@/utils/auth' // create an axios instance const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url - withCredentials: true, // send cookies when cross-domain requests + // withCredentials: true, // send cookies when cross-domain requests timeout: 5000 // request timeout }) From a0793dbeab6eac29863ad9aef7de77710600bb37 Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Tue, 28 May 2019 15:10:37 +0800 Subject: [PATCH 193/202] fix[ImageCropper]: removeEventListener when destroyed(#2169) --- src/components/ImageCropper/index.vue | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/ImageCropper/index.vue b/src/components/ImageCropper/index.vue index c30c5b18..c2688e99 100644 --- a/src/components/ImageCropper/index.vue +++ b/src/components/ImageCropper/index.vue @@ -839,16 +839,20 @@ export default { that.$emit('crop-upload-fail', err, field, ki) } }) + }, + closeHandler(e) { + if (this.value && (e.key == 'Escape' || e.keyCode == 27)) { + this.off() + } } }, created() { // 绑定按键esc隐藏此插件事件 - document.addEventListener('keyup', (e) => { - if (this.value && (e.key == 'Escape' || e.keyCode == 27)) { - this.off() - } - }) - } + document.addEventListener('keyup', this.closeHandler) + }, + destroyed() { + document.removeEventListener('keyup', this.closeHandler) + }, } </script> From 8e9f2e14799a61a9baf0e346eb8038e57e3e3fcd Mon Sep 17 00:00:00 2001 From: Jessynt <xr5299@gmail.com> Date: Tue, 28 May 2019 16:18:25 +0800 Subject: [PATCH 194/202] docs: fix typo (#2170) --- src/views/example/components/ArticleDetail.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/example/components/ArticleDetail.vue b/src/views/example/components/ArticleDetail.vue index ae090738..ef0f1df9 100644 --- a/src/views/example/components/ArticleDetail.vue +++ b/src/views/example/components/ArticleDetail.vue @@ -7,7 +7,7 @@ <PlatformDropdown v-model="postForm.platforms" /> <SourceUrlDropdown v-model="postForm.source_uri" /> <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm"> - Publush + Publish </el-button> <el-button v-loading="loading" type="warning" @click="draftForm"> Draft @@ -36,7 +36,7 @@ </el-col> <el-col :span="10"> - <el-form-item label-width="120px" label="Publush Time:" class="postInfo-container-item"> + <el-form-item label-width="120px" label="Publish Time:" class="postInfo-container-item"> <el-date-picker v-model="displayTime" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="Select date and time" /> </el-form-item> </el-col> From 4bd8f7f670219db02e4c29781788f602c27ffa1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=82=96=E6=95=8F?= <392716797@qq.com> Date: Sun, 2 Jun 2019 16:08:23 +0800 Subject: [PATCH 195/202] fix: input attribute autocomplete error (#2191) --- src/components/MDinput/index.vue | 12 ++++++------ src/views/login/index.vue | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/MDinput/index.vue b/src/components/MDinput/index.vue index 013462fa..c59ea34a 100644 --- a/src/components/MDinput/index.vue +++ b/src/components/MDinput/index.vue @@ -9,7 +9,7 @@ :placeholder="fillPlaceHolder" :readonly="readonly" :disabled="disabled" - :autoComplete="autoComplete" + :autocomplete="autoComplete" :required="required" type="email" class="material-input" @@ -24,7 +24,7 @@ :placeholder="fillPlaceHolder" :readonly="readonly" :disabled="disabled" - :autoComplete="autoComplete" + :autocomplete="autoComplete" :required="required" type="url" class="material-input" @@ -40,7 +40,7 @@ :step="step" :readonly="readonly" :disabled="disabled" - :autoComplete="autoComplete" + :autocomplete="autoComplete" :max="max" :min="min" :minlength="minlength" @@ -59,7 +59,7 @@ :placeholder="fillPlaceHolder" :readonly="readonly" :disabled="disabled" - :autoComplete="autoComplete" + :autocomplete="autoComplete" :max="max" :min="min" :required="required" @@ -76,7 +76,7 @@ :placeholder="fillPlaceHolder" :readonly="readonly" :disabled="disabled" - :autoComplete="autoComplete" + :autocomplete="autoComplete" :required="required" type="tel" class="material-input" @@ -91,7 +91,7 @@ :placeholder="fillPlaceHolder" :readonly="readonly" :disabled="disabled" - :autoComplete="autoComplete" + :autocomplete="autoComplete" :minlength="minlength" :maxlength="maxlength" :required="required" diff --git a/src/views/login/index.vue b/src/views/login/index.vue index d991457c..5fb3f6e3 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,6 +1,6 @@ <template> <div class="login-container"> - <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left"> + <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left"> <div class="title-container"> <h3 class="title">Login Form</h3> @@ -17,7 +17,7 @@ name="username" type="text" tabindex="1" - auto-complete="on" + autocomplete="on" /> </el-form-item> @@ -34,7 +34,7 @@ placeholder="Password" name="password" tabindex="2" - auto-complete="on" + autocomplete="on" @keyup.native="checkCapslock" @blur="capsTooltip = false" @keyup.enter.native="handleLogin" From d3a2b6b34ed2f4ba69b78f2d07483747eb6ea7dd Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Thu, 6 Jun 2019 17:46:00 +0800 Subject: [PATCH 196/202] perf[PanThumb]: Replace the image tag with background-image to prevent the stretching (#2202) --- src/components/PanThumb/index.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/PanThumb/index.vue b/src/components/PanThumb/index.vue index de6940ad..1bcf4170 100644 --- a/src/components/PanThumb/index.vue +++ b/src/components/PanThumb/index.vue @@ -5,7 +5,8 @@ <slot /> </div> </div> - <img :src="image" class="pan-thumb"> + <!-- eslint-disable-next-line --> + <div :style="{backgroundImage: `url(${image})`}" class="pan-thumb"></div> </div> </template> @@ -52,7 +53,8 @@ export default { .pan-thumb { width: 100%; height: 100%; - background-size: 100%; + background-position: center center; + background-size: cover; border-radius: 50%; overflow: hidden; position: absolute; @@ -60,7 +62,7 @@ export default { transition: all 0.3s ease-in-out; } -.pan-thumb:after { +/* .pan-thumb:after { content: ''; width: 8px; height: 8px; @@ -71,7 +73,7 @@ export default { margin: -4px 0 0 -4px; background: radial-gradient(ellipse at center, rgba(14, 14, 14, 1) 0%, rgba(125, 126, 125, 1) 100%); box-shadow: 0 0 1px rgba(255, 255, 255, 0.9); -} +} */ .pan-info { position: absolute; From 35adfcef3fd251a389ea0884b12eb3545e1d78c5 Mon Sep 17 00:00:00 2001 From: TinaryTree <mbdkhss@gmail.com> Date: Thu, 27 Jun 2019 23:15:48 +0800 Subject: [PATCH 197/202] docs: fix typo README.zh-CN.md (#2283) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 31bbe351..82b8908c 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -164,7 +164,7 @@ cd vue-element-admin # 安装依赖 npm install -# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 +# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npm.taobao.org # 启动服务 From ef167ff064373ceff7002ae0f586b8d2730ea4b9 Mon Sep 17 00:00:00 2001 From: MaYuanhai <414199639@qq.com> Date: Sun, 30 Jun 2019 11:09:19 +0800 Subject: [PATCH 198/202] perf[clipboard.js]: remove redundant code (#2307) --- src/utils/clipboard.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/utils/clipboard.js b/src/utils/clipboard.js index e916a44d..cf5b07a1 100644 --- a/src/utils/clipboard.js +++ b/src/utils/clipboard.js @@ -22,14 +22,10 @@ export default function handleClipboard(text, event) { }) clipboard.on('success', () => { clipboardSuccess() - clipboard.off('error') - clipboard.off('success') clipboard.destroy() }) clipboard.on('error', () => { clipboardError() - clipboard.off('error') - clipboard.off('success') clipboard.destroy() }) clipboard.onClick(event) From 018c20a3f6f695be9de28aa651d2c1cc64c13cee Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Sun, 30 Jun 2019 16:07:54 +0800 Subject: [PATCH 199/202] bump: update axios for security vulnerability --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8fbbf88e..a57d8c89 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "url": "https://github.com/PanJiaChen/vue-element-admin/issues" }, "dependencies": { - "axios": "0.18.0", + "axios": "0.18.1", "clipboard": "2.0.4", "codemirror": "5.45.0", "driver.js": "0.9.5", From 1909018dbdd57588a480b9d69753cbbd6a78093d Mon Sep 17 00:00:00 2001 From: itsccn <chen.sun@itsccn.com> Date: Thu, 4 Jul 2019 14:38:31 +0800 Subject: [PATCH 200/202] bump: update @vue/cli-plugin-eslint version (#2327) FIx cannot find module '.../node_modules/eslint/lib/api.js/package.json' bug,see https://github.com/vuejs/vue-cli/issues/4231. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a57d8c89..9942fbac 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@babel/core": "7.0.0", "@babel/register": "7.0.0", "@vue/cli-plugin-babel": "3.5.3", - "@vue/cli-plugin-eslint": "3.5.1", + "@vue/cli-plugin-eslint": "^3.9.1", "@vue/cli-plugin-unit-jest": "3.5.3", "@vue/cli-service": "3.5.3", "@vue/test-utils": "1.0.0-beta.29", From c8039a5ce3d065eb7e1972d76cf9c57d487124bb Mon Sep 17 00:00:00 2001 From: Pan <panfree23@gmail.com> Date: Thu, 4 Jul 2019 16:41:44 +0800 Subject: [PATCH 201/202] chore: allow dynamic set port --- vue.config.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vue.config.js b/vue.config.js index 4a5cd438..7b8f3a5d 100644 --- a/vue.config.js +++ b/vue.config.js @@ -7,10 +7,13 @@ function resolve(dir) { } const name = defaultSettings.title || 'vue Element Admin' // page title + // If your port is set to 80, // use administrator privileges to execute the command line. // For example, Mac: sudo npm run -const port = 9527 // dev port +// You can change the port by the following method: +// port = 9527 npm run dev OR npm run dev --port = 9527 +const port = process.env.port || process.env.npm_config_port || 9527 // dev port // All configuration item explanations can be find in https://cli.vuejs.org/config/ module.exports = { From 46cc375d0d91261a7962715dd48e66e10e8c5872 Mon Sep 17 00:00:00 2001 From: why <w.why@163.com> Date: Tue, 16 Jul 2019 17:12:26 +0800 Subject: [PATCH 202/202] fix[complex-table]: form header sort icon is out of sync (#2382) --- src/views/table/complex-table.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/views/table/complex-table.vue b/src/views/table/complex-table.vue index fe266465..3d61f6c6 100644 --- a/src/views/table/complex-table.vue +++ b/src/views/table/complex-table.vue @@ -35,7 +35,7 @@ style="width: 100%;" @sort-change="sortChange" > - <el-table-column label="ID" prop="id" sortable="custom" align="center" width="80"> + <el-table-column label="ID" prop="id" sortable="custom" align="center" width="80" :class-name="getSortClass('id')"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> </template> @@ -375,6 +375,14 @@ export default { return v[j] } })) + }, + getSortClass: function(key) { + const sort = this.listQuery.sort + return sort === `+${key}` + ? 'ascending' + : sort === `-${key}` + ? 'descending' + : '' } } }