From 9b7570fecff000b1739d0b0662fa8d20a096da44 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 7 Sep 2012 18:08:09 +0200
Subject: [PATCH] OO-291: wizard to import users in a course

---
 .../member/AbstractMemberListController.java  | 16 +++-
 ...ler.java => EditMembershipController.java} | 39 +++++++---
 .../member/MembersOverviewController.java     | 50 ++++++++++++
 .../course/member/_content/edit_member.html   |  5 +-
 .../member/_content/members_overview.html     |  8 ++
 .../member/_i18n/LocalStrings_de.properties   |  3 +
 .../ImportMemberByUsernamesController.java    | 69 +++++++++++++++++
 .../wizard/ImportMemberMailController.java    | 66 ++++++++++++++++
 ...ortMemberOverviewIdentitiesController.java | 77 +++++++++++++++++++
 ...mportMemberPermissionChoiceController.java | 68 ++++++++++++++++
 .../ImportMember_1_ChooseMemberStep.java      | 53 +++++++++++++
 ...mportMember_2_ConfirmMemberChoiceStep.java | 53 +++++++++++++
 .../ImportMember_3_ChoosePermissionStep.java  | 58 ++++++++++++++
 .../wizard/ImportMember_4_MailStep.java       | 52 +++++++++++++
 .../wizard/_content/confirm_identities.html   |  1 +
 .../wizard/_content/edit_permissions.html     |  0
 .../wizard/_i18n/LocalStrings_de.properties   |  7 ++
 17 files changed, 611 insertions(+), 14 deletions(-)
 rename src/main/java/org/olat/course/member/{EditMemberController.java => EditMembershipController.java} (89%)
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMemberMailController.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMemberPermissionChoiceController.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMember_1_ChooseMemberStep.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMember_2_ConfirmMemberChoiceStep.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMember_3_ChoosePermissionStep.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/ImportMember_4_MailStep.java
 create mode 100644 src/main/java/org/olat/course/member/wizard/_content/confirm_identities.html
 create mode 100644 src/main/java/org/olat/course/member/wizard/_content/edit_permissions.html
 create mode 100644 src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties

