package org.ovirt.engine.ui.webadmin.section.main.view.popup.gluster;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.gwtbootstrap3.client.ui.Alert;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotScheduleRecurrence;
import org.ovirt.engine.core.compat.DayOfWeek;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.EntityModelWidgetWithInfo;
import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab;
import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTabPanel;
import org.ovirt.engine.ui.common.widget.editor.EntityModelDateTimeBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.GwtBootstrapDateTimePicker;
import org.ovirt.engine.ui.common.widget.editor.ListModelCheckBoxGroupEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelDaysOfMonthSelectorEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelRadioGroupEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelLabelEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
import org.ovirt.engine.ui.common.widget.label.EnableableFormLabel;
import org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotModel;
import org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotModel.EndDateOptions;
import org.ovirt.engine.ui.uicompat.EnumTranslator;
import org.ovirt.engine.ui.uicompat.external.StringUtils;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.gluster.GlusterVolumeSnapshotCreatePopupPresenterWidget;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.text.shared.AbstractRenderer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Label;
import com.google.inject.Inject;
public class GlusterVolumeSnapshotCreatePopupView extends
AbstractModelBoundPopupView<GlusterVolumeSnapshotModel> implements
GlusterVolumeSnapshotCreatePopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<GlusterVolumeSnapshotModel, GlusterVolumeSnapshotCreatePopupView> {
}
interface ViewUiBinder extends
UiBinder<SimpleDialogPanel, GlusterVolumeSnapshotCreatePopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends
ElementIdHandler<GlusterVolumeSnapshotCreatePopupView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
@UiField
DialogTabPanel tabContainer;
@UiField
DialogTab generalTab;
@UiField
@Path(value = "clusterName.entity")
@WithElementId
StringEntityModelLabelEditor clusterNameEditor;
@UiField
@Path(value = "volumeName.entity")
@WithElementId
StringEntityModelLabelEditor volumeNameEditor;
@UiField(provided = true)
@Ignore
public EntityModelWidgetWithInfo snapshotNameEditorWithInfo;
@Path(value = "snapshotName.entity")
@WithElementId
StringEntityModelTextBoxEditor snapshotNameEditor;
@UiField
@Path(value = "description.entity")
@WithElementId
StringEntityModelTextBoxEditor snapshotDescriptionEditor;
@UiField
@Ignore
@WithElementId
Alert generalTabErrorMsg;
@UiField
DialogTab scheduleTab;
@UiField(provided = true)
@Path(value = "recurrence.selectedItem")
@WithElementId
ListModelListBoxEditor<GlusterVolumeSnapshotScheduleRecurrence> recurrenceEditor;
@UiField
@Path(value = "timeZones.selectedItem")
@WithElementId
ListModelListBoxEditor<Map.Entry<String, String>> timeZoneEditor;
@UiField(provided = true)
@Path(value = "daysOfTheWeek.selectedItem")
@WithElementId
ListModelCheckBoxGroupEditor<DayOfWeek> daysOfWeekEditor;
@UiField
@Path(value = "interval.selectedItem")
@WithElementId
ListModelListBoxEditor<String> intervalEditor;
@UiField
@Path(value = "endByOptions.selectedItem")
@WithElementId
ListModelRadioGroupEditor<EndDateOptions> endByOptionsEditor;
@UiField(provided = true)
@Path(value = "endDate.entity")
@WithElementId
EntityModelDateTimeBoxEditor endDate;
@UiField(provided = true)
@Path(value = "startAt.entity")
@WithElementId
EntityModelDateTimeBoxEditor startAtEditor;
@UiField(provided = true)
@Path(value = "executionTime.entity")
@WithElementId
EntityModelDateTimeBoxEditor executionTimeEditor;
@UiField
@Path(value = "daysOfMonth.selectedItem")
@WithElementId
ListModelDaysOfMonthSelectorEditor daysOfMonthEditor;
@UiField
@Ignore
@WithElementId
Label criticalIntervalLabel;
@UiField
@Ignore
@WithElementId
Alert scheduleTabErrorMessage;
@UiField
@Ignore
@WithElementId
Label disableCliScheduleMessageLabel;
private final Driver driver = GWT.create(Driver.class);
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public GlusterVolumeSnapshotCreatePopupView(EventBus eventBus) {
super(eventBus);
initEditors();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
ViewIdHandler.idHandler.generateAndSetIds(this);
driver.initialize(this);
daysOfWeekEditor.asCheckBoxGroup().clearAllSelections();
}
private void initEditors() {
snapshotNameEditor = new StringEntityModelTextBoxEditor();
snapshotNameEditor.hideLabel();
EnableableFormLabel label = new EnableableFormLabel();
label.setText(constants.volumeSnapshotNamePrefixLabel());
snapshotNameEditorWithInfo = new EntityModelWidgetWithInfo(label, snapshotNameEditor);
snapshotNameEditorWithInfo.setExplanation(templates.italicText(constants.snapshotNameInfo()));
startAtEditor = new EntityModelDateTimeBoxEditor();
startAtEditor.getContentWidget().setDateTimeFormat(GwtBootstrapDateTimePicker.DEFAULT_DATE_TIME_FORMAT);
startAtEditor.getContentWidget().showDateAndTime();
daysOfWeekEditor = new ListModelCheckBoxGroupEditor<>(new AbstractRenderer<DayOfWeek>() {
@Override
public String render(DayOfWeek object) {
return object.toString().substring(0, 3);
}
});
endDate = new EntityModelDateTimeBoxEditor();
endDate.getContentWidget().setDateTimeFormat(GwtBootstrapDateTimePicker.DEFAULT_DATE_TIME_FORMAT);
endDate.getContentWidget().showDateAndTime();
executionTimeEditor = new EntityModelDateTimeBoxEditor();
executionTimeEditor.getContentWidget().setDateTimeFormat("hh:ii");//$NON-NLS-1$
executionTimeEditor.getContentWidget().showTimeOnly();
recurrenceEditor =
new ListModelListBoxEditor<>(new AbstractRenderer<GlusterVolumeSnapshotScheduleRecurrence>() {
@Override
public String render(GlusterVolumeSnapshotScheduleRecurrence object) {
return EnumTranslator.getInstance().translate(object);
}
});
}
@Override
public void edit(final GlusterVolumeSnapshotModel object) {
driver.edit(object);
updateVisibilities(object);
updateTabVisibilities(object);
}
@Override
public void updateVisibilities(GlusterVolumeSnapshotModel object) {
GlusterVolumeSnapshotScheduleRecurrence recurrenceOption = object
.getRecurrence().getSelectedItem();
intervalEditor.setVisible(recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.INTERVAL);
endByOptionsEditor.setVisible(recurrenceOption != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN);
timeZoneEditor.setVisible(recurrenceOption != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN);
daysOfWeekEditor.setVisible(recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.WEEKLY);
daysOfMonthEditor.setVisible(recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.MONTHLY);
startAtEditor.setVisible(recurrenceOption != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN);
executionTimeEditor.setVisible(recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.DAILY
|| recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.WEEKLY
|| recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.MONTHLY);
disableCliScheduleMessageLabel.setVisible(object.getDisableCliSchedule().getEntity()
&& recurrenceOption != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN);
setEndDateVisibility(object);
}
@Override
public void setEndDateVisibility(GlusterVolumeSnapshotModel object) {
endDate.setVisible(object.getRecurrence().getSelectedItem() != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN
&& object.getEndByOptions().getSelectedItem() == EndDateOptions.HasEndDate);
}
@Override
public void setCriticalIntervalLabelVisibility(GlusterVolumeSnapshotModel object, int interval) {
if (object.getRecurrence().getSelectedItem() == GlusterVolumeSnapshotScheduleRecurrence.INTERVAL) {
criticalIntervalLabel.setVisible(interval <= 30);
} else {
criticalIntervalLabel.setVisible(false);
}
}
public void setMessage(String msg, Alert alert) {
alert.setText(msg);
alert.setVisible(!StringUtils.isEmpty(msg));
}
@Override
public void handleValidationErrors(GlusterVolumeSnapshotModel object) {
String generalTabErrors = collectGeneralTabErrors(object);
setMessage(generalTabErrors, generalTabErrorMsg);
String scheduleTabErrors = collectScheduleTabErrors(object);
setMessage(scheduleTabErrors, scheduleTabErrorMessage);
}
private String collectScheduleTabErrors(GlusterVolumeSnapshotModel object) {
StringBuilder scheduleTabErrors = new StringBuilder();
if (!daysOfWeekEditor.isValid()) {
appendErrors(object.getDaysOfTheWeek().getInvalidityReasons(), scheduleTabErrors);
}
if (!daysOfMonthEditor.isValid()) {
appendErrors(object.getDaysOfMonth().getInvalidityReasons(), scheduleTabErrors);
}
if (!endDate.isValid()) {
appendErrors(object.getEndDate().getInvalidityReasons(), scheduleTabErrors);
}
return scheduleTabErrors.toString();
}
private String collectGeneralTabErrors(GlusterVolumeSnapshotModel object) {
StringBuilder generalTabErrorBuilder = new StringBuilder();
if (!snapshotNameEditor.isValid()){
appendErrors(Collections.singletonList(constants.volumeSnapshotNamePrefixLabel()), generalTabErrorBuilder);
appendErrors(object.getSnapshotName().getInvalidityReasons(), generalTabErrorBuilder);
}
return generalTabErrorBuilder.toString();
}
@Override
public void switchTabBasedOnEditorInvalidity() {
if (!clusterNameEditor.isValid() || !volumeNameEditor.isValid() || !snapshotNameEditor.isValid()
|| !snapshotDescriptionEditor.isValid()) {
tabContainer.switchTab(generalTab);
} else if (!recurrenceEditor.isValid() || !intervalEditor.isValid() || !timeZoneEditor.isValid()
|| !startAtEditor.isValid() || !executionTimeEditor.isValid() || !daysOfWeekEditor.isValid()
|| !daysOfMonthEditor.isValid() || !endByOptionsEditor.isValid() || !endDate.isValid()) {
tabContainer.switchTab(scheduleTab);
}
}
private void appendErrors(List<String> errors, StringBuilder sBuilder) {
for(String currentError : errors) {
sBuilder.append(currentError);
sBuilder.append("\n");//$NON-NLS-1$
}
}
private void updateTabVisibilities(GlusterVolumeSnapshotModel object) {
generalTab.setVisible(object.isGeneralTabVisible());
scheduleTab.setVisible(object.isScheduleTabVisible());
if (object.getRecurrence().getSelectedItem() != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN) {
scheduleTab.activate();
}
}
@Override
public GlusterVolumeSnapshotModel flush() {
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
}