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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1997e35efb30d45dd06e1453ab369de2c2a06304ba6a7af1bc0d8b83b6b55470
4
- data.tar.gz: b492bbe782f6c15950eb6b6b18c3c8ba51bec70e892bdef614ef97a291b62b7f
3
+ metadata.gz: 1f50c77c77c53b3790f60e5635bd2de1268a0085c7a95508fb31db394271f3a1
4
+ data.tar.gz: eb86f0b2a34fd67b3b14a52a2f4d03d4b6210127c989c75674f16f61284d5b16
5
5
  SHA512:
6
- metadata.gz: 2b3e0a7c2aae85d4bd6ba9ff20d19913d817839642e264d765b4fb85a66cdf83bd027f0152b437c2e92df0ab972b4330d3be47934821b9228302a94fc6fce9e8
7
- data.tar.gz: 655a05ac3125ab3c04dd4bd110411795030cffb4aecb196987fdb86eee38b46e32415ce34f568d0488bb807b8d8d4fae31022b01f4d0cafd71cb7b5b48938426
6
+ metadata.gz: 22ccaa192dc4db372f231e1c61c35a7db6f1ffded4c098df3ac914a48c25d4a57eab80c5a71bcc79d551cc0e7baaf3a493e0e2ab1761f37265da662ad606a4c1
7
+ data.tar.gz: 50ae100ed07dc32ed4079cab8e0aa76cb3ee1e10a5c30e19b347c08abb23b98d37ed02aba67e925be720dc2b4410fcd385df9b03d54f8d28cff6ca6e35f98747
@@ -278,6 +278,12 @@
278
278
  text-transform: uppercase;
279
279
  }
280
280
 
281
+ .loader{
282
+ width: 100%;
283
+ text-align: center;
284
+ margin: 20px 0;
285
+ }
286
+
281
287
  @media only screen and (min-width: 769px) {
282
288
  #headline{
283
289
  --side-padding: 10%;
@@ -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: 769px) {
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 flex="1 0 25%" className="column">
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 flex="1 0 30%" className="column footer-menu">
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 flex="1 0 20%" className="column contact-info">
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" style={{pointerEvents: "none"}} href="javascript:void(0)"><img src="/iceholidays-assets/images/social/ico_twitter.png"/></a>
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="javascript:void(0)" style={{pointerEvents: "none"}}>
135
- <Icon path={mdiTwitter} size={1} />
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
- .then(itinerariesData => {
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">
@@ -1,5 +1,5 @@
1
1
  module Iceholidays
2
2
  module Frontend
3
- VERSION = "0.8.0"
3
+ VERSION = "0.10.0"
4
4
  end
5
5
  end
@@ -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: 769px) {
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%;