@vcmap/ui 5.0.0-rc.21 → 5.0.0-rc.22

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 (101) hide show
  1. package/build/buildHelpers.js +1 -0
  2. package/build/commonViteConfig.js +1 -0
  3. package/config/www.config.json +25 -14
  4. package/dist/assets/cesium.js +1 -1
  5. package/dist/assets/{core.59d4d1.js → core.a66593.js} +2443 -2457
  6. package/dist/assets/core.js +1 -1
  7. package/dist/assets/favicon.decf54cc.svg +10 -0
  8. package/dist/assets/{index.a3861d4e.js → index.8b833ead.js} +1 -1
  9. package/dist/assets/{ol.c1c512.js → ol.d4539f.js} +12406 -12152
  10. package/dist/assets/ol.js +1 -1
  11. package/dist/assets/ui.d760e4.css +5 -0
  12. package/dist/assets/{ui.80175f.js → ui.d760e4.js} +5218 -4240
  13. package/dist/assets/ui.js +1 -1
  14. package/dist/assets/vue.js +2 -2
  15. package/dist/assets/vuetify.427322.css +5 -0
  16. package/dist/assets/{vuetify.efc158.js → vuetify.427322.js} +1 -1
  17. package/dist/assets/vuetify.js +2 -2
  18. package/dist/index.html +6 -1
  19. package/index.html +5 -0
  20. package/index.js +2 -1
  21. package/lib/olLib.js +15 -1
  22. package/package.json +4 -3
  23. package/plugins/@vcmap/project-selector/ProjectSelectorComponent.vue +1 -1
  24. package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +10 -4
  25. package/plugins/@vcmap-show-case/form-inputs-example/FormInputsExample.vue +75 -81
  26. package/plugins/@vcmap-show-case/form-inputs-example/index.js +7 -3
  27. package/plugins/@vcmap-show-case/form-inputs-example/validation.js +1 -1
  28. package/plugins/@vcmap-show-case/list-example/ListExample.vue +5 -2
  29. package/plugins/@vcmap-show-case/wizard-example/wizardExample.vue +57 -23
  30. package/plugins/package.json +2 -1
  31. package/src/application/VcsApp.vue +13 -5
  32. package/src/application/VcsAttributions.vue +2 -3
  33. package/src/application/VcsAttributionsFooter.vue +10 -16
  34. package/src/application/VcsNavbar.vue +1 -2
  35. package/src/application/VcsSettings.vue +21 -8
  36. package/src/assets/favicon-128.png +0 -0
  37. package/src/assets/favicon-180.png +0 -0
  38. package/src/assets/favicon-192.png +0 -0
  39. package/src/assets/favicon-32.png +0 -0
  40. package/src/assets/favicon.svg +10 -0
  41. package/src/components/buttons/VcsButton.vue +2 -3
  42. package/src/components/form-inputs-controls/VcsCheckbox.vue +46 -26
  43. package/src/components/form-inputs-controls/VcsFormSection.vue +15 -13
  44. package/src/components/form-inputs-controls/VcsLabel.vue +10 -1
  45. package/src/components/form-inputs-controls/VcsRadio.vue +38 -18
  46. package/src/components/form-inputs-controls/VcsSelect.vue +117 -59
  47. package/src/components/form-inputs-controls/VcsTextArea.vue +101 -60
  48. package/src/components/form-inputs-controls/VcsTextField.vue +171 -69
  49. package/src/components/form-inputs-controls/VcsWizard.vue +20 -14
  50. package/src/components/form-inputs-controls/VcsWizardStep.vue +18 -16
  51. package/src/components/form-inputs-controls/composables.js +26 -0
  52. package/src/components/form-output/VcsFormattedNumber.vue +1 -1
  53. package/src/components/icons/2DDistanceIcon.vue +0 -3
  54. package/src/components/icons/3DDistanceIcon.vue +0 -3
  55. package/src/components/icons/3DHeightIcon.vue +0 -3
  56. package/src/components/icons/CheckboxCheckedIcon.vue +4 -11
  57. package/src/components/icons/CheckboxIcon.vue +9 -2
  58. package/src/components/icons/CheckboxIndeterminateIcon.vue +4 -21
  59. package/src/components/icons/CommentIcon.vue +1 -5
  60. package/src/components/icons/ObliqueViewIcon.vue +6 -8
  61. package/src/components/icons/SimpleCircleOutlinedIcon.vue +1 -1
  62. package/src/components/icons/SplitViewIcon.vue +0 -4
  63. package/src/components/icons/ToolsIcon.vue +2 -4
  64. package/src/components/lists/VcsActionList.vue +0 -1
  65. package/src/components/lists/VcsList.vue +6 -25
  66. package/src/components/lists/VcsTreeview.vue +2 -2
  67. package/src/components/lists/VcsTreeviewLeaf.vue +3 -9
  68. package/src/components/lists/VcsTreeviewSearchbar.vue +4 -4
  69. package/src/components/notification/VcsBadge.vue +6 -2
  70. package/src/components/notification/VcsHelp.vue +39 -0
  71. package/src/components/tables/VcsTable.vue +70 -24
  72. package/src/featureInfo/AddressBalloonComponent.vue +1 -1
  73. package/src/featureInfo/BalloonComponent.vue +14 -9
  74. package/src/featureInfo/featureInfo.js +25 -7
  75. package/src/featureInfo/tableFeatureInfoView.js +4 -0
  76. package/src/i18n/de.js +5 -1
  77. package/src/i18n/en.js +5 -1
  78. package/src/legend/styleLegendItem.vue +24 -2
  79. package/src/legend/vcsLegend.vue +24 -31
  80. package/src/manager/toolbox/GroupToolboxComponent.vue +2 -3
  81. package/src/manager/toolbox/SelectToolboxComponent.vue +11 -5
  82. package/src/manager/toolbox/ToolboxManager.vue +0 -7
  83. package/src/manager/window/WindowComponent.vue +0 -1
  84. package/src/manager/window/WindowComponentHeader.vue +2 -2
  85. package/src/navigation/overviewMap.js +6 -15
  86. package/src/navigation/tiltSlider.vue +30 -6
  87. package/src/search/resultsComponent.vue +0 -1
  88. package/src/search/search.js +7 -17
  89. package/src/search/searchComponent.vue +6 -7
  90. package/src/styles/_theming.scss +72 -3
  91. package/src/styles/_typography.scss +0 -5
  92. package/src/styles/main.scss +1 -0
  93. package/src/styles/shades.scss +2 -0
  94. package/src/styles/variables.scss +40 -4
  95. package/src/uiConfig.js +1 -0
  96. package/src/vcsUiApp.js +5 -0
  97. package/src/vuePlugins/vuetify.js +59 -13
  98. package/dist/assets/ui.80175f.css +0 -1
  99. package/dist/assets/vuetify.efc158.css +0 -5
  100. /package/dist/assets/{cesium.49585c.js → cesium.88cffd.js} +0 -0
  101. /package/dist/assets/{vue.a08ab1.js → vue.db5102.js} +0 -0
