Article #3 - Redirect - Magellan of Idaho
An error occurred while processing the template.
The following has evaluated to null or missing: ==> section.AccordionGroup [in template "20097#20123#PS-ARTICLE" at line 117, column 32] ---- 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: #list section.AccordionGroup.getSibli... [in template "20097#20123#PS-ARTICLE" at line 117, column 25] ----
1<#--
2Web content templates are used to lay out the fields defined in a web
3content structure.
4Please use the left panel to quickly add commonly used variables.
5Autocomplete is also available and can be invoked by typing "${".
6-->
7
8<#assign
9articleId = .vars['reserved-article-id'].data
10
11/>
12
13
14
15<#macro ctaSection ctaData>
16 <#if ctaData?has_content && ctaData.get("classPK")?has_content>
17 <div id="cta-section" class="l3-cta">
18 <#assign
19 ctaClassPK = ctaData.get("classPK")
20 article = publicSiteGlobalTemplateHelper.getArticleByResourcePrimKey(ctaClassPK)
21 />
22 <@liferay_journal["journal-article"]
23 articleId=article.getArticleId()
24 groupId=article.getGroupId()
25 />
26 </div>
27 </#if>
28</#macro>
29<#macro accordionSection items>
30 <#if (items?size gt 0)>
31 <section id="faq-section" class="faq">
32
33 <#list items![] as item>
34 <#if item.Title.getData()?has_content>
35 <div class="panel magellan-accordion panel-panel" role="tablist">
36 <button class="panel-header panel-header-link collapse-icon collapse-icon-middle collapsed btn btn-unstyled"
37 type="button" aria-expanded="false" role="tab">
38 <span class="panel-title">${item.Title.getData()}</span>
39 <span class="collapse-icon-closed">
40 <@clay.icon symbol="angle-down" />
41 </span>
42 <span class="collapse-icon-open">
43 <@clay.icon symbol="angle-up" />
44 </span>
45 </button>
46 <div class="panel-collapse collapse" role="tabpanel">
47 <div class="panel-body" tabindex="0">${item.Content.getData()}</div>
48 </div>
49 </div>
50 </#if>
51 </#list>
52 </section>
53 </#if>
54</#macro>
55<#assign
56shouldRenderTableOfContent = getterUtil.getBoolean(ShowTableOfContent.getData())
57/>
58<article class="l3-article container-fluid">
59 <div class="row">
60 <div class="col-md-9 article-content" id="main">
61 <#list SectionSeparator.getSiblings() as section>
62 <#if section?index gt 0>
63 <hr/>
64 </#if>
65 <#assign showTableOfContentMobile = (shouldRenderTableOfContent && section?index == 1) />
66 <#if showTableOfContentMobile>
67 <div class="d-lg-none table-of-content-mobile mb-5">
68 <div class="panel magellan-accordion panel-panel" role="tablist">
69 <button class="panel-header panel-header-link collapse-icon collapse-icon-middle collapsed btn btn-unstyled"
70 type="button" aria-expanded="false" role="tab">
71 <span class="panel-title">
72 <@liferay.language key="what-is-on-this-page" />
73 </span>
74 <span class="collapse-icon-closed">
75 <@clay.icon symbol="angle-down" />
76 </span>
77 <span class="collapse-icon-open">
78 <@clay.icon symbol="angle-up" />
79 </span>
80 </button>
81 <div class="panel-collapse collapse" role="tabpanel">
82 <ul class="list-unstyled">
83 <#list SectionSeparator.getSiblings() as section>
84 <#if section.SectionMenuTitle.getData()?has_content || section.SectionTitle.getData()?has_content>
85 <li>
86 <a class="table-of-content-item" href="#section-${section?index}">
87 <#if section.SectionMenuTitle?? && section.SectionMenuTitle.getData()?has_content>
88 ${section.SectionMenuTitle.getData()}
89 <#else>
90 ${section.SectionTitle.getData()}
91 </#if>
92 </a>
93 </li>
94 </#if>
95 </#list>
96 </ul>
97 </div>
98 </div>
99 </div>
100 </#if>
101
102 <section class="${(section?index == 0) ? then('overview','paragraph section'+section?index) }" >
103 <div class="section-content">
104
105 <#if section.SectionTitle.getData()?has_content>
106 <#if section?index == 0>
107 <h2 id="section-${section?index}">${section.SectionTitle.getData()}</h2>
108 <#else>
109 <h3 id="section-${section?index}">${section.SectionTitle.getData()}</h3>
110 </#if>
111 </#if>
112
113 <#if section.SectionTextContent.getData()?has_content>
114 <div class="section-text-content">${section.SectionTextContent.getData()}</div>
115 </#if>
116
117 <#list section.AccordionGroup.getSiblings() as accord>
118 <div class="section-accordion">
119 <@accordionSection
120 items=accord.Accordion.getSiblings()
121 />
122 </div>
123 </#list>
124
125 <#if section.CTAContent.getData()?has_content>
126 <div class="section-cta">
127 <@ctaSection
128 ctaData=jsonFactoryUtil.createJSONObject(section.CTAContent.getData())
129 />
130 </div>
131 </#if>
132
133 </div>
134 </section>
135 </#list>
136 </div>
137 <#if shouldRenderTableOfContent>
138 <div class="d-none d-lg-block col-md-3" id="sticky-sidebar">
139 <div class="sticky-top-">
140 <div class="position-fixed table-of-content ">
141 <span><@liferay.language key="what-is-on-this-page" /></span>
142 <ul class="list-unstyled nav flex-column flex-nowrap overflow-auto">
143 <#list SectionSeparator.getSiblings() as section>
144 <#if section.SectionMenuTitle.getData()?has_content || section.SectionTitle.getData()?has_content>
145 <li>
146 <a class="table-of-content-item" href="#section-${section?index}">
147 <#if section.SectionMenuTitle?? && section.SectionMenuTitle.getData()?has_content>
148 ${section.SectionMenuTitle.getData()}
149 <#else>
150 ${section.SectionTitle.getData()}
151 </#if>
152 </a>
153 </li>
154 </#if>
155 </#list>
156 </ul>
157 </div>
158 </div>
159 </div>
160 </#if>
161 </div>
162</article>
163
164<script>
165 (function () {
166 function setTableOfContentItemActive(itemId) {
167 console.log(itemId);
168 const selector = Liferay.Util.isPhone() || Liferay.Util.isTablet()
169 ? '.table-of-content-mobile .table-of-content-item'
170 : '.table-of-content .table-of-content-item';
171 const tableOfContentItems = document.querySelectorAll(selector);
172
173 if (!tableOfContentItems) {
174 return;
175 }
176
177 tableOfContentItems.forEach(function (item) {
178 item.classList.remove('active');
179
180 });
181 const activeItem = document.querySelector(selector + '[href="' + itemId + '"]');
182 activeItem.classList.add('active');
183
184 }
185
186 const tableOfContentItems = document.querySelectorAll('.table-of-content-item');
187 tableOfContentItems.forEach(function (item, index) {
188 if (index === 0) {
189 setTableOfContentItemActive(item.getAttribute('href'));
190 }
191 item.addEventListener('click', function (event) {
192 event.preventDefault();
193 event.stopPropagation();
194 const scrollTargetId = item.getAttribute('href');
195 const scrollTarget = document.getElementById(scrollTargetId.replace('#', ''));
196 const offsetNavbarRem = getComputedStyle(document.getElementById('content')).getPropertyValue('--navbar-height');
197 const offsetHeaderRem = getComputedStyle(document.getElementById('content')).getPropertyValue('--header-height');
198 const documentFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);
199 const offsetNavbar = offsetNavbarRem.trim().replace('rem', '') * documentFontSize;
200 const offsetHeader = offsetHeaderRem.trim().replace('rem', '') * documentFontSize;
201 const y = scrollTarget.offsetTop;
202 window.scroll({
203 top: y,
204 behavior: 'smooth'
205 });
206
207 setTableOfContentItemActive(scrollTargetId);
208 return false;
209 })
210 });
211 const faqItems = document.querySelectorAll('.l3-article .magellan-accordion > .panel-header');
212 faqItems.forEach(function (item) {
213 item.addEventListener('click', function (event) {
214 item.classList.toggle('collapsed');
215 item.parentElement.querySelector('.panel-collapse').classList.toggle('collapse');
216 });
217 });
218
219 HTMLElement.prototype.oldScrollIntoView = HTMLElement.prototype.scrollIntoView;
220 HTMLElement.prototype.scrollIntoView = function () {
221 if (this.id !== "p_p_id_${themeDisplay.portletDisplay.id}_") {
222 HTMLElement.prototype.oldScrollIntoView();
223 }
224 };
225
226 var sections = document.querySelectorAll('.l3-article .article-content > section');
227 sections.forEach(function (item) {
228 var content = item.querySelector('.section-content');
229 if(content) {
230 if(content.innerHTML.trim().length == 0) {
231 item.previousElementSibling.remove();
232 content.remove();
233 }
234 }
235 });
236
237 })();
238
239</script>