package org.sakaiproject.delegatedaccess.tool.pages; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeModel; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.markup.html.form.RadioGroup; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.tree.AbstractTree; import org.apache.wicket.markup.html.tree.BaseTree; import org.apache.wicket.markup.html.tree.LinkTree; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.sakaiproject.delegatedaccess.model.ListOptionSerialized; import org.sakaiproject.delegatedaccess.model.NodeModel; import org.sakaiproject.delegatedaccess.model.SelectOption; import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants; import org.sakaiproject.site.api.Site; /** * Creates the landing page for a user to show them all their access and links to go to the sites * * @author Bryan Holladay (holladay@longsight.com) * */ public class UserPage extends BaseTreePage{ private BaseTree tree; boolean expand = true; private String search = ""; private String instructorField = ""; private SelectOption termField; private TreeModel treeModel = null; private String userId; private String selectedInstructorOption = DelegatedAccessConstants.ADVANCED_SEARCH_INSTRUCTOR_TYPE_INSTRUCTOR; protected AbstractTree getTree() { return tree; } public UserPage(){ disableLink(accessPageLink); //this is the home page so set user as current user if(isShoppingPeriodTool()){ userId = DelegatedAccessConstants.SHOPPING_PERIOD_USER; }else{ //check if they should even have acces to this page: if(!hasDelegatedAccess){ if(hasShoppingAdmin){ setResponsePage(new ShoppingEditPage()); }else if(hasAccessAdmin){ setResponsePage(new SearchUsersPage()); } } userId = sakaiProxy.getCurrentUserId(); } //Title Label title = new Label("title"); if(isShoppingPeriodTool()){ title.setDefaultModel(new StringResourceModel("shoppingTitle", null)); }else{ title.setDefaultModel(new StringResourceModel("delegatedAccessTitle", null)); } add(title); //Description Label description = new Label("description"); if(isShoppingPeriodTool()){ description.setDefaultModel(new StringResourceModel("shoppingInstruction", null)); }else{ description.setDefaultModel(new StringResourceModel("delegatedAccessInstructions", null)); } add(description); setTreeModel(userId, false); final List<ListOptionSerialized> blankRestrictedTools = projectLogic.getEntireToolsList(); if(treeModel != null){ DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeModel.getRoot(); if(((NodeModel) node.getUserObject()).isDirectAccess()){ projectLogic.addChildrenNodes(node, userId, blankRestrictedTools, true, null, false, isShoppingPeriodTool()); } } //a null model means the user doesn't have any associations tree = new LinkTree("tree", treeModel){ @Override public boolean isVisible() { return treeModel != null && ((!sakaiProxy.getDisableUserTreeView() && !isShoppingPeriodTool()) || (!sakaiProxy.getDisableShoppingTreeView() && isShoppingPeriodTool())); } protected void onNodeLinkClicked(Object node, BaseTree tree, AjaxRequestTarget target) { if(tree.isLeaf(node)){ //The user has clicked a leaf and chances are its a site. //all sites are leafs, but there may be non sites as leafs NodeModel nodeModel = (NodeModel) ((DefaultMutableTreeNode) node).getUserObject(); if(nodeModel.isSiteNode()){ Site site = sakaiProxy.getSiteByRef(nodeModel.getNode().title); if(site != null){ //redirect the user to the site target.appendJavascript("window.open('" + site.getUrl() + "')"); } } }else{ boolean anyAdded = false; if(!tree.getTreeState().isNodeExpanded(node) && !((NodeModel) ((DefaultMutableTreeNode) node).getUserObject()).isAddedDirectChildrenFlag()){ anyAdded = projectLogic.addChildrenNodes(node, userId, blankRestrictedTools, true, null, false, isShoppingPeriodTool()); ((NodeModel) ((DefaultMutableTreeNode) node).getUserObject()).setAddedDirectChildrenFlag(true); } if(anyAdded){ collapseEmptyFoldersHelper((DefaultMutableTreeNode) node); } if(!tree.getTreeState().isNodeExpanded(node) || anyAdded){ tree.getTreeState().expandNode(node); }else{ tree.getTreeState().collapseNode(node); } } }; protected void onJunctionLinkClicked(AjaxRequestTarget target, Object node) { //the nodes are generated on the fly with ajax. This will add any child nodes that //are missing in the tree. Expanding and collapsing will refresh the tree node if(tree.getTreeState().isNodeExpanded(node) && !((NodeModel) ((DefaultMutableTreeNode) node).getUserObject()).isAddedDirectChildrenFlag()){ boolean anyAdded = projectLogic.addChildrenNodes(node, userId, blankRestrictedTools, true, null, false, isShoppingPeriodTool()); ((NodeModel) ((DefaultMutableTreeNode) node).getUserObject()).setAddedDirectChildrenFlag(true); if(anyAdded){ collapseEmptyFoldersHelper((DefaultMutableTreeNode) node); } } } @Override protected boolean isForceRebuildOnSelectionChange() { return false; }; }; tree.setRootLess(true); add(tree); tree.getTreeState().collapseAll(); //Access Warning: Label noAccessLabel = new Label("noAccess"){ @Override public boolean isVisible() { return treeModel == null && (!isShoppingPeriodTool() && !sakaiProxy.getDisableUserTreeView()); } }; if(isShoppingPeriodTool()){ noAccessLabel.setDefaultModel(new StringResourceModel("noShoppingSites", null)); }else{ noAccessLabel.setDefaultModel(new StringResourceModel("noDelegatedAccess", null)); } add(noAccessLabel); //no hierarchy setup: add(new Label("noHierarchy", new StringResourceModel("noHierarchy", null)){ public boolean isVisible() { return treeModel == null && sakaiProxy.isSuperUser() && "".equals(projectLogic.getRootNodeId().id); } }); //Create Search Form: final PropertyModel<String> messageModel = new PropertyModel<String>(this, "search"); final PropertyModel<String> instructorFieldModel = new PropertyModel<String>(this, "instructorField"); final PropertyModel<SelectOption> termFieldModel = new PropertyModel<SelectOption>(this, "termField"); Form<?> form = new Form("form"){ @Override protected void onSubmit() { Map<String, String> advancedOptions = new HashMap<String,String>(); if(termField != null && !"".equals(termField.getValue())){ advancedOptions.put(DelegatedAccessConstants.ADVANCED_SEARCH_TERM, termField.getValue()); } if(instructorField != null && !"".equals(instructorField)){ advancedOptions.put(DelegatedAccessConstants.ADVANCED_SEARCH_INSTRUCTOR, instructorField); advancedOptions.put(DelegatedAccessConstants.ADVANCED_SEARCH_INSTRUCTOR_TYPE, selectedInstructorOption); } //need to set the tree model so that is is the full model setResponsePage(new UserPageSiteSearch(search, advancedOptions, false, false)); } @Override public boolean isVisible() { return treeModel != null || isShoppingPeriodTool() || (!isShoppingPeriodTool() && sakaiProxy.getDisableUserTreeView()); } }; AbstractReadOnlyModel<String> instructorFieldLabelModel = new AbstractReadOnlyModel<String>() { @Override public String getObject() { if(isShoppingPeriodTool()){ return new StringResourceModel("instructor", null).getObject() + ":"; }else{ return new StringResourceModel("user", null).getObject() + ":"; } } }; form.add(new Label("instructorFieldLabel", instructorFieldLabelModel)); form.add(new TextField<String>("search", messageModel)); form.add(new TextField<String>("instructorField", instructorFieldModel)); //Instructor Options: RadioGroup group = new RadioGroup("instructorOptionsGroup", new PropertyModel<String>(this, "selectedInstructorOption")){ @Override public boolean isVisible() { //only show if its not shopping period return !isShoppingPeriodTool(); } }; group.add(new Radio("instructorOption", Model.of(DelegatedAccessConstants.ADVANCED_SEARCH_INSTRUCTOR_TYPE_INSTRUCTOR))); group.add(new Radio("memberOption", Model.of(DelegatedAccessConstants.ADVANCED_SEARCH_INSTRUCTOR_TYPE_MEMBER))); form.add(group); List<SelectOption> termOptions = new ArrayList<SelectOption>(); for(String[] entry : sakaiProxy.getTerms()){ termOptions.add(new SelectOption(entry[1], entry[0])); } ChoiceRenderer choiceRenderer = new ChoiceRenderer("label", "value"); DropDownChoice termFieldDropDown = new DropDownChoice("termField", termFieldModel, termOptions, choiceRenderer); //keeps the null option (choose one) after a user selects an option termFieldDropDown.setNullValid(true); form.add(termFieldDropDown); form.add(new WebMarkupContainer("searchHeader")); form.add(new Button("submitButton")); add(form); } private void setTreeModel(String userId, boolean cascade){ if(isShoppingPeriodTool()){ if(sakaiProxy.getDisableShoppingTreeView()){ treeModel = null; }else{ treeModel = projectLogic.createAccessTreeModelForUser(DelegatedAccessConstants.SHOPPING_PERIOD_USER, false, cascade); if(treeModel != null && ((DefaultMutableTreeNode) treeModel.getRoot()).getChildCount() == 0){ treeModel = null; } } }else{ if(sakaiProxy.getDisableUserTreeView()){ treeModel = null; }else{ treeModel = projectLogic.createAccessTreeModelForUser(userId, false, cascade); } } } }