package org.sakaiproject.delegatedaccess.tool.pages;
import org.apache.log4j.Logger;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.html.IHeaderContributor;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.sakaiproject.delegatedaccess.logic.ProjectLogic;
import org.sakaiproject.delegatedaccess.logic.SakaiProxy;
import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants;
/**
* This is our base page for Delegated Access. It sets up the containing markup and top navigation.
* All top level pages should extend from this page so as to keep the same navigation. The content for those pages will
* be rendered in the main area below the top nav.
*
* <p>It also allows us to setup the API injection and any other common methods, which are then made available in the other pages.
*
* @author Bryan Holladay (holladay@longsight.com)
*
*/
public class BasePage extends WebPage implements IHeaderContributor {
private static final Logger log = Logger.getLogger(BasePage.class);
@SpringBean(name="org.sakaiproject.delegatedaccess.logic.SakaiProxy")
protected SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.delegatedaccess.logic.ProjectLogic")
protected ProjectLogic projectLogic;
Link<Void> accessPageLink;
Link<Void> shoppingAdminLink;
Link<Void> shoppingStatsLink;
Link<Void> searchUsersLink;
Link<Void> searchAccessLink;
Link<Void> administrateLink;
boolean hasShoppingAdmin;
boolean hasDelegatedAccess;
boolean hasAccessAdmin;
FeedbackPanel feedbackPanel;
boolean shoppingPeriodTool = false;
public BasePage() {
log.debug("BasePage()");
shoppingPeriodTool = sakaiProxy.isShoppingTool();
hasShoppingAdmin = projectLogic.hasShoppingPeriodAdminNodes(sakaiProxy.getCurrentUserId());
hasDelegatedAccess = projectLogic.hasDelegatedAccessNodes(sakaiProxy.getCurrentUserId());
hasAccessAdmin = projectLogic.hasAccessAdminNodes(sakaiProxy.getCurrentUserId());
//access page link
accessPageLink = new Link<Void>("accessPageLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
setResponsePage(new UserPage());
}
@Override
public boolean isVisible() {
return shoppingPeriodTool || (!shoppingPeriodTool && hasDelegatedAccess);
}
};
if(shoppingPeriodTool){
accessPageLink.add(new Label("firstLinkLabel",new ResourceModel("link.first.shopping")).setRenderBodyOnly(true));
accessPageLink.add(new AttributeModifier("title", true, new ResourceModel("link.first.tooltip.shopping")));
}else{
accessPageLink.add(new Label("firstLinkLabel",new ResourceModel("link.first")).setRenderBodyOnly(true));
accessPageLink.add(new AttributeModifier("title", true, new ResourceModel("link.first.tooltip")));
}
add(accessPageLink);
//shopping admin link
shoppingAdminLink = new Link<Void>("shoppingAdminLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
setResponsePage(new ShoppingEditPage());
}
@Override
public boolean isVisible() {
return !shoppingPeriodTool && hasShoppingAdmin;
}
};
shoppingAdminLink.add(new Label("secondLinkLabel",new ResourceModel("link.second")).setRenderBodyOnly(true));
shoppingAdminLink.add(new AttributeModifier("title", true, new ResourceModel("link.second.tooltip")));
add(shoppingAdminLink);
//shopping stats link
shoppingStatsLink = new Link<Void>("shoppingStatsLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
setResponsePage(new UserPageSiteSearch("", null, true, true));
}
@Override
public boolean isVisible() {
return !shoppingPeriodTool && hasShoppingAdmin;
}
};
shoppingStatsLink.add(new Label("shoppingStatsLinkLabel",new ResourceModel("link.shoppingStats")).setRenderBodyOnly(true));
shoppingStatsLink.add(new AttributeModifier("title", true, new ResourceModel("link.shoppingStats.tooltip")));
add(shoppingStatsLink);
//search users link
searchUsersLink = new Link<Void>("searchUsersLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
setResponsePage(new SearchUsersPage());
}
@Override
public boolean isVisible() {
return (sakaiProxy.isSuperUser() || hasAccessAdmin) && !shoppingPeriodTool;
}
};
searchUsersLink.add(new Label("thirdLinkLabel",new ResourceModel("link.third")).setRenderBodyOnly(true));
searchUsersLink.add(new AttributeModifier("title", true, new ResourceModel("link.third.tooltip")));
add(searchUsersLink);
//search access link
searchAccessLink = new Link<Void>("searchAccessLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
setResponsePage(new SearchAccessPage());
}
@Override
public boolean isVisible() {
return (sakaiProxy.isSuperUser() || hasAccessAdmin) && !shoppingPeriodTool;
}
};
searchAccessLink.add(new Label("searchAccessLinkLabel",new ResourceModel("searchAccessLinkLabel")).setRenderBodyOnly(true));
searchAccessLink.add(new AttributeModifier("title", true, new ResourceModel("searchAccessLinkLabel.tooltip")));
add(searchAccessLink);
//administrate link
administrateLink = new Link<Void>("administrateLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
setResponsePage(new AdministratePage());
}
@Override
public boolean isVisible() {
return sakaiProxy.isSuperUser() && !shoppingPeriodTool;
}
};
administrateLink.add(new Label("administrateLinkLabel",new ResourceModel("link.administrate")).setRenderBodyOnly(true));
administrateLink.add(new AttributeModifier("title", true, new ResourceModel("link.administrate.tooltip")));
add(administrateLink);
// Add a FeedbackPanel for displaying our messages
feedbackPanel = new FeedbackPanel("feedback"){
@Override
protected Component newMessageDisplayComponent(final String id, final FeedbackMessage message) {
final Component newMessageDisplayComponent = super.newMessageDisplayComponent(id, message);
if(message.getLevel() == FeedbackMessage.ERROR ||
message.getLevel() == FeedbackMessage.DEBUG ||
message.getLevel() == FeedbackMessage.FATAL ||
message.getLevel() == FeedbackMessage.WARNING){
add(new SimpleAttributeModifier("class", "alertMessage"));
} else if(message.getLevel() == FeedbackMessage.INFO){
add(new SimpleAttributeModifier("class", "success"));
}
return newMessageDisplayComponent;
}
};
add(feedbackPanel);
//first check that the user's has been initialized:
if(!shoppingPeriodTool &&
sakaiProxy.getCurrentSession().getAttribute(DelegatedAccessConstants.SESSION_ATTRIBUTE_DELEGATED_ACCESS_FLAG) == null){
//how did we get here? (here = access to DA but the DA flag isn't set)
//3 Ideas:
//1: Admin "Become User", which bypassess the Observer event login
//2: something screwed up on login (or logged in another way) and bypasses the Observer event login
//3: Someone added this tool to their Workspace but doesn't have any DA (oh well, just look it up anyways since the tool is useless to them)
//oh well, we want this to work, so let's retry:
projectLogic.initializeDelegatedAccessSession();
}
}
/**
* Helper to clear the feedbackpanel display.
* @param f FeedBackPanel
*/
public void clearFeedback(FeedbackPanel f) {
if(!f.hasFeedbackMessage()) {
f.add(new SimpleAttributeModifier("class", ""));
}
}
/**
* This block adds the required wrapper markup to style it like a Sakai tool.
* Add to this any additional CSS or JS references that you need.
*
*/
public void renderHead(IHeaderResponse response) {
//get Sakai skin
String skinRepo = sakaiProxy.getSkinRepoProperty();
String toolCSS = sakaiProxy.getToolSkinCSS(skinRepo);
String toolBaseCSS = skinRepo + "/tool_base.css";
//Sakai additions
response.renderJavascriptReference("/library/js/headscripts.js");
response.renderCSSReference(toolBaseCSS);
response.renderCSSReference(toolCSS);
response.renderOnLoadJavascript("setMainFrameHeight( window.name )");
//Tool additions (at end so we can override if required)
response.renderString("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
//response.renderCSSReference("css/my_tool_styles.css");
//response.renderJavascriptReference("js/my_tool_javascript.js");
//for jQuery
response.renderJavascriptReference("/library/js/jquery-latest.min.js");
//for datepicker
response.renderCSSReference("css/jquery-ui-1.10.3.min.css");
response.renderJavascriptReference("javascript/jquery-ui-1.10.3.min.js");
}
/**
* Helper to disable a link. Add the Sakai class 'current'.
*/
protected void disableLink(Link<Void> l) {
l.add(new AttributeAppender("class", new Model<String>("current"), " "));
l.setRenderBodyOnly(true);
l.setEnabled(false);
}
protected boolean isShoppingPeriodTool(){
return shoppingPeriodTool;
}
}