MDL-68977 core_table: Do not update dynamic tables on nullop
authorAndrew Nicols <andrew@nicols.co.uk>
Tue, 9 Jun 2020 02:59:08 +0000 (10:59 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Tue, 9 Jun 2020 03:21:04 +0000 (11:21 +0800)
When a setting is added/removed (i.e. an empty filter is removed) and
there is no change, then we should treat this is a null-op and not
refresh the table unnecessarily.

lib/table/amd/build/dynamic.min.js
lib/table/amd/build/dynamic.min.js.map
lib/table/amd/src/dynamic.js

index 0060edc..11ddc73 100644 (file)
Binary files a/lib/table/amd/build/dynamic.min.js and b/lib/table/amd/build/dynamic.min.js differ
index 3cbcaea..089870b 100644 (file)
Binary files a/lib/table/amd/build/dynamic.min.js.map and b/lib/table/amd/build/dynamic.min.js.map differ
index b812a1f..899809b 100644 (file)
@@ -123,9 +123,14 @@ export const updateTable = (tableRoot, {
     checkTableIsDynamic(tableRoot);
 
     const pendingPromise = new Pending('core_table/dynamic:updateTable');
+    let tableConfigChanged = false;
 
     // Update sort fields.
     if (sortBy && sortOrder) {
+        // Always update the table if requested and there were sort fields.
+        // These fields are only ever normalised in the backend.
+        tableConfigChanged = true;
+
         const sortData = JSON.parse(tableRoot.dataset.tableSortData);
         sortData.unshift({
             sortby: sortBy,
@@ -136,33 +141,61 @@ export const updateTable = (tableRoot, {
 
     // Update initials.
     if (firstInitial !== null) {
+        if (tableRoot.dataset.tableFirstInitial !== firstInitial) {
+            tableConfigChanged = true;
+        }
+
         tableRoot.dataset.tableFirstInitial = firstInitial;
     }
 
     if (lastInitial !== null) {
+        if (tableRoot.dataset.tableLastInitial !== lastInitial) {
+            tableConfigChanged = true;
+        }
+
         tableRoot.dataset.tableLastInitial = lastInitial;
     }
 
     if (pageNumber !== null) {
+        if (tableRoot.dataset.tablePageNumber != pageNumber) {
+            tableConfigChanged = true;
+        }
+
         tableRoot.dataset.tablePageNumber = pageNumber;
     }
 
     if (pageSize !== null) {
+        if (tableRoot.dataset.tablePageSize != pageSize) {
+            tableConfigChanged = true;
+        }
+
         tableRoot.dataset.tablePageSize = pageSize;
     }
 
     // Update filters.
     if (filters) {
-        tableRoot.dataset.tableFilters = JSON.stringify(filters);
+        const filterJson = JSON.stringify(filters);
+
+        if (tableRoot.dataset.tableFilters !== filterJson) {
+            tableConfigChanged = true;
+        }
+
+        tableRoot.dataset.tableFilters = filterJson;
     }
 
     // Update hidden columns.
     if (hiddenColumns) {
-        tableRoot.dataset.tableHiddenColumns = JSON.stringify(hiddenColumns);
+        const columnJson = JSON.stringify(hiddenColumns);
+
+        if (tableRoot.dataset.tableHiddenColumns !== columnJson) {
+            tableConfigChanged = true;
+        }
+
+        tableRoot.dataset.tableHiddenColumns = columnJson;
     }
 
     // Refresh.
-    if (refreshContent) {
+    if (refreshContent && tableConfigChanged) {
         return refreshTableContent(tableRoot)
         .then(tableRoot => {
             pendingPromise.resolve();