From 054881a24f619e76de32f44855848072841e6709 Mon Sep 17 00:00:00 2001 From: Jan Britz Date: Tue, 9 Jul 2024 12:38:19 +0200 Subject: [PATCH] fix: reset page to `0` when filtering with tags --- amd/build/package_search/mutations.min.js | 2 +- amd/build/package_search/mutations.min.js.map | 2 +- amd/src/package_search/mutations.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/amd/build/package_search/mutations.min.js b/amd/build/package_search/mutations.min.js index 786c3c41..7498d7e1 100644 --- a/amd/build/package_search/mutations.min.js +++ b/amd/build/package_search/mutations.min.js @@ -1,3 +1,3 @@ -define("qtype_questionpy/package_search/mutations",["exports","core/ajax","core/notification","qtype_questionpy/utils"],(function(_exports,_ajax,_notification,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_ajax=_interopRequireDefault(_ajax),_notification=_interopRequireDefault(_notification);return _exports.default=class{constructor(options){this.options=options}_getSearchPackagesInCategoriesPromise(state,page,categories){const methods=[];for(const category of categories){const method={methodname:"qtype_questionpy_search_packages",args:{query:state.general.query,tags:state.general.tags,category:category,sort:state.general.sorting.sort,order:state.general.sorting.order,limit:this.options.limit,page:"number"==typeof page?page:state[category].page,contextid:this.options.contextid}};methods.push(method)}return _ajax.default.call(methods)}_setLoading(stateManager,loading){const state=stateManager.state;if(state.loading===loading)return;const isReadonly=stateManager.readonly;isReadonly&&stateManager.setReadOnly(!1),state.general.loading=loading,isReadonly&&stateManager.setReadOnly(!0)}async searchPackages(stateManager){let args=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,categories=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const state=stateManager.state;args=args||{},categories=categories||["all","recentlyused","favourites"],stateManager.setReadOnly(!1),this._setLoading(stateManager,!0),state.general.query="string"==typeof args.query?args.query:state.general.query,state.general.tags=args.tags||state.general.tags,state.general.sorting={sort:args.sort||state.general.sorting.sort,order:args.order||state.general.sorting.order},stateManager.setReadOnly(!0);try{let results=await this._getSearchPackagesInCategoriesPromise(state,args.page,categories);stateManager.setReadOnly(!1);for(const[index,category]of categories.entries()){const result=await results[index];state["".concat(category,"Packages")]=result.packages,state[category].count=result.count,state[category].total=result.total,"number"==typeof args.page&&(state[category].page=args.page)}stateManager.setReadOnly(!0)}catch(exception){await _notification.default.exception(exception)}finally{this._setLoading(stateManager,!1)}}async searchPackagesByQuery(stateManager,query){await this.searchPackages(stateManager,{page:0,query:query})}async filterPackagesByTags(stateManager,tags){await this.searchPackages(stateManager,{tags:tags})}async changePage(stateManager,category,page){await this.searchPackages(stateManager,{page:page},[category])}async changeSort(stateManager,sort,order){await this.searchPackages(stateManager,{sort:sort,order:order},["all","favourites"])}async load(stateManager,categories){await this.searchPackages(stateManager,{},categories)}async favourite(stateManager,packageid,favourite){const state=stateManager.state;try{this._setLoading(stateManager,!0);if(!await(0,_utils.favouritePackage)(packageid,favourite))return;stateManager.setReadOnly(!1);for(const category of["all","recentlyused"]){const pkg=state["".concat(category,"Packages")].get(packageid);pkg&&(pkg.isfavourite=favourite)}stateManager.setReadOnly(!0);let page=state.favourites.page;if(!favourite){const isFirstPage=0===page,isLastPage=page===Math.floor((state.favourites.total-1)/this.options.limit),existsOnePackage=1===state.favourites.count;!isFirstPage&&isLastPage&&existsOnePackage&&(page-=1)}await this.changePage(stateManager,"favourites",page)}catch(exception){await _notification.default.exception(exception)}finally{this._setLoading(stateManager,!1)}}},_exports.default})); +define("qtype_questionpy/package_search/mutations",["exports","core/ajax","core/notification","qtype_questionpy/utils"],(function(_exports,_ajax,_notification,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_ajax=_interopRequireDefault(_ajax),_notification=_interopRequireDefault(_notification);return _exports.default=class{constructor(options){this.options=options}_getSearchPackagesInCategoriesPromise(state,page,categories){const methods=[];for(const category of categories){const method={methodname:"qtype_questionpy_search_packages",args:{query:state.general.query,tags:state.general.tags,category:category,sort:state.general.sorting.sort,order:state.general.sorting.order,limit:this.options.limit,page:"number"==typeof page?page:state[category].page,contextid:this.options.contextid}};methods.push(method)}return _ajax.default.call(methods)}_setLoading(stateManager,loading){const state=stateManager.state;if(state.loading===loading)return;const isReadonly=stateManager.readonly;isReadonly&&stateManager.setReadOnly(!1),state.general.loading=loading,isReadonly&&stateManager.setReadOnly(!0)}async searchPackages(stateManager){let args=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,categories=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const state=stateManager.state;args=args||{},categories=categories||["all","recentlyused","favourites"],stateManager.setReadOnly(!1),this._setLoading(stateManager,!0),state.general.query="string"==typeof args.query?args.query:state.general.query,state.general.tags=args.tags||state.general.tags,state.general.sorting={sort:args.sort||state.general.sorting.sort,order:args.order||state.general.sorting.order},stateManager.setReadOnly(!0);try{let results=await this._getSearchPackagesInCategoriesPromise(state,args.page,categories);stateManager.setReadOnly(!1);for(const[index,category]of categories.entries()){const result=await results[index];state["".concat(category,"Packages")]=result.packages,state[category].count=result.count,state[category].total=result.total,"number"==typeof args.page&&(state[category].page=args.page)}stateManager.setReadOnly(!0)}catch(exception){await _notification.default.exception(exception)}finally{this._setLoading(stateManager,!1)}}async searchPackagesByQuery(stateManager,query){await this.searchPackages(stateManager,{page:0,query:query})}async filterPackagesByTags(stateManager,tags){await this.searchPackages(stateManager,{page:0,tags:tags})}async changePage(stateManager,category,page){await this.searchPackages(stateManager,{page:page},[category])}async changeSort(stateManager,sort,order){await this.searchPackages(stateManager,{sort:sort,order:order},["all","favourites"])}async load(stateManager,categories){await this.searchPackages(stateManager,{},categories)}async favourite(stateManager,packageid,favourite){const state=stateManager.state;try{this._setLoading(stateManager,!0);if(!await(0,_utils.favouritePackage)(packageid,favourite))return;stateManager.setReadOnly(!1);for(const category of["all","recentlyused"]){const pkg=state["".concat(category,"Packages")].get(packageid);pkg&&(pkg.isfavourite=favourite)}stateManager.setReadOnly(!0);let page=state.favourites.page;if(!favourite){const isFirstPage=0===page,isLastPage=page===Math.floor((state.favourites.total-1)/this.options.limit),existsOnePackage=1===state.favourites.count;!isFirstPage&&isLastPage&&existsOnePackage&&(page-=1)}await this.changePage(stateManager,"favourites",page)}catch(exception){await _notification.default.exception(exception)}finally{this._setLoading(stateManager,!1)}}},_exports.default})); //# sourceMappingURL=mutations.min.js.map \ No newline at end of file diff --git a/amd/build/package_search/mutations.min.js.map b/amd/build/package_search/mutations.min.js.map index 5a54ea3c..78cb627d 100644 --- a/amd/build/package_search/mutations.min.js.map +++ b/amd/build/package_search/mutations.min.js.map @@ -1 +1 @@ -{"version":3,"file":"mutations.min.js","sources":["../../src/package_search/mutations.js"],"sourcesContent":["/*\n * This file is part of the QuestionPy Moodle plugin - https://questionpy.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/**\n * @module qtype_questionpy/package_search/mutations\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport {favouritePackage} from 'qtype_questionpy/utils';\n\nexport default class {\n /**\n * @param {{contextid: number, limit: number}} options\n */\n constructor(options) {\n this.options = options;\n }\n\n /**\n * Search through given categories.\n *\n * If no page is provided the current page will be used.\n *\n * @param {any} state\n * @param {number|null} page\n * @param {string[]} categories\n * @returns {any}\n * @private\n */\n _getSearchPackagesInCategoriesPromise(state, page, categories) {\n const methods = [];\n for (const category of categories) {\n const method = {\n methodname: \"qtype_questionpy_search_packages\",\n args: {\n query: state.general.query,\n tags: state.general.tags,\n category: category,\n sort: state.general.sorting.sort,\n order: state.general.sorting.order,\n limit: this.options.limit,\n page: (typeof page === \"number\") ? page : state[category].page,\n contextid: this.options.contextid,\n },\n };\n methods.push(method);\n }\n return Ajax.call(methods);\n }\n\n /**\n * Sets the `loading` property.\n *\n * It only communicates changes to the watchers if the `StateManager` is currently readonly.\n *\n * @param {StateManager} stateManager\n * @param {boolean} loading\n * @private\n */\n _setLoading(stateManager, loading) {\n const state = stateManager.state;\n if (state.loading === loading) {\n return;\n }\n const isReadonly = stateManager.readonly;\n if (isReadonly) {\n stateManager.setReadOnly(false);\n }\n state.general.loading = loading;\n if (isReadonly) {\n stateManager.setReadOnly(true);\n }\n }\n\n /**\n * Used to search packages.\n *\n * Missing arguments are taken from the current state.\n *\n * @param {StateManager} stateManager\n * @param {Object|null} args\n * @param {string[]|null} categories\n */\n async searchPackages(stateManager, args = null, categories = null) {\n const state = stateManager.state;\n\n // Missing arguments are taken from the current state.\n args = args || {};\n\n // Search through every category if no categories are provided.\n categories = categories || [\"all\", \"recentlyused\", \"favourites\"];\n\n // Update general data.\n stateManager.setReadOnly(false);\n this._setLoading(stateManager, true);\n state.general.query = (typeof args.query === \"string\") ? args.query : state.general.query;\n state.general.tags = args.tags || state.general.tags;\n state.general.sorting = {\n sort: args.sort || state.general.sorting.sort,\n order: args.order || state.general.sorting.order,\n };\n stateManager.setReadOnly(true);\n\n try {\n // Get search results for each category.\n let results = await this._getSearchPackagesInCategoriesPromise(state, args.page, categories);\n\n stateManager.setReadOnly(false);\n // Update category specific data.\n for (const [index, category] of categories.entries()) {\n const result = await results[index];\n state[`${category}Packages`] = result.packages;\n state[category].count = result.count;\n state[category].total = result.total;\n if (typeof args.page === \"number\") {\n state[category].page = args.page;\n }\n }\n stateManager.setReadOnly(true);\n } catch (exception) {\n await Notification.exception(exception);\n } finally {\n this._setLoading(stateManager, false);\n }\n }\n\n /**\n * Used to search for packages only by providing a query.\n *\n * @param {StateManager} stateManager\n * @param {string} query\n */\n async searchPackagesByQuery(stateManager, query) {\n await this.searchPackages(stateManager, {page: 0, query: query});\n }\n\n /**\n * Used to filter packages only by providing tags.\n *\n * @param {StateManager} stateManager\n * @param {int[]} tags\n * @returns {Promise}\n */\n async filterPackagesByTags(stateManager, tags) {\n await this.searchPackages(stateManager, {tags: tags});\n }\n\n /**\n * Used to change the current page of a tab.\n *\n * @param {StateManager} stateManager\n * @param {string} category\n * @param {number} page\n */\n async changePage(stateManager, category, page) {\n await this.searchPackages(stateManager, {page: page}, [category]);\n }\n\n /**\n * Used to change the current sorting.\n *\n * @param {StateManager} stateManager\n * @param {string} sort\n * @param {string} order\n */\n async changeSort(stateManager, sort, order) {\n await this.searchPackages(stateManager, {sort: sort, order: order}, [\"all\", \"favourites\"]);\n }\n\n /**\n * Used to re-/load data of given categories.\n *\n * @param {StateManager} stateManager\n * @param {string[]} categories\n */\n async load(stateManager, categories) {\n await this.searchPackages(stateManager, {}, categories);\n }\n\n /**\n * Used to un-/favourite a package.\n *\n * @param {StateManager} stateManager\n * @param {int} packageid\n * @param {boolean} favourite\n */\n async favourite(stateManager, packageid, favourite) {\n const state = stateManager.state;\n try {\n this._setLoading(stateManager, true);\n const successful = await favouritePackage(packageid, favourite);\n if (!successful) {\n return;\n }\n stateManager.setReadOnly(false);\n for (const category of [\"all\", \"recentlyused\"]) {\n const pkg = state[`${category}Packages`].get(packageid);\n if (pkg) {\n pkg.isfavourite = favourite;\n }\n }\n stateManager.setReadOnly(true);\n let page = state.favourites.page;\n if (!favourite) {\n // Turn back a page in 'favourites' if the unmarked package was the last one on the page.\n const isFirstPage = page === 0;\n const isLastPage = page === Math.floor((state.favourites.total - 1) / this.options.limit);\n const existsOnePackage = state.favourites.count === 1;\n if (!isFirstPage && isLastPage && existsOnePackage) {\n page -= 1;\n }\n }\n await this.changePage(stateManager, 'favourites', page);\n } catch (exception) {\n await Notification.exception(exception);\n } finally {\n this._setLoading(stateManager, false);\n }\n }\n}\n"],"names":["constructor","options","_getSearchPackagesInCategoriesPromise","state","page","categories","methods","category","method","methodname","args","query","general","tags","sort","sorting","order","limit","this","contextid","push","Ajax","call","_setLoading","stateManager","loading","isReadonly","readonly","setReadOnly","results","index","entries","result","packages","count","total","exception","Notification","searchPackages","packageid","favourite","pkg","get","isfavourite","favourites","isFirstPage","isLastPage","Math","floor","existsOnePackage","changePage"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mutations.min.js","sources":["../../src/package_search/mutations.js"],"sourcesContent":["/*\n * This file is part of the QuestionPy Moodle plugin - https://questionpy.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/**\n * @module qtype_questionpy/package_search/mutations\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport {favouritePackage} from 'qtype_questionpy/utils';\n\nexport default class {\n /**\n * @param {{contextid: number, limit: number}} options\n */\n constructor(options) {\n this.options = options;\n }\n\n /**\n * Search through given categories.\n *\n * If no page is provided the current page will be used.\n *\n * @param {any} state\n * @param {number|null} page\n * @param {string[]} categories\n * @returns {any}\n * @private\n */\n _getSearchPackagesInCategoriesPromise(state, page, categories) {\n const methods = [];\n for (const category of categories) {\n const method = {\n methodname: \"qtype_questionpy_search_packages\",\n args: {\n query: state.general.query,\n tags: state.general.tags,\n category: category,\n sort: state.general.sorting.sort,\n order: state.general.sorting.order,\n limit: this.options.limit,\n page: (typeof page === \"number\") ? page : state[category].page,\n contextid: this.options.contextid,\n },\n };\n methods.push(method);\n }\n return Ajax.call(methods);\n }\n\n /**\n * Sets the `loading` property.\n *\n * It only communicates changes to the watchers if the `StateManager` is currently readonly.\n *\n * @param {StateManager} stateManager\n * @param {boolean} loading\n * @private\n */\n _setLoading(stateManager, loading) {\n const state = stateManager.state;\n if (state.loading === loading) {\n return;\n }\n const isReadonly = stateManager.readonly;\n if (isReadonly) {\n stateManager.setReadOnly(false);\n }\n state.general.loading = loading;\n if (isReadonly) {\n stateManager.setReadOnly(true);\n }\n }\n\n /**\n * Used to search packages.\n *\n * Missing arguments are taken from the current state.\n *\n * @param {StateManager} stateManager\n * @param {Object|null} args\n * @param {string[]|null} categories\n */\n async searchPackages(stateManager, args = null, categories = null) {\n const state = stateManager.state;\n\n // Missing arguments are taken from the current state.\n args = args || {};\n\n // Search through every category if no categories are provided.\n categories = categories || [\"all\", \"recentlyused\", \"favourites\"];\n\n // Update general data.\n stateManager.setReadOnly(false);\n this._setLoading(stateManager, true);\n state.general.query = (typeof args.query === \"string\") ? args.query : state.general.query;\n state.general.tags = args.tags || state.general.tags;\n state.general.sorting = {\n sort: args.sort || state.general.sorting.sort,\n order: args.order || state.general.sorting.order,\n };\n stateManager.setReadOnly(true);\n\n try {\n // Get search results for each category.\n let results = await this._getSearchPackagesInCategoriesPromise(state, args.page, categories);\n\n stateManager.setReadOnly(false);\n // Update category specific data.\n for (const [index, category] of categories.entries()) {\n const result = await results[index];\n state[`${category}Packages`] = result.packages;\n state[category].count = result.count;\n state[category].total = result.total;\n if (typeof args.page === \"number\") {\n state[category].page = args.page;\n }\n }\n stateManager.setReadOnly(true);\n } catch (exception) {\n await Notification.exception(exception);\n } finally {\n this._setLoading(stateManager, false);\n }\n }\n\n /**\n * Used to search for packages only by providing a query.\n *\n * @param {StateManager} stateManager\n * @param {string} query\n */\n async searchPackagesByQuery(stateManager, query) {\n await this.searchPackages(stateManager, {page: 0, query: query});\n }\n\n /**\n * Used to filter packages only by providing tags.\n *\n * @param {StateManager} stateManager\n * @param {int[]} tags\n * @returns {Promise}\n */\n async filterPackagesByTags(stateManager, tags) {\n await this.searchPackages(stateManager, {page: 0, tags: tags});\n }\n\n /**\n * Used to change the current page of a tab.\n *\n * @param {StateManager} stateManager\n * @param {string} category\n * @param {number} page\n */\n async changePage(stateManager, category, page) {\n await this.searchPackages(stateManager, {page: page}, [category]);\n }\n\n /**\n * Used to change the current sorting.\n *\n * @param {StateManager} stateManager\n * @param {string} sort\n * @param {string} order\n */\n async changeSort(stateManager, sort, order) {\n await this.searchPackages(stateManager, {sort: sort, order: order}, [\"all\", \"favourites\"]);\n }\n\n /**\n * Used to re-/load data of given categories.\n *\n * @param {StateManager} stateManager\n * @param {string[]} categories\n */\n async load(stateManager, categories) {\n await this.searchPackages(stateManager, {}, categories);\n }\n\n /**\n * Used to un-/favourite a package.\n *\n * @param {StateManager} stateManager\n * @param {int} packageid\n * @param {boolean} favourite\n */\n async favourite(stateManager, packageid, favourite) {\n const state = stateManager.state;\n try {\n this._setLoading(stateManager, true);\n const successful = await favouritePackage(packageid, favourite);\n if (!successful) {\n return;\n }\n stateManager.setReadOnly(false);\n for (const category of [\"all\", \"recentlyused\"]) {\n const pkg = state[`${category}Packages`].get(packageid);\n if (pkg) {\n pkg.isfavourite = favourite;\n }\n }\n stateManager.setReadOnly(true);\n let page = state.favourites.page;\n if (!favourite) {\n // Turn back a page in 'favourites' if the unmarked package was the last one on the page.\n const isFirstPage = page === 0;\n const isLastPage = page === Math.floor((state.favourites.total - 1) / this.options.limit);\n const existsOnePackage = state.favourites.count === 1;\n if (!isFirstPage && isLastPage && existsOnePackage) {\n page -= 1;\n }\n }\n await this.changePage(stateManager, 'favourites', page);\n } catch (exception) {\n await Notification.exception(exception);\n } finally {\n this._setLoading(stateManager, false);\n }\n }\n}\n"],"names":["constructor","options","_getSearchPackagesInCategoriesPromise","state","page","categories","methods","category","method","methodname","args","query","general","tags","sort","sorting","order","limit","this","contextid","push","Ajax","call","_setLoading","stateManager","loading","isReadonly","readonly","setReadOnly","results","index","entries","result","packages","count","total","exception","Notification","searchPackages","packageid","favourite","pkg","get","isfavourite","favourites","isFirstPage","isLastPage","Math","floor","existsOnePackage","changePage"],"mappings":"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"} \ No newline at end of file diff --git a/amd/src/package_search/mutations.js b/amd/src/package_search/mutations.js index 8ff6f1d7..b44c1f03 100644 --- a/amd/src/package_search/mutations.js +++ b/amd/src/package_search/mutations.js @@ -157,7 +157,7 @@ export default class { * @returns {Promise} */ async filterPackagesByTags(stateManager, tags) { - await this.searchPackages(stateManager, {tags: tags}); + await this.searchPackages(stateManager, {page: 0, tags: tags}); } /**