Thymeleaf, how to make conditional statement with th:src? - thymeleaf

If dish.imageFolder is not null - it should be
<img th:src="#{${dish.imageFolder}}"/>
If null - this image
<img src="https://via.placeholder.com/150" alt=""/>

One option:
<img th:src="${dish.imageFolder != null} ? #{${dish.imageFolder}} : 'https://via.placeholder.com/150'" />
I would probably just use th:if though, like this:
<img th:if="${dish.imageFolder != null}" th:src="#{${dish.imageFolder}}" />
<img th:if="${dish.imageFolder == null}" src="https://via.placeholder.com/150" />

Related

How can I do: required="false" in grails g:select?

required="false" does not work in "g:select" tag
Example:
<g:select from="${}" name="select" required="false" />
and
<g:select from="${}" name="select" required="true" />
produces a html tag required (in html5)
How can I make the "g:select" produces the required or not, dynamically?
Just remove required, for eg:
<g:select id="select" from="${}" name="select"/>
You can use jquery to change the g:select to be required or not required. For example, lets say you have another
<g:select id="yesNo" from="[yes, no]">
In the gsp, use javascript:
$( "#yesNo" ).change(function() {
if($(this)[0].value == "yes") {
$( "#select" ).attr('required', 'required')
}
else {
$( "#select" ).removeProp( "required" )
}
});
Another approach is if you pass a variable required to gsp, you can use <g:if>:
In controller:
[required: "true"] //If dont want required, simply don't return required at all
In gsp:
<g:if test="${required}">
<g:select from="${}" name="select" required/>
</g:if>
<g:else>
<g:select from="${}" name="select"/>
</g:else>
<g:select from="${}" name="select" required="${false/true}" />
should work !

mvc show no picture if can't find file

I have a mvc project. there is a column like this
<td>
<img width="60" src='#Url.Content("~/Content/photos/" + #item.ID+".jpg")' alt="Image" />
</td>
But if no jpg file exists, I wanna show another general picture. How could I do that? Thanks
I am presuming that your item ID is coming from your model. If this is the case you could use Razor to solve this problem. This is one solution:
#if (item.ID != null)
{
<td>
<img width="60" src='#Url.Content("~/Content/photos/" + #item.ID+".jpg")' alt="Image" />
</td>
}
else
{
//code to show general picture here
}
I figure it could use it like this
#if (System.IO.File.Exists(Server.MapPath("~/Content/photos/" + #item.ID + ".jpg")))
{
<img width="60" src='#Url.Content("~/Content/photos/" + #item.ID+".jpg")' alt="Image" />
}
else
{
<img width="60" src='#Url.Content("~/Content/photos/noPic.jpg")' alt="Image" />
}

simply outputting #Model value in img src or a href

