iceholidays-frontend 0.5.0 → 0.7.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/iceholidays/frontend/_slick-theme.scss +194 -0
  3. data/app/assets/stylesheets/iceholidays/frontend/_slick.scss +100 -0
  4. data/app/assets/stylesheets/iceholidays/frontend/application.sass.scss +64 -4
  5. data/app/assets/stylesheets/iceholidays/frontend/common.scss +17 -2
  6. data/app/assets/stylesheets/iceholidays/frontend/layout.scss +1 -1
  7. data/app/assets/stylesheets/iceholidays/frontend/utils/_slick_overrides.scss +3 -0
  8. data/app/javascript/api-services/brochure-api.service.ts +17 -0
  9. data/app/javascript/api-services/posts-api.service.ts +47 -0
  10. data/app/javascript/interfaces/blog.interface.ts +8 -0
  11. data/app/javascript/react/App.tsx +1 -1
  12. data/app/javascript/react/components/Destinations.tsx +21 -10
  13. data/app/javascript/react/components/PriceDetails.tsx +6 -6
  14. data/app/javascript/react/components/Testimonials.tsx +4 -1
  15. data/app/javascript/react/components/shared/LocationDropdown.tsx +3 -1
  16. data/app/javascript/react/layouts/MainHeader.tsx +80 -32
  17. data/app/javascript/react/pages/AboutUsPage.tsx +4 -4
  18. data/app/javascript/react/pages/BlogPage.tsx +82 -66
  19. data/app/javascript/react/pages/BlogShowPage.tsx +50 -35
  20. data/app/javascript/react/pages/ListingPage.tsx +115 -85
  21. data/app/javascript/react/pages/ShowPage.tsx +124 -87
  22. data/app/javascript/react/widgets/FilterPills.tsx +21 -18
  23. data/config/routes.rb +1 -1
  24. data/lib/iceholidays/frontend/version.rb +1 -1
  25. data/public/iceholidays-assets/application.css +306 -11
  26. data/public/iceholidays-assets/application.js +161 -121
  27. data/public/iceholidays-assets/application.js.map +4 -4
  28. data/public/iceholidays-assets/images/TST Ribbon@2x.png +0 -0
  29. data/public/iceholidays-assets/images/TST Ribbon@3x.png +0 -0
  30. data/public/iceholidays-assets/images/TSTRibbon.png +0 -0
  31. metadata +11 -2
