free-fe-core-modules 0.0.15 → 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.
Files changed (58) hide show
  1. package/components/Basic/EIcon.vue +3 -0
  2. package/components/ThemeSwitch/index.vue +18 -7
  3. package/free-field/Fields/AgreementCheck.js +8 -8
  4. package/free-field/Fields/ApiCall.js +1 -1
  5. package/free-field/Fields/Boolean.js +19 -52
  6. package/free-field/Fields/Category.js +1 -1
  7. package/free-field/Fields/Check.js +8 -3
  8. package/free-field/Fields/Column.vue +12 -9
  9. package/free-field/Fields/Customize.js +1 -1
  10. package/free-field/Fields/Date.js +1 -1
  11. package/free-field/Fields/DateRange.js +2 -2
  12. package/free-field/Fields/DynamicList.js +2 -1
  13. package/free-field/Fields/File.vue +393 -0
  14. package/free-field/Fields/FileList.vue +460 -0
  15. package/free-field/Fields/FileListCombined.vue +172 -0
  16. package/free-field/Fields/FixedList.vue +4 -3
  17. package/free-field/Fields/{InputFieldList.vue → FreeFieldList.vue} +34 -11
  18. package/free-field/Fields/Image.vue +361 -0
  19. package/free-field/Fields/ImageList.vue +353 -0
  20. package/free-field/Fields/ImageListCombined.vue +108 -0
  21. package/free-field/Fields/Labels.vue +3 -5
  22. package/free-field/Fields/MixedTable.vue +2 -2
  23. package/free-field/Fields/Number.js +1 -1
  24. package/free-field/Fields/NumberRange.vue +9 -8
  25. package/free-field/Fields/Password.js +1 -1
  26. package/free-field/Fields/Permission.vue +2 -2
  27. package/free-field/Fields/PermissionEditor.vue +2 -2
  28. package/free-field/Fields/QueryFilters.vue +1 -1
  29. package/free-field/Fields/RadioList.vue +3 -3
  30. package/free-field/Fields/Rich.vue +27 -4
  31. package/free-field/Fields/Row.vue +13 -10
  32. package/free-field/Fields/Search.vue +25 -25
  33. package/free-field/Fields/Select.vue +17 -13
  34. package/free-field/Fields/SelectionChain.vue +1 -1
  35. package/free-field/Fields/Separator.js +1 -1
  36. package/free-field/Fields/SingleList.vue +1 -1
  37. package/free-field/Fields/Static.js +1 -1
  38. package/free-field/Fields/String.js +15 -3
  39. package/free-field/Fields/Tabs.vue +9 -9
  40. package/free-field/Fields/Text.js +2 -1
  41. package/free-field/Fields/Time.vue +1 -1
  42. package/free-field/Fields/TimeRange.vue +2 -2
  43. package/free-field/Fields/Year.js +1 -1
  44. package/free-field/Fields/YearRange.vue +2 -2
  45. package/free-field/Fields/index.js +20 -13
  46. package/free-field/composible/fieldWrapper.js +136 -10
  47. package/free-field/composible/useFreeField.js +17 -6
  48. package/free-field/composible/useUploader.js +320 -0
  49. package/free-field/style.scss +173 -0
  50. package/i18n/en-us/index.js +3 -0
  51. package/i18n/fields/en-us/index.js +1 -0
  52. package/i18n/fields/zh-cn/index.js +1 -0
  53. package/i18n/zh-cn/index.js +3 -0
  54. package/index.js +7 -0
  55. package/package.json +1 -1
  56. package/view/menu/index.vue +6 -6
  57. package/view/system/index.vue +1 -1
  58. package/free-field/style.sass +0 -11