New to Razor and I am missing somethign simple here:
#foreach (var p in #Model)
{
<a href="/category/#Html.Display("CategoryID")" >
<img src="http://images.mydomain.com/productimages/#ViewData["ManufacturerID"]/category-#Html.Display("CategoryID")_lg.jpg?width=200&height=130" width="200" height="130" class="myImg" alt="" />
</a>
}
I simply want to out put the CategoryID here, the link above does not output a value for CategoryID. What am I doing wrong here?
My model is populated since I can drop this in the loop and it displays: #p.CategoryName
Try this.
#foreach (var p in #Model)
{
<a href="/category/#p.CategoryID" >
<img src="http://images.mydomain.com/productimages/#ViewData["ManufacturerID"]/category-#(p.CategoryID)_lg.jpg?width=200&height=130" width="200" height="130" class="myImg" alt="" />
</a>
}
We are using explicit expression inside the image source string ( #(p.CategoryID) )
In your link href just use #p.CategoryID. The Html.Display() is used to show value from model's property. Your model doesn;t contains CategoryID property because it's a collection.

How do I get the index of current ui:fragment in a facelet?

<ui:fragment rendered="#{...}">
<p class="#{current.index eq 0 ? '' : 'someClass'}">
Some Text
</p>
</ui:fragment>
.....
<ui:fragment ...>
<p class="#{current.index eq 0 ? '' : 'someClass'}">
...
</p>
....
</ui:fragment>
How do I get the index of current ui:fragment in the above facelet?
You're hardcoding them instead of using an iterating component like <ui:repeat> or so, so there's no index available in the scope. Just either hardcode the index as well, or use an iterating component like <ui:repeat> wherein the index is available by the varStatus reference.
<ui:repeat value="#{bean.list}" var="item" varStatus="loop">
<p>#{loop.index}</p>
</ui:repeat>
If I'm using hardcoded text in the p tag,
<ui:fragment rendered="#{...}">
<p class="dummyClass someClass">
Text 1
</p>
</ui:fragment>
<ui:fragment rendered="#{...}">
<p class="dummyClass someClass">
Text 2
</p>
</ui:fragment>
.........
And then using jQuery
$('.dummyClass').each(function() {
if($(this).index() == 1){
$(this).removeClass('someClass');
}
});
Note that the .index() with no parameters returns 1 for the first element.

Struts2 pagination

My Struts2 application needs the pagination functionality applied to some records, but what I need to customize is the "Last 1 - 2 - 3 Next" appearance and also have the ability to use a combo box for the selection of how many records should be visible(10 - 20 - 30 - 40 -50).
I have tried two way to accomplish this goal:
1) use display tag library, but I'm not able to customize the appearance, because is auto-generated by the library, and I don't how implement the combo box for select how many records should be visible
2) create my own code for accomplish this functionality but is a job too long and not enough time due to the expiry.
My question is: exists some Struts2 library for realize this functionality? Or, is possible to customize the display tag library for the page scroll bar and the records combo box?
I can give insight from struts2 code base there is no functionality as described by you provided by struts2 in itself..
Regarding the Display tag i have not used them much but since they are the part of oprn source i am sure we can customize that one more thing regarding the customization of display tag ask question under display tag you will get better answer at at quick pace
I wrote a custom tld just for the purpose as below and then just use it like this:
Usage:
paginate.tag
1}">
<c:set var="showingPage"
value="${param.pageNumber == null ? 1 : param.pageNumber}" />
<c:url value="${postUrl}" var="previousUrl">
<c:param name="pageNumber" value="${showingPage - 1}" />
<c:param name="perPage" value="${perPage}" />
</c:url>
<c:url value="${postUrl}" var="nextUrl">
<c:param name="pageNumber" value="${showingPage +1}" />
<c:param name="perPage" value="${perPage}" />
</c:url>
<div class="pagination" />
<c:if test="${showingPage > 1}">
<< Previous
</c:if>
<fmt:formatNumber var="endCounter" pattern="0">
<%= totalCount % perPage > 0 ? Math.ceil(totalCount/perPage) + 1 : totalCount/perPage %>
</fmt:formatNumber>
<c:forEach begin="1" end="${endCounter}" var="index">
<c:url value="${postUrl}" var="url">
<c:param name="pageNumber" value="${index}" />
<c:param name="perPage" value="${perPage}" />
</c:url>
${index}
</c:forEach>
<c:if test="${endCounter != showingPage}">
Next >>
</c:if>
</div>
</c:if>
hi you can try struts2 jquery grid here is the code
<%# page contentType="text/html; charset=UTF-8"%>
<%# taglib prefix="s" uri="/struts-tags"%>
<%# taglib prefix="sj" uri="/struts-jquery-tags"%>
<%# taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<sj:div id="resultsDiv">
<body>
<div id="mainframe">
<s:form>
<div id="sucessMsg">
<s:property value="msg" />
</div>
<s:url id="editurl" action="editUser" />
<s:url id="deleteurl" action="deleteUser" />
<script type="text/javascript">
function editLinkFormatter(cellval, options, rowObject, icon, link_class, link_action) {
//alert(rowObject.username);
return "<a href='#' onClick='javascript:openEditDialog(""+cellval+"",""+rowObject.username+"")'><font class='hyperlink'><u>" + rowObject.username + "</u></font></a>";
}
function deleteLinkFormatter(cellval, options, rowObject, icon, link_class, link_action) {
return "<a href='deleteUser?userid="+cellval+"' onClick='javascript: return delete_user()'><font class='hyperlink'><u>Delete</u></font></a>";
//return "Delete";
}
colModal: [
{name: 'userid', formatter: function (cellvalue, options, rowObject) {
return editLinkFormatter(cellvalue, options, rowObject,
'ui-icon-pencil', 'edit-link-class', 'Edit');
}},
{name: 'userid', formatter: function (cellvalue, options, rowObject) {
return deleteLinkFormatter(cellvalue, options, rowObject, icon, link_class, link_action);
}}
];
function openEditDialog(userid,username) {
$("#resultsDiv").load("<s:property value="editurl"/>?userid="+userid+"&username="+username);
}
function delete_user() {
var agree=confirm("Are you sure you want to Delete?");
if (agree){
return true;
}
else{
return false;
}
// $("#edit_Users").dialog('open');
}
function unlockerFormatter(cellval, options, rowObject, icon, link_class, link_action) {
if(rowObject.loginStatus=='Locked'){
return "<a href='unlockuser?userid=" + rowObject.userid + "')'><font class='hyperlink'><u>Locked</u></font></a>";
}
else{
return "UnLocked";
}
/* return "<a href='deleteUser?userid="+cellval+"' onClick='javascript: return deleteUser("+cellval+")'><u>Delete</u></a>"; */
//return "Delete";
}
</script>
<sj:dialog id="edit_Users" title="Edit User" autoOpen="false"
modal="true" width="800" />
<sj:div id="draggable" draggable="true">
<s:url id="remoteurl" action="viewUserstemp" />
<sjg:grid id="gridtable" caption="Users" dataType="json"
href="%{remoteurl}" pager="true" gridModel="gridModel"
rowList="10,15,20,50,100" rowNum="10" rownumbers="true" viewrecords="true"
width="800" navigator="true" navigatorView="false" navigatorDelete="false" navigatorAdd="false" navigatorEdit="false" navigatorSearch="false">
<sjg:gridColumn name="userid" index="userid" title="User Id"
sortable="false" />
<sjg:gridColumn name="userid" index="username" title="User Name"
sortable="true" formatter="editLinkFormatter" />
<sjg:gridColumn name="emailid" index="emailid" title="Email Id"
sortable="true" />
<sjg:gridColumn name="userCreatedDate" index="userCreatedDate"
title="Created Date" sortable="true" />
<sjg:gridColumn name="userModifiedDate" index="userModifiedDate"
title="Modified Date" sortable="true" />
<sjg:gridColumn name="accstatus" index="accstatus"
title="Account Status" sortable="true" />
<sjg:gridColumn name="userid" index="username" title="Delete User"
sortable="true" formatter="deleteLinkFormatter" />
<sjg:gridColumn name="loginStatus" index="loginStatus" title="Unlock User"
sortable="true" formatter="unlockerFormatter" />
</sjg:grid>
<br></br>
<s:submit action="loadUserValues" cssClass="ui-button ui-widget ui-state-default ui-corner-all ui-state-hover" name="button"
id="button" value="New User" />
<br />
</sj:div>
</s:form>
<%--
<td height="25" align="left" valign="middle">
<s:url id="url" action="unlockuser">
<s:param name="userid">
<s:property value="userid" />
</s:param>
</s:url>
<s:set name="type" value="%{loginStatus}" />
<s:if test="%{#type=='Locked'}">
<s:a href="%{url}" title="Click here to Unlock" ><s:property value="loginStatus"/></s:a>
</s:if>
<s:else>
Unlocked
</s:else> --%>
</td>
</div>
</body>
</sj:div>
</html>

Resources