From ca69d3875e25ec2c539e5ae22367e3480e84c122 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Fri, 24 Apr 2020 09:40:32 +0800 Subject: [PATCH] MDL-68506 core_table: Add a tableContentRefreshed event --- lib/table/amd/build/dynamic.min.js | 2 +- lib/table/amd/build/dynamic.min.js.map | 2 +- .../amd/build/local/dynamic/events.min.js | 2 ++ .../amd/build/local/dynamic/events.min.js.map | 1 + .../amd/build/local/dynamic/selectors.min.js | 2 +- .../build/local/dynamic/selectors.min.js.map | 2 +- lib/table/amd/src/dynamic.js | 34 +++++++++++++++++-- lib/table/amd/src/local/dynamic/events.js | 29 ++++++++++++++++ lib/table/amd/src/local/dynamic/selectors.js | 1 + 9 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 lib/table/amd/build/local/dynamic/events.min.js create mode 100644 lib/table/amd/build/local/dynamic/events.min.js.map create mode 100644 lib/table/amd/src/local/dynamic/events.js diff --git a/lib/table/amd/build/dynamic.min.js b/lib/table/amd/build/dynamic.min.js index 96cc2ca97ef..6b39495f61f 100644 --- a/lib/table/amd/build/dynamic.min.js +++ b/lib/table/amd/build/dynamic.min.js @@ -1,2 +1,2 @@ -define ("core_table/dynamic",["exports","core_table/local/dynamic/repository","core_table/local/dynamic/selectors"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=a.setLastInitial=a.setFirstInitial=a.setPageSize=a.setPageNumber=a.setSortOrder=a.setFilters=a.updateTable=a.refreshTableContent=void 0;c=function(a){if(a&&a.__esModule){return a}else{var b={};if(null!=a){for(var c in a){if(Object.prototype.hasOwnProperty.call(a,c)){var d=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(a,c):{};if(d.get||d.set){Object.defineProperty(b,c,d)}else{b[c]=a[c]}}}}b.default=a;return b}}(c);function d(a){return g(a)||f(a)||e()}function e(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function f(a){if(Symbol.iterator in Object(a)||"[object Arguments]"===Object.prototype.toString.call(a))return Array.from(a)}function g(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b.\n\n/**\n * Module to handle dynamic table features.\n *\n * @module core_table/dynamic\n * @package core_table\n * @copyright 2020 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {fetch as fetchTableData} from 'core_table/local/dynamic/repository';\nimport * as Selectors from 'core_table/local/dynamic/selectors';\n\nlet watching = false;\n\n/**\n * Ensure that a table is a dynamic table.\n *\n * @param {HTMLElement} tableRoot\n * @returns {Bool}\n */\nconst checkTableIsDynamic = tableRoot => {\n if (!tableRoot) {\n // The table is not a dynamic table.\n throw new Error(\"The table specified is not a dynamic table and cannot be updated\");\n }\n\n if (!tableRoot.matches(Selectors.main.region)) {\n // The table is not a dynamic table.\n throw new Error(\"The table specified is not a dynamic table and cannot be updated\");\n }\n\n return true;\n};\n\n/**\n * Get the filterset data from a known dynamic table.\n *\n * @param {HTMLElement} tableRoot\n * @returns {Object}\n */\nconst getFiltersetFromTable = tableRoot => {\n return JSON.parse(tableRoot.dataset.tableFilters);\n};\n\n/**\n * Update the specified table based on its current values.\n *\n * @param {HTMLElement} tableRoot\n * @returns {Promise}\n */\nexport const refreshTableContent = tableRoot => {\n const filterset = getFiltersetFromTable(tableRoot);\n\n return fetchTableData(\n tableRoot.dataset.tableComponent,\n tableRoot.dataset.tableHandler,\n tableRoot.dataset.tableUniqueid,\n {\n sortBy: tableRoot.dataset.tableSortBy,\n sortOrder: tableRoot.dataset.tableSortOrder,\n joinType: filterset.jointype,\n filters: filterset.filters,\n firstinitial: tableRoot.dataset.tableFirstInitial,\n lastinitial: tableRoot.dataset.tableLastInitial,\n pageNumber: tableRoot.dataset.tablePageNumber,\n pageSize: tableRoot.dataset.tablePageSize,\n }\n )\n .then(data => {\n const placeholder = document.createElement('div');\n placeholder.innerHTML = data.html;\n tableRoot.replaceWith(...placeholder.childNodes);\n\n return data;\n });\n};\n\nexport const updateTable = (tableRoot, {\n sortBy = null,\n sortOrder = null,\n filters = null,\n firstInitial = null,\n lastInitial = null,\n pageNumber = null,\n pageSize = null,\n} = {}, refreshContent = true) => {\n checkTableIsDynamic(tableRoot);\n\n // Update sort fields.\n if (sortBy && sortOrder) {\n tableRoot.dataset.tableSortBy = sortBy;\n tableRoot.dataset.tableSortOrder = sortOrder;\n }\n\n // Update initials.\n if (firstInitial !== null) {\n tableRoot.dataset.tableFirstInitial = firstInitial;\n }\n\n if (lastInitial !== null) {\n tableRoot.dataset.tableLastInitial = lastInitial;\n }\n\n if (pageNumber !== null) {\n tableRoot.dataset.tablePageNumber = pageNumber;\n }\n\n if (pageSize !== null) {\n tableRoot.dataset.tablePageSize = pageSize;\n }\n\n // Update filters.\n if (filters) {\n tableRoot.dataset.tableFilters = JSON.stringify(filters);\n }\n\n // Refresh.\n if (refreshContent) {\n return refreshTableContent(tableRoot);\n } else {\n return Promise.resolve();\n }\n};\n\n/**\n * Update the specified table using the new filters.\n *\n * @param {HTMLElement} tableRoot\n * @param {Object} filters\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setFilters = (tableRoot, filters, refreshContent = true) =>\n updateTable(tableRoot, {filters}, refreshContent);\n\n/**\n * Update the sort order.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} sortBy\n * @param {Number} sortOrder\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setSortOrder = (tableRoot, sortBy, sortOrder, refreshContent = true) =>\n updateTable(tableRoot, {sortBy, sortOrder}, refreshContent);\n\n/**\n * Set the page number.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} pageNumber\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setPageNumber = (tableRoot, pageNumber, refreshContent = true) =>\n updateTable(tableRoot, {pageNumber}, refreshContent);\n\n/**\n * Set the page size.\n *\n * @param {HTMLElement} tableRoot\n * @param {Number} pageSize\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setPageSize = (tableRoot, pageSize, refreshContent = true) =>\n updateTable(tableRoot, {pageSize, pageNumber: 0}, refreshContent);\n\n/**\n * Update the first initial to show.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} firstInitial\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setFirstInitial = (tableRoot, firstInitial, refreshContent = true) =>\n updateTable(tableRoot, {firstInitial}, refreshContent);\n\n/**\n * Update the last initial to show.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} lastInitial\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setLastInitial = (tableRoot, lastInitial, refreshContent = true) =>\n updateTable(tableRoot, {lastInitial}, refreshContent);\n\n/**\n * Set up listeners to handle table updates.\n */\nexport const init = () => {\n if (watching) {\n // Already watching.\n return;\n }\n watching = true;\n\n document.addEventListener('click', e => {\n const tableRoot = e.target.closest(Selectors.main.region);\n\n if (!tableRoot) {\n return;\n }\n\n const sortableLink = e.target.closest(Selectors.table.links.sortableColumn);\n if (sortableLink) {\n e.preventDefault();\n\n setSortOrder(tableRoot, sortableLink.dataset.sortby, sortableLink.dataset.sortorder);\n }\n\n const firstInitialLink = e.target.closest(Selectors.initialsBar.links.firstInitial);\n if (firstInitialLink !== null) {\n e.preventDefault();\n\n setFirstInitial(tableRoot, firstInitialLink.dataset.initial);\n }\n\n const lastInitialLink = e.target.closest(Selectors.initialsBar.links.lastInitial);\n if (lastInitialLink !== null) {\n e.preventDefault();\n\n setLastInitial(tableRoot, lastInitialLink.dataset.initial);\n }\n\n const pageItem = e.target.closest(Selectors.paginationBar.links.pageItem);\n if (pageItem) {\n e.preventDefault();\n\n setPageNumber(tableRoot, pageItem.dataset.pageNumber);\n }\n });\n};\n"],"file":"dynamic.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/dynamic.js"],"names":["watching","checkTableIsDynamic","tableRoot","Error","matches","Selectors","main","region","getFiltersetFromTable","JSON","parse","dataset","tableFilters","refreshTableContent","filterset","tableComponent","tableHandler","tableUniqueid","sortBy","tableSortBy","sortOrder","tableSortOrder","joinType","jointype","filters","firstinitial","tableFirstInitial","lastinitial","tableLastInitial","pageNumber","tablePageNumber","pageSize","tablePageSize","then","data","placeholder","document","createElement","innerHTML","html","replaceWith","childNodes","getTableFromId","dispatchEvent","CustomEvent","Events","tableContentRefreshed","bubbles","updateTable","firstInitial","lastInitial","refreshContent","stringify","Promise","resolve","setFilters","setSortOrder","setPageNumber","setPageSize","setFirstInitial","setLastInitial","init","addEventListener","e","target","closest","sortableLink","table","links","sortableColumn","preventDefault","sortby","sortorder","firstInitialLink","initialsBar","initial","lastInitialLink","pageItem","paginationBar","tableRegionId","querySelector","fromRegionId"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to handle dynamic table features.\n *\n * @module core_table/dynamic\n * @package core_table\n * @copyright 2020 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {fetch as fetchTableData} from 'core_table/local/dynamic/repository';\nimport * as Selectors from 'core_table/local/dynamic/selectors';\nimport Events from './local/dynamic/events';\n\nlet watching = false;\n\n/**\n * Ensure that a table is a dynamic table.\n *\n * @param {HTMLElement} tableRoot\n * @returns {Bool}\n */\nconst checkTableIsDynamic = tableRoot => {\n if (!tableRoot) {\n // The table is not a dynamic table.\n throw new Error(\"The table specified is not a dynamic table and cannot be updated\");\n }\n\n if (!tableRoot.matches(Selectors.main.region)) {\n // The table is not a dynamic table.\n throw new Error(\"The table specified is not a dynamic table and cannot be updated\");\n }\n\n return true;\n};\n\n/**\n * Get the filterset data from a known dynamic table.\n *\n * @param {HTMLElement} tableRoot\n * @returns {Object}\n */\nconst getFiltersetFromTable = tableRoot => {\n return JSON.parse(tableRoot.dataset.tableFilters);\n};\n\n/**\n * Update the specified table based on its current values.\n *\n * @param {HTMLElement} tableRoot\n * @returns {Promise}\n */\nexport const refreshTableContent = tableRoot => {\n const filterset = getFiltersetFromTable(tableRoot);\n\n return fetchTableData(\n tableRoot.dataset.tableComponent,\n tableRoot.dataset.tableHandler,\n tableRoot.dataset.tableUniqueid,\n {\n sortBy: tableRoot.dataset.tableSortBy,\n sortOrder: tableRoot.dataset.tableSortOrder,\n joinType: filterset.jointype,\n filters: filterset.filters,\n firstinitial: tableRoot.dataset.tableFirstInitial,\n lastinitial: tableRoot.dataset.tableLastInitial,\n pageNumber: tableRoot.dataset.tablePageNumber,\n pageSize: tableRoot.dataset.tablePageSize,\n }\n )\n .then(data => {\n const placeholder = document.createElement('div');\n placeholder.innerHTML = data.html;\n tableRoot.replaceWith(...placeholder.childNodes);\n\n // Update the tableRoot.\n return getTableFromId(tableRoot.dataset.tableUniqueid);\n }).then(tableRoot => {\n tableRoot.dispatchEvent(new CustomEvent(Events.tableContentRefreshed, {\n bubbles: true,\n }));\n\n return tableRoot;\n });\n};\n\nexport const updateTable = (tableRoot, {\n sortBy = null,\n sortOrder = null,\n filters = null,\n firstInitial = null,\n lastInitial = null,\n pageNumber = null,\n pageSize = null,\n} = {}, refreshContent = true) => {\n checkTableIsDynamic(tableRoot);\n\n // Update sort fields.\n if (sortBy && sortOrder) {\n tableRoot.dataset.tableSortBy = sortBy;\n tableRoot.dataset.tableSortOrder = sortOrder;\n }\n\n // Update initials.\n if (firstInitial !== null) {\n tableRoot.dataset.tableFirstInitial = firstInitial;\n }\n\n if (lastInitial !== null) {\n tableRoot.dataset.tableLastInitial = lastInitial;\n }\n\n if (pageNumber !== null) {\n tableRoot.dataset.tablePageNumber = pageNumber;\n }\n\n if (pageSize !== null) {\n tableRoot.dataset.tablePageSize = pageSize;\n }\n\n // Update filters.\n if (filters) {\n tableRoot.dataset.tableFilters = JSON.stringify(filters);\n }\n\n // Refresh.\n if (refreshContent) {\n return refreshTableContent(tableRoot);\n } else {\n return Promise.resolve(tableRoot);\n }\n};\n\n/**\n * Update the specified table using the new filters.\n *\n * @param {HTMLElement} tableRoot\n * @param {Object} filters\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setFilters = (tableRoot, filters, refreshContent = true) =>\n updateTable(tableRoot, {filters}, refreshContent);\n\n/**\n * Update the sort order.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} sortBy\n * @param {Number} sortOrder\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setSortOrder = (tableRoot, sortBy, sortOrder, refreshContent = true) =>\n updateTable(tableRoot, {sortBy, sortOrder}, refreshContent);\n\n/**\n * Set the page number.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} pageNumber\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setPageNumber = (tableRoot, pageNumber, refreshContent = true) =>\n updateTable(tableRoot, {pageNumber}, refreshContent);\n\n/**\n * Set the page size.\n *\n * @param {HTMLElement} tableRoot\n * @param {Number} pageSize\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setPageSize = (tableRoot, pageSize, refreshContent = true) =>\n updateTable(tableRoot, {pageSize, pageNumber: 0}, refreshContent);\n\n/**\n * Update the first initial to show.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} firstInitial\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setFirstInitial = (tableRoot, firstInitial, refreshContent = true) =>\n updateTable(tableRoot, {firstInitial}, refreshContent);\n\n/**\n * Update the last initial to show.\n *\n * @param {HTMLElement} tableRoot\n * @param {String} lastInitial\n * @param {Bool} refreshContent\n * @returns {Promise}\n */\nexport const setLastInitial = (tableRoot, lastInitial, refreshContent = true) =>\n updateTable(tableRoot, {lastInitial}, refreshContent);\n\n/**\n * Set up listeners to handle table updates.\n */\nexport const init = () => {\n if (watching) {\n // Already watching.\n return;\n }\n watching = true;\n\n document.addEventListener('click', e => {\n const tableRoot = e.target.closest(Selectors.main.region);\n\n if (!tableRoot) {\n return;\n }\n\n const sortableLink = e.target.closest(Selectors.table.links.sortableColumn);\n if (sortableLink) {\n e.preventDefault();\n\n setSortOrder(tableRoot, sortableLink.dataset.sortby, sortableLink.dataset.sortorder);\n }\n\n const firstInitialLink = e.target.closest(Selectors.initialsBar.links.firstInitial);\n if (firstInitialLink !== null) {\n e.preventDefault();\n\n setFirstInitial(tableRoot, firstInitialLink.dataset.initial);\n }\n\n const lastInitialLink = e.target.closest(Selectors.initialsBar.links.lastInitial);\n if (lastInitialLink !== null) {\n e.preventDefault();\n\n setLastInitial(tableRoot, lastInitialLink.dataset.initial);\n }\n\n const pageItem = e.target.closest(Selectors.paginationBar.links.pageItem);\n if (pageItem) {\n e.preventDefault();\n\n setPageNumber(tableRoot, pageItem.dataset.pageNumber);\n }\n });\n};\n\n/**\n * Fetch the table via its table region id.\n *\n * @param {String} tableRegionId\n * @returns {HTMLElement}\n */\nexport const getTableFromId = tableRegionId => {\n const tableRoot = document.querySelector(Selectors.main.fromRegionId(tableRegionId));\n\n\n if (!tableRoot) {\n // The table is not a dynamic table.\n throw new Error(\"The table specified is not a dynamic table and cannot be updated\");\n }\n\n return tableRoot;\n};\n\nexport {\n Events\n};\n"],"file":"dynamic.min.js"} \ No newline at end of file diff --git a/lib/table/amd/build/local/dynamic/events.min.js b/lib/table/amd/build/local/dynamic/events.min.js new file mode 100644 index 00000000000..2c0a7878179 --- /dev/null +++ b/lib/table/amd/build/local/dynamic/events.min.js @@ -0,0 +1,2 @@ +define ("core_table/local/dynamic/events",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;var b={tableContentRefreshed:function prefixEventName(a){return"core_table/dynamic:".concat(a)}("tableContentRefreshed")};a.default=b;return a.default}); +//# sourceMappingURL=events.min.js.map diff --git a/lib/table/amd/build/local/dynamic/events.min.js.map b/lib/table/amd/build/local/dynamic/events.min.js.map new file mode 100644 index 00000000000..400c65985e1 --- /dev/null +++ b/lib/table/amd/build/local/dynamic/events.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/local/dynamic/events.js"],"names":["tableContentRefreshed","prefixEventName","eventName"],"mappings":"uJA0Be,CACXA,qBAAqB,CAHD,QAAlBC,CAAAA,eAAkB,CAAAC,CAAS,qCAA0BA,CAA1B,EAGN,CAAgB,uBAAhB,CADZ,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/local/dynamic/events\n * @package core_table\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nconst prefixEventName = eventName => `core_table/dynamic:${eventName}`;\n\nexport default {\n tableContentRefreshed: prefixEventName('tableContentRefreshed'),\n};\n"],"file":"events.min.js"} \ No newline at end of file diff --git a/lib/table/amd/build/local/dynamic/selectors.min.js b/lib/table/amd/build/local/dynamic/selectors.min.js index f4dc44a485b..916c3eeffc0 100644 --- a/lib/table/amd/build/local/dynamic/selectors.min.js +++ b/lib/table/amd/build/local/dynamic/selectors.min.js @@ -1,2 +1,2 @@ -define ("core_table/local/dynamic/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;a.default={main:{region:"[data-region=\"core_table/dynamic\"]"},table:{links:{sortableColumn:"a[data-sortable=\"1\"]"}},initialsBar:{links:{firstInitial:".firstinitial [data-initial]",lastInitial:".lastinitial [data-initial]"}},paginationBar:{links:{pageItem:".pagination [data-page-number]"}}};return a.default}); +define ("core_table/local/dynamic/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;a.default={main:{region:"[data-region=\"core_table/dynamic\"]",fromRegionId:function fromRegionId(a){return"[data-region=\"core_table/dynamic\"][data-table-uniqueid=\"".concat(a,"\"]")}},table:{links:{sortableColumn:"a[data-sortable=\"1\"]"}},initialsBar:{links:{firstInitial:".firstinitial [data-initial]",lastInitial:".lastinitial [data-initial]"}},paginationBar:{links:{pageItem:".pagination [data-page-number]"}}};return a.default}); //# sourceMappingURL=selectors.min.js.map diff --git a/lib/table/amd/build/local/dynamic/selectors.min.js.map b/lib/table/amd/build/local/dynamic/selectors.min.js.map index 73059fccd1d..994561c2428 100644 --- a/lib/table/amd/build/local/dynamic/selectors.min.js.map +++ b/lib/table/amd/build/local/dynamic/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/local/dynamic/selectors.js"],"names":["main","region","table","links","sortableColumn","initialsBar","firstInitial","lastInitial","paginationBar","pageItem"],"mappings":"8JAuBe,CACXA,IAAI,CAAE,CACFC,MAAM,CAAE,sCADN,CADK,CAIXC,KAAK,CAAE,CACHC,KAAK,CAAE,CACHC,cAAc,CAAE,wBADb,CADJ,CAJI,CASXC,WAAW,CAAE,CACTF,KAAK,CAAE,CACHG,YAAY,CAAE,8BADX,CAEHC,WAAW,CAAE,6BAFV,CADE,CATF,CAeXC,aAAa,CAAE,CACXL,KAAK,CAAE,CACHM,QAAQ,CAAE,gCADP,CADI,CAfJ,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/selectors\n * @package core_table\n * @copyright 2020 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default {\n main: {\n region: '[data-region=\"core_table/dynamic\"]',\n },\n table: {\n links: {\n sortableColumn: 'a[data-sortable=\"1\"]',\n },\n },\n initialsBar: {\n links: {\n firstInitial: '.firstinitial [data-initial]',\n lastInitial: '.lastinitial [data-initial]',\n },\n },\n paginationBar: {\n links: {\n pageItem: '.pagination [data-page-number]'\n }\n },\n};\n"],"file":"selectors.min.js"} \ No newline at end of file +{"version":3,"sources":["../../../src/local/dynamic/selectors.js"],"names":["main","region","fromRegionId","regionId","table","links","sortableColumn","initialsBar","firstInitial","lastInitial","paginationBar","pageItem"],"mappings":"8JAuBe,CACXA,IAAI,CAAE,CACFC,MAAM,CAAE,sCADN,CAEFC,YAAY,CAAE,sBAAAC,CAAQ,6EAA+DA,CAA/D,QAFpB,CADK,CAKXC,KAAK,CAAE,CACHC,KAAK,CAAE,CACHC,cAAc,CAAE,wBADb,CADJ,CALI,CAUXC,WAAW,CAAE,CACTF,KAAK,CAAE,CACHG,YAAY,CAAE,8BADX,CAEHC,WAAW,CAAE,6BAFV,CADE,CAVF,CAgBXC,aAAa,CAAE,CACXL,KAAK,CAAE,CACHM,QAAQ,CAAE,gCADP,CADI,CAhBJ,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/selectors\n * @package core_table\n * @copyright 2020 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default {\n main: {\n region: '[data-region=\"core_table/dynamic\"]',\n fromRegionId: regionId => `[data-region=\"core_table/dynamic\"][data-table-uniqueid=\"${regionId}\"]`,\n },\n table: {\n links: {\n sortableColumn: 'a[data-sortable=\"1\"]',\n },\n },\n initialsBar: {\n links: {\n firstInitial: '.firstinitial [data-initial]',\n lastInitial: '.lastinitial [data-initial]',\n },\n },\n paginationBar: {\n links: {\n pageItem: '.pagination [data-page-number]'\n }\n },\n};\n"],"file":"selectors.min.js"} \ No newline at end of file diff --git a/lib/table/amd/src/dynamic.js b/lib/table/amd/src/dynamic.js index c3f264f07d1..9a959502d68 100644 --- a/lib/table/amd/src/dynamic.js +++ b/lib/table/amd/src/dynamic.js @@ -23,6 +23,7 @@ */ import {fetch as fetchTableData} from 'core_table/local/dynamic/repository'; import * as Selectors from 'core_table/local/dynamic/selectors'; +import Events from './local/dynamic/events'; let watching = false; @@ -85,7 +86,14 @@ export const refreshTableContent = tableRoot => { placeholder.innerHTML = data.html; tableRoot.replaceWith(...placeholder.childNodes); - return data; + // Update the tableRoot. + return getTableFromId(tableRoot.dataset.tableUniqueid); + }).then(tableRoot => { + tableRoot.dispatchEvent(new CustomEvent(Events.tableContentRefreshed, { + bubbles: true, + })); + + return tableRoot; }); }; @@ -132,7 +140,7 @@ export const updateTable = (tableRoot, { if (refreshContent) { return refreshTableContent(tableRoot); } else { - return Promise.resolve(); + return Promise.resolve(tableRoot); } }; @@ -249,3 +257,25 @@ export const init = () => { } }); }; + +/** + * Fetch the table via its table region id. + * + * @param {String} tableRegionId + * @returns {HTMLElement} + */ +export const getTableFromId = tableRegionId => { + const tableRoot = document.querySelector(Selectors.main.fromRegionId(tableRegionId)); + + + if (!tableRoot) { + // The table is not a dynamic table. + throw new Error("The table specified is not a dynamic table and cannot be updated"); + } + + return tableRoot; +}; + +export { + Events +}; diff --git a/lib/table/amd/src/local/dynamic/events.js b/lib/table/amd/src/local/dynamic/events.js new file mode 100644 index 00000000000..115ea690726 --- /dev/null +++ b/lib/table/amd/src/local/dynamic/events.js @@ -0,0 +1,29 @@ +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +/** + * Dynamic table selectors. + * + * @module core_table/local/dynamic/events + * @package core_table + * @copyright 2020 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +const prefixEventName = eventName => `core_table/dynamic:${eventName}`; + +export default { + tableContentRefreshed: prefixEventName('tableContentRefreshed'), +}; diff --git a/lib/table/amd/src/local/dynamic/selectors.js b/lib/table/amd/src/local/dynamic/selectors.js index 118f328a08a..8b07a19ecbf 100644 --- a/lib/table/amd/src/local/dynamic/selectors.js +++ b/lib/table/amd/src/local/dynamic/selectors.js @@ -24,6 +24,7 @@ export default { main: { region: '[data-region="core_table/dynamic"]', + fromRegionId: regionId => `[data-region="core_table/dynamic"][data-table-uniqueid="${regionId}"]`, }, table: { links: {