sh-view 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/package.json +9 -13
  2. package/packages/components/global-components/sh-alert/index.vue +175 -173
  3. package/packages/components/global-components/sh-badge/index.vue +57 -43
  4. package/packages/components/global-components/sh-card/index.vue +24 -16
  5. package/packages/components/global-components/sh-code-editor/index.vue +250 -260
  6. package/packages/components/global-components/sh-col/index.vue +44 -36
  7. package/packages/components/global-components/sh-corner/index.vue +230 -228
  8. package/packages/components/global-components/sh-count-to/index.vue +60 -51
  9. package/packages/components/global-components/sh-drawer/index.vue +209 -182
  10. package/packages/components/global-components/sh-drawer/scrollbar.js +44 -42
  11. package/packages/components/global-components/sh-empty/index.vue +0 -1
  12. package/packages/components/global-components/sh-form/form.vue +110 -0
  13. package/packages/components/global-components/sh-form/js/props.js +76 -63
  14. package/packages/components/global-components/sh-form/js/useForm.js +236 -0
  15. package/packages/components/global-components/sh-form/query.vue +70 -0
  16. package/packages/components/global-components/sh-header/index.vue +35 -50
  17. package/packages/components/global-components/sh-icon/css/index.scss +44 -0
  18. package/packages/components/global-components/sh-icon/index.vue +24 -11
  19. package/packages/components/global-components/sh-image/index.vue +47 -38
  20. package/packages/components/global-components/sh-list/index.vue +42 -37
  21. package/packages/components/global-components/sh-loading/index.vue +12 -8
  22. package/packages/components/global-components/sh-modal/index.vue +49 -40
  23. package/packages/components/global-components/sh-noticebar/index.vue +68 -54
  24. package/packages/components/global-components/sh-poptip/index.vue +247 -130
  25. package/packages/components/global-components/sh-progress/index.vue +71 -69
  26. package/packages/components/global-components/sh-pull-refresh/index.vue +156 -157
  27. package/packages/components/global-components/sh-result/index.vue +37 -28
  28. package/packages/components/global-components/sh-row/index.vue +21 -18
  29. package/packages/components/global-components/sh-split/index.vue +115 -109
  30. package/packages/components/global-components/sh-table/components/importModal.vue +95 -86
  31. package/packages/components/global-components/sh-table/components/sh-column.vue +62 -0
  32. package/packages/components/global-components/sh-table/{index.vue → grid.vue} +34 -145
  33. package/packages/components/global-components/sh-table/js/tableMethods.js +175 -0
  34. package/packages/components/global-components/sh-table/js/useTable.js +592 -0
  35. package/packages/components/global-components/sh-table/table.vue +266 -0
  36. package/packages/components/global-components/sh-tabs/index.vue +118 -93
  37. package/packages/components/global-components/sh-tag/index.vue +52 -51
  38. package/packages/components/global-components/sh-toolbar/index.vue +53 -47
  39. package/packages/components/global-components/sh-tree/components/table-tree.vue +152 -139
  40. package/packages/components/global-components/sh-tree/index.vue +218 -195
  41. package/packages/components/global-components/sh-tree/mixin/treeProps.js +118 -120
  42. package/packages/components/global-components/sh-upload/index.vue +308 -51
  43. package/packages/components/global-components/sh-water-fall/index.vue +4 -11
  44. package/packages/components/index.js +5 -3
  45. package/packages/components/other-components/sh-cron-modal/components/cron-content.vue +140 -129
  46. package/packages/components/other-components/sh-cron-modal/css/index.scss +0 -5
  47. package/packages/components/other-components/sh-cron-modal/index.vue +81 -67
  48. package/packages/components/other-components/sh-cron-modal/mixin/cron-emits.js +1 -0
  49. package/packages/components/other-components/sh-cron-modal/mixin/cron-hooks.js +179 -0
  50. package/packages/components/other-components/sh-cron-modal/mixin/cron-props.js +9 -0
  51. package/packages/components/other-components/sh-cron-modal/tabs/cron-day-box.vue +101 -92
  52. package/packages/components/other-components/sh-cron-modal/tabs/cron-hour-box.vue +68 -56
  53. package/packages/components/other-components/sh-cron-modal/tabs/cron-minute-box.vue +68 -56
  54. package/packages/components/other-components/sh-cron-modal/tabs/cron-month-box.vue +68 -56
  55. package/packages/components/other-components/sh-cron-modal/tabs/cron-second-box.vue +68 -56
  56. package/packages/components/other-components/sh-cron-modal/tabs/cron-week-box.vue +126 -115
  57. package/packages/components/other-components/sh-cron-modal/tabs/cron-year-box.vue +59 -46
  58. package/packages/components/other-components/sh-menu/index.vue +73 -60
  59. package/packages/components/other-components/sh-menu/menu-group-content.vue +71 -59
  60. package/packages/components/other-components/sh-menu/menu-item-content.vue +40 -30
  61. package/packages/components/other-components/sh-menu-card/index.vue +70 -64
  62. package/packages/components/other-components/sh-menu-card/menu-box.vue +50 -44
  63. package/packages/components/other-components/sh-preview/components/sh-excel.vue +182 -0
  64. package/packages/components/other-components/sh-preview/components/sh-word.vue +73 -0
  65. package/packages/components/other-components/sh-preview/index.vue +86 -85
  66. package/packages/components/other-components/sh-preview/js/data-hook.js +37 -0
  67. package/packages/components/other-components/sh-preview/js/data-props.js +11 -0
  68. package/packages/components/other-components/sh-system-tip/index.vue +28 -24
  69. package/packages/css/index.js +4 -4
  70. package/packages/directive/module/prevent-click.js +1 -1
  71. package/packages/directive/module/resize.js +11 -154
  72. package/packages/index.js +39 -39
  73. package/packages/mixin/index.js +86 -87
  74. package/packages/vxeTable/render/cell/vxe-render-checkbox.vue +14 -5
  75. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +43 -36
  76. package/packages/vxeTable/render/cell/vxe-render-code.vue +14 -5
  77. package/packages/vxeTable/render/cell/vxe-render-goption.vue +34 -24
  78. package/packages/vxeTable/render/cell/vxe-render-href.vue +21 -11
  79. package/packages/vxeTable/render/cell/vxe-render-img.vue +16 -10
  80. package/packages/vxeTable/render/cell/vxe-render-input.vue +83 -79
  81. package/packages/vxeTable/render/cell/vxe-render-money.vue +14 -6
  82. package/packages/vxeTable/render/cell/vxe-render-progress.vue +28 -19
  83. package/packages/vxeTable/render/cell/vxe-render-radio.vue +14 -5
  84. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +43 -36
  85. package/packages/vxeTable/render/cell/vxe-render-select.vue +44 -36
  86. package/packages/vxeTable/render/cell/vxe-render-switch.vue +14 -5
  87. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -78
  88. package/packages/vxeTable/render/cell/vxe-render-textarea.vue +14 -5
  89. package/packages/vxeTable/render/cell/vxe-render-time.vue +23 -13
  90. package/packages/vxeTable/render/cell/vxe-render-tree.vue +23 -27
  91. package/packages/vxeTable/render/cell/vxe-render-upload.vue +11 -7
  92. package/packages/vxeTable/render/filters/vxe-filter-input.vue +25 -43
  93. package/packages/vxeTable/render/footer/vxe-footer-input.vue +23 -13
  94. package/packages/vxeTable/render/footer/vxe-footer-money.vue +30 -20
  95. package/packages/vxeTable/render/globalRenders.jsx +1 -1
  96. package/packages/vxeTable/render/header/vxe-header-money.vue +31 -21
  97. package/packages/vxeTable/render/mixin/cell-hooks.js +162 -0
  98. package/packages/vxeTable/render/mixin/cell-props.js +23 -0
  99. package/packages/vxeTable/render/mixin/filter-hooks.js +28 -0
  100. package/packages/components/global-components/sh-form/components/form-item.vue +0 -25
  101. package/packages/components/global-components/sh-form/css/index.scss +0 -55
  102. package/packages/components/global-components/sh-form/index.vue +0 -114
  103. package/packages/components/global-components/sh-form/js/methods.js +0 -146
  104. package/packages/components/global-components/sh-form/mixin/defaultData.js +0 -32
  105. package/packages/components/global-components/sh-icon/css/default/index.scss +0 -27
  106. package/packages/components/global-components/sh-icon/css/font/index.scss +0 -16
  107. package/packages/components/global-components/sh-icon/icon-default.vue +0 -32
  108. package/packages/components/global-components/sh-icon/icon-font.vue +0 -32
  109. package/packages/components/global-components/sh-poptip/popper.js +0 -115
  110. package/packages/components/global-components/sh-query/index.vue +0 -317
  111. package/packages/components/global-components/sh-table/js/methods.js +0 -549
  112. package/packages/components/global-components/sh-table/mixin/defaultData.js +0 -94
  113. package/packages/components/global-components/sh-upload/js/mixin.js +0 -257
  114. package/packages/components/other-components/sh-cron-modal/mixin/cron-box.js +0 -169
  115. package/packages/vxeTable/render/mixin/cell-mixin.js +0 -195
  116. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.svg → ionicons.svg} +0 -0
  117. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.ttf → ionicons.ttf} +0 -0
  118. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff → ionicons.woff} +0 -0
  119. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff2 → ionicons.woff2} +0 -0
  120. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.js → iconfont.js} +0 -0
  121. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.json → iconfont.json} +0 -0
  122. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.ttf → iconfont.ttf} +0 -0
  123. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff → iconfont.woff} +0 -0
  124. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff2 → iconfont.woff2} +0 -0
  125. /package/packages/{assets/css → css}/animated.scss +0 -0
  126. /package/packages/{assets/css → css}/loader.scss +0 -0
  127. /package/packages/{assets/css → css}/main.scss +0 -0
  128. /package/packages/{assets/css → css}/theme.scss +0 -0