@@ -19,10 +19,10 @@ function FilterPills(
19
19
  props: {
20
20
  items:any[];
21
21
  title?:string;
22
- initialValue:{keyword?:string, year?:string, month?: string, location_id?:any}
23
- bindLabel?:string;
24
- bindValue?:string;
25
- allOption?:boolean;
22
+ initialValue:{keyword?:string, year?:any, month?: string, location_id?:any, type?: any}
23
+ bindLabel:string;
24
+ bindValue:string;
25
+ allOption:boolean;
26
26
  selectFilter;
27
27
  }){
28
28
 
@@ -32,7 +32,7 @@ function FilterPills(
32
32
 
33
33
  const allHasValues = () => {
34
34
  const {keyword, ...noKeyword} = selected;
35
- return Object.entries(noKeyword).every(o => o[1] != "");
35
+ return Object.entries(noKeyword).every(o => o[1] != "" && o[1] != null);
36
36
  }
37
37
  const [collapseFilters, setcollapseFilters] = useState(allHasValues);
38
38
 
@@ -57,16 +57,15 @@ function FilterPills(
57
57
  { title && <div className="filter-title"> {title} </div> }
58
58
  <Space size={10} wrap>
59
59
  {
60
- allOption && <div className="filter-pill selected"> <span> All </span></div>
60
+ allOption && <div onClick={()=>selectFilter(bindValue, null)} className={`filter-pill ${(selected[bindValue] == null || selected[bindValue] == '') && 'selected'}`}> <span> All </span></div>
61
61
  }
62
62
  {
63
63
  items.map((item, index) => {
64
64
  //special case for location id
65
65
  const id:any = bindValue == "location_id" ? "id" : bindValue;
66
- const label = bindLabel ? item[bindLabel] : item;
67
66
  const value = bindValue ? item[id] : item;
68
67
  const selectedItem = selected && bindValue ? selected[bindValue]: item ;
69
- return <div key={index} onClick={()=>selectFilter(bindValue, value)} className={`filter-pill ${selectedItem == value && 'selected'}`}> <span>{ label } </span></div>
68
+ return <div key={index} onClick={()=>selectFilter(bindValue, value)} className={`filter-pill ${selectedItem == value && 'selected'}`}> <span>{ item[bindLabel] } </span></div>
70
69
  })
71
70
  }
72
71
  </Space>
@@ -77,26 +76,24 @@ function FilterPills(
77
76
  <div className="filter-title"> Year </div>
78
77
  <Space size={10} wrap>
79
78
  {
80
- allOption && <div className="filter-pill selected"> <span> All </span></div>
79
+ allOption && <div onClick={()=>selectFilter("year", "")} className={`filter-pill ${selected.year == '' && 'selected'}`}> <span> All </span></div>
81
80
  }
82
81
  {
83
- years().map((year, index) => {
84
- const selectedItem = selected && selected.year;
85
- return <div key={index} onClick={()=>selectFilter("year", year)} className={`filter-pill default-filter ${selectedItem == year.toString() && 'selected'}`}> <span>{year} </span></div>
86
- })
82
+ years().map((year, index) => (
83
+ <div key={index} onClick={()=>selectFilter("year", year)} className={`filter-pill default-filter ${selected.year == year && 'selected'}`}> <span>{year} </span></div>
84
+ ))
87
85
  }
88
86
  </Space>
89
87
 
90
88
  <div className="filter-title"> Month </div>
91
89
  <Row gutter={[10, 10]} justify="space-between">
92
90
  {
93
- allOption && <Col className="filter-pill selected"> <span> All </span></Col>
91
+ allOption && <div onClick={()=>selectFilter("month", "")} className={`filter-pill ${selected.month == '' && 'selected'}`}> <span> All </span></div>
94
92
  }
95
93
  {
96
- months.map((month, index) => {
97
- const selectedItem = selected && selected.month ;
98
- return <Col xs={8} md={6} lg={4}> <div key={index} onClick={()=>selectFilter("month", month.shortMonth)} className={`filter-pill default-filter ${selectedItem?.toString() == month.shortMonth && 'selected'}`}> <span>{month.name} </span></div> </Col>
99
- })
94
+ months.map((month, index) => (
95
+ <Col key={index} xs={8} md={6} lg={4}> <div onClick={()=>selectFilter("month", month.shortMonth)} className={`filter-pill default-filter ${selected.month == month.shortMonth && 'selected'}`}> <span>{month.name} </span></div> </Col>
96
+ ))
100
97
  }
101
98
  </Row>
102
99
  </Space>
@@ -108,4 +105,10 @@ function FilterPills(
108
105
 
109
106
  }
110
107
 
108
+ FilterPills.defaultProps = {
109
+ allOption: false,
110
+ bindLabel: "label",
111
+ bindValue: "id"
112
+ }
113
+
111
114
  export default FilterPills;
data/config/routes.rb CHANGED
@@ -6,7 +6,7 @@ Iceholidays::Frontend::Engine.routes.draw do
6
6
  get '/about-us' => 'site#about_us', as: :about_us
7
7
  get '/countries' => 'site#countries', as: :countries
8
8
  get '/blog' => 'site#blog', as: :blog
9
- get '/blog/1' => 'site#show_blog', as: :show_blog
9
+ get '/blog/:id' => 'site#show_blog', as: :show_blog
10
10
  get '/contact-agents' => 'site#contact_agents', as: :contact_agents
11
11
  get '/contact-us' => 'site#contact_us', as: :contact_us
12
12
  resources :posts, only:[:index, :show]
@@ -1,5 +1,5 @@
1
1
  module Iceholidays
2
2
  module Frontend
3
- VERSION = "0.5.0"
3
+ VERSION = "0.7.0"
4
4
  end
5
5
  end
@@ -15,6 +15,240 @@
15
15
  *= require_self
16
16
  */
17
17
  @import url("//fonts.googleapis.com/css?family=Poppins:ital,wght@0,100;0,200;0,200;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,200;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
18
+ /* Slider */
19
+ .slick-slider {
20
+ position: relative;
21
+ display: block;
22
+ box-sizing: border-box;
23
+ -webkit-touch-callout: none;
24
+ -webkit-user-select: none;
25
+ -khtml-user-select: none;
26
+ -moz-user-select: none;
27
+ -ms-user-select: none;
28
+ user-select: none;
29
+ -ms-touch-action: pan-y;
30
+ touch-action: pan-y;
31
+ -webkit-tap-highlight-color: transparent;
32
+ }
33
+
34
+ .slick-list {
35
+ position: relative;
36
+ overflow: hidden;
37
+ display: block;
38
+ margin: 0;
39
+ padding: 0;
40
+ }
41
+ .slick-list:focus {
42
+ outline: none;
43
+ }
44
+ .slick-list.dragging {
45
+ cursor: pointer;
46
+ cursor: hand;
47
+ }
48
+
49
+ .slick-slider .slick-track,
50
+ .slick-slider .slick-list {
51
+ -webkit-transform: translate3d(0, 0, 0);
52
+ -moz-transform: translate3d(0, 0, 0);
53
+ -ms-transform: translate3d(0, 0, 0);
54
+ -o-transform: translate3d(0, 0, 0);
55
+ transform: translate3d(0, 0, 0);
56
+ }
57
+
58
+ .slick-track {
59
+ position: relative;
60
+ left: 0;
61
+ top: 0;
62
+ display: block;
63
+ margin-left: auto;
64
+ margin-right: auto;
65
+ }
66
+ .slick-track:before, .slick-track:after {
67
+ content: "";
68
+ display: table;
69
+ }
70
+ .slick-track:after {
71
+ clear: both;
72
+ }
73
+ .slick-loading .slick-track {
74
+ visibility: hidden;
75
+ }
76
+
77
+ .slick-slide {
78
+ float: left;
79
+ height: 100%;
80
+ min-height: 1px;
81
+ display: none;
82
+ }
83
+ [dir=rtl] .slick-slide {
84
+ float: right;
85
+ }
86
+ .slick-slide img {
87
+ display: block;
88
+ }
89
+ .slick-slide.slick-loading img {
90
+ display: none;
91
+ }
92
+ .slick-slide.dragging img {
93
+ pointer-events: none;
94
+ }
95
+ .slick-initialized .slick-slide {
96
+ display: block;
97
+ }
98
+ .slick-loading .slick-slide {
99
+ visibility: hidden;
100
+ }
101
+ .slick-vertical .slick-slide {
102
+ display: block;
103
+ height: auto;
104
+ border: 1px solid transparent;
105
+ }
106
+
107
+ .slick-arrow.slick-hidden {
108
+ display: none;
109
+ }
110
+
111
+ /* Slider */
112
+ /* Icons */
113
+ /* Arrows */
114
+ .slick-prev,
115
+ .slick-next {
116
+ position: absolute;
117
+ display: block;
118
+ height: 20px;
119
+ width: 20px;
120
+ line-height: 0px;
121
+ font-size: 0px;
122
+ cursor: pointer;
123
+ background: transparent;
124
+ color: transparent;
125
+ top: 50%;
126
+ -webkit-transform: translate(0, -50%);
127
+ -ms-transform: translate(0, -50%);
128
+ transform: translate(0, -50%);
129
+ padding: 0;
130
+ border: none;
131
+ outline: none;
132
+ }
133
+ .slick-prev:hover, .slick-prev:focus,
134
+ .slick-next:hover,
135
+ .slick-next:focus {
136
+ outline: none;
137
+ background: transparent;
138
+ color: transparent;
139
+ }
140
+ .slick-prev:hover:before, .slick-prev:focus:before,
141
+ .slick-next:hover:before,
142
+ .slick-next:focus:before {
143
+ opacity: 1;
144
+ }
145
+ .slick-prev.slick-disabled:before,
146
+ .slick-next.slick-disabled:before {
147
+ opacity: 0.25;
148
+ }
149
+ .slick-prev:before,
150
+ .slick-next:before {
151
+ font-family: "slick";
152
+ font-size: 20px;
153
+ line-height: 1;
154
+ color: white;
155
+ opacity: 0.75;
156
+ -webkit-font-smoothing: antialiased;
157
+ -moz-osx-font-smoothing: grayscale;
158
+ }
159
+
160
+ .slick-prev {
161
+ left: -25px;
162
+ }
163
+ [dir=rtl] .slick-prev {
164
+ left: auto;
165
+ right: -25px;
166
+ }
167
+ .slick-prev:before {
168
+ content: "←";
169
+ }
170
+ [dir=rtl] .slick-prev:before {
171
+ content: "→";
172
+ }
173
+
174
+ .slick-next {
175
+ right: -25px;
176
+ }
177
+ [dir=rtl] .slick-next {
178
+ left: -25px;
179
+ right: auto;
180
+ }
181
+ .slick-next:before {
182
+ content: "→";
183
+ }
184
+ [dir=rtl] .slick-next:before {
185
+ content: "←";
186
+ }
187
+
188
+ /* Dots */
189
+ .slick-dotted.slick-slider {
190
+ margin-bottom: 30px;
191
+ }
192
+
193
+ .slick-dots {
194
+ position: absolute;
195
+ bottom: -25px;
196
+ list-style: none;
197
+ display: block;
198
+ text-align: center;
199
+ padding: 0;
200
+ margin: 0;
201
+ width: 100%;
202
+ }
203
+ .slick-dots li {
204
+ position: relative;
205
+ display: inline-block;
206
+ height: 20px;
207
+ width: 20px;
208
+ margin: 0 5px;
209
+ padding: 0;
210
+ cursor: pointer;
211
+ }
212
+ .slick-dots li button {
213
+ border: 0;
214
+ background: transparent;
215
+ display: block;
216
+ height: 20px;
217
+ width: 20px;
218
+ outline: none;
219
+ line-height: 0px;
220
+ font-size: 0px;
221
+ color: transparent;
222
+ padding: 5px;
223
+ cursor: pointer;
224
+ }
225
+ .slick-dots li button:hover, .slick-dots li button:focus {
226
+ outline: none;
227
+ }
228
+ .slick-dots li button:hover:before, .slick-dots li button:focus:before {
229
+ opacity: 1;
230
+ }
231
+ .slick-dots li button:before {
232
+ position: absolute;
233
+ top: 0;
234
+ left: 0;
235
+ content: "•";
236
+ width: 20px;
237
+ height: 20px;
238
+ font-family: "slick";
239
+ font-size: 6px;
240
+ line-height: 20px;
241
+ text-align: center;
242
+ color: black;
243
+ opacity: 0.25;
244
+ -webkit-font-smoothing: antialiased;
245
+ -moz-osx-font-smoothing: grayscale;
246
+ }
247
+ .slick-dots li.slick-active button:before {
248
+ color: black;
249
+ opacity: 0.75;
250
+ }
251
+
18
252
  .ant-layout-content {
19
253
  position: relative;
20
254
  }
@@ -112,6 +346,10 @@ a {
112
346
  background-color: transparent;
113
347
  }
114
348
 
349
+ .slick-track {
350
+ margin: unset;
351
+ }
352
+
115
353
  #main-header {
116
354
  --button-height: 35px;
117
355
  position: relative;
@@ -334,7 +572,7 @@ a {
334
572
  }
335
573
  #main-footer .contact-info .ant-flex {
336
574
  gap: 10px !important;
337
- align-items: flex-start;
575
+ align-items: center;
338
576
  }
339
577
  }
340
578
  #headline {
@@ -484,10 +722,11 @@ a {
484
722
  margin-top: 100px;
485
723
  }
486
724
  #ribbon-section_header {
487
- height: 138px;
725
+ height: 150px;
488
726
  text-align: center;
489
727
  position: relative;
490
- background-image: url("/iceholidays-assets/images/Layer_1.png");
728
+ background-image: url("/iceholidays-assets/images/TSTRibbon.png");
729
+ background-repeat: no-repeat;
491
730
  }
492
731
  #ribbon-section_header h1 {
493
732
  font-family: Poppins, san-serif;
@@ -580,6 +819,18 @@ a {
580
819
  line-height: 30px;
581
820
  }
582
821
  }
822
+ @media only screen and (min-width: 1441px) {
823
+ #ribbon-section_header {
824
+ background-image: url("/iceholidays-assets/images/TST Ribbon@2x.png");
825
+ height: 300px;
826
+ }
827
+ }
828
+ @media only screen and (min-width: 2880px) {
829
+ #ribbon-section_header {
830
+ background-image: url("/iceholidays-assets/images/TST Ribbon@3x.png");
831
+ height: 450px;
832
+ }
833
+ }
583
834
  .ant-input {
584
835
  field-sizing: content;
585
836
  }
