Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java =================================================================== diff -u -refca149a7fdbdff875aac4ebaa162cabe51d0d08 -r772f0f585ff29c3b9f51f8201682cc1db3bfee1c --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision efca149a7fdbdff875aac4ebaa162cabe51d0d08) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision 772f0f585ff29c3b9f51f8201682cc1db3bfee1c) @@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; @@ -42,6 +43,7 @@ import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.authoring.service.IAuthoringService; import org.lamsfoundation.lams.learningdesign.dto.LicenseDTO; +import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.tool.IToolVO; @@ -69,7 +71,7 @@ * @author Manpreet Minhas * * @struts.action path = "/authoring/author" parameter = "method" validate = "false" - * + * @struts:action-forward name="openAutoring" path="/author2.jsp" */ public class AuthoringAction extends LamsDispatchAction { @@ -80,6 +82,7 @@ private static IUserManagementService userManagementService; private static ILamsToolService toolService; private static IAuthoringService authoringService; + private static ILearningDesignService learningDesignService; private Integer getUserId() { HttpSession ss = SessionManager.getSession(); @@ -93,6 +96,12 @@ return user != null ? user.getLocaleLanguage() : ""; } + public ActionForward openAuthoring(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException { + request.setAttribute("tools", getLearningDesignService().getToolDTOs(request.getRemoteUser())); + return mapping.findForward("openAutoring"); + } + /** * Output the supplied WDDX packet. If the request parameter USE_JSP_OUTPUT is set, then it sets the session * attribute "parameterName" to the wddx packet string. If USE_JSP_OUTPUT is not set, then the packet is written out @@ -323,7 +332,12 @@ // generate the next unique content ID for the tool Long toolContentID = authoringService.insertToolContentID(toolID); if (toolContentID != null) { - String contentFolderID = FileUtil.generateUniqueContentFolderID(); + + String contentFolderID = request.getParameter(AttributeNames.PARAM_CONTENT_FOLDER_ID); + if (StringUtils.isBlank(contentFolderID)) { + contentFolderID = FileUtil.generateUniqueContentFolderID(); + } + String authorUrl = authoringService.getToolAuthorUrl(toolID, toolContentID, contentFolderID); if (authorUrl != null) { JSONObject responseJSON = new JSONObject(); @@ -457,4 +471,14 @@ } return AuthoringAction.toolService; } + + + private ILearningDesignService getLearningDesignService() { + if (AuthoringAction.learningDesignService == null) { + WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + AuthoringAction.learningDesignService = (ILearningDesignService) ctx.getBean("learningDesignService"); + } + return AuthoringAction.learningDesignService; + } } \ No newline at end of file Fisheye: Tag 772f0f585ff29c3b9f51f8201682cc1db3bfee1c refers to a dead (removed) revision in file `lams_central/src/java/org/lamsfoundation/lams/web/AuthoringAction.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java =================================================================== diff -u -r606581007abbdaee5483777096f32ffac1c3e3eb -r772f0f585ff29c3b9f51f8201682cc1db3bfee1c --- lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision 606581007abbdaee5483777096f32ffac1c3e3eb) +++ lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision 772f0f585ff29c3b9f51f8201682cc1db3bfee1c) @@ -389,7 +389,7 @@ public ActionForward getFolderContents(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws UserAccessDeniedException, JSONException, IOException, RepositoryCheckedException { - Integer folderID = new Integer(WebUtil.readIntParam(req, "folderID")); + Integer folderID = WebUtil.readIntParam(req, "folderID", true); JSONObject responseJSON = getFolderContents(folderID, getUser().getUserID()); res.setContentType("application/json;charset=utf-8"); Index: lams_central/web/author2.jsp =================================================================== diff -u -ra32a2caaa30f22384bc822c874269f59c5a7c5f7 -r772f0f585ff29c3b9f51f8201682cc1db3bfee1c --- lams_central/web/author2.jsp (.../author2.jsp) (revision a32a2caaa30f22384bc822c874269f59c5a7c5f7) +++ lams_central/web/author2.jsp (.../author2.jsp) (revision 772f0f585ff29c3b9f51f8201682cc1db3bfee1c) @@ -10,18 +10,33 @@ Flashless Authoring + + - - - + + + + + + + - +
+
+ Open +
@@ -34,7 +49,7 @@
  • Branch
  • -
    +
    Group
    @@ -47,9 +62,9 @@
    -
    +
    - +
    @@ -59,5 +74,37 @@ + +
    +
    Open sequence
    + + + + + + + + + + + +
    +
    +
    +
    + + +
    +
    + Recently used sequences +
    +
    + Open +
    +
    + Cancel +
    +
    +
    \ No newline at end of file Index: lams_central/web/css/authoring.css =================================================================== diff -u -ra32a2caaa30f22384bc822c874269f59c5a7c5f7 -r772f0f585ff29c3b9f51f8201682cc1db3bfee1c --- lams_central/web/css/authoring.css (.../authoring.css) (revision a32a2caaa30f22384bc822c874269f59c5a7c5f7) +++ lams_central/web/css/authoring.css (.../authoring.css) (revision 772f0f585ff29c3b9f51f8201682cc1db3bfee1c) @@ -1,3 +1,78 @@ +div.dialogContainer, .ldChoiceDependentCanvasElement { + display: none; +} + +div#openLearningDesignDialog { + font-size: 12px; +} + +div.dialogTitle { + padding: 5px 0px 5px 0px; + font-weight: bold; + text-align: center; +} + +div#openLearningDesignDialog > table { + width: 100%; + height: 735px; + table-layout: fixed; + border-top: thin dotted #2E6E9E; +} + +a.ygtvspacer { + border-bottom: none; +} + +td#learningDesignTreeCell { + padding: 2px 2px 0px 5px; + vertical-align: top; + width: 200px; + border-right: thin dotted #2E6E9E; +} + +div#learningDesignTree { + overflow: auto; +} + +.ygtv-highlight1, .ygtv-highlight1 .ygtvlabel { + background-color: #dfeffc; +} + +#recentlyUsedCell { + height: 200px; + vertical-align: top; + border-top: thin dotted #2E6E9E; + border-right: thin dotted #2E6E9E; + padding: 5px 0px 5px 0px; + font-size: 11px; + font-weight: bold; + text-align: center; +} + +td#canvasCell { + text-align: center; + padding: 10px 0px 0px 10px; +} + +div#canvasDiv { + overflow: auto; + height: 685px; +} + +img#ldScreenshotLoading { + padding-top: 200px; +} + +#buttonsCell { + border-top: thin dotted #2E6E9E; + padding-top: 5px; +} + +#buttonsCell > div { + float: right; + margin-left: 10px; +} + div#toolbar { padding: 3px; height: 27px; @@ -63,7 +138,7 @@ div.template div { float: right; width: 92px; - padding-top: 10px; + padding-top: 11px; font-size: 10pt; } Index: lams_central/web/includes/javascript/authoring.js =================================================================== diff -u -ra32a2caaa30f22384bc822c874269f59c5a7c5f7 -r772f0f585ff29c3b9f51f8201682cc1db3bfee1c --- lams_central/web/includes/javascript/authoring.js (.../authoring.js) (revision a32a2caaa30f22384bc822c874269f59c5a7c5f7) +++ lams_central/web/includes/javascript/authoring.js (.../authoring.js) (revision 772f0f585ff29c3b9f51f8201682cc1db3bfee1c) @@ -1,7 +1,6 @@ var paper = null; var canvas = null; var bin = null; -var maxActivityId = 0; var activities = []; var layout = { @@ -45,8 +44,8 @@ function initTemplates(){ $('.template').each(function(){ var toolName = $('div', this); - if (toolName.text().length > 14){ - toolName.text(toolName.text().substring(0, 12) + '...'); + if (toolName.text().length > 15){ + toolName.css('padding-top', '4px'); } $(this).draggable({ @@ -57,10 +56,12 @@ 'scope' : 'template', 'helper' : function(event){ var helper = $(this).clone().css({ - 'border' : 'thin black solid', + 'width' : '135px', + 'border' : 'thin black solid', 'z-index' : 1, - 'cursor' : 'move' + 'cursor' : 'move' }); + helper.children('div').remove(); return helper; } }); @@ -70,7 +71,7 @@ 'tolerance' : 'touch', 'scope' : 'template', 'drop' : function (event, draggable) { - ActivityUtils.addActivity(draggable); + activities.push(new ToolActivity(null, draggable)); } }); } @@ -132,96 +133,60 @@ .mousemove(CanvasHandlers.approachPropertiesDialogHandler) .find('.ui-dialog-titlebar-close').remove(); + var openLDDialog = $('#openLearningDesignDialog').dialog({ + 'autoOpen' : false, + 'position' : { + 'my' : 'left top', + 'at' : 'left+5px top+5px', + 'of' : 'body' + }, + 'resizable' : false, + 'width' : 990, + 'height' : 780 + }); + openLDDialog.closest('.ui-dialog').find('.ui-dialog-titlebar').remove(); + $('#ldScreenshotAuthor', openLDDialog).load(function(){ + // hide "loading" animation + $('.ldChoiceDependentCanvasElement').css('display', 'none'); + // show the thumbnail + $(this).css('display', 'inline'); + }); + // there should be no focus, just highlight + YAHOO.widget.TreeView.FOCUS_CLASS_NAME = null; + + CanvasHandlers.resetCanvasMode(); } var ActivityUtils = { - addActivity : function(template) { - $(template.helper).remove(); - - var activityId = ++maxActivityId; - var activity = new Activity(activityId, 'tool'); - activities.push(activity); - - var canvasOffset = canvas.offset(); - - paper.setStart(); - var shape = paper.rect( - template.offset.left - canvasOffset.left, - template.offset.top - canvasOffset.top, - layout.conf.activityWidth, layout.conf.activityHeight) - .attr({ - 'fill' : layout.colors.activity - }); - - paper.image($('img', template.draggable).attr('src'), shape.attr('x') - + shape.attr('width') / 2 - 15, shape.attr('y') + 2, 30, 30); - - paper.text(shape.attr('x') + shape.attr('width') / 2, shape - .attr('y') + 40, $('div', template.draggable).text()); - - activity.items = paper.setFinish(); - activity.items.shape = shape; - activity.addEffects(); - }, - - - addGrouping : function(x, y) { - var activityId = ++maxActivityId; - var activity = new Activity(activityId, 'group'); - activities.push(activity); - + initActivity : function(activity) { + activity.items.mousedown(function(event, x, y){ + if (event.ctrlKey) { + CanvasHandlers.drawTransitionStartHandler(activity, event, x, y); + } else { + var mouseupHandler = function(){ + CanvasHandlers.dragActivityEndHandler(activity); + }; - paper.setStart(); - var shape = paper.rect( - x - layout.conf.activityWidth/2, - y - layout.conf.activityHeight/2, - layout.conf.activityWidth, layout.conf.activityHeight) + CanvasHandlers.dragItemsStartHandler(activity.items, this, mouseupHandler, event, x, y); + } + }) + .click(function(event){ + activity.items.clicked = true; + CanvasHandlers.selectActivityHandler(event, activity); + }) + .dblclick(function(){ + activity.items.clicked = true; + CanvasHandlers.openActivityAuthoringHandler(activity); + }) .attr({ - 'fill' : layout.colors.activity + 'cursor' : 'pointer' }); - - paper.image('images/grouping.gif', - shape.attr('x') + shape.attr('width') / 2 - 15, - shape.attr('y') + 2, - 30, 30); - - paper.text(shape.attr('x') + shape.attr('width') / 2, shape - .attr('y') + 40, 'Grouping'); - - activity.items = paper.setFinish(); - activity.items.shape = shape; - activity.addEffects(); }, - - - addGate : function(x, y) { - var activityId = ++maxActivityId; - var activity = new Activity(activityId, 'gate'); - activities.push(activity); - - paper.setStart(); - var shape = paper.path('M ' + x + ' ' + y + layout.defs.gate) - .attr({ - 'fill' : layout.colors.gate - }); - - paper.text(x + 7, y + 14, 'STOP') - .attr({ - 'font-size' : 9, - 'font' : 'sans-serif', - 'stroke' : layout.colors.gateText - }) - - activity.items = paper.setFinish(); - activity.items.shape = shape; - activity.addEffects(); - }, - removeActivity : function(activity) { if (activity.fromTransition) { var toActivity = activity.fromTransition.toActivity; @@ -407,15 +372,49 @@ }, + openActivityAuthoringHandler : function(activity){ + if (!activity.authorURL && activity.toolID) { + $.ajax({ + async : false, + cache : false, + url : LAMS_URL + "authoring/author.do", + dataType : 'json', + data : { + 'method' : 'createToolContent', + 'toolID' : activity.toolID, + 'contentFolderID' : contentFolderID + }, + success : function(response) { + activity.authorURL = response.authorURL; + activity.id = response.toolContentID; + if (!contentFolderID) { + contentFolderID = response.contentFolderID; + } + } + }); + } + + if (activity.authorURL) { + window.open(activity.authorURL, 'activityAuthoring' + activity.id, + "HEIGHT=800,WIDTH=1024,resizable=yes,scrollbars=yes,status=false," + + "menubar=no,toolbar=no"); + } + }, + + dragItemsStartHandler : function(items, draggedElement, mouseupHandler, event, startX, startY) { + items.toFront(); items.clicked = false; - setTimeout(function(){ + if (items.dragStarter) { + clearTimeout(items.dragStarter); + } + items.dragStarter = setTimeout(function(){ + items.dragStarter = null; if (items.clicked) { items.clicked = false; return; } - items.toFront(); items.attr('cursor', 'move'); canvas.mousemove(function(event) { @@ -566,53 +565,197 @@ var MenuUtils = { addGrouping : function() { - canvas.css('cursor', 'url("images/grouping.gif"), move').click(function(event){ + canvas.css('cursor', 'url("../images/grouping.gif"), move').click(function(event){ var x = event.pageX - canvas.offset().left; var y = event.pageY - canvas.offset().top; - ActivityUtils.addGrouping(x, y); + activities.push(new GroupingActivity(null, x, y)); CanvasHandlers.resetCanvasMode(); }); }, addGate : function() { - canvas.css('cursor', 'url("images/stop.gif"), move').click(function(event){ + canvas.css('cursor', 'url("../images/stop.gif"), move').click(function(event){ var x = event.pageX - canvas.offset().left; var y = event.pageY - canvas.offset().top; - ActivityUtils.addGate(x, y); + activities.push(new GateActivity(null, x, y)); CanvasHandlers.resetCanvasMode(); }); + }, + + + openLearningDesign : function(){ + var dialog = $('#openLearningDesignDialog'); + $('#learningDesignTree', dialog).empty(); + dialog.dialog('open'); + + var treeNodes = MenuUtils.getFolderContents(); + var tree = new YAHOO.widget.TreeView('learningDesignTree', treeNodes); + tree.setDynamicLoad(function(node, callback){ + // load subfolder contents + var childNodeData = MenuUtils.getFolderContents(node.data.folderID); + if (childNodeData) { + $.each(childNodeData, function(){ + new YAHOO.widget.TextNode(this, node); + }); + } + + // required by YUI + callback(); + }); + + tree.singleNodeHighlight = true; + tree.subscribe('clickEvent', function(event){ + + if (!event.node.data.learningDesignId){ + // it is a folder + return false; + } + + // display "loading" animation and finally LD thumbnail + $('.ldChoiceDependentCanvasElement').css('display', 'none'); + if (event.node.highlightState == 0) { + $('#ldScreenshotLoading').css('display', 'inline'); + $('#ldScreenshotAuthor').attr('src', LD_THUMBNAIL_URL_BASE + event.node.data.learningDesignId); + $('#ldScreenshotAuthor').css('width', 'auto').css('height', 'auto'); + } else { + // toggleCanvasResize(CANVAS_RESIZE_OPTION_NONE); + } + }); + tree.subscribe('clickEvent',tree.onEventToggleHighlight); + tree.render(); + + // expand the first (user) folder + tree.getRoot().children[0].expand(); + }, + + + getFolderContents : function(folderID) { + var result = null; + + var parseFolderContents = function(nodeJSON) { + var result = []; + + if (nodeJSON.folders) { + $.each(nodeJSON.folders, function(){ + result.push({'type' : 'text', + 'label' : this.isRunSequencesFolder ? + LABEL_RUN_SEQUENCES_FOLDER : this.name, + 'folderID' : this.folderID + }); + }); + } + if (nodeJSON.learningDesigns) { + $.each(nodeJSON.learningDesigns, function(){ + result.push({'type' : 'text', + 'label' : this.name, + 'isLeaf' : true, + 'learningDesignId' : this.learningDesignId + }); + }); + } + + return result; + }; + + $.ajax({ + url : LAMS_URL + 'home.do', + data : { + 'method' : 'getFolderContents', + 'folderID' : folderID + }, + cache : false, + async: false, + dataType : 'json', + success : function(response) { + result = parseFolderContents(response); + } + }); + + return result; } }; -function Activity(id, type) { +function ToolActivity(id, template) { this.id = id; - this.type = type; - this.items = paper.set(); + this.type = 'tool'; + this.toolID = template.draggable.attr('toolId'); - this.addEffects = function(){ - var activity = this; - - activity.items.mousedown(function(event, x, y){ - if (event.ctrlKey) { - CanvasHandlers.drawTransitionStartHandler(activity, event, x, y); - } else { - var mouseupHandler = function(){ - CanvasHandlers.dragActivityEndHandler(activity); - }; + $(template.helper).remove(); + var canvasOffset = canvas.offset(); + + paper.setStart(); + var shape = paper.rect( + template.offset.left - canvasOffset.left, + template.offset.top - canvasOffset.top, + layout.conf.activityWidth, layout.conf.activityHeight) + .attr({ + 'fill' : layout.colors.activity + }); + + paper.image($('img', template.draggable).attr('src'), shape.attr('x') + + shape.attr('width') / 2 - 15, shape.attr('y') + 2, 30, 30); + + paper.text(shape.attr('x') + shape.attr('width') / 2, shape + .attr('y') + 40, $('div', template.draggable).text()); + + this.items = paper.setFinish(); + this.items.shape = shape; + + ActivityUtils.initActivity(this); +} - CanvasHandlers.dragItemsStartHandler(activity.items, this, mouseupHandler, event, x, y); - } - }) - .click(function(event){ - activity.items.clicked = true; - CanvasHandlers.selectActivityHandler(event, activity); - }) - .attr({ - 'cursor' : 'pointer' - }); - }; + +function GroupingActivity(id, x, y) { + this.id = id; + this.type = 'group'; + + paper.setStart(); + var shape = paper.rect( + x - layout.conf.activityWidth/2, + y - layout.conf.activityHeight/2, + layout.conf.activityWidth, layout.conf.activityHeight) + .attr({ + 'fill' : layout.colors.activity + }); + + paper.image('../images/grouping.gif', + shape.attr('x') + shape.attr('width') / 2 - 15, + shape.attr('y') + 2, + 30, 30); + + paper.text(shape.attr('x') + shape.attr('width') / 2, shape + .attr('y') + 40, 'Grouping'); + + this.items = paper.setFinish(); + this.items.shape = shape; + + ActivityUtils.initActivity(this); +} + + +function GateActivity(id, x, y) { + this.id = id; + this.type = 'gate'; + + paper.setStart(); + var shape = paper.path('M ' + x + ' ' + y + layout.defs.gate) + .attr({ + 'fill' : layout.colors.gate + }); + + paper.text(x + 7, y + 14, 'STOP') + .attr({ + 'font-size' : 9, + 'font' : 'sans-serif', + 'stroke' : layout.colors.gateText + }) + + this.items = paper.setFinish(); + this.items.shape = shape; + + ActivityUtils.initActivity(this); } \ No newline at end of file Index: lams_central/web/main.jsp =================================================================== diff -u -rf92865513dd2beca642af28ab42096ee4849ac32 -r772f0f585ff29c3b9f51f8201682cc1db3bfee1c --- lams_central/web/main.jsp (.../main.jsp) (revision f92865513dd2beca642af28ab42096ee4849ac32) +++ lams_central/web/main.jsp (.../main.jsp) (revision 772f0f585ff29c3b9f51f8201682cc1db3bfee1c) @@ -243,7 +243,7 @@