free-fe-core-modules 0.0.1

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 (112) hide show
  1. package/README.md +7 -0
  2. package/components/.gitkeep +0 -0
  3. package/components/Basic/BreadCrumbs.vue +87 -0
  4. package/components/Basic/EIcon.vue +84 -0
  5. package/components/Basic/LeveledMenus.vue +92 -0
  6. package/components/Basic/SummaryHead.vue +312 -0
  7. package/components/Dialog/BasicDialog.vue +442 -0
  8. package/components/Dialog/index.js +38 -0
  9. package/components/Dialog/index1.js +49 -0
  10. package/components/FloatingWindow/index.vue +140 -0
  11. package/components/SelectLocales/index.vue +47 -0
  12. package/components/SlidingCarousel/index.vue +86 -0
  13. package/components/SlidingNews/index.vue +138 -0
  14. package/components/StickyButtons/index.vue +98 -0
  15. package/components/ThemeSwitch/index.vue +77 -0
  16. package/field-components/Display/index.js +3 -0
  17. package/field-components/Fields/AgreementCheck.vue +161 -0
  18. package/field-components/Fields/ApiCall.vue +139 -0
  19. package/field-components/Fields/Boolean.vue +112 -0
  20. package/field-components/Fields/Category.vue +33 -0
  21. package/field-components/Fields/Check.vue +131 -0
  22. package/field-components/Fields/Customize.vue +103 -0
  23. package/field-components/Fields/Date.vue +142 -0
  24. package/field-components/Fields/DateRange.vue +199 -0
  25. package/field-components/Fields/DynamicList.vue +575 -0
  26. package/field-components/Fields/FieldEditor.vue +379 -0
  27. package/field-components/Fields/File.vue +382 -0
  28. package/field-components/Fields/FileList.vue +405 -0
  29. package/field-components/Fields/FileListCombined.vue +142 -0
  30. package/field-components/Fields/FixedList.vue +372 -0
  31. package/field-components/Fields/Image.vue +328 -0
  32. package/field-components/Fields/ImageList.vue +285 -0
  33. package/field-components/Fields/ImageListCombined.vue +76 -0
  34. package/field-components/Fields/InputFieldList.vue +299 -0
  35. package/field-components/Fields/Labels.vue +182 -0
  36. package/field-components/Fields/MixedTable.vue +367 -0
  37. package/field-components/Fields/Number.vue +247 -0
  38. package/field-components/Fields/Password.vue +79 -0
  39. package/field-components/Fields/Permission.vue +83 -0
  40. package/field-components/Fields/PermissionEditor.vue +205 -0
  41. package/field-components/Fields/QueryFilters.vue +162 -0
  42. package/field-components/Fields/RadioList.vue +81 -0
  43. package/field-components/Fields/Rich.vue +369 -0
  44. package/field-components/Fields/Search.vue +499 -0
  45. package/field-components/Fields/Select.vue +376 -0
  46. package/field-components/Fields/SelectionChain.vue +198 -0
  47. package/field-components/Fields/Separator.vue +26 -0
  48. package/field-components/Fields/SingleList.vue +125 -0
  49. package/field-components/Fields/Static.vue +22 -0
  50. package/field-components/Fields/String.vue +185 -0
  51. package/field-components/Fields/Text.vue +89 -0
  52. package/field-components/Fields/Time.vue +160 -0
  53. package/field-components/Fields/TimeRange.vue +348 -0
  54. package/field-components/Fields/UltimateFile.vue +100 -0
  55. package/field-components/Fields/Year.vue +124 -0
  56. package/field-components/Fields/YearRange.vue +188 -0
  57. package/field-components/Fields/components/FieldTypeOptions.vue +248 -0
  58. package/field-components/Fields/index.js +117 -0
  59. package/field-components/components/FieldComponents.vue +246 -0
  60. package/field-components/index.js +13 -0
  61. package/field-components/style.sass +11 -0
  62. package/free-fields/AutoHide.js +66 -0
  63. package/free-fields/CenterContent.js +15 -0
  64. package/free-fields/Draggable.js +30 -0
  65. package/free-fields/Droppable.js +114 -0
  66. package/free-fields/EditableString.js +63 -0
  67. package/free-fields/FieldCategory.js +83 -0
  68. package/free-fields/FieldTypeSelect.js +94 -0
  69. package/free-fields/fieldEditors/arrayEditor.js +3 -0
  70. package/free-fields/fieldEditors/boolEditor.js +22 -0
  71. package/free-fields/fieldEditors/dateEditor.js +23 -0
  72. package/free-fields/fieldEditors/datetimeEditor.js +23 -0
  73. package/free-fields/fieldEditors/index.js +21 -0
  74. package/free-fields/fieldEditors/jsonEditor.js +371 -0
  75. package/free-fields/fieldEditors/labeledField.js +74 -0
  76. package/free-fields/fieldEditors/numberEditor.js +51 -0
  77. package/free-fields/fieldEditors/objectEditor.js +3 -0
  78. package/free-fields/fieldEditors/selectEditor.js +0 -0
  79. package/free-fields/fieldEditors/stringEditor.js +49 -0
  80. package/free-fields/fieldEditors/textEditor.js +50 -0
  81. package/free-fields/fieldEditors/timeEditor.js +23 -0
  82. package/free-fields/index.js +402 -0
  83. package/i18n/en-us/index.js +73 -0
  84. package/i18n/fields/en-us/index.js +9 -0
  85. package/i18n/fields/zh-cn/index.js +9 -0
  86. package/i18n/zh-cn/index.js +73 -0
  87. package/index.js +367 -0
  88. package/package.json +11 -0
  89. package/router/dict/api.js +18 -0
  90. package/router/dict/data.js +48 -0
  91. package/router/dict/index.js +7 -0
  92. package/router/error/api.js +14 -0
  93. package/router/error/data.js +33 -0
  94. package/router/error/index.js +9 -0
  95. package/router/index.js +13 -0
  96. package/router/menu/api.js +24 -0
  97. package/router/menu/data.js +85 -0
  98. package/router/menu/index.js +7 -0
  99. package/router/system/api.js +10 -0
  100. package/router/system/data.js +46 -0
  101. package/router/system/index.js +7 -0
  102. package/stores/index.js +17 -0
  103. package/stores/module-mourning/actions.js +3 -0
  104. package/stores/module-mourning/getters.js +1 -0
  105. package/stores/module-mourning/index.js +11 -0
  106. package/stores/module-mourning/state.js +3 -0
  107. package/stores/mourning.js +3 -0
  108. package/view/dict/index.vue +284 -0
  109. package/view/error/list.vue +197 -0
  110. package/view/menu/index.vue +332 -0
  111. package/view/mourning/mourning.vue +45 -0
  112. package/view/system/index.vue +149 -0
