Merge branch 'MDL-85598-main' of https://github.com/ferranrecio/moodle
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
issueNumber: MDL-85598
|
||||
notes:
|
||||
core_course:
|
||||
- message: >-
|
||||
Activities can now specify an additional purpose in their
|
||||
PLUGINNAME_supports function by using the new FEATURE_MOD_OTHERPURPOSE
|
||||
feature.
|
||||
type: improved
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -6,6 +6,6 @@ define("core_course/local/activitychooser/exporter",["exports","core/str"],(func
|
||||
* @copyright 2025 Ferran Recio <ferran@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
const activityCategories=["administration","assessment","collaboration","communication","content","interactivecontent"];let allStrings=null;loadNecessaryStrings();async function loadNecessaryStrings(){if(null!==allStrings)return allStrings;allStrings={};const stringToLoad=[{key:"all",component:"core"},{key:"yes",component:"core"},{key:"no",component:"core"},{key:"favourites",component:"core"},{key:"recommended",component:"core"},{key:"gradable",component:"core"},{key:"recommended_help",component:"core_course"},{key:"supports",component:"core_course"},...activityCategories.map((key=>({key:"mod_purpose_"+key,component:"core_course"}))),...activityCategories.map((key=>({key:"mod_purpose_"+key+"_help",component:"core_course"})))],loadedStrings=await(0,_str.getStrings)(stringToLoad);return stringToLoad.forEach(((_ref,index)=>{let{key:key}=_ref;allStrings[key]=loadedStrings[index]})),allStrings}return _exports.default=class{getTabData(tabId,filteredModules,tabLabel){let tabHelp=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const result={tabId:tabId,active:arguments.length>4&&void 0!==arguments[4]&&arguments[4],items:filteredModules,displayed:filteredModules.length>0,tabLabel:tabLabel};return tabHelp&&(result.tabHelp=tabHelp),result}normaliseModulesData(modulesData){if(modulesData instanceof Map)modulesData=Array.from(modulesData.values());else if(!Array.isArray(modulesData))throw new Error("Invalid modules data format. Expected an array or a Map.");return modulesData}async getModChooserTemplateData(modulesData){modulesData=this.normaliseModulesData(modulesData);const allStrings=await loadNecessaryStrings(),favouriteTab=await this.getFavouriteTabData(modulesData),tabs=[{...this.getTabData("all",modulesData,allStrings.all,null,!favouriteTab.displayed),hasSearchResults:!0},favouriteTab,{...this.getTabData("recommended",modulesData.filter((mod=>!0===mod.recommended)),allStrings.recommended,allStrings.recommended_help),separator:!0}];return activityCategories.forEach((category=>{const categoryModules=modulesData.filter((mod=>mod.purpose==category));0!==categoryModules.length&&tabs.push(this.getTabData(category,categoryModules,allStrings["mod_purpose_"+category],allStrings["mod_purpose_"+category+"_help"]))})),{modules:modulesData,tabs:tabs}}async getModuleHelpTemplateData(moduleData){const purposeKey="mod_purpose_".concat(moduleData.purpose),allStrings=await loadNecessaryStrings(),data={...moduleData};return data.details=[{label:allStrings.supports,value:allStrings[purposeKey]||""},{label:allStrings.gradable,value:moduleData.gradable?allStrings.yes:allStrings.no}],data}async getFavouriteTabData(modulesData){modulesData=this.normaliseModulesData(modulesData);const allStrings=await loadNecessaryStrings(),favouriteModules=modulesData.filter((mod=>!0===mod.favourite));return this.getTabData("favourites",favouriteModules,allStrings.favourites,null,favouriteModules.length>0)}getSearchResultData(resultsModulesData){return{searchresultsnumber:(resultsModulesData=this.normaliseModulesData(resultsModulesData)).length,searchresults:resultsModulesData}}countTabItems(tabData){var _tabData$items$length,_tabData$items;return null!==(_tabData$items$length=null===(_tabData$items=tabData.items)||void 0===_tabData$items?void 0:_tabData$items.length)&&void 0!==_tabData$items$length?_tabData$items$length:0}getFooterData(footerData){return{activeFooter:footerData.customfootertemplate}}},_exports.default}));
|
||||
const activityCategories=["administration","assessment","collaboration","communication","content","interactivecontent"];let allStrings=null;loadNecessaryStrings();async function loadNecessaryStrings(){if(null!==allStrings)return allStrings;allStrings={};const stringToLoad=[{key:"all",component:"core"},{key:"yes",component:"core"},{key:"no",component:"core"},{key:"favourites",component:"core"},{key:"recommended",component:"core"},{key:"gradable",component:"core"},{key:"recommended_help",component:"core_course"},...activityCategories.map((key=>({key:"mod_purpose_"+key,component:"core_course"}))),...activityCategories.map((key=>({key:"mod_purpose_"+key+"_help",component:"core_course"})))],loadedStrings=await(0,_str.getStrings)(stringToLoad);return stringToLoad.forEach(((_ref,index)=>{let{key:key}=_ref;allStrings[key]=loadedStrings[index]})),allStrings}return _exports.default=class{getTabData(tabId,filteredModules,tabLabel){let tabHelp=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const result={tabId:tabId,active:arguments.length>4&&void 0!==arguments[4]&&arguments[4],items:filteredModules,displayed:filteredModules.length>0,tabLabel:tabLabel};return tabHelp&&(result.tabHelp=tabHelp),result}normaliseModulesData(modulesData){if(modulesData instanceof Map)modulesData=Array.from(modulesData.values());else if(!Array.isArray(modulesData))throw new Error("Invalid modules data format. Expected an array or a Map.");return modulesData}async getModChooserTemplateData(modulesData){modulesData=this.normaliseModulesData(modulesData);const allStrings=await loadNecessaryStrings(),favouriteTab=await this.getFavouriteTabData(modulesData),tabs=[{...this.getTabData("all",modulesData,allStrings.all,null,!favouriteTab.displayed),hasSearchResults:!0},favouriteTab,{...this.getTabData("recommended",modulesData.filter((mod=>!0===mod.recommended)),allStrings.recommended,allStrings.recommended_help),separator:!0}];return activityCategories.forEach((category=>{const categoryModules=modulesData.filter((mod=>mod.purpose==category||mod.otherpurpose==category));0!==categoryModules.length&&tabs.push(this.getTabData(category,categoryModules,allStrings["mod_purpose_"+category],allStrings["mod_purpose_"+category+"_help"]))})),{modules:modulesData,tabs:tabs}}async getModuleHelpTemplateData(moduleData){const allStrings=await loadNecessaryStrings(),data={...moduleData,purposes:[]};for(const purposeField of["purpose","otherpurpose"])moduleData[purposeField]&&activityCategories.includes(moduleData[purposeField])&&data.purposes.push({purposename:moduleData[purposeField],purposelabel:allStrings["mod_purpose_".concat(moduleData[purposeField])]});return data.details=[{label:allStrings.gradable,value:moduleData.gradable?allStrings.yes:allStrings.no}],data}async getFavouriteTabData(modulesData){modulesData=this.normaliseModulesData(modulesData);const allStrings=await loadNecessaryStrings(),favouriteModules=modulesData.filter((mod=>!0===mod.favourite));return this.getTabData("favourites",favouriteModules,allStrings.favourites,null,favouriteModules.length>0)}getSearchResultData(resultsModulesData){return{searchresultsnumber:(resultsModulesData=this.normaliseModulesData(resultsModulesData)).length,searchresults:resultsModulesData}}countTabItems(tabData){var _tabData$items$length,_tabData$items;return null!==(_tabData$items$length=null===(_tabData$items=tabData.items)||void 0===_tabData$items?void 0:_tabData$items.length)&&void 0!==_tabData$items$length?_tabData$items$length:0}getFooterData(footerData){return{activeFooter:footerData.customfootertemplate}}},_exports.default}));
|
||||
|
||||
//# sourceMappingURL=exporter.min.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -6,6 +6,6 @@ define("core_course/local/activitychooser/selectors",["exports"],(function(_expo
|
||||
* @copyright 2019 Mathew May <mathew.solutions>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
const getDataSelector=(name,value)=>"[data-".concat(name,'="').concat(value,'"]');var _default={regions:{activeFooter:getDataSelector("region","active-footer-container"),categoryContent:getDataSelector("region","category-content"),getSectionChooserOptions:containerid=>"".concat(containerid," ").concat(getDataSelector("region","chooser-options-container")),chooserOptions:getDataSelector("region","chooser-options-container"),chooserOption:{container:getDataSelector("region","chooser-option-container"),actions:getDataSelector("region","chooser-option-actions-container"),info:getDataSelector("region","chooser-option-info-container")},chooserSummary:{container:getDataSelector("region","chooser-option-summary-container"),content:getDataSelector("region","chooser-option-summary-content-container"),header:getDataSelector("region","summary-header"),actions:getDataSelector("region","chooser-option-summary-actions-container")},carousel:getDataSelector("region","carousel"),help:getDataSelector("region","help"),tabContent:getDataSelector("region","tabcontent"),favouriteTabNav:getDataSelector("region","favourites-tab-nav"),allTabNav:getDataSelector("region","all-tab-nav"),favouriteTab:getDataSelector("region","favourites"),getModuleSelector:modname=>'[role="menuitem"][data-modname="'.concat(modname,'"]'),searchResults:getDataSelector("region","search-results-container")},actions:{optionActions:{showSummary:getDataSelector("action","show-option-summary"),manageFavourite:getDataSelector("action","manage-module-favourite")},addChooser:getDataSelector("action","add-chooser-option"),addSelectedChooserOption:getDataSelector("action","add-selected-chooser-option"),closeOption:getDataSelector("action","close-chooser-option-summary"),hide:getDataSelector("action","hide"),search:getDataSelector("action","search"),clearSearch:getDataSelector("action","clearsearch")},elements:{section:".section",sectionmodchooser:"button.section-modchooser-link",tab:'a[data-bs-toggle="tab"]',activetab:'a[data-bs-toggle="tab"][aria-selected="true"]',moduleItem:item=>'[data-internal="'.concat(item,'"]'),favouriteIconActive:'[data-icon="favourite-active"]',favouriteIconInactive:'[data-icon="favourite-inactive"]'}};return _exports.default=_default,_exports.default}));
|
||||
const getDataSelector=(name,value)=>"[data-".concat(name,'="').concat(value,'"]');var _default={regions:{activeFooter:getDataSelector("region","active-footer-container"),categoryContent:getDataSelector("region","category-content"),getSectionChooserOptions:containerid=>"".concat(containerid," ").concat(getDataSelector("region","chooser-options-container")),chooserOptions:getDataSelector("region","chooser-options-container"),chooserOption:{container:getDataSelector("region","chooser-option-container"),actions:getDataSelector("region","chooser-option-actions-container"),info:getDataSelector("region","chooser-option-info-container")},chooserSummary:{container:getDataSelector("region","chooser-option-summary-container"),content:getDataSelector("region","chooser-option-summary-content-container"),header:getDataSelector("region","summary-header"),actions:getDataSelector("region","chooser-option-summary-actions-container")},carousel:getDataSelector("region","carousel"),help:getDataSelector("region","help"),tabContent:getDataSelector("region","tabcontent"),favouriteTabNav:getDataSelector("region","favourites-tab-nav"),allTabNav:getDataSelector("region","all-tab-nav"),categoryTabNav:category=>getDataSelector("region","".concat(category,"-tab-nav")),favouriteTab:getDataSelector("region","favourites"),getModuleSelector:modname=>'[role="menuitem"][data-modname="'.concat(modname,'"]'),searchResults:getDataSelector("region","search-results-container")},actions:{optionActions:{showSummary:getDataSelector("action","show-option-summary"),manageFavourite:getDataSelector("action","manage-module-favourite")},addChooser:getDataSelector("action","add-chooser-option"),addSelectedChooserOption:getDataSelector("action","add-selected-chooser-option"),clearSearch:getDataSelector("action","clearsearch"),closeOption:getDataSelector("action","close-chooser-option-summary"),displayCategory:getDataSelector("action","chooser-display-category"),hide:getDataSelector("action","hide"),search:getDataSelector("action","search")},elements:{section:".section",sectionmodchooser:"button.section-modchooser-link",tab:'a[data-bs-toggle="tab"]',activetab:'a[data-bs-toggle="tab"][aria-selected="true"]',moduleItem:item=>'[data-internal="'.concat(item,'"]'),favouriteIconActive:'[data-icon="favourite-active"]',favouriteIconInactive:'[data-icon="favourite-inactive"]'}};return _exports.default=_default,_exports.default}));
|
||||
|
||||
//# sourceMappingURL=selectors.min.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -293,6 +293,11 @@ class ActivityChooserDialogue {
|
||||
return;
|
||||
}
|
||||
|
||||
if (target.closest(selectors.actions.displayCategory)) {
|
||||
this.handleDisplayCategory(target);
|
||||
return;
|
||||
}
|
||||
|
||||
if (target.closest(selectors.actions.optionActions.manageFavourite)) {
|
||||
await this.handleFavouriteClick(target);
|
||||
return;
|
||||
@@ -345,6 +350,21 @@ class ActivityChooserDialogue {
|
||||
this.dialogueDom.showModuleHelp(moduleData, this.modal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the display of a category when the user clicks on the "display category" button.
|
||||
* @param {HTMLElement} target The target element that triggered the event
|
||||
*/
|
||||
handleDisplayCategory(target) {
|
||||
const category = target.dataset.category;
|
||||
if (!category) {
|
||||
return;
|
||||
}
|
||||
this.dialogueDom.hideModuleHelp();
|
||||
const tabNav = this.dialogueDom.showCategoryTab(category);
|
||||
tabNav.focus();
|
||||
tabNav.scrollIntoView();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the favourite state of a module when the user clicks on the "starred" button.
|
||||
*
|
||||
|
||||
@@ -155,16 +155,27 @@ export default class ChooserDialogueDOM {
|
||||
* @return {HTMLElement} The "All activities" tab element.
|
||||
*/
|
||||
showAllActivitiesTab() {
|
||||
const navTab = this.modalBody.querySelector(selectors.regions.allTabNav);
|
||||
return this.showCategoryTab('all');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a specific category tab.
|
||||
* @method showCategoryTab
|
||||
* @param {String} category The category to show.
|
||||
* @return {HTMLElement} The category tab element.
|
||||
*/
|
||||
showCategoryTab(category) {
|
||||
const navTab = this.modalBody.querySelector(selectors.regions.categoryTabNav(category));
|
||||
|
||||
if (navTab.classList.contains('active')) {
|
||||
return navTab;
|
||||
}
|
||||
|
||||
const pendingPromise = new Pending('core_course/activitychooser:alltab');
|
||||
navTab.addEventListener('shown.bs.tab', pendingPromise.resolve, {once: true});
|
||||
const pendingPromise = new Pending(`core_course/activitychooser:${category}-tab`);
|
||||
|
||||
navTab.addEventListener('shown.bs.tab', pendingPromise.resolve, {once: true});
|
||||
Tab.getOrCreateInstance(navTab).show();
|
||||
|
||||
return navTab;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,6 +49,20 @@ export default class {
|
||||
* @property {String|null} tabHelp the help text for the tab (optional)
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} ModuleHelpData
|
||||
* @property {String} name The name of the module.
|
||||
* @property {String} description The description of the module.
|
||||
* @property {Array<ModulePurposeData>} purposes The purposes of the module.
|
||||
* @property {Array} details Additional details about the module.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} ModulePurposeData
|
||||
* @property {String} purposename The name of the purpose.
|
||||
* @property {String} purposelabel The label of the purpose.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Generate a tab data object for the activity chooser.
|
||||
*
|
||||
@@ -127,7 +141,7 @@ export default class {
|
||||
];
|
||||
|
||||
activityCategories.forEach((category) => {
|
||||
const categoryModules = modulesData.filter(mod => mod.purpose == category);
|
||||
const categoryModules = modulesData.filter(mod => mod.purpose == category || mod.otherpurpose == category);
|
||||
if (categoryModules.length === 0) {
|
||||
return;
|
||||
}
|
||||
@@ -151,19 +165,29 @@ export default class {
|
||||
* Get the module help template data.
|
||||
*
|
||||
* @param {Object} moduleData Data of the module to get help for.
|
||||
* @return {Promise<Object>} Promise resolved with the module help data.
|
||||
* @return {Promise<ModuleHelpData>} Promise resolved with the module help data.
|
||||
*/
|
||||
async getModuleHelpTemplateData(moduleData) {
|
||||
const purposeKey = `mod_purpose_${moduleData.purpose}`;
|
||||
const allStrings = await loadNecessaryStrings();
|
||||
const data = {
|
||||
...moduleData,
|
||||
purposes: [],
|
||||
};
|
||||
// Add purpose information from all related fields.
|
||||
for (const purposeField of ['purpose', 'otherpurpose']) {
|
||||
if (
|
||||
!moduleData[purposeField]
|
||||
|| !activityCategories.includes(moduleData[purposeField])
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
data.purposes.push({
|
||||
purposename: moduleData[purposeField],
|
||||
purposelabel: allStrings[`mod_purpose_${moduleData[purposeField]}`],
|
||||
});
|
||||
}
|
||||
// The rest of details are displayed as a simpler list.
|
||||
data.details = [
|
||||
{
|
||||
label: allStrings['supports'],
|
||||
value: allStrings[purposeKey] || '',
|
||||
},
|
||||
{
|
||||
label: allStrings['gradable'],
|
||||
value: moduleData.gradable ? allStrings['yes'] : allStrings['no'],
|
||||
@@ -253,7 +277,6 @@ async function loadNecessaryStrings() {
|
||||
{key: 'recommended', component: 'core'},
|
||||
{key: 'gradable', component: 'core'},
|
||||
{key: 'recommended_help', component: 'core_course'},
|
||||
{key: 'supports', component: 'core_course'},
|
||||
...activityCategories.map(
|
||||
(key) => ({
|
||||
key: 'mod_purpose_' + key,
|
||||
|
||||
@@ -54,6 +54,7 @@ export default {
|
||||
tabContent: getDataSelector('region', 'tabcontent'),
|
||||
favouriteTabNav: getDataSelector('region', 'favourites-tab-nav'),
|
||||
allTabNav: getDataSelector('region', 'all-tab-nav'),
|
||||
categoryTabNav: category => getDataSelector('region', `${category}-tab-nav`),
|
||||
favouriteTab: getDataSelector('region', 'favourites'),
|
||||
getModuleSelector: modname => `[role="menuitem"][data-modname="${modname}"]`,
|
||||
searchResults: getDataSelector('region', 'search-results-container'),
|
||||
@@ -65,10 +66,11 @@ export default {
|
||||
},
|
||||
addChooser: getDataSelector('action', 'add-chooser-option'),
|
||||
addSelectedChooserOption: getDataSelector('action', 'add-selected-chooser-option'),
|
||||
clearSearch: getDataSelector('action', 'clearsearch'),
|
||||
closeOption: getDataSelector('action', 'close-chooser-option-summary'),
|
||||
displayCategory: getDataSelector('action', 'chooser-display-category'),
|
||||
hide: getDataSelector('action', 'hide'),
|
||||
search: getDataSelector('action', 'search'),
|
||||
clearSearch: getDataSelector('action', 'clearsearch'),
|
||||
},
|
||||
elements: {
|
||||
section: '.section',
|
||||
|
||||
@@ -47,6 +47,7 @@ class content_item {
|
||||
* @param string $purpose the purpose type of this component.
|
||||
* @param bool $branded whether or not this item is branded.
|
||||
* @param bool $gradable whether or not this item is gradable.
|
||||
* @param string|null $otherpurpose the alternative purpose type of this component.
|
||||
*/
|
||||
public function __construct(
|
||||
/** @var int $id the id. */
|
||||
@@ -71,6 +72,8 @@ class content_item {
|
||||
private bool $branded = false,
|
||||
/** @var bool $gradable whether or not this component is gradable. */
|
||||
private bool $gradable = false,
|
||||
/** @var string|null $otherpurpose the alternative purpose type of this component. */
|
||||
private ?string $otherpurpose = null,
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -154,6 +157,15 @@ class content_item {
|
||||
return $this->purpose;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get alternative purpose for this item.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function get_other_purpose(): ?string {
|
||||
return $this->otherpurpose;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether this item is branded.
|
||||
*
|
||||
|
||||
@@ -71,6 +71,12 @@ class course_content_item_exporter extends exporter {
|
||||
'purpose' => ['type' => PARAM_TEXT, 'description' => 'The purpose of the component exposing the content item'],
|
||||
'branded' => ['type' => PARAM_BOOL, 'description' => ' Whether this content item is branded or not'],
|
||||
'gradable' => ['type' => PARAM_BOOL, 'description' => 'Whether this content item is gradable or not'],
|
||||
'otherpurpose' => [
|
||||
'type' => PARAM_TEXT,
|
||||
'null' => NULL_ALLOWED,
|
||||
'default' => null,
|
||||
'description' => 'The alternative purpose of the component exposing the content item',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -143,6 +149,7 @@ class course_content_item_exporter extends exporter {
|
||||
'purpose' => $this->contentitem->get_purpose(),
|
||||
'branded' => $this->contentitem->is_branded(),
|
||||
'gradable' => $this->contentitem->is_gradable(),
|
||||
'otherpurpose' => $this->contentitem->get_other_purpose(),
|
||||
];
|
||||
|
||||
return $properties;
|
||||
|
||||
@@ -147,6 +147,7 @@ class content_item_readonly_repository implements content_item_readonly_reposito
|
||||
$help = $this->get_core_module_help_string($mod->name);
|
||||
$archetype = plugin_supports('mod', $mod->name, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER);
|
||||
$purpose = plugin_supports('mod', $mod->name, FEATURE_MOD_PURPOSE, MOD_PURPOSE_OTHER);
|
||||
$otherpurpose = plugin_supports('mod', $mod->name, FEATURE_MOD_OTHERPURPOSE);
|
||||
$isbranded = component_callback('mod_' . $mod->name, 'is_branded', [], false);
|
||||
$gradable = plugin_supports('mod', $mod->name, FEATURE_GRADE_HAS_GRADE, false);
|
||||
|
||||
@@ -162,6 +163,7 @@ class content_item_readonly_repository implements content_item_readonly_reposito
|
||||
purpose: $purpose,
|
||||
branded: $isbranded,
|
||||
gradable: $gradable,
|
||||
otherpurpose: $otherpurpose,
|
||||
);
|
||||
|
||||
$modcontentitemreference = clone($contentitem);
|
||||
@@ -215,6 +217,7 @@ class content_item_readonly_repository implements content_item_readonly_reposito
|
||||
$help = $this->get_core_module_help_string($mod->name);
|
||||
$archetype = plugin_supports('mod', $mod->name, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER);
|
||||
$purpose = plugin_supports('mod', $mod->name, FEATURE_MOD_PURPOSE, MOD_PURPOSE_OTHER);
|
||||
$otherpurpose = plugin_supports('mod', $mod->name, FEATURE_MOD_OTHERPURPOSE);
|
||||
$isbranded = component_callback('mod_' . $mod->name, 'is_branded', [], false);
|
||||
$gradable = plugin_supports('mod', $mod->name, FEATURE_GRADE_HAS_GRADE, false);
|
||||
|
||||
@@ -238,6 +241,7 @@ class content_item_readonly_repository implements content_item_readonly_reposito
|
||||
purpose: $purpose,
|
||||
branded: $isbranded,
|
||||
gradable: $gradable,
|
||||
otherpurpose: $otherpurpose,
|
||||
);
|
||||
|
||||
$modcontentitemreference = clone($contentitem);
|
||||
|
||||
@@ -65,6 +65,25 @@
|
||||
<div
|
||||
class="activitychooser-option-details"
|
||||
>
|
||||
{{! Purposes panel. }}
|
||||
<div class="modchooser-detail">
|
||||
<p class="visually-hidden">
|
||||
{{#str}} supports, course{{/str}}
|
||||
</p>
|
||||
<ul class="list-unstyled modchoosernav nav nav-pills d-flex gap-2 flex-column">
|
||||
{{#purposes}}
|
||||
<li>
|
||||
<button
|
||||
class="nav-item nav-link border"
|
||||
data-action="chooser-display-category"
|
||||
data-category="{{purposename}}"
|
||||
>
|
||||
{{purposelabel}}
|
||||
</button>
|
||||
</li>
|
||||
{{/purposes}}
|
||||
</ul>
|
||||
</div>
|
||||
{{#details}}
|
||||
<div class="modchooser-detail">
|
||||
{{! Detail name and value. }}
|
||||
|
||||
@@ -44,29 +44,49 @@ Feature: Display and choose from the available activities in course
|
||||
|
||||
Scenario: The teacher can see the activity summary in the activity chooser
|
||||
Given I open the activity chooser
|
||||
When I click on "Information about the Assignment activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
Then I should see "Assignment" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "The assignment activity module enables a teacher to communicate tasks, collect work and provide grades and feedback."
|
||||
And I should see "Supports" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Assessment" in the "help" "core_course > Activity chooser screen"
|
||||
When I click on "Information about the Forum activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
Then I should see "Forum" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "The forum activity module enables participants to have asynchronous discussions"
|
||||
# Confirm more help link exists and it has a correct format.
|
||||
And "More help" "link" should exist
|
||||
And "Opens in new window" "link" should be visible
|
||||
# Validate information panel.
|
||||
And I should see "Collaboration" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Communication" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Gradable" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Yes" in the "help" "core_course > Activity chooser screen"
|
||||
And I click on "Back" "button" in the "Add an activity or resource" "dialogue"
|
||||
And I click on "Information about the Book activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
Then I should see "Book" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "The book module enables a teacher to create a multi-page resource in a book-like format"
|
||||
And I should see "Supports" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Resources" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Gradable" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "No" in the "help" "core_course > Activity chooser screen"
|
||||
# Confirm show summary also works for weekly format course
|
||||
# Validate everything again in weekly format course.
|
||||
And I am on "C2" course homepage with editing mode on
|
||||
And I click on "Add content" "button" in the "13 January - 19 January" "section"
|
||||
And I click on "Activity or resource" "button" in the "13 January - 19 January" "section"
|
||||
And I click on "Information about the Assignment activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
And I should see "Assignment" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "The assignment activity module enables a teacher to communicate tasks, collect work and provide grades and feedback."
|
||||
And I should see "Assessment" in the "help" "core_course > Activity chooser screen"
|
||||
And I click on "Information about the Forum activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
And I should see "Forum" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "The forum activity module enables participants to have asynchronous discussions"
|
||||
And "More help" "link" should exist
|
||||
And "Opens in new window" "link" should be visible
|
||||
And I should see "Collaboration" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Communication" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Gradable" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Yes" in the "help" "core_course > Activity chooser screen"
|
||||
|
||||
Scenario: The teacher use the activity chooser help panel to go to the specific purpose category
|
||||
Given I open the activity chooser
|
||||
When I click on "Information about the Forum activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
And I click on "Collaboration" "button" in the "help" "core_course > Activity chooser screen"
|
||||
Then I should see "Tools for collaborative learning" in the "Add an activity or resource" "dialogue"
|
||||
And "Assignment" "link" should not exist in the "collaboration" "core_course > Activity chooser tab"
|
||||
And "Database" "link" should exist in the "collaboration" "core_course > Activity chooser tab"
|
||||
And I click on "Information about the Forum activity" "button" in the "collaboration" "core_course > Activity chooser tab"
|
||||
And I click on "Communication" "button" in the "help" "core_course > Activity chooser screen"
|
||||
And I should see "Activities that facilitate real-time communication" in the "Add an activity or resource" "dialogue"
|
||||
And "Choice" "link" should exist in the "communication" "core_course > Activity chooser tab"
|
||||
|
||||
Scenario: The teacher can hide the activity summary in the activity chooser
|
||||
Given I open the activity chooser
|
||||
@@ -305,25 +325,3 @@ Feature: Display and choose from the available activities in course
|
||||
# Confirm escape key closes the modal
|
||||
And I press the escape key
|
||||
And "Add an activity or resource" "dialogue" should not be visible
|
||||
|
||||
Scenario: Teacher can access 'More help' from activity information in activity chooser
|
||||
Given I open the activity chooser
|
||||
When I click on "Information about the Assignment activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
# Confirm more help link exists
|
||||
Then "More help" "link" should exist
|
||||
# Confirm that corresponding help icon exist
|
||||
And ".fa-book" "css_element" should exist
|
||||
# Confirm that link opens in new window
|
||||
And "Opens in new window" "link" should be visible
|
||||
# Confirm the same behaviour for weekly format course
|
||||
And I am on "C2" course homepage with editing mode on
|
||||
And I click on "Add content" "button" in the "13 January - 19 January" "section"
|
||||
And I click on "Activity or resource" "button" in the "13 January - 19 January" "section"
|
||||
And I should see "All" in the "Add an activity or resource" "dialogue"
|
||||
And I click on "Information about the Assignment activity" "button" in the "Add an activity or resource" "dialogue"
|
||||
# Confirm more help link exists
|
||||
And "More help" "link" should exist
|
||||
# Confirm that corresponding help icon exist
|
||||
And ".fa-book" "css_element" should exist
|
||||
# Confirm that link opens in new window
|
||||
And "Opens in new window" "link" should be visible
|
||||
|
||||
@@ -51,6 +51,7 @@ final class content_item_test extends \advanced_testcase {
|
||||
purpose: MOD_PURPOSE_CONTENT,
|
||||
branded: true,
|
||||
gradable: true,
|
||||
otherpurpose: MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
);
|
||||
|
||||
$this->assertEquals(22, $contentitem->get_id());
|
||||
@@ -64,6 +65,39 @@ final class content_item_test extends \advanced_testcase {
|
||||
$this->assertEquals('content', $contentitem->get_purpose());
|
||||
$this->assertTrue($contentitem->is_branded());
|
||||
$this->assertTrue($contentitem->is_gradable());
|
||||
$this->assertEquals(MOD_PURPOSE_INTERACTIVECONTENT, $contentitem->get_other_purpose());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test class when only the mandatory fields are set.
|
||||
*/
|
||||
public function test_content_item_without_optional_params(): void {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$contentitem = new content_item(
|
||||
id: 22,
|
||||
name: 'Item name',
|
||||
title: new lang_string_title('modulename', 'mod_assign'),
|
||||
link: new \moodle_url('mod_edit.php'),
|
||||
icon: '<img src="test">',
|
||||
help: 'Description of the module',
|
||||
archetype: MOD_ARCHETYPE_RESOURCE,
|
||||
componentname: 'mod_page',
|
||||
purpose: MOD_PURPOSE_CONTENT,
|
||||
);
|
||||
|
||||
$this->assertEquals(22, $contentitem->get_id());
|
||||
$this->assertEquals('Item name', $contentitem->get_name());
|
||||
$this->assertEquals('Assignment', $contentitem->get_title()->get_value());
|
||||
$this->assertEquals(new \moodle_url('mod_edit.php'), $contentitem->get_link());
|
||||
$this->assertEquals('<img src="test">', $contentitem->get_icon());
|
||||
$this->assertEquals('Description of the module', $contentitem->get_help());
|
||||
$this->assertEquals(MOD_ARCHETYPE_RESOURCE, $contentitem->get_archetype());
|
||||
$this->assertEquals('mod_page', $contentitem->get_component_name());
|
||||
$this->assertEquals('content', $contentitem->get_purpose());
|
||||
$this->assertFalse($contentitem->is_branded());
|
||||
$this->assertFalse($contentitem->is_gradable());
|
||||
$this->assertNull($contentitem->get_other_purpose());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -86,16 +86,19 @@ final class exporters_content_item_test extends \advanced_testcase {
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
|
||||
$contentitem = new \core_course\local\entity\content_item(
|
||||
-1,
|
||||
'test_name',
|
||||
new \core_course\local\entity\string_title('test_title'),
|
||||
new \moodle_url(''),
|
||||
'',
|
||||
'* First point
|
||||
id: -1,
|
||||
name: 'test_name',
|
||||
title: new \core_course\local\entity\string_title('test_title'),
|
||||
link: new \moodle_url(''),
|
||||
icon: '',
|
||||
help: '* First point
|
||||
* Another point',
|
||||
MOD_ARCHETYPE_OTHER,
|
||||
'core_test',
|
||||
MOD_PURPOSE_CONTENT
|
||||
archetype: MOD_ARCHETYPE_OTHER,
|
||||
componentname: 'core_test',
|
||||
purpose: MOD_PURPOSE_CONTENT,
|
||||
branded: false,
|
||||
gradable: false,
|
||||
otherpurpose: MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
);
|
||||
|
||||
$ciexporter = new course_content_item_exporter($contentitem, ['context' => \context_course::instance($course->id)]);
|
||||
@@ -118,6 +121,10 @@ final class exporters_content_item_test extends \advanced_testcase {
|
||||
$this->assertEquals($exporteditem->archetype, $contentitem->get_archetype());
|
||||
$this->assertObjectHasProperty('componentname', $exporteditem);
|
||||
$this->assertEquals($exporteditem->componentname, $contentitem->get_component_name());
|
||||
$this->assertEquals($exporteditem->purpose, $contentitem->get_purpose());
|
||||
$this->assertEquals($exporteditem->branded, $contentitem->is_branded());
|
||||
$this->assertEquals($exporteditem->gradable, $contentitem->is_gradable());
|
||||
$this->assertEquals($exporteditem->otherpurpose, $contentitem->get_other_purpose());
|
||||
// Most important, is this a legacy item?
|
||||
$this->assertObjectHasProperty('legacyitem', $exporteditem);
|
||||
$this->assertTrue($exporteditem->legacyitem);
|
||||
|
||||
@@ -151,7 +151,7 @@ $string['searchresults'] = 'Search results: {$a}';
|
||||
$string['sectionlink'] = 'Permalink';
|
||||
$string['showstartedcoursestask'] = 'Show courses on start date';
|
||||
$string['submitsearch'] = 'Submit search';
|
||||
$string['supports'] = 'Supports';
|
||||
$string['supports'] = 'This activity supports';
|
||||
$string['studentsatriskincourse'] = 'Students at risk in {$a} course';
|
||||
$string['studentsatriskinfomessage'] = 'Hi {$a->userfirstname},
|
||||
<p>Students in the {$a->coursename} course have been identified as being at risk.</p>';
|
||||
|
||||
@@ -484,6 +484,8 @@ define('MOD_ARCHETYPE_SYSTEM', 3);
|
||||
|
||||
/** Type of module */
|
||||
define('FEATURE_MOD_PURPOSE', 'mod_purpose');
|
||||
/** Type of module alternative purpose */
|
||||
define('FEATURE_MOD_OTHERPURPOSE', 'mod_otherpurpose');
|
||||
/** Module purpose administration */
|
||||
define('MOD_PURPOSE_ADMINISTRATION', 'administration');
|
||||
/** Module purpose assessment */
|
||||
|
||||
@@ -5806,4 +5806,154 @@ EOT;
|
||||
$pluginlist = get_plugin_list_with_function('fake', 'test_callback');
|
||||
$this->assertArrayNotHasKey('fake_fullfeatured', $pluginlist);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that plugin_supports returns the correct purpose values for activity plugins.
|
||||
*
|
||||
* @dataProvider provider_plugin_supports_purpose
|
||||
* @param string $modname
|
||||
* @param string $purpose
|
||||
* @param string|null $otherpurpose
|
||||
* @return void
|
||||
*/
|
||||
public function test_plugin_supports_purpose(
|
||||
string $modname,
|
||||
string $purpose,
|
||||
?string $otherpurpose
|
||||
): void {
|
||||
$this->assertEquals(
|
||||
$purpose,
|
||||
plugin_supports('mod', $modname, FEATURE_MOD_PURPOSE),
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
$otherpurpose,
|
||||
plugin_supports('mod', $modname, FEATURE_MOD_OTHERPURPOSE),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for plugin_supports_purpose tests.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function provider_plugin_supports_purpose(): array {
|
||||
return [
|
||||
'assign' => [
|
||||
'modname' => 'assign',
|
||||
'purpose' => MOD_PURPOSE_ASSESSMENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'bigbluebuttonbn' => [
|
||||
'modname' => 'bigbluebuttonbn',
|
||||
'purpose' => MOD_PURPOSE_COMMUNICATION,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'book' => [
|
||||
'modname' => 'book',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'choice' => [
|
||||
'modname' => 'choice',
|
||||
'purpose' => MOD_PURPOSE_COMMUNICATION,
|
||||
'otherpurpose' => MOD_PURPOSE_COLLABORATION,
|
||||
],
|
||||
'data' => [
|
||||
'modname' => 'data',
|
||||
'purpose' => MOD_PURPOSE_COLLABORATION,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'feedback' => [
|
||||
'modname' => 'feedback',
|
||||
'purpose' => MOD_PURPOSE_COMMUNICATION,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'folder' => [
|
||||
'modname' => 'folder',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'forum' => [
|
||||
'modname' => 'forum',
|
||||
'purpose' => MOD_PURPOSE_COLLABORATION,
|
||||
'otherpurpose' => MOD_PURPOSE_COMMUNICATION,
|
||||
],
|
||||
'glossary' => [
|
||||
'modname' => 'glossary',
|
||||
'purpose' => MOD_PURPOSE_COLLABORATION,
|
||||
'otherpurpose' => MOD_PURPOSE_CONTENT,
|
||||
],
|
||||
'h5pactivity' => [
|
||||
'modname' => 'h5pactivity',
|
||||
'purpose' => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
'otherpurpose' => MOD_PURPOSE_ASSESSMENT,
|
||||
],
|
||||
'imscp' => [
|
||||
'modname' => 'imscp',
|
||||
'purpose' => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
'otherpurpose' => MOD_PURPOSE_CONTENT,
|
||||
],
|
||||
'label' => [
|
||||
'modname' => 'label',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'lesson' => [
|
||||
'modname' => 'lesson',
|
||||
'purpose' => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
'otherpurpose' => MOD_PURPOSE_ASSESSMENT,
|
||||
],
|
||||
'lti' => [
|
||||
'modname' => 'lti',
|
||||
'purpose' => MOD_PURPOSE_OTHER,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'page' => [
|
||||
'modname' => 'page',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'qbank' => [
|
||||
'modname' => 'qbank',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'quiz' => [
|
||||
'modname' => 'quiz',
|
||||
'purpose' => MOD_PURPOSE_ASSESSMENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'resource' => [
|
||||
'modname' => 'resource',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'scorm' => [
|
||||
'modname' => 'scorm',
|
||||
'purpose' => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
'otherpurpose' => MOD_PURPOSE_CONTENT,
|
||||
],
|
||||
'subsection' => [
|
||||
'modname' => 'subsection',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'url' => [
|
||||
'modname' => 'url',
|
||||
'purpose' => MOD_PURPOSE_CONTENT,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'wiki' => [
|
||||
'modname' => 'wiki',
|
||||
'purpose' => MOD_PURPOSE_COLLABORATION,
|
||||
'otherpurpose' => null,
|
||||
],
|
||||
'workshop' => [
|
||||
'modname' => 'workshop',
|
||||
'purpose' => MOD_PURPOSE_ASSESSMENT,
|
||||
'otherpurpose' => MOD_PURPOSE_COLLABORATION,
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
+17
-33
@@ -369,39 +369,23 @@ function assign_update_events($assign, $override = null) {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function assign_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS:
|
||||
return true;
|
||||
case FEATURE_GROUPINGS:
|
||||
return true;
|
||||
case FEATURE_MOD_INTRO:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES:
|
||||
return true;
|
||||
case FEATURE_GRADE_HAS_GRADE:
|
||||
return true;
|
||||
case FEATURE_GRADE_HAS_PENALTY:
|
||||
return true;
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
return true;
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
return true;
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
return true;
|
||||
case FEATURE_ADVANCED_GRADING:
|
||||
return true;
|
||||
case FEATURE_PLAGIARISM:
|
||||
return true;
|
||||
case FEATURE_COMMENT:
|
||||
return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_ASSESSMENT;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_HAS_PENALTY => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_ADVANCED_GRADING => true,
|
||||
FEATURE_PLAGIARISM => true,
|
||||
FEATURE_COMMENT => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_ASSESSMENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -61,10 +61,7 @@ global $CFG;
|
||||
* @uses FEATURE_SHOW_DESCRIPTION
|
||||
*/
|
||||
function bigbluebuttonbn_supports($feature) {
|
||||
if (!$feature) {
|
||||
return null;
|
||||
}
|
||||
$features = [
|
||||
return match ($feature) {
|
||||
FEATURE_IDNUMBER => true,
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
@@ -76,11 +73,8 @@ function bigbluebuttonbn_supports($feature) {
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COMMUNICATION,
|
||||
];
|
||||
if (isset($features[(string) $feature])) {
|
||||
return $features[$feature];
|
||||
}
|
||||
return null;
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-14
@@ -273,20 +273,19 @@ function book_get_post_actions() {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function book_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+14
-25
@@ -828,31 +828,20 @@ function choice_get_response_data($choice, $cm, $groupmode, $onlyactive, ?int $g
|
||||
* @return null|true|string True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function choice_supports($feature) {
|
||||
switch ($feature) {
|
||||
case FEATURE_GROUPS:
|
||||
return true;
|
||||
case FEATURE_GROUPINGS:
|
||||
return true;
|
||||
case FEATURE_MOD_INTRO:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES:
|
||||
return true;
|
||||
case FEATURE_GRADE_HAS_GRADE:
|
||||
return false;
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
return false;
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
return true;
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_COMMUNICATION;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COMMUNICATION,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_COLLABORATION,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+15
-16
@@ -2600,22 +2600,21 @@ function data_get_extra_capabilities() {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function data_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS: return true;
|
||||
case FEATURE_GROUPINGS: return true;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return true;
|
||||
case FEATURE_GRADE_OUTCOMES: return true;
|
||||
case FEATURE_RATE: return true;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_COMMENT: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_COLLABORATION;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_RATE => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_COMMENT => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COLLABORATION,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
+13
-14
@@ -57,20 +57,19 @@ require_once(__DIR__ . '/deprecatedlib.php');
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function feedback_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS: return true;
|
||||
case FEATURE_GROUPINGS: return true;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_COMMUNICATION;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COMMUNICATION,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-14
@@ -38,20 +38,19 @@ define('FOLDER_DISPLAY_INLINE', 1);
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function folder_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+18
-19
@@ -358,25 +358,24 @@ function forum_delete_instance($id) {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function forum_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS: return true;
|
||||
case FEATURE_GROUPINGS: return true;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return true;
|
||||
case FEATURE_GRADE_OUTCOMES: return true;
|
||||
case FEATURE_RATE: return true;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_PLAGIARISM: return true;
|
||||
case FEATURE_ADVANCED_GRADING: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_COLLABORATION;
|
||||
case FEATURE_CAN_UNINSTALL:
|
||||
return false;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_RATE => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_PLAGIARISM => true,
|
||||
FEATURE_ADVANCED_GRADING => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COLLABORATION,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_COMMUNICATION,
|
||||
FEATURE_CAN_UNINSTALL => false,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+16
-16
@@ -3120,22 +3120,22 @@ function glossary_get_extra_capabilities() {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function glossary_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return true;
|
||||
case FEATURE_GRADE_OUTCOMES: return true;
|
||||
case FEATURE_RATE: return true;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_COMMENT: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_COLLABORATION;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_RATE => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_COMMENT => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COLLABORATION,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
function glossary_extend_navigation($navigation, $course, $module, $cm) {
|
||||
|
||||
@@ -45,30 +45,20 @@ use mod_h5pactivity\xapi\handler;
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function h5pactivity_supports(string $feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS:
|
||||
return true;
|
||||
case FEATURE_GROUPINGS:
|
||||
return true;
|
||||
case FEATURE_MOD_INTRO:
|
||||
return true;
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
return true;
|
||||
case FEATURE_MODEDIT_DEFAULT_COMPLETION:
|
||||
return true;
|
||||
case FEATURE_GRADE_HAS_GRADE:
|
||||
return true;
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
return true;
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_INTERACTIVECONTENT;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_MODEDIT_DEFAULT_COMPLETION => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_ASSESSMENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+14
-15
@@ -32,21 +32,20 @@ require_once(__DIR__ . '/deprecatedlib.php');
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function imscp_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_INTERACTIVECONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+14
-15
@@ -195,21 +195,20 @@ function label_reset_userdata($data) {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function label_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_IDNUMBER: return true;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return false;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_NO_VIEW_LINK: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_IDNUMBER => true,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => false,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_NO_VIEW_LINK => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+14
-24
@@ -987,30 +987,20 @@ function lesson_reset_userdata($data) {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function lesson_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS:
|
||||
return true;
|
||||
case FEATURE_GROUPINGS:
|
||||
return true;
|
||||
case FEATURE_MOD_INTRO:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
return true;
|
||||
case FEATURE_GRADE_HAS_GRADE:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES:
|
||||
return true;
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
return true;
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
return true;
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_INTERACTIVECONTENT;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_ASSESSMENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+12
-17
@@ -56,23 +56,18 @@ require_once(__DIR__ . '/deprecatedlib.php');
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function lti_supports($feature) {
|
||||
switch ($feature) {
|
||||
case FEATURE_GROUPS:
|
||||
case FEATURE_GROUPINGS:
|
||||
return false;
|
||||
case FEATURE_MOD_INTRO:
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
case FEATURE_GRADE_HAS_GRADE:
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_OTHER;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_OTHER,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-14
@@ -31,20 +31,19 @@ use core\url;
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function page_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+17
-21
@@ -30,27 +30,23 @@
|
||||
* @return bool|string|null True if module supports feature, false if not, null if it doesn't know or string for the module purpose.
|
||||
*/
|
||||
function qbank_supports(string $feature) {
|
||||
switch ($feature) {
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
case FEATURE_PUBLISHES_QUESTIONS:
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
case FEATURE_USES_QUESTIONS:
|
||||
return true;
|
||||
case FEATURE_CAN_DISPLAY:
|
||||
case FEATURE_CAN_UNINSTALL:
|
||||
case FEATURE_COMMENT:
|
||||
case FEATURE_COMPLETION:
|
||||
case FEATURE_COMPLETION_HAS_RULES:
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
case FEATURE_CONTROLS_GRADE_VISIBILITY:
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
case FEATURE_MODEDIT_DEFAULT_COMPLETION:
|
||||
return false;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_CONTENT;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_PUBLISHES_QUESTIONS => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_USES_QUESTIONS => true,
|
||||
FEATURE_CAN_DISPLAY => false,
|
||||
FEATURE_CAN_UNINSTALL => false,
|
||||
FEATURE_COMMENT => false,
|
||||
FEATURE_COMPLETION => false,
|
||||
FEATURE_COMPLETION_HAS_RULES => false,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => false,
|
||||
FEATURE_CONTROLS_GRADE_VISIBILITY => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_MODEDIT_DEFAULT_COMPLETION => false,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+16
-17
@@ -1623,23 +1623,22 @@ function quiz_attempt_summary_link_to_reports($quiz, $cm, $context, $returnzero
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function quiz_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS: return true;
|
||||
case FEATURE_GROUPINGS: return true;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return true;
|
||||
case FEATURE_GRADE_OUTCOMES: return true;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_CONTROLS_GRADE_VISIBILITY: return true;
|
||||
case FEATURE_USES_QUESTIONS: return true;
|
||||
case FEATURE_PLAGIARISM: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_CONTROLS_GRADE_VISIBILITY => true,
|
||||
FEATURE_USES_QUESTIONS => true,
|
||||
FEATURE_PLAGIARISM => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_ASSESSMENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-14
@@ -31,20 +31,19 @@ use core\url;
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function resource_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+14
-15
@@ -1031,21 +1031,20 @@ function scorm_pluginfile($course, $cm, $context, $filearea, $args, $forcedownlo
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function scorm_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GROUPS: return true;
|
||||
case FEATURE_GROUPINGS: return true;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_COMPLETION_HAS_RULES: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return true;
|
||||
case FEATURE_GRADE_OUTCOMES: return true;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_INTERACTIVECONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_COMPLETION_HAS_RULES => true,
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GRADE_OUTCOMES => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_INTERACTIVECONTENT,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-14
@@ -31,20 +31,19 @@ defined('MOODLE_INTERNAL') || die;
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function url_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
||||
case FEATURE_GROUPS: return false;
|
||||
case FEATURE_GROUPINGS: return false;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
||||
case FEATURE_GRADE_HAS_GRADE: return false;
|
||||
case FEATURE_GRADE_OUTCOMES: return false;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
||||
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_MOD_ARCHETYPE => MOD_ARCHETYPE_RESOURCE,
|
||||
FEATURE_GROUPS => false,
|
||||
FEATURE_GROUPINGS => false,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_CONTENT,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+14
-27
@@ -277,33 +277,20 @@ function wiki_reset_course_form_definition(&$mform) {
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function wiki_supports($feature) {
|
||||
switch ($feature) {
|
||||
case FEATURE_GROUPS:
|
||||
return true;
|
||||
case FEATURE_GROUPINGS:
|
||||
return true;
|
||||
case FEATURE_MOD_INTRO:
|
||||
return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
return true;
|
||||
case FEATURE_GRADE_HAS_GRADE:
|
||||
return false;
|
||||
case FEATURE_GRADE_OUTCOMES:
|
||||
return false;
|
||||
case FEATURE_RATE:
|
||||
return false;
|
||||
case FEATURE_BACKUP_MOODLE2:
|
||||
return true;
|
||||
case FEATURE_SHOW_DESCRIPTION:
|
||||
return true;
|
||||
case FEATURE_COMMENT:
|
||||
return true;
|
||||
case FEATURE_MOD_PURPOSE:
|
||||
return MOD_PURPOSE_COLLABORATION;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_GRADE_HAS_GRADE => false,
|
||||
FEATURE_GRADE_OUTCOMES => false,
|
||||
FEATURE_RATE => false,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_COMMENT => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_COLLABORATION,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-13
@@ -50,19 +50,19 @@ define('WORKSHOP_SUBMISSION_TYPE_REQUIRED', 2);
|
||||
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
||||
*/
|
||||
function workshop_supports($feature) {
|
||||
switch($feature) {
|
||||
case FEATURE_GRADE_HAS_GRADE: return true;
|
||||
case FEATURE_GROUPS: return true;
|
||||
case FEATURE_GROUPINGS: return true;
|
||||
case FEATURE_MOD_INTRO: return true;
|
||||
case FEATURE_BACKUP_MOODLE2: return true;
|
||||
case FEATURE_COMPLETION_TRACKS_VIEWS:
|
||||
return true;
|
||||
case FEATURE_SHOW_DESCRIPTION: return true;
|
||||
case FEATURE_PLAGIARISM: return true;
|
||||
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;
|
||||
default: return null;
|
||||
}
|
||||
return match ($feature) {
|
||||
FEATURE_GRADE_HAS_GRADE => true,
|
||||
FEATURE_GROUPS => true,
|
||||
FEATURE_GROUPINGS => true,
|
||||
FEATURE_MOD_INTRO => true,
|
||||
FEATURE_BACKUP_MOODLE2 => true,
|
||||
FEATURE_COMPLETION_TRACKS_VIEWS => true,
|
||||
FEATURE_SHOW_DESCRIPTION => true,
|
||||
FEATURE_PLAGIARISM => true,
|
||||
FEATURE_MOD_PURPOSE => MOD_PURPOSE_ASSESSMENT,
|
||||
FEATURE_MOD_OTHERPURPOSE => MOD_PURPOSE_COLLABORATION,
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user