adp-web-components 0.0.47 → 0.0.48
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/dist/cjs/contact-us-form.cjs.entry.js +4801 -57
- package/dist/cjs/dead-stock-lookup_3.cjs.entry.js +1 -1
- package/dist/cjs/dynamic-claim_6.cjs.entry.js +3 -2
- package/dist/cjs/dynamic-redeem.cjs.entry.js +1 -1
- package/dist/cjs/form-input_4.cjs.entry.js +10 -6
- package/dist/cjs/form-structure_2.cjs.entry.js +3 -3
- package/dist/cjs/{get-local-language-3ae85685.js → get-local-language-ebb05d9e.js} +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/part-lookup.cjs.entry.js +1 -1
- package/dist/cjs/shift-components.cjs.js +1 -1
- package/dist/cjs/vehicle-lookup.cjs.entry.js +1 -1
- package/dist/collection/components/form-elements/form-input.css +1 -1
- package/dist/collection/components/form-elements/form-input.js +59 -1
- package/dist/collection/components/form-elements/form-select.css +1 -1
- package/dist/collection/components/form-elements/form-structure-error.css +1 -1
- package/dist/collection/components/form-elements/form-structure.css +1 -1
- package/dist/collection/components/form-elements/form-submit.css +1 -1
- package/dist/collection/components/form-elements/form-text-area.css +1 -1
- package/dist/collection/components/forms/contact-us/form.css +1 -0
- package/dist/collection/components/forms/contact-us/mapper.js +12 -0
- package/dist/collection/components/forms/contact-us/params.js +72 -0
- package/dist/collection/components/forms/contact-us/validations.js +19 -0
- package/dist/collection/components/forms/contact-us-form.js +6 -74
- package/dist/collection/components/vehicle-lookup/vehicle-specification.js +2 -1
- package/dist/collection/global/lib/validate-form-structure.js +2 -2
- package/dist/collection/templates/vehicle-lookup/mock-data.js +1 -5
- package/dist/components/contact-us-form.js +1 -1
- package/dist/components/dead-stock-lookup.js +1 -1
- package/dist/components/distributor-lookup.js +1 -1
- package/dist/components/dynamic-claim.js +1 -1
- package/dist/components/dynamic-redeem.js +1 -1
- package/dist/components/form-input.js +1 -1
- package/dist/components/form-select.js +1 -1
- package/dist/components/form-structure-error.js +1 -1
- package/dist/components/form-structure.js +1 -1
- package/dist/components/form-submit.js +1 -1
- package/dist/components/form-text-area.js +1 -1
- package/dist/components/manufacturer-lookup.js +1 -1
- package/dist/components/{p-40bb71e4.js → p-08357e63.js} +1 -1
- package/dist/components/{p-e4ae4434.js → p-0d76f2b9.js} +1 -1
- package/dist/components/{p-0f15eb0b.js → p-171807db.js} +1 -1
- package/dist/components/{p-21feb9cb.js → p-344f4417.js} +1 -1
- package/dist/components/p-5d5842e9.js +5 -0
- package/dist/components/{p-ce440126.js → p-62beac88.js} +1 -1
- package/dist/components/p-638e64fa.js +5 -0
- package/dist/components/{p-d70c3cbd.js → p-7e62f352.js} +1 -1
- package/dist/components/p-87da0395.js +5 -0
- package/dist/components/{p-b901ce51.js → p-8de98849.js} +1 -1
- package/dist/components/{p-5d3abb5b.js → p-9a50bc07.js} +1 -1
- package/dist/components/p-aae5c784.js +5 -0
- package/dist/components/{p-8db6fbb6.js → p-ac4a782f.js} +1 -1
- package/dist/components/p-af8083e5.js +5 -0
- package/dist/components/{p-d8a1e55d.js → p-b400d6f6.js} +1 -1
- package/dist/components/{p-7f889bd6.js → p-bb28c098.js} +1 -1
- package/dist/components/p-da2ea879.js +5 -0
- package/dist/components/{p-5e1738a6.js → p-fefbfbe8.js} +1 -1
- package/dist/components/paint-thickness.js +1 -1
- package/dist/components/part-lookup.js +1 -1
- package/dist/components/service-history.js +1 -1
- package/dist/components/vehicle-accessories.js +1 -1
- package/dist/components/vehicle-lookup.js +1 -1
- package/dist/components/vehicle-specification.js +1 -1
- package/dist/components/warranty-details.js +1 -1
- package/dist/esm/contact-us-form.entry.js +4801 -57
- package/dist/esm/dead-stock-lookup_3.entry.js +1 -1
- package/dist/esm/dynamic-claim_6.entry.js +3 -2
- package/dist/esm/dynamic-redeem.entry.js +1 -1
- package/dist/esm/form-input_4.entry.js +10 -6
- package/dist/esm/form-structure_2.entry.js +3 -3
- package/dist/esm/{get-local-language-cd53bfd4.js → get-local-language-50038b04.js} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/part-lookup.entry.js +1 -1
- package/dist/esm/shift-components.js +1 -1
- package/dist/esm/vehicle-lookup.entry.js +1 -1
- package/dist/locales/ar.json +1 -1
- package/dist/locales/ku.json +1 -1
- package/dist/shift-components/{p-974f9490.entry.js → p-49005e96.entry.js} +1 -1
- package/dist/shift-components/{p-359ea480.entry.js → p-4e5e528c.entry.js} +1 -1
- package/dist/shift-components/{p-36423afa.entry.js → p-6cd76655.entry.js} +1 -1
- package/dist/shift-components/p-96570d9d.entry.js +5 -0
- package/dist/shift-components/{p-ba46e8f2.entry.js → p-983cb144.entry.js} +1 -1
- package/dist/shift-components/p-aad6afa6.entry.js +5 -0
- package/dist/shift-components/{p-f4b4e9d2.js → p-b11c327e.js} +1 -1
- package/dist/shift-components/{p-b8390527.entry.js → p-b7d8b392.entry.js} +1 -1
- package/dist/shift-components/p-bc1b619c.entry.js +5 -0
- package/dist/shift-components/shift-components.esm.js +1 -1
- package/dist/types/components/form-elements/form-input.d.ts +3 -0
- package/dist/types/components/forms/contact-us/mapper.d.ts +2 -0
- package/dist/types/components/forms/contact-us/params.d.ts +2 -0
- package/dist/types/components/forms/contact-us/validations.d.ts +26 -0
- package/dist/types/components/forms/contact-us-form.d.ts +2 -19
- package/dist/types/components.d.ts +6 -0
- package/dist/types/global/lib/validate-form-structure.d.ts +2 -2
- package/dist/types/global/types/forms.d.ts +1 -1
- package/package.json +2 -1
- package/dist/collection/components/forms/contact-us-form.css +0 -1
- package/dist/components/p-14df0c85.js +0 -5
- package/dist/components/p-176b63e3.js +0 -5
- package/dist/components/p-4bae9c16.js +0 -5
- package/dist/components/p-64e16378.js +0 -5
- package/dist/components/p-9faefa40.js +0 -5
- package/dist/components/p-b224d16f.js +0 -5
- package/dist/shift-components/p-14de3422.entry.js +0 -5
- package/dist/shift-components/p-6cc94857.entry.js +0 -5
- package/dist/shift-components/p-ecc53648.entry.js +0 -5
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by ShiftSoftware
|
|
3
|
+
* Copyright (c)
|
|
4
|
+
*/
|
|
5
|
+
import { CITY_ENDPOINT } from "../../../global/api/urls";
|
|
6
|
+
import { getLocaleLanguage } from "../../../global/lib/get-local-language";
|
|
7
|
+
import { phoneValidator } from "./validations";
|
|
8
|
+
const name = {
|
|
9
|
+
label: 'fullName',
|
|
10
|
+
formLocaleName: 'contactUs',
|
|
11
|
+
};
|
|
12
|
+
const email = {
|
|
13
|
+
type: 'email',
|
|
14
|
+
label: 'emailAddress',
|
|
15
|
+
formLocaleName: 'contactUs',
|
|
16
|
+
};
|
|
17
|
+
const message = {
|
|
18
|
+
label: 'writeAMessage',
|
|
19
|
+
formLocaleName: 'contactUs',
|
|
20
|
+
placeholder: 'leaveUsMessage',
|
|
21
|
+
};
|
|
22
|
+
const phone = {
|
|
23
|
+
type: 'text',
|
|
24
|
+
label: 'phoneNumber',
|
|
25
|
+
numberDirection: true,
|
|
26
|
+
formLocaleName: 'contactUs',
|
|
27
|
+
defaultValue: phoneValidator.default,
|
|
28
|
+
onChangeMiddleware: (event) => {
|
|
29
|
+
const target = event.target;
|
|
30
|
+
phoneValidator.reset();
|
|
31
|
+
target.value = phoneValidator.input(target.value);
|
|
32
|
+
return event;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const cityId = {
|
|
36
|
+
label: 'city',
|
|
37
|
+
placeholder: 'selectCity',
|
|
38
|
+
formLocaleName: 'contactUs',
|
|
39
|
+
fetcher: async (language, signal) => {
|
|
40
|
+
const response = await fetch(CITY_ENDPOINT, { signal, headers: { 'Accept-Language': language } });
|
|
41
|
+
const arrayRes = (await response.json());
|
|
42
|
+
const selectItems = arrayRes.map(item => ({ label: item.Name, value: item.ID }));
|
|
43
|
+
return selectItems;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
const generalTicketType = {
|
|
47
|
+
label: 'inquiryType',
|
|
48
|
+
formLocaleName: 'contactUs',
|
|
49
|
+
placeholder: 'selectInquiryType',
|
|
50
|
+
fetcher: async (language, _) => {
|
|
51
|
+
const ticketTypes = (await getLocaleLanguage(language)).generalTicketTypes;
|
|
52
|
+
const generalInquiryTypes = [
|
|
53
|
+
{
|
|
54
|
+
value: 'GeneralInquiry',
|
|
55
|
+
label: ticketTypes.GeneralInquiry,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
value: 'Complaint',
|
|
59
|
+
label: ticketTypes.Complaint,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
return generalInquiryTypes;
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export const formFieldParams = {
|
|
66
|
+
name,
|
|
67
|
+
email,
|
|
68
|
+
message,
|
|
69
|
+
phone,
|
|
70
|
+
cityId,
|
|
71
|
+
generalTicketType,
|
|
72
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by ShiftSoftware
|
|
3
|
+
* Copyright (c)
|
|
4
|
+
*/
|
|
5
|
+
import { AsYouType } from "libphonenumber-js";
|
|
6
|
+
import { object, string } from "yup";
|
|
7
|
+
export const phoneValidator = new AsYouType('IQ');
|
|
8
|
+
phoneValidator.default = '+' + phoneValidator.metadata.numberingPlan.metadata[0];
|
|
9
|
+
phoneValidator.input(phoneValidator.default);
|
|
10
|
+
export const contactUsSchema = object({
|
|
11
|
+
cityId: string(),
|
|
12
|
+
email: string().email('emailAddressNotValid'),
|
|
13
|
+
message: string().required('messageIsRequired'),
|
|
14
|
+
generalTicketType: string().required('inquiryTypeIsRequired'),
|
|
15
|
+
name: string().required('fullNameIsRequired').min(3, 'fullNameMinimum'),
|
|
16
|
+
phone: string()
|
|
17
|
+
.required('phoneNumberIsRequired')
|
|
18
|
+
.test('libphonenumber-validation', 'phoneNumberFormatInvalid', () => phoneValidator.isValid()),
|
|
19
|
+
});
|
|
@@ -2,84 +2,16 @@
|
|
|
2
2
|
* Built by ShiftSoftware
|
|
3
3
|
* Copyright (c)
|
|
4
4
|
*/
|
|
5
|
-
import { object, string } from "yup";
|
|
6
5
|
import { Host, h } from "@stencil/core";
|
|
7
6
|
import { localeSchema } from "../../global/types/locales/index";
|
|
8
7
|
import cn from "../../global/lib/cn";
|
|
9
8
|
import { FormHook } from "../../global/lib/form-hook";
|
|
10
9
|
import { getLocaleLanguage } from "../../global/lib/get-local-language";
|
|
11
10
|
import { isValidStructure } from "../../global/lib/validate-form-structure";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
message: string().required('messageIsRequired'),
|
|
17
|
-
generalTicketType: string().required('inquiryTypeIsRequired'),
|
|
18
|
-
name: string().required('fullNameIsRequired').min(3, 'fullNameMinimum'),
|
|
19
|
-
phone: string()
|
|
20
|
-
.required('phoneNumberIsRequired')
|
|
21
|
-
.transform(value => value.replace(/^0/, ''))
|
|
22
|
-
.matches(/^\d+$/, 'phoneNumberFormatInvalid')
|
|
23
|
-
.length(10, 'phoneNumberFormatInvalid'),
|
|
24
|
-
});
|
|
25
|
-
const formElementMapper = {
|
|
26
|
-
name: 'text',
|
|
27
|
-
email: 'text',
|
|
28
|
-
phone: 'number',
|
|
29
|
-
cityId: 'select',
|
|
30
|
-
message: 'text-area',
|
|
31
|
-
generalTicketType: 'select',
|
|
32
|
-
};
|
|
33
|
-
const formFieldParams = {
|
|
34
|
-
name: {
|
|
35
|
-
label: 'fullName',
|
|
36
|
-
formLocaleName: 'contactUs',
|
|
37
|
-
},
|
|
38
|
-
email: {
|
|
39
|
-
type: 'email',
|
|
40
|
-
label: 'emailAddress',
|
|
41
|
-
formLocaleName: 'contactUs',
|
|
42
|
-
},
|
|
43
|
-
message: {
|
|
44
|
-
label: 'writeAMessage',
|
|
45
|
-
formLocaleName: 'contactUs',
|
|
46
|
-
placeholder: 'leaveUsMessage',
|
|
47
|
-
},
|
|
48
|
-
phone: { inputPreFix: '+964', type: 'number', label: 'phoneNumber', formLocaleName: 'contactUs' },
|
|
49
|
-
cityId: {
|
|
50
|
-
label: 'city',
|
|
51
|
-
placeholder: 'selectCity',
|
|
52
|
-
formLocaleName: 'contactUs',
|
|
53
|
-
fetcher: async (language, signal) => {
|
|
54
|
-
const response = await fetch(CITY_ENDPOINT, { signal, headers: { 'Accept-Language': language } });
|
|
55
|
-
const arrayRes = (await response.json());
|
|
56
|
-
const selectItems = arrayRes.map(item => ({ label: item.Name, value: item.ID }));
|
|
57
|
-
return selectItems;
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
generalTicketType: {
|
|
61
|
-
label: 'inquiryType',
|
|
62
|
-
formLocaleName: 'contactUs',
|
|
63
|
-
placeholder: 'selectInquiryType',
|
|
64
|
-
fetcher: async (language, _) => {
|
|
65
|
-
const ticketTypes = (await getLocaleLanguage(language)).generalTicketTypes;
|
|
66
|
-
const generalInquiryTypes = [
|
|
67
|
-
{
|
|
68
|
-
value: 'GeneralInquiry',
|
|
69
|
-
label: ticketTypes.GeneralInquiry,
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
value: 'Complaint',
|
|
73
|
-
label: ticketTypes.Complaint,
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
|
-
return generalInquiryTypes;
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
const themes = {
|
|
81
|
-
tiq: '["div#container", ["div#inputs_wrapper", "name", "email", "cityId", "phone", "generalTicketType" ], "message#message",["div#recaptcha_container", "slot"], "submit.Submit"]',
|
|
82
|
-
};
|
|
11
|
+
import { formFieldParams } from "./contact-us/params";
|
|
12
|
+
import { formElementMapper } from "./contact-us/mapper";
|
|
13
|
+
import { contactUsSchema } from "./contact-us/validations";
|
|
14
|
+
import themes from "./contact-us/themes.json";
|
|
83
15
|
export class ContactUsForm {
|
|
84
16
|
constructor() {
|
|
85
17
|
this.recaptchaWidget = null;
|
|
@@ -169,12 +101,12 @@ export class ContactUsForm {
|
|
|
169
101
|
static get is() { return "contact-us-form"; }
|
|
170
102
|
static get originalStyleUrls() {
|
|
171
103
|
return {
|
|
172
|
-
"$": ["contact-us
|
|
104
|
+
"$": ["contact-us/form.css"]
|
|
173
105
|
};
|
|
174
106
|
}
|
|
175
107
|
static get styleUrls() {
|
|
176
108
|
return {
|
|
177
|
-
"$": ["contact-us
|
|
109
|
+
"$": ["contact-us/form.css"]
|
|
178
110
|
};
|
|
179
111
|
}
|
|
180
112
|
static get properties() {
|
|
@@ -92,7 +92,8 @@ export class VehicleSpecification {
|
|
|
92
92
|
return (h(Host, { key: '6ed532937cdafcfab7aabc39bbfd0d4c1dff1b00' }, h("div", { key: 'ddb8b2dc2838a030499b5241f3dfa15f7a68bf07', dir: this.locale.direction, class: "min-h-[100px] relative transition-all duration-300 overflow-hidden" }, h("div", { key: 'f81b91d6c7cfd81df70b691b56b10c26ebaf1efc' }, h(Loading, { key: 'b96b054448c12ccbaf6fa6291382f51e3c334376', isLoading: this.state.includes('loading') }), h("div", { key: '76cd0cc45c7f84986bd813effac5a53a0295c491', class: cn('transition-all duration-700', { 'scale-0': this.state.includes('loading') || this.state === 'idle', 'opacity-0': this.state.includes('loading') }) }, h("div", { key: '60724b3858a6707e3afa18d985f50616fa8484f0', class: cn('text-center pt-[4px] text-[20px]', { 'text-red-600': !!this.errorMessage }) }, (_a = this.vehicleInformation) === null || _a === void 0 ? void 0 : _a.vin), ['error', 'error-loading'].includes(this.state) && (h("div", { key: '60dcc26e1ecceb4cbca2c2de1e6db439c17e1019', class: "py-[16px] min-h-[100px] flex items-center" }, h("div", { key: '4d3c1afca968d2c7fc2a925fc626d70492f49869', class: "px-[16px] py-[8px] border reject-card text-[20px] rounded-[8px] w-fit mx-auto" }, this.locale.errors[this.errorMessage] || this.locale.errors.wildCard))), ['data', 'data-loading'].includes(this.state) && (h("div", { key: 'af212e18ce332b031699b6c3e00df805fbc31db1', class: "flex mt-[12px] max-h-[70dvh] overflow-hidden rounded-[4px] flex-col border border-[#d6d8dc]" }, h("div", { key: '21a2974e7222b7d6a8fcaa2df1978ecf7670eedf', class: "w-full h-[40px] flex shrink-0 justify-center text-[18px] items-center text-[#383c43] text-center bg-[#e1e3e5]" }, texts.vehicleSpecification), h("div", { key: 'b3413a1f409cebfa51c3c84aab4acb1ddf88e3ac', class: "h-0 overflow-auto flex-1" }, !((_b = this.vehicleInformation) === null || _b === void 0 ? void 0 : _b.vehicleSpecification) && h("div", { key: '4e1d80fd788a29fce807c7bf7a55cf306691c614', class: "h-[80px] flex items-center justify-center text-[18px]" }, texts.noData), !!((_c = this.vehicleInformation) === null || _c === void 0 ? void 0 : _c.vehicleSpecification) && (h("table", { key: 'b8edb5185c70b660818af1023ecdff2d371732fd', class: "w-full overflow-auto relative border-collapse" }, h("thead", { key: 'fb412628f875cca8d6a9d6921e9bec42a4ee4a64', class: "top-0 font-bold sticky bg-white" }, h("tr", { key: '7676f04f48b6fce484f65f0c80a17e2c500eba27' }, ['model', 'variant', 'katashiki', 'modelYear', 'sfx'].map(title => (h("th", { key: title, class: "px-[10px] py-[20px] text-center whitespace-nowrap border-b border-[#d6d8dc]" }, texts[title]))))), h("tbody", { key: '1075c4b0ea60a3ccca8c84ff0e85dbc743c2d344' }, h("tr", { key: 'a2e4bae8f5c53f9b2447242b12bba65288e7cece' }, h("td", { key: 'a792eb66c320e92c1b6a04159cf7f3d7076b30d3', class: "px-[10px] py-[20px] text-center whitespace-nowrap" }, ((_e = (_d = this === null || this === void 0 ? void 0 : this.vehicleInformation) === null || _d === void 0 ? void 0 : _d.vehicleVariantInfo) === null || _e === void 0 ? void 0 : _e.modelCode) || '...', " ", h("br", { key: '2994aa18bdadecc364a34a0f9d3b88908e2c6676', class: "my-2" }), ((_g = (_f = this === null || this === void 0 ? void 0 : this.vehicleInformation) === null || _f === void 0 ? void 0 : _f.vehicleSpecification) === null || _g === void 0 ? void 0 : _g.modelDesc) || '...'), h("td", { key: '215d557dab5b54a432cc0a1fe8f0dde27aa1a5b4', class: "px-[10px] py-[20px] text-center whitespace-nowrap" }, ((_j = (_h = this === null || this === void 0 ? void 0 : this.vehicleInformation) === null || _h === void 0 ? void 0 : _h.identifiers) === null || _j === void 0 ? void 0 : _j.variant) || '...', " ", h("br", { key: 'ec59b6a49dd36a203d879bd60fd36094f3bc9407' }), ((_l = (_k = this === null || this === void 0 ? void 0 : this.vehicleInformation) === null || _k === void 0 ? void 0 : _k.vehicleSpecification) === null || _l === void 0 ? void 0 : _l.variantDesc) || '...'), ['identifiers.katashiki', 'vehicleVariantInfo.modelYear', 'vehicleVariantInfo.sfx'].map(infoPath => {
|
|
93
93
|
var _a;
|
|
94
94
|
const [place, field] = infoPath.split('.');
|
|
95
|
-
const
|
|
95
|
+
const targetPlace = (_a = this === null || this === void 0 ? void 0 : this.vehicleInformation) === null || _a === void 0 ? void 0 : _a[place];
|
|
96
|
+
const cellValue = targetPlace && targetPlace[field] ? targetPlace[field].toString() : '';
|
|
96
97
|
return (h("td", { key: infoPath, class: cn('px-[10px] py-[20px] text-center whitespace-nowrap') }, cellValue.trim() ? cellValue : '...'));
|
|
97
98
|
})))))))))))));
|
|
98
99
|
}
|
|
@@ -32,9 +32,9 @@ const recursiveParser = (structuredArray) => {
|
|
|
32
32
|
return parent;
|
|
33
33
|
};
|
|
34
34
|
export const formStructureStringExample = '[["div.kodo#j7","name.name#name"], "div.d3#s2"]';
|
|
35
|
-
export const isValidStructure = (
|
|
35
|
+
export const isValidStructure = (requestedStructure) => {
|
|
36
36
|
try {
|
|
37
|
-
const parsedStructure = JSON.parse(
|
|
37
|
+
const parsedStructure = typeof requestedStructure === 'string' ? JSON.parse(requestedStructure) : requestedStructure;
|
|
38
38
|
if (!Array.isArray(parsedStructure) || !parsedStructure.length)
|
|
39
39
|
throw new Error('Invalid structure');
|
|
40
40
|
const structuredObject = recursiveParser(parsedStructure);
|
|
@@ -1680,11 +1680,7 @@ const mockData = {
|
|
|
1680
1680
|
},
|
|
1681
1681
|
],
|
|
1682
1682
|
ssc: null,
|
|
1683
|
-
vehicleVariantInfo:
|
|
1684
|
-
modelCode: '13461',
|
|
1685
|
-
sfx: 'HN',
|
|
1686
|
-
modelYear: 2023,
|
|
1687
|
-
},
|
|
1683
|
+
vehicleVariantInfo: null,
|
|
1688
1684
|
vehicleSpecification: {
|
|
1689
1685
|
modelDesc: 'HILUX 2.7 D/C 4*4/AT/High/ADD',
|
|
1690
1686
|
variantDesc: '2.7L/DC/4x4/AT/High/ADD',
|