From vibrant cities to breathtaking landscapes — Canada welcomes you with warmth and wonder.
Set Off on Your AdventureStart your journey
we make it memorable
An error occurred while processing the template.
The following has evaluated to null or missing:
==> cur_CarouselSection.ImageDesktopFieldSetFieldSet.Schedule [in template "64899143380625#20119#8206410" at line 38, column 40]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign scheduleStr = cur_CarouselSec... [in template "64899143380625#20119#8206410" at line 38, column 17]
----
1<#--
2 Add elements from the sidebar to define your template. Type "${" to use the
3 autocomplete feature.
4
5 #set($serviceContext = $portal.getClass().forName("com.liferay.portal.service.ServiceContextThreadLocal").getServiceContext())
6 #set($layoutLocalServiceUtil = $serviceLocator.findService("com.liferay.portal.service.LayoutLocalService"))
7 #set($themeDisplay = $serviceContext.getThemeDisplay())
8 #set($journalTool = $serviceLocator.findService("ram-single-site-portlet", "es.indra.velocity.tools.JournalTool"))
9 #set($httpRequest = $themeDisplay.getRequest())
10 #set($isMobile = $journalTool.isMobile($httpRequest))
11 -->
12
13 <div class="offersUpdate flex-c flex-g-16 f-mb-64">
14 <h2 class="whyram__title f-heading-l f-fw-l"><@liferay.language key='offers-updates-title' /></h2>
15 <div class="js-offersUpdateContainer offersUpdate__container">
16 <div class="swiper swiper-offersUpdate">
17 <div class="swiper-wrapper">
18
19 <#assign currentDateMillis = .now?datetime>
20 <#assign array = []>
21
22
23
24 <#if ImageDesktopFieldSet.getSiblings()?has_content>
25 <#list ImageDesktopFieldSet.getSiblings() as cur_CarouselSection>
26
27
28
29
30
31
32
33 <#assign isActive = getterUtil.getBoolean(cur_CarouselSection.ImageDesktopFieldSetFieldSet.Active.getData())>
34 <#-- assign scheduleDateMillis = cur_CarouselSection.ImageDesktopFieldSetFieldSet.Schedule.getData() -->
35
36
37 <#-- Recupera y parsea la fecha programada (yyyy-MM-dd) -->
38 <#assign scheduleStr = cur_CarouselSection.ImageDesktopFieldSetFieldSet.Schedule.getData()>
39 <#if scheduleStr?? && scheduleStr?has_content>
40 <#assign scheduleDate = scheduleStr?date("yyyy-MM-dd")>
41 <#-- Convierte a milisegundos (00:00:00 de esa fecha en la zona configurada) -->
42 <#assign scheduleDateMillis = scheduleDate?long>
43 <#assign isPast = (currentDateMillis?long gt scheduleDateMillis)>
44
45 <#if isActive == true && isPast>
46 <#assign item = {
47 "data": cur_CarouselSection,
48 "order": cur_CarouselSection.ImageDesktopFieldSetFieldSet.order.getData()
49 }>
50 <#assign array = array + [item]>
51 </#if>
52
53 <#else>
54 <#if isActive>
55 <#assign item = {
56 "data": cur_CarouselSection,
57 "order": cur_CarouselSection.ImageDesktopFieldSetFieldSet.order.getData()
58 }>
59 <#assign array = array + [item]>
60 </#if>
61 </#if>
62 </#list>
63
64 <#if array?size != 0>
65 <#assign sortedArray = array?sort_by("order")>
66 <#list sortedArray as cur_ImageDesktop>
67
68 <div class="swiper-slide ${cur_ImageDesktop.order}">
69
70 <#assign link = "">
71
72
73
74 <#if cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.Link_to_Page5551.getFriendlyUrl() != "">
75 <#assign link = cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.Link_to_Page5551.getFriendlyUrl()>
76 <#else>
77 <#assign link = cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.linkUrl.getData()>
78 </#if>
79
80 <a href="${link}" class="offersUpdate__card js-offersUpdateCard">
81
82 <img class="offersUpdate__img-mobile" src="${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.ImageMobileFieldSet.ImageMobile.getData()}" alt="${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.ImageMobileFieldSet.ImageMobileFieldSetFieldSet.altMobile.getData()}">
83 <img class="offersUpdate__img" src="${cur_ImageDesktop.data.ImageDesktop.getData()}" alt="${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.altDesktop.getData()}" />
84
85 <div class="offersUpdate__footer">
86 <span class="ram-btn-f2">
87 ${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.Button_textFieldSet.Button_text.getData()}
88 </span>
89 </div>
90 </a>
91 </div>
92 </#list>
93 </#if>
94 </#if>
95 </div>
96 </div>
97 <button class="offersUpdate__arrow ram-btn-f2 swiper-button-prev" tabindex="-1"></button>
98 <button class="offersUpdate__arrow ram-btn-f2 swiper-button-next" tabindex="-1"></button>
99 </div>
100 <div class="swiper-pagination offersUpdate__pagination"></div>
101 </div>
102 <script>
103 document.addEventListener("DOMContentLoaded", () => {
104 const swiperOffersUpdateWrapper = document.querySelector('.js-offersUpdateContainer'),
105 swiper = document.querySelector('.swiper-offersUpdate');
106
107 var swiperOffersUpdate = new Swiper(".swiper-offersUpdate", {
108 uniqueNavElements: true,
109 loop: true,
110 centeredSlides: true,
111 disableOnInteraction: true,
112 keyboard: {
113 enabled: true,
114 },
115 autoplay: {
116 delay: 5000,
117 disableOnInteraction: true,
118 },
119 slidesPerView: 1,
120 navigation: {
121 nextEl: ".offersUpdate .swiper-button-next",
122 prevEl: ".offersUpdate .swiper-button-prev",
123 },
124 pagination: {
125 el: ".swiper-pagination",
126 clickable: true,
127 },
128 on: {
129 init: function () {
130 let params = swiper.swiper.params;
131 const slides = document.querySelectorAll('.swiper-offersUpdate .swiper-slide');
132
133 if (slides.length <= 3) {
134 params.loop = false;
135 params.rewind = true;
136 }
137 },
138 },
139 });
140
141 if (swiperOffersUpdateWrapper) {
142 swiperOffersUpdateWrapper.addEventListener('mouseover', () => {
143 swiperOffersUpdateWrapper.classList.add('offersUpdate--hover');
144 });
145
146 swiperOffersUpdateWrapper.addEventListener('mouseout', () => {
147 swiperOffersUpdateWrapper.classList.remove('offersUpdate--hover');
148 });
149
150 swiper.addEventListener('mouseover', () => {
151 swiperOffersUpdate.autoplay.stop();
152 });
153
154 swiper.addEventListener('mouseleave', () => {
155 swiperOffersUpdate.autoplay.start();
156 });
157 }
158
159
160 });
161 </script>
What makes so great flying with us?
- Learn more
Meals included in all our flights
Delight in carefully prepared complimentary meals on flights
- Learn more
Free hold luggage for your trip
Travel stress-free with included complimentary baggage allowance
- Learn more
Entertainment on board
Enjoy the latest movies and music during flights
- Learn more
Extra leg room in all our flights
Stretch out and enjoy enhanced comfort on flights