@@ -3,30 +3,31 @@
3
3
  :tooltip-position="tooltipPosition"
4
4
  :tooltip="errorMessage"
5
5
  color="error"
6
+ :max-width="200"
6
7
  >
7
8
  <template #activator="{ on, attrs }">
8
9
  <span v-on="on">
9
10
  <v-radio-group
11
+ ref="radioGroup"
10
12
  hide-details
11
13
  class="w-full vcs-radio-group"
12
- :dense="$attrs.dense!==false"
14
+ :dense="isDense"
13
15
  :ripple="false"
14
16
  v-bind="{...$attrs, ...attrs}"
15
17
  v-on="{...$listeners, ...on}"
16
- @update:error="setError"
17
18
  >
18
19
  <v-radio
19
20
  v-for="(item, idx) in items"
20
21
  :id="`radio-${idx}`"
21
22
  :key="`radio-${idx}`"
22
23
  :ripple="false"
23
- :color="item.color ?? 'secondary'"
24
24
  :value="item.value ?? item"
25
25
  :disabled="item.disabled ?? false"
26
- :class="$attrs.dense!==false ? 'vcs-radio-dense' : 'vcs-radio'"
26
+ class="ma-0"
27
+ :class="isDense ? 'vcs-radio-dense' : 'vcs-radio'"
27
28
  >
28
29
  <template #label>
29
- <VcsLabel :html-for="`radio-${idx}`" :dense="!!$attrs.dense">
30
+ <VcsLabel :html-for="`radio-${idx}`" :dense="isDense">
30
31
  {{ $t(item.label ?? item) }}
31
32
  </VcsLabel>
32
33
  </template>
@@ -38,11 +39,12 @@
38
39
  </template>
39
40
  <style lang="scss" scoped>
40
41
  @import "../../styles/vcsFont";
42
+ @import '../../styles/shades.scss';
41
43
  .v-input--radio-group--column .v-radio:not(:last-child):not(:only-child) {
42
44
  margin-bottom: 0;
43
45
  }
44
- .v-input{
45
- &.vcs-radio-group{
46
+ .v-input {
47
+ &.vcs-radio-group {
46
48
  ::v-deep {
47
49
  margin-top: 0;
48
50
  padding-top: 0;
@@ -50,19 +52,35 @@
50
52
  .v-icon.v-icon{
51
53
  font-size: $base-font-size;
52
54
  color: inherit;
55
+ &.theme--light{
56
+ color: map-get($shades, 'black') !important;
57
+ &.error--text{
58
+ color: var(--v-error-base) !important;
59
+ }
60
+ }
61
+ &.theme--dark{
62
+ color: map-get($shades, 'white') !important;
63
+ &.error--text{
64
+ color: var(--v-error-base) !important;
65
+ }
66
+ }
53
67
  }
54
- .v-radio:not(:last-child):not(:only-child){
68
+ .v-radio:not(:last-child):not(:only-child) {
55
69
  margin-bottom: 0;
56
70
  }
57
- .v-input--selection-controls__input{
71
+ .v-input--selection-controls__input {
58
72
  margin: 0;
59
73
  }
74
+ label.v-label.error--text {
75
+ animation: none;
76
+ }
60
77
  }
61
78
  }
62
79
  }
63
80
  .vcs-radio {
64
81
  height: 40px;
65
82
  align-items: center;
83
+ padding-left: 4px;
66
84
  }
67
85
  .vcs-radio-dense {
68
86
  height: 32px;
@@ -70,10 +88,11 @@
70
88
  }
71
89
  </style>
72
90
  <script>
91
+ import { computed, ref } from 'vue';
73
92
  import { VRadio, VRadioGroup } from 'vuetify/lib';
74
93
  import VcsTooltip from '../notification/VcsTooltip.vue';
75
94
  import VcsLabel from './VcsLabel.vue';
76
- import validate from '../notification/validation.js';
95
+ import { useErrorSync } from './composables.js';
77
96
 
78
97
  /**
79
98
  * @typedef {Object} VcsRadioItem
@@ -111,17 +130,18 @@
111
130
  required: true,
112
131
  },
113
132
  },
114
- data() {
133
+ setup(props, { attrs }) {
134
+ const radioGroup = ref();
135
+
136
+ const errorMessage = useErrorSync(radioGroup);
137
+ const isDense = computed(() => attrs.dense !== false);
138
+
115
139
  return {
116
- errorMessage: '',
140
+ radioGroup,
141
+ errorMessage,
142
+ isDense,
117
143
  };
118
144
  },
119
- methods: {
120
- setError() {
121
- const rules = [...this.$attrs.rules].concat(this.$attrs.errorMessages);
122
- this.errorMessage = validate(rules, this.$attrs.value).join('\n');
123
- },
124
- },
125
145
  model: {
126
146
  event: 'change',
127
147
  },
@@ -1,33 +1,42 @@
1
1
  <template>
2
- <div
3
- @mouseover="hover = true"
4
- @mouseleave="hover = false"
5
- >
2
+ <div>
6
3
  <VcsTooltip
7
4
  :tooltip-position="tooltipPosition"
8
5
  :tooltip="errorMessage"
9
6
  color="error"
7
+ :max-width="200"
10
8
  >
11
9
  <template #activator="{ on, attrs }">
12
10
  <span v-on="on">
13
11
  <v-select
12
+ ref="selectField"
14
13
  append-icon="mdi-chevron-down"
15
14
  hide-details
16
15
  flat
17
- :outlined="isOutlined"
16
+ outlined
18
17
  :dense="isDense"
19
18
  :height="isDense ? 24 : 32"
20
19
  :item-text="item => $t(getText(item))"
21
- :class="$attrs.color === 'primary' ? 'primary--select' : ''"
20
+ class="py-1 primary--placeholder"
21
+ :class="{
22
+ 'remove-outline': !isOutlined,
23
+ 'input--dense': isDense,
24
+ 'input--not-dense': !isDense,
25
+ 'outline--current': focus,
26
+ 'outline--error': !!errorMessage,
27
+ }"
22
28
  v-bind="{...$attrs, ...attrs}"
23
29
  v-on="{...$listeners, ...on}"
24
- @update:error="setError"
30
+ @focus="focus = true;"
31
+ @blur="focus = false;"
32
+ @mouseover="hover = true"
33
+ @mouseleave="hover = false"
25
34
  >
26
35
  <template #selection="{ item, index }">
27
36
  <span v-if="index === 0" class="text-truncate">
28
37
  {{ $t(getText(item)) }}
29
38
  </span>
30
- <span v-if="index === 1" class="text-no-wrap grey--text text-caption">
39
+ <span v-if="index === 1" class="text-no-wrap text-caption">
31
40
  (+{{ $attrs.value.length - 1 }})
32
41
  </span>
33
42
  </template>
@@ -38,39 +47,85 @@
38
47
  </div>
39
48
  </template>
40
49
  <style lang="scss" scoped>
41
- .v-text-field {
42
- padding: 0;
43
- margin: 0;
44
- }
45
-
46
- .vcs-select-hover{
47
- color: var(--v-primary-base) !important;
48
- }
49
-
50
- .primary--select {
51
- ::v-deep {
52
- .v-select__selection,
53
- .v-select__selection--comma,
54
- .v-select.v-text-field input {
55
- color: var(--v-primary-base);
56
- }
57
- }
58
- }
59
- .v-select{
60
- &.v-select--is-multi{
61
- ::v-deep {
62
- .v-select__selections{
50
+ .primary--placeholder {
51
+ ::v-deep {
52
+ input::placeholder {
53
+ color: var(--v-primary-base);
54
+ font-style: italic;
55
+ opacity: 1;
56
+ }
57
+ }
58
+ }
59
+ .v-select{
60
+ &.v-select--is-multi{
61
+ ::v-deep {
62
+ .v-select__selections{
63
63
  flex-wrap: nowrap;
64
- }
65
- }
66
- }
67
- }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ .remove-outline {
69
+ ::v-deep {
70
+ fieldset {
71
+ border-width: 0;
72
+ border-radius: 0;
73
+ }
74
+ }
75
+ }
76
+ .outline--current {
77
+ ::v-deep {
78
+ .v-input__slot fieldset, .v-input__slot .v-select__slot {
79
+ border-color: currentColor;
80
+ transition: border-color 0.5s ease;
81
+ }
82
+ }
83
+ }
84
+ .outline--error {
85
+ ::v-deep {
86
+ .v-input__slot fieldset, .v-input__slot .v-select__slot {
87
+ border-color: var(--v-error-base);
88
+ }
89
+ }
90
+ }
91
+ .input--dense {
92
+ ::v-deep {
93
+ .v-input__slot {
94
+ padding: 0 4px !important;
95
+ }
96
+ fieldset {
97
+ padding-left: 2px;
98
+ }
99
+ }
100
+ }
101
+ .input--not-dense {
102
+ ::v-deep {
103
+ .v-input__slot {
104
+ padding: 0 8px !important;
105
+ }
106
+ fieldset {
107
+ padding-left: 6px;
108
+ }
109
+ }
110
+ }
111
+ .v-input {
112
+ ::v-deep {
113
+ fieldset {
114
+ border-radius: 2px;
115
+ border-color: var(--v-base-base);
116
+ }
117
+ .v-select__slot {
118
+ border-bottom: 1px solid var(--v-base-base);
119
+ }
120
+ }
121
+ }
68
122
  </style>
69
123
  <script>
70
124
 
71
125
  import { VSelect } from 'vuetify/lib';
126
+ import { computed, ref } from 'vue';
72
127
  import VcsTooltip from '../notification/VcsTooltip.vue';
73
- import validate from '../notification/validation.js';
128
+ import { useErrorSync } from './composables.js';
74
129
 
75
130
  /**
76
131
  * @description Stylized wrapper around {@link https://vuetifyjs.com/en/api/v-select/ |vuetify select}.
@@ -100,33 +155,36 @@
100
155
  default: undefined,
101
156
  },
102
157
  },
103
- data() {
104
- return {
105
- hover: false,
106
- errorMessage: '',
107
- };
108
- },
109
- computed: {
110
- isDense() {
111
- return this.$attrs.dense !== undefined && this.$attrs.dense !== false;
112
- },
113
- isOutlined() {
114
- return (this.hover || this.errorMessage.length > 0) &&
115
- !(this.$attrs.disabled || this.$attrs.disabled === '');
116
- },
117
- },
118
- methods: {
119
- setError() {
120
- const rules = [...this.$attrs.rules].concat(this.$attrs.errorMessages);
121
- this.errorMessage = validate(rules, this.$attrs.value).join('\n');
122
- },
123
- getText(item) {
124
- if (this.itemText) {
125
- return this.itemText(item);
158
+ setup(props, { attrs }) {
159
+ const hover = ref(false);
160
+ const focus = ref(false);
161
+ // $ref to v-select element
162
+ const selectField = ref();
163
+
164
+ const errorMessage = useErrorSync(selectField);
165
+
166
+ const isDense = computed(() => attrs.dense !== false);
167
+ const isOutlined = computed(() => {
168
+ return (hover.value || focus.value || !!errorMessage.value) && !(attrs.disabled || attrs.disabled === '');
169
+ });
170
+
171
+ function getText(item) {
172
+ if (props.itemText) {
173
+ return props.itemText(item);
126
174
  } else {
127
175
  return item?.text ?? item;
128
176
  }
129
- },
177
+ }
178
+
179
+ return {
180
+ hover,
181
+ focus,
182
+ errorMessage,
183
+ isDense,
184
+ isOutlined,
185
+ getText,
186
+ selectField,
187
+ };
130
188
  },
131
189
  };
132
190
  </script>
@@ -1,30 +1,33 @@
1
1
  <template>
2
- <div
3
- @mouseover="hover = true"
4
- @mouseleave="hover = false"
5
- >
2
+ <div>
6
3
  <VcsTooltip
7
4
  :tooltip-position="tooltipPosition"
8
5
  :tooltip="errorMessage"
9
- :value="(hover || focus) && isError"
10
6
  color="error"
11
7
  :max-width="200"
12
8
  >
13
- <template #activator="{ attrs }">
9
+ <template #activator="{ on, attrs }">
14
10
  <v-textarea
15
11
  ref="textAreaRef"
16
12
  hide-details
17
13
  :dense="isDense"
18
14
  :clearable="isClearable"
19
15
  @focus="focus = true"
20
- @blur="focus = neverBlurred = false"
21
- @input="firstInput = true"
22
- :outlined="isOutlined"
16
+ @blur="focus = false"
17
+ @mouseover="hover = true"
18
+ @mouseleave="hover = false"
19
+ outlined
23
20
  v-bind="{...$attrs, ...attrs}"
24
- v-on="{...$listeners}"
21
+ v-on="{...$listeners, ...on}"
25
22
  :rows="$attrs.rows || (isDense ? 3 : 5)"
26
- class="ma-0 pb-1 pt-1 primary--placeholder"
27
- :class="$attrs.color === 'primary' ? 'primary--textarea' : ''"
23
+ class="ma-0 py-1 primary--placeholder"
24
+ :class="{
25
+ 'remove-outline': !isOutlined,
26
+ 'outline--current': focus,
27
+ 'outline--error': errorMessage,
28
+ 'input--dense': isDense,
29
+ 'input--not-dense': !isDense,
30
+ }"
28
31
  />
29
32
  </template>
30
33
  </VcsTooltip>
@@ -41,18 +44,77 @@
41
44
  }
42
45
  }
43
46
  }
44
- .primary--textarea {
45
- ::v-deep {
46
- textarea {
47
- color: var(--v-primary-base);
47
+ .remove-outline {
48
+ ::v-deep {
49
+ fieldset {
50
+ border-width: 0;
51
+ border-radius: 0;
52
+ }
53
+ }
54
+ }
55
+ .outline--current {
56
+ ::v-deep {
57
+ .v-input__slot fieldset {
58
+ border-color: currentColor;
59
+ transition: border-color 0.5s ease;
60
+ }
61
+ .v-text-field__slot textarea {
62
+ border-color: transparent;
63
+ }
64
+ }
65
+ }
66
+ .outline--error {
67
+ ::v-deep {
68
+ .v-input__slot fieldset, .v-text-field__slot textarea {
69
+ border-color: var(--v-error-base);
70
+ }
71
+ }
72
+ }
73
+ .input--dense {
74
+ ::v-deep {
75
+ .v-input__slot {
76
+ padding: 0 4px !important;
77
+ }
78
+ fieldset {
79
+ padding-left: 2px;
80
+ }
81
+ }
82
+ }
83
+ .input--not-dense {
84
+ ::v-deep {
85
+ .v-input__slot {
86
+ padding: 0 8px !important;
87
+ }
88
+ fieldset {
89
+ padding-left: 6px;
90
+ }
91
+ }
92
+ }
93
+ .v-input {
94
+ ::v-deep {
95
+ textarea {
96
+ border-bottom: 1px solid var(--v-base-base);
97
+ border-radius: 0;
98
+ }
99
+ textarea::selection {
100
+ background-color: var(--v-primary-base);
101
+ }
102
+ fieldset {
103
+ border-radius: 2px;
104
+ border-color: var(--v-base-base);
105
+ }
106
+ .v-text-field__slot {
107
+ margin-right: 0 !important;
108
+ }
48
109
  }
49
110
  }
50
- }
51
111
  </style>
52
112
 
53
113
  <script>
114
+ import { computed, ref } from 'vue';
54
115
  import { VTextarea } from 'vuetify/lib';
55
116
  import VcsTooltip from '../notification/VcsTooltip.vue';
117
+ import { useErrorSync } from './composables.js';
56
118
 
57
119
  /**
58
120
  * @description extends API of {@link https://vuetifyjs.com/en/api/v-textarea/|vuetify v-textarea}.
@@ -82,51 +144,30 @@
82
144
  default: 'right',
83
145
  },
84
146
  },
85
- data() {
147
+ setup(props, { attrs }) {
148
+ const hover = ref(false);
149
+ const focus = ref(false);
150
+ const textAreaRef = ref();
151
+
152
+ const errorMessage = useErrorSync(textAreaRef);
153
+
154
+ const isClearable = computed(() => {
155
+ return (attrs.clearable !== undefined && attrs.clearable !== false) &&
156
+ (hover.value || focus.value || errorMessage.value);
157
+ });
158
+ const isDense = computed(() => attrs.dense !== false);
159
+ const isOutlined = computed(() => {
160
+ return (hover.value || focus.value || errorMessage.value) && !(attrs.disabled || attrs.disabled === '');
161
+ });
86
162
  return {
87
- hover: false,
88
- focus: false,
89
- firstInput: false,
90
- neverBlurred: true,
91
- isMounted: false,
92
- errorMessage: '',
163
+ hover,
164
+ focus,
165
+ textAreaRef,
166
+ errorMessage,
167
+ isClearable,
168
+ isDense,
169
+ isOutlined,
93
170
  };
94
171
  },
95
- computed: {
96
- isClearable() {
97
- return (this.$attrs.clearable !== undefined && this.$attrs.clearable !== false) &&
98
- (this.hover || this.focus || this.isError);
99
- },
100
- isDense() {
101
- return this.$attrs.dense !== undefined && this.$attrs.dense !== false;
102
- },
103
- isError() {
104
- return this.joinedErrorBucket.length > 0 && (this.firstInput || !this.neverBlurred);
105
- },
106
- isOutlined() {
107
- return (this.hover || this.focus || this.isError) && !(this.$attrs.disabled || this.$attrs.disabled === '');
108
- },
109
- joinedErrorBucket() {
110
- if (!this.isMounted) {
111
- return false;
112
- } else {
113
- return this.$refs.textAreaRef.errorBucket.concat(this.$refs.textAreaRef.errorMessages).join('\n');
114
- }
115
- },
116
- },
117
- watch: {
118
- joinedErrorBucket(newValue, oldValue) {
119
- if (oldValue && !newValue) {
120
- setTimeout(() => {
121
- this.errorMessage = newValue;
122
- }, 200);
123
- } else {
124
- this.errorMessage = newValue;
125
- }
126
- },
127
- },
128
- mounted() {
129
- this.isMounted = true;
130
- },
131
172
  };
132
173
  </script>