如何合并 primefaces 数据表行中的单元格?
How to merge cells in a primefaces datatable row?
数据表标签或 CSS 这可能吗?任何解决方案都是有帮助的。
如果可能,日期的搜索字段可以在同一列中。
Primefaces 数据表:
datatable
数据表代码:
<p:dataTable>
<p:column filterBy="#{log.mbr}" sortBy="#{log.mbr}" headerText="mbr">
<h:outputText value="#{log.mbr}" />
</p:column>
<p:column id="dateFrom" headerText="datum od"
filterBy="#{log.datumOd}" sortBy="#{log.datumUpisa}">
<f:facet name="filter">
<p:calendar onkeypress="PF('loggerTable').filter()"
onchange="PF('loggerTable').filter()" id="from"
styleClass="customCalendar" pattern="dd/MM/yyyy"
widgetVar="dateFrom">
<p:ajax event="dateSelect" oncomplete="PF('loggerTable').filter()"
update="logsTable" />
</p:calendar>
</f:facet>
<h:outputText id="datumOdZaBrisanje" value="#{log.datumUpisa}" />
</p:column>
<p:column id="dateTo" headerText="datum do" filterBy="#{log.datumDo}">
<f:facet name="filter">
<p:calendar onchange="PF('loggerTable').filter()" id="to"
styleClass="customCalendar" pattern="dd/MM/yyyy"
widgetVar="calendarFrom">
<p:ajax event="dateSelect" oncomplete="PF('loggerTable').filter()"
update="logsTable" />
</p:calendar>
</f:facet>
</p:column>
<p:column style="width:40px;text-align: center" headerText="prikaz">
<p:commandButton update=":form:logDetail"
oncomplete="PF('logDialog').initPosition();PF('logDialog').show()"
icon="fa fa-search">
<f:setPropertyActionListener value="#{log}"
target="#{logger.selectedLog}" />
</p:commandButton>
</p:column>
</p:dataTable>
这段代码做类似的事情。
xhtml
<p:dataTable id="MissionTable"
value="#{MissionsBean.missionsList}"
var="record"
widgetVar="MissionTable"
selection="#{MissionsBean.mission}"
rowKey="#{record}"
filterDelay="600"
>
.............
<p:column headerText="Date Start" sortBy="#{record.missionDateStart}"
filterBy="#{record.missionDateStart}"
filterFunction="#{MissionsBean.filterByDateStart}"
filterMatchMode="contains" style="width: 180px!important; text-align: center;">
<f:facet name="filter">
<h:inputHidden id="filter"/>
</f:facet>
<f:facet name="header">
<p:link value="Date Start" style="color: white;"
onclick="$(PrimeFaces.escapeClientId('#{p:component('filter')}'))[0].value = ''"
/>
<br/>
<p:calendar id="sfrom" pattern="dd/MM/yy" size="4" navigator="true">
<p:ajax event="dateSelect"
onstart="$(PrimeFaces.escapeClientId('#{p:component('filter')}'))[0].value = $(PrimeFaces.escapeClientId('#{p:component('sfrom')}_input'))[0].value + '>' + $(PrimeFaces.escapeClientId('#{p:component('sto')}_input'))[0].value"
oncomplete="PF('MissionTable').filter()"/>
</p:calendar>
<h:outputText class="fa fa-arrows-h fa-2x" style="vertical-align: middle;"/>
<p:calendar id="sto" pattern="dd/MM/yy" size="4" navigator="true">
<p:ajax event="dateSelect"
onstart="$(PrimeFaces.escapeClientId('#{p:component('filter')}'))[0].value = $(PrimeFaces.escapeClientId('#{p:component('sfrom')}_input'))[0].value + '>' + $(PrimeFaces.escapeClientId('#{p:component('sto')}_input'))[0].value"
oncomplete="PF('MissionTable').filter()"/>
</p:calendar>
</f:facet>
<h:outputText value="#{record.missionDateStart}">
<f:convertDateTime pattern="dd MMM yyyy HH:mm"></f:convertDateTime>
</h:outputText>
</p:column>
......................
</p:dataTable>
自定义过滤器是
public boolean filterByDate(Object value, Object filter, Locale locale) {
String filterText = (filter == null) ? null : filter.toString().trim();
if (filterText == null || filterText.isEmpty()) {
return true;
}
if (value == null) {
return false;
}
DateTimeFormatter sdf = DateTimeFormatter.ofPattern("dd/MM/yy");
Instant instant = ((Date) value).toInstant(); //Zone : UTC+0
LocalDate dateValue = instant.atZone(ZoneId.of("Europe/Athens")).toLocalDate();
LocalDate dateFrom;
LocalDate dateTo;
try {
String fromPart = filterText.substring(0, filterText.indexOf(">"));
String toPart = filterText.substring(filterText.indexOf(">") + 1);
dateFrom = fromPart.isEmpty() ? null : LocalDate.parse(fromPart, sdf);
dateTo = toPart.isEmpty() ? null : LocalDate.parse(toPart, sdf);
} catch (Exception e) {
log.error("unable to parse date: " + filterText, e);
return false;
}
return (dateFrom == null || dateValue.isAfter(dateFrom) || dateValue.isEqual(dateFrom))
&& (dateTo == null || dateValue.isBefore(dateTo) || dateValue.isEqual(dateTo));
}
我记得我根据 this answer
编写了我的代码
注意日期pattern
。我的例子和你的不一样。
抱歉,我无法根据您的代码调整我的代码。
希望这段代码对你有所帮助。
如果您使用 Primefaces 7,您可以尝试使用 datePicker 范围选择:
数据表标签或 CSS 这可能吗?任何解决方案都是有帮助的。 如果可能,日期的搜索字段可以在同一列中。
Primefaces 数据表:
datatable
数据表代码:
<p:dataTable>
<p:column filterBy="#{log.mbr}" sortBy="#{log.mbr}" headerText="mbr">
<h:outputText value="#{log.mbr}" />
</p:column>
<p:column id="dateFrom" headerText="datum od"
filterBy="#{log.datumOd}" sortBy="#{log.datumUpisa}">
<f:facet name="filter">
<p:calendar onkeypress="PF('loggerTable').filter()"
onchange="PF('loggerTable').filter()" id="from"
styleClass="customCalendar" pattern="dd/MM/yyyy"
widgetVar="dateFrom">
<p:ajax event="dateSelect" oncomplete="PF('loggerTable').filter()"
update="logsTable" />
</p:calendar>
</f:facet>
<h:outputText id="datumOdZaBrisanje" value="#{log.datumUpisa}" />
</p:column>
<p:column id="dateTo" headerText="datum do" filterBy="#{log.datumDo}">
<f:facet name="filter">
<p:calendar onchange="PF('loggerTable').filter()" id="to"
styleClass="customCalendar" pattern="dd/MM/yyyy"
widgetVar="calendarFrom">
<p:ajax event="dateSelect" oncomplete="PF('loggerTable').filter()"
update="logsTable" />
</p:calendar>
</f:facet>
</p:column>
<p:column style="width:40px;text-align: center" headerText="prikaz">
<p:commandButton update=":form:logDetail"
oncomplete="PF('logDialog').initPosition();PF('logDialog').show()"
icon="fa fa-search">
<f:setPropertyActionListener value="#{log}"
target="#{logger.selectedLog}" />
</p:commandButton>
</p:column>
</p:dataTable>
这段代码做类似的事情。
xhtml
<p:dataTable id="MissionTable"
value="#{MissionsBean.missionsList}"
var="record"
widgetVar="MissionTable"
selection="#{MissionsBean.mission}"
rowKey="#{record}"
filterDelay="600"
>
.............
<p:column headerText="Date Start" sortBy="#{record.missionDateStart}"
filterBy="#{record.missionDateStart}"
filterFunction="#{MissionsBean.filterByDateStart}"
filterMatchMode="contains" style="width: 180px!important; text-align: center;">
<f:facet name="filter">
<h:inputHidden id="filter"/>
</f:facet>
<f:facet name="header">
<p:link value="Date Start" style="color: white;"
onclick="$(PrimeFaces.escapeClientId('#{p:component('filter')}'))[0].value = ''"
/>
<br/>
<p:calendar id="sfrom" pattern="dd/MM/yy" size="4" navigator="true">
<p:ajax event="dateSelect"
onstart="$(PrimeFaces.escapeClientId('#{p:component('filter')}'))[0].value = $(PrimeFaces.escapeClientId('#{p:component('sfrom')}_input'))[0].value + '>' + $(PrimeFaces.escapeClientId('#{p:component('sto')}_input'))[0].value"
oncomplete="PF('MissionTable').filter()"/>
</p:calendar>
<h:outputText class="fa fa-arrows-h fa-2x" style="vertical-align: middle;"/>
<p:calendar id="sto" pattern="dd/MM/yy" size="4" navigator="true">
<p:ajax event="dateSelect"
onstart="$(PrimeFaces.escapeClientId('#{p:component('filter')}'))[0].value = $(PrimeFaces.escapeClientId('#{p:component('sfrom')}_input'))[0].value + '>' + $(PrimeFaces.escapeClientId('#{p:component('sto')}_input'))[0].value"
oncomplete="PF('MissionTable').filter()"/>
</p:calendar>
</f:facet>
<h:outputText value="#{record.missionDateStart}">
<f:convertDateTime pattern="dd MMM yyyy HH:mm"></f:convertDateTime>
</h:outputText>
</p:column>
......................
</p:dataTable>
自定义过滤器是
public boolean filterByDate(Object value, Object filter, Locale locale) {
String filterText = (filter == null) ? null : filter.toString().trim();
if (filterText == null || filterText.isEmpty()) {
return true;
}
if (value == null) {
return false;
}
DateTimeFormatter sdf = DateTimeFormatter.ofPattern("dd/MM/yy");
Instant instant = ((Date) value).toInstant(); //Zone : UTC+0
LocalDate dateValue = instant.atZone(ZoneId.of("Europe/Athens")).toLocalDate();
LocalDate dateFrom;
LocalDate dateTo;
try {
String fromPart = filterText.substring(0, filterText.indexOf(">"));
String toPart = filterText.substring(filterText.indexOf(">") + 1);
dateFrom = fromPart.isEmpty() ? null : LocalDate.parse(fromPart, sdf);
dateTo = toPart.isEmpty() ? null : LocalDate.parse(toPart, sdf);
} catch (Exception e) {
log.error("unable to parse date: " + filterText, e);
return false;
}
return (dateFrom == null || dateValue.isAfter(dateFrom) || dateValue.isEqual(dateFrom))
&& (dateTo == null || dateValue.isBefore(dateTo) || dateValue.isEqual(dateTo));
}
我记得我根据 this answer
编写了我的代码注意日期pattern
。我的例子和你的不一样。
抱歉,我无法根据您的代码调整我的代码。 希望这段代码对你有所帮助。
如果您使用 Primefaces 7,您可以尝试使用 datePicker 范围选择: