@bcrs-shared-components/base-address 3.0.2 → 3.0.4

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/BaseAddress.vue CHANGED
@@ -1,381 +1,381 @@
1
- <template>
2
- <div class="base-address">
3
- <!-- Display fields -->
4
- <v-expand-transition>
5
- <div
6
- v-if="!editing"
7
- class="address-block"
8
- >
9
- <div class="address-block__info pre-wrap">
10
- <p class="address-block__info-row">
11
- {{ addressLocal.streetAddress }}
12
- </p>
13
- <p
14
- v-if="addressLocal.streetAddressAdditional"
15
- class="address-block__info-row"
16
- >
17
- {{ addressLocal.streetAddressAdditional }}
18
- </p>
19
- <p class="address-block__info-row">
20
- <span>{{ addressLocal.addressCity }}</span>
21
- <span v-if="addressLocal.addressRegion">&nbsp;{{ addressLocal.addressRegion }}&nbsp;</span>
22
- <span v-if="addressLocal.postalCode">&nbsp;{{ addressLocal.postalCode }}</span>
23
- </p>
24
- <p class="address-block__info-row">
25
- {{ getCountryName(country) }}
26
- </p>
27
- <p
28
- v-if="addressLocal.deliveryInstructions"
29
- class="address-block__info-row delivery-text"
30
- >
31
- {{ addressLocal.deliveryInstructions }}
32
- </p>
33
- </div>
34
- </div>
35
- </v-expand-transition>
36
-
37
- <!-- Edit fields -->
38
- <v-expand-transition>
39
- <v-form
40
- v-if="editing"
41
- ref="addressForm"
42
- name="address-form"
43
- lazy-validation
44
- >
45
- <div class="form__row">
46
- <v-autocomplete
47
- v-model="addressLocal.addressCountry"
48
- autocomplete="new-password"
49
- :name="Math.random().toString()"
50
- variant="filled"
51
- class="address-country"
52
- hide-no-data
53
- item-title="name"
54
- item-value="code"
55
- :items="getCountries()"
56
- :label="countryLabel"
57
- :rules="[...schemaLocal.country]"
58
- />
59
- <!-- special field to select AddressComplete country, separate from our model field -->
60
- <input
61
- :id="countryId"
62
- type="hidden"
63
- :value="country"
64
- >
65
- </div>
66
- <div class="form__row">
67
- <!-- NB1: AddressComplete needs to be enabled each time user clicks in this search field.
68
- NB2: Only process first keypress -- assumes if user moves between instances of this
69
- component then they are using the mouse (and thus, clicking). -->
70
- <v-text-field
71
- :id="streetId"
72
- v-model="addressLocal.streetAddress"
73
- autocomplete="new-password"
74
- class="street-address"
75
- variant="filled"
76
- :hint="hideAddressHint ? '' : 'Street address, PO box, rural route, or general delivery address'"
77
- :label="streetLabel"
78
- :name="Math.random().toString()"
79
- persistent-hint
80
- :rules="[...schemaLocal.street]"
81
- @keypress.once="enableAddressComplete()"
82
- @click="enableAddressComplete()"
83
- />
84
- </div>
85
- <div class="form__row">
86
- <v-textarea
87
- v-model="addressLocal.streetAddressAdditional"
88
- autocomplete="new-password"
89
- auto-grow
90
- variant="filled"
91
- class="street-address-additional"
92
- :label="streetAdditionalLabel"
93
- :name="Math.random().toString()"
94
- rows="1"
95
- :rules="!!addressLocal.streetAddressAdditional ? [...schemaLocal.streetAdditional] : []"
96
- />
97
- </div>
98
- <div class="form__row three-column">
99
- <v-text-field
100
- v-model="addressLocal.addressCity"
101
- autocomplete="new-password"
102
- variant="filled"
103
- class="item address-city"
104
- :label="cityLabel"
105
- :name="Math.random().toString()"
106
- :rules="[...schemaLocal.city]"
107
- />
108
- <v-autocomplete
109
- v-if="useCountryRegions(country)"
110
- v-model="addressLocal.addressRegion"
111
- autocomplete="new-password"
112
- variant="filled"
113
- class="item address-region"
114
- hide-no-data
115
- item-title="name"
116
- item-value="short"
117
- :items="getCountryRegions(country)"
118
- :label="regionLabel"
119
- :menu-props="{ maxHeight: '14rem' }"
120
- :name="Math.random().toString()"
121
- :rules="[...schemaLocal.region]"
122
- >
123
- <template #item="{item, props}">
124
- <v-divider v-if="item.raw.divider" />
125
- <v-list-item
126
- v-else
127
- v-bind="props"
128
- />
129
- </template>
130
- </v-autocomplete>
131
- <v-text-field
132
- v-else
133
- v-model="addressLocal.addressRegion"
134
- variant="filled"
135
- class="item address-region"
136
- :label="regionLabel"
137
- :name="Math.random().toString()"
138
- :rules="[...schemaLocal.region]"
139
- />
140
- <v-text-field
141
- v-model="addressLocal.postalCode"
142
- variant="filled"
143
- class="item postal-code"
144
- :label="postalCodeLabel"
145
- :name="Math.random().toString()"
146
- :rules="[...schemaLocal.postalCode]"
147
- />
148
- </div>
149
- <div
150
- v-if="!hideDeliveryAddress"
151
- class="form__row"
152
- >
153
- <v-textarea
154
- v-model="addressLocal.deliveryInstructions"
155
- auto-grow
156
- variant="filled"
157
- class="delivery-instructions"
158
- :label="deliveryInstructionsLabel"
159
- :name="Math.random().toString()"
160
- rows="2"
161
- :rules="!!addressLocal.deliveryInstructions ? [...schemaLocal.deliveryInstructions] : []"
162
- />
163
- </div>
164
- </v-form>
165
- </v-expand-transition>
166
- </div>
167
- </template>
168
-
169
- <script lang="ts">
170
- import { defineComponent, onMounted, toRefs, watch } from 'vue-demi'
171
- import {
172
- baseRules,
173
- useAddress,
174
- useAddressComplete,
175
- useCountryRegions,
176
- useCountriesProvinces,
177
- useBaseValidations,
178
- spaceRules
179
- } from './factories'
180
- import { AddressIF, SchemaIF } from '@bcrs-shared-components/interfaces'
181
- import { AddressValidationRules } from '@bcrs-shared-components/enums'
182
-
183
- export default defineComponent({
184
- name: 'BaseAddress',
185
- props: {
186
- value: {
187
- type: Object as () => AddressIF,
188
- default: () => ({
189
- street: '',
190
- streetAdditional: '',
191
- city: '',
192
- region: '',
193
- postalCode: '',
194
- country: '',
195
- deliveryInstructions: ''
196
- })
197
- },
198
- /* used for readonly mode vs edit mode */
199
- editing: {
200
- type: Boolean,
201
- default: false
202
- },
203
- /* contains validation for each field */
204
- schema: {
205
- type: Object as () => SchemaIF,
206
- default: null
207
- },
208
- /* triggers all current form validation errors */
209
- triggerErrors: {
210
- type: Boolean,
211
- default: false
212
- },
213
- /* Hides the persistent hint field on Address Input */
214
- hideAddressHint: {
215
- type: Boolean,
216
- default: false
217
- },
218
- /* Hides Delivery Address field (e.g. for Unit Notes) */
219
- hideDeliveryAddress: {
220
- type: Boolean,
221
- default: false
222
- }
223
- },
224
- emits: ['valid'],
225
- setup (props, { emit }) {
226
- // eslint-disable-next-line vue/no-setup-props-destructure
227
- const localSchema = { ...props.schema }
228
- const {
229
- addressLocal,
230
- country,
231
- schemaLocal,
232
- isSchemaRequired,
233
- labels
234
- } = useAddress(toRefs(props).value, localSchema)
235
-
236
- const origPostalCodeRules = localSchema.postalCode
237
- const origRegionRules = localSchema.region
238
-
239
- const { addressForm, resetValidation, validate } = useBaseValidations()
240
-
241
- const { enableAddressComplete, uniqueIds } = useAddressComplete(addressLocal)
242
-
243
- const countryProvincesHelpers = useCountriesProvinces()
244
-
245
- const countryChangeHandler = (val: string, oldVal: string) => {
246
- // do not trigger any changes if it is view only (summary instance)
247
- if (!props.editing) return
248
-
249
- if (val === 'CA') {
250
- localSchema.postalCode = origPostalCodeRules.concat([baseRules.postalCode])
251
- localSchema.region = origRegionRules
252
- } else if (val === 'US') {
253
- localSchema.postalCode = origPostalCodeRules.concat([baseRules.zipCode])
254
- localSchema.region = origRegionRules
255
- } else {
256
- localSchema.postalCode = origPostalCodeRules.concat([baseRules[AddressValidationRules.MAX_LENGTH](15)])
257
- localSchema.region = [baseRules[AddressValidationRules.MAX_LENGTH](2), ...spaceRules]
258
- }
259
- // reset other address fields (check is for loading an existing address)
260
- if (oldVal) {
261
- addressLocal.value.streetAddress = ''
262
- addressLocal.value.streetAddressAdditional = ''
263
- addressLocal.value.addressCity = ''
264
- addressLocal.value.addressRegion = ''
265
- addressLocal.value.postalCode = ''
266
- }
267
- // wait for schema update and validate the form
268
- setTimeout(() => {
269
- props.triggerErrors ? validate() : resetValidation()
270
- }, 5)
271
- }
272
-
273
- onMounted(() => {
274
- countryChangeHandler(addressLocal.value.addressCountry, null)
275
- })
276
-
277
- watch(() => addressLocal.value, (val) => {
278
- let valid = true
279
- /** checks each field against the schema rules to see if the address is valid or not
280
- * NOTE: we don't want it to trigger error msgs yet which is why this does not call validate()
281
- */
282
- for (const key in val) {
283
- for (const index in schemaLocal.value[key]) {
284
- if (schemaLocal.value[key][index](val[key]) !== true) {
285
- valid = false
286
- break
287
- }
288
- }
289
- if (!valid) break
290
- }
291
- emit('valid', valid)
292
- }, { immediate: true, deep: true })
293
-
294
- watch(() => country.value, (val, oldVal) => {
295
- countryChangeHandler(val, oldVal)
296
- })
297
-
298
- watch(() => props.triggerErrors, () => {
299
- validate()
300
- })
301
-
302
- return {
303
- addressForm,
304
- addressLocal,
305
- country,
306
- ...countryProvincesHelpers,
307
- enableAddressComplete,
308
- isSchemaRequired,
309
- ...labels,
310
- schemaLocal,
311
- useCountryRegions,
312
- ...uniqueIds,
313
- validate
314
- }
315
- }
316
- })
317
- </script>
318
-
319
- <style lang="scss" scoped>
320
- @import '@/assets/styles/theme.scss';
321
-
322
- .delivery-text {
323
- font-style: italic;
324
- margin-top: 10px;
325
- }
326
-
327
- // Address Block Layout
328
- .address-block {
329
- display: flex;
330
- p {
331
- margin-bottom: unset;
332
- }
333
- }
334
-
335
- .address-block__info {
336
- flex: 1 1 auto;
337
- }
338
-
339
- // Form Row Elements
340
- .form__row.three-column {
341
- align-items: stretch;
342
- display: flex;
343
- flex-flow: row nowrap;
344
- margin-left: -0.5rem;
345
- margin-right: -0.5rem;
346
-
347
- .item {
348
- flex: 1 1 auto;
349
- flex-basis: 0;
350
- margin-left: 0.5rem;
351
- margin-right: 0.5rem;
352
- }
353
- }
354
-
355
- .pre-wrap {
356
- white-space: pre-wrap;
357
- }
358
-
359
- // make 'readonly' inputs looks disabled
360
- // (can't use 'disabled' because we want normal error styling)
361
- .v-select.v-input--is-readonly,
362
- .v-text-field.v-input--is-readonly {
363
- pointer-events: none;
364
-
365
- ::v-deep .v-label {
366
- // set label colour to same as disabled
367
- color: rgba(0,0,0,.38);
368
- }
369
-
370
- ::v-deep .v-select__selection {
371
- // set selection colour to same as disabled
372
- color: rgba(0,0,0,.38);
373
- }
374
-
375
- ::v-deep .v-icon {
376
- // set error icon colour to same as disabled
377
- color: rgba(0,0,0,.38) !important;
378
- opacity: 0.6;
379
- }
380
- }
381
- </style>
1
+ <template>
2
+ <div class="base-address">
3
+ <!-- Display fields -->
4
+ <v-expand-transition>
5
+ <div
6
+ v-if="!editing"
7
+ class="address-block"
8
+ >
9
+ <div class="address-block__info pre-wrap">
10
+ <p class="address-block__info-row">
11
+ {{ addressLocal.streetAddress }}
12
+ </p>
13
+ <p
14
+ v-if="addressLocal.streetAddressAdditional"
15
+ class="address-block__info-row"
16
+ >
17
+ {{ addressLocal.streetAddressAdditional }}
18
+ </p>
19
+ <p class="address-block__info-row">
20
+ <span>{{ addressLocal.addressCity }}</span>
21
+ <span v-if="addressLocal.addressRegion">&nbsp;{{ addressLocal.addressRegion }}&nbsp;</span>
22
+ <span v-if="addressLocal.postalCode">&nbsp;{{ addressLocal.postalCode }}</span>
23
+ </p>
24
+ <p class="address-block__info-row">
25
+ {{ getCountryName(country) }}
26
+ </p>
27
+ <p
28
+ v-if="addressLocal.deliveryInstructions"
29
+ class="address-block__info-row delivery-text"
30
+ >
31
+ {{ addressLocal.deliveryInstructions }}
32
+ </p>
33
+ </div>
34
+ </div>
35
+ </v-expand-transition>
36
+
37
+ <!-- Edit fields -->
38
+ <v-expand-transition>
39
+ <v-form
40
+ v-if="editing"
41
+ ref="addressForm"
42
+ name="address-form"
43
+ lazy-validation
44
+ >
45
+ <div class="form__row">
46
+ <v-autocomplete
47
+ v-model="addressLocal.addressCountry"
48
+ autocomplete="new-password"
49
+ :name="Math.random().toString()"
50
+ variant="filled"
51
+ class="address-country"
52
+ hide-no-data
53
+ item-title="name"
54
+ item-value="code"
55
+ :items="getCountries()"
56
+ :label="countryLabel"
57
+ :rules="[...schemaLocal.country]"
58
+ >
59
+ <template #item="{item, props: autoCompleteProps}">
60
+ <v-divider v-if="item.raw.divider" />
61
+ <v-list-item
62
+ v-else
63
+ v-bind="autoCompleteProps"
64
+ />
65
+ </template>
66
+ </v-autocomplete>
67
+ <!-- special field to select AddressComplete country, separate from our model field -->
68
+ <input
69
+ :id="countryId"
70
+ type="hidden"
71
+ :value="country"
72
+ >
73
+ </div>
74
+ <div class="form__row">
75
+ <!-- NB1: AddressComplete needs to be enabled each time user clicks in this search field.
76
+ NB2: Only process first keypress -- assumes if user moves between instances of this
77
+ component then they are using the mouse (and thus, clicking). -->
78
+ <v-text-field
79
+ :id="streetId"
80
+ v-model="addressLocal.streetAddress"
81
+ autocomplete="new-password"
82
+ class="street-address"
83
+ variant="filled"
84
+ :hint="hideAddressHint ? '' : 'Street address, PO box, rural route, or general delivery address'"
85
+ :label="streetLabel"
86
+ :name="Math.random().toString()"
87
+ persistent-hint
88
+ :rules="[...schemaLocal.street]"
89
+ @keypress.once="enableAddressComplete()"
90
+ @click="enableAddressComplete()"
91
+ />
92
+ </div>
93
+ <div class="form__row">
94
+ <v-textarea
95
+ v-model="addressLocal.streetAddressAdditional"
96
+ autocomplete="new-password"
97
+ auto-grow
98
+ variant="filled"
99
+ class="street-address-additional"
100
+ :label="streetAdditionalLabel"
101
+ :name="Math.random().toString()"
102
+ rows="1"
103
+ :rules="!!addressLocal.streetAddressAdditional ? [...schemaLocal.streetAdditional] : []"
104
+ />
105
+ </div>
106
+ <div class="form__row three-column">
107
+ <v-text-field
108
+ v-model="addressLocal.addressCity"
109
+ autocomplete="new-password"
110
+ variant="filled"
111
+ class="item address-city"
112
+ :label="cityLabel"
113
+ :name="Math.random().toString()"
114
+ :rules="[...schemaLocal.city]"
115
+ />
116
+ <v-autocomplete
117
+ v-if="useCountryRegions(country)"
118
+ v-model="addressLocal.addressRegion"
119
+ autocomplete="new-password"
120
+ variant="filled"
121
+ class="item address-region"
122
+ hide-no-data
123
+ item-title="name"
124
+ item-value="short"
125
+ :items="getCountryRegions(country)"
126
+ :label="regionLabel"
127
+ :menu-props="{ maxHeight: '14rem' }"
128
+ :name="Math.random().toString()"
129
+ :rules="[...schemaLocal.region]"
130
+ >
131
+ <template #item="{item, props: autoCompleteProps}">
132
+ <v-divider v-if="item.raw.divider" />
133
+ <v-list-item
134
+ v-else
135
+ v-bind="autoCompleteProps"
136
+ />
137
+ </template>
138
+ </v-autocomplete>
139
+ <v-text-field
140
+ v-else
141
+ v-model="addressLocal.addressRegion"
142
+ variant="filled"
143
+ class="item address-region"
144
+ :label="regionLabel"
145
+ :name="Math.random().toString()"
146
+ :rules="[...schemaLocal.region]"
147
+ />
148
+ <v-text-field
149
+ v-model="addressLocal.postalCode"
150
+ variant="filled"
151
+ class="item postal-code"
152
+ :label="postalCodeLabel"
153
+ :name="Math.random().toString()"
154
+ :rules="[...schemaLocal.postalCode]"
155
+ />
156
+ </div>
157
+ <div
158
+ v-if="!hideDeliveryAddress"
159
+ class="form__row"
160
+ >
161
+ <v-textarea
162
+ v-model="addressLocal.deliveryInstructions"
163
+ auto-grow
164
+ variant="filled"
165
+ class="delivery-instructions"
166
+ :label="deliveryInstructionsLabel"
167
+ :name="Math.random().toString()"
168
+ rows="2"
169
+ :rules="!!addressLocal.deliveryInstructions ? [...schemaLocal.deliveryInstructions] : []"
170
+ />
171
+ </div>
172
+ </v-form>
173
+ </v-expand-transition>
174
+ </div>
175
+ </template>
176
+
177
+ <script setup lang="ts">
178
+ import { AddressIF, SchemaIF } from '@bcrs-shared-components/interfaces'
179
+ import { Ref, onMounted, toRef, watch } from 'vue'
180
+ import {
181
+ baseRules,
182
+ spaceRules,
183
+ useAddress,
184
+ useAddressComplete,
185
+ useBaseValidations,
186
+ useCountriesProvinces,
187
+ useCountryRegions
188
+ } from '@bcrs-shared-components/base-address/factories'
189
+ import { AddressValidationRules } from '@bcrs-shared-components/enums'
190
+
191
+ const props = withDefaults(defineProps<{
192
+ value: AddressIF
193
+ editing: boolean
194
+ schema: SchemaIF
195
+ triggerErrors: boolean
196
+ hideAddressHint: boolean
197
+ hideDeliveryAddress: boolean
198
+ }>(), {
199
+ value: () => ({
200
+ streetAddress: '',
201
+ streetAddressAdditional: '',
202
+ addressCity: '',
203
+ addressRegion: '',
204
+ postalCode: '',
205
+ addressCountry: null,
206
+ deliveryInstructions: ''
207
+ }),
208
+ /* used for readonly mode vs edit mode */
209
+ editing: false,
210
+ /* contains validation for each field */
211
+ schema: null,
212
+ /* triggers all current form validation errors */
213
+ triggerErrors: false,
214
+ /* Hides the persistent hint field on Address Input */
215
+ hideAddressHint: false,
216
+ /* Hides Delivery Address field (e.g. for Unit Notes) */
217
+ hideDeliveryAddress: false
218
+ })
219
+
220
+ const emits = defineEmits<{
221
+ 'update-address': [address: AddressIF]
222
+ valid: [valid: boolean]
223
+ }>()
224
+
225
+ // eslint-disable-next-line vue/no-setup-props-destructure
226
+ const localSchema = { ...props.schema }
227
+ const {
228
+ addressLocal,
229
+ country,
230
+ schemaLocal,
231
+ labels
232
+ } = useAddress(toRef(props.value) as Ref<AddressIF>, localSchema)
233
+
234
+ const origPostalCodeRules = localSchema.postalCode
235
+ const origRegionRules = localSchema.region
236
+
237
+ const { addressForm, resetValidation, validate } = useBaseValidations()
238
+
239
+ const { enableAddressComplete, uniqueIds } = useAddressComplete(addressLocal)
240
+
241
+ const countryProvincesHelpers = useCountriesProvinces()
242
+
243
+ const countryChangeHandler = (val: string, oldVal: string) => {
244
+ // do not trigger any changes if it is view only (summary instance)
245
+ if (!props.editing) return
246
+
247
+ if (val === 'CA') {
248
+ localSchema.postalCode = origPostalCodeRules.concat([baseRules.postalCode])
249
+ localSchema.region = origRegionRules
250
+ } else if (val === 'US') {
251
+ localSchema.postalCode = origPostalCodeRules.concat([baseRules.zipCode])
252
+ localSchema.region = origRegionRules
253
+ } else {
254
+ localSchema.postalCode = origPostalCodeRules.concat([baseRules[AddressValidationRules.MAX_LENGTH](15)])
255
+ localSchema.region = [baseRules[AddressValidationRules.MAX_LENGTH](2), ...spaceRules]
256
+ }
257
+ // reset other address fields (check is for loading an existing address)
258
+ if (oldVal) {
259
+ addressLocal.value.streetAddress = ''
260
+ addressLocal.value.streetAddressAdditional = ''
261
+ addressLocal.value.addressCity = ''
262
+ addressLocal.value.addressRegion = ''
263
+ addressLocal.value.postalCode = ''
264
+ }
265
+ // wait for schema update and validate the form
266
+ setTimeout(() => {
267
+ props.triggerErrors ? validate() : resetValidation()
268
+ }, 5)
269
+ }
270
+
271
+ onMounted(() => {
272
+ countryChangeHandler(addressLocal.value.addressCountry, null)
273
+ })
274
+
275
+ watch(() => addressLocal.value, (val) => {
276
+ let valid = true
277
+ /** checks each field against the schema rules to see if the address is valid or not
278
+ * NOTE: we don't want it to trigger error msgs yet which is why this does not call validate()
279
+ */
280
+ for (const key in val) {
281
+ for (const index in schemaLocal.value[key]) {
282
+ if (schemaLocal.value[key][index](val[key]) !== true) {
283
+ valid = false
284
+ break
285
+ }
286
+ }
287
+ if (!valid) break
288
+ }
289
+ emits('valid', valid)
290
+ emits('update-address', val)
291
+ }, { immediate: true, deep: true })
292
+
293
+ watch(() => country.value, (val, oldVal) => {
294
+ countryChangeHandler(val, oldVal)
295
+ })
296
+
297
+ watch(() => props.triggerErrors, () => {
298
+ validate()
299
+ })
300
+
301
+ const { getCountries, getCountryName, getCountryRegions } = countryProvincesHelpers
302
+ const {
303
+ countryLabel,
304
+ streetLabel,
305
+ streetAdditionalLabel,
306
+ cityLabel,
307
+ regionLabel,
308
+ postalCodeLabel,
309
+ deliveryInstructionsLabel
310
+ } = labels
311
+ const { streetId, countryId } = uniqueIds
312
+
313
+ defineExpose({
314
+ addressForm,
315
+ validate
316
+ })
317
+ </script>
318
+
319
+ <style lang="scss" scoped>
320
+ @import '@/assets/styles/theme.scss';
321
+
322
+ .delivery-text {
323
+ font-style: italic;
324
+ margin-top: 10px;
325
+ }
326
+
327
+ // Address Block Layout
328
+ .address-block {
329
+ display: flex;
330
+ p {
331
+ margin-bottom: unset;
332
+ }
333
+ }
334
+
335
+ .address-block__info {
336
+ flex: 1 1 auto;
337
+ }
338
+
339
+ // Form Row Elements
340
+ .form__row.three-column {
341
+ align-items: stretch;
342
+ display: flex;
343
+ flex-flow: row nowrap;
344
+ margin-left: -0.5rem;
345
+ margin-right: -0.5rem;
346
+
347
+ .item {
348
+ flex: 1 1 auto;
349
+ flex-basis: 0;
350
+ margin-left: 0.5rem;
351
+ margin-right: 0.5rem;
352
+ }
353
+ }
354
+
355
+ .pre-wrap {
356
+ white-space: pre-wrap;
357
+ }
358
+
359
+ // make 'readonly' inputs looks disabled
360
+ // (can't use 'disabled' because we want normal error styling)
361
+ .v-select.v-input--is-readonly,
362
+ .v-text-field.v-input--is-readonly {
363
+ pointer-events: none;
364
+
365
+ :deep(.v-label) {
366
+ // set label colour to same as disabled
367
+ color: rgba(0,0,0,.38);
368
+ }
369
+
370
+ :deep(.v-select__selection) {
371
+ // set selection colour to same as disabled
372
+ color: rgba(0,0,0,.38);
373
+ }
374
+
375
+ :deep(.v-icon) {
376
+ // set error icon colour to same as disabled
377
+ color: rgba(0,0,0,.38) !important;
378
+ opacity: 0.6;
379
+ }
380
+ }
381
+ </style>