/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <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> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ package org.olat.admin.user.imp; import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.table.AbstractCSSIconFlexiCellRenderer; 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.FlexiTableDataModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelImpl; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.wizard.BasicStep; import org.olat.core.gui.control.generic.wizard.PrevNextFinishConfig; import org.olat.core.gui.control.generic.wizard.StepFormBasicController; import org.olat.core.gui.control.generic.wizard.StepFormController; import org.olat.core.gui.control.generic.wizard.StepsEvent; import org.olat.core.gui.control.generic.wizard.StepsRunContext; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; import org.springframework.beans.factory.annotation.Autowired; class ImportStep01 extends BasicStep { private static final String usageIdentifyer = UserImportController.class.getCanonicalName(); private static final String[] theKeys = new String[]{ "", "update", "ignore" }; private boolean newUsers; private boolean canCreateOLATPassword; public ImportStep01(UserRequest ureq, boolean canCreateOLATPassword, boolean newUsers) { super(ureq); this.newUsers = newUsers; this.canCreateOLATPassword = canCreateOLATPassword; setI18nTitleAndDescr("step1.description", "step1.short.description"); setNextStep(new ImportStep02(ureq)); } @Override public PrevNextFinishConfig getInitialPrevNextFinishConfig() { return new PrevNextFinishConfig(true, true, true); } @Override public StepFormController getStepController(UserRequest ureq, WindowControl windowControl, StepsRunContext stepsRunContext, Form form) { StepFormController stepI = new ImportStepForm01(ureq, windowControl, form, stepsRunContext); return stepI; } private final class ImportStepForm01 extends StepFormBasicController { private FormLayoutContainer textContainer; private SingleSelection updateEl, updatePasswordEl; private List<UserPropertyHandler> userPropertyHandlers; @Autowired private UserManager userManager; public ImportStepForm01(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) { super(ureq, control, rootForm, runContext, LAYOUT_VERTICAL, null); // use custom translator with fallback to user properties translator setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); flc.setTranslator(getTranslator()); initForm(ureq); } @Override protected void doDispose() { // } @Override protected void formOK(UserRequest ureq) { Boolean updateUsers = Boolean.FALSE; if(updateEl != null && updateEl.isOneSelected() && updateEl.isSelected(1)) { updateUsers = Boolean.TRUE; } addToRunContext("updateUsers", updateUsers); Boolean updatePasswords = Boolean.FALSE; if(updatePasswordEl != null && updatePasswordEl.isOneSelected() && updatePasswordEl.isSelected(1)) { updatePasswords = Boolean.TRUE; } addToRunContext("updatePasswords", updatePasswords); fireEvent(ureq, StepsEvent.ACTIVATE_NEXT); } @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; if(updateEl != null && (!updateEl.isOneSelected() || updateEl.isSelected(0))) { updateEl.setErrorKey("form.mandatory.hover", null); allOk &= false; } if(updatePasswordEl != null && (!updatePasswordEl.isOneSelected() || updatePasswordEl.isSelected(0))) { updatePasswordEl.setErrorKey("form.mandatory.hover", null); allOk &= false; } return allOk & super.validateFormLogic(ureq); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { FormLayoutContainer formLayoutVertical = FormLayoutContainer.createVerticalFormLayout("vertical", getTranslator()); formLayout.add(formLayoutVertical); @SuppressWarnings("unchecked") List<Identity> idents = (List<Identity>) getFromRunContext("idents"); @SuppressWarnings("unchecked") List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) getFromRunContext("updateIdents"); @SuppressWarnings("unchecked") List<TransientIdentity> newIdents = (List<TransientIdentity>) getFromRunContext("newIdents"); textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), velocity_root + "/step1.html"); formLayoutVertical.add(textContainer); int cntall = idents.size(); int cntNew = newIdents.size(); int cntOld = cntall - cntNew; textContainer.contextPut("newusers", newUsers); String overview = getTranslator().translate("import.confirm", new String[] { "" + cntall, "" + cntNew, "" + cntOld }); textContainer.contextPut("overview", overview); textContainer.contextPut("updateusers", updateIdents.isEmpty()); if(!updateIdents.isEmpty()) { String[] theValues = new String[]{ translate("update.select"), translate("update.yes"), translate("update.no") }; updateEl = uifactory .addDropdownSingleselect("update.user", textContainer, theKeys, theValues, null); if(canCreateOLATPassword) { updatePasswordEl = uifactory .addDropdownSingleselect("update.password", textContainer, theKeys, theValues, null); } } FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); int colPos = 0; // add special column with information about whether this user // exists already or not FlexiColumnModel newUserCustomColumnModel = new DefaultFlexiColumnModel("table.user.existing", colPos++); newUserCustomColumnModel.setCellRenderer(new UserNewOldCustomFlexiCellRenderer()); newUserCustomColumnModel.setAlignment(FlexiColumnModel.ALIGNMENT_CENTER); tableColumnModel.addFlexiColumnModel(newUserCustomColumnModel); // fixed fields: tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.login", colPos++)); if (canCreateOLATPassword) { tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.pwd", colPos++)); } tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.lang", colPos++)); // followed by all properties configured // if only mandatory required: check for um.isMandatoryUserProperty(usageIdentifyer, userPropertyHandler); userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true); for (int i = 0; i < userPropertyHandlers.size(); i++) { UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(i); tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++)); } FlexiTableDataModel<Identity> tableDataModel = new FlexiTableDataModelImpl<Identity>(new Model(idents, colPos), tableColumnModel); uifactory.addTableElement(getWindowControl(), "newUsers", tableDataModel, getTranslator(), formLayoutVertical); } } private static class UserNewOldCustomFlexiCellRenderer extends AbstractCSSIconFlexiCellRenderer { @Override protected String getCellValue(Object cellValue) { return ""; } @Override protected String getCssClass(Object cellValue) { if (cellValue instanceof Boolean) { if (((Boolean) cellValue).booleanValue()) { return "o_icon_new"; } else { return "o_icon_warn"; } } return "o_icon_error"; } @Override protected String getHoverText(Object cellValue, Translator translator) { if (cellValue instanceof Boolean) { if (((Boolean) cellValue).booleanValue()) { return translator.translate("import.user.new.alt"); } else { return translator.translate("import.user.existing.alt"); } } return translator.translate("error"); } } }