package org.sakaiproject.site.tool.helper.order.rsf; import java.util.Iterator; import java.util.Map; import org.sakaiproject.component.api.ServerConfigurationService; import org.sakaiproject.site.api.SitePage; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.site.tool.helper.order.impl.SitePageEditHandler; import org.sakaiproject.tool.api.SessionManager; import org.sakaiproject.tool.api.Tool; import uk.ac.cam.caret.sakai.rsf.producers.FrameAdjustingProducer; import uk.ac.cam.caret.sakai.rsf.util.SakaiURLUtil; import uk.org.ponder.messageutil.MessageLocator; import uk.org.ponder.rsf.components.UIBoundString; import uk.org.ponder.rsf.components.UIBranchContainer; import uk.org.ponder.rsf.components.UICommand; import uk.org.ponder.rsf.components.UIComponent; import uk.org.ponder.rsf.components.UIContainer; import uk.org.ponder.rsf.components.UIForm; import uk.org.ponder.rsf.components.UIInput; import uk.org.ponder.rsf.components.UIInternalLink; import uk.org.ponder.rsf.components.UIMessage; import uk.org.ponder.rsf.components.UIOutput; import uk.org.ponder.rsf.components.decorators.UITooltipDecorator; import uk.org.ponder.rsf.components.decorators.UIAlternativeTextDecorator; import uk.org.ponder.rsf.flow.ARIResult; import uk.org.ponder.rsf.flow.ActionResultInterceptor; import uk.org.ponder.rsf.view.ComponentChecker; import uk.org.ponder.rsf.view.DefaultView; import uk.org.ponder.rsf.view.ViewComponentProducer; import uk.org.ponder.rsf.viewstate.RawViewParameters; import uk.org.ponder.rsf.viewstate.ViewParameters; /** * * @author Joshua Ryan joshua.ryan@asu.edu * */ public class PageListProducer implements ViewComponentProducer, DefaultView, ActionResultInterceptor { public static final String VIEW_ID = "PageList"; public Map<String, SitePage> sitePages; public SitePageEditHandler handler; public MessageLocator messageLocator; public SessionManager sessionManager; public FrameAdjustingProducer frameAdjustingProducer; public ServerConfigurationService serverConfigurationService; public String ALLOW_TITLE_EDIT = "org.sakaiproject.site.tool.helper.order.rsf.PageListProducer.allowTitleEdit"; public String getViewID() { return VIEW_ID; } private UIComponent fullyDecorate(UIComponent todecorate, UIBoundString text) { return todecorate.decorate( new UIAlternativeTextDecorator(text)).decorate(new UITooltipDecorator(text)); } public void fillComponents(UIContainer tofill, ViewParameters viewparams, ComponentChecker checker) { if (handler.update) { PageAddViewParameters addParam = new PageAddViewParameters(); addParam.viewID = PageAddProducer.VIEW_ID; fullyDecorate(UIInternalLink.make(tofill, "add-link", UIMessage.make("show_add"), addParam), UIMessage.make("page_show_add")); UIBranchContainer content = UIBranchContainer.make(tofill, "content:"); UIForm pageForm = UIForm.make(content, "pages-form"); String state = ""; sitePages = handler.getPages(); for (Iterator<String> it = sitePages.keySet().iterator(); it.hasNext(); ) { String key = it.next(); SitePage page = sitePages.get(key); UIBranchContainer pagerow = UIBranchContainer.make(pageForm, "page-row:", page.getId()); pagerow.decorate(new UITooltipDecorator(UIMessage.make("page_click_n_drag"))); UIOutput.make(pagerow, "page-name", page.getTitle()); UIInput.make(pagerow, "page-name-input", "#{SitePageEditHandler.nil}", page.getTitle()); UIMessage.make(pagerow, "page-name-label", "title"); //nameLabel.decorate(new UILabelTargetDecorator(name)); PageEditViewParameters param = new PageEditViewParameters(); param.pageId = page.getId(); param.viewID = PageEditProducer.VIEW_ID; Object[] pageTitle = new Object[] {page.getTitle()}; //default value is to allow the Title to be edited. If the sakai properties //specifically requests this to be set to false, then do not allow this function if (serverConfigurationService.getBoolean(ALLOW_TITLE_EDIT, true)) { fullyDecorate(UIInternalLink.make(pagerow, "edit-link", param), UIMessage.make("page_edit", pageTitle)); fullyDecorate(UIInternalLink.make(pagerow, "save-edit-link", param), UIMessage.make("save_page_edit", pageTitle)); fullyDecorate(UIOutput.make(pagerow, "cancel-edit-link"), UIMessage.make("cancel_page_edit", pageTitle)); } if (page.getTools().size() == 1) { ToolConfiguration tool = (ToolConfiguration) page.getTools().get(0); //if the page only has one tool and it's not site info or required we allow the user to delete it here //TODO: can we get the fact that site info called us if (!handler.isRequired(tool.getToolId()) && !"sakai.sitesetup".equals(tool.getToolId()) && !"sakai.siteinfo".equals(tool.getToolId())) { param.viewID = PageDelProducer.VIEW_ID; fullyDecorate(UIInternalLink.make(pagerow, "del-link", param), UIMessage.make("page_remove", pageTitle)); } // allow special configuration for the iframe tool. This needs to be generalized //for all tools that want special configuration and/or allow multiple instances //per site if ("sakai.iframe".equals(tool.getToolId())) { UIInput.make(pagerow, "page-config-input", "#{SitePageEditHandler.nil}", tool.getPlacementConfig().getProperty("source")); } } // TODO: Deal with interaction between visible and enabled if (handler.allowsHide(page)) { param.viewID = PageEditProducer.VIEW_ID; if (handler.isVisible(page)) { param.visible = "false"; fullyDecorate(UIInternalLink.make(pagerow, "hide-link", param), UIMessage.make("page_hide", pageTitle)); param.visible = "true"; fullyDecorate(UIInternalLink.make(pagerow, "show-link-off", param), UIMessage.make("page_show", pageTitle)); } else { param.visible = "true"; fullyDecorate(UIInternalLink.make(pagerow, "show-link", param), UIMessage.make("page_show", pageTitle)); param.visible = "false"; fullyDecorate(UIInternalLink.make(pagerow, "hide-link-off", param), UIMessage.make("page_hide", pageTitle)); } } // NEW // TODO: Force hidden if disabled if (handler.allowsHide(page)) { param.viewID = PageEditProducer.VIEW_ID; param.visible = null; if (handler.isEnabled(page)) { param.enabled = "false"; fullyDecorate(UIInternalLink.make(pagerow, "disable-link", param), UIMessage.make("page_disable", pageTitle)); param.enabled = "true"; fullyDecorate(UIInternalLink.make(pagerow, "enable-link-off", param), UIMessage.make("page_enable", pageTitle)); } else { param.enabled = "true"; fullyDecorate(UIInternalLink.make(pagerow, "enable-link", param), UIMessage.make("page_enable", pageTitle)); param.enabled = "false"; fullyDecorate(UIInternalLink.make(pagerow, "disable-link-off", param), UIMessage.make("page_disable", pageTitle)); } } state += page.getId() + " "; } UIInput.make(pageForm, "state-init", "#{SitePageEditHandler.state}", state); fullyDecorate(UICommand.make(pageForm, "save", UIMessage.make("save"), "#{SitePageEditHandler.savePages}"), UIMessage.make("save_message")); fullyDecorate(UICommand.make(pageForm, "revert", UIMessage.make("cancel"), "#{SitePageEditHandler.cancel}"), UIMessage.make("cancel_message")); if (handler.isSiteOrdered()) { fullyDecorate(UICommand.make(pageForm, "reset", UIMessage.make("reset"), "#{SitePageEditHandler.reset}"), UIMessage.make("reset_message")); } frameAdjustingProducer.fillComponents(tofill, "resize", "resetFrame"); } else { //error messages - apparently nothing in template for these //UIBranchContainer error = UIBranchContainer.make(tofill, "error:"); //UIMessage.make(error, "message", "access_error"); } } public ServerConfigurationService getServerConfigurationService() { return serverConfigurationService; } public void setServerConfigurationService( ServerConfigurationService serverConfigurationService) { this.serverConfigurationService = serverConfigurationService; } public void interceptActionResult(ARIResult result, ViewParameters incoming, Object actionReturn) { if ("done".equals(actionReturn)) { Tool tool = handler.getCurrentTool(); result.resultingView = new RawViewParameters(SakaiURLUtil.getHelperDoneURL(tool, sessionManager)); } } }