le composant de calendrier primefaces reçoit Date par défaut. Puis-je obtenir seulement le mois et l'année sans dates.
Comment obtenir seulement le mois et l'année
PrimeFaces n'a pas de composant sélecteur mois année en tant que tel. Donc, si vous voulez utiliser un composant externe basé sur jQuery, allez à la caisse jQuery.mtz.monthpicker
Je viens de cacher la table du sélecteur de jour avec CSS. J'ai également dû créer mes propres flèches pour la navigation, car les flèches standard ne déclenchent pas l'événement dateSelect
.
Balisage:
<p:commandButton actionListener="#{bean.decrementMonth}"
id="navLeft" update="[your components]" icon="ui-icon-triangle-1-w" />
<h:panelGroup class="tableView">
<p:calendar value="#{bean.selectedDate}" mode="inline" />
</h:panelGroup>
<p:commandButton actionListener="#{bean.incrementMonth}"
id="navRight" update="[your components]" icon="ui-icon-triangle-1-e" />
CSS:
.tableView table,
.tableView a.ui-datepicker-prev,
.tableView a.ui-datepicker-next {
display: none;
}
Méthodes de haricots:
public void decrementMonth() throws Exception {
Calendar c = Calendar.getInstance();
c.setTime(this.selectedDate);
c.add(Calendar.MONTH, -1);
//... business logic to update date dependent data
}
public void incrementMonth() throws Exception {
Calendar c = Calendar.getInstance();
c.setTime(this.selectedDate);
c.add(Calendar.MONTH, 1);
//... business logic to update date dependent data
}
Résultat ( PrimeFaces 3.4.2 ):
Voici comment j'ai réalisé un simple sélecteur de plage d'un mois qui ressemble à ceci:
La page Web VoirCalendrier.xhtml:
<h:form id="calendrierRegenererFormulaire">
<h2><h:outputText value="#{msgs.CalendrierPlageAafficher} "/></h2>
<h:panelGrid columns="6">
<h:outputLabel value="#{msgs.CalendrierDateDebut} : " for="calendrierDateDebut" />
<p:calendar id="calendrierDateDebut" value="#{locationsControleur.dateDebut}"
pattern="yyyy-MM-dd" effect="slideDown" navigator="true" mode="inline"
lang="#{sessionControleur.localeInterface}" locale="#{sessionControleur.langue}" style="moisAnSeul" />
<h:outputLabel value="#{msgs.CalendrierDateFin} : " for="calendrierDateFin" />
<p:calendar id="calendrierDateFin" value="#{locationsControleur.dateFin}"
pattern="yyyy-MM-dd" effect="slideDown" navigator="true" mode="inline"
lang="#{sessionControleur.localeInterface}" locale="#{sessionControleur.langue}" style="moisAnSeul" />
<p:commandButton value="#{msgs.CalendrierRegenerer}" update=":calendrierFormulaire"
onclick="regenererCal()"/>
</h:panelGrid>
</h:form>
Pour empêcher l'affichage des jours du calendrier, il vous suffit de définir sa propriété dislay sur none avec le code suivant dans votre fichier css actif:
.ui-datepicker-calendar {
display: none;
}
Comme indiqué par Daniel Slazlay ci-dessus, la navigation dans les menus déroulants mois/année ou avec les flèches ne modifie pas la valeur de date interne des commandes p: calendar. Pour ce faire, les valeurs des menus déroulants mois et année sélectionnés sont lues pour les deux calendriers p: lorsque le bouton «Régénérer le calendrier» est activé. Avec ces informations, vous pouvez construire une chaîne de date au format "aaaa-MM-jj" et définir la valeur cachée interne des commandes p: calendar. est retourné alors que pour le dernier mois, c'est le dernier jour du mois qui est retourné. Ceci est fait avec le javascript suivant:
function regenererCal() {
year = $("#calendrierRegenererFormulaire\\:calendrierDateDebut .ui-datepicker-year").val();
month = $("#calendrierRegenererFormulaire\\:calendrierDateDebut .ui-datepicker-month").val();
$('#calendrierRegenererFormulaire\\:calendrierDateDebut_input').val(year + '-' + ('0' + (++month)).slice(-2) + '-01');
year = $("#calendrierRegenererFormulaire\\:calendrierDateFin .ui-datepicker-year").val();
month = $("#calendrierRegenererFormulaire\\:calendrierDateFin .ui-datepicker-month").val();
lastDay = new Date(year, month + 1, 0); // To get last day of month, see http://stackoverflow.com/a/13572682/1431979
$('#calendrierRegenererFormulaire\\:calendrierDateFin_input').val(lastDay.getFullYear() + '-' + ('0' + (lastDay.getMonth()+1)).slice(-2) + '-' + lastDay.getDate());
// Check what is posted to your server
console.log("[voirCalendrier.js]regenererCal calendrierDateDebut_input = " + $('#calendrierRegenererFormulaire\\:calendrierDateDebut_input').val());
console.log("[voirCalendrier.js]regenererCal calendrierDateFin_input = " + $('#calendrierRegenererFormulaire\\:calendrierDateFin_input').val());
}
Du côté du serveur, vous pouvez vérifier que les bonnes méthodes sont reçues par les méthodes setter:
...
formatAAAA_MM_JJ = new SimpleDateFormat("yyyy-MM-dd HH:mm", langue);
...
public void setDateDebut(Date dateDebut) {
this.dateDebut = dateDebut;
logger.info("{locationsContrôleur}setDateDebut dateDebut = " + formatAAAA_MM_JJ.format(dateDebut));
}
public void setDateFin(Date dateFin) {
this.dateFin = dateFin;
logger.info("{locationsContrôleur}setDateFin dateFin = " + formatAAAA_MM_JJ.format(dateFin));
}
J'espère que cela peut aider les autres.
//<![CDATA[
function showMonthYear(calendar){
$('.ui-datepicker-calendar').css('display','none');
$('.ui-datepicker').css('top', $('.ui-datepicker').offset().top+250);
var month = '';
var year = '';
if($(calendar).val()){
month = $(calendar).val().split('/')[0];
year = $(calendar).val().split('/')[1];
} else {
month = $.datepicker.formatDate("mm", new Date());
year = $.datepicker.formatDate("yy", new Date());
}
var exists = 0 != $('.ui-datepicker-year option[value='+year+']').length;
if(!exists){
$(".ui-datepicker-year").empty();
var initYear = parseInt(year)-10;
var endYear = parseInt(year)+10;
while(initYear < endYear){
$(".ui-datepicker-year").append($('<option>', {value:initYear, text: initYear}));
initYear++;
}
}
$('.ui-datepicker-month').val(parseInt(month)-1);
$('.ui-datepicker-year').val(year);
$(".ui-datepicker-month").change( function(){changeMonthYear(calendar);});
$(".ui-datepicker-year").change( function(){changeMonthYear(calendar);});
}
function changeMonthYear(calendar){
console.log('changeMonthYear');
$('.ui-datepicker-calendar').css('display','none');
$(".ui-datepicker-month").change( function(){changeMonthYear(calendar);});
$(".ui-datepicker-year").change( function(){changeMonthYear(calendar);});
var month = parseInt($('.ui-datepicker-month').val())+1;
if(month < 10){ month = '0'+month; }
$(calendar).val(month+"/"+parseInt($('.ui-datepicker-year').val()));
}
// ]]>
</script>
<p:calendar size="5"
onclick="showMonthYear(this)"
maxlength="10" pattern="MM/yyyy" navigator="true" />
Utilisé cette fonctionnalité de la documentation Primefaces:
Un autre événement pratique est le viewChange qui est déclenché lorsque month et changements d'année. Une instance de org.primefaces.event.DateViewChangeEvent est passé à l'écouteur d'événement fournissant le mois et l'année en cours information.
Fait le code suivant: XHTML
<p:panelGrid styleClass="monthYearOnly">
<p:row>
<p:column>FROM:</p:column>
<p:column>
<p:calendar id="from" mode="inline" value="#{callEntryBean.from}" navigator="true">
<p:ajax event="viewChange" listener="#{callEntryBean.updateFrom()}"/>
</p:calendar>
</p:column>
<p:column>TO:</p:column>
<p:column>
<p:calendar id="to" mode="inline" value="#{callEntryBean.to}" navigator="true">
<p:ajax event="viewChange" listener="#{callEntryBean.updateTo()}"/>
</p:calendar>
</p:column>
<p:column>
<p:commandButton value="Filter"
action="#{callEntryBean.filterDisplay}" update=""/>
</p:column>
</p:row>
</p:panelGrid>
CSS
.monthYearOnly .ui-datepicker-calendar{
display: none;
}
Haricot
public void updateFrom(){
Map<String,String> requestParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
LOGGER.info("before: " + from);
Calendar c = Calendar.getInstance();
c.setTime(from);
c.set(Calendar.MONTH, Integer.parseInt(requestParams.get("form:from_month")) - 1);
c.set(Calendar.YEAR, Integer.parseInt(requestParams.get("form:from_year")));
from = c.getTime();
LOGGER.info("after: " + from);
}
public void updateTo(){
Map<String,String> requestParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
LOGGER.info("before: " + to);
Calendar c = Calendar.getInstance();
c.setTime(to);
c.set(Calendar.MONTH, Integer.parseInt(requestParams.get("form:to_month")) - 1);
c.set(Calendar.YEAR, Integer.parseInt(requestParams.get("form:to_year")));
c.set(Calendar.DATE,c.getActualMaximum(Calendar.DAY_OF_MONTH));
to = c.getTime();
Calendar now = Calendar.getInstance();
if(c.after(now)){
to = now.getTime();
}
LOGGER.info("after: " + to);
}
Fondamentalement, le déclencheur ajax lorsque month
ou year
est modifié est la principale caractéristique ici. Malheureusement, il s’agit là d’un peu de travail, car je ne peux pas récupérer le org.primefaces.event.DateViewChangeEvent
. Cela semble être un bug et j'ai posté un rapport sur le forum Primefaces tout à l'heure. Mettra à jour ce post lorsque j'aurai des commentaires là-bas.
J'espère que ça aide.
Vous pouvez définir cela dans le motif, dans votre cas, ce serait:
<p:calendar id="test" value="#{bean.date}" pattern="MM.yyyy" />
Je lisais et vous ne pouvez pas obtenir cette fonctionnalité de la boîte de Primefaces.
https://code.google.com/p/primefaces/issues/detail?id=3453
La question est ancienne mais les derniers commentaires d'il y a un mois. Alors ils utilisent cette approche:
jQuery UI DatePicker pour afficher le mois, uniquement
Il existe également la solution consistant à utiliser uniquement <p:selectOneMenu>
et à éditer ce dont vous avez besoin.
À votre santé
Vous pouvez utiliser l'événement viewChange sur le calendrier p: pour capturer le clic sur le mois suivant/précédent. Vous pouvez ensuite déclencher l'événement dateSelect en cliquant sur le premier jour du mois.
JSF:
<p:calendar value="#{sampleBean.month}" styleClass="monthcal" mode="inline">
<p:ajax event="viewChange" onsuccess="$('.ui-calendar[id=\''+this.source+'\'] a.ui-state-default').filter(function(){return $(this).text()*1===1;}).click();" />
</p:calendar>
Pour masquer le volet avec les jours, ajoutez ce qui suit au fichier css
.monthcal .ui-datepicker-calendar {display: none;}
Maintenant, le calendrier primeur a une option de sélection de mois, dans le calendrier p en utilisant l'option mois comme vue.
<p-calendar [(ngModel)]="dateValue" view="month" dateFormat="mm/yy" [yearNavigator]="true" yearRange="2000:2030"></p-calendar>
Vous devez ajouter ce bloc pour compléter la navigation avec la flèche:
$(".ui-datepicker-next").click( function(){changeMonthYear(calendar);});
$(".ui-datepicker-prev").click( function(){changeMonthYear(calendar);});