xianniu-ui 0.1.2 → 0.1.4

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 (81) hide show
  1. package/lib/style/basic.css +1 -0
  2. package/lib/style/city.css +1 -0
  3. package/lib/style/date.css +1 -0
  4. package/lib/style/flex.css +1 -0
  5. package/lib/style/import.css +1 -0
  6. package/lib/style/index.css +1 -1
  7. package/{src → lib/style}/theme/element-variables.scss +2 -4
  8. package/{src → lib/style}/theme/index.scss +0 -0
  9. package/{src → lib/style}/theme/mixin.scss +0 -0
  10. package/{src → lib/style}/theme/sidebar.scss +0 -0
  11. package/lib/style/theme/theme.scss +4 -0
  12. package/{src → lib/style}/theme/transition.scss +0 -0
  13. package/{src → lib/style}/theme/variables.scss +0 -0
  14. package/lib/style/upload.css +1 -0
  15. package/lib/xianniu-ui.common.js +25504 -18072
  16. package/lib/xianniu-ui.css +1 -0
  17. package/lib/xianniu-ui.umd.js +25508 -18076
  18. package/lib/xianniu-ui.umd.min.js +1 -9
  19. package/package.json +63 -62
  20. package/packages/city/index.js +7 -0
  21. package/packages/city/main.vue +258 -0
  22. package/packages/date/index.js +7 -0
  23. package/packages/date/main.vue +348 -0
  24. package/packages/dialog/!main.vue +90 -0
  25. package/packages/dialog/main.vue +37 -57
  26. package/packages/drawer/index.js +7 -0
  27. package/packages/drawer/main.vue +65 -0
  28. package/packages/empty/index.js +7 -0
  29. package/packages/empty/main.vue +33 -0
  30. package/packages/export/index.js +7 -0
  31. package/packages/export/main.vue +99 -0
  32. package/packages/import/index.js +7 -0
  33. package/packages/import/main.vue +135 -0
  34. package/packages/inputRange/index.js +7 -0
  35. package/packages/inputRange/main.vue +15 -0
  36. package/packages/page/main.vue +5 -5
  37. package/packages/search/index.js +7 -0
  38. package/packages/search/main.vue +230 -0
  39. package/packages/style/lib/basic.css +1 -0
  40. package/packages/style/lib/city.css +1 -0
  41. package/packages/style/lib/date.css +1 -0
  42. package/packages/style/lib/flex.css +1 -0
  43. package/packages/style/lib/import.css +1 -0
  44. package/packages/style/lib/index.css +1 -1
  45. package/packages/style/lib/upload.css +1 -0
  46. package/packages/style/src/basic.scss +64 -0
  47. package/packages/style/src/city.scss +3 -0
  48. package/packages/style/src/date.scss +5 -0
  49. package/packages/style/src/flex.scss +74 -0
  50. package/packages/style/src/import.scss +37 -0
  51. package/packages/style/src/index.scss +9 -1
  52. package/packages/style/src/mixin/mixin.scss +270 -0
  53. package/packages/style/src/search.scss +17 -0
  54. package/packages/style/src/table.scss +36 -4
  55. package/packages/style/src/theme/element-variables.scss +26 -0
  56. package/packages/style/src/theme/index.scss +1 -0
  57. package/packages/style/src/theme/mixin.scss +270 -0
  58. package/packages/style/src/theme/sidebar.scss +271 -0
  59. package/packages/style/src/theme/theme.scss +4 -0
  60. package/packages/style/src/theme/transition.scss +52 -0
  61. package/packages/style/src/theme/variables.scss +36 -0
  62. package/packages/style/src/tip.scss +22 -0
  63. package/packages/style/src/tree.scss +87 -0
  64. package/packages/style/src/upload.scss +46 -0
  65. package/packages/table/column.vue +42 -23
  66. package/packages/table/main.vue +126 -35
  67. package/packages/tip/index.js +7 -0
  68. package/packages/tip/main.vue +22 -0
  69. package/packages/tree/index.js +7 -0
  70. package/packages/tree/main.vue +192 -0
  71. package/packages/upload/index.js +7 -0
  72. package/packages/upload/main.vue +346 -0
  73. package/packages/upload/upload-pop.vue +49 -0
  74. package/packages/upload/upload-slot.vue +0 -0
  75. package/src/index.js +23 -3
  76. package/src/plugins/index.js +1 -1
  77. package/src/utils/format.js +119 -106
  78. package/src/utils/index.js +0 -2
  79. package/src/utils/reg.js +7 -1
  80. package/src/utils/utils.js +76 -10
  81. package/src/utils/lodash.js +0 -2