@@ -1243,6 +1494,12 @@ body {
1243
1494
  display: block;
1244
1495
  width: 100%;
1245
1496
  }
1497
+ #listing-page #no-tours-found {
1498
+ font-family: Poppins, san-serif;
1499
+ font-weight: 400;
1500
+ text-align: center;
1501
+ color: rgba(0, 0, 12, 0.6);
1502
+ }
1246
1503
 
1247
1504
  .tour_details_description.ant-modal .ant-modal-title {
1248
1505
  font-family: Poppins, san-serif;
@@ -1353,20 +1610,20 @@ body {
1353
1610
  #show-page #date-selector {
1354
1611
  padding: 20px var(--side-padding);
1355
1612
  }
1356
- #show-page #date-selector [class~=ant-carousel] .slick-slide > div {
1613
+ #show-page #date-selector [class~=slick-slider] .slick-slide > div {
1357
1614
  padding: 0 5px;
1358
1615
  }
1359
- #show-page #date-selector [class~=ant-carousel] .slick-arrow {
1616
+ #show-page #date-selector [class~=slick-slider] .slick-arrow {
1360
1617
  color: rgb(149, 148, 146);
1361
1618
  }
1362
- #show-page #date-selector [class~=ant-carousel] .slick-arrow:hover {
1619
+ #show-page #date-selector [class~=slick-slider] .slick-arrow:hover {
1363
1620
  color: #DCB062;
1364
1621
  }
1365
- #show-page #date-selector [class~=ant-carousel] .slick-prev {
1366
- inset-inline-start: -40px;
1622
+ #show-page #date-selector [class~=slick-slider] .slick-prev {
1623
+ inset-inline-start: -35px;
1367
1624
  }
1368
- #show-page #date-selector [class~=ant-carousel] .slick-next {
1369
- inset-inline-end: -40px;
1625
+ #show-page #date-selector [class~=slick-slider] .slick-next {
1626
+ inset-inline-end: -35px;
1370
1627
  }
1371
1628
  #show-page #date-selector .date-box {
1372
1629
  background: #FFFFFF;
@@ -1818,6 +2075,9 @@ body {
1818
2075
  margin: 20px 0;
1819
2076
  display: block;
1820
2077
  }
2078
+ #about-signature-tours picture > img {
2079
+ width: 100%;
2080
+ }
1821
2081
  #about-signature-tours #about-st-feature #feature {
1822
2082
  height: 246px;
1823
2083
  gap: 0px;
@@ -1873,7 +2133,7 @@ body {
1873
2133
  font-size: 24px;
1874
2134
  font-weight: 500;
1875
2135
  line-height: 36px;
1876
- text-align: left;
2136
+ text-align: center;
1877
2137
  text-underline-position: from-font;
1878
2138
  text-decoration-skip-ink: none;
1879
2139
  }
