@lancom/shared 0.0.372 → 0.0.374

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,6 +1,13 @@
1
+
2
+ const phoneValidators = {
3
+ '+61': /^[0-9]{9,10}$/
4
+ }
5
+
1
6
  export const phone = {
2
- validate: value => {
3
- return /^[0-9-()\s+]+$/.test(`${value}`); // todo add validation for phone number
7
+ validate: (value, params) => {
8
+ const [code] = params || [];
9
+ const exp = phoneValidators[code] || /^[0-9-()\s+]+$/;
10
+ return exp.test(`${value || ''}`);
4
11
  },
5
12
  message: 'Phone number is not valid'
6
13
  };
@@ -66,35 +66,10 @@
66
66
  {{ errors[0] }}
67
67
  </span>
68
68
  </validation-provider>
69
- <validation-provider
70
- v-slot="{ errors }"
71
- tag="div"
72
- name="Phone"
73
- :rules="phoneRules"
74
- class="form-row">
75
- <input
76
- id="phone"
77
- ref="phone"
78
- v-model="form.phone"
79
- name="phone"
80
- type="phone"
81
- class="form-field"
82
- :class="{
83
- 'is-danger': errors.length,
84
- filled: form.phone
85
- }"
86
- @keyup.enter="$refs.phone.focus()" />
87
- <label
88
- for="phone"
89
- class="form-label label-inner">
90
- Phone number
91
- </label>
92
- <span
93
- v-if="errors.length"
94
- class="form-help is-danger">
95
- {{ errors[0] }}
96
- </span>
97
- </validation-provider>
69
+ <phone-input
70
+ :labelless="false"
71
+ :required="requiredPhone"
72
+ v-model="form.phone" />
98
73
  <validation-provider
99
74
  v-slot="{ errors }"
100
75
  tag="div"
@@ -170,11 +145,13 @@ import { mapGetters } from 'vuex';
170
145
  import api from '@lancom/shared/assets/js/api';
171
146
  import gtm from '@lancom/shared/assets/js/utils/gtm';
172
147
  import EmailLink from '@lancom/shared/components/email_link/email-link';
148
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
173
149
 
