MDL-67915 core_table: add support for hide and show of columns

This commit is contained in:
Simey Lameze 2020-04-17 08:33:40 +08:00
parent 9df4a4de18
commit e2f12c2220
12 changed files with 131 additions and 31 deletions

View File

@ -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<a.length;b++){c[b]=a[b]}return c}}var h=!1,i=function(a){if(!a){throw new Error("The table specified is not a dynamic table and cannot be updated")}if(!a.matches(c.main.region)){throw new Error("The table specified is not a dynamic table and cannot be updated")}return!0},j=function(a){return JSON.parse(a.dataset.tableFilters)},k=function(a){var c=j(a);return(0,b.fetch)(a.dataset.tableComponent,a.dataset.tableHandler,a.dataset.tableUniqueid,{sortBy:a.dataset.tableSortBy,sortOrder:a.dataset.tableSortOrder,joinType:c.jointype,filters:c.filters,firstinitial:a.dataset.tableFirstInitial,lastinitial:a.dataset.tableLastInitial,pageNumber:a.dataset.tablePageNumber,pageSize:a.dataset.tablePageSize}).then(function(b){var c=document.createElement("div");c.innerHTML=b.html;a.replaceWith.apply(a,d(c.childNodes));return b})};a.refreshTableContent=k;var l=function(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},c=b.sortBy,d=void 0===c?null:c,e=b.sortOrder,f=void 0===e?null:e,g=b.filters,h=void 0===g?null:g,j=b.firstInitial,l=void 0===j?null:j,m=b.lastInitial,n=void 0===m?null:m,o=b.pageNumber,p=void 0===o?null:o,q=b.pageSize,r=void 0===q?null:q,s=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;i(a);if(d&&f){a.dataset.tableSortBy=d;a.dataset.tableSortOrder=f}if(null!==l){a.dataset.tableFirstInitial=l}if(null!==n){a.dataset.tableLastInitial=n}if(null!==p){a.dataset.tablePageNumber=p}if(null!==r){a.dataset.tablePageSize=r}if(h){a.dataset.tableFilters=JSON.stringify(h)}if(s){return k(a)}else{return Promise.resolve()}};a.updateTable=l;a.setFilters=function setFilters(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{filters:b},c)};var m=function(a,b,c){var d=3<arguments.length&&arguments[3]!==void 0?arguments[3]:!0;return l(a,{sortBy:b,sortOrder:c},d)};a.setSortOrder=m;var n=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageNumber:b},c)};a.setPageNumber=n;a.setPageSize=function setPageSize(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageSize:b,pageNumber:0},c)};var o=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{firstInitial:b},c)};a.setFirstInitial=o;var p=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{lastInitial:b},c)};a.setLastInitial=p;var q=function(){if(h){return}h=!0;document.addEventListener("click",function(a){var b=a.target.closest(c.main.region);if(!b){return}var d=a.target.closest(c.table.links.sortableColumn);if(d){a.preventDefault();m(b,d.dataset.sortby,d.dataset.sortorder)}var e=a.target.closest(c.initialsBar.links.firstInitial);if(null!==e){a.preventDefault();o(b,e.dataset.initial)}var f=a.target.closest(c.initialsBar.links.lastInitial);if(null!==f){a.preventDefault();p(b,f.dataset.initial)}var g=a.target.closest(c.paginationBar.links.pageItem);if(g){a.preventDefault();n(b,g.dataset.pageNumber)}})};a.init=q});
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.showColumn=a.hideColumn=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<a.length;b++){c[b]=a[b]}return c}}var h=!1,i=function(a){if(!a){throw new Error("The table specified is not a dynamic table and cannot be updated")}if(!a.matches(c.main.region)){throw new Error("The table specified is not a dynamic table and cannot be updated")}return!0},j=function(a){return JSON.parse(a.dataset.tableFilters)},k=function(a){var c=j(a);return(0,b.fetch)(a.dataset.tableComponent,a.dataset.tableHandler,a.dataset.tableUniqueid,{sortBy:a.dataset.tableSortBy,sortOrder:a.dataset.tableSortOrder,joinType:c.jointype,filters:c.filters,firstinitial:a.dataset.tableFirstInitial,lastinitial:a.dataset.tableLastInitial,pageNumber:a.dataset.tablePageNumber,pageSize:a.dataset.tablePageSize,hiddenColumns:JSON.parse(a.dataset.tableHiddenColumns)}).then(function(b){var c=document.createElement("div");c.innerHTML=b.html;a.replaceWith.apply(a,d(c.childNodes));return b})};a.refreshTableContent=k;var l=function(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},c=b.sortBy,d=void 0===c?null:c,e=b.sortOrder,f=void 0===e?null:e,g=b.filters,h=void 0===g?null:g,j=b.firstInitial,l=void 0===j?null:j,m=b.lastInitial,n=void 0===m?null:m,o=b.pageNumber,p=void 0===o?null:o,q=b.pageSize,r=void 0===q?null:q,s=b.hiddenColumns,t=void 0===s?null:s,u=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;i(a);if(d&&f){a.dataset.tableSortBy=d;a.dataset.tableSortOrder=f}if(null!==l){a.dataset.tableFirstInitial=l}if(null!==n){a.dataset.tableLastInitial=n}if(null!==p){a.dataset.tablePageNumber=p}if(null!==r){a.dataset.tablePageSize=r}if(h){a.dataset.tableFilters=JSON.stringify(h)}if(t){a.dataset.tableHiddenColumns=JSON.stringify(t)}if(u){return k(a)}else{return Promise.resolve()}};a.updateTable=l;a.setFilters=function setFilters(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{filters:b},c)};var m=function(a,b,c){var d=3<arguments.length&&arguments[3]!==void 0?arguments[3]:!0;return l(a,{sortBy:b,sortOrder:c},d)};a.setSortOrder=m;var n=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageNumber:b},c)};a.setPageNumber=n;a.setPageSize=function setPageSize(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageSize:b,pageNumber:0},c)};var o=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{firstInitial:b},c)};a.setFirstInitial=o;var p=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{lastInitial:b},c)};a.setLastInitial=p;var q=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0,d=JSON.parse(a.dataset.tableHiddenColumns);d.push(b);l(a,{hiddenColumns:d},c)};a.hideColumn=q;var r=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0,d=JSON.parse(a.dataset.tableHiddenColumns);d=d.filter(function(a){return a!==b});l(a,{hiddenColumns:d},c)};a.showColumn=r;var s=function(){if(h){return}h=!0;document.addEventListener("click",function(a){var b=a.target.closest(c.main.region);if(!b){return}var d=a.target.closest(c.table.links.sortableColumn);if(d){a.preventDefault();m(b,d.dataset.sortby,d.dataset.sortorder)}var e=a.target.closest(c.initialsBar.links.firstInitial);if(null!==e){a.preventDefault();o(b,e.dataset.initial)}var f=a.target.closest(c.initialsBar.links.lastInitial);if(null!==f){a.preventDefault();p(b,f.dataset.initial)}var g=a.target.closest(c.paginationBar.links.pageItem);if(g){a.preventDefault();n(b,g.dataset.pageNumber)}var h=a.target.closest(c.table.links.hide);if(h){a.preventDefault();q(b,h.dataset.column)}var i=a.target.closest(c.table.links.show);if(i){a.preventDefault();r(b,i.dataset.column)}})};a.init=s});
//# sourceMappingURL=dynamic.min.js.map