@@ -2221,6 +2481,17 @@ body {
2221
2481
  #blog-page_body #blogs {
2222
2482
  margin: 30px 0;
2223
2483
  }
2484
+ #blog-page_body #blogs .preview-content {
2485
+ overflow: hidden;
2486
+ text-overflow: ellipsis;
2487
+ display: -webkit-box;
2488
+ -webkit-line-clamp: 2;
2489
+ -webkit-box-orient: vertical;
2490
+ max-height: 100px;
2491
+ }
2492
+ #blog-page_body #blogs .view-blog {
2493
+ margin-top: 10px;
2494
+ }
2224
2495
 
2225
2496
  #blog-show-page_body {
2226
2497
  margin: 20px var(--side-padding);
@@ -2229,6 +2500,21 @@ body {
2229
2500
  background: rgb(255, 255, 255);
2230
2501
  box-shadow: 0px 5px 20px 0px rgba(225, 182, 91, 0.2);
2231
2502
  }
2503
+ #blog-show-page_body h1 {
2504
+ font-family: Poppins;
2505
+ font-weight: 600;
2506
+ font-size: 24px;
2507
+ line-height: 36px;
2508
+ letter-spacing: 0%;
2509
+ margin-top: 0;
2510
+ }
2511
+ #blog-show-page_body img {
2512
+ object-fit: cover;
2513
+ height: auto;
2514
+ border-radius: 20px;
2515
+ width: 100%;
2516
+ margin-bottom: 20px;
2517
+ }
2232
2518
 
2233
2519
  @media only screen and (min-width: 769px) {
2234
2520
  * {
@@ -2528,6 +2814,15 @@ body {
2528
2814
  line-height: 45px;
2529
2815
  letter-spacing: 0.05em;
2530
2816
  }
2817
+ #show-page #date-selector [class~=slick-slider] .slick-slide > div {
2818
+ padding: 0 5px;
2819
+ }
2820
+ #show-page #date-selector [class~=slick-slider] .slick-prev {
2821
+ inset-inline-start: -40px;
2822
+ }
2823
+ #show-page #date-selector [class~=slick-slider] .slick-next {
2824
+ inset-inline-end: -40px;
2825
+ }
2531
2826
  #show-page_body .toggle_contact-agent,
2532
2827
  #show-page_body .collapse-contact-agent {
2533
2828
  display: none;