/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.resource.accesscontrol.ui; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import org.olat.basesecurity.BaseSecurityModule; import org.olat.commons.calendar.CalendarUtils; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; import org.olat.core.gui.components.panel.StackedPanel; import org.olat.core.gui.components.stack.BreadcrumbPanel; import org.olat.core.gui.components.stack.BreadcrumbPanelAware; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.resource.OresHelper; import org.olat.resource.OLATResource; import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.Order; import org.olat.resource.accesscontrol.OrderStatus; import org.olat.resource.accesscontrol.ui.OrdersDataModel.OrderCol; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; import org.springframework.beans.factory.annotation.Autowired; /** * * Description:<br> * Controller to manage the orders, limited or not the an OLAT resource. * * <P> * Initial Date: 30 mai 2011 <br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class OrdersAdminController extends FormBasicController implements Activateable2, BreadcrumbPanelAware { protected static final int USER_PROPS_OFFSET = 500; protected static final String USER_PROPS_ID = OrdersAdminController.class.getCanonicalName(); private static final String CMD_SELECT = "sel"; private StackedPanel mainPanel; private VelocityContainer mainVC; private FlexiTableElement tableEl; private OrdersDataSource dataSource; private OrdersDataModel dataModel; private BreadcrumbPanel stackPanel; private OrdersSearchForm searchForm; private OrderDetailController detailController; private final OLATResource resource; private final boolean isAdministrativeUser; private final List<UserPropertyHandler> userPropertyHandlers; @Autowired private ACService acService; @Autowired private UserManager userManager; @Autowired private AccessControlModule acModule; @Autowired private BaseSecurityModule securityModule; /** * Constructor for the admin. extension * * @param ureq * @param wControl */ public OrdersAdminController(UserRequest ureq, WindowControl wControl) { this(ureq, wControl, null, null); } public OrdersAdminController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, OLATResource resource) { super(ureq, wControl, "order_list"); this.resource = resource; this.stackPanel = stackPanel; Roles roles = ureq.getUserSession().getRoles(); isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles); userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); initForm(ureq); } @Override public void setBreadcrumbPanel(BreadcrumbPanel stackPanel) { this.stackPanel = stackPanel; } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.status, new OrderStatusRenderer())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.orderNr)); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.creationDate)); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.summary)); if(isAdministrativeUser) { columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.username)); } int i=0; for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { int colIndex = USER_PROPS_OFFSET + i++; if (userPropertyHandler == null) continue; String propName = userPropertyHandler.getName(); boolean visible = userManager.isMandatoryUserProperty(USER_PROPS_ID , userPropertyHandler); FlexiColumnModel col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, true, propName); columnsModel.addFlexiColumnModel(col); } columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.methods, new AccessMethodRenderer(acModule))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OrderCol.total)); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.order.details", translate("select"), CMD_SELECT)); dataSource = new OrdersDataSource(acService, resource, null, userPropertyHandlers); if(resource == null) { searchForm = new OrdersSearchForm(ureq, getWindowControl(), mainForm); listenTo(searchForm); formLayout.add("searchForm", searchForm.getInitialFormItem()); Calendar cal = CalendarUtils.getStartOfDayCalendar(getLocale()); cal.add(Calendar.MONTH, -1); searchForm.setFrom(cal.getTime()); dataSource.setFrom(cal.getTime()); } dataModel = new OrdersDataModel(dataSource, getLocale(), userManager, columnsModel); tableEl = uifactory.addTableElement(getWindowControl(), "orderList", dataModel, 25, true, getTranslator(), formLayout); tableEl.setExportEnabled(true); List<FlexiTableFilter> filters = new ArrayList<>(); filters.add(new FlexiTableFilter(translate("order.status.new"), OrderStatus.NEW.name())); filters.add(new FlexiTableFilter(translate("order.status.prepayment"), OrderStatus.PREPAYMENT.name())); filters.add(new FlexiTableFilter(translate("order.status.payed"), OrderStatus.PAYED.name())); filters.add(new FlexiTableFilter(translate("order.status.canceled"), OrderStatus.CANCELED.name())); filters.add(new FlexiTableFilter(translate("order.status.error"), OrderStatus.ERROR.name())); tableEl.setFilters("", filters, false); if(formLayout instanceof FormLayoutContainer) { FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; layoutCont.contextPut("title", translate("orders.admin.my")); layoutCont.contextPut("description", translate("orders.admin.my.desc")); } } @Override protected void formOK(UserRequest ureq) { // } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(source == tableEl) { if(event instanceof SelectionEvent) { SelectionEvent se = (SelectionEvent)event; OrderTableItem row = dataModel.getObject(se.getIndex()); if(CMD_SELECT.equals(se.getCommand())) { doSelectOrder(ureq, row); } } } super.formInnerEvent(ureq, source, event); } protected void doDispose() { // } @Override protected void event(UserRequest ureq, Controller source, Event event) { if (source == searchForm) { if(event == Event.DONE_EVENT) { doSearch(); addSearchToHistory(ureq); } } else if (source == detailController) { if(event == Event.BACK_EVENT) { mainPanel.setContent(mainVC); removeAsListenerAndDispose(detailController); detailController = null; addSearchToHistory(ureq); } } } private void doSearch() { dataSource.setFrom(searchForm.getFrom()); dataSource.setTo(searchForm.getTo()); dataSource.setRefNo(searchForm.getRefNo()); dataSource.reset(); tableEl.reset(true, true, true); } protected void addSearchToHistory(UserRequest ureq) { StateEntry state = searchForm == null ? null : searchForm.getStateEntry(); ContextEntry currentEntry = getWindowControl().getBusinessControl().getCurrentContextEntry(); if(currentEntry != null) { currentEntry.setTransientState(state); } addToHistory(ureq, getWindowControl()); } protected void doSelectOrder(UserRequest ureq, OrderTableItem order) { removeAsListenerAndDispose(detailController); OLATResourceable ores = OresHelper.createOLATResourceableInstance(Order.class, order.getOrderKey()); WindowControl bwControl = addToHistory(ureq, ores, null); detailController = new OrderDetailController(ureq, bwControl, order.getOrderKey()); listenTo(detailController); if(stackPanel == null) { mainPanel.setContent(detailController.getInitialComponent()); } else { detailController.hideBackLink(); stackPanel.pushController(order.getOrderNr(), detailController); } } @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { /* if(state != null) { if(searchForm.setStateEntry(state)) { loadModel(); } } if(entries == null || entries.isEmpty()) return; Long orderKey = entries.get(0).getOLATResourceable().getResourceableId(); OrdersDataModel model = (OrdersDataModel)tableCtr.getTableDataModel(); OrderTableItem order = model.getItem(orderKey); if(order != null) { selectOrder(ureq, order); } */ } }