MOBILE-2907 resource: Use customdata and afterlink if possible
This commit is contained in:
		
							parent
							
								
									6e69bebc02
								
							
						
					
					
						commit
						407a33b5cd
					
				@ -113,12 +113,17 @@ export class AddonModResourceHelperProvider {
 | 
			
		||||
     * @return {boolean}         Whether the resource should be displayed embeded.
 | 
			
		||||
     */
 | 
			
		||||
    isDisplayedEmbedded(module: any, display: number): boolean {
 | 
			
		||||
        if (!module.contents.length || !this.fileProvider.isAvailable() ||
 | 
			
		||||
        if ((!module.contents.length && !module.contentsinfo) || !this.fileProvider.isAvailable() ||
 | 
			
		||||
                (!this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7') && this.isNextcloudFile(module))) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const ext = this.mimetypeUtils.getFileExtension(module.contents[0].filename);
 | 
			
		||||
        let ext;
 | 
			
		||||
 | 
			
		||||
        if (module.contentsinfo) {
 | 
			
		||||
            ext = this.mimetypeUtils.getExtension(module.contentsinfo.mimetypes[0]);
 | 
			
		||||
        } else {
 | 
			
		||||
            ext = this.mimetypeUtils.getFileExtension(module.contents[0].filename);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return (display == this.DISPLAY_EMBED || display == this.DISPLAY_AUTO) && this.mimetypeUtils.canBeEmbedded(ext);
 | 
			
		||||
    }
 | 
			
		||||
@ -130,12 +135,18 @@ export class AddonModResourceHelperProvider {
 | 
			
		||||
     * @return {boolean}   Whether the resource should be displayed in an iframe.
 | 
			
		||||
     */
 | 
			
		||||
    isDisplayedInIframe(module: any): boolean {
 | 
			
		||||
        if (!module.contents.length || !this.fileProvider.isAvailable()) {
 | 
			
		||||
        if ((!module.contents.length && !module.contentsinfo) || !this.fileProvider.isAvailable()) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const ext = this.mimetypeUtils.getFileExtension(module.contents[0].filename),
 | 
			
		||||
        let mimetype;
 | 
			
		||||
 | 
			
		||||
        if (module.contentsinfo) {
 | 
			
		||||
            mimetype = module.contentsinfo.mimetypes[0];
 | 
			
		||||
        } else {
 | 
			
		||||
            const ext = this.mimetypeUtils.getFileExtension(module.contents[0].filename);
 | 
			
		||||
            mimetype = this.mimetypeUtils.getMimeType(ext);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return mimetype == 'text/html';
 | 
			
		||||
    }
 | 
			
		||||
@ -147,6 +158,10 @@ export class AddonModResourceHelperProvider {
 | 
			
		||||
     * @return {boolean} Whether it's a Nextcloud file.
 | 
			
		||||
     */
 | 
			
		||||
    isNextcloudFile(module: any): boolean {
 | 
			
		||||
        if (module.contentsinfo) {
 | 
			
		||||
            return module.contentsinfo.repositorytype == 'nextcloud';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return module.contents && module.contents[0] && module.contents[0].repositorytype == 'nextcloud';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -121,8 +121,16 @@ export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
 | 
			
		||||
     * @return {Promise<boolean>} Resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    protected hideOpenButton(module: any, courseId: number): Promise<boolean> {
 | 
			
		||||
        return this.courseProvider.loadModuleContents(module, courseId, undefined, false, false, undefined, this.modName)
 | 
			
		||||
                .then(() => {
 | 
			
		||||
        let promise;
 | 
			
		||||
 | 
			
		||||
        if (module.contentsinfo) {
 | 
			
		||||
            // No need to load contents.
 | 
			
		||||
            promise = Promise.resolve();
 | 
			
		||||
        } else {
 | 
			
		||||
            promise = this.courseProvider.loadModuleContents(module, courseId, undefined, false, false, undefined, this.modName);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return promise.then(() => {
 | 
			
		||||
            return this.prefetchDelegate.getModuleStatus(module, courseId).then((status) => {
 | 
			
		||||
                return status !== CoreConstants.DOWNLOADED || this.resourceHelper.isDisplayedInIframe(module);
 | 
			
		||||
            });
 | 
			
		||||
@ -141,7 +149,7 @@ export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
 | 
			
		||||
        let infoFiles = [],
 | 
			
		||||
            options: any = {};
 | 
			
		||||
 | 
			
		||||
        // Check if the button needs to be shown or not. This also loads the module contents.
 | 
			
		||||
        // Check if the button needs to be shown or not.
 | 
			
		||||
        promises.push(this.hideOpenButton(module, courseId).then((hideOpenButton) => {
 | 
			
		||||
            handlerData.buttons[0].hidden = hideOpenButton;
 | 
			
		||||
        }));
 | 
			
		||||
@ -164,7 +172,13 @@ export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
 | 
			
		||||
                },
 | 
			
		||||
                extra = [];
 | 
			
		||||
 | 
			
		||||
            if (files && files.length) {
 | 
			
		||||
            if (module.contentsinfo) {
 | 
			
		||||
                // No need to use the list of files.
 | 
			
		||||
                const mimetype = module.contentsinfo.mimetypes[0];
 | 
			
		||||
                resourceData.icon = this.mimetypeUtils.getMimetypeIcon(mimetype);
 | 
			
		||||
                resourceData.extra = this.textUtils.cleanTags(module.afterlink);
 | 
			
		||||
 | 
			
		||||
            } else if (files && files.length) {
 | 
			
		||||
                const file = files[0];
 | 
			
		||||
 | 
			
		||||
                resourceData.icon = this.mimetypeUtils.getFileIcon(file.filename);
 | 
			
		||||
@ -178,11 +192,12 @@ export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
 | 
			
		||||
                            return result + file.filesize;
 | 
			
		||||
                        }, 0);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    extra.push(this.textUtils.bytesToSize(size, 1));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (options.showtype) {
 | 
			
		||||
                    // We should take it from options.filedetails.size if avalaible ∫but it's already translated.
 | 
			
		||||
                    // We should take it from options.filedetails.size if avalaible but it's already translated.
 | 
			
		||||
                    extra.push(this.mimetypeUtils.getMimetypeDescription(file));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -203,12 +218,15 @@ export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
 | 
			
		||||
                            {$a: this.timeUtils.userDate(file.timecreated * 1000, 'core.strftimedatetimeshort') }));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (resourceData.icon == '') {
 | 
			
		||||
                if (resourceData.icon == '') {
 | 
			
		||||
                    resourceData.icon = this.courseProvider.getModuleIconSrc(this.modName, module.modicon);
 | 
			
		||||
                }
 | 
			
		||||
                resourceData.extra += extra.join(' ');
 | 
			
		||||
            } else {
 | 
			
		||||
                // No files, just set the icon.
 | 
			
		||||
                resourceData.icon = this.courseProvider.getModuleIconSrc(this.modName, module.modicon);
 | 
			
		||||
            }
 | 
			
		||||
            resourceData.extra += extra.join(' ');
 | 
			
		||||
 | 
			
		||||
            return resourceData;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@ -51,11 +51,18 @@ export class AddonModResourcePrefetchHandler extends CoreCourseResourcePrefetchH
 | 
			
		||||
     * @return {string} Status to display.
 | 
			
		||||
     */
 | 
			
		||||
    determineStatus(module: any, status: string, canCheck: boolean): string {
 | 
			
		||||
        if (status == CoreConstants.DOWNLOADED && module && module.contents) {
 | 
			
		||||
            // If the first file is an external file, always display the module as outdated.
 | 
			
		||||
            const mainFile = module.contents[0];
 | 
			
		||||
            if (mainFile && mainFile.isexternalfile) {
 | 
			
		||||
                return CoreConstants.OUTDATED;
 | 
			
		||||
        if (status == CoreConstants.DOWNLOADED && module) {
 | 
			
		||||
            // If the main file is an external file, always display the module as outdated.
 | 
			
		||||
            if (module.contentsinfo) {
 | 
			
		||||
                if (module.contentsinfo.repositorytype) {
 | 
			
		||||
                    // It's an external file.
 | 
			
		||||
                    return CoreConstants.OUTDATED;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (module.contents) {
 | 
			
		||||
                const mainFile = module.contents[0];
 | 
			
		||||
                if (mainFile && mainFile.isexternalfile) {
 | 
			
		||||
                    return CoreConstants.OUTDATED;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -138,6 +138,37 @@ export class CoreMimetypeUtilsProvider {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the URL of the icon of an extension.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} extension Extension.
 | 
			
		||||
     * @return {string} Icon URL.
 | 
			
		||||
     */
 | 
			
		||||
    getExtensionIcon(extension: string): string {
 | 
			
		||||
        const icon = this.getExtensionIconName(extension) || 'unknown';
 | 
			
		||||
 | 
			
		||||
        return this.getFileIconForType(icon);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the name of the icon of an extension.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} extension Extension.
 | 
			
		||||
     * @return {string} Icon. Undefined if not found.
 | 
			
		||||
     */
 | 
			
		||||
    getExtensionIconName(extension: string): string {
 | 
			
		||||
        if (this.extToMime[extension]) {
 | 
			
		||||
            if (this.extToMime[extension].icon) {
 | 
			
		||||
                return this.extToMime[extension].icon;
 | 
			
		||||
            } else {
 | 
			
		||||
                const type = this.extToMime[extension].type.split('/')[0];
 | 
			
		||||
                if (type == 'video' || type == 'text' || type == 'image' || type == 'document' || type == 'audio') {
 | 
			
		||||
                    return type;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the "type" (string) of an extension, something like "image", "video" or "audio".
 | 
			
		||||
     *
 | 
			
		||||
@ -172,19 +203,8 @@ export class CoreMimetypeUtilsProvider {
 | 
			
		||||
     * @return {string} The path to a file icon.
 | 
			
		||||
     */
 | 
			
		||||
    getFileIcon(filename: string): string {
 | 
			
		||||
        const ext = this.getFileExtension(filename);
 | 
			
		||||
        let icon = 'unknown';
 | 
			
		||||
 | 
			
		||||
        if (ext && this.extToMime[ext]) {
 | 
			
		||||
            if (this.extToMime[ext].icon) {
 | 
			
		||||
                icon = this.extToMime[ext].icon;
 | 
			
		||||
            } else {
 | 
			
		||||
                const type = this.extToMime[ext].type.split('/')[0];
 | 
			
		||||
                if (type == 'video' || type == 'text' || type == 'image' || type == 'document' || type == 'audio') {
 | 
			
		||||
                    icon = type;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        const ext = this.getFileExtension(filename),
 | 
			
		||||
            icon = this.getExtensionIconName(ext) || 'unknown';
 | 
			
		||||
 | 
			
		||||
        return this.getFileIconForType(icon);
 | 
			
		||||
    }
 | 
			
		||||
@ -407,6 +427,30 @@ export class CoreMimetypeUtilsProvider {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the icon of a mimetype.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} mimetype Mimetype.
 | 
			
		||||
     * @return {string} Type of the mimetype.
 | 
			
		||||
     */
 | 
			
		||||
    getMimetypeIcon(mimetype: string): string {
 | 
			
		||||
        mimetype = mimetype.split(';')[0]; // Remove codecs from the mimetype if any.
 | 
			
		||||
 | 
			
		||||
        const extensions = this.mimeToExt[mimetype] || [];
 | 
			
		||||
        let icon = 'unknown';
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < extensions.length; i++) {
 | 
			
		||||
            const iconName = this.getExtensionIconName(extensions[i]);
 | 
			
		||||
 | 
			
		||||
            if (iconName) {
 | 
			
		||||
                icon = iconName;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.getFileIconForType(icon);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a group name, return the translated name.
 | 
			
		||||
     *
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user