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

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,389 @@
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}">
60
+ <v-divider v-if="item.raw.divider" />
61
+ <v-list-item
62
+ v-else
63
+ v-bind="props"
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}">
132
+ <v-divider v-if="item.raw.divider" />
133
+ <v-list-item
134
+ v-else
135
+ v-bind="props"
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 lang="ts">
178
+ import { defineComponent, onMounted, toRefs, watch } from 'vue-demi'
179
+ import {
180
+ baseRules,
181
+ useAddress,
182
+ useAddressComplete,
183
+ useCountryRegions,
184
+ useCountriesProvinces,
185
+ useBaseValidations,
186
+ spaceRules
187
+ } from './factories'
188
+ import { AddressIF, SchemaIF } from '@bcrs-shared-components/interfaces'
189
+ import { AddressValidationRules } from '@bcrs-shared-components/enums'
190
+
191
+ export default defineComponent({
192
+ name: 'BaseAddress',
193
+ props: {
194
+ value: {
195
+ type: Object as () => AddressIF,
196
+ default: () => ({
197
+ streetAddress: '',
198
+ streetAddressAdditional: '',
199
+ addressCity: '',
200
+ addressRegion: '',
201
+ postalCode: '',
202
+ addressCountry: null,
203
+ deliveryInstructions: ''
204
+ })
205
+ },
206
+ /* used for readonly mode vs edit mode */
207
+ editing: {
208
+ type: Boolean,
209
+ default: false
210
+ },
211
+ /* contains validation for each field */
212
+ schema: {
213
+ type: Object as () => SchemaIF,
214
+ default: null
215
+ },
216
+ /* triggers all current form validation errors */
217
+ triggerErrors: {
218
+ type: Boolean,
219
+ default: false
220
+ },
221
+ /* Hides the persistent hint field on Address Input */
222
+ hideAddressHint: {
223
+ type: Boolean,
224
+ default: false
225
+ },
226
+ /* Hides Delivery Address field (e.g. for Unit Notes) */
227
+ hideDeliveryAddress: {
228
+ type: Boolean,
229
+ default: false
230
+ }
231
+ },
232
+ emits: ['valid'],
233
+ setup (props, { emit }) {
234
+ // eslint-disable-next-line vue/no-setup-props-destructure
235
+ const localSchema = { ...props.schema }
236
+ const {
237
+ addressLocal,
238
+ country,
239
+ schemaLocal,
240
+ isSchemaRequired,
241
+ labels
242
+ } = useAddress(toRefs(props).value, localSchema)
243
+
244
+ const origPostalCodeRules = localSchema.postalCode
245
+ const origRegionRules = localSchema.region
246
+
247
+ const { addressForm, resetValidation, validate } = useBaseValidations()
248
+
249
+ const { enableAddressComplete, uniqueIds } = useAddressComplete(addressLocal)
250
+
251
+ const countryProvincesHelpers = useCountriesProvinces()
252
+
253
+ const countryChangeHandler = (val: string, oldVal: string) => {
254
+ // do not trigger any changes if it is view only (summary instance)
255
+ if (!props.editing) return
256
+
257
+ if (val === 'CA') {
258
+ localSchema.postalCode = origPostalCodeRules.concat([baseRules.postalCode])
259
+ localSchema.region = origRegionRules
260
+ } else if (val === 'US') {
261
+ localSchema.postalCode = origPostalCodeRules.concat([baseRules.zipCode])
262
+ localSchema.region = origRegionRules
263
+ } else {
264
+ localSchema.postalCode = origPostalCodeRules.concat([baseRules[AddressValidationRules.MAX_LENGTH](15)])
265
+ localSchema.region = [baseRules[AddressValidationRules.MAX_LENGTH](2), ...spaceRules]
266
+ }
267
+ // reset other address fields (check is for loading an existing address)
268
+ if (oldVal) {
269
+ addressLocal.value.streetAddress = ''
270
+ addressLocal.value.streetAddressAdditional = ''
271
+ addressLocal.value.addressCity = ''
272
+ addressLocal.value.addressRegion = ''
273
+ addressLocal.value.postalCode = ''
274
+ }
275
+ // wait for schema update and validate the form
276
+ setTimeout(() => {
277
+ props.triggerErrors ? validate() : resetValidation()
278
+ }, 5)
279
+ }
280
+
281
+ onMounted(() => {
282
+ countryChangeHandler(addressLocal.value.addressCountry, null)
283
+ })
284
+
285
+ watch(() => addressLocal.value, (val) => {
286
+ let valid = true
287
+ /** checks each field against the schema rules to see if the address is valid or not
288
+ * NOTE: we don't want it to trigger error msgs yet which is why this does not call validate()
289
+ */
290
+ for (const key in val) {
291
+ for (const index in schemaLocal.value[key]) {
292
+ if (schemaLocal.value[key][index](val[key]) !== true) {
293
+ valid = false
294
+ break
295
+ }
296
+ }
297
+ if (!valid) break
298
+ }
299
+ emit('valid', valid)
300
+ }, { immediate: true, deep: true })
301
+
302
+ watch(() => country.value, (val, oldVal) => {
303
+ countryChangeHandler(val, oldVal)
304
+ })
305
+
306
+ watch(() => props.triggerErrors, () => {
307
+ validate()
308
+ })
309
+
310
+ return {
311
+ addressForm,
312
+ addressLocal,
313
+ country,
314
+ ...countryProvincesHelpers,
315
+ enableAddressComplete,
316
+ isSchemaRequired,
317
+ ...labels,
318
+ schemaLocal,
319
+ useCountryRegions,
320
+ ...uniqueIds,
321
+ validate
322
+ }
323
+ }
324
+ })
325
+ </script>
326
+
327
+ <style lang="scss" scoped>
328
+ @import '@/assets/styles/theme.scss';
329
+
330
+ .delivery-text {
331
+ font-style: italic;
332
+ margin-top: 10px;
333
+ }
334
+
335
+ // Address Block Layout
336
+ .address-block {
337
+ display: flex;
338
+ p {
339
+ margin-bottom: unset;
340
+ }
341
+ }
342
+
343
+ .address-block__info {
344
+ flex: 1 1 auto;
345
+ }
346
+
347
+ // Form Row Elements
348
+ .form__row.three-column {
349
+ align-items: stretch;
350
+ display: flex;
351
+ flex-flow: row nowrap;
352
+ margin-left: -0.5rem;
353
+ margin-right: -0.5rem;
354
+
355
+ .item {
356
+ flex: 1 1 auto;
357
+ flex-basis: 0;
358
+ margin-left: 0.5rem;
359
+ margin-right: 0.5rem;
360
+ }
361
+ }
362
+
363
+ .pre-wrap {
364
+ white-space: pre-wrap;
365
+ }
366
+
367
+ // make 'readonly' inputs looks disabled
368
+ // (can't use 'disabled' because we want normal error styling)
369
+ .v-select.v-input--is-readonly,
370
+ .v-text-field.v-input--is-readonly {
371
+ pointer-events: none;
372
+
373
+ ::v-deep .v-label {
374
+ // set label colour to same as disabled
375
+ color: rgba(0,0,0,.38);
376
+ }
377
+
378
+ ::v-deep .v-select__selection {
379
+ // set selection colour to same as disabled
380
+ color: rgba(0,0,0,.38);
381
+ }
382
+
383
+ ::v-deep .v-icon {
384
+ // set error icon colour to same as disabled
385
+ color: rgba(0,0,0,.38) !important;
386
+ opacity: 0.6;
387
+ }
388
+ }
389
+ </style>