package org.sakaiproject.delegatedaccess.tool.pages;
import java.util.ArrayList;
import java.util.List;
import javax.swing.tree.TreeNode;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.util.string.Strings;
import org.sakaiproject.delegatedaccess.model.ListOptionSerialized;
import org.sakaiproject.delegatedaccess.model.NodeModel;
import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants;
/**
*
* This is the panel (table cell) for the restricted tools column
*
* @author Bryan Holladay (holladay@longsight.com)
*
*/
public class EditablePanelList extends Panel
{
private NodeModel nodeModel;
private TreeNode node;
private boolean loadedFlag = false;
public EditablePanelList(String id, IModel inputModel, final NodeModel nodeModel, final TreeNode node, final int userType, final int fieldType)
{
super(id);
this.nodeModel = nodeModel;
this.node = node;
final WebMarkupContainer editableSpan = new WebMarkupContainer("editableSpan");
editableSpan.setOutputMarkupId(true);
final String editableSpanId = editableSpan.getMarkupId();
add(editableSpan);
AjaxLink<Void> saveEditableSpanLink = new AjaxLink<Void>("saveEditableSpanLink") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
target.appendJavascript("document.getElementById('" + editableSpanId + "').style.display='none';");
//In order for the models to refresh, you have to call "expand" or "collapse" then "updateTree",
//since I don't want to expand or collapse, I just call whichever one the node is already
//Refreshing the tree will update all the models and information (like role) will be generated onClick
if(((BaseTreePage)target.getPage()).getTree().getTreeState().isNodeExpanded(node)){
((BaseTreePage)target.getPage()).getTree().getTreeState().expandNode(node);
}else{
((BaseTreePage)target.getPage()).getTree().getTreeState().collapseNode(node);
}
((BaseTreePage)target.getPage()).getTree().updateTree(target);
}
};
editableSpan.add(saveEditableSpanLink);
Label editableSpanLabel = new Label("editableNodeTitle", nodeModel.getNode().title);
editableSpan.add(editableSpanLabel);
WebMarkupContainer toolTableHeader = new WebMarkupContainer("toolTableHeader"){
@Override
public boolean isVisible() {
return DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType;
}
};
editableSpan.add(toolTableHeader);
List<ListOptionSerialized[]> listOptions = new ArrayList<ListOptionSerialized[]>();
final ListView<ListOptionSerialized[]> listView = new ListView<ListOptionSerialized[]>("list", listOptions) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ListOptionSerialized[]> item) {
ListOptionSerialized wrapper = item.getModelObject()[0];
item.add(new Label("name", wrapper.getName()));
//Auth Checkbox:
final CheckBox checkBox = new CheckBox("authCheck", new PropertyModel(wrapper, "selected"));
checkBox.setOutputMarkupId(true);
checkBox.setOutputMarkupPlaceholderTag(true);
final String checkBoxId = checkBox.getMarkupId();
final String toolId = wrapper.getId();
checkBox.add(new AjaxFormComponentUpdatingBehavior("onClick")
{
protected void onUpdate(AjaxRequestTarget target){
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
nodeModel.setAuthToolRestricted(toolId, isChecked());
}
}
private boolean isChecked(){
final String value = checkBox.getValue();
if (value != null)
{
try
{
return Strings.isTrue(value);
}
catch (Exception e)
{
return false;
}
}
return false;
}
});
item.add(checkBox);
if(nodeModel.isPublicToolRestricted(toolId) && !nodeModel.isAuthToolRestricted(toolId)){
//disable the auth option because public is already selected (only disable if it's not already selected)
checkBox.setEnabled(false);
}
//Public Checkbox:
ListOptionSerialized publicWrapper = item.getModelObject()[1];
final CheckBox publicCheckBox = new CheckBox("publicCheck", new PropertyModel(publicWrapper, "selected")){
@Override
public boolean isVisible() {
return DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType;
}
};
publicCheckBox.setOutputMarkupId(true);
final String publicToolId = publicWrapper.getId();
publicCheckBox.add(new AjaxFormComponentUpdatingBehavior("onClick")
{
protected void onUpdate(AjaxRequestTarget target){
boolean checked = isPublicChecked();
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
nodeModel.setPublicToolRestricted(publicToolId, checked);
}
if(checked){
//if public is checked, we don't need the "auth" checkbox enabled (or selected). Disabled and De-select it
checkBox.setModelValue(new String[]{"false"});
checkBox.setEnabled(false);
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
nodeModel.setAuthToolRestricted(toolId, false);
}
}else{
checkBox.setEnabled(true);
}
target.addComponent(checkBox, checkBoxId);
}
private boolean isPublicChecked(){
final String value = publicCheckBox.getValue();
if (value != null)
{
try
{
return Strings.isTrue(value);
}
catch (Exception e)
{
return false;
}
}
return false;
}
});
item.add(publicCheckBox);
}
};
editableSpan.add(listView);
AjaxLink<Void> restrictToolsLink = new AjaxLink<Void>("restrictToolsLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
if(!loadedFlag){
loadedFlag = true;
List<ListOptionSerialized[]> listOptions = null;
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
listOptions = getNodeModelToolsList(nodeModel);
}
listView.setDefaultModelObject(listOptions);
target.addComponent(editableSpan);
}
target.appendJavascript("document.getElementById('" + editableSpanId + "').style.display='';");
}
};
add(restrictToolsLink);
add(new WebComponent("noToolsSelectedWarning"){
@Override
public boolean isVisible() {
return DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType && nodeModel.getSelectedRestrictedAuthTools().isEmpty() && nodeModel.getSelectedRestrictedPublicTools().isEmpty();
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
tag.put("title", new ResourceModel("noToolsSelected").getObject());
}
});
Label restrictToolsLinkLabel = new Label("restrictToolsSpan");
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
restrictToolsLinkLabel.setDefaultModel(new StringResourceModel("showToolsHeader", null));
}else{
restrictToolsLinkLabel.setDefaultModel(new StringResourceModel("restrictedToolsHeader", null));
}
}
restrictToolsLink.add(restrictToolsLinkLabel);
Label editToolsTitle = new Label("editToolsTitle");
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
editToolsTitle.setDefaultModel(new StringResourceModel("editableShowToolsTitle", null));
}else{
editToolsTitle.setDefaultModel(new StringResourceModel("editableRestrictedToolsTitle", null));
}
}
editableSpan.add(editToolsTitle);
Label editToolsInstructions = new Label("editToolsInstructions");
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
editToolsInstructions.setDefaultModel(new StringResourceModel("editableShowToolsDescription", null));
}else{
editToolsInstructions.setDefaultModel(new StringResourceModel("editableRestrictedToolsDescription", null));
}
}
editableSpan.add(editToolsInstructions);
}
private List<ListOptionSerialized[]> getNodeModelToolsList(NodeModel nodeModel){
List<ListOptionSerialized[]> returnList = new ArrayList<ListOptionSerialized[]>();
List<ListOptionSerialized> authList = nodeModel.getRestrictedAuthTools();
List<ListOptionSerialized> publicList = nodeModel.getRestrictedPublicTools();
for(ListOptionSerialized opt : authList){
returnList.add(new ListOptionSerialized[]{opt, findListOption(publicList, opt.getName())});
}
return returnList;
}
private ListOptionSerialized findListOption(List<ListOptionSerialized> optList, String name){
ListOptionSerialized returnOpt = null;
for(ListOptionSerialized opt : optList){
if(name.equals(opt.getName())){
returnOpt = opt;
break;
}
}
return returnOpt;
}
}