174
150
  export default {
175
151
  name: 'LancomContactUs',
176
152
  components: {
177
- EmailLink
153
+ EmailLink,
154
+ PhoneInput
178
155
  },
179
156
  props: {
180
157
  btnClass: {
@@ -193,10 +170,7 @@ export default {
193
170
  };
194
171
  },
195
172
  computed: {
196
- ...mapGetters(['contacts', 'shop', 'googleClickId']),
197
- phoneRules() {
198
- return this.requiredPhone ? 'required|phone' : 'phone';
199
- }
173
+ ...mapGetters(['contacts', 'shop', 'googleClickId'])
200
174
  },
201
175
  // mounted() {
202
176
  // this.preloadReCaptcha();
@@ -66,35 +66,9 @@
66
66
  {{ errors[0] }}
67
67
  </span>
68
68
  </validation-provider>
69
- <validation-provider
70
- v-slot="{ errors }"
71
- tag="div"
72
- name="Phone"
73
- rules="required|phone"
74
- class="form-row">
75
- <input
76
- id="phone"
77
- ref="phone"
78
- v-model="form.phone"
79
- name="phone"
80
- type="phone"
81
- class="form-field"
82
- :class="{
83
- 'is-danger': errors.length,
84
- filled: form.phone
85
- }"
86
- @keyup.enter="$refs.phone.focus()" />
87
- <label
88
- for="phone"
89
- class="form-label label-inner">
90
- Phone number
91
- </label>
92
- <span
93
- v-if="errors.length"
94
- class="form-help is-danger">
95
- {{ errors[0] }}
96
- </span>
97
- </validation-provider>
69
+ <phone-input
70
+ :labelless="false"
71
+ v-model="form.phone" />
98
72
  <validation-provider
99
73
  v-slot="{ errors }"
100
74
  tag="div"
@@ -142,12 +116,16 @@ import api from '@lancom/shared/assets/js/api';
142
116
  import { side } from '@lancom/shared/assets/js/utils/filters';
143
117
  import { generateCartProducts } from '@lancom/shared/assets/js/utils/product';
144
118
  import { populateProductsFields } from '@lancom/shared/assets/js/utils/order';
119
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
145
120
 
146
121
  export default {
147
122
  name: 'OfferScreenPrinting',
148
123
  filters: {
149
124
  side
150
125
  },
126
+ components: {
127
+ PhoneInput
128
+ },
151
129
  data() {
152
130
  return {
153
131
  form: {},
@@ -93,36 +93,7 @@
93
93
  {{ errors[0] }}
94
94
  </span>
95
95
  </validation-provider>
96
- <validation-provider
97
- v-slot="{ errors }"
98
- tag="div"
99
- :name="namePrefix + 'Phone'"
100
- rules="required|phone"
101
- class="form-col col-half">
102
- <label
103
- :for="'phone'+uniqueKey"
104
- class="form-label">
105
- Phone number
106
- </label>
107
- <input
108
- :id="'phone'+uniqueKey"
109
- ref="phone"
110
- v-model="address.phone"
111
- placeholder="Phone"
112
- :name="'phone'+uniqueKey"
113
- type="text"
114
- class="form-field labelless"
115
- :class="{
116
- 'is-danger': errors.length,
117
- filled: address.phone
118
- }"
119
- @keyup.enter="$refs.phone.focus()" />
120
- <span
121
- v-if="errors.length"
122
- class="form-help is-danger">
123
- {{ errors[0] }}
124
- </span>
125
- </validation-provider>
96
+ <phone-input v-model="address.phone" class="form-col col-half" />
126
97
  </div>
127
98
  <validation-provider
128
99
  v-slot="{ errors }"
@@ -248,11 +219,13 @@
248
219
  <script>
249
220
  import { mapGetters, mapMutations, mapActions } from 'vuex';
250
221
  import PostcodeSelect from '@lancom/shared/components/common/postcode_select/postcode-select';
222
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
251
223
 
252
224
  export default {
253
225
  name: 'AddressForm',
254
226
  components: {
255
- PostcodeSelect
227
+ PostcodeSelect,
228
+ PhoneInput
256
229
  },
257
230
  data() {
258
231
  return {
@@ -0,0 +1,12 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .CustomerAddressForm {
4
+ &__copy-btn {
5
+ position: absolute;
6
+ top: 7px;
7
+ right: 5px;
8
+ border-bottom: dashed;
9
+ cursor: pointer;
10
+ font-size: 14px;
11
+ }
12
+ }
@@ -0,0 +1,136 @@
1
+ <template>
2
+ <div>
3
+ <div class="form-row">
4
+ <label
5
+ v-if="labelless"
6
+ class="form-label"
7
+ @click="$refs.phone.$el.focus()">
8
+ {{ displayLabelText }}
9
+ </label>
10
+ <div style="display: flex">
11
+ <div >
12
+ <multiselect
13
+ class="labelless"
14
+ v-model="code"
15
+ :options="codes"
16
+ style="margin-right: 5px; width: 130px;" />
17
+ </div>
18
+ <div style="flex-grow: 1;">
19
+ <validation-provider
20
+ v-slot="{ errors }"
21
+ tag="div"
22
+ class="form-row"
23
+ style="margin-bottom: 0;"
24
+ :name="namePrefix + 'Phone'"
25
+ :rules="required ? `required|phone:${code}` : `phone:${code}`">
26
+ <input
27
+ :id="'phone' + uniqueKey"
28
+ ref="phone"
29
+ v-model="model"
30
+ :placeholder="labelless ? placeholder : ''"
31
+ :disabled="disabled"
32
+ :name="'phone' + uniqueKey"
33
+ type="text"
34
+ class="form-field"
35
+ :class="{
36
+ 'is-danger': errors.length,
37
+ filled: model,
38
+ labelless
39
+ }" />
40
+ <label
41
+ v-if="!labelless"
42
+ class="form-label label-inner"
43
+ :for="'phone' + uniqueKey">
44
+ {{ displayLabelText }}
45
+ </label>
46
+ <span
47
+ v-if="errors.length"
48
+ class="form-help is-danger">
49
+ {{ errors[0] }}
50
+ </span>
51
+ </validation-provider>
52
+ </div>
53
+
54
+ </div>
55
+ </div>
56
+ <span
57
+ v-if="copyFrom"
58
+ class="CustomerAddressForm__copy-btn"
59
+ @click="$emit('copy')">
60
+ copy
61
+ </span>
62
+ </div>
63
+ </template>
64
+
65
+ <script>
66
+ import Multiselect from 'vue-multiselect';
67
+
68
+ export default {
69
+ name: 'PhoneInput',
70
+ components: {
71
+ Multiselect
72
+ },
73
+ props: {
74
+ codeCountry: {
75
+ type: Object
76
+ },
77
+ value: {
78
+ type: String
79
+ },
80
+ labelText: {
81
+ type: String
82
+ },
83
+ containerClass: {
84
+ type: String
85
+ },
86
+ placeholder: {
87
+ type: String,
88
+ default: 'Phone'
89
+ },
90
+ copyFrom: {
91
+ type: Boolean,
92
+ default: false
93
+ },
94
+ labelless: {
95
+ type: Boolean,
96
+ default: true
97
+ },
98
+ required: {
99
+ type: Boolean,
100
+ default: true
101
+ },
102
+ disabled: {
103
+ type: Boolean,
104
+ default: false
105
+ },
106
+ namePrefix: {
107
+ type: String,
108
+ default: ''
109
+ }
110
+ },
111
+ data() {
112
+ return {
113
+ code: '+61',
114
+ uniqueKey: Math.random(),
115
+ codes: ['+44','+61'],
116
+ };
117
+ },
118
+ computed: {
119
+ displayLabelText() {
120
+ return this.labelText || 'Phone number';
121
+ },
122
+ model: {
123
+ get() {
124
+ return (this.value || '').replace(/^\+[0-9]{2}/, '');
125
+ },
126
+ set(phone) {
127
+ this.$emit('input', `${this.code}${phone}`);
128
+ }
129
+ }
130
+ }
131
+ };
132
+ </script>
133
+
134
+ <style lang="scss">
135
+ @import 'phone-input';
136
+ </style>
@@ -62,33 +62,9 @@
62
62
  {{ errors[0] }}
63
63
  </span>
64
64
  </validation-provider>
65
- <validation-provider
66
- v-slot="{ errors }"
67
- tag="div"
68
- name="Phone"
69
- class="form-row">
70
- <label
71
- for="phone"
72
- class="form-label">
73
- Phone (optional)
74
- </label>
75
- <input
76
- id="phone"
77
- v-model="customer.phone"
78
- name="phone"
79
- type="number"
80
- class="form-field labelless"
81
- placeholder="Phone"
82
- :class="{
83
- 'is-invalid': errors.length,
84
- filled: customer.phone
85
- }" />
86
- <span
87
- v-if="errors.length"
88
- class="form-help is-danger">
89
- {{ errors[0] }}
90
- </span>
91
- </validation-provider>
65
+ <phone-input
66
+ v-model="customer.phone"
67
+ label-text="Phone (optional)" />
92
68
  </div>
93
69
  <div class="col-6">
94
70
  <validation-provider
@@ -222,12 +198,14 @@
222
198
  <script>
223
199
  import { mapGetters } from 'vuex';
224
200
  import PostcodeSelect from '@lancom/shared/components/common/postcode_select/postcode-select';
201
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
225
202
  import api from '@lancom/shared/assets/js/api';
226
203
 
227
204
  export default {
228
205
  name: 'CustomerForm',
229
206
  components: {
230
- PostcodeSelect
207
+ PostcodeSelect,
208
+ PhoneInput
231
209
  },
232
210
  props: {
233
211
  customer: {
@@ -51,35 +51,9 @@
51
51
  {{ errors[0] }}
52
52
  </span>
53
53
  </validation-provider>
54
- <validation-provider
55
- v-slot="{ errors }"
56
- tag="div"
57
- name="Phone"
58
- rules="required"
59
- class="form-col col-half">
60
- <input
61
- id="phone"
62
- ref="phone"
63
- v-model="form.phone"
64
- name="phone"
65
- type="text"
66
- class="form-field"
67
- :class="{
68
- 'is-danger': errors.length,
69
- filled: form.phone
70
- }"
71
- @keyup.enter="$refs.phone.focus()" />
72
- <label
73
- for="phone"
74
- class="form-label label-inner">
75
- Phone number
76
- </label>
77
- <span
78
- v-if="errors.length"
79
- class="form-help is-danger">
80
- {{ errors[0] }}
81
- </span>
82
- </validation-provider>
54
+ <phone-input
55
+ v-model="form.phone"
56
+ class="form-col col-half" />
83
57
  </div>
84
58
  <validation-provider
85
59
  v-if="!isSent"
@@ -136,9 +110,13 @@
136
110
  <script>
137
111
  import api from '@lancom/shared/assets/js/api';
138
112
  import { mapGetters } from 'vuex';
113
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
139
114
 
140
115
  export default {
141
116
  name: 'FailedConversionModal',
117
+ components: {
118
+ PhoneInput
119
+ },
142
120
  props: {
143
121
  file: {
144
122
  type: Object,
@@ -40,35 +40,9 @@
40
40
  {{ errors[0] }}
41
41
  </span>
42
42
  </validation-provider>
43
- <validation-provider
44
- v-slot="{ errors }"
45
- tag="div"
46
- name="Phone"
47
- rules="required"
48
- class="form-col col-half">
49
- <input
50
- id="phone"
51
- ref="phone"
52
- v-model="form.phone"
53
- name="phone"
54
- type="text"
55
- class="form-field"
56
- :class="{
57
- 'is-danger': errors.length,
58
- filled: form.phone
59
- }"
60
- @keyup.enter="$refs.phone.focus()" />
61
- <label
62
- for="phone"
63
- class="form-label label-inner">
64
- Phone number
65
- </label>
66
- <span
67
- v-if="errors.length"
68
- class="form-help is-danger">
69
- {{ errors[0] }}
70
- </span>
71
- </validation-provider>
43
+ <phone-input
44
+ v-model="form.phone"
45
+ class="form-col col-half" />
72
46
  </div>
73
47
  <validation-provider
74
48
  v-slot="{ errors }"
@@ -269,6 +243,7 @@
269
243
  <script>
270
244
  import { mapGetters, mapActions, mapMutations } from 'vuex';
271
245
  import PostcodeSelect from '@lancom/shared/components/common/postcode_select/postcode-select';
246
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
272
247
  import ProductTotalPricing from '@lancom/shared/components/common/products_total_pricing/products-total-pricing';
273
248
  import { price } from '@lancom/shared/assets/js/utils/filters';
274
249
 
@@ -277,7 +252,8 @@ export default {
277
252
  filters: { price },
278
253
  components: {
279
254
  PostcodeSelect,
280
- ProductTotalPricing
255
+ ProductTotalPricing,
256
+ PhoneInput
281
257
  },
282
258
  props: {
283
259
  switchModal: {
@@ -35,35 +35,9 @@
35
35
  {{ errors[0] }}
36
36
  </span>
37
37
  </validation-provider>
38
- <validation-provider
39
- v-slot="{ errors }"
40
- tag="div"
41
- name="Phone"
42
- rules="required|phone"
43
- class="form-row">
44
- <label
45
- for="quote-request-name"
46
- class="form-label">
47
- Your Phone
48
- </label>
49
- <input
50
- id="quote-request-phone"
51
- ref="name"
52
- v-model="quote.address.phone"
53
- name="phone"
54
- placeholder="Phone"
55
- type="text"
56
- class="form-field labelless"
57
- :class="{
58
- 'is-danger': errors.length,
59
- filled: quote.address.phone
60
- }" />
61
- <span
62
- v-if="errors.length"
63
- class="form-help is-danger">
64
- {{ errors[0] }}
65
- </span>
66
- </validation-provider>
38
+ <phone-input
39
+ class="form-row"
40
+ v-model="quote.address.phone" />
67
41
  <validation-provider
68
42
  v-slot="{ errors }"
69
43
  tag="div"
@@ -322,6 +296,7 @@ import { mapGetters } from 'vuex';
322
296
  import CheckedIcon from '@lancom/shared/components/common/checked-icon';
323
297
  import FileUploader from '@lancom/shared/components/common/file_uploader';
324
298
  import PostcodeSelect from '@lancom/shared/components/common/postcode_select/postcode-select';
299
+ import PhoneInput from '@lancom/shared/components/common/phone_input/phone-input';
325
300
 
326
301
  export default {
327
302
  name: 'QuoteRequest',
@@ -329,7 +304,8 @@ export default {
329
304
  CheckedIcon,
330
305
  FileUploader,
331
306
  PostcodeSelect,
332
- Multiselect
307
+ Multiselect,
308
+ PhoneInput
333
309
  },
334
310
  data() {
335
311
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancom/shared",
3
- "version": "0.0.372",
3
+ "version": "0.0.374",
4
4
  "description": "lancom common scripts",
5
5
  "author": "e.tokovenko <e.tokovenko@gmail.com>",
6
6
  "repository": {
@@ -52,7 +52,7 @@ module.exports = async function (req, res, next) {
52
52
  lead.hashedPhoneNumber,
53
53
  lead.conversionValue,
54
54
  lead.conversion?.isoCode || 'AUD',
55
- lead.code
55
+ lead.order?.code || lead.quote?.code || lead.contact?.code
56
56
  ]);
57
57
 
58
58
  const csvContent = [