mirror of
https://github.com/moodle/moodle.git
synced 2025-08-11 03:46:42 +02:00
Merge branch 'MDL-79613-master' of https://github.com/snake/moodle
This commit is contained in:
commit
02d5e79b6f
8 changed files with 180 additions and 3 deletions
|
@ -5,6 +5,6 @@ define("core_grades/searchwidget/basewidget",["exports","core/utils","core/templ
|
||||||
* @module core_grades/searchwidget/basewidget
|
* @module core_grades/searchwidget/basewidget
|
||||||
* @copyright 2022 Mathew May <mathew.solutions>
|
* @copyright 2022 Mathew May <mathew.solutions>
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||||
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.showLoader=_exports.registerListenerEvents=_exports.promisesAndResolvers=_exports.init=void 0,Templates=_interopRequireWildcard(Templates),Selectors=_interopRequireWildcard(Selectors),_notification=_interopRequireDefault(_notification),_log=_interopRequireDefault(_log);_exports.init=async function(widgetContentContainer,bodyPromise,data,searchFunc){let unsearchableContent=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,afterSelect=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null;_log.default.debug("This pattern is no longer used, refer to core/search_combobox() instead."),bodyPromise.then((async bodyContent=>{if(widgetContentContainer.innerHTML=bodyContent,unsearchableContent){widgetContentContainer.querySelector(Selectors.regions.unsearchableContent).innerHTML+=unsearchableContent}const searchResultsContainer=widgetContentContainer.querySelector(Selectors.regions.searchResults);await showLoader(searchResultsContainer),await renderSearchResults(searchResultsContainer,data),registerListenerEvents(widgetContentContainer,data,searchFunc,afterSelect)})).catch(_notification.default.exception)};const registerListenerEvents=function(widgetContentContainer,data,searchFunc){let afterSelect=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const searchResultsContainer=widgetContentContainer.querySelector(Selectors.regions.searchResults),searchInput=widgetContentContainer.querySelector(Selectors.actions.search);if(!searchInput)return;searchInput.focus();const clearSearchButton=widgetContentContainer.querySelector(Selectors.actions.clearSearch);searchInput.addEventListener("input",(0,_utils.debounce)((async()=>{searchInput.value.length>0?clearSearchButton.classList.remove("d-none"):clearSearchButton.classList.add("d-none"),searchInput.removeAttribute("aria-activedescendant"),await renderSearchResults(searchResultsContainer,debounceCallee(searchInput.value,data,searchFunc()))}),300)),clearSearchButton.addEventListener("click",(async e=>{e.stopPropagation(),searchInput.value="",searchInput.focus(),clearSearchButton.classList.add("d-none"),searchInput.removeAttribute("aria-activedescendant"),await renderSearchResults(searchResultsContainer,debounceCallee(searchInput.value,data,searchFunc()))}));const inputElement=document.getElementById(searchInput.dataset.inputElement);inputElement&&afterSelect&&inputElement.addEventListener("change",(e=>{widgetContentContainer.querySelector(Selectors.elements.getSearchWidgetSelectOption(searchInput))&&afterSelect(e.target.value)})),widgetContentContainer.addEventListener("click",(e=>{const deprecatedOption=e.target.closest('a.dropdown-item[role="menuitem"]:not([href]), .dropdown-item[role="option"]:not([href])');if(deprecatedOption)if(inputElement&&afterSelect)afterSelect(deprecatedOption.dataset.value);else{const url=(data.find((object=>object.id==deprecatedOption.dataset.value))||{url:""}).url;location.href=url}})),widgetContentContainer.addEventListener("keydown",(e=>{const deprecatedOption=e.target.closest('a.dropdown-item[role="menuitem"]:not([href]), .dropdown-item[role="option"]:not([href])');if(deprecatedOption&&(" "===e.key||"Enter"===e.key))if(e.preventDefault(),inputElement&&afterSelect)afterSelect(deprecatedOption.dataset.value);else{const url=(data.find((object=>object.id==deprecatedOption.dataset.value))||{url:""}).url;location.href=url}}))};_exports.registerListenerEvents=registerListenerEvents;const showLoader=async container=>{container.innerHTML="";const{html:html,js:js}=await Templates.renderForPromise("core_grades/searchwidget/loading",{});Templates.replaceNodeContents(container,html,js)};_exports.showLoader=showLoader;const debounceCallee=(searchValue,data,searchFunction)=>searchValue.length>0?searchFunction(data,searchValue):data,renderSearchResults=async(searchResultsContainer,searchResultsData)=>{const templateData={searchresults:searchResultsData},{html:html,js:js}=await Templates.renderForPromise("core_grades/searchwidget/searchresults",templateData);if(await Templates.replaceNodeContents(searchResultsContainer,html,js),"listbox"!==searchResultsContainer.getAttribute("role")){const deprecatedOptions=searchResultsContainer.querySelectorAll('a.dropdown-item[role="menuitem"][href=""], .dropdown-item[role="option"]:not([href])');for(const option of deprecatedOptions)option.tabIndex=0,option.removeAttribute("href")}};_exports.promisesAndResolvers=()=>{let bodyPromiseResolver;const bodyPromise=new Promise((resolve=>{bodyPromiseResolver=resolve}));return{bodyPromiseResolver:bodyPromiseResolver,bodyPromise:bodyPromise}}}));
|
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.showLoader=_exports.registerListenerEvents=_exports.promisesAndResolvers=_exports.init=void 0,Templates=_interopRequireWildcard(Templates),Selectors=_interopRequireWildcard(Selectors),_notification=_interopRequireDefault(_notification),_log=_interopRequireDefault(_log);_exports.init=async function(widgetContentContainer,bodyPromise,data,searchFunc){let unsearchableContent=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,afterSelect=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null;_log.default.debug("The core_grades/searchwidget/basewidget component is deprecated. Please refer to core/search_combobox() instead."),bodyPromise.then((async bodyContent=>{if(widgetContentContainer.innerHTML=bodyContent,unsearchableContent){widgetContentContainer.querySelector(Selectors.regions.unsearchableContent).innerHTML+=unsearchableContent}const searchResultsContainer=widgetContentContainer.querySelector(Selectors.regions.searchResults);await showLoader(searchResultsContainer),await renderSearchResults(searchResultsContainer,data),registerListenerEvents(widgetContentContainer,data,searchFunc,afterSelect)})).catch(_notification.default.exception)};const registerListenerEvents=function(widgetContentContainer,data,searchFunc){let afterSelect=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const searchResultsContainer=widgetContentContainer.querySelector(Selectors.regions.searchResults),searchInput=widgetContentContainer.querySelector(Selectors.actions.search);if(!searchInput)return;searchInput.focus();const clearSearchButton=widgetContentContainer.querySelector(Selectors.actions.clearSearch);searchInput.addEventListener("input",(0,_utils.debounce)((async()=>{searchInput.value.length>0?clearSearchButton.classList.remove("d-none"):clearSearchButton.classList.add("d-none"),searchInput.removeAttribute("aria-activedescendant"),await renderSearchResults(searchResultsContainer,debounceCallee(searchInput.value,data,searchFunc()))}),300)),clearSearchButton.addEventListener("click",(async e=>{e.stopPropagation(),searchInput.value="",searchInput.focus(),clearSearchButton.classList.add("d-none"),searchInput.removeAttribute("aria-activedescendant"),await renderSearchResults(searchResultsContainer,debounceCallee(searchInput.value,data,searchFunc()))}));const inputElement=document.getElementById(searchInput.dataset.inputElement);inputElement&&afterSelect&&inputElement.addEventListener("change",(e=>{widgetContentContainer.querySelector(Selectors.elements.getSearchWidgetSelectOption(searchInput))&&afterSelect(e.target.value)})),widgetContentContainer.addEventListener("click",(e=>{const deprecatedOption=e.target.closest('a.dropdown-item[role="menuitem"]:not([href]), .dropdown-item[role="option"]:not([href])');if(deprecatedOption)if(inputElement&&afterSelect)afterSelect(deprecatedOption.dataset.value);else{const url=(data.find((object=>object.id==deprecatedOption.dataset.value))||{url:""}).url;location.href=url}})),widgetContentContainer.addEventListener("keydown",(e=>{const deprecatedOption=e.target.closest('a.dropdown-item[role="menuitem"]:not([href]), .dropdown-item[role="option"]:not([href])');if(deprecatedOption&&(" "===e.key||"Enter"===e.key))if(e.preventDefault(),inputElement&&afterSelect)afterSelect(deprecatedOption.dataset.value);else{const url=(data.find((object=>object.id==deprecatedOption.dataset.value))||{url:""}).url;location.href=url}}))};_exports.registerListenerEvents=registerListenerEvents;const showLoader=async container=>{container.innerHTML="";const{html:html,js:js}=await Templates.renderForPromise("core_grades/searchwidget/loading",{});Templates.replaceNodeContents(container,html,js)};_exports.showLoader=showLoader;const debounceCallee=(searchValue,data,searchFunction)=>searchValue.length>0?searchFunction(data,searchValue):data,renderSearchResults=async(searchResultsContainer,searchResultsData)=>{const templateData={searchresults:searchResultsData},{html:html,js:js}=await Templates.renderForPromise("core_grades/searchwidget/searchresults",templateData);if(await Templates.replaceNodeContents(searchResultsContainer,html,js),"listbox"!==searchResultsContainer.getAttribute("role")){const deprecatedOptions=searchResultsContainer.querySelectorAll('a.dropdown-item[role="menuitem"][href=""], .dropdown-item[role="option"]:not([href])');for(const option of deprecatedOptions)option.tabIndex=0,option.removeAttribute("href")}};_exports.promisesAndResolvers=()=>{let bodyPromiseResolver;const bodyPromise=new Promise((resolve=>{bodyPromiseResolver=resolve}));return{bodyPromiseResolver:bodyPromiseResolver,bodyPromise:bodyPromise}}}));
|
||||||
|
|
||||||
//# sourceMappingURL=basewidget.min.js.map
|
//# sourceMappingURL=basewidget.min.js.map
|
File diff suppressed because one or more lines are too long
|
@ -45,7 +45,7 @@ export const init = async(
|
||||||
unsearchableContent = null,
|
unsearchableContent = null,
|
||||||
afterSelect = null,
|
afterSelect = null,
|
||||||
) => {
|
) => {
|
||||||
Log.debug('This pattern is no longer used, refer to core/search_combobox() instead.');
|
Log.debug('The core_grades/searchwidget/basewidget component is deprecated. Please refer to core/search_combobox() instead.');
|
||||||
bodyPromise.then(async(bodyContent) => {
|
bodyPromise.then(async(bodyContent) => {
|
||||||
// Render the body content.
|
// Render the body content.
|
||||||
widgetContentContainer.innerHTML = bodyContent;
|
widgetContentContainer.innerHTML = bodyContent;
|
||||||
|
|
39
grade/templates/searchwidget/error.mustache
Normal file
39
grade/templates/searchwidget/error.mustache
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
{{!
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
}}
|
||||||
|
{{!
|
||||||
|
@template core_grades/searchwidget/error
|
||||||
|
|
||||||
|
Chooser error template.
|
||||||
|
|
||||||
|
Variables required for this template:
|
||||||
|
* errormessage - The error message
|
||||||
|
|
||||||
|
Example context (json):
|
||||||
|
{
|
||||||
|
"errormessage": "Error"
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
<div class="p-2 px-sm-5 py-sm-4">
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<h5 class="alert-heading">
|
||||||
|
<i class="fa fa-exclamation-circle fa-fw text-danger"></i>
|
||||||
|
{{#str}} error, error {{/str}}
|
||||||
|
</h5>
|
||||||
|
<hr>
|
||||||
|
<p class="text-break">{{{errormessage}}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
27
grade/templates/searchwidget/loading.mustache
Normal file
27
grade/templates/searchwidget/loading.mustache
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{{!
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
}}
|
||||||
|
{{!
|
||||||
|
@template core_grades/searchwidget/loading
|
||||||
|
|
||||||
|
This template renders the loading placeholder for the search widget.
|
||||||
|
|
||||||
|
Example context (json):
|
||||||
|
{}
|
||||||
|
}}
|
||||||
|
<div class="d-flex w-100 h-100 justify-content-center align-items-center">
|
||||||
|
{{> core/loading }}
|
||||||
|
</div>
|
7
grade/templates/searchwidget/readme.txt
Normal file
7
grade/templates/searchwidget/readme.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
NOTE: Templates inside this directory have been deprecated since Moodle 4.3 and will be removed in 4.7.
|
||||||
|
|
||||||
|
They are only retained so that plugins using the now-deprecated searchwidget located in:
|
||||||
|
|
||||||
|
'grade/amd/src/searchwidget/basewidget.js'
|
||||||
|
|
||||||
|
can continue to use this widget in a working state during the deprecation period.
|
59
grade/templates/searchwidget/searchitem.mustache
Normal file
59
grade/templates/searchwidget/searchitem.mustache
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{{!
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
}}
|
||||||
|
{{!
|
||||||
|
@template core_grades/searchwidget/searchitem
|
||||||
|
|
||||||
|
Search result line items.
|
||||||
|
|
||||||
|
Example context (json):
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"name": "Quiz 1",
|
||||||
|
"fullname": "Cameron Greeve"
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
<li
|
||||||
|
role="option"
|
||||||
|
class="dropdown-item d-flex px-2 py-1 {{^name}}align-items-center{{/name}}"
|
||||||
|
{{#name}}id="item-{{id}}"{{/name}}
|
||||||
|
{{^name}}id="user-{{id}}"{{/name}}
|
||||||
|
data-value="{{id}}"
|
||||||
|
>
|
||||||
|
{{#name}}
|
||||||
|
<span class="pull-left result-cell text-truncate mr-2">
|
||||||
|
{{name}}
|
||||||
|
</span>
|
||||||
|
{{/name}}
|
||||||
|
{{^name}}
|
||||||
|
<div class="d-block pr-2 w-25">
|
||||||
|
{{#profileimage}}
|
||||||
|
<img class="userpicture w-75 mx-auto d-block" src="{{profileimage}}" alt="" />
|
||||||
|
{{/profileimage}}
|
||||||
|
{{^profileimage}}
|
||||||
|
<span class="userinitials"></span>
|
||||||
|
{{/profileimage}}
|
||||||
|
</div>
|
||||||
|
<div class="d-block pr-3 w-75">
|
||||||
|
<span class="w-100 p-0 font-weight-bold">
|
||||||
|
{{fullname}}
|
||||||
|
</span>
|
||||||
|
<span class="w-100 pull-left text-truncate small">
|
||||||
|
{{email}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{{/name}}
|
||||||
|
</li>
|
45
grade/templates/searchwidget/searchresults.mustache
Normal file
45
grade/templates/searchwidget/searchresults.mustache
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
{{!
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
}}
|
||||||
|
{{!
|
||||||
|
@template core_grades/searchwidget/searchresults
|
||||||
|
|
||||||
|
The wrapper in which our search results will be rendered
|
||||||
|
|
||||||
|
Example context (json):
|
||||||
|
{
|
||||||
|
"searchresults": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"name": "Quiz 1",
|
||||||
|
"fullname": "Cameron Greeve",
|
||||||
|
"sendmessage": "http://foo.bar/message/index.php?id=25",
|
||||||
|
"addcontact": "http://foo.bar/message/index.php?user1=2&user2=14&addcontact=14&sesskey=XXXXX",
|
||||||
|
"currentuser": "2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
<div class="searchresultitemscontainer-wrapper dropdown">
|
||||||
|
<ul class="searchresultitemscontainer d-flex flex-column mw-100 position-relative py-2 list-group rounded-0" role="none" data-region="search-result-items-container">
|
||||||
|
{{#searchresults}}
|
||||||
|
{{>core_grades/searchwidget/searchitem}}
|
||||||
|
{{/searchresults}}
|
||||||
|
{{^searchresults}}
|
||||||
|
<p>{{#str}} resultsfound, core, 0 {{/str}}</p>
|
||||||
|
{{/searchresults}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
Loading…
Add table
Add a link
Reference in a new issue