The Pros and Cons of Going Mobile - UST
Info Center Main Carousel




Resources Overview Tabbed Content
Asset Publisher
While many foundations are well on their way with going mobile, start-ups and smaller organizations may still be trying to figure out how to establish a mobile presence in addition to their website and email operations. There are important matters to consider, the first of which is to determine what is considered a mobile device.
GFC Global describes a mobile device as “a general term for any type of handheld computer. These devices are designed to be extremely portable, and they can often fit in your hand. Some mobile devices—like tablets, e-readers, and smartphones—are powerful enough to do many of the things you do with a desktop or laptop computer.” Mobile devices run on mobile operating systems—the two major operating systems are Android and iOS.
Most nonprofits have a website that interacts with and receive donations from other PCs. Many have a Facebook or Twitter account to announce events and direct visitors to the main website for more information and to donate to their cause.
Not all institutions dedicated to good works have adapted their internet sites to interact with mobile devices or optimized those sites so that they can at least be viewed on mobile devices. Increasing numbers of nonprofits are catching on to the benefits of connectivity with mobile devices but before examining the pros and cons of transitioning, here are some compelling statistics about mobile device use.
First is a demographic shift in smartphone ownership in this survey report from the Pew Research Center (1/13/2022) by Michelle Faverio. “The (2021) survey found that 96% of those ages 18 to 29 own a smartphone compared with 61% of those 65 and older, a 35-percentage point difference. However, that gap has decreased from 53 points in 2012. The survey also showed that 95% of those ages 30 to 49 reported owning a smartphone in 2021 and 83% of those 50 to 64 said the same.” Going mobile is not just for Gen X, Millennials, and Gen Y.
In his article forthe site Exploding Topics, Internet Traffic from Mobile Devices(2/7/23),Josh Howarth affirmed, “Internet use and mobile use are components of everyday life for billions of people. In fact, for many, the two now go hand in hand.” What follows are selections from his breakdown of “the current state of mobile devices in 2023.”
- 60.04% of website traffic comes from mobile devices.
- 92.1% of internet users access the internet using a mobile phone.
- There are approximately 4.32 billion active mobile internet users.
- There will be over 1 billion 5G connections worldwide by 2025.
- Back in Q1 2015, this figure sat at less than one-third (31.16%). In other words, mobile device internet traffic increased by 75% since 2015.
- In fact, the percentage of people accessing the internet via mobile decides has increased quarter-over-quarter. Q1 2017 was the first-time mobile traffic surpassed traffic from desktop computers.
- The US has a mobile internet penetration rate of 84.37%.
- By comparison, approximately 7 in 10 (71.2%) use the more traditional laptop or desktop.
Howarth maintained that “e-commerce is among the most popular (use) for mobile devices. Indeed, more than half of the online population (55.4%) are likely to have bought something online in the past month with their mobile device.” It is into this larger e-commerce category that charitable donations would fall.
Looking forward, he concluded, “There are 4.66 billion active internet users. And 4.32 billion active mobile internet users. Notably, those figures are almost identical. The discrepancy between active social media users (4.2 billion) and active mobile social media users (4.15 billion) is even smaller.”
Howarth paints a dynamic vision of the future for nonprofits deciding to go mobile. Let’s examine both the pros and the cons for foundations that haven’t stepped onto the fast track yet.
Marita Meegan, writing for fundaisingIP.com, wants you to pause and consider Is Your Website Optimized for Mobile Devices? She recommends that you learn how many people visit your site from mobile devices. If you don’t have an analytics program on your site, she recommends Google Analytics, which is free to download and use. With Google Analytics or your own program, you can determine how many people drive by your site and the make and model of their internet jalopy.
She also encourages you to look at how your site appears on the variety of mobile screens types out there. Larger tablets will probably display your site correctly, but smaller tablets and smartphones will not reflect the site’s optimal appearance and will require design modifications to accommodate the different types of screen sizes that your analytics reveal. Observe how well your site functions on those screens, especially the donation pages.
She offers useful tips to pare your site down for optimal appeal and usability on smaller screens. A simple design that functions well with easy navigation will make the mobile version of your site more user-friendly and seem more trustworthy.
Ms. Meegan ventures into the pro and con territory when she asks Should Your Non-Profit Have a Mobile App? On the pro side are variety, flexibility, and apps tailored to your organization’s needs and specialization. There are apps for all kinds of digital appetites, ranging from Red Cross emergency tips to a geo locator for fundraising events, not to mention apps for donation and check out. You determine what you need at the outset and what you can do without for now because big apps can cost significant money. An app, she cautions, will continually incur costs for your nonprofit. Software requires upgrading each time something changes on a device’s operating system. Updating your app can be costly: security updates, data protection, bug fixes, upgrades and more—and for each platform you design it for. Again, a careful study of your analytics will help you determine which platforms and apps can get you the best mileage to see a ROI. She suggests third-party apps might meet your budget needs.
As it should be obvious by now that going mobile is the way everything is going, PRO and CON might best be reframed as PROPOSAL and CONSIDER. Best-selling finance author Robert Kiyosaki teaches that we should never say to ourselves, “I can’t afford it” when presented with an opportunity, but that we should instead ask ourselves “How can I afford it?” So, stepping outside the PRO and CON box and into a space of Proposal and Consider, we can weigh some of the more widely expressed concerns about going mobile.
PROPOSAL | CONSIDER |
Mobile apps are difficult to manage. | Mobile apps streamline daily operations, automate tasks, and integrate them on one platform, saving time and resources. |
Texting is laborious and a time suck. | Mobile texting can reach large numbers of people in a blink of time. Templates can help. |
How is text-to-give secure? | Text-to-give forms protect transactions and donor data. |
Getting someone to create new apps can be expensive. | Third-party companies like AppMySite provide a user-friendly, DIY, no-code,mobile app builder that makes creating premium native mobile apps accessible for nonprofits.These apps you can build in minutes to work with Android and iOS. It costs less than an in-house app designer, but it also gets you started for free. |
Nonprofits think their donor base is older and won’t use smart phones. | Mobile users span multiple generations. There is no digital divide here, only growing numbers of mobile users of all ages. |
Managing volunteers with a mobile device sounds like herding cats. | A volunteer mobile app reduces the volunteer management process with self-serve features to enhance communication, recruitment, training, more. |
How can you raise funds with a simple, plain text message? | Ask candidates and staff from last year’s midterm elections how they raised funds in minutes with a simple text-to-give alert versus direct mail or email. |
Has text-to-give been around long enough to demonstrate its usefulness? | Donation via text has been part of disaster response since Hurricane Katrina in 2005. But text-to-give really took off after the 2010 Haiti earthquake, when the American Red Cross raised more than $32 million within one year. It was also around for the first Ice Bucket Challenge, and that Challenge went from viral to phenomenal. |
A final thought about going mobile. Ask yourself, “How can mobile technology connect with my mission and connect my mission to others?” The answer may sound like a good song about a car.
This blog post was written by Amélie Frank, consulting copywriter to UST. To learn more about Amélie’s professional portfolio you can find her online at https://www.linkedin.com/in/amelie-frank/
Asset Publisher
Java method "com.sun.proxy.$Proxy131.getDLFileEntryByUuidAndGroupId(String, long)" threw an exception when invoked on com.sun.proxy.$Proxy131 object "com.liferay.portlet.documentlibrary.service.impl.DLFileEntryLocalServiceImpl@57bdc4"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign dlfileEntry2 = documentServic... [in template "6242803#6242849#6281901" at line 83, column 1] ----
1<#assign liferay_ui = taglibLiferayHash["/META-INF/liferay-ui.tld"] />
2<#assign liferay_theme = taglibLiferayHash["/META-INF/liferay-theme.tld"] />
3<@liferay_theme["defineObjects"]/>
4
5<#assign blogsEntryLocalService = serviceLocator.findService("com.liferay.blogs.kernel.service.BlogsEntryLocalService")>
6<#assign assetCategoryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryService")>
7<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
8<#assign documentService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
9
10
11<#assign namespace = randomNamespace />
12<#assign smallImageURL = "">
13<#assign imageUrl = "">
14<#assign videoUrl = "">
15<#assign subHeading = "">
16<#assign blogClassName="com.liferay.blogs.kernel.model.BlogsEntry">
17<#assign documentClassName = "com.liferay.document.library.kernel.model.DLFileEntry">
18<#assign vocabularyNameToUse = "Topic">
19<#assign resetCurParam = "false">
20<#if renderRequest.getParameter("resetCur")?? && renderRequest.getParameter("resetCur")??>
21 <#if renderRequest.getParameter("resetCur") == "true">
22 <#assign resetCurParam = "false">
23 </#if>
24</#if>
25<#assign categoryIdParam = "">
26<#if renderRequest.getParameter("categoryId")?? && renderRequest.getParameter("categoryId")??>
27 <#assign categoryIdParam = renderRequest.getParameter("categoryId")>
28</#if>
29<#assign pagination = "none">
30<#assign pageinationDelta = 5>
31
32<#attempt>
33 <#assign pagination = portletPreferences["paginationType"]?first >
34 <#recover>
35</#attempt>
36
37<#attempt>
38 <#assign pageinationDelta = portletPreferences["delta"]?first?number >
39 <#recover>
40</#attempt>
41
42<#assign portletId = themeDisplay.getPortletDisplay().getId()>
43<#assign siteGroupID = themeDisplay.getSiteGroupId()>
44
45<#assign vocabularyIdToUse = 0>
46<#attempt>
47 <#assign vocabularyIdToUse = assetVocabularyLocalService.getGroupVocabulary(themeDisplay.getSiteGroupId(), vocabularyNameToUse).getVocabularyId()>
48 <#recover>
49</#attempt>
50
51<script>
52function redirectToPage(pageURL){
53 var pathValue = window.location.pathname;
54 pageURL = pageURL.replace(" ","-").replace("'","-").replace("&","");
55 var rest = pathValue.substring(0, pathValue.lastIndexOf("/") + 1);
56 var last = pathValue.substring(pathValue.lastIndexOf("/") + 1, pathValue.length);
57 var pathValue = pathValue.replace(last,pageURL);
58 //console.log("pathValue : " +pathValue);
59 window.location.href = pathValue;
60}
61</script>
62
63<script>
64$(document).ready(function() {
65 $('.${namespace}asset-img .video-click-popup').click(function() {
66 showVideoPlayerModal($(this).attr('href'));
67 });
68});
69</script>
70
71<div id="${namespace}info-wrapper" class="info-wrapper">
72<#assign fullUid = "">
73<#list entries as entry>
74<#-- ${entry.title}<br> -->
75<#assign firstChar = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())?last_index_of("/")>
76<#assign lastChar = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())?index_of("?")>
77
78<#assign firstSlash = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())?index_of("/")>
79<#assign lastSlash = firstChar>
80<#assign strToReplace = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())?substring(firstSlash+1, lastSlash)>
81
82<#assign fullUid = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())?substring(firstChar+1, lastChar)>
83<#assign dlfileEntry2 = documentService.getDLFileEntryByUuidAndGroupId(fullUid, siteGroupID)>
84<#-- ${fullUid}<br> -->
85<#assign imageFolderID = dlfileEntry2.getFolderId()>
86<#assign imageTitle = dlfileEntry2.getTitle()>
87<#assign replaceStr = "documents"+"/"+siteGroupID+"/"+imageFolderID+"/"+imageTitle>
88
89 <#assign dateToUse = entry.getCreateDate()>
90 <#assign entry = entry />
91
92 <#assign assetRenderer = entry.getAssetRenderer() />
93
94 <#assign entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale)) />
95
96 <#assign dlfileModalPopup = "">
97
98 <#assign viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, entry) />
99 <#assign linkTarget = "">
100 <#if assetLinkBehavior != "showFullContent">
101 <#assign viewURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, viewURL) />
102 <#assign viewURL = "/c/blogs/find_entry?entryId=" + entry.getClassPK()>
103 </#if>
104 <#assign blogCategoies = assetCategoryService.getCategories(entry.getClassName(), entry.getClassPK())>
105 <#assign entryClassName = entry.getClassName()>
106
107 <#if (entryClassName == blogClassName)>
108 <#assign blogEntry = blogsEntryLocalService.getEntry(entry.getClassPK())>
109 <#assign dateToUse = blogEntry.getDisplayDate()>
110 <#assign imageUrl = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())>
111
112 <#assign fixUrl = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("image-url")?replace(strToReplace, replaceStr)>
113 <#assign imageUrl = fixUrl>
114
115 <#assign videoUrl = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("video-url")>
116 <#assign subHeading = blogsEntryLocalService.getEntry(entry.getClassPK()).getExpandoBridge().getAttribute("sub-heading")>
117 <#if blogEntry.isSmallImage() >
118 <#assign smallImageURL = blogEntry.getEntryImageURL(themeDisplay)?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())>
119 </#if>
120 <#elseif entryClassName == documentClassName>
121 <#attempt>
122 <#assign dlFileEntry = documentService.getDLFileEntry(entry.getClassPK())>
123 <#if dlFileEntry.getExpandoBridge().hasAttribute("image-url")>
124 <#assign imageUrl = dlFileEntry.getExpandoBridge().getAttribute("image-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())>
125 ${imageUrl}
126 </#if>
127 <#if dlFileEntry.getExpandoBridge().hasAttribute("icon-url")>
128 <#assign smallImageURL = dlFileEntry.getExpandoBridge().getAttribute("icon-url")?replace("[$SITE_GROUP_ID$]", themeDisplay.getSiteGroupId())>
129 </#if>
130 <#if dlFileEntry.getExpandoBridge().hasAttribute("display-title")>
131 <#assign documentDisplayTitle = dlFileEntry.getExpandoBridge().getAttribute("display-title")>
132 <#if documentDisplayTitle?has_content>
133 <#assign entryTitle = htmlUtil.escape(documentDisplayTitle) />
134 </#if>
135 </#if>
136 <#if dlFileEntry.getExpandoBridge().hasAttribute("modal-popup-function")>
137 <#assign dlfileModalPopup = dlFileEntry.getExpandoBridge().getAttribute("modal-popup-function")>
138 </#if>
139
140 <#if !dlfileModalPopup?has_content>
141 <#assign viewURL = themeDisplay.getPortalURL() + "/c/document_library/get_file?uuid=" + dlFileEntry.getUuid() + "&groupId=" + themeDisplay.getScopeGroupId()>
142 <#assign linkTarget = "target=\"_blank\"">
143 </#if>
144 <#recover>
145
146 </#attempt>
147 </#if>
148 <#assign linkTarget = "target=\"_blank\"">
149
150<div class="asset-wrapper">
151 <#if dlfileModalPopup?has_content>
152 <div class="${namespace}asset-img asset-img">
153 <img src="${imageUrl}" onclick="${dlfileModalPopup}" class="asset-image" >
154 </div>
155 <#else>
156 <#if (imageUrl != "") || (videoUrl != "")>
157 <div class="${namespace}asset-img asset-img">
158 <#if (videoUrl != "")>
159 <div class="video-modal video-click-popup" href="${videoUrl}">
160 <#else>
161 <#if (imageUrl != "")>
162 <a href="${viewURL}" target="_blank" ${linkTarget}>
163 </#if>
164 </#if>
165
166 <#if (imageUrl != "")>
167 <img src="${imageUrl}" class="asset-image" >
168 </#if>
169
170 <#if (videoUrl != "")>
171 </div>
172 <#else>
173 <#if (imageUrl != "")>
174 </a>
175 </#if>
176 </#if>
177 </div>
178 </#if>
179 </#if>
180<div class="asset-icon"> </div>
181 <div class="asset-abstract">
182 <div class="lfr-meta-actions asset-actions">
183 <@getEditIcon />
184 </div>
185<#assign categoryName= "">
186<#if entry.getCategories()?has_content>
187 <#list entry.getCategories() as curCategory>
188 <#if curCategory.getVocabularyId() == vocabularyIdToUse>
189 <#assign categoryName= curCategory.getName()>
190 <#break>
191 </#if>
192 </#list>
193</#if>
194
195<#attempt>
196 <#if categoryIdParam?? && !validator.isNull(categoryIdParam) && validator.isNumber(categoryIdParam)>
197 <#assign categoryName = assetCategoryService.getCategory(categoryIdParam?number).getName()>
198 </#if>
199 <#recover>
200</#attempt>
201
202<#if categoryName?has_content>
203 <div class="asset-category">
204 <span class="content-pillar" style="background-color: #707070;">${categoryName}</span>
205 </div>
206</#if>
207 <div class="asset-title-image">
208 <#if (smallImageURL != "")>
209 <img alt="" src="${smallImageURL}" />
210 </#if>
211
212 <h3 class="title">
213 <#if dlfileModalPopup?has_content>
214 <a onclick="${dlfileModalPopup}">${entryTitle}</a>
215 <#else>
216 <a href="${viewURL}" ${linkTarget}>${entryTitle}</a>
217 </#if>
218 </h3>
219 </div>
220
221
222<div class="date-and-author"><span class="asset-date">
223 ${dateUtil.getDate(dateToUse, "MMMM dd, yyyy ", locale)}
224 </span><!--/
225 <span class="asset-author">
226 <@liferay.language key="written-by" /> ${htmlUtil.escape(portalUtil.getUserName(entry.getUserId(), entry.getUserName()))}
227 </span>-->
228 </div>
229 <div class="asset-content">
230
231
232 <div class="asset-summary">
233 <@getMetadataField fieldName="author" />
234
235 <#assign abstractTxt = htmlUtil.escape(assetRenderer.getSummary(locale)) >
236 <#-- <#assign abstractTxtLen = abstractTxt?length > 172 -->
237 <#if abstractTxt?length gt 172>
238 ${abstractTxt[0..172]}...
239 <!-- ${htmlUtil.escape(assetRenderer.getSummary(locale))} -->
240 <#else>
241 ${abstractTxt}
242 </#if>
243
244 </div>
245 <#if dlfileModalPopup?has_content>
246 <a onclick="${dlfileModalPopup}" class="more-link"><@liferay.language key="read-more" /><span class="hide-accessible"><@liferay.language key="about" />${entryTitle}</span></a>
247 <#else>
248
249 <a href="${viewURL}" ${linkTarget} class="more-link"><@liferay.language key="read-more" /><span class="hide-accessible"><@liferay.language key="about" />${entryTitle}</span></a>
250 </#if>
251
252 </div>
253 </div>
254 <div class="clearfix"></div>
255</div>
256</#list>
257</div>
258
259<script>
260 AUI().use('liferay-portlet-url', function(A) {
261
262 $(document).ready(function() {
263 if ($('#${namespace}info-wrapper').siblings('.lfr-pagination').find('ul.lfr-pagination-buttons a').length) {
264 $('#${namespace}info-wrapper').siblings('.lfr-pagination').find('ul.lfr-pagination-buttons a').attr('href', 'javascript:;');
265 $('#${namespace}info-wrapper').siblings('.lfr-pagination').attr('curParam', '1');
266 $('#${namespace}info-wrapper').siblings('.lfr-pagination').click(function() {
267 if ($(this).attr('curParam') === '1') {
268 $($(this).find('ul.lfr-pagination-buttons li')[0]).addClass('disabled');
269 } else {
270 $($(this).find('ul.lfr-pagination-buttons li')[0]).removeClass('disabled');
271 }
272 });
273
274 $($('#${namespace}info-wrapper').siblings('.lfr-pagination').find('ul.lfr-pagination-buttons a')[0]).click(function() {
275 if (!$(this).parent().hasClass('disabled')) {
276 var curParam = Number($(this).parents('.lfr-pagination').attr('curParam'));
277 if (Number(curParam) <= 1) {
278 return;
279 }
280 $(this).parents('ul.lfr-pagination-buttons').find('li:nth-child(2)').removeClass('disabled');
281 //console.log($(this).parents('ul.lfr-pagination-buttons').find('li:nth-child(2)'));
282 var nextURL = Liferay.PortletURL.createRenderURL();
283 $(this).parents('.lfr-pagination').attr('curParam', Number(curParam) - 1);
284 nextURL.setPortletId('${portletId}');
285 nextURL.setWindowState('exclusive');
286 nextURL.setParameter('cur', curParam - 1);
287 nextURL.setParameter('resetCur', '${resetCurParam}');
288 <#if categoryIdParam??>
289 nextURL.setParameter('categoryId', '${categoryIdParam}');
290 </#if>
291 //$('#${namespace}info-wrapper').load(nextURL.toString() + ' .info-wrapper');
292 $.ajax({
293 url: nextURL.toString(),
294 }).done(function( data ) {
295 Liferay.fire('activateTab', {tabId: $('#${namespace}info-wrapper').parents('div.content[tabNameValue]').attr('tabNameValue'), scrollToTab: true});
296 $('#${namespace}info-wrapper').html($(data).find('.info-wrapper').addBack('.info-wrapper').html());
297 if ($($(data).find('.lfr-pagination-buttons li')[1]).hasClass('disabled')) {
298 $($('#${namespace}info-wrapper').siblings('.lfr-pagination').find('ul.lfr-pagination-buttons li')[1]).addClass('disabled');
299
300 }
301 });
302 }
303 });
304 $($('#${namespace}info-wrapper').siblings('.lfr-pagination').find('ul.lfr-pagination-buttons a')[1]).click(function() {
305 //console.log('clicked ' + !$(this).hasClass("disabled"))
306 if (!$(this).parent().hasClass('disabled')) {
307 var nextURL = Liferay.PortletURL.createRenderURL();
308 var curParam = Number($(this).parents('.lfr-pagination').attr('curParam'));
309 $(this).parents('.lfr-pagination').attr('curParam', Number(curParam) + 1);
310 nextURL.setPortletId('${portletId}');
311 nextURL.setWindowState('exclusive');
312 nextURL.setParameter('cur', curParam + 1);
313 nextURL.setParameter('resetCur', '${resetCurParam}');
314 <#if categoryIdParam??>
315 nextURL.setParameter('categoryId', '${categoryIdParam}');
316 </#if>
317 //$('#${namespace}info-wrapper').load(nextURL.toString() + ' .info-wrapper');
318 $.ajax({
319 url: nextURL.toString(),
320 }).done(function( data ) {
321 $('#${namespace}info-wrapper').html($(data).find('.info-wrapper').addBack('.info-wrapper').html());
322 if ($($(data).find('.lfr-pagination-buttons li')[1]).hasClass('disabled')) {
323 $($('#${namespace}info-wrapper').siblings('.lfr-pagination').find('ul.lfr-pagination-buttons li')[1]).addClass('disabled');
324 }
325 Liferay.fire('activateTab', {tabId: $('#${namespace}info-wrapper').parents('div.content[tabNameValue]').attr('tabNameValue'), scrollToTab: true});
326 });
327 }
328 });
329 }
330
331 });
332 });
333 </script>
334
335<#macro getDiscussion>
336 <#if validator.isNotNull(assetRenderer.getDiscussionPath()) && (enableComments == "true")>
337 <br />
338
339 <#assign discussionURL = renderResponse.createActionURL() />
340
341 ${discussionURL.setParameter("struts_action", "/asset_publisher/" + assetRenderer.getDiscussionPath())}
342
343 <@liferay_ui["discussion"]
344 className=entry.getClassName()
345 classPK=entry.getClassPK()
346 formAction=discussionURL?string
347 formName="fm" + entry.getClassPK()
348 ratingsEnabled=enableCommentRatings == "true"
349 redirect=portalUtil.getCurrentURL(request)
350 userId=assetRenderer.getUserId()
351 />
352 </#if>
353</#macro>
354
355<#macro getEditIcon>
356 <#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())>
357 <#assign redirectURL = renderResponse.createRenderURL() />
358
359 ${redirectURL.setParameter("struts_action", "/asset_publisher/add_asset_redirect")}
360 ${redirectURL.setWindowState("pop_up")}
361
362 <#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("pop_up"), redirectURL)!"" />
363
364 <#if validator.isNotNull(editPortletURL)>
365 <#assign title = languageUtil.format(locale, "edit-x", entryTitle) />
366
367 <@liferay_ui["icon"]
368 image="edit"
369 message=title
370 url="javascript:Liferay.Util.openWindow({dialog: {width: 960}, id:'" + renderResponse.getNamespace() + "editAsset', title: '" + title + "', uri:'" + htmlUtil.escapeURL(editPortletURL.toString()) + "'});"
371 />
372 </#if>
373 </#if>
374</#macro>
375
376<#macro getFlagsIcon>
377 <#if enableFlags == "true">
378 <@liferay_ui["flags"]
379 className=entry.getClassName()
380 classPK=entry.getClassPK()
381 contentTitle=entry.getTitle(locale)
382 label=false
383 reportedUserId=entry.getUserId()
384 />
385 </#if>
386</#macro>
387
388<#macro getMetadataField
389 fieldName
390>
391 <#if stringUtil.split(metadataFields)?seq_contains(fieldName)>
392 <span class="metadata-entry metadata-${fieldName}">
393 <#assign dateFormat = "dd MMM yyyy - HH:mm:ss" />
394
395 <#if fieldName == "author">
396 <@liferay.language key="by" /> ${portalUtil.getUserName(assetRenderer.getUserId(), assetRenderer.getUserName())}
397 <#elseif fieldName == "categories">
398 <@liferay_ui["asset-categories-summary"]
399 className=entry.getClassName()
400 classPK=entry.getClassPK()
401 portletURL=renderResponse.createRenderURL()
402 />
403 <#elseif fieldName == "create-date">
404 ${dateUtil.getDate(entry.getCreateDate(), dateFormat, locale)}
405 <#elseif fieldName == "expiration-date">
406 ${dateUtil.getDate(entry.getExpirationDate(), dateFormat, locale)}
407 <#elseif fieldName == "modified-date">
408 ${dateUtil.getDate(entry.getModifiedDate(), dateFormat, locale)}
409 <#elseif fieldName == "priority">
410 ${entry.getPriority()}
411 <#elseif fieldName == "publish-date">
412 ${dateUtil.getDate(entry.getPublishDate(), dateFormat, locale)}
413 <#elseif fieldName == "tags">
414 <@liferay_ui["asset-tags-summary"]
415 className=entry.getClassName()
416 classPK=entry.getClassPK()
417 portletURL=renderResponse.createRenderURL()
418 />
419 <#elseif fieldName == "view-count">
420 <@liferay_ui["icon"]
421 image="history"
422 />
423
424 ${entry.getViewCount()} <@liferay.language key="views" />
425 </#if>
426 </span>
427 </#if>
428</#macro>
429
430<#macro getPrintIcon>
431 <#if enablePrint == "true" >
432 <#assign printURL = renderResponse.createRenderURL() />
433
434 ${printURL.setParameter("struts_action", "/asset_publisher/view_content")}
435 ${printURL.setParameter("assetEntryId", entry.getEntryId()?string)}
436 ${printURL.setParameter("viewMode", "print")}
437 ${printURL.setParameter("type", entry.getAssetRendererFactory().getType())}
438
439 <#if (validator.isNotNull(assetRenderer.getUrlTitle()))>
440 <#if (assetRenderer.getGroupId() != themeDisplay.getScopeGroupId())>
441 ${printURL.setParameter("groupId", assetRenderer.getGroupId()?string)}
442 </#if>
443
444 ${printURL.setParameter("urlTitle", assetRenderer.getUrlTitle())}
445 </#if>
446
447 ${printURL.setWindowState("pop_up")}
448
449 <@liferay_ui["icon"]
450 image="print"
451 message="print"
452 url="javascript:Liferay.Util.openWindow({id:'" + renderResponse.getNamespace() + "printAsset', title: '" + languageUtil.format(locale, "print-x-x", ["hide-accessible", entryTitle]) + "', uri: '" + htmlUtil.escapeURL(printURL.toString()) + "'});"
453 />
454 </#if>
455</#macro>
456
457<#macro getRatings>
458 <#if (enableRatings == "true")>
459 <div class="asset-ratings">
460 <@liferay_ui["ratings"]
461 className=entry.getClassName()
462 classPK=entry.getClassPK()
463 />
464 </div>
465 </#if>
466</#macro>
467
468<#macro getRelatedAssets>
469 <#if enableRelatedAssets == "true">
470 <@liferay_ui["asset-links"]
471 assetEntryId=entry.getEntryId()
472 />
473 </#if>
474</#macro>
475
476<#macro getSocialBookmarks>
477 <#if enableSocialBookmarks == "true">
478 <@liferay_ui["social-bookmarks"]
479 displayStyle="${socialBookmarksDisplayStyle}"
480 target="_blank"
481 title=entry.getTitle(locale)
482 url=viewURL
483 />
484 </#if>
485</#macro>