free-fe-core-modules 0.0.54 → 0.1.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.
- package/components/Basic/EIcon.vue +4 -14
- package/components/Dialog/index.js +1 -1
- package/free-field/Fields/AgreementCheck.js +3 -3
- package/free-field/Fields/DateRange.js +4 -3
- package/free-field/Fields/DynamicList.js +4 -5
- package/free-field/Fields/File.vue +52 -160
- package/free-field/Fields/FileList.vue +47 -156
- package/free-field/Fields/FixedList.vue +17 -49
- package/free-field/Fields/FreeFieldList.vue +17 -64
- package/free-field/Fields/Image.vue +54 -133
- package/free-field/Fields/ImageList.vue +42 -106
- package/free-field/Fields/MixedTable.vue +1 -1
- package/free-field/Fields/Number.js +0 -1
- package/free-field/Fields/Permission.vue +8 -20
- package/free-field/Fields/QueryFilters.vue +4 -8
- package/free-field/Fields/Search.vue +51 -109
- package/free-field/Fields/Select.vue +49 -130
- package/free-field/Fields/SingleList.vue +19 -28
- package/free-field/Fields/YearRange.vue +22 -36
- package/free-field/Fields/pdfviewer.js +5 -6
- package/free-field/composible/fieldWrapper.js +1 -2
- package/free-field/composible/useUploader.js +5 -5
- package/index.js +9 -10
- package/package.json +1 -1
- package/view/dict/index.vue +27 -66
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<span class="e-icon justify-center items-center">
|
|
3
|
-
<q-icon
|
|
4
|
-
|
|
5
|
-
class="full-width full-height"
|
|
6
|
-
:name="name"
|
|
7
|
-
></q-icon>
|
|
8
|
-
<q-img
|
|
9
|
-
v-else
|
|
10
|
-
class="full-width full-height"
|
|
11
|
-
style="display: block;"
|
|
12
|
-
:src="imgPath"
|
|
13
|
-
round
|
|
14
|
-
>
|
|
3
|
+
<q-icon v-if="isIcon" class="full-width full-height" :name="name"></q-icon>
|
|
4
|
+
<q-img v-else class="full-width full-height" style="display: block;" :src="imgPath" round>
|
|
15
5
|
<slot></slot>
|
|
16
6
|
<template v-slot:error v-if="!hideError">
|
|
17
7
|
<div class="error-slot column absolute-full justify-center text-center">
|
|
18
|
-
<span class="no-picture-text full-width">{{noImageText}}</span>
|
|
8
|
+
<span class="no-picture-text full-width">{{ noImageText }}</span>
|
|
19
9
|
</div>
|
|
20
10
|
</template>
|
|
21
11
|
</q-img>
|
|
@@ -23,7 +13,7 @@
|
|
|
23
13
|
</template>
|
|
24
14
|
|
|
25
15
|
<script>
|
|
26
|
-
import { ref, computed, defineComponent, getCurrentInstance, watchEffect
|
|
16
|
+
import { ref, computed, defineComponent, getCurrentInstance, watchEffect } from 'vue';
|
|
27
17
|
|
|
28
18
|
export default defineComponent({
|
|
29
19
|
name: 'EIcon',
|
|
@@ -14,7 +14,7 @@ MsgDialog.install = (app) => {
|
|
|
14
14
|
|
|
15
15
|
dialogApp.config.globalProperties = app.config.globalProperties;
|
|
16
16
|
|
|
17
|
-
const {
|
|
17
|
+
const { ...appContext } = app._context;
|
|
18
18
|
Object.assign(dialogApp._context, appContext);
|
|
19
19
|
|
|
20
20
|
MsgDialogInstance = dialogApp.mount('#free-dialog');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineComponent, h, ref, getCurrentInstance } from 'vue';
|
|
2
|
-
import { QCheckbox } from 'quasar';
|
|
1
|
+
import { defineComponent, h, ref, getCurrentInstance, defineExpose } from 'vue';
|
|
2
|
+
import { QCheckbox, QIcon } from 'quasar';
|
|
3
3
|
import { useFreeField, freeFieldProps } from '../composible/useFreeField';
|
|
4
4
|
|
|
5
5
|
export default defineComponent({
|
|
@@ -21,7 +21,7 @@ export default defineComponent({
|
|
|
21
21
|
...freeFieldProps,
|
|
22
22
|
},
|
|
23
23
|
emits: ['input'],
|
|
24
|
-
setup(props, { emit
|
|
24
|
+
setup(props, { emit }){
|
|
25
25
|
if (!props.Field) return {};
|
|
26
26
|
|
|
27
27
|
const { proxy:vm } = getCurrentInstance();
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ref, defineComponent, getCurrentInstance, h, computed, watch, watchEffect } from 'vue';
|
|
2
2
|
import { QInput, QIcon, QPopupProxy, QDate } from 'quasar';
|
|
3
|
-
import { useFreeField, freeFieldProps } from '../composible/useFreeField';
|
|
4
|
-
import freeFieldLabel from '../composible/freeFieldLabel';
|
|
5
|
-
import { useFormValidator} from '../../composible/useFormValidator';
|
|
3
|
+
import { useFreeField, freeFieldProps } from '../composible/useFreeField.js';
|
|
4
|
+
import freeFieldLabel from '../composible/freeFieldLabel.js';
|
|
5
|
+
import { useFormValidator} from '../../composible/useFormValidator.js';
|
|
6
|
+
import ReadonlyContent from '../composible/readonlyContent.js';
|
|
6
7
|
|
|
7
8
|
export default defineComponent({
|
|
8
9
|
name: 'InputFieldDateRange',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ref, defineComponent,
|
|
1
|
+
import { ref, defineComponent, h, computed, watchEffect } from 'vue';
|
|
2
2
|
import { QTable, QTh, QTd, QTr, QIcon } from 'quasar';
|
|
3
3
|
import { useFreeField, freeFieldProps } from '../composible/useFreeField';
|
|
4
4
|
import freeFieldLabel from '../composible/freeFieldLabel';
|
|
@@ -17,7 +17,7 @@ export default defineComponent({
|
|
|
17
17
|
Options: {
|
|
18
18
|
Columns: [{
|
|
19
19
|
Label: '第一列',
|
|
20
|
-
|
|
20
|
+
Fields: [{
|
|
21
21
|
Name: 'CA',
|
|
22
22
|
Placeholder: '请填写',
|
|
23
23
|
Type: 'Number',
|
|
@@ -25,7 +25,7 @@ export default defineComponent({
|
|
|
25
25
|
}],
|
|
26
26
|
}, {
|
|
27
27
|
Label: '第二列',
|
|
28
|
-
|
|
28
|
+
Fields: [{
|
|
29
29
|
Name: 'CB',
|
|
30
30
|
Type: 'String',
|
|
31
31
|
}],
|
|
@@ -247,7 +247,6 @@ export default defineComponent({
|
|
|
247
247
|
const showCell = (p) => {
|
|
248
248
|
const colNum = Number(p.col.name);
|
|
249
249
|
|
|
250
|
-
// eslint-disable-next-line no-restricted-globals
|
|
251
250
|
if (isNaN(colNum)) return true;
|
|
252
251
|
|
|
253
252
|
if (p.row.rowSize !== void 0) {
|
|
@@ -302,7 +301,7 @@ export default defineComponent({
|
|
|
302
301
|
align : 'center',
|
|
303
302
|
sortable : true,
|
|
304
303
|
classes : 'index',
|
|
305
|
-
|
|
304
|
+
Fields: [{
|
|
306
305
|
Name: 'index',
|
|
307
306
|
Type: 'Number',
|
|
308
307
|
required : true,
|
|
@@ -1,92 +1,40 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="row free-field-file" v-if="Field">
|
|
3
|
-
<span
|
|
4
|
-
:
|
|
5
|
-
|
|
6
|
-
|
|
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>
|
|
3
|
+
<span :class="`field-label ${(Field.Label && Field.Label.trim().length)
|
|
4
|
+
? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`" v-if="Field.Label !== void 0">
|
|
5
|
+
<q-tooltip v-if="Field.Description" anchor="top right">{{ Field.Description }}</q-tooltip>
|
|
6
|
+
{{ Field.Label || '' }}
|
|
7
|
+
<span v-if="Field.Required" class="required-mark">*</span>
|
|
17
8
|
</span>
|
|
18
9
|
|
|
19
|
-
<q-uploader
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@rejected="filesRejected"
|
|
23
|
-
ref="uploader"
|
|
24
|
-
:factory="factoryFn"
|
|
25
|
-
auto-upload
|
|
26
|
-
:max-file-size="maxFileSize"
|
|
27
|
-
:accept="acceptedFileTypes"
|
|
28
|
-
:class="`q-ma-xs ${hasError ? 'free-field--error' : ''}`"
|
|
29
|
-
>
|
|
10
|
+
<q-uploader @uploaded="uploaded" @removed="removeFile" @rejected="filesRejected" ref="uploader" :factory="factoryFn"
|
|
11
|
+
auto-upload :max-file-size="maxFileSize" :accept="acceptedFileTypes"
|
|
12
|
+
:class="`q-ma-xs ${hasError ? 'free-field--error' : ''}`">
|
|
30
13
|
<template v-slot:list="scope">
|
|
31
|
-
<div
|
|
32
|
-
|
|
33
|
-
class="
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class="row ellipsis full-width"
|
|
37
|
-
v-for="(file, index) in fieldData.value"
|
|
38
|
-
:key="index"
|
|
39
|
-
>
|
|
40
|
-
<q-btn
|
|
41
|
-
icon="cloud_download"
|
|
42
|
-
dense
|
|
43
|
-
flat
|
|
44
|
-
></q-btn>
|
|
45
|
-
<a
|
|
46
|
-
class="ellipsis"
|
|
47
|
-
target="_blank"
|
|
48
|
-
:href="$filter('serverPath', file.id)"
|
|
49
|
-
:download="file.name"
|
|
50
|
-
>
|
|
14
|
+
<div v-if="Field.Options && Field.Options.AsLink && !!fieldData.value?.id"
|
|
15
|
+
class="file-link row full-width ellipsis items-center">
|
|
16
|
+
<div class="row ellipsis full-width" v-for="(file, index) in fieldData.value" :key="index">
|
|
17
|
+
<q-btn icon="cloud_download" dense flat></q-btn>
|
|
18
|
+
<a class="ellipsis" target="_blank" :href="$filter('serverPath', file.id)" :download="file.name">
|
|
51
19
|
{{ file.name }}
|
|
52
20
|
<q-tooltip>{{ file.name }}</q-tooltip>
|
|
53
21
|
</a>
|
|
54
22
|
</div>
|
|
55
23
|
</div>
|
|
56
24
|
<div v-else>
|
|
57
|
-
<div
|
|
58
|
-
|
|
59
|
-
v-if="!dense
|
|
60
|
-
|
|
61
|
-
<q-spinner
|
|
62
|
-
v-if="scope.isUploading"
|
|
63
|
-
class="q-uploader__spinner"
|
|
64
|
-
/>
|
|
65
|
-
<q-btn
|
|
66
|
-
v-if="!scope.isUploading && !Field.ReadOnly"
|
|
67
|
-
type="a"
|
|
68
|
-
icon="cloud_upload"
|
|
69
|
-
dense
|
|
70
|
-
flat
|
|
71
|
-
class="upload-btn"
|
|
72
|
-
label="点击上传"
|
|
73
|
-
>
|
|
25
|
+
<div class="uploader-btns row no-wrap items-center" v-if="!dense">
|
|
26
|
+
<q-spinner v-if="scope.isUploading" class="q-uploader__spinner" />
|
|
27
|
+
<q-btn v-if="!scope.isUploading && !Field.ReadOnly" type="a" icon="cloud_upload" dense flat
|
|
28
|
+
class="upload-btn" label="点击上传">
|
|
74
29
|
<q-uploader-add-trigger v-if="!Field.ReadOnly" />
|
|
75
30
|
</q-btn>
|
|
76
|
-
<q-btn
|
|
77
|
-
|
|
78
|
-
icon="clear"
|
|
79
|
-
@click="scope.abort"
|
|
80
|
-
class="clear-btn"
|
|
81
|
-
round
|
|
82
|
-
dense
|
|
83
|
-
flat
|
|
84
|
-
></q-btn>
|
|
31
|
+
<q-btn v-if="scope.isUploading && !Field.ReadOnly" icon="clear" @click="scope.abort" class="clear-btn" round
|
|
32
|
+
dense flat></q-btn>
|
|
85
33
|
<slot name="warning"></slot>
|
|
86
34
|
</div>
|
|
87
35
|
|
|
88
|
-
<q-item v-if="dense && fieldData.value?.
|
|
89
|
-
<q-item-section v-if="fieldData.value?.
|
|
36
|
+
<q-item v-if="dense && fieldData.value?.id">
|
|
37
|
+
<q-item-section v-if="fieldData.value?.id && fieldData.value.name">
|
|
90
38
|
<q-item-label class="full-width ellipsis">
|
|
91
39
|
{{ fieldData.value.name }}
|
|
92
40
|
<q-tooltip>{{ fieldData.value.name }}</q-tooltip>
|
|
@@ -94,113 +42,58 @@
|
|
|
94
42
|
</q-item-section>
|
|
95
43
|
|
|
96
44
|
<q-item-section side>
|
|
97
|
-
<q-btn
|
|
98
|
-
|
|
99
|
-
type="a"
|
|
100
|
-
icon="cloud_upload"
|
|
101
|
-
class="upload-btn"
|
|
102
|
-
dense
|
|
103
|
-
flat
|
|
104
|
-
>
|
|
45
|
+
<q-btn v-if="!scope.isUploading && !Field.ReadOnly" type="a" icon="cloud_upload" class="upload-btn" dense
|
|
46
|
+
flat>
|
|
105
47
|
<q-uploader-add-trigger v-if="!Field.ReadOnly" />
|
|
106
48
|
</q-btn>
|
|
107
49
|
</q-item-section>
|
|
108
50
|
</q-item>
|
|
109
51
|
|
|
110
|
-
<div
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
<q-card
|
|
115
|
-
flat
|
|
116
|
-
class="file-list-item"
|
|
117
|
-
v-for="(file, index) in fieldData.value"
|
|
118
|
-
:key="index"
|
|
119
|
-
>
|
|
120
|
-
<e-icon
|
|
121
|
-
class="file-image"
|
|
122
|
-
:name="fileThumb(file)"
|
|
123
|
-
thumb
|
|
124
|
-
:relative="filePreviewType(file) !== 'image'"
|
|
125
|
-
@click="preview(file)"
|
|
126
|
-
>
|
|
52
|
+
<div v-else-if="!!fieldData.value?.id" class="file-list row items-start justify-start">
|
|
53
|
+
<q-card flat class="file-list-item">
|
|
54
|
+
<e-icon class="file-image" :name="fileThumb(fieldData.value)" thumb
|
|
55
|
+
:relative="filePreviewType(fieldData.value) !== 'image'" @click="preview(fieldData.value)">
|
|
127
56
|
<div class="view-btn-wrapper absolute-full justify-center text-center">
|
|
128
|
-
<q-btn
|
|
129
|
-
flat
|
|
130
|
-
class="view-btn full-height full-width"
|
|
131
|
-
>查看</q-btn>
|
|
57
|
+
<q-btn flat class="view-btn full-height full-width">查看</q-btn>
|
|
132
58
|
</div>
|
|
133
59
|
</e-icon>
|
|
134
60
|
<span class="file-name full-width ellipsis">
|
|
135
|
-
<a
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
:href="$filter('serverPath', file.id)"
|
|
139
|
-
:download="file.name">
|
|
140
|
-
{{ file.name }}
|
|
61
|
+
<a v-if="fieldData.value && fieldData.value.id" target="_blank"
|
|
62
|
+
:href="$filter('serverPath', fieldData.value.id)" :download="fieldData.value.name">
|
|
63
|
+
{{ fieldData.value.name }}
|
|
141
64
|
</a>
|
|
142
|
-
<span v-else-if="
|
|
143
|
-
{{
|
|
65
|
+
<span v-else-if="fieldData.value && fieldData.value.name">
|
|
66
|
+
{{ fieldData.value.name }}
|
|
144
67
|
</span>
|
|
145
|
-
<q-tooltip>{{
|
|
68
|
+
<q-tooltip>{{ fieldData.value.name }}</q-tooltip>
|
|
146
69
|
</span>
|
|
147
70
|
|
|
148
71
|
<span class="file-size full-width ellipsis">
|
|
149
|
-
Size: {{
|
|
72
|
+
Size: {{ fieldData.value.sizeLabel || fieldData.value.__sizeLabel }}
|
|
150
73
|
</span>
|
|
151
74
|
|
|
152
|
-
<q-btn
|
|
153
|
-
|
|
154
|
-
dense
|
|
155
|
-
round
|
|
156
|
-
class="delete-btn"
|
|
157
|
-
icon="close"
|
|
158
|
-
@click="scope.removeFile(file)"
|
|
159
|
-
v-if="!Field.ReadOnly"
|
|
160
|
-
/>
|
|
75
|
+
<q-btn flat dense round class="delete-btn" icon="close" @click="scope.removeFile(fieldData.value)"
|
|
76
|
+
v-if="!Field.ReadOnly" />
|
|
161
77
|
</q-card>
|
|
162
78
|
</div>
|
|
163
|
-
<div
|
|
164
|
-
class="free-field--error-tag"
|
|
165
|
-
v-if="hasError"
|
|
166
|
-
>
|
|
79
|
+
<div class="free-field--error-tag" v-if="hasError">
|
|
167
80
|
<e-icon name="error"></e-icon>
|
|
168
81
|
</div>
|
|
169
82
|
</div>
|
|
170
83
|
</template>
|
|
171
84
|
</q-uploader>
|
|
172
|
-
<q-dialog
|
|
173
|
-
|
|
174
|
-
flat
|
|
175
|
-
full-width
|
|
176
|
-
full-height
|
|
177
|
-
v-model="showPreview"
|
|
178
|
-
style="background: rgba(0,0,0,0)"
|
|
179
|
-
>
|
|
85
|
+
<q-dialog class="image-preview-dialog" flat full-width full-height v-model="showPreview"
|
|
86
|
+
style="background: rgba(0,0,0,0)">
|
|
180
87
|
<div class="image-preview">
|
|
181
|
-
<q-icon name="close"
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<q-img
|
|
187
|
-
v-if="previewType=== 'image'"
|
|
188
|
-
contain
|
|
189
|
-
:src="previewFile"
|
|
190
|
-
@click="showPreview=false"
|
|
191
|
-
style="height: 100%; max-width: 100%;"
|
|
192
|
-
>
|
|
88
|
+
<q-icon name="close" class="absolute cursor-pointer bg-white text-primary"
|
|
89
|
+
style="border-radius: 6px;border: 1px solid primary;right: 0;" round size="20px"
|
|
90
|
+
@click="showPreview = false"></q-icon>
|
|
91
|
+
<q-img v-if="previewType === 'image'" fit="contain" :src="previewFile" @click="showPreview = false"
|
|
92
|
+
style="height: 100%; max-width: 100%;">
|
|
193
93
|
</q-img>
|
|
194
94
|
|
|
195
|
-
<pdf-viewer
|
|
196
|
-
|
|
197
|
-
v-model="showPreview"
|
|
198
|
-
@click="showPreview=false"
|
|
199
|
-
:src="previewFile"
|
|
200
|
-
:version="Field?.Options?.PdfViewerVersion"
|
|
201
|
-
type="pdfjs"
|
|
202
|
-
style="height: 100%; max-width: 100%;"
|
|
203
|
-
/>
|
|
95
|
+
<pdf-viewer v-if="previewType === 'pdf'" v-model="showPreview" @click="showPreview = false" :src="previewFile"
|
|
96
|
+
:version="Field?.Options?.PdfViewerVersion" type="pdfjs" style="height: 100%; max-width: 100%;" />
|
|
204
97
|
</div>
|
|
205
98
|
</q-dialog>
|
|
206
99
|
</div>
|
|
@@ -208,10 +101,10 @@
|
|
|
208
101
|
|
|
209
102
|
<script>
|
|
210
103
|
import { computed, defineComponent, getCurrentInstance, ref } from 'vue';
|
|
211
|
-
import { useFreeField, freeFieldProps } from '../composible/useFreeField';
|
|
212
|
-
import { useFormValidator} from '../../composible/useFormValidator';
|
|
213
|
-
import { useUploader } from '../composible/useUploader';
|
|
214
|
-
import PdfViewer from './pdfviewer';
|
|
104
|
+
import { useFreeField, freeFieldProps } from '../composible/useFreeField.js';
|
|
105
|
+
import { useFormValidator} from '../../composible/useFormValidator.js';
|
|
106
|
+
import { useUploader } from '../composible/useUploader.js';
|
|
107
|
+
import PdfViewer from './pdfviewer.js';
|
|
215
108
|
|
|
216
109
|
export default defineComponent({
|
|
217
110
|
name: 'InputFieldFile',
|
|
@@ -282,7 +175,7 @@ export default defineComponent({
|
|
|
282
175
|
|
|
283
176
|
const selfValidate = () => {
|
|
284
177
|
if (props.Field?.Required) {
|
|
285
|
-
hasError.value =
|
|
178
|
+
hasError.value = !fieldData.value?.id;
|
|
286
179
|
return !!fieldData.value?.id;
|
|
287
180
|
}
|
|
288
181
|
|
|
@@ -331,7 +224,6 @@ export default defineComponent({
|
|
|
331
224
|
if (res && res.msg === 'OK') {
|
|
332
225
|
setFieldData({
|
|
333
226
|
id: res.data.id,
|
|
334
|
-
// eslint-disable-next-line no-underscore-dangle
|
|
335
227
|
sizeLabel: file.__sizeLabel,
|
|
336
228
|
name: file.name,
|
|
337
229
|
size: file.size,
|