Преглед на файлове

Merge branch 'superman' of http://git.shengws.com/zhangbj/xt_vue into superman

csx преди 6 години
родител
ревизия
13488cf93f
променени са 100 файла, в които са добавени 8177 реда и са изтрити 220 реда
  1. 2 2
      config/dev.env.js
  2. 2 2
      config/sit.env.js
  3. 8 1
      index.html
  4. 9 0
      src/api/district.js
  5. 32 0
      src/api/org/orginfo.js
  6. 80 0
      src/components/Neditor/index.vue
  7. 19 25
      src/router/index.js
  8. 26 0
      src/router/modules/org.js
  9. 115 161
      src/router/modules/stock.js
  10. 26 0
      src/store/modules/xt_user.js
  11. 33 7
      src/views/layout/components/Navbar.vue
  12. 9 0
      src/views/layout/components/TagsView.vue
  13. 4 0
      src/xt_pages/dialysis/batch_print/batch_print_order.vue
  14. 24 15
      src/xt_pages/dialysis/details/dialog/assessmentBeforeDislysisDialog.vue
  15. 11 1
      src/xt_pages/dialysis/dialysisPrintOrder.vue
  16. 4 2
      src/xt_pages/home/index.vue
  17. 621 0
      src/xt_pages/home/modifyOrgInfoDialog.vue
  18. 47 0
      src/xt_pages/org/README.md
  19. 610 0
      src/xt_pages/org/orginfo.vue
  20. 1 0
      src/xt_pages/stock/config/goodInfo.vue
  21. 0 1
      src/xt_pages/stock/stockInOrderAdd.vue
  22. 3 3
      src/xt_pages/user/components/PatientDetail.vue
  23. 168 0
      static/neditor/README.md
  24. 40 0
      static/neditor/dialogs/anchor/anchor.html
  25. 682 0
      static/neditor/dialogs/attachment/attachment.css
  26. 60 0
      static/neditor/dialogs/attachment/attachment.html
  27. 775 0
      static/neditor/dialogs/attachment/attachment.js
  28. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_chm.gif
  29. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_default.png
  30. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_doc.gif
  31. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_exe.gif
  32. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_jpg.gif
  33. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_mp3.gif
  34. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_mv.gif
  35. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_pdf.gif
  36. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_ppt.gif
  37. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_psd.gif
  38. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_rar.gif
  39. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_txt.gif
  40. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_xls.gif
  41. BIN
      static/neditor/dialogs/attachment/images/alignicon.gif
  42. BIN
      static/neditor/dialogs/attachment/images/alignicon.png
  43. BIN
      static/neditor/dialogs/attachment/images/bg.png
  44. BIN
      static/neditor/dialogs/attachment/images/file-icons.gif
  45. BIN
      static/neditor/dialogs/attachment/images/file-icons.png
  46. BIN
      static/neditor/dialogs/attachment/images/icons.gif
  47. BIN
      static/neditor/dialogs/attachment/images/icons.png
  48. BIN
      static/neditor/dialogs/attachment/images/image.png
  49. BIN
      static/neditor/dialogs/attachment/images/progress.png
  50. BIN
      static/neditor/dialogs/attachment/images/success.gif
  51. BIN
      static/neditor/dialogs/attachment/images/success.png
  52. 97 0
      static/neditor/dialogs/background/background.css
  53. 56 0
      static/neditor/dialogs/background/background.html
  54. 376 0
      static/neditor/dialogs/background/background.js
  55. BIN
      static/neditor/dialogs/background/images/bg.png
  56. BIN
      static/neditor/dialogs/background/images/success.png
  57. 65 0
      static/neditor/dialogs/charts/chart.config.js
  58. 165 0
      static/neditor/dialogs/charts/charts.css
  59. 89 0
      static/neditor/dialogs/charts/charts.html
  60. 519 0
      static/neditor/dialogs/charts/charts.js
  61. BIN
      static/neditor/dialogs/charts/images/charts0.png
  62. BIN
      static/neditor/dialogs/charts/images/charts1.png
  63. BIN
      static/neditor/dialogs/charts/images/charts2.png
  64. BIN
      static/neditor/dialogs/charts/images/charts3.png
  65. BIN
      static/neditor/dialogs/charts/images/charts4.png
  66. BIN
      static/neditor/dialogs/charts/images/charts5.png
  67. 43 0
      static/neditor/dialogs/emotion/emotion.css
  68. 54 0
      static/neditor/dialogs/emotion/emotion.html
  69. 186 0
      static/neditor/dialogs/emotion/emotion.js
  70. BIN
      static/neditor/dialogs/emotion/images/0.gif
  71. BIN
      static/neditor/dialogs/emotion/images/bface.gif
  72. BIN
      static/neditor/dialogs/emotion/images/cface.gif
  73. BIN
      static/neditor/dialogs/emotion/images/fface.gif
  74. BIN
      static/neditor/dialogs/emotion/images/jxface2.gif
  75. BIN
      static/neditor/dialogs/emotion/images/neweditor-tab-bg.png
  76. BIN
      static/neditor/dialogs/emotion/images/tface.gif
  77. BIN
      static/neditor/dialogs/emotion/images/wface.gif
  78. BIN
      static/neditor/dialogs/emotion/images/yface.gif
  79. 272 0
      static/neditor/dialogs/fonts/buttoniconex.css
  80. BIN
      static/neditor/dialogs/fonts/iconfont.eot
  81. 398 0
      static/neditor/dialogs/fonts/iconfont.svg
  82. BIN
      static/neditor/dialogs/fonts/iconfont.ttf
  83. BIN
      static/neditor/dialogs/fonts/iconfont.woff
  84. 1 0
      static/neditor/dialogs/fonts/images/addfile.svg
  85. 1 0
      static/neditor/dialogs/fonts/images/selected.svg
  86. 106 0
      static/neditor/dialogs/gmap/gmap.html
  87. 7 0
      static/neditor/dialogs/help/help.css
  88. 82 0
      static/neditor/dialogs/help/help.html
  89. 56 0
      static/neditor/dialogs/help/help.js
  90. 936 0
      static/neditor/dialogs/image/image.css
  91. 127 0
      static/neditor/dialogs/image/image.html
  92. 1130 0
      static/neditor/dialogs/image/image.js
  93. BIN
      static/neditor/dialogs/image/images/alignicon.jpg
  94. BIN
      static/neditor/dialogs/image/images/bg.png
  95. BIN
      static/neditor/dialogs/image/images/icons.gif
  96. BIN
      static/neditor/dialogs/image/images/icons.png
  97. BIN
      static/neditor/dialogs/image/images/image.png
  98. BIN
      static/neditor/dialogs/image/images/progress.png
  99. BIN
      static/neditor/dialogs/image/images/success.gif
  100. 0 0
      static/neditor/dialogs/image/images/success.png

+ 2 - 2
config/dev.env.js Целия файл

@@ -11,6 +11,6 @@ module.exports = {
11 11
   SSO_HOST: '"http://testsso.sgjyun.com"',
12 12
   SRCM_HOST: '"http://test1.sgjyun.com"',
13 13
   XT_HOST: '"http://xt.test.sgjyun.com"',
14
-  MIRCO_MALL_HOST: '"http://mall.sgjyun.com"',
15
-  CDM_HOST: '"http://cdm.sgjyun.com"',
14
+  MIRCO_MALL_HOST: '"http://mall.test.sgjyun.com"',
15
+  CDM_HOST: '"http://cdm.test.sgjyun.com"',
16 16
 }

+ 2 - 2
config/sit.env.js Целия файл

@@ -6,6 +6,6 @@ module.exports = {
6 6
   SSO_HOST: '"http://testsso.sgjyun.com"',
7 7
   SRCM_HOST: '"http://test1.sgjyun.com"',
8 8
   XT_HOST: '"http://xt.test.sgjyun.com"',
9
-  MIRCO_MALL_HOST: '"http://mall.sgjyun.com"',
10
-  CDM_HOST: '"http://cdm.sgjyun.com"',
9
+  MIRCO_MALL_HOST: '"http://mall.test.sgjyun.com"',
10
+  CDM_HOST: '"http://cdm.test.sgjyun.com"',
11 11
 }

+ 8 - 1
index.html Целия файл

@@ -8,7 +8,14 @@
8 8
     <title>血透管理-酷医云</title>
9 9
   </head>
10 10
   <body>
11
-    <script src=<%= htmlWebpackPlugin.options.path %>/tinymce4.7.5/tinymce.min.js></script>
11
+      <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
12
+    <script src="<%= htmlWebpackPlugin.options.path %>/tinymce4.7.5/tinymce.min.js"></script>
13
+    <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.config.js"></script>
14
+    <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.all.min.js"></script>
15
+    <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.service.js"></script>
16
+    <script src="<%= htmlWebpackPlugin.options.path %>/neditor/i18n/zh-cn/zh-cn.js"></script>
17
+    <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.parse.min.js"></script>
18
+
12 19
     <div id="app"></div>
13 20
     <!-- built files will be auto injected -->
14 21
   </body>

+ 9 - 0
src/api/district.js Целия файл

@@ -0,0 +1,9 @@
1
+import request from '@/utils/request'
2
+
3
+export function GetDistrictsByUpid(params){
4
+    return request({
5
+        url:'/api/district/getdistrictsbyupid',
6
+        method:'get',
7
+        params: params
8
+    })
9
+}

+ 32 - 0
src/api/org/orginfo.js Целия файл

@@ -0,0 +1,32 @@
1
+import request from '@/utils/request'
2
+
3
+export function GetOrgInfo(){
4
+    return request({
5
+        url:'/api/orginfo/getinfo',
6
+        method:'get',
7
+    })
8
+}
9
+
10
+export function SaveOrgGallery(data){
11
+    return request({
12
+        url:'/api/orginfo/savegallery',
13
+        method:'Post',
14
+        data:data,
15
+    })
16
+}
17
+
18
+export function EditOrgInfo(data){
19
+    return request({
20
+        url:'/api/orginfo/edit',
21
+        method:'Post',
22
+        data:data,
23
+    })
24
+}
25
+
26
+export function DeleteOrgGallery(id){
27
+    return request({
28
+        url:'/api/orginfo/deletegallery',
29
+        method:'delete',
30
+        params:{id:id},
31
+    })
32
+}

+ 80 - 0
src/components/Neditor/index.vue Целия файл

@@ -0,0 +1,80 @@
1
+<template>
2
+    <div>
3
+        <div :id="this.id"></div>
4
+    </div>
5
+</template>
6
+
7
+<script>
8
+
9
+
10
+export default {
11
+    name:"Neditor",
12
+    props: ['id','r_content'],
13
+    data() {
14
+        return {
15
+            ue: '', //ueditor实例
16
+            content: '', //编辑器内容
17
+        }
18
+    },
19
+    methods: {
20
+        //初始化编辑器
21
+        initEditor() {
22
+            this.ue = UE.getEditor(this.id, {
23
+                initialFrameWidth: '100%',
24
+                initialFrameHeight: '350',
25
+                topOffset:'110',
26
+                // scaleEnabled: true,
27
+            })
28
+            //编辑器准备就绪后会触发该事件
29
+            this.ue.addListener('ready',()=>{
30
+                //设置可以编辑
31
+                this.ue.setEnabled()
32
+                this.ue.setContent(this.r_content)
33
+            })
34
+            //编辑器内容修改时
35
+            this.selectionchange()
36
+        },
37
+        
38
+        //编辑器内容修改时
39
+        selectionchange() {
40
+            this.ue.addListener('selectionchange', () => {
41
+                this.content = this.ue.getContent()
42
+            })
43
+        },
44
+
45
+    },
46
+
47
+    activated() {
48
+        //初始化编辑器
49
+        this.initEditor()
50
+    },
51
+    deactivated() {
52
+        //销毁编辑器实例,使用textarea代替
53
+        this.ue.destroy()
54
+        //重置编辑器,可用来做多个tab使用同一个编辑器实例
55
+        //this.ue.reset()
56
+        //如果要使用同一个实例,请注释destroy()方法
57
+    },
58
+
59
+    computed:{
60
+        // 利用计算属性返回prop里传过来的内容
61
+        revecive:function(){
62
+            return this.r_content
63
+        }
64
+    },
65
+
66
+    watch:{
67
+        // !!! 这里需要注意,需要一个watch来实时更新编辑器的内容
68
+        revecive:function(){
69
+            this.ue.setContent(this.r_content)
70
+        }
71
+    }
72
+}
73
+</script>
74
+
75
+
76
+<style>
77
+  .edui-editor {
78
+      z-index: 60 !important;
79
+  }
80
+</style>

+ 19 - 25
src/router/index.js Целия файл

@@ -1,10 +1,10 @@
1 1
 import Vue from 'vue'
2 2
 import Router from 'vue-router'
3
-
4 3
 Vue.use(Router)
5 4
 
6 5
 /* Layout */
7 6
 import Layout from '@/views/layout/Layout'
7
+
8 8
 import data_dict from './modules/data_dict'
9 9
 import device from './modules/device'
10 10
 import dialysis from './modules/dialysis'
@@ -15,6 +15,7 @@ import stock from './modules/stock'
15 15
 import weight_sign from './modules/weight_sign'
16 16
 import workforce from './modules/workforce'
17 17
 import service from './modules/service'
18
+import org from './modules/org'
18 19
 
19 20
 /** note: submenu only apppear when children.length>=1
20 21
  *   detail see  https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
@@ -74,33 +75,25 @@ var _constant_router_map = [{
74 75
 service
75 76
 ]
76 77
 
77
-var _asy_router_map = []
78
+var _asy_router_map = [
79
+  patient,
80
+  workforce,
81
+  weight_sign,
82
+  dialysis,
83
+  stock,
84
+  qcd,
85
+  data_dict,
86
+  device,
87
+  role,
88
+  org
89
+]
78 90
 
79 91
 var is_asy_router = process.env.NODE_ENV === 'production' // true; 设置为 true 强制进行路由验证
80
-if (is_asy_router) {
81
-  var _asy_router_map = [
82
-    patient,
83
-    workforce,
84
-    weight_sign,
85
-    dialysis,
86
-    stock,
87
-    qcd,
88
-    data_dict,
89
-    device,
90
-    role
91
-  ]
92
+if (!is_asy_router) {
93
+  _constant_router_map = _constant_router_map.concat(_asy_router_map)
94
+  _asy_router_map = []
92 95
 } else {
93
-  _constant_router_map = _constant_router_map.concat([
94
-    patient,
95
-    workforce,
96
-    weight_sign,
97
-    dialysis,
98
-    stock,
99
-    qcd,
100
-    data_dict,
101
-    device,
102
-    role
103
-  ])
96
+
104 97
 }
105 98
 
106 99
 export const xt_constantRouterMap = _constant_router_map
@@ -113,3 +106,4 @@ export default new Router({
113 106
   }),
114 107
   routes: xt_constantRouterMap
115 108
 })
109
+

+ 26 - 0
src/router/modules/org.js Целия файл

@@ -0,0 +1,26 @@
1
+import Layout from '@/views/layout/Layout'
2
+
3
+export default {
4
+    path: '/orginfo',
5
+    component: Layout,
6
+    hidden: true,
7
+    is_menu: false,
8
+    meta: {
9
+        title: 'orginfo',
10
+        icon: 'shebei'
11
+    },
12
+    children: [
13
+        {
14
+            path: '/orginfo',
15
+            component: () => import('@/xt_pages/org/orginfo'),
16
+            hidden: true,
17
+            is_menu: false,
18
+            name: 'orginfo',
19
+            meta: {
20
+                title: '机构信息',
21
+                icon: 'shebei',
22
+                noCache: true
23
+            }
24
+        }
25
+    ]
26
+}

+ 115 - 161
src/router/modules/stock.js Целия файл

@@ -10,166 +10,120 @@ export default {
10 10
     title: 'stockManage',
11 11
     icon: 'stock'
12 12
   },
13
-  children: [{
14
-    path: '/stock/config',
15
-    component: () => import('@/xt_pages/stock/index'),
16
-    name: 'config',
17
-    meta: {
18
-      title: 'config'
19
-    }
20
-  },
21
-  {
22
-    path: '/stock/in',
23
-    component: () => import('@/xt_pages/stock/stockInOrder'),
24
-    name: 'stockInOrder',
25
-    meta: {
26
-      title: 'stockInOrder',
27
-      noCache: true
28
-    }
29
-  }, {
30
-    path: '/stock/in/other',
31
-    component: () => import('@/xt_pages/stock/otherStockInOrder'),
32
-    name: 'otherStockInOrder',
33
-    meta: {
34
-      title: 'otherStockInOrder',
35
-      noCache: true
36
-    }
37
-  }, {
38
-    path: '/stock/return',
39
-    component: () => import('@/xt_pages/stock/salesReturnOrder'),
40
-    name: 'salesReturnOrder',
41
-    meta: {
42
-      title: 'salesReturnOrder',
43
-      noCache: true
44
-    }
45
-  }, {
46
-    path: '/stock/return/other',
47
-    component: () => import('@/xt_pages/stock/otherSalesReturnOrder'),
48
-    name: 'otherSalesReturnOrder',
49
-    meta: {
50
-      title: 'otherSalesReturnOrder',
51
-      noCache: true
52
-    }
53
-  },
54
-  {
55
-    path: '/stock/out',
56
-    component: () => import('@/xt_pages/stock/stockOutOrder'),
57
-    name: 'stockOutOrder',
58
-    meta: {
59
-      title: 'stockOutOrder',
60
-      noCache: true
61
-    }
62
-  }, {
63
-    path: '/stock/out/other',
64
-    component: () => import('@/xt_pages/stock/otherStockOutOrder'),
65
-    name: 'otherStockOutOrder',
66
-    meta: {
67
-      title: 'otherStockOutOrder',
68
-      noCache: true
69
-    }
70
-  }, {
71
-    path: '/stock/cancel',
72
-    component: () => import('@/xt_pages/stock/cancelStockOrder'),
73
-    name: 'cancelStockOrder',
74
-    meta: {
75
-      title: 'cancelStockOrder',
76
-      noCache: true
77
-    }
78
-  }, {
79
-    path: '/stock/cancel/other',
80
-    component: () => import('@/xt_pages/stock/otherCancelStockOrder'),
81
-    name: 'otherCancelStockOrder',
82
-    meta: {
83
-      title: 'otherCancelStockOrder',
84
-      noCache: true
85
-    }
86
-  }, {
87
-    path: '/stock/query',
88
-    component: () => import('@/xt_pages/stock/stockQuery'),
89
-    name: 'stockQuery',
90
-    meta: {
91
-      title: 'stockQuery'
92
-    }
93
-  }, {
94
-    path: '/stock/detail',
95
-    component: () => import('@/xt_pages/stock/stockDetailIndex'),
96
-    name: 'stockDetail',
97
-    meta: {
98
-      title: 'stockDetail'
99
-    }
100
-  },
101
-  {
102
-    path: '/stock/in/add',
103
-    component: () => import('@/xt_pages/stock/stockInOrderAdd'),
104
-    name: 'stockInOrderAdd',
105
-    hidden: true,
106
-    is_menu: false,
107
-    meta: {
108
-      title: 'stockInOrderAdd'
109
-    }
110
-  }, {
111
-    path: '/stock/in/detail',
112
-    component: () => import('@/xt_pages/stock/stockInDetail'),
113
-    name: 'stockInDetail',
114
-    hidden: true,
115
-    is_menu: false,
116
-    meta: {
117
-      title: 'stockInDetail'
118
-    }
119
-  }, {
120
-    path: '/stock/return/detail',
121
-    component: () => import('@/xt_pages/stock/salesReturnDetail'),
122
-    name: 'salesReturnDetail',
123
-    hidden: true,
124
-    is_menu: false,
125
-    meta: {
126
-      title: 'salesReturnDetail'
127
-    }
128
-  }, {
129
-    path: '/stock/return/add',
130
-    component: () => import('@/xt_pages/stock/salesReturnOrderAdd'),
131
-    name: 'salesReturnOrderAdd',
132
-    hidden: true,
133
-    is_menu: false,
134
-    meta: {
135
-      title: 'salesReturnOrderAdd'
136
-    }
137
-  }, {
138
-    path: '/stock/out/add',
139
-    component: () => import('@/xt_pages/stock/stockOutOrderAdd'),
140
-    name: 'stockOutOrderAdd',
141
-    hidden: true,
142
-    is_menu: false,
143
-    meta: {
144
-      title: 'stockOutOrderAdd'
145
-    }
146
-  }, {
147
-    path: '/stock/out/detail',
148
-    component: () => import('@/xt_pages/stock/stockOutDetail'),
149
-    name: 'stockOutDetail',
150
-    hidden: true,
151
-    is_menu: false,
152
-    meta: {
153
-      title: 'stockOutDetail'
154
-    }
155
-  }, {
156
-    path: '/stock/cancel/add',
157
-    component: () => import('@/xt_pages/stock/cancelStockOrderAdd'),
158
-    name: 'cancelStockOrderAdd',
159
-    hidden: true,
160
-    is_menu: false,
161
-    meta: {
162
-      title: 'cancelStockOrderAdd'
163
-    }
164
-  }, {
165
-    path: '/stock/cancel/detail',
166
-    component: () => import('@/xt_pages/stock/cancelStockDetail'),
167
-    name: 'cancelStockDetail',
168
-    hidden: true,
169
-    is_menu: false,
170
-    meta: {
171
-      title: 'cancelStockDetail'
172
-    }
173
-  }
13
+  children: [
14
+        {
15
+          path: '/stock/in',
16
+          component: () => import('@/xt_pages/stock/stockInOrder'),
17
+          name: 'stockInOrder',
18
+          meta: { title: 'stockInOrder', noCache: true }
19
+        }, {
20
+          path: '/stock/return',
21
+          component: () => import('@/xt_pages/stock/salesReturnOrder'),
22
+          name: 'salesReturnOrder',
23
+          meta: { title: 'salesReturnOrder', noCache: true }
24
+        }, 
25
+        {
26
+          path: '/stock/out',
27
+          component: () => import('@/xt_pages/stock/stockOutOrder'),
28
+          name: 'stockOutOrder',
29
+          meta: { title: 'stockOutOrder', noCache: true }
30
+        },  {
31
+          path: '/stock/cancel',
32
+          component: () => import('@/xt_pages/stock/cancelStockOrder'),
33
+          name: 'cancelStockOrder',
34
+          meta: { title: 'cancelStockOrder', noCache: true }
35
+        },{
36
+          path: '/stock/in/other',
37
+          component: () => import('@/xt_pages/stock/otherStockInOrder'),
38
+          name: 'otherStockInOrder',
39
+          meta: { title: 'otherStockInOrder', noCache: true }
40
+        }, {
41
+          path: '/stock/return/other',
42
+          component: () => import('@/xt_pages/stock/otherSalesReturnOrder'),
43
+          name: 'otherSalesReturnOrder',
44
+          meta: { title: 'otherSalesReturnOrder', noCache: true }
45
+        },{
46
+          path: '/stock/out/other',
47
+          component: () => import('@/xt_pages/stock/otherStockOutOrder'),
48
+          name: 'otherStockOutOrder',
49
+          meta: { title: 'otherStockOutOrder', noCache: true }
50
+        }, {
51
+          path: '/stock/cancel/other',
52
+          component: () => import('@/xt_pages/stock/otherCancelStockOrder'),
53
+          name: 'otherCancelStockOrder',
54
+          meta: { title: 'otherCancelStockOrder', noCache: true }
55
+        }, {
56
+          path: '/stock/query',
57
+          component: () => import('@/xt_pages/stock/stockQuery'),
58
+          name: 'stockQuery',
59
+          meta: { title: 'stockQuery' }
60
+        }, {
61
+          path: '/stock/detail',
62
+          component: () => import('@/xt_pages/stock/stockDetailIndex'),
63
+          name: 'stockDetail',
64
+          meta: { title: 'stockDetail' }
65
+        },{
66
+          path: '/stock/in/add',
67
+          component: () => import('@/xt_pages/stock/stockInOrderAdd'),
68
+          name: 'stockInOrderAdd',
69
+          hidden: true,
70
+          is_menu: false,
71
+          meta: { title: 'stockInOrderAdd' }
72
+        }, {
73
+          path: '/stock/in/detail',
74
+          component: () => import('@/xt_pages/stock/stockInDetail'),
75
+          name: 'stockInDetail',
76
+          hidden: true,
77
+          is_menu: false,
78
+          meta: { title: 'stockInDetail' }
79
+        }, {
80
+          path: '/stock/return/detail',
81
+          component: () => import('@/xt_pages/stock/salesReturnDetail'),
82
+          name: 'salesReturnDetail',
83
+          hidden: true,
84
+          is_menu: false,
85
+          meta: { title: 'salesReturnDetail' }
86
+        }, {
87
+          path: '/stock/return/add',
88
+          component: () => import('@/xt_pages/stock/salesReturnOrderAdd'),
89
+          name: 'salesReturnOrderAdd',
90
+          hidden: true,
91
+          is_menu: false,
92
+          meta: { title: 'salesReturnOrderAdd' }
93
+        }, {
94
+          path: '/stock/out/add',
95
+          component: () => import('@/xt_pages/stock/stockOutOrderAdd'),
96
+          name: 'stockOutOrderAdd',
97
+          hidden: true,
98
+          is_menu: false,
99
+          meta: { title: 'stockOutOrderAdd', noCache: true }
100
+        }, {
101
+          path: '/stock/out/detail',
102
+          component: () => import('@/xt_pages/stock/stockOutDetail'),
103
+          name: 'stockOutDetail',
104
+          hidden: true,
105
+          is_menu: false,
106
+          meta: { title: 'stockOutDetail', noCache: true }
107
+        }, {
108
+          path: '/stock/cancel/add',
109
+          component: () => import('@/xt_pages/stock/cancelStockOrderAdd'),
110
+          name: 'cancelStockOrderAdd',
111
+          hidden: true,
112
+          is_menu: false,
113
+          meta: { title: 'cancelStockOrderAdd', noCache: true }
114
+        }, {
115
+          path: '/stock/cancel/detail',
116
+          component: () => import('@/xt_pages/stock/cancelStockDetail'),
117
+          name: 'cancelStockDetail',
118
+          hidden: true,
119
+          is_menu: false,
120
+          meta: { title: 'cancelStockDetail', noCache: true }
121
+        },
122
+        {
123
+          path: '/stock/config',
124
+          component: () => import('@/xt_pages/stock/index'),
125
+          name: 'config',
126
+          meta: { title: 'config' }
127
+        }
174 128
   ]
175 129
 }

+ 26 - 0
src/store/modules/xt_user.js Целия файл

@@ -93,6 +93,10 @@ const xt_user = {
93 93
       state.user.user_name = payload.user_name
94 94
       state.user.avatar = payload.avatar
95 95
     },
96
+    MODIFY_ORG_INFO:(state, payload) => {
97
+      state.org.org_name = payload.org_name
98
+      state.org.org_short_name = payload.org_short_name
99
+    },
96 100
 
97 101
     SET_SUBSCIBE_PATIENT: (state) => {
98 102
       state.subscibe.patients += 1
@@ -230,6 +234,28 @@ const xt_user = {
230 234
         })
231 235
       )
232 236
     },
237
+    ModifyOrgInfo({
238
+      commit,
239
+      state
240
+    }, params) {
241
+      commit('MODIFY_ORG_INFO', {
242
+        org_name: params.org_name,
243
+        org_short_name: params.org_short_name
244
+      })
245
+      cacheAdminUserInfo(
246
+        JSON.stringify({
247
+          user: state.user,
248
+          org: state.org,
249
+          current_org_id: state.org_id,
250
+          current_app_id: state.app_id,
251
+          urlfors: state.urlfors,
252
+          subscibe: state.subscibe,
253
+          scrm_role_exist: state.scrm_role_exist,
254
+          cdm_role_exist: state.cdm_role_exist,
255
+          mall_role_exist: state.mall_role_exist
256
+        })
257
+      )
258
+    },
233 259
 
234 260
     // InitAdminUserInfo( {commit, state} ) {
235 261
     //   var cacheInfo = getAdminUserInfoCache()

+ 33 - 7
src/views/layout/components/Navbar.vue Целия файл

@@ -38,27 +38,33 @@
38 38
       </div>
39 39
 
40 40
       <div class="right-menu">
41
-        <el-dropdown class="avatar-container right-menu-item" trigger="click">
41
+        <el-dropdown class="avatar-container right-menu-item" trigger="click"  @command="handleCommand">
42 42
           <div class="avatar-wrapper">
43 43
             <img class="user-avatar" :src="avater">
44 44
             <span class="user-title">{{ this.$store.getters.xt_user.user.user_name }}</span>
45 45
             <i class="el-icon-caret-bottom"></i>
46 46
           </div>
47 47
           <el-dropdown-menu slot="dropdown">
48
-            <el-dropdown-item>
49
-              <span @click="modifyUserInfoAction">修改个人信息</span>
48
+            <el-dropdown-item command="modifyUserInfoAction">
49
+              修改个人信息
50
+              <!-- <span @click="modifyUserInfoAction">修改个人信息</span> -->
51
+            </el-dropdown-item>
52
+            <el-dropdown-item command="modifyOrgInfoAction">
53
+              机构信息
50 54
             </el-dropdown-item>
51 55
             <!-- <el-dropdown-item divided>
52 56
               <span @click="myServe">我的服务</span>
53 57
             </el-dropdown-item> -->
54
-            <el-dropdown-item divided>
55
-              <span @click="logout" style="display:block;">{{$t('navbar.logOut')}}</span>
58
+            <el-dropdown-item divided command="logout">
59
+              {{$t('navbar.logOut')}}
60
+              <!-- <span @click="logout" style="display:block;">{{$t('navbar.logOut')}}</span> -->
56 61
             </el-dropdown-item>
57 62
           </el-dropdown-menu>
58 63
         </el-dropdown>
59 64
 
60 65
         <!-- <screenfull class="screenfull right-menu-item"></screenfull> -->
61 66
         <modify-user-info-dialog ref="modify_user_info_dialog"></modify-user-info-dialog>
67
+        <modify-org-info-dialog ref="modify_org_info_dialog"></modify-org-info-dialog>
62 68
 
63 69
       </div>
64 70
     </el-menu>
@@ -71,6 +77,7 @@
71 77
   // import Hamburger from "@/components/Hamburger";
72 78
   import Screenfull from '@/components/Screenfull'
73 79
   import ModifyUserInfoDialog from '@/xt_pages/home/modify_user_info_dialog'
80
+  import ModifyOrgInfoDialog from '@/xt_pages/home/modifyOrgInfoDialog'
74 81
 
75 82
   export default {
76 83
     data() {
@@ -82,7 +89,8 @@
82 89
       // Breadcrumb,
83 90
       // Hamburger,
84 91
       Screenfull,
85
-      ModifyUserInfoDialog
92
+      ModifyUserInfoDialog,
93
+      ModifyOrgInfoDialog,
86 94
     },
87 95
     computed: {
88 96
       ...mapGetters(['sidebar']),
@@ -97,10 +105,28 @@
97 105
       // toggleSideBar() {
98 106
       //   this.$store.dispatch("toggleSideBar");
99 107
       // },
108
+      handleCommand(command){
109
+        switch (command) {
110
+          case 'modifyUserInfoAction':
111
+            this.modifyUserInfoAction();
112
+            break;
113
+          case 'modifyOrgInfoAction':
114
+            this.modifyOrgInfoAction();
115
+            break;
116
+          case 'logout':
117
+            this.logout();
118
+            break;
119
+        }
120
+      },
100 121
       logout() {
101 122
         this.$store.dispatch('FrontendLogout')
102 123
         window.location.href = process.env.BASE_API + '/logout'
103 124
       },
125
+      modifyOrgInfoAction() {
126
+        // this.$refs.modify_org_info_dialog.show()
127
+        this.$router.push('/orginfo')
128
+        return false
129
+      },
104 130
       modifyUserInfoAction() {
105 131
         this.$refs.modify_user_info_dialog.show()
106 132
       },
@@ -109,7 +135,7 @@
109 135
         return false
110 136
       },
111 137
       SCRMWebsit() {
112
-        return process.env.SCRM_HOST
138
+        return process.env.SRCM_HOST
113 139
       },
114 140
       MircoMallWebsit() {
115 141
         return process.env.MIRCO_MALL_HOST

+ 9 - 0
src/views/layout/components/TagsView.vue Целия файл

@@ -133,6 +133,10 @@ export default {
133 133
     z-index: 1000;
134 134
     top: 60px;
135 135
     overflow-x: scroll;
136
+    white-space: normal;
137
+    right: 0;
138
+    left: 150px;
139
+    
136 140
     /* 针对缺省样式 (必须的) */
137 141
       &::-webkit-scrollbar {
138 142
         width: 6px;
@@ -223,6 +227,11 @@ export default {
223 227
     }
224 228
   }
225 229
 }
230
+.scroll-wrapper{
231
+      right: 0;
232
+      position: fixed!important;
233
+      
234
+}
226 235
 </style>
227 236
 
228 237
 <style rel="stylesheet/scss" lang="scss">

+ 4 - 0
src/xt_pages/dialysis/batch_print/batch_print_order.vue Целия файл

@@ -99,6 +99,10 @@
99 99
                                             <check-box text="直穿" :checked="isBbloodAccessParOperaCheck(record.assessment_before_dislysis, '直穿')"></check-box>
100 100
                                             <check-box text="颈内静脉" :checked="isBbloodAccessParOperaCheck(record.assessment_before_dislysis, '颈内静脉')"></check-box>
101 101
                                             <check-box text="股静脉" :checked="isBbloodAccessParOperaCheck(record.assessment_before_dislysis, '股静脉')"></check-box>
102
+                                            <check-box text="锁骨下" :checked="isBbloodAccessParOperaCheck(record.assessment_before_dislysis, '锁骨下')"></check-box>
103
+                                        </div>
104
+                                        <div class="inline_block">
105
+                                            穿刺方法:<div class="under_line" style="width: 300px;">{{ record.assessment_before_dislysis?record.assessment_before_dislysis.puncture_method:''}}</div>
102 106
                                         </div>
103 107
                                     </div>
104 108
                                     <div class="row" style="padding: 2px 0;">

+ 24 - 15
src/xt_pages/dialysis/details/dialog/assessmentBeforeDislysisDialog.vue Целия файл

@@ -130,35 +130,40 @@
130 130
 
131 131
 
132 132
       <el-row :gutter="20">
133
+        <el-col :span="8">
134
+          <el-form-item label="穿刺方法: ">
135
+            
136
+            <el-select v-model="assessmentBeforeDislysis.puncture_method">
137
+              <el-option v-for="item in puncture_method" :label="item.name" :value="item.name"
138
+                         :key="item.id"></el-option>
139
+            </el-select>
140
+
141
+          </el-form-item>
142
+        </el-col>
143
+
133 144
         <el-col :span="8">
134 145
           <el-form-item label="并发症: ">
135 146
             <el-input v-model="assessmentBeforeDislysis.complication" @focus="showInnerDialog('5')"></el-input>
136 147
           </el-form-item>
137 148
         </el-col>
138
-
139
-
140 149
         <el-col :span="8">
141 150
           <el-form-item label="前次透析后:">
142 151
             <el-input v-model="assessmentBeforeDislysis.last_post_dialysis" @focus="showInnerDialog('1')"></el-input>
143 152
           </el-form-item>
144 153
         </el-col>
154
+
155
+      </el-row>
156
+
157
+      <el-row :gutter="20">
145 158
         <el-col :span="8">
146 159
           <el-form-item label="透析期间: ">
147
-
148 160
             <el-input v-model="assessmentBeforeDislysis.dialysis_interphase" @focus="showInnerDialog('2')">></el-input>
149
-
150
-
151 161
           </el-form-item>
152 162
         </el-col>
153
-
154
-      </el-row>
155
-
156
-      <el-row :gutter="20">
157 163
         <el-col :span="8">
158 164
           <el-form-item label="透析前症状: ">
159 165
             <el-input v-model="assessmentBeforeDislysis.symptom_before_dialysis"
160 166
                       @focus="showInnerDialog('3')"></el-input>
161
-
162 167
           </el-form-item>
163 168
         </el-col>
164 169
 
@@ -171,6 +176,10 @@
171 176
           </el-form-item>
172 177
         </el-col>
173 178
 
179
+      </el-row>
180
+
181
+      <el-row :gutter="20">
182
+
174 183
         <el-col :span="8" v-if="assessmentBeforeDislysis.is_hemorrhage == 1">
175 184
           <el-form-item label="出血选项: ">
176 185
             <div>
@@ -178,10 +187,6 @@
178 187
             </div>
179 188
           </el-form-item>
180 189
         </el-col>
181
-
182
-      </el-row>
183
-
184
-      <el-row :gutter="20">
185 190
         <el-col :span="8" v-if="assessmentBeforeDislysis.is_hemorrhage == 1">
186 191
           <el-form-item label="其他出血情况: ">
187 192
             <el-input v-model="assessmentBeforeDislysis.hemorrhage_other"></el-input>
@@ -235,6 +240,7 @@ export default {
235 240
         blood_access_part_opera: [],
236 241
         internal_fistula: [],
237 242
         internal_fistula_skin: [],
243
+        puncture_method:[],
238 244
         isVisibiltyForCruorDialog: false,
239 245
         assessmentBeforeDislysis: {
240 246
           catheter_bend: '',
@@ -257,7 +263,8 @@ export default {
257 263
           internal_fistula: '',
258 264
           is_hemorrhage: '',
259 265
           hemorrhage: '',
260
-          hemorrhage_other: ''
266
+          hemorrhage_other: '',
267
+          puncture_method:'',
261 268
         },
262 269
         // InnerDialogProps: {
263 270
         //   checkedCities: [],
@@ -456,6 +463,8 @@ export default {
456 463
       this.blood_access_part = getDataConfig('hemodialysis', 'vascular_access')
457 464
       this.blood_access_part_opera = getDataConfig('hemodialysis', 'vascular_access_desc')
458 465
       this.internal_fistula_skin = getDataConfig('hemodialysis', 'internal_fistula_skin')
466
+      this.puncture_method = getDataConfig('hemodialysis', 'puncture_method')
467
+      
459 468
       var date = this.$route.query && this.$route.query.date
460 469
       this.record_date = uParseTime(date, '{y}-{m}-{d}')
461 470
   }, watch: {

+ 11 - 1
src/xt_pages/dialysis/dialysisPrintOrder.vue Целия файл

@@ -196,7 +196,7 @@
196 196
                   <tbody>
197 197
                   <tr>
198 198
                     <td width="70">血管通路:</td>
199
-                    <td width="400">
199
+                    <td width="480">
200 200
                       <div>
201 201
                         <label-box :isChecked="predialysis.blood_access_part_opera_name.indexOf('自体内瘘')>-1?true:false"
202 202
                                    showValue='自体内瘘'></label-box>
@@ -213,6 +213,16 @@
213 213
                         <label-box :isChecked="predialysis.blood_access_part_opera_name.indexOf('股静脉')>-1?true:false"
214 214
                                    showValue='股静脉'></label-box>
215 215
                         &nbsp;
216
+                        <label-box :isChecked="predialysis.blood_access_part_opera_name.indexOf('锁骨下')>-1?true:false"
217
+                                  showValue='锁骨下'></label-box>
218
+                        &nbsp;
219
+                      </div>
220
+                    </td>
221
+                    
222
+                    <td width="65">穿刺方法:</td>
223
+                    <td width="100">
224
+                      <div class="under-line">&nbsp;
225
+                        <span v-if="predialysis.puncture_method">{{predialysis.puncture_method}}</span>
216 226
                       </div>
217 227
                     </td>
218 228
 

+ 4 - 2
src/xt_pages/home/index.vue Целия файл

@@ -42,7 +42,7 @@
42 42
             <li class="taocan-item">
43 43
               <div class="ng-binding" :title="subscibeBan.desc">{{subscibeBan.desc}}</div>
44 44
             </li>
45
-            <li class="taocan-item">
45
+            <!-- <li class="taocan-item">
46 46
               <div class="ng-binding" :title="subscibeBan.detail">{{subscibeBan.detail}}</div>
47 47
             </li>
48 48
             <li class="taocan-item" v-if="this.subscibe.state==3 || this.subscibe.state==2 || leftTime<0">
@@ -56,7 +56,7 @@
56 56
                 <div class="taocan-use clearfix" :style="subscibeBan.pce"></div>
57 57
               </div>
58 58
                 <a class="btn clearfix" v-if="subscibeBan.pay_status" href="javascript:0" @click="openPay">立即购买</a>
59
-            </li>
59
+            </li> -->
60 60
           </ul>
61 61
         </div>
62 62
      </div>
@@ -173,6 +173,8 @@ export default {
173 173
 
174 174
       var leaveTime = 0
175 175
 
176
+      this.subscibe.state = 2;//强制改为免费版
177
+      
176 178
       switch (this.subscibe.state) {
177 179
         case 9:
178 180
           this.subscibeBan = {

+ 621 - 0
src/xt_pages/home/modifyOrgInfoDialog.vue Целия файл

@@ -0,0 +1,621 @@
1
+<template>
2
+    <div>
3
+        <el-dialog  title="机构信息" :modal-append-to-body="false" :append-to-body="true" width="50%" :visible.sync="visible" :before-close="_close" id="edit-org-info-form">
4
+            <el-form ref="form" :model="form" label-width="80px"  v-loading="formloading" :element-loading-text="loadingText">
5
+                <el-form-item label="机构名称:" prop="org_name">
6
+                    <el-input v-model="form.org_name" placeholder="机构名称" ></el-input>
7
+                </el-form-item>
8
+                <el-form-item label="商家简称:" prop="org_short_name">
9
+                    <el-input v-model="form.org_short_name" placeholder="商家简称" ></el-input>
10
+                </el-form-item>
11
+                <el-form-item label="机构介绍:" prop="org_introduction">
12
+                    <!-- <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" placeholder="机构介绍" v-model="form.org_introduction">  </el-input> -->
13
+                    <keep-alive>
14
+                    <neditor ref="neditor" 
15
+                        id="editor" 
16
+                        v-bind:r_content="form.org_introduction">
17
+                    </neditor>
18
+                </keep-alive>
19
+                </el-form-item>
20
+                <el-form-item label="机构头像:" prop="org_logo">
21
+                    <el-upload
22
+                        v-loading="uploading"
23
+                        :element-loading-text="loadingText"
24
+                        class="avatar-uploader"
25
+                        :data="uploadData"
26
+                        action="https://upload.qiniup.com"
27
+                        :show-file-list="false"
28
+                        :on-error="handleAvatarError"
29
+                        :on-success="handleAvatarSuccess"
30
+                        :before-upload="beforeAvatarUpload">
31
+                        <img v-if="form.org_logo" :src="form.org_logo" class="avatar">
32
+                        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
33
+                    </el-upload>
34
+                </el-form-item>
35
+                <el-form-item label="机构地区:" prop="org_area">
36
+                    <el-select v-model="form.province" clearable filterable placeholder="请选择" @change="changeProvince">
37
+                        <el-option
38
+                        v-for="item in provinces"
39
+                        :key="item.id"
40
+                        :label="item.name"
41
+                        :value="item.id">
42
+                        </el-option>
43
+                    </el-select>
44
+                    <el-select v-model="form.city" v-show="form.province&&citys.length>0" clearable filterable placeholder="请选择" @change="changeCity">
45
+                        <el-option
46
+                        v-for="item in citys"
47
+                        :key="item.id"
48
+                        :label="item.name"
49
+                        :value="item.id">
50
+                        </el-option>
51
+                    </el-select>
52
+                    <el-select v-model="form.district" v-show="form.city&&districts.length>0" clearable filterable placeholder="请选择">
53
+                        <el-option
54
+                        v-for="item in districts"
55
+                        :key="item.id"
56
+                        :label="item.name"
57
+                        :value="item.id">
58
+                        </el-option>
59
+                    </el-select>
60
+                </el-form-item>
61
+                <el-form-item label="机构地址:" prop="address">
62
+                    <el-input v-model="form.address" placeholder="机构地址" ></el-input>
63
+                </el-form-item>
64
+                <el-form-item label="机构类型:" prop="org_type">
65
+                    <el-select v-model="form.parent_type" clearable placeholder="请选择" @change="changeParentType" >
66
+                        <el-option
67
+                        v-for="item in orgtypes"
68
+                        :key="item.id"
69
+                        :label="item.name"
70
+                        :value="item.id">
71
+                        </el-option>
72
+                    </el-select>
73
+                    <el-select v-model="form.child_type" v-show="form.parent_type&&childtypes.length>0" clearable placeholder="请选择" @change="changeChildType">
74
+                        <el-option
75
+                        v-for="item in childtypes"
76
+                        :key="item.id"
77
+                        :label="item.name"
78
+                        :value="item.id">
79
+                        </el-option>
80
+                    </el-select>
81
+                </el-form-item>
82
+                <el-form-item label="机构电话:" prop="telephone">
83
+                    <el-input v-model="form.telephone" placeholder="机构电话" ></el-input>
84
+                </el-form-item>
85
+                <el-form-item label="营业状态:" prop="operating_state">
86
+                    <el-radio-group v-model="form.operating_state" >
87
+                        <el-radio v-for="item in operatingStateOptions" :key="item.value" :label="item.value" :value="item.value" >{{item.label}}</el-radio>
88
+                    </el-radio-group>
89
+                </el-form-item>
90
+                <el-form-item label="营业时间:" prop="business_time">
91
+                    <el-input v-model="form.business_week" placeholder="营业时间" style="width:48%"></el-input> 
92
+                    <el-input v-model="form.business_time" placeholder="营业时间" style="width:48%"></el-input>
93
+                </el-form-item>
94
+                <el-form-item label="" prop="business_time">
95
+                    <el-checkbox-group v-model="form.business_week_select"   @change="handleChangeWeek">
96
+                        <el-checkbox v-for="(item, index) in weekOptions" :label="item" :key="index" :value="item" >{{item}}</el-checkbox>
97
+                    </el-checkbox-group>
98
+                </el-form-item>
99
+                
100
+                <el-form-item label="上午:" prop="business_time">
101
+                    <el-radio-group v-model="form.business_time_shange" @change="handleChangeTime">
102
+                        <el-radio v-for="(item, index)  in shangOptions" :key="index" :label="item" :value="item" >{{item}}</el-radio>
103
+                    </el-radio-group>
104
+                </el-form-item>
105
+                
106
+                <el-form-item label="下午:" prop="business_time_xia">
107
+                    <el-radio-group v-model="form.business_time_xia" @change="handleChangeTime">
108
+                        <el-radio v-for="(item, index)  in xiaOptions" :key="index" :label="item" :value="item" >{{item}}</el-radio>
109
+                    </el-radio-group>
110
+                </el-form-item>
111
+
112
+                <el-form-item label="服务病种:" prop="illness">
113
+                    <el-checkbox-group v-model="form.illness_list"  @change="handleChangeIllness">
114
+                        <el-checkbox v-for="item in illnessOptions" :label="item.id" :key="item.id" :value="item.id" >{{item.illness_name}}</el-checkbox>
115
+                    </el-checkbox-group>
116
+                </el-form-item>
117
+                <el-form-item label="机构图册:" prop="gallery">
118
+                    <el-upload
119
+                        v-loading="guploading"
120
+                        :data="uploadData"
121
+                        action="https://upload.qiniup.com"
122
+                        list-type="picture-card"
123
+                        :file-list="fileList"
124
+                        :on-remove="handleRemove"
125
+                        :on-error="handleGalleryError"
126
+                        :on-success="handleGallerySuccess"
127
+                        :before-upload="beforeGalleryUpload">
128
+                        <i class="el-icon-plus"></i>
129
+                    </el-upload>
130
+                    <el-dialog :visible.sync="dialogVisible">
131
+                        <img width="100%" :src="dialogImageUrl" alt="">
132
+                    </el-dialog>
133
+                </el-form-item>
134
+            </el-form>
135
+            <div slot="footer" class="dialog-footer">
136
+                    <el-button @click="visible=false">取消</el-button>
137
+                    <el-button type="primary" @click="submitForm" :disabled="formsubmit">保存</el-button>
138
+            </div>
139
+        </el-dialog>
140
+    </div>
141
+</template>
142
+<script>
143
+import { getToken } from '@/api/qiniu'
144
+import {GetOrgInfo,SaveOrgGallery,DeleteOrgGallery,EditOrgInfo} from '@/api/org/orginfo';
145
+import {GetDistrictsByUpid} from '@/api/district';
146
+import { getFileExtension} from '@/utils/tools'
147
+import Neditor from '@/components/Neditor'
148
+export default {
149
+    name: "ModifyOrgInfoDialog",
150
+    components:{
151
+        Neditor,
152
+    },
153
+    data(){
154
+        return {
155
+            qiniuDomain: 'https://images.shengws.com/',
156
+            visible:false,
157
+            formloading:false,
158
+            uploading:false,
159
+            guploading:false,
160
+            formsubmit:false,
161
+            loadingText:'',
162
+            illnessList:[],
163
+            fileList:[],
164
+            provinces:[],
165
+            citys:[],
166
+            districts:[],
167
+            orgtypes:[],
168
+            orgtypesMap:{},
169
+            childtypes:[],
170
+            uploadData: { token: '', key: '' },
171
+            operatingStateOptions: [{ value: 1, label: '正常营业' }, { value: 2, label: '暂未营业' }],
172
+            weekOptions:["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"],
173
+            shangOptions:['1:00','2:00','3:00','4:00','5:00','6:00','7:00','8:00','9:00','10:00','11:00','12:00'],
174
+            xiaOptions:['13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00'],
175
+            illnessOptions:[],
176
+            form:{
177
+                org_name:'',
178
+                org_short_name:'',
179
+                org_introduction:'',
180
+                org_logo:'',
181
+                province:'',
182
+                city:'',
183
+                district:'',
184
+                address:'',
185
+                parent_type:'',
186
+                child_type:'',
187
+                org_type:'',
188
+                telephone:'',
189
+                operating_state:'',
190
+                business_week:'',
191
+                business_week_select:[],
192
+                business_time_shange:'',
193
+                business_time_xia:'',
194
+                business_time:'',
195
+                illness:'',
196
+                illness_list:[],
197
+                org_gallery:[],
198
+            },
199
+             myConfig: {
200
+                // 如果需要上传功能,找后端小伙伴要服务器接口地址
201
+                serverUrl: '/api/web/upload/ueditor',
202
+                // 你的UEditor资源存放的路径,相对于打包后的index.html
203
+                UEDITOR_HOME_URL: '/NEditor/',
204
+                // 编辑器不自动被内容撑高
205
+                autoHeightEnabled: false,
206
+                // 初始容器高度
207
+                initialFrameHeight: 240,
208
+                // 初始容器宽度
209
+                initialFrameWidth: '100%',
210
+                // 关闭自动保存
211
+                enableAutoSave: false
212
+            },
213
+            dialogImageUrl: '',
214
+            dialogVisible: false
215
+        }
216
+
217
+    },
218
+    created(){
219
+    },
220
+    methods:{
221
+        _close: function(done) {
222
+            this.clear()
223
+            done()
224
+        },
225
+        clear: function() {
226
+            this.form = {
227
+                org_name:'',
228
+                org_short_name:'',
229
+                org_introduction:'',
230
+                org_logo:'',
231
+                province:'',
232
+                city:'',
233
+                district:'',
234
+                address:'',
235
+                parent_type:'',
236
+                child_type:'',
237
+                org_type:'',
238
+                telephone:'',
239
+                operating_state:'',
240
+                business_week:'',
241
+                business_week_select:[],
242
+                business_time_shange:'',
243
+                business_time_xia:'',
244
+                business_time:'',
245
+                illness:'',
246
+                illness_list:[],
247
+                org_gallery:[],
248
+            };
249
+        },
250
+        show() {
251
+            this.clear()
252
+            this.visible = true
253
+            this.GetOrgInfo();
254
+        },
255
+        hide() {
256
+            this.clear()
257
+            this.visible = false
258
+        },
259
+        handleChangeIllness(values){
260
+            this.form.illness = values.join(',');
261
+        },
262
+        handleChangeWeek(values) {
263
+            var selectweek = [];
264
+            for (const index in values) {
265
+                var item = {id:this.weekOptions.indexOf(values[index]), name:values[index]};
266
+                selectweek.push(item);
267
+            }
268
+            
269
+            if(selectweek.length==0) {
270
+                this.form.business_week = '';
271
+            }else if(selectweek.length==1) {
272
+                this.form.business_week = selectweek[0];
273
+            }else {
274
+                selectweek = selectweek.sort(function (a,b) {
275
+                    return a.id-b.id;
276
+                });
277
+                var blen = selectweek.length;
278
+                if (blen == (selectweek[blen-1].id - selectweek[0].id + 1)) {
279
+                    this.form.business_week = selectweek[0]["name"] + ' — ' + selectweek[blen-1]["name"];
280
+                }else {
281
+                    var tem = [];
282
+                    for (const index in selectweek) {
283
+                        tem.push(selectweek[index].name);
284
+                    }
285
+                    this.form.business_week = tem.join("、")
286
+                }
287
+               
288
+            }
289
+        },
290
+        handleChangeTime(t){
291
+            if(this.form.business_time_shange.length>0 && this.form.business_time_xia.length>0) {
292
+                this.form.business_time = '上午'+this.form.business_time_shange+"—下午"+this.form.business_time_xia;
293
+            }else if (this.form.business_time_shange.length>0) {
294
+                this.form.business_time = '上午'+this.form.business_time_shange;
295
+            }else if (this.form.business_time_xia.length>0) {
296
+                this.form.business_time = "下午"+this.form.business_time_xia;
297
+            }else {
298
+                this.form.business_time = '';
299
+            }
300
+        },
301
+        handleAvatarError(err, file, fileList) {
302
+            this.$message.error(err);
303
+            this.uploading = false;
304
+            return false
305
+        },
306
+        handleAvatarSuccess(res, file) {
307
+            this.form.org_logo = this.qiniuDomain + res.url;
308
+            this.uploading = false;
309
+        },
310
+        beforeAvatarUpload(file) {
311
+            var fileType = file.type
312
+            const isJPG = fileType.indexOf('image') > -1
313
+            const isLt2M = file.size / 1024 / 1024 < 2
314
+
315
+            if (!isJPG) {
316
+                this.$message.error('只能上传图片')
317
+                return false
318
+            }
319
+            if (!isLt2M) {
320
+                this.$message.error('上传头像图片大小不能超过 2MB!')
321
+                return false
322
+            }
323
+
324
+            var date = new Date()
325
+            var ext = getFileExtension(file.name)
326
+            var key = date.getFullYear() + (date.getMonth() + 1) + date.getDate() + date.getHours()  + date.getMinutes()  + date.getSeconds()  +'_o_' + file.uid + '.' + ext;
327
+            this.uploading = true;
328
+            this.loadingText = '机构头像上传中'
329
+
330
+            const _self = this
331
+            return new Promise((resolve, reject) => {
332
+                getToken().then(response => {
333
+                    const token = response.data.data.uptoken
334
+                    _self._data.uploadData.token = token
335
+                    _self._data.uploadData.key = key
336
+                    resolve(true)
337
+                }).catch(err => {
338
+                    reject(false)
339
+                    this.uploading = false;
340
+                })
341
+            })
342
+        },
343
+        handleGalleryError(err, file, fileList) {
344
+            this.$message.error(err);
345
+            this.guploading = false;
346
+            return false
347
+        },
348
+        handleGallerySuccess(res, file) {
349
+            var data = {type:1, url: this.qiniuDomain + res.url};
350
+            SaveOrgGallery(data).then(response=>{
351
+                var res = response.data;
352
+                if (res.state==1) {
353
+                    this.$message.success('上传成功');
354
+                }else {
355
+                    this.$message.error('上传失败');
356
+                }
357
+            }).catch(e=>{});
358
+            this.guploading = false;
359
+        },
360
+        beforeGalleryUpload(file) {
361
+            var fileType = file.type
362
+            const isJPG = fileType.indexOf('image') > -1
363
+            const isLt100M = file.size / 1024 / 1024 < 100
364
+
365
+            if (!isJPG) {
366
+                this.$message.error('只能上传图片')
367
+                return false
368
+            }
369
+            if (!isLt100M) {
370
+                this.$message.error('上传图片大小不能超过 100MB!')
371
+                return false
372
+            }
373
+
374
+            var date = new Date()
375
+            var ext = getFileExtension(file.name)
376
+            var key = date.getFullYear() + (date.getMonth() + 1) + date.getDate() + date.getHours()  + date.getMinutes()  + date.getSeconds()  +'_g_' + file.uid + '.' + ext;
377
+            this.guploading = true;
378
+            this.loadingText = '机构图册上传中'
379
+
380
+            const _self = this
381
+            return new Promise((resolve, reject) => {
382
+                getToken().then(response => {
383
+                    const token = response.data.data.uptoken
384
+                    _self._data.uploadData.token = token
385
+                    _self._data.uploadData.key = key
386
+                    resolve(true)
387
+                }).catch(err => {
388
+                    reject(false)
389
+                    this.guploading = false;
390
+                })
391
+            })
392
+        },
393
+
394
+        handleRemove(file, fileList) {
395
+            DeleteOrgGallery(file.id).then(response=>{
396
+                var res = response.data;
397
+                if(res.state==1) {
398
+                    this.$message.success('删除成功');
399
+                }else {
400
+                    this.$message.error('删除失败');
401
+                }
402
+            }).catch(e=>{});
403
+            console.log("handleRemove",file, fileList);
404
+        },
405
+        GetOrgInfo(){
406
+            GetOrgInfo().then(response=>{
407
+                var res = response.data;
408
+                if (res.state === 1) {
409
+                    this.form.org_name = res.data.orginfo.org_name;
410
+                    this.form.org_short_name = res.data.orginfo.org_short_name;
411
+                    this.form.org_introduction = res.data.orginfo.org_introduction;
412
+                    this.form.org_logo = res.data.orginfo.org_logo;
413
+                    this.form.province = res.data.orginfo.province;
414
+                    this.form.city = res.data.orginfo.city;
415
+                    this.form.district = res.data.orginfo.district;
416
+                    this.form.address = res.data.orginfo.address;
417
+                    this.form.org_type = res.data.orginfo.org_type;
418
+                    this.form.telephone = res.data.orginfo.telephone;
419
+                    this.form.operating_state = res.data.orginfo.operating_state;
420
+                    this.form.business_week = res.data.orginfo.business_week;
421
+                    this.form.business_week_select = [];
422
+                    this.form.business_time = res.data.orginfo.business_time;
423
+                    this.form.business_time_shange = '';
424
+                    this.form.business_time_xia = '';
425
+                    this.form.illness = res.data.orginfo.illness;
426
+                    this.form.illness_list = [];
427
+                    this.form.org_gallery = res.data.orginfo.org_gallery;
428
+                    this.fileList = [];
429
+                    for (const index in this.form.org_gallery) {
430
+                        var image = {id:this.form.org_gallery[index].id, name:this.form.org_gallery[index].id, url: this.form.org_gallery[index].type==1?this.form.org_gallery[index].url:this.form.org_gallery[index].url+'?vframe/jpg/offset/0/w/100/h/100'};
431
+                        this.fileList.push(image);
432
+                    }
433
+
434
+                    var illness = res.data.orginfo.illness.split(',');
435
+                    for (const index in illness) {
436
+                        var iid = parseInt(illness[index]);
437
+                        if (isNaN(iid) || iid<=0) {
438
+                            continue;
439
+                        }
440
+                        this.form.illness_list.push(iid);
441
+                    }
442
+                    var business_week = this.form.business_week;
443
+                    var business_week_tem = business_week.split(" — ");
444
+                    if(business_week_tem.length==2) {
445
+                        var fromIndex = this.weekOptions.indexOf(business_week_tem[0]);
446
+                        var toIndex = this.weekOptions.indexOf(business_week_tem[1]);
447
+                        if(fromIndex>=0 && toIndex>=0) {
448
+                            for (const index in this.weekOptions) {
449
+                                if(index>=fromIndex && index <= toIndex) {
450
+                                    this.form.business_week_select.push(this.weekOptions[index]);
451
+                                }
452
+                            }
453
+                        }
454
+                    }else {
455
+                        business_week_tem = business_week.split("、");
456
+                        for (const index in business_week_tem) {
457
+                            if(business_week_tem[index].length>0) {
458
+                                this.form.business_week_select.push(business_week_tem[index]);
459
+                            }
460
+                        }
461
+                    }
462
+                    var business_time = this.form.business_time;
463
+                    var business_time_tem = business_time.split("—");
464
+                    if(business_time_tem.length==2) {
465
+                        this.form.business_time_shange = business_time_tem[0].substring(2);
466
+                        this.form.business_time_xia = business_time_tem[1].substring(2);
467
+                    }else {
468
+                        var selectTime = business_time_tem[0].substring(2);
469
+                        if(this.shangOptions.indexOf(selectTime)>-1) {
470
+                            this.form.business_time_shange = selectTime;
471
+                        }else if(this.xiaOptions.indexOf(selectTime)>-1) {
472
+                            this.form.business_time_xia = selectTime;
473
+                        }
474
+                    }
475
+
476
+                    this.provinces = res.data.provinces;
477
+                    this.citys = res.data.citys?res.data.citys:[];
478
+                    this.districts = res.data.districts?res.data.districts:[];
479
+
480
+                    this.orgtypes = [];
481
+                    this.orgtypesMap ={},
482
+                    this.childtypes = [];
483
+                    var orgtypes = res.data.orgtypes;
484
+                    for (const index in orgtypes) {
485
+                        if(orgtypes[index].pid>0) {
486
+                            if(!(orgtypes[index].pid in this.orgtypesMap)) {
487
+                                this.orgtypesMap[orgtypes[index].pid] = [];
488
+                            }
489
+                            this.orgtypesMap[orgtypes[index].pid].push(orgtypes[index]);
490
+                            if(orgtypes[index].id == this.form.org_type) {
491
+                                this.form.child_type = orgtypes[index].id;
492
+                                this.form.parent_type = orgtypes[index].pid;
493
+                            }
494
+                        }else {
495
+                            this.orgtypes.push(orgtypes[index]);
496
+                            if(orgtypes[index].id == this.form.org_type) {
497
+                                this.form.parent_type = orgtypes[index].id;
498
+                            }
499
+                        }
500
+                    }
501
+                    if (this.form.parent_type in this.orgtypesMap) {
502
+                        this.childtypes = this.orgtypesMap[this.form.parent_type];
503
+                    }else {
504
+                        this.childtypes = [];
505
+                    }
506
+                    this.illnessOptions = res.data.illness?res.data.illness:[];
507
+                        
508
+                } else {
509
+                    this.$message.error(resp.msg)
510
+                }
511
+            }).catch(e=>{
512
+
513
+            })
514
+        },
515
+         myTrim(x) {
516
+            return x.replace(/^\s+|\s+$/gm,'');
517
+        },
518
+        changeProvince(id) {
519
+            this.citys = [];
520
+            this.districts = [];
521
+            this.form.city = '';
522
+            this.form.district = '';
523
+            var upid = parseInt(id);
524
+            if (isNaN(upid) || upid<=0) {
525
+                return false;
526
+            }
527
+            GetDistrictsByUpid({id:upid}).then(response=>{
528
+                var res = response.data;
529
+                if(res.state===1) {
530
+                    this.citys = res.data.citys?res.data.citys:[];
531
+                }
532
+            }).catch(e=>{
533
+
534
+            })
535
+        },
536
+        changeCity(id) {
537
+            this.districts = [];
538
+            this.form.district = '';
539
+            var upid = parseInt(id);
540
+            if (isNaN(upid) || upid<=0) {
541
+                return false;
542
+            }
543
+            GetDistrictsByUpid({id:upid}).then(response=>{
544
+                var res = response.data;
545
+                if(res.state===1) {
546
+                    this.districts = res.data.citys?res.data.citys:[];
547
+                }
548
+            }).catch(e=>{
549
+
550
+            })
551
+        },
552
+        changeParentType(id) {
553
+            id = parseInt(id);
554
+            this.childtypes = [];
555
+            this.form.child_type = '';
556
+            this.form.org_type = 0;
557
+
558
+            if (isNaN(id) || id<=0) {
559
+                return false;
560
+            }
561
+            if(id in this.orgtypesMap) {
562
+                this.childtypes = this.orgtypesMap[id];
563
+            }else{
564
+                this.childtypes = [];
565
+            }
566
+            
567
+            this.form.org_type = id;
568
+
569
+        },
570
+        changeChildType(id) {
571
+            this.form.org_type = id;
572
+        },
573
+        submitForm(){
574
+            this.form.org_introduction = this.$refs.neditor.content;
575
+            this.formloading = true;
576
+            this.formsubmit = true;
577
+            EditOrgInfo(this.form).then(response=>{
578
+                var res = response.data;
579
+                if(res.state==1) {
580
+                    this.$message.success("修改成功");
581
+                }else {
582
+                    this.$message.error(res.msg);
583
+                }
584
+                
585
+                this.formloading = false;
586
+                this.formsubmit = false;
587
+            }).catch(e=>{
588
+
589
+                this.formloading = false;
590
+                this.formsubmit = false;
591
+            })
592
+        },
593
+    }
594
+}
595
+</script>
596
+
597
+<style>
598
+  #edit-org-info-form .avatar-uploader .el-upload {
599
+    border: 1px dashed #d9d9d9;
600
+    border-radius: 6px;
601
+    cursor: pointer;
602
+    position: relative;
603
+    overflow: hidden;
604
+  }
605
+  #edit-org-info-form .avatar-uploader .el-upload:hover {
606
+    border-color: #409EFF;
607
+  }
608
+  #edit-org-info-form .avatar-uploader-icon {
609
+    font-size: 28px;
610
+    color: #8c939d;
611
+    width: 178px;
612
+    height: 178px;
613
+    line-height: 178px;
614
+    text-align: center;
615
+  }
616
+  #edit-org-info-form .avatar {
617
+    width: 178px;
618
+    height: 178px;
619
+    display: block;
620
+  }
621
+</style>

+ 47 - 0
src/xt_pages/org/README.md Целия файл

@@ -0,0 +1,47 @@
1
+### neditor使用:
2
+
3
+1、引入资源
4
+
5
+1.1 在static\neditor
6
+
7
+1.2 在根目录下index.html下
8
+
9
+```
10
+<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
11
+<script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.config.js"></script>
12
+<script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.all.min.js"></script>
13
+<script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.service.js"></script>
14
+<script src="<%= htmlWebpackPlugin.options.path %>/neditor/i18n/zh-cn/zh-cn.js"></script>
15
+<script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.parse.min.js"></script>
16
+```
17
+
18
+2、自定义components,在src下新建Neditor/index.vue,具体见src\components\Neditor\index.vue
19
+
20
+3、使用
21
+
22
+3.1、引入自定义components:
23
+
24
+`import Neditor from '@/components/Neditor'`
25
+
26
+3.2、注册:
27
+
28
+```
29
+components: {
30
+    Neditor,
31
+    ......
32
+},
33
+```
34
+3.3
35
+
36
+```
37
+<el-form-item label="机构介绍:" prop="org_introduction">
38
+    <keep-alive><!--网上说用百度ueditor时,要用keep-alive-->
39
+         <neditor ref="neditor"   id="editor"  v-bind:r_content="form.org_introduction"> </neditor> <!--这里是Neditor-->
40
+    </keep-alive>
41
+</el-form-item>
42
+```
43
+3.4
44
+4.
45
+提交时,需要获取富文本里的内容:
46
+
47
+`this.form.org_introduction = this.$refs.neditor.content;`

+ 610 - 0
src/xt_pages/org/orginfo.vue Целия файл

@@ -0,0 +1,610 @@
1
+<template>
2
+  <div class="main-contain">
3
+    <div  class="position">
4
+      <bread-crumb :crumbs='crumbs'></bread-crumb>
5
+    </div>
6
+    <div class="app-container " >
7
+      <el-form ref="form" :model="form" label-width="80px" id="edit-org-info-form" v-loading="formloading" :element-loading-text="loadingText" class="clearfix" :popper-append-to-body="false" >
8
+        <el-row >
9
+          <el-col :span="24"  >
10
+            <el-form-item label="机构名称:" prop="org_name">
11
+                <el-input v-model="form.org_name" placeholder="机构名称" ></el-input>
12
+            </el-form-item>
13
+            <el-form-item label="联系人姓名:" prop="contact_name">
14
+                <el-input v-model="form.contact_name" placeholder="联系人姓名" ></el-input>
15
+            </el-form-item>
16
+            <el-form-item label="机构介绍:" prop="org_introduction">
17
+                <!-- <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" placeholder="机构介绍" v-model="form.org_introduction">  </el-input> -->
18
+                <keep-alive>
19
+                <neditor ref="neditor" 
20
+                    id="editor" 
21
+                    v-bind:r_content="form.org_introduction">
22
+                </neditor>
23
+            </keep-alive>
24
+            </el-form-item>
25
+            <el-form-item label="机构头像:" prop="org_logo">
26
+                <el-upload
27
+                    v-loading="uploading"
28
+                    :element-loading-text="loadingText"
29
+                    class="avatar-uploader"
30
+                    :data="uploadData"
31
+                    action="https://upload.qiniup.com"
32
+                    :show-file-list="false"
33
+                    :on-error="handleAvatarError"
34
+                    :on-success="handleAvatarSuccess"
35
+                    :before-upload="beforeAvatarUpload">
36
+                    <img v-if="form.org_logo" :src="form.org_logo" class="avatar">
37
+                    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
38
+                </el-upload>
39
+            </el-form-item>
40
+            <el-form-item label="机构地区:" prop="org_area">
41
+                <el-select v-model="form.province" clearable filterable placeholder="请选择" @change="changeProvince">
42
+                    <el-option
43
+                    v-for="item in provinces"
44
+                    :key="item.id"
45
+                    :label="item.name"
46
+                    :value="item.id">
47
+                    </el-option>
48
+                </el-select>
49
+                <el-select v-model="form.city" v-show="form.province&&citys.length>0" clearable filterable placeholder="请选择" @change="changeCity">
50
+                    <el-option
51
+                    v-for="item in citys"
52
+                    :key="item.id"
53
+                    :label="item.name"
54
+                    :value="item.id">
55
+                    </el-option>
56
+                </el-select>
57
+                <el-select v-model="form.district" v-show="form.city&&districts.length>0" clearable filterable placeholder="请选择">
58
+                    <el-option
59
+                    v-for="item in districts"
60
+                    :key="item.id"
61
+                    :label="item.name"
62
+                    :value="item.id">
63
+                    </el-option>
64
+                </el-select>
65
+            </el-form-item>
66
+            <el-form-item label="机构地址:" prop="address">
67
+                <el-input v-model="form.address" placeholder="机构地址" ></el-input>
68
+            </el-form-item>
69
+            <el-form-item label="机构类型:" prop="org_type">
70
+                <el-select v-model="form.parent_type" clearable placeholder="请选择" @change="changeParentType" >
71
+                    <el-option
72
+                    v-for="item in orgtypes"
73
+                    :key="item.id"
74
+                    :label="item.name"
75
+                    :value="item.id">
76
+                    </el-option>
77
+                </el-select>
78
+                <el-select v-model="form.child_type" v-show="form.parent_type&&childtypes.length>0" clearable placeholder="请选择" @change="changeChildType">
79
+                    <el-option
80
+                    v-for="item in childtypes"
81
+                    :key="item.id"
82
+                    :label="item.name"
83
+                    :value="item.id">
84
+                    </el-option>
85
+                </el-select>
86
+            </el-form-item>
87
+            <el-form-item label="机构电话:" prop="telephone">
88
+                <el-input v-model="form.telephone" placeholder="机构电话" ></el-input>
89
+            </el-form-item>
90
+            <el-form-item label="营业状态:" prop="operating_state">
91
+                <el-radio-group v-model="form.operating_state" >
92
+                    <el-radio v-for="item in operatingStateOptions" :key="item.value" :label="item.value" :value="item.value" >{{item.label}}</el-radio>
93
+                </el-radio-group>
94
+            </el-form-item>
95
+            <el-form-item label="营业时间:" prop="business_time">
96
+                <el-input v-model="form.business_week" placeholder="营业时间" style="width:48%"></el-input> 
97
+                <el-input v-model="form.business_time" placeholder="营业时间" style="width:48%"></el-input>
98
+            </el-form-item>
99
+            <el-form-item label="" prop="business_time">
100
+                <el-checkbox-group v-model="form.business_week_select"   @change="handleChangeWeek">
101
+                    <el-checkbox v-for="(item, index) in weekOptions" :label="item" :key="index" :value="item" >{{item}}</el-checkbox>
102
+                </el-checkbox-group>
103
+            </el-form-item>
104
+            
105
+            <el-form-item label="上午:" prop="business_time">
106
+                <el-radio-group v-model="form.business_time_shange" @change="handleChangeTime">
107
+                    <el-radio v-for="(item, index)  in shangOptions" :key="index" :label="item" :value="item" >{{item}}</el-radio>
108
+                </el-radio-group>
109
+            </el-form-item>
110
+            
111
+            <el-form-item label="下午:" prop="business_time_xia">
112
+                <el-radio-group v-model="form.business_time_xia" @change="handleChangeTime">
113
+                    <el-radio v-for="(item, index)  in xiaOptions" :key="index" :label="item" :value="item" >{{item}}</el-radio>
114
+                </el-radio-group>
115
+            </el-form-item>
116
+
117
+            <el-form-item label="服务病种:" prop="illness">
118
+                <el-checkbox-group v-model="form.illness_list"  @change="handleChangeIllness">
119
+                    <el-checkbox v-for="item in illnessOptions" :label="item.id" :key="item.id" :value="item.id" >{{item.illness_name}}</el-checkbox>
120
+                </el-checkbox-group>
121
+            </el-form-item>
122
+            <el-form-item label="机构图册:" prop="gallery">
123
+                <el-upload
124
+                    v-loading="guploading"
125
+                    :data="uploadData"
126
+                    action="https://upload.qiniup.com"
127
+                    list-type="picture-card"
128
+                    :file-list="fileList"
129
+                    :on-remove="handleRemove"
130
+                    :on-error="handleGalleryError"
131
+                    :on-success="handleGallerySuccess"
132
+                    :before-upload="beforeGalleryUpload">
133
+                    <i class="el-icon-plus"></i>
134
+                </el-upload>
135
+            </el-form-item>
136
+          </el-col>
137
+        </el-row>
138
+
139
+        <el-row :span="24">
140
+          <el-col :span="24" align="right" >
141
+            <el-form-item>
142
+                <el-button @click="$router.back(-1)" icon="el-icon-refresh" size="small">取消</el-button>
143
+                <el-button  @click="submitForm"  size="small" type="primary" icon="el-icon-setting" >保存</el-button>
144
+            </el-form-item>
145
+          </el-col>
146
+        </el-row>
147
+
148
+      </el-form>
149
+
150
+    </div>
151
+  </div>
152
+
153
+</template>
154
+
155
+<script>
156
+import { getToken } from '@/api/qiniu'
157
+import {GetOrgInfo,SaveOrgGallery,DeleteOrgGallery,EditOrgInfo} from '@/api/org/orginfo';
158
+import {GetDistrictsByUpid} from '@/api/district';
159
+import { getFileExtension} from '@/utils/tools'
160
+import Neditor from '@/components/Neditor'
161
+  import BreadCrumb from '@/xt_pages/components/bread-crumb'
162
+  export default {
163
+    name: 'orginfo',
164
+    data() {
165
+      return {
166
+        crumbs: [
167
+          { path: false, name: '机构信息' },
168
+        ],
169
+        qiniuDomain: 'https://images.shengws.com/',
170
+        formloading:false,
171
+        uploading:false,
172
+        guploading:false,
173
+        formsubmit:false,
174
+        loadingText:'',
175
+        illnessList:[],
176
+        fileList:[],
177
+        provinces:[],
178
+        citys:[],
179
+        districts:[],
180
+        orgtypes:[],
181
+        orgtypesMap:{},
182
+        childtypes:[],
183
+        uploadData: { token: '', key: '' },
184
+        operatingStateOptions: [{ value: 1, label: '正常营业' }, { value: 2, label: '暂未营业' }],
185
+        weekOptions:["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"],
186
+        shangOptions:['1:00','2:00','3:00','4:00','5:00','6:00','7:00','8:00','9:00','10:00','11:00','12:00'],
187
+        xiaOptions:['13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00'],
188
+        illnessOptions:[],
189
+        form:{
190
+            org_name:'',
191
+            contact_name:'',
192
+            org_introduction:'',
193
+            org_logo:'',
194
+            province:'',
195
+            city:'',
196
+            district:'',
197
+            address:'',
198
+            parent_type:'',
199
+            child_type:'',
200
+            org_type:'',
201
+            telephone:'',
202
+            operating_state:'',
203
+            business_week:'',
204
+            business_week_select:[],
205
+            business_time_shange:'',
206
+            business_time_xia:'',
207
+            business_time:'',
208
+            illness:'',
209
+            illness_list:[],
210
+            org_gallery:[],
211
+        },
212
+            myConfig: {
213
+            // 如果需要上传功能,找后端小伙伴要服务器接口地址
214
+            serverUrl: '/api/web/upload/ueditor',
215
+            // 你的UEditor资源存放的路径,相对于打包后的index.html
216
+            UEDITOR_HOME_URL: '/NEditor/',
217
+            // 编辑器不自动被内容撑高
218
+            autoHeightEnabled: false,
219
+            // 初始容器高度
220
+            initialFrameHeight: 240,
221
+            // 初始容器宽度
222
+            initialFrameWidth: '100%',
223
+            // 关闭自动保存
224
+            enableAutoSave: false
225
+        },
226
+        
227
+      }
228
+    },
229
+    components: {
230
+        Neditor,
231
+      BreadCrumb
232
+    },
233
+    computed: {
234
+      
235
+    },
236
+    created() {
237
+        this.formloading = true;
238
+        this.loadingText = '加载中...';
239
+        this.GetOrgInfo();
240
+    },
241
+    methods: {
242
+        
243
+        handleChangeIllness(values){
244
+            this.form.illness = values.join(',');
245
+        },
246
+        handleChangeWeek(values) {
247
+            var selectweek = [];
248
+            for (const index in values) {
249
+                var item = {id:this.weekOptions.indexOf(values[index]), name:values[index]};
250
+                selectweek.push(item);
251
+            }
252
+            
253
+            if(selectweek.length==0) {
254
+                this.form.business_week = '';
255
+            }else if(selectweek.length==1) {
256
+                this.form.business_week = selectweek[0];
257
+            }else {
258
+                selectweek = selectweek.sort(function (a,b) {
259
+                    return a.id-b.id;
260
+                });
261
+                var blen = selectweek.length;
262
+                if (blen == (selectweek[blen-1].id - selectweek[0].id + 1)) {
263
+                    this.form.business_week = selectweek[0]["name"] + ' — ' + selectweek[blen-1]["name"];
264
+                }else {
265
+                    var tem = [];
266
+                    for (const index in selectweek) {
267
+                        tem.push(selectweek[index].name);
268
+                    }
269
+                    this.form.business_week = tem.join("、")
270
+                }
271
+               
272
+            }
273
+        },
274
+        handleChangeTime(t){
275
+            if(this.form.business_time_shange.length>0 && this.form.business_time_xia.length>0) {
276
+                this.form.business_time = '上午'+this.form.business_time_shange+"—下午"+this.form.business_time_xia;
277
+            }else if (this.form.business_time_shange.length>0) {
278
+                this.form.business_time = '上午'+this.form.business_time_shange;
279
+            }else if (this.form.business_time_xia.length>0) {
280
+                this.form.business_time = "下午"+this.form.business_time_xia;
281
+            }else {
282
+                this.form.business_time = '';
283
+            }
284
+        },
285
+        handleAvatarError(err, file, fileList) {
286
+            this.$message.error(err);
287
+            this.uploading = false;
288
+            return false
289
+        },
290
+        handleAvatarSuccess(res, file) {
291
+            this.form.org_logo = this.qiniuDomain + res.url;
292
+            this.uploading = false;
293
+        },
294
+        beforeAvatarUpload(file) {
295
+            var fileType = file.type
296
+            const isJPG = fileType.indexOf('image') > -1
297
+            const isLt2M = file.size / 1024 / 1024 < 2
298
+
299
+            if (!isJPG) {
300
+                this.$message.error('只能上传图片')
301
+                return false
302
+            }
303
+            if (!isLt2M) {
304
+                this.$message.error('上传头像图片大小不能超过 2MB!')
305
+                return false
306
+            }
307
+
308
+            var date = new Date()
309
+            var ext = getFileExtension(file.name)
310
+            var key = "" + date.getFullYear() + (date.getMonth() + 1) + date.getDate() + date.getHours()  + date.getMinutes()  + date.getSeconds()  +'_o_' + file.uid + '.' + ext;
311
+            this.uploading = true;
312
+            this.loadingText = '机构头像上传中'
313
+
314
+            const _self = this
315
+            return new Promise((resolve, reject) => {
316
+                getToken().then(response => {
317
+                    const token = response.data.data.uptoken
318
+                    _self._data.uploadData.token = token
319
+                    _self._data.uploadData.key = key
320
+                    resolve(true)
321
+                }).catch(err => {
322
+                    reject(false)
323
+                    this.uploading = false;
324
+                })
325
+            })
326
+        },
327
+        handleGalleryError(err, file, fileList) {
328
+            this.$message.error(err);
329
+            this.guploading = false;
330
+            return false
331
+        },
332
+        handleGallerySuccess(res, file) {
333
+            var data = {type:1, url: this.qiniuDomain + res.url};
334
+            SaveOrgGallery(data).then(response=>{
335
+                var res = response.data;
336
+                if (res.state==1) {
337
+                    this.$message.success('上传成功');
338
+                }else {
339
+                    this.$message.error('上传失败');
340
+                }
341
+            }).catch(e=>{});
342
+            this.guploading = false;
343
+        },
344
+        beforeGalleryUpload(file) {
345
+            var fileType = file.type
346
+            const isJPG = fileType.indexOf('image') > -1
347
+            const isLt100M = file.size / 1024 / 1024 < 100
348
+
349
+            if (!isJPG) {
350
+                this.$message.error('只能上传图片')
351
+                return false
352
+            }
353
+            if (!isLt100M) {
354
+                this.$message.error('上传图片大小不能超过 100MB!')
355
+                return false
356
+            }
357
+
358
+            var date = new Date()
359
+            var ext = getFileExtension(file.name)
360
+            var key = ""+date.getFullYear() + (date.getMonth() + 1) + date.getDate() + date.getHours()  + date.getMinutes()  + date.getSeconds()  +'_g_' + file.uid + '.' + ext;
361
+            this.guploading = true;
362
+            this.loadingText = '机构图册上传中'
363
+
364
+            const _self = this
365
+            return new Promise((resolve, reject) => {
366
+                getToken().then(response => {
367
+                    const token = response.data.data.uptoken
368
+                    _self._data.uploadData.token = token
369
+                    _self._data.uploadData.key = key
370
+                    resolve(true)
371
+                }).catch(err => {
372
+                    reject(false)
373
+                    this.guploading = false;
374
+                })
375
+            })
376
+        },
377
+
378
+        handleRemove(file, fileList) {
379
+            DeleteOrgGallery(file.id).then(response=>{
380
+                var res = response.data;
381
+                if(res.state==1) {
382
+                    this.$message.success('删除成功');
383
+                }else {
384
+                    this.$message.error('删除失败');
385
+                }
386
+            }).catch(e=>{});
387
+            console.log("handleRemove",file, fileList);
388
+        },
389
+        GetOrgInfo(){
390
+            GetOrgInfo().then(response=>{
391
+                var res = response.data;
392
+                if (res.state === 1) {
393
+                    this.form.org_name = res.data.orginfo.org_name;
394
+                    this.form.contact_name = res.data.orginfo.contact_name;
395
+                    this.form.org_introduction = res.data.orginfo.org_introduction;
396
+                    this.form.org_logo = res.data.orginfo.org_logo;
397
+                    this.form.province = res.data.orginfo.province;
398
+                    this.form.city = res.data.orginfo.city;
399
+                    this.form.district = res.data.orginfo.district;
400
+                    this.form.address = res.data.orginfo.address;
401
+                    this.form.org_type = res.data.orginfo.org_type;
402
+                    this.form.telephone = res.data.orginfo.telephone;
403
+                    this.form.operating_state = res.data.orginfo.operating_state;
404
+                    this.form.business_week = res.data.orginfo.business_week;
405
+                    this.form.business_week_select = [];
406
+                    this.form.business_time = res.data.orginfo.business_time;
407
+                    this.form.business_time_shange = '';
408
+                    this.form.business_time_xia = '';
409
+                    this.form.illness = res.data.orginfo.illness;
410
+                    this.form.illness_list = [];
411
+                    this.form.org_gallery = res.data.orginfo.org_gallery;
412
+                    this.fileList = [];
413
+                    for (const index in this.form.org_gallery) {
414
+                        var image = {id:this.form.org_gallery[index].id, name:this.form.org_gallery[index].id, url: this.form.org_gallery[index].type==1?this.form.org_gallery[index].url:this.form.org_gallery[index].url+'?vframe/jpg/offset/0/w/100/h/100'};
415
+                        this.fileList.push(image);
416
+                    }
417
+
418
+                    var illness = res.data.orginfo.illness.split(',');
419
+                    for (const index in illness) {
420
+                        var iid = parseInt(illness[index]);
421
+                        if (isNaN(iid) || iid<=0) {
422
+                            continue;
423
+                        }
424
+                        this.form.illness_list.push(iid);
425
+                    }
426
+                    var business_week = this.form.business_week;
427
+                    var business_week_tem = business_week.split(" — ");
428
+                    if(business_week_tem.length==2) {
429
+                        var fromIndex = this.weekOptions.indexOf(business_week_tem[0]);
430
+                        var toIndex = this.weekOptions.indexOf(business_week_tem[1]);
431
+                        if(fromIndex>=0 && toIndex>=0) {
432
+                            for (const index in this.weekOptions) {
433
+                                if(index>=fromIndex && index <= toIndex) {
434
+                                    this.form.business_week_select.push(this.weekOptions[index]);
435
+                                }
436
+                            }
437
+                        }
438
+                    }else {
439
+                        business_week_tem = business_week.split("、");
440
+                        for (const index in business_week_tem) {
441
+                            if(business_week_tem[index].length>0) {
442
+                                this.form.business_week_select.push(business_week_tem[index]);
443
+                            }
444
+                        }
445
+                    }
446
+                    var business_time = this.form.business_time;
447
+                    var business_time_tem = business_time.split("—");
448
+                    if(business_time_tem.length==2) {
449
+                        this.form.business_time_shange = business_time_tem[0].substring(2);
450
+                        this.form.business_time_xia = business_time_tem[1].substring(2);
451
+                    }else {
452
+                        var selectTime = business_time_tem[0].substring(2);
453
+                        if(this.shangOptions.indexOf(selectTime)>-1) {
454
+                            this.form.business_time_shange = selectTime;
455
+                        }else if(this.xiaOptions.indexOf(selectTime)>-1) {
456
+                            this.form.business_time_xia = selectTime;
457
+                        }
458
+                    }
459
+
460
+                    this.provinces = res.data.provinces;
461
+                    this.citys = res.data.citys?res.data.citys:[];
462
+                    this.districts = res.data.districts?res.data.districts:[];
463
+
464
+                    this.orgtypes = [];
465
+                    this.orgtypesMap ={},
466
+                    this.childtypes = [];
467
+                    var orgtypes = res.data.orgtypes;
468
+                    for (const index in orgtypes) {
469
+                        if(orgtypes[index].pid>0) {
470
+                            if(!(orgtypes[index].pid in this.orgtypesMap)) {
471
+                                this.orgtypesMap[orgtypes[index].pid] = [];
472
+                            }
473
+                            this.orgtypesMap[orgtypes[index].pid].push(orgtypes[index]);
474
+                            if(orgtypes[index].id == this.form.org_type) {
475
+                                this.form.child_type = orgtypes[index].id;
476
+                                this.form.parent_type = orgtypes[index].pid;
477
+                            }
478
+                        }else {
479
+                            this.orgtypes.push(orgtypes[index]);
480
+                            if(orgtypes[index].id == this.form.org_type) {
481
+                                this.form.parent_type = orgtypes[index].id;
482
+                            }
483
+                        }
484
+                    }
485
+                    if (this.form.parent_type in this.orgtypesMap) {
486
+                        this.childtypes = this.orgtypesMap[this.form.parent_type];
487
+                    }else {
488
+                        this.childtypes = [];
489
+                    }
490
+                    this.illnessOptions = res.data.illness?res.data.illness:[];
491
+                    this.formloading = false;
492
+                } else {
493
+                    this.$message.error(resp.msg)
494
+                }
495
+            }).catch(e=>{
496
+
497
+            })
498
+        },
499
+         myTrim(x) {
500
+            return x.replace(/^\s+|\s+$/gm,'');
501
+        },
502
+        changeProvince(id) {
503
+            this.citys = [];
504
+            this.districts = [];
505
+            this.form.city = '';
506
+            this.form.district = '';
507
+            var upid = parseInt(id);
508
+            if (isNaN(upid) || upid<=0) {
509
+                return false;
510
+            }
511
+            GetDistrictsByUpid({id:upid}).then(response=>{
512
+                var res = response.data;
513
+                if(res.state===1) {
514
+                    this.citys = res.data.citys?res.data.citys:[];
515
+                }
516
+            }).catch(e=>{
517
+
518
+            })
519
+        },
520
+        changeCity(id) {
521
+            this.districts = [];
522
+            this.form.district = '';
523
+            var upid = parseInt(id);
524
+            if (isNaN(upid) || upid<=0) {
525
+                return false;
526
+            }
527
+            GetDistrictsByUpid({id:upid}).then(response=>{
528
+                var res = response.data;
529
+                if(res.state===1) {
530
+                    this.districts = res.data.citys?res.data.citys:[];
531
+                }
532
+            }).catch(e=>{
533
+
534
+            })
535
+        },
536
+        changeParentType(id) {
537
+            id = parseInt(id);
538
+            this.childtypes = [];
539
+            this.form.child_type = '';
540
+            this.form.org_type = 0;
541
+
542
+            if (isNaN(id) || id<=0) {
543
+                return false;
544
+            }
545
+            if(id in this.orgtypesMap) {
546
+                this.childtypes = this.orgtypesMap[id];
547
+            }else{
548
+                this.childtypes = [];
549
+            }
550
+            
551
+            this.form.org_type = id;
552
+
553
+        },
554
+        changeChildType(id) {
555
+            this.form.org_type = id;
556
+        },
557
+        submitForm(){
558
+            this.form.org_introduction = this.$refs.neditor.content;
559
+            this.formloading = true;
560
+            this.formsubmit = true;
561
+            this.loadingText = '正在保存...';
562
+            EditOrgInfo(this.form).then(response=>{
563
+                var res = response.data;
564
+                if(res.state==1) {
565
+                    this.$store.dispatch("ModifyOrgInfo", { org_name: this.form.org_name, contact_name: this.form.org_name })
566
+                    
567
+                    this.$message.success("修改成功");
568
+                }else {
569
+                    this.$message.error(res.msg);
570
+                }
571
+                
572
+                this.formloading = false;
573
+                this.formsubmit = false;
574
+            }).catch(e=>{
575
+
576
+                this.formloading = false;
577
+                this.formsubmit = false;
578
+            })
579
+        },
580
+    }
581
+  }
582
+</script>
583
+
584
+<style rel="stylesheet/scss" >
585
+
586
+  #edit-org-info-form .avatar-uploader .el-upload {
587
+    border: 1px dashed #d9d9d9;
588
+    border-radius: 6px;
589
+    cursor: pointer;
590
+    position: relative;
591
+    overflow: hidden;
592
+  }
593
+  #edit-org-info-form .avatar-uploader .el-upload:hover {
594
+    border-color: #409EFF;
595
+  }
596
+  #edit-org-info-form .avatar-uploader-icon {
597
+    font-size: 28px;
598
+    color: #8c939d;
599
+    width: 178px;
600
+    height: 178px;
601
+    line-height: 178px;
602
+    text-align: center;
603
+  }
604
+  #edit-org-info-form .avatar {
605
+    width: 178px;
606
+    height: 178px;
607
+    display: block;
608
+  }
609
+</style>
610
+

+ 1 - 0
src/xt_pages/stock/config/goodInfo.vue Целия файл

@@ -35,6 +35,7 @@
35 35
 
36 36
           <el-table-column label="进价"  align="center" >
37 37
             <template slot-scope="scope" v-if="scope.row.buy_price">
38
+
38 39
               {{scope.row.buy_price}}
39 40
 
40 41
             </template>

+ 0 - 1
src/xt_pages/stock/stockInOrderAdd.vue Целия файл

@@ -661,4 +661,3 @@
661 661
   }
662 662
 
663 663
 </style>
664
-s

+ 3 - 3
src/xt_pages/user/components/PatientDetail.vue Целия файл

@@ -356,11 +356,11 @@
356 356
                         </tr>
357 357
                         <tr>
358 358
                             <td><div class="td_proj_title">现<br/>病<br/>史</div></td>
359
-                            <td colspan="7"><div class="td_proj_content td_align_left" v-html="patientPrint.past_history"></div></td>
359
+                            <td colspan="7"><div class="td_proj_content td_align_left" v-html="patientPrint.present_history"></div></td>
360 360
                         </tr>
361 361
                         <tr>
362 362
                             <td><div class="td_proj_title">既<br/>往<br/>史</div></td>
363
-                            <td colspan="7"><div class="td_proj_content td_align_left" v-html="patientPrint.present_history"></div></td>
363
+                            <td colspan="7"><div class="td_proj_content td_align_left" v-html="patientPrint.past_history"></div></td>
364 364
                         </tr>
365 365
                         <tr>
366 366
                             <td colspan="8"><div class="td_proj_title">体格检查</div></td>
@@ -939,7 +939,7 @@ export default {
939 939
               }
940 940
               this.patientPrint.contagions = printContagions.join('、')
941 941
             } else {
942
-              this.patientPrint.contagions = ''
942
+              this.patientPrint.contagions = ''
943 943
             }
944 944
 
945 945
             if (diseasesArr.length > 0) {

+ 168 - 0
static/neditor/README.md Целия файл

@@ -0,0 +1,168 @@
1
+
2
+<p align="center">
3
+<a href="https://jq.qq.com/?_wv=1027&k=5qVzRh4" title="Notadd 官方技术交流群"><img src="https://img.shields.io/badge/QQ%20Group-321735506-6782d6.svg?style=flat-square"></a>
4
+<a href="https://travis-ci.org/notadd/neditor" title="Build Status"><img src="https://img.shields.io/travis/notadd/neditor/master.svg?style=flat-square"></a>
5
+</p>
6
+
7
+## 新版发布
8
+
9
+2.1 发布,此次版本移除了后端相关代码,纯 ajax 提交,请配置 `neditor.config.js` `neditor.service.js`,支持各种后端或者云存储。
10
+
11
+## 捐赠
12
+
13
+该项目需要您的支持, [捐赠](https://gitee.com/notadd/neditor?donate=true)  以支持此项目的发展。
14
+
15
+
16
+## 第一步:下载编辑器
17
+
18
+**方式一:完整安装包 (推荐)**
19
+
20
+* [Neditor.tar.xz](https://www.notadd.com/download/neditor/Neditor-next-master.tar.xz)
21
+
22
+**方式二: npm安装**
23
+
24
+`npm i @notadd/neditor -S`
25
+
26
+**方式三:编译安装**
27
+
28
+```shell
29
+git clone https://github.com/notadd/neditor.git
30
+npm install
31
+npm run build
32
+```
33
+
34
+### 第二步:在浏览器打开 index.html ###
35
+
36
+进入到目录 `dist` , 使用浏览器打开文件 `index.html` 。
37
+
38
+如果看到了下面这样的编辑器,恭喜你,初次部署成功!
39
+
40
+![部署成功](https://www.notadd.com/src/neditor-demo.webp)
41
+
42
+## 相关版本
43
+
44
+[Angular 版 Neditor](https://github.com/notadd/ngx-neditor)    
45
+
46
+[Vue 版 Neditor](https://github.com/caiya/vue-neditor-wrap)   【第三方维护】
47
+
48
+## 技术支持
49
+
50
+该项目基于 MIT 协议开源,任何组织/企业以及个人都可以免费使用(保留版权)。    
51
+如果您需要额外商业技术支持或者定制编辑器,请联系 QQ:1256985886
52
+
53
+
54
+
55
+其他版本待添加
56
+
57
+### 自定义的参数
58
+
59
+编辑器有很多可自定义的参数项,在实例化的时候可以传入给编辑器:
60
+
61
+```javascript
62
+var ue = UE.getEditor('container', {
63
+    autoHeight: false
64
+});
65
+```
66
+
67
+配置项也可以通过 `neditor.config.js` 文件修改,具体的配置方法请看 [前端配置项说明](http://fex.baidu.com/ueditor/#start-config1.4 前端配置项说明.md)、[后端配置项说明](http://fex.baidu.com/ueditor/#server-config)
68
+
69
+### 编辑器图片、视频、涂鸦、附件上传service
70
+
71
+编辑器上传逻辑单独在 `neditor.service.js` 文件配置,具体的配置方法见注释
72
+
73
+### 设置和读取编辑器的内容
74
+
75
+通 getContent 和 setContent 方法可以设置和读取编辑器的内容
76
+
77
+```javascript
78
+var ue = UE.getContent();
79
+ue.ready(function(){
80
+    //设置编辑器的内容
81
+    ue.setContent('hello');
82
+    //获取html内容,返回: <p>hello</p>
83
+    var html = ue.getContent();
84
+    //获取纯文本内容,返回: hello
85
+    var txt = ue.getContentTxt();
86
+});
87
+```
88
+
89
+Ueditor 的更多API请看[API 文档](http://ueditor.baidu.com/doc "ueditor API 文档")
90
+
91
+##  下载地址
92
+
93
+Neditor 码云: [http://gitee.com/notadd/neditor](http://gitee.com/notadd/neditor "Neditor github 地址")
94
+
95
+Neditor github 地址:[http://github.com/notadd/neditor](http://github.com/notadd/neditor "Neditor github 地址")
96
+
97
+## 相关链接
98
+
99
+Ueditor 官网:[http://ueditor.baidu.com](http://ueditor.baidu.com "ueditor 官网")
100
+
101
+Ueditor API 文档:[http://ueditor.baidu.com/doc](http://ueditor.baidu.com/doc "ueditor API 文档")
102
+
103
+## 详细文档
104
+
105
+Ueditor 文档:[http://fex.baidu.com/ueditor/](http://fex.baidu.com/ueditor/)
106
+
107
+注: 对IE8以下版本不再承诺兼容
108
+
109
+
110
+### 关于 HTTPS
111
+
112
+使用了 [又拍云CDN](https://console.upyun.com/register/?invite=r17EYO3BW) 服务,支持跨域 和 https。
113
+
114
+如果有需要,也可将下面域名改成自己的。
115
+```
116
+imgbaidu.b0.upaiyun.com
117
+tingapi.b0.upaiyun.com
118
+```
119
+
120
+## 联系我们 ##
121
+
122
+Neditor官方交流群:257753500
123
+
124
+QQ 群: 321735506
125
+
126
+[issue](http://github.com/notadd/neditor/issues)
127
+
128
+
129
+
130
+## Todo
131
+
132
+### 2.1
133
+
134
+- [x] 将上传封装为 service ,支持非 GraphQL 接口。
135
+- [x] 细节样式修改(美化)
136
+
137
+### 2.2
138
+
139
+- [ ] word 内图片自动上传
140
+- [x] 粘贴图片转为本地图片(图片本地化)
141
+
142
+### 2.3
143
+
144
+- [ ] 上传文件/图片无需后端
145
+
146
+### 3.0
147
+
148
+- [ ] 使用 Typescript 重构
149
+- [ ] 草稿箱功能与离线保存
150
+- [ ] service worker 特性
151
+- [ ] 实现 2.0 的大部分功能
152
+
153
+## 其他项目:Notadd
154
+
155
+https://github.com/notadd/notadd
156
+
157
+
158
+ ## 感谢提供赞助:
159
+ 
160
+ 
161
+ <a href="https://www.ucloud.cn/site/active/gift.html?ytag=notadd"><img src="https://www.notadd.com/src/ucloud_logo.svg" width="150" /></a> &nbsp;
162
+
163
+**UCloud 云服务器限时优惠 — Notadd 项目用户福利**
164
+
165
+[【基础型】1核2G 1M带宽 50GB SSD数据盘 低至250元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd )    
166
+
167
+[【标准型】2核4G 1M带宽 50GB SSD数据盘 低至550元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd )
168
+

+ 40 - 0
static/neditor/dialogs/anchor/anchor.html Целия файл

@@ -0,0 +1,40 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+    "http://www.w3.org/TR/html4/loose.dtd">
3
+<html>
4
+    <head>
5
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+        <title></title>
7
+        <style type="text/css">
8
+            *{color: #838383;margin: 0;padding: 0}
9
+            html,body {font-size: 12px;overflow: hidden; }
10
+            .content{padding:15px 0 0 15px;}
11
+            input{width:210px;height:28px;line-height:28px;margin-left: 4px;border-radius: 5px;border: 1px solid #ccc;}
12
+        </style>
13
+    </head>
14
+    <body>
15
+        <div class="content">
16
+            <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
17
+        </div>
18
+        <script type="text/javascript" src="../internal.js"></script>
19
+        <script type="text/javascript">
20
+            var anchorInput = $G('anchorName'),
21
+                node = editor.selection.getRange().getClosedNode();
22
+            if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
23
+                anchorInput.value = node;
24
+            }
25
+            anchorInput.onkeydown = function(evt){
26
+                evt = evt || window.event;
27
+                if(evt.keyCode == 13){
28
+                    editor.execCommand('anchor', anchorInput.value);
29
+                    dialog.close();
30
+                    domUtils.preventDefault(evt)
31
+                }
32
+            };
33
+            dialog.onok = function (){
34
+                editor.execCommand('anchor', anchorInput.value);
35
+                dialog.close();
36
+            };
37
+            $focus(anchorInput);
38
+        </script>
39
+    </body>
40
+</html>

+ 682 - 0
static/neditor/dialogs/attachment/attachment.css Целия файл

@@ -0,0 +1,682 @@
1
+@charset "utf-8";
2
+/* dialog样式 */
3
+.wrapper {
4
+    zoom: 1;
5
+    width: 630px;
6
+    *width: 626px;
7
+    height: 380px;
8
+    margin: 0 auto;
9
+    padding: 10px;
10
+    position: relative;
11
+    font-family: sans-serif;
12
+}
13
+
14
+/*tab样式框大小*/
15
+.tabhead {
16
+    float:left;
17
+}
18
+.tabbody {
19
+    width: 100%;
20
+    height: 346px;
21
+    position: relative;
22
+    clear: both;
23
+}
24
+
25
+.tabbody .panel {
26
+    position: absolute;
27
+    width: 0;
28
+    height: 0;
29
+    background: #fff;
30
+    overflow: hidden;
31
+    display: none;
32
+}
33
+
34
+.tabbody .panel.focus {
35
+    width: 100%;
36
+    height: 346px;
37
+    display: block;
38
+}
39
+
40
+/* 上传附件 */
41
+.tabbody #upload.panel {
42
+    width: 0;
43
+    height: 0;
44
+    overflow: hidden;
45
+    position: absolute !important;
46
+    clip: rect(1px, 1px, 1px, 1px);
47
+    background: #fff;
48
+    display: block;
49
+}
50
+
51
+.tabbody #upload.panel.focus {
52
+    width: 100%;
53
+    height: 346px;
54
+    display: block;
55
+    clip: auto;
56
+}
57
+
58
+#upload .queueList {
59
+    margin: 0;
60
+    width: 100%;
61
+    height: 100%;
62
+    position: absolute;
63
+    overflow: hidden;
64
+}
65
+
66
+#upload p {
67
+    margin: 0;
68
+}
69
+
70
+.element-invisible {
71
+    width: 0 !important;
72
+    height: 0 !important;
73
+    border: 0;
74
+    padding: 0;
75
+    margin: 0;
76
+    overflow: hidden;
77
+    position: absolute !important;
78
+    clip: rect(1px, 1px, 1px, 1px);
79
+}
80
+
81
+#upload .placeholder {
82
+    margin: 10px;
83
+    /*border: 2px dashed #e6e6e6;*/
84
+    height: 172px;
85
+    padding-top: 150px;
86
+    text-align: center;
87
+    /*background: url(./images/image.png) center 70px no-repeat;*/
88
+    background-color: #f3f3f3;
89
+    color: #cccccc;
90
+    font-size: 18px;
91
+    position: relative;
92
+    top:0;
93
+    *top: 10px;
94
+}
95
+
96
+#upload .placeholder .webuploader-pick {
97
+    font-size: 16px;
98
+    background: #f3f3f3;
99
+    border-radius: 3px;
100
+    line-height: 44px;
101
+    padding: 0 30px;
102
+    color: #646464;
103
+    display: inline-block;
104
+    margin: 0 auto 20px auto;
105
+    cursor: pointer;
106
+    /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */
107
+    border: 1px solid #ccc;
108
+}
109
+
110
+#upload .placeholder .webuploader-pick-hover {
111
+    border: 1px solid #00a2d4;
112
+    color: #00a2d4;
113
+}
114
+
115
+
116
+#filePickerContainer {
117
+    text-align: center;
118
+}
119
+
120
+#upload .placeholder .flashTip {
121
+    color: #666666;
122
+    font-size: 12px;
123
+    position: absolute;
124
+    width: 100%;
125
+    text-align: center;
126
+    bottom: 20px;
127
+}
128
+
129
+#upload .placeholder .flashTip a {
130
+    color: #0785d1;
131
+    text-decoration: none;
132
+}
133
+
134
+#upload .placeholder .flashTip a:hover {
135
+    text-decoration: underline;
136
+}
137
+
138
+#upload .placeholder.webuploader-dnd-over {
139
+    border-color: #999999;
140
+}
141
+
142
+#upload .filelist {
143
+    list-style: none;
144
+    margin: 0;
145
+    padding: 0;
146
+    overflow-x: hidden;
147
+    overflow-y: auto;
148
+    position: relative;
149
+    height: 300px;
150
+}
151
+
152
+#upload .filelist:after {
153
+    content: '';
154
+    display: block;
155
+    width: 0;
156
+    height: 0;
157
+    overflow: hidden;
158
+    clear: both;
159
+}
160
+
161
+#upload .filelist li {
162
+    width: 113px;
163
+    height: 113px;
164
+    background: url(./images/bg.png);
165
+    text-align: center;
166
+    margin: 9px 0 0 9px;
167
+    *margin: 6px 0 0 6px;
168
+    position: relative;
169
+    display: block;
170
+    float: left;
171
+    overflow: hidden;
172
+    font-size: 12px;
173
+}
174
+
175
+#upload .filelist li p.log {
176
+    position: relative;
177
+    top: -45px;
178
+}
179
+
180
+#upload .filelist li p.title {
181
+    position: absolute;
182
+    top: 0;
183
+    left: 0;
184
+    width: 100%;
185
+    overflow: hidden;
186
+    white-space: nowrap;
187
+    text-overflow: ellipsis;
188
+    top: 5px;
189
+    text-indent: 5px;
190
+    text-align: left;
191
+}
192
+
193
+#upload .filelist li p.progress {
194
+    position: absolute;
195
+    width: 100%;
196
+    bottom: 0;
197
+    left: 0;
198
+    height: 8px;
199
+    overflow: hidden;
200
+    z-index: 50;
201
+    margin: 0;
202
+    border-radius: 0;
203
+    background: none;
204
+    -webkit-box-shadow: 0 0 0;
205
+}
206
+
207
+#upload .filelist li p.progress span {
208
+    display: none;
209
+    overflow: hidden;
210
+    width: 0;
211
+    height: 100%;
212
+    background: #1483d8 url(./images/progress.png) repeat-x;
213
+
214
+    -webit-transition: width 200ms linear;
215
+    -moz-transition: width 200ms linear;
216
+    -o-transition: width 200ms linear;
217
+    -ms-transition: width 200ms linear;
218
+    transition: width 200ms linear;
219
+
220
+    -webkit-animation: progressmove 2s linear infinite;
221
+    -moz-animation: progressmove 2s linear infinite;
222
+    -o-animation: progressmove 2s linear infinite;
223
+    -ms-animation: progressmove 2s linear infinite;
224
+    animation: progressmove 2s linear infinite;
225
+
226
+    -webkit-transform: translateZ(0);
227
+}
228
+
229
+@-webkit-keyframes progressmove {
230
+    0% {
231
+        background-position: 0 0;
232
+    }
233
+    100% {
234
+        background-position: 17px 0;
235
+    }
236
+}
237
+
238
+@-moz-keyframes progressmove {
239
+    0% {
240
+        background-position: 0 0;
241
+    }
242
+    100% {
243
+        background-position: 17px 0;
244
+    }
245
+}
246
+
247
+@keyframes progressmove {
248
+    0% {
249
+        background-position: 0 0;
250
+    }
251
+    100% {
252
+        background-position: 17px 0;
253
+    }
254
+}
255
+
256
+#upload .filelist li p.imgWrap {
257
+    position: relative;
258
+    z-index: 2;
259
+    line-height: 113px;
260
+    vertical-align: middle;
261
+    overflow: hidden;
262
+    width: 113px;
263
+    height: 113px;
264
+
265
+    -webkit-transform-origin: 50% 50%;
266
+    -moz-transform-origin: 50% 50%;
267
+    -o-transform-origin: 50% 50%;
268
+    -ms-transform-origin: 50% 50%;
269
+    transform-origin: 50% 50%;
270
+
271
+    -webit-transition: 200ms ease-out;
272
+    -moz-transition: 200ms ease-out;
273
+    -o-transition: 200ms ease-out;
274
+    -ms-transition: 200ms ease-out;
275
+    transition: 200ms ease-out;
276
+}
277
+#upload .filelist li p.imgWrap.notimage {
278
+    margin-top: 0;
279
+    width: 111px;
280
+    height: 111px;
281
+    border: 1px #eeeeee solid;
282
+}
283
+#upload .filelist li p.imgWrap.notimage i.file-preview {
284
+    margin-top: 15px;
285
+}
286
+
287
+#upload .filelist li img {
288
+    width: 100%;
289
+}
290
+
291
+#upload .filelist li p.error {
292
+    background: #f43838;
293
+    color: #fff;
294
+    position: absolute;
295
+    bottom: 0;
296
+    left: 0;
297
+    height: 28px;
298
+    line-height: 28px;
299
+    width: 100%;
300
+    z-index: 100;
301
+    display:none;
302
+}
303
+
304
+#upload .filelist li .success {
305
+    display: block;
306
+    position: absolute;
307
+    left: 0;
308
+    bottom: 0;
309
+    height: 40px;
310
+    width: 100%;
311
+    z-index: 200;
312
+    background: url(./images/success.png) no-repeat right bottom;
313
+    background-image: url(./images/success.gif) \9;
314
+}
315
+
316
+#upload .filelist li.filePickerBlock {
317
+    width: 113px;
318
+    height: 113px;
319
+    background: url(../fonts/images/addfile.svg) no-repeat center;
320
+    border: 1px solid #eeeeee;
321
+    border-radius: 0;
322
+}
323
+#upload .filelist li.filePickerBlock div.webuploader-pick  {
324
+    width: 100%;
325
+    height: 100%;
326
+    margin: 0;
327
+    padding: 0;
328
+    opacity: 0;
329
+    background: none;
330
+    font-size: 0;
331
+}
332
+
333
+#upload .filelist div.file-panel {
334
+    position: absolute;
335
+    height: 0;
336
+    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
337
+    background: rgba(0, 0, 0, 0.5);
338
+    width: 100%;
339
+    top: 0;
340
+    left: 0;
341
+    overflow: hidden;
342
+    z-index: 300;
343
+}
344
+
345
+#upload .filelist div.file-panel span {
346
+    width: 24px;
347
+    height: 24px;
348
+    display: inline;
349
+    float: right;
350
+    text-indent: -9999px;
351
+    overflow: hidden;
352
+    background: url(./images/icons.png) no-repeat;
353
+    background: url(./images/icons.gif) no-repeat \9;
354
+    margin: 5px 1px 1px;
355
+    cursor: pointer;
356
+    -webkit-tap-highlight-color: rgba(0,0,0,0);
357
+    -webkit-user-select: none;
358
+    -moz-user-select: none;
359
+    -ms-user-select: none;
360
+    user-select: none;
361
+}
362
+
363
+#upload .filelist div.file-panel span.rotateLeft {
364
+    display:none;
365
+    background-position: 0 -24px;
366
+}
367
+
368
+#upload .filelist div.file-panel span.rotateLeft:hover {
369
+    background-position: 0 0;
370
+}
371
+
372
+#upload .filelist div.file-panel span.rotateRight {
373
+    display:none;
374
+    background-position: -24px -24px;
375
+}
376
+
377
+#upload .filelist div.file-panel span.rotateRight:hover {
378
+    background-position: -24px 0;
379
+}
380
+
381
+#upload .filelist div.file-panel span.cancel {
382
+    background-position: -48px -24px;
383
+}
384
+
385
+#upload .filelist div.file-panel span.cancel:hover {
386
+    background-position: -48px 0;
387
+}
388
+
389
+#upload .statusBar {
390
+    height: 45px;
391
+    border-bottom: 1px solid #dadada;
392
+    margin: 0 10px;
393
+    padding: 0;
394
+    line-height: 45px;
395
+    vertical-align: middle;
396
+    position: relative;
397
+}
398
+
399
+#upload .statusBar .progress {
400
+    border: 1px solid #1483d8;
401
+    width: 198px;
402
+    background: #fff;
403
+    height: 18px;
404
+    position: absolute;
405
+    top: 12px;
406
+    display: none;
407
+    text-align: center;
408
+    line-height: 18px;
409
+    color: #6dbfff;
410
+    margin: 0 10px 0 0;
411
+}
412
+#upload .statusBar .progress span.percentage {
413
+    width: 0;
414
+    height: 100%;
415
+    left: 0;
416
+    top: 0;
417
+    background: #1483d8;
418
+    position: absolute;
419
+}
420
+#upload .statusBar .progress span.text {
421
+    position: relative;
422
+    z-index: 10;
423
+}
424
+
425
+#upload .statusBar .info {
426
+    display: inline-block;
427
+    font-size: 14px;
428
+    color: #666666;
429
+}
430
+
431
+#upload .statusBar .btns {
432
+    position: absolute;
433
+    top: 7px;
434
+    right: 0;
435
+    line-height: 30px;
436
+}
437
+
438
+#filePickerBtn {
439
+    display: inline-block;
440
+    float: left;
441
+}
442
+#upload .statusBar .btns .webuploader-pick,
443
+#upload .statusBar .btns .uploadBtn,
444
+#upload .statusBar .btns .uploadBtn.state-uploading,
445
+#upload .statusBar .btns .uploadBtn.state-paused {
446
+    background: #ffffff;
447
+    border: 1px solid #cfcfcf;
448
+    color: #565656;
449
+    padding: 0 18px;
450
+    display: inline-block;
451
+    border-radius: 3px;
452
+    margin-left: 10px;
453
+    cursor: pointer;
454
+    font-size: 14px;
455
+    float: left;
456
+    -webkit-user-select: none;
457
+    -moz-user-select: none;
458
+    -ms-user-select: none;
459
+    user-select: none;
460
+}
461
+#upload .statusBar .btns .webuploader-pick-hover,
462
+#upload .statusBar .btns .uploadBtn:hover,
463
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
464
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
465
+    background: #f0f0f0;
466
+}
467
+
468
+#upload .statusBar .btns .uploadBtn,
469
+#upload .statusBar .btns .uploadBtn.state-paused{
470
+    background: #00b7ee;
471
+    color: #fff;
472
+    border-color: transparent;
473
+}
474
+#upload .statusBar .btns .uploadBtn:hover,
475
+#upload .statusBar .btns .uploadBtn.state-paused:hover{
476
+    background: #00a2d4;
477
+}
478
+
479
+#upload .statusBar .btns .uploadBtn.disabled {
480
+    pointer-events: none;
481
+    filter:alpha(opacity=60);
482
+    -moz-opacity:0.6;
483
+    -khtml-opacity: 0.6;
484
+    opacity: 0.6;
485
+}
486
+
487
+
488
+
489
+/* 图片管理样式 */
490
+#online {
491
+    width: 100%;
492
+    height: 336px;
493
+    padding: 10px 0 0 0;
494
+}
495
+#online #fileList{
496
+    width: 100%;
497
+    height: 100%;
498
+    overflow-x: hidden;
499
+    overflow-y: auto;
500
+    position: relative;
501
+}
502
+#online ul {
503
+    display: block;
504
+    list-style: none;
505
+    margin: 0;
506
+    padding: 0;
507
+}
508
+#online li {
509
+    float: left;
510
+    display: block;
511
+    list-style: none;
512
+    padding: 0;
513
+    width: 113px;
514
+    height: 113px;
515
+    margin: 0 0 9px 9px;
516
+    *margin: 0 0 6px 6px;
517
+    background-color: #eee;
518
+    overflow: hidden;
519
+    cursor: pointer;
520
+    position: relative;
521
+}
522
+#online li.clearFloat {
523
+    float: none;
524
+    clear: both;
525
+    display: block;
526
+    width:0;
527
+    height:0;
528
+    margin: 0;
529
+    padding: 0;
530
+}
531
+#online li img {
532
+    cursor: pointer;
533
+}
534
+#online li div.file-wrapper {
535
+    cursor: pointer;
536
+    position: absolute;
537
+    display: block;
538
+    width: 111px;
539
+    height: 111px;
540
+    border: 1px solid #eee;
541
+    background: url("./images/bg.png") repeat;
542
+}
543
+#online li div span.file-title{
544
+    display: block;
545
+    padding: 0 3px;
546
+    margin: 3px 0 0 0;
547
+    font-size: 12px;
548
+    height: 15px;
549
+    color: #555555;
550
+    text-align: center;
551
+    width: 107px;
552
+    white-space: nowrap;
553
+    word-break: break-all;
554
+    overflow: hidden;
555
+    text-overflow: ellipsis;
556
+}
557
+#online li .icon {
558
+    cursor: pointer;
559
+    width: 113px;
560
+    height: 113px;
561
+    position: absolute;
562
+    top: 0;
563
+    left: 0;
564
+    z-index: 2;
565
+    border: 0;
566
+    background-repeat: no-repeat;
567
+}
568
+#online li .icon:hover {
569
+    width: 107px;
570
+    height: 107px;
571
+    border: 3px solid #1094fa;
572
+}
573
+#online li.selected .icon {
574
+    background-image: url(images/success.png);
575
+    background-image: url(images/success.gif) \9;
576
+    background-position: 75px 75px;
577
+}
578
+#online li.selected .icon:hover {
579
+    width: 107px;
580
+    height: 107px;
581
+    border: 3px solid #1094fa;
582
+    background-position: 72px 72px;
583
+}
584
+
585
+
586
+/* 在线文件的文件预览图标 */
587
+i.file-preview {
588
+    display: block;
589
+    margin: 10px auto;
590
+    width: 70px;
591
+    height: 70px;
592
+    background-image: url("./images/file-icons.png");
593
+    background-image: url("./images/file-icons.gif") \9;
594
+    background-position: -140px center;
595
+    background-repeat: no-repeat;
596
+}
597
+i.file-preview.file-type-dir{
598
+    background-position: 0 center;
599
+}
600
+i.file-preview.file-type-file{
601
+    background-position: -140px center;
602
+}
603
+i.file-preview.file-type-filelist{
604
+    background-position: -210px center;
605
+}
606
+i.file-preview.file-type-zip,
607
+i.file-preview.file-type-rar,
608
+i.file-preview.file-type-7z,
609
+i.file-preview.file-type-tar,
610
+i.file-preview.file-type-gz,
611
+i.file-preview.file-type-bz2{
612
+    background-position: -280px center;
613
+}
614
+i.file-preview.file-type-xls,
615
+i.file-preview.file-type-xlsx{
616
+    background-position: -350px center;
617
+}
618
+i.file-preview.file-type-doc,
619
+i.file-preview.file-type-docx{
620
+    background-position: -420px center;
621
+}
622
+i.file-preview.file-type-ppt,
623
+i.file-preview.file-type-pptx{
624
+    background-position: -490px center;
625
+}
626
+i.file-preview.file-type-vsd{
627
+    background-position: -560px center;
628
+}
629
+i.file-preview.file-type-pdf{
630
+    background-position: -630px center;
631
+}
632
+i.file-preview.file-type-txt,
633
+i.file-preview.file-type-md,
634
+i.file-preview.file-type-json,
635
+i.file-preview.file-type-htm,
636
+i.file-preview.file-type-xml,
637
+i.file-preview.file-type-html,
638
+i.file-preview.file-type-js,
639
+i.file-preview.file-type-css,
640
+i.file-preview.file-type-php,
641
+i.file-preview.file-type-jsp,
642
+i.file-preview.file-type-asp{
643
+    background-position: -700px center;
644
+}
645
+i.file-preview.file-type-apk{
646
+    background-position: -770px center;
647
+}
648
+i.file-preview.file-type-exe{
649
+    background-position: -840px center;
650
+}
651
+i.file-preview.file-type-ipa{
652
+    background-position: -910px center;
653
+}
654
+i.file-preview.file-type-mp4,
655
+i.file-preview.file-type-swf,
656
+i.file-preview.file-type-mkv,
657
+i.file-preview.file-type-avi,
658
+i.file-preview.file-type-flv,
659
+i.file-preview.file-type-mov,
660
+i.file-preview.file-type-mpg,
661
+i.file-preview.file-type-mpeg,
662
+i.file-preview.file-type-ogv,
663
+i.file-preview.file-type-webm,
664
+i.file-preview.file-type-rm,
665
+i.file-preview.file-type-rmvb{
666
+    background-position: -980px center;
667
+}
668
+i.file-preview.file-type-ogg,
669
+i.file-preview.file-type-wav,
670
+i.file-preview.file-type-wmv,
671
+i.file-preview.file-type-mid,
672
+i.file-preview.file-type-mp3{
673
+    background-position: -1050px center;
674
+}
675
+i.file-preview.file-type-jpg,
676
+i.file-preview.file-type-jpeg,
677
+i.file-preview.file-type-gif,
678
+i.file-preview.file-type-bmp,
679
+i.file-preview.file-type-png,
680
+i.file-preview.file-type-psd{
681
+    background-position: -140px center;
682
+}

+ 60 - 0
static/neditor/dialogs/attachment/attachment.html Целия файл

@@ -0,0 +1,60 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+    <meta charset="UTF-8">
5
+    <title>neditor图片对话框</title>
6
+    <script type="text/javascript" src="../internal.js"></script>
7
+
8
+    <!-- jquery -->
9
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
10
+
11
+    <!-- webuploader -->
12
+    <script src="../../third-party/webuploader/webuploader.js"></script>
13
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
14
+
15
+    <!-- attachment dialog -->
16
+    <link rel="stylesheet" href="attachment.css" type="text/css" />
17
+</head>
18
+<body>
19
+
20
+    <div class="wrapper">
21
+        <div id="tabhead" class="tabhead">
22
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
23
+            <!-- <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span> -->
24
+        </div>
25
+        <div id="tabbody" class="tabbody">
26
+            <!-- 上传图片 -->
27
+            <div id="upload" class="panel focus">
28
+                <div id="queueList" class="queueList">
29
+                    <div class="statusBar element-invisible">
30
+                        <div class="progress">
31
+                            <span class="text">0%</span>
32
+                            <span class="percentage"></span>
33
+                        </div><div class="info"></div>
34
+                        <div class="btns">
35
+                            <div id="filePickerBtn"></div>
36
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
37
+                        </div>
38
+                    </div>
39
+                    <div id="dndArea" class="placeholder">
40
+                        <div class="filePickerContainer">
41
+                            <div id="filePickerReady"></div>
42
+                        </div>
43
+                    </div>
44
+                    <ul class="filelist element-invisible">
45
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
46
+                    </ul>
47
+                </div>
48
+            </div>
49
+
50
+            <!-- 在线图片 -->
51
+            <div id="online" class="panel">
52
+                <div id="fileList"><var id="lang_imgLoading"></var></div>
53
+            </div>
54
+
55
+        </div>
56
+    </div>
57
+    <script type="text/javascript" src="attachment.js"></script>
58
+
59
+</body>
60
+</html>

+ 775 - 0
static/neditor/dialogs/attachment/attachment.js Целия файл

@@ -0,0 +1,775 @@
1
+/**
2
+ * User: Jinqn
3
+ * Date: 14-04-08
4
+ * Time: 下午16:34
5
+ * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
6
+ */
7
+
8
+(function () {
9
+
10
+    var uploadFile,
11
+        onlineFile;
12
+
13
+    window.onload = function () {
14
+        initTabs();
15
+        initButtons();
16
+    };
17
+
18
+    /* 初始化tab标签 */
19
+    function initTabs() {
20
+        var tabs = $G('tabhead').children;
21
+        for (var i = 0; i < tabs.length; i++) {
22
+            domUtils.on(tabs[i], "click", function (e) {
23
+                var target = e.target || e.srcElement;
24
+                setTabFocus(target.getAttribute('data-content-id'));
25
+            });
26
+        }
27
+
28
+        setTabFocus('upload');
29
+    }
30
+
31
+    /* 初始化tabbody */
32
+    function setTabFocus(id) {
33
+        if(!id) return;
34
+        var i, bodyId, tabs = $G('tabhead').children;
35
+        for (i = 0; i < tabs.length; i++) {
36
+            bodyId = tabs[i].getAttribute('data-content-id')
37
+            if (bodyId == id) {
38
+                domUtils.addClass(tabs[i], 'focus');
39
+                domUtils.addClass($G(bodyId), 'focus');
40
+            } else {
41
+                domUtils.removeClasses(tabs[i], 'focus');
42
+                domUtils.removeClasses($G(bodyId), 'focus');
43
+            }
44
+        }
45
+        switch (id) {
46
+            case 'upload':
47
+                uploadFile = uploadFile || new UploadFile('queueList');
48
+                break;
49
+            case 'online':
50
+                onlineFile = onlineFile || new OnlineFile('fileList');
51
+                break;
52
+        }
53
+    }
54
+
55
+    /* 初始化onok事件 */
56
+    function initButtons() {
57
+
58
+        dialog.onok = function () {
59
+            var list = [], id, tabs = $G('tabhead').children;
60
+            for (var i = 0; i < tabs.length; i++) {
61
+                if (domUtils.hasClass(tabs[i], 'focus')) {
62
+                    id = tabs[i].getAttribute('data-content-id');
63
+                    break;
64
+                }
65
+            }
66
+
67
+            switch (id) {
68
+                case 'upload':
69
+                    list = uploadFile.getInsertList();
70
+                    var count = uploadFile.getQueueCount();
71
+                    if (count) {
72
+                        $('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
73
+                        return false;
74
+                    }
75
+                    break;
76
+                case 'online':
77
+                    list = onlineFile.getInsertList();
78
+                    break;
79
+            }
80
+
81
+            editor.execCommand('insertfile', list);
82
+        };
83
+    }
84
+
85
+
86
+    /* 上传附件 */
87
+    function UploadFile(target) {
88
+        this.$wrap = target.constructor == String ? $('#' + target) : $(target);
89
+        this.init();
90
+    }
91
+    UploadFile.prototype = {
92
+        init: function () {
93
+            this.fileList = [];
94
+            this.initContainer();
95
+            this.initUploader();
96
+        },
97
+        initContainer: function () {
98
+            this.$queue = this.$wrap.find('.filelist');
99
+        },
100
+        /* 初始化容器 */
101
+        initUploader: function () {
102
+            var _this = this,
103
+                $ = jQuery,    // just in case. Make sure it's not an other libaray.
104
+                $wrap = _this.$wrap,
105
+            // 图片容器
106
+                $queue = $wrap.find('.filelist'),
107
+            // 状态栏,包括进度和控制按钮
108
+                $statusBar = $wrap.find('.statusBar'),
109
+            // 文件总体选择信息。
110
+                $info = $statusBar.find('.info'),
111
+            // 上传按钮
112
+                $upload = $wrap.find('.uploadBtn'),
113
+            // 上传按钮
114
+                $filePickerBtn = $wrap.find('.filePickerBtn'),
115
+            // 上传按钮
116
+                $filePickerBlock = $wrap.find('.filePickerBlock'),
117
+            // 没选择文件之前的内容。
118
+                $placeHolder = $wrap.find('.placeholder'),
119
+            // 总体进度条
120
+                $progress = $statusBar.find('.progress').hide(),
121
+            // 添加的文件数量
122
+                fileCount = 0,
123
+            // 添加的文件总大小
124
+                fileSize = 0,
125
+            // 优化retina, 在retina下这个值是2
126
+                ratio = window.devicePixelRatio || 1,
127
+            // 缩略图大小
128
+                thumbnailWidth = 113 * ratio,
129
+                thumbnailHeight = 113 * ratio,
130
+            // 可能有pedding, ready, uploading, confirm, done.
131
+                state = '',
132
+            // 所有文件的进度信息,key为file id
133
+                percentages = {},
134
+                supportTransition = (function () {
135
+                    var s = document.createElement('p').style,
136
+                        r = 'transition' in s ||
137
+                            'WebkitTransition' in s ||
138
+                            'MozTransition' in s ||
139
+                            'msTransition' in s ||
140
+                            'OTransition' in s;
141
+                    s = null;
142
+                    return r;
143
+                })(),
144
+            // WebUploader实例
145
+                uploader,
146
+                actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
147
+                fileMaxSize = editor.getOpt('fileMaxSize'),
148
+                acceptExtensions = (editor.getOpt('fileAllowFiles') || 
149
+                    [".txt",".doc",".docs",".xls",".xlsx",".ppt",".pdf",".odt",".ott",".fodt",".uot",".xml",".dot",".htm",".html",".rtf",".docm",".zip",".rar",".tar",".7z",".tar.gz",".tar.bz",".tar.xz"]).join('').replace(/\./g, ',').replace(/^[,]/, '');;
150
+            if (!WebUploader.Uploader.support()) {
151
+                $('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
152
+                return;
153
+            } else if (!editor.getOpt('fileActionName')) {
154
+                $('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
155
+                return;
156
+            }
157
+
158
+            uploader = _this.uploader = WebUploader.create({
159
+                pick: {
160
+                    id: '#filePickerReady',
161
+                    label: lang.uploadSelectFile
162
+                },
163
+                swf: '../../third-party/webuploader/Uploader.swf',
164
+                server: actionUrl,
165
+                fileVal: editor.getOpt('fileFieldName'),
166
+                duplicate: true,
167
+                fileSingleSizeLimit: fileMaxSize,
168
+                compress: false
169
+            });
170
+            uploader.addButton({
171
+                id: '#filePickerBlock'
172
+            });
173
+            uploader.addButton({
174
+                id: '#filePickerBtn',
175
+                label: lang.uploadAddFile
176
+            });
177
+
178
+            setState('pedding');
179
+
180
+            // 当有文件添加进来时执行,负责view的创建
181
+            function addFile(file) {
182
+                var $li = $('<li id="' + file.id + '">' +
183
+                        '<p class="title">' + file.name + '</p>' +
184
+                        '<p class="imgWrap"></p>' +
185
+                        '<p class="progress"><span></span></p>' +
186
+                        '</li>'),
187
+
188
+                    $btns = $('<div class="file-panel">' +
189
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
190
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
191
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
192
+                    $prgress = $li.find('p.progress span'),
193
+                    $wrap = $li.find('p.imgWrap'),
194
+                    $info = $('<p class="error"></p>').hide().appendTo($li),
195
+
196
+                    showError = function (code) {
197
+                        switch (code) {
198
+                            case 'exceed_size':
199
+                                text = lang.errorExceedSize;
200
+                                break;
201
+                            case 'interrupt':
202
+                                text = lang.errorInterrupt;
203
+                                break;
204
+                            case 'http':
205
+                                text = lang.errorHttp;
206
+                                break;
207
+                            case 'not_allow_type':
208
+                                text = lang.errorFileType;
209
+                                break;
210
+                            default:
211
+                                text = lang.errorUploadRetry;
212
+                                break;
213
+                        }
214
+                        $info.text(text).show();
215
+                    };
216
+
217
+                if (file.getStatus() === 'invalid') {
218
+                    showError(file.statusText);
219
+                } else {
220
+                    $wrap.text(lang.uploadPreview);
221
+                    if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
222
+                        $wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
223
+                        '<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
224
+                    } else {
225
+                        if (browser.ie && browser.version <= 7) {
226
+                            $wrap.text(lang.uploadNoPreview);
227
+                        } else {
228
+                            uploader.makeThumb(file, function (error, src) {
229
+                                if (error || !src) {
230
+                                    $wrap.text(lang.uploadNoPreview);
231
+                                } else {
232
+                                    var $img = $('<img src="' + src + '">');
233
+                                    $wrap.empty().append($img);
234
+                                    $img.on('error', function () {
235
+                                        $wrap.text(lang.uploadNoPreview);
236
+                                    });
237
+                                }
238
+                            }, thumbnailWidth, thumbnailHeight);
239
+                        }
240
+                    }
241
+                    percentages[ file.id ] = [ file.size, 0 ];
242
+                    file.rotation = 0;
243
+
244
+                    /* 检查文件格式 */
245
+                    if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
246
+                        showError('not_allow_type');
247
+                        uploader.removeFile(file);
248
+                    }
249
+                }
250
+
251
+                file.on('statuschange', function (cur, prev) {
252
+                    if (prev === 'progress') {
253
+                        $prgress.hide().width(0);
254
+                    } else if (prev === 'queued') {
255
+                        $li.off('mouseenter mouseleave');
256
+                        $btns.remove();
257
+                    }
258
+                    // 成功
259
+                    if (cur === 'error' || cur === 'invalid') {
260
+                        showError(file.statusText);
261
+                        percentages[ file.id ][ 1 ] = 1;
262
+                    } else if (cur === 'interrupt') {
263
+                        showError('interrupt');
264
+                    } else if (cur === 'queued') {
265
+                        percentages[ file.id ][ 1 ] = 0;
266
+                    } else if (cur === 'progress') {
267
+                        $info.hide();
268
+                        $prgress.css('display', 'block');
269
+                    } else if (cur === 'complete') {
270
+                    }
271
+
272
+                    $li.removeClass('state-' + prev).addClass('state-' + cur);
273
+                });
274
+
275
+                $li.on('mouseenter', function () {
276
+                    $btns.stop().animate({height: 30});
277
+                });
278
+                $li.on('mouseleave', function () {
279
+                    $btns.stop().animate({height: 0});
280
+                });
281
+
282
+                $btns.on('click', 'span', function () {
283
+                    var index = $(this).index(),
284
+                        deg;
285
+
286
+                    switch (index) {
287
+                        case 0:
288
+                            uploader.removeFile(file);
289
+                            return;
290
+                        case 1:
291
+                            file.rotation += 90;
292
+                            break;
293
+                        case 2:
294
+                            file.rotation -= 90;
295
+                            break;
296
+                    }
297
+
298
+                    if (supportTransition) {
299
+                        deg = 'rotate(' + file.rotation + 'deg)';
300
+                        $wrap.css({
301
+                            '-webkit-transform': deg,
302
+                            '-mos-transform': deg,
303
+                            '-o-transform': deg,
304
+                            'transform': deg
305
+                        });
306
+                    } else {
307
+                        $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
308
+                    }
309
+
310
+                });
311
+
312
+                $li.insertBefore($filePickerBlock);
313
+            }
314
+
315
+            // 负责view的销毁
316
+            function removeFile(file) {
317
+                var $li = $('#' + file.id);
318
+                delete percentages[ file.id ];
319
+                updateTotalProgress();
320
+                $li.off().find('.file-panel').off().end().remove();
321
+            }
322
+
323
+            function updateTotalProgress() {
324
+                var loaded = 0,
325
+                    total = 0,
326
+                    spans = $progress.children(),
327
+                    percent;
328
+
329
+                $.each(percentages, function (k, v) {
330
+                    total += v[ 0 ];
331
+                    loaded += v[ 0 ] * v[ 1 ];
332
+                });
333
+
334
+                percent = total ? loaded / total : 0;
335
+
336
+                spans.eq(0).text(Math.round(percent * 100) + '%');
337
+                spans.eq(1).css('width', Math.round(percent * 100) + '%');
338
+                updateStatus();
339
+            }
340
+
341
+            function setState(val, files) {
342
+
343
+                if (val != state) {
344
+
345
+                    var stats = uploader.getStats();
346
+
347
+                    $upload.removeClass('state-' + state);
348
+                    $upload.addClass('state-' + val);
349
+
350
+                    switch (val) {
351
+
352
+                        /* 未选择文件 */
353
+                        case 'pedding':
354
+                            $queue.addClass('element-invisible');
355
+                            $statusBar.addClass('element-invisible');
356
+                            $placeHolder.removeClass('element-invisible');
357
+                            $progress.hide(); $info.hide();
358
+                            uploader.refresh();
359
+                            break;
360
+
361
+                        /* 可以开始上传 */
362
+                        case 'ready':
363
+                            $placeHolder.addClass('element-invisible');
364
+                            $queue.removeClass('element-invisible');
365
+                            $statusBar.removeClass('element-invisible');
366
+                            $progress.hide(); $info.show();
367
+                            $upload.text(lang.uploadStart);
368
+                            uploader.refresh();
369
+                            break;
370
+
371
+                        /* 上传中 */
372
+                        case 'uploading':
373
+                            $progress.show(); $info.hide();
374
+                            $upload.text(lang.uploadPause);
375
+                            break;
376
+
377
+                        /* 暂停上传 */
378
+                        case 'paused':
379
+                            $progress.show(); $info.hide();
380
+                            $upload.text(lang.uploadContinue);
381
+                            break;
382
+
383
+                        case 'confirm':
384
+                            $progress.show(); $info.hide();
385
+                            $upload.text(lang.uploadStart);
386
+
387
+                            stats = uploader.getStats();
388
+                            if (stats.successNum && !stats.uploadFailNum) {
389
+                                setState('finish');
390
+                                return;
391
+                            }
392
+                            break;
393
+
394
+                        case 'finish':
395
+                            $progress.hide(); $info.show();
396
+                            if (stats.uploadFailNum) {
397
+                                $upload.text(lang.uploadRetry);
398
+                            } else {
399
+                                $upload.text(lang.uploadStart);
400
+                            }
401
+                            break;
402
+                    }
403
+
404
+                    state = val;
405
+                    updateStatus();
406
+
407
+                }
408
+
409
+                if (!_this.getQueueCount()) {
410
+                    $upload.addClass('disabled')
411
+                } else {
412
+                    $upload.removeClass('disabled')
413
+                }
414
+
415
+            }
416
+
417
+            function updateStatus() {
418
+                var text = '', stats;
419
+
420
+                if (state === 'ready') {
421
+                    text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
422
+                } else if (state === 'confirm') {
423
+                    stats = uploader.getStats();
424
+                    if (stats.uploadFailNum) {
425
+                        text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
426
+                    }
427
+                } else {
428
+                    stats = uploader.getStats();
429
+                    text = lang.updateStatusFinish.replace('_', fileCount).
430
+                        replace('_KB', WebUploader.formatSize(fileSize)).
431
+                        replace('_', stats.successNum);
432
+
433
+                    if (stats.uploadFailNum) {
434
+                        text += lang.updateStatusError.replace('_', stats.uploadFailNum);
435
+                    }
436
+                }
437
+
438
+                $info.html(text);
439
+            }
440
+
441
+            uploader.on('fileQueued', function (file) {
442
+                /* 选择文件后设置上传相关的url和自定义参数 */
443
+                editor.getOpt("fileUploadService")(_this, editor).setUploadData(file);
444
+
445
+                if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
446
+                    fileCount++;
447
+                    fileSize += file.size;
448
+                }
449
+
450
+                if (fileCount === 1) {
451
+                    $placeHolder.addClass('element-invisible');
452
+                    $statusBar.show();
453
+                }
454
+
455
+                addFile(file);
456
+            });
457
+
458
+            uploader.on('fileDequeued', function (file) {
459
+                if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
460
+                    fileCount--;
461
+                    fileSize -= file.size;
462
+                }
463
+
464
+                removeFile(file);
465
+                updateTotalProgress();
466
+            });
467
+
468
+            uploader.on('filesQueued', function (file) {
469
+                if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
470
+                    setState('ready');
471
+                }
472
+                updateTotalProgress();
473
+            });
474
+
475
+            uploader.on('all', function (type, files) {
476
+                switch (type) {
477
+                    case 'uploadFinished':
478
+                        setState('confirm', files);
479
+                        break;
480
+                    case 'startUpload':
481
+                        /* 设置Uploader配置项 */
482
+                        editor.getOpt("fileUploadService")(_this, editor).setUploaderOptions(uploader);
483
+                        setState('uploading', files);
484
+                        break;
485
+                    case 'stopUpload':
486
+                        setState('paused', files);
487
+                        break;
488
+                }
489
+            });
490
+
491
+            uploader.on('uploadBeforeSend', function (object, data, headers) {
492
+                //这里可以通过data对象添加POST参数
493
+                editor.getOpt("fileUploadService")(_this, editor).setFormData(object, data, headers);
494
+            });
495
+
496
+            uploader.on('uploadProgress', function (file, percentage) {
497
+                var $li = $('#' + file.id),
498
+                    $percent = $li.find('.progress span');
499
+
500
+                $percent.css('width', percentage * 100 + '%');
501
+                percentages[ file.id ][ 1 ] = percentage;
502
+                updateTotalProgress();
503
+            });
504
+
505
+            uploader.on('uploadSuccess', function (file, res) {
506
+                var $file = $('#' + file.id);
507
+                try {
508
+                    if (editor.getOpt("fileUploadService")(_this, editor).getResponseSuccess(res)) {
509
+                        _this.fileList.push(res);
510
+                        $file.append('<span class="success"></span>');
511
+                    } else {
512
+                        $file.find('.error').text(res.message).show();
513
+                    }
514
+                } catch (e) {
515
+                    $file.find('.error').text(lang.errorServerUpload).show();
516
+                }
517
+            });
518
+
519
+            uploader.on('uploadError', function (file, code) {
520
+            });
521
+            uploader.on('error', function (code, file) {
522
+                if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
523
+                    addFile(file);
524
+                }
525
+            });
526
+            uploader.on('uploadComplete', function (file, ret) {
527
+            });
528
+
529
+            $upload.on('click', function () {
530
+                if ($(this).hasClass('disabled')) {
531
+                    return false;
532
+                }
533
+
534
+                if (state === 'ready') {
535
+                    uploader.upload();
536
+                } else if (state === 'paused') {
537
+                    uploader.upload();
538
+                } else if (state === 'uploading') {
539
+                    uploader.stop();
540
+                }
541
+            });
542
+
543
+            $upload.addClass('state-' + state);
544
+            updateTotalProgress();
545
+        },
546
+        getQueueCount: function () {
547
+            var file, i, status, readyFile = 0, files = this.uploader.getFiles();
548
+            for (i = 0; file = files[i++]; ) {
549
+                status = file.getStatus();
550
+                if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
551
+            }
552
+            return readyFile;
553
+        },
554
+        getInsertList: function () {
555
+            var i, link, data, list = [],
556
+                prefix = editor.getOpt('fileUrlPrefix'),
557
+                fileSrcField = editor.getOpt("fileUploadService")(this, editor).fileSrcField || 'url',
558
+                fileSrc = '',
559
+                fileSrcFieldKeys = fileSrcField.split('.');
560
+
561
+            for (i = 0; i < this.fileList.length; i++) {
562
+                data = this.fileList[i];
563
+                if(fileSrcFieldKeys.length > 1) {
564
+                    function setFileSrc(obj, keys, index) {
565
+                        obj = obj[keys[index]];
566
+                        if (index < keys.length - 1) {
567
+                            setFileSrc(obj, keys, index += 1)
568
+                        } else {
569
+                            fileSrc = obj;
570
+                        }
571
+                    }
572
+    
573
+                    setFileSrc(data, fileSrcFieldKeys, 0);
574
+                } else {
575
+                    fileSrc = data[fileSrcField];
576
+                }
577
+                link = fileSrc;
578
+                list.push({
579
+                    title: data.original || link.substr(link.lastIndexOf('/') + 1),
580
+                    url: prefix + link
581
+                });
582
+            }
583
+            return list;
584
+        }
585
+    };
586
+
587
+
588
+    /* 在线附件 */
589
+    function OnlineFile(target) {
590
+        this.container = utils.isString(target) ? document.getElementById(target) : target;
591
+        this.init();
592
+    }
593
+    OnlineFile.prototype = {
594
+        init: function () {
595
+            this.initContainer();
596
+            this.initEvents();
597
+            this.initData();
598
+        },
599
+        /* 初始化容器 */
600
+        initContainer: function () {
601
+            this.container.innerHTML = '';
602
+            this.list = document.createElement('ul');
603
+            this.clearFloat = document.createElement('li');
604
+
605
+            domUtils.addClass(this.list, 'list');
606
+            domUtils.addClass(this.clearFloat, 'clearFloat');
607
+
608
+            this.list.appendChild(this.clearFloat);
609
+            this.container.appendChild(this.list);
610
+        },
611
+        /* 初始化滚动事件,滚动到地步自动拉取数据 */
612
+        initEvents: function () {
613
+            var _this = this;
614
+
615
+            /* 滚动拉取图片 */
616
+            domUtils.on($G('fileList'), 'scroll', function(e){
617
+                var panel = this;
618
+                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
619
+                    _this.getFileData();
620
+                }
621
+            });
622
+            /* 选中图片 */
623
+            domUtils.on(this.list, 'click', function (e) {
624
+                var target = e.target || e.srcElement,
625
+                    li = target.parentNode;
626
+
627
+                if (li.tagName.toLowerCase() == 'li') {
628
+                    if (domUtils.hasClass(li, 'selected')) {
629
+                        domUtils.removeClasses(li, 'selected');
630
+                    } else {
631
+                        domUtils.addClass(li, 'selected');
632
+                    }
633
+                }
634
+            });
635
+        },
636
+        /* 初始化第一次的数据 */
637
+        initData: function () {
638
+
639
+            /* 拉取数据需要使用的值 */
640
+            this.state = 0;
641
+            this.listSize = editor.getOpt('fileManagerListSize');
642
+            this.listIndex = 0;
643
+            this.listEnd = false;
644
+
645
+            /* 第一次拉取数据 */
646
+            this.getFileData();
647
+        },
648
+        /* 向后台拉取图片列表数据 */
649
+        getFileData: function () {
650
+            var _this = this;
651
+
652
+            if(!_this.listEnd && !this.isLoadingData) {
653
+                this.isLoadingData = true;
654
+                ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
655
+                    timeout: 100000,
656
+                    data: utils.extend({
657
+                            start: this.listIndex,
658
+                            size: this.listSize
659
+                        }, editor.queryCommandValue('serverparam')),
660
+                    method: 'get',
661
+                    onsuccess: function (r) {
662
+                        try {
663
+                            var json = eval('(' + r.responseText + ')');
664
+                            if (json.state == 'SUCCESS') {
665
+                                _this.pushData(json.list);
666
+                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
667
+                                if(_this.listIndex >= json.total) {
668
+                                    _this.listEnd = true;
669
+                                }
670
+                                _this.isLoadingData = false;
671
+                            }
672
+                        } catch (e) {
673
+                            if(r.responseText.indexOf('ue_separate_ue') != -1) {
674
+                                var list = r.responseText.split(r.responseText);
675
+                                _this.pushData(list);
676
+                                _this.listIndex = parseInt(list.length);
677
+                                _this.listEnd = true;
678
+                                _this.isLoadingData = false;
679
+                            }
680
+                        }
681
+                    },
682
+                    onerror: function () {
683
+                        _this.isLoadingData = false;
684
+                    }
685
+                });
686
+            }
687
+        },
688
+        /* 添加图片到列表界面上 */
689
+        pushData: function (list) {
690
+            var i, item, img, filetype, preview, icon, _this = this,
691
+                urlPrefix = editor.getOpt('fileManagerUrlPrefix');
692
+            for (i = 0; i < list.length; i++) {
693
+                if(list[i] && list[i].url) {
694
+                    item = document.createElement('li');
695
+                    icon = document.createElement('span');
696
+                    filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
697
+
698
+                    if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) {
699
+                        preview = document.createElement('img');
700
+                        domUtils.on(preview, 'load', (function(image){
701
+                            return function(){
702
+                                _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
703
+                            };
704
+                        })(preview));
705
+                        preview.width = 113;
706
+                        preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
707
+                    } else {
708
+                        var ic = document.createElement('i'),
709
+                            textSpan = document.createElement('span');
710
+                        textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
711
+                        preview = document.createElement('div');
712
+                        preview.appendChild(ic);
713
+                        preview.appendChild(textSpan);
714
+                        domUtils.addClass(preview, 'file-wrapper');
715
+                        domUtils.addClass(textSpan, 'file-title');
716
+                        domUtils.addClass(ic, 'file-type-' + filetype);
717
+                        domUtils.addClass(ic, 'file-preview');
718
+                    }
719
+                    domUtils.addClass(icon, 'icon');
720
+                    item.setAttribute('data-url', urlPrefix + list[i].url);
721
+                    if (list[i].original) {
722
+                        item.setAttribute('data-title', list[i].original);
723
+                    }
724
+
725
+                    item.appendChild(preview);
726
+                    item.appendChild(icon);
727
+                    this.list.insertBefore(item, this.clearFloat);
728
+                }
729
+            }
730
+        },
731
+        /* 改变图片大小 */
732
+        scale: function (img, w, h, type) {
733
+            var ow = img.width,
734
+                oh = img.height;
735
+
736
+            if (type == 'justify') {
737
+                if (ow >= oh) {
738
+                    img.width = w;
739
+                    img.height = h * oh / ow;
740
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
741
+                } else {
742
+                    img.width = w * ow / oh;
743
+                    img.height = h;
744
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
745
+                }
746
+            } else {
747
+                if (ow >= oh) {
748
+                    img.width = w * ow / oh;
749
+                    img.height = h;
750
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
751
+                } else {
752
+                    img.width = w;
753
+                    img.height = h * oh / ow;
754
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
755
+                }
756
+            }
757
+        },
758
+        getInsertList: function () {
759
+            var i, lis = this.list.children, list = [];
760
+            for (i = 0; i < lis.length; i++) {
761
+                if (domUtils.hasClass(lis[i], 'selected')) {
762
+                    var url = lis[i].getAttribute('data-url');
763
+                    var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
764
+                    list.push({
765
+                        title: title,
766
+                        url: url
767
+                    });
768
+                }
769
+            }
770
+            return list;
771
+        }
772
+    };
773
+
774
+
775
+})();

BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_chm.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_default.png Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_doc.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_exe.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_jpg.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_mp3.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_mv.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_pdf.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_ppt.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_psd.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_rar.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_txt.gif Целия файл


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_xls.gif Целия файл


BIN
static/neditor/dialogs/attachment/images/alignicon.gif Целия файл


BIN
static/neditor/dialogs/attachment/images/alignicon.png Целия файл


BIN
static/neditor/dialogs/attachment/images/bg.png Целия файл


BIN
static/neditor/dialogs/attachment/images/file-icons.gif Целия файл


BIN
static/neditor/dialogs/attachment/images/file-icons.png Целия файл


BIN
static/neditor/dialogs/attachment/images/icons.gif Целия файл


BIN
static/neditor/dialogs/attachment/images/icons.png Целия файл


BIN
static/neditor/dialogs/attachment/images/image.png Целия файл


BIN
static/neditor/dialogs/attachment/images/progress.png Целия файл


BIN
static/neditor/dialogs/attachment/images/success.gif Целия файл


BIN
static/neditor/dialogs/attachment/images/success.png Целия файл


+ 97 - 0
static/neditor/dialogs/background/background.css Целия файл

@@ -0,0 +1,97 @@
1
+.wrapper{ width: 424px;margin: 20px; zoom:1;position: relative}
2
+.tabbody{height:225px;}
3
+.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
4
+.tabbody .focus { display: block;}
5
+
6
+body{font-size: 12px;color: #888;overflow: hidden;}
7
+input,label{vertical-align:middle}
8
+.clear{clear: both;}
9
+.pl{padding-left: 18px;padding-left: 23px\9;}
10
+
11
+#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
12
+#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
13
+#imageList img {cursor: pointer;border: 2px solid white;}
14
+
15
+.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;border-radius: 4px;}
16
+.content div{margin: 10px 0 10px 5px;}
17
+.content .iptradio{margin: 0px 5px 5px 0px;}
18
+.txt{width:280px; margin-left: 10px;height: 26px;line-height: 26px; border-radius: 5px;border: 1px solid #ccc;}
19
+
20
+.wrapcolor{height: 19px;}
21
+div.color{float: left;margin: 0;}
22
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0 0 0 10px;float: left;}
23
+div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
24
+#custom input{height: 15px;min-height: 15px;width:20px;}
25
+#repeatType{width:100px;
26
+    margin-left: 10px;
27
+    border-radius: 4px;
28
+    height: 23px;}
29
+
30
+
31
+/* 图片管理样式 */
32
+#imgManager {
33
+    width: 100%;
34
+    height: 225px;
35
+}
36
+#imgManager #imageList{
37
+    width: 100%;
38
+    overflow-x: hidden;
39
+    overflow-y: auto;
40
+}
41
+#imgManager ul {
42
+    display: block;
43
+    list-style: none;
44
+    margin: 0;
45
+    padding: 0;
46
+}
47
+#imgManager li {
48
+    float: left;
49
+    display: block;
50
+    list-style: none;
51
+    padding: 0;
52
+    width: 113px;
53
+    height: 113px;
54
+    margin: 9px 0 0 19px;
55
+    background-color: #eee;
56
+    overflow: hidden;
57
+    cursor: pointer;
58
+    position: relative;
59
+}
60
+#imgManager li.clearFloat {
61
+    float: none;
62
+    clear: both;
63
+    display: block;
64
+    width:0;
65
+    height:0;
66
+    margin: 0;
67
+    padding: 0;
68
+}
69
+#imgManager li img {
70
+    cursor: pointer;
71
+}
72
+#imgManager li .icon {
73
+    cursor: pointer;
74
+    width: 113px;
75
+    height: 113px;
76
+    position: absolute;
77
+    top: 0;
78
+    left: 0;
79
+    z-index: 2;
80
+    border: 0;
81
+    background-repeat: no-repeat;
82
+}
83
+#imgManager li .icon:hover {
84
+    width: 107px;
85
+    height: 107px;
86
+    border: 3px solid #1094fa;
87
+}
88
+#imgManager li.selected .icon {
89
+    background-image: url(images/success.png);
90
+    background-position: 75px 75px;
91
+}
92
+#imgManager li.selected .icon:hover {
93
+    width: 107px;
94
+    height: 107px;
95
+    border: 3px solid #1094fa;
96
+    background-position: 72px 72px;
97
+}

+ 56 - 0
static/neditor/dialogs/background/background.html Целия файл

@@ -0,0 +1,56 @@
1
+<!DOCTYPE HTML>
2
+<html>
3
+<head>
4
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
5
+    <script type="text/javascript" src="../internal.js"></script>
6
+    <link rel="stylesheet" type="text/css" href="background.css">
7
+</head>
8
+<body>
9
+    <div id="bg_container" class="wrapper">
10
+        <div id="tabHeads" class="tabhead">
11
+            <span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
12
+            <!-- <span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span> -->
13
+        </div>
14
+        <div id="tabBodys" class="tabbody">
15
+            <div id="normal" class="panel focus">
16
+                <fieldset class="bgarea">
17
+                    <legend><var id="lang_background_set"></var></legend>
18
+                    <div class="content">
19
+                        <div>
20
+                            <label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
21
+                            <label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
22
+                        </div>
23
+                        <div class="wrapcolor pl">
24
+                            <div class="color">
25
+                                <var id="lang_background_color"></var>:
26
+                            </div>
27
+                            <div id="colorPicker"></div>
28
+                            <div class="clear"></div>
29
+                        </div>
30
+                        <div class="wrapcolor pl">
31
+                            <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
32
+                        </div>
33
+                        <div id="alignment" class="alignment">
34
+                            <var id="lang_background_align"></var>:<select id="repeatType">
35
+                                <option value="center"></option>
36
+                                <option value="repeat-x"></option>
37
+                                <option value="repeat-y"></option>
38
+                                <option value="repeat"></option>
39
+                                <option value="self"></option>
40
+                            </select>
41
+                        </div>
42
+                        <div id="custom" >
43
+                            <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
44
+                        </div>
45
+                    </div>
46
+                </fieldset>
47
+
48
+            </div>
49
+            <div id="imgManager" class="panel">
50
+                <div id="imageList" style=""></div>
51
+            </div>
52
+        </div>
53
+    </div>
54
+    <script type="text/javascript" src="background.js"></script>
55
+</body>
56
+</html>

+ 376 - 0
static/neditor/dialogs/background/background.js Целия файл

@@ -0,0 +1,376 @@
1
+(function () {
2
+
3
+    var onlineImage,
4
+        backupStyle = editor.queryCommandValue('background');
5
+
6
+    window.onload = function () {
7
+        initTabs();
8
+        initColorSelector();
9
+    };
10
+
11
+    /* 初始化tab标签 */
12
+    function initTabs(){
13
+        var tabs = $G('tabHeads').children;
14
+        for (var i = 0; i < tabs.length; i++) {
15
+            domUtils.on(tabs[i], "click", function (e) {
16
+                var target = e.target || e.srcElement;
17
+                for (var j = 0; j < tabs.length; j++) {
18
+                    if(tabs[j] == target){
19
+                        tabs[j].className = "focus";
20
+                        var contentId = tabs[j].getAttribute('data-content-id');
21
+                        $G(contentId).style.display = "block";
22
+                        if(contentId == 'imgManager') {
23
+                            initImagePanel();
24
+                        }
25
+                    }else {
26
+                        tabs[j].className = "";
27
+                        $G(tabs[j].getAttribute('data-content-id')).style.display = "none";
28
+                    }
29
+                }
30
+            });
31
+        }
32
+    }
33
+
34
+    /* 初始化颜色设置 */
35
+    function initColorSelector () {
36
+        var obj = editor.queryCommandValue('background');
37
+        if (obj) {
38
+            var color = obj['background-color'],
39
+                repeat = obj['background-repeat'] || 'repeat',
40
+                image = obj['background-image'] || '',
41
+                position = obj['background-position'] || 'center center',
42
+                pos = position.split(' '),
43
+                x = parseInt(pos[0]) || 0,
44
+                y = parseInt(pos[1]) || 0;
45
+
46
+            if(repeat == 'no-repeat' && (x || y)) repeat = 'self';
47
+
48
+            image = image.match(/url[\s]*\(([^\)]*)\)/);
49
+            image = image ? image[1]:'';
50
+            updateFormState('colored', color, image, repeat, x, y);
51
+        } else {
52
+            updateFormState();
53
+        }
54
+
55
+        var updateHandler = function () {
56
+            updateFormState();
57
+            updateBackground();
58
+        }
59
+        domUtils.on($G('nocolorRadio'), 'click', updateBackground);
60
+        domUtils.on($G('coloredRadio'), 'click', updateHandler);
61
+        domUtils.on($G('url'), 'keyup', function(){
62
+            if($G('url').value && $G('alignment').style.display == "none") {
63
+                utils.each($G('repeatType').children, function(item){
64
+                    item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);
65
+                });
66
+            }
67
+            updateHandler();
68
+        });
69
+        domUtils.on($G('repeatType'), 'change', updateHandler);
70
+        domUtils.on($G('x'), 'keyup', updateBackground);
71
+        domUtils.on($G('y'), 'keyup', updateBackground);
72
+
73
+        initColorPicker();
74
+    }
75
+
76
+    /* 初始化颜色选择器 */
77
+    function initColorPicker() {
78
+        var me = editor,
79
+            cp = $G("colorPicker");
80
+
81
+        /* 生成颜色选择器ui对象 */
82
+        var popup = new UE.ui.Popup({
83
+            content: new UE.ui.ColorPicker({
84
+                noColorText: me.getLang("clearColor"),
85
+                editor: me,
86
+                onpickcolor: function (t, color) {
87
+                    updateFormState('colored', color);
88
+                    updateBackground();
89
+                    UE.ui.Popup.postHide();
90
+                },
91
+                onpicknocolor: function (t, color) {
92
+                    updateFormState('colored', 'transparent');
93
+                    updateBackground();
94
+                    UE.ui.Popup.postHide();
95
+                }
96
+            }),
97
+            editor: me,
98
+            onhide: function () {
99
+            }
100
+        });
101
+
102
+        /* 设置颜色选择器 */
103
+        domUtils.on(cp, "click", function () {
104
+            popup.showAnchor(this);
105
+        });
106
+        domUtils.on(document, 'mousedown', function (evt) {
107
+            var el = evt.target || evt.srcElement;
108
+            UE.ui.Popup.postHide(el);
109
+        });
110
+        domUtils.on(window, 'scroll', function () {
111
+            UE.ui.Popup.postHide();
112
+        });
113
+    }
114
+
115
+    /* 初始化在线图片列表 */
116
+    function initImagePanel() {
117
+        onlineImage = onlineImage || new OnlineImage('imageList');
118
+    }
119
+
120
+    /* 更新背景色设置面板 */
121
+    function updateFormState (radio, color, url, align, x, y) {
122
+        var nocolorRadio = $G('nocolorRadio'),
123
+            coloredRadio = $G('coloredRadio');
124
+
125
+        if(radio) {
126
+            nocolorRadio.checked = (radio == 'colored' ? false:'checked');
127
+            coloredRadio.checked = (radio == 'colored' ? 'checked':false);
128
+        }
129
+        if(color) {
130
+            domUtils.setStyle($G("colorPicker"), "background-color", color);
131
+        }
132
+
133
+        if(url && /^\//.test(url)) {
134
+            var a = document.createElement('a');
135
+            a.href = url;
136
+            browser.ie && (a.href = a.href);
137
+            url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
138
+        }
139
+
140
+        if(url || url === '') {
141
+            $G('url').value = url;
142
+        }
143
+        if(align) {
144
+            utils.each($G('repeatType').children, function(item){
145
+                item.selected = (align == item.getAttribute('value') ? 'selected':false);
146
+            });
147
+        }
148
+        if(x || y) {
149
+            $G('x').value = parseInt(x) || 0;
150
+            $G('y').value = parseInt(y) || 0;
151
+        }
152
+
153
+        $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';
154
+        $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';
155
+    }
156
+
157
+    /* 更新背景颜色 */
158
+    function updateBackground () {
159
+        if ($G('coloredRadio').checked) {
160
+            var color = domUtils.getStyle($G("colorPicker"), "background-color"),
161
+                bgimg = $G("url").value,
162
+                align = $G("repeatType").value,
163
+                backgroundObj = {
164
+                    "background-repeat": "no-repeat",
165
+                    "background-position": "center center"
166
+                };
167
+
168
+            if (color) backgroundObj["background-color"] = color;
169
+            if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
170
+            if (align == 'self') {
171
+                backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
172
+            } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
173
+                backgroundObj["background-repeat"] = align;
174
+            }
175
+
176
+            editor.execCommand('background', backgroundObj);
177
+        } else {
178
+            editor.execCommand('background', null);
179
+        }
180
+    }
181
+
182
+
183
+    /* 在线图片 */
184
+    function OnlineImage(target) {
185
+        this.container = utils.isString(target) ? document.getElementById(target) : target;
186
+        this.init();
187
+    }
188
+    OnlineImage.prototype = {
189
+        init: function () {
190
+            this.reset();
191
+            this.initEvents();
192
+        },
193
+        /* 初始化容器 */
194
+        initContainer: function () {
195
+            this.container.innerHTML = '';
196
+            this.list = document.createElement('ul');
197
+            this.clearFloat = document.createElement('li');
198
+
199
+            domUtils.addClass(this.list, 'list');
200
+            domUtils.addClass(this.clearFloat, 'clearFloat');
201
+
202
+            this.list.id = 'imageListUl';
203
+            this.list.appendChild(this.clearFloat);
204
+            this.container.appendChild(this.list);
205
+        },
206
+        /* 初始化滚动事件,滚动到地步自动拉取数据 */
207
+        initEvents: function () {
208
+            var _this = this;
209
+
210
+            /* 滚动拉取图片 */
211
+            domUtils.on($G('imageList'), 'scroll', function(e){
212
+                var panel = this;
213
+                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
214
+                    _this.getImageData();
215
+                }
216
+            });
217
+            /* 选中图片 */
218
+            domUtils.on(this.container, 'click', function (e) {
219
+                var target = e.target || e.srcElement,
220
+                    li = target.parentNode,
221
+                    nodes = $G('imageListUl').childNodes;
222
+
223
+                if (li.tagName.toLowerCase() == 'li') {
224
+                    updateFormState('nocolor', null, '');
225
+                    for (var i = 0, node; node = nodes[i++];) {
226
+                        if (node == li && !domUtils.hasClass(node, 'selected')) {
227
+                            domUtils.addClass(node, 'selected');
228
+                            updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
229
+                        } else {
230
+                            domUtils.removeClasses(node, 'selected');
231
+                        }
232
+                    }
233
+                    updateBackground();
234
+                }
235
+            });
236
+        },
237
+        /* 初始化第一次的数据 */
238
+        initData: function () {
239
+
240
+            /* 拉取数据需要使用的值 */
241
+            this.state = 0;
242
+            this.listSize = editor.getOpt('imageManagerListSize');
243
+            this.listIndex = 0;
244
+            this.listEnd = false;
245
+
246
+            /* 第一次拉取数据 */
247
+            this.getImageData();
248
+        },
249
+        /* 重置界面 */
250
+        reset: function() {
251
+            this.initContainer();
252
+            this.initData();
253
+        },
254
+        /* 向后台拉取图片列表数据 */
255
+        getImageData: function () {
256
+            var _this = this;
257
+
258
+            if(!_this.listEnd && !this.isLoadingData) {
259
+                this.isLoadingData = true;
260
+                var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
261
+                    isJsonp = utils.isCrossDomainUrl(url);
262
+                ajax.request(url, {
263
+                    'timeout': 100000,
264
+                    'dataType': isJsonp ? 'jsonp':'',
265
+                    'data': utils.extend({
266
+                            start: this.listIndex,
267
+                            size: this.listSize
268
+                        }, editor.queryCommandValue('serverparam')),
269
+                    'method': 'get',
270
+                    'onsuccess': function (r) {
271
+                        try {
272
+                            var json = isJsonp ? r:eval('(' + r.responseText + ')');
273
+                            if (json.state == 'SUCCESS') {
274
+                                _this.pushData(json.list);
275
+                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
276
+                                if(_this.listIndex >= json.total) {
277
+                                    _this.listEnd = true;
278
+                                }
279
+                                _this.isLoadingData = false;
280
+                            }
281
+                        } catch (e) {
282
+                            if(r.responseText.indexOf('ue_separate_ue') != -1) {
283
+                                var list = r.responseText.split(r.responseText);
284
+                                _this.pushData(list);
285
+                                _this.listIndex = parseInt(list.length);
286
+                                _this.listEnd = true;
287
+                                _this.isLoadingData = false;
288
+                            }
289
+                        }
290
+                    },
291
+                    'onerror': function () {
292
+                        _this.isLoadingData = false;
293
+                    }
294
+                });
295
+            }
296
+        },
297
+        /* 添加图片到列表界面上 */
298
+        pushData: function (list) {
299
+            var i, item, img, icon, _this = this,
300
+                urlPrefix = editor.getOpt('imageManagerUrlPrefix');
301
+            for (i = 0; i < list.length; i++) {
302
+                if(list[i] && list[i].url) {
303
+                    item = document.createElement('li');
304
+                    img = document.createElement('img');
305
+                    icon = document.createElement('span');
306
+
307
+                    domUtils.on(img, 'load', (function(image){
308
+                        return function(){
309
+                            _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
310
+                        }
311
+                    })(img));
312
+                    img.width = 113;
313
+                    img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
314
+                    img.setAttribute('_src', urlPrefix + list[i].url);
315
+                    domUtils.addClass(icon, 'icon');
316
+
317
+                    item.appendChild(img);
318
+                    item.appendChild(icon);
319
+                    this.list.insertBefore(item, this.clearFloat);
320
+                }
321
+            }
322
+        },
323
+        /* 改变图片大小 */
324
+        scale: function (img, w, h, type) {
325
+            var ow = img.width,
326
+                oh = img.height;
327
+
328
+            if (type == 'justify') {
329
+                if (ow >= oh) {
330
+                    img.width = w;
331
+                    img.height = h * oh / ow;
332
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
333
+                } else {
334
+                    img.width = w * ow / oh;
335
+                    img.height = h;
336
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
337
+                }
338
+            } else {
339
+                if (ow >= oh) {
340
+                    img.width = w * ow / oh;
341
+                    img.height = h;
342
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
343
+                } else {
344
+                    img.width = w;
345
+                    img.height = h * oh / ow;
346
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
347
+                }
348
+            }
349
+        },
350
+        getInsertList: function () {
351
+            var i, lis = this.list.children, list = [], align = getAlign();
352
+            for (i = 0; i < lis.length; i++) {
353
+                if (domUtils.hasClass(lis[i], 'selected')) {
354
+                    var img = lis[i].firstChild,
355
+                        src = img.getAttribute('_src');
356
+                    list.push({
357
+                        src: src,
358
+                        _src: src,
359
+                        floatStyle: align
360
+                    });
361
+                }
362
+
363
+            }
364
+            return list;
365
+        }
366
+    };
367
+
368
+    dialog.onok = function () {
369
+        updateBackground();
370
+        editor.fireEvent('saveScene');
371
+    };
372
+    dialog.oncancel = function () {
373
+        editor.execCommand('background', backupStyle);
374
+    };
375
+
376
+})();

BIN
static/neditor/dialogs/background/images/bg.png Целия файл


BIN
static/neditor/dialogs/background/images/success.png Целия файл


+ 65 - 0
static/neditor/dialogs/charts/chart.config.js Целия файл

@@ -0,0 +1,65 @@
1
+/*
2
+ * 图表配置文件
3
+ * */
4
+
5
+
6
+//不同类型的配置
7
+var typeConfig = [
8
+    {
9
+        chart: {
10
+            type: 'line'
11
+        },
12
+        plotOptions: {
13
+            line: {
14
+                dataLabels: {
15
+                    enabled: false
16
+                },
17
+                enableMouseTracking: true
18
+            }
19
+        }
20
+    }, {
21
+        chart: {
22
+            type: 'line'
23
+        },
24
+        plotOptions: {
25
+            line: {
26
+                dataLabels: {
27
+                    enabled: true
28
+                },
29
+                enableMouseTracking: false
30
+            }
31
+        }
32
+    }, {
33
+        chart: {
34
+            type: 'area'
35
+        }
36
+    }, {
37
+        chart: {
38
+            type: 'bar'
39
+        }
40
+    }, {
41
+        chart: {
42
+            type: 'column'
43
+        }
44
+    }, {
45
+        chart: {
46
+            plotBackgroundColor: null,
47
+            plotBorderWidth: null,
48
+            plotShadow: false
49
+        },
50
+        plotOptions: {
51
+            pie: {
52
+                allowPointSelect: true,
53
+                cursor: 'pointer',
54
+                dataLabels: {
55
+                    enabled: true,
56
+                    color: '#000000',
57
+                    connectorColor: '#000000',
58
+                    formatter: function() {
59
+                        return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
60
+                    }
61
+                }
62
+            }
63
+        }
64
+    }
65
+];

+ 165 - 0
static/neditor/dialogs/charts/charts.css Целия файл

@@ -0,0 +1,165 @@
1
+html, body {
2
+    width: 100%;
3
+    height: 100%;
4
+    margin: 0;
5
+    padding: 0;
6
+    overflow-x: hidden;
7
+}
8
+
9
+.main {
10
+    width: 100%;
11
+    overflow: hidden;
12
+}
13
+
14
+.table-view {
15
+    height: 100%;
16
+    float: left;
17
+    margin: 20px;
18
+    width: 40%;
19
+}
20
+
21
+.table-view .table-container {
22
+    width: 100%;
23
+    margin-bottom: 50px;
24
+    overflow: scroll;
25
+}
26
+
27
+.table-view th {
28
+    padding: 5px 10px;
29
+    background-color: #F7F7F7;
30
+}
31
+
32
+.table-view td {
33
+    width: 50px;
34
+    text-align: center;
35
+    padding:0;
36
+}
37
+
38
+.table-container input {
39
+    width: 40px;
40
+    padding: 5px;
41
+    border: none;
42
+    outline: none;
43
+}
44
+
45
+.table-view caption {
46
+    font-size: 18px;
47
+    text-align: left;
48
+}
49
+
50
+.charts-view {
51
+    /*margin-left: 49%!important;*/
52
+    width: 50%;
53
+    margin-left: 49%;
54
+    height: 400px;
55
+}
56
+
57
+.charts-container {
58
+    border-left: 1px solid #c3c3c3;
59
+}
60
+
61
+.charts-format fieldset {
62
+    padding-left: 20px;
63
+    margin-bottom: 50px;
64
+}
65
+
66
+.charts-format legend {
67
+    padding-left: 10px;
68
+    padding-right: 10px;
69
+}
70
+
71
+.format-item-container {
72
+    padding: 20px;
73
+}
74
+
75
+.format-item-container label {
76
+    display: block;
77
+    margin: 10px 0;
78
+}
79
+
80
+.charts-format .data-item {
81
+    border: 1px solid black;
82
+    outline: none;
83
+    padding: 2px 3px;
84
+}
85
+
86
+/* 图表类型 */
87
+
88
+.charts-type {
89
+    margin-top: 50px;
90
+    height: 300px;
91
+}
92
+
93
+.scroll-view {
94
+    border: 1px solid #c3c3c3;
95
+    border-left: none;
96
+    border-right: none;
97
+    overflow: hidden;
98
+}
99
+
100
+.scroll-container {
101
+    margin: 20px;
102
+    width: 100%;
103
+    overflow: hidden;
104
+}
105
+
106
+.scroll-bed {
107
+    width: 10000px;
108
+    _margin-top: 20px;
109
+    -webkit-transition: margin-left .5s ease;
110
+    -moz-transition: margin-left .5s ease;
111
+    transition: margin-left .5s ease;
112
+}
113
+
114
+.view-box {
115
+    display: inline-block;
116
+    *display: inline;
117
+    *zoom: 1;
118
+    margin-right: 20px;
119
+    border: 2px solid white;
120
+    line-height: 0;
121
+    overflow: hidden;
122
+    cursor: pointer;
123
+}
124
+
125
+.view-box img {
126
+    border: 1px solid #cecece;
127
+}
128
+
129
+.view-box.selected {
130
+    border-color: #7274A7;
131
+}
132
+
133
+.button-container {
134
+    margin-bottom: 20px;
135
+    text-align: center;
136
+}
137
+
138
+.button-container a {
139
+    display: inline-block;
140
+    width: 100px;
141
+    height: 25px;
142
+    line-height: 25px;
143
+    border: 1px solid #c2ccd1;
144
+    margin-right: 30px;
145
+    text-decoration: none;
146
+    color: black;
147
+    -webkit-border-radius: 2px;
148
+    -moz-border-radius: 2px;
149
+    border-radius: 2px;
150
+}
151
+
152
+.button-container a:HOVER {
153
+    background: #fcfcfc;
154
+}
155
+
156
+.button-container a:ACTIVE {
157
+    border-top-color: #c2ccd1;
158
+    box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);
159
+}
160
+
161
+.edui-charts-not-data {
162
+    height: 100px;
163
+    line-height: 100px;
164
+    text-align: center;
165
+}

+ 89 - 0
static/neditor/dialogs/charts/charts.html Целия файл

@@ -0,0 +1,89 @@
1
+<!DOCTYPE html>
2
+<html>
3
+    <head>
4
+        <title>chart</title>
5
+        <meta chartset="utf-8">
6
+        <link rel="stylesheet" type="text/css" href="charts.css">
7
+        <script type="text/javascript" src="../internal.js"></script>
8
+    </head>
9
+    <body>
10
+        <div class="main">
11
+            <div class="table-view">
12
+                <h3><var id="lang_data_source"></var></h3>
13
+                <div id="tableContainer" class="table-container"></div>
14
+                <h3><var id="lang_chart_format"></var></h3>
15
+                <form name="data-form">
16
+                    <div class="charts-format">
17
+                        <fieldset>
18
+                            <legend><var id="lang_data_align"></var></legend>
19
+                            <div class="format-item-container">
20
+                                <label>
21
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
22
+                                    <var id="lang_chart_align_same"></var>
23
+                                </label>
24
+                                <label>
25
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
26
+                                    <var id="lang_chart_align_reverse"></var>
27
+                                </label>
28
+                                <br>
29
+                            </div>
30
+                        </fieldset>
31
+                        <fieldset>
32
+                            <legend><var id="lang_chart_title"></var></legend>
33
+                            <div class="format-item-container">
34
+                                <label>
35
+                                    <var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
36
+                                </label>
37
+                                <label>
38
+                                    <var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
39
+                                </label>
40
+                                <label>
41
+                                    <var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
42
+                                </label>
43
+                                <label>
44
+                                    <var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
45
+                                </label>
46
+                            </div>
47
+                        </fieldset>
48
+                        <fieldset>
49
+                            <legend><var id="lang_chart_tip"></var></legend>
50
+                            <div class="format-item-container">
51
+                                <label>
52
+                                    <var id="lang_cahrt_tip_prefix"></var>
53
+                                    <input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
54
+                                </label>
55
+                                <p><var id="lang_cahrt_tip_description"></var></p>
56
+                            </div>
57
+                        </fieldset>
58
+                        <fieldset>
59
+                            <legend><var id="lang_chart_data_unit"></var></legend>
60
+                            <div class="format-item-container">
61
+                                <label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
62
+                                <p><var id="lang_chart_data_unit_description"></var></p>
63
+                            </div>
64
+                        </fieldset>
65
+                    </div>
66
+                </form>
67
+            </div>
68
+            <div class="charts-view">
69
+                <div id="chartsContainer" class="charts-container"></div>
70
+                <div id="chartsType" class="charts-type">
71
+                    <h3><var id="lang_chart_type"></var></h3>
72
+                    <div class="scroll-view">
73
+                        <div class="scroll-container">
74
+                            <div id="scrollBed" class="scroll-bed"></div>
75
+                        </div>
76
+                        <div id="buttonContainer" class="button-container">
77
+                            <a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
78
+                            <a href="#" data-title="next"><var id="lang_next_btn"></var></a>
79
+                        </div>
80
+                    </div>
81
+                </div>
82
+            </div>
83
+        </div>
84
+        <script src="../../third-party/jquery-1.10.2.min.js"></script>
85
+        <script src="../../third-party/highcharts/highcharts.js"></script>
86
+        <script src="chart.config.js"></script>
87
+        <script src="charts.js"></script>
88
+    </body>
89
+</html>

+ 519 - 0
static/neditor/dialogs/charts/charts.js Целия файл

@@ -0,0 +1,519 @@
1
+/*
2
+ * 图片转换对话框脚本
3
+ **/
4
+
5
+var tableData = [],
6
+    //编辑器页面table
7
+    editorTable = null,
8
+    chartsConfig = window.typeConfig,
9
+    resizeTimer = null,
10
+    //初始默认图表类型
11
+    currentChartType = 0;
12
+
13
+window.onload = function () {
14
+
15
+    editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
16
+
17
+    //未找到表格, 显示错误页面
18
+    if ( !editorTable ) {
19
+        document.body.innerHTML = "<div class='edui-charts-not-data'>未找到数据</div>";
20
+        return;
21
+    }
22
+
23
+    //初始化图表类型选择
24
+    initChartsTypeView();
25
+    renderTable( editorTable );
26
+    initEvent();
27
+    initUserConfig( editorTable.getAttribute( "data-chart" ) );
28
+    $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
29
+    updateViewType( currentChartType );
30
+
31
+    dialog.addListener( "resize", function () {
32
+
33
+        if ( resizeTimer != null ) {
34
+            window.clearTimeout( resizeTimer );
35
+        }
36
+
37
+        resizeTimer = window.setTimeout( function () {
38
+
39
+            resizeTimer = null;
40
+
41
+            renderCharts();
42
+
43
+        }, 500 );
44
+
45
+    } );
46
+
47
+};
48
+
49
+function initChartsTypeView () {
50
+
51
+    var contents = [];
52
+
53
+    for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {
54
+
55
+        contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
56
+
57
+    }
58
+
59
+    $( "#scrollBed" ).html( contents.join( "" ) );
60
+
61
+}
62
+
63
+//渲染table, 以便用户修改数据
64
+function renderTable ( table ) {
65
+
66
+    var tableHtml = [];
67
+
68
+    //构造数据
69
+    for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
70
+
71
+        tableData[ i ] = [];
72
+        tableHtml[ i ] = [];
73
+
74
+        for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
75
+
76
+            var value = getCellValue( cell );
77
+
78
+            if ( i > 0 && j > 0 ) {
79
+                value = +value;
80
+            }
81
+
82
+            if ( i === 0 || j === 0 ) {
83
+                tableHtml[ i ].push( '<th>'+ value +'</th>' );
84
+            } else {
85
+                tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
86
+            }
87
+
88
+            tableData[ i ][ j ] = value;
89
+
90
+        }
91
+
92
+        tableHtml[ i ] = tableHtml[ i ].join( "" );
93
+
94
+    }
95
+
96
+    //draw 表格
97
+    $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
98
+
99
+}
100
+
101
+/*
102
+ * 根据表格已有的图表属性初始化当前图表属性
103
+ */
104
+function initUserConfig ( config ) {
105
+
106
+    var parsedConfig = {};
107
+
108
+    if ( !config ) {
109
+        return;
110
+    }
111
+
112
+    config = config.split( ";" );
113
+
114
+    $.each( config, function ( index, item ) {
115
+
116
+        item = item.split( ":" );
117
+        parsedConfig[ item[ 0 ] ] = item[ 1 ];
118
+
119
+    } );
120
+
121
+    setUserConfig( parsedConfig );
122
+
123
+}
124
+
125
+function initEvent () {
126
+
127
+    var cacheValue = null,
128
+        //图表类型数
129
+        typeViewCount = chartsConfig.length- 1,
130
+        $chartsTypeViewBox = $( '#scrollBed .view-box' );
131
+
132
+    $( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
133
+
134
+        renderCharts();
135
+
136
+    } )
137
+
138
+    $( ".table-view" ).delegate( ".data-item", "focus", function () {
139
+
140
+        cacheValue = this.value;
141
+
142
+    } ).delegate( ".data-item", "blur", function () {
143
+
144
+        if ( this.value !== cacheValue ) {
145
+            renderCharts();
146
+        }
147
+
148
+        cacheValue = null;
149
+
150
+    } );
151
+
152
+    $( "#buttonContainer" ).delegate( "a", "click", function (e) {
153
+
154
+        e.preventDefault();
155
+
156
+        if ( this.getAttribute( "data-title" ) === 'prev' ) {
157
+
158
+            if ( currentChartType > 0 ) {
159
+                currentChartType--;
160
+                updateViewType( currentChartType );
161
+            }
162
+
163
+        } else {
164
+
165
+            if ( currentChartType < typeViewCount ) {
166
+                currentChartType++;
167
+                updateViewType( currentChartType );
168
+            }
169
+
170
+        }
171
+
172
+    } );
173
+
174
+    //图表类型变化
175
+    $( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
176
+
177
+        var index = $( this ).attr( "data-chart-type" );
178
+        $chartsTypeViewBox.removeClass( "selected" );
179
+        $( $chartsTypeViewBox[ index ] ).addClass( "selected" );
180
+
181
+        currentChartType = index | 0;
182
+
183
+        //饼图, 禁用部分配置
184
+        if ( currentChartType === chartsConfig.length - 1 ) {
185
+
186
+            disableNotPieConfig();
187
+
188
+        //启用完整配置
189
+        } else {
190
+
191
+            enableNotPieConfig();
192
+
193
+        }
194
+
195
+        renderCharts();
196
+
197
+    } );
198
+
199
+}
200
+
201
+function renderCharts () {
202
+
203
+    var data = collectData();
204
+
205
+    $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
206
+
207
+        credits: {
208
+            enabled: false
209
+        },
210
+        exporting: {
211
+            enabled: false
212
+        },
213
+        title: {
214
+            text: data.title,
215
+            x: -20 //center
216
+        },
217
+        subtitle: {
218
+            text: data.subTitle,
219
+            x: -20
220
+        },
221
+        xAxis: {
222
+            title: {
223
+                text: data.xTitle
224
+            },
225
+            categories: data.categories
226
+        },
227
+        yAxis: {
228
+            title: {
229
+                text: data.yTitle
230
+            },
231
+            plotLines: [{
232
+                value: 0,
233
+                width: 1,
234
+                color: '#808080'
235
+            }]
236
+        },
237
+        tooltip: {
238
+            enabled: true,
239
+            valueSuffix: data.suffix
240
+        },
241
+        legend: {
242
+            layout: 'vertical',
243
+            align: 'right',
244
+            verticalAlign: 'middle',
245
+            borderWidth: 1
246
+        },
247
+        series: data.series
248
+
249
+    } ));
250
+
251
+}
252
+
253
+function updateViewType ( index ) {
254
+
255
+    $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
256
+
257
+}
258
+
259
+function collectData () {
260
+
261
+    var form = document.forms[ 'data-form' ],
262
+        data = null;
263
+
264
+    if ( currentChartType !== chartsConfig.length - 1 ) {
265
+
266
+        data = getSeriesAndCategories();
267
+        $.extend( data, getUserConfig() );
268
+
269
+    //饼图数据格式
270
+    } else {
271
+        data = getSeriesForPieChart();
272
+        data.title = form[ 'title' ].value;
273
+        data.suffix = form[ 'unit' ].value;
274
+    }
275
+
276
+    return data;
277
+
278
+}
279
+
280
+/**
281
+ * 获取用户配置信息
282
+ */
283
+function getUserConfig () {
284
+
285
+    var form = document.forms[ 'data-form' ],
286
+        info = {
287
+            title: form[ 'title' ].value,
288
+            subTitle: form[ 'sub-title' ].value,
289
+            xTitle: form[ 'x-title' ].value,
290
+            yTitle: form[ 'y-title' ].value,
291
+            suffix: form[ 'unit' ].value,
292
+            //数据对齐方式
293
+            tableDataFormat: getTableDataFormat (),
294
+            //饼图提示文字
295
+            tip: $( "#tipInput" ).val()
296
+        };
297
+
298
+    return info;
299
+
300
+}
301
+
302
+function setUserConfig ( config ) {
303
+
304
+    var form = document.forms[ 'data-form' ];
305
+
306
+    config.title && ( form[ 'title' ].value = config.title );
307
+    config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
308
+    config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
309
+    config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
310
+    config.suffix && ( form[ 'unit' ].value = config.suffix );
311
+    config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
312
+    config.tip && ( form[ 'tip' ].value = config.tip );
313
+    currentChartType = config.chartType || 0;
314
+
315
+}
316
+
317
+function getSeriesAndCategories () {
318
+
319
+    var form = document.forms[ 'data-form' ],
320
+        series = [],
321
+        categories = [],
322
+        tmp = [],
323
+        tableData = getTableData();
324
+
325
+    //反转数据
326
+    if ( getTableDataFormat() === "-1" ) {
327
+
328
+        for ( var i = 0, len = tableData.length; i < len; i++ ) {
329
+
330
+            for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
331
+
332
+                if ( !tmp[ j ] ) {
333
+                    tmp[ j ] = [];
334
+                }
335
+
336
+                tmp[ j ][ i ] = tableData[ i ][ j ];
337
+
338
+            }
339
+
340
+        }
341
+
342
+        tableData = tmp;
343
+
344
+    }
345
+
346
+    categories = tableData[0].slice( 1 );
347
+
348
+    for ( var i = 1, data; data = tableData[ i ]; i++ ) {
349
+
350
+        series.push( {
351
+            name: data[ 0 ],
352
+            data: data.slice( 1 )
353
+        } );
354
+
355
+    }
356
+
357
+    return {
358
+        series: series,
359
+        categories: categories
360
+    };
361
+
362
+}
363
+
364
+/*
365
+ * 获取数据源数据对齐方式
366
+ */
367
+function getTableDataFormat () {
368
+
369
+    var form = document.forms[ 'data-form' ],
370
+        items = form['charts-format'];
371
+
372
+    return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
373
+
374
+}
375
+
376
+/*
377
+ * 禁用非饼图类型的配置项
378
+ */
379
+function disableNotPieConfig() {
380
+
381
+    updateConfigItem( 'disable' );
382
+
383
+}
384
+
385
+/*
386
+ * 启用非饼图类型的配置项
387
+ */
388
+function enableNotPieConfig() {
389
+
390
+    updateConfigItem( 'enable' );
391
+
392
+}
393
+
394
+function updateConfigItem ( value ) {
395
+
396
+    var table = $( "#showTable" )[ 0 ],
397
+        isDisable = value === 'disable' ? true : false;
398
+
399
+    //table中的input处理
400
+    for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
401
+
402
+        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
403
+
404
+            $( "input", cell ).attr( "disabled", isDisable );
405
+
406
+        }
407
+
408
+    }
409
+
410
+    //其他项处理
411
+    $( "input.not-pie-item" ).attr( "disabled", isDisable );
412
+    $( "#tipInput" ).attr( "disabled", !isDisable )
413
+
414
+}
415
+
416
+/*
417
+ * 获取饼图数据
418
+ * 饼图的数据只取第一行的
419
+ **/
420
+function getSeriesForPieChart () {
421
+
422
+    var series = {
423
+            type: 'pie',
424
+            name: $("#tipInput").val(),
425
+            data: []
426
+        },
427
+        tableData = getTableData();
428
+
429
+
430
+    for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
431
+
432
+        var title = tableData[ 0 ][ j ],
433
+            val = tableData[ 1 ][ j ];
434
+
435
+        series.data.push( [ title, val ] );
436
+
437
+    }
438
+
439
+    return {
440
+        series: [ series ]
441
+    };
442
+
443
+}
444
+
445
+function getTableData () {
446
+
447
+    var table = document.getElementById( "showTable" ),
448
+        xCount = table.rows[0].cells.length - 1,
449
+        values = getTableInputValue();
450
+
451
+    for ( var i = 0, value; value = values[ i ]; i++ ) {
452
+
453
+        tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
454
+
455
+    }
456
+
457
+    return tableData;
458
+
459
+}
460
+
461
+function getTableInputValue () {
462
+
463
+    var table = document.getElementById( "showTable" ),
464
+        inputs = table.getElementsByTagName( "input" ),
465
+        values = [];
466
+
467
+    for ( var i = 0, input; input = inputs[ i ]; i++ ) {
468
+        values.push( input.value | 0 );
469
+    }
470
+
471
+    return values;
472
+
473
+}
474
+
475
+function getCellValue ( cell ) {
476
+
477
+    var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
478
+
479
+    return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
480
+
481
+}
482
+
483
+
484
+//dialog确认事件
485
+dialog.onok = function () {
486
+
487
+    //收集信息
488
+    var form = document.forms[ 'data-form' ],
489
+        info = getUserConfig();
490
+
491
+    //添加图表类型
492
+    info.chartType = currentChartType;
493
+
494
+    //同步表格数据到编辑器
495
+    syncTableData();
496
+
497
+    //执行图表命令
498
+    editor.execCommand( 'charts', info );
499
+
500
+};
501
+
502
+/*
503
+ * 同步图表编辑视图的表格数据到编辑器里的原始表格
504
+ */
505
+function syncTableData () {
506
+
507
+    var tableData = getTableData();
508
+
509
+    for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
510
+
511
+        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
512
+
513
+            cell.innerHTML = tableData[ i ] [ j ];
514
+
515
+        }
516
+
517
+    }
518
+
519
+}

BIN
static/neditor/dialogs/charts/images/charts0.png Целия файл


BIN
static/neditor/dialogs/charts/images/charts1.png Целия файл


BIN
static/neditor/dialogs/charts/images/charts2.png Целия файл


BIN
static/neditor/dialogs/charts/images/charts3.png Целия файл


BIN
static/neditor/dialogs/charts/images/charts4.png Целия файл


BIN
static/neditor/dialogs/charts/images/charts5.png Целия файл


+ 43 - 0
static/neditor/dialogs/emotion/emotion.css Целия файл

@@ -0,0 +1,43 @@
1
+.jd img{
2
+    background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
3
+    cursor:pointer;width:35px;height:35px;display:block;
4
+}
5
+.pp img{
6
+    background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
7
+    cursor:pointer;width:25px;height:25px;display:block;
8
+}
9
+.ldw img{
10
+    background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
11
+    cursor:pointer;width:35px;height:35px;display:block;
12
+}
13
+.tsj img{
14
+    background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
15
+    cursor:pointer;width:35px;height:35px;display:block;
16
+}
17
+.cat img{
18
+    background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
19
+    cursor:pointer;width:35px;height:35px;display:block;
20
+}
21
+.bb img{
22
+    background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
23
+    cursor:pointer;width:35px;height:35px;display:block;
24
+}
25
+.youa img{
26
+    background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
27
+    cursor:pointer;width:35px;height:35px;display:block;
28
+}
29
+
30
+.smileytable td {height: 37px;}
31
+#tabPanel{margin-left:5px;overflow: hidden;}
32
+#tabContent {float:left;background:#FFFFFF;}
33
+#tabContent div{display: none;width:480px;overflow:hidden;}
34
+#tabIconReview.show{left:17px;display:block;}
35
+.menuFocus{background:#ACCD3C;}
36
+.menuDefault{background:#FFFFFF;}
37
+#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
38
+img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
39
+
40
+.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
41
+.tabbody table{width: 100%;}
42
+.tabbody td{border:1px solid #BAC498;}
43
+.tabbody td span{display: block;zoom:1;padding:0 4px;}

+ 54 - 0
static/neditor/dialogs/emotion/emotion.html Целия файл

@@ -0,0 +1,54 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
2
+<html xmlns="http://www.w3.org/1999/xhtml">
3
+<head>
4
+    <title></title>
5
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+    <meta name="robots" content="noindex, nofollow"/>
7
+    <script type="text/javascript" src="../internal.js"></script>
8
+    <link rel="stylesheet" type="text/css" href="emotion.css">
9
+</head>
10
+<body>
11
+<div id="tabPanel" class="wrapper">
12
+    <div id="tabHeads" class="tabhead">
13
+        <span><var id="lang_input_choice"></var></span>
14
+        <span><var id="lang_input_Tuzki"></var></span>
15
+        <span><var id="lang_input_lvdouwa"></var></span>
16
+        <span><var id="lang_input_BOBO"></var></span>
17
+        <span><var id="lang_input_babyCat"></var></span>
18
+        <span><var id="lang_input_bubble"></var></span>
19
+        <span><var id="lang_input_youa"></var></span>
20
+    </div>
21
+    <div id="tabBodys" class="tabbody">
22
+        <div id="tab0"></div>
23
+        <div id="tab1"></div>
24
+        <div id="tab2"></div>
25
+        <div id="tab3"></div>
26
+        <div id="tab4"></div>
27
+        <div id="tab5"></div>
28
+        <div id="tab6"></div>
29
+    </div>
30
+</div>
31
+<div id="tabIconReview">
32
+    <img id='faceReview' class='review' src="../../themes/notadd/images/spacer.gif"/>
33
+</div>
34
+<script type="text/javascript" src="emotion.js"></script>
35
+<script type="text/javascript">
36
+    var emotion = {
37
+        tabNum:7, //切换面板数量
38
+        SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
39
+        imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
40
+        imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
41
+        imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
42
+        SmileyInfor:{
43
+            tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
44
+            tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
45
+            tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
46
+            tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
47
+            tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
48
+            tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
49
+            tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
50
+        }
51
+    };
52
+</script>
53
+</body>
54
+</html>

+ 186 - 0
static/neditor/dialogs/emotion/emotion.js Целия файл

@@ -0,0 +1,186 @@
1
+window.onload = function () {
2
+    editor.setOpt({
3
+        emotionLocalization:false
4
+    });
5
+
6
+    emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "//imgbaidu.b0.upaiyun.com/hi/";
7
+    emotion.SmileyBox = createTabList( emotion.tabNum );
8
+    emotion.tabExist = createArr( emotion.tabNum );
9
+
10
+    initImgName();
11
+    initEvtHandler( "tabHeads" );
12
+};
13
+
14
+function initImgName() {
15
+    for ( var pro in emotion.SmilmgName ) {
16
+        var tempName = emotion.SmilmgName[pro],
17
+                tempBox = emotion.SmileyBox[pro],
18
+                tempStr = "";
19
+
20
+        if ( tempBox.length ) return;
21
+        for ( var i = 1; i <= tempName[1]; i++ ) {
22
+            tempStr = tempName[0];
23
+            if ( i < 10 ) tempStr = tempStr + '0';
24
+            tempStr = tempStr + i + '.gif';
25
+            tempBox.push( tempStr );
26
+        }
27
+    }
28
+}
29
+
30
+function initEvtHandler( conId ) {
31
+    var tabHeads = $G( conId );
32
+    for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {
33
+        var tabObj = tabHeads.childNodes[i];
34
+        if ( tabObj.nodeType == 1 ) {
35
+            domUtils.on( tabObj, "click", (function ( index ) {
36
+                return function () {
37
+                    switchTab( index );
38
+                };
39
+            })( j ) );
40
+            j++;
41
+        }
42
+    }
43
+    switchTab( 0 );
44
+    $G( "tabIconReview" ).style.display = 'none';
45
+}
46
+
47
+function InsertSmiley( url, evt ) {
48
+    var obj = {
49
+        src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
50
+    };
51
+    obj._src = obj.src;
52
+    editor.execCommand( 'insertimage', obj );
53
+    if ( !evt.ctrlKey ) {
54
+        dialog.popup.hide();
55
+    }
56
+}
57
+
58
+function switchTab( index ) {
59
+
60
+    autoHeight( index );
61
+    if ( emotion.tabExist[index] == 0 ) {
62
+        emotion.tabExist[index] = 1;
63
+        createTab( 'tab' + index );
64
+    }
65
+    //获取呈现元素句柄数组
66
+    var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ),
67
+            tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ),
68
+            i = 0, L = tabHeads.length;
69
+    //隐藏所有呈现元素
70
+    for ( ; i < L; i++ ) {
71
+        tabHeads[i].className = "";
72
+        tabBodys[i].style.display = "none";
73
+    }
74
+    //显示对应呈现元素
75
+    tabHeads[index].className = "focus";
76
+    tabBodys[index].style.display = "block";
77
+}
78
+
79
+function autoHeight( index ) {
80
+    var iframe = dialog.getDom( "iframe" ),
81
+            parent = iframe.parentNode.parentNode;
82
+    switch ( index ) {
83
+        case 0:
84
+            iframe.style.height = "380px";
85
+            parent.style.height = "392px";
86
+            break;
87
+        case 1:
88
+            iframe.style.height = "220px";
89
+            parent.style.height = "232px";
90
+            break;
91
+        case 2:
92
+            iframe.style.height = "260px";
93
+            parent.style.height = "272px";
94
+            break;
95
+        case 3:
96
+            iframe.style.height = "300px";
97
+            parent.style.height = "312px";
98
+            break;
99
+        case 4:
100
+            iframe.style.height = "140px";
101
+            parent.style.height = "152px";
102
+            break;
103
+        case 5:
104
+            iframe.style.height = "260px";
105
+            parent.style.height = "272px";
106
+            break;
107
+        case 6:
108
+            iframe.style.height = "230px";
109
+            parent.style.height = "242px";
110
+            break;
111
+        default:
112
+
113
+    }
114
+}
115
+
116
+
117
+function createTab( tabName ) {
118
+    var faceVersion = "?v=1.1", //版本号
119
+            tab = $G( tabName ), //获取将要生成的Div句柄
120
+            imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
121
+            positionLine = 11 / 2, //中间数
122
+            iWidth = iHeight = 35, //图片长宽
123
+            iColWidth = 3, //表格剩余空间的显示比例
124
+            tableCss = emotion.imageCss[tabName],
125
+            cssOffset = emotion.imageCssOffset[tabName],
126
+            textHTML = ['<table class="smileytable">'],
127
+            i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
128
+            sUrl, realUrl, posflag, offset, infor;
129
+
130
+    for ( ; i < imgNum; ) {
131
+        textHTML.push( '<tr>' );
132
+        for ( var j = 0; j < imgColNum; j++, i++ ) {
133
+            faceImage = emotion.SmileyBox[tabName][i];
134
+            if ( faceImage ) {
135
+                sUrl = imagePath + faceImage + faceVersion;
136
+                realUrl = imagePath + faceImage;
137
+                posflag = j < positionLine ? 0 : 1;
138
+                offset = cssOffset * i * (-1) - 1;
139
+                infor = emotion.SmileyInfor[tabName][i];
140
+
141
+                textHTML.push( '<td  class="' + tableCss + '"   border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center"  bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
142
+                textHTML.push( '<span>' );
143
+                textHTML.push( '<img  style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
144
+                textHTML.push( '</span>' );
145
+            } else {
146
+                textHTML.push( '<td width="' + iColWidth + '%"   bgcolor="#FFFFFF">' );
147
+            }
148
+            textHTML.push( '</td>' );
149
+        }
150
+        textHTML.push( '</tr>' );
151
+    }
152
+    textHTML.push( '</table>' );
153
+    textHTML = textHTML.join( "" );
154
+    tab.innerHTML = textHTML;
155
+}
156
+
157
+function over( td, srcPath, posFlag ) {
158
+    td.style.backgroundColor = "#ACCD3C";
159
+    $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")";
160
+    if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show";
161
+    $G( "tabIconReview" ).style.display = 'block';
162
+}
163
+
164
+function out( td ) {
165
+    td.style.backgroundColor = "transparent";
166
+    var tabIconRevew = $G( "tabIconReview" );
167
+    tabIconRevew.className = "";
168
+    tabIconRevew.style.display = 'none';
169
+}
170
+
171
+function createTabList( tabNum ) {
172
+    var obj = {};
173
+    for ( var i = 0; i < tabNum; i++ ) {
174
+        obj["tab" + i] = [];
175
+    }
176
+    return obj;
177
+}
178
+
179
+function createArr( tabNum ) {
180
+    var arr = [];
181
+    for ( var i = 0; i < tabNum; i++ ) {
182
+        arr[i] = 0;
183
+    }
184
+    return arr;
185
+}
186
+

BIN
static/neditor/dialogs/emotion/images/0.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/bface.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/cface.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/fface.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/jxface2.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/neweditor-tab-bg.png Целия файл


BIN
static/neditor/dialogs/emotion/images/tface.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/wface.gif Целия файл


BIN
static/neditor/dialogs/emotion/images/yface.gif Целия файл


Файловите разлики са ограничени, защото са твърде много
+ 272 - 0
static/neditor/dialogs/fonts/buttoniconex.css


BIN
static/neditor/dialogs/fonts/iconfont.eot Целия файл


+ 398 - 0
static/neditor/dialogs/fonts/iconfont.svg Целия файл

@@ -0,0 +1,398 @@
1
+<?xml version="1.0" standalone="no"?>
2
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+<!--
4
+2013-9-30: Created.
5
+-->
6
+<svg>
7
+<metadata>
8
+Created by iconfont
9
+</metadata>
10
+<defs>
11
+
12
+<font id="edui-notadd" horiz-adv-x="1024" >
13
+  <font-face
14
+    font-family="edui-notadd"
15
+    font-weight="500"
16
+    font-stretch="normal"
17
+    units-per-em="1024"
18
+    ascent="896"
19
+    descent="-128"
20
+  />
21
+    <missing-glyph />
22
+    
23
+    <glyph glyph-name="close" unicode="&#58964;" d="M960 742.4l-89.6 89.6-358.4-358.4-358.4 358.4-89.6-89.6 358.4-358.4-358.4-358.4 89.6-89.6 358.4 358.4 358.4-358.4 89.6 89.6-358.4 358.4 358.4 358.4z"  horiz-adv-x="1024" />
24
+
25
+    
26
+    <glyph glyph-name="searchreplace" unicode="&#59151;" d="M437.771654 317.01890000000003h82.93098L299.553354 896H219.181972L0.080371 317.01890000000003h80.883302L136.762912 476.225905h241.626065zM160.823135 541.751617l87.026337 241.114145A222.173119 222.173119 0 0 1 256.040186 823.307413a274.388921 274.388921 0 0 1 9.214553-40.441651l90.097855-241.114145h-194.529459z m825.214441-403.904587a146.920933 146.920933 0 0 1-94.705131 44.537008 145.897094 145.897094 0 0 1 74.740266 51.191963 138.730219 138.730219 0 0 1 27.13174 84.466738 117.741515 117.741515 0 0 1-45.560847 96.75281 189.922182 189.922182 0 0 1-122.348791 36.346294h-170.469237V-127.83925699999998h175.076513a204.767851 204.767851 0 0 1 137.70638 46.072766 153.575889 153.575889 0 0 1 53.751561 121.324952 136.170621 136.170621 0 0 1-35.322454 98.288569z m-255.959814 250.840618h74.740266q109.550801 0 109.5508-81.907141a91.121694 91.121694 0 0 0-30.715178-73.204506 126.956068 126.956068 0 0 0-84.978658-26.619821h-68.59723V388.687648z m180.707629-421.821774a136.682541 136.682541 0 0 0-90.609775-27.13174h-90.097854v204.767851h77.299864q135.146782 0 135.146782-99.824327a93.681292 93.681292 0 0 0-31.739017-78.323704zM460.808037 94.33386199999995a176.100352 176.100352 0 0 0-85.490578 40.95357 178.148031 178.148031 0 0 0-38.905892 219.613521L282.148087 384.080371A241.114145 241.114145 0 0 1 460.808037 29.32006899999999v-42.489329l112.110399 77.811783L460.808037 142.966226v-51.191963z"  horiz-adv-x="1024" />
27
+
28
+    
29
+    <glyph glyph-name="italic" unicode="&#58925;" d="M384 832v-64h128L384 0H256v-64h384v64H512l128 768h128V832z"  horiz-adv-x="1024" />
30
+
31
+    
32
+    <glyph glyph-name="insertcaption" unicode="&#58967;" d="M568.25 834v-393.75h393.75V834z m337.5-225h-112.5v-112.5h-56.25V609h-112.5V665.25h112.5V777.75h56.25v-112.5h112.5zM938.375 440.25H62v-506.25h900V440.25zM114.875-9.75v225H343.25v-225z m423.5625 0H399.5v225h225v-225z m370.6875 0H680.75v225h228.375zM455.75 834H62v-56.25h168.75v-337.5h56.25V777.75h168.75V834z"  horiz-adv-x="1024" />
33
+
34
+    
35
+    <glyph glyph-name="insertparagraph" unicode="&#58926;" d="M997.12 896h-997.12v-576h1024v576zM60.16 384v256h259.84v-256zM542.080 384h-158.080v256h256v-256zM963.84 384h-259.84v256h259.84zM448 320h-448v-64h192v-384h64v384h192v64z"  horiz-adv-x="1024" />
36
+
37
+    
38
+    <glyph glyph-name="inserttitlecol" unicode="&#58969;" d="M64-64v128h-64v-192h192v64h-128zM448-128h576v1024h-576zM960 192v-256h-192v256zM704 192v-256h-192v256zM960 512v-256h-192v256zM704 512v-256h-192v256zM960 832v-256h-192v256zM704 832v-256h-192v256zM64 384h128v64h-192v-192h64v128zM384 384v-128h64v192h-192v-64h128zM384-64h-128v-64h192v192h-64v-128zM64-64v128h-64v-192h192v64h-128zM448-128h576v1024h-576zM960 192v-256h-192v256zM704 192v-256h-192v256zM960 512v-256h-192v256zM704 512v-256h-192v256zM960 832v-256h-192v256zM704 832v-256h-192v256zM64 384h128v64h-192v-192h64v128zM384 384v-128h64v192h-192v-64h128zM384-64h-128v-64h192v192h-64v-128zM0 448h448v448h-448zM256 832v-128h128v-64h-128v-128h-64v128h-128v64h128v128z"  horiz-adv-x="1024" />
39
+
40
+    
41
+    <glyph glyph-name="insertimage" unicode="&#58903;" d="M350.080 360.96l128-192 263.68 430.080 156.16-256v-23.040h64v458.88c0 0.010 0 0.023 0 0.035 0 29.337-23.783 53.12-53.12 53.12-0.675 0-1.347-0.013-2.017-0.038l-853.663 0.003c-29.337 0-53.12-23.783-53.12-53.12v-727.040c0-28.63 23.21-51.84 51.84-51.84 0 0 0 0 0 0h588.16v64h-485.12zM296.96 711.68c-0.034-0-0.033-0-0.032-0-118.007-53.154-65.211-0.36 0 0zM1024 192h-192v192h-64v-192h-192v-64h192v-192h64v192h192v64z"  horiz-adv-x="1024" />
42
+
43
+    
44
+    <glyph glyph-name="previousstep" unicode="&#58928;" d="M483.84 0c-9.271 0.086-17.958 2.506-25.527 6.698l-3.273-0.298-368 332.8c-13.235 9.399-22.074 24.243-23.235 41.197 0.134-1.173 0.1-0.024 0.1 1.134 0 18.444 8.766 34.84 22.359 45.25l371.336 328.42c8.13 7.803 19.143 12.656 31.289 12.811-0.567-0.011-0.565-0.011-0.563-0.011 15.34 0 28.71-8.432 35.728-20.914 4.536-8.376 7.142-18.094 7.146-28.419l-0-191.946h29.44c34.754-0.054 68.438-4.531 100.552-12.9 60.101-15.232 114.839-46.015 159.094-87.786 24.409-12.831 74.63-78.825 101.032-155.877 11.808-7.806 39.215-98.972 43.624-196.13-3.497 49.062-2.666 43.42-2.666 37.584 0-13.892-4.709-26.684-12.617-36.868-7.167-8.081-17.718-13.251-29.479-13.305-18.37 1.665-34.085 12.269-42.803 27.412-24.444 39.773-60.939 71.608-104.398 90.375-0.074 8.386-50.308 30.081-105.051 37.675 15.832 0.434-31.071 8.408-79.837 8.408-1.776 0-3.549-0.011-5.32-0.032l-48.371 0.003v-161.28c0.493-3.088 0.775-6.648 0.775-10.274 0-15.423-5.098-29.655-13.702-41.102-7.798-8.019-18.891-13.106-31.173-13.106-2.28 0-4.519 0.175-6.704 0.513zM145.28 384l312.96-281.6v148.48c7.245 27.987 32.273 48.324 62.050 48.324 2.264 0 4.501-0.118 6.705-0.347l52.844 0.023c1.379 0.014 3.008 0.021 4.64 0.021 58.359 0 114.417-9.85 166.603-27.978 61.993-22.007 117.34-60.173 160.325-109.408l-43.568 42.646c-22.699 92.319-79.174 168.698-155.264 216.901-21.633 14.132-81.989 33.984-146.982 33.984-0.617 0-1.233-0.002-1.849-0.005-4.98 0.383-10.897 0.6-16.865 0.6-5.968 0-11.885-0.218-17.744-0.646l-12.016 0.046c-0.636-0.025-1.382-0.040-2.131-0.040-19.528 0-36.761 9.827-47.023 24.805-5.559 8.317-8.91 18.241-9.215 28.927l0.13 152.388z"  horiz-adv-x="1024" />
45
+
46
+    
47
+    <glyph glyph-name="nextstep" unicode="&#58929;" d="M506.88 15.36c-8.477 11.272-13.575 25.504-13.575 40.926 0 3.626 0.282 7.186 0.825 10.66l-0.050 159.614h-48.64c-1.501 0.019-3.275 0.029-5.051 0.029-48.766 0-95.669-7.974-139.477-22.689-50.006-17.279-94.98-47.496-130.256-86.627 4.899 12.591-24.587-25.889-40.469-70.797 10.925 27.391-5.086 17.214-23.542 16.13-10.253 0.213-20.784 5.419-27.986 13.621-9.722 10.595-15.716 24.869-15.716 40.544 0 3.971 0.385 7.852 1.119 11.608 13.646 97.38 48.926 184.899 100.832 260.053 10.486 22.71 71.898 78.958 145.81 112.475-16.158-3.265 43.015 19.543 107.047 25.738-22.32-1.169 11.377 3.266 46.109 3.274l28.94-0v192c0.014 10.328 2.629 20.042 7.223 28.527 7.288 10.538 19.676 17.6 33.714 17.6 0.683 0 1.363-0.017 2.038-0.050 12.071-0.314 23.014-5.3 31.061-13.22l370.124-327.897c13.729-10.51 22.495-26.906 22.495-45.35 0-1.157-0.035-2.307-0.103-3.447-1.522-16.856-10.584-31.479-23.778-40.507l-366.614-329.256h-3.84c-7.316-4.007-16.024-6.375-25.284-6.402-0.212-0.022-0.839-0.035-1.47-0.035-12.377 0-23.547 5.166-31.471 13.46zM565.12 661.12v-154.24c-0.823-10.739-4.61-20.458-10.535-28.506-8.813-12.907-26.046-22.734-45.574-22.734-0.75 0-1.496 0.014-2.238 0.043l-9.493-0.003c-5.075 0.382-10.992 0.6-16.96 0.6-5.968 0-11.885-0.218-17.744-0.646 0.263 0.049-0.353 0.051-0.97 0.051-64.993 0-125.349-19.852-175.335-53.823-70.569-55.034-119.949-136.478-133.177-229.562l15.866 40.18c50.614 39.788 112.633 67.349 180.391 77.216-20.185 0.726 36.912 11.038 96.409 11.112l50.881-0.008c1.928 0.206 4.165 0.324 6.43 0.324 29.778 0 54.806-20.337 61.952-47.879l0.098-150.845 313.6 281.6z"  horiz-adv-x="1024" />
48
+
49
+    
50
+    <glyph glyph-name="scaleboard" unicode="&#58930;" d="M374.935 244.376c-6.461 7.093-15.736 11.526-26.046 11.526-0.291 0-0.581-0.004-0.87-0.011l-308.991 0.001c-21.495-0.701-38.694-18.129-39.029-39.649l-0-24.333c2.003-21.281 19.78-37.802 41.416-37.802 0.736 0 1.467 0.019 2.194 0.057l163.053-0.004-186.828-190.667c-9.538-9.598-15.433-22.825-15.433-37.43s5.895-27.832 15.436-37.432c9.39-9.462 22.404-15.321 36.787-15.321 14.383 0 27.397 5.859 36.787 15.32l186.831 188.111v-165.074c-0.014-0.383-0.022-0.833-0.022-1.285 0-20.631 16.551-37.397 37.099-37.744l26.905-0c0.983-0.094 2.125-0.148 3.279-0.148 19.293 0 35.087 14.981 36.384 33.945l0.006 309.786c0.069 0.841 0.108 1.82 0.108 2.809 0 9.24-3.436 17.677-9.1 24.104zM383.893 570.045v291.758c-0.898 19.073-16.579 34.196-35.793 34.196-1.592 0-3.16-0.104-4.697-0.305l-27.971 0.019c-0.015 0-0.032 0-0.050 0-20.495 0-37.11-16.615-37.11-37.11 0-0.675 0.018-1.346 0.054-2.012l-0.004-166.261-184.269 184.269c-9.289 9.429-22.197 15.27-36.47 15.27s-27.18-5.841-36.464-15.264c-9.318-9.469-15.067-22.461-15.067-36.796 0-14.335 5.749-27.327 15.067-36.797l184.262-184.262h-161.875c-0.387 0.013-0.842 0.020-1.298 0.020-22.879 0-41.508-18.195-42.208-40.904l-0.002-26.937c1.642-20.273 18.063-36.222 38.394-37.111l310.308 0.001c0.233-0.006 0.508-0.009 0.784-0.009 10.002 0 19.029 4.173 25.436 10.873 5.684 6.325 9.152 14.716 9.152 23.917 0 1.271-0.066 2.526-0.195 3.763l0.013 19.040zM648.779 523.338c6.421-6.724 15.456-10.905 25.467-10.905 0.494 0 0.986 0.010 1.475 0.030l308.964-0.002c21.282 0.686 38.357 17.77 39.028 38.991l0.001 24.351c-2.003 21.281-19.78 37.802-41.416 37.802-0.736 0-1.467-0.019-2.194-0.057l-163.053 0.004 186.828 187.468c9.538 9.598 15.433 22.825 15.433 37.43s-5.895 27.832-15.436 37.432c-9.39 9.462-22.404 15.321-36.787 15.321-14.383 0-27.397-5.859-36.787-15.32l-186.831-184.912v165.074c0.032 0.579 0.050 1.257 0.050 1.94 0 20.416-16.207 37.047-36.457 37.728l-26.935 0.002c-1.164 0.132-2.513 0.207-3.879 0.207-19.539 0-35.49-15.366-36.426-34.673l-0.003-309.757c-0.069-0.841-0.108-1.82-0.108-2.809 0-9.24 3.436-17.677 9.1-24.104zM639.821 197.669v-291.119c0.998-18.987 16.637-34.005 35.784-34.005 0.917 0 1.826 0.034 2.726 0.102l28.032-0.007c0.015-0 0.032-0 0.050-0 20.495 0 37.11 16.615 37.11 37.11 0 0.675-0.018 1.346-0.054 2.012l0.004 166.261 185.548-184.269c9.289-9.429 22.197-15.27 36.47-15.27s27.18 5.841 36.464 15.264c9.318 9.469 15.067 22.461 15.067 36.796 0 14.335-5.749 27.327-15.067 36.797l-183.622 183.622h161.875c0.387-0.013 0.842-0.020 1.298-0.020 22.879 0 41.508 18.195 42.208 40.904l0.002 26.937c-0.666 21.074-17.41 38.028-38.335 39.027l-309.728 0.002c-0.233 0.006-0.508 0.009-0.784 0.009-10.002 0-19.029-4.173-25.436-10.873-5.651-6.317-9.098-14.684-9.098-23.857 0-1.066 0.047-2.121 0.138-3.164l-0.010-19.059z"  horiz-adv-x="1024" />
51
+
52
+    
53
+    <glyph glyph-name="brush" unicode="&#58931;" d="M986.879 611.21l-247.031 249.591c-22.153 21.757-52.546 35.188-86.077 35.188s-63.924-13.431-86.095-35.206l-474.845-476.765c-18.637-14.716-31.089-36.552-33.229-61.336l-59.567-342.489c-0.021-0.846-0.034-1.842-0.034-2.841 0-29.481 10.66-56.473 28.336-77.331 16.942-17.233 40.717-28.021 67.013-28.021 0.915 0 1.826 0.013 2.734 0.039l13.946-0.003 344.308 63.998c24.036 2.986 44.69 15.459 58.416 33.491l472.125 472.091c22.918 21.123 37.224 51.289 37.224 84.797 0 33.508-14.306 63.674-37.144 84.724zM448.018 27.551l-348.788-63.998 60.798 348.148 347.508 351.347 288.63-287.35zM922.881 507.534l-63.998-70.397-291.19 286.71 63.998 63.998c5.716 4.344 12.952 6.96 20.799 6.96s15.083-2.615 20.885-7.022l246.306-249.529c5.572-5.706 9.258-13.277 10.035-21.691 1.485 0.571-3.635-4.548-8.115-9.028z"  horiz-adv-x="1024" />
54
+
55
+    
56
+    <glyph glyph-name="background" unicode="&#58973;" d="M988.16 448h-568.32c-19.794 0-35.84-16.046-35.84-35.84 0 0 0 0 0 0v-504.32c0-19.794 16.046-35.84 35.84-35.84h568.96c0 0 0 0 0 0 19.794 0 35.84 16.046 35.84 35.84 0 0 0 0 0 0v504.32c0 0.002 0 0.004 0 0.006 0 19.794-16.046 35.84-35.84 35.84-0.225 0-0.45-0.002-0.674-0.006zM664.32 283.52c-1.074-43.349-36.469-78.080-79.977-78.080-44.183 0-80 35.817-80 80 0 44.175 35.804 79.987 79.976 80 44.338-0.719 80.004-36.829 80.004-81.27 0-0.229-0.001-0.457-0.003-0.685zM929.28-64h-467.84l131.2 205.44 85.12-133.12 177.28 298.24 104.96-178.56v-163.2c-1.040-16.12-14.369-28.8-30.66-28.8-0.021 0-0.042 0-0.063 0zM320 64h-96c-17.673 0-32-14.327-32-32s14.327-32 32-32h96zM320 256h-192c-35.346 0-64 28.654-64 64v448c0 35.346 28.654 64 64 64h640c35.346 0 64-28.654 64-64v-256h64v320c0 35.346-28.654 64-64 64h-768c-35.346 0-64-28.654-64-64v-576c0-35.346 28.654-64 64-64h256z"  horiz-adv-x="1024" />
57
+
58
+    
59
+    <glyph glyph-name="strikethrough" unicode="&#58892;" d="M994.56 224c-23.431-29.473-59.162-48.299-99.302-48.649-73.498 0.009-122.138 57.609-127.258 150.409h236.8v52.48h-236.8c7.68 92.8 58.24 150.4 132.48 150.4 35.063-0.422 66.321-16.357 87.286-41.248l28.554 35.488c-28.874 32.657-70.869 53.143-117.65 53.143-0.939 0-1.876-0.008-2.811-0.025-100.339 0.002-176.499-74.238-186.739-197.758h-100.48c26.76 17.48 44.197 47.29 44.197 81.173 0 0.938-0.013 1.873-0.040 2.804 0.003 76.023-59.517 105.463-146.557 105.463h-128v-192h-110.72l-64 192h-58.88l-64-192h-58.24v-52.48h41.6l-64-192h54.4l41.6 136.32h155.52l40.32-131.84h56.96l-64 192h95.36v-192h135.68c95.36 0 161.28 41.6 161.28 128 0.031 0.938 0.048 2.041 0.048 3.148 0 22.888-7.462 44.033-20.087 61.134l52.679-0.282c9.6-126.080 84.48-199.68 186.24-199.68 52.305 0.631 98.632 25.674 128.197 64.243zM433.92 524.8h64c64 0 100.48-18.56 100.48-69.76s-28.16-71.040-101.12-71.040h-64zM172.16 524.8c14.080-49.92 26.88-96.64 42.88-145.28h-87.040c17.28 47.36 31.36 93.44 44.16 144zM236.16 312.32h-128l4.48 14.72h120.96zM620.16 264.96c0-58.24-42.88-85.12-115.84-85.12h-70.4v145.92h154.88c21.122-10.749 35.339-32.326 35.339-57.224 0-1.484-0.050-2.955-0.15-4.414z"  horiz-adv-x="1024" />
60
+
61
+    
62
+    <glyph glyph-name="spechars" unicode="&#58883;" d="M954.24-128l-158.72 160c-74.993-63.304-172.734-101.779-279.462-101.779-1.427 0-2.852 0.007-4.275 0.021-2.434-0.062-5.559-0.096-8.691-0.096-105.177 0-201.348 38.558-275.15 102.309l-158.182-160.455-69.76 72.32 160.64 155.52c-60.013 78.679-96.281 178.281-96.653 286.339-0.087 1.262-0.144 5.312-0.144 9.374 0 103.089 36.542 197.643 97.38 271.415l-161.223 156.712 69.76 72.32 158.72-160c77.817 61.889 177.407 99.439 285.753 99.854-0.643 0.007 1.234 0.019 3.114 0.019 105.383 0 201.953-37.734 276.935-100.428l159.958 160.555 69.76-72.32-161.92-157.44c61.004-73.69 98.013-169.18 98.013-273.313 0-3.139-0.034-6.27-0.101-9.393 0.012-0.237 0.014-1.069 0.014-1.901 0-106.863-37.416-204.987-99.861-281.987l163.855-155.326zM512 736c-2.049 0.045-4.464 0.070-6.885 0.070-95.58 0-181.874-39.758-243.247-103.638-62.592-62.161-101.269-148.112-101.269-243.098 0-1.876 0.015-3.748 0.045-5.617-0.010-0.497-0.014-1.417-0.014-2.338 0-96.943 40.213-184.494 104.868-246.882 62.121-65.122 149.43-105.554 246.182-105.554 96.752 0 184.061 40.432 245.952 105.321 64.513 62.767 104.458 150.238 104.458 247.038 0 0.948-0.004 1.895-0.011 2.842 0.048 1.936 0.074 4.389 0.074 6.847 0 95.909-40.57 182.342-105.486 243.074-61.899 63.002-147.752 101.939-242.699 101.939-0.692 0-1.384-0.002-2.075-0.006z"  horiz-adv-x="1024" />
63
+
64
+    
65
+    <glyph glyph-name="clearboard" unicode="&#58932;" d="M704 768v128h-384v-128h-320v-64h64v-832h896v832h64v64zM384 832h256v-64h-256zM320-64h-192v576h192zM640-64h-256v576h256zM896-64h-192v576h192zM896 576h-768v128h768z"  horiz-adv-x="1024" />
66
+
67
+    
68
+    <glyph glyph-name="bold" unicode="&#58884;" d="M876.8 185.60000000000002c-6.4 51.2-25.6 102.4-57.6 140.8-32 38.4-83.2 70.4-128 76.8 44.8 12.8 76.8 38.4 102.4 76.8 32 38.4 38.4 83.2 38.4 134.4 0 57.6-25.6 121.6-70.4 166.4C710.4 819.2 640 832 576 832H192v-896h384c76.8-6.4 140.8 12.8 211.2 51.2 57.6 44.8 96 121.6 89.6 198.4zM288 742.4h262.4c44.8 0 96-6.4 134.4-38.4 32-25.6 51.2-57.6 44.8-96 0-44.8-12.8-83.2-44.8-115.2-38.4-32-89.6-44.8-134.4-38.4H288V742.4zM768 192c0-51.2-25.6-102.4-70.4-134.4-44.8-25.6-89.6-38.4-140.8-38.4H288V352h275.2c51.2 0 102.4-6.4 147.2-38.4 44.8-25.6 64-76.8 57.6-121.6z"  horiz-adv-x="1024" />
69
+
70
+    
71
+    <glyph glyph-name="fullscreen" unicode="&#58966;" d="M960 896h-896c-35.346 0-64-28.654-64-64v-704c0-35.346 28.654-64 64-64h320v-128h-96c-17.673 0-32-14.327-32-32s14.327-32 32-32h448c17.673 0 32 14.327 32 32s-14.327 32-32 32h-96v128h320c35.346 0 64 28.654 64 64v704c0 35.346-28.654 64-64 64zM576-64h-128v128h128zM960 192c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v576c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
72
+
73
+    
74
+    <glyph glyph-name="formatmatch" unicode="&#58893;" d="M128 448v-448l108.8 300.8L396.8 0H896V448zM128 640h768v-64H128zM384 768h256v-128H384z"  horiz-adv-x="1024" />
75
+
76
+    
77
+    <glyph glyph-name="underline" unicode="&#58885;" d="M192 0h640v-64H192zM704 832v-384c0-102.4-83.2-192-192-192-102.4 0-192 83.2-192 192V832H192v-384c0-179.2 147.2-320 320-320s320 147.2 320 320V832h-128z"  horiz-adv-x="1024" />
78
+
79
+    
80
+    <glyph glyph-name="removeformat" unicode="&#58894;" d="M682.88 832l-682.88-704 170.88-192h398.080l455.040 512zM528 64h-288l-48 56.96 192 227.2 192-227.84z"  horiz-adv-x="1024" />
81
+
82
+    
83
+    <glyph glyph-name="blockquote" unicode="&#58895;" d="M401.92 1.7279999999999518v292.48H248.064c-7.36 187.392 65.92 344.96 219.648 472.448L401.856 834.112C218.88 706.56 127.36 511.616 127.36 249.27999999999997v-247.552h274.56z m428.16 0v292.48h-153.728c-7.36 187.392 65.92 344.96 219.648 472.448L830.08 834.112c-182.976-127.616-274.432-322.496-274.432-584.832v-247.552h274.496z"  horiz-adv-x="1024" />
84
+
85
+    
86
+    <glyph glyph-name="anchor" unicode="&#58904;" d="M722.56 227.84l76.8-72.32c-69.066-57.593-157.186-94.491-253.698-100.167l30.338 404.167c75.21 27.154 128 97.922 128 181.019 0 106.039-85.961 192-192 192-106.039 0-192-85.961-192-192 0-83.098 52.79-153.865 126.663-180.597l1.337-400.423c-96.583 9.193-182.742 47.773-250.98 106.575l101.86 61.745-298.88 42.88 45.44-280.96 79.36 74.24c103.19-79.877 234.444-128.040 376.947-128.040 2.48 0 4.957 0.015 7.43 0.044 2.030-0.038 4.87-0.058 7.715-0.058 142.963 0 274.192 50.241 376.992 134.031l85.956-82.776 44.16 283.52zM384 640c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128z"  horiz-adv-x="1024" />
87
+
88
+    
89
+    <glyph glyph-name="help" unicode="&#58905;" d="M512 896c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512 0 282.77-229.23 512-512 512zM512-64c-247.424 0-448 200.576-448 448s200.576 448 448 448c247.424 0 448-200.576 448-448 0-247.424-200.576-448-448-448zM512 256h-64v27.52c4.886 52.070 35.44 96.057 78.726 119.583q60.794 45.537 60.794 88.417c-3.36 32.484-30.587 57.601-63.679 57.601-0.113 0-0.225-0-0.338-0.001q-76.783 0-95.343-87.68l-108.16 20.48c15.836 91.427 94.565 160.079 189.328 160.079 9.749 0 19.329-0.727 28.687-2.129q152.545-7.55 165.985-135.55c-0.314-62.091-36.817-115.582-89.483-140.485-79.833-53.479-142.936-124.653-185.13-208.189zM448 192h128v-128h-128z"  horiz-adv-x="1024" />
90
+
91
+    
92
+    <glyph glyph-name="horizontal" unicode="&#58936;" d="M0 448h1024v-128h-1024z"  horiz-adv-x="1024" />
93
+
94
+    
95
+    <glyph glyph-name="simpleupload" unicode="&#58906;" d="M128 64l160 320 160-320h-320zM514.56 64l254.72 512 254.72-512h-509.44zM960 832h-896c-35.346 0-64-28.654-64-64v-768c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v768c0 35.346-28.654 64-64 64zM960 64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v640c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
96
+
97
+    
98
+    <glyph glyph-name="indent" unicode="&#58907;" d="M896 480L768 576v-384l128 96L1024 384zM32 768h960c19.2 0 32 12.8 32 32s-12.8 32-32 32H32c-19.2 0-32-12.8-32-32s12.8-32 32-32zM32-64h960c19.2 0 32 12.8 32 32s-12.8 32-32 32H32c-19.2 0-32-12.8-32-32s12.8-32 32-32zM64 448h512c32 0 64 25.6 64 64 0 32-25.6 64-64 64H64c-38.4 0-64-25.6-64-64s25.6-64 64-64zM64 192h512c32 0 64 25.6 64 64 0 32-25.6 64-64 64H64c-32 0-64-25.6-64-64s25.6-64 64-64z"  horiz-adv-x="1024" />
99
+
100
+    
101
+    <glyph glyph-name="justifycenter" unicode="&#58908;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800 640h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800 256h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800-128h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800 256h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
102
+
103
+    
104
+    <glyph glyph-name="justifyleft" unicode="&#58909;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM608 640h-576C12.8 640 0 652.8 0 672S12.8 704 32 704h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM608-128h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM608 256h-576c-19.2 0-32 12.8-32 32S12.8 320 32 320h576c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
105
+
106
+    
107
+    <glyph glyph-name="justifyjustify" unicode="&#58910;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 640H32C12.8 640 0 652.8 0 672S12.8 704 32 704h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992-128H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 256H32c-19.2 0-32 12.8-32 32S12.8 320 32 320h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
108
+
109
+    
110
+    <glyph glyph-name="justifyright" unicode="&#58911;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 640h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992-128h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 256h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
111
+
112
+    
113
+    <glyph glyph-name="link" unicode="&#58912;" d="M759.040 128v124.16c73.167 0 132.48 59.313 132.48 132.48 0 73.167-59.313 132.48-132.48 132.48l-150.4-0c-0.384 0.004-0.839 0.006-1.294 0.006-73.908 0-133.948-59.373-135.025-133.025l-128.001-0.101c2.862 142.002 118.651 256.020 261.070 256.020 1.143 0 2.284-0.007 3.423-0.022l150.227 0.002c1.157 0.018 2.522 0.029 3.89 0.029 142.422 0 258.213-114.023 261.066-255.763-2.853-142.272-118.644-256.295-261.066-256.295-1.368 0-2.733 0.011-4.095 0.031zM415.36 128h-150.4c-1.157-0.018-2.522-0.029-3.89-0.029-142.422 0-258.213 114.023-261.066 255.763 2.853 142.272 118.644 256.295 261.066 256.295 1.368 0 2.733-0.011 4.095-0.031l-0.206-124.158c-0 0-0 0-0 0-73.167 0-132.48-59.313-132.48-132.48 0-73.167 59.313-132.48 132.48-132.48 0 0 0 0 0 0h150.4c0.575-0.009 1.254-0.014 1.933-0.014 73.91 0 133.952 59.378 135.025 133.033l128.001 0.101c-2.857-142.006-118.648-256.029-261.070-256.029-1.368 0-2.733 0.011-4.095 0.031z"  horiz-adv-x="1024" />
114
+
115
+    
116
+    <glyph glyph-name="cleardoc" unicode="&#58913;" d="M895.91 639.939h-191.955v199.633c-3.964 31.88-30.89 56.308-63.523 56.308-0.162 0-0.325-0.001-0.487-0.002l-502.257 0c-1.216 0.076-2.637 0.119-4.068 0.119-36.533 0-66.506-28.090-69.498-63.85l-0.017-896.043c3.010-36.014 32.982-64.104 69.515-64.104 1.431 0 2.852 0.043 4.261 0.128l748.43-0.009c1.216-0.076 2.637-0.119 4.068-0.119 36.533 0 66.506 28.090 69.498 63.85l0.017 647.142c-3.664 32.179-30.738 56.948-63.597 56.948-0.136 0-0.273-0-0.409-0.001zM895.91-55.577c-0-4.594-3.724-8.318-8.318-8.318h-749.903c-5.301 0-9.598 4.297-9.598 9.598 0 0 0 0 0 0v877.873c0 4.594 3.724 8.318 8.318 8.318h491.404c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-191.985c3.573-30.12 28.96-53.257 59.75-53.257 1.49 0 2.968 0.054 4.431 0.161l180.242-0.011c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-620.684z"  horiz-adv-x="1024" />
117
+
118
+    
119
+    <glyph glyph-name="drafts" unicode="&#58896;" d="M832 576v160c0 17.673-14.327 32-32 32h-224v64c0 35.346-28.654 64-64 64h-128c-35.346 0-64-28.654-64-64v-64h-224c-17.673 0-32-14.327-32-32v-640c0-17.673 14.327-32 32-32h288v-192h448l192 192v512zM384 832h128v-64h-128zM192 704h512v-64h-512zM832-37.76v101.76h101.76zM960 128h-192v-192h-320v576h512z"  horiz-adv-x="1024" />
120
+
121
+    
122
+    <glyph glyph-name="subscript" unicode="&#58897;" d="M716.8 76.79999999999995v29.696c0 99.328 160.256 135.68 160.256 179.2 0 16.896-10.752 27.136-32.768 27.136a116.736 116.736 0 0 1-74.24-35.84l-47.104 51.2A170.496 170.496 0 0 0 852.992 384c76.288 0 119.808-40.448 119.808-93.184 0-74.752-95.232-94.72-142.848-141.312H972.8V76.79999999999995zM72.192 175.61599999999999l494.592 494.592a56.832 56.832 0 0 0 78.848 8.704l7.68-7.68a56.832 56.832 0 0 0-8.704-78.848l-494.592-494.592a56.832 56.832 0 0 0-78.848-8.704l-7.68 7.68a56.832 56.832 0 0 0 8.704 78.848zM566.784 97.79200000000003L72.192 592.384a56.832 56.832 0 0 0-8.704 78.848l7.68 7.68a56.832 56.832 0 0 0 78.848-8.704l494.592-494.592a56.832 56.832 0 0 0 8.704-78.848l-7.68-7.68a56.832 56.832 0 0 0-78.848 8.704z"  horiz-adv-x="1024" />
123
+
124
+    
125
+    <glyph glyph-name="unlink" unicode="&#58914;" d="M539.417 447.988v127.976c1.652-0.102 3.582-0.16 5.526-0.16 49.558 0 90.285 37.811 94.905 86.159l0.030 19.581c-4.65 48.732-45.377 86.544-94.935 86.544-1.944 0-3.874-0.058-5.789-0.173l-310.717 0.013c-1.652 0.102-3.582 0.16-5.526 0.16-49.558 0-90.285-37.811-94.905-86.159l-0.030-18.942c4.338-49.025 45.209-87.18 94.992-87.18 1.924 0 3.835 0.057 5.73 0.169l-0.261-127.988c-1.945-0.061-4.233-0.096-6.528-0.096-119.961 0-217.703 95.133-221.897 214.072l-0.011 19.58c4.205 119.322 101.947 214.455 221.908 214.455 2.296 0 4.583-0.035 6.862-0.104l310.647 0.008c1.945 0.061 4.233 0.096 6.528 0.096 119.961 0 217.703-95.133 221.897-214.072l0.011-18.94c-3.859-119.604-101.743-215.094-221.929-215.094-2.288 0-4.568 0.035-6.84 0.103zM795.368-127.902h-310.981c-1.945-0.061-4.233-0.096-6.528-0.096-119.961 0-217.703 95.133-221.897 214.072l-0.011 18.94c3.859 119.604 101.743 215.094 221.929 215.094 2.288 0 4.568-0.035 6.84-0.103l-0.333-127.968c-1.652 0.102-3.582 0.16-5.526 0.16-49.558 0-90.285-37.811-94.905-86.159l-0.030-18.942c4.338-49.025 45.209-87.18 94.992-87.18 1.924 0 3.835 0.057 5.73 0.169l311.359-0.012c1.46-0.080 3.169-0.125 4.889-0.125 49.546 0 90.265 37.792 94.902 86.123l0.030 18.943c-4.338 49.025-45.209 87.18-94.992 87.18-1.924 0-3.835-0.057-5.73-0.169l0.261 127.988c1.945 0.061 4.233 0.096 6.528 0.096 119.961 0 217.703-95.133 221.897-214.072l0.011-18.94c-3.859-119.604-101.743-215.094-221.929-215.094-2.288 0-4.568 0.035-6.84 0.103z"  horiz-adv-x="1024" />
126
+
127
+    
128
+    <glyph glyph-name="superscript" unicode="&#58898;" d="M716.8 384v29.696c0 99.328 160.256 135.68 160.256 179.2 0 16.896-10.752 27.136-32.768 27.136a116.736 116.736 0 0 1-74.24-35.84l-47.104 51.2A170.496 170.496 0 0 0 852.992 691.2C929.28 691.2 972.8 650.752 972.8 598.0160000000001c0-74.752-95.232-94.72-142.848-141.312H972.8V384zM72.192 175.61599999999999l494.592 494.592a56.832 56.832 0 0 0 78.848 8.704l7.68-7.68a56.832 56.832 0 0 0-8.704-78.848l-494.592-494.592a56.832 56.832 0 0 0-78.848-8.704l-7.68 7.68a56.832 56.832 0 0 0 8.704 78.848zM566.784 97.79200000000003L72.192 592.384a56.832 56.832 0 0 0-8.704 78.848l7.68 7.68a56.832 56.832 0 0 0 78.848-8.704l494.592-494.592a56.832 56.832 0 0 0 8.704-78.848l-7.68-7.68a56.832 56.832 0 0 0-78.848 8.704z"  horiz-adv-x="1024" />
129
+
130
+    
131
+    <glyph glyph-name="forecolor" unicode="&#58938;" d="M588.8 832H428.8L192 128h108.8l57.6 166.4h275.2l57.6-166.4H832L588.8 832zM390.4 396.8l102.4 313.6 102.4-313.6H390.4zM192 0h640v-64H192z"  horiz-adv-x="1024" />
132
+
133
+    
134
+    <glyph glyph-name="backcolor" unicode="&#58965;" d="M910.594 232.538s-105.392-190.467-105.392-246.973c-0.202-2.447-0.317-5.297-0.317-8.174 0-58.206 47.186-105.392 105.392-105.392 58.206 0 105.392 47.186 105.392 105.392 0 2.877-0.115 5.727-0.341 8.545 0.659 58.674-104.733 246.601-104.733 246.601zM412.839 795.052l-24.126-26.031-121.899 126.978-97.138-100.313 121.899-126.978-291.415-299.034 412.679-426.012 412.679 426.012zM138.566 369.675l275.543 283.797 274.908-283.797z"  horiz-adv-x="1024" />
135
+
136
+    
137
+    <glyph glyph-name="touppercase" unicode="&#58915;" d="M295.68 768l-295.68-768h113.28l74.24 192h328.96l71.040-192h116.48l-295.68 768zM242.56 320l92.16 250.88c11.787 26.52 19.084 57.373 20.096 89.81 0.577-50.126 8.010-77.346 19.81-102.083l86.814-238.607zM996.48 83.84v115.84q1.92 120.32-131.2 120.32t-152.32-92.16l67.84-17.92q8.32 55.68 82.56 51.84t64-53.76c-27.154-12.564-58.932-19.893-92.421-19.893-1.709 0-3.413 0.019-5.112 0.057q-122.627-12.164-127.747-101.764t118.4-86.4c3.66-0.341 7.916-0.536 12.216-0.536 40.397 0 76.785 17.169 102.263 44.608 0.399-15.437 7.943-29.137 19.476-37.823l69.565 0.151c-17.207 18.277-27.781 42.967-27.781 70.127 0 2.573 0.095 5.124 0.281 7.65zM926.72 128q-6.4-64-95.36-71.68-56.96 0-55.040 32t67.84 44.16c0.513-0.006 1.118-0.010 1.724-0.010 30.022 0 57.98 8.834 81.418 24.044zM949.76 512h74.24c-15.36 106.88-232.32 128-311.040 128v128l-200.96-160 200.32-160v120.96c2.461 0.045 5.363 0.070 8.271 0.070 83.861 0 162.791-21.112 231.766-58.31z"  horiz-adv-x="1024" />
138
+
139
+    
140
+    <glyph glyph-name="tolowercase" unicode="&#58916;" d="M295.68 768l-295.68-768h113.28l74.24 192h328.96l71.040-192h116.48l-295.68 768zM242.56 320l92.16 250.88c11.787 26.52 19.084 57.373 20.096 89.81 0.577-50.126 8.010-77.346 19.81-102.083l86.814-238.607zM996.48 83.84v115.84q1.92 120.32-131.2 120.32t-152.32-92.16l67.84-17.92q8.32 55.68 82.56 51.84t64-53.76c-27.154-12.564-58.932-19.893-92.421-19.893-1.709 0-3.413 0.019-5.112 0.057q-122.627-12.164-127.747-101.764t118.4-86.4c3.66-0.341 7.916-0.536 12.216-0.536 40.397 0 76.785 17.169 102.263 44.608 0.399-15.437 7.943-29.137 19.476-37.823l69.565 0.151c-17.207 18.277-27.781 42.967-27.781 70.127 0 2.573 0.095 5.124 0.281 7.65zM926.72 128q-6.4-64-95.36-71.68-56.96 0-55.040 32t67.84 44.16c0.513-0.006 1.118-0.010 1.724-0.010 30.022 0 57.98 8.834 81.418 24.044zM586.24 512h-74.24c15.36 106.88 232.32 128 311.040 128v128l200.96-160-200.96-160v120.96c-2.276 0.038-4.96 0.060-7.65 0.060-83.854 0-162.777-21.108-231.747-58.3z"  horiz-adv-x="1024" />
141
+
142
+    
143
+    <glyph glyph-name="insertvideo" unicode="&#58919;" d="M384 128l256 256-256 256v-512zM960 832h-896c-35.346 0-64-28.654-64-64v-768c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v768c0 35.346-28.654 64-64 64zM960 0h-896v768h896z"  horiz-adv-x="1024" />
144
+
145
+    
146
+    <glyph glyph-name="emotion" unicode="&#58886;" d="M512 896c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512 0 282.77-229.23 512-512 512zM512-64c-247.424 0-448 200.576-448 448s200.576 448 448 448c247.424 0 448-200.576 448-448 0-247.424-200.576-448-448-448zM256 512c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64zM640 512c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64zM512 64c141.385 0 256 114.615 256 256h-512c0-141.385 114.615-256 256-256z"  horiz-adv-x="1024" />
147
+
148
+    
149
+    <glyph glyph-name="pasteplain" unicode="&#58899;" d="M640 640v128h-64v64c0 35.346-28.654 64-64 64h-192c-35.346 0-64-28.654-64-64v-64h-64v-128zM320 832h192v-64h-192zM832 512v224c-0.704 17.824-15.323 32.007-33.256 32.007-0.234 0-0.467-0.002-0.699-0.007l-94.045 0.001v-64h64v-64h-64v-64h-576v192h-94.080c-0.198 0.004-0.431 0.007-0.664 0.007-17.932 0-32.552-14.183-33.254-31.943l-0.002-736.064h384v-128h640v640zM448-64v512h512v-512zM576 320h320v-64h-320zM704 256h64v-256h-64zM704 704h64v-128h-64z"  horiz-adv-x="1024" />
150
+
151
+    
152
+    <glyph glyph-name="preview" unicode="&#58939;" d="M895.91 639.939h-191.955v199.633c-3.964 31.88-30.89 56.308-63.523 56.308-0.162 0-0.325-0.001-0.487-0.002l-502.257 0c-1.216 0.076-2.637 0.119-4.068 0.119-36.533 0-66.506-28.090-69.498-63.85l-0.017-896.043c3.010-36.014 32.982-64.104 69.515-64.104 1.431 0 2.852 0.043 4.261 0.128l748.43-0.009c1.216-0.076 2.637-0.119 4.068-0.119 36.533 0 66.506 28.090 69.498 63.85l0.017 647.142c-3.664 32.179-30.738 56.948-63.597 56.948-0.136 0-0.273-0-0.409-0.001zM895.91-55.577c-0-4.594-3.724-8.318-8.318-8.318h-749.903c-5.301 0-9.598 4.297-9.598 9.598 0 0 0 0 0 0v877.873c0 4.594 3.724 8.318 8.318 8.318h491.404c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-191.985c3.573-30.12 28.96-53.257 59.75-53.257 1.49 0 2.968 0.054 4.431 0.161l180.242-0.011c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-620.684zM767.94 45.519l-173.399 172.759c11.267 14.903 21.003 31.929 28.429 50.141l99.541-268.33zM256.060 352.007c-0 88.345 71.618 159.962 159.962 159.962s159.962-71.618 159.962-159.962c0-88.345-71.618-159.962-159.962-159.962-88.345 0-159.962 71.618-159.962 159.962z"  horiz-adv-x="1024" />
153
+
154
+    
155
+    <glyph glyph-name="print" unicode="&#58940;" d="M320.006 448h384v-64h-384zM320.006 320h384v-64h-384zM988.806 716.8h-156.8v179.2h-640v-179.2h-156.8c-0.002 0-0.004 0-0.006 0-19.44 0-35.2-15.76-35.2-35.2 0-0.225 0.002-0.45 0.006-0.674l-0-443.486h192v-45.44l256-256h384v301.44h192v311.68c0.032 0.574 0.051 1.245 0.051 1.92s-0.018 1.346-0.055 2.013l0.004 127.907c0.004 0.19 0.006 0.415 0.006 0.64 0 19.44-15.76 35.2-35.2 35.2-0.002 0-0.004-0-0.006-0zM256.006 832h512v-115.2h-512zM896.006 320h-56.96v120.32h-71.040v-440.32h-296.96v199.040h-215.040v241.28h-68.48v-120.32h-59.52v192h768zM928.006 594.56c-0.19-0.004-0.415-0.006-0.64-0.006-18.027 0-32.64 14.613-32.64 32.64 0 18.027 14.613 32.64 32.64 32.64 18.024 0 32.636-14.61 32.64-32.633 0.004-0.191 0.006-0.415 0.006-0.64 0-17.673-14.327-32-32-32-0.002 0-0.005 0-0.007 0z"  horiz-adv-x="1024" />
156
+
157
+    
158
+    <glyph glyph-name="selectall" unicode="&#58900;" d="M184.32 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM113.92 752l-113.92-113.92v-40.32l113.92 113.92v40.32zM144 896l-144-144v-40.32l184.32 184.32h-40.32zM30.72 896l-30.72-30.72v-40.32l71.040 71.040h-40.32zM527.36 782.080l113.92 113.92h-40.32l-113.28-113.92h39.68zM113.92 408.32l-113.92-113.28v-40.32l113.92 113.92v39.68zM113.92 522.24l-113.92-113.92v-39.68l113.92 113.28v40.32zM414.080 782.080l113.28 113.92h-39.68l-113.92-113.92h40.32zM300.16 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM113.92 636.16l-113.92-113.92v-40.32l113.92 113.92v40.32zM113.92 60.8l-113.92-113.28v-40.32l113.92 113.28v40.32zM875.52 782.080l113.28 113.92h-40.32l-113.28-113.92h40.32zM113.92 174.72l-113.92-113.92v-40.32l113.92 113.92v40.32zM761.6 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM113.92 288.64l-113.92-113.92v-40.32l113.92 113.92v40.32zM647.68 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM910.080 476.8l113.92 113.92v40.32l-113.92-113.92v-40.32zM378.88-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 590.72l113.92 113.28v40.32l-113.92-113.28v-40.32zM264.96-14.080l-113.28-113.92h40.32l113.28 113.92h-40.32zM151.68-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 744.32v-40.32l113.92 113.92v40.32l-113.92-113.92zM910.080 136.96l113.92 113.92v40.32l-113.92-113.92v-40.32zM718.72-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 250.88l113.92 113.92v40.32l-113.92-113.92v-40.32zM604.8-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM490.88-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 364.8l113.92 113.92v40.32l-113.92-113.92v-40.32zM988.16-128l35.84 35.84v40.32l-76.16-76.16h40.32zM874.24-128l149.76 149.76v40.32l-190.080-190.080h40.32zM833.92-14.080l-113.28-113.92h39.68l113.92 113.92h-40.32zM910.080 21.76l113.92 113.92v39.68l-113.92-113.28v-40.32zM256 265.6q7.040-137.6 186.24-137.6c5.836-0.542 12.621-0.851 19.478-0.851 64.527 0 122.663 27.362 163.439 71.117 0.443-24.781 12.479-46.819 30.964-60.763l111.879 0.097c-27.64 29.266-44.63 68.846-44.63 112.395 0 4.366 0.171 8.692 0.506 12.971l-0.036 185.034q3.2 192-211.84 192t-242.56-147.2l108.8-28.8q13.44 89.6 133.76 83.2 112 6.4 101.76-86.4c-43.614-20.262-94.671-32.082-148.489-32.082-2.697 0-5.387 0.030-8.070 0.089q-198-19.207-201.2-163.207zM611.84 377.6v-44.8q-10.24-105.6-152.32-115.2-91.52 0-88.32 51.2-6.4 60.8 108.8 70.4c0.479-0.003 1.045-0.005 1.611-0.005 48.398 0 93.45 14.326 131.147 38.969z"  horiz-adv-x="1024" />
159
+
160
+    
161
+    <glyph glyph-name="mergecells" unicode="&#58941;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM320 576h-256v256h256zM384 832h256v-256h-256zM960-64h-576v576h576zM960 576h-256v256h256z"  horiz-adv-x="1024" />
162
+
163
+    
164
+    <glyph glyph-name="deletecol" unicode="&#58942;" d="M1024 588.16v307.84h-256v-576h256zM832 640v192h128v-192zM832 384v192h128v-192zM448 588.16v307.84h-448v-576h448zM64 640v192h128v-192zM256 640v192h128v-192zM64 384v192h128v-192zM256 384v192h128v-192zM640 192v68.48l-69.76-68.48h69.76zM593.28 187.52zM640 384v-136.32l64 34.56v357.76h-192v-352l64-32v128zM576 448v128h64v-128zM734.72-128l96.64 92.8-127.36 122.24 128 122.88-96 92.16-32-19.84v-154.24h-192v160l-32 14.080-96-92.16 128-122.88-127.36-122.24 96-92.8 127.36 122.24 126.72-122.24zM512 192h76.8l-76.8 74.24v-74.24z"  horiz-adv-x="1024" />
165
+
166
+    
167
+    <glyph glyph-name="deleterow" unicode="&#58943;" d="M307.84 896h-307.84v-256h576v256zM256 704h-192v128h192zM512 704h-192v128h192zM307.84 320h-307.84v-448h576v448zM256-64h-192v128h192zM256 128h-192v128h192zM512-64h-192v128h192zM512 128h-192v128h192zM716.8 535.68h-68.48l68.48-70.4v70.4zM708.48 465.28zM520.96 551.040h128l-34.56 35.84h-358.4v-219.52h352l32 35.84h-119.040zM448 448h-131.84v64h131.84zM1024 607.36l-92.8 96-122.24-127.36-122.88 128-92.16-96 19.84-21.12h137.6v-219.52h-143.36l-14.080-15.36 92.16-96 122.88 128 122.24-127.36 92.8 96.64-122.24 126.72 122.24 127.36zM716.8 403.2v76.8l-74.24-76.8h74.24z"  horiz-adv-x="1024" />
168
+
169
+    
170
+    <glyph glyph-name="attachment" unicode="&#58920;" d="M972.16 523.52l-520.32-512c-40.168-39.518-95.315-63.917-156.16-63.917-60.845 0-115.992 24.399-156.19 63.947-40.076 39.269-64.939 93.994-64.939 154.525 0 60.216 24.604 114.685 64.307 153.904l468.502 460.822c26.767 26.283 63.489 42.507 104 42.507s77.233-16.224 104.022-42.529c26.612-26.227 43.112-62.696 43.112-103.018 0-40.323-16.5-76.791-43.117-103.023l-467.857-463.377c-13.401-13.236-31.826-21.411-52.16-21.411s-38.759 8.175-52.168 21.418c-13.309 13.117-21.559 31.351-21.559 51.513 0 20.161 8.25 38.396 21.558 51.511l416.649 411.529-51.84 51.2-416-411.52c-26.634-26.249-43.134-62.717-43.134-103.040s16.5-76.791 43.117-103.023c26.785-26.3 63.506-42.524 104.017-42.524 40.511 0 77.233 16.224 104.022 42.529l468.458 463.338c39.758 39.343 64.377 93.916 64.377 154.24s-24.619 114.897-64.358 154.222c-40.254 39.917-95.659 64.572-156.823 64.572-60.843 0-115.989-24.397-156.186-63.943l-491.49-488.931c-37.461-48.505-60.045-110.166-60.045-177.101 0-80.906 32.995-154.105 86.262-206.877 53.349-51.49 126.039-83.2 206.136-83.2 67.624 0 129.969 22.604 179.89 60.668l547.756 535.151-51.84 51.2z"  horiz-adv-x="1024" />
171
+
172
+    
173
+    <glyph glyph-name="music" unicode="&#58944;" d="M991.14 895.112h-7.673c-2.402 0.564-5.16 0.887-7.993 0.887s-5.591-0.323-8.239-0.935l-747.266-134.875c-15.608-1.932-27.64-14.874-28.137-30.724-0.026-0.447-0.041-1.006-0.041-1.568 0-0.562 0.015-1.121 0.046-1.676l-0.003-616.348c-18.531 11.177-40.89 17.823-64.795 17.91-69.781-0.006-127.038-57.264-127.038-127.895 0-70.631 57.258-127.889 127.889-127.889 70.631 0 127.889 57.258 127.889 127.889l-0 511.556c2.687-0.709 5.772-1.116 8.952-1.116s6.265 0.407 9.206 1.172l685.232 123.996v-457.203c-18.531 11.177-40.89 17.823-64.795 17.91-69.747-0.051-126.96-57.291-126.96-127.895 0-70.631 57.258-127.889 127.889-127.889 69.057 0 125.33 54.734 127.804 123.187l0.006 799.532c0 17.658-14.314 31.972-31.972 31.972z"  horiz-adv-x="1024" />
174
+
175
+    
176
+    <glyph glyph-name="gmap" unicode="&#58921;" d="M543.36 323.84h128v-144.64c-27.042-18.911-60.614-30.218-96.827-30.218-2.41 0-4.808 0.050-7.194 0.149-135.339-0.011-207.659 89.589-207.659 236.789s83.84 233.6 206.080 233.6c1.985 0.077 4.316 0.121 6.658 0.121 51.625 0 98.258-21.372 131.535-55.751l56.368 63.95c-48.672 47.215-115.142 76.321-188.411 76.321-3.288 0-6.562-0.059-9.822-0.175-2.247 0.102-5.444 0.153-8.653 0.153-164.713 0-298.24-133.527-298.24-298.24 0-7.707 0.292-15.345 0.866-22.905-0.061-201.235 127.939-318.995 303.939-318.995 2.993-0.105 6.51-0.164 10.041-0.164 75.665 0 144.927 27.412 198.397 72.848l-0.438 267.157h-224.64zM896 896h-768c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h768c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM896 0c0-35.346-28.654-64-64-64h-640c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h640c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
177
+
178
+    
179
+    <glyph glyph-name="insertframe" unicode="&#58949;" d="M448 512c-141.385 0-256-114.615-256-256s114.615-256 256-256c141.385 0 256 114.615 256 256 0 141.385-114.615 256-256 256zM643.84 341.12c11.26-25.164 17.818-54.536 17.818-85.44s-6.558-60.276-18.358-86.801l-96.099 1.361c4.638 25.688 7.29 55.254 7.29 85.44 0 30.186-2.652 59.752-7.736 88.479zM384 256c-0.006 0.936-0.009 2.043-0.009 3.15 0 28.938 2.331 57.331 6.815 85.002l114.795-3.032c4.079-24.639 6.409-53.032 6.409-81.97 0-1.108-0.003-2.214-0.010-3.32 0.007-0.766 0.010-1.872 0.010-2.98 0-28.938-2.331-57.331-6.815-85.002l-114.795 3.032c-4.079 24.639-6.409 53.032-6.409 81.97 0 1.108 0.003 2.214 0.010 3.32zM618.88 384h-81.28c-11.121 41.020-32.662 76.060-61.625 103.299 78.384-37.794 124.984-72.611 153.982-119.469zM448 448c19.2 0 35.84-24.96 48-64h-96c12.16 39.040 28.8 64 48 64zM398.080 463.36c-24.403-30.724-40.833-68.802-45.587-110.426l-75.373 31.066c33.569 44.293 83.219 74.881 140.108 83.067zM252.16 341.12h96c-4.638-25.688-7.29-55.254-7.29-85.44 0-30.186 2.652-59.752 7.736-88.479l-96.446 3.039c-11.26 25.164-17.818 54.536-17.818 85.44s6.558 60.276 18.358 86.801zM277.12 128h81.28c11.121-41.020 32.662-76.060 61.625-103.299-78.384 37.794-124.984 72.611-153.982 119.469zM448 64c-19.2 0-35.84 24.96-48 64h96c-12.16-39.040-28.8-64-48-64zM497.92 48.64c24.403 30.724 40.833 68.802 45.587 110.426l75.373-31.066c-33.569-44.293-83.219-74.881-140.108-83.067zM597.76 896h-533.76v-1024h896v693.76zM896 540.16v-604.16h-768v896h448v-256h320z"  horiz-adv-x="1024" />
180
+
181
+    
182
+    <glyph glyph-name="pdfformat" unicode="&#58927;" d="M597.76 896h-533.76v-1024h896v693.76zM896-64h-768v896h448v-291.2h320zM213.76 280.32h-47.36v-133.12h49.28c58.24 0 85.76 21.76 85.76 69.76s-30.72 63.36-87.68 63.36zM486.4 273.92h-32.64v-268.8h32.64c77.44 0 119.040 45.44 119.040 135.68s-40.96 133.12-119.040 133.12zM64 448v-576h874.24v576zM239.36 95.36h-54.4v-136.96h-56.96v361.6h109.44c82.56 0 138.24-27.52 138.24-108.8s-55.68-115.84-136.32-115.84zM495.36-41.6h-98.56v361.6h93.44c5.013 0.56 10.826 0.879 16.713 0.879 88.012 0 159.36-71.348 159.36-159.36 0-7.305-0.492-14.496-1.443-21.54 1.076-5.861 1.638-13.575 1.638-21.42 0-88.719-71.921-160.64-160.64-160.64-4.374 0-8.707 0.175-12.992 0.518zM906.88 272h-158.72v-110.72h133.76v-48h-133.76v-155.52h-56.96v362.24h214.4z"  horiz-adv-x="1024" />
183
+
184
+    
185
+    <glyph glyph-name="word" unicode="&#58950;" d="M718.080 350.080c-12.16-60.16-21.12-117.76-32-177.28h-3.84c-12.8 58.88-23.68 117.12-36.48 177.28l-78.080 337.92h-106.24l-77.44-337.92c-12.8-58.88-23.68-117.76-35.84-177.28h-2.56c-9.6 58.88-18.56 117.12-29.44 177.28l-72.96 337.92h-115.2l147.84-624h131.84l64 307.2c14.080 58.88 23.68 117.12 34.56 181.76h5.76c12.16-64 21.76-121.6 34.56-180.48l71.68-308.48h136.96l140.8 624h-106.88zM960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM960 0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
186
+
187
+    
188
+    <glyph glyph-name="excel" unicode="&#58951;" d="M960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM960 0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64zM816.64 768h-155.52l-74.88-154.88c-19.2-41.6-40.32-85.12-59.52-128h-5.12c-23.040 43.52-46.72 86.4-67.2 128l-85.12 154.88h-160.64l213.76-367.36-230.4-400.64h156.16l82.56 161.92c21.76 47.36 44.16 93.44 64 136.96h6.4c25.6-43.52 50.56-90.88 73.6-136.96l96-161.92h161.28l-229.12 384z"  horiz-adv-x="1024" />
189
+
190
+    
191
+    <glyph glyph-name="time" unicode="&#58954;" d="M839.71 665.392l21.719 21.719 43.439-43.439 54.298 53.659-127.76 127.76-54.937-54.298 43.439-43.439-21.719-21.719c-75.422 67.785-173.222 112.028-281.079 120.458 35.914 34.385 3.15 64.831-36.725 64.831-39.875 0-72.639-30.446-76.313-69.359-53.727-9.585-101.81-26.59-145.709-50.339l109.274-52.815c33.919 10.918 72.943 17.223 113.435 17.25 210.674-0.002 382.275-171.603 382.275-383.283 0-211.68-171.601-383.281-383.281-383.281-211.68 0-383.281 171.601-383.281 383.281-0 0.065-0 0.141-0 0.218 0 67.637 17.52 131.182 48.269 186.345l-80.209 52.35c-40.161-67.975-63.89-149.791-63.89-237.149 0-1.069 0.004-2.137 0.011-3.204-0.001-264.436 214.5-478.938 479.101-478.938 264.601 0 479.102 214.501 479.102 479.102-0.017 120.866-45.332 231.144-119.891 314.787zM480.065 640.479c-0.001 0-0.003 0-0.004 0-25.53 0-46.268-20.516-46.628-45.96l-0-182.093c-18.945-13.991-31.096-36.239-31.096-61.325s12.151-47.334 30.889-61.179l0.207-64.027c2.821-23.303 22.479-41.184 46.313-41.184s43.492 17.881 46.291 40.96l0.022 64.104c18.945 13.991 31.096 36.239 31.096 61.325s-12.151 47.334-30.889 61.179l-0.207 184.76c-1.708 24.169-21.601 43.165-45.99 43.439zM252.651 896l-109.235-251.049 274.685-5.11-50.465 77.934-51.104 79.85-63.88 98.376z"  horiz-adv-x="1024" />
192
+
193
+    
194
+    <glyph glyph-name="snapscreen" unicode="&#58960;" d="M665.6 503.040l-204.8-155.52-204.8 233.6v-389.12h512v155.52l-102.4 155.52zM1024 64h-128v704h-704v128h-64v-128h-128v-64h128v-704h704v-128h64v128h128zM192 64v640h640v-640z"  horiz-adv-x="1024" />
195
+
196
+    
197
+    <glyph glyph-name="wordimage" unicode="&#58962;" d="M988.16 448h-568.32c-19.794 0-35.84-16.046-35.84-35.84 0 0 0 0 0 0v-504.32c0-19.794 16.046-35.84 35.84-35.84h568.96c0 0 0 0 0 0 19.794 0 35.84 16.046 35.84 35.84 0 0 0 0 0 0v504.32c0 0.002 0 0.004 0 0.006 0 19.794-16.046 35.84-35.84 35.84-0.225 0-0.45-0.002-0.674-0.006zM664.32 283.52c-1.074-43.349-36.469-78.080-79.977-78.080-44.183 0-80 35.817-80 80 0 44.175 35.804 79.987 79.976 80 44.338-0.719 80.004-36.829 80.004-81.27 0-0.229-0.001-0.457-0.003-0.685zM929.28-64h-467.84l131.2 205.44 85.12-133.12 177.28 298.24 104.96-178.56v-163.2c-1.040-16.12-14.369-28.8-30.66-28.8-0.021 0-0.042 0-0.063 0zM960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h256v64h-192c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64v-256h64v320c0 35.346-28.654 64-64 64zM320 341.76l-78.72 362.24h-118.4l151.68-640h45.44v266.24zM858.88 512l43.52 192h-116.48l-40.32-192h113.28zM501.76 512c0 26.88 4.48 40.32 7.040 64h3.2c0-23.68 7.68-64 7.68-64h97.28l-44.8 192h-115.84l-42.88-192z"  horiz-adv-x="1024" />
198
+
199
+    
200
+    <glyph glyph-name="edittd" unicode="&#58970;" d="M576 128c0-106.039 85.961-192 192-192s192 85.961 192 192c0 106.039-85.961 192-192 192-106.039 0-192-85.961-192-192zM448 128c0.094 176.66 143.327 319.835 320 319.835 46.3 0 90.303-9.833 130.036-27.525l-2.036 347.69h-768v-768h346.88c-16.972 37.769-26.865 81.866-26.88 128.273zM0 896v-1024h576c-46.418 35.069-82.504 81.491-104.415 135.203l-407.585-71.203v896h896v-448c46.418-35.069 82.504-81.491 104.415-135.203l-40.415 647.203z"  horiz-adv-x="1024" />
201
+
202
+    
203
+    <glyph glyph-name="lineheight" unicode="&#58922;" d="M380.8 128h-380.8l190.72-254.72 190.080 254.72zM512 128h512v-64h-512v64zM512 320h512v-64h-512v64zM512 512h512v-64h-512v64zM512 704h512v-64h-512v64zM2.56 640h380.8l-190.080 254.72-190.72-254.72z"  horiz-adv-x="1024" />
204
+
205
+    
206
+    <glyph glyph-name="rowspacingbottom" unicode="&#58923;" d="M704 128H320l192-256zM672 256H32c-19.2 0-32 12.8-32 32S12.8 320 32 320h640c19.2 0 32-12.8 32-32s-12.8-32-32-32zM864 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h832c19.2 0 32-12.8 32-32s-12.8-32-32-32zM480 640h-448C12.8 640 0 652.8 0 672S12.8 704 32 704h448c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
207
+
208
+    
209
+    <glyph glyph-name="rowspacingtop" unicode="&#58924;" d="M320 640h384L512 896zM352 512h640c19.2 0 32-12.8 32-32s-12.8-32-32-32h-640c-19.2 0-32 12.8-32 32s12.8 32 32 32zM160 320h832c19.2 0 32-12.8 32-32s-12.8-32-32-32h-832c-19.2 0-32 12.8-32 32s12.8 32 32 32zM544 128h448c19.2 0 32-12.8 32-32s-12.8-32-32-32h-448c-19.2 0-32 12.8-32 32s12.8 32 32 32zM32-64h960c19.2 0 32-12.8 32-32s-12.8-32-32-32H32c-19.2 0-32 12.8-32 32s12.8 32 32 32z"  horiz-adv-x="1024" />
210
+
211
+    
212
+    <glyph glyph-name="scrawl" unicode="&#58902;" d="M1018.284 618.88c-3.741 3.949-9.022 6.406-14.878 6.406-0.17 0-0.339-0.002-0.507-0.006-18.281-3.25-33.767-13.388-43.958-27.584l-387.377-385.216c-97.674-132.446-170.577-289.537-208.303-459.854l130.863 340.174 14.080 8.96c3.84 0 90.24 56.96 104.96 71.040l390.4 389.12c16.64 14.080 29.44 41.6 14.72 56.96zM774.444 497.92c-1.065-30.621-26.145-55.040-56.928-55.040-31.458 0-56.96 25.502-56.96 56.96 0 31.447 25.483 56.942 56.926 56.96 31.613-0.715 56.965-26.51 56.965-58.226 0-0.23-0.001-0.46-0.004-0.689zM173.484 292.48c-0.572-0.020-1.245-0.031-1.92-0.031-32.519 0-58.88 26.361-58.88 58.88 0 32.519 26.361 58.88 58.88 58.88 32.508 0 58.862-26.344 58.88-58.847 0.002-0.196 0.004-0.426 0.004-0.656 0-31.716-25.352-57.511-56.897-58.225zM256.684 497.92c1.065 30.621 26.145 55.040 56.928 55.040 31.458 0 56.96-25.502 56.96-56.96 0-31.447-25.483-56.942-56.926-56.96-31.613 0.715-56.965 26.51-56.965 58.226 0 0.23 0.001 0.46 0.004 0.689zM459.564 556.8c1.065 30.621 26.145 55.040 56.928 55.040 31.458 0 56.96-25.502 56.96-56.96 0-31.447-25.483-56.942-56.926-56.96-31.613 0.715-56.965 26.51-56.965 58.226 0 0.23 0.001 0.46 0.004 0.689zM902.444 357.76c-31.114-198.424-199.103-348.964-402.953-352.649-44.127 0.133-86.562 8.912-125.365 24.752-35.522 14.937-52.802 33.497-56.642 45.657s-3.84 13.44-5.12 20.48c-7.834 36.146-22.479 67.979-42.623 95.538 5.698-5.462-21.312 11.988-52.397 11.988-0.345 0-0.689-0.002-1.033-0.006-3.886 0.48-8.445 0.754-13.068 0.754-4.623 0-9.182-0.274-13.662-0.806-12.472-3.188-27.415-5.056-42.792-5.072-27.705 0.004-76.345 7.684-77.625 60.164-8.32 266.88 206.080 412.16 421.76 437.76 7.269 0.45 15.764 0.706 24.32 0.706 8.556 0 17.051-0.256 25.48-0.762-0.547 0.058 0.179 0.060 0.905 0.060 61.978 0 121.325-11.266 176.105-31.862 7.43-3.343 13.19-5.903 41.35-19.983 45.5-22.593 82.418-56.579 107.926-98.3l0.234 108.54c-39.591 39.065-89.533 67.734-145.34 81.521 39.74-11.761 32.060-7.921 18.62-2.161-57.675 21.514-124.314 33.964-193.861 33.964-2.496 0-4.989-0.016-7.477-0.048-8.039 0.525-17.876 0.822-27.782 0.822-9.906 0-19.744-0.297-29.503-0.882-141.37-14.839-266.964-78.425-360.631-173.541-66.027-62.45-121.268-181.419-121.268-313.291 0-8.831 0.248-17.603 0.737-26.312-0.056 0.957-0.057 0.66-0.057 0.363 0-38.985 18.155-73.73 46.471-96.241 26.281-19.448 59.014-31.013 94.449-31.013 1.984 0 3.961 0.036 5.927 0.108 20.847 0.167 41.263 2.875 60.785 7.826l7.41-0.794c13.44 0 19.2-11.52 30.72-57.6 0-7.68 3.84-15.36 5.76-23.040 18.972-47.312 59.266-82.528 108.663-94.1 33.53-14.445 83.337-24.315 135.45-24.315 1.254 0 2.507 0.006 3.758 0.017 0.225-0.003 0.719-0.004 1.212-0.004 63.695 0 124.367 12.941 179.531 36.338 81.727 34.251 151.681 90.814 202.313 162.068 5.358-6.858 54.273 74.77 77.563 166.616-8.168-44.029 10.698 24.185 13.446 96.526l-3.217-20.585z"  horiz-adv-x="1024" />
213
+
214
+    
215
+    <glyph glyph-name="redo" unicode="&#58889;" d="M900.608 421.888c-51.2 51.2-260.608 261.632-291.84 292.352-11.806 10.097-27.254 16.241-44.137 16.241-18.488 0-35.255-7.368-47.525-19.327-11.992-12.987-19.355-30.431-19.355-49.596 0-9.601 1.848-18.77 5.208-27.172 12.114-17.938 187.73-199.186 187.73-199.186h-520.704c-1.707 0.167-3.691 0.262-5.696 0.262-34.215 0-61.952-27.737-61.952-61.952 0-0.993 0.023-1.98 0.070-2.961 1.872-36.617 31.37-65.906 68.041-67.444l517.682-0.001-173.056-172.032c-11.419-12.149-18.435-28.551-18.435-46.592s7.016-34.443 18.468-46.628c12.029-13.522 29.523-22.020 49.001-22.020 15.841 0 30.37 5.621 41.7 14.976 24.977 22.951 255.889 252.839 297.873 296.359s-3.072 94.72-3.072 94.72z"  horiz-adv-x="1024" />
216
+
217
+    
218
+    <glyph glyph-name="undo" unicode="&#58880;" d="M128.512 419.84c51.2 51.2 260.608 261.632 291.84 292.352 11.806 10.097 27.254 16.241 44.137 16.241 18.488 0 35.255-7.368 47.525-19.327 11.777-12.935 18.997-30.227 18.997-49.205 0-9.749-1.905-19.053-5.364-27.559-13.648-17.942-187.216-197.142-187.216-197.142h520.192c1.125 0.073 2.44 0.114 3.764 0.114 34.215 0 61.952-27.737 61.952-61.952 0-1.662-0.065-3.309-0.194-4.938-1.863-36.541-31.361-65.829-68.033-67.368l-517.682-0.001 173.568-173.056c11.419-12.149 18.435-28.551 18.435-46.592s-7.016-34.443-18.468-46.628c-12.029-13.522-29.523-22.020-49.001-22.020-15.841 0-30.37 5.621-41.7 14.976-24.977 22.951-255.889 252.839-297.873 296.359s5.12 95.744 5.12 95.744z"  horiz-adv-x="1024" />
219
+
220
+    
221
+    <glyph glyph-name="inserttitle" unicode="&#58971;" d="M512 379.904v153.6h-51.2v-102.4h-102.4v-51.2h-153.6v51.2h-102.4v102.4h-51.2v-614.4h921.6v460.8zM338.944-29.696h-240.64v167.936h238.592zM338.944 189.44h-240.64v139.264h238.592zM636.416-29.696h-248.32v167.936h246.272zM636.416 189.44h-248.32v139.264h246.272zM919.552-29.696h-233.984v167.936h231.936zM919.552 189.44h-233.984v139.264h231.936zM512 430.592v-51.2h460.8v465.408h-460.8v-307.2zM563.2 635.392h153.6v153.6h51.2v-153.6h153.6v-51.2h-153.6v-153.6h-51.2v153.6h-153.6zM99.328 787.968h102.4v51.2h-153.6v-153.6h51.2v102.4zM512.512 791.040v51.2h-153.6v-51.2h102.4v-102.4h51.2v102.4z"  horiz-adv-x="1024" />
222
+
223
+    
224
+    <glyph glyph-name="insertparagraphtrue" unicode="&#58976;" d="M997.12 448h-997.12v-576h1024v576zM60.16-64v256h259.84v-256zM542.080-64h-158.080v256h256v-256zM963.84-64h-259.84v256h259.84zM448 896h-448v-64h192v-384h64v384h192v64z"  horiz-adv-x="1024" />
225
+
226
+    
227
+    <glyph glyph-name="aligntable" unicode="&#58978;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32C12.8 640 0 652.8 0 672S12.8 704 32 704h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-384H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32c-19.2 0-32 12.8-32 32S12.8 320 32 320h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
228
+
229
+    
230
+    <glyph glyph-name="table" unicode="&#58980;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM640-64h-256v256h256zM640 256h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-896v256h896z"  horiz-adv-x="1024" />
231
+
232
+    
233
+    <glyph glyph-name="tablealignment-left" unicode="&#58979;" d="M51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 640l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 332.79999999999995l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 25.600000000000023l614.4 0 0-51.2-614.4 0 0 51.2Z"  horiz-adv-x="1024" />
234
+
235
+    
236
+    <glyph glyph-name="tablealignment-center" unicode="&#58981;" d="M51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 640l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 332.79999999999995l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 25.600000000000023l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2Z"  horiz-adv-x="1024" />
237
+
238
+    
239
+    <glyph glyph-name="tablealignment-right" unicode="&#58982;" d="M51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM358.4 640l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM358.4 332.79999999999995l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2ZM358.4 25.600000000000023l614.4 0 0-51.2-614.4 0 0 51.2Z"  horiz-adv-x="1024" />
240
+
241
+    
242
+    <glyph glyph-name="paste" unicode="&#58983;" d="M832 576v160c0 17.673-14.327 32-32 32h-224v64c0 35.346-28.654 64-64 64h-128c-35.346 0-64-28.654-64-64v-64h-224c-17.673 0-32-14.327-32-32v-640c0-17.673 14.327-32 32-32h288v-192h448l192 192v512zM384 832h128v-64h-128zM192 704h512v-64h-512zM832-37.76v101.76h101.76zM960 128h-192v-192h-320v576h512z"  horiz-adv-x="1024" />
243
+
244
+    
245
+    <glyph glyph-name="map" unicode="&#58984;" d="M375.424 564.176c-2.432-6.96-7.856-24.704-3.152-40.208 9.232-34.672 39.424-36.24 39.424-36.24h43.264V593.632h-46.4c-20.864-6.24-30.944-22.432-33.136-29.456z m129.072-119.072H397.008c-46.448 9.28-64.896 40.992-67.28 46.368-2.288 5.456-15.504 30.944-8.464 74.256 20.032 64.976 77.28 69.616 77.28 69.616h57.248v70.368l48.704-0.8v-259.808z m200.272 0.768H581.04c-47.92 12.368-50.176 46.496-50.176 46.496V629.184L581.04 630v-123.024c3.008-13.024 19.376-15.44 19.376-15.44h50.912V629.232h53.456v-183.36h-0.016zM512-125.45c-11.203 0-21.563 6-27.172 15.688L208.375 368.274c-30.803 53.1-47.11 113.662-47.11 175.084 0 193.047 157.35 350.094 350.75 350.094 193.391 0 350.72-157.047 350.72-350.094 0-61.421-16.298-121.975-47.126-175.115l-276.437-478.007c-5.61-9.687-15.953-15.687-27.172-15.687z m0.016 956.138c-158.788 0-287.985-128.907-287.985-287.329 0-50.375 13.375-100.037 38.663-143.615l249.303-431.1 249.297 431.062c25.297 43.616 38.656 93.281 38.656 143.656 0 158.42-129.172 287.325-287.934 287.325z"  horiz-adv-x="1024" />
246
+
247
+    
248
+    <glyph glyph-name="directionalityrtl" unicode="&#58881;" d="M960 62.080l-384 320 384 320.64v-640.64zM64 704v64h448v-64h-192v-640h192v-64h-448v64h192v640h-192z"  horiz-adv-x="1024" />
249
+
250
+    
251
+    <glyph glyph-name="imagecenter" unicode="&#58882;" d="M0 896h1024v-64h-1024zM128 704h768v-448h-768v448zM0 128h1024v-64h-1024zM0-64h1024v-64h-1024z"  horiz-adv-x="1024" />
252
+
253
+    
254
+    <glyph glyph-name="imagenone" unicode="&#58887;" d="M52.736 788.992l921.6 0 0-51.2-921.6 0 0 51.2ZM52.736 635.392l409.6 0 0-512-409.6 0 0 512ZM564.736 174.592l409.6 0 0-51.2-409.6 0 0 51.2ZM54.784 20.992l921.6 0 0-51.2-921.6 0 0 51.2ZM564.736 328.192l409.6 0 0-51.2-409.6 0 0 51.2Z"  horiz-adv-x="1024" />
255
+
256
+    
257
+    <glyph glyph-name="fontborder" unicode="&#58888;" d="M345.6 64l44.8 153.6h224l44.8-153.6H768L576 704H448L256 64h89.6z m153.6 531.2l83.2-288H416l83.2 288zM896 832H64v-896h896V832h-64z m0-832H128V768h768v-768z"  horiz-adv-x="1024" />
258
+
259
+    
260
+    <glyph glyph-name="edittable" unicode="&#58890;" d="M993.92 47.36l-144 144.64c8.659 23.774 13.667 51.219 13.667 79.833 0 132.548-107.452 240-240 240-33.832 0-66.029-7-95.221-19.632l-16.365-6.441v-2.56c-2.225-2.205-3.603-5.261-3.603-8.64s1.378-6.435 3.602-8.639l134.401-134.401-81.92-80.64-131.84 133.12c-2.579 2.775-6.249 4.505-10.323 4.505-6.183 0-11.434-3.985-13.327-9.526l-4.509-10.339c-12.032-27.638-19.033-59.835-19.033-93.667 0-132.548 107.452-240 240-240 28.614 0 56.059 5.008 81.505 14.194l142.328-144.527c18.54-18.584 44.175-30.081 72.496-30.081 0.163 0 0.326 0 0.489 0.001 56.695 0.247 102.579 46.285 102.579 103.039 0 28.187-11.318 53.73-29.656 72.333zM960-64c-10.303-10.282-24.526-16.64-40.234-16.64-0.030 0-0.061 0-0.091 0-0.021-0-0.051-0-0.082-0-15.708 0-29.93 6.358-40.235 16.641l-165.119 165.119-14.080-6.4c-23.254-10.787-50.473-17.079-79.162-17.079-106.039 0-192 85.961-192 192 0 16.288 2.028 32.103 5.846 47.205l120.676-124.846c2.359-1.847 5.369-2.963 8.64-2.963s6.281 1.115 8.671 2.986l127.969 127.977c2.168 2.464 3.491 5.718 3.491 9.28s-1.323 6.816-3.504 9.296l-120.306 122.864c14.813 4.102 31.821 6.459 49.381 6.459 106.039 0 192-85.961 192-192 0-30.528-7.125-59.393-19.803-85.021l-5.898-12.958 163.84-162.56c9.956-10.245 16.095-24.246 16.095-39.68s-6.139-29.435-16.108-39.694zM832 896h-832v-832h320v512h512zM256 128h-192v192h192zM256 384h-192v192h192zM256 640h-192v192h192zM512 640h-192v192h192zM576 640v192h192v-192z"  horiz-adv-x="1024" />
261
+
262
+    
263
+    <glyph glyph-name="imageleft" unicode="&#58891;" d="M50.688 794.624l921.6 0 0-51.2-921.6 0 0 51.2ZM50.688 641.024l409.6 0 0-512-409.6 0 0 512ZM562.688 180.224l409.6 0 0-51.2-409.6 0 0 51.2ZM52.736 26.624l921.6 0 0-51.2-921.6 0 0 51.2ZM562.688 333.824l409.6 0 0-51.2-409.6 0 0 51.2ZM562.688 487.424l409.6 0 0-51.2-409.6 0 0 51.2ZM562.688 641.024l409.6 0 0-51.2-409.6 0 0 51.2Z"  horiz-adv-x="1024" />
264
+
265
+    
266
+    <glyph glyph-name="imageright" unicode="&#58901;" d="M0 896h1024v-64h-1024zM512 704h512v-640h-512v640zM0 128h448v-64h-448zM0-64h1024v-64h-1024zM0 320h448v-64h-448zM0 512h448v-64h-448zM0 704h448v-64h-448z"  horiz-adv-x="1024" />
267
+
268
+    
269
+    <glyph glyph-name="insertcol" unicode="&#58917;" d="M256 640l-256-256 256-256v512zM1024-128v1024h-640v-1024zM768 832h192v-256h-192zM768 512h192v-256h-192zM768 192h192v-256h-192zM448 832h192v-256h-192zM448 512h192v-256h-192zM448 192h192v-256h-192z"  horiz-adv-x="1024" />
270
+
271
+    
272
+    <glyph glyph-name="insertcolnext" unicode="&#58918;" d="M768 128l256 256-256 256v-512zM0 896v-1024h640v1024zM256-64h-192v256h192zM256 256h-192v256h192zM256 576h-192v256h192zM576-64h-192v256h192zM576 256h-192v256h192zM576 576h-192v256h192z"  horiz-adv-x="1024" />
273
+
274
+    
275
+    <glyph glyph-name="insertorderedlist" unicode="&#58933;" d="M319.956 832.009h703.902v-127.982h-703.902v127.982zM319.956 448.062h703.902v-127.982h-703.902v127.982zM319.956 64.115h703.902v-127.982h-703.902v127.982zM191.973 896v-255.964h-127.982v255.964zM0 256.089v30.716c0 103.666 159.978 141.42 159.978 186.854 0 17.918-10.878 28.156-33.275 28.156-31.301-3-58.565-18.191-77.352-40.702l-43.591 57.98c30.879 35.002 75.835 56.965 125.921 56.965 0.725 0 1.448-0.005 2.171-0.014 78.599 0.001 122.113-42.233 122.113-97.265 0-78.069-95.347-98.546-142.7-147.18h142.7v-75.51zM127.982-127.858c-2.045-0.090-4.443-0.142-6.854-0.142-47.758 0-90.798 20.2-121.042 52.521l48.547 49.366c18.682-18.147 44.020-29.531 72.013-30.151 25.894 0.076 39.332 14.154 39.332 33.351 0 17.278-12.158 26.236-36.475 26.236h-24.317v52.473h24.957c23.037 0 36.475 6.399 36.475 26.876 0 19.837-12.798 31.356-38.395 31.356-26.139-0.731-49.26-13.049-64.502-31.98l-47.483 49.257c29.161 33.898 72.108 55.232 120.038 55.232 2.794 0 5.572-0.073 8.33-0.216 72.564 5.775 117.357-35.819 117.357-82.533v-5.119c0-0.034 0-0.075 0-0.115 0-35.341-28.65-63.991-63.991-63.991-1.351 0-2.692 0.042-4.022 0.124 50.735-7.048 70.572-33.284 70.572-67.2v-3.839c-2.56-53.113-54.392-91.507-130.542-91.507z"  horiz-adv-x="1024" />
276
+
277
+    
278
+    <glyph glyph-name="insertparagraphbeforetable" unicode="&#58934;" d="M256 512v-640h768v640zM512-64h-192v512h192zM960-64h-384v128h384zM960 128h-384v128h384zM960 320h-384v128h384zM384 320h64v-256h-64zM0 896v-64h128v-384h64v384h128v64h-320z"  horiz-adv-x="1024" />
279
+
280
+    
281
+    <glyph glyph-name="insertrow" unicode="&#58935;" d="M768 640l-256 256-256-256h512zM0-128h1024v640h-1024zM960 128v-192h-256v192zM640 128v-192h-256v192zM320 128v-192h-256v192zM960 448v-192h-256v192zM640 448v-192h-256v192zM320 448v-192h-256v192z"  horiz-adv-x="1024" />
282
+
283
+    
284
+    <glyph glyph-name="insertrownext" unicode="&#58937;" d="M256 128l256-256 256 256h-512zM1024 896h-1024v-640h1024zM64 640v192h256v-192zM384 640v192h256v-192zM704 640v192h256v-192zM64 320v192h256v-192zM384 320v192h256v-192zM704 320v192h256v-192z"  horiz-adv-x="1024" />
285
+
286
+    
287
+    <glyph glyph-name="insertunorderedlist" unicode="&#58945;" d="M960 704H256c-38.4 0-64 25.6-64 64s25.6 64 64 64h704c38.4 0 64-25.6 64-64s-25.6-64-64-64zM64 704c-38.4 0-64 25.6-64 64s25.6 64 64 64 64-25.6 64-64-25.6-64-64-64zM960 320H256c-38.4 0-64 25.6-64 64s25.6 64 64 64h704c38.4 0 64-25.6 64-64s-25.6-64-64-64zM64 320c-38.4 0-64 25.6-64 64s25.6 64 64 64 64-25.6 64-64-25.6-64-64-64zM960-64H256c-38.4 0-64 25.6-64 64s25.6 64 64 64h704c38.4 0 64-25.6 64-64s-25.6-64-64-64zM64-64c-38.4 0-64 25.6-64 64s25.6 64 64 64 64-25.6 64-64-25.6-64-64-64z"  horiz-adv-x="1024" />
288
+
289
+    
290
+    <glyph glyph-name="mergeright" unicode="&#58946;" d="M0 896v-1024h1024v1024zM384 832h256v-256h-256zM384 448h320v64l192-128-192-128v64h-320zM320-64h-256v256h256zM320 256h-256v256h256zM320 576h-256v256h256zM640-64h-256v256h256zM960-64h-256v256h256zM960 576h-256v256h256z"  horiz-adv-x="1024" />
291
+
292
+    
293
+    <glyph glyph-name="mergedown" unicode="&#58947;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM320 576h-256v256h256zM512 0l-128 192h64v320h128v-320h64zM640 576h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-256v256h256z"  horiz-adv-x="1024" />
294
+
295
+    
296
+    <glyph glyph-name="inserttable" unicode="&#58948;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM640-64h-256v256h256zM640 256h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-896v256h896z"  horiz-adv-x="1024" />
297
+
298
+    
299
+    <glyph glyph-name="pagebreak" unicode="&#58952;" d="M384-64h512v-64h-512zM0 576v-384l256 192-256 192zM320 768h576v-64h-576zM384 64h256v-64h-256zM192 192v-320h64v256h704v-256h64v320h-832zM1022.72 896h-62.72v-256h-704v256h-64v-320h832v320h-1.28z"  horiz-adv-x="1024" />
300
+
301
+    
302
+    <glyph glyph-name="source" unicode="&#58953;" d="M170.88 384h-113.92v128h-56.96v-320h56.96v128h113.92v-128h56.96v320h-56.96v-128zM284.16 448h56.96v-256h56.96v256h56.96v64h-170.88v-64zM738.56 510.72l-84.48-250.24-84.48 251.52-2.56-1.28h-55.040v-316.8h56.96v140.16l47.36-140.8h72.96l2.56-1.28 48 140.8v-139.52h56.32v316.8h-55.040l-2.56 0.64zM910.080 256v256h-56.96v-320h170.88v64h-113.92z"  horiz-adv-x="1024" />
303
+
304
+    
305
+    <glyph glyph-name="splittorows" unicode="&#58955;" d="M0 896h1024v-64H0zM960 896v-320h-128V896h-64v-320H256V896H192v-320H64V896H0v-1024h1024V896z m-192-384v-256H256V512zM64 512h128v-256H64z m0-576v256h128v-256z m192 0v256h512v-256z m704 0h-128v256h128z m0 320h-128V512h128z"  horiz-adv-x="1024" />
306
+
307
+    
308
+    <glyph glyph-name="splittocols" unicode="&#58956;" d="M1024 896h-1024v-1024h1024zM960 512v-256h-128v256zM960 832v-256h-128v256zM64 576v256h128v-256zM64 256v256h128v-256zM64-64v256h128v-256zM256-64v896h128v-896zM448-64v896h128v-896zM640-64v896h128v-896zM832-64v256h128v-256z"  horiz-adv-x="1024" />
309
+
310
+    
311
+    <glyph glyph-name="splittocells" unicode="&#58957;" d="M0 896v-1024h1024v1024zM320-64h-256v576h256zM640-64h-256v256h256zM640 256h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-576v256h576z"  horiz-adv-x="1024" />
312
+
313
+    
314
+    <glyph glyph-name="arrow" unicode="&#58959;" d="M513.024 230.4l204.8 204.8h-409.6l204.8-204.8z"  horiz-adv-x="1024" />
315
+
316
+    
317
+    <glyph glyph-name="aligntd" unicode="&#58961;" d="M256.061 128.061h511.877v-63.985h-511.877v63.985zM256.061 320.015h511.877v-63.985h-511.877v63.985zM256.061 511.969h511.877v-63.985h-511.877v63.985zM256.061 703.923h511.877v-63.985h-511.877v63.985zM863.916-127.878h-703.832c-1.402-0.077-3.043-0.121-4.695-0.121-48.324 0-87.898 37.462-91.266 84.928l-0.017 853.847c3.384 47.758 42.959 85.22 91.282 85.22 1.651 0 3.292-0.044 4.922-0.13l703.604 0.010c1.402 0.077 3.043 0.121 4.695 0.121 48.324 0 87.898-37.462 91.266-84.928l0.017-853.847c-3.384-47.758-42.959-85.22-91.282-85.22-1.651 0-3.292 0.044-4.922 0.13zM160.084 831.892c-0.591 0.041-1.281 0.065-1.977 0.065-15.956 0-29.010-12.427-30.011-28.131l-0.004-839.567c1.005-15.791 14.059-28.218 30.016-28.218 0.696 0 1.386 0.024 2.069 0.070l703.739-0.005c0.591-0.041 1.281-0.065 1.977-0.065 15.956 0 29.010 12.427 30.011 28.131l0.004 839.567c-1.005 15.791-14.059 28.218-30.016 28.218-0.696 0-1.386-0.024-2.069-0.070z"  horiz-adv-x="1024" />
318
+
319
+    
320
+    <glyph glyph-name="autotypeset" unicode="&#58963;" d="M192 704h384v-320h-384v320zM640 704h192v-64h-192v64zM640 512h192v-64h-192v64zM192 320h640v-64h-640v64zM192 128h640v-64h-640v64zM960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM960 0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
321
+
322
+    
323
+    <glyph glyph-name="charts" unicode="&#58968;" d="M0 832v-896h1024v896zM960 0h-896v768h896zM704 640h128v-512h-128zM448 320h128v-192h-128zM192 512h128v-384h-128z"  horiz-adv-x="1024" />
324
+
325
+    
326
+    <glyph glyph-name="closeerror" unicode="&#58972;" d="M512 896c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512 0 282.77-229.23 512-512 512zM796.16 225.92l-128-128-156.16 158.080-158.080-156.16-128 128 158.080 156.16-156.16 158.080 128 128 156.16-158.080 158.080 158.080 128-128-158.080-158.080z"  horiz-adv-x="1024" />
327
+
328
+    
329
+    <glyph glyph-name="copy" unicode="&#58975;" d="M256.060 511.97h511.879v-63.985h-511.879v63.985zM256.060 320.015h511.879v-63.985h-511.879v63.985zM256.060 128.060h511.879v-63.985h-511.879v63.985zM256.060 703.924h255.94v-63.985h-255.94v63.985zM895.91 639.939h-191.955v199.633c-3.964 31.88-30.89 56.308-63.523 56.308-0.162 0-0.325-0.001-0.487-0.002l-502.257 0c-1.216 0.076-2.637 0.119-4.068 0.119-36.533 0-66.506-28.090-69.498-63.85l-0.017-896.043c3.010-36.014 32.982-64.104 69.515-64.104 1.431 0 2.852 0.043 4.261 0.128l748.43-0.009c1.216-0.076 2.637-0.119 4.068-0.119 36.533 0 66.506 28.090 69.498 63.85l0.017 647.142c-3.664 32.179-30.738 56.948-63.597 56.948-0.136 0-0.273-0-0.409-0.001zM895.91-55.577c-0-4.594-3.724-8.318-8.318-8.318h-749.903c-5.301 0-9.598 4.297-9.598 9.598 0 0 0 0 0 0v877.873c0 4.594 3.724 8.318 8.318 8.318h491.404c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-191.985c3.573-30.12 28.96-53.257 59.75-53.257 1.49 0 2.968 0.054 4.431 0.161l180.242-0.011c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-620.684z"  horiz-adv-x="1024" />
330
+
331
+    
332
+    <glyph glyph-name="date" unicode="&#58977;" d="M896 768v-64h64v-704h-896v704h64v64h-128v-832h1024v832h-128zM832 832h-192v-255.36l192-0.64v256zM576 192h256v-64h-256zM576 384h256v-64h-256zM448 768h128v-64h-128zM192 192h256v-64h-256zM192 384h256v-64h-256zM384 832h-192v-256l192 0.64v255.36z"  horiz-adv-x="1024" />
333
+
334
+    
335
+    <glyph glyph-name="deletetable" unicode="&#58985;" d="M576 896v-448h448v448zM1003.52 558.72l-90.24-90.24-113.28 113.28-113.28-113.28-90.24 90.24 113.28 113.28-113.28 113.28 90.24 90.24 113.28-113.28 113.28 113.28 90.88-90.88-113.92-112.64zM960 256h-256v192h-64v-192h-256v256h192v64h-512v256h512v64h-576v-1024h1024v576h-64zM320-64h-256v256h256zM320 256h-256v256h256zM640-64h-256v256h256zM960-64h-256v256h256z"  horiz-adv-x="1024" />
336
+
337
+    
338
+    <glyph glyph-name="directionalityltr" unicode="&#58986;" d="M64 64l384 320-384 320v-640zM960 704v64h-448v-64h192v-640h-192v-64h448v64h-192v640h192z"  horiz-adv-x="1024" />
339
+
340
+    
341
+    <glyph glyph-name="arrowright" unicode="&#58987;" d="M615.424 384l-204.8 204.8v-409.6l204.8 204.8z"  horiz-adv-x="1024" />
342
+
343
+    
344
+    <glyph glyph-name="tableleft" unicode="&#58988;" d="M960 832v-896H64V832h896m64 64H0v-1024h1024V896zM192 704h640v-64H192zM192 512h640v-64H192zM192 320h256v-64H192z"  horiz-adv-x="1024" />
345
+
346
+    
347
+    <glyph glyph-name="tableright" unicode="&#58989;" d="M960 832v-896H64V832h896m64 64H0v-1024h1024V896zM188.8 704.64h640v-64h-640zM188.8 512.64h640v-64h-640zM576 320.64h256v-64H576z"  horiz-adv-x="1024" />
348
+
349
+    
350
+    <glyph glyph-name="tablecenter" unicode="&#58990;" d="M960 832v-896H64V832h896m64 64H0v-1024h1024V896zM188.8 703.36h640v-64h-640zM188.8 511.36h640v-64h-640zM383.36 319.36h256v-64h-256z"  horiz-adv-x="1024" />
351
+
352
+    
353
+    <glyph glyph-name="videoleft" unicode="&#58991;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM704 192l224 0 0-32-224 0 0 32ZM704 288l224 0 0-32-224 0 0 32ZM704 384l224 0 0-32-224 0 0 32ZM704 480l224 0 0-32-224 0 0 32ZM704 576l224 0 0-32-224 0 0 32ZM256 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM640 576H128a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L544 448l-162.24-208.64L304 332.8 186.56 192H160a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
354
+
355
+    
356
+    <glyph glyph-name="videocenter" unicode="&#58992;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM96 192l96 0 0-32-96 0 0 32ZM96 288l96 0 0-32-96 0 0 32ZM96 384l96 0 0-32-96 0 0 32ZM96 480l96 0 0-32-96 0 0 32ZM96 576l96 0 0-32-96 0 0 32ZM832 288l96 0 0-32-96 0 0 32ZM832 192l96 0 0-32-96 0 0 32ZM832 384l96 0 0-32-96 0 0 32ZM832 480l96 0 0-32-96 0 0 32ZM832 576l96 0 0-32-96 0 0 32ZM384 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM768 576H256a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L672 448l-162.24-208.64-77.76 93.44L314.56 192H288a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
357
+
358
+    
359
+    <glyph glyph-name="videonone" unicode="&#58993;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM704 192l224 0 0-32-224 0 0 32ZM704 288l224 0 0-32-224 0 0 32ZM256 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM640 576H128a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L544 448l-162.24-208.64L304 332.8 186.56 192H160a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
360
+
361
+    
362
+    <glyph glyph-name="videoright" unicode="&#58994;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM96 192l224 0 0-32-224 0 0 32ZM96 288l224 0 0-32-224 0 0 32ZM96 384l224 0 0-32-224 0 0 32ZM96 480l224 0 0-32-224 0 0 32ZM96 576l224 0 0-32-224 0 0 32ZM512 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM896 576H384a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L800 448l-162.24-208.64-77.76 93.44-117.44-140.8H416a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
363
+
364
+    
365
+    <glyph glyph-name="template" unicode="&#58958;" d="M0 832v-896h1024v896zM960 0h-896v768h896zM192 640h320v-192h-320zM640 640h192v-512h-192zM192 320h320v-192h-320z"  horiz-adv-x="1024" />
366
+
367
+    
368
+    <glyph glyph-name="addfile" unicode="&#58995;" d="M1024 416H544V896h-64v-480H0v-64h480v-480h64V352h480v64z"  horiz-adv-x="1024" />
369
+
370
+    
371
+    <glyph glyph-name="selected" unicode="&#58996;" d="M914.24 278.72a32 32 0 0 1-45.12 0l-221.44-221.12-112.96 112.96a32 32 0 1 1-45.12-45.12l135.68-135.68a32 32 0 0 1 45.44 0l243.52 243.52a32 32 0 0 1 0 45.44zM0-128h1024V896z m914.24 361.28L672-10.24a32 32 0 0 0-45.44 0l-135.68 135.68a32 32 0 1 0 45.12 45.12l112.96-112.96 221.12 221.12a32 32 0 1 0 45.12-45.12z"  horiz-adv-x="1024" />
372
+
373
+    
374
+    <glyph glyph-name="pickarea" unicode="&#58997;" d="M977.454545 802.909091h-46.545454v-791.272727a46.545455 46.545455 0 0 0-46.545455-46.545455H93.090909v-46.545454a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V756.363636a46.545455 46.545455 0 0 1-46.545455 46.545455zM46.545455 849.454545l837.818181 0 0-837.818181-837.818181 0 0 837.818181ZM884.363636 896H46.545455a46.545455 46.545455 0 0 1-46.545455-46.545455v-837.818181a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V849.454545a46.545455 46.545455 0 0 1-46.545455 46.545455z m0-837.818182a46.545455 46.545455 0 0 0-46.545454-46.545454H93.090909a46.545455 46.545455 0 0 0-46.545454 46.545454V802.909091a46.545455 46.545455 0 0 0 46.545454 46.545454h744.727273a46.545455 46.545455 0 0 0 46.545454-46.545454z"  horiz-adv-x="1024" />
375
+
376
+    
377
+    <glyph glyph-name="overlay" unicode="&#58998;" d="M977.454545 802.909091h-46.545454v-791.272727a46.545455 46.545455 0 0 0-46.545455-46.545455H93.090909v-46.545454a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V756.363636a46.545455 46.545455 0 0 1-46.545455 46.545455zM46.545455 849.454545l837.818181 0 0-837.818181-837.818181 0 0 837.818181ZM884.363636 896H46.545455a46.545455 46.545455 0 0 1-46.545455-46.545455v-837.818181a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V849.454545a46.545455 46.545455 0 0 1-46.545455 46.545455z m0-837.818182a46.545455 46.545455 0 0 0-46.545454-46.545454H93.090909a46.545455 46.545455 0 0 0-46.545454 46.545454V802.909091a46.545455 46.545455 0 0 0 46.545454 46.545454h744.727273a46.545455 46.545455 0 0 0 46.545454-46.545454z"  horiz-adv-x="1024" />
378
+
379
+    
380
+    <glyph glyph-name="preitem" unicode="&#58999;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM175.542857 764.342857h497.371429v-58.514286H175.542857zM175.542857 384h438.857143v-29.257143H175.542857zM175.542857 501.028571h906.971429v-29.257142H175.542857zM175.542857 618.057143h234.057143v-29.257143H175.542857zM175.542857 266.971429h1111.771429v-29.257143H175.542857zM175.542857 149.942857h292.571429v-29.257143H175.542857zM175.542857 32.914286h760.685714v-29.257143H175.542857z"  horiz-adv-x="1462" />
381
+
382
+    
383
+    <glyph glyph-name="preitem1" unicode="&#59000;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM117.028571 720.457143h351.085715v-29.257143H117.028571z"  horiz-adv-x="1462" />
384
+
385
+    
386
+    <glyph glyph-name="preitem2" unicode="&#59001;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM175.542857 778.971429h497.371429v-58.514286H175.542857zM848.457143 340.114286h438.857143v-29.257143H848.457143zM848.457143 457.142857h438.857143v-29.257143H848.457143zM848.457143 574.171429h438.857143v-29.257143H848.457143zM175.542857 223.085714h1111.771429v-29.257143H175.542857zM175.542857 106.057143h702.171429v-29.257143H175.542857zM175.542857-10.971429h702.171429v-29.257142H175.542857zM731.428571 544.914286v-204.8H204.8V544.914286h526.628571m29.257143 29.257143H175.542857v-263.314286h585.142857V574.171429zM1258.057143 106.057143v-117.028572H994.742857v117.028572h263.314286m29.257143 29.257143H965.485714v-175.542857h321.828572V135.314286z"  horiz-adv-x="1462" />
387
+
388
+    
389
+    <glyph glyph-name="preitem3" unicode="&#59002;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM482.742857 720.457143h497.371429v-58.514286H482.742857zM643.657143 603.428571h175.542857v-29.257142H643.657143zM175.542857 427.885714h1111.771429v-29.257143H175.542857zM175.542857 310.857143h1111.771429v-29.257143H175.542857zM175.542857 193.828571h1111.771429v-29.257142H175.542857zM175.542857 76.8h1111.771429v-29.257143H175.542857z"  horiz-adv-x="1462" />
390
+
391
+    
392
+    <glyph glyph-name="preitem4" unicode="&#59003;" d="M1258.057143 632.685714v-204.8H204.8V632.685714h1053.257143m29.257143 29.257143H175.542857v-263.314286h1111.771429V661.942857zM0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM175.542857 778.971429h497.371429v-58.514286H175.542857zM175.542857 340.114286h351.085714v-29.257143H175.542857zM175.542857 223.085714h1111.771429v-29.257143H175.542857zM175.542857 106.057143h702.171429v-29.257143H175.542857zM175.542857-10.971429h1111.771429v-29.257142H175.542857z"  horiz-adv-x="1462" />
393
+
394
+    
395
+
396
+
397
+  </font>
398
+</defs></svg>

BIN
static/neditor/dialogs/fonts/iconfont.ttf Целия файл


BIN
static/neditor/dialogs/fonts/iconfont.woff Целия файл


+ 1 - 0
static/neditor/dialogs/fonts/images/addfile.svg Целия файл

@@ -0,0 +1 @@
1
+<?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 t="1488001777589" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5327" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50"><defs><style type="text/css"></style></defs><path d="M1024 480H544V0h-64v480H0v64h480v480h64V544h480v-64z" fill="#E5E5E5" p-id="5328"></path></svg>

+ 1 - 0
static/neditor/dialogs/fonts/images/selected.svg Целия файл

@@ -0,0 +1 @@
1
+<?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 t="1488001207278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5218" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="40"><defs><style type="text/css"></style></defs><path d="M914.24 617.28a32 32 0 0 0-45.12 0l-221.44 221.12-112.96-112.96a32 32 0 1 0-45.12 45.12l135.68 135.68a32 32 0 0 0 45.44 0l243.52-243.52a32 32 0 0 0 0-45.44z" fill="#FFFFFF" p-id="5219"></path><path d="M0 1024h1024V0z m914.24-361.28L672 906.24a32 32 0 0 1-45.44 0l-135.68-135.68a32 32 0 1 1 45.12-45.12l112.96 112.96 221.12-221.12a32 32 0 1 1 45.12 45.12z" fill="#1094FA" p-id="5220"></path></svg>

+ 106 - 0
static/neditor/dialogs/gmap/gmap.html Целия файл

@@ -0,0 +1,106 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+        "http://www.w3.org/TR/html4/loose.dtd">
3
+<html>
4
+<head>
5
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+    <title></title>
7
+    <script type="text/javascript" src="../internal.js"></script>
8
+    <style type="text/css">
9
+        .content{
10
+            width: 600px;
11
+            height: 412px;
12
+            margin: 20px;
13
+        }
14
+        .content table{width: 100%}
15
+        .content table td{vertical-align: middle;}
16
+        #address{width:405px;height:28px;background: #FFF;border:1px solid #ccc; line-height: 28px;border-radius: 5px;margin-left: 10px;}
17
+        #container {margin-top: 10px;}
18
+        #doSearch {
19
+            display: block;
20
+            text-align: center;
21
+            line-height: 30px;
22
+            text-decoration: none;
23
+            height: 30px;
24
+            width: 78px;
25
+            border: 0;
26
+            background-color: #3498db;
27
+            border-radius: 5px;
28
+            color: #fff;
29
+        }
30
+    </style>
31
+    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
32
+</head>
33
+<body>
34
+<div class="content">
35
+    <table>
36
+        <tr>
37
+            <td><label for="address"><var id="lang_input_address"></var></label></td>
38
+            <td><input id="address" type="text" /></td>
39
+            <td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
40
+        </tr>
41
+    </table>
42
+    <div id="container" style="width: 100%; height: 362px;margin-top: 20px;"></div>
43
+</div>
44
+<script type="text/javascript">
45
+    domUtils.on(window,"load",function(){
46
+        var map = new google.maps.Map(document.getElementById('container'), {
47
+                zoom: 3,
48
+                streetViewControl: false,
49
+                scaleControl: true,
50
+                mapTypeId: google.maps.MapTypeId.ROADMAP
51
+            });
52
+            var imgcss;
53
+            var marker = new google.maps.Marker({
54
+                map: map,
55
+                draggable: true
56
+            });
57
+            function doSearch(){
58
+                var address = document.getElementById('address').value;
59
+                var geocoder = new google.maps.Geocoder();
60
+                geocoder.geocode( { 'address': address}, function (results, status) {
61
+                    if (status == google.maps.GeocoderStatus.OK) {
62
+                        var bounds = results[0].geometry.viewport;
63
+                        map.fitBounds(bounds);
64
+                        marker.setPosition(results[0].geometry.location);
65
+                        marker.setTitle(address);
66
+                    } else alert(lang.searchError);
67
+                });
68
+            }
69
+            $G('address').onkeydown = function (evt){
70
+                evt = evt || event;
71
+                if (evt.keyCode == 13) {
72
+                    doSearch();
73
+                }
74
+            };
75
+            $G("doSearch").onclick = doSearch;
76
+            dialog.onok = function (){
77
+                var center = map.getCenter();
78
+                var point = marker.getPosition();
79
+                var url = "https://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
80
+                editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
81
+            };
82
+
83
+            function getPars(str,par){
84
+                var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
85
+                return reg.exec(str)[1];
86
+            }
87
+            var img = editor.selection.getRange().getClosedNode();
88
+            if(img && img.src.indexOf("https://maps.googleapis.com/maps/api/staticmap")!=-1){
89
+                var url = img.getAttribute("src");
90
+                var centers = getPars(url,"center").split(",");
91
+                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
92
+                map.setCenter(point);
93
+                map.setZoom(Number(getPars(url,"zoom")));
94
+                centers = getPars(url,"markers").split(",");
95
+                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
96
+                imgcss = img.style.cssText;
97
+            }else{
98
+                setTimeout(function(){
99
+                    doSearch();
100
+                },30)
101
+            }
102
+    });
103
+
104
+</script>
105
+</body>
106
+</html>

+ 7 - 0
static/neditor/dialogs/help/help.css Целия файл

@@ -0,0 +1,7 @@
1
+.wrapper{width: 370px;margin: 10px auto;zoom: 1;}
2
+.tabbody{height: 360px;}
3
+.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;}
4
+.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;}
5
+.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;}
6
+.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;}
7
+.tabbody table thead{font-weight: bold;line-height: 25px;}

+ 82 - 0
static/neditor/dialogs/help/help.html Целия файл

@@ -0,0 +1,82 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+        "http://www.w3.org/TR/html4/loose.dtd">
3
+<html>
4
+<head>
5
+    <title>帮助</title>
6
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+    <script type="text/javascript" src="../internal.js"></script>
8
+    <link rel="stylesheet" type="text/css" href="help.css">
9
+</head>
10
+<body>
11
+<div class="wrapper" id="helptab">
12
+    <div id="tabHeads" class="tabhead">
13
+        <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
14
+        <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
15
+    </div>
16
+    <div id="tabBodys" class="tabbody">
17
+        <div id="about" class="panel">
18
+            <h1>UEditor</h1>
19
+            <p id="version"></p>
20
+            <p><var id="lang_input_introduction"></var></p>
21
+        </div>
22
+        <div id="shortcuts" class="panel">
23
+            <table>
24
+                <thead>
25
+                <tr>
26
+                    <td><var id="lang_Txt_shortcuts"></var></td>
27
+                    <td><var id="lang_Txt_func"></var></td>
28
+                </tr>
29
+                </thead>
30
+                <tbody>
31
+                <tr>
32
+                    <td>ctrl+b</td>
33
+                    <td><var id="lang_Txt_bold"></var></td>
34
+                </tr>
35
+                <tr>
36
+                    <td>ctrl+c</td>
37
+                    <td><var id="lang_Txt_copy"></var></td>
38
+                </tr>
39
+                <tr>
40
+                    <td>ctrl+x</td>
41
+                    <td><var id="lang_Txt_cut"></var></td>
42
+                </tr>
43
+                <tr>
44
+                    <td>ctrl+v</td>
45
+                    <td><var id="lang_Txt_Paste"></var></td>
46
+                </tr>
47
+                <tr>
48
+                    <td>ctrl+y</td>
49
+                    <td><var id="lang_Txt_undo"></var></td>
50
+                </tr>
51
+                <tr>
52
+                    <td>ctrl+z</td>
53
+                    <td><var id="lang_Txt_redo"></var></td>
54
+                </tr>
55
+                <tr>
56
+                    <td>ctrl+i</td>
57
+                    <td><var id="lang_Txt_italic"></var></td>
58
+                </tr>
59
+                <tr>
60
+                    <td>ctrl+u</td>
61
+                    <td><var id="lang_Txt_underline"></var></td>
62
+                </tr>
63
+                <tr>
64
+                    <td>ctrl+a</td>
65
+                    <td><var id="lang_Txt_selectAll"></var></td>
66
+                </tr>
67
+                <tr>
68
+                    <td>shift+enter</td>
69
+                    <td><var id="lang_Txt_visualEnter"></var></td>
70
+                </tr>
71
+                <tr>
72
+                    <td>alt+z</td>
73
+                    <td><var id="lang_Txt_fullscreen"></var></td>
74
+                </tr>
75
+                </tbody>
76
+            </table>
77
+        </div>
78
+    </div>
79
+</div>
80
+<script type="text/javascript" src="help.js"></script>
81
+</body>
82
+</html>

+ 56 - 0
static/neditor/dialogs/help/help.js Целия файл

@@ -0,0 +1,56 @@
1
+/**
2
+ * Created with JetBrains PhpStorm.
3
+ * User: xuheng
4
+ * Date: 12-9-26
5
+ * Time: 下午1:06
6
+ * To change this template use File | Settings | File Templates.
7
+ */
8
+/**
9
+ * tab点击处理事件
10
+ * @param tabHeads
11
+ * @param tabBodys
12
+ * @param obj
13
+ */
14
+function clickHandler( tabHeads,tabBodys,obj ) {
15
+    //head样式更改
16
+    for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
17
+        tabHeads[k].className = "";
18
+    }
19
+    obj.className = "focus";
20
+    //body显隐
21
+    var tabSrc = obj.getAttribute( "tabSrc" );
22
+    for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
23
+        var body = tabBodys[j],
24
+            id = body.getAttribute( "id" );
25
+        body.onclick = function(){
26
+            this.style.zoom = 1;
27
+        };
28
+        if ( id != tabSrc ) {
29
+            body.style.zIndex = 1;
30
+        } else {
31
+            body.style.zIndex = 200;
32
+        }
33
+    }
34
+
35
+}
36
+
37
+/**
38
+ * TAB切换
39
+ * @param tabParentId  tab的父节点ID或者对象本身
40
+ */
41
+function switchTab( tabParentId ) {
42
+    var tabElements = $G( tabParentId ).children,
43
+        tabHeads = tabElements[0].children,
44
+        tabBodys = tabElements[1].children;
45
+
46
+    for ( var i = 0, length = tabHeads.length; i < length; i++ ) {
47
+        var head = tabHeads[i];
48
+        if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head );
49
+        head.onclick = function () {
50
+            clickHandler(tabHeads,tabBodys,this);
51
+        }
52
+    }
53
+}
54
+switchTab("helptab");
55
+
56
+document.getElementById('version').innerHTML = parent.UE.version;

+ 936 - 0
static/neditor/dialogs/image/image.css Целия файл

@@ -0,0 +1,936 @@
1
+@charset "utf-8";
2
+/* dialog样式 */
3
+.wrapper {
4
+    zoom: 1;
5
+    width: 600px;
6
+    height: 412px;
7
+    margin: 0 auto;
8
+    padding: 20px;
9
+    position: relative;
10
+    font-family: sans-serif;
11
+}
12
+
13
+/*tab样式框大小*/
14
+.tabhead {
15
+    float:left;
16
+}
17
+.tabbody {
18
+    width: 100%;
19
+    height: 346px;
20
+    position: relative;
21
+    clear: both;
22
+}
23
+
24
+.tabbody .panel {
25
+    position: absolute;
26
+    width: 0;
27
+    height: 0;
28
+    background: #fff;
29
+    overflow: hidden;
30
+    display: none;
31
+}
32
+
33
+.tabbody .panel.focus {
34
+    width: 100%;
35
+    height: 380px;
36
+    display: block;
37
+}
38
+
39
+/* 图片对齐方式 */
40
+.alignBar{
41
+    float:right;
42
+    margin-top: 5px;
43
+    position: relative;
44
+}
45
+
46
+.alignBar .algnLabel{
47
+    float:left;
48
+    height: 20px;
49
+    line-height: 20px;
50
+}
51
+
52
+.alignBar #alignIcon{
53
+    zoom:1;
54
+    _display: inline;
55
+    display: inline-block;
56
+    position: relative;
57
+}
58
+.alignBar #alignIcon span{
59
+    float: left;
60
+    cursor: pointer;
61
+    display: block;
62
+    width: 19px;
63
+    height: 17px;
64
+    margin-right: 3px;
65
+    margin-left: 3px;
66
+    background-image: url(./images/alignicon.jpg);
67
+}
68
+.alignBar #alignIcon .none-align{
69
+    background-position: 0 -18px;
70
+}
71
+.alignBar #alignIcon .left-align{
72
+    background-position: -20px -18px;
73
+}
74
+.alignBar #alignIcon .right-align{
75
+    background-position: -40px -18px;
76
+}
77
+.alignBar #alignIcon .center-align{
78
+    background-position: -60px -18px;
79
+}
80
+.alignBar #alignIcon .none-align.focus{
81
+    background-position: 0 0;
82
+}
83
+.alignBar #alignIcon .left-align.focus{
84
+    background-position: -20px 0;
85
+}
86
+.alignBar #alignIcon .right-align.focus{
87
+    background-position: -40px 0;
88
+}
89
+.alignBar #alignIcon .center-align.focus{
90
+    background-position: -60px 0;
91
+}
92
+
93
+
94
+
95
+
96
+/* 远程图片样式 */
97
+#remote {
98
+    z-index: 200;
99
+}
100
+
101
+#remote .top{
102
+    width: 100%;
103
+    margin-top: 20px;
104
+}
105
+#remote .left{
106
+    display: block;
107
+    float: left;
108
+    width: 240px;
109
+    height:10px;
110
+}
111
+#remote .right{
112
+    display: block;
113
+    float: right;
114
+    width: 345px;
115
+    height:10px;
116
+}
117
+#remote .row{
118
+    /*margin-left: 20px;*/
119
+    display: flex;
120
+    clear: both;
121
+    height: 30px;
122
+    line-height: 30px;
123
+    margin-bottom: 20px;
124
+}
125
+
126
+#remote .row label{
127
+    text-align: center;
128
+    width: 50px;
129
+    zoom:1;
130
+    _display: inline;
131
+    display:inline-block;
132
+    vertical-align: middle;
133
+    margin-right: 10px;
134
+}
135
+#remote .row label.algnLabel{
136
+    float: left;
137
+
138
+}
139
+
140
+#remote input.text{
141
+    height: 28px;
142
+    width: 150px;
143
+    font-size: 14px;
144
+    line-height: 1.42857143;
145
+    color: #555;
146
+    background-color: #fff;
147
+    background-image: none;
148
+    border: 1px solid #ccc;
149
+    border-radius: 4px;
150
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
151
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
152
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
153
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
154
+}
155
+#remote input.text:focus {
156
+    border-color: #66afe9;
157
+    outline: 0;
158
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
159
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
160
+}
161
+#remote textarea.text{
162
+    width: 160px;
163
+    height: 120px;
164
+    font-size: 14px;
165
+    line-height: 1.42857143;
166
+    color: #555;
167
+    background-color: #fff;
168
+    background-image: none;
169
+    border: 1px solid #ccc;
170
+    border-radius: 4px;
171
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
172
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
173
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
174
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
175
+    resize: none;
176
+}
177
+#remote textarea.text:focus {
178
+    border-color: #66afe9;
179
+    outline: 0;
180
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
181
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
182
+}
183
+#remote #url{
184
+    width: 537px;
185
+    height: 28px;
186
+}
187
+#remote #width,
188
+#remote #height{
189
+    width: 60px;
190
+    height: 28px;
191
+    margin-left: 8px;
192
+    margin-right: 8px;
193
+}
194
+#remote .top .row:nth-child(2) span:nth-child(1) ,
195
+#remote .top .row:nth-child(2) span:nth-child(2) {
196
+    display: block;
197
+    margin-right: 18px;
198
+}
199
+
200
+#remote .top .row:nth-child(2) span:last-child {
201
+    margin-left: 15px;
202
+}
203
+#remote #border,
204
+#remote #vhSpace,
205
+#remote #title{
206
+    width: 145px;
207
+    margin-right: 8px;
208
+}
209
+#remote #lock{
210
+    margin-top: 11px;
211
+}
212
+#remote #lockicon{
213
+    zoom: 1;
214
+    _display:inline;
215
+    display: inline-block;
216
+    height: 20px;
217
+    background: url("../../themes/notadd/images/lock.gif") -13px -13px no-repeat;
218
+    vertical-align: middle;
219
+}
220
+#remote #preview{
221
+    clear: both;
222
+    width: 345px;
223
+    height: 261px;
224
+    z-index: 9999;
225
+    background-color: #f3f3f3;
226
+    overflow: hidden;
227
+}
228
+
229
+/* 上传图片 */
230
+.tabbody #upload.panel {
231
+    width: 0;
232
+    height: 0;
233
+    overflow: hidden;
234
+    position: absolute !important;
235
+    clip: rect(1px, 1px, 1px, 1px);
236
+    background: #fff;
237
+    display: block;
238
+}
239
+
240
+.tabbody #upload.panel.focus {
241
+    width: 100%;
242
+    height: 373px;
243
+    display: block;
244
+    clip: auto;
245
+    margin-top: 12px;
246
+}
247
+
248
+#upload .queueList {
249
+    margin: 0;
250
+    width: 100%;
251
+    height: 100%;
252
+    position: absolute;
253
+    overflow: hidden;
254
+}
255
+
256
+#upload p {
257
+    margin: 0;
258
+}
259
+
260
+.element-invisible {
261
+    width: 0 !important;
262
+    height: 0 !important;
263
+    border: 0;
264
+    padding: 0;
265
+    margin: 0;
266
+    overflow: hidden;
267
+    position: absolute !important;
268
+    clip: rect(1px, 1px, 1px, 1px);
269
+}
270
+
271
+#upload .placeholder {
272
+    margin: 10px;
273
+    height: 212px;
274
+    padding-top: 160px;
275
+    text-align: center;
276
+    /*background: url(./images/image.png) center 130px no-repeat #f3f3f3;*/
277
+    background-color: #f3f3f3;
278
+    color: #cccccc;
279
+    font-size: 18px;
280
+    position: relative;
281
+    top: 0;
282
+}
283
+
284
+#upload .placeholder .webuploader-pick {
285
+    font-size: 16px;
286
+    background: #f3f3f3;
287
+    border-radius: 3px;
288
+    line-height: 44px;
289
+    padding: 0 30px;
290
+    color: #646464;
291
+    display: inline-block;
292
+    margin: 0 auto 20px auto;
293
+    cursor: pointer;
294
+    /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */
295
+    border: 1px solid #ccc;
296
+}
297
+
298
+#upload .placeholder .webuploader-pick-hover {
299
+    border: 1px solid #00a2d4;
300
+    color: #00a2d4;
301
+}
302
+
303
+
304
+#filePickerContainer {
305
+    text-align: center;
306
+}
307
+
308
+#upload .placeholder .flashTip {
309
+    color: #666666;
310
+    font-size: 12px;
311
+    position: absolute;
312
+    width: 100%;
313
+    text-align: center;
314
+    bottom: 20px;
315
+}
316
+
317
+#upload .placeholder .flashTip a {
318
+    color: #0785d1;
319
+    text-decoration: none;
320
+}
321
+
322
+#upload .placeholder .flashTip a:hover {
323
+    text-decoration: underline;
324
+}
325
+
326
+#upload .placeholder.webuploader-dnd-over {
327
+    border-color: #999999;
328
+}
329
+
330
+#upload .filelist {
331
+    list-style: none;
332
+    margin: 0;
333
+    padding: 0;
334
+    overflow-x: hidden;
335
+    overflow-y: auto;
336
+    position: relative;
337
+    height: 300px;
338
+}
339
+
340
+#upload .filelist:after {
341
+    content: '';
342
+    display: block;
343
+    width: 0;
344
+    height: 0;
345
+    overflow: hidden;
346
+    clear: both;
347
+    position: relative;
348
+}
349
+
350
+#upload .filelist li {
351
+    width: 135px;
352
+    height: 135px;
353
+    background: url(./images/bg.png);
354
+    text-align: center;
355
+    margin: 9px 0 0 9px;
356
+    *margin: 6px 0 0 6px;
357
+    position: relative;
358
+    display: block;
359
+    float: left;
360
+    overflow: hidden;
361
+    font-size: 12px;
362
+}
363
+
364
+#upload .filelist li p.log {
365
+    position: relative;
366
+    top: -45px;
367
+}
368
+
369
+#upload .filelist li p.title {
370
+    position: absolute;
371
+    top: 0;
372
+    left: 0;
373
+    width: 100%;
374
+    overflow: hidden;
375
+    white-space: nowrap;
376
+    text-overflow: ellipsis;
377
+    top: 5px;
378
+    text-indent: 5px;
379
+    text-align: left;
380
+}
381
+
382
+#upload .filelist li p.progress {
383
+    position: absolute;
384
+    width: 100%;
385
+    bottom: 0;
386
+    left: 0;
387
+    height: 8px;
388
+    overflow: hidden;
389
+    z-index: 50;
390
+    margin: 0;
391
+    border-radius: 0;
392
+    background: none;
393
+    -webkit-box-shadow: 0 0 0;
394
+}
395
+
396
+#upload .filelist li p.progress span {
397
+    display: none;
398
+    overflow: hidden;
399
+    width: 0;
400
+    height: 100%;
401
+    background: #1483d8 url(./images/progress.png) repeat-x;
402
+
403
+    -webit-transition: width 200ms linear;
404
+    -moz-transition: width 200ms linear;
405
+    -o-transition: width 200ms linear;
406
+    -ms-transition: width 200ms linear;
407
+    transition: width 200ms linear;
408
+
409
+    -webkit-animation: progressmove 2s linear infinite;
410
+    -moz-animation: progressmove 2s linear infinite;
411
+    -o-animation: progressmove 2s linear infinite;
412
+    -ms-animation: progressmove 2s linear infinite;
413
+    animation: progressmove 2s linear infinite;
414
+
415
+    -webkit-transform: translateZ(0);
416
+}
417
+
418
+@-webkit-keyframes progressmove {
419
+    0% {
420
+        background-position: 0 0;
421
+    }
422
+    100% {
423
+        background-position: 17px 0;
424
+    }
425
+}
426
+
427
+@-moz-keyframes progressmove {
428
+    0% {
429
+        background-position: 0 0;
430
+    }
431
+    100% {
432
+        background-position: 17px 0;
433
+    }
434
+}
435
+
436
+@keyframes progressmove {
437
+    0% {
438
+        background-position: 0 0;
439
+    }
440
+    100% {
441
+        background-position: 17px 0;
442
+    }
443
+}
444
+
445
+#upload .filelist li p.imgWrap {
446
+    position: relative;
447
+    z-index: 2;
448
+    line-height: 135px;
449
+    vertical-align: middle;
450
+    overflow: hidden;
451
+    width: 135px;
452
+    height: 135px;
453
+
454
+    -webkit-transform-origin: 50% 50%;
455
+    -moz-transform-origin: 50% 50%;
456
+    -o-transform-origin: 50% 50%;
457
+    -ms-transform-origin: 50% 50%;
458
+    transform-origin: 50% 50%;
459
+
460
+    -webit-transition: 200ms ease-out;
461
+    -moz-transition: 200ms ease-out;
462
+    -o-transition: 200ms ease-out;
463
+    -ms-transition: 200ms ease-out;
464
+    transition: 200ms ease-out;
465
+}
466
+
467
+#upload .filelist li img {
468
+    width: 100%;
469
+}
470
+
471
+#upload .filelist li p.error {
472
+    background: #f43838;
473
+    color: #fff;
474
+    position: absolute;
475
+    bottom: 0;
476
+    left: 0;
477
+    height: 28px;
478
+    line-height: 28px;
479
+    width: 100%;
480
+    z-index: 100;
481
+    display:none;
482
+}
483
+
484
+#upload .filelist li .success {
485
+    display: block;
486
+    position: absolute;
487
+    left: 0;
488
+    bottom: 0;
489
+    height: 40px;
490
+    width: 100%;
491
+    z-index: 200;
492
+    background: url(../fonts/images/selected.svg) no-repeat right bottom;
493
+}
494
+
495
+#upload .filelist li.filePickerBlock {
496
+    width: 135px;
497
+    height: 135px;
498
+    background: url(../fonts/images/addfile.svg) no-repeat center;
499
+    border: 1px solid #eeeeee;
500
+    border-radius: 0;
501
+}
502
+#upload .filelist li.filePickerBlock div.webuploader-pick  {
503
+    width: 100%;
504
+    height: 100%;
505
+    margin: 0;
506
+    padding: 0;
507
+    opacity: 0;
508
+    background: none;
509
+    font-size: 0;
510
+}
511
+
512
+#upload .filelist div.file-panel {
513
+    position: absolute;
514
+    height: 0;
515
+    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
516
+    background: rgba(0, 0, 0, 0.5);
517
+    width: 100%;
518
+    top: 0;
519
+    left: 0;
520
+    overflow: hidden;
521
+    z-index: 300;
522
+}
523
+
524
+#upload .filelist div.file-panel span {
525
+    width: 24px;
526
+    height: 24px;
527
+    display: inline;
528
+    float: right;
529
+    text-indent: -9999px;
530
+    overflow: hidden;
531
+    background: url(./images/icons.png) no-repeat;
532
+    background: url(./images/icons.gif) no-repeat \9;
533
+    margin: 5px 1px 1px;
534
+    cursor: pointer;
535
+    -webkit-tap-highlight-color: rgba(0,0,0,0);
536
+    -webkit-user-select: none;
537
+    -moz-user-select: none;
538
+    -ms-user-select: none;
539
+    user-select: none;
540
+}
541
+
542
+#upload .filelist div.file-panel span.rotateLeft {
543
+    display:none;
544
+    background-position: 0 -24px;
545
+}
546
+
547
+#upload .filelist div.file-panel span.rotateLeft:hover {
548
+    background-position: 0 0;
549
+}
550
+
551
+#upload .filelist div.file-panel span.rotateRight {
552
+    display:none;
553
+    background-position: -24px -24px;
554
+}
555
+
556
+#upload .filelist div.file-panel span.rotateRight:hover {
557
+    background-position: -24px 0;
558
+}
559
+
560
+#upload .filelist div.file-panel span.cancel {
561
+    background-position: -48px -24px;
562
+}
563
+
564
+#upload .filelist div.file-panel span.cancel:hover {
565
+    background-position: -48px 0;
566
+}
567
+
568
+#upload .statusBar {
569
+    height: 45px;
570
+    border-bottom: 1px solid #dadada;
571
+    margin: 0 10px;
572
+    padding: 0;
573
+    line-height: 45px;
574
+    vertical-align: middle;
575
+    position: relative;
576
+}
577
+
578
+#upload .statusBar .progress {
579
+    border: 1px solid #1483d8;
580
+    width: 198px;
581
+    background: #fff;
582
+    height: 18px;
583
+    position: absolute;
584
+    top: 12px;
585
+    display: none;
586
+    text-align: center;
587
+    line-height: 18px;
588
+    color: #6dbfff;
589
+    margin: 0 10px 0 0;
590
+}
591
+#upload .statusBar .progress span.percentage {
592
+    width: 0;
593
+    height: 100%;
594
+    left: 0;
595
+    top: 0;
596
+    background: #1483d8;
597
+    position: absolute;
598
+}
599
+#upload .statusBar .progress span.text {
600
+    position: relative;
601
+    z-index: 10;
602
+}
603
+
604
+#upload .statusBar .info {
605
+    display: inline-block;
606
+    font-size: 14px;
607
+    color: #666666;
608
+}
609
+
610
+#upload .statusBar .btns {
611
+    position: absolute;
612
+    top: 7px;
613
+    right: 0;
614
+    line-height: 30px;
615
+}
616
+
617
+#filePickerBtn {
618
+    display: inline-block;
619
+    float: left;
620
+}
621
+#upload .statusBar .btns .webuploader-pick,
622
+#upload .statusBar .btns .uploadBtn,
623
+#upload .statusBar .btns .uploadBtn.state-uploading,
624
+#upload .statusBar .btns .uploadBtn.state-paused {
625
+    background: #ffffff;
626
+    border: 1px solid #cfcfcf;
627
+    color: #565656;
628
+    padding: 0 18px;
629
+    display: inline-block;
630
+    border-radius: 3px;
631
+    margin-left: 10px;
632
+    cursor: pointer;
633
+    font-size: 14px;
634
+    float: left;
635
+    -webkit-user-select: none;
636
+    -moz-user-select: none;
637
+    -ms-user-select: none;
638
+    user-select: none;
639
+}
640
+#upload .statusBar .btns .webuploader-pick-hover,
641
+#upload .statusBar .btns .uploadBtn:hover,
642
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
643
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
644
+    background: #f0f0f0;
645
+}
646
+
647
+#upload .statusBar .btns .uploadBtn,
648
+#upload .statusBar .btns .uploadBtn.state-paused{
649
+    background: #00b7ee;
650
+    color: #fff;
651
+    border-color: transparent;
652
+}
653
+#upload .statusBar .btns .uploadBtn:hover,
654
+#upload .statusBar .btns .uploadBtn.state-paused:hover{
655
+    background: #00a2d4;
656
+}
657
+
658
+#upload .statusBar .btns .uploadBtn.disabled {
659
+    pointer-events: none;
660
+    filter:alpha(opacity=60);
661
+    -moz-opacity:0.6;
662
+    -khtml-opacity: 0.6;
663
+    opacity: 0.6;
664
+}
665
+
666
+
667
+
668
+/* 图片管理样式 */
669
+#online {
670
+    width: 100%;
671
+    height: 336px;
672
+    padding: 10px 0 0 0;
673
+}
674
+#online #imageList{
675
+    width: 100%;
676
+    height: 100%;
677
+    overflow-x: hidden;
678
+    overflow-y: auto;
679
+    position: relative;
680
+}
681
+#online ul {
682
+    display: block;
683
+    list-style: none;
684
+    margin: 0;
685
+    padding: 0;
686
+}
687
+#online li {
688
+    float: left;
689
+    display: block;
690
+    list-style: none;
691
+    padding: 0;
692
+    width: 135px;
693
+    height: 135px;
694
+    margin: 0 0 9px 9px;
695
+    *margin: 0 0 6px 6px;
696
+    background-color: #eee;
697
+    overflow: hidden;
698
+    cursor: pointer;
699
+    position: relative;
700
+}
701
+#online li.clearFloat {
702
+    float: none;
703
+    clear: both;
704
+    display: block;
705
+    width:0;
706
+    height:0;
707
+    margin: 0;
708
+    padding: 0;
709
+}
710
+#online li img {
711
+    cursor: pointer;
712
+    width: 135px !important;
713
+    height: 135px !important;
714
+    margin-top: 0px !important;
715
+}
716
+#online li .icon {
717
+    cursor: pointer;
718
+    width: 135px;
719
+    height: 135px;
720
+    position: absolute;
721
+    top: 0;
722
+    left: 0;
723
+    z-index: 2;
724
+    border: 0;
725
+    background-repeat: no-repeat;
726
+}
727
+#online li .icon:hover {
728
+    width: 129px;
729
+    height: 129px;
730
+    border: 3px solid #1094fa;
731
+}
732
+#online li.selected .icon {
733
+    background-image: url(images/success.png);
734
+    background-image: url(images/success.gif)\9;
735
+    background-position: 95px 95px;
736
+}
737
+#online li.selected .icon:hover {
738
+    width: 129px;
739
+    height: 129px;
740
+    border: 3px solid #1094fa;
741
+    background-position: 92px 92px;
742
+}
743
+
744
+
745
+/* 图片搜索样式 */
746
+#search .searchBar {
747
+    width: 100%;
748
+    height: 30px;
749
+    margin: 10px 0 5px 0;
750
+    padding: 0;
751
+}
752
+
753
+#search input.text{
754
+    width: 150px;
755
+    padding: 3px 6px;
756
+    font-size: 14px;
757
+    line-height: 1.42857143;
758
+    color: #555;
759
+    background-color: #fff;
760
+    background-image: none;
761
+    border: 1px solid #ccc;
762
+    border-radius: 4px;
763
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
764
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
765
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
766
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
767
+}
768
+#search input.text:focus {
769
+    border-color: #66afe9;
770
+    outline: 0;
771
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
772
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
773
+}
774
+#search input.searchTxt {
775
+    margin-left:5px;
776
+    padding-left: 5px;
777
+    background: #FFF;
778
+    width: 300px;
779
+    *width: 260px;
780
+    height: 21px;
781
+    line-height: 21px;
782
+    float: left;
783
+    dislay: block;
784
+}
785
+#search .pagination{
786
+    margin-top: 5px;
787
+}
788
+#search input.num{
789
+    width: 80px;
790
+}
791
+
792
+#search .searchType {
793
+    width: 95px;
794
+    height: 28px;
795
+    padding:0;
796
+    line-height: 28px;
797
+    border: 1px solid #d7d7d7;
798
+    border-radius: 0;
799
+    vertical-align: top;
800
+    margin-left: 5px;
801
+    float: left;
802
+    dislay: block;
803
+}
804
+
805
+#search #searchBtn,
806
+#search #searchReset {
807
+    display: inline-block;
808
+    margin-bottom: 0;
809
+    margin-right: 5px;
810
+    padding: 4px 10px;
811
+    font-weight: 400;
812
+    text-align: center;
813
+    vertical-align: middle;
814
+    cursor: pointer;
815
+    background-image: none;
816
+    border: 1px solid transparent;
817
+    white-space: nowrap;
818
+    font-size: 14px;
819
+    border-radius: 4px;
820
+    -webkit-user-select: none;
821
+    -moz-user-select: none;
822
+    -ms-user-select: none;
823
+    user-select: none;
824
+    vertical-align: top;
825
+    float: right;
826
+}
827
+
828
+#search #searchBtn {
829
+    color: white;
830
+    border-color: #285e8e;
831
+    background-color: #3b97d7;
832
+}
833
+#search #searchReset {
834
+    color: #333;
835
+    border-color: #ccc;
836
+    background-color: #fff;
837
+}
838
+#search #searchBtn:hover {
839
+    background-color: #3276b1;
840
+}
841
+#search #searchReset:hover {
842
+    background-color: #eee;
843
+}
844
+
845
+#search .msg {
846
+    margin-left: 5px;
847
+}
848
+
849
+#search .searchList{
850
+    width: 100%;
851
+    height: 300px;
852
+    overflow: hidden;
853
+    clear: both;
854
+}
855
+#search .searchList ul{
856
+    margin:0;
857
+    padding:0;
858
+    list-style:none;
859
+    clear: both;
860
+    width: 100%;
861
+    height: 100%;
862
+    overflow-x: hidden;
863
+    overflow-y: auto;
864
+    zoom: 1;
865
+    position: relative;
866
+}
867
+
868
+#search .searchList li {
869
+    list-style:none;
870
+    float: left;
871
+    display: block;
872
+    width: 115px;
873
+    margin: 5px 10px 5px 20px;
874
+    *margin: 5px 10px 5px 15px;
875
+    padding:0;
876
+    font-size: 12px;
877
+    box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
878
+    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
879
+    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
880
+    position: relative;
881
+    vertical-align: top;
882
+    text-align: center;
883
+    overflow: hidden;
884
+    cursor: pointer;
885
+    filter: alpha(Opacity=100);
886
+    -moz-opacity: 1;
887
+    opacity: 1;
888
+    border: 2px solid #eee;
889
+}
890
+
891
+#search .searchList li.selected {
892
+    filter: alpha(Opacity=40);
893
+    -moz-opacity: 0.4;
894
+    opacity: 0.4;
895
+    border: 2px solid #00a0e9;
896
+}
897
+
898
+#search .searchList li p {
899
+    background-color: #eee;
900
+    margin: 0;
901
+    padding: 0;
902
+    position: relative;
903
+    width:100%;
904
+    height:115px;
905
+    overflow: hidden;
906
+}
907
+
908
+#search .searchList li p img {
909
+    cursor: pointer;
910
+    border: 0;
911
+}
912
+
913
+#search .searchList li a {
914
+    color: #999;
915
+    border-top: 1px solid #F2F2F2;
916
+    background: #FAFAFA;
917
+    text-align: center;
918
+    display: block;
919
+    padding: 0 5px;
920
+    width: 105px;
921
+    height:32px;
922
+    line-height:32px;
923
+    white-space:nowrap;
924
+    text-overflow:ellipsis;
925
+    text-decoration: none;
926
+    overflow: hidden;
927
+    word-break: break-all;
928
+}
929
+
930
+#search .searchList a:hover {
931
+    text-decoration: underline;
932
+    color: #333;
933
+}
934
+#search .searchList .clearFloat{
935
+    clear: both;
936
+}

+ 127 - 0
static/neditor/dialogs/image/image.html Целия файл

@@ -0,0 +1,127 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+    <meta charset="UTF-8">
5
+    <title>neditor图片对话框</title>
6
+    <script type="text/javascript" src="../internal.js"></script>
7
+
8
+    <!-- jquery -->
9
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
10
+
11
+    <!-- webuploader -->
12
+    <script src="../../third-party/webuploader/webuploader.js"></script>
13
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
14
+
15
+    <!-- image dialog -->
16
+    <link rel="stylesheet" href="image.css" type="text/css" />
17
+    <!--<link rel="stylesheet" href="../fonts/buttoniconex.css">-->
18
+</head>
19
+<body>
20
+
21
+    <div class="wrapper">
22
+        <div id="tabhead" class="tabhead">
23
+            <span class="tab" data-content-id="remote"><var id="lang_tab_remote"></var></span>
24
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
25
+            <!-- <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span> -->
26
+            <!-- <span class="tab" data-content-id="search"><var id="lang_tab_search"></var></span> -->
27
+        </div>
28
+        <div class="alignBar">
29
+            <label class="algnLabel"><var id="lang_input_align"></var></label>
30
+                <span id="alignIcon">
31
+                    <span id="noneAlign" class="none-align focus" data-align="none">
32
+                        <!--<i class="icon edui-icon"></i>-->
33
+                    </span>
34
+                    <span id="leftAlign" class="left-align" data-align="left"></span>
35
+                    <span id="rightAlign" class="right-align" data-align="right"></span>
36
+                    <span id="centerAlign" class="center-align" data-align="center"></span>
37
+                </span>
38
+            <input id="align" name="align" type="hidden" value="none"/>
39
+        </div>
40
+        <div id="tabbody" class="tabbody">
41
+
42
+            <!-- 远程图片 -->
43
+            <div id="remote" class="panel">
44
+                <div class="top">
45
+                    <div class="row">
46
+                        <label for="url"><var id="lang_input_url"></var></label>
47
+                        <span><input class="text" id="url" type="text"/></span>
48
+                    </div>
49
+                    <div class="row">
50
+                        <label><var id="lang_input_size"></var></label>
51
+                        <span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text" id="width"/>px </span>
52
+                        <span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
53
+                        <span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
54
+                    </div>
55
+                </div>
56
+                <div class="left">
57
+                    <div class="row">
58
+                        <label><var id="lang_input_border"></var></label>
59
+                        <span><input class="text" type="text" id="border"/>px </span>
60
+                    </div>
61
+                    <div class="row">
62
+                        <label><var id="lang_input_vhspace"></var></label>
63
+                        <span><input class="text" type="text" id="vhSpace"/>px </span>
64
+                    </div>
65
+                    <div class="row">
66
+                        <label><var id="lang_input_title"></var></label>
67
+                        <span><textarea class="text" id="title" cols="30" rows="3"></textarea></span>
68
+                    </div>
69
+                </div>
70
+                <div class="right"><div id="preview"></div></div>
71
+            </div>
72
+
73
+            <!-- 上传图片 -->
74
+            <div id="upload" class="panel focus">
75
+                <div id="queueList" class="queueList">
76
+                    <div class="statusBar element-invisible">
77
+                        <div class="progress">
78
+                            <span class="text">0%</span>
79
+                            <span class="percentage"></span>
80
+                        </div><div class="info"></div>
81
+                        <div class="btns">
82
+                            <div id="filePickerBtn"></div>
83
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
84
+                        </div>
85
+                    </div>
86
+                    <div id="dndArea" class="placeholder">
87
+                        <div class="filePickerContainer">
88
+                            <div id="filePickerReady"></div>
89
+                        </div>
90
+                    </div>
91
+                    <ul class="filelist element-invisible">
92
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
93
+                    </ul>
94
+                </div>
95
+            </div>
96
+
97
+            <!-- 在线图片 -->
98
+            <div id="online" class="panel">
99
+                <div id="imageList"><var id="lang_imgLoading"></var></div>
100
+            </div>
101
+
102
+            <!-- 搜索图片 -->
103
+            <div id="search" class="panel">
104
+                <div class="searchBar">
105
+                    <input id="searchTxt" class="searchTxt text" type="text" />
106
+                    <select id="searchType" class="searchType">
107
+                        <option value="&lm=-1&st=-1&face=0&s="></option>
108
+                        <option value="&lm=-1&st=-1&face=0&s=3"></option>
109
+                        <option value="&lm=-1&st=-1&face=1&s="></option>
110
+                        <option value="&lm=-1&st=1&face=0&s="></option>
111
+                        <option value="&lm=-1&st=2&face=0&s="></option>
112
+                        <option value="&lm=6&st=-1&face=0&s="></option>
113
+                        <option value="&lm=7&st=-1&face=0&s="></option>
114
+                    </select>
115
+                    <input id="searchReset" type="button"  />
116
+                    <input id="searchBtn" type="button"  />
117
+                </div>
118
+                <div id="searchList" class="searchList"><ul id="searchListUl"></ul></div>
119
+                <div class="pagination">每页显示 <input type="number" id="pageNum" class="text num" value="50"/> 条</div>
120
+            </div>
121
+
122
+        </div>
123
+    </div>
124
+    <script type="text/javascript" src="image.js"></script>
125
+
126
+</body>
127
+</html>

Файловите разлики са ограничени, защото са твърде много
+ 1130 - 0
static/neditor/dialogs/image/image.js


BIN
static/neditor/dialogs/image/images/alignicon.jpg Целия файл


BIN
static/neditor/dialogs/image/images/bg.png Целия файл


BIN
static/neditor/dialogs/image/images/icons.gif Целия файл


BIN
static/neditor/dialogs/image/images/icons.png Целия файл


BIN
static/neditor/dialogs/image/images/image.png Целия файл


BIN
static/neditor/dialogs/image/images/progress.png Целия файл


BIN
static/neditor/dialogs/image/images/success.gif Целия файл


+ 0 - 0
static/neditor/dialogs/image/images/success.png Целия файл


Някои файлове не бяха показани, защото твърде много файлове са промени