@@ -0,0 +1,182 @@
1
+ <script>
2
+ import { defineComponent, computed, getCurrentInstance } from 'vue'
3
+ import dataHook from '../js/data-hook'
4
+ import dataProps from '../js/data-hook'
5
+ import Spreadsheet from 'x-data-spreadsheet'
6
+ import ExcelJS from 'exceljs'
7
+ export default defineComponent({
8
+ name: 'ShOfficeDocx',
9
+ props: dataProps,
10
+ emits: ['rendered', 'error'],
11
+ setup(props, { emit }) {
12
+ const { proxy } = getCurrentInstance()
13
+ const { $vUtils } = proxy
14
+
15
+ let defaultOption = {
16
+ mode: 'read',
17
+ showToolbar: false
18
+ }
19
+
20
+ const excelOptions = computed(() => {
21
+ return Object.assign({}, defaultOption, props.options)
22
+ })
23
+
24
+ const domRender = async (data, container) => {
25
+ if (!data) {
26
+ container.innerHTML = ''
27
+ return Promise.resolve()
28
+ }
29
+ const wb = new ExcelJS.Workbook()
30
+ // 微软的 Excel ColorIndex 一个索引数字对应一个颜色
31
+ let workbook = await wb.xlsx.load(data)
32
+ let workbookData = []
33
+ workbook.eachSheet(sheet => {
34
+ // 构造x-data-spreadsheet 的 sheet 数据源结构
35
+ let sheetData = { name: sheet.name, styles: [], rows: {}, merges: [] }
36
+ // 收集合并单元格信息
37
+ let mergeAddressData = []
38
+ for (let mergeRange in sheet._merges) {
39
+ sheetData.merges.push(sheet._merges[mergeRange].shortRange)
40
+ let mergeAddress = {}
41
+ // 合并单元格起始地址
42
+ mergeAddress.startAddress = sheet._merges[mergeRange].tl
43
+ // 合并单元格终止地址
44
+ mergeAddress.endAddress = sheet._merges[mergeRange].br
45
+ // Y轴方向跨度
46
+ mergeAddress.YRange = sheet._merges[mergeRange].model.bottom - sheet._merges[mergeRange].model.top
47
+ // X轴方向跨度
48
+ mergeAddress.XRange = sheet._merges[mergeRange].model.right - sheet._merges[mergeRange].model.left
49
+ mergeAddressData.push(mergeAddress)
50
+ }
51
+ sheetData.cols = {}
52
+ for (let i = 0; i < sheet.columns.length; i++) {
53
+ sheetData.cols[i.toString()] = {}
54
+ if (sheet.columns[i].width) {
55
+ // 不知道为什么从 exceljs 读取的宽度显示到 x-data-spreadsheet 特别小, 这里乘以8
56
+ sheetData.cols[i.toString()].width = sheet.columns[i].width * 8
57
+ } else {
58
+ // 默认列宽
59
+ sheetData.cols[i.toString()].width = 100
60
+ }
61
+ }
62
+
63
+ // 遍历行
64
+ sheet.eachRow((row, rowIndex) => {
65
+ sheetData.rows[(rowIndex - 1).toString()] = { cells: {} }
66
+ //includeEmpty = false 不包含空白单元格
67
+ row.eachCell({ includeEmpty: true }, function (cell, colNumber) {
68
+ let cellText = ''
69
+ if (cell.value && cell.value.result) {
70
+ // Excel 单元格有公式
71
+ cellText = cell.value.result
72
+ } else if (cell.value && cell.value.richText) {
73
+ // Excel 单元格是多行文本
74
+ for (let text in cell.value.richText) {
75
+ // 多行文本做累加
76
+ cellText += cell.value.richText[text].text
77
+ }
78
+ } else {
79
+ // Excel 单元格无公式
80
+ cellText = cell.value
81
+ }
82
+ //解析单元格,包含样式
83
+ //*********************单元格存在背景色******************************
84
+ // 单元格存在背景色
85
+ let backGroundColor = null
86
+ if (cell.style.fill && cell.style.fill.fgColor && cell.style.fill.fgColor.argb) {
87
+ // 8位字符颜色先转rgb再转16进制颜色
88
+ backGroundColor = (val => {
89
+ val = val.trim().toLowerCase() //去掉前后空格
90
+ let argb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(val)
91
+ let rgb = `rgba(${parseInt(argb[2], 16)}, ${parseInt(argb[3], 16)}, ${parseInt(argb[4], 16)})`
92
+ let percent = (parseInt(argb[1], 16) / 255) * 100
93
+ return $vUtils.fade(rgb, percent)
94
+ })(cell.style.fill.fgColor.argb)
95
+ }
96
+
97
+ if (backGroundColor) {
98
+ cell.style.bgcolor = backGroundColor
99
+ }
100
+ //*************************************************************************** */
101
+
102
+ //*********************字体存在背景色******************************
103
+ // 字体颜色
104
+ let fontColor = null
105
+ if (cell.style.font && cell.style.font.color && cell.style.font.color.argb) {
106
+ // 8位字符颜色先转rgb再转16进制颜色
107
+ fontColor = (val => {
108
+ val = val.trim().toLowerCase() //去掉前后空格
109
+ let argb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(val)
110
+ let rgb = `rgba(${parseInt(argb[2], 16)}, ${parseInt(argb[3], 16)}, ${parseInt(argb[4], 16)})`
111
+ let percent = (parseInt(argb[1], 16) / 255) * 100
112
+ return $vUtils.fade(rgb, percent)
113
+ })(cell.style.font.color.argb)
114
+ }
115
+ if (fontColor) {
116
+ cell.style.color = fontColor
117
+ }
118
+
119
+ // exceljs 对齐的格式转成 x-date-spreedsheet 能识别的对齐格式
120
+ if (cell.style.alignment && cell.style.alignment.horizontal) {
121
+ cell.style.align = cell.style.alignment.horizontal
122
+ cell.style.valign = cell.style.alignment.vertical
123
+ }
124
+
125
+ //处理合并单元格
126
+ let mergeAddress = _.find(mergeAddressData, function (o) {
127
+ return o.startAddress === cell._address
128
+ })
129
+ if (mergeAddress) {
130
+ // 遍历的单元格属于合并单元格
131
+ if (cell.master.address !== mergeAddress.startAddress) {
132
+ // 不是合并单元格中的第一个单元格不需要计入数据源
133
+ return
134
+ }
135
+ // 说明是合并单元格区域的起始单元格
136
+ sheetData.rows[(rowIndex - 1).toString()].cells[(colNumber - 1).toString()] = { text: cellText, style: 0, merge: [mergeAddress.YRange, mergeAddress.XRange] }
137
+ sheetData.styles.push(cell.style)
138
+ //对应的style存放序号
139
+ sheetData.rows[(rowIndex - 1).toString()].cells[(colNumber - 1).toString()].style = sheetData.styles.length - 1
140
+ } else {
141
+ // 非合并单元格
142
+ sheetData.rows[(rowIndex - 1).toString()].cells[(colNumber - 1).toString()] = { text: cellText, style: 0 }
143
+ //解析单元格,包含样式
144
+ sheetData.styles.push(cell.style)
145
+ //对应的style存放序号
146
+ sheetData.rows[(rowIndex - 1).toString()].cells[(colNumber - 1).toString()].style = sheetData.styles.length - 1
147
+ }
148
+ })
149
+ })
150
+ workbookData.push(sheetData)
151
+ })
152
+ return new Spreadsheet(rootRef.value, excelOptions).loadData(workbookData)
153
+ }
154
+
155
+ const useData = dataHook(props, context, {
156
+ domRender
157
+ })
158
+
159
+ return {
160
+ ...useData
161
+ }
162
+ }
163
+ })
164
+ </script>
165
+
166
+ <template>
167
+ <div ref="rootRef" class="sh-office-docx"></div>
168
+ </template>
169
+
170
+ <style lang="less">
171
+ @media screen and (max-width: 800px) {
172
+ .sh-office-docx {
173
+ .docx-wrapper {
174
+ padding: 10px;
175
+ > section.docx {
176
+ padding: 10px !important;
177
+ width: 100% !important;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ </style>
@@ -0,0 +1,73 @@
1
+ <script>
2
+ import { defineComponent, computed } from 'vue'
3
+ import dataHook from '../js/data-hook'
4
+ import dataProps from '../js/data-hook'
5
+ import { renderAsync } from 'docx-preview'
6
+ export default defineComponent({
7
+ name: 'ShOfficeDocx',
8
+ props: dataProps,
9
+ emits: ['rendered', 'error'],
10
+ setup(props, context) {
11
+ let defaultOption = {
12
+ inWrapper: true, //启用围绕文档内容呈现包装器
13
+ ignoreWidth: true, //禁用页面的渲染宽度
14
+ ignoreHeight: false, //禁用页面的渲染高度
15
+ ignoreFonts: false, //禁用字体渲染
16
+ breakPages: true, //在分页符上启用分页
17
+ ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
18
+ experimental: false, //启用实验功能(制表符停止计算)
19
+ trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
20
+ useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
21
+ useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
22
+ showChanges: false, //启用文档更改的实验渲染(插入/删除)
23
+ debug: false //启用额外的日志记录
24
+ }
25
+
26
+ const docxOptions = computed(() => {
27
+ return Object.assign({}, defaultOption, props.options)
28
+ })
29
+
30
+ const domRender = (data, container) => {
31
+ if (!data) {
32
+ container.innerHTML = ''
33
+ return Promise.resolve()
34
+ }
35
+ let blob
36
+ if (data instanceof Blob) {
37
+ blob = data
38
+ } else if (data instanceof Response) {
39
+ blob = data.blob()
40
+ } else if (data instanceof ArrayBuffer) {
41
+ blob = new Blob([data])
42
+ }
43
+ return renderAsync(blob, container, null, docxOptions.value)
44
+ }
45
+
46
+ const useData = dataHook(props, context, {
47
+ domRender
48
+ })
49
+
50
+ return {
51
+ ...useData
52
+ }
53
+ }
54
+ })
55
+ </script>
56
+
57
+ <template>
58
+ <div ref="rootRef" class="sh-office-docx"></div>
59
+ </template>
60
+
61
+ <style lang="less">
62
+ @media screen and (max-width: 800px) {
63
+ .sh-office-docx {
64
+ .docx-wrapper {
65
+ padding: 10px;
66
+ > section.docx {
67
+ padding: 10px !important;
68
+ width: 100% !important;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ </style>
@@ -1,85 +1,86 @@
1
- <template>
2
- <div class="sh-preview">
3
- <component :is="componentName" v-bind="componentProps" :style="componentStyles" @rendered="onRendered" @error="onError" />
4
- </div>
5
- </template>
6
-
7
- <script>
8
- import * as ShWord from '@vue-office/docx'
9
- import '@vue-office/docx/lib/index.css'
10
- import * as ShExcel from '@vue-office/excel'
11
- import '@vue-office/excel/lib/index.css'
12
- import * as ShPdf from '@vue-office/pdf'
13
- export default {
14
- name: 'ShPreview',
15
- components: {
16
- ShWord,
17
- ShExcel,
18
- ShPdf
19
- },
20
- props: {
21
- type: {
22
- type: String
23
- },
24
- base: {
25
- type: String
26
- },
27
- url: {
28
- type: String
29
- },
30
- width: {
31
- type: String,
32
- default: '100%'
33
- },
34
- height: {
35
- type: String,
36
- default: '600px'
37
- }
38
- },
39
- emits: ['ready', 'error'],
40
- computed: {
41
- previewType() {
42
- return (this.type && this.type.toLowerCase()) || (this.url && this.url.substr(this.url.lastIndexOf('.') + 1).toLowerCase())
43
- },
44
- componentName() {
45
- if (['word', 'doc', 'docx'].includes(this.previewType)) {
46
- return 'sh-word'
47
- } else if (['excel', 'xlsx'].includes(this.previewType)) {
48
- return 'sh-excel'
49
- } else if (['pdf'].includes(this.previewType)) {
50
- return 'sh-pdf'
51
- }
52
- return 'iframe'
53
- },
54
- componentProps() {
55
- let srcPrefix = this.base || ''
56
- let srcSuffix = this.componentName === 'iframe' ? '#scrollbars=0&toolbar=0&statusbar=0' : ''
57
- return {
58
- src: srcPrefix + this.url + srcSuffix,
59
- frameborder: 0
60
- }
61
- },
62
- componentStyles() {
63
- return {
64
- width: this.width,
65
- height: this.height
66
- }
67
- }
68
- },
69
- methods: {
70
- onRendered(data) {
71
- this.$emit('ready', data)
72
- },
73
- onError(data) {
74
- this.$emit('error', data)
75
- }
76
- }
77
- }
78
- </script>
79
-
80
- <style lang="scss" scoped>
81
- .sh-preview {
82
- position: relative;
83
- overflow: auto;
84
- }
85
- </style>
1
+ <template>
2
+ <div class="sh-preview">
3
+ <component :is="componentName" v-bind="componentProps" :style="componentStyles" @rendered="onRendered" @error="onError" />
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import { defineComponent, computed } from 'vue'
9
+ import ShWord from './components/sh-word.vue'
10
+ import ShExcel from './components/sh-excel.vue'
11
+ export default defineComponent({
12
+ name: 'ShPreview',
13
+ components: {
14
+ ShWord,
15
+ ShExcel
16
+ },
17
+ props: {
18
+ type: {
19
+ type: String
20
+ },
21
+ base: {
22
+ type: String
23
+ },
24
+ url: {
25
+ type: String
26
+ },
27
+ width: {
28
+ type: String,
29
+ default: '100%'
30
+ },
31
+ height: {
32
+ type: String,
33
+ default: '600px'
34
+ }
35
+ },
36
+ emits: ['ready', 'error'],
37
+ setup(props, context) {
38
+ const { emit, slots } = context
39
+ const previewType = computed(() => (props.type && props.type.toLowerCase()) || (props.url && props.url.substr(props.url.lastIndexOf('.') + 1).toLowerCase()))
40
+ const componentName = computed(() => {
41
+ if (['word', 'doc', 'docx'].includes(previewType.value)) {
42
+ return 'sh-word'
43
+ } else if (['excel', 'xlsx'].includes(previewType.value)) {
44
+ return 'sh-excel'
45
+ }
46
+ return 'iframe'
47
+ })
48
+ const componentProps = computed(() => {
49
+ let srcPrefix = props.base || ''
50
+ let srcSuffix = componentName.value === 'iframe' ? '#scrollbars=0&toolbar=0&statusbar=0' : ''
51
+ return {
52
+ src: srcPrefix + props.url + srcSuffix,
53
+ frameborder: 0
54
+ }
55
+ })
56
+ const componentStyles = computed(() => {
57
+ return {
58
+ width: props.width,
59
+ height: props.height
60
+ }
61
+ })
62
+
63
+ const onRendered = data => {
64
+ emit('ready', data)
65
+ }
66
+ const onError = data => {
67
+ emit('error', data)
68
+ }
69
+
70
+ return {
71
+ componentName,
72
+ componentProps,
73
+ componentStyles,
74
+ onRendered,
75
+ onError
76
+ }
77
+ }
78
+ })
79
+ </script>
80
+
81
+ <style lang="scss" scoped>
82
+ .sh-preview {
83
+ position: relative;
84
+ overflow: auto;
85
+ }
86
+ </style>
@@ -0,0 +1,37 @@
1
+ import { onMounted, ref, watch } from 'vue'
2
+
3
+ export default function (props, context, state) {
4
+ const rootRef = ref(null)
5
+ const { emit } = context
6
+
7
+ const initData = async () => {
8
+ if (!props.src) return
9
+ let container = rootRef.value
10
+ try {
11
+ let fileRes = src
12
+ if (typeof src === 'string') {
13
+ fileRes = fetch(src, props.serverConfig)
14
+ }
15
+ await state.domRender(fileRes, container)
16
+ emit('rendered')
17
+ } catch (e) {
18
+ await state.domRender('', container)
19
+ emit('error', e)
20
+ }
21
+ }
22
+
23
+ onMounted(() => {
24
+ initData()
25
+ })
26
+
27
+ watch(
28
+ () => props.src,
29
+ () => {
30
+ initData()
31
+ }
32
+ )
33
+
34
+ return {
35
+ rootRef
36
+ }
37
+ }
@@ -0,0 +1,11 @@
1
+ export default {
2
+ src: [String, ArrayBuffer, Blob],
3
+ options: {
4
+ type: Object,
5
+ default: () => ({})
6
+ },
7
+ serverConfig: {
8
+ type: Object,
9
+ default: () => ({})
10
+ }
11
+ }
@@ -8,7 +8,8 @@
8
8
  </template>
9
9
 
10
10
  <script>
11
- export default {
11
+ import { defineComponent, computed, onActivated } from 'vue'
12
+ export default defineComponent({
12
13
  name: 'SystemTip',
13
14
  props: {
14
15
  name: {
@@ -16,21 +17,18 @@ export default {
16
17
  default: ''
17
18
  }
18
19
  },
19
- data() {
20
- return {
21
- nowdate: new Date()
22
- }
23
- },
24
- computed: {
25
- headerDate() {
26
- let hours = this.nowdate.getHours()
27
- let month = this.nowdate.getMonth() + 1
28
- let day = this.nowdate.getDate()
29
- let week = this.nowdate.getDay()
30
- return { date: this.nowdate, hours, month, day, week }
31
- },
32
- headerWeek() {
33
- let { week } = this.headerDate
20
+ setup(props, context) {
21
+ let nowdate = new Date()
22
+
23
+ const headerDate = computed(() => {
24
+ let hours = nowdate.getHours()
25
+ let month = nowdate.getMonth() + 1
26
+ let day = nowdate.getDate()
27
+ let week = nowdate.getDay()
28
+ return { date: nowdate, hours, month, day, week }
29
+ })
30
+ const headerWeek = computed(() => {
31
+ let { week } = headerDate.value
34
32
  let tw = ''
35
33
  switch (week) {
36
34
  case 0:
@@ -56,9 +54,9 @@ export default {
56
54
  break
57
55
  }
58
56
  return tw
59
- },
60
- headerTitle() {
61
- let { hours } = this.headerDate
57
+ })
58
+ const headerTitle = computed(() => {
59
+ let { hours } = headerDate.value
62
60
  let title = ''
63
61
  let desc = ''
64
62
  switch (true) {
@@ -99,13 +97,19 @@ export default {
99
97
  desc = '睡前请把窗户打开,让"幸福"进来,睡前请把"心情"打开,让"快乐"入驻,睡前请把"思想"放飞,让甜蜜入梦!今晚祝你好梦成真,幸福一生!晚安!'
100
98
  break
101
99
  }
102
- return { title: `Hi! <span class="primary">${this.name}</span> ${title}`, desc }
100
+ return { title: `Hi! <span class="primary">${props.name}</span> ${title}`, desc }
101
+ })
102
+
103
+ onActivated(() => {
104
+ nowdate = new Date()
105
+ })
106
+
107
+ return {
108
+ headerWeek,
109
+ headerTitle
103
110
  }
104
- },
105
- activated() {
106
- this.nowdate = new Date()
107
111
  }
108
- }
112
+ })
109
113
  </script>
110
114
 
111
115
  <style lang="scss" scoped></style>
@@ -1,4 +1,4 @@
1
- import '../assets/css/theme.scss'
2
- import '../assets/css/loader.scss'
3
- import '../assets/css/main.scss'
4
- import '../assets/css/animated.scss'
1
+ import './theme.scss'
2
+ import './loader.scss'
3
+ import './main.scss'
4
+ import './animated.scss'
@@ -3,7 +3,7 @@ import { utils } from 'sh-tools'
3
3
  let preventClass = 'sh-prevent--disabled'
4
4
 
5
5
  export default {
6
- inserted(el, binding) {
6
+ mounted(el, binding) {
7
7
  el.addEventListener('click', () => {
8
8
  if (!el.disabled) {
9
9
  el.disabled = true