iceholidays-frontend 0.9.0 → 0.10.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 +18 -1
- data/app/javascript/react/layouts/MainFooter.tsx +5 -6
- data/app/javascript/react/pages/ContactUsPage.tsx +3 -7
- data/app/javascript/react/pages/ListingPage.tsx +12 -6
- data/lib/iceholidays/frontend/version.rb +1 -1
- data/public/iceholidays-assets/application.css +20 -1
- 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: 1f50c77c77c53b3790f60e5635bd2de1268a0085c7a95508fb31db394271f3a1
|
|
4
|
+
data.tar.gz: eb86f0b2a34fd67b3b14a52a2f4d03d4b6210127c989c75674f16f61284d5b16
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 22ccaa192dc4db372f231e1c61c35a7db6f1ffded4c098df3ac914a48c25d4a57eab80c5a71bcc79d551cc0e7baaf3a493e0e2ab1761f37265da662ad606a4c1
|
|
7
|
+
data.tar.gz: 50ae100ed07dc32ed4079cab8e0aa76cb3ee1e10a5c30e19b347c08abb23b98d37ed02aba67e925be720dc2b4410fcd385df9b03d54f8d28cff6ca6e35f98747
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
&> div{
|
|
73
73
|
border-bottom: 1px solid #DFB16380;
|
|
74
74
|
padding: 10px 0;
|
|
75
|
+
flex: 100%;
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
.ant-space{
|
|
@@ -214,7 +215,7 @@
|
|
|
214
215
|
}
|
|
215
216
|
}
|
|
216
217
|
|
|
217
|
-
@media only screen and (min-width:
|
|
218
|
+
@media only screen and (min-width: 768px) {
|
|
218
219
|
#main-header{
|
|
219
220
|
#toggle-menu{
|
|
220
221
|
display: none;
|
|
@@ -282,6 +283,18 @@
|
|
|
282
283
|
}
|
|
283
284
|
}
|
|
284
285
|
|
|
286
|
+
#countries{
|
|
287
|
+
flex: 1 0 25%;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
#footer-menus{
|
|
291
|
+
flex: 1 0 30%;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
#contact-infos{
|
|
295
|
+
flex: 1 0 20%;
|
|
296
|
+
}
|
|
297
|
+
|
|
285
298
|
.footer-menu{
|
|
286
299
|
padding-top: 40px;
|
|
287
300
|
}
|
|
@@ -291,6 +304,10 @@
|
|
|
291
304
|
gap: 10px !important;
|
|
292
305
|
align-items: flex-start;
|
|
293
306
|
}
|
|
307
|
+
|
|
308
|
+
.social-icons{
|
|
309
|
+
align-items: center;
|
|
310
|
+
}
|
|
294
311
|
}
|
|
295
312
|
}
|
|
296
313
|
}
|
|
@@ -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>
|
|
@@ -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;
|
|
@@ -131,13 +131,9 @@ export default class ContactUsPage extends React.Component {
|
|
|
131
131
|
<a target="_blank" href="https://www.instagram.com/thesignaturetours">
|
|
132
132
|
<Icon path={mdiInstagram} size={1} />
|
|
133
133
|
</a>
|
|
134
|
-
<a target="_blank" href="
|
|
135
|
-
<Icon path={
|
|
134
|
+
<a target="_blank" href="https://wa.me/60128688148">
|
|
135
|
+
<Icon path={mdiWhatsapp} size={1} />
|
|
136
136
|
</a>
|
|
137
|
-
<a target="_blank" href="javascript:void(0)" style={{pointerEvents: "none"}}>
|
|
138
|
-
<Icon path={mdiYoutube} size={1} />
|
|
139
|
-
</a>
|
|
140
|
-
<img src="/iceholidays-assets/images/social.png" className="social-icon"/>
|
|
141
137
|
</Space>
|
|
142
138
|
</div>
|
|
143
139
|
</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">
|
|
@@ -415,6 +415,7 @@ a {
|
|
|
415
415
|
#main-footer_links > div {
|
|
416
416
|
border-bottom: 1px solid rgba(223, 177, 99, 0.5019607843);
|
|
417
417
|
padding: 10px 0;
|
|
418
|
+
flex: 100%;
|
|
418
419
|
}
|
|
419
420
|
#main-footer_links .ant-space {
|
|
420
421
|
width: 100%;
|
|
@@ -528,7 +529,7 @@ a {
|
|
|
528
529
|
white-space: nowrap;
|
|
529
530
|
}
|
|
530
531
|
}
|
|
531
|
-
@media only screen and (min-width:
|
|
532
|
+
@media only screen and (min-width: 768px) {
|
|
532
533
|
#main-header #toggle-menu {
|
|
533
534
|
display: none;
|
|
534
535
|
}
|
|
@@ -579,6 +580,15 @@ a {
|
|
|
579
580
|
#main-footer_links > div {
|
|
580
581
|
padding: 10px 0 40px;
|
|
581
582
|
}
|
|
583
|
+
#main-footer #countries {
|
|
584
|
+
flex: 1 0 25%;
|
|
585
|
+
}
|
|
586
|
+
#main-footer #footer-menus {
|
|
587
|
+
flex: 1 0 30%;
|
|
588
|
+
}
|
|
589
|
+
#main-footer #contact-infos {
|
|
590
|
+
flex: 1 0 20%;
|
|
591
|
+
}
|
|
582
592
|
#main-footer .footer-menu {
|
|
583
593
|
padding-top: 40px;
|
|
584
594
|
}
|
|
@@ -586,6 +596,9 @@ a {
|
|
|
586
596
|
gap: 10px !important;
|
|
587
597
|
align-items: flex-start;
|
|
588
598
|
}
|
|
599
|
+
#main-footer .contact-info .social-icons {
|
|
600
|
+
align-items: center;
|
|
601
|
+
}
|
|
589
602
|
}
|
|
590
603
|
#headline {
|
|
591
604
|
--side-padding: 20px;
|
|
@@ -803,6 +816,12 @@ a {
|
|
|
803
816
|
text-transform: uppercase;
|
|
804
817
|
}
|
|
805
818
|
|
|
819
|
+
.loader {
|
|
820
|
+
width: 100%;
|
|
821
|
+
text-align: center;
|
|
822
|
+
margin: 20px 0;
|
|
823
|
+
}
|
|
824
|
+
|
|
806
825
|
@media only screen and (min-width: 769px) {
|
|
807
826
|
#headline {
|
|
808
827
|
--side-padding: 10%;
|