iceholidays-frontend 0.9.0 → 0.11.0
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.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/iceholidays/frontend/common.scss +6 -0
- data/app/assets/stylesheets/iceholidays/frontend/layout.scss +103 -25
- data/app/assets/stylesheets/iceholidays/frontend/utils/_antd_overrides.scss +12 -3
- data/app/javascript/api-services/contact-us-api.service.ts +10 -0
- data/app/javascript/react/layouts/MainFooter.tsx +5 -6
- data/app/javascript/react/layouts/MainHeader.tsx +43 -37
- data/app/javascript/react/pages/ContactUsPage.tsx +15 -13
- data/app/javascript/react/pages/ListingPage.tsx +12 -6
- data/lib/iceholidays/frontend/version.rb +1 -1
- data/public/iceholidays-assets/application.css +69 -9
- data/public/iceholidays-assets/application.js +84 -84
- data/public/iceholidays-assets/application.js.map +3 -3
- data/public/iceholidays-assets/images/social/ico_whatsapp.png +0 -0
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ff4468b5bb9777f1aa1b907f832ae75fc918847e5c721bc3bbf434a56d2bb11c
|
|
4
|
+
data.tar.gz: 3bbc05e5a116b40f46291d072497fd315b445e1ebb5c382dcf7a82083a1e4a45
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 41b36ae9c5787a229e9dabf1c7a02434dbf7dddb7f662fb6d2ec7601b3e6139aa1ac5d4e973cacfdefce3b66f1af9c810609f4159a38e2aaf0ae0eaa98051f70
|
|
7
|
+
data.tar.gz: de17d34551a35097c3e11dcd957ea0ce29199c6f07054ac8af0ba5c61dcbdbc1691198d83d41a89c7f4d5eaa0b8f59a921562e634df133483358ea812d1acd42
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
height: 50px;
|
|
6
6
|
width: 100%;
|
|
7
7
|
background: linear-gradient(241.37deg, #D1AC6E -108.33%, #D1AC6E -14.72%, $secondary-color -2.73%, #B68B31 108.18%);
|
|
8
|
-
padding-inline-end: 25px;
|
|
8
|
+
// padding-inline-end: 25px;
|
|
9
9
|
display: inline-flex;
|
|
10
10
|
justify-content: space-between;
|
|
11
11
|
align-items: center;
|
|
@@ -39,27 +39,28 @@
|
|
|
39
39
|
padding-top: 25px;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
}
|
|
43
|
+
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
45
|
+
.get-brochure{
|
|
46
|
+
width: 152px;
|
|
47
|
+
height: var(--button-height);
|
|
48
|
+
padding: 7px 8px 7px 8px;
|
|
49
|
+
border-radius: 20px;
|
|
50
|
+
border: 1px solid;
|
|
51
|
+
background: linear-gradient(287.63deg, $primary-color -19.9%, $primary-color 10.87%, #F9E298 26.63%, #B68B31 93.91%);
|
|
52
|
+
border-image-source: linear-gradient(0deg, rgba(255, 255, 255, 0.5) 0%, rgba(42, 42, 42, 0.5) 100%);
|
|
53
|
+
box-shadow: 0px 3px 10px 0px #AA853E80, 0px 4px 4px 0px #F9F6F31A inset;
|
|
54
|
+
text-align: center;
|
|
55
|
+
text-transform: uppercase;
|
|
56
|
+
font-family: $font-default;
|
|
57
|
+
font-size: 14px;
|
|
58
|
+
font-weight: 500;
|
|
59
|
+
line-height: 21px;
|
|
60
|
+
letter-spacing: 0.05em;
|
|
61
|
+
text-align: left;
|
|
62
|
+
text-underline-position: from-font;
|
|
63
|
+
text-decoration-skip-ink: none;
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
#main-footer{
|
|
@@ -72,6 +73,7 @@
|
|
|
72
73
|
&> div{
|
|
73
74
|
border-bottom: 1px solid #DFB16380;
|
|
74
75
|
padding: 10px 0;
|
|
76
|
+
flex: 100%;
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
.ant-space{
|
|
@@ -185,7 +187,8 @@
|
|
|
185
187
|
height: 56px;
|
|
186
188
|
}
|
|
187
189
|
|
|
188
|
-
.ant-menu-item:has(.logo_desktop)
|
|
190
|
+
.ant-menu-item:has(.logo_desktop),
|
|
191
|
+
.ant-menu-item:has(.get-brochure){
|
|
189
192
|
display: none;
|
|
190
193
|
}
|
|
191
194
|
}
|
|
@@ -220,19 +223,24 @@
|
|
|
220
223
|
display: none;
|
|
221
224
|
}
|
|
222
225
|
|
|
226
|
+
#get-brochure-mobile{
|
|
227
|
+
display: none;
|
|
228
|
+
}
|
|
229
|
+
|
|
223
230
|
.nav-menu{
|
|
224
231
|
display: flex;
|
|
225
232
|
flex: 1;
|
|
226
233
|
background: transparent;
|
|
227
234
|
height: 100%;
|
|
228
235
|
justify-content: center;
|
|
229
|
-
|
|
236
|
+
min-width: 100%;
|
|
237
|
+
// padding-inline-start: 25px;
|
|
230
238
|
|
|
231
239
|
a{
|
|
232
240
|
color: white;
|
|
233
241
|
text-transform: uppercase;
|
|
234
242
|
font-family: $font-default;
|
|
235
|
-
font-size:
|
|
243
|
+
font-size: 14px;
|
|
236
244
|
font-weight: 500;
|
|
237
245
|
line-height: 24px;
|
|
238
246
|
letter-spacing: 0.05em;
|
|
@@ -251,11 +259,23 @@
|
|
|
251
259
|
.ant-menu-item:has(.logo){
|
|
252
260
|
// margin: 0 -35px;
|
|
253
261
|
padding: 0;
|
|
262
|
+
order: 1 !important;
|
|
263
|
+
padding-inline-start: 20px;
|
|
254
264
|
}
|
|
265
|
+
|
|
266
|
+
.ant-menu-item:has(.get-brochure) .ant-menu-title-content{
|
|
267
|
+
height: 100%;
|
|
268
|
+
display: flex;
|
|
269
|
+
align-items: center;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// .ant-menu-item[data-menu-id*=app] {
|
|
273
|
+
// order: 10 !important;
|
|
274
|
+
// }
|
|
255
275
|
}
|
|
256
276
|
|
|
257
277
|
.logo{
|
|
258
|
-
width:
|
|
278
|
+
width: 295px;
|
|
259
279
|
// height: 66px;
|
|
260
280
|
|
|
261
281
|
&.logo_mobile{
|
|
@@ -282,6 +302,18 @@
|
|
|
282
302
|
}
|
|
283
303
|
}
|
|
284
304
|
|
|
305
|
+
#countries{
|
|
306
|
+
flex: 1 0 25%;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
#footer-menus{
|
|
310
|
+
flex: 1 0 30%;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
#contact-infos{
|
|
314
|
+
flex: 1 0 20%;
|
|
315
|
+
}
|
|
316
|
+
|
|
285
317
|
.footer-menu{
|
|
286
318
|
padding-top: 40px;
|
|
287
319
|
}
|
|
@@ -291,6 +323,52 @@
|
|
|
291
323
|
gap: 10px !important;
|
|
292
324
|
align-items: flex-start;
|
|
293
325
|
}
|
|
326
|
+
|
|
327
|
+
.social-icons{
|
|
328
|
+
align-items: center;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
@media only screen and (min-width: 899px) {
|
|
335
|
+
#main-header .nav-menu {
|
|
336
|
+
// padding-inline-start: 0;
|
|
337
|
+
|
|
338
|
+
.ant-menu-item:has(.logo) {
|
|
339
|
+
order: 2 !important;
|
|
340
|
+
padding-inline-start: 0;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
@media only screen and (min-width: 1008px) {
|
|
346
|
+
#main-header .nav-menu .ant-menu-item:has(.logo) {
|
|
347
|
+
order: 3 !important;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
@media only screen and (min-width: 1300px) {
|
|
352
|
+
#main-header{
|
|
353
|
+
.nav-menu{
|
|
354
|
+
padding-inline-start: 80px;
|
|
355
|
+
|
|
356
|
+
a{
|
|
357
|
+
font-size: 16px;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.logo{
|
|
362
|
+
width: 304px;
|
|
363
|
+
// height: 66px;
|
|
364
|
+
|
|
365
|
+
&.logo_mobile{
|
|
366
|
+
display: none;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
&.logo_desktop{
|
|
370
|
+
display: block;
|
|
371
|
+
}
|
|
294
372
|
}
|
|
295
373
|
}
|
|
296
374
|
}
|
|
@@ -108,15 +108,24 @@ a{
|
|
|
108
108
|
|
|
109
109
|
&>.ant-menu-item:hover,
|
|
110
110
|
&>.ant-menu-item-selected,
|
|
111
|
-
&>.ant-menu-item-active
|
|
111
|
+
&>.ant-menu-item-active,
|
|
112
|
+
&>.ant-menu-submenu-open,
|
|
113
|
+
&>.ant-menu-submenu-selected,
|
|
114
|
+
&>.ant-menu-submenu-active{
|
|
112
115
|
|
|
113
116
|
&::after{
|
|
114
|
-
display: none;
|
|
117
|
+
display: none !important;
|
|
115
118
|
}
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
.ant-menu-item-selected{
|
|
120
|
-
background-color: transparent;
|
|
123
|
+
background-color: transparent !important;
|
|
124
|
+
color: unset !important;
|
|
125
|
+
text-transform: uppercase;
|
|
121
126
|
}
|
|
127
|
+
|
|
128
|
+
// .ant-menu-submenu-selected>.ant-menu-submenu-title{
|
|
129
|
+
// color: #FFFFFF !important;
|
|
130
|
+
// }
|
|
122
131
|
}
|
|
@@ -3,6 +3,16 @@ import axios from "axios";
|
|
|
3
3
|
class ContactUsApi
|
|
4
4
|
{
|
|
5
5
|
|
|
6
|
+
contactInquiry(formValues){
|
|
7
|
+
const apiUrl = "/api/v1/inquiries";
|
|
8
|
+
|
|
9
|
+
return axios.post(apiUrl, {inquiry: formValues})
|
|
10
|
+
.then(response => {
|
|
11
|
+
return Promise.resolve(null);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
6
16
|
getStates(): Promise<any[]> {
|
|
7
17
|
const apiUrl = "/api/v1/states";
|
|
8
18
|
|
|
@@ -61,7 +61,7 @@ export default class MainFooter extends React.Component<IMainFooterProps> {
|
|
|
61
61
|
return (
|
|
62
62
|
<div id="main-footer">
|
|
63
63
|
<Row id="main-footer_links" gutter={[12, 12]}>
|
|
64
|
-
<Col
|
|
64
|
+
<Col id="countries" className="column">
|
|
65
65
|
<Space direction="vertical">
|
|
66
66
|
<div className="link-group-title">Countries</div>
|
|
67
67
|
<div className="link-group-items">
|
|
@@ -71,7 +71,7 @@ export default class MainFooter extends React.Component<IMainFooterProps> {
|
|
|
71
71
|
</div>
|
|
72
72
|
</Space>
|
|
73
73
|
</Col>
|
|
74
|
-
<Col
|
|
74
|
+
<Col id="footer-menus" className="column footer-menu">
|
|
75
75
|
<Space direction="vertical">
|
|
76
76
|
<div className="link-group-items">
|
|
77
77
|
{
|
|
@@ -80,16 +80,15 @@ export default class MainFooter extends React.Component<IMainFooterProps> {
|
|
|
80
80
|
</div>
|
|
81
81
|
</Space>
|
|
82
82
|
</Col>
|
|
83
|
-
<Col
|
|
83
|
+
<Col id="contact-infos" className="column contact-info">
|
|
84
84
|
<Space direction="vertical" align="center">
|
|
85
85
|
<Flex vertical gap="20px" align="center">
|
|
86
86
|
<div className="link-group-title">Contact Us</div>
|
|
87
87
|
<div><a href="/app/contact-agents">contact agents</a></div>
|
|
88
88
|
<div className="link-group-title">Follow us on</div>
|
|
89
|
-
<Flex gap={20} justify="space-between">
|
|
89
|
+
<Flex gap={20} justify="space-between" className="social-icons">
|
|
90
90
|
<a target="_blank" href="https://www.facebook.com/thesignaturetour"><img src="/iceholidays-assets/images/social/ico_fb.png"/></a>
|
|
91
|
-
<a target="_blank"
|
|
92
|
-
<a target="_blank" style={{pointerEvents: "none"}} href="javascript:void(0)"><img src="/iceholidays-assets/images/social/ico_yt.png"/></a>
|
|
91
|
+
<a target="_blank" href="https://wa.me/60128688148"><img src="/iceholidays-assets/images/social/ico_whatsapp.png"/></a>
|
|
93
92
|
<a target="_blank" href="https://www.instagram.com/thesignaturetours"><img src="/iceholidays-assets/images/social/ico_ig.png"/></a>
|
|
94
93
|
</Flex>
|
|
95
94
|
</Flex>
|
|
@@ -9,39 +9,6 @@ import BrochueApi from "../../api-services/brochure-api.service";
|
|
|
9
9
|
type MenuItem = Required<MenuProps>['items'][number];
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
const items: MenuItem[] = [
|
|
13
|
-
{
|
|
14
|
-
key: 'app',
|
|
15
|
-
label: <Link to="/app"> Home </Link>
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
key: 'about-us',
|
|
19
|
-
label: <Link to="/app/about-us"> About Us </Link>
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
key: 'countries',
|
|
23
|
-
label: <Link to="/app/countries"> Countries </Link>
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
key: 'blog',
|
|
27
|
-
label: <Link to="/app/blog"> Blog </Link>
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
key: 'logo',
|
|
31
|
-
label: <img src="/iceholidays-assets/images/logo.png" className="logo logo_desktop"/>,
|
|
32
|
-
disabled: true
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
key: 'contact-agents',
|
|
36
|
-
label: <Link to="/app/contact-agents"> Contact Agents </Link>
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
key: 'contact-us',
|
|
40
|
-
label: <Link to="/app/contact-us"> Contact Us </Link>
|
|
41
|
-
},
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
|
|
45
12
|
function withLocation(Component) {
|
|
46
13
|
return props => <Component {...props} location={useLocation()} />;
|
|
47
14
|
}
|
|
@@ -49,6 +16,45 @@ function withLocation(Component) {
|
|
|
49
16
|
class MainHeader extends React.Component <{location}> {
|
|
50
17
|
brochureApi = new BrochueApi;
|
|
51
18
|
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
items: MenuItem[] = [
|
|
22
|
+
{
|
|
23
|
+
key: 'app',
|
|
24
|
+
label: <Link to="/app"> Home </Link>
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: 'about-us',
|
|
28
|
+
label: <Link to="/app/about-us"> About Us </Link>
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
key: 'countries',
|
|
32
|
+
label: <Link to="/app/countries"> Countries </Link>
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: 'blog',
|
|
36
|
+
label: <Link to="/app/blog"> Blog </Link>
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'logo',
|
|
40
|
+
label: <img src="/iceholidays-assets/images/logo.png" className="logo logo_desktop"/>,
|
|
41
|
+
disabled: true
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: 'contact-agents',
|
|
45
|
+
label: <Link to="/app/contact-agents"> Contact Agents </Link>
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
key: 'contact-us',
|
|
49
|
+
label: <Link to="/app/contact-us"> Contact Us </Link>
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: 'brochure',
|
|
53
|
+
label: <Button onClick={()=>this.downloadBrochure()} className="get-brochure" id="get-brochure-menu" type="primary"><Icon path={mdiFileDownload} size="18px" /> get brochure</Button>,
|
|
54
|
+
disabled: true
|
|
55
|
+
},
|
|
56
|
+
]
|
|
57
|
+
|
|
52
58
|
state = {
|
|
53
59
|
open: false,
|
|
54
60
|
current: "",
|
|
@@ -64,7 +70,7 @@ class MainHeader extends React.Component <{location}> {
|
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
|
|
67
|
-
downloadBrochure
|
|
73
|
+
downloadBrochure() {
|
|
68
74
|
this.brochureApi.getBrochure()
|
|
69
75
|
.then((brochureUrl:any) => {
|
|
70
76
|
// const blob = brochureUrl.blob();
|
|
@@ -107,12 +113,12 @@ class MainHeader extends React.Component <{location}> {
|
|
|
107
113
|
const {open, current } = this.state;
|
|
108
114
|
return (
|
|
109
115
|
<div id="main-header">
|
|
110
|
-
<Menu mode="horizontal" items={items} onClick={this.onClick} selectedKeys={[current]} className="nav-menu"/>
|
|
116
|
+
<Menu mode="horizontal" items={this.items} onClick={this.onClick} selectedKeys={[current]} className="nav-menu"/>
|
|
111
117
|
|
|
112
118
|
<a href="/app"><img src="/iceholidays-assets/images/logo_mobile.png" className="logo logo_mobile"/></a>
|
|
113
119
|
|
|
114
120
|
<div id="nav-buttons">
|
|
115
|
-
|
|
121
|
+
<Button onClick={()=>this.downloadBrochure()} className="get-brochure" id="get-brochure-mobile" type="primary"><Icon path={mdiFileDownload} size="18px" /> get brochure</Button>
|
|
116
122
|
|
|
117
123
|
<Button id="toggle-menu" type="primary" onClick={()=>this.showDrawer()}>
|
|
118
124
|
<Icon path={mdiMenu} size="25px" />
|
|
@@ -120,7 +126,7 @@ class MainHeader extends React.Component <{location}> {
|
|
|
120
126
|
</div>
|
|
121
127
|
|
|
122
128
|
<Drawer title={null} onClose={()=>this.onClose()} open={open} id="nav-drawer">
|
|
123
|
-
<Menu items={items} onClick={this.onClick} selectedKeys={[current]} className="nav-menu_mobile"/>
|
|
129
|
+
<Menu items={this.items} onClick={this.onClick} selectedKeys={[current]} className="nav-menu_mobile"/>
|
|
124
130
|
</Drawer>
|
|
125
131
|
</div>
|
|
126
132
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import Headline from "../components/shared/Headline";
|
|
3
3
|
import { Button, Col, Flex, Form, Input, notification, Row, Select, Space } from "antd";
|
|
4
|
-
import { mdiFacebook, mdiInstagram, mdiTwitter, mdiYoutube } from "@mdi/js";
|
|
4
|
+
import { mdiFacebook, mdiInstagram, mdiTwitter, mdiWhatsapp, mdiYoutube } from "@mdi/js";
|
|
5
5
|
import Icon from "@mdi/react";
|
|
6
6
|
import ContactUsApi from "../../api-services/contact-us-api.service";
|
|
7
7
|
const { TextArea } = Input;
|
|
@@ -44,7 +44,13 @@ export default class ContactUsPage extends React.Component {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
submitForm(formValues) {
|
|
47
|
-
|
|
47
|
+
this.api.contactInquiry(formValues)
|
|
48
|
+
.then(_ => {
|
|
49
|
+
notification.success({message: "Inquiry sent."})
|
|
50
|
+
})
|
|
51
|
+
.catch(error => {
|
|
52
|
+
notification.error({ message: 'An error occured while sending inquiry.'});
|
|
53
|
+
});
|
|
48
54
|
}
|
|
49
55
|
|
|
50
56
|
render(){
|
|
@@ -67,24 +73,24 @@ export default class ContactUsPage extends React.Component {
|
|
|
67
73
|
validateMessages={validateMessages}
|
|
68
74
|
onFinish={(formValues)=>this.submitForm(formValues)}
|
|
69
75
|
>
|
|
70
|
-
<Form.Item label="Enter Name" name="name">
|
|
76
|
+
<Form.Item label="Enter Name" name="name" required>
|
|
71
77
|
<Input placeholder="Enter Here" />
|
|
72
78
|
</Form.Item>
|
|
73
79
|
|
|
74
80
|
<Row gutter={20}>
|
|
75
81
|
<Col span={12}>
|
|
76
|
-
<Form.Item label="Enter Email" name="email" rules={[{ type: 'email' }]}>
|
|
82
|
+
<Form.Item label="Enter Email" name="email" rules={[{ type: 'email' }]} required>
|
|
77
83
|
<Input placeholder="Enter Here" />
|
|
78
84
|
</Form.Item>
|
|
79
85
|
</Col>
|
|
80
86
|
<Col span={12}>
|
|
81
|
-
<Form.Item label="Enter Phone Number" name="
|
|
87
|
+
<Form.Item label="Enter Phone Number" name="phone" required>
|
|
82
88
|
<Input placeholder="Enter Here" />
|
|
83
89
|
</Form.Item>
|
|
84
90
|
</Col>
|
|
85
91
|
</Row>
|
|
86
92
|
|
|
87
|
-
<Form.Item label="Select State" name="state">
|
|
93
|
+
<Form.Item label="Select State" name="state" required>
|
|
88
94
|
<Select
|
|
89
95
|
placeholder="Please Select"
|
|
90
96
|
options={this.state?.states}
|
|
@@ -99,7 +105,7 @@ export default class ContactUsPage extends React.Component {
|
|
|
99
105
|
<Input placeholder="Enter Here" />
|
|
100
106
|
</Form.Item>
|
|
101
107
|
|
|
102
|
-
<Form.Item label="Write your message" name="message">
|
|
108
|
+
<Form.Item label="Write your message" name="message" required>
|
|
103
109
|
<TextArea rows={4} placeholder="Write Here"/>
|
|
104
110
|
</Form.Item>
|
|
105
111
|
|
|
@@ -131,13 +137,9 @@ export default class ContactUsPage extends React.Component {
|
|
|
131
137
|
<a target="_blank" href="https://www.instagram.com/thesignaturetours">
|
|
132
138
|
<Icon path={mdiInstagram} size={1} />
|
|
133
139
|
</a>
|
|
134
|
-
<a target="_blank" href="
|
|
135
|
-
<Icon path={
|
|
136
|
-
</a>
|
|
137
|
-
<a target="_blank" href="javascript:void(0)" style={{pointerEvents: "none"}}>
|
|
138
|
-
<Icon path={mdiYoutube} size={1} />
|
|
140
|
+
<a target="_blank" href="https://wa.me/60128688148">
|
|
141
|
+
<Icon path={mdiWhatsapp} size={1} />
|
|
139
142
|
</a>
|
|
140
|
-
<img src="/iceholidays-assets/images/social.png" className="social-icon"/>
|
|
141
143
|
</Space>
|
|
142
144
|
</div>
|
|
143
145
|
</Col>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { Component } from "react";
|
|
2
|
-
import { Badge, Breadcrumb, Button, Flex, Modal, Space, Select, Row, Col, notification } from "antd";
|
|
2
|
+
import { Badge, Breadcrumb, Button, Flex, Modal, Space, Select, Row, Col, notification, Spin } from "antd";
|
|
3
3
|
import FilterPills from "../widgets/FilterPills";
|
|
4
4
|
import { Link, useSearchParams } from "react-router-dom";
|
|
5
5
|
import { mdiDotsHorizontalCircleOutline, mdiFileDownload, mdiFilterVariant, mdiInformationOutline, mdiMapMarkerOutline } from "@mdi/js";
|
|
@@ -42,6 +42,7 @@ class ListingPage extends React.Component <{searchParams}> {
|
|
|
42
42
|
seriesApi = new SeriesApi;
|
|
43
43
|
|
|
44
44
|
state = {
|
|
45
|
+
loading: true,
|
|
45
46
|
countries: [],
|
|
46
47
|
selectedCountry: {name: "", cities: []},
|
|
47
48
|
searchParamsObj: {keyword: "", year: "", month: "", location_id: null},
|
|
@@ -121,6 +122,8 @@ class ListingPage extends React.Component <{searchParams}> {
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
getItineraries(searchParams, init = false){
|
|
125
|
+
this.setState({loading: true});
|
|
126
|
+
|
|
124
127
|
const locationId = searchParams.location_id;
|
|
125
128
|
const storedSearchParamsStr = localStorage.getItem("searchParams");
|
|
126
129
|
if(storedSearchParamsStr != null){
|
|
@@ -132,10 +135,11 @@ class ListingPage extends React.Component <{searchParams}> {
|
|
|
132
135
|
}
|
|
133
136
|
|
|
134
137
|
this.seriesApi.getItineraries(searchParams)
|
|
135
|
-
|
|
138
|
+
.then(itinerariesData => {
|
|
136
139
|
this.setBreadcrumbs();
|
|
137
140
|
this.setState({itineraries: itinerariesData})
|
|
138
141
|
})
|
|
142
|
+
.finally(()=>this.setState({loading: false}))
|
|
139
143
|
.catch(error => {
|
|
140
144
|
notification.error({ message: 'An error occured while loading itineraries.'});
|
|
141
145
|
});
|
|
@@ -179,14 +183,14 @@ class ListingPage extends React.Component <{searchParams}> {
|
|
|
179
183
|
searchParamsObj.location_id = selectedCountry.id;
|
|
180
184
|
// this.getLocation(selectedCountry.id);
|
|
181
185
|
|
|
182
|
-
this.setState({selectedCountry, searchParamsObj});
|
|
186
|
+
this.setState({selectedCountry, searchParamsObj, loading: true});
|
|
183
187
|
this.getItineraries(searchParamsObj);
|
|
184
188
|
}
|
|
185
189
|
}
|
|
186
190
|
|
|
187
191
|
|
|
188
192
|
render(){
|
|
189
|
-
const {countries, selectedCountry, searchParamsObj, itineraries, location, breadcrumbs, descriptionData, fileUrlData, departureDatesData } = this.state;
|
|
193
|
+
const {loading, countries, selectedCountry, searchParamsObj, itineraries, location, breadcrumbs, descriptionData, fileUrlData, departureDatesData } = this.state;
|
|
190
194
|
|
|
191
195
|
return <div id="listing-page">
|
|
192
196
|
|
|
@@ -204,8 +208,9 @@ class ListingPage extends React.Component <{searchParams}> {
|
|
|
204
208
|
<FilterPills items={selectedCountry.cities} bindLabel="name" bindValue="location_id" initialValue={searchParamsObj} selectFilter={(selected) => this.getItineraries(selected)}></FilterPills>
|
|
205
209
|
</Space>
|
|
206
210
|
|
|
211
|
+
<Spin size="large" className="loader" spinning={loading}/>
|
|
207
212
|
{
|
|
208
|
-
itineraries.length > 0 ? (
|
|
213
|
+
!loading && (itineraries.length > 0 ? (
|
|
209
214
|
<>
|
|
210
215
|
<div id="legends">
|
|
211
216
|
<Space size={17}>
|
|
@@ -278,9 +283,10 @@ class ListingPage extends React.Component <{searchParams}> {
|
|
|
278
283
|
</Flex>
|
|
279
284
|
</div>
|
|
280
285
|
</>
|
|
281
|
-
) : <h1 id="no-tours-found">No tour package is found.</h1>
|
|
286
|
+
) : <h1 id="no-tours-found">No tour package is found.</h1>)
|
|
282
287
|
}
|
|
283
288
|
|
|
289
|
+
|
|
284
290
|
</div>
|
|
285
291
|
|
|
286
292
|
<Modal title="Description" open={this.state.descriptionModalOpen} onCancel={()=>this.closeModal("descriptionModalOpen")} footer={null} width={1000} centered className="tour_details_description">
|