@5minds/node-red-dashboard-2-processcube-dynamic-form 2.0.8 → 2.1.0-develop-7297c2-mdiwcn5m

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.
@@ -1,29 +1,18 @@
1
1
  <template>
2
- <div style="display: flex; justify-content: space-between; width: 100%">
3
- <div style="display: flex; gap: 8px; flex-wrap: wrap">
2
+ <div class="ui-dynamic-form-footer-actions-container">
3
+ <div class="ui-dynamic-form-footer-actions-left">
4
4
  <div v-for="(action, index) in actions" :key="index">
5
- <v-btn
6
- v-if="action.alignment === 'left' || !action.alignment"
7
- :key="index"
8
- style="min-height: 36px"
9
- :class="getActionButtonClass(action)"
10
- :disabled="formIsFinished"
11
- @click="actionCallback(action)"
12
- >
5
+ <v-btn v-if="action.alignment === 'left' || !action.alignment" :key="index"
6
+ class="ui-dynamic-form-footer-action-button" :class="getActionButtonClass(action)"
7
+ :disabled="formIsFinished" @click="actionCallback(action)">
13
8
  {{ action.label }}
14
9
  </v-btn>
15
10
  </div>
16
11
  </div>
17
- <div style="display: flex; gap: 8px;">
12
+ <div class="ui-dynamic-form-footer-actions-right">
18
13
  <div v-for="(action, index) in actions" :key="index">
19
- <v-btn
20
- v-if="action.alignment === 'right'"
21
- :key="index"
22
- style="min-height: 36px"
23
- :class="getActionButtonClass(action)"
24
- :disabled="formIsFinished"
25
- @click="actionCallback(action)"
26
- >
14
+ <v-btn v-if="action.alignment === 'right'" :key="index" class="ui-dynamic-form-footer-action-button"
15
+ :class="getActionButtonClass(action)" :disabled="formIsFinished" @click="actionCallback(action)">
27
16
  {{ action.label }}
28
17
  </v-btn>
29
18
  </div>