@@ -0,0 +1,460 @@
1
+ <template>
2
+ <div class="row free-field-file-list" v-if="Field">
3
+ <span
4
+ :class="`field-label ${(Field.Label && Field.Label.trim().length)
5
+ ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
6
+ v-if="Field.Label !== void 0"
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
+ @added="localFiles.push(...$event)"
20
+ @uploaded="uploaded"
21
+ @removed="removeFile"
22
+ @rejected="filesRejected"
23
+ :factory="factoryFn"
24
+ multiple
25
+ :auto-upload="Field && Field.Options && Field.Options.Auto"
26
+ :max-file-size="maxFileSize"
27
+ :max-total-size="maxTotalSize"
28
+ :accept="acceptedFileTypes"
29
+ :class="`q-ma-xs ${hasError ? 'free-field--error' : ''}`"
30
+ ref="uploader"
31
+ >
32
+ <template v-slot:list="scope">
33
+ <div
34
+ v-if="Field.Options && Field.Options.AsLink && allFiles.length"
35
+ class="file-link row full-width ellipsis items-center"
36
+ >
37
+ <div
38
+ class="row ellipsis full-width"
39
+ v-for="(file, index) in allFiles || []"
40
+ :key="index"
41
+ >
42
+ <q-btn
43
+ icon="cloud_download"
44
+ dense
45
+ flat
46
+ ></q-btn>
47
+ <a
48
+ class="ellipsis"
49
+ target="_blank"
50
+ :href="$filter('serverPath', file.id)"
51
+ :download="file.name"
52
+ >
53
+ {{ file.name }}
54
+ <q-tooltip>{{ file.name }}</q-tooltip>
55
+ </a>
56
+ </div>
57
+ </div>
58
+ <div v-else>
59
+ <div class="uploader-btns row no-wrap items-center">
60
+ <q-spinner
61
+ v-if="scope.isUploading"
62
+ class="q-uploader__spinner"
63
+ />
64
+ <q-btn
65
+ v-if="scope.canAddFiles && !Field.ReadOnly && canHaveMore"
66
+ type="a"
67
+ icon="add_box"
68
+ label="点击添加"
69
+ class="add-btn"
70
+ dense
71
+ flat
72
+ >
73
+ <q-uploader-add-trigger v-if="!Field.ReadOnly" />
74
+ </q-btn>
75
+ <q-btn
76
+ v-if="!Field.ReadOnly
77
+ && scope.canUpload && !(Field && Field.Options && Field.Options.Auto)"
78
+ type="a"
79
+ icon="cloud_upload"
80
+ @click="scope.upload"
81
+ class="upload-btn"
82
+ label="点击上传"
83
+ dense
84
+ flat
85
+ ></q-btn>
86
+
87
+ <q-btn
88
+ v-if="scope.isUploading && !Field.ReadOnly"
89
+ type="a"
90
+ icon="clear"
91
+ @click="scope.abort"
92
+ class="abort-btn"
93
+ round
94
+ dense
95
+ flat
96
+ ></q-btn>
97
+ <slot name="warning"></slot>
98
+ </div>
99
+
100
+ <!-- <div
101
+ v-if="scope.files.length && Field.AsList"
102
+ class="file-list file-list-list"
103
+ >
104
+ <q-list>
105
+ <q-item
106
+ class="file-list-item"
107
+ v-for="(file, index) in scope.files"
108
+ :key="index"
109
+ >
110
+ <span class="file-name full-width ellipsis">
111
+ <a
112
+ target="_blank"
113
+ :href="file.id | serverPath"
114
+ :download="file.name">
115
+ {{ file.name }}
116
+ </a>
117
+ <q-tooltip>{{ file.name }}</q-tooltip>
118
+ </span>
119
+
120
+ <span class="file-size full-width ellipsis">
121
+ Size: {{ file.sizeLabel || file.__sizeLabel }}
122
+ </span>
123
+
124
+ <q-btn
125
+ flat
126
+ dense
127
+ round
128
+ class="delete-btn"
129
+ icon="close"
130
+ @click="scope.removeFile(file)"
131
+ v-if="!Field.ReadOnly"
132
+ />
133
+ </q-item>
134
+ </q-list>
135
+ </div> -->
136
+
137
+ <div
138
+ v-if="allFiles.length"
139
+ class="file-list file-list-card row items-start justify-start q-gutter-xl"
140
+ >
141
+ <q-card
142
+ flat
143
+ class="file-list-item"
144
+ v-for="(file, index) in allFiles || []"
145
+ :key="index"
146
+ >
147
+ <e-icon
148
+ class="file-image"
149
+ :name="fileThumb(file)"
150
+ thumb
151
+ :relative="filePreviewType(file) !== 'image'"
152
+ @click="preview(file)"
153
+ >
154
+ <div class="view-btn-wrapper absolute-full justify-center text-center">
155
+ <q-btn
156
+ flat
157
+ class="view-btn full-height full-width"
158
+ >查看</q-btn>
159
+ </div>
160
+ </e-icon>
161
+ <span class="file-name full-width ellipsis">
162
+ <a
163
+ target="_blank"
164
+ :href="$filter('serverPath', file.id)"
165
+ :download="file.name">
166
+ {{ file.name }}
167
+ </a>
168
+ <q-tooltip>{{ file.name }}</q-tooltip>
169
+ </span>
170
+
171
+ <span class="file-size full-width ellipsis">
172
+ Size: {{ file.sizeLabel || file.__sizeLabel }}
173
+ </span>
174
+
175
+ <q-btn
176
+ flat
177
+ dense
178
+ round
179
+ class="delete-btn"
180
+ icon="close"
181
+ @click="scope.removeFile(file)"
182
+ v-if="!Field.ReadOnly"
183
+ />
184
+ </q-card>
185
+ </div>
186
+ <div
187
+ class="free-field--error-tag"
188
+ v-if="hasError"
189
+ >
190
+ <e-icon name="error"></e-icon>
191
+ </div>
192
+ </div>
193
+ </template>
194
+ </q-uploader>
195
+ <q-dialog
196
+ class="image-preview-dialog"
197
+ flat
198
+ full-width
199
+ full-height
200
+ v-model="showPreview"
201
+ style="background: rgba(0,0,0,0)"
202
+ >
203
+ <div class="image-preview">
204
+ <q-icon name="close"
205
+ class="absolute cursor-pointer bg-white text-primary"
206
+ style="border-radius: 6px;border: 1px solid primary;right: 0;"
207
+ round size="20px"
208
+ @click="showPreview=false"></q-icon>
209
+ <q-img
210
+ v-if="previewType=== 'image'"
211
+ contain
212
+ :src="previewFile"
213
+ @click="showPreview=false"
214
+ style="height: 100%; max-width: 100%;"
215
+ >
216
+ </q-img>
217
+
218
+ <q-pdfviewer
219
+ v-if="previewType === 'pdf'"
220
+ v-model="showPreview"
221
+ @click="showPreview=false"
222
+ :src="previewFile"
223
+ type="pdfjs"
224
+ style="height: 100%; max-width: 100%;"
225
+ />
226
+ </div>
227
+ </q-dialog>
228
+ </div>
229
+ </template>
230
+
231
+ <script>
232
+ import { computed, defineComponent, getCurrentInstance, ref } from 'vue';
233
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
234
+ import { useFormValidator} from '../../composible/useFormValidator';
235
+ import { useUploader } from '../composible/useUploader';
236
+
237
+ export default defineComponent({
238
+ name: 'InputFieldFileList',
239
+ fieldInfo: {
240
+ Category: 'Upload',
241
+ Label: '文件列表',
242
+ Value: 'FileList',
243
+ Extra: [
244
+ {
245
+ Type: 'String',
246
+ Label: '支持的文件类型',
247
+ Name: 'Options.Ext',
248
+ Default: 'pdf,doc,docx',
249
+ },
250
+ {
251
+ Type: 'Boolean',
252
+ Label: '自动上传',
253
+ Name: 'Options.Auto',
254
+ Default: false,
255
+ },
256
+ {
257
+ Type: 'String',
258
+ Label: '最大文件大小',
259
+ Name: 'MaxValue',
260
+ Default: '10m',
261
+ },
262
+ {
263
+ Type: 'String',
264
+ Label: '最大总大小',
265
+ Name: 'Options.MaxTotal',
266
+ Default: '50m',
267
+ },
268
+ {
269
+ Type: 'Number',
270
+ Label: '最多文件个数',
271
+ Name: 'Options.MaxCount',
272
+ MinValue: 1,
273
+ Options: {
274
+ Postfix: '个',
275
+ },
276
+ },
277
+ {
278
+ Type: 'Boolean',
279
+ Label: '紧凑样式',
280
+ Name: 'Options.Dense',
281
+ Default: false,
282
+ },
283
+ {
284
+ Type: 'Boolean',
285
+ Label: '显示为链接',
286
+ Name: 'Options.AsLink',
287
+ Default: false,
288
+ },
289
+ ],
290
+ Description: '',
291
+ },
292
+ props: {
293
+ ...freeFieldProps,
294
+ },
295
+ emits: ['input'],
296
+ setup(props, { expose, emit }) {
297
+ const { proxy:vm } = getCurrentInstance();
298
+ const { fieldData, setFieldData } = useFreeField(props);
299
+ const {
300
+ showPreview,
301
+ previewType,
302
+ previewFile,
303
+ maxFileSize,
304
+ maxTotalSize,
305
+ acceptedFileTypes,
306
+ fileThumb,
307
+ filePreviewType,
308
+ filePreview,
309
+ filesRejected,
310
+ preview,
311
+ } = useUploader(props);
312
+
313
+ const uploader = ref(null);
314
+ const localFiles = ref([]);
315
+ const hasError = ref(false);
316
+
317
+ const selfValidate = () => {
318
+ if (props.Field?.Required) {
319
+ hasError.value = fieldData.value?.length <= 0;
320
+ return fieldData.value?.length > 0;
321
+ }
322
+
323
+ const rules = Array.isArray(typeof props.Field.Rules) ? props.Field.Rules : [props.Field.Rules];
324
+
325
+ let isValid = true;
326
+ for (let i = 0; i < rules.length; i += 1) {
327
+ const r = rules[i];
328
+
329
+ if (typeof r === 'function') {
330
+ isValid = isValid && r(fieldData.value);
331
+ }
332
+ }
333
+
334
+ hasError.value = !isValid;
335
+ return isValid;
336
+ };
337
+
338
+ const factoryFn = () => {
339
+ return {
340
+ url: props.Field.url || `${vm.ctx.config.baseUrl}/upload`,
341
+ fieldName: 'file',
342
+ };
343
+ };
344
+
345
+ const uploaded = (info) => {
346
+ const uploadedFiles = [];
347
+ for (let i = 0; i < info.files.length; i += 1) {
348
+ const file = info.files[i];
349
+
350
+ const { xhr } = file;
351
+ let res;
352
+ if (xhr && xhr.response) {
353
+ if (typeof xhr.response === 'string') {
354
+ //
355
+ res = JSON.parse(xhr.response);
356
+ } else if (typeof xhr.response === 'object') {
357
+ //
358
+ res = xhr.response;
359
+ } else {
360
+ //
361
+ return;
362
+ }
363
+
364
+ if (res && res.msg === 'OK') {
365
+ uploadedFiles.push({
366
+ id: res.data.id,
367
+ // eslint-disable-next-line no-underscore-dangle
368
+ sizeLabel: file.__sizeLabel,
369
+ name: file.name,
370
+ size: file.size,
371
+ type: file.type,
372
+ });
373
+ }
374
+ } else if (file.id) {
375
+ // old files
376
+ uploadedFiles.push(file);
377
+ }
378
+ }
379
+
380
+ localFiles.value = localFiles.value.filter((f) => !info.files.includes(f));
381
+
382
+ setFieldData([
383
+ ...fieldData.value,
384
+ ...uploadedFiles
385
+ ], emit);
386
+ selfValidate();
387
+ }
388
+
389
+ const allFiles = computed(() => {
390
+ // return [
391
+ // // ...fieldData.value || [],
392
+ // ...(uploader.value?.files || []),
393
+ // ];
394
+
395
+ console.log('allFiles', fieldData.value, localFiles.value);
396
+
397
+ return [].concat(fieldData.value || []).concat(localFiles.value)
398
+ });
399
+
400
+
401
+ const { validate } = useFormValidator();
402
+ expose({
403
+ validate,
404
+ });
405
+
406
+ return {
407
+ fieldData,
408
+ setFieldData,
409
+
410
+ showPreview,
411
+ previewType,
412
+ previewFile,
413
+ maxFileSize,
414
+ maxTotalSize,
415
+ acceptedFileTypes,
416
+ fileThumb,
417
+ filePreviewType,
418
+ filePreview,
419
+ filesRejected,
420
+ preview,
421
+ uploader,
422
+ localFiles,
423
+
424
+ hasError,
425
+ selfValidate,
426
+ factoryFn,
427
+ uploaded,
428
+ allFiles,
429
+ canHaveMore: computed(() => {
430
+ if (!fieldData.value?.length) return true;
431
+ if (!props.Field?.Options?.MaxCount) return true;
432
+
433
+ return fieldData.value?.length < props.Field?.Options?.MaxCount;
434
+ }),
435
+ dense: computed(() => props.Field?.dense || props.Field?.Options?.Dense),
436
+ removeFile: (files) => {
437
+ localFiles.value = localFiles.value.filter((f) => !files.includes(f));
438
+ setFieldData(fieldData.value.filter((f) => !files.includes(f)), emit);
439
+ selfValidate();
440
+ },
441
+ };
442
+ },
443
+ });
444
+ </script>
445
+
446
+ <style lang="sass" scoped>
447
+ .file-link
448
+ &>div
449
+ display: inline-block
450
+ white-space: nowrap
451
+ overflow: hidden
452
+ & a
453
+ white-space: nowrap
454
+ overflow: hidden
455
+ </style>
456
+
457
+ <style lang="sass">
458
+ .q-uploader__header
459
+ display: none
460
+ </style>
@@ -0,0 +1,172 @@
1
+ <template>
2
+ <div class="row free-field-file-list combined free-field--readonly" v-if="Field">
3
+ <span
4
+ :class="`field-label ${(Field.Label && Field.Label.trim().length)
5
+ ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
6
+ v-if="Field.Label !== void 0"
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>
20
+ <div
21
+ v-if="fieldData.value?.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 fieldData.value"
28
+ :key="index"
29
+ >
30
+ <span class="file-name full-width ellipsis">
31
+ <a
32
+ target="_blank"
33
+ :href="$filter('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="fieldData.value?.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 fieldData.value"
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="$filter('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-icon name="close"
99
+ class="absolute cursor-pointer bg-white text-primary"
100
+ style="border-radius: 6px;border: 1px solid primary;right: 0;"
101
+ round size="20px"
102
+ @click="showPreview=false"></q-icon>
103
+ <q-img
104
+ v-if="previewType=== 'image'"
105
+ contain
106
+ :src="previewFile"
107
+ @click="showPreview=false"
108
+ style="height: 100%; max-width: 100%;"
109
+ >
110
+ </q-img>
111
+
112
+ <q-pdfviewer
113
+ v-if="previewType === 'pdf'"
114
+ v-model="showPreview"
115
+ @click="showPreview=false"
116
+ :src="previewFile"
117
+ type="pdfjs"
118
+ style="height: 100%; max-width: 100%;"
119
+ />
120
+ </div>
121
+ </q-dialog>
122
+ </div>
123
+ </template>
124
+
125
+ <script>
126
+ import { computed, defineComponent, ref } from 'vue';
127
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
128
+ import { useUploader } from '../composible/useUploader';
129
+
130
+ export default defineComponent({
131
+ name: 'InputFieldFileListCombined',
132
+ fieldInfo: {
133
+ Category: 'Upload',
134
+ Label: '合并文件列表',
135
+ Value: 'FileListCombined',
136
+ Description: '',
137
+ },
138
+ props: {
139
+ ...freeFieldProps,
140
+ },
141
+ setup(props) {
142
+ const { fieldData, setFieldData } = useFreeField(props);
143
+ const {
144
+ showPreview,
145
+ previewType,
146
+ previewFile,
147
+ fileThumb,
148
+ filePreviewType,
149
+ filePreview,
150
+ preview,
151
+ } = useUploader(props);
152
+
153
+ const uploader = ref(null);
154
+
155
+ return {
156
+ fieldData,
157
+ setFieldData,
158
+
159
+ showPreview,
160
+ previewType,
161
+ previewFile,
162
+ fileThumb,
163
+ filePreviewType,
164
+ filePreview,
165
+ preview,
166
+ uploader,
167
+
168
+ dense: computed(() => props.Field?.dense || props.Field?.Options?.Dense),
169
+ };
170
+ },
171
+ });
172
+ </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="input-field-fixed-list row">
2
+ <div class="free-field-fixed-list row">
3
3
  <span
