Index: lams_central/web/includes/javascript/dialog5.js =================================================================== diff -u --- lams_central/web/includes/javascript/dialog5.js (revision 0) +++ lams_central/web/includes/javascript/dialog5.js (revision 7344842c444056d9b34ef71feb165946dd4f64ae) @@ -0,0 +1,452 @@ +var dialogTemplate = $(''); + + +/** + * Checks if the dialog is already opened. + * If not, creates a new dialog with the given ID and init parameters. + */ +function showDialog(id, initParams, extraButtons, recreate) { + var dialog = $('#' + id); + // is it opened already? + if (dialog.length > 0) { + if (recreate){ + dialog.modal('hide'); + + //try to open already existing dialog + } else { + //restore minimised dialog + if (dialog.hasClass('dialogMin')) { + restoreMinimisedDialog(dialog); + + } else { + // we do not support multiple opened bootstrap dialogs yet + // dialog.dialog('moveToTop'); + } + + return; + } + } + + // checks whether the dialog should be created inside a current window or in a parent one. The latter is preferred + //in case we want dialog to be not constrained by the boundaries of a current window + var targetWindow = initParams.isCreateInParentWindow ? window.parent : window; + + // create a new dialog by cloning a template + dialog = dialogTemplate.clone().appendTo(targetWindow.$('body')); + dialog.data('isCreateInParentWindow', initParams.isCreateInParentWindow); + + // use the input attributes or fall back to default ones + initParams = $.extend({ + 'autoOpen' : true, + 'modal' : false, + 'draggable' : true, + 'resizable' : extraButtons == true, + 'startMaximized' : false, + 'beforeClose' : function(){ + $('iframe', this).attr('src', null); + }, + 'close' : function() { + // completely delete the dialog + $(this).remove(); + } + }, initParams); + + // update title + $('.modal-title', dialog).attr('id', id + 'Label').text(initParams.title); + dialog.attr({ + 'id' : id, + 'aria-labelledby' : id + 'Label' + }); + + var modalDialog = $('.modal-dialog', dialog), + modalContent = $('.modal-content', dialog); + + if (initParams.width) { + modalDialog.width(initParams.width); + } + if (initParams.height) { + modalContent.height(initParams.height); + } + if (initParams.resizable) { + modalContent.resizable(); + } + + // disable draggable for Android and iPhone as it breaks the close buttons + var draggable = initParams.draggable && ! /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + if (draggable) { + modalDialog.draggable({ + 'cancel' : '.modal-body, button.close' + }); + } + dialog.data("isDraggable", draggable); + + // store extra attributes for dialog content internal use + if (initParams.data) { + dialog.data(initParams.data); + } + + dialog.on('show.bs.modal', initParams.modal ? initParams.open : function(event){ + + // skip hiding dialog if it's already shown, as bootstrap doesn't fire 'shown.bs.modal' event second time if dialog is already open + if (!dialog.data('shown')) { + dialog.css('visibility', 'hidden'); + } + + if (initParams.open) { + initParams.open.call(dialog, event); + } + + }); + dialog.on('hide.bs.modal', initParams.beforeClose); + dialog.on('hidden.bs.modal', initParams.close); + + dialog.modal({ + 'keyboard' : false, + 'backdrop' : initParams.modal ? 'static' : false, + 'show' : initParams.autoOpen + }); + + if (!initParams.modal) { + // make the dialog non-modal + dialog.on('shown.bs.modal', function(){ + + // store 'shown.bs.modal' event was fired + dialog.data({ + 'shown' : true + }); + + // the main modal div is maximised, we need to shrink it + modalDialog.css({ + 'margin' : 0 + }); + dialog.width(modalDialog.outerWidth(true) + 15); + dialog.height(modalDialog.outerHeight(true) + 15); + // remove overlay + dialog.siblings('.modal-backdrop').remove(); + dialog.css('visibility', 'visible'); + + // center the dialog or put it into previously defined position + var position = dialog.data('position'); + if (position !== false) { + position = position || + (dialog.data('isCreateInParentWindow') ? + { + 'my' : 'center center', + 'at' : 'center center', + 'of' : targetWindow + } + : + { + 'my' : 'top', + 'at' : 'top+15px', + 'of' : window + } + ); + dialog.position(position); + } + + if (draggable) { + modalDialog.on('drag', function(event, ui){ + // pass the event to the dialog, not its internal element + dialog.offset({ + 'top' : Math.min(window.innerHeight - 30, Math.max(0, ui.offset.top + 5)), + 'left' : Math.min(window.innerWidth - 200, Math.max(0, ui.offset.left + 5)) + }); + modalDialog.css({ + 'position' : 'static' + }); + }); + } + + if (initParams.resizable) { + modalContent.on('resize', function(event, ui){ + dialog.width(ui.size.width + 15); + dialog.height(ui.size.height + 15); + }).on('resizestart', function(){ + // disable iframe as a target + // so it does not consume mouse movement when shrinking the dialog + $('iframe', this).css('pointer-events', 'none'); + }).on('resizestop', function(){ + $('iframe', this).css('pointer-events', 'auto'); + }); + } + }); + } + + if (extraButtons) { + var maximizeButton = $('.dialogMaximise', dialog).click(function(){ + var icon = $('i', this), + wasMaxed = icon.hasClass('fa-clone'), + internalDialog = $('.modal-dialog', dialog), + internalContent = $('.modal-content', dialog); + icon.toggleClass('fa-plus').toggleClass('fa-clone'); + if (wasMaxed) { + // restore dialog + var oldWidth = dialog.data('oldWidth'), + oldHeight = dialog.data('oldHeight'); + if (!initParams.modal) { + dialog.width(oldWidth + 15); + dialog.height(oldHeight + 15); + } + internalDialog.width(oldWidth); + internalContent.width(oldWidth); + internalContent.height(oldHeight); + + // enable resizing + $('.ui-resizable-handle', dialog).show(); + } else { + // store previous size + dialog.data({ + 'oldWidth' : internalContent.width(), + 'oldHeight': internalContent.height() + }); + if (!initParams.modal) { + dialog.css({ + 'width' : '100%', + 'height': '100%' + }); + } + internalDialog.css({ + 'width' : '100%', + 'height': '100%' + }); + internalContent.css('width', 'calc(100% - 15px)'); + internalContent.height(internalDialog.height() - 20); + + // disable resizing + $('.ui-resizable-handle', dialog).hide(); + } + // center the dialog + (initParams.modal ? internalDialog : dialog).position( + dialog.data('isCreateInParentWindow') ? + { + 'my' : 'center center', + 'at' : 'center center', + 'of' : window.parent + } + : + { + 'my' : 'top', + 'at' : 'center top', + 'of' : window + } + ); + + internalContent.trigger('resizestop'); + }); + + if (initParams.startMaximized) { + maximizeButton.click(); + } + + $('.dialogMinimise', dialog).click(function() { + if (dialog.hasClass('dialogMin')) { + restoreMinimisedDialog(dialog); + } else { + // swap icon + $('.dialogMinimise i', dialog).toggleClass('fa-minus').toggleClass('fa-clone'); + // store current left position + dialog.data('oldLeft', dialog.css('left')); + dialog.css('left', $('.dialogMin').length * 260 + 5 + 'px'); + dialog.addClass('dialogMin'); + // remove overlay + dialog.siblings('.modal-backdrop').hide(); + // disable maximising + $('.dialogMaximise', dialog).hide(); + // disable rezising + $('.ui-resizable-handle', dialog).hide(); + if (draggable) { + modalDialog.draggable('disable'); + } + //enable scrolling of the parent's content + dialog.parent().removeClass("modal-open"); + }; + }); + + dialog.on('hide.bs.modal', function(){ + shiftMinimisedDialogs($(this)); + }); + } else { + $('.dialogMinimise, .dialogMaximise', dialog).remove(); + } + + return dialog; +} + +function restoreMinimisedDialog(dialog) { + // swap icon + $('.dialogMinimise i', dialog).toggleClass('fa-minus').toggleClass('fa-clone'); + shiftMinimisedDialogs(dialog); + // restore old left position + dialog.css('left', dialog.data('oldLeft')); + dialog.removeClass('dialogMin'); + dialog.siblings('.modal-backdrop').show(); + $('.dialogMaximise', dialog).show(); + $('.ui-resizable-handle', dialog).show(); + if (dialog.data("isDraggable")) { + var modalDialog = $('.modal-dialog', dialog); + modalDialog.draggable('enable'); + } + //disable scrolling of the parent's content + dialog.parent().addClass("modal-open"); + + // in case of monitor dialog reload its content. It's required as all monitor dialogs use the same ids for their HTML elements + var isMonitorDialog = dialog.data('isMonitorDialog'); + if (isMonitorDialog) { + //hide iframe until it gets loaded + $('iframe', dialog).hide(); + $('iframe', dialog).on('load', function() { + $('iframe', dialog).show(); + }); + + //reload iframe + $('iframe', dialog)["0"].contentWindow.location.reload(); + } +} + +/** + * Moves other minimised dialogs to the left after the given dialog was restored or closed. + */ +function shiftMinimisedDialogs(dialog){ + var left = dialog.offset().left; + $('.dialogMin').each(function(){ + var thisDialogLeft = $(this).offset().left; + // if the dialog was to the right of the given dialog, shift it to left + if (left < thisDialogLeft) { + $(this).css('left', thisDialogLeft - 260 + 'px'); + } + }); +} + + +/** + * Focuses on the dialog. Called from within the contained iframe. + */ +function moveDialogToTop(id) { + // $('#' + id).dialog('moveToTop'); +} + + +//used by both /lams_central/web/main.jsp and /lams_central/web/lti/addlesson.jsp pages +function showAuthoringDialog(learningDesignID, relaunchMonitorLessonID){ + var dialog = showDialog('dialogAuthoring', { + 'height' : Math.max(300, $(window).height() - 30), + 'width' : Math.max(600, Math.min(1290, $(window).width() - 60)), + 'title' : LABELS.AUTHORING_TITLE, + 'beforeClose' : function(){ + // if LD was modified, ask the user if he really wants to exit + var innerLib = $('iframe', this)[0].contentWindow.GeneralLib, + // no innerLib means that an exception occured in Authoring + // and the interface is not usable anyway + canClose = !innerLib || innerLib.canClose() || confirm(LABELS.NAVIGATE_AWAY_CONFIRM); + if (canClose) { + $('iframe', this).attr('src', null); + } else { + return false; + } + }, + 'open' : function() { + var url = LAMS_URL + 'authoring/openAuthoring.do'; + + if (learningDesignID) { + url += '?learningDesignID=' + learningDesignID; + } + + // load contents after opening the dialog + $('iframe', this).attr({'src' : url, 'id' : 'authoringModal'}); + } + }, true); + + if (relaunchMonitorLessonID) { + dialog.data('relaunchMonitorLessonID', relaunchMonitorLessonID); + } + + // resize the paper when dialog is resized + $('.modal-content', dialog).on('resizestop', function() { + $('iframe', this)[0].contentWindow.GeneralLib.resizePaper(); + }); +} + + +//used by both /lams_central/web/main.jsp and /lams_monitoring/web/monitor.jsp pages +function showNotificationsDialog(orgID, lessonID) { + //check whether current window is a top level one (otherwise it's an iframe or popup) + var isTopLevelWindow = window.top == window.self; + //calculate width and height based on the dimensions of the window to which dialog is added + var dialogWindow = isTopLevelWindow ? $(window) : $(window.parent); + + // if screen is narrow, then it is much longer + var width = Math.max(380, Math.min(800, dialogWindow.width() - 60)), + height = width < 798 ? 850 : 650; + height = Math.max(380, Math.min(height, dialogWindow.height() - 30)); + + var id = "dialogNotifications" + (lessonID ? "Lesson" + lessonID : "Org" + orgID); + showDialog(id, { + 'data' : { + 'orgID' : orgID, + 'lessonID' : lessonID + }, + 'height': height, + 'width' : width, + //dialog needs to be added to a top level window to avoid boundary limitations of the interim iframe + "isCreateInParentWindow" : !isTopLevelWindow, + 'title' : LABELS.EMAIL_NOTIFICATIONS_TITLE, + 'open' : function() { + var dialog = $(this); + // if lesson ID is given, use lesson view; otherwise use course view + if (lessonID) { + // load contents after opening the dialog + $('iframe', dialog).attr('src', LAMS_URL + + 'monitoring/emailNotifications/getLessonView.do?lessonID=' + + lessonID); + } else { + $('iframe', dialog).attr('src', LAMS_URL + + 'monitoring/emailNotifications/getCourseView.do?organisationID=' + + orgID); + } + } + }, true); +} + + +//used by Page.tag +function showMyPortraitDialog() { + showDialog("dialogMyProfile", { + 'title' : "Portrait", + 'modal' : true, + 'width' : Math.max(380, Math.min(770, $(window).width() - 60)), + 'open' : function() { + var dialog = $(this); + // load contents after opening the dialog + $('iframe', dialog).attr('src', LAMS_URL + 'index.do?redirect=portrait&isReturnButtonHidden=true'); + + // in case of mobile devices allow iframe scrolling + if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { + setTimeout(function() { + dialog.css({ + 'overflow-y' : 'scroll', + '-webkit-overflow-scrolling' : 'touch' + }); + },500); + } + } + }); +} Index: lams_monitoring/web/css/components-monitoring.css =================================================================== diff -u -r9f11e3eeced19099731c175fc0f461ab40e281d5 -r7344842c444056d9b34ef71feb165946dd4f64ae --- lams_monitoring/web/css/components-monitoring.css (.../components-monitoring.css) (revision 9f11e3eeced19099731c175fc0f461ab40e281d5) +++ lams_monitoring/web/css/components-monitoring.css (.../components-monitoring.css) (revision 7344842c444056d9b34ef71feb165946dd4f64ae) @@ -23,7 +23,8 @@ margin: 0; } -.monitoring-page-wrapper input:focus, .monitoring-page-wrapper button:focus, .monitoring-page-wrapper textarea:focus { +.monitoring-page-wrapper input:focus, .monitoring-page-wrapper button:focus, + .monitoring-page-wrapper textarea:focus { outline: none; } @@ -46,14 +47,14 @@ } .monitoring-page-wrapper .component-sidebar .menu-li a svg .c, -.monitoring-page-wrapper .component-sidebar .menu-li a svg .d, -.monitoring-page-wrapper .component-sidebar .menu-li a svg rect { + .monitoring-page-wrapper .component-sidebar .menu-li a svg .d, + .monitoring-page-wrapper .component-sidebar .menu-li a svg rect { stroke: #ACB5CC; transition: all .3s ease; } .monitoring-page-wrapper .component-sidebar .menu-li a svg .a, -.monitoring-page-wrapper .component-sidebar .menu-li a svg .b { + .monitoring-page-wrapper .component-sidebar .menu-li a svg .b { stroke: transparent; transition: all .3s ease; } @@ -64,35 +65,42 @@ transition: all .3s ease; } -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3) a svg .a { +.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3) a svg .a + { stroke: #ACB5CC; } -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3) a svg .b { +.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3) a svg .b + { stroke: transparent; } .monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2):hover a svg rect.b, -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2):hover a svg .d, -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2):hover a svg .c { + .monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2):hover a svg .d, + .monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2):hover a svg .c + { stroke: #3C42E0; } .monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2).active a svg rect.b, -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2).active a svg .d, -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2).active a svg .c { + .monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2).active a svg .d, + .monitoring-page-wrapper .component-sidebar .menu-li:nth-child(2).active a svg .c + { stroke: #3C42E0; } -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3):hover a svg .a { +.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3):hover a svg .a + { stroke: #3C42E0; } -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3).active a svg .a { +.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(3).active a svg .a + { stroke: #3C42E0; } -.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(4):hover a svg path.b { +.monitoring-page-wrapper .component-sidebar .menu-li:nth-child(4):hover a svg path.b + { fill: #3C42E0; } @@ -130,8 +138,6 @@ display: block; } */ - - .monitoring-page-wrapper .content-left { -ms-flex: 0 0 26.5rem; flex: 0 0 26.5rem; @@ -154,7 +160,6 @@ justify-content: space-between; } - .monitoring-page-wrapper .graph-star-col { width: 5rem; } @@ -228,7 +233,6 @@ background-color: #fff; } - .monitoring-page-wrapper .user-map-col { background-image: url(/lams/images/components/lines.png); background-size: cover; @@ -342,7 +346,8 @@ margin: 0; } -.monitoring-page-wrapper #required-tasks-content .label.contribute-activity-title { +.monitoring-page-wrapper #required-tasks-content .label.contribute-activity-title + { font-family: mont-bold, sans-serif; } @@ -360,7 +365,13 @@ box-shadow: 0px 3px 6px #3C42E040; } -.monitoring-page-wrapper #required-tasks-content button.contribute-go-button { +.monitoring-page-wrapper #required-tasks-content button.contribute-gate-opened-button + { + background-color: #05CCD6; +} + +.monitoring-page-wrapper #required-tasks-content button.contribute-go-button + { min-width: 5rem; } @@ -386,7 +397,6 @@ color: #3C42E0; } - .monitoring-page-wrapper .content-left.content-left1 { -ms-flex: 0 0 100%; flex: 0 0 100%; @@ -517,7 +527,8 @@ padding-left: 4.9rem; } -.monitoring-page-wrapper .table-sorter-top.row .table-user-progress .progress-col { +.monitoring-page-wrapper .table-sorter-top.row .table-user-progress .progress-col + { width: 23rem; max-width: calc(100% - 4rem); height: .4rem; @@ -528,7 +539,8 @@ margin-top: 1rem; } -.monitoring-page-wrapper .table-sorter-top.row .table-user-progress .progress-col .progress1 { +.monitoring-page-wrapper .table-sorter-top.row .table-user-progress .progress-col .progress1 + { float: left; height: 100%; background-color: #FFCF60; @@ -627,9 +639,10 @@ margin-top: 3rem; } -.monitoring-page-wrapper #chart-2, .monitoring-page-wrapper #chart-3, .monitoring-page-wrapper #chart-4, -.monitoring-page-wrapper #chart-5, .monitoring-page-wrapper #chart-6, .monitoring-page-wrapper #chart-7, -.monitoring-page-wrapper #chart-8 { +.monitoring-page-wrapper #chart-2, .monitoring-page-wrapper #chart-3, + .monitoring-page-wrapper #chart-4, .monitoring-page-wrapper #chart-5, + .monitoring-page-wrapper #chart-6, .monitoring-page-wrapper #chart-7, + .monitoring-page-wrapper #chart-8 { height: 256px !important } @@ -704,12 +717,14 @@ } /* Track */ -.monitoring-page-wrapper .table-content-right-inner::-webkit-scrollbar-track { +.monitoring-page-wrapper .table-content-right-inner::-webkit-scrollbar-track + { background: #fff; } /* Handle */ -.monitoring-page-wrapper .table-content-right-inner::-webkit-scrollbar-thumb { +.monitoring-page-wrapper .table-content-right-inner::-webkit-scrollbar-thumb + { background: #20639B; border-radius: 45px; } @@ -743,21 +758,25 @@ background-color: transparent; } -.monitoring-page-wrapper .cd-timeline__block:nth-child(odd) .cd-timeline__content { +.monitoring-page-wrapper .cd-timeline__block:nth-child(odd) .cd-timeline__content + { border-right: 4px solid #1AD9B2; } -.monitoring-page-wrapper .cd-timeline__block:nth-child(odd) .cd-timeline__content:before { +.monitoring-page-wrapper .cd-timeline__block:nth-child(odd) .cd-timeline__content:before + { right: -18px; left: inherit; border-left-color: #1AD9B2; } -.monitoring-page-wrapper .cd-timeline__block:nth-child(even) .cd-timeline__content { +.monitoring-page-wrapper .cd-timeline__block:nth-child(even) .cd-timeline__content + { border-left: 4px solid #FFCF60; } -.monitoring-page-wrapper .cd-timeline__block:nth-child(even) .cd-timeline__content:before { +.monitoring-page-wrapper .cd-timeline__block:nth-child(even) .cd-timeline__content:before + { left: -18px !important; right: inherit !important; border-right-color: #FFCF60; @@ -798,7 +817,7 @@ padding-right: 1.5rem; } -..monitoring-page-wrapper cd-timeline__content p span { +.monitoring-page-wrapper cd-timeline__content p span { float: right; } @@ -808,4 +827,328 @@ .monitoring-page-wrapper .progress1.green { background-color: #1AD9B2 !important; +} + + +.dialogContainer { + display: none; + -webkit-overflow-scrolling: touch !important; + overflow: auto; +} + +.dialogContainer iframe { + width: 100%; + height: 100%; + border: none; +} + +.dialogContainer .modal-body { + height: 100%; + max-height: calc(100% - 56px); + padding: 10px; + overflow: auto; +} + + +/********** CANVAS STYLES **********/ +#canvas-container div#sequenceCanvas { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +#canvas-container div#sequenceCanvas div.learner-icon-container { + position: relative; +} + +#canvas-container div#sequenceCanvas div.learner-icon-container div.learner-icon, + #completedLearnersContainer div.learner-icon { + border-radius: 20px; + background-color: #FFFFFF; +} + +#canvas-container div#sequenceCanvas div.learner-icon-container div.learner-icon, div#sequenceCanvas div.learner-icon-container div.more-learner-icon + { + position: absolute; +} + +#completedLearnersContainer { + overflow: auto; +} + +#completedLearnersContainer div.learner-icon { + margin-right: 5px; + min-width: 35px; +} + +#canvas-container div#sequenceCanvas div.more-learner-icon, #completedLearnersContainer div.more-learner-icon + { + display: inline-block; + width: 35px; + height: 35px; + line-height: 35px; + font-size: 13px; + border-radius: 20px; + cursor: pointer; + background-color: #e7e7e7; + text-align: center; +} + +#canvas-container div#sequenceCanvas div.learner-icon.learner-searched { + border: red 3px solid; + border-radius: 25px; + z-index: 109 !important; +} + +#canvas-container div#sequenceCanvas div.portrait-generic-sm.learner-icon.learner-searched + { + border: none; +} + +#canvas-container div#sequenceCanvas div.portrait-generic-sm.learner-icon.learner-searched::before + { + border: red 3px solid; + border-radius: 25px; +} + +#canvas-container div#sequenceCanvas .activity-requires-attention { + cursor: pointer; + width: 16px; + height: 16px; +} + +#completedLearnersContainer #completedLessonLearnersIcon { + width: 35px; + height: 35px; + margin-right: 5px; +} + +#canvas-container div#sequenceCanvas svg.svg-learning-design { + display: block; + overflow: visible; +} + +#canvas-container div#sequenceCanvas svg.svg-learning-design g.gate svg { + display: none; +} + +#canvas-container img#sequenceCanvasLoading { + padding: 5px 0 0 100px; + display: none; +} + +#canvas-container .topButtonsContainer #sequenceSearchPhrase { + float: right; + margin: 6px 5px 5px 0; +} + +#canvas-container .topButtonsContainer #sequenceSearchPhraseIcon { + float: right; + margin: 9px 7px 5px 0; +} + +#canvas-container .topButtonsContainer #sequenceSearchPhraseClear { + float: right; + cursor: pointer; + margin: 9px 25px 5px 0; + visibility: hidden; +} + +#canvas-container .ui-menu-item-wrapper.autocomplete-menu-item-with-portrait { + display: flex; + justify-content: space-between; +} + +#canvas-container .ui-menu-item-wrapper.autocomplete-menu-item-with-portrait>p { + padding-top: 10px; +} + +#canvas-container img#sequenceSearchedLearnerHighlighter { + position: absolute; + display: none; +} + +#canvas-container div#completedLearnersContainer { + display: flex; + padding: 4px 0px 3px 5px; + border-top: thin dotted #AAAAAA; +} + +#canvas-container div#completedLearnersContainer span { + font-family: Verdana; + font-size: 10px; + cursor: default; + vertical-align: top; + margin-right: 5px; +} + +#sequenceInfoDialog { + cursor: pointer; +} + +#canvas-container .portrait-sm { + width: 35px; + height: 35px; + display: inline-block; + background-repeat: no-repeat; + background-size: cover; +} + +#canvas-container .portrait-md { + width: 80px; + height: 80px; + display: inline-block; + background-repeat: no-repeat; + background-size: cover; +} + +#canvas-container .portrait-lg { + width: 200px; + height: 200px; + display: inline-block; + background-repeat: no-repeat; + background-size: cover; +} + +#canvas-container .portrait-xl { + width: 400px; + height: 400px; + display: inline-block; + background-repeat: no-repeat; + background-size: cover; +} + +#canvas-container .portrait-container-sm { + height: 38px; + margin-top: 3px; +} + +#canvas-container .portrait-color-0 { + color: #001f3f; +} + +#canvas-container .portrait-color-1 { + color: #FF851B; +} + +#canvas-container .portrait-color-2 { + color: #85144b; +} + +#canvas-container .portrait-color-3 { + color: #111111; +} + +#canvas-container .portrait-color-4 { + color: #3D9970; +} + +#canvas-container .portrait-color-5 { + color: #0074D9; +} + +#canvas-container .portrait-color-6 { + color: #FF4136; +} + +#canvas-container .portrait-sm-lineheight { + line-height: 32px; + vertical-align: top; +} + +#canvas-container .portrait-generic-sm { + display: inline-block; + height: 35px; + vertical-align: middle; +} + +#canvas-container .portrait-generic-sm:before { + content: "\f2be"; + font-family: FontAwesome; + font-style: normal; + font-size: 35px; + font-weight: normal; + line-height: 35px; +} + +#canvas-container .portrait-generic-md { + display: inline-block; + height: 80px; + vertical-align: middle; +} + +#canvas-container .portrait-generic-md:before { + content: "\f2be"; + font-family: FontAwesome; + font-style: normal; + font-size: 80px; + font-weight: normal; + line-height: 65px; +} + +#canvas-container .portrait-generic-lg { + display: inline-block; + height: 200px; + vertical-align: middle; +} + +#canvas-container .portrait-generic-lg:before { + content: "\f2be"; + font-family: FontAwesome; + font-style: normal; + font-size: 200px; + font-weight: normal; + line-height: 200px; +} + +#canvas-container .portrait-generic-xl { + display: inline-block; + height: 400px; + vertical-align: middle; +} + +#canvas-container .portrait-generic-xl:before { + content: "\f2be"; + font-family: FontAwesome; + font-style: normal; + font-size: 400px; + font-weight: normal; + line-height: 400px; +} + +#canvas-container .leader-display { + margin: 0px; +} + +#canvas-container .leader-display h4 { + margin-bottom: 0px; +} + +#canvas-container .popover-link { + color: #337ab7 !important; +} + +#canvas-container .popover-link:hover { + color: #0E9AEF !important; +} + +#canvas-container .popover-link:focus { + color: #0E9AEF !important; +} + +#canvas-container .popover-title { + background-color: #dddddd; +} + +#canvas-container .popover-content-with-portrait { + min-height: 220px; + min-width: 220px; } \ No newline at end of file Index: lams_monitoring/web/includes/javascript/monitorLesson5.js =================================================================== diff -u -r9f11e3eeced19099731c175fc0f461ab40e281d5 -r7344842c444056d9b34ef71feb165946dd4f64ae --- lams_monitoring/web/includes/javascript/monitorLesson5.js (.../monitorLesson5.js) (revision 9f11e3eeced19099731c175fc0f461ab40e281d5) +++ lams_monitoring/web/includes/javascript/monitorLesson5.js (.../monitorLesson5.js) (revision 7344842c444056d9b34ef71feb165946dd4f64ae) @@ -1,7 +1,34 @@ - //auto refresh all tabs every 30 seconds -let autoRefreshInterval = 30 * 1000, - autoRefreshIntervalObject = null; +// ********** GLOBAL VARIABLES ********** +// copy of lesson SVG so it does no need to be fetched every time +let originalSequenceCanvas = null, + // DIV container for lesson SVG + // it gets accessed so many times it's worth to cache it here + sequenceCanvas = $('#sequenceCanvas'), + // switch between SVG original size and fit-to-sreen (enlarge/shrink) + learningDesignSvgFitScreen = false, +// info box show timeout + sequenceInfoTimeout = 8000, + // which learner was selected in the search box + sequenceSearchedLearner = null, + // for synchronisation purposes + sequenceRefreshInProgress = false, + //auto refresh all tabs every 30 seconds + autoRefreshInterval = 30 * 1000, + autoRefreshIntervalObject = null, +// when user is doing something, do not auto refresh + autoRefreshBlocked = false, +// double tap support + tapTimeout = 500, + lastTapTime = 0, + lastTapTarget = null, +// popup window size + popupWidth = 1280, + popupHeight = 720, + + gateOpenIconPath = 'images/svg/gateOpen.svg', + gateOpenIconData = null; + function refreshMonitor(tabName, isAuto){ if (autoRefreshIntervalObject && !isAuto) { clearInterval(autoRefreshIntervalObject); @@ -15,6 +42,7 @@ } updateLessonTab(); + updateSequenceTab(); } /** @@ -33,6 +61,12 @@ updateContributeActivities(response.contributeActivities); } }); + + /* + drawChart('pie', 'chartDiv', + LAMS_URL + 'monitoring/monitoring/getLessonChartData.do?lessonID=' + lessonId, + true); + */ } @@ -84,7 +118,12 @@ switch (this.contributionType) { case 3 : case 12 : if (this.isComplete) { - entryContent += '' + LABELS.CONTRIBUTE_OPENED_GATE + ''; + entryContent += '
'; } else { entryContent += '