Index: lams_monitoring/web/css/_monitorLesson_base.scss =================================================================== diff -u -r0cbfe8e52b48e47d7bd3bb317fda683596cce2ec -rf5f319dfc7d61207ef8a7d60b2cb101f77c7b880 --- lams_monitoring/web/css/_monitorLesson_base.scss (.../_monitorLesson_base.scss) (revision 0cbfe8e52b48e47d7bd3bb317fda683596cce2ec) +++ lams_monitoring/web/css/_monitorLesson_base.scss (.../_monitorLesson_base.scss) (revision f5f319dfc7d61207ef8a7d60b2cb101f77c7b880) @@ -328,6 +328,11 @@ font-size : 16px; z-index : 108; } + +div#sequenceCanvas .activity-requires-attention { + position: absolute; + cursor : pointer; +} div#sequenceCanvas svg.learningDesignSvg { display: block; Index: lams_monitoring/web/includes/javascript/monitorLesson.js =================================================================== diff -u -r0cbfe8e52b48e47d7bd3bb317fda683596cce2ec -rf5f319dfc7d61207ef8a7d60b2cb101f77c7b880 --- lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 0cbfe8e52b48e47d7bd3bb317fda683596cce2ec) +++ lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision f5f319dfc7d61207ef8a7d60b2cb101f77c7b880) @@ -8,6 +8,7 @@ sequenceInfoTimeout = 8000, // which learner was selected in the search box sequenceSearchedLearner = null, + sequencePreviousLearnerData = null, // container for learners' progress bars metadata bars = null, // placeholder for single learner's progress bar and title @@ -1546,23 +1547,32 @@ // branching and gates require extra adjustments isBranching = [10,11,12,13].indexOf(activity.type) > -1, isGate = [3,4,5,14].indexOf(activity.type) > -1, - isContainer = [6,7].indexOf(activity.type) > -1; + isContainer = [6,7].indexOf(activity.type) > -1, + requiresAttentionIcon = activity.requiresAttention ? + $('') + .attr({ + 'id' : 'act' + activity.id + 'attention', + 'src' : LAMS_URL + 'images/icons/exclamation.png', + 'title' : LABELS.CONTRIBUTE_ATTENTION + }) + .addClass('activity-requires-attention') + .appendTo(sequenceCanvas) + : null, - - if (activity.learnerCount > 0){ - if (activity.learners) { - activity.learners = [...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners] - activity.learnerCount = activity.learners.length; - } - - var learningDesignSvgViewbox = learningDesignSvg.attr('viewBox').split(' '), - learningDesignSvgInternalLeftOffset = +learningDesignSvgViewbox[0], - learningDesignSvgInternalTopOffset = +learningDesignSvgViewbox[1], - learningDesignSvgExternalOffset = learningDesignSvg.offset(), - activityLeftOffset = learningDesignSvgExternalOffset.left + coord.x - learningDesignSvgInternalLeftOffset + sequenceCanvas.scrollLeft(), - activityTopOffset = learningDesignSvgExternalOffset.top + coord.y - learningDesignSvgInternalTopOffset + sequenceCanvas.scrollTop(); - - if (isTool || isGrouping) { + learningDesignSvgViewbox = learningDesignSvg.attr('viewBox').split(' '), + learningDesignSvgInternalLeftOffset = +learningDesignSvgViewbox[0], + learningDesignSvgInternalTopOffset = +learningDesignSvgViewbox[1], + learningDesignSvgExternalOffset = learningDesignSvg.offset(), + activityLeftOffset = learningDesignSvgExternalOffset.left + coord.x - learningDesignSvgInternalLeftOffset + sequenceCanvas.scrollLeft(), + activityTopOffset = learningDesignSvgExternalOffset.top + coord.y - learningDesignSvgInternalTopOffset + sequenceCanvas.scrollTop(); + + // if (activity.learners) { + // activity.learners = [...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners,...activity.learners] + // activity.learnerCount = activity.learners.length; + // } + + if (isTool || isGrouping) { + if (activity.learnerCount > 0) { // if learners reached the activity, make room for their icons: make activity icon and label smaller and move to top var activityGroup = $('g[id="' + activity.id + '"]', learningDesignSvg); $('svg', activityGroup).attr({ @@ -1585,14 +1595,14 @@ }) .addClass('activityTitleLabel') .appendTo(activityGroup); - + $.each(activity.learners, function(learnerIndex, learner){ if (learnerIndex >= 7 && activity.learnerCount > 8) { return false; } $(definePortrait(learner.portraitId, learner.id, STYLE_SMALL, true, LAMS_URL)) .css({ - 'left' : activityLeftOffset + (learnerIndex * (activity.learnerCount < 5 ? 45 : 20)) - 2 + 'px', + 'left' : activityLeftOffset + (learnerIndex * (activity.learnerCount < 5 ? 45 : 20)) - 2 + 'px', 'top' : activityTopOffset - 60 + 'px', 'z-index' : 100 + learnerIndex }) @@ -1616,8 +1626,16 @@ .text('+' + (activity.learnerCount - 7)) .appendTo(sequenceCanvas); } - - } else if (isGate) { + } + + if (requiresAttentionIcon) { + requiresAttentionIcon.css({ + 'left' : activityLeftOffset + 160 + 'px', + 'top' : activityTopOffset - 95 + 'px' + }); + } + } else if (isGate) { + if (activity.learnerCount > 0) { $('
') .css({ 'left' : activityLeftOffset + 'px', @@ -1626,7 +1644,16 @@ .addClass('more-learner-icon') .text(activity.learnerCount) .appendTo(sequenceCanvas); - } else if (isBranching) { + } + + if (requiresAttentionIcon) { + requiresAttentionIcon.css({ + 'left' : activityLeftOffset + 5 + 'px', + 'top' : activityTopOffset - 100 + 'px' + }); + } + } else if (isBranching) { + if (activity.learnerCount > 0) { $('
') .css({ 'left' : activityLeftOffset - 20 + 'px', @@ -1635,7 +1662,16 @@ .addClass('more-learner-icon') .text(activity.learnerCount) .appendTo(sequenceCanvas); - } else if (isContainer) { + } + + if (requiresAttentionIcon) { + requiresAttentionIcon.css({ + 'left' : activityLeftOffset - 13 + 'px', + 'top' : activityTopOffset - 124 + 'px' + }); + } + } else if (isContainer) { + if (activity.learnerCount > 0) { $('
') .css({ 'left' : activityLeftOffset + coord.width - 50 + 'px', @@ -1645,81 +1681,14 @@ .text(activity.learnerCount) .appendTo(sequenceCanvas); } - - - /* - var groupTitle = activity.learnerCount + ' ' + LABELS.LEARNER_GROUP_COUNT + ' ' + LABELS.LEARNER_GROUP_SHOW, - element = appendXMLElement('image', { - 'id' : 'act' + activity.id + 'learnerGroup', - 'x' : isBranching ? coord.x + 2 : (isGate ? coord.x + 10 : coord.x2 - 18), - 'y' : isBranching ? coord.y - 12 : coord.y + 1, - 'height' : 16, - 'width' : 16, - 'xlink:href' : LAMS_URL + 'images/icons/group.png', - 'style' : 'cursor : pointer' - }, null, appendTarget); - appendXMLElement('title', null, groupTitle, element); - // add a small number telling how many learners are in the group - element = appendXMLElement('text', { - 'id' : 'act' + activity.id + 'learnerGroupText', - 'x' : isBranching ? coord.x + 9 : (isGate ? coord.x + 17 : coord.x2 - 9), - 'y' : isBranching ? coord.y + 12 : coord.y + 25, - 'text-anchor': 'middle', - 'font-family': 'Verdana', - 'font-size' : 8, - 'style' : 'cursor : pointer' - }, activity.learnerCount, appendTarget); - appendXMLElement('title', null, groupTitle, element); - - if (activity.learners) { - // draw single icons for the first few learners; - // don't do it for gate and optional activities - if ([3,4,5,7,13,14].indexOf(activity.type) == -1) { - $.each(activity.learners, function(learnerIndex, learner){ - var learnerDisplayName = getLearnerDisplayName(learner); - activityLearnerId = 'act' + activity.id + 'learner' + learner.id, - elementAttributes = { - 'id' : activityLearnerId, - 'x' : coord.x + learnerIndex*15 + 1, - // a bit lower for Optional Activity - 'y' : coord.y, - 'height' : 16, - 'width' : 16, - 'xlink:href' : LAMS_URL + 'images/icons/' - + (learner.id == sequenceSearchedLearner ? 'user_red.png' - : (learner.leader ? 'user_online.png' : 'user.png')), - 'style' : 'cursor : pointer', - 'class' : 'popover-link new-popover', - 'data-toggle': 'popover', - 'data-id' : 'popover-'+activityLearnerId, - 'data-fullname': learnerDisplayName}, - element; - - if ( learner.portraitId ) { - elementAttributes['data-portrait'] = learner.portraitId; - } - element = appendXMLElement('image', elementAttributes, null, appendTarget); - }); - } + if (requiresAttentionIcon) { + requiresAttentionIcon.css({ + 'left' : activityLeftOffset - 20 + 'px', + 'top' : activityTopOffset - 80 + 'px' + }); } - */ } - - if (activity.requiresAttention) { - /* - var element = appendXMLElement('image', { - 'id' : 'act' + activity.id + 'attention', - 'x' : isBranching ? coord.x + 14 : coord.x2 - 19, - 'y' : isBranching ? coord.y + 6 : coord.y2 - 19, - 'height' : 16, - 'width' : 16, - 'xlink:href' : LAMS_URL + 'images/icons/exclamation.png', - 'style' : 'cursor : pointer' - }, null, learningDesignSvg[0]); - appendXMLElement('title', null, LABELS.CONTRIBUTE_ATTENTION, element); - */ - } }