Răsfoiți Sursa

After segment update, batch refresh dependent segments

Vijayakrishnan Krishnan 1 săptămână în urmă
părinte
comite
54bd8ce01b
2 a modificat fișierele cu 92 adăugiri și 3 ștergeri
  1. 39 1
      js-dev/mc.js
  2. 53 2
      resources/views/app/patient/note/segment_script.blade.php

+ 39 - 1
js-dev/mc.js

@@ -598,9 +598,25 @@ window.refreshAffectedSegmentsByType = function(_type) {
     }
     let segments = window.segmentRefreshConfig.typeToSegments[_type];
     if(segments && segments.length) {
-        for (let i = 0; i < segments.length; i++) {
+
+        // 2024-05-30: optimization round #1
+        // Before: An ajax call per segment to /api/visit/updateSegmentHtml (uid)
+        // After: One ajax call to /api/visit/updateSegmentHtmlMultiple [uid, uid, ..]
+
+        /*for (let i = 0; i < segments.length; i++) {
             refreshSegment(segments[i]);
+        }*/
+
+        // collect the uids
+        let segmentUids = [];
+        for (let i = 0; i < segments.length; i++) {
+            let segment = $('.visit-segment[data-segment-template-name="' + segments[i] + '"]');
+            let uid = segment.attr('data-segment-uid');
+            if(!!uid) segmentUids.push(uid);
         }
+
+        // update all
+        if(!!segmentUids.length) refreshSegmentByUidMultiple(segmentUids);
     }
     else {
         if(!_type) {
@@ -608,6 +624,28 @@ window.refreshAffectedSegmentsByType = function(_type) {
         }
     }
 };
+
+window.refreshSegmentByUidMultiple = function(_uids) {
+
+    for (let i = 0; i < _uids.length; i++) {
+        $('.visit-segment[data-segment-uid="' + _uids[i] + '"]').addClass('refreshing');
+    }
+
+    $.post('/api/visit/updateSegmentHtmlMultiple', {
+        segmentUids: _uids.join(',')
+    }, _data => {
+        // noteSection.removeClass('refreshing');
+        // updateAllSegmentsInResponse(_data);
+        console.log(_data);
+
+        updateAllSegmentsInResponseMultiple(_data);
+
+        for (let i = 0; i < _uids.length; i++) {
+            $('.visit-segment[data-segment-uid="' + _uids[i] + '"]').removeClass('refreshing');
+        }
+    }, 'json');
+}
+
 window.refreshAffectedSegmentsByPopupKey = function(_key) {
     let types = [];
     for(let x in window.segmentRefreshConfig.wizardToTypes) {

+ 53 - 2
resources/views/app/patient/note/segment_script.blade.php

@@ -40,22 +40,73 @@
             }
         }
 
+        // 2024-05-30: optimization round #1
+        // Handler for response from /api/visit/updateSegmentHtmlMultiple [uid, uid, ..]
+        window.updateAllSegmentsInResponseMultiple = function(_response, _updateListeners = true, _updateOnlySummary = false) {
+            if(!hasResponseError(_response)) {
+
+                // _response.data is an array
+                for(let i=0; i<_response.data.length; i++) {
+
+                    let item = _response.data[i];
+
+                    // refresh primary segment (where uid is _response.data.uid)
+                    if(item && item.uid) {
+                        updateSegmentByUid(item.uid, item.summaryHtml, item.editHtml, _updateOnlySummary);
+                    }
+
+                    // refresh listening segments
+                    // TODO: batch it
+                    if(_updateListeners) {
+                        if(item && item.listenerSegmentUids && item.listenerSegmentUids.length) {
+                            for (let i=0; i<item.listenerSegmentUids.length; i++) {
+                                let listenerSegment = $('.note-section[data-segment-uid="' + item.listenerSegmentUids[i] + '"]');
+                                let listenerSegmentTemplateName = listenerSegment.attr('data-segment-template-name');
+                                if(listenerSegment && listenerSegment.length) {
+                                    $.post('/api/visit/updateSegmentHtml', {
+                                        segmentUid: item.listenerSegmentUids[i]
+                                    }, _data => {
+                                        updateAllSegmentsInResponse(_data, false, _updateOnlySummary);
+
+                                        // ugly hack!
+                                        if(listenerSegmentTemplateName === 'medrisk_vigilence') {
+                                            $('.mrv-trigger')
+                                                .empty()
+                                                .append('<div class="text-info font-weight-bold text-center font-size-11">MRV</div>')
+                                                .append(_data.data.summaryHtml);
+                                        }
+
+                                    }, 'json');
+                                }
+                            }
+                        }
+                    }
+
+                }
+
+                // refresh rhs-sidebar
+                window.refreshRHSSidebar();
+
+            }
+        }
+
         window.refreshRHSSidebar = function() {
             let noteRHSSidebar = $('#note-rhs-sidebar');
             if(noteRHSSidebar.length) {
                 let lastUpdatedAt = noteRHSSidebar.attr('last-updated-at');
                 if(lastUpdatedAt) {
                     lastUpdatedAt = +lastUpdatedAt;
-                    if(new Date().getTime() - lastUpdatedAt < 500) { // dont refresh if refreshed less than a second ago
+                    // don't refresh if refreshed less than a second ago
+                    if(new Date().getTime() - lastUpdatedAt < 1000) {
                         console.log('Skipping rhs sidebar refresh');
                         return false;
                     }
                 }
-                noteRHSSidebar.attr('last-updated-at', new Date().getTime());
                 $.get('/note-rhs-sidebar/{{$patient->uid}}/{{$note->uid}}', _data => {
                     noteRHSSidebar
                         .empty()
                         .html($(_data).html());
+                    noteRHSSidebar.attr('last-updated-at', new Date().getTime());
                     $(window).trigger('scroll');
                 });
             }