package com.evolveum.midpoint.web.component.wizard;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.model.NonEmptyModel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.component.wizard.resource.*;
import com.evolveum.midpoint.web.component.wizard.resource.dto.WizardIssuesDto;
import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.extensions.wizard.*;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author lazyman
*/
public class Wizard extends BasePanel<IWizardModel> implements IWizardModelListener, IWizard {
private static final String ID_FORM = "form";
private static final String ID_HEADER = "header";
private static final String ID_STEPS = "steps";
private static final String ID_VIEW = "view";
private static final String ID_ISSUES = "issues";
private static final String ID_BUTTONS = "buttons";
private static final String ID_AUTO_SAVE_NOTE = "autoSaveNote";
private static final String ID_READ_ONLY_NOTE = "readOnlyNote";
private static final String ID_READ_ONLY_SWITCH = "readOnlySwitch";
@NotNull private final NonEmptyModel<WizardIssuesDto> issuesModel;
public Wizard(String id, IModel<IWizardModel> model, @NotNull NonEmptyModel<WizardIssuesDto> issuesModel) {
super(id, model);
this.issuesModel = issuesModel;
initLayout();
}
protected void initLayout() {
Form form = new Form(ID_FORM);
add(form);
IModel<List<WizardStepDto>> stepsModel = new LoadableModel<List<WizardStepDto>>() {
@Override
protected List<WizardStepDto> load() {
return loadSteps();
}
};
WizardSteps steps = new WizardSteps(ID_STEPS, stepsModel){
@Override
public IWizardStep getActiveStep() {
if(Wizard.this.getModel() != null && Wizard.this.getModel().getObject() != null){
return Wizard.this.getModel().getObject().getActiveStep();
}
return null;
}
@Override
public void changeStepPerformed(AjaxRequestTarget target, WizardStepDto dto) {
changeStep(target, dto);
}
};
steps.setOutputMarkupId(true);
steps.setVisible(hasMoreThanOneStep());
form.add(steps);
WebMarkupContainer header = new WebMarkupContainer(ID_HEADER);
form.add(header);
WebMarkupContainer view = new WebMarkupContainer(ID_VIEW);
form.add(view);
WizardIssuesPanel issuesPanel = new WizardIssuesPanel(ID_ISSUES, issuesModel);
issuesPanel.setOutputMarkupId(true);
form.add(issuesPanel);
WizardButtonBar buttons = new WizardButtonBar(ID_BUTTONS, this);
buttons.setOutputMarkupId(true);
form.add(buttons);
WebMarkupContainer autoSaveNote = new WebMarkupContainer(ID_AUTO_SAVE_NOTE);
autoSaveNote.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
PageResourceWizard wizardPage = (PageResourceWizard) getPageBase();
return !wizardPage.isConfigurationOnly() && !wizardPage.isReadOnly();
}
});
form.add(autoSaveNote);
WebMarkupContainer readOnlyNote = new WebMarkupContainer(ID_READ_ONLY_NOTE);
readOnlyNote.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
PageResourceWizard wizardPage = (PageResourceWizard) getPageBase();
return wizardPage.isReadOnly();
}
});
form.add(readOnlyNote);
readOnlyNote.add(new AjaxFallbackLink<String>(ID_READ_ONLY_SWITCH) {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
PageResourceWizard wizardPage = (PageResourceWizard) getPageBase();
wizardPage.resetModels(); // e.g. to switch configuration models to read-write
wizardPage.setReadOnly(false);
ajaxRequestTarget.add(wizardPage);
}
});
IWizardModel wizard = getWizardModel();
wizard.addListener(this);
wizard.reset();
}
public boolean hasMoreThanOneStep() {
Iterator<IWizardStep> iter = getWizardModel().stepIterator();
if (!iter.hasNext()) {
return false;
}
iter.next();
return iter.hasNext();
}
public WizardIssuesPanel getIssuesPanel() {
return (WizardIssuesPanel) get(createComponentPath(ID_FORM, ID_ISSUES));
}
public Component getSteps() {
return get(createComponentPath(ID_FORM, ID_STEPS));
}
public Component getButtons() {
return get(createComponentPath(ID_FORM, ID_BUTTONS));
}
private List<WizardStepDto> loadSteps() {
List<WizardStepDto> steps = new ArrayList<>();
IWizardModel model = getWizardModel();
Iterator<IWizardStep> iterator = model.stepIterator();
while (iterator.hasNext()) {
IWizardStep step = iterator.next();
if (step instanceof WizardStep) {
WizardStep wizStep = (WizardStep) step;
steps.add(new WizardStepDto(wizStep.getTitle(), wizStep, false, true));
} else {
steps.add(new WizardStepDto("Wizard.unknownStep", null, false, true));
}
}
return steps;
}
@Override
public boolean isVersioned() {
return false;
}
@Override
public IWizardModel getWizardModel() {
IModel<IWizardModel> model = getModel();
return model.getObject();
}
@Override
public void onActiveStepChanged(IWizardStep newStep) {
if(newStep == null){
return;
}
Form form = (Form) get(ID_FORM);
form.replace(newStep.getView(ID_VIEW, this, this));
form.replace(newStep.getHeader(ID_HEADER, this, this));
//mark proper wizard step as current.
int index = 0;
IWizardModel model = getWizardModel();
Iterator<IWizardStep> iterator = model.stepIterator();
while (iterator.hasNext()) {
IWizardStep step = iterator.next();
if (step.equals(newStep)) {
break;
}
index++;
}
WizardSteps steps = (WizardSteps) get(createComponentPath(ID_FORM, ID_STEPS));
IModel<List<WizardStepDto>> stepsModel = steps.getModel();
stepsModel.getObject().get(index).setActive(true);
steps.updateModal();
}
@Override
public void onCancel() {
getPageBase().redirectBack();
//setResponsePage(new PageResources(false));
//warn(getString("Wizard.message.cancel"));
}
@Override
public void onFinish() {
// 'show result' is already done
// if(getModel() != null && getModel().getObject() != null){
// IWizardStep activeStep = getModel().getObject().getActiveStep();
//
// if(activeStep != null){
// OperationResult result = ((WizardStep)activeStep).getResult();
// if (result != null) {
// getPageBase().showResult(result);
// }
// }
// }
getPageBase().redirectBack();
}
private void changeStep(AjaxRequestTarget target, WizardStepDto dto){
IWizardStep newStep = null;
Iterator<IWizardStep> iterator = getWizardModel().stepIterator();
if(dto != null){
if(getString("NameStep.title").equals(dto.getName())){
while(iterator.hasNext()){
IWizardStep step = iterator.next();
if(step instanceof NameStep){
newStep = step;
}
}
} else if(getString("ConfigurationStep.title").equals(dto.getName())){
while(iterator.hasNext()){
IWizardStep step = iterator.next();
if(step instanceof ConfigurationStep){
newStep = step;
}
}
} else if(getString("SchemaStep.title").equals(dto.getName())){
while(iterator.hasNext()){
IWizardStep step = iterator.next();
if(step instanceof SchemaStep){
newStep = step;
}
}
} else if(getString("SchemaHandlingStep.title").equals(dto.getName())){
while(iterator.hasNext()){
IWizardStep step = iterator.next();
if(step instanceof SchemaHandlingStep){
newStep = step;
}
}
} else if(getString("CapabilityStep.title").equals(dto.getName())) {
while(iterator.hasNext()){
IWizardStep step = iterator.next();
if(step instanceof CapabilityStep){
newStep = step;
}
}
} else if(getString("SynchronizationStep.title").equals(dto.getName())){
while(iterator.hasNext()){
IWizardStep step = iterator.next();
if(step instanceof SynchronizationStep){
newStep = step;
}
}
}
}
WizardModel model = (WizardModel) getWizardModel();
IWizardStep currentStep = model.getActiveStep();
currentStep.applyState();
if(currentStep.isComplete()){
model.setActiveStep(newStep);
onActiveStepChanged(newStep);
}
target.add(this, getPageBase().getFeedbackPanel());
}
//
// public boolean noErrors() {
// return !issuesModel.getObject().hasErrors();
// }
}