iceholidays-frontend 0.8.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 +24 -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 +25 -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{
|
|
@@ -208,7 +209,13 @@
|
|
|
208
209
|
|
|
209
210
|
}
|
|
210
211
|
|
|
211
|
-
@media only screen and (min-width:
|
|
212
|
+
@media only screen and (min-width: 450px) {
|
|
213
|
+
#main-footer_links a{
|
|
214
|
+
white-space: nowrap;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@media only screen and (min-width: 768px) {
|
|
212
219
|
#main-header{
|
|
213
220
|
#toggle-menu{
|
|
214
221
|
display: none;
|
|
@@ -276,6 +283,18 @@
|
|
|
276
283
|
}
|
|
277
284
|
}
|
|
278
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
|
+
|
|
279
298
|
.footer-menu{
|
|
280
299
|
padding-top: 40px;
|
|
281
300
|
}
|
|
@@ -283,6 +302,10 @@
|
|
|
283
302
|
.contact-info{
|
|
284
303
|
.ant-flex{
|
|
285
304
|
gap: 10px !important;
|
|
305
|
+
align-items: flex-start;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.social-icons{
|
|
286
309
|
align-items: center;
|
|
287
310
|
}
|
|
288
311
|
}
|
|
@@ -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%;
|
|
@@ -523,7 +524,12 @@ a {
|
|
|
523
524
|
color: #5B4713;
|
|
524
525
|
}
|
|
525
526
|
|
|
526
|
-
@media only screen and (min-width:
|
|
527
|
+
@media only screen and (min-width: 450px) {
|
|
528
|
+
#main-footer_links a {
|
|
529
|
+
white-space: nowrap;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
@media only screen and (min-width: 768px) {
|
|
527
533
|
#main-header #toggle-menu {
|
|
528
534
|
display: none;
|
|
529
535
|
}
|
|
@@ -574,11 +580,23 @@ a {
|
|
|
574
580
|
#main-footer_links > div {
|
|
575
581
|
padding: 10px 0 40px;
|
|
576
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
|
+
}
|
|
577
592
|
#main-footer .footer-menu {
|
|
578
593
|
padding-top: 40px;
|
|
579
594
|
}
|
|
580
595
|
#main-footer .contact-info .ant-flex {
|
|
581
596
|
gap: 10px !important;
|
|
597
|
+
align-items: flex-start;
|
|
598
|
+
}
|
|
599
|
+
#main-footer .contact-info .social-icons {
|
|
582
600
|
align-items: center;
|
|
583
601
|
}
|
|
584
602
|
}
|
|
@@ -798,6 +816,12 @@ a {
|
|
|
798
816
|
text-transform: uppercase;
|
|
799
817
|
}
|
|
800
818
|
|
|
819
|
+
.loader {
|
|
820
|
+
width: 100%;
|
|
821
|
+
text-align: center;
|
|
822
|
+
margin: 20px 0;
|
|
823
|
+
}
|
|
824
|
+
|
|
801
825
|
@media only screen and (min-width: 769px) {
|
|
802
826
|
#headline {
|
|
803
827
|
--side-padding: 10%;
|