/* * Copyright 2012 Red Hat, Inc. and/or its affiliates. * * 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 org.drools.workbench.screens.guided.dtable.client.widget.auditlog; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.cellview.client.SimplePager; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.ListDataProvider; import org.drools.workbench.models.datamodel.auditlog.AuditLog; import org.drools.workbench.models.datamodel.auditlog.AuditLogEntry; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants; import org.guvnor.common.services.shared.security.AppRoles; import org.gwtbootstrap3.client.ui.CheckBox; import org.gwtbootstrap3.client.ui.Column; import org.gwtbootstrap3.client.ui.Label; import org.gwtbootstrap3.client.ui.Pagination; import org.gwtbootstrap3.client.ui.Row; import org.gwtbootstrap3.client.ui.constants.ColumnSize; import org.gwtbootstrap3.client.ui.constants.ModalBackdrop; import org.gwtbootstrap3.client.ui.constants.Styles; import org.gwtbootstrap3.client.ui.gwt.CellTable; import org.jboss.errai.security.shared.api.RoleImpl; import org.jboss.errai.security.shared.api.identity.User; import org.uberfire.ext.widgets.common.client.common.popups.BaseModal; import org.uberfire.ext.widgets.common.client.common.popups.footers.ModalFooterOKButton; /** * The AuditLog View implementation */ public class AuditLogViewImpl extends BaseModal implements AuditLogView { private final AuditLog auditLog; /** * The page size constant value. */ private static final int PAGE_SIZE = 4; @UiField Row eventTypes; @UiField Row eventsContainer; @UiField Pagination cellTablePagination; private SimplePager pager = new SimplePager(); private CellTable<AuditLogEntry> events; private ListDataProvider<AuditLogEntry> dlp; /** * Custom styles for audit log cell table. * <p/> * NOTE: BZ-996942 */ public interface AuditLogStyle extends CssResource { String eventTypesTitle(); String eventsContainerInline(); String auditLogDetailLabel(); String auditLogDetailValue(); } @UiField AuditLogStyle style; //The current user's security context (admins can see all records) private final User identity; interface AuditLogViewImplBinder extends UiBinder<Widget, AuditLogViewImpl> { } private static AuditLogViewImplBinder uiBinder = GWT.create(AuditLogViewImplBinder.class); public AuditLogViewImpl(final AuditLog auditLog, final User identity) { this.auditLog = auditLog; this.identity = identity; setTitle(GuidedDecisionTableConstants.INSTANCE.DecisionTableAuditLog()); setDataBackdrop(ModalBackdrop.STATIC); setDataKeyboard(true); setFade(true); setRemoveOnHide(true); setWidth(1000 + "px"); setBody(uiBinder.createAndBindUi(AuditLogViewImpl.this)); add(new ModalFooterOKButton(this::hide)); setup(); } @Override public void show() { refreshDataProvider(); super.show(); } void refreshDataProvider() { dlp.setList(filterDeletedEntries(auditLog)); } public void setup() { // BZ-996917: Use a the gwtboostrap style "row-fluid" to allow display some events in the same row. eventTypes.setStyleName(Styles.ROW); // Fill panel with available events. for (Map.Entry<String, Boolean> e : auditLog.getAuditLogFilter().getAcceptedTypes().entrySet()) { eventTypes.add(makeEventTypeCheckBox(e.getKey(), e.getValue())); } // Create the GWT Cell Table as events container. // BZ-996942: Set custom width and table css style. events = new CellTable<>(); events.setWidth("100%"); events.addStyleName(Styles.TABLE); dlp = new ListDataProvider<AuditLogEntry>() { @Override public void setList(final List<AuditLogEntry> listToWrap) { super.setList(listToWrap); cellTablePagination.rebuild(pager); } }; dlp.addDataDisplay(events); AuditLogEntrySummaryColumn summaryColumn = new AuditLogEntrySummaryColumn(style.auditLogDetailLabel(), style.auditLogDetailValue()); AuditLogEntryCommentColumn commentColumn = new AuditLogEntryCommentColumn(); events.addColumn(summaryColumn); events.addColumn(commentColumn); events.setColumnWidth(summaryColumn, 60.0, Unit.PCT); events.setColumnWidth(commentColumn, 40.0, Unit.PCT); //If the current user is not an Administrator include the delete comment column if (identity.getRoles().contains(new RoleImpl(AppRoles.ADMIN.getName()))) { AuditLogEntryDeleteCommentColumn deleteCommentColumn = new AuditLogEntryDeleteCommentColumn(); deleteCommentColumn.setFieldUpdater((int index, AuditLogEntry row, SafeHtml value) -> { row.setDeleted(true); dlp.setList(filterDeletedEntries(auditLog)); dlp.refresh(); }); events.addColumn(deleteCommentColumn); events.setColumnWidth(commentColumn, 35.0, Unit.PCT); events.setColumnWidth(deleteCommentColumn, 5.0, Unit.PCT); } events.setEmptyTableWidget(new Label(GuidedDecisionTableConstants.INSTANCE.DecisionTableAuditLogNoEntries())); events.setKeyboardPagingPolicy(KeyboardPagingPolicy.CHANGE_PAGE); events.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED); events.setPageSize(PAGE_SIZE); // Configure the simple pager. pager.setDisplay(events); pager.setPageSize(PAGE_SIZE); // Add the table to the container. eventsContainer.add(events); } private Widget makeEventTypeCheckBox(final String eventType, final Boolean isEnabled) { final CheckBox chkEventType = new CheckBox(AuditLogEntryCellHelper.getEventTypeDisplayText(eventType)); chkEventType.setValue(Boolean.TRUE.equals(isEnabled)); chkEventType.addValueChangeHandler((ValueChangeEvent<Boolean> event) -> { auditLog.getAuditLogFilter().getAcceptedTypes().put(eventType, event.getValue()); }); // BZ-996942: Use one column layout. chkEventType.setWordWrap(false); return new Column(ColumnSize.MD_2) {{ add(chkEventType); }}; } private List<AuditLogEntry> filterDeletedEntries(final List<AuditLogEntry> entries) { if (!identity.getRoles().contains(new RoleImpl(AppRoles.ADMIN.getName()))) { return entries; } final List<AuditLogEntry> filteredEntries = new ArrayList<>(); final Iterator<AuditLogEntry> i = entries.iterator(); while (i.hasNext()) { final AuditLogEntry entry = i.next(); if (!entry.isDeleted()) { filteredEntries.add(entry); } } return filteredEntries; } }