diff --git a/src/main/java/org/olat/course/member/AbstractMemberListController.java b/src/main/java/org/olat/course/member/AbstractMemberListController.java
index 3e3fb77952d..e9d6db42e92 100644
--- a/src/main/java/org/olat/course/member/AbstractMemberListController.java
+++ b/src/main/java/org/olat/course/member/AbstractMemberListController.java
@@ -72,7 +72,8 @@ import org.olat.user.UserManager;
 public abstract class AbstractMemberListController extends BasicController {
 	
 	public static final String TABLE_ACTION_EDIT = "tbl_edit";
-	public static final String TABLE_ACTION_REMOVE = "tbl_REMOVE";
+	public static final String TABLE_ACTION_MAIL = "tbl_mail";
+	public static final String TABLE_ACTION_REMOVE = "tbl_remove";
 	
 	protected final MemberListTableModel memberListModel;
 	protected final TableController memberListCtr;
@@ -80,7 +81,7 @@ public abstract class AbstractMemberListController extends BasicController {
 	
 	private DialogBoxController leaveDialogBox;
 	protected CloseableModalController cmc;
-	private EditMemberController editMemberCtrl;
+	private EditMembershipController editMemberCtrl;
 
 	private final UserManager userManager;
 	private final RepositoryEntry repoEntry;
@@ -109,8 +110,13 @@ public abstract class AbstractMemberListController extends BasicController {
 		int numOfColumns = initColumns();
 		memberListModel = new MemberListTableModel(numOfColumns);
 		memberListCtr.setTableDataModel(memberListModel);
+		memberListCtr.setMultiSelect(true);
+		memberListCtr.addMultiSelectAction("table.header.edit", TABLE_ACTION_EDIT);
+		memberListCtr.addMultiSelectAction("table.header.mail", TABLE_ACTION_MAIL);
+		memberListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_REMOVE);
 
 		mainVC.put("memberList", memberListCtr.getInitialComponent());
+		
 		putInitialPanel(mainVC);
 	}
 	
@@ -156,6 +162,10 @@ public abstract class AbstractMemberListController extends BasicController {
 				List<MemberView> selectedItems = memberListModel.getObjects(te.getSelection());
 				if(TABLE_ACTION_REMOVE.equals(te.getAction())) {
 					confirmDelete(ureq, selectedItems);
+				} else if(TABLE_ACTION_EDIT.equals(te.getAction())) {
+					//TODO
+				}if(TABLE_ACTION_MAIL.equals(te.getAction())) {
+					//TODO
 				}
 			}
 		} else if (source == leaveDialogBox) {
@@ -208,7 +218,7 @@ public abstract class AbstractMemberListController extends BasicController {
 	
 	protected void openEdit(UserRequest ureq, MemberView member) {
 		Identity identity = securityManager.loadIdentityByKey(member.getIdentityKey());
-		editMemberCtrl = new EditMemberController(ureq, getWindowControl(), identity, repoEntry);
+		editMemberCtrl = new EditMembershipController(ureq, getWindowControl(), identity, repoEntry);
 		listenTo(editMemberCtrl);
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), editMemberCtrl.getInitialComponent(),
 				true, translate("edit.member"));
diff --git a/src/main/java/org/olat/course/member/EditMemberController.java b/src/main/java/org/olat/course/member/EditMembershipController.java
similarity index 89%
rename from src/main/java/org/olat/course/member/EditMemberController.java
rename to src/main/java/org/olat/course/member/EditMembershipController.java
index fc35be8ecd8..e24a300ca52 100644
--- a/src/main/java/org/olat/course/member/EditMemberController.java
+++ b/src/main/java/org/olat/course/member/EditMembershipController.java
@@ -30,6 +30,7 @@ import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
+import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.form.flexible.impl.elements.MultipleSelectionElementImpl;
@@ -56,11 +57,11 @@ import org.olat.repository.model.RepositoryEntryMembership;
  * 
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-public class EditMemberController extends FormBasicController {
+public class EditMembershipController extends FormBasicController {
 	
 	private EditMemberTableDataModel tableDataModel;
 	private MultipleSelectionElement repoRightsEl;
-	private final MemberInfoController infoController;
+	private MemberInfoController infoController;
 	
 	private static final String[] repoRightsKeys = {"owner", "tutor", "participant"};
 	
@@ -75,7 +76,7 @@ public class EditMemberController extends FormBasicController {
 	private static final String[] keys = new String[] { "ison" };
 	private static final String[] values = new String[] {""};
 	
-	public EditMemberController(UserRequest ureq, WindowControl wControl, Identity member,
+	public EditMembershipController(UserRequest ureq, WindowControl wControl, Identity member,
 			RepositoryEntry repoEntry) {
 		super(ureq, wControl, "edit_member");
 		this.member = member;
@@ -90,11 +91,27 @@ public class EditMemberController extends FormBasicController {
 		loadModel(member);
 	}
 	
+	public EditMembershipController(UserRequest ureq, WindowControl wControl, List<Identity> members,
+			RepositoryEntry repoEntry, Form rootForm) {
+		super(ureq, wControl, LAYOUT_CUSTOM, "edit_member", rootForm);
+		
+		this.member = null;
+		this.repoEntry = repoEntry;
+		repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class);
+		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
+		
+		memberships = Collections.emptyList();
+
+		initForm(ureq);
+		loadModel(member);
+	}
+	
 	private void loadModel(Identity member) {
 		List<BusinessGroupView> groups = businessGroupService.findBusinessGroupViews(null, repoEntry.getOlatResource(), 0, -1);
 		List<Long> businessGroupKeys = PersistenceHelper.toKeys(groups);
 		
-		groupMemberships = businessGroupService.getBusinessGroupMembership(businessGroupKeys, member);
+		groupMemberships = member == null ?
+				Collections.<BusinessGroupMembership>emptyList() : businessGroupService.getBusinessGroupMembership(businessGroupKeys, member);
 		List<MemberOption> options = new ArrayList<MemberOption>();
 		for(BusinessGroupView group:groups) {
 			MemberOption option = new MemberOption(group);
@@ -122,7 +139,9 @@ public class EditMemberController extends FormBasicController {
 		
 		if(formLayout instanceof FormLayoutContainer) {
 			FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
-			layoutCont.put("infos", infoController.getInitialComponent());
+			if(infoController != null) {
+				layoutCont.put("infos", infoController.getInitialComponent());
+			}
 
 			String title = translate("edit.member.title", new String[]{ repoEntry.getDisplayname() });
 			layoutCont.contextPut("editTitle", title);
@@ -133,10 +152,12 @@ public class EditMemberController extends FormBasicController {
 				translate("role.owner"), translate("role.tutor"), translate("role.participant")
 		};
 		repoRightsEl = uifactory.addCheckboxesVertical("repoRights", formLayout, repoRightsKeys, repoValues, null, 1);
-		RepoPermission repoPermission = PermissionHelper.getPermission(repoEntry, member, memberships);
-		repoRightsEl.select("owner", repoPermission.isOwner());
-		repoRightsEl.select("tutor", repoPermission.isTutor());
-		repoRightsEl.select("participant", repoPermission.isParticipant());
+		if(member != null) {
+			RepoPermission repoPermission = PermissionHelper.getPermission(repoEntry, member, memberships);
+			repoRightsEl.select("owner", repoPermission.isOwner());
+			repoRightsEl.select("tutor", repoPermission.isTutor());
+			repoRightsEl.select("participant", repoPermission.isParticipant());
+		}
 
 		//group rights
 		FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java
index c873b22b64d..f840cee4339 100644
--- a/src/main/java/org/olat/course/member/MembersOverviewController.java
+++ b/src/main/java/org/olat/course/member/MembersOverviewController.java
@@ -21,6 +21,8 @@ package org.olat.course.member;
 
 import java.util.List;
 
+import org.olat.collaboration.CollaborationTools;
+import org.olat.collaboration.CollaborationToolsFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -30,16 +32,24 @@ import org.olat.core.gui.components.segmentedview.SegmentViewComponent;
 import org.olat.core.gui.components.segmentedview.SegmentViewEvent;
 import org.olat.core.gui.components.segmentedview.SegmentViewFactory;
 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.controller.BasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
+import org.olat.core.gui.control.generic.wizard.Step;
+import org.olat.core.gui.control.generic.wizard.StepRunnerCallback;
+import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.resource.OresHelper;
+import org.olat.course.member.wizard.ImportMember_1_ChooseMemberStep;
+import org.olat.group.BusinessGroup;
+import org.olat.group.ui.wizard.BGConfigBusinessGroup;
 import org.olat.repository.RepositoryEntry;
 import org.olat.util.logging.activity.LoggingResourceable;
 
@@ -60,6 +70,9 @@ public class MembersOverviewController extends BasicController implements Activa
 	private MemberListController tutorsCtrl;
 	private MemberListController participantsCtrl;
 	private MemberListController waitingCtrl;
+	private final Link importMemberLink, addMemberLink;
+	
+	private StepsMainRunController importMembersWizard;
 	
 	private final RepositoryEntry repoEntry;
 	
@@ -84,6 +97,13 @@ public class MembersOverviewController extends BasicController implements Activa
 		segmentView.addSegment(searchLink, false);
 		
 		updateAllMembers(ureq);
+		
+		addMemberLink = LinkFactory.createButton("add.member", mainVC, this);
+		mainVC.put("addMembers", addMemberLink);
+		importMemberLink = LinkFactory.createButton("import.member", mainVC, this);
+		mainVC.put("importMembers", importMemberLink);
+		
+		
 		putInitialPanel(mainVC);
 	}
 	
@@ -116,8 +136,38 @@ public class MembersOverviewController extends BasicController implements Activa
 			} else if (clickedLink == searchLink) {
 				updateSearch(ureq);
 			}
+		} else if (source == addMemberLink) {
+			
+		} else if (source == importMemberLink) {
+			doImportMembers(ureq);
 		}
 	}
+
+	@Override
+	protected void event(UserRequest ureq, Controller source, Event event) {
+		if(source == importMembersWizard) {
+			System.out.println("Import!!!");
+		}
+		super.event(ureq, source, event);
+	}
+
+	private void doImportMembers(UserRequest ureq) {
+		removeAsListenerAndDispose(importMembersWizard);
+
+		Step start = new ImportMember_1_ChooseMemberStep(ureq, repoEntry);
+		StepRunnerCallback finish = new StepRunnerCallback() {
+			@Override
+			public Step execute(UserRequest ureq, WindowControl wControl, StepsRunContext runContext) {
+				//configuration
+				System.out.println("Import!!!");
+				return StepsMainRunController.DONE_MODIFIED;
+			}
+		};
+		
+		importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null, translate("import.member"));
+		listenTo(importMembersWizard);
+		getWindowControl().pushAsModalDialog(importMembersWizard.getInitialComponent());
+	}
 	
 	private MemberListController updateAllMembers(UserRequest ureq) {
 		if(allMemberListCtrl == null) {
diff --git a/src/main/java/org/olat/course/member/_content/edit_member.html b/src/main/java/org/olat/course/member/_content/edit_member.html
index a56efbc2c6e..9e5adaf9af4 100644
--- a/src/main/java/org/olat/course/member/_content/edit_member.html
+++ b/src/main/java/org/olat/course/member/_content/edit_member.html
@@ -1,5 +1,6 @@
-$r.render("infos")
-
+#if($r.available("infos"))
+	$r.render("infos")
+#end
 <h4>$editTitle</h4>
 $r.render("repoRights")
 <h5>$r.translate("edit.member.groups")</h5>
diff --git a/src/main/java/org/olat/course/member/_content/members_overview.html b/src/main/java/org/olat/course/member/_content/members_overview.html
index b57b8ffe749..77bd534159b 100644
--- a/src/main/java/org/olat/course/member/_content/members_overview.html
+++ b/src/main/java/org/olat/course/member/_content/members_overview.html
@@ -1,3 +1,11 @@
+<div class="o_buttons_box_right">
+	#if($r.available("addMembers"))
+		$r.render("addMembers")
+	#end
+	#if($r.available("importMembers"))
+		$r.render("importMembers")
+	#end
+</div>
 <h4 class="b_with_small_icon_left b_group_icon">
 	$r.translate("menu.members")
 </h4>
diff --git a/src/main/java/org/olat/course/member/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/member/_i18n/LocalStrings_de.properties
index 1a3aecae97b..639ce202ca2 100644
--- a/src/main/java/org/olat/course/member/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/member/_i18n/LocalStrings_de.properties
@@ -14,6 +14,8 @@ participants=Teilnehmer
 waitinglist=Warteliste
 search=Suche
 action=Aktion
+add.member=Mitglieder hinzufügen
+import.member=Mitglieder importieren
 edit.member=Mitglied bearbeiten
 edit.member.title=Mitgliederrechte Kurs "{0}"
 edit.member.groups=Gruppenmitgliedschaften
@@ -30,6 +32,7 @@ table.header.edit=Bearbeiten
 table.header.remove=Entfernen
 table.header.firstName=Vorname
 table.header.lastName=Name
+table.header.mail=Email
 table.header.firstTime=Beitritt
 table.header.lastTime=Zuletzt besucht
 table.header.role=Rolle
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java
new file mode 100644
index 00000000000..896338743a3
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java
@@ -0,0 +1,69 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.TextElement;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+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.wizard.StepFormBasicController;
+import org.olat.core.gui.control.generic.wizard.StepsEvent;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMemberByUsernamesController extends StepFormBasicController {
+	private TextElement idata;
+
+	public ImportMemberByUsernamesController(UserRequest ureq, WindowControl wControl, Form rootForm, StepsRunContext runContext) {
+		super(ureq, wControl, rootForm, runContext, LAYOUT_DEFAULT, null);
+		
+		initForm (ureq);
+	}
+
+	public boolean validate() {
+		return !idata.isEmpty("form.legende.mandatory");
+	}
+
+	public String getLoginsString() {
+		return idata.getValue();
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		fireEvent(ureq, StepsEvent.ACTIVATE_NEXT);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		idata = uifactory.addTextAreaElement("addusers", "form.addusers", -1, 15, 40, true, " ", formLayout);
+		idata.setExampleKey ("form.names.example", null);
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberMailController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberMailController.java
new file mode 100644
index 00000000000..970dd644a32
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberMailController.java
@@ -0,0 +1,66 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.TextElement;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+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.wizard.StepFormBasicController;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMemberMailController extends StepFormBasicController {
+	private TextElement subject;
+	private TextElement content;
+
+	public ImportMemberMailController(UserRequest ureq, WindowControl wControl, Form rootForm, StepsRunContext runContext) {
+		super(ureq, wControl, rootForm, runContext, LAYOUT_DEFAULT, null);
+		
+		initForm (ureq);
+	}
+
+	public boolean validate() {
+		return true;
+	}
+
+
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		fireEvent (ureq, Event.DONE_EVENT);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+	
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
new file mode 100644
index 00000000000..f3e1a8f9934
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
@@ -0,0 +1,77 @@
+/**
+ * <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.course.member.wizard;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.olat.admin.securitygroup.gui.UserControllerFactory;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+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.table.TableController;
+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.wizard.StepFormBasicController;
+import org.olat.core.gui.control.generic.wizard.StepsEvent;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+import org.olat.core.id.Identity;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMemberOverviewIdentitiesController extends StepFormBasicController {
+	private TableController identityTableCtrl;
+
+	public ImportMemberOverviewIdentitiesController(UserRequest ureq, WindowControl wControl, Form rootForm, StepsRunContext runContext) {
+		super(ureq, wControl, rootForm, runContext, LAYOUT_CUSTOM, "confirm_identities");
+		
+		List<Identity> oks = new ArrayList<Identity>();
+		identityTableCtrl = UserControllerFactory.createTableControllerFor(null, oks, ureq, getWindowControl(), null);
+		listenTo(identityTableCtrl);
+
+		initForm (ureq);
+	}
+
+	public boolean validate() {
+		return true;
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		fireEvent(ureq, StepsEvent.ACTIVATE_NEXT);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		if(formLayout instanceof FormLayoutContainer) {
+			FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
+			layoutCont.put("identityList", identityTableCtrl.getInitialComponent());	
+		}
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberPermissionChoiceController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberPermissionChoiceController.java
new file mode 100644
index 00000000000..d7a7149571e
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberPermissionChoiceController.java
@@ -0,0 +1,68 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.generic.wizard.StepFormBasicController;
+import org.olat.core.gui.control.generic.wizard.StepsEvent;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+import org.olat.course.member.EditMembershipController;
+import org.olat.repository.RepositoryEntry;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMemberPermissionChoiceController extends StepFormBasicController {
+	private EditMembershipController permissionCtrl;
+
+	public ImportMemberPermissionChoiceController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry,
+			Form rootForm, StepsRunContext runContext) {
+		super(ureq, wControl, rootForm, runContext, LAYOUT_VERTICAL, null);
+		
+		permissionCtrl = new EditMembershipController(ureq, getWindowControl(), null, repoEntry, rootForm);
+		listenTo(permissionCtrl);
+
+		initForm (ureq);
+	}
+
+	public boolean validate() {
+		return true;
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		fireEvent (ureq, StepsEvent.ACTIVATE_NEXT);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		formLayout.add(permissionCtrl.getInitialFormItem());	
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMember_1_ChooseMemberStep.java b/src/main/java/org/olat/course/member/wizard/ImportMember_1_ChooseMemberStep.java
new file mode 100644
index 00000000000..e68e65ac68f
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMember_1_ChooseMemberStep.java
@@ -0,0 +1,53 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+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.StepFormController;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+import org.olat.repository.RepositoryEntry;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMember_1_ChooseMemberStep extends BasicStep {
+	
+	public ImportMember_1_ChooseMemberStep(UserRequest ureq, RepositoryEntry repoEntry) {
+		super(ureq);
+		setNextStep(new ImportMember_2_ConfirmMemberChoiceStep(ureq, repoEntry));
+		setI18nTitleAndDescr("import.import.title", "import.import.title");
+	}
+
+	@Override
+	public PrevNextFinishConfig getInitialPrevNextFinishConfig() {
+		return new PrevNextFinishConfig(false, true, false);
+	}
+
+	@Override
+	public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext runContext, Form form) {
+		ImportMemberByUsernamesController controller = new ImportMemberByUsernamesController(ureq, wControl, form, runContext);
+		return controller;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMember_2_ConfirmMemberChoiceStep.java b/src/main/java/org/olat/course/member/wizard/ImportMember_2_ConfirmMemberChoiceStep.java
new file mode 100644
index 00000000000..9655c680296
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMember_2_ConfirmMemberChoiceStep.java
@@ -0,0 +1,53 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+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.StepFormController;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+import org.olat.repository.RepositoryEntry;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMember_2_ConfirmMemberChoiceStep extends BasicStep {
+	
+	public ImportMember_2_ConfirmMemberChoiceStep(UserRequest ureq, RepositoryEntry repoEntry) {
+		super(ureq);
+		setNextStep(new ImportMember_3_ChoosePermissionStep(ureq, repoEntry));
+		setI18nTitleAndDescr("import.confirm.title", "import.confirm.title");
+	}
+
+	@Override
+	public PrevNextFinishConfig getInitialPrevNextFinishConfig() {
+		return new PrevNextFinishConfig(true, true, false);
+	}
+
+	@Override
+	public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext runContext, Form form) {
+		ImportMemberOverviewIdentitiesController controller = new ImportMemberOverviewIdentitiesController(ureq, wControl, form, runContext);
+		return controller;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMember_3_ChoosePermissionStep.java b/src/main/java/org/olat/course/member/wizard/ImportMember_3_ChoosePermissionStep.java
new file mode 100644
index 00000000000..2ed72615c69
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMember_3_ChoosePermissionStep.java
@@ -0,0 +1,58 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+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.StepFormController;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+import org.olat.repository.RepositoryEntry;
+
+
+/**
+ *
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMember_3_ChoosePermissionStep extends BasicStep {
+	
+	private final RepositoryEntry repoEntry;
+	
+	public ImportMember_3_ChoosePermissionStep(UserRequest ureq, RepositoryEntry repoEntry) {
+		super(ureq);
+		this.repoEntry = repoEntry;
+		setNextStep(new ImportMember_4_MailStep(ureq));
+		setI18nTitleAndDescr("import.permission.title", "import.permission.title");
+	}
+
+	@Override
+	public PrevNextFinishConfig getInitialPrevNextFinishConfig() {
+		return new PrevNextFinishConfig(true, true, false);
+	}
+
+	@Override
+	public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext runContext, Form form) {
+		ImportMemberPermissionChoiceController controller
+			= new ImportMemberPermissionChoiceController(ureq, wControl, repoEntry, form, runContext);
+		return controller;
+	}
+}
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMember_4_MailStep.java b/src/main/java/org/olat/course/member/wizard/ImportMember_4_MailStep.java
new file mode 100644
index 00000000000..2462129c9de
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/ImportMember_4_MailStep.java
@@ -0,0 +1,52 @@
+/**
+ * <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.course.member.wizard;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.impl.Form;
+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.StepFormController;
+import org.olat.core.gui.control.generic.wizard.StepsRunContext;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class ImportMember_4_MailStep extends BasicStep {
+	
+	public ImportMember_4_MailStep(UserRequest ureq) {
+		super(ureq);
+		setNextStep(NOSTEP);
+		setI18nTitleAndDescr("import.mail.title", "import.mail.title");
+	}
+
+	@Override
+	public PrevNextFinishConfig getInitialPrevNextFinishConfig() {
+		return new PrevNextFinishConfig(true, false, true);
+	}
+
+	@Override
+	public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext runContext, Form form) {
+		ImportMemberMailController controller = new ImportMemberMailController(ureq, wControl, form, runContext);
+		return controller;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/_content/confirm_identities.html b/src/main/java/org/olat/course/member/wizard/_content/confirm_identities.html
new file mode 100644
index 00000000000..522feed2165
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/_content/confirm_identities.html
@@ -0,0 +1 @@
+$r.render("identityList")
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/member/wizard/_content/edit_permissions.html b/src/main/java/org/olat/course/member/wizard/_content/edit_permissions.html
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties
new file mode 100644
index 00000000000..08f1235c8f5
--- /dev/null
+++ b/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties
@@ -0,0 +1,7 @@
+#Mon Mar 02 09:54:04 CET 2009
+import.import.title=Benutzernamen angeben
+import.confirm.title=Überprüfen
+import.permission.title=Berechtigungen
+import.mail.title=E-Mail-Benachrichtigung
+form.names.example=aoi,kanu,
+form.addusers=Benutzername
\ No newline at end of file
-- 
GitLab