@@ -0,0 +1,7 @@
1
+ import XnUpload from './main.vue'
2
+
3
+ XnUpload.install = function (Vue) {
4
+ Vue.component(XnUpload.name, XnUpload)
5
+ }
6
+
7
+ export default XnUpload
@@ -0,0 +1,346 @@
1
+ <template>
2
+ <el-upload
3
+ ref="upload"
4
+ :class="{
5
+ 'is-disabled': $attrs.disabled != undefined,
6
+ }"
7
+ class="xn-upload xn-upload-main"
8
+ action="###"
9
+ :list-type="listType"
10
+ v-bind="$attrs"
11
+ :file-list.sync="fileList"
12
+ :http-request="onHttpUpload"
13
+ :on-error="onError"
14
+ :before-upload="onBeforeUpload"
15
+ :style="styles"
16
+ :headers="uploadHeaders"
17
+ :on-exceed="onExceed"
18
+ :on-change="onChange"
19
+ >
20
+ <template v-if="listType === 'picture-card'">
21
+ <div slot="trigger" class="upload-limit">
22
+ <i class="el-icon el-icon-plus" />
23
+ <span
24
+ ><em>{{ fileList.length }}</em
25
+ >/<em>{{ limit }}</em>
26
+ </span>
27
+ </div>
28
+ </template>
29
+ <template v-else>
30
+ <slot>
31
+ <el-button icon="el-icon-upload">编辑</el-button>
32
+ </slot>
33
+ </template>
34
+ <div
35
+ slot="file"
36
+ slot-scope="{ file }"
37
+ class="xn-upload--slot"
38
+ :class="{ 'upload-slot-idcard': listType === 'idcard' }"
39
+ >
40
+ <uploadPop :file="file" @on-download="handleDownload(file)"></uploadPop>
41
+ <template v-if="isImage(file)">
42
+ <el-image
43
+ class="el-upload-list__item-thumbnail"
44
+ :src="file.url"
45
+ fit="cover"
46
+ :lazy="true"
47
+ />
48
+ </template>
49
+ <template v-else>
50
+ <div class="xn-upload-list__item--file">
51
+ <div class="annex">
52
+ <i class="el-icon el-icon-folder" />
53
+ <span class="label">附件</span>
54
+ </div>
55
+ <div class="file-name">{{ file.accessoryName }}</div>
56
+ </div>
57
+ </template>
58
+ <div v-if="file.status === 'uploading'" class="process">
59
+ <el-progress
60
+ :status="file.percentage === 100 ? 'success' : null"
61
+ type="circle"
62
+ :percentage="process(file.percentage)"
63
+ :stroke-width="6"
64
+ />
65
+ </div>
66
+ <span class="el-upload-list__item-actions">
67
+ <span
68
+ v-if="isImage(file)"
69
+ class="el-upload-list__item-preview"
70
+ @click="handlePictureCardPreview(file)"
71
+ >
72
+ <i class="fz-16 el-icon-zoom-in" />
73
+ </span>
74
+ <span
75
+ class="el-upload-list__item-delete icon"
76
+ @click="handleDownload(file, fileList)"
77
+ >
78
+ <i class="fz-16 el-icon-download" />
79
+ </span>
80
+ <span
81
+ v-if="!$attrs.disabled && !preview"
82
+ class="el-upload-list__item-delete icon"
83
+ @click="handleRemove(file, fileList)"
84
+ >
85
+ <i class="fz-16 el-icon-delete" />
86
+ </span>
87
+ </span>
88
+ </div>
89
+ <div v-if="tip !== ''" slot="tip" class="el-upload__tip">{{ tip }}</div>
90
+ <el-image-viewer
91
+ v-if="isShowImageView"
92
+ :on-close="closeViewer"
93
+ :z-index="999999"
94
+ :url-list="[imageView]"
95
+ />
96
+ </el-upload>
97
+ </template>
98
+
99
+ <script>
100
+ import ElImageViewer from "element-ui/packages/image/src/image-viewer";
101
+ import * as imageConversion from "image-conversion";
102
+ import axios from "axios";
103
+ import uploadPop from "./upload-pop.vue";
104
+ export default {
105
+ name: "XnUpload",
106
+ inheritAttrs: true,
107
+ components: {
108
+ uploadPop,
109
+ ElImageViewer,
110
+ },
111
+ props: {
112
+ listType: {
113
+ type: String,
114
+ default: "picture-card",
115
+ },
116
+ hiddenUpload: {
117
+ type: Boolean,
118
+ default: false,
119
+ },
120
+ preview: {
121
+ type: Boolean,
122
+ default: false,
123
+ },
124
+ fileList: {
125
+ type: Array,
126
+ default: () => [],
127
+ },
128
+
129
+ limit: {
130
+ type: Number,
131
+ default: 1,
132
+ },
133
+ tip: {
134
+ type: String,
135
+ default: "",
136
+ },
137
+ accept: {
138
+ type: Array,
139
+ default: () => ["jpg", "jpeg", "png", "pdf"],
140
+ },
141
+ maxSize: {
142
+ type: Number,
143
+ default: 1024 * 5 * 1024, // 最大限制 5M
144
+ },
145
+ compress: {
146
+ type: Number,
147
+ default: 0,
148
+ },
149
+ type: {
150
+ type: String,
151
+ default: "front",
152
+ validator: (val) => {
153
+ return ["front", "back"].includes(val);
154
+ },
155
+ },
156
+ styles: {
157
+ type: Object,
158
+ default: () => {},
159
+ },
160
+ },
161
+ data() {
162
+ return {
163
+ isShowImageView: false,
164
+ imageView: "",
165
+ isHidden: false,
166
+ // actionParams: {
167
+ // action: '',
168
+ // },
169
+ uploadHeaders: {
170
+ xnToken: "",
171
+ },
172
+ viewList: [],
173
+ files: [],
174
+ successFiles: [],
175
+ };
176
+ },
177
+ computed: {
178
+ process() {
179
+ return (num) => {
180
+ return Math.floor(num);
181
+ };
182
+ },
183
+ isImage() {
184
+ return (file) => {
185
+ return file.imgFlag;
186
+ };
187
+ },
188
+ },
189
+ watch: {
190
+ fileList: {
191
+ handler(n) {
192
+ this.successFiles = n;
193
+ if (this.limit === n.length) {
194
+ this.isHidden = true;
195
+ } else {
196
+ this.isHidden = false;
197
+ }
198
+ },
199
+ immediate: true,
200
+ },
201
+ },
202
+ created() {
203
+ console.log(this.$attrs);
204
+ },
205
+ beforeDestroy() {
206
+ this.$emit("update:fileList", []);
207
+ },
208
+ methods: {
209
+ onBeforeUpload(file) {
210
+ let fileExt = file.name.substring(file.name.lastIndexOf(".") + 1);
211
+
212
+ // 判断上传格式
213
+ fileExt = `${fileExt}`.toLowerCase();
214
+
215
+ if (!this.accept.includes(fileExt)) {
216
+ this.$message.warning(`请上传指定格式【${this.accept}】`);
217
+ return false;
218
+ }
219
+ },
220
+ handleCompress(file) {
221
+ const { compress } = this;
222
+ const _maxSize = parseFloat(this.maxSize);
223
+ let size = 0;
224
+ if (compress) {
225
+ size = compress;
226
+ } else {
227
+ size = file.size > _maxSize ? _maxSize / 1024 : file.size
228
+ }
229
+ return new Promise((resolve) => {
230
+ imageConversion["compressAccurately"](file, size).then((result) => {
231
+ resolve(result);
232
+ });
233
+ });
234
+ },
235
+ onExceedSize(size, maxSize) {
236
+ if (size > maxSize) {
237
+ this.$message.warning(
238
+ `最大不能超过${this.$utils.bytesToSize(maxSize)}`
239
+ );
240
+ return false;
241
+ }
242
+ return true;
243
+ },
244
+ onChange(file, fileList) {
245
+ this.files = fileList;
246
+ },
247
+ async onHttpUpload(file) {
248
+ const formData = new FormData();
249
+ let result = null;
250
+ if (this.$utils.isImg(file.file.name)) {
251
+ result = await this.handleCompress(file.file);
252
+ var newFile = new window.File([result], file.file.name, {
253
+ type: file.file.type,
254
+ });
255
+ }
256
+ const _file = result ? newFile : file.file;
257
+ formData.append("file", _file);
258
+
259
+ axios({
260
+ method: "post",
261
+ url: this.$XN.uploadUrl || '',
262
+ data: formData,
263
+ headers: {
264
+ "Content-Type": "application/x-www-form-urlencoded",
265
+ },
266
+ onUploadProgress(progress) {
267
+ const _progress = Math.round(
268
+ (progress.loaded / progress.total) * 100
269
+ );
270
+ file.onProgress({ percent: _progress });
271
+ },
272
+ })
273
+ .then((res) => {
274
+ const { accessoryName, accessorySize, ext, imgFlag, url } =
275
+ res.data.data;
276
+ var obj = {};
277
+ obj.accessoryName = accessoryName;
278
+ obj.accessorySize = accessorySize;
279
+ obj.ext = ext;
280
+ obj.imgFlag = imgFlag;
281
+ obj.url = url;
282
+ this.successFiles.push(obj);
283
+ file.onSuccess();
284
+ this.$emit("update:fileList", this.successFiles);
285
+ this.$emit("on-success", this.successFiles);
286
+ })
287
+ .catch(() => {
288
+ // console.log(err);
289
+ this.$emit("update:fileList", this.successFiles);
290
+ file.onError();
291
+ });
292
+ },
293
+
294
+ onError() {
295
+ // console.log(err);
296
+ this.$message.error("上传失败,请重试");
297
+ },
298
+ onSubmitUpload() {
299
+ this.$refs.upload.submit();
300
+ },
301
+ onAbort() {
302
+ this.$refs.upload.abort();
303
+ },
304
+
305
+ onExceed() {
306
+ this.$message.warning(`上传总数限制为【${this.limit}】个,请删除后上传`);
307
+ },
308
+ handlePictureCardPreview(file) {
309
+ this.isShowImageView = true;
310
+ this.$nextTick(() => {
311
+ this.imageView = file.url;
312
+ });
313
+ },
314
+ async handleDownload({ url }) {
315
+ const elt = document.createElement("a");
316
+ elt.setAttribute("href", url);
317
+ elt.setAttribute("download", "下载文件");
318
+ elt.style.display = "none";
319
+ elt.target = "_blank";
320
+ document.body.appendChild(elt);
321
+ elt.click();
322
+ document.body.removeChild(elt);
323
+ },
324
+ handleRemove(file, fileList) {
325
+ fileList.forEach((item, idx) => {
326
+ if (file.uid === item.uid) {
327
+ fileList.splice(idx, 1);
328
+ }
329
+ });
330
+ if (this.viewList.length) {
331
+ this.viewList.forEach((item, idx) => {
332
+ if (item.url === file.url) {
333
+ this.viewList.splice(idx, 1);
334
+ }
335
+ });
336
+ }
337
+ this.$emit("update:fileList", fileList);
338
+ // this.$emit('on-change', fileList.map(item => item.url).join(','))
339
+ },
340
+ closeViewer() {
341
+ this.isShowImageView = false;
342
+ },
343
+ },
344
+ };
345
+ </script>
346
+
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <el-popover width="300" trigger="hover">
3
+ <el-form label-width="80px" size="mini">
4
+ <el-form-item label="文件名">
5
+ <div :title="file.accessoryName" class="tip-filename">
6
+ {{ file.accessoryName }}
7
+ </div>
8
+ </el-form-item>
9
+ <el-form-item label="文件大小">
10
+ {{ $format.bytesToSize(file.accessorySize) }}
11
+ </el-form-item>
12
+ <el-form-item label="文件格式">
13
+ {{ file.ext }}
14
+ </el-form-item>
15
+ <el-form-item label="文件类型">
16
+ {{ file.imgFlag ? "图片" : "文件" }}
17
+ </el-form-item>
18
+ <el-form-item label="操作">
19
+ <el-link
20
+ type="primary"
21
+ :underline="false"
22
+ @click="handleDownload(file)"
23
+ icon="el-icon-download"
24
+ >下载</el-link
25
+ >
26
+ </el-form-item>
27
+ </el-form>
28
+ <div v-if="file.ext" slot="reference" class="xn-upload--slot__ext">{{ file.ext }}</div>
29
+ </el-popover>
30
+ </template>
31
+
32
+ <script>
33
+ export default {
34
+ props: {
35
+ file: {
36
+ type: Object,
37
+ default: () => {},
38
+ },
39
+ },
40
+ methods:{
41
+ handleDownload(file){
42
+ this.$emit('on-download',file)
43
+ }
44
+ }
45
+ };
46
+ </script>
47
+
48
+ <style>
49
+ </style>
File without changes
package/src/index.js CHANGED
@@ -2,12 +2,30 @@
2
2
  import XnDialog from '../packages/dialog/index'
3
3
  import XnTable from '../packages/table/index'
4
4
  import XnPage from '../packages/page/index'
5
+ import XnSearch from '../packages/search/index'
6
+ import XnDate from '../packages/date/index'
7
+ import XnUpload from '../packages/upload/index'
8
+ import XnCity from '../packages/city/index'
9
+ import XnTip from '../packages/tip/index'
10
+ import XnDrawer from '../packages/drawer/index'
11
+ import XnTree from '../packages/tree/index'
12
+ import XnImport from '../packages/import/index'
13
+ import XnExport from '../packages/export/index'
5
14
 
6
15
  import Utils from 'xn-ui/src/utils/index'
7
16
  const components = [
8
17
  XnDialog,
9
18
  XnTable,
10
- XnPage
19
+ XnPage,
20
+ XnSearch,
21
+ XnDate,
22
+ XnUpload,
23
+ XnCity,
24
+ XnTip,
25
+ XnDrawer,
26
+ XnTree,
27
+ XnImport,
28
+ XnExport
11
29
  ]
12
30
  const version = require('../package.json').version
13
31
 
@@ -27,7 +45,6 @@ const install = function (Vue) {
27
45
  Vue.prototype.$reg = Utils.$reg
28
46
  Vue.prototype.$format = Utils.$format
29
47
  Vue.prototype.$dayjs = Utils.$dayjs
30
- Vue.prototype.$lodash = Utils.$lodash
31
48
  Vue.prototype.$storage = Utils.$storage
32
49
 
33
50
  }
@@ -40,5 +57,8 @@ export default {
40
57
  install,
41
58
  XnDialog,
42
59
  XnTable,
43
- XnPage
60
+ XnPage,
61
+ XnSearch,
62
+ XnCity,
63
+ XnTip
44
64
  }
@@ -1,6 +1,6 @@
1
1
  import Vue from 'vue'
2
2
  import Element from 'element-ui'
3
- import '@/theme/index.scss'
3
+ import 'xn-ui/packages/style/src/theme/index.scss'
4
4
  Vue.use(Element, {
5
5
  size: 'small'
6
6
  })