@@ -36,12 +25,12 @@
36
25
  export default {
37
26
  name: 'UIDynamicFormFooterAction',
38
27
  props: {
39
- actions: { type: Array, default () { return [] } },
40
- actionCallback: { type: Function, default (action) {} },
41
- formIsFinished: { type: Boolean, default () { return false } }
28
+ actions: { type: Array, default() { return [] } },
29
+ actionCallback: { type: Function, default(action) { } },
30
+ formIsFinished: { type: Boolean, default() { return false } }
42
31
  },
43
32
  methods: {
44
- getActionButtonClass (action) {
33
+ getActionButtonClass(action) {
45
34
  return action.primary === 'true' ? 'ui-dynamic-form-footer-action-primary' : 'ui-dynamic-form-footer-action-secondary'
46
35
  }
47
36
  }
@@ -1,25 +1,18 @@
1
1
  <template>
2
2
  <div v-if="title.length > 0">
3
- <h3 :class="typeSpecificStyling" style="display: flex; gap: 25px; align-items: center">
4
- <svg
5
- v-if="collapsible && !collapsed"
6
- style="width: 25px; height: 25px; cursor: pointer;"
7
- xmlns="http://www.w3.org/2000/svg"
8
- viewBox="0 0 448 512"
9
- @click="toggleCollapse"
10
- >
11
- <path :fill="style === 'default' ? 'white' : 'black'" d="M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"/>
3
+ <h3 :class="typeSpecificStyling" class="ui-dynamic-form-title-responsive"
4
+ style="display: flex; gap: 25px; align-items: center">
5
+ <svg v-if="collapsible && !collapsed" style="width: 25px; height: 25px; cursor: pointer;"
6
+ xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" @click="toggleCollapse">
7
+ <path :fill="style === 'default' ? 'white' : 'black'"
8
+ d="M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z" />
12
9
  </svg>
13
- <svg
14
- v-if="collapsible && collapsed"
15
- style="width: 25px; height: 25px; cursor: pointer;"
16
- xmlns="http://www.w3.org/2000/svg"
17
- viewBox="0 0 320 512"
18
- @click="toggleCollapse"
19
- >
20
- <path :fill="style === 'default' ? 'white' : 'black'" d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/>
10
+ <svg v-if="collapsible && collapsed" style="width: 25px; height: 25px; cursor: pointer;"
11
+ xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" @click="toggleCollapse">
12
+ <path :fill="style === 'default' ? 'white' : 'black'"
13
+ d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z" />
21
14
  </svg>
22
- <div :style="{width: 'fit-content', display: style === 'default' ? '' : 'flex'}">
15
+ <div :style="{ width: 'fit-content', display: style === 'default' ? '' : 'flex' }">
23
16
  <img v-if="titleIcon.length > 0" :src="titleIcon" style="padding-right: 16px;">
24
17
  <span :style="customStyles">{{ title }}</span>
25
18
  <hr v-if="style === 'default'">
@@ -33,16 +26,16 @@
33
26
  export default {
34
27
  name: 'UIDynamicFormTitleText',
35
28
  props: {
36
- style: { type: String, default () { return 'default' } },
37
- title: { type: String, default () { return '' } },
38
- customStyles: { type: String, default () { return '' } },
39
- collapsible: { type: Boolean, default () { return false } },
40
- collapsed: { type: Boolean, default () { return false } },
41
- titleIcon: { type: String, default () { return '' } },
42
- toggleCollapse: { type: Function, default () {} }
29
+ style: { type: String, default() { return 'default' } },
30
+ title: { type: String, default() { return '' } },
31
+ customStyles: { type: String, default() { return '' } },
32
+ collapsible: { type: Boolean, default() { return false } },
33
+ collapsed: { type: Boolean, default() { return false } },
34
+ titleIcon: { type: String, default() { return '' } },
35
+ toggleCollapse: { type: Function, default() { } }
43
36
  },
44
37
  computed: {
45
- typeSpecificStyling () {
38
+ typeSpecificStyling() {
46
39
  return `ui-dynamic-form-title-${this.style}`
47
40
  }
48
41
  }
@@ -15,9 +15,11 @@
15
15
  :collapsed="collapsed" :toggleCollapse="toggleCollapse" />
16
16
  <Transition name="cardCollapse">
17
17
  <div v-if="!collapsed">
18
- <div className="ui-dynamic-form-formfield-positioner" :style="props.inner_card_styling">
18
+ <div className="ui-dynamic-form-formfield-positioner" :style="props.inner_card_styling"
19
+ :data-columns="props.form_columns || 1">
19
20
  <FormKit id="form" type="group">
20
21
  <v-row v-for="(field, index) in fields()" :key="field"
22
+ :class="field.type === 'header' ? 'ui-dynamic-form-header-row' : ''"
21
23
  :style="getRowWidthStyling(field, index)">
22
24
  <v-col cols="12">
23
25
  <component :is="createComponent(field).type"
@@ -779,7 +781,7 @@ export default {
779
781
  if (field.type === 'header') {
780
782
  style += 'flex-basis: 100%;'
781
783
  } else {
782
- style += `flex-basis: ${(1 / this.props.form_columns) * 100}%;`
784
+ style += `flex-basis: 100%;`
783
785
  }
784
786
  return style
785
787
  },
@@ -130,6 +130,42 @@ code {
130
130
  padding: 8px;
131
131
  }
132
132
 
133
+ .ui-dynamic-form-footer-actions-container {
134
+ display: flex;
135
+ justify-content: space-between;
136
+ align-items: center;
137
+ gap: 12px;
138
+ width: 100%;
139
+ box-sizing: border-box;
140
+ }
141
+
142
+ .ui-dynamic-form-footer-actions-left,
143
+ .ui-dynamic-form-footer-actions-right {
144
+ display: flex;
145
+ gap: 8px;
146
+ align-items: center;
147
+ }
148
+
149
+ .ui-dynamic-form-footer-action-button {
150
+ min-height: 36px;
151
+ padding: 8px 12px;
152
+ box-sizing: border-box;
153
+ flex-shrink: 0;
154
+ }
155
+
156
+ @media screen and (min-width: 600px) {
157
+ .ui-dynamic-form-footer-actions-container {
158
+ flex-wrap: wrap;
159
+ }
160
+
161
+ .ui-dynamic-form-footer-action-button {
162
+ max-width: 200px;
163
+ white-space: nowrap;
164
+ overflow: hidden;
165
+ text-overflow: ellipsis;
166
+ }
167
+ }
168
+
133
169
  .ui-dynamic-form-wrapper {
134
170
  --fk-color-primary: rgb(var(--v-theme-primary)) !important;
135
171
  --fk-color-border: rgb(var(--v-theme-group-outline)); /* Does not work somehow */
@@ -146,6 +182,202 @@ code {
146
182
  }
147
183
  }
148
184
 
185
+ @media only screen and (max-width: 599px) {
186
+ .ui-dynamic-form-external-sizing-wrapper {
187
+ max-width: 100vw;
188
+ margin: 0;
189
+ padding: 0;
190
+ overflow-x: hidden;
191
+ }
192
+
193
+ .ui-dynamic-form-wrapper {
194
+ padding: 8px;
195
+ margin: 0;
196
+ overflow-x: hidden;
197
+ }
198
+
199
+ .ui-dynamic-form-formfield-positioner {
200
+ padding: 16px;
201
+ padding-top: 8px;
202
+ max-height: calc(100vh - 200px);
203
+ column-gap: 0px;
204
+ flex-direction: column;
205
+ border-left: none;
206
+ border-right: none;
207
+ overflow-x: hidden;
208
+ }
209
+
210
+ .ui-dynamic-form-title-default {
211
+ padding: 16px;
212
+ font-size: 24px;
213
+ border-left: none;
214
+ border-right: none;
215
+ }
216
+
217
+ .ui-dynamic-form-title-minimal {
218
+ padding: 12px;
219
+ border-left: none;
220
+ border-right: none;
221
+ }
222
+
223
+ .ui-dynamic-form-title-outside {
224
+ padding: 12px 16px;
225
+ font-size: 20px;
226
+ }
227
+
228
+ .ui-dynamic-form-footer-common {
229
+ padding: 12px 16px;
230
+ gap: 12px;
231
+ margin: 0;
232
+ }
233
+
234
+ .input-light,
235
+ .input-default,
236
+ .input-dark {
237
+ font-size: 16px;
238
+ padding: 12px 8px;
239
+ min-height: 44px;
240
+ }
241
+
242
+ .ui-dynamic-form-input-label {
243
+ font-size: 16px;
244
+ padding-bottom: 8px;
245
+ }
246
+
247
+ .ui-dynamic-form-footer-actions-container {
248
+ flex-direction: column;
249
+ gap: 12px;
250
+ align-items: stretch;
251
+ width: 100%;
252
+ }
253
+
254
+ .ui-dynamic-form-footer-actions-left,
255
+ .ui-dynamic-form-footer-actions-right {
256
+ flex-direction: column;
257
+ gap: 8px;
258
+ width: 100%;
259
+ }
260
+
261
+ .ui-dynamic-form-footer-actions-left > div,
262
+ .ui-dynamic-form-footer-actions-right > div {
263
+ width: 100%;
264
+ }
265
+
266
+ .ui-dynamic-form-footer-action-button {
267
+ min-height: 44px;
268
+ padding: 12px 16px;
269
+ font-size: 16px;
270
+ width: 100%;
271
+ box-sizing: border-box;
272
+ white-space: nowrap;
273
+ overflow: hidden;
274
+ text-overflow: ellipsis;
275
+ }
276
+
277
+ .ui-dynamic-form-footer-action-button .v-btn__content {
278
+ white-space: nowrap !important;
279
+ overflow: hidden !important;
280
+ text-overflow: ellipsis !important;
281
+ max-width: 100% !important;
282
+ display: block !important;
283
+ }
284
+
285
+ .ui-dynamic-form-footer-action-primary,
286
+ .ui-dynamic-form-footer-action-secondary {
287
+ min-height: 44px;
288
+ font-size: 16px;
289
+ width: 100%;
290
+ box-sizing: border-box;
291
+ }
292
+
293
+ .ui-dynamic-form-footer-action-primary .v-btn__content,
294
+ .ui-dynamic-form-footer-action-secondary .v-btn__content {
295
+ white-space: nowrap !important;
296
+ overflow: hidden !important;
297
+ text-overflow: ellipsis !important;
298
+ max-width: 100% !important;
299
+ display: block !important;
300
+ }
301
+
302
+ .ui-dynamic-form-formfield-positioner .v-row {
303
+ margin-bottom: 16px;
304
+ flex-basis: 100% !important;
305
+ }
306
+
307
+ .ui-dynamic-form-formfield-positioner select,
308
+ .ui-dynamic-form-formfield-positioner textarea {
309
+ font-size: 16px;
310
+ min-height: 44px;
311
+ padding: 12px 8px;
312
+ }
313
+
314
+ .ui-dynamic-form-formfield-positioner input[type="checkbox"],
315
+ .ui-dynamic-form-formfield-positioner input[type="radio"] {
316
+ width: 20px;
317
+ height: 20px;
318
+ margin-right: 8px;
319
+ }
320
+
321
+ .ui-dynamic-form-formfield-positioner input[type="file"] {
322
+ font-size: 16px;
323
+ padding: 12px 8px;
324
+ }
325
+
326
+ .ui-dynamic-form-title-default h3 svg,
327
+ .ui-dynamic-form-title-minimal h3 svg,
328
+ .ui-dynamic-form-title-outside h3 svg {
329
+ width: 20px;
330
+ height: 20px;
331
+ }
332
+
333
+ .ui-dynamic-form-title-responsive {
334
+ gap: 15px !important;
335
+ flex-wrap: wrap;
336
+ }
337
+
338
+ .ui-dynamic-form-title-responsive img {
339
+ max-width: 32px;
340
+ height: auto;
341
+ }
342
+
343
+ .ui-dynamic-form-formfield-positioner {
344
+ -webkit-overflow-scrolling: touch;
345
+ }
346
+ }
347
+
348
+ @media only screen and (max-width: 480px) {
349
+ .ui-dynamic-form-formfield-positioner {
350
+ padding: 12px;
351
+ padding-top: 4px;
352
+ }
353
+
354
+ .ui-dynamic-form-title-default {
355
+ padding: 12px;
356
+ font-size: 20px;
357
+ }
358
+
359
+ .ui-dynamic-form-title-outside {
360
+ font-size: 18px;
361
+ }
362
+
363
+ .input-light,
364
+ .input-default,
365
+ .input-dark {
366
+ font-size: 16px;
367
+ padding: 10px 6px;
368
+ }
369
+
370
+ .ui-dynamic-form-input-label {
371
+ font-size: 14px;
372
+ }
373
+
374
+ .ui-dynamic-form-footer-action-button {
375
+ min-height: 48px;
376
+ font-size: 16px;
377
+ padding: 12px 16px;
378
+ }
379
+ }
380
+
149
381
  .cardCollapse-leave-active {
150
382
  transition: max-height 0.5s ease, opacity 0.2s ease;
151
383
  max-height: 100vh;
@@ -176,6 +408,28 @@ code {
176
408
  border-radius: 0px 0px 6px 6px;
177
409
  }
178
410
 
411
+ @media (min-width: 600px) {
412
+ .ui-dynamic-form-formfield-positioner .v-row:not(.ui-dynamic-form-header-row) {
413
+ flex-basis: calc(50% - 10px); /* Default 2 columns, adjust based on form_columns */
414
+ }
415
+
416
+ .ui-dynamic-form-formfield-positioner[data-columns="1"] .v-row:not(.ui-dynamic-form-header-row) {
417
+ flex-basis: 100%;
418
+ }
419
+
420
+ .ui-dynamic-form-formfield-positioner[data-columns="2"] .v-row:not(.ui-dynamic-form-header-row) {
421
+ flex-basis: calc(50% - 10px);
422
+ }
423
+
424
+ .ui-dynamic-form-formfield-positioner[data-columns="3"] .v-row:not(.ui-dynamic-form-header-row) {
425
+ flex-basis: calc(33.333% - 14px);
426
+ }
427
+
428
+ .ui-dynamic-form-formfield-positioner[data-columns="4"] .v-row:not(.ui-dynamic-form-header-row) {
429
+ flex-basis: calc(25% - 15px);
430
+ }
431
+ }
432
+
179
433
  .ui-dynamic-form-formfield-positioner h1,
180
434
  .ui-dynamic-form-formfield-positioner h2,
181
435
  .ui-dynamic-form-formfield-positioner h3 {