4
4
  :class="`field-label ${(Field.Label && Field.Label.trim().length)
5
5
  ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
@@ -25,7 +25,7 @@
25
25
  <template v-slot:body-cell="props">
26
26
  <q-td
27
27
  :props="props"
28
- style="text-align: center;"
28
+ style="text-align: center;padding:0;margin:0;height:auto;width:auto;"
29
29
  v-if="props.col.List &&
30
30
  (props.col.List.length === 1) &&
31
31
  props.row[props.col.List[0].Name] === 'NaN'"
@@ -37,6 +37,7 @@
37
37
  :colspan="props.value && props.value.colspan || 1"
38
38
  :rowspan="props.value && props.value.rowspan || 1"
39
39
  :class="`items-center justify-center ${tableTdClass(props.rowIndex)}`"
40
+ style="padding:0;margin:0;height:auto;width:auto;"
40
41
  >
41
42
  <span v-if="props.col.List && props.col.List.length > 1" class="full-width full-height">
42
43
  <free-field
@@ -359,7 +360,7 @@ export default defineComponent({
359
360
  });
360
361
  </script>
361
362
  <style lang="sass">
362
- .input-field-fixed-list
363
+ .free-field-fixed-list
363
364
  .field-label
364
365
  margin-top: auto
365
366
  margin-bottom: auto