@@ -0,0 +1,405 @@
1
+ <template>
2
+ <div class="row input-field-file-list">
3
+ <span
4
+ :class="`field-label ${(Field.Label && Field.Label.trim().length)
5
+ ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
6
+ v-if="typeof Field.Label !== 'undefined'"
7
+ >
8
+ <q-tooltip
9
+ v-if="Field.Description"
10
+ anchor="top right"
11
+ >{{Field.Description}}</q-tooltip>
12
+ {{Field.Label || ''}}
13
+ <span
14
+ v-if="Field.Required"
15
+ class="required-mark"
16
+ >*</span>
17
+ </span>
18
+ <q-uploader
19
+ @finish="uploaded"
20
+ @removed="uploaded"
21
+ @rejected="filesRejected"
22
+ :factory="factoryFn"
23
+ multiple
24
+ :auto-upload="Field && Field.Options && Field.Options.Auto"
25
+ :max-file-size="maxFileSize"
26
+ :max-total-size="maxTotalSize"
27
+ :accept="acceptedFileTypes"
28
+ :class="`q-ma-xs ${hasError ? 'input-field--error' : ''}`"
29
+ ref="uploader"
30
+ >
31
+ <template v-slot:list="scope">
32
+ <div
33
+ v-if="Field.Options && Field.Options.AsLink && scope.files.length"
34
+ class="file-link row full-width ellipsis items-center"
35
+ >
36
+ <div
37
+ class="row ellipsis full-width"
38
+ v-for="(file, index) in scope.files"
39
+ :key="index"
40
+ >
41
+ <q-btn
42
+ icon="cloud_download"
43
+ dense
44
+ flat
45
+ ></q-btn>
46
+ <a
47
+ class="ellipsis"
48
+ target="_blank"
49
+ :href="runFilter('serverPath',file.id)"
50
+ :download="file.name"
51
+ >
52
+ {{ file.name }}
53
+ <q-tooltip>{{ file.name }}</q-tooltip>
54
+ </a>
55
+ </div>
56
+ </div>
57
+ <div v-else>
58
+ <div class="uploader-btns row no-wrap items-center">
59
+ <q-spinner
60
+ v-if="scope.isUploading"
61
+ class="q-uploader__spinner"
62
+ />
63
+ <q-btn
64
+ v-if="scope.canAddFiles && !Field.ReadOnly && canHaveMore"
65
+ type="a"
66
+ icon="add_box"
67
+ label="点击添加"
68
+ class="add-btn"
69
+ dense
70
+ flat
71
+ >
72
+ <q-uploader-add-trigger v-if="!Field.ReadOnly" />
73
+ </q-btn>
74
+ <q-btn
75
+ v-if="!Field.ReadOnly
76
+ && scope.canUpload && !(Field && Field.Options && Field.Options.Auto)"
77
+ type="a"
78
+ icon="cloud_upload"
79
+ @click="scope.upload"
80
+ class="upload-btn"
81
+ label="点击上传"
82
+ dense
83
+ flat
84
+ ></q-btn>
85
+
86
+ <q-btn
87
+ v-if="scope.isUploading && !Field.ReadOnly"
88
+ type="a"
89
+ icon="clear"
90
+ @click="scope.abort"
91
+ class="abort-btn"
92
+ round
93
+ dense
94
+ flat
95
+ ></q-btn>
96
+ <slot name="warning"></slot>
97
+ </div>
98
+
99
+ <!-- <div
100
+ v-if="scope.files.length && Field.AsList"
101
+ class="file-list file-list-list"
102
+ >
103
+ <q-list>
104
+ <q-item
105
+ class="file-list-item"
106
+ v-for="(file, index) in scope.files"
107
+ :key="index"
108
+ >
109
+ <span class="file-name full-width ellipsis">
110
+ <a
111
+ target="_blank"
112
+ :href="runFilter('serverPath',file.id)"
113
+ :download="file.name">
114
+ {{ file.name }}
115
+ </a>
116
+ <q-tooltip>{{ file.name }}</q-tooltip>
117
+ </span>
118
+
119
+ <span class="file-size full-width ellipsis">
120
+ Size: {{ file.sizeLabel || file.__sizeLabel }}
121
+ </span>
122
+
123
+ <q-btn
124
+ flat
125
+ dense
126
+ round
127
+ class="delete-btn"
128
+ icon="close"
129
+ @click="scope.removeFile(file)"
130
+ v-if="!Field.ReadOnly"
131
+ />
132
+ </q-item>
133
+ </q-list>
134
+ </div> -->
135
+
136
+ <div
137
+ v-if="scope.files.length"
138
+ class="file-list file-list-card row items-start justify-start q-gutter-xl"
139
+ >
140
+ <q-card
141
+ flat
142
+ class="file-list-item"
143
+ v-for="(file, index) in scope.files"
144
+ :key="index"
145
+ >
146
+ <e-icon
147
+ class="file-image"
148
+ :name="fileThumb(file)"
149
+ thumb
150
+ :relative="filePreviewType(file) !== 'image'"
151
+ @click="preview(file)"
152
+ >
153
+ <div class="view-btn-wrapper absolute-full justify-center text-center">
154
+ <q-btn
155
+ flat
156
+ class="view-btn full-height full-width"
157
+ >查看</q-btn>
158
+ </div>
159
+ </e-icon>
160
+ <span class="file-name full-width ellipsis">
161
+ <a
162
+ target="_blank"
163
+ :href="runFilter('serverPath',file.id)"
164
+ :download="file.name">
165
+ {{ file.name }}
166
+ </a>
167
+ <q-tooltip>{{ file.name }}</q-tooltip>
168
+ </span>
169
+
170
+ <span class="file-size full-width ellipsis">
171
+ Size: {{ file.sizeLabel || file.__sizeLabel }}
172
+ </span>
173
+
174
+ <q-btn
175
+ flat
176
+ dense
177
+ round
178
+ class="delete-btn"
179
+ icon="close"
180
+ @click="scope.removeFile(file)"
181
+ v-if="!Field.ReadOnly"
182
+ />
183
+ </q-card>
184
+ </div>
185
+ <div
186
+ class="input-field--error-tag"
187
+ v-if="hasError"
188
+ >
189
+ <e-icon name="error"></e-icon>
190
+ </div>
191
+ </div>
192
+ </template>
193
+ </q-uploader>
194
+ <q-dialog
195
+ class="image-preview-dialog"
196
+ flat
197
+ full-width
198
+ full-height
199
+ v-model="showPreview"
200
+ style="background: rgba(0,0,0,0)"
201
+ >
202
+ <div class="image-preview">
203
+ <q-img
204
+ v-if="previewType=== 'image'"
205
+ contain
206
+ :src="previewFile"
207
+ @click="showPreview=false"
208
+ style="height: 100%; max-width: 100%;"
209
+ >
210
+ </q-img>
211
+
212
+ <q-pdfviewer
213
+ v-if="previewType === 'pdf'"
214
+ v-model="showPreview"
215
+ @click="showPreview=false"
216
+ :src="previewFile"
217
+ type="pdfjs"
218
+ style="height: 100%; max-width: 100%;"
219
+ />
220
+ </div>
221
+ </q-dialog>
222
+ </div>
223
+ </template>
224
+
225
+ <script>
226
+ import { defineComponent } from 'vue';
227
+ import mixnins from 'free-fe-mixins';
228
+
229
+ export default defineComponent({
230
+ name: 'InputFieldFileList',
231
+ mixins: [mixnins.UploaderMixin, mixnins.InputFieldMixin],
232
+ emits:['input'],
233
+ fieldInfo: {
234
+ Category: 'Upload',
235
+ Label: '文件列表',
236
+ Value: 'FileList',
237
+ Extra: [
238
+ {
239
+ Type: 'String',
240
+ Label: '支持的文件类型',
241
+ Name: 'Options.Ext',
242
+ Default: 'pdf,doc,docx',
243
+ },
244
+ {
245
+ Type: 'Boolean',
246
+ Label: '自动上传',
247
+ Name: 'Options.Auto',
248
+ Default: false,
249
+ },
250
+ {
251
+ Type: 'String',
252
+ Label: '最大文件大小',
253
+ Name: 'MaxValue',
254
+ Default: '10m',
255
+ },
256
+ {
257
+ Type: 'String',
258
+ Label: '最大总大小',
259
+ Name: 'Options.MaxTotal',
260
+ Default: '50m',
261
+ },
262
+ {
263
+ Type: 'Number',
264
+ Label: '最多文件个数',
265
+ Name: 'Options.MaxCount',
266
+ MinValue: 1,
267
+ Options: {
268
+ Postfix: '个',
269
+ },
270
+ },
271
+ {
272
+ Type: 'Boolean',
273
+ Label: '紧凑样式',
274
+ Name: 'Options.Dense',
275
+ Default: false,
276
+ },
277
+ {
278
+ Type: 'Boolean',
279
+ Label: '显示为链接',
280
+ Name: 'Options.AsLink',
281
+ Default: false,
282
+ },
283
+ ],
284
+ Description: '',
285
+ },
286
+ data() {
287
+ return {
288
+ hasError: false,
289
+ };
290
+ },
291
+ watch: {
292
+ fieldData() {
293
+ if (this.fieldData) {
294
+ if (Array.isArray(this.fieldData)) {
295
+ this.$refs.uploader.files = this.fieldData.filter((f) => !!f);
296
+ } else {
297
+ this.$refs.uploader.files = [this.fieldData];
298
+ }
299
+ }
300
+ },
301
+ },
302
+ mounted() {
303
+ if (this.fieldData) {
304
+ try {
305
+ this.$refs.uploader.files = this.fieldData.filter((f) => !!f);
306
+ } catch (ex) {
307
+ //
308
+ }
309
+ }
310
+ },
311
+ computed: {
312
+ canHaveMore() {
313
+ if (this.Field && this.Field.Options && this.Field.Options.MaxCount) {
314
+ return (this.fieldData || []).length < this.Field.Options.MaxCount;
315
+ }
316
+
317
+ return true;
318
+ },
319
+ },
320
+ methods: {
321
+ validate() {
322
+ if (this.Field.Required) {
323
+ this.hasError = this.$refs.uploader.files.length <= 0;
324
+ return this.$refs.uploader.files.length > 0;
325
+ }
326
+
327
+ const rules = Array.isArray(typeof this.Field.Rules) ? this.Field.Rules : [this.Field.Rules];
328
+
329
+ let isValid = true;
330
+ for (let i = 0; i < rules.length; i += 1) {
331
+ const r = rules[i];
332
+
333
+ if (typeof r === 'function') {
334
+ isValid = isValid && r(this.$refs.uploader.files);
335
+ }
336
+ }
337
+
338
+ this.hasError = !isValid;
339
+ return isValid;
340
+ },
341
+ factoryFn() {
342
+ return {
343
+ url: this.Field.url || `${this.ctx.config.baseUrl}/upload`,
344
+ fieldName: 'file',
345
+ };
346
+ },
347
+ uploaded() {
348
+ const uploadedFiles = [];
349
+ for (let i = 0; i < this.$refs.uploader.files.length; i += 1) {
350
+ const file = this.$refs.uploader.files[i];
351
+
352
+ const { xhr } = file;
353
+ let res;
354
+ if (xhr && xhr.response) {
355
+ if (typeof xhr.response === 'string') {
356
+ //
357
+ res = JSON.parse(xhr.response);
358
+ } else if (typeof xhr.response === 'object') {
359
+ //
360
+ res = xhr.response;
361
+ } else {
362
+ //
363
+ return;
364
+ }
365
+
366
+ if (res && res.msg === 'OK') {
367
+ uploadedFiles.push({
368
+ id: res.data.id,
369
+ // eslint-disable-next-line no-underscore-dangle
370
+ sizeLabel: file.__sizeLabel,
371
+ name: file.name,
372
+ size: file.size,
373
+ type: file.type,
374
+ });
375
+ }
376
+ } else if (file.id) {
377
+ // old files
378
+ uploadedFiles.push(file);
379
+ }
380
+ }
381
+
382
+ this.fieldData = uploadedFiles;
383
+ this.$emit('input');
384
+
385
+ this.validate();
386
+ },
387
+ },
388
+ });
389
+ </script>
390
+
391
+ <style lang="sass" scoped>
392
+ .file-link
393
+ &>div
394
+ display: inline-block
395
+ white-space: nowrap
396
+ overflow: hidden
397
+ & a
398
+ white-space: nowrap
399
+ overflow: hidden
400
+ </style>
401
+
402
+ <style lang="sass">
403
+ .q-uploader__header
404
+ display: none
405
+ </style>
@@ -0,0 +1,142 @@
1
+ <template>
2
+ <div class="row input-field-file-list combined input-field--readonly">
3
+ <span
4
+ :class="`field-label ${(Field.Label && Field.Label.trim().length)
5
+ ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
6
+ v-if="typeof Field.Label !== 'undefined'"
7
+ >
8
+ <q-tooltip
9
+ v-if="Field.Description"
10
+ anchor="top right"
11
+ >{{Field.Description}}</q-tooltip>
12
+ {{Field.Label || ''}}
13
+ </span>
14
+ <q-uploader
15
+ multiple
16
+ :class="`q-ma-xs`"
17
+ ref="uploader"
18
+ >
19
+ <template v-slot:list="scope">
20
+ <div
21
+ v-if="scope.files.length && Field.AsList"
22
+ class="file-list file-list-list"
23
+ >
24
+ <q-list>
25
+ <q-item
26
+ class="file-list-item"
27
+ v-for="(file, index) in scope.files"
28
+ :key="index"
29
+ >
30
+ <span class="file-name full-width ellipsis">
31
+ <a
32
+ target="_blank"
33
+ :href="runFilter('serverPath',file.id)"
34
+ :download="file.name">
35
+ {{ file.name }}
36
+ </a>
37
+ <q-tooltip>{{ file.name }}</q-tooltip>
38
+ </span>
39
+
40
+ <span class="file-size full-width ellipsis">
41
+ Size: {{ file.sizeLabel || file.__sizeLabel }}
42
+ </span>
43
+ </q-item>
44
+ </q-list>
45
+ </div>
46
+
47
+ <div
48
+ v-if="scope.files.length && !Field.AsList"
49
+ class="file-list file-list-card row items-start justify-start q-gutter-xl"
50
+ >
51
+ <q-card
52
+ flat
53
+ class="file-list-item"
54
+ v-for="(file, index) in scope.files"
55
+ :key="index"
56
+ >
57
+ <e-icon
58
+ class="file-image"
59
+ :name="fileThumb(file)"
60
+ thumb
61
+ :relative="filePreviewType(file) !== 'image'"
62
+ @click="preview(file)"
63
+ >
64
+ <div class="view-btn-wrapper absolute-full justify-center text-center">
65
+ <q-btn
66
+ flat
67
+ class="view-btn full-height full-width"
68
+ >查看</q-btn>
69
+ </div>
70
+ </e-icon>
71
+ <span class="file-name full-width ellipsis">
72
+ <a
73
+ target="_blank"
74
+ :href="runFilter('serverPath',file.id)"
75
+ :download="file.name">
76
+ {{ file.name }}
77
+ </a>
78
+ <q-tooltip>{{ file.name }}</q-tooltip>
79
+ </span>
80
+
81
+ <span class="file-size full-width ellipsis">
82
+ Size: {{ file.sizeLabel || file.__sizeLabel }}
83
+ </span>
84
+ </q-card>
85
+ </div>
86
+ </template>
87
+ </q-uploader>
88
+ <q-dialog
89
+ class="image-preview-dialog"
90
+ flat
91
+ full-width
92
+ full-height
93
+ v-model="showPreview"
94
+ style="background: rgba(0,0,0,0)"
95
+ >
96
+
97
+ <div class="image-preview">
98
+ <q-img
99
+ v-if="previewType=== 'image'"
100
+ contain
101
+ :src="previewFile"
102
+ @click="showPreview=false"
103
+ style="height: 100%; max-width: 100%;"
104
+ >
105
+ </q-img>
106
+
107
+ <q-pdfviewer
108
+ v-if="previewType === 'pdf'"
109
+ v-model="showPreview"
110
+ @click="showPreview=false"
111
+ :src="previewFile"
112
+ type="pdfjs"
113
+ style="height: 100%; max-width: 100%;"
114
+ />
115
+ </div>
116
+ </q-dialog>
117
+ </div>
118
+ </template>
119
+
120
+ <script>
121
+ import { defineComponent } from 'vue';
122
+ import mixnins from 'free-fe-mixins';
123
+
124
+ export default defineComponent({
125
+ name: 'InputFieldFileListCombined',
126
+ mixins: [mixnins.UploaderMixin, mixnins.InputFieldMixin],
127
+ fieldInfo: {
128
+ Category: 'Upload',
129
+ Label: '合并文件列表',
130
+ Value: 'FileListCombined',
131
+ Description: '',
132
+ },
133
+ watch: {
134
+ fieldData() {
135
+ if (this.fieldData) {
136
+ const theFiles = Object.assign([], this.fieldData);
137
+ this.$refs.uploader.files = (theFiles || []);// .sort((a, b) => a.name - b.name);
138
+ }
139
+ },
140
+ },
141
+ });
142
+ </script>