free-fe-core-modules 0.0.16 → 0.0.17
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 +3 -0
- package/free-field/Fields/AgreementCheck.js +8 -8
- package/free-field/Fields/ApiCall.js +1 -1
- package/free-field/Fields/Boolean.js +19 -52
- package/free-field/Fields/Category.js +1 -1
- package/free-field/Fields/Check.js +8 -3
- package/free-field/Fields/Column.vue +12 -9
- package/free-field/Fields/Customize.js +1 -1
- package/free-field/Fields/Date.js +1 -1
- package/free-field/Fields/DateRange.js +2 -2
- package/free-field/Fields/DynamicList.js +2 -1
- package/free-field/Fields/File.vue +393 -0
- package/free-field/Fields/FileList.vue +460 -0
- package/free-field/Fields/FileListCombined.vue +172 -0
- package/free-field/Fields/FixedList.vue +4 -3
- package/free-field/Fields/{InputFieldList.vue → FreeFieldList.vue} +34 -11
- package/free-field/Fields/Image.vue +361 -0
- package/free-field/Fields/ImageList.vue +353 -0
- package/free-field/Fields/ImageListCombined.vue +108 -0
- package/free-field/Fields/Labels.vue +3 -5
- package/free-field/Fields/MixedTable.vue +2 -2
- package/free-field/Fields/Number.js +1 -1
- package/free-field/Fields/NumberRange.vue +9 -8
- package/free-field/Fields/Password.js +1 -1
- package/free-field/Fields/Permission.vue +2 -2
- package/free-field/Fields/PermissionEditor.vue +2 -2
- package/free-field/Fields/QueryFilters.vue +1 -1
- package/free-field/Fields/RadioList.vue +3 -3
- package/free-field/Fields/Rich.vue +27 -4
- package/free-field/Fields/Row.vue +13 -10
- package/free-field/Fields/Search.vue +25 -25
- package/free-field/Fields/Select.vue +17 -13
- package/free-field/Fields/SelectionChain.vue +1 -1
- package/free-field/Fields/Separator.js +1 -1
- package/free-field/Fields/SingleList.vue +1 -1
- package/free-field/Fields/Static.js +1 -1
- package/free-field/Fields/String.js +15 -3
- package/free-field/Fields/Tabs.vue +9 -9
- package/free-field/Fields/Text.js +2 -1
- package/free-field/Fields/Time.vue +1 -1
- package/free-field/Fields/TimeRange.vue +2 -2
- package/free-field/Fields/Year.js +1 -1
- package/free-field/Fields/YearRange.vue +2 -2
- package/free-field/Fields/index.js +20 -13
- package/free-field/composible/fieldWrapper.js +136 -10
- package/free-field/composible/useFreeField.js +17 -6
- package/free-field/composible/useUploader.js +320 -0
- package/free-field/style.scss +173 -0
- package/i18n/en-us/index.js +3 -0
- package/i18n/fields/en-us/index.js +1 -0
- package/i18n/fields/zh-cn/index.js +1 -0
- package/i18n/zh-cn/index.js +3 -0
- package/index.js +7 -0
- package/package.json +1 -1
- package/view/menu/index.vue +6 -6
- package/view/system/index.vue +1 -1
- package/free-field/style.sass +0 -11
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="
|
|
2
|
+
<div class="free-field-rich row no-wrap">
|
|
3
3
|
<span
|
|
4
4
|
:class="`field-label ${(Field.Label && Field.Label.trim().length)
|
|
5
5
|
? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
class="required-mark"
|
|
16
16
|
>*</span>
|
|
17
17
|
</span>
|
|
18
|
-
<span class="content relative-position fit" :class="isValid ? '' : '
|
|
18
|
+
<span class="content relative-position fit" :class="isValid ? '' : 'free-field--error'">
|
|
19
19
|
<slot name="warning"></slot>
|
|
20
20
|
|
|
21
|
-
<div class="
|
|
21
|
+
<div class="free-field--error-tag" v-if="!isValid">
|
|
22
22
|
<e-icon name="error"></e-icon>
|
|
23
23
|
</div>
|
|
24
24
|
|
|
@@ -183,6 +183,7 @@ export default defineComponent({
|
|
|
183
183
|
'aligncenter',
|
|
184
184
|
'alignright',
|
|
185
185
|
'alignjustify',
|
|
186
|
+
'indent2em',
|
|
186
187
|
'|',
|
|
187
188
|
'numlist',
|
|
188
189
|
'bullist',
|
|
@@ -244,6 +245,28 @@ export default defineComponent({
|
|
|
244
245
|
};
|
|
245
246
|
|
|
246
247
|
const tinySetup = (editor) => {
|
|
248
|
+
// add button for indent 2ems
|
|
249
|
+
editor.on('init', () => {
|
|
250
|
+
editor.formatter.register('indent2em', {
|
|
251
|
+
block: 'p',
|
|
252
|
+
styles: { 'text-indent': '2em' }
|
|
253
|
+
});
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
editor.ui.registry.addToggleButton('indent2em', {
|
|
257
|
+
tooltip: '首行缩进两个字宽度',
|
|
258
|
+
icon: 'indent',
|
|
259
|
+
onAction: function () {
|
|
260
|
+
editor.execCommand('mceToggleFormat', false, 'indent2em');
|
|
261
|
+
},
|
|
262
|
+
onSetup: function (api) {
|
|
263
|
+
editor.formatter.formatChanged('indent2em', function (state) {
|
|
264
|
+
api.setActive(state);
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// add button for insert field content
|
|
247
270
|
if (props.enableField) {
|
|
248
271
|
editor.ui.registry.addButton('insertFieldButton', {
|
|
249
272
|
text: '数据字段',
|
|
@@ -345,7 +368,7 @@ export default defineComponent({
|
|
|
345
368
|
// .tox-tinymce-aux
|
|
346
369
|
// z-index: 6001 !important
|
|
347
370
|
|
|
348
|
-
.
|
|
371
|
+
.free-field-rich
|
|
349
372
|
.tox-statusbar__branding
|
|
350
373
|
display: none
|
|
351
374
|
.tox-tinymce
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="
|
|
3
|
-
<
|
|
4
|
-
v-for="(field, idx) in Field.Options
|
|
2
|
+
<div class="free-field-row row" :class="rowClasses" v-if="Field">
|
|
3
|
+
<free-field
|
|
4
|
+
v-for="(field, idx) in Field.Options?.List"
|
|
5
5
|
:Field="field"
|
|
6
6
|
:values="fieldData"
|
|
7
7
|
:key="idx"
|
|
8
|
-
@input="$emit('input')"></
|
|
8
|
+
@input="$emit('input')"></free-field>
|
|
9
9
|
</div>
|
|
10
10
|
</template>
|
|
11
11
|
|
|
12
12
|
<script>
|
|
13
|
-
import {
|
|
13
|
+
import { defineComponent } from 'vue';
|
|
14
|
+
import { freeFieldProps } from '../composible/useFreeField';
|
|
14
15
|
|
|
15
|
-
export default {
|
|
16
|
+
export default defineComponent({
|
|
16
17
|
name: 'InputFieldRow',
|
|
17
|
-
|
|
18
|
+
props: {
|
|
19
|
+
...freeFieldProps,
|
|
20
|
+
},
|
|
18
21
|
fieldInfo: {
|
|
19
22
|
Category: 'Container',
|
|
20
23
|
Label: '行',
|
|
@@ -23,7 +26,7 @@ export default {
|
|
|
23
26
|
{
|
|
24
27
|
Label: '不换行',
|
|
25
28
|
Name: 'Options.NoWrap',
|
|
26
|
-
Type: '
|
|
29
|
+
Type: 'Boolean',
|
|
27
30
|
},
|
|
28
31
|
{
|
|
29
32
|
Label: '竖向对齐',
|
|
@@ -116,10 +119,10 @@ export default {
|
|
|
116
119
|
},
|
|
117
120
|
computed: {
|
|
118
121
|
rowClasses() {
|
|
119
|
-
return '';
|
|
122
|
+
return this.Field.Options?.NoWrap ? 'nowrap' : '' + this.Field.Options?.ItemsAlign + ' ' + this.Field.Options?.JustifyAlign;
|
|
120
123
|
},
|
|
121
124
|
},
|
|
122
|
-
};
|
|
125
|
+
});
|
|
123
126
|
</script>
|
|
124
127
|
|
|
125
128
|
<style lang="scss" scoped>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<span class="
|
|
3
|
-
<q-dialog v-model="showSearch" class="
|
|
4
|
-
<q-card class="
|
|
2
|
+
<span class="free-field-search">
|
|
3
|
+
<q-dialog v-model="showSearch" class="free-field-search-dialog" persistent>
|
|
4
|
+
<q-card class="free-field-search-dialog-card">
|
|
5
5
|
<q-toolbar>
|
|
6
6
|
<div class="simple-field full-width">
|
|
7
7
|
<q-input
|
|
@@ -9,24 +9,24 @@
|
|
|
9
9
|
v-model="searchKey"
|
|
10
10
|
hide-bottom-space
|
|
11
11
|
:placeholder="Field &&
|
|
12
|
-
((Field.Options
|
|
12
|
+
((Field.Options?.SearchPlaceholder) || Field.Placeholder)"
|
|
13
13
|
@keydown.enter="search()"
|
|
14
14
|
class="full-width"
|
|
15
15
|
>
|
|
16
16
|
<template v-slot:append>
|
|
17
|
-
<q-btn :class="Field.Options
|
|
17
|
+
<q-btn :class="Field.Options?.SearchBtnClasses" :flat="!Field.Options?.SearchBtn3D" :round="!Field.Options?.SearchBtnRect" icon="search" @click="search()" :disabled="Field.ReadOnly">{{Field.Options.SearchBtnText}}</q-btn>
|
|
18
18
|
</template>
|
|
19
19
|
</q-input>
|
|
20
20
|
</div>
|
|
21
21
|
</q-toolbar>
|
|
22
22
|
|
|
23
23
|
<q-card-section :style="`
|
|
24
|
-
width: ${Field.Options
|
|
25
|
-
max-width: ${Field.Options
|
|
24
|
+
width: ${Field.Options?.Width|| '800px'};
|
|
25
|
+
max-width: ${Field.Options?.MaxWidth|| '80vw'};
|
|
26
26
|
overflow-y: scroll`">
|
|
27
27
|
<q-table
|
|
28
|
-
:flat="Field.Options
|
|
29
|
-
:bordered="Field.Options
|
|
28
|
+
:flat="Field.Options?.Flat"
|
|
29
|
+
:bordered="Field.Options?.Bordered"
|
|
30
30
|
:rows="searchData ? searchData.docs : []"
|
|
31
31
|
:columns="searchColumns"
|
|
32
32
|
row-key="id"
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
>
|
|
38
38
|
<template v-slot:header="props">
|
|
39
39
|
<q-tr :props="props">
|
|
40
|
-
<q-th auto-width v-if="!Field.Options
|
|
40
|
+
<q-th auto-width v-if="!Field.Options?.checkOnRight"/>
|
|
41
41
|
<q-th
|
|
42
42
|
v-for="col in props.cols"
|
|
43
43
|
:key="col.name"
|
|
@@ -45,13 +45,13 @@
|
|
|
45
45
|
>
|
|
46
46
|
{{ col.label }}
|
|
47
47
|
</q-th>
|
|
48
|
-
<q-th auto-width v-if="Field.Options
|
|
48
|
+
<q-th auto-width v-if="Field.Options?.checkOnRight"/>
|
|
49
49
|
</q-tr>
|
|
50
50
|
</template>
|
|
51
51
|
<template v-slot:body="props">
|
|
52
52
|
<q-tr class="table-row">
|
|
53
|
-
<q-td auto-width v-if="!Field.Options
|
|
54
|
-
<q-toggle v-model="props.selected" v-if="Field.Options
|
|
53
|
+
<q-td auto-width v-if="!Field.Options?.checkOnRight">
|
|
54
|
+
<q-toggle v-model="props.selected" v-if="Field.Options?.useToggle"/>
|
|
55
55
|
<q-checkbox v-else v-model="props.selected"></q-checkbox>
|
|
56
56
|
</q-td>
|
|
57
57
|
<q-td
|
|
@@ -62,8 +62,8 @@
|
|
|
62
62
|
>
|
|
63
63
|
{{col.value}}
|
|
64
64
|
</q-td>
|
|
65
|
-
<q-td auto-width v-if="Field.Options
|
|
66
|
-
<q-toggle v-model="props.selected" v-if="Field.Options
|
|
65
|
+
<q-td auto-width v-if="Field.Options?.checkOnRight">
|
|
66
|
+
<q-toggle v-model="props.selected" v-if="Field.Options?.useToggle"/>
|
|
67
67
|
<q-checkbox v-else v-model="props.selected"></q-checkbox>
|
|
68
68
|
</q-td>
|
|
69
69
|
</q-tr>
|
|
@@ -92,12 +92,12 @@
|
|
|
92
92
|
<q-card-actions>
|
|
93
93
|
<div class="buttons row full-width justify-center q-ma-sm">
|
|
94
94
|
<q-btn
|
|
95
|
-
:icon="(Field.Options
|
|
95
|
+
:icon="(Field.Options?.CancelIcon) || 'cancel'"
|
|
96
96
|
class="cancel-btn q-mr-md"
|
|
97
97
|
@click="showSearch = false; searchSelected=originalSelected; $emit('input')"
|
|
98
98
|
>{{$t('cancelButtonText')}}</q-btn>
|
|
99
99
|
<q-btn
|
|
100
|
-
:icon="(Field.Options
|
|
100
|
+
:icon="(Field.Options?.OkIcon) || 'check'"
|
|
101
101
|
class="ok-btn" @click="searchOK">{{$t('okButtonText')}}</q-btn>
|
|
102
102
|
</div>
|
|
103
103
|
</q-card-actions>
|
|
@@ -116,16 +116,16 @@
|
|
|
116
116
|
<span v-if="Field.Required" class="required-mark">*</span>
|
|
117
117
|
</span>
|
|
118
118
|
<span class="readonly-content">
|
|
119
|
-
<span :style="(Field.Info
|
|
119
|
+
<span :style="(Field.Info?.Style) ? Field.Info.Style : ''">{{searchDisplay}}</span>
|
|
120
120
|
</span>
|
|
121
121
|
</span>
|
|
122
122
|
<q-input
|
|
123
123
|
v-else
|
|
124
124
|
modelValue=""
|
|
125
|
-
:type="`${Field
|
|
125
|
+
:type="`${Field?.Multiple ? 'textarea' : ''}`"
|
|
126
126
|
hide-bottom-space
|
|
127
127
|
readonly
|
|
128
|
-
:class="`${Field
|
|
128
|
+
:class="`${Field?.Multiple
|
|
129
129
|
? '' : 'simple-field'} ${searchDisplay ? 'has-data' : 'empty'}`"
|
|
130
130
|
ref="fieldToValid"
|
|
131
131
|
@click="searchKey = '';searchData = {}; showSearch = true"
|
|
@@ -142,13 +142,13 @@
|
|
|
142
142
|
>
|
|
143
143
|
<q-tooltip
|
|
144
144
|
anchor="top right"
|
|
145
|
-
>{{selected[(Field.Options
|
|
146
|
-
{{selected[(Field.Options
|
|
145
|
+
>{{selected[(Field.Options?.SearchDisplayField) || 'id']}}</q-tooltip>
|
|
146
|
+
{{selected[(Field.Options?.SearchDisplayField) || 'id']}}
|
|
147
147
|
</q-chip>
|
|
148
148
|
</template>
|
|
149
149
|
<template v-slot:before>
|
|
150
150
|
<span
|
|
151
|
-
:class="`field-label ${(Field.Label
|
|
151
|
+
:class="`field-label ${(Field.Label?.trim().length)
|
|
152
152
|
? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
|
|
153
153
|
v-if="Field.Label !== void 0"
|
|
154
154
|
>
|
|
@@ -501,11 +501,11 @@ export default defineComponent({
|
|
|
501
501
|
</script>
|
|
502
502
|
|
|
503
503
|
<style lang="sass" scoped>
|
|
504
|
-
.
|
|
504
|
+
.free-field-search-dialog-card
|
|
505
505
|
max-width: unset !important
|
|
506
506
|
max-height: unset !important
|
|
507
507
|
|
|
508
|
-
.
|
|
508
|
+
.free-field-search
|
|
509
509
|
.simple-field
|
|
510
510
|
display: flex
|
|
511
511
|
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<span :class="(Field && Field.AsCheck) ? '
|
|
3
|
-
'
|
|
2
|
+
<span :class="(Field && Field.AsCheck) ? 'free-field-select' :
|
|
3
|
+
'free-field-select simple-field row'">
|
|
4
4
|
<span
|
|
5
5
|
v-if="!Field.AsCheck"
|
|
6
6
|
class="row no-wrap items-center full-width inline-block"
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
|
|
44
44
|
<q-select
|
|
45
45
|
v-else
|
|
46
|
-
popup-content-class="
|
|
46
|
+
popup-content-class="free-field-select-control"
|
|
47
47
|
hide-bottom-space
|
|
48
48
|
:modelValue="fieldData.value"
|
|
49
|
-
@update:modelValue="
|
|
49
|
+
@update:modelValue="selectChanged"
|
|
50
50
|
:options="Field.Options || []"
|
|
51
51
|
option-value="Value"
|
|
52
52
|
option-label="Label"
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
</span>
|
|
105
105
|
<span
|
|
106
106
|
v-else
|
|
107
|
-
class="
|
|
107
|
+
class="free-field-select-ascheck row items-start no-wrap"
|
|
108
108
|
>
|
|
109
109
|
<span
|
|
110
110
|
:class="`field-label ${(Field.Label && Field.Label.trim().length)
|
|
@@ -127,11 +127,11 @@
|
|
|
127
127
|
</div>
|
|
128
128
|
<div
|
|
129
129
|
class="checkbox-list"
|
|
130
|
-
:class="hasError ? '
|
|
130
|
+
:class="hasError ? 'free-field--error' : ''"
|
|
131
131
|
>
|
|
132
132
|
|
|
133
133
|
<div
|
|
134
|
-
class="
|
|
134
|
+
class="free-field--error-tag"
|
|
135
135
|
v-if="hasError"
|
|
136
136
|
>
|
|
137
137
|
<e-icon name="error"></e-icon>
|
|
@@ -311,14 +311,18 @@ export default defineComponent({
|
|
|
311
311
|
validate,
|
|
312
312
|
})
|
|
313
313
|
|
|
314
|
+
const selectChanged = (v) => {
|
|
315
|
+
selfValidate();
|
|
316
|
+
setFieldData(v, emit);
|
|
317
|
+
};
|
|
318
|
+
|
|
314
319
|
const checkChanged = (v) => {
|
|
315
320
|
selfValidate();
|
|
316
321
|
|
|
317
322
|
if (!props.Field.Multiple) {
|
|
318
323
|
checked.value = [v];
|
|
319
324
|
}
|
|
320
|
-
setFieldData(checked.value.join(','));
|
|
321
|
-
emit('input');
|
|
325
|
+
setFieldData(checked.value.join(','), emit);
|
|
322
326
|
};
|
|
323
327
|
|
|
324
328
|
const apiCall = () => {
|
|
@@ -347,8 +351,7 @@ export default defineComponent({
|
|
|
347
351
|
if (d.data && d.data.options) {
|
|
348
352
|
selectOptions.value = d.data.options;
|
|
349
353
|
if (d.data.options.findIndex((o) => o.Value === fieldData.value) < 0) {
|
|
350
|
-
setFieldData(undefined);
|
|
351
|
-
emit('input');
|
|
354
|
+
setFieldData(undefined, emit);
|
|
352
355
|
}
|
|
353
356
|
} else {
|
|
354
357
|
selectOptions.value = [];
|
|
@@ -386,6 +389,7 @@ export default defineComponent({
|
|
|
386
389
|
|
|
387
390
|
readonlyContent,
|
|
388
391
|
|
|
392
|
+
selectChanged,
|
|
389
393
|
checkChanged,
|
|
390
394
|
};
|
|
391
395
|
},
|
|
@@ -393,7 +397,7 @@ export default defineComponent({
|
|
|
393
397
|
</script>
|
|
394
398
|
|
|
395
399
|
<style lang="sass">
|
|
396
|
-
.
|
|
400
|
+
.free-field-select
|
|
397
401
|
.q-field__native
|
|
398
402
|
white-space: nowrap
|
|
399
403
|
&>span
|
|
@@ -402,6 +406,6 @@ export default defineComponent({
|
|
|
402
406
|
.checkbox-list
|
|
403
407
|
position: relative
|
|
404
408
|
margin-left: 12px
|
|
405
|
-
&.
|
|
409
|
+
&.free-field--error
|
|
406
410
|
padding-right: 24px
|
|
407
411
|
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="
|
|
2
|
+
<div class="free-field-select-chain row items-start no-wrap">
|
|
3
3
|
<span
|
|
4
4
|
:class="`field-label ${(Field.Label && Field.Label.trim().length)
|
|
5
5
|
? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, h, computed } from 'vue';
|
|
1
|
+
import { defineComponent, h, computed, getCurrentInstance } from 'vue';
|
|
2
2
|
import { useFreeField, freeFieldProps } from '../composible/useFreeField';
|
|
3
3
|
import { QInput } from 'quasar';
|
|
4
4
|
import ReadonlyContent from '../composible/readonlyContent';
|
|
@@ -44,14 +44,25 @@ export default defineComponent({
|
|
|
44
44
|
},
|
|
45
45
|
],
|
|
46
46
|
Description: '',
|
|
47
|
+
demoField: [{
|
|
48
|
+
Type: 'Category',
|
|
49
|
+
Label: '测试一下字符串',
|
|
50
|
+
},{
|
|
51
|
+
Type: 'String',
|
|
52
|
+
Name: 'MyName',
|
|
53
|
+
}],
|
|
54
|
+
demoData: {
|
|
55
|
+
MyName: 'Tom'
|
|
56
|
+
},
|
|
47
57
|
},
|
|
48
58
|
props: {
|
|
49
59
|
...freeFieldProps,
|
|
50
60
|
},
|
|
51
61
|
emits: ['input'],
|
|
52
|
-
setup(props, { emit, slots, expose }){
|
|
62
|
+
setup(props, { emit, slots, expose, attrs }){
|
|
53
63
|
if (!props.Field) return {};
|
|
54
64
|
|
|
65
|
+
const { proxy:vm } = getCurrentInstance();
|
|
55
66
|
const { fieldData, setFieldData } = useFreeField(props);
|
|
56
67
|
|
|
57
68
|
const readonlyNode = () => h(ReadonlyContent, {
|
|
@@ -77,6 +88,7 @@ export default defineComponent({
|
|
|
77
88
|
// bottomSlots: true,
|
|
78
89
|
hideBottomSpace: true,
|
|
79
90
|
readonly: props.Field?.ReadOnly,
|
|
91
|
+
placeholder: props.Field?.Placeholder || attrs.placeholder || vm.$t(vm.getModule('core-modules').config['defaultInputFieldPlaceholder']),
|
|
80
92
|
|
|
81
93
|
class: 'full-width',
|
|
82
94
|
style: props.Field.Info?.Style,
|
|
@@ -99,7 +111,7 @@ export default defineComponent({
|
|
|
99
111
|
})
|
|
100
112
|
|
|
101
113
|
return () => h('div', {
|
|
102
|
-
class: 'simple-field
|
|
114
|
+
class: 'simple-field free-field-string row items-center no-wrap',
|
|
103
115
|
}, [
|
|
104
116
|
props.Field.ReadOnly ? readonlyNode() : inputNode.value,
|
|
105
117
|
slots.warning && slots.warning(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="
|
|
2
|
+
<div class="free-field-tabs row no-wrap" v-if="Field">
|
|
3
3
|
<span
|
|
4
4
|
:class="`field-label ${(Field.Label && Field.Label.trim().length)
|
|
5
5
|
? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
|
|
@@ -16,20 +16,20 @@
|
|
|
16
16
|
>*</span>
|
|
17
17
|
</span>
|
|
18
18
|
|
|
19
|
-
<div class="col
|
|
19
|
+
<div class="col free-field-tabs-tabs-wrapper">
|
|
20
20
|
<q-tabs
|
|
21
21
|
class="tabs"
|
|
22
22
|
v-model="tab"
|
|
23
23
|
:shrink="true"
|
|
24
24
|
no-caps
|
|
25
|
-
:vertical="Field.Options
|
|
26
|
-
:align="Field.Options
|
|
27
|
-
:dense="Field.Options
|
|
25
|
+
:vertical="Field.Options?.vertical || false"
|
|
26
|
+
:align="Field.Options?.align || 'left'"
|
|
27
|
+
:dense="Field.Options?.dense">
|
|
28
28
|
<q-tab
|
|
29
29
|
v-for="(t, idx) in fieldData.value" :key="idx"
|
|
30
30
|
:name="idx"
|
|
31
|
-
:label="t[Field.Options
|
|
32
|
-
:dense="Field.Options
|
|
31
|
+
:label="t[Field.Options?.LabelField]"
|
|
32
|
+
:dense="Field.Options?.dense">
|
|
33
33
|
</q-tab>
|
|
34
34
|
</q-tabs>
|
|
35
35
|
<q-tab-panels v-model="tab">
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
v-for="(t, idx) in fieldData.value" :key="idx"
|
|
38
38
|
:name="idx">
|
|
39
39
|
<free-field
|
|
40
|
-
v-for="(field, idx) in Field.Options
|
|
40
|
+
v-for="(field, idx) in Field.Options?.List"
|
|
41
41
|
:Field="field"
|
|
42
42
|
:values="t"
|
|
43
43
|
:key="idx"
|
|
@@ -149,7 +149,7 @@ export default defineComponent({
|
|
|
149
149
|
</script>
|
|
150
150
|
|
|
151
151
|
<style lang="scss" scoped>
|
|
152
|
-
.
|
|
152
|
+
.free-field-tabs {
|
|
153
153
|
&-tabs-wrapper {
|
|
154
154
|
margin-left: 12px;
|
|
155
155
|
border: 1px solid rgba($color: #000000, $alpha: 0.12);
|
|
@@ -72,10 +72,11 @@ export default defineComponent({
|
|
|
72
72
|
})
|
|
73
73
|
|
|
74
74
|
return () => h('div', {
|
|
75
|
-
class: '
|
|
75
|
+
class: 'free-field-text',
|
|
76
76
|
}, [
|
|
77
77
|
slots.warning && h('div', {
|
|
78
78
|
class: props.Field.Label ? 'warning-with-label' : 'warning-without-label',
|
|
79
|
+
style: props.Field.Label ? 'margin-left: var(--field-label-width)' : '',
|
|
79
80
|
}, slots.warning()),
|
|
80
81
|
props.Field.ReadOnly ? readonlyNode() : inputNode.value,
|
|
81
82
|
]);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<span class="simple-field
|
|
2
|
+
<span class="simple-field free-field-time row items-center no-wrap">
|
|
3
3
|
<span v-if="Field.ReadOnly">
|
|
4
4
|
<span
|
|
5
5
|
:class="`field-label field-label-readonly ${(Field.Label && Field.Label.trim().length)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<span class="simple-field
|
|
2
|
+
<span class="simple-field free-field-time-range row items-center no-wrap">
|
|
3
3
|
<span v-if="Field.ReadOnly">
|
|
4
4
|
<span
|
|
5
5
|
:class="`field-label field-label-readonly ${(Field.Label && Field.Label.trim().length)
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
</template>
|
|
57
57
|
</q-input>
|
|
58
58
|
|
|
59
|
-
<span class="
|
|
59
|
+
<span class="free-field-range-separator">{{`${Field.Separator || '~'}`}}</span>
|
|
60
60
|
|
|
61
61
|
<q-input
|
|
62
62
|
v-model="max"
|
|
@@ -131,7 +131,7 @@ export default defineComponent({
|
|
|
131
131
|
})
|
|
132
132
|
|
|
133
133
|
return () => h('div', {
|
|
134
|
-
class: 'simple-field
|
|
134
|
+
class: 'simple-field free-field-year row items-center no-wrap',
|
|
135
135
|
}, [
|
|
136
136
|
selectNode.value,
|
|
137
137
|
slots.warning && slots.warning(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<span class="
|
|
2
|
+
<span class="free-field-year-range simple-field">
|
|
3
3
|
<span v-if="Field.ReadOnly">
|
|
4
4
|
<span
|
|
5
5
|
:class="`field-label field-label-readonly ${(Field.Label && Field.Label.trim().length)
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
</span>
|
|
33
33
|
</template>
|
|
34
34
|
</q-select>
|
|
35
|
-
<span class="
|
|
35
|
+
<span class="free-field-range-separator">{{`${Field.Separator || '~'}`}}</span>
|
|
36
36
|
<q-select
|
|
37
37
|
v-model="range.max"
|
|
38
38
|
hide-bottom-space
|
|
@@ -6,6 +6,7 @@ import fCategory from './Category.js';
|
|
|
6
6
|
import fCheck from './Check.js';
|
|
7
7
|
import fLabels from './Labels.vue';
|
|
8
8
|
import fNumber from './Number.js';
|
|
9
|
+
import fNumberRange from './NumberRange.vue';
|
|
9
10
|
import fPermission from './Permission.vue';
|
|
10
11
|
import fSearch from './Search.vue';
|
|
11
12
|
import fText from './Text.js';
|
|
@@ -17,25 +18,27 @@ import fYear from './Year.js';
|
|
|
17
18
|
import fYearRange from './YearRange.vue';
|
|
18
19
|
import fRadioList from './RadioList.vue';
|
|
19
20
|
import fBoolean from './Boolean.js';
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
import fFile from './File.vue';
|
|
22
|
+
import fFileList from './FileList.vue';
|
|
23
|
+
import fFileListCombined from './FileListCombined.vue';
|
|
24
|
+
import fImage from './Image.vue';
|
|
25
|
+
import fImageList from './ImageList.vue';
|
|
26
|
+
import fImageListCombined from './ImageListCombined.vue';
|
|
24
27
|
import fFixedList from './FixedList.vue';
|
|
25
28
|
import fDynamicList from './DynamicList.js';
|
|
26
29
|
import fSingleList from './SingleList.vue';
|
|
27
30
|
import fSelectChain from './SelectionChain.vue';
|
|
28
31
|
import fRich from './Rich.vue';
|
|
29
|
-
import fFieldList from './
|
|
32
|
+
import fFieldList from './FreeFieldList.vue';
|
|
30
33
|
import fMixedTable from './MixedTable.vue';
|
|
31
34
|
import fCustomize from './Customize.js';
|
|
32
35
|
import fAgreementCheck from './AgreementCheck.js';
|
|
33
36
|
import fSeparator from './Separator.js';
|
|
34
37
|
import fQueryFilters from './QueryFilters.vue';
|
|
35
|
-
// import fFileListCombined from './FileListCombined.vue';
|
|
36
|
-
// import fImageListCombined from './ImageListCombined.vue';
|
|
37
38
|
import fApiCall from './ApiCall.js';
|
|
38
39
|
import fTabs from './Tabs.vue';
|
|
40
|
+
import fRow from './Row.vue';
|
|
41
|
+
import fColumn from './Column.vue';
|
|
39
42
|
|
|
40
43
|
export default {
|
|
41
44
|
Static: fStatic,
|
|
@@ -46,6 +49,7 @@ export default {
|
|
|
46
49
|
Check: fCheck,
|
|
47
50
|
Labels: fLabels,
|
|
48
51
|
Number: fNumber,
|
|
52
|
+
NumberRange: fNumberRange,
|
|
49
53
|
Permission: fPermission,
|
|
50
54
|
Search: fSearch,
|
|
51
55
|
Text: fText,
|
|
@@ -57,10 +61,12 @@ export default {
|
|
|
57
61
|
YearRange: fYearRange,
|
|
58
62
|
RadioList: fRadioList,
|
|
59
63
|
Boolean: fBoolean,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
File: fFile,
|
|
65
|
+
FileList: fFileList,
|
|
66
|
+
FileListCombined: fFileListCombined,
|
|
67
|
+
Image: fImage,
|
|
68
|
+
ImageList: fImageList,
|
|
69
|
+
ImageListCombined: fImageListCombined,
|
|
64
70
|
FixedList: fFixedList,
|
|
65
71
|
DynamicList: fDynamicList,
|
|
66
72
|
SingleList: fSingleList,
|
|
@@ -72,8 +78,9 @@ export default {
|
|
|
72
78
|
AgreementCheck: fAgreementCheck,
|
|
73
79
|
Separator: fSeparator,
|
|
74
80
|
QueryFilters: fQueryFilters,
|
|
75
|
-
// FileListCombined: fFileListCombined,
|
|
76
|
-
// ImageListCombined: fImageListCombined,
|
|
77
81
|
ApiCall: fApiCall,
|
|
82
|
+
|
|
78
83
|
Tabs: fTabs,
|
|
84
|
+
Row: fRow,
|
|
85
|
+
Column: fColumn,
|
|
79
86
|
};
|