package de.flower.rmt.ui.panel; import de.flower.common.ui.ajax.event.AjaxEventSender; import de.flower.common.ui.tooltips.TooltipBehavior; import de.flower.rmt.model.db.entity.Invitation; import de.flower.rmt.model.db.type.RSVPStatus; import de.flower.rmt.ui.markup.html.form.renderer.RSVPStatusRenderer; import org.apache.wicket.AttributeModifier; import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableChoiceLabel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import java.util.Arrays; /** * @author flowerrrr */ public abstract class QuickResponseLabel extends AjaxEditableChoiceLabel<RSVPStatus> { private TooltipBehavior tooltipBehavior; /** * @param id * @param status is null for NO_RESPONSE. done to be able to use #defaultNullLabel(). */ public QuickResponseLabel(final String id, final RSVPStatus status) { super(id, Model.of(status), Arrays.asList(RSVPStatus.quickResponseValues()), new RSVPStatusRenderer()); } protected IModel<RSVPStatus> getModel() { return (IModel<RSVPStatus>) getDefaultModel(); } @Override protected void onModelChanged() { submitStatus(getModel().getObject()); AjaxEventSender.entityEvent(this, Invitation.class); // must remove twipsy behavior when user has selected an entry removeTooltipBehavior(); } /** * just return other than real event to disable edit mode of label. * * @return */ @Override protected String getLabelAjaxEvent() { if (isEnabled()) { return super.getLabelAjaxEvent(); } else { return "foobar-event"; } } protected abstract void submitStatus(final RSVPStatus status); /** * Use our info icon to signal user that he has not responded yet. * * @return */ @Override protected String defaultNullLabel() { return "<span class=\"xicon-info\"/>"; } @Override protected void onInitialize() { super.onInitialize(); // if event is closed add tooltip to tell user he cannot respond if (!isEnabled()) { addTooltipBehavior("player.events.tooltip.event.closed"); getLabel().add(AttributeModifier.replace("href", AttributeModifier.VALUELESS_ATTRIBUTE_REMOVE)); // to avoid mouse pointer when hovering over <a> tag } else { if (getModel().getObject() == null) { addTooltipBehavior("player.events.tooltip.no.response"); } } getLabel().add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() { @Override public String getObject() { RSVPStatus status = getModel().getObject(); if (status == null) { return ""; } switch (status) { case ACCEPTED: return "label label-success"; case UNSURE: return "label label-warning"; case DECLINED: return "label label-important"; default: throw new IllegalStateException("Unknown status [" + status + "]"); } } })); } private void addTooltipBehavior(String resourceKey) { tooltipBehavior = new TooltipBehavior(new ResourceModel(resourceKey)); getLabel().add(tooltipBehavior); } private void removeTooltipBehavior() { if (tooltipBehavior != null) { getLabel().remove(tooltipBehavior); //noinspection AssignmentToNull tooltipBehavior = null; } } }