Merge pull request #2790 from dpalou/MOBILE-3757-2
MOBILE-3757 course: Always display manual completion for some URLsmain
commit
970b5220ee
|
@ -74,7 +74,7 @@ export class AddonModLabelModuleHandlerService implements CoreCourseModuleHandle
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
manualCompletionAlwaysShown(): boolean {
|
async manualCompletionAlwaysShown(): Promise<boolean> {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,39 +85,11 @@ export class AddonModUrlModuleHandlerService implements CoreCourseModuleHandler
|
||||||
title: module.name,
|
title: module.name,
|
||||||
class: 'addon-mod_url-handler',
|
class: 'addon-mod_url-handler',
|
||||||
showDownloadButton: false,
|
showDownloadButton: false,
|
||||||
async action(event: Event, module: CoreCourseModule, courseId: number, options?: CoreNavigationOptions): Promise<void> {
|
action: async (event: Event, module: CoreCourseModule, courseId: number, options?: CoreNavigationOptions) => {
|
||||||
const modal = await CoreDomUtils.showModalLoading();
|
const modal = await CoreDomUtils.showModalLoading();
|
||||||
|
|
||||||
// First of all, make sure module contents are loaded.
|
|
||||||
try {
|
try {
|
||||||
await CoreCourse.loadModuleContents(
|
const shouldOpen = this.shouldOpenLink(module, courseId);
|
||||||
module,
|
|
||||||
courseId,
|
|
||||||
undefined,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
this.modName,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Check if the URL can be handled by the app. If so, always open it directly.
|
|
||||||
const canHandle =
|
|
||||||
await CoreContentLinksHelper.canHandleLink(module.contents[0].fileurl, courseId, undefined, true);
|
|
||||||
|
|
||||||
let shouldOpen = false;
|
|
||||||
if (canHandle) {
|
|
||||||
// URL handled by the app, open it directly.
|
|
||||||
shouldOpen = true;
|
|
||||||
} else if (AddonModUrl.isGetUrlWSAvailable()) {
|
|
||||||
// Not handled by the app, check the display type.
|
|
||||||
const url = await CoreUtils.ignoreErrors(AddonModUrl.getUrl(courseId, module.id));
|
|
||||||
const displayType = AddonModUrl.getFinalDisplayType(url);
|
|
||||||
|
|
||||||
shouldOpen = displayType == CoreConstants.RESOURCELIB_DISPLAY_OPEN ||
|
|
||||||
displayType == CoreConstants.RESOURCELIB_DISPLAY_POPUP;
|
|
||||||
} else {
|
|
||||||
shouldOpen = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldOpen) {
|
if (shouldOpen) {
|
||||||
openUrl(module, courseId);
|
openUrl(module, courseId);
|
||||||
|
@ -185,5 +157,45 @@ export class AddonModUrlModuleHandlerService implements CoreCourseModuleHandler
|
||||||
return AddonModUrlIndexComponent;
|
return AddonModUrlIndexComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the link should be opened directly.
|
||||||
|
*
|
||||||
|
* @param module Module.
|
||||||
|
* @param courseId Course ID.
|
||||||
|
* @return Promise resolved with boolean.
|
||||||
|
*/
|
||||||
|
protected async shouldOpenLink(module: CoreCourseModule, courseId: number): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
// First of all, make sure module contents are loaded.
|
||||||
|
await CoreCourse.loadModuleContents(module, courseId, undefined, false, false, undefined, this.modName);
|
||||||
|
|
||||||
|
// Check if the URL can be handled by the app. If so, always open it directly.
|
||||||
|
const canHandle = await CoreContentLinksHelper.canHandleLink(module.contents[0].fileurl, courseId, undefined, true);
|
||||||
|
|
||||||
|
if (canHandle) {
|
||||||
|
// URL handled by the app, open it directly.
|
||||||
|
return true;
|
||||||
|
} else if (AddonModUrl.isGetUrlWSAvailable()) {
|
||||||
|
// Not handled by the app, check the display type.
|
||||||
|
const url = await CoreUtils.ignoreErrors(AddonModUrl.getUrl(courseId, module.id));
|
||||||
|
const displayType = AddonModUrl.getFinalDisplayType(url);
|
||||||
|
|
||||||
|
return displayType == CoreConstants.RESOURCELIB_DISPLAY_OPEN ||
|
||||||
|
displayType == CoreConstants.RESOURCELIB_DISPLAY_POPUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
manualCompletionAlwaysShown(module: CoreCourseModule): Promise<boolean> {
|
||||||
|
return this.shouldOpenLink(module, module.course!);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
export const AddonModUrlModuleHandler = makeSingleton(AddonModUrlModuleHandlerService);
|
export const AddonModUrlModuleHandler = makeSingleton(AddonModUrlModuleHandlerService);
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
:host {
|
|
||||||
ion-button {
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,7 +25,6 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'core-course-module-manual-completion',
|
selector: 'core-course-module-manual-completion',
|
||||||
templateUrl: 'core-course-module-manual-completion.html',
|
templateUrl: 'core-course-module-manual-completion.html',
|
||||||
styleUrls: ['module-manual-completion.scss'],
|
|
||||||
})
|
})
|
||||||
export class CoreCourseModuleManualCompletionComponent implements OnInit, OnChanges, OnDestroy {
|
export class CoreCourseModuleManualCompletionComponent implements OnInit, OnChanges, OnDestroy {
|
||||||
|
|
||||||
|
|
|
@ -89,8 +89,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
this.courseId = this.courseId || this.module.course;
|
this.courseId = this.courseId || this.module.course;
|
||||||
this.modNameTranslated = CoreCourse.translateModuleName(this.module.modname) || '';
|
this.modNameTranslated = CoreCourse.translateModuleName(this.module.modname) || '';
|
||||||
this.showLegacyCompletion = !CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('3.11');
|
this.showLegacyCompletion = !CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('3.11');
|
||||||
this.showManualCompletion =
|
this.checkShowManualCompletion();
|
||||||
this.showCompletionConditions || CoreCourseModuleDelegate.manualCompletionAlwaysShown(this.module);
|
|
||||||
|
|
||||||
if (!this.module.handlerData) {
|
if (!this.module.handlerData) {
|
||||||
return;
|
return;
|
||||||
|
@ -128,6 +127,14 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether manual completion should be shown.
|
||||||
|
*/
|
||||||
|
protected async checkShowManualCompletion(): Promise<void> {
|
||||||
|
this.showManualCompletion = this.showCompletionConditions ||
|
||||||
|
await CoreCourseModuleDelegate.manualCompletionAlwaysShown(this.module);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called when the module is clicked.
|
* Function called when the module is clicked.
|
||||||
*
|
*
|
||||||
|
|
|
@ -98,9 +98,9 @@ export interface CoreCourseModuleHandler extends CoreDelegateHandler {
|
||||||
* Returns false by default.
|
* Returns false by default.
|
||||||
*
|
*
|
||||||
* @param module Module.
|
* @param module Module.
|
||||||
* @return Whether the manual completion should always be displayed.
|
* @return Promise resolved with boolean: whether the manual completion should always be displayed.
|
||||||
*/
|
*/
|
||||||
manualCompletionAlwaysShown?(module: CoreCourseModule): boolean;
|
manualCompletionAlwaysShown?(module: CoreCourseModule): Promise<boolean>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -380,10 +380,12 @@ export class CoreCourseModuleDelegateService extends CoreDelegate<CoreCourseModu
|
||||||
* Returns false by default.
|
* Returns false by default.
|
||||||
*
|
*
|
||||||
* @param module Module.
|
* @param module Module.
|
||||||
* @return Whether the manual completion should always be displayed.
|
* @return Promise resolved with boolean: whether the manual completion should always be displayed.
|
||||||
*/
|
*/
|
||||||
manualCompletionAlwaysShown(module: CoreCourseModule): boolean {
|
async manualCompletionAlwaysShown(module: CoreCourseModule): Promise<boolean> {
|
||||||
return !!this.executeFunctionOnEnabled<boolean>(module.modname, 'manualCompletionAlwaysShown', [module]);
|
const result = await this.executeFunctionOnEnabled<boolean>(module.modname, 'manualCompletionAlwaysShown', [module]);
|
||||||
|
|
||||||
|
return !!result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,7 +192,7 @@ export class CoreSitePluginsModuleHandler extends CoreSitePluginsBaseHandler imp
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
manualCompletionAlwaysShown(module: CoreCourseModule): boolean {
|
async manualCompletionAlwaysShown(module: CoreCourseModule): Promise<boolean> {
|
||||||
if (this.handlerSchema.manualcompletionalwaysshown !== undefined) {
|
if (this.handlerSchema.manualcompletionalwaysshown !== undefined) {
|
||||||
return this.handlerSchema.manualcompletionalwaysshown;
|
return this.handlerSchema.manualcompletionalwaysshown;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue