/*
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.web.page.admin.server;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.TabbedPanel;
import com.evolveum.midpoint.web.component.form.Form;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import java.util.ArrayList;
import java.util.List;
/**
* @author semancik
*
*/
public class TaskMainPanel extends Panel {
private static final String ID_MAIN_FORM = "mainForm";
private static final String ID_TAB_PANEL = "tabPanel";
private static final String ID_BUTTON_PANEL = "buttonPanel";
private static final String ID_EDIT = "edit";
private static final String ID_BACK = "back";
private static final String ID_CANCEL_EDITING = "cancelEditing";
private static final String ID_SAVE = "save";
private static final String ID_SUSPEND = "suspend";
private static final String ID_RESUME = "resume";
private static final String ID_RUN_NOW = "runNow";
private static final String ID_STOP_APPROVAL = "stopApproval";
private static final Trace LOGGER = TraceManager.getTrace(TaskMainPanel.class);
private final LoadableModel<ObjectWrapper<TaskType>> objectModel;
private final IModel<TaskDto> taskDtoModel;
private final IModel<Boolean> showAdvancedFeaturesModel;
private final PageTaskEdit parentPage;
public TaskMainPanel(String id, LoadableModel<ObjectWrapper<TaskType>> objectModel, IModel<TaskDto> taskDtoModel,
IModel<Boolean> showAdvancedFeaturesModel, PageTaskEdit parentPage) {
super(id, objectModel);
this.objectModel = objectModel;
this.taskDtoModel = taskDtoModel;
this.showAdvancedFeaturesModel = showAdvancedFeaturesModel;
this.parentPage = parentPage;
initLayout();
}
private void initLayout() {
Form mainForm = new Form<>(ID_MAIN_FORM, true);
add(mainForm);
initTabPanel(mainForm);
initButtons(mainForm);
}
protected void initTabPanel(Form mainForm) {
List<ITab> tabs = createTabs();
TabbedPanel<ITab> tabPanel = WebComponentUtil.createTabPanel(ID_TAB_PANEL, parentPage, tabs, new TabbedPanel.RightSideItemProvider() {
@Override
public Component createRightSideItem(String id) {
VisibleEnableBehaviour boxEnabled = new VisibleEnableBehaviour() {
@Override
public boolean isEnabled() {
return !parentPage.isEdit();
}
};
TaskShowAdvancedFeaturesPanel advancedFeaturesPanel = new TaskShowAdvancedFeaturesPanel(id, showAdvancedFeaturesModel, boxEnabled) {
@Override
protected void onAdvancedFeaturesUpdate(AjaxRequestTarget target) {
target.add(getTabPanel());
target.add(getButtonPanel());
// we DO NOT call parentPage.refresh here because in edit mode this would erase any model changes
// (well, because - for some strange reasons - even this code erases name and description input fields
// occassionally, we hide 'advanced features' checkbox in editing mode)
}
};
advancedFeaturesPanel.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return parentPage.getTaskDto().isWorkflow(); // we don't distinguish between basic/advanced features for other task types yet
}
});
return advancedFeaturesPanel;
}
});
mainForm.add(tabPanel);
}
protected List<ITab> createTabs() {
List<ITab> tabs = new ArrayList<>();
final TaskTabsVisibility visibility = new TaskTabsVisibility();
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.basic")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskBasicTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeBasicVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.scheduleTitle")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskSchedulingTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeSchedulingVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.subtasksAndThreads")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskSubtasksAndThreadsTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeSubtasksAndThreadsVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.progress")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskProgressTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeProgressVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.performance")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskPerformanceTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeEnvironmentalPerformanceVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.approvals")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskApprovalsTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeApprovalsVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.operation")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskOperationTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeOperationVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.result")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskResultTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeResultVisible(parentPage);
}
});
tabs.add(
new AbstractTab(parentPage.createStringResource("pageTaskEdit.errors")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
return new TaskErrorsTabPanel(panelId, getMainForm(), objectModel, taskDtoModel, parentPage);
}
@Override
public boolean isVisible() {
return visibility.computeErrorsVisible(parentPage);
}
});
return tabs;
}
public Form getMainForm() {
return (Form) get(ID_MAIN_FORM);
}
public TabbedPanel<ITab> getTabPanel() {
return (TabbedPanel<ITab>) getMainForm().get(ID_TAB_PANEL);
}
public WebMarkupContainer getButtonPanel() {
return (WebMarkupContainer) getMainForm().get(ID_BUTTON_PANEL);
}
private void initButtons(Form mainForm) {
WebMarkupContainer buttonPanel = new WebMarkupContainer(ID_BUTTON_PANEL);
buttonPanel.setOutputMarkupId(true);
mainForm.add(buttonPanel);
final TaskButtonsVisibility visibility = new TaskButtonsVisibility();
AjaxButton backButton = new AjaxButton(ID_BACK, parentPage.createStringResource("pageTaskEdit.button.back")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.getController().backPerformed(target);
}
};
backButton.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeBackVisible(parentPage);
}
});
buttonPanel.add(backButton);
AjaxButton cancelEditingButton = new AjaxButton(ID_CANCEL_EDITING, parentPage.createStringResource("pageTaskEdit.button.cancelEditing")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.getController().cancelEditingPerformed(target);
}
};
cancelEditingButton.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeCancelEditVisible(parentPage);
}
});
buttonPanel.add(cancelEditingButton);
AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_SAVE, parentPage.createStringResource("pageTaskEdit.button.save")) {
@Override
protected void onSubmit(AjaxRequestTarget target, org.apache.wicket.markup.html.form.Form<?> form) {
parentPage.getController().savePerformed(target);
}
@Override
protected void onError(AjaxRequestTarget target, org.apache.wicket.markup.html.form.Form<?> form) {
target.add(parentPage.getFeedbackPanel());
}
};
saveButton.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeSaveVisible(parentPage);
}
});
mainForm.setDefaultButton(saveButton);
buttonPanel.add(saveButton);
AjaxButton editButton = new AjaxButton(ID_EDIT, parentPage.createStringResource("pageTaskEdit.button.edit")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.setEdit(true);
parentPage.refresh(target); // stops refreshing as well
target.add(getMainForm());
}
};
editButton.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeEditVisible(parentPage);
}
});
buttonPanel.add(editButton);
AjaxButton suspend = new AjaxButton(ID_SUSPEND, parentPage.createStringResource("pageTaskEdit.button.suspend")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.getController().suspendPerformed(target);
}
};
suspend.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeSuspendVisible(parentPage);
}
});
buttonPanel.add(suspend);
AjaxButton resume = new AjaxButton(ID_RESUME, parentPage.createStringResource("pageTaskEdit.button.resume")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.getController().resumePerformed(target);
}
};
resume.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeResumeVisible(parentPage);
}
});
buttonPanel.add(resume);
AjaxButton runNow = new AjaxButton(ID_RUN_NOW, parentPage.createStringResource("pageTaskEdit.button.runNow")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.getController().runNowPerformed(target);
}
};
runNow.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeRunNowVisible(parentPage);
}
});
buttonPanel.add(runNow);
AjaxButton stopApproval = new AjaxButton(ID_STOP_APPROVAL, parentPage.createStringResource("pageTaskEdit.button.stopApprovalProcess")) {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.getController().stopApprovalProcessPerformed(target);
}
};
stopApproval.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return visibility.computeStopVisible(parentPage);
}
});
buttonPanel.add(stopApproval);
}
}