File diff suppressed because one or more lines are too long

View File

@ -1,2 +1,2 @@
define ("core_table/local/dynamic/repository",["exports","core/ajax"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.fetch=void 0;a.fetch=function fetch(a,c,d){var e=3<arguments.length&&arguments[3]!==void 0?arguments[3]:{},f=e.sortBy,g=void 0===f?null:f,h=e.sortOrder,i=void 0===h?null:h,j=e.joinType,k=void 0===j?null:j,l=e.filters,m=void 0===l?{}:l,n=e.firstinitial,o=void 0===n?null:n,p=e.lastinitial,q=void 0===p?null:p,r=e.pageNumber,s=void 0===r?null:r,t=e.pageSize,u=void 0===t?null:t;return(0,b.call)([{methodname:"core_table_dynamic_fetch",args:{component:a,handler:c,uniqueid:d,sortby:g,sortorder:i,jointype:k,filters:m,firstinitial:o,lastinitial:q,pagenumber:s,pagesize:u}}])[0]}});
define ("core_table/local/dynamic/repository",["exports","core/ajax"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.fetch=void 0;a.fetch=function fetch(a,c,d){var e=3<arguments.length&&arguments[3]!==void 0?arguments[3]:{},f=e.sortBy,g=void 0===f?null:f,h=e.sortOrder,i=void 0===h?null:h,j=e.joinType,k=void 0===j?null:j,l=e.filters,m=void 0===l?{}:l,n=e.firstinitial,o=void 0===n?null:n,p=e.lastinitial,q=void 0===p?null:p,r=e.pageNumber,s=void 0===r?null:r,t=e.pageSize,u=void 0===t?null:t,v=e.hiddenColumns,w=void 0===v?{}:v;return(0,b.call)([{methodname:"core_table_dynamic_fetch",args:{component:a,handler:c,uniqueid:d,sortby:g,sortorder:i,jointype:k,filters:m,firstinitial:o,lastinitial:q,pagenumber:s,pagesize:u,hiddencolumns:w}}])[0]}});
//# sourceMappingURL=repository.min.js.map

View File

@ -1 +1 @@
{"version":3,"sources":["../../../src/local/dynamic/repository.js"],"names":["fetch","component","handler","uniqueid","sortBy","sortOrder","joinType","filters","firstinitial","lastinitial","pageNumber","pageSize","methodname","args","sortby","sortorder","jointype","pagenumber","pagesize"],"mappings":"yKAyCqB,QAARA,CAAAA,KAAQ,CAACC,CAAD,CAAYC,CAAZ,CAAqBC,CAArB,CAUhB,8DADG,EACH,KATGC,MASH,CATGA,CASH,YATY,IASZ,OARGC,SAQH,CARGA,CAQH,YARe,IAQf,OAPGC,QAOH,CAPGA,CAOH,YAPc,IAOd,OANGC,OAMH,CANGA,CAMH,YANa,EAMb,OALGC,YAKH,CALGA,CAKH,YALkB,IAKlB,OAJGC,WAIH,CAJGA,CAIH,YAJiB,IAIjB,OAHGC,UAGH,CAHGA,CAGH,YAHgB,IAGhB,OAFGC,QAEH,CAFGA,CAEH,YAFc,IAEd,GACD,MAAO,WAAU,CAAC,CACdC,UAAU,2BADI,CAEdC,IAAI,CAAE,CACFZ,SAAS,CAATA,CADE,CAEFC,OAAO,CAAPA,CAFE,CAGFC,QAAQ,CAARA,CAHE,CAIFW,MAAM,CAAEV,CAJN,CAKFW,SAAS,CAAEV,CALT,CAMFW,QAAQ,CAAEV,CANR,CAOFC,OAAO,CAAPA,CAPE,CAQFC,YAAY,CAAZA,CARE,CASFC,WAAW,CAAXA,CATE,CAUFQ,UAAU,CAAEP,CAVV,CAWFQ,QAAQ,CAAEP,CAXR,CAFQ,CAAD,CAAV,EAeH,CAfG,CAgBV,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 <http://www.gnu.org/licenses/>.\n\n/**\n * A javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @class repository\n * @package core_calendar\n * @copyright 2017 Simey Lameze <lameze@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\n\n/**\n * Fetch table view.\n *\n * @method fetch\n * @param {String} component The component\n * @param {String} handler The name of the handler\n * @param {String} uniqueid The unique id of the table\n * @param {Object} filters The filters to apply when searching\n * @param {String} firstinitial The first name initial to filter on\n * @param {String} lastinitial The last name initial to filter on\n * @param {String} pageNumber The page number\n * @param {Number} pageSize The page size\n * @param {Number} params parameters to request table\n * @return {Promise} Resolved with requested table view\n */\nexport const fetch = (component, handler, uniqueid, {\n sortBy = null,\n sortOrder = null,\n joinType = null,\n filters = {},\n firstinitial = null,\n lastinitial = null,\n pageNumber = null,\n pageSize = null,\n } = {}\n) => {\n return fetchMany([{\n methodname: `core_table_dynamic_fetch`,\n args: {\n component,\n handler,\n uniqueid,\n sortby: sortBy,\n sortorder: sortOrder,\n jointype: joinType,\n filters,\n firstinitial,\n lastinitial,\n pagenumber: pageNumber,\n pagesize: pageSize,\n },\n }])[0];\n};\n"],"file":"repository.min.js"}
{"version":3,"sources":["../../../src/local/dynamic/repository.js"],"names":["fetch","component","handler","uniqueid","sortBy","sortOrder","joinType","filters","firstinitial","lastinitial","pageNumber","pageSize","hiddenColumns","methodname","args","sortby","sortorder","jointype","pagenumber","pagesize","hiddencolumns"],"mappings":"yKAyCqB,QAARA,CAAAA,KAAQ,CAACC,CAAD,CAAYC,CAAZ,CAAqBC,CAArB,CAWhB,8DADG,EACH,KAVGC,MAUH,CAVGA,CAUH,YAVY,IAUZ,OATGC,SASH,CATGA,CASH,YATe,IASf,OARGC,QAQH,CARGA,CAQH,YARc,IAQd,OAPGC,OAOH,CAPGA,CAOH,YAPa,EAOb,OANGC,YAMH,CANGA,CAMH,YANkB,IAMlB,OALGC,WAKH,CALGA,CAKH,YALiB,IAKjB,OAJGC,UAIH,CAJGA,CAIH,YAJgB,IAIhB,OAHGC,QAGH,CAHGA,CAGH,YAHc,IAGd,OAFGC,aAEH,CAFGA,CAEH,YAFmB,EAEnB,GACD,MAAO,WAAU,CAAC,CACdC,UAAU,2BADI,CAEdC,IAAI,CAAE,CACFb,SAAS,CAATA,CADE,CAEFC,OAAO,CAAPA,CAFE,CAGFC,QAAQ,CAARA,CAHE,CAIFY,MAAM,CAAEX,CAJN,CAKFY,SAAS,CAAEX,CALT,CAMFY,QAAQ,CAAEX,CANR,CAOFC,OAAO,CAAPA,CAPE,CAQFC,YAAY,CAAZA,CARE,CASFC,WAAW,CAAXA,CATE,CAUFS,UAAU,CAAER,CAVV,CAWFS,QAAQ,CAAER,CAXR,CAYFS,aAAa,CAAER,CAZb,CAFQ,CAAD,CAAV,EAgBH,CAhBG,CAiBV,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 <http://www.gnu.org/licenses/>.\n\n/**\n * A javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @class repository\n * @package core_calendar\n * @copyright 2017 Simey Lameze <lameze@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\n\n/**\n * Fetch table view.\n *\n * @method fetch\n * @param {String} component The component\n * @param {String} handler The name of the handler\n * @param {String} uniqueid The unique id of the table\n * @param {Object} filters The filters to apply when searching\n * @param {String} firstinitial The first name initial to filter on\n * @param {String} lastinitial The last name initial to filter on\n * @param {String} pageNumber The page number\n * @param {Number} pageSize The page size\n * @param {Number} params parameters to request table\n * @return {Promise} Resolved with requested table view\n */\nexport const fetch = (component, handler, uniqueid, {\n sortBy = null,\n sortOrder = null,\n joinType = null,\n filters = {},\n firstinitial = null,\n lastinitial = null,\n pageNumber = null,\n pageSize = null,\n hiddenColumns = {}\n } = {}\n) => {\n return fetchMany([{\n methodname: `core_table_dynamic_fetch`,\n args: {\n component,\n handler,\n uniqueid,\n sortby: sortBy,\n sortorder: sortOrder,\n jointype: joinType,\n filters,\n firstinitial,\n lastinitial,\n pagenumber: pageNumber,\n pagesize: pageSize,\n hiddencolumns: hiddenColumns,\n },\n }])[0];\n};\n"],"file":"repository.min.js"}

View File

@ -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\"]"},table:{links:{sortableColumn:"a[data-sortable=\"1\"]",hide:"a[data-action=\"hide\"]",show:"a[data-action=\"show\"]"}},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

View File

@ -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 <http://www.gnu.org/licenses/>.\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/selectors\n * @package core_table\n * @copyright 2020 Simey Lameze <simey@moodle.com>\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"}
{"version":3,"sources":["../../../src/local/dynamic/selectors.js"],"names":["main","region","table","links","sortableColumn","hide","show","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,CAEHC,IAAI,CAAE,yBAFH,CAGHC,IAAI,CAAE,yBAHH,CADJ,CAJI,CAWXC,WAAW,CAAE,CACTJ,KAAK,CAAE,CACHK,YAAY,CAAE,8BADX,CAEHC,WAAW,CAAE,6BAFV,CADE,CAXF,CAiBXC,aAAa,CAAE,CACXP,KAAK,CAAE,CACHQ,QAAQ,CAAE,gCADP,CADI,CAjBJ,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 <http://www.gnu.org/licenses/>.\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/selectors\n * @package core_table\n * @copyright 2020 Simey Lameze <simey@moodle.com>\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 hide: 'a[data-action=\"hide\"]',\n show: 'a[data-action=\"show\"]',\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"}

View File

@ -78,6 +78,7 @@ export const refreshTableContent = tableRoot => {
lastinitial: tableRoot.dataset.tableLastInitial,
pageNumber: tableRoot.dataset.tablePageNumber,
pageSize: tableRoot.dataset.tablePageSize,
hiddenColumns: JSON.parse(tableRoot.dataset.tableHiddenColumns),
}
)
.then(data => {
@ -97,6 +98,7 @@ export const updateTable = (tableRoot, {
lastInitial = null,
pageNumber = null,
pageSize = null,
hiddenColumns = null,
} = {}, refreshContent = true) => {
checkTableIsDynamic(tableRoot);
@ -128,6 +130,11 @@ export const updateTable = (tableRoot, {
tableRoot.dataset.tableFilters = JSON.stringify(filters);
}
// Update hidden columns.
if (hiddenColumns) {
tableRoot.dataset.tableHiddenColumns = JSON.stringify(hiddenColumns);
}
// Refresh.
if (refreshContent) {
return refreshTableContent(tableRoot);
@ -203,6 +210,34 @@ export const setFirstInitial = (tableRoot, firstInitial, refreshContent = true)
export const setLastInitial = (tableRoot, lastInitial, refreshContent = true) =>
updateTable(tableRoot, {lastInitial}, refreshContent);
/**
* Hide a column in the participants table.
*
* @param {HTMLElement} tableRoot
* @param {String} columnToHide
* @param {Bool} refreshContent
*/
export const hideColumn = (tableRoot, columnToHide, refreshContent = true) => {
const hiddenColumns = JSON.parse(tableRoot.dataset.tableHiddenColumns);
hiddenColumns.push(columnToHide);
updateTable(tableRoot, {hiddenColumns}, refreshContent);
};
/**
* Make a hidden column visible in the participants table.
*
* @param {HTMLElement} tableRoot
* @param {String} columnToShow
* @param {Bool} refreshContent
*/
export const showColumn = (tableRoot, columnToShow, refreshContent = true) => {
let hiddenColumns = JSON.parse(tableRoot.dataset.tableHiddenColumns);
hiddenColumns = hiddenColumns.filter(columnName => columnName !== columnToShow);
updateTable(tableRoot, {hiddenColumns}, refreshContent);
};
/**
* Set up listeners to handle table updates.
*/
@ -247,5 +282,20 @@ export const init = () => {
setPageNumber(tableRoot, pageItem.dataset.pageNumber);
}
const hide = e.target.closest(Selectors.table.links.hide);
if (hide) {
e.preventDefault();
hideColumn(tableRoot, hide.dataset.column);
}
const show = e.target.closest(Selectors.table.links.show);
if (show) {
e.preventDefault();
showColumn(tableRoot, show.dataset.column);
}
});
};

View File

@ -48,6 +48,7 @@ export const fetch = (component, handler, uniqueid, {
lastinitial = null,
pageNumber = null,
pageSize = null,
hiddenColumns = {}
} = {}
) => {
return fetchMany([{
@ -64,6 +65,7 @@ export const fetch = (component, handler, uniqueid, {
lastinitial,
pagenumber: pageNumber,
pagesize: pageSize,
hiddencolumns: hiddenColumns,
},
}])[0];
};

View File

@ -28,6 +28,8 @@ export default {
table: {
links: {
sortableColumn: 'a[data-sortable="1"]',
hide: 'a[data-action="hide"]',
show: 'a[data-action="show"]',
},
},
initialsBar: {

View File

@ -115,6 +115,14 @@ class fetch extends external_api {
VALUE_REQUIRED,
null
),
'hiddencolumns' => new external_multiple_structure(
new external_value(
PARAM_ALPHANUMEXT,
'Name of column',
VALUE_REQUIRED,
null
)
),
]);
}
@ -146,7 +154,8 @@ class fetch extends external_api {
?string $firstinitial = null,
?string $lastinitial = null,
?int $pagenumber = null,
?int $pagesize = null
?int $pagesize = null,
?array $hiddencolumns = null
) {
global $PAGE;
@ -163,6 +172,7 @@ class fetch extends external_api {
'lastinitial' => $lastinitial,
'pagenumber' => $pagenumber,
'pagesize' => $pagesize,
'hiddencolumns' => $hiddencolumns,
] = self::validate_parameters(self::execute_parameters(), [
'component' => $component,
'handler' => $handler,
@ -175,6 +185,7 @@ class fetch extends external_api {
'lastinitial' => $lastinitial,
'pagenumber' => $pagenumber,
'pagesize' => $pagesize,
'hiddencolumns' => $hiddencolumns,
]);
$tableclass = "\\{$component}\\table\\{$handler}";
@ -221,6 +232,10 @@ class fetch extends external_api {
$pagesize = 20;
}
if ($hiddencolumns !== null) {
$instance->set_hidden_columns($hiddencolumns);
}
$context = $instance->get_context();
self::validate_context($context);
$PAGE->set_url($instance->get_base_url());

View File

@ -65,7 +65,8 @@ class fetch_test extends advanced_testcase {
$this->resetAfterTest();
$this->expectException(\UnexpectedValueException::class);
fetch::execute("core_users", "participants", "", "email", "4", [], "1");
fetch::execute("core_users", "participants", "", "email", "4", [], (string)filter::JOINTYPE_ANY,
null, null, null, null, []);
}
/**
@ -79,7 +80,8 @@ class fetch_test extends advanced_testcase {
$this->expectExceptionMessage("Table handler class {$handler} not found. Please make sure that your table handler class is under the \\core_user\\table namespace.");
// Tests that invalid users_participants_table class gets an exception.
fetch::execute("core_user", "users_participants_table", "", "email", "4", [], "1");
fetch::execute("core_user", "users_participants_table", "", "email", "4", [], (string)filter::JOINTYPE_ANY,
null, null, null, null, []);
}
/**
@ -129,7 +131,9 @@ class fetch_test extends advanced_testcase {
];
$participantstable = fetch::execute("core_user", "participants",
"user-index-participants-{$course->id}", "firstname", "4", $filter, (string)filter::JOINTYPE_ANY);
"user-index-participants-{$course->id}", "firstname", "4", $filter, (string)filter::JOINTYPE_ANY,
null, null, null, null, []);
$html = $participantstable['html'];
$this->assertStringContainsString($user1->email, $html);

View File

@ -154,6 +154,9 @@ class flexible_table {
/** @var $filename */
protected $filename;
/** @var array $hiddencolumns List of hidden columns. */
protected $hiddencolumns;
/**
* Constructor
* @param string $uniqueid all tables have to have a unique id, this is used
@ -511,25 +514,7 @@ class flexible_table {
$oldprefs = $this->prefs;
}
if (($showcol = optional_param($this->request[TABLE_VAR_SHOW], '', PARAM_ALPHANUMEXT)) &&
isset($this->columns[$showcol])) {
$this->prefs['collapse'][$showcol] = false;
} else if (($hidecol = optional_param($this->request[TABLE_VAR_HIDE], '', PARAM_ALPHANUMEXT)) &&
isset($this->columns[$hidecol])) {
$this->prefs['collapse'][$hidecol] = true;
if (array_key_exists($hidecol, $this->prefs['sortby'])) {
unset($this->prefs['sortby'][$hidecol]);
}
}
// Now, update the column attributes for collapsed columns
foreach (array_keys($this->columns) as $column) {
if (!empty($this->prefs['collapse'][$column])) {
$this->column_style[$column]['width'] = '10px';
}
}
$this->set_hide_show_preferences();
$this->set_sorting_preferences();
$this->set_initials_preferences();
@ -1205,14 +1190,18 @@ class flexible_table {
if (!empty($this->prefs['collapse'][$column])) {
$linkattributes = array('title' => get_string('show') . ' ' . strip_tags($this->headers[$index]),
'aria-expanded' => 'false',
'aria-controls' => $ariacontrols);
'aria-controls' => $ariacontrols,
'data-action' => 'show',
'data-column' => $column);
return html_writer::link($this->baseurl->out(false, array($this->request[TABLE_VAR_SHOW] => $column)),
$OUTPUT->pix_icon('t/switch_plus', get_string('show')), $linkattributes);
} else if ($this->headers[$index] !== NULL) {
$linkattributes = array('title' => get_string('hide') . ' ' . strip_tags($this->headers[$index]),
'aria-expanded' => 'true',
'aria-controls' => $ariacontrols);
'aria-controls' => $ariacontrols,
'data-action' => 'hide',
'data-column' => $column);
return html_writer::link($this->baseurl->out(false, array($this->request[TABLE_VAR_HIDE] => $column)),
$OUTPUT->pix_icon('t/switch_minus', get_string('hide')), $linkattributes);
}
@ -1380,6 +1369,43 @@ class flexible_table {
}
/**
* Set hide and show preferences.
*/
protected function set_hide_show_preferences(): void {
if ($this->hiddencolumns !== null) {
$this->prefs['collapse'] = array_fill_keys(array_filter($this->hiddencolumns, function($column) {
return array_key_exists($column, $this->columns);
}), true);
} else {
if ($column = optional_param($this->request[TABLE_VAR_HIDE], '', PARAM_ALPHANUMEXT)) {
if (isset($this->columns[$column])) {
$this->prefs['collapse'][$column] = true;
}
}
}
if ($column = optional_param($this->request[TABLE_VAR_SHOW], '', PARAM_ALPHANUMEXT)) {
unset($this->prefs['collapse'][$column]);
}
foreach (array_keys($this->prefs['collapse']) as $column) {
if (array_key_exists($column, $this->prefs['sortby'])) {
unset($this->prefs['sortby'][$column]);
}
}
}
/**
* Set the list of hidden columns.
*
* @param array $columns The list of hidden columns.
*/
public function set_hidden_columns(array $columns): void {
$this->hiddencolumns = $columns;
}
/**
* Set the preferred table sorting attributes.
*
@ -1540,6 +1566,7 @@ class flexible_table {
'data-table-last-initial' => $this->prefs['i_last'],
'data-table-page-number' => $this->currpage + 1,
'data-table-page-size' => $this->pagesize,
'data-table-hidden-columns' => json_encode(array_keys($this->prefs['collapse'])),
]);
}