The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#44717" at line 117, column 25]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#44717" at line 117, column 16]
----
1<style>
2@media screen and (min-width: 768px) and (max-width: 992px) {
3 .wrapper-dpt-tin-image{
4 display: flex;
5 }
6 .dpt-tin-image .title-dpt-tin-image{
7 height: 114px;
8 }
9 .dpt-tin-video .title-dpt-tin-video {
10 height: 105px;
11 }
12}
13</style>
14
15<style>
16 .main-img-news {
17 border-radius: 10px;
18 width: 100%;
19 aspect-ratio: 4 / 3;
20 object-fit: cover;
21 }
22
23 .title-main-news {
24 color: rgba(3, 95, 181, 1);
25 font-family: Roboto;
26 font-size: clamp(16px, 3vw, 22px);
27 font-weight: 700;
28 text-align: left;
29 }
30
31
32 .sub-news {
33 margin-top: 4rem;
34 border-top: 3px solid rgba(3, 95, 181, 1);
35 }
36
37 .wrap-subnews-tnb:hover {
38 cursor: pointer;
39 }
40
41
42 .wrap-col-sub-news {
43 height: 650px;
44 overflow-y: auto;
45 }
46
47 @media (max-width: 1024px) {
48 .sub-news {
49 margin-top: 0rem;
50 padding-top: 0.5rem;
51 }
52
53 .ddxd {
54 margin-top: 60px;
55 }
56 }
57
58 @media (max-width: 576px) {
59 .sub-news {
60 margin-top: 0rem;
61 padding-top: 0.5rem;
62 }
63
64 .ddxd {
65 margin-top: 60px;
66 }
67 }
68
69
70 .cursor-pointer {
71 cursor: pointer;
72 }
73
74 .wrap-subnews-tnb {
75 list-style: none;
76 width: 100%;
77 padding: 0;
78 margin: 0;
79 list-style-type: square;
80 }
81 .wrap-subnews-tnb li {
82 list-style-type: square;
83 cursor: pointer;
84 border-bottom: 1px solid #EBEBEB;
85 min-height: 45px;
86 margin: 0 5px 0 25px;
87 padding: 10px 0;
88 font-size: clamp(14px, 3vw, 16px);
89 font-weight: 500;
90 line-height: 22.4px;
91 color: #2E2E2E;
92 transition: all 0.2s;
93 }
94 .wrap-subnews-tnb li::marker {
95 color: #035FB5;
96 }
97
98 .wrap-subnews-tnb li:hover::marker {
99 color: #DE6F18;
100 }
101
102 .wrap-subnews-tnb li:last-child {
103 border-bottom: none;
104 }
105 .wrap-subnews-tnb li:hover {
106 color: #035FB5;
107 }
108
109</style>
110
111<div class="row mx-0 ddxd" id="khoitinnoibattrangchu">
112
113 <div class="col-12 col-lg-8 px-0 pr-lg-3">
114 <#assign indexLocal=0 />
115 <#if entries?has_content>
116 <#list entries as curEntry>
117 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
118 <#if className=="com.liferay.journal.model.JournalArticle" &&
119 curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 1>
120 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
121 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
122 curEntry=curEntry
123 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
124 indexLocal=indexLocal + 1 />
125 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
126 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
127 <#else>
128 <#assign
129 smallImageUrl="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
130 </#if>
131 <div id="tinnoibat-trangchu">
132 <img onclick="location.href='${viewURL}'" src="${htmlUtil.escape(smallImageUrl)}" alt="${htmlUtil.escape(title)}"
133 class="w-100 main-img-news cursor-pointer" id="img-main" />
134 <div class="title-main-news p-2 cursor-pointer" id="div-a-main"
135 onclick="location.href='${viewURL}'">
136 ${htmlUtil.escape(title)}
137 </div>
138
139
140 </div>
141</#if>
142</#list>
143</#if>
144</div>
145<div class="col-12 col-lg-4 pr-2 custom-thin-scroll wrap-col-sub-news pl-0 pl-lg-3" id="khoitinbencanh-trangchu">
146 <div class="sub-news">
147 <ul class=" wrap-subnews-tnb" >
148 <#assign subNewsCount=0 />
149 <#assign indexLocal=0 />
150 <#if entries?has_content>
151 <#list entries as curEntry>
152 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
153 <#if className=="com.liferay.journal.model.JournalArticle" &&
154 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
155 <#if indexLocal gt 0>
156 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
157 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
158 curEntry=curEntry
159 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
160 subNewsCount=subNewsCount + 1 />
161 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
162 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
163 <#else>
164 <#assign
165 smallImageUrl="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
166 </#if>
167
168 <li class="main-item-box sub-news-item home-tinnoibat-tinmoi-news"
169 data-title="${htmlUtil.escape(title)}"
170 data-image="${htmlUtil.escape(smallImageUrl)}">
171 <a title="${htmlUtil.escape(title)}"
172 href="${htmlUtil.escape(viewURL)}">
173 ${htmlUtil.escape(title)}
174 </a>
175 </li>
176 </#if>
177 <#assign indexLocal=indexLocal + 1 />
178</#if>
179</#list>
180</#if>
181</ul>
182</div>
183</div>
184</div>
185
186<script>
187 $(document).ready(function() {
188 const $subNewsItems = $('.sub-news-item');
189 const $mainNewsImage = $('#img-main');
190 const $mainNewsTitle = $('#div-a-main');
191
192 // Store default main news information
193 const defaultMainNews = {
194 title: $mainNewsTitle.text(),
195 image: $mainNewsImage.attr('src'),
196 link: $mainNewsTitle.closest('a').attr('href')
197 };
198
199 $subNewsItems.each(function() {
200 // Handle mouseover event
201 $(this).on('mouseover', function() {
202 const $newsItem = $(this).find('.home-tinnoibat-tinmoi-news');
203 const title = $newsItem.prevObject[0].dataset.title;
204 const image = $newsItem.prevObject[0].dataset.image;
205 const link = $(this).find('.home-tinnoibat-tinmoi-news-a').attr('href');
206 if ($mainNewsImage.length && title && image) {
207 $mainNewsImage.attr('src', image);
208 $mainNewsTitle.text(title).attr('title', title);
209 $mainNewsTitle.closest('a').attr('href', link);
210 }
211 });
212 $(this).on('mouseout', function() {
213 $mainNewsImage.attr('src', defaultMainNews.image);
214 $mainNewsTitle.text(defaultMainNews.title).attr('title', defaultMainNews.title);
215 $mainNewsTitle.closest('a').attr('href', defaultMainNews.link);
216 });
217 });
218 });
219
220 (function () {
221 var el = document.querySelector('#tinnoibat-trangchu');
222 var elDivLichLamViec = document.querySelector('#khoitinbencanh-trangchu');
223 if (!el || !elDivLichLamViec) return;
224
225 function updateHeight() {
226 requestAnimationFrame(() => {
227 if (window.innerWidth >= 992) {
228 elDivLichLamViec.style.height = el.clientHeight + 'px';
229 } else {
230 elDivLichLamViec.style.height = '368px';
231 }
232 });
233 }
234
235 if (window.ResizeObserver) {
236 var resizeObserver = new ResizeObserver(updateHeight);
237 resizeObserver.observe(el);
238 }
239
240 window.addEventListener('resize', updateHeight);
241 updateHeight();
242 })();
243
244
245</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#958410" at line 102, column 27]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#958410" at line 102, column 18]
----
1<style>
2 .main-img-news {
3 border-radius: 10px;
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 }
8
9 .title-main-news {
10 color: rgba(3, 95, 181, 1);
11 font-family: Roboto;
12 font-size: clamp(16px, 3vw, 22px);
13 font-weight: 700;
14 text-align: left;
15 }
16
17
18 .sub-news {
19 margin-top: 4rem;
20 border-top: 3px solid rgba(3, 95, 181, 1);
21 }
22
23 .wrap-subnews-tnb:hover {
24 cursor: pointer;
25 }
26
27
28 .wrap-col-sub-news {
29 height: 650px;
30 overflow-y: auto;
31 }
32
33 @media (max-width: 1024px) {
34 .sub-news {
35 margin-top: 0rem;
36 padding-top: 0.5rem;
37 }
38
39 .ddxd {
40 margin-top: 60px;
41 }
42 }
43
44 @media (max-width: 576px) {
45 .sub-news {
46 margin-top: 0rem;
47 padding-top: 0.5rem;
48 }
49
50 .ddxd {
51 margin-top: 60px;
52 }
53 }
54
55
56 .cursor-pointer {
57 cursor: pointer;
58 }
59
60 .wrap-subnews-tnb {
61 list-style: none;
62 width: 100%;
63 padding: 0;
64 margin: 0;
65 list-style-type: square;
66 }
67 .wrap-subnews-tnb li {
68 list-style-type: square;
69 cursor: pointer;
70 border-bottom: 1px solid #EBEBEB;
71 min-height: 45px;
72 margin: 0 5px 0 25px;
73 padding: 10px 0;
74 font-size: clamp(14px, 3vw, 16px);
75 font-weight: 500;
76 line-height: 22.4px;
77 color: #2E2E2E;
78 transition: all 0.2s;
79 }
80 .wrap-subnews-tnb li::marker {
81 color: #035FB5;
82 }
83
84 .wrap-subnews-tnb li:hover::marker {
85 color: #DE6F18;
86 }
87
88 .wrap-subnews-tnb li:last-child {
89 border-bottom: none;
90 }
91 .wrap-subnews-tnb li:hover {
92 color: #035FB5;
93 }
94</style>
95
96<div class="row mx-0 ddxd">
97
98 <div class="col-12 col-lg-8 px-0 pr-lg-3">
99 <#assign indexLocal=0 />
100 <#if entries?has_content>
101 <#list entries as curEntry>
102 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
103 <#if className=="com.liferay.journal.model.JournalArticle" &&
104 curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 1>
105 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
106 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
107 curEntry=curEntry
108 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
109 indexLocal=indexLocal + 1 />
110 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
111 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
112 <#else>
113 <#assign
114 smallImageUrl="/documents/37638/0/ảnh-đại-diện-đà-nẵng-01.jpg">
115 </#if>
116 <div id="tinnoibat-trangchu">
117 <img onclick="location.href='${viewURL}'" src="${htmlUtil.escape(smallImageUrl)}" alt="${htmlUtil.escape(title)}"
118 class="w-100 main-img-news cursor-pointer" id="img-main2" />
119 <div class="title-main-news p-2 cursor-pointer" id="div-a-main2"
120 onclick="location.href='${viewURL}'">
121 ${htmlUtil.escape(title)}
122 </div>
123 </div>
124</#if>
125</#list>
126</#if>
127</div>
128<div class="col-12 col-lg-4 pr-2 custom-thin-scroll wrap-col-sub-news pl-0 pl-lg-3" id="khoitinbencanh-trangchu">
129 <div class="sub-news">
130 <ul class=" wrap-subnews-tnb" >
131 <#assign subNewsCount=0 />
132 <#assign indexLocal=0 />
133 <#if entries?has_content>
134 <#list entries as curEntry>
135 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
136 <#if className=="com.liferay.journal.model.JournalArticle" &&
137 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
138 <#if indexLocal gt 0>
139 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
140 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
141 curEntry=curEntry
142 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
143 subNewsCount=subNewsCount + 1 />
144 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
145 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
146 <#else>
147 <#assign
148 smallImageUrl="/documents/37638/0/ảnh-đại-diện-đà-nẵng-01.jpg">
149 </#if>
150
151 <li class="main-item-box sub-news-item2 home-tinnoibat-tinmoi-news2"
152 data-title="${htmlUtil.escape(title)}"
153 data-image="${htmlUtil.escape(smallImageUrl)}"
154 onclick="location.href='${viewURL}'"
155 title ="${htmlUtil.escape(title)}">
156 ${htmlUtil.escape(title)}
157 </li>
158 </#if>
159 <#assign indexLocal=indexLocal + 1 />
160</#if>
161</#list>
162</#if>
163</ul>
164</div>
165</div>
166
167</div>
168<script>
169 $(document).ready(function() {
170 const $subNewsItems = $('.sub-news-item2');
171 const $mainNewsImage = $('#img-main2');
172 const $mainNewsTitle = $('#div-a-main2');
173
174 // Store default main news information
175 const defaultMainNews = {
176 title: $mainNewsTitle.text(),
177 image: $mainNewsImage.attr('src'),
178 link: $mainNewsTitle.closest('a').attr('href')
179 };
180
181 function sanitizeHTML(str) {
182 return $('<div>').text(str).html();
183 }
184
185 $subNewsItems.each(function() {
186 // Handle mouseover event
187 $(this).on('mouseover', function() {
188 const $newsItem = $(this).find('.home-tinnoibat-tinmoi-news2');
189 const title = $newsItem.prevObject[0].dataset.title;
190 const image = $newsItem.prevObject[0].dataset.image;
191 const link = $(this).find('.home-tinnoibat-tinmoi-news-a2').attr('href');
192 if ($mainNewsImage.length && title && image) {
193 setTimeout(function() {
194 $mainNewsImage.attr('src', image);
195 $mainNewsTitle.text(title).attr('title', title);
196 $mainNewsTitle.closest('a').attr('href', link);
197 }, 300);
198 }
199 });
200
201 // Handle mouseout event
202 $(this).on('mouseout', function() {
203 $mainNewsImage.attr('src', defaultMainNews.image);
204 $mainNewsTitle.text(defaultMainNews.title).attr('title', defaultMainNews.title);
205 $mainNewsTitle.closest('a').attr('href', defaultMainNews.link);
206 });
207 });
208 });
209
210 (function () {
211 var el = document.querySelector('#tinnoibat-trangchu');
212 var elDivLichLamViec = document.querySelector('#khoitinbencanh-trangchu');
213 if (!el || !elDivLichLamViec) return;
214
215 function updateHeight() {
216 requestAnimationFrame(() => {
217 if (window.innerWidth >= 992) {
218 elDivLichLamViec.style.height = el.clientHeight + 'px';
219 } else {
220 elDivLichLamViec.style.height = '368px';
221 }
222 });
223 }
224
225 if (window.ResizeObserver) {
226 var resizeObserver = new ResizeObserver(updateHeight);
227 resizeObserver.observe(el);
228 }
229
230 window.addEventListener('resize', updateHeight);
231 updateHeight();
232 })();
233
234
235</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#175002" at line 74, column 27]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#175002" at line 74, column 18]
----
1<style>
2 .custom-thin-scroll::-webkit-scrollbar {
3 width: 4px;
4 }
5
6 .custom-thin-scroll::-webkit-scrollbar-track {
7 background: #E0E0E04D;
8 border-radius: 10px;
9 }
10
11 .custom-thin-scroll::-webkit-scrollbar-thumb {
12 background: #ACB0B3;
13 border-radius: 10px;
14 }
15 .tc-thonbao .custom-list-w-icon {
16 list-style: none;
17 padding: 0;
18 margin: 0;
19 }
20
21 .tc-thonbao .custom-list-w-icon li {
22 position: relative;
23 padding: 5px 5px 5px 30px;
24 font-size: clamp(14px, 3vw, 16px);
25 font-weight: 500;
26 color: #2E2E2E;
27 cursor: pointer;
28 transition: all 0.2s;
29 }
30 .tc-thonbao .custom-list-w-icon li .li-content::before {
31 content: '';
32 position: absolute;
33 left: -30px;
34 top: 5px;
35 width: 20px;
36 min-height: 20px;
37 -webkit-mask: var(--urlIcon) no-repeat center;
38 mask: var(--urlIcon) no-repeat center;
39 background: #2E2E2E;
40 }
41
42
43 .tc-thonbao .custom-list-w-icon li.list-icon-dark::before {
44 background-color: #5F676D;
45 transition: background-color 0.2s;
46 }
47
48
49 .tc-thonbao .custom-list-w-icon li .li-content:hover::before {
50 background-color: #DE6F18;
51 }
52
53 .tc-thonbao .custom-list-w-icon li:hover {
54 color: #035FB5;
55 }
56 .tc-thonbao {
57 overflow-y: auto;
58 position: relative;
59 display: flex;
60 flex-direction: column;
61 }
62
63 .tc-thonbao .custom-list-w-icon {
64 display: flex;
65 flex-direction: column;
66 gap: 3px;
67 }
68</style>
69
70<div class="tc-thonbao custom-thin-scroll" id="khoithonghaobencanh" style="height: 350px;">
71 <ul class="custom-list-w-icon "
72 style="--urlIcon: url('/documents/37638/39612/icon-ring.png/5fb9d93c-a89e-9857-ea76-daee9e2f3cb7?t=1737532773610');">
73 <#list entries as curEntry>
74 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
75 <#if className=="com.liferay.journal.model.JournalArticle" &&
76 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
77 <#assign title=curEntry.getTitle(locale)
78 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}" />
79 <li class="list-icon-dark" >
80 <a class="li-content" href="${viewURL}" title="${title}">
81 ${title}
82 </a>
83 </li>
84 </#if>
85</#list>
86</ul>
87</div>
88<script>
89 (function () {
90 var ell = document.querySelector('#khoitinnoibattrangchu');
91 var blockchinhquyen02cap = document.querySelector('#chinhquyen02cap');
92 var ellDivThongBao = document.querySelector('#khoithonghaobencanh');
93 var ellBanDo = document.querySelector('#fragment-5202-nsbd');
94
95 if (!ell || !ellBanDo || !ellDivThongBao) return;
96
97 function updateHeight() {
98 requestAnimationFrame(() => {
99 if (window.innerWidth >= 992) {
100 ellDivThongBao.style.height = (ell.clientHeight + blockchinhquyen02cap.clientHeight - ellBanDo.clientHeight - 60) + 'px';
101 } else {
102 ellDivThongBao.style.setProperty('height', '350px', 'important');
103 }
104 });
105 }
106 window.addEventListener('resize', updateHeight);
107 setTimeout(updateHeight, 1000);
108 })();
109</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#46830" at line 103, column 25]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#46830" at line 103, column 16]
----
1<style>
2 /* block 11 */
3 .title-big-news-block11 {
4 font-family: Roboto;
5 font-size: clamp(16px, 3vw, 24px);
6 font-weight: 700;
7 text-align: left;
8 color: #2E2E2E;
9 }
10
11 .wrap-big-news-block11 {
12 /*background-color: #E0E0E04D;*/
13 border-radius: 10px;
14 }
15
16 .wrap-big-news-block11:hover {
17 cursor: pointer;
18
19 .title-big-news-block11 {
20 color: #035FB5;
21 }
22 }
23
24 .img-lo57 {
25 width: 100%;
26 aspect-ratio: 4 / 3;
27 object-fit: cover;
28 }
29
30 .img-nho-block11 {
31 border-radius: 10px 10px 0 0;
32 }
33
34 .tin-nho-block11 {
35 border-radius: 10px;
36 /*background-color: rgba(224, 224, 224, 0.3);*/
37 /*border-bottom: 1px solid rgba(235, 235, 235, 1)*/
38 }
39
40 .title-tin-nho-block11 {
41 height: 110px;
42 overflow-y: auto;
43 font-family: Roboto;
44 font-size: clamp(14px, 2vw, 16px);
45 font-weight: 500;
46 text-align: left;
47 color: rgba(46, 46, 46, 1);
48 scrollbar-width: none;
49 -ms-overflow-style: none;
50 }
51
52 .title-tin-nho-block11::-webkit-scrollbar {
53 display: none;
54 }
55
56 .inner-bg-gray:hover {
57 cursor: pointer;
58
59 .title-tin-nho-block11 {
60 color: rgba(3, 95, 181, 1);
61 }
62
63 img {
64 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
65 }
66 }
67
68 .item-small-news .inner-bg-gray {
69 background-color: rgba(224, 224, 224, 0.3);
70 height: 100%;
71 width: 100%;
72 border-radius: 8px;
73 overflow: hidden;
74 border-bottom: 1px solid rgba(235, 235, 235, 1);
75 }
76
77 @media (max-width: 992px) {
78 .title-tin-nho-block11 {
79 height: 100px;
80 }
81 }
82 .wrap-col-5 {
83 background: #E0E0E04D;
84 height: 99%;
85 border-radius: 10px;
86 }
87 .tin-nho-block11 .under-ws{
88 bottom: 0;
89 left: 0;
90 width: 100%;
91 height: 34px;
92
93 background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #EBEBEB 69.12%);
94 }
95</style>
96
97
98<div class="row">
99 <div class="col-12 col-lg-5 mb-1 mb-lg-0 px-0 px-lg-3">
100 <div class="wrap-col-5">
101 <#assign indexLocal=0 />
102 <#list entries as curEntry>
103 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
104 <#if className=="com.liferay.journal.model.JournalArticle" &&
105 curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
106 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle() noiDung=article.getContent()
107 idBaiViet=article.getId()
108 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
109 indexLocal=indexLocal + 1 />
110 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
111 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
112 <#else>
113 <#assign smallImageUrl="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
114 </#if>
115 <#if indexLocal==1>
116 <div class="row">
117 <div class="col-12">
118 <a class="wrap-big-news-block11" href="${viewURL}" title="${title}">
119 <img src="${smallImageUrl}" alt="" class="img-lo57" style="border-radius: 10px 10px 0 0; aspect-ratio: 1.28;">
120 <div class="title-big-news-block11 p-2 p-lg-3">
121 ${title}
122 </div>
123 </a>
124 </div>
125 </div>
126 </#if>
127</#if>
128</#list>
129</div>
130
131</div>
132<div class="col-12 col-lg-7 px-0 px-lg-3">
133 <div class="row">
134 <#assign subNewsCount=0 />
135 <#assign indexLocal=0 />
136 <#if entries?has_content>
137 <#list entries as curEntry>
138 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
139 <#if className=="com.liferay.journal.model.JournalArticle" &&
140 curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 7>
141 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle() noiDung=article.getContent()
142 idBaiViet=article.getId()
143 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
144 subNewsCount=subNewsCount + 1 />
145 <#assign indexLocal=indexLocal + 1 />
146 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
147 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
148 <#else>
149 <#assign smallImageUrl="/documents/37638/0/ảnh-đại-diện-đà-nẵng-01.jpg">
150 </#if>
151 <#if subNewsCount lte 7 && indexLocal gt 1>
152 <div class="col-6 col-lg-4 item-small-news mb-2">
153 <a class="inner-bg-gray" href="${viewURL}" title='${title}'>
154 <div class="row">
155 <div class="col-12">
156 <div class="tin-nho-block11 position-relative" >
157 <img src="${smallImageUrl}" alt="" class="img-nho-block11 img-lo57">
158 <div class="p-2 p-lg-3 title-tin-nho-block11">
159 ${title}
160 </div>
161 <div class="under-ws position-absolute"></div>
162 </div>
163 </div>
164 </div>
165 </a>
166 </div>
167</#if>
168</#if>
169</#list>
170</#if>
171</div>
172</div>
173</div>
CỔNG THÔNG TIN ĐIỆN TỬ
CHÍNH PHỦ
CỔNG DỊCH VỤ CÔNG
TRỰC TUYẾN
CÔNG BÁO THÀNH PHỐ
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#45397" at line 64, column 22]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#45397" at line 64, column 13]
----
1<style>
2 .cddhubnd .custom-list-w-icon-tinvb {
3 list-style: none;
4 padding: 0;
5 margin: 0;
6
7 }
8
9 .cddhubnd .custom-list-w-icon-tinvb li{
10 padding: 15px 5px 15px 45px;
11 cursor: pointer;
12 transition: all 0.2s;
13 }
14
15 .li-content{
16 position: relative;
17 }
18 .cddhubnd .custom-list-w-icon-tinvb li a{
19 font-size: clamp(14px, 3vw, 16px);
20 font-weight: 500;
21 color: #2E2E2E;
22 text-decoration: none;
23 transition: all 0.2s;
24 }
25
26 .cddhubnd .custom-list-w-icon-tinvb li.list-bg {
27 margin-bottom: 16px;
28 background: #E0E0E04D;
29 }
30
31 .cddhubnd .custom-list-w-icon-tinvb li .li-content::before {
32 content: '';
33 position: absolute;
34 left: -30px;
35 top: 3px;
36 width: 20px;
37 min-height: 20px;
38 -webkit-mask: var(--urlIcon) no-repeat center;
39 mask: var(--urlIcon) no-repeat center;
40 background: #2E2E2E;
41 }
42
43 .cddhubnd .custom-list-w-icon-tinvb li.list-icon-grey .li-content::before {
44 background-color: #848A8F;
45 transition: background-color 0.2s;
46 }
47
48 .cddhubnd .custom-list-w-icon-tinvb li:hover .li-content::before {
49 background-color: #DE6F18;
50 }
51
52 .cddhubnd .custom-list-w-icon-tinvb li:hover a{
53 color: #035FB5;
54 }
55 .vb-thuong-item.vb-item > .custom-list-w-icon > li::before {
56 top: 30px;
57 }
58</style>
59<#assign groupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")>
60<div class="cddhubnd">
61 <ul class="custom-list-w-icon-tinvb" style="--urlIcon: url('/documents/37638/39612/book-icon.svg/1c253d07-0391-ab9e-5997-ea95bdb37598?t=1737516649655');">
62 <#list entries as curEntry>
63 <#assign
64 renderer=curEntry.getAssetRenderer()
65 className=renderer.getClassName()
66 groupId = curEntry.getGroupId()
67 group = groupLocalService.getGroup(groupId)
68 friendlyURL = group.getFriendlyURL() />
69 <#if className=="com.liferay.journal.model.JournalArticle" &&
70 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
71 <#assign title=curEntry.getTitle(locale)
72 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${friendlyURL}/-/${renderer.getUrlTitle()}" />
73 <li class="list-bg list-icon-grey">
74 <div class="li-content">
75 <a href="${viewURL}" title="${title}">
76 ${title}
77 </a>
78 </div>
79 </li>
80 </#if>
81 </#list>
82 </ul>
83</div>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#46416" at line 114, column 16]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#46416" at line 114, column 5]
----
1<style>
2 .schedule-item {
3 display: flex;
4 align-items: flex-start;
5 gap: clamp(4px, 2vw, 10px);
6 margin-bottom: 15px;
7 cursor: pointer;
8 }
9
10 .schedule-item-title p {
11 margin: 0;
12 color: #2E2E2E;
13 font-size: clamp(14px, 2vw, 16px);
14 font-weight: 700;
15 transition: color 0.2s ease;
16 }
17
18 .schedule-item-time p {
19 margin: 0;
20 font-size: clamp(12px, 2vw, 14px);
21 color: #5F676D;
22 }
23
24 .schedule-item:hover .schedule-item-title p {
25 color: #035FB5;
26 }
27
28 .schedule-item:hover .schedule-item-icon::before {
29 border-color: #DE6F18;
30 filter: drop-shadow(0 0 2px #DE6F18);
31 }
32
33 .schedule-item:hover .schedule-item-icon::after {
34 background-color: #DE6F18;
35 }
36
37 .schedule-item-content {
38 flex: 1;
39 }
40
41 .schedule-item-icon {
42 width: 12px;
43 height: 12px;
44 position: relative;
45 display: inline-flex;
46 align-items: center;
47 justify-content: center;
48 margin-top: 5px;
49 }
50
51 .schedule-item-icon::before {
52 content: '';
53 position: absolute;
54 width: 12px;
55 height: 12px;
56 border: 1px solid;
57 border-radius: 50%;
58 }
59
60 .schedule-item-icon::after {
61 content: '';
62 width: 6px;
63 height: 6px;
64 border-radius: 50%;
65 }
66
67 .schedule-item-icon.blue::before {
68 border-color: #0066CC;
69 }
70
71 .schedule-item-icon.blue::after {
72 background-color: #0066CC;
73 }
74
75 .schedule-item-icon::before {
76 border-color: #0066CC;
77 }
78
79 .schedule-item-icon::after {
80 background-color: #0066CC;
81 }
82
83 .blue-link {
84 color: #0066CC;
85 text-decoration: none;
86 }
87
88 .blue-link:hover {
89 text-decoration: underline;
90 }
91
92 /*.side-news-block {*/
93 /* overflow-y: auto;*/
94 /*}*/
95
96 .video{
97 width: 100% !important;
98 height: auto !important;
99}
100.yui3-widget{
101 width: 100% !important;
102 height: auto !important;
103}
104</style>
105
106<#assign dateFormatDay = "dd" />
107<#assign monthFormatDay = "MM" />
108<#assign yearFormatDay = "yyyy" />
109<#assign dateFormatTime = "HH:mm" />
110<div class="container-box custom-thin-scroll">
111 <div class="box-content">
112 <#list entries as curEntry>
113 <#assign
114 renderer = curEntry.getAssetRenderer()
115 className = renderer.getClassName() />
116 <#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale)>
117 <#assign
118 title = curEntry.getTitle(locale)
119 viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
120 createTime = dateUtil.getDate(curEntry.getPublishDate(), dateFormatTime, locale)
121 createDay = dateUtil.getDate(curEntry.getPublishDate(), dateFormatDay, locale)
122 createMonth = dateUtil.getDate(curEntry.getPublishDate(), monthFormatDay, locale)
123 createYear = dateUtil.getDate(curEntry.getPublishDate(), yearFormatDay, locale)/>
124 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
125 <#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
126 <#else>
127 <#assign smallImageUrl = "/documents/37629/39524/carousel-11.png" >
128 </#if>
129 <a class="schedule-item" href="${viewURL}" title="${title}">
130 <div class="schedule-item-icon"></div>
131 <div class="schedule-item-content">
132 <div class="schedule-item-title">
133 <p>${title}</p>
134 </div>
135 <div class="schedule-item-time">
136 <p>${createTime} | ${createDay}/${createMonth}/${createYear}</p>
137 </div>
138 </div>
139 </a>
140</#if>
141</#list>
142</div>
143</div>
144
145<script>
146
147 // (function() {
148 // var el = document.querySelector('.wrap-tin-noi-bat-no-tabs');
149 // var heightTinNoiBat = 0;
150 // var elDivLichLamViec = document.querySelector('#fragment-15506-qbul');
151 //
152 // if (el) {
153 // heightTinNoiBat = el.offsetHeight;
154 // var width = window.innerWidth;
155 //
156 // function updateHeight() {
157 // if (elDivLichLamViec && width > 992) {
158 // elDivLichLamViec.style.height = heightTinNoiBat - 99 + 'px';
159 // }
160 // }
161 //
162 // var resizeObserver = new ResizeObserver(updateHeight);
163 // resizeObserver.observe(el);
164 // updateHeight();
165 // }
166 // })();
167
168 (function() {
169 var el = document.querySelector('.wrap-tin-noi-bat-no-tabs');
170 var heightTinNoiBat = 0;
171 var elDivLichLamViec = document.querySelector('.side-news-block-content');
172
173 if (el) {
174 heightTinNoiBat = el.offsetHeight;
175
176 function updateHeight() {
177 if (elDivLichLamViec && window.innerWidth > 992) {
178 elDivLichLamViec.style.height = heightTinNoiBat - 65 + 'px';
179 }
180 }
181
182 var resizeObserver = new ResizeObserver(updateHeight);
183 resizeObserver.observe(el);
184 updateHeight();
185 }
186 })();
187
188
189
190
191
192</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 21]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 12]
----
1<style>
2 ul.custom-simple-list-w-icon {
3
4 cursor: pointer;
5 list-style-position: bottom;
6 }
7
8 ul.custom-simple-list-w-icon li {
9 position: relative;
10 text-align: start!important;
11 padding: 5px 5px 5px 20px;
12 color: #2E2E2E;
13 font-size: clamp(14px, 2vw, 16px);
14 font-weight: 500;
15 }
16 ul.custom-simple-list-w-icon li::before {
17 content: '';
18 position: absolute;
19 left: 5px;
20 top: 12px;
21 width: 10px;
22 height: 10px;
23 background-color: #035FB5;
24 -webkit-mask: var(--urlIcon) no-repeat center;
25 mask: var(--urlIcon) no-repeat center;
26 transition: background-color 0.3s;
27 }
28 ul.custom-simple-list-w-icon li:hover::before{
29 background-color: #DE6F18;
30 }
31
32 ul.custom-simple-list-w-icon li:hover {
33 color: #035FB5;
34 }
35</style>
36<ul class="custom-simple-list-w-icon" style="--urlIcon: url('/documents/37638/39612/list-style-square-icon.svg/80e3941c-0052-6c5d-1976-2d29526843ac?t=1737538625301');">
37 <#list entries as curEntry>
38 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
39 <#if className=="com.liferay.journal.model.JournalArticle" &&
40 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
41 <#assign title=curEntry.getTitle(locale)
42 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
43 <li>
44 <a href="${viewURL}" title="${title}">${title}</a>
45 </li>
46</#if>
47</#list>
48</ul>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 21]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 12]
----
1<style>
2 ul.custom-simple-list-w-icon {
3
4 cursor: pointer;
5 list-style-position: bottom;
6 }
7
8 ul.custom-simple-list-w-icon li {
9 position: relative;
10 text-align: start!important;
11 padding: 5px 5px 5px 20px;
12 color: #2E2E2E;
13 font-size: clamp(14px, 2vw, 16px);
14 font-weight: 500;
15 }
16 ul.custom-simple-list-w-icon li::before {
17 content: '';
18 position: absolute;
19 left: 5px;
20 top: 12px;
21 width: 10px;
22 height: 10px;
23 background-color: #035FB5;
24 -webkit-mask: var(--urlIcon) no-repeat center;
25 mask: var(--urlIcon) no-repeat center;
26 transition: background-color 0.3s;
27 }
28 ul.custom-simple-list-w-icon li:hover::before{
29 background-color: #DE6F18;
30 }
31
32 ul.custom-simple-list-w-icon li:hover {
33 color: #035FB5;
34 }
35</style>
36<ul class="custom-simple-list-w-icon" style="--urlIcon: url('/documents/37638/39612/list-style-square-icon.svg/80e3941c-0052-6c5d-1976-2d29526843ac?t=1737538625301');">
37 <#list entries as curEntry>
38 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
39 <#if className=="com.liferay.journal.model.JournalArticle" &&
40 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
41 <#assign title=curEntry.getTitle(locale)
42 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
43 <li>
44 <a href="${viewURL}" title="${title}">${title}</a>
45 </li>
46</#if>
47</#list>
48</ul>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 21]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 12]
----
1<style>
2 ul.custom-simple-list-w-icon {
3
4 cursor: pointer;
5 list-style-position: bottom;
6 }
7
8 ul.custom-simple-list-w-icon li {
9 position: relative;
10 text-align: start!important;
11 padding: 5px 5px 5px 20px;
12 color: #2E2E2E;
13 font-size: clamp(14px, 2vw, 16px);
14 font-weight: 500;
15 }
16 ul.custom-simple-list-w-icon li::before {
17 content: '';
18 position: absolute;
19 left: 5px;
20 top: 12px;
21 width: 10px;
22 height: 10px;
23 background-color: #035FB5;
24 -webkit-mask: var(--urlIcon) no-repeat center;
25 mask: var(--urlIcon) no-repeat center;
26 transition: background-color 0.3s;
27 }
28 ul.custom-simple-list-w-icon li:hover::before{
29 background-color: #DE6F18;
30 }
31
32 ul.custom-simple-list-w-icon li:hover {
33 color: #035FB5;
34 }
35</style>
36<ul class="custom-simple-list-w-icon" style="--urlIcon: url('/documents/37638/39612/list-style-square-icon.svg/80e3941c-0052-6c5d-1976-2d29526843ac?t=1737538625301');">
37 <#list entries as curEntry>
38 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
39 <#if className=="com.liferay.journal.model.JournalArticle" &&
40 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
41 <#assign title=curEntry.getTitle(locale)
42 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
43 <li>
44 <a href="${viewURL}" title="${title}">${title}</a>
45 </li>
46</#if>
47</#list>
48</ul>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 21]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#47215" at line 38, column 12]
----
1<style>
2 ul.custom-simple-list-w-icon {
3
4 cursor: pointer;
5 list-style-position: bottom;
6 }
7
8 ul.custom-simple-list-w-icon li {
9 position: relative;
10 text-align: start!important;
11 padding: 5px 5px 5px 20px;
12 color: #2E2E2E;
13 font-size: clamp(14px, 2vw, 16px);
14 font-weight: 500;
15 }
16 ul.custom-simple-list-w-icon li::before {
17 content: '';
18 position: absolute;
19 left: 5px;
20 top: 12px;
21 width: 10px;
22 height: 10px;
23 background-color: #035FB5;
24 -webkit-mask: var(--urlIcon) no-repeat center;
25 mask: var(--urlIcon) no-repeat center;
26 transition: background-color 0.3s;
27 }
28 ul.custom-simple-list-w-icon li:hover::before{
29 background-color: #DE6F18;
30 }
31
32 ul.custom-simple-list-w-icon li:hover {
33 color: #035FB5;
34 }
35</style>
36<ul class="custom-simple-list-w-icon" style="--urlIcon: url('/documents/37638/39612/list-style-square-icon.svg/80e3941c-0052-6c5d-1976-2d29526843ac?t=1737538625301');">
37 <#list entries as curEntry>
38 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
39 <#if className=="com.liferay.journal.model.JournalArticle" &&
40 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
41 <#assign title=curEntry.getTitle(locale)
42 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
43 <li>
44 <a href="${viewURL}" title="${title}">${title}</a>
45 </li>
46</#if>
47</#list>
48</ul>
CHỈ ĐẠO ĐIỀU HÀNH CỦA CHÍNH PHỦ
VB CHỈ ĐẠO ĐIỀU HÀNH CHÍNH PHỦ
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 12]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 1]
----
1<style>
2 /* block 10 */
3 .img-news-block-10 {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 transition: 0.3s ease;
9 }
10
11 .title-first-news-block-10 {
12 font-size: clamp(14px, 3vw, 18px);
13 font-weight: 700;
14 line-height: 25.2px;
15 text-align: left;
16 color: rgba(46, 46, 46, 1);
17 }
18
19 .line-block-10 {
20 height: 1px;
21 background-color: rgba(235, 235, 235, 1);
22 }
23 .icon-news-block-10 {
24 border-right: 1px solid rgb(129, 128, 128);
25 padding-right: 10px;
26 }
27 .title-sub-news-block-10 {
28 position: relative;
29 padding: 15px 5px 15px 45px;
30 font-size: clamp(14px, 3vw, 16px);
31 font-weight: 500;
32 color: #2E2E2E;
33 cursor: pointer;
34 transition: all 0.2s;
35 }
36 .title-sub-news-block-10::before {
37 content: '';
38 position: absolute;
39 left: 5px;
40 top: 20px;
41 width: 20px;
42 height: 20px;
43 background-color: #2E2E2E;
44 transition: background-color 0.2s;
45 -webkit-mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
46 mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
47 }
48 .title-sub-news-block-10:hover::before {
49 background-color: #DE6F18;
50
51 }
52
53 .sub-news-block-10:hover {
54 cursor: pointer;
55 .title-sub-news-block-10 {
56 color: rgba(3, 95, 181, 1);
57 }
58 .icon-news-block-10 {
59 filter: invert(33%) sepia(100%) saturate(500%) brightness(115%);
60 border-right: 1px solid rgb(129, 128, 128) !important;
61 }
62 }
63 .wrap-first-news-block-10:hover {
64 cursor: pointer;
65 .img-news-block-10 {
66 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
67 }
68 .title-first-news-block-10 {
69 color: rgba(3, 95, 181, 1);
70 }
71 }
72 .sub-news-block-10 .divider-yy {
73 position: absolute;
74 height: 25px;
75 width: 1px;
76 background: #ACB0B3;
77 left: 35px;
78 top: 20px;
79 }
80
81 @media only screen and (max-width: 576px) {
82 .img-news-block-10 {
83 max-width: 100%;
84 }
85 }
86</style>
87<#assign indexLocal = 0/>
88<#list entries as curEntry>
89<#assign
90renderer = curEntry.getAssetRenderer()
91className = renderer.getClassName() />
92<#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
93<#assign
94title = curEntry.getTitle(locale)
95article = renderer.getArticle()
96noiDung = article.getContent()
97idBaiViet = article.getId()
98viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
99indexLocal = indexLocal + 1 />
100<#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
101<#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
102<#else>
103<#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
104</#if>
105<#if indexLocal == 1>
106<a class="row wrap-first-news-block-10 mx-auto" href="${viewURL}" title="${title}">
107 <div class="col-12 col-md-4 col-lg-3 col-xl-6 px-0">
108 <img src="${smallImageUrl}" alt="" class="img-news-block-10">
109 </div>
110 <div class="col-12 col-md-8 col-lg-9 px-0 col-xl-6 pl-md-3 align-self-center mt-2 mt-md-0">
111 <span class="title-first-news-block-10">${title}</span>
112 </div>
113</a>
114
115<#else>
116<div class="line-block-10 my-2"></div>
117<a class="d-flex sub-news-block-10" href="${viewURL}" title="${title}">
118 <div class="title-sub-news-block-10 "> <div class="divider-yy"></div>${title}</div>
119</a>
120</#if>
121</#if>
122</#list>
HỘI ĐỒNG NHÂN DÂN THÀNH PHỐ
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 12]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 1]
----
1<style>
2 /* block 10 */
3 .img-news-block-10 {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 transition: 0.3s ease;
9 }
10
11 .title-first-news-block-10 {
12 font-size: clamp(14px, 3vw, 18px);
13 font-weight: 700;
14 line-height: 25.2px;
15 text-align: left;
16 color: rgba(46, 46, 46, 1);
17 }
18
19 .line-block-10 {
20 height: 1px;
21 background-color: rgba(235, 235, 235, 1);
22 }
23 .icon-news-block-10 {
24 border-right: 1px solid rgb(129, 128, 128);
25 padding-right: 10px;
26 }
27 .title-sub-news-block-10 {
28 position: relative;
29 padding: 15px 5px 15px 45px;
30 font-size: clamp(14px, 3vw, 16px);
31 font-weight: 500;
32 color: #2E2E2E;
33 cursor: pointer;
34 transition: all 0.2s;
35 }
36 .title-sub-news-block-10::before {
37 content: '';
38 position: absolute;
39 left: 5px;
40 top: 20px;
41 width: 20px;
42 height: 20px;
43 background-color: #2E2E2E;
44 transition: background-color 0.2s;
45 -webkit-mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
46 mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
47 }
48 .title-sub-news-block-10:hover::before {
49 background-color: #DE6F18;
50
51 }
52
53 .sub-news-block-10:hover {
54 cursor: pointer;
55 .title-sub-news-block-10 {
56 color: rgba(3, 95, 181, 1);
57 }
58 .icon-news-block-10 {
59 filter: invert(33%) sepia(100%) saturate(500%) brightness(115%);
60 border-right: 1px solid rgb(129, 128, 128) !important;
61 }
62 }
63 .wrap-first-news-block-10:hover {
64 cursor: pointer;
65 .img-news-block-10 {
66 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
67 }
68 .title-first-news-block-10 {
69 color: rgba(3, 95, 181, 1);
70 }
71 }
72 .sub-news-block-10 .divider-yy {
73 position: absolute;
74 height: 25px;
75 width: 1px;
76 background: #ACB0B3;
77 left: 35px;
78 top: 20px;
79 }
80
81 @media only screen and (max-width: 576px) {
82 .img-news-block-10 {
83 max-width: 100%;
84 }
85 }
86</style>
87<#assign indexLocal = 0/>
88<#list entries as curEntry>
89<#assign
90renderer = curEntry.getAssetRenderer()
91className = renderer.getClassName() />
92<#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
93<#assign
94title = curEntry.getTitle(locale)
95article = renderer.getArticle()
96noiDung = article.getContent()
97idBaiViet = article.getId()
98viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
99indexLocal = indexLocal + 1 />
100<#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
101<#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
102<#else>
103<#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
104</#if>
105<#if indexLocal == 1>
106<a class="row wrap-first-news-block-10 mx-auto" href="${viewURL}" title="${title}">
107 <div class="col-12 col-md-4 col-lg-3 col-xl-6 px-0">
108 <img src="${smallImageUrl}" alt="" class="img-news-block-10">
109 </div>
110 <div class="col-12 col-md-8 col-lg-9 px-0 col-xl-6 pl-md-3 align-self-center mt-2 mt-md-0">
111 <span class="title-first-news-block-10">${title}</span>
112 </div>
113</a>
114
115<#else>
116<div class="line-block-10 my-2"></div>
117<a class="d-flex sub-news-block-10" href="${viewURL}" title="${title}">
118 <div class="title-sub-news-block-10 "> <div class="divider-yy"></div>${title}</div>
119</a>
120</#if>
121</#if>
122</#list>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#995001" at line 67, column 14]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#995001" at line 67, column 3]
----
1<style>
2 .dpt-tin-video{
3 cursor: pointer;
4 margin-bottom: 10px;
5 }
6 .dpt-tin-video:hover .title-dpt-tin-video{
7 color: rgba(3, 95, 181, 1);
8 }
9 .dpt-tin-video:hover .img-dpt-size{
10 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
11 }
12 .title-dpt-tin-video {
13 height: 96px;
14 background: #E0E0E04D;
15 overflow-y: auto;
16 padding: 10px;
17 font-size: clamp(14px, 2vw, 18px);
18 font-weight: 700;
19 line-height: 25.2px;
20 text-align: left;
21 color: rgba(46, 46, 46, 1);
22 scrollbar-width: none;
23 -ms-overflow-style: none;
24 }
25
26 .title-dpt-tin-video::-webkit-scrollbar {
27 display: none;
28 }
29
30 .img-dpt-size {
31 width: 100%;
32 aspect-ratio: 304 / 228;
33 border-radius: 10px 10px 0 0;
34 }
35 .img-dpt-tin-video{
36 object-fit: cover;
37 }
38 .dpt-tin-video .under-ws {
39 bottom: 0;
40 left: 0;
41 width: 100%;
42 height: 20px;
43 border-radius: 0 0 6px 6px;
44 background: linear-gradient(180deg, rgba(246, 246, 246, 0) 0%, rgba(246, 246, 246, 0.7) 28.26%, #F6F6F6 99.9%);
45 }
46 @media (min-width: 576px) and (max-width: 1023px) {
47 .wrapper-dpt-tin-video{
48 display: flex;
49 flex-wrap: wrap;
50 margin-right: -15px;
51 margin-left: -15px;
52 }
53 .custom-col {
54 width: 50%;
55 padding: 0 15px;
56 }
57 .dpt-tin-video .under-ws{
58 display: none;
59 }
60 }
61</style>
62<div class="wrapper-dpt-tin-video">
63 <#assign indexLocal = 0/>
64 <#if entries?has_content>
65 <#list entries as curEntry>
66 <#assign
67 renderer = curEntry.getAssetRenderer()
68 className = renderer.getClassName() />
69 <#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
70 <#assign
71 title = curEntry.getTitle(locale)
72 article = renderer.getArticle()
73 noiDung = article.getContent()
74 idBaiViet = article.getId()
75 viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
76 indexLocal = indexLocal + 1 />
77 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
78 <#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
79 <#else>
80 <#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
81</#if>
82<a class="dpt-tin-video position-relative custom-col" href="${viewURL}" title="${title}">
83 <img src="${smallImageUrl}" alt="" class="img-dpt-tin-video img-dpt-size position-relative">
84 <div class=" title-dpt-tin-video">
85 ${title}
86 </div>
87 <div class="under-ws position-absolute">
88 </div>
89</a>
90</#if>
91</#list>
92</#if>
93</div>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#995001" at line 67, column 14]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#995001" at line 67, column 3]
----
1<style>
2 .dpt-tin-video{
3 cursor: pointer;
4 margin-bottom: 10px;
5 }
6 .dpt-tin-video:hover .title-dpt-tin-video{
7 color: rgba(3, 95, 181, 1);
8 }
9 .dpt-tin-video:hover .img-dpt-size{
10 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
11 }
12 .title-dpt-tin-video {
13 height: 96px;
14 background: #E0E0E04D;
15 overflow-y: auto;
16 padding: 10px;
17 font-size: clamp(14px, 2vw, 18px);
18 font-weight: 700;
19 line-height: 25.2px;
20 text-align: left;
21 color: rgba(46, 46, 46, 1);
22 scrollbar-width: none;
23 -ms-overflow-style: none;
24 }
25
26 .title-dpt-tin-video::-webkit-scrollbar {
27 display: none;
28 }
29
30 .img-dpt-size {
31 width: 100%;
32 aspect-ratio: 304 / 228;
33 border-radius: 10px 10px 0 0;
34 }
35 .img-dpt-tin-video{
36 object-fit: cover;
37 }
38 .dpt-tin-video .under-ws {
39 bottom: 0;
40 left: 0;
41 width: 100%;
42 height: 20px;
43 border-radius: 0 0 6px 6px;
44 background: linear-gradient(180deg, rgba(246, 246, 246, 0) 0%, rgba(246, 246, 246, 0.7) 28.26%, #F6F6F6 99.9%);
45 }
46 @media (min-width: 576px) and (max-width: 1023px) {
47 .wrapper-dpt-tin-video{
48 display: flex;
49 flex-wrap: wrap;
50 margin-right: -15px;
51 margin-left: -15px;
52 }
53 .custom-col {
54 width: 50%;
55 padding: 0 15px;
56 }
57 .dpt-tin-video .under-ws{
58 display: none;
59 }
60 }
61</style>
62<div class="wrapper-dpt-tin-video">
63 <#assign indexLocal = 0/>
64 <#if entries?has_content>
65 <#list entries as curEntry>
66 <#assign
67 renderer = curEntry.getAssetRenderer()
68 className = renderer.getClassName() />
69 <#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
70 <#assign
71 title = curEntry.getTitle(locale)
72 article = renderer.getArticle()
73 noiDung = article.getContent()
74 idBaiViet = article.getId()
75 viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
76 indexLocal = indexLocal + 1 />
77 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
78 <#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
79 <#else>
80 <#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
81</#if>
82<a class="dpt-tin-video position-relative custom-col" href="${viewURL}" title="${title}">
83 <img src="${smallImageUrl}" alt="" class="img-dpt-tin-video img-dpt-size position-relative">
84 <div class=" title-dpt-tin-video">
85 ${title}
86 </div>
87 <div class="under-ws position-absolute">
88 </div>
89</a>
90</#if>
91</#list>
92</#if>
93</div>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 12]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 1]
----
1<style>
2 /* block 10 */
3 .img-news-block-10 {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 transition: 0.3s ease;
9 }
10
11 .title-first-news-block-10 {
12 font-size: clamp(14px, 3vw, 18px);
13 font-weight: 700;
14 line-height: 25.2px;
15 text-align: left;
16 color: rgba(46, 46, 46, 1);
17 }
18
19 .line-block-10 {
20 height: 1px;
21 background-color: rgba(235, 235, 235, 1);
22 }
23 .icon-news-block-10 {
24 border-right: 1px solid rgb(129, 128, 128);
25 padding-right: 10px;
26 }
27 .title-sub-news-block-10 {
28 position: relative;
29 padding: 15px 5px 15px 45px;
30 font-size: clamp(14px, 3vw, 16px);
31 font-weight: 500;
32 color: #2E2E2E;
33 cursor: pointer;
34 transition: all 0.2s;
35 }
36 .title-sub-news-block-10::before {
37 content: '';
38 position: absolute;
39 left: 5px;
40 top: 20px;
41 width: 20px;
42 height: 20px;
43 background-color: #2E2E2E;
44 transition: background-color 0.2s;
45 -webkit-mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
46 mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
47 }
48 .title-sub-news-block-10:hover::before {
49 background-color: #DE6F18;
50
51 }
52
53 .sub-news-block-10:hover {
54 cursor: pointer;
55 .title-sub-news-block-10 {
56 color: rgba(3, 95, 181, 1);
57 }
58 .icon-news-block-10 {
59 filter: invert(33%) sepia(100%) saturate(500%) brightness(115%);
60 border-right: 1px solid rgb(129, 128, 128) !important;
61 }
62 }
63 .wrap-first-news-block-10:hover {
64 cursor: pointer;
65 .img-news-block-10 {
66 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
67 }
68 .title-first-news-block-10 {
69 color: rgba(3, 95, 181, 1);
70 }
71 }
72 .sub-news-block-10 .divider-yy {
73 position: absolute;
74 height: 25px;
75 width: 1px;
76 background: #ACB0B3;
77 left: 35px;
78 top: 20px;
79 }
80
81 @media only screen and (max-width: 576px) {
82 .img-news-block-10 {
83 max-width: 100%;
84 }
85 }
86</style>
87<#assign indexLocal = 0/>
88<#list entries as curEntry>
89<#assign
90renderer = curEntry.getAssetRenderer()
91className = renderer.getClassName() />
92<#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
93<#assign
94title = curEntry.getTitle(locale)
95article = renderer.getArticle()
96noiDung = article.getContent()
97idBaiViet = article.getId()
98viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
99indexLocal = indexLocal + 1 />
100<#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
101<#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
102<#else>
103<#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
104</#if>
105<#if indexLocal == 1>
106<a class="row wrap-first-news-block-10 mx-auto" href="${viewURL}" title="${title}">
107 <div class="col-12 col-md-4 col-lg-3 col-xl-6 px-0">
108 <img src="${smallImageUrl}" alt="" class="img-news-block-10">
109 </div>
110 <div class="col-12 col-md-8 col-lg-9 px-0 col-xl-6 pl-md-3 align-self-center mt-2 mt-md-0">
111 <span class="title-first-news-block-10">${title}</span>
112 </div>
113</a>
114
115<#else>
116<div class="line-block-10 my-2"></div>
117<a class="d-flex sub-news-block-10" href="${viewURL}" title="${title}">
118 <div class="title-sub-news-block-10 "> <div class="divider-yy"></div>${title}</div>
119</a>
120</#if>
121</#if>
122</#list>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 12]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 1]
----
1<style>
2 /* block 10 */
3 .img-news-block-10 {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 transition: 0.3s ease;
9 }
10
11 .title-first-news-block-10 {
12 font-size: clamp(14px, 3vw, 18px);
13 font-weight: 700;
14 line-height: 25.2px;
15 text-align: left;
16 color: rgba(46, 46, 46, 1);
17 }
18
19 .line-block-10 {
20 height: 1px;
21 background-color: rgba(235, 235, 235, 1);
22 }
23 .icon-news-block-10 {
24 border-right: 1px solid rgb(129, 128, 128);
25 padding-right: 10px;
26 }
27 .title-sub-news-block-10 {
28 position: relative;
29 padding: 15px 5px 15px 45px;
30 font-size: clamp(14px, 3vw, 16px);
31 font-weight: 500;
32 color: #2E2E2E;
33 cursor: pointer;
34 transition: all 0.2s;
35 }
36 .title-sub-news-block-10::before {
37 content: '';
38 position: absolute;
39 left: 5px;
40 top: 20px;
41 width: 20px;
42 height: 20px;
43 background-color: #2E2E2E;
44 transition: background-color 0.2s;
45 -webkit-mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
46 mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
47 }
48 .title-sub-news-block-10:hover::before {
49 background-color: #DE6F18;
50
51 }
52
53 .sub-news-block-10:hover {
54 cursor: pointer;
55 .title-sub-news-block-10 {
56 color: rgba(3, 95, 181, 1);
57 }
58 .icon-news-block-10 {
59 filter: invert(33%) sepia(100%) saturate(500%) brightness(115%);
60 border-right: 1px solid rgb(129, 128, 128) !important;
61 }
62 }
63 .wrap-first-news-block-10:hover {
64 cursor: pointer;
65 .img-news-block-10 {
66 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
67 }
68 .title-first-news-block-10 {
69 color: rgba(3, 95, 181, 1);
70 }
71 }
72 .sub-news-block-10 .divider-yy {
73 position: absolute;
74 height: 25px;
75 width: 1px;
76 background: #ACB0B3;
77 left: 35px;
78 top: 20px;
79 }
80
81 @media only screen and (max-width: 576px) {
82 .img-news-block-10 {
83 max-width: 100%;
84 }
85 }
86</style>
87<#assign indexLocal = 0/>
88<#list entries as curEntry>
89<#assign
90renderer = curEntry.getAssetRenderer()
91className = renderer.getClassName() />
92<#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
93<#assign
94title = curEntry.getTitle(locale)
95article = renderer.getArticle()
96noiDung = article.getContent()
97idBaiViet = article.getId()
98viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
99indexLocal = indexLocal + 1 />
100<#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
101<#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
102<#else>
103<#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
104</#if>
105<#if indexLocal == 1>
106<a class="row wrap-first-news-block-10 mx-auto" href="${viewURL}" title="${title}">
107 <div class="col-12 col-md-4 col-lg-3 col-xl-6 px-0">
108 <img src="${smallImageUrl}" alt="" class="img-news-block-10">
109 </div>
110 <div class="col-12 col-md-8 col-lg-9 px-0 col-xl-6 pl-md-3 align-self-center mt-2 mt-md-0">
111 <span class="title-first-news-block-10">${title}</span>
112 </div>
113</a>
114
115<#else>
116<div class="line-block-10 my-2"></div>
117<a class="d-flex sub-news-block-10" href="${viewURL}" title="${title}">
118 <div class="title-sub-news-block-10 "> <div class="divider-yy"></div>${title}</div>
119</a>
120</#if>
121</#if>
122</#list>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 12]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#48486" at line 90, column 1]
----
1<style>
2 /* block 10 */
3 .img-news-block-10 {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 transition: 0.3s ease;
9 }
10
11 .title-first-news-block-10 {
12 font-size: clamp(14px, 3vw, 18px);
13 font-weight: 700;
14 line-height: 25.2px;
15 text-align: left;
16 color: rgba(46, 46, 46, 1);
17 }
18
19 .line-block-10 {
20 height: 1px;
21 background-color: rgba(235, 235, 235, 1);
22 }
23 .icon-news-block-10 {
24 border-right: 1px solid rgb(129, 128, 128);
25 padding-right: 10px;
26 }
27 .title-sub-news-block-10 {
28 position: relative;
29 padding: 15px 5px 15px 45px;
30 font-size: clamp(14px, 3vw, 16px);
31 font-weight: 500;
32 color: #2E2E2E;
33 cursor: pointer;
34 transition: all 0.2s;
35 }
36 .title-sub-news-block-10::before {
37 content: '';
38 position: absolute;
39 left: 5px;
40 top: 20px;
41 width: 20px;
42 height: 20px;
43 background-color: #2E2E2E;
44 transition: background-color 0.2s;
45 -webkit-mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
46 mask: url('/documents/37638/39612/icon-news-gray.svg/7baa887d-cba6-5bd4-e1cf-1ebb6495a01b?t=1737532773364') no-repeat center;
47 }
48 .title-sub-news-block-10:hover::before {
49 background-color: #DE6F18;
50
51 }
52
53 .sub-news-block-10:hover {
54 cursor: pointer;
55 .title-sub-news-block-10 {
56 color: rgba(3, 95, 181, 1);
57 }
58 .icon-news-block-10 {
59 filter: invert(33%) sepia(100%) saturate(500%) brightness(115%);
60 border-right: 1px solid rgb(129, 128, 128) !important;
61 }
62 }
63 .wrap-first-news-block-10:hover {
64 cursor: pointer;
65 .img-news-block-10 {
66 box-shadow: 4px 4px 4px 0px rgba(0, 0, 0, 0.25);
67 }
68 .title-first-news-block-10 {
69 color: rgba(3, 95, 181, 1);
70 }
71 }
72 .sub-news-block-10 .divider-yy {
73 position: absolute;
74 height: 25px;
75 width: 1px;
76 background: #ACB0B3;
77 left: 35px;
78 top: 20px;
79 }
80
81 @media only screen and (max-width: 576px) {
82 .img-news-block-10 {
83 max-width: 100%;
84 }
85 }
86</style>
87<#assign indexLocal = 0/>
88<#list entries as curEntry>
89<#assign
90renderer = curEntry.getAssetRenderer()
91className = renderer.getClassName() />
92<#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 4>
93<#assign
94title = curEntry.getTitle(locale)
95article = renderer.getArticle()
96noiDung = article.getContent()
97idBaiViet = article.getId()
98viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
99indexLocal = indexLocal + 1 />
100<#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
101<#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
102<#else>
103<#assign smallImageUrl = "https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg" >
104</#if>
105<#if indexLocal == 1>
106<a class="row wrap-first-news-block-10 mx-auto" href="${viewURL}" title="${title}">
107 <div class="col-12 col-md-4 col-lg-3 col-xl-6 px-0">
108 <img src="${smallImageUrl}" alt="" class="img-news-block-10">
109 </div>
110 <div class="col-12 col-md-8 col-lg-9 px-0 col-xl-6 pl-md-3 align-self-center mt-2 mt-md-0">
111 <span class="title-first-news-block-10">${title}</span>
112 </div>
113</a>
114
115<#else>
116<div class="line-block-10 my-2"></div>
117<a class="d-flex sub-news-block-10" href="${viewURL}" title="${title}">
118 <div class="title-sub-news-block-10 "> <div class="divider-yy"></div>${title}</div>
119</a>
120</#if>
121</#if>
122</#list>
Thành phố Đà Nẵng đã trao đổi 1999094
văn bản qua mạng
giữa 500 đơn vị
(Tự động cập nhật lúc 0:0 ngày 23/07/2025)
Đến nay, Thành phố Đà Nẵng
đã giải quyết được
99,99%
Hồ sơ đúng hạn
(Tự động cập nhật lúc 08:18 ngày 23/07/2025)
Hóa đơn cho hàng hóa tự làm
Người gửi: Nguyễn Định
Địa chỉ: Thôn Yến Nê 2, Hòa Tiến, Hòa Vang, TP Đà Nẵng
Thời gian: 12/02/2025
Thủ tục đăng ký thi Lớp 10 công lập của HS ngoại tỉnh
Người gửi: Trần Thị Hạnh
Địa chỉ: 30/12 Trần Phú, quận Hải Châu, TP. Đà Nẵng
Thời gian: 12/02/2025
Trường tiểu học Trưng Nữ Vương gây khó khăn cho học sinh bán trú ngoài trường
Người gửi: Nguyễn Thị Dung
Địa chỉ: tổ 7, phường Hòa Hiệp Nam, Liên Chiểu, Đà Nẵng
Thời gian: 12/02/2025
Tuyển sinh trực tuyến
Người gửi: Nguyễn Thị Diễm My
Địa chỉ: Tổ 78, Phường Khuê Trung, quận Cẩm Lệ
Thời gian: 12/02/2025
Câu hỏi về cách đăng ký cấp tài khoản cho thí sinh tự do học văn hoá và tốt nghiệp tại trường Cao Đẳng
Người gửi: Trang Trần Thảo Vy
Địa chỉ: K96/85 Điện Biên Phủ, phường Chính Gián, quận Thanh Khê, TP.Đà Nẵng
Thời gian: 12/02/2025
Đăng kí tạm trú đã có giấy xác nhận nhưng sau gần 20 ngày vẫn chưa được cập nhật trên hệ thống VNID
Người gửi: Nguyễn Thị Tiên
Địa chỉ: Hòa Khánh Bắc
Thời gian: 15/01/2025
GIẢI QUYẾT CẢI CHÍNH GIẤY CHỨNG TỬ
Người gửi: Nguyễn Thị Thu Thủy
Địa chỉ: Thôn Hà Tây 2, Điện Hòa
Ngày gửi: 17/12/2025
Chế độ ưu đãi cho giáo viên nghỉ thai sản
Người gửi: TRẦN THỊ THANH TÂM
Địa chỉ: Xã Quế Sơn Trung - Thành phố Đà Nẵng
Ngày gửi: 09/12/2025
Về việc chỉ phần trăm đứng lớp 30% cho giáo viên hợp đồng 111
Người gửi: Doãn Thị Hoài Khương
Địa chỉ: xã Tam Anh, TP Đà Nẵng
Ngày gửi: 04/12/2025
Vấn Đề Tiếng Ồn Vào Sáng Sớm Quá Mức Tại Sân Trung Tâm Văn Hoá & Thể Thao Phường Mỹ An
Người gửi: Phạm Thị Phương Thảo
Địa chỉ: k01/19 Phan Hành Sơn, Mỹ An, Ngũ Hành Sơn, Đà Nẵng
Ngày gửi: 01/12/2025
Thăng hạng GV THCS từ hạng III lên hạng II
Người gửi: Lê Văn Nam
Địa chỉ: Xã Trà My, TP Đà Nẵng
Ngày gửi: 30/11/2025
Xét thăng hạng cho giáo viên các cấp
Người gửi: Nguyễn Thị Lan
Địa chỉ: Tổ 1, Ngũ Hành Sơn, Đà Nẵng
Ngày gửi: 30/11/2025
DU KHÁCH
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 27]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 18]
----
1<style>
2 .slider-container {
3 padding: 10px 0 35px;
4 max-height: 100vh;
5 }
6
7 .slider-basic .slides-wrapper {
8 margin: auto;
9 overflow: hidden;
10 }
11
12 .slider-basic .slider-list {
13 list-style-type: none;
14 margin: 0;
15 padding: 0;
16 display: flex;
17 overflow: hidden;
18 transition: 1s;
19 max-height: calc(100vh - 80px);
20 }
21
22 .slider-basic .slider-item {
23 background-color: white;
24 padding: 3px;
25 margin: 0 16px 5px 0;
26 box-shadow: -4px 4px 6px rgba(0, 0, 0, 0.25);
27 border-radius: 6px;
28
29
30 }
31
32 .slider-basic .slider-item .card-link {
33 text-decoration: none;
34 }
35
36 .slider-basic .slider-item .card-link .tieude {
37 padding: 14px;
38 height: 120px;
39 color: #2E2E2E;
40 font-weight: 700;
41 font-size: clamp(14px, 2vw, 16px);
42 line-height: 22.4px;
43 }
44
45 .slider-basic .slider-item:hover .card-link .tieude {
46 background: linear-gradient(225.35deg, #379EFF -6.25%, #004F99 106.95%);
47 color: white;
48 }
49
50 .slider-basic .slider-item img {
51 width: 100%;
52 aspect-ratio: 4 / 3;
53 object-fit: cover;
54 }
55
56 .slider-arrows {
57 width: calc(100% + 70px);
58 height: 30px;
59 top: calc(50% - 15px);
60 left: -35px;
61 }
62
63 .slider-arrow-prev,
64 .slider-arrow-next {
65 border: none;
66 background: none;
67 }
68
69 .slider-arrow-prev svg {
70 transform: rotate(180deg);
71 }
72
73 .slider-arrow-prev path,
74 .slider-arrow-next path {
75 fill: #DE6F18;
76 }
77
78 .slider-arrow-prev.disable path,
79 .slider-arrow-next.disable path {
80 fill: #ACB0B3;
81 }
82
83
84 .slider-container .cus-slider-indicators {
85 position: absolute;
86 bottom: 0;
87 left: 50%;
88 transform: translateX(-50%);
89 display: flex;
90 align-items: center;
91 gap: 8px;
92 }
93
94 .slider-container .slider-indicator {
95 width: 25px;
96 height: 10px;
97 background-color: #E0E0E0;
98 border-radius: 5px;
99 cursor: pointer;
100 transition: 0.3s;
101 }
102
103 .slider-container .slider-indicator.active {
104 background-color: #DE6F18;
105 width: 15px;
106 height: 15px;
107 border-radius: 100%;
108 }
109 @media (max-width: 992px) {
110 .slider-container {
111 padding: 10px 10px 35px;
112 }
113 .slider-arrows {
114 width: calc(100% + 43px);
115 left: -22px;
116 }
117 }
118
119 @media (max-width: 992px) {
120 .slider-container {
121 padding: 10px 10px 35px;
122 }
123 .slider-arrows {
124 width: calc(100% + 43px);
125 left: -22px;
126 }
127 }
128
129 @media only screen and (min-width: 768px) and (max-width: 992px) {
130 .slider-container {
131 overflow: hidden;
132 padding: 10px 30px 35px !important;
133 }
134 .slider-arrows {
135 width: calc(95% + 43px) !important;
136 left: -5px !important;
137 }
138 .slider-basic .slides-wrapper {
139 margin: unset;
140 }
141 .slider-container .slider-arrows{
142 z-index: 9;
143 padding: 0 !important;
144 }
145 }
146
147 @media (max-width: 576px) {
148 .slider-basic .slides-wrapper {
149 margin: unset;
150 }
151 .slider-container .slider-arrows{
152 z-index: 9;
153 padding: 0 15px !important;
154 }
155 }
156</style>
157
158<div class="slider-container position-relative slider-basic" id="sliderBasic">
159 <div class="slides-wrapper">
160 <div class="slides-container">
161 <ul class="slider-list">
162 <#if entries?has_content>
163 <#list entries as curEntry>
164 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
165 <#if className=="com.liferay.journal.model.JournalArticle" &&
166 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
167 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
168 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
169 curEntry=curEntry
170 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
171 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
172 <#assign smallImageUrlSide=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
173 <#else>
174 <#assign smallImageUrlSide="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
175 </#if>
176
177 <li class="slider-item">
178 <a href="${viewURL}" class="card-link" title="${title}">
179 <img src="${htmlUtil.escape(smallImageUrlSide)}" alt="${htmlUtil.escape(title)}" />
180 <div class="tieude">
181 <p class="mb-0">${htmlUtil.escape(title)}</p>
182 </div>
183 </a>
184 </li>
185 </#if>
186 </#list>
187</#if>
188
189</ul>
190</div>
191</div>
192<div class="slider-arrows position-absolute d-flex justify-content-between">
193 <button type="button" class="slider-arrow-prev">
194 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
195 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
196 width="28" height="28">
197 <path
198 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
199 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
200 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
201 stroke-linecap="round" stroke-linejoin="round" />
202 </mask>
203 <g mask="url(#mask0_1865_10187)">
204 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
205 </g>
206 </svg>
207
208 </button>
209 <button type="button" class="slider-arrow-next">
210
211 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
212 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
213 width="28" height="28">
214 <path
215 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
216 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
217 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
218 stroke-linecap="round" stroke-linejoin="round" />
219 </mask>
220 <g mask="url(#mask0_1865_10187)">
221 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
222 </g>
223 </svg>
224 </button>
225</div>
226<div class="cus-slider-indicators"></div>
227</div>
228<script>
229 (function () {
230 'use strict';
231 class Slider {
232 constructor(id, mediaQueries) {
233 // Get HTML elements
234 this.slider = document.querySelector('#' + id);
235 this.sliderList = this.slider.querySelector('.slider-list');
236 this.sliderItems = this.slider.querySelectorAll('.slider-item');
237 this.sliderNext = this.slider.querySelector('.slider-arrow-next');
238 this.sliderPrev = this.slider.querySelector('.slider-arrow-prev');
239 this.indicatorsContainer = this.slider.querySelector('.cus-slider-indicators');
240
241 this.currentIndex = 0;
242 this.totalSlides = this.sliderItems.length;
243
244 this.createIndicators();
245 this.updateIndicators();
246
247 // Get media queries
248 this.mediaQueryList = [window.matchMedia('screen and (max-width:'+ (mediaQueries[0] - 1) +'px)')];
249
250 mediaQueries.forEach((mediaQuery) => {
251 this.mediaQueryList.push(window.matchMedia('screen and (min-width:'+ mediaQuery +'px)'));
252 });
253
254 // Define global variables
255 this.numberOfVisibleItems = null;
256 this.currentItemIndex = 0;
257 this.sliderItemsLength = this.sliderItems.length;
258 this.mediaQueryLength = this.mediaQueryList.length;
259
260 // Add event listener: to call the run function again when screen resized
261 this.mediaQueryList.forEach((mediaQuery) => {
262 mediaQuery.addEventListener('change', () => this.run());
263 });
264
265 // Add event listener: to go to next slide
266 this.sliderNext.addEventListener('click', () => this.nextSlide());
267
268 // Add event listener: to go to previous slide
269 this.sliderPrev.addEventListener('click', () => this.prevSlide());
270
271 // Add event listener for indicators
272 this.indicatorDots.forEach((dot) => {
273 dot.addEventListener('click', (e) => this.goToSlide(parseInt(e.target.dataset.index)));
274 });
275
276 this.run();
277 }
278 static generateId() {
279 const randomId = `sliderBasic` + Math.floor(Math.random() * 999);
280 return randomId;
281 }
282
283 createIndicators() {
284 this.indicatorsContainer.innerHTML = ''; // Clear existing indicators
285 for (let i = 0; i < this.getIndicatorCount(); i++) {
286 let indicator = document.createElement('div');
287 indicator.classList.add('slider-indicator');
288 indicator.dataset.index = i;
289 if (i < 5) {
290 this.indicatorsContainer.appendChild(indicator);
291 }
292 }
293 this.indicatorDots = this.indicatorsContainer.querySelectorAll('.slider-indicator');
294 }
295
296 getIndicatorCount() {
297 if (window.innerWidth >= 992) return this.totalSlides - 3;
298 if (window.innerWidth >= 768) return this.totalSlides - 2;
299 if (window.innerWidth >= 576) return this.totalSlides - 1;
300 return this.totalSlides;
301 }
302
303 updateIndicators() {
304 this.indicatorDots.forEach(dot => dot.classList.remove('active'));
305 if (this.indicatorDots[this.currentIndex]) {
306 this.indicatorDots[this.currentIndex].classList.add('active');
307 }
308
309 if (this.getIndicatorCount() > 4 && this.currentIndex > 4) {
310 console.log('this.indicatorDots', this.indicatorDots)
311 this.indicatorDots[4].classList.add('active');
312 }
313
314 }
315
316 nextSlide() {
317 if (this.currentItemIndex < this.sliderItemsLength - this.numberOfVisibleItems) {
318 this.currentItemIndex++;
319 this.shiftSlides();
320 }
321 }
322
323 prevSlide() {
324 if (this.currentItemIndex > 0) {
325 this.currentItemIndex--;
326 this.shiftSlides();
327 }
328 }
329
330 goToSlide(index) {
331 if (index >= 0 && index < this.sliderItemsLength) {
332 this.currentItemIndex = index;
333 this.shiftSlides();
334 }
335 }
336
337 shiftSlides() {
338 this.sliderList.style.transform = 'translateX(-' + ((100 / this.sliderItemsLength) * this.currentItemIndex) + '%)';
339 this.currentIndex = this.currentItemIndex;
340 this.updateIndicators();
341 }
342
343 run() {
344 let index = this.mediaQueryLength - 1;
345 while (index >= 0) {
346 if (this.mediaQueryList[index].matches) {
347 this.numberOfVisibleItems = index + 1;
348
349 // Reset the slider
350 this.currentItemIndex = 0;
351 this.sliderList.style.transform = 'translateX(0%)';
352
353 // Set slider list width
354 this.sliderList.style.width = 'calc(' + ((100 / this.numberOfVisibleItems) * this.sliderItemsLength) + '% + ' + ((this.sliderItemsLength / this.numberOfVisibleItems) * 16) + 'px)';
355
356
357 // Set slides width
358 this.sliderItems.forEach((item) => {
359 item.style.width = (100 / this.numberOfVisibleItems) + '%';
360 });
361
362 this.updateIndicators();
363 break;
364 }
365 index--;
366 }
367 }
368 }
369
370 const sliderElement = document.getElementById("sliderBasic");
371 if (sliderElement) {
372 const sliderId = Slider.generateId();
373 sliderElement.id = sliderId;
374 new Slider(sliderId, [576, 768, 992]);
375 } else {
376 console.error("Không tìm thấy slider với ID 'sliderBasic'");
377 }
378 })();
379
380</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 27]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 18]
----
1<style>
2 .slider-container {
3 padding: 10px 0 35px;
4 max-height: 100vh;
5 }
6
7 .slider-basic .slides-wrapper {
8 margin: auto;
9 overflow: hidden;
10 }
11
12 .slider-basic .slider-list {
13 list-style-type: none;
14 margin: 0;
15 padding: 0;
16 display: flex;
17 overflow: hidden;
18 transition: 1s;
19 max-height: calc(100vh - 80px);
20 }
21
22 .slider-basic .slider-item {
23 background-color: white;
24 padding: 3px;
25 margin: 0 16px 5px 0;
26 box-shadow: -4px 4px 6px rgba(0, 0, 0, 0.25);
27 border-radius: 6px;
28
29
30 }
31
32 .slider-basic .slider-item .card-link {
33 text-decoration: none;
34 }
35
36 .slider-basic .slider-item .card-link .tieude {
37 padding: 14px;
38 height: 120px;
39 color: #2E2E2E;
40 font-weight: 700;
41 font-size: clamp(14px, 2vw, 16px);
42 line-height: 22.4px;
43 }
44
45 .slider-basic .slider-item:hover .card-link .tieude {
46 background: linear-gradient(225.35deg, #379EFF -6.25%, #004F99 106.95%);
47 color: white;
48 }
49
50 .slider-basic .slider-item img {
51 width: 100%;
52 aspect-ratio: 4 / 3;
53 object-fit: cover;
54 }
55
56 .slider-arrows {
57 width: calc(100% + 70px);
58 height: 30px;
59 top: calc(50% - 15px);
60 left: -35px;
61 }
62
63 .slider-arrow-prev,
64 .slider-arrow-next {
65 border: none;
66 background: none;
67 }
68
69 .slider-arrow-prev svg {
70 transform: rotate(180deg);
71 }
72
73 .slider-arrow-prev path,
74 .slider-arrow-next path {
75 fill: #DE6F18;
76 }
77
78 .slider-arrow-prev.disable path,
79 .slider-arrow-next.disable path {
80 fill: #ACB0B3;
81 }
82
83
84 .slider-container .cus-slider-indicators {
85 position: absolute;
86 bottom: 0;
87 left: 50%;
88 transform: translateX(-50%);
89 display: flex;
90 align-items: center;
91 gap: 8px;
92 }
93
94 .slider-container .slider-indicator {
95 width: 25px;
96 height: 10px;
97 background-color: #E0E0E0;
98 border-radius: 5px;
99 cursor: pointer;
100 transition: 0.3s;
101 }
102
103 .slider-container .slider-indicator.active {
104 background-color: #DE6F18;
105 width: 15px;
106 height: 15px;
107 border-radius: 100%;
108 }
109 @media (max-width: 992px) {
110 .slider-container {
111 padding: 10px 10px 35px;
112 }
113 .slider-arrows {
114 width: calc(100% + 43px);
115 left: -22px;
116 }
117 }
118
119 @media (max-width: 992px) {
120 .slider-container {
121 padding: 10px 10px 35px;
122 }
123 .slider-arrows {
124 width: calc(100% + 43px);
125 left: -22px;
126 }
127 }
128
129 @media only screen and (min-width: 768px) and (max-width: 992px) {
130 .slider-container {
131 overflow: hidden;
132 padding: 10px 30px 35px !important;
133 }
134 .slider-arrows {
135 width: calc(95% + 43px) !important;
136 left: -5px !important;
137 }
138 .slider-basic .slides-wrapper {
139 margin: unset;
140 }
141 .slider-container .slider-arrows{
142 z-index: 9;
143 padding: 0 !important;
144 }
145 }
146
147 @media (max-width: 576px) {
148 .slider-basic .slides-wrapper {
149 margin: unset;
150 }
151 .slider-container .slider-arrows{
152 z-index: 9;
153 padding: 0 15px !important;
154 }
155 }
156</style>
157
158<div class="slider-container position-relative slider-basic" id="sliderBasic">
159 <div class="slides-wrapper">
160 <div class="slides-container">
161 <ul class="slider-list">
162 <#if entries?has_content>
163 <#list entries as curEntry>
164 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
165 <#if className=="com.liferay.journal.model.JournalArticle" &&
166 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
167 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
168 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
169 curEntry=curEntry
170 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
171 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
172 <#assign smallImageUrlSide=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
173 <#else>
174 <#assign smallImageUrlSide="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
175 </#if>
176
177 <li class="slider-item">
178 <a href="${viewURL}" class="card-link" title="${title}">
179 <img src="${htmlUtil.escape(smallImageUrlSide)}" alt="${htmlUtil.escape(title)}" />
180 <div class="tieude">
181 <p class="mb-0">${htmlUtil.escape(title)}</p>
182 </div>
183 </a>
184 </li>
185 </#if>
186 </#list>
187</#if>
188
189</ul>
190</div>
191</div>
192<div class="slider-arrows position-absolute d-flex justify-content-between">
193 <button type="button" class="slider-arrow-prev">
194 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
195 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
196 width="28" height="28">
197 <path
198 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
199 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
200 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
201 stroke-linecap="round" stroke-linejoin="round" />
202 </mask>
203 <g mask="url(#mask0_1865_10187)">
204 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
205 </g>
206 </svg>
207
208 </button>
209 <button type="button" class="slider-arrow-next">
210
211 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
212 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
213 width="28" height="28">
214 <path
215 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
216 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
217 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
218 stroke-linecap="round" stroke-linejoin="round" />
219 </mask>
220 <g mask="url(#mask0_1865_10187)">
221 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
222 </g>
223 </svg>
224 </button>
225</div>
226<div class="cus-slider-indicators"></div>
227</div>
228<script>
229 (function () {
230 'use strict';
231 class Slider {
232 constructor(id, mediaQueries) {
233 // Get HTML elements
234 this.slider = document.querySelector('#' + id);
235 this.sliderList = this.slider.querySelector('.slider-list');
236 this.sliderItems = this.slider.querySelectorAll('.slider-item');
237 this.sliderNext = this.slider.querySelector('.slider-arrow-next');
238 this.sliderPrev = this.slider.querySelector('.slider-arrow-prev');
239 this.indicatorsContainer = this.slider.querySelector('.cus-slider-indicators');
240
241 this.currentIndex = 0;
242 this.totalSlides = this.sliderItems.length;
243
244 this.createIndicators();
245 this.updateIndicators();
246
247 // Get media queries
248 this.mediaQueryList = [window.matchMedia('screen and (max-width:'+ (mediaQueries[0] - 1) +'px)')];
249
250 mediaQueries.forEach((mediaQuery) => {
251 this.mediaQueryList.push(window.matchMedia('screen and (min-width:'+ mediaQuery +'px)'));
252 });
253
254 // Define global variables
255 this.numberOfVisibleItems = null;
256 this.currentItemIndex = 0;
257 this.sliderItemsLength = this.sliderItems.length;
258 this.mediaQueryLength = this.mediaQueryList.length;
259
260 // Add event listener: to call the run function again when screen resized
261 this.mediaQueryList.forEach((mediaQuery) => {
262 mediaQuery.addEventListener('change', () => this.run());
263 });
264
265 // Add event listener: to go to next slide
266 this.sliderNext.addEventListener('click', () => this.nextSlide());
267
268 // Add event listener: to go to previous slide
269 this.sliderPrev.addEventListener('click', () => this.prevSlide());
270
271 // Add event listener for indicators
272 this.indicatorDots.forEach((dot) => {
273 dot.addEventListener('click', (e) => this.goToSlide(parseInt(e.target.dataset.index)));
274 });
275
276 this.run();
277 }
278 static generateId() {
279 const randomId = `sliderBasic` + Math.floor(Math.random() * 999);
280 return randomId;
281 }
282
283 createIndicators() {
284 this.indicatorsContainer.innerHTML = ''; // Clear existing indicators
285 for (let i = 0; i < this.getIndicatorCount(); i++) {
286 let indicator = document.createElement('div');
287 indicator.classList.add('slider-indicator');
288 indicator.dataset.index = i;
289 if (i < 5) {
290 this.indicatorsContainer.appendChild(indicator);
291 }
292 }
293 this.indicatorDots = this.indicatorsContainer.querySelectorAll('.slider-indicator');
294 }
295
296 getIndicatorCount() {
297 if (window.innerWidth >= 992) return this.totalSlides - 3;
298 if (window.innerWidth >= 768) return this.totalSlides - 2;
299 if (window.innerWidth >= 576) return this.totalSlides - 1;
300 return this.totalSlides;
301 }
302
303 updateIndicators() {
304 this.indicatorDots.forEach(dot => dot.classList.remove('active'));
305 if (this.indicatorDots[this.currentIndex]) {
306 this.indicatorDots[this.currentIndex].classList.add('active');
307 }
308
309 if (this.getIndicatorCount() > 4 && this.currentIndex > 4) {
310 console.log('this.indicatorDots', this.indicatorDots)
311 this.indicatorDots[4].classList.add('active');
312 }
313
314 }
315
316 nextSlide() {
317 if (this.currentItemIndex < this.sliderItemsLength - this.numberOfVisibleItems) {
318 this.currentItemIndex++;
319 this.shiftSlides();
320 }
321 }
322
323 prevSlide() {
324 if (this.currentItemIndex > 0) {
325 this.currentItemIndex--;
326 this.shiftSlides();
327 }
328 }
329
330 goToSlide(index) {
331 if (index >= 0 && index < this.sliderItemsLength) {
332 this.currentItemIndex = index;
333 this.shiftSlides();
334 }
335 }
336
337 shiftSlides() {
338 this.sliderList.style.transform = 'translateX(-' + ((100 / this.sliderItemsLength) * this.currentItemIndex) + '%)';
339 this.currentIndex = this.currentItemIndex;
340 this.updateIndicators();
341 }
342
343 run() {
344 let index = this.mediaQueryLength - 1;
345 while (index >= 0) {
346 if (this.mediaQueryList[index].matches) {
347 this.numberOfVisibleItems = index + 1;
348
349 // Reset the slider
350 this.currentItemIndex = 0;
351 this.sliderList.style.transform = 'translateX(0%)';
352
353 // Set slider list width
354 this.sliderList.style.width = 'calc(' + ((100 / this.numberOfVisibleItems) * this.sliderItemsLength) + '% + ' + ((this.sliderItemsLength / this.numberOfVisibleItems) * 16) + 'px)';
355
356
357 // Set slides width
358 this.sliderItems.forEach((item) => {
359 item.style.width = (100 / this.numberOfVisibleItems) + '%';
360 });
361
362 this.updateIndicators();
363 break;
364 }
365 index--;
366 }
367 }
368 }
369
370 const sliderElement = document.getElementById("sliderBasic");
371 if (sliderElement) {
372 const sliderId = Slider.generateId();
373 sliderElement.id = sliderId;
374 new Slider(sliderId, [576, 768, 992]);
375 } else {
376 console.error("Không tìm thấy slider với ID 'sliderBasic'");
377 }
378 })();
379
380</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 27]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 18]
----
1<style>
2 .slider-container {
3 padding: 10px 0 35px;
4 max-height: 100vh;
5 }
6
7 .slider-basic .slides-wrapper {
8 margin: auto;
9 overflow: hidden;
10 }
11
12 .slider-basic .slider-list {
13 list-style-type: none;
14 margin: 0;
15 padding: 0;
16 display: flex;
17 overflow: hidden;
18 transition: 1s;
19 max-height: calc(100vh - 80px);
20 }
21
22 .slider-basic .slider-item {
23 background-color: white;
24 padding: 3px;
25 margin: 0 16px 5px 0;
26 box-shadow: -4px 4px 6px rgba(0, 0, 0, 0.25);
27 border-radius: 6px;
28
29
30 }
31
32 .slider-basic .slider-item .card-link {
33 text-decoration: none;
34 }
35
36 .slider-basic .slider-item .card-link .tieude {
37 padding: 14px;
38 height: 120px;
39 color: #2E2E2E;
40 font-weight: 700;
41 font-size: clamp(14px, 2vw, 16px);
42 line-height: 22.4px;
43 }
44
45 .slider-basic .slider-item:hover .card-link .tieude {
46 background: linear-gradient(225.35deg, #379EFF -6.25%, #004F99 106.95%);
47 color: white;
48 }
49
50 .slider-basic .slider-item img {
51 width: 100%;
52 aspect-ratio: 4 / 3;
53 object-fit: cover;
54 }
55
56 .slider-arrows {
57 width: calc(100% + 70px);
58 height: 30px;
59 top: calc(50% - 15px);
60 left: -35px;
61 }
62
63 .slider-arrow-prev,
64 .slider-arrow-next {
65 border: none;
66 background: none;
67 }
68
69 .slider-arrow-prev svg {
70 transform: rotate(180deg);
71 }
72
73 .slider-arrow-prev path,
74 .slider-arrow-next path {
75 fill: #DE6F18;
76 }
77
78 .slider-arrow-prev.disable path,
79 .slider-arrow-next.disable path {
80 fill: #ACB0B3;
81 }
82
83
84 .slider-container .cus-slider-indicators {
85 position: absolute;
86 bottom: 0;
87 left: 50%;
88 transform: translateX(-50%);
89 display: flex;
90 align-items: center;
91 gap: 8px;
92 }
93
94 .slider-container .slider-indicator {
95 width: 25px;
96 height: 10px;
97 background-color: #E0E0E0;
98 border-radius: 5px;
99 cursor: pointer;
100 transition: 0.3s;
101 }
102
103 .slider-container .slider-indicator.active {
104 background-color: #DE6F18;
105 width: 15px;
106 height: 15px;
107 border-radius: 100%;
108 }
109 @media (max-width: 992px) {
110 .slider-container {
111 padding: 10px 10px 35px;
112 }
113 .slider-arrows {
114 width: calc(100% + 43px);
115 left: -22px;
116 }
117 }
118
119 @media (max-width: 992px) {
120 .slider-container {
121 padding: 10px 10px 35px;
122 }
123 .slider-arrows {
124 width: calc(100% + 43px);
125 left: -22px;
126 }
127 }
128
129 @media only screen and (min-width: 768px) and (max-width: 992px) {
130 .slider-container {
131 overflow: hidden;
132 padding: 10px 30px 35px !important;
133 }
134 .slider-arrows {
135 width: calc(95% + 43px) !important;
136 left: -5px !important;
137 }
138 .slider-basic .slides-wrapper {
139 margin: unset;
140 }
141 .slider-container .slider-arrows{
142 z-index: 9;
143 padding: 0 !important;
144 }
145 }
146
147 @media (max-width: 576px) {
148 .slider-basic .slides-wrapper {
149 margin: unset;
150 }
151 .slider-container .slider-arrows{
152 z-index: 9;
153 padding: 0 15px !important;
154 }
155 }
156</style>
157
158<div class="slider-container position-relative slider-basic" id="sliderBasic">
159 <div class="slides-wrapper">
160 <div class="slides-container">
161 <ul class="slider-list">
162 <#if entries?has_content>
163 <#list entries as curEntry>
164 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
165 <#if className=="com.liferay.journal.model.JournalArticle" &&
166 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
167 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
168 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
169 curEntry=curEntry
170 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
171 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
172 <#assign smallImageUrlSide=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
173 <#else>
174 <#assign smallImageUrlSide="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
175 </#if>
176
177 <li class="slider-item">
178 <a href="${viewURL}" class="card-link" title="${title}">
179 <img src="${htmlUtil.escape(smallImageUrlSide)}" alt="${htmlUtil.escape(title)}" />
180 <div class="tieude">
181 <p class="mb-0">${htmlUtil.escape(title)}</p>
182 </div>
183 </a>
184 </li>
185 </#if>
186 </#list>
187</#if>
188
189</ul>
190</div>
191</div>
192<div class="slider-arrows position-absolute d-flex justify-content-between">
193 <button type="button" class="slider-arrow-prev">
194 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
195 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
196 width="28" height="28">
197 <path
198 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
199 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
200 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
201 stroke-linecap="round" stroke-linejoin="round" />
202 </mask>
203 <g mask="url(#mask0_1865_10187)">
204 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
205 </g>
206 </svg>
207
208 </button>
209 <button type="button" class="slider-arrow-next">
210
211 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
212 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
213 width="28" height="28">
214 <path
215 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
216 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
217 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
218 stroke-linecap="round" stroke-linejoin="round" />
219 </mask>
220 <g mask="url(#mask0_1865_10187)">
221 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
222 </g>
223 </svg>
224 </button>
225</div>
226<div class="cus-slider-indicators"></div>
227</div>
228<script>
229 (function () {
230 'use strict';
231 class Slider {
232 constructor(id, mediaQueries) {
233 // Get HTML elements
234 this.slider = document.querySelector('#' + id);
235 this.sliderList = this.slider.querySelector('.slider-list');
236 this.sliderItems = this.slider.querySelectorAll('.slider-item');
237 this.sliderNext = this.slider.querySelector('.slider-arrow-next');
238 this.sliderPrev = this.slider.querySelector('.slider-arrow-prev');
239 this.indicatorsContainer = this.slider.querySelector('.cus-slider-indicators');
240
241 this.currentIndex = 0;
242 this.totalSlides = this.sliderItems.length;
243
244 this.createIndicators();
245 this.updateIndicators();
246
247 // Get media queries
248 this.mediaQueryList = [window.matchMedia('screen and (max-width:'+ (mediaQueries[0] - 1) +'px)')];
249
250 mediaQueries.forEach((mediaQuery) => {
251 this.mediaQueryList.push(window.matchMedia('screen and (min-width:'+ mediaQuery +'px)'));
252 });
253
254 // Define global variables
255 this.numberOfVisibleItems = null;
256 this.currentItemIndex = 0;
257 this.sliderItemsLength = this.sliderItems.length;
258 this.mediaQueryLength = this.mediaQueryList.length;
259
260 // Add event listener: to call the run function again when screen resized
261 this.mediaQueryList.forEach((mediaQuery) => {
262 mediaQuery.addEventListener('change', () => this.run());
263 });
264
265 // Add event listener: to go to next slide
266 this.sliderNext.addEventListener('click', () => this.nextSlide());
267
268 // Add event listener: to go to previous slide
269 this.sliderPrev.addEventListener('click', () => this.prevSlide());
270
271 // Add event listener for indicators
272 this.indicatorDots.forEach((dot) => {
273 dot.addEventListener('click', (e) => this.goToSlide(parseInt(e.target.dataset.index)));
274 });
275
276 this.run();
277 }
278 static generateId() {
279 const randomId = `sliderBasic` + Math.floor(Math.random() * 999);
280 return randomId;
281 }
282
283 createIndicators() {
284 this.indicatorsContainer.innerHTML = ''; // Clear existing indicators
285 for (let i = 0; i < this.getIndicatorCount(); i++) {
286 let indicator = document.createElement('div');
287 indicator.classList.add('slider-indicator');
288 indicator.dataset.index = i;
289 if (i < 5) {
290 this.indicatorsContainer.appendChild(indicator);
291 }
292 }
293 this.indicatorDots = this.indicatorsContainer.querySelectorAll('.slider-indicator');
294 }
295
296 getIndicatorCount() {
297 if (window.innerWidth >= 992) return this.totalSlides - 3;
298 if (window.innerWidth >= 768) return this.totalSlides - 2;
299 if (window.innerWidth >= 576) return this.totalSlides - 1;
300 return this.totalSlides;
301 }
302
303 updateIndicators() {
304 this.indicatorDots.forEach(dot => dot.classList.remove('active'));
305 if (this.indicatorDots[this.currentIndex]) {
306 this.indicatorDots[this.currentIndex].classList.add('active');
307 }
308
309 if (this.getIndicatorCount() > 4 && this.currentIndex > 4) {
310 console.log('this.indicatorDots', this.indicatorDots)
311 this.indicatorDots[4].classList.add('active');
312 }
313
314 }
315
316 nextSlide() {
317 if (this.currentItemIndex < this.sliderItemsLength - this.numberOfVisibleItems) {
318 this.currentItemIndex++;
319 this.shiftSlides();
320 }
321 }
322
323 prevSlide() {
324 if (this.currentItemIndex > 0) {
325 this.currentItemIndex--;
326 this.shiftSlides();
327 }
328 }
329
330 goToSlide(index) {
331 if (index >= 0 && index < this.sliderItemsLength) {
332 this.currentItemIndex = index;
333 this.shiftSlides();
334 }
335 }
336
337 shiftSlides() {
338 this.sliderList.style.transform = 'translateX(-' + ((100 / this.sliderItemsLength) * this.currentItemIndex) + '%)';
339 this.currentIndex = this.currentItemIndex;
340 this.updateIndicators();
341 }
342
343 run() {
344 let index = this.mediaQueryLength - 1;
345 while (index >= 0) {
346 if (this.mediaQueryList[index].matches) {
347 this.numberOfVisibleItems = index + 1;
348
349 // Reset the slider
350 this.currentItemIndex = 0;
351 this.sliderList.style.transform = 'translateX(0%)';
352
353 // Set slider list width
354 this.sliderList.style.width = 'calc(' + ((100 / this.numberOfVisibleItems) * this.sliderItemsLength) + '% + ' + ((this.sliderItemsLength / this.numberOfVisibleItems) * 16) + 'px)';
355
356
357 // Set slides width
358 this.sliderItems.forEach((item) => {
359 item.style.width = (100 / this.numberOfVisibleItems) + '%';
360 });
361
362 this.updateIndicators();
363 break;
364 }
365 index--;
366 }
367 }
368 }
369
370 const sliderElement = document.getElementById("sliderBasic");
371 if (sliderElement) {
372 const sliderId = Slider.generateId();
373 sliderElement.id = sliderId;
374 new Slider(sliderId, [576, 768, 992]);
375 } else {
376 console.error("Không tìm thấy slider với ID 'sliderBasic'");
377 }
378 })();
379
380</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 27]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#293297" at line 164, column 18]
----
1<style>
2 .slider-container {
3 padding: 10px 0 35px;
4 max-height: 100vh;
5 }
6
7 .slider-basic .slides-wrapper {
8 margin: auto;
9 overflow: hidden;
10 }
11
12 .slider-basic .slider-list {
13 list-style-type: none;
14 margin: 0;
15 padding: 0;
16 display: flex;
17 overflow: hidden;
18 transition: 1s;
19 max-height: calc(100vh - 80px);
20 }
21
22 .slider-basic .slider-item {
23 background-color: white;
24 padding: 3px;
25 margin: 0 16px 5px 0;
26 box-shadow: -4px 4px 6px rgba(0, 0, 0, 0.25);
27 border-radius: 6px;
28
29
30 }
31
32 .slider-basic .slider-item .card-link {
33 text-decoration: none;
34 }
35
36 .slider-basic .slider-item .card-link .tieude {
37 padding: 14px;
38 height: 120px;
39 color: #2E2E2E;
40 font-weight: 700;
41 font-size: clamp(14px, 2vw, 16px);
42 line-height: 22.4px;
43 }
44
45 .slider-basic .slider-item:hover .card-link .tieude {
46 background: linear-gradient(225.35deg, #379EFF -6.25%, #004F99 106.95%);
47 color: white;
48 }
49
50 .slider-basic .slider-item img {
51 width: 100%;
52 aspect-ratio: 4 / 3;
53 object-fit: cover;
54 }
55
56 .slider-arrows {
57 width: calc(100% + 70px);
58 height: 30px;
59 top: calc(50% - 15px);
60 left: -35px;
61 }
62
63 .slider-arrow-prev,
64 .slider-arrow-next {
65 border: none;
66 background: none;
67 }
68
69 .slider-arrow-prev svg {
70 transform: rotate(180deg);
71 }
72
73 .slider-arrow-prev path,
74 .slider-arrow-next path {
75 fill: #DE6F18;
76 }
77
78 .slider-arrow-prev.disable path,
79 .slider-arrow-next.disable path {
80 fill: #ACB0B3;
81 }
82
83
84 .slider-container .cus-slider-indicators {
85 position: absolute;
86 bottom: 0;
87 left: 50%;
88 transform: translateX(-50%);
89 display: flex;
90 align-items: center;
91 gap: 8px;
92 }
93
94 .slider-container .slider-indicator {
95 width: 25px;
96 height: 10px;
97 background-color: #E0E0E0;
98 border-radius: 5px;
99 cursor: pointer;
100 transition: 0.3s;
101 }
102
103 .slider-container .slider-indicator.active {
104 background-color: #DE6F18;
105 width: 15px;
106 height: 15px;
107 border-radius: 100%;
108 }
109 @media (max-width: 992px) {
110 .slider-container {
111 padding: 10px 10px 35px;
112 }
113 .slider-arrows {
114 width: calc(100% + 43px);
115 left: -22px;
116 }
117 }
118
119 @media (max-width: 992px) {
120 .slider-container {
121 padding: 10px 10px 35px;
122 }
123 .slider-arrows {
124 width: calc(100% + 43px);
125 left: -22px;
126 }
127 }
128
129 @media only screen and (min-width: 768px) and (max-width: 992px) {
130 .slider-container {
131 overflow: hidden;
132 padding: 10px 30px 35px !important;
133 }
134 .slider-arrows {
135 width: calc(95% + 43px) !important;
136 left: -5px !important;
137 }
138 .slider-basic .slides-wrapper {
139 margin: unset;
140 }
141 .slider-container .slider-arrows{
142 z-index: 9;
143 padding: 0 !important;
144 }
145 }
146
147 @media (max-width: 576px) {
148 .slider-basic .slides-wrapper {
149 margin: unset;
150 }
151 .slider-container .slider-arrows{
152 z-index: 9;
153 padding: 0 15px !important;
154 }
155 }
156</style>
157
158<div class="slider-container position-relative slider-basic" id="sliderBasic">
159 <div class="slides-wrapper">
160 <div class="slides-container">
161 <ul class="slider-list">
162 <#if entries?has_content>
163 <#list entries as curEntry>
164 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
165 <#if className=="com.liferay.journal.model.JournalArticle" &&
166 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
167 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
168 description=article.getDescription(locale) ddmTemplateKey=article.getDDMTemplateKey()
169 curEntry=curEntry
170 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"/>
171 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
172 <#assign smallImageUrlSide=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
173 <#else>
174 <#assign smallImageUrlSide="https://danang.gov.vn/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
175 </#if>
176
177 <li class="slider-item">
178 <a href="${viewURL}" class="card-link" title="${title}">
179 <img src="${htmlUtil.escape(smallImageUrlSide)}" alt="${htmlUtil.escape(title)}" />
180 <div class="tieude">
181 <p class="mb-0">${htmlUtil.escape(title)}</p>
182 </div>
183 </a>
184 </li>
185 </#if>
186 </#list>
187</#if>
188
189</ul>
190</div>
191</div>
192<div class="slider-arrows position-absolute d-flex justify-content-between">
193 <button type="button" class="slider-arrow-prev">
194 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
195 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
196 width="28" height="28">
197 <path
198 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
199 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
200 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
201 stroke-linecap="round" stroke-linejoin="round" />
202 </mask>
203 <g mask="url(#mask0_1865_10187)">
204 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
205 </g>
206 </svg>
207
208 </button>
209 <button type="button" class="slider-arrow-next">
210
211 <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
212 <mask id="mask0_1865_10187" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0"
213 width="28" height="28">
214 <path
215 d="M14 26.5C20.9037 26.5 26.5 20.9037 26.5 14C26.5 7.09625 20.9037 1.5 14 1.5C7.09625 1.5 1.5 7.09625 1.5 14C1.5 20.9037 7.09625 26.5 14 26.5Z"
216 fill="#555555" stroke="white" stroke-width="1.66667" stroke-linejoin="round" />
217 <path d="M12.125 19.625L17.75 14L12.125 8.375" stroke="white" stroke-width="1.66667"
218 stroke-linecap="round" stroke-linejoin="round" />
219 </mask>
220 <g mask="url(#mask0_1865_10187)">
221 <path d="M-1 -1H29V29H-1V-1Z" fill="#DE6F18" />
222 </g>
223 </svg>
224 </button>
225</div>
226<div class="cus-slider-indicators"></div>
227</div>
228<script>
229 (function () {
230 'use strict';
231 class Slider {
232 constructor(id, mediaQueries) {
233 // Get HTML elements
234 this.slider = document.querySelector('#' + id);
235 this.sliderList = this.slider.querySelector('.slider-list');
236 this.sliderItems = this.slider.querySelectorAll('.slider-item');
237 this.sliderNext = this.slider.querySelector('.slider-arrow-next');
238 this.sliderPrev = this.slider.querySelector('.slider-arrow-prev');
239 this.indicatorsContainer = this.slider.querySelector('.cus-slider-indicators');
240
241 this.currentIndex = 0;
242 this.totalSlides = this.sliderItems.length;
243
244 this.createIndicators();
245 this.updateIndicators();
246
247 // Get media queries
248 this.mediaQueryList = [window.matchMedia('screen and (max-width:'+ (mediaQueries[0] - 1) +'px)')];
249
250 mediaQueries.forEach((mediaQuery) => {
251 this.mediaQueryList.push(window.matchMedia('screen and (min-width:'+ mediaQuery +'px)'));
252 });
253
254 // Define global variables
255 this.numberOfVisibleItems = null;
256 this.currentItemIndex = 0;
257 this.sliderItemsLength = this.sliderItems.length;
258 this.mediaQueryLength = this.mediaQueryList.length;
259
260 // Add event listener: to call the run function again when screen resized
261 this.mediaQueryList.forEach((mediaQuery) => {
262 mediaQuery.addEventListener('change', () => this.run());
263 });
264
265 // Add event listener: to go to next slide
266 this.sliderNext.addEventListener('click', () => this.nextSlide());
267
268 // Add event listener: to go to previous slide
269 this.sliderPrev.addEventListener('click', () => this.prevSlide());
270
271 // Add event listener for indicators
272 this.indicatorDots.forEach((dot) => {
273 dot.addEventListener('click', (e) => this.goToSlide(parseInt(e.target.dataset.index)));
274 });
275
276 this.run();
277 }
278 static generateId() {
279 const randomId = `sliderBasic` + Math.floor(Math.random() * 999);
280 return randomId;
281 }
282
283 createIndicators() {
284 this.indicatorsContainer.innerHTML = ''; // Clear existing indicators
285 for (let i = 0; i < this.getIndicatorCount(); i++) {
286 let indicator = document.createElement('div');
287 indicator.classList.add('slider-indicator');
288 indicator.dataset.index = i;
289 if (i < 5) {
290 this.indicatorsContainer.appendChild(indicator);
291 }
292 }
293 this.indicatorDots = this.indicatorsContainer.querySelectorAll('.slider-indicator');
294 }
295
296 getIndicatorCount() {
297 if (window.innerWidth >= 992) return this.totalSlides - 3;
298 if (window.innerWidth >= 768) return this.totalSlides - 2;
299 if (window.innerWidth >= 576) return this.totalSlides - 1;
300 return this.totalSlides;
301 }
302
303 updateIndicators() {
304 this.indicatorDots.forEach(dot => dot.classList.remove('active'));
305 if (this.indicatorDots[this.currentIndex]) {
306 this.indicatorDots[this.currentIndex].classList.add('active');
307 }
308
309 if (this.getIndicatorCount() > 4 && this.currentIndex > 4) {
310 console.log('this.indicatorDots', this.indicatorDots)
311 this.indicatorDots[4].classList.add('active');
312 }
313
314 }
315
316 nextSlide() {
317 if (this.currentItemIndex < this.sliderItemsLength - this.numberOfVisibleItems) {
318 this.currentItemIndex++;
319 this.shiftSlides();
320 }
321 }
322
323 prevSlide() {
324 if (this.currentItemIndex > 0) {
325 this.currentItemIndex--;
326 this.shiftSlides();
327 }
328 }
329
330 goToSlide(index) {
331 if (index >= 0 && index < this.sliderItemsLength) {
332 this.currentItemIndex = index;
333 this.shiftSlides();
334 }
335 }
336
337 shiftSlides() {
338 this.sliderList.style.transform = 'translateX(-' + ((100 / this.sliderItemsLength) * this.currentItemIndex) + '%)';
339 this.currentIndex = this.currentItemIndex;
340 this.updateIndicators();
341 }
342
343 run() {
344 let index = this.mediaQueryLength - 1;
345 while (index >= 0) {
346 if (this.mediaQueryList[index].matches) {
347 this.numberOfVisibleItems = index + 1;
348
349 // Reset the slider
350 this.currentItemIndex = 0;
351 this.sliderList.style.transform = 'translateX(0%)';
352
353 // Set slider list width
354 this.sliderList.style.width = 'calc(' + ((100 / this.numberOfVisibleItems) * this.sliderItemsLength) + '% + ' + ((this.sliderItemsLength / this.numberOfVisibleItems) * 16) + 'px)';
355
356
357 // Set slides width
358 this.sliderItems.forEach((item) => {
359 item.style.width = (100 / this.numberOfVisibleItems) + '%';
360 });
361
362 this.updateIndicators();
363 break;
364 }
365 index--;
366 }
367 }
368 }
369
370 const sliderElement = document.getElementById("sliderBasic");
371 if (sliderElement) {
372 const sliderId = Slider.generateId();
373 sliderElement.id = sliderId;
374 new Slider(sliderId, [576, 768, 992]);
375 } else {
376 console.error("Không tìm thấy slider với ID 'sliderBasic'");
377 }
378 })();
379
380</script>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#53314" at line 112, column 31]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#53314" at line 112, column 22]
----
1<style>
2 /* block he thong csdl */
3 .img-big-news-csdl {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 height: 100%;
9 max-height: 230px;
10 }
11
12 .txt-title-big-news-csdl {
13 font-size: clamp(14px, 3vw, 18px);
14 font-weight: 700;
15 line-height: 25.2px;
16 text-align: left;
17 color: #2E2E2E;
18 }
19
20 .txt-description-big-news-csdl {
21 font-family: Roboto;
22 font-size: clamp(14px, 2vw, 16px);
23 font-weight: 400;
24 line-height: 22.4px;
25 text-align: left;
26 color: #2E2E2E;
27 }
28
29 .border-right-csdl {
30 border-right: 1px solid #848A8F;
31 }
32
33 .item-sub-news-csdl {
34 cursor: pointer;
35 color: #2E2E2E;
36 font-size: clamp(14px, 2vw, 16px);
37 font-weight: 600;
38 background-color: #E0E0E04D;
39 padding: 1rem;
40 border-bottom: 1px solid #EBEBEB;
41 transition: 0.3s ease;
42 cursor: pointer;
43 }
44
45 .item-sub-news-csdl:hover {
46 color: #035FB5;
47 }
48
49 .item-big-news-csdl:hover {
50 cursor: pointer;
51 }
52
53 .item-big-news-csdl:hover .img-big-news-csdl {
54 box-shadow: 4px 4px 4px 0px #00000040;
55 }
56
57 .item-big-news-csdl:hover .txt-title-big-news-csdl {
58 color: #035FB5;
59 }
60
61
62 .list-subnews-csdl {
63 max-height: 200px;
64 overflow: auto;
65 }
66
67 /* Tùy chỉnh thanh cuộn cho WebKit (Chrome, Safari, Edge) */
68 .list-subnews-csdl::-webkit-scrollbar {
69 width: 6px !important;
70 }
71
72 .list-subnews-csdl::-webkit-scrollbar-track {
73 background: #f9f9f9;
74 }
75
76 .list-subnews-csdl::-webkit-scrollbar-thumb {
77 background: #ccc;
78 border-radius: 3px;
79 }
80
81 .list-subnews-csdl::-webkit-scrollbar-thumb:hover {
82 background: #aaa;
83 }
84
85 @media (max-width: 1024px) {
86 .border-right-csdl {
87 border-right: none;
88 }
89 }
90
91 .wrap-text-content-limit {
92 max-height: 200px;
93 overflow: auto;
94 scrollbar-width: none;
95 }
96
97 .bottom-shadow {
98 position: absolute;
99 bottom: -1px;
100 left: 0;
101 height: 15px;
102 width: 100%;
103 background: linear-gradient(to top, rgb(255 255 255 / 76%), rgb(255 255 255 / 65%));
104 }
105</style>
106
107<div class="row">
108 <#assign indexLocal=0 />
109 <div class="col-12 col-xl-8 border-right-csdl">
110 <div class="row item-big-news-csdl">
111 <#list entries as curEntry>
112 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
113 <#if className=="com.liferay.journal.model.JournalArticle">
114 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
115 description=article.getDescription(locale) noiDung=article.getContent()
116 idBaiViet=article.getId()
117 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
118 indexLocal=indexLocal + 1 />
119 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
120 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
121 <#else>
122 <#assign
123 smallImageUrl="/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
124 </#if>
125 <#if indexLocal==1>
126 <a class="col-12 col-md-5 col-xl-5" href="${viewURL}" title="${title}">
127 <img src="${smallImageUrl}" alt="" class="img-big-news-csdl">
128 </a>
129 <a class="col-12 col-md-7 col-xl-7 align-self-center" href="${viewURL}" title="${title}">
130 <div class="wrap-text-content-limit">
131 <div class="txt-title-big-news-csdl mb-2">${title}</div>
132 <div class="txt-description-big-news-csdl">${description}</div>
133 <div class="bottom-shadow"></div>
134 </div>
135 </a>
136 </#if>
137</#if>
138</#list>
139</div>
140</div>
141
142
143<div class="col-12 col-xl-4">
144 <div class="list-subnews-csdl mt-2 mt-xl-0">
145 <#assign subIndex=0 />
146 <#list entries as curEntry>
147 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
148 <#if className=="com.liferay.journal.model.JournalArticle" &&
149 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
150 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
151 description=article.getDescription(locale) noiDung=article.getContent()
152 idBaiViet=article.getId()
153 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
154 subIndex=subIndex + 1 />
155 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
156 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
157 <#else>
158 <#assign
159 smallImageUrl="/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
160 </#if>
161 <#if subIndex gt 1>
162
163 <a class="mb-2 pr-lg-1" href="${viewURL}" title="${title}">
164 <div class="item-sub-news-csdl">${title}</div>
165 </a>
166
167</#if>
168</#if>
169</#list>
170</div>
171</div>
172</div>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#53314" at line 112, column 31]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#53314" at line 112, column 22]
----
1<style>
2 /* block he thong csdl */
3 .img-big-news-csdl {
4 width: 100%;
5 aspect-ratio: 4 / 3;
6 object-fit: cover;
7 border-radius: 10px;
8 height: 100%;
9 max-height: 230px;
10 }
11
12 .txt-title-big-news-csdl {
13 font-size: clamp(14px, 3vw, 18px);
14 font-weight: 700;
15 line-height: 25.2px;
16 text-align: left;
17 color: #2E2E2E;
18 }
19
20 .txt-description-big-news-csdl {
21 font-family: Roboto;
22 font-size: clamp(14px, 2vw, 16px);
23 font-weight: 400;
24 line-height: 22.4px;
25 text-align: left;
26 color: #2E2E2E;
27 }
28
29 .border-right-csdl {
30 border-right: 1px solid #848A8F;
31 }
32
33 .item-sub-news-csdl {
34 cursor: pointer;
35 color: #2E2E2E;
36 font-size: clamp(14px, 2vw, 16px);
37 font-weight: 600;
38 background-color: #E0E0E04D;
39 padding: 1rem;
40 border-bottom: 1px solid #EBEBEB;
41 transition: 0.3s ease;
42 cursor: pointer;
43 }
44
45 .item-sub-news-csdl:hover {
46 color: #035FB5;
47 }
48
49 .item-big-news-csdl:hover {
50 cursor: pointer;
51 }
52
53 .item-big-news-csdl:hover .img-big-news-csdl {
54 box-shadow: 4px 4px 4px 0px #00000040;
55 }
56
57 .item-big-news-csdl:hover .txt-title-big-news-csdl {
58 color: #035FB5;
59 }
60
61
62 .list-subnews-csdl {
63 max-height: 200px;
64 overflow: auto;
65 }
66
67 /* Tùy chỉnh thanh cuộn cho WebKit (Chrome, Safari, Edge) */
68 .list-subnews-csdl::-webkit-scrollbar {
69 width: 6px !important;
70 }
71
72 .list-subnews-csdl::-webkit-scrollbar-track {
73 background: #f9f9f9;
74 }
75
76 .list-subnews-csdl::-webkit-scrollbar-thumb {
77 background: #ccc;
78 border-radius: 3px;
79 }
80
81 .list-subnews-csdl::-webkit-scrollbar-thumb:hover {
82 background: #aaa;
83 }
84
85 @media (max-width: 1024px) {
86 .border-right-csdl {
87 border-right: none;
88 }
89 }
90
91 .wrap-text-content-limit {
92 max-height: 200px;
93 overflow: auto;
94 scrollbar-width: none;
95 }
96
97 .bottom-shadow {
98 position: absolute;
99 bottom: -1px;
100 left: 0;
101 height: 15px;
102 width: 100%;
103 background: linear-gradient(to top, rgb(255 255 255 / 76%), rgb(255 255 255 / 65%));
104 }
105</style>
106
107<div class="row">
108 <#assign indexLocal=0 />
109 <div class="col-12 col-xl-8 border-right-csdl">
110 <div class="row item-big-news-csdl">
111 <#list entries as curEntry>
112 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
113 <#if className=="com.liferay.journal.model.JournalArticle">
114 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
115 description=article.getDescription(locale) noiDung=article.getContent()
116 idBaiViet=article.getId()
117 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
118 indexLocal=indexLocal + 1 />
119 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
120 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
121 <#else>
122 <#assign
123 smallImageUrl="/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
124 </#if>
125 <#if indexLocal==1>
126 <a class="col-12 col-md-5 col-xl-5" href="${viewURL}" title="${title}">
127 <img src="${smallImageUrl}" alt="" class="img-big-news-csdl">
128 </a>
129 <a class="col-12 col-md-7 col-xl-7 align-self-center" href="${viewURL}" title="${title}">
130 <div class="wrap-text-content-limit">
131 <div class="txt-title-big-news-csdl mb-2">${title}</div>
132 <div class="txt-description-big-news-csdl">${description}</div>
133 <div class="bottom-shadow"></div>
134 </div>
135 </a>
136 </#if>
137</#if>
138</#list>
139</div>
140</div>
141
142
143<div class="col-12 col-xl-4">
144 <div class="list-subnews-csdl mt-2 mt-xl-0">
145 <#assign subIndex=0 />
146 <#list entries as curEntry>
147 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
148 <#if className=="com.liferay.journal.model.JournalArticle" &&
149 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
150 <#assign title=curEntry.getTitle(locale) article=renderer.getArticle()
151 description=article.getDescription(locale) noiDung=article.getContent()
152 idBaiViet=article.getId()
153 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
154 subIndex=subIndex + 1 />
155 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
156 <#assign smallImageUrl=curEntry.getAssetRenderer().getThumbnailPath(renderRequest)>
157 <#else>
158 <#assign
159 smallImageUrl="/documents/37638/0/%E1%BA%A3nh-%C4%91%E1%BA%A1i-di%E1%BB%87n-%C4%91%C3%A0-n%E1%BA%B5ng-01.jpg">
160 </#if>
161 <#if subIndex gt 1>
162
163 <a class="mb-2 pr-lg-1" href="${viewURL}" title="${title}">
164 <div class="item-sub-news-csdl">${title}</div>
165 </a>
166
167</#if>
168</#if>
169</#list>
170</div>
171</div>
172</div>
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#64057" at line 56, column 14]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#64057" at line 56, column 5]
----
1<style>
2 .tin-nb-if {
3 list-style: none;
4 padding: 0;
5 margin: 0;
6 }
7
8 .tin-nb-if li {
9 position: relative;
10 padding: 15px 5px 15px 45px;
11 font-size: clamp(14px, 3vw, 16px);
12 font-weight: 500;
13 color: #2E2E2E;
14 cursor: pointer;
15 transition: all 0.2s;
16 }
17 .li-content{
18 position: relative;
19 }
20 .tin-nb-if li .li-content::before {
21 content: '';
22 position: absolute;
23 left: -30px;
24 top: 3px;
25 width: 20px;
26 min-height: 20px;
27 -webkit-mask: var(--urlIcon) no-repeat center;
28 mask: var(--urlIcon) no-repeat center;
29 background: #2E2E2E;
30 }
31 .tin-nb-if li .li-content:hover::before {
32 background-color: #DE6F18;
33 }
34
35 .tin-nb-if li.list-icon-dark::before {
36 background-color: #2E2E2E;
37 transition: background-color 0.2s;
38 }
39
40 .tin-nb-if li:hover::before {
41 background-color: #DE6F18;
42 }
43
44 .tin-nb-if li:hover {
45 color: #035FB5;
46 }
47
48 .tin-nb-if li.list-bg {
49 margin-bottom: 10px;
50 }
51</style>
52<div class="tin-nb-if">
53 <ul style="--urlIcon: url('/documents/37638/39612/file-icon.svg/a7a0015a-a543-f8f6-d640-9e77ae719f47?t=1737516649743');">
54 <#list entries as curEntry>
55 <#assign
56 renderer=curEntry.getAssetRenderer()
57 className=renderer.getClassName() />
58 <#if className=="com.liferay.journal.model.JournalArticle" &&
59 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
60 <#assign title=curEntry.getTitle(locale)
61 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}" />
62 <li class="list-bg align-content-center" >
63 <a class="li-content" href="${viewURL}" title="${title}">
64 ${title}
65 </a>
66 </li>
67 </#if>
68</#list>
69</ul>
70</div
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#64057" at line 56, column 14]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#64057" at line 56, column 5]
----
1<style>
2 .tin-nb-if {
3 list-style: none;
4 padding: 0;
5 margin: 0;
6 }
7
8 .tin-nb-if li {
9 position: relative;
10 padding: 15px 5px 15px 45px;
11 font-size: clamp(14px, 3vw, 16px);
12 font-weight: 500;
13 color: #2E2E2E;
14 cursor: pointer;
15 transition: all 0.2s;
16 }
17 .li-content{
18 position: relative;
19 }
20 .tin-nb-if li .li-content::before {
21 content: '';
22 position: absolute;
23 left: -30px;
24 top: 3px;
25 width: 20px;
26 min-height: 20px;
27 -webkit-mask: var(--urlIcon) no-repeat center;
28 mask: var(--urlIcon) no-repeat center;
29 background: #2E2E2E;
30 }
31 .tin-nb-if li .li-content:hover::before {
32 background-color: #DE6F18;
33 }
34
35 .tin-nb-if li.list-icon-dark::before {
36 background-color: #2E2E2E;
37 transition: background-color 0.2s;
38 }
39
40 .tin-nb-if li:hover::before {
41 background-color: #DE6F18;
42 }
43
44 .tin-nb-if li:hover {
45 color: #035FB5;
46 }
47
48 .tin-nb-if li.list-bg {
49 margin-bottom: 10px;
50 }
51</style>
52<div class="tin-nb-if">
53 <ul style="--urlIcon: url('/documents/37638/39612/file-icon.svg/a7a0015a-a543-f8f6-d640-9e77ae719f47?t=1737516649743');">
54 <#list entries as curEntry>
55 <#assign
56 renderer=curEntry.getAssetRenderer()
57 className=renderer.getClassName() />
58 <#if className=="com.liferay.journal.model.JournalArticle" &&
59 curEntry.getAvailableLanguageIds()?seq_contains(locale)>
60 <#assign title=curEntry.getTitle(locale)
61 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}" />
62 <li class="list-bg align-content-center" >
63 <a class="li-content" href="${viewURL}" title="${title}">
64 ${title}
65 </a>
66 </li>
67 </#if>
68</#list>
69</ul>
70</div
CÔNG KHAI
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#64829" at line 79, column 23]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#64829" at line 79, column 14]
----
1<style>
2 .tin-style6dots-wrap ul {
3 list-style: none;
4 padding: 0;
5 margin: 0;
6 display: flex;
7 flex-wrap: wrap;
8 justify-content: space-between;
9 }
10
11 .tin-style6dots-wrap ul li {
12 min-height: 70px;
13 width: calc(50% - 15px);
14 padding: 10px 5px 10px 45px;
15 font-size: clamp(14px, 3vw, 16px);
16 font-weight: 500;
17 color: #2E2E2E;
18 cursor: pointer;
19 transition: all 0.2s;
20 }
21
22 .tin-style6dots-wrap ul li.list-bg {
23 margin-bottom: 16px;
24 background: #E0E0E04D;
25 }
26
27 .tin-style6dots-wrap ul li.divider-x {
28 border-bottom: solid 1px #EBEBEB;
29 }
30
31 .tin-style6dots-wrap ul li.divider-x:last-child {
32 border-bottom: none;
33 }
34
35 .tin-style6dots-wrap ul .divider-y {
36 position: absolute;
37 height: 25px;
38 width: 1px;
39 background: #ACB0B3;
40 left: 35px;
41 top: 50%;
42 transform: translateY(-50%);
43 }
44
45 .li-content{
46 position: relative;
47 }
48 .tin-style6dots-wrap ul li .li-content::before {
49 content: '';
50 position: absolute;
51 left: -30px;
52 top: 3px;
53 width: 20px;
54 min-height: 20px;
55 -webkit-mask: var(--urlIcon) no-repeat center;
56 mask: var(--urlIcon) no-repeat center;
57 background: #035FB5;
58
59 }
60 .tin-style6dots-wrap ul li .li-content:hover::before {
61 background-color: #DE6F18;
62 }
63
64 .tin-style6dots-wrap ul li:hover {
65 color: #035FB5;
66 }
67
68 @media (max-width: 768px) {
69 .tin-style6dots-wrap ul li {
70 width: 100%;
71 }
72 }
73</style>
74
75<#assign indexLocal=0 />
76<div class="tin-style6dots-wrap">
77 <ul style="--urlIcon: url('/documents/37638/39612/six-dots-icon.svg');">
78 <#list entries as curEntry>
79 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
80 <#if className=="com.liferay.journal.model.JournalArticle" &&
81 curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 6>
82 <#assign title=curEntry.getTitle(locale)
83 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}" />
84 <li class="list-bg align-content-center" >
85 <a class="li-content" href="${viewURL}" title="${title}">
86 ${title}
87 </a>
88 </li>
89 </#if>
90</#list>
91</ul>
92</div
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer() [in template "37610#37640#64829" at line 79, column 23]
----
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: renderer = curEntry.getAssetRenderer() [in template "37610#37640#64829" at line 79, column 14]
----
1<style>
2 .tin-style6dots-wrap ul {
3 list-style: none;
4 padding: 0;
5 margin: 0;
6 display: flex;
7 flex-wrap: wrap;
8 justify-content: space-between;
9 }
10
11 .tin-style6dots-wrap ul li {
12 min-height: 70px;
13 width: calc(50% - 15px);
14 padding: 10px 5px 10px 45px;
15 font-size: clamp(14px, 3vw, 16px);
16 font-weight: 500;
17 color: #2E2E2E;
18 cursor: pointer;
19 transition: all 0.2s;
20 }
21
22 .tin-style6dots-wrap ul li.list-bg {
23 margin-bottom: 16px;
24 background: #E0E0E04D;
25 }
26
27 .tin-style6dots-wrap ul li.divider-x {
28 border-bottom: solid 1px #EBEBEB;
29 }
30
31 .tin-style6dots-wrap ul li.divider-x:last-child {
32 border-bottom: none;
33 }
34
35 .tin-style6dots-wrap ul .divider-y {
36 position: absolute;
37 height: 25px;
38 width: 1px;
39 background: #ACB0B3;
40 left: 35px;
41 top: 50%;
42 transform: translateY(-50%);
43 }
44
45 .li-content{
46 position: relative;
47 }
48 .tin-style6dots-wrap ul li .li-content::before {
49 content: '';
50 position: absolute;
51 left: -30px;
52 top: 3px;
53 width: 20px;
54 min-height: 20px;
55 -webkit-mask: var(--urlIcon) no-repeat center;
56 mask: var(--urlIcon) no-repeat center;
57 background: #035FB5;
58
59 }
60 .tin-style6dots-wrap ul li .li-content:hover::before {
61 background-color: #DE6F18;
62 }
63
64 .tin-style6dots-wrap ul li:hover {
65 color: #035FB5;
66 }
67
68 @media (max-width: 768px) {
69 .tin-style6dots-wrap ul li {
70 width: 100%;
71 }
72 }
73</style>
74
75<#assign indexLocal=0 />
76<div class="tin-style6dots-wrap">
77 <ul style="--urlIcon: url('/documents/37638/39612/six-dots-icon.svg');">
78 <#list entries as curEntry>
79 <#assign renderer=curEntry.getAssetRenderer() className=renderer.getClassName() />
80 <#if className=="com.liferay.journal.model.JournalArticle" &&
81 curEntry.getAvailableLanguageIds()?seq_contains(locale) && indexLocal < 6>
82 <#assign title=curEntry.getTitle(locale)
83 viewURL="${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}" />
84 <li class="list-bg align-content-center" >
85 <a class="li-content" href="${viewURL}" title="${title}">
86 ${title}
87 </a>
88 </li>
89 </#if>
90</#list>
91</ul>
92</div
Y tế
Hội đồng nhân dân với cử tri
OCOP
Nghị quyết của Đảng
An ninh Đà Nẵng
Vẻ đẹp Đà Nẵng
HỆ THỐNG CƠ SỞ DỮ LIỆU
HỖ TRỢ DOANH NGHIỆP
QUY HOẠCH & PHÁT TRIỂN
THÔNG TIN CẦN BIẾT
THĂM DÒ Ý KIẾN
KẾT QUẢ BÌNH CHỌN
“Cảm ơn bạn đã bình chọn!”






