Index: lams_central/web/css/_learner_base.scss =================================================================== diff -u -re6b3b4b473ebb151c10733808c40d4276b4f81ab -ra9f62e22a4fe8d5adcf84322fbd833c217028fde --- lams_central/web/css/_learner_base.scss (.../_learner_base.scss) (revision e6b3b4b473ebb151c10733808c40d4276b4f81ab) +++ lams_central/web/css/_learner_base.scss (.../_learner_base.scss) (revision a9f62e22a4fe8d5adcf84322fbd833c217028fde) @@ -791,24 +791,7 @@ @include box-shadow(0 5px 10px rgba(0,0,0,.2)); } -// Popovers used in Gradebook to display portraits -// popover links forced to be the usual link color or jqgrid can interfere -.popover-link { - color: $a-link-default !important; -} -.popover-link:hover { - color: $a-link-default-hover !important; -} - -.popover-link:focus { - color: $a-link-default-focus !important; -} - -.popover-title { - background-color: $gray-light-mid; -} - // clickable panel created in CKEditor .lams-bootpanel .clickable { cursor: pointer; @@ -1081,3 +1064,26 @@ margin-bottom: 0px; } } + +// Popovers used in Gradebook to display portraits +// popover links forced to be the usual link color or jqgrid can interfere +.popover-link { + color: $a-link-default !important; +} + +.popover-link:hover { + color: $a-link-default-hover !important; +} + +.popover-link:focus { + color: $a-link-default-focus !important; +} + +.popover-title { + background-color: $gray-light-mid; +} + +.popover-content-with-portrait { + min-height: $portrait-size-image-lg + 20; + min-width: $portrait-size-image-lg + 20; +} Index: lams_central/web/includes/javascript/portrait.js =================================================================== diff -u -refa51a5d0464d96fada4e5a70f1fb86c2d726717 -ra9f62e22a4fe8d5adcf84322fbd833c217028fde --- lams_central/web/includes/javascript/portrait.js (.../portrait.js) (revision efa51a5d0464d96fada4e5a70f1fb86c2d726717) +++ lams_central/web/includes/javascript/portrait.js (.../portrait.js) (revision a9f62e22a4fe8d5adcf84322fbd833c217028fde) @@ -82,36 +82,63 @@ // Create a popover/tooltip to display the learner's portrait. Put it in bind('pagerInitialized pagerComplete', function(event, options){}) // (tablesorter) or within loadComplete (jqgrid). Elements to be processed should have class new-popover and dataset values for 'portrait' // and 'fullname'. Use with definePortraitPopover. Size is optional. -function initializePortraitPopover(LAMS_URL, size) { +function initializePortraitPopover(LAMS_URL, size, placement) { if ( ! size ) size = STYLE_LARGE; + if ( ! placement ) + placement = 'right'; + $('.new-popover').each(function( index, element ) { - var idString = element.dataset.id; - var url = LAMS_URL + '/download?preferDownload=false&uuid='+element.dataset.portrait+_getSizeVersion(size); + if ( ! element.dataset ) { + console.log("Warning: portrait dataset missing. Unable to display portrait. "+element.id); + return; + } + if ( element.dataset.portrait ) { + var url = LAMS_URL + '/download?preferDownload=false&uuid='+element.dataset.portrait+_getSizeVersion(size); + // uses custom template to set the size of the portrait area + var template = '' $(element).popover({ + template: template, content: '', html: true, trigger: 'hover focus', title: element.dataset.fullname, delay: { "show": 400, "hide": 100 }, - container: 'body' // ensures popovers are not clipped within jqgrid tables - }); - element.classList.remove('new-popover'); + container: 'body', // ensures popovers are not clipped within jqgrid tables + placement: placement + }); + } else { + $(element).popover({ + content: element.dataset.fullname, + html: false, + trigger: 'hover focus', + delay: { "show": 400, "hide": 100 }, + container: 'body', // ensures popovers are not clipped within jqgrid tables + placement: placement + }); + } + element.classList.remove('new-popover'); }); } // Define the element to have a popover/tooltip to display the learner's portrait. Call in the ajaxProcessing (tablesorter) or // in a formatter function (jqgrid). Use with initializePortraitPopover. Displays the fullName and portrait in the popover when the // user hovers on linkText. Usually linkText === fullName. -function definePortraitPopover(portraitId, userId, fullName, linkText) { +// +// If showNameNoPortrait and portraitId is missing then assume just want to show the name as a hover area. Useful for showing +// the portraits in the learner progress. +function definePortraitPopover(portraitId, userId, fullName, linkText, showNameNoPortrait) { if ( ! linkText ) linkText = fullName; if ( portraitId ) { return ''+linkText+''; + } else if ( showNameNoPortrait ) { + return ''+linkText+''; } else { return linkText; } Index: lams_gradebook/web/gradebookCourseMonitor.jsp =================================================================== diff -u -re6b3b4b473ebb151c10733808c40d4276b4f81ab -ra9f62e22a4fe8d5adcf84322fbd833c217028fde --- lams_gradebook/web/gradebookCourseMonitor.jsp (.../gradebookCourseMonitor.jsp) (revision e6b3b4b473ebb151c10733808c40d4276b4f81ab) +++ lams_gradebook/web/gradebookCourseMonitor.jsp (.../gradebookCourseMonitor.jsp) (revision a9f62e22a4fe8d5adcf84322fbd833c217028fde) @@ -424,7 +424,7 @@ function userNameFormatter (cellvalue, options, rowObject) { var index = rowObject.length - 1; - return definePortraitPopover(rowObject[index].innerHTML, rowObject[0].innerHTML, cellvalue); + return definePortraitPopover(rowObject[index].innerHTML, rowObject[0].innerHTML, cellvalue, cellvalue, true); } Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -re6b3b4b473ebb151c10733808c40d4276b4f81ab -ra9f62e22a4fe8d5adcf84322fbd833c217028fde --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision e6b3b4b473ebb151c10733808c40d4276b4f81ab) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision a9f62e22a4fe8d5adcf84322fbd833c217028fde) @@ -506,12 +506,12 @@ }) function userNameFormatter (cellvalue, options, rowObject) { - return definePortraitPopover(rowObject[8].innerHTML, rowObject.id, cellvalue); + return definePortraitPopover(rowObject[8].innerHTML, rowObject.id, cellvalue, cellvalue, true); } // Combine portraits with activityURL. Both are optional so it is mix and match. function userNameFormatterActivity (cellvalue, options, rowObject) { - var portProcessed = definePortraitPopover(rowObject[9].innerHTML, rowObject.id, cellvalue); + var portProcessed = definePortraitPopover(rowObject[9].innerHTML, rowObject.id, cellvalue, cellvalue, true); if ( rowObject.children.length > 10 && rowObject[10].innerHTML.length > 0 ) { var activityURL = rowObject[10].innerHTML; if ( portProcessed.indexOf('').attr({ + 'id' : activityLearnerId, 'src' : LAMS_URL + 'images/icons/' + (learner.id == sequenceSearchedLearner ? 'user_red.png' : 'user.png'), 'style' : 'cursor : pointer', - 'title' : getLearnerDisplayName(learner) - }) + 'class' : 'popover-link new-popover', + 'data-toggle': 'popover', + 'data-id' : 'popover-'+activityLearnerId, + 'data-fullname': getLearnerDisplayName(learner) + }) // drag learners to force complete activities .draggable({ 'appendTo' : '#t2', @@ -1434,6 +1450,9 @@ } }) .appendTo(iconsContainer); + if ( learner.portraitId ) { + icon.attr('data-portrait', learner.portraitId); + } if (learner.id == sequenceSearchedLearner){ highlightSearchedLearner(icon);