/* * Copyright (c) 2010-2015 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.reports; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.application.Url; import com.evolveum.midpoint.web.component.BasicSearchPanel; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.ObjectDataProvider; import com.evolveum.midpoint.web.component.data.Table; import com.evolveum.midpoint.web.component.data.column.DoubleButtonColumn; import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.page.admin.configuration.PageAdminConfiguration; import com.evolveum.midpoint.web.page.admin.reports.component.RunReportPopupPanel; import com.evolveum.midpoint.web.page.admin.reports.dto.ReportSearchDto; import com.evolveum.midpoint.web.session.ReportsStorage; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import java.util.ArrayList; import java.util.List; //import com.evolveum.midpoint.report.impl.ReportConstants; /** * @author lazyman */ @PageDescriptor( urls = { @Url(mountUrl = "/admin/reports", matchUrlForSecurity = "/admin/reports") }, action = { @AuthorizationAction(actionUri = PageAdminReports.AUTH_REPORTS_ALL, label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_REPORTS_URL, label = "PageReports.auth.reports.label", description = "PageReports.auth.reports.description")}) public class PageReports extends PageAdminReports { private static final Trace LOGGER = TraceManager.getTrace(PageReports.class); private static final String DOT_CLASS = PageReports.class.getName() + "."; private static final String OPERATION_RUN_REPORT = DOT_CLASS + "runReport"; private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_REPORTS_TABLE = "reportsTable"; private static final String ID_SEARCH_FORM = "searchForm"; private static final String ID_BASIC_SEARCH = "basicSearch"; private static final String ID_SUBREPORTS = "subReportCheckbox"; private static final String ID_TABLE_HEADER = "tableHeader"; private IModel<ReportSearchDto> searchModel; public PageReports() { searchModel = new LoadableModel<ReportSearchDto>() { @Override protected ReportSearchDto load() { ReportsStorage storage = getSessionStorage().getReports(); ReportSearchDto dto = storage.getReportSearch(); if (dto == null) { dto = new ReportSearchDto(); } return dto; } }; initLayout(); } private void initLayout() { Form mainForm = new Form(ID_MAIN_FORM); add(mainForm); ObjectDataProvider provider = new ObjectDataProvider(PageReports.this, ReportType.class); provider.setQuery(createQuery()); BoxedTablePanel table = new BoxedTablePanel(ID_REPORTS_TABLE, provider, initColumns(), UserProfileStorage.TableId.PAGE_REPORTS, (int) getItemsPerPage(UserProfileStorage.TableId.PAGE_REPORTS)) { @Override protected WebMarkupContainer createHeader(String headerId) { return new SearchFragment(headerId, ID_TABLE_HEADER, PageReports.this, searchModel); } }; table.setShowPaging(false); table.setOutputMarkupId(true); mainForm.add(table); } private List<IColumn<ReportType, String>> initColumns() { List<IColumn<ReportType, String>> columns = new ArrayList<IColumn<ReportType, String>>(); IColumn column; column = new LinkColumn<SelectableBean<ReportType>>(createStringResource("PageReports.table.name"), ReportType.F_NAME.getLocalPart(), "value.name") { @Override public void onClick(AjaxRequestTarget target, IModel<SelectableBean<ReportType>> rowModel) { ReportType report = rowModel.getObject().getValue(); if (report != null) { reportTypeFilterPerformed(target, report.getOid()); } } @Override public boolean isEnabled(IModel<SelectableBean<ReportType>> rowModel) { return rowModel.getObject().getValue() != null && rowModel.getObject().getValue().isParent(); } }; columns.add(column); column = new PropertyColumn(createStringResource("PageReports.table.description"), "value.description"); columns.add(column); column = new DoubleButtonColumn<SelectableBean<ReportType>>(new Model(), null) { @Override public String getFirstCap() { return PageReports.this.createStringResource("PageReports.button.run").getString(); } @Override public String getSecondCap() { return PageReports.this.createStringResource("PageReports.button.configure").getString(); } @Override public String getFirstColorCssClass() { if (getRowModel().getObject().getValue() != null && getRowModel().getObject().getValue().isParent()) { return BUTTON_COLOR_CLASS.PRIMARY.toString(); } else { return BUTTON_COLOR_CLASS.PRIMARY.toString() + " " + BUTTON_DISABLED; } } @Override public void firstClicked(AjaxRequestTarget target, IModel<SelectableBean<ReportType>> model) { runReportPerformed(target, model.getObject().getValue()); } @Override public void secondClicked(AjaxRequestTarget target, IModel<SelectableBean<ReportType>> model) { configurePerformed(target, model.getObject().getValue()); } @Override public boolean isFirstButtonEnabled(IModel<SelectableBean<ReportType>> rowModel) { return getRowModel().getObject().getValue() != null && rowModel.getObject().getValue().isParent(); } }; columns.add(column); return columns; } private void reportTypeFilterPerformed(AjaxRequestTarget target, String oid) { PageParameters params = new PageParameters(); params.add(OnePageParameterEncoder.PARAMETER, oid); navigateToNext(PageCreatedReports.class, params); } protected void runReportPerformed(AjaxRequestTarget target, ReportType report) { RunReportPopupPanel runReportPopupPanel = new RunReportPopupPanel(getMainPopupBodyId(), report) { private static final long serialVersionUID = 1L; protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType, PrismContainer<ReportParameterType> reportParam) { OperationResult result = new OperationResult(OPERATION_RUN_REPORT); try { Task task = createSimpleTask(OPERATION_RUN_REPORT); getReportManager().runReport(reportType.asPrismObject(), reportParam, task, result); } catch (Exception ex) { result.recordFatalError(ex); } finally { result.computeStatusIfUnknown(); } showResult(result); target.add(getFeedbackPanel(), get(createComponentPath(ID_MAIN_FORM))); hideMainPopup(target); }; }; showMainPopup(runReportPopupPanel, target); } private void configurePerformed(AjaxRequestTarget target, ReportType report) { PageParameters params = new PageParameters(); params.add(OnePageParameterEncoder.PARAMETER, report.getOid()); navigateToNext(PageReport.class, params); } private ObjectDataProvider getDataProvider() { DataTable table = getReportTable().getDataTable(); return (ObjectDataProvider) table.getDataProvider(); } private Table getReportTable() { return (Table) get(createComponentPath(ID_MAIN_FORM, ID_REPORTS_TABLE)); } private void searchPerformed(AjaxRequestTarget target) { ObjectQuery query = createQuery(); ObjectDataProvider provider = getDataProvider(); provider.setQuery(query); ReportsStorage storage = getSessionStorage().getReports(); storage.setReportSearch(searchModel.getObject()); storage.setPaging(null); Table table = getReportTable(); table.setCurrentPage(null); target.add((Component) table); target.add(getFeedbackPanel()); } private ObjectQuery createQuery() { ReportSearchDto dto = searchModel.getObject(); String text = dto.getText(); Boolean parent = !dto.isParent(); S_AtomicFilterEntry q = QueryBuilder.queryFor(ReportType.class, getPrismContext()); if (StringUtils.isNotEmpty(text)) { PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); String normalizedText = normalizer.normalize(text); q = q.item(ReportType.F_NAME).eqPoly(normalizedText).matchingNorm().and(); } if (parent) { q = q.item(ReportType.F_PARENT).eq(true).and(); } return q.all().build(); } private void clearSearchPerformed(AjaxRequestTarget target) { searchModel.setObject(new ReportSearchDto()); Table panel = getReportTable(); DataTable table = panel.getDataTable(); ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider(); provider.setQuery(createQuery()); ReportsStorage storage = getSessionStorage().getReports(); storage.setReportSearch(searchModel.getObject()); storage.setPaging(null); panel.setCurrentPage(null); target.add((Component) panel); } // private void initRunReportModal() { // ModalWindow window = createModalWindow(MODAL_ID_RUN_REPORT, // createStringResource("Run report"), 1100, 560); // window.setContent(new RunReportPopupPanel(window.getContentId()) { // // @Override // protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType, PrismContainer<ReportParameterType> params) { // runReportPerformed(target, reportType, params); // } // }); // add(window); // window.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { // // @Override // public void onClose(AjaxRequestTarget target) { // target.appendJavaScript("$('.wicket-aa-container').remove();"); // } // }); // } // private void showRunReportPopup(AjaxRequestTarget target, ReportType reportType) { // ModalWindow modal = (ModalWindow) get(MODAL_ID_RUN_REPORT); // RunReportPopupPanel content = (RunReportPopupPanel) modal.get(modal.getContentId()); //// ReportDto reportDto = new ReportDto() // content.setReportType(reportType); //// ModalWindow window = (ModalWindow) get(MODAL_ID_RUN_REPORT); // modal.show(target); // target.add(getFeedbackPanel()); //// showModalWindow(MODAL_ID_RUN_REPORT, target); //// target.add(getFeedbackPanel()); // } private static class SearchFragment extends Fragment { public SearchFragment(String id, String markupId, MarkupContainer markupProvider, IModel<ReportSearchDto> model) { super(id, markupId, markupProvider, model); initLayout(); } private void initLayout() { final Form searchForm = new Form(ID_SEARCH_FORM); add(searchForm); searchForm.setOutputMarkupId(true); final IModel<ReportSearchDto> model = (IModel) getDefaultModel(); BasicSearchPanel<ReportSearchDto> basicSearch = new BasicSearchPanel<ReportSearchDto>(ID_BASIC_SEARCH, model) { @Override protected IModel<String> createSearchTextModel() { return new PropertyModel<>(model, ReportSearchDto.F_SEARCH_TEXT); } @Override protected void searchPerformed(AjaxRequestTarget target) { PageReports page = (PageReports) getPage(); page.searchPerformed(target); } @Override protected void clearSearchPerformed(AjaxRequestTarget target) { PageReports page = (PageReports) getPage(); page.clearSearchPerformed(target); } }; searchForm.add(basicSearch); CheckBox showSubreports = new CheckBox(ID_SUBREPORTS, new PropertyModel(model, ReportSearchDto.F_PARENT)); showSubreports.add(createFilterAjaxBehaviour()); searchForm.add(showSubreports); } private AjaxFormComponentUpdatingBehavior createFilterAjaxBehaviour() { return new AjaxFormComponentUpdatingBehavior("change") { @Override protected void onUpdate(AjaxRequestTarget target) { PageReports page = (PageReports) getPage(); page.searchPerformed(target); } }; } } }