forked from EVOgeek/Vmeda.Online
		
	MOBILE-3931 module: Adapt module site plugins code
This commit is contained in:
		
							parent
							
								
									16cee9df14
								
							
						
					
					
						commit
						6c782e3b3e
					
				| @ -58,7 +58,6 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy, | ||||
|     hasOffline = false; // Resources don't have any data to sync.
 | ||||
| 
 | ||||
|     description?: string; // Module description.
 | ||||
|     isDestroyed = false; // Whether the component is destroyed.
 | ||||
| 
 | ||||
|     protected fetchContentDefaultError = 'core.course.errorgetmodule'; // Default error to show when loading contents.
 | ||||
|     protected isCurrentView = false; // Whether the component is in the current view.
 | ||||
| @ -72,6 +71,7 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy, | ||||
|     protected debouncedUpdateModule?: () => void; // Update the module after a certain time.
 | ||||
|     protected showCompletion = false; // Whether to show completion inside the activity.
 | ||||
|     protected displayDescription = true; // Wether to show Module description on module page, and not on summary or the contrary.
 | ||||
|     protected isDestroyed = false; // Whether the component is destroyed.
 | ||||
| 
 | ||||
|     constructor( | ||||
|         @Optional() @Inject('') loggerName: string = 'CoreCourseModuleMainResourceComponent', | ||||
| @ -111,11 +111,10 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy, | ||||
|      * Refresh the data. | ||||
|      * | ||||
|      * @param refresher Refresher. | ||||
|      * @param done Function to call when done. Never used. | ||||
|      * @param showErrors If show errors to the user of hide them. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     async doRefresh(refresher?: IonRefresher | null, done?: () => void, showErrors: boolean = false): Promise<void> { | ||||
|     async doRefresh(refresher?: IonRefresher | null, showErrors = false): Promise<void> { | ||||
|         if (!this.loaded || !this.module) { | ||||
|             // Module can be undefined if course format changes from single activity to weekly/topics.
 | ||||
|             return; | ||||
| @ -405,10 +404,14 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy, | ||||
|             componentProps: { | ||||
|                 moduleId: this.module.id, | ||||
|                 module: this.module, | ||||
|                 description: !this.displayDescription ? this.description : '', | ||||
|                 description: this.description, | ||||
|                 component: this.component, | ||||
|                 courseId: this.courseId, | ||||
|                 hasOffline: this.hasOffline, | ||||
|                 displayOptions: { | ||||
|                     // Show description on summary if not shown on the page.
 | ||||
|                     displayDescription: !this.displayDescription, | ||||
|                 }, | ||||
|             }, | ||||
|         }); | ||||
| 
 | ||||
| @ -421,11 +424,11 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy, | ||||
|                 } finally { | ||||
|                     modal.dismiss(); | ||||
|                 } | ||||
|             } else if(data.action == 'sync') { | ||||
|             } else if (data.action == 'sync') { | ||||
|                 const modal = await CoreDomUtils.showModalLoading(); | ||||
| 
 | ||||
|                 try { | ||||
|                     await this.doRefresh( undefined, undefined, true); | ||||
|                     await this.doRefresh( undefined, true); | ||||
|                 } finally { | ||||
|                     modal.dismiss(); | ||||
|                 } | ||||
|  | ||||
| @ -19,12 +19,12 @@ | ||||
|                     </core-format-text> | ||||
|                 </h1> | ||||
|             </ion-label> | ||||
|             <ion-button fill="clear" [href]="externalUrl" core-link [showBrowserWarning]="false" color="dark" | ||||
|                 [attr.aria-label]="'core.openinbrowser' | translate" slot="end"> | ||||
|             <ion-button fill="clear" *ngIf="displayOptions.displayOpenInBrowser" [href]="externalUrl" core-link [showBrowserWarning]="false" | ||||
|                 color="dark" [attr.aria-label]="'core.openinbrowser' | translate" slot="end"> | ||||
|                 <ion-icon name="fas-external-link-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|         </ion-item> | ||||
|         <ion-item class="ion-text-wrap" *ngIf="module && description"> | ||||
|         <ion-item class="ion-text-wrap" *ngIf="module && description && displayOptions.displayDescription"> | ||||
|             <ion-label> | ||||
|                 <core-format-text [text]="description" [component]="component" [componentId]="componentId" contextLevel="module" | ||||
|                     [contextInstanceId]="module.id" [courseId]="courseId" [maxHeight]="120"> | ||||
| @ -32,7 +32,7 @@ | ||||
|             </ion-label> | ||||
|         </ion-item> | ||||
| 
 | ||||
|         <ion-item button class="ion-margin" *ngIf="prefetchText" class="ion-text-wrap"> | ||||
|         <ion-item button class="ion-margin" *ngIf="prefetchText && displayOptions.displayPrefetch" class="ion-text-wrap"> | ||||
|             <ion-label> | ||||
|                 <p class="item-heading ion-text-wrap">{{ prefetchText }}</p> | ||||
|                 <p *ngIf="downloadTimeReadable">{{ downloadTimeReadable }}</p> | ||||
| @ -45,7 +45,7 @@ | ||||
|             <ion-spinner *ngIf="prefetchStatusIcon == 'spinner'" slot="end" aria-hidden="true"></ion-spinner> | ||||
|         </ion-item> | ||||
| 
 | ||||
|         <ion-item button class="ion-margin" *ngIf="sizeReadable" class="ion-text-wrap"> | ||||
|         <ion-item button class="ion-margin" *ngIf="sizeReadable && displayOptions.displaySize" class="ion-text-wrap"> | ||||
|             <ion-label> | ||||
|                 <p class="item-heading ion-text-wrap">{{ 'addon.storagemanager.totalspaceusage' | translate }}</p> | ||||
|                 <ion-badge color="light">{{ sizeReadable | coreBytesToSize }}</ion-badge> | ||||
| @ -57,7 +57,7 @@ | ||||
|             <ion-spinner *ngIf="removeFilesLoading" slot="end" aria-hidden="true"></ion-spinner> | ||||
|         </ion-item> | ||||
| 
 | ||||
|         <ion-button *ngIf="blog" class="ion-margin" (click)="gotoBlog()" expand="block" fill="outline"> | ||||
|         <ion-button *ngIf="blog && displayOptions.displayBlog" class="ion-margin" (click)="gotoBlog()" expand="block" fill="outline"> | ||||
|             <ion-icon name="far-newspaper" slot="start" aria-hidden="true"></ion-icon> | ||||
|             <ion-label> | ||||
|                 {{ 'addon.blog.blog' | translate }} | ||||
| @ -65,7 +65,7 @@ | ||||
|         </ion-button> | ||||
|     </core-loading> | ||||
| </ion-content> | ||||
| <ion-footer *ngIf="loaded && isOnline"> | ||||
| <ion-footer *ngIf="loaded && isOnline && displayOptions.displayRefresh"> | ||||
|     <ion-button class="ion-margin" *ngIf="!hasOffline" (click)="refresh()" expand="block"> | ||||
|         <ion-icon name="fas-redo-alt" slot="start" aria-hidden="true"></ion-icon> | ||||
|         <ion-label> | ||||
|  | ||||
| @ -46,6 +46,7 @@ export class CoreCourseModuleSummaryComponent implements OnInit, OnDestroy { | ||||
|     @Input() component = ''; // Component name.
 | ||||
|     @Input() description = ''; // Module description.
 | ||||
|     @Input() hasOffline = false; // If it has offline data to be synced.
 | ||||
|     @Input() displayOptions: CoreCourseModuleSummaryDisplayOptions = {}; | ||||
| 
 | ||||
|     loaded = false; // If the component has been loaded.
 | ||||
|     componentId?: number; // Component ID.
 | ||||
| @ -95,6 +96,15 @@ export class CoreCourseModuleSummaryComponent implements OnInit, OnDestroy { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         this.displayOptions = Object.assign({ | ||||
|             displayOpenInBrowser: true, | ||||
|             displayDescription: true, | ||||
|             displayRefresh: true, | ||||
|             displayPrefetch: true, | ||||
|             displaySize: true, | ||||
|             displayBlog: true, | ||||
|         }, this.displayOptions); | ||||
| 
 | ||||
|         this.fetchContent(); | ||||
| 
 | ||||
|         if (this.component) { | ||||
| @ -309,3 +319,12 @@ export class CoreCourseModuleSummaryComponent implements OnInit, OnDestroy { | ||||
| export type CoreCourseModuleSummaryResult = { | ||||
|     action: 'sync'|'refresh'; | ||||
| }; | ||||
| 
 | ||||
| export type CoreCourseModuleSummaryDisplayOptions = { | ||||
|     displayOpenInBrowser?: boolean; | ||||
|     displayDescription?: boolean; | ||||
|     displayRefresh?: boolean; | ||||
|     displayPrefetch?: boolean; | ||||
|     displaySize?: boolean; | ||||
|     displayBlog?: boolean; | ||||
| }; | ||||
|  | ||||
| @ -64,7 +64,6 @@ import { CoreFile } from '@services/file'; | ||||
| import { CoreUrlUtils } from '@services/utils/url'; | ||||
| import { CoreTextUtils } from '@services/utils/text'; | ||||
| import { CoreTimeUtils } from '@services/utils/time'; | ||||
| import { CoreEventObserver, CoreEvents } from '@singletons/events'; | ||||
| import { CoreFilterHelper } from '@features/filter/services/filter-helper'; | ||||
| import { CoreNetworkError } from '@classes/errors/network-error'; | ||||
| import { CoreSiteHome } from '@features/sitehome/services/sitehome'; | ||||
| @ -474,23 +473,18 @@ export class CoreCourseHelperProvider { | ||||
|      * | ||||
|      * @param module Module to remove the files. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param done Function to call when done. It will close the context menu. | ||||
|      * @return Promise resolved when done. | ||||
|      * @deprecated since 4.0 | ||||
|      */ | ||||
|     async confirmAndRemoveFiles(module: CoreCourseModuleData, courseId: number, done?: () => void): Promise<void> { | ||||
|     async confirmAndRemoveFiles(module: CoreCourseModuleData, courseId: number): Promise<void> { | ||||
|         let modal: CoreIonLoadingElement | undefined; | ||||
| 
 | ||||
|         try { | ||||
| 
 | ||||
|             await CoreDomUtils.showDeleteConfirm('addon.storagemanager.confirmdeletedatafrom', { name: module.name }); | ||||
| 
 | ||||
|             modal = await CoreDomUtils.showModalLoading(); | ||||
| 
 | ||||
|             await this.removeModuleStoredData(module, courseId); | ||||
| 
 | ||||
|             done && done(); | ||||
| 
 | ||||
|         } catch (error) { | ||||
|             if (error) { | ||||
|                 CoreDomUtils.showErrorModal(error); | ||||
| @ -555,45 +549,6 @@ export class CoreCourseHelperProvider { | ||||
|         await CoreDomUtils.confirmDownloadSize(sizeSum, undefined, undefined, undefined, undefined, alwaysConfirm); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Helper function to prefetch a module, showing a confirmation modal if the size is big. | ||||
|      * This function is meant to be called from a context menu option. It will also modify some data like the prefetch icon. | ||||
|      * | ||||
|      * @param instance The component instance that has the context menu. | ||||
|      * @param module Module to be prefetched | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param done Function to call when done. It will close the context menu. | ||||
|      * @return Promise resolved when done. | ||||
|      * @deprecated since 4.0 | ||||
|      */ | ||||
|     async contextMenuPrefetch( | ||||
|         instance: ComponentWithContextMenu, | ||||
|         module: CoreCourseModuleData, | ||||
|         courseId: number, | ||||
|         done?: () => void, | ||||
|     ): Promise<void> { | ||||
|         const initialIcon = instance.prefetchStatusIcon; | ||||
|         instance.prefetchStatusIcon = CoreConstants.ICON_DOWNLOADING; // Show spinner since this operation might take a while.
 | ||||
| 
 | ||||
|         try { | ||||
|             // We need to call getDownloadSize, the package might have been updated.
 | ||||
|             const size = await CoreCourseModulePrefetchDelegate.getModuleDownloadSize(module, courseId, true); | ||||
| 
 | ||||
|             await CoreDomUtils.confirmDownloadSize(size); | ||||
| 
 | ||||
|             await CoreCourseModulePrefetchDelegate.prefetchModule(module, courseId, true); | ||||
| 
 | ||||
|             // Success, close menu.
 | ||||
|             done && done(); | ||||
|         } catch (error) { | ||||
|             instance.prefetchStatusIcon = initialIcon; | ||||
| 
 | ||||
|             if (!instance.isDestroyed) { | ||||
|                 CoreDomUtils.showErrorModalDefault(error, 'core.errordownloading', true); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check whether a course is accessed using guest access. | ||||
|      * | ||||
| @ -1030,87 +985,6 @@ export class CoreCourseHelperProvider { | ||||
|         await CoreFilepool.downloadOrPrefetchFiles(siteId, files, false, false, component, componentId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Fill the Context Menu for a certain module. | ||||
|      * | ||||
|      * @param instance The component instance that has the context menu. | ||||
|      * @param module Module to be prefetched | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param invalidateCache Invalidates the cache first. | ||||
|      * @param component Component of the module. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     async fillContextMenu( | ||||
|         instance: ComponentWithContextMenu, | ||||
|         module: CoreCourseModuleData, | ||||
|         courseId: number, | ||||
|         invalidateCache?: boolean, | ||||
|         component?: string, | ||||
|     ): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         const moduleInfo = await this.getModulePrefetchInfo(module, courseId, invalidateCache, component); | ||||
| 
 | ||||
|         instance.size = moduleInfo.sizeReadable; | ||||
|         instance.prefetchStatusIcon = moduleInfo.statusIcon; | ||||
|         instance.prefetchStatus = moduleInfo.status; | ||||
|         instance.downloadTimeReadable = CoreTextUtils.ucFirst(moduleInfo.downloadTimeReadable); | ||||
| 
 | ||||
|         if (moduleInfo.status != CoreConstants.NOT_DOWNLOADABLE) { | ||||
|             // Module is downloadable, get the text to display to prefetch.
 | ||||
|             if (moduleInfo.downloadTime && moduleInfo.downloadTime > 0) { | ||||
|                 instance.prefetchText = Translate.instant('core.lastdownloaded') + ': ' + moduleInfo.downloadTimeReadable; | ||||
|             } else { | ||||
|                 // Module not downloaded, show a default text.
 | ||||
|                 instance.prefetchText = Translate.instant('core.download'); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (moduleInfo.status == CoreConstants.DOWNLOADING) { | ||||
|             // Set this to empty to prevent "remove file" option showing up while downloading.
 | ||||
|             instance.size = ''; | ||||
|         } | ||||
| 
 | ||||
|         if (!instance.contextMenuStatusObserver && component) { | ||||
|             instance.contextMenuStatusObserver = CoreEvents.on( | ||||
|                 CoreEvents.PACKAGE_STATUS_CHANGED, | ||||
|                 (data) => { | ||||
|                     if (data.componentId == module.id && data.component == component) { | ||||
|                         this.fillContextMenu(instance, module, courseId, false, component); | ||||
|                     } | ||||
|                 }, | ||||
|                 siteId, | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|         if (!instance.contextFileStatusObserver && component) { | ||||
|             // Debounce the update size function to prevent too many calls when downloading or deleting a whole activity.
 | ||||
|             const debouncedUpdateSize = CoreUtils.debounce(async () => { | ||||
|                 const moduleSize = await CoreCourseModulePrefetchDelegate.getModuleStoredSize(module, courseId); | ||||
| 
 | ||||
|                 instance.size = moduleSize > 0 ? CoreTextUtils.bytesToSize(moduleSize, 2) : ''; | ||||
|             }, 1000); | ||||
| 
 | ||||
|             instance.contextFileStatusObserver = CoreEvents.on( | ||||
|                 CoreEvents.COMPONENT_FILE_ACTION, | ||||
|                 (data) => { | ||||
|                     if (data.component != component || data.componentId != module.id) { | ||||
|                         // The event doesn't belong to this component, ignore.
 | ||||
|                         return; | ||||
|                     } | ||||
| 
 | ||||
|                     if (!CoreFilepool.isFileEventDownloadedOrDeleted(data)) { | ||||
|                         return; | ||||
|                     } | ||||
| 
 | ||||
|                     // Update the module size.
 | ||||
|                     debouncedUpdateSize(); | ||||
|                 }, | ||||
|                 siteId, | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get a course. It will first check the user courses, and fallback to another WS if not enrolled. | ||||
|      * | ||||
| @ -2225,14 +2099,3 @@ export type CoreCourseOpenModuleOptions = { | ||||
|     sectionId?: number; // Section the module belongs to.
 | ||||
|     modNavOptions?: CoreNavigationOptions; // Navigation options to open the module, including params to pass to the module.
 | ||||
| }; | ||||
| 
 | ||||
| type ComponentWithContextMenu = { | ||||
|     prefetchStatusIcon?: string; | ||||
|     isDestroyed?: boolean; | ||||
|     size?: string; | ||||
|     prefetchStatus?: string; | ||||
|     prefetchText?: string; | ||||
|     downloadTimeReadable?: string; | ||||
|     contextMenuStatusObserver?: CoreEventObserver; | ||||
|     contextFileStatusObserver?: CoreEventObserver; | ||||
| }; | ||||
|  | ||||
| @ -202,10 +202,10 @@ export interface CoreCourseModuleMainComponent { | ||||
|      * Refresh the data. | ||||
|      * | ||||
|      * @param refresher Refresher. | ||||
|      * @param done Function to call when done. | ||||
|      * @param showErrors If show errors to the user of hide them. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     doRefresh(refresher?: IonRefresher, done?: () => void): Promise<void>; | ||||
|     doRefresh(refresher?: IonRefresher | null, showErrors?: boolean): Promise<void>; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -1,28 +1,8 @@ | ||||
| <!-- Buttons to add to the header. --> | ||||
| <core-navbar-buttons slot="end"> | ||||
|     <core-context-menu> | ||||
|         <core-context-menu-item [hidden]="!displayOpenInBrowser || !externalUrl || ( | ||||
|             content?.compileComponent?.componentInstance?.displayOpenInBrowser === false)" [priority]="900" | ||||
|             [content]="'core.openinbrowser' | translate" [href]="externalUrl" iconAction="fas-external-link-alt"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!displayDescription || !description || ( | ||||
|             content?.compileComponent?.componentInstance?.displayDescription === false)" [priority]="800" | ||||
|             [content]="'core.moduleintro' | translate" (action)="expandDescription()" iconAction="fas-arrow-right"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!displayRefresh || ( | ||||
|             content?.compileComponent?.componentInstance?.displayRefresh === false)" [priority]="700" | ||||
|             [content]="'core.refresh' | translate" (action)="doRefresh(null, $event)" [iconAction]="refreshIcon" [closeOnClick]="false"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!displayPrefetch || !prefetchStatusIcon || ( | ||||
|             content?.compileComponent?.componentInstance?.displayPrefetch === false)" [priority]="600" [content]="prefetchText" | ||||
|             (action)="prefetch()" [iconAction]="prefetchStatusIcon" [closeOnClick]="false"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!displaySize || !size || ( | ||||
|             content?.compileComponent?.componentInstance?.displaySize === false)" [priority]="500" | ||||
|             [content]="'core.clearstoreddata' | translate:{$a: size}" [iconDescription]="'fas-archive'" (action)="removeFiles()" | ||||
|             iconAction="fas-trash" [closeOnClick]="false"> | ||||
|         </core-context-menu-item> | ||||
|     </core-context-menu> | ||||
|     <ion-button fill="clear" (click)="openModuleSummary()" [attr.aria-label]="'core.info' | translate"> | ||||
|         <ion-icon name="fas-info-circle" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|     </ion-button> | ||||
| </core-navbar-buttons> | ||||
| 
 | ||||
| <core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" | ||||
|  | ||||
| @ -14,8 +14,13 @@ | ||||
| 
 | ||||
| import { CoreConstants } from '@/core/constants'; | ||||
| import { Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core'; | ||||
| import { CoreIonLoadingElement } from '@classes/ion-loading'; | ||||
| 
 | ||||
| import { CoreSiteWSPreSets } from '@classes/site'; | ||||
| import { | ||||
|     CoreCourseModuleSummaryResult, | ||||
|     CoreCourseModuleSummaryComponent, | ||||
| } from '@features/course/components/module-summary/module-summary'; | ||||
| import { CoreCourseHelper, CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||
| import { | ||||
|     CoreCourseModuleDelegate, | ||||
| @ -28,10 +33,8 @@ import { | ||||
|     CoreSitePluginsCourseModuleHandlerData, | ||||
| } from '@features/siteplugins/services/siteplugins'; | ||||
| import { IonRefresher } from '@ionic/angular'; | ||||
| import { CoreTextUtils } from '@services/utils/text'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { Translate } from '@singletons'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| import { CoreSitePluginsPluginContentComponent } from '../plugin-content/plugin-content'; | ||||
| 
 | ||||
| /** | ||||
| @ -55,22 +58,39 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C | ||||
|     args?: Record<string, unknown>; | ||||
|     initResult?: CoreSitePluginsContent | null; | ||||
|     preSets?: CoreSiteWSPreSets; | ||||
| 
 | ||||
|     // Data for context menu.
 | ||||
|     externalUrl?: string; | ||||
|     description?: string; | ||||
|     refreshIcon?: string; | ||||
| 
 | ||||
|     /** | ||||
|      * @deprecated since 4.0, use module.url instead. | ||||
|      */ | ||||
|     externalUrl?: string; | ||||
|     /** | ||||
|      * @deprecated since 4.0. It won't be populated anymore. | ||||
|      */ | ||||
|     refreshIcon = CoreConstants.ICON_REFRESH; | ||||
|     /** | ||||
|      * @deprecated since 4.0.. It won't be populated anymore. | ||||
|      */ | ||||
|     prefetchStatus?: string; | ||||
|     /** | ||||
|      * @deprecated since 4.0. It won't be populated anymore. | ||||
|      */ | ||||
|     prefetchStatusIcon?: string; | ||||
|     /** | ||||
|      * @deprecated since 4.0. It won't be populated anymore. | ||||
|      */ | ||||
|     prefetchText?: string; | ||||
|     /** | ||||
|      * @deprecated since 4.0. It won't be populated anymore. | ||||
|      */ | ||||
|     size?: string; | ||||
|     contextMenuStatusObserver?: CoreEventObserver; | ||||
|     contextFileStatusObserver?: CoreEventObserver; | ||||
| 
 | ||||
|     displayOpenInBrowser = true; | ||||
|     displayDescription = true; | ||||
|     displayRefresh = true; | ||||
|     displayPrefetch = true; | ||||
|     displaySize = true; | ||||
| 
 | ||||
|     ptrEnabled = true; | ||||
|     isDestroyed = false; | ||||
| 
 | ||||
| @ -80,8 +100,6 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C | ||||
|      * Component being initialized. | ||||
|      */ | ||||
|     ngOnInit(): void { | ||||
|         this.refreshIcon = CoreConstants.ICON_LOADING; | ||||
| 
 | ||||
|         if (!this.module) { | ||||
|             return; | ||||
|         } | ||||
| @ -122,71 +140,119 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C | ||||
|      * Refresh the data. | ||||
|      * | ||||
|      * @param refresher Refresher. | ||||
|      * @param done Function to call when done. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     async doRefresh(refresher?: IonRefresher | null, done?: () => void): Promise<void> { | ||||
|         if (this.content) { | ||||
|             this.refreshIcon = CoreConstants.ICON_LOADING; | ||||
|         } | ||||
| 
 | ||||
|     async doRefresh(refresher?: IonRefresher | null): Promise<void> { | ||||
|         try { | ||||
|             await this.content?.refreshContent(false); | ||||
|         } finally { | ||||
|             refresher?.complete(); | ||||
|             done && done(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Function called when the data of the site plugin content is loaded. | ||||
|      */ | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     contentLoaded(refresh: boolean): void { | ||||
|         this.refreshIcon = CoreConstants.ICON_REFRESH; | ||||
| 
 | ||||
|         // Check if there is a prefetch handler for this type of module.
 | ||||
|         if (CoreCourseModulePrefetchDelegate.getPrefetchHandlerFor(this.module.modname)) { | ||||
|             CoreCourseHelper.fillContextMenu(this, this.module, this.courseId, refresh, this.component); | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Function called when starting to load the data of the site plugin content. | ||||
|      */ | ||||
|     contentLoading(): void { | ||||
|         this.refreshIcon = CoreConstants.ICON_LOADING; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Expand the description. | ||||
|      * | ||||
|      * @deprecated since 4.0 | ||||
|      */ | ||||
|     expandDescription(): void { | ||||
|         if (!this.description) { | ||||
|         this.openModuleSummary(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Opens a module summary page. | ||||
|      */ | ||||
|     async openModuleSummary(): Promise<void> { | ||||
|         if (!this.module) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         CoreTextUtils.viewText(Translate.instant('core.description'), this.description, { | ||||
|         const data = await CoreDomUtils.openSideModal<CoreCourseModuleSummaryResult>({ | ||||
|             component: CoreCourseModuleSummaryComponent, | ||||
|             componentProps: { | ||||
|                 moduleId: this.module.id, | ||||
|                 module: this.module, | ||||
|                 description: this.description, | ||||
|                 component: this.component, | ||||
|             componentId: this.module.id, | ||||
|             filter: true, | ||||
|             contextLevel: 'module', | ||||
|             instanceId: this.module.id, | ||||
|                 courseId: this.courseId, | ||||
|                 displayOptions: { | ||||
|                     displayOpenInBrowser: this.displayOpenInBrowser, | ||||
|                     displayDescription: this.displayDescription, | ||||
|                     displayRefresh: this.displayRefresh, | ||||
|                     displayPrefetch: this.displayPrefetch, | ||||
|                     displaySize: this.displaySize, | ||||
|                     displayBlog: false, | ||||
|                 }, | ||||
|             }, | ||||
|         }); | ||||
| 
 | ||||
|         if (data && data.action == 'refresh') { | ||||
|             const modal = await CoreDomUtils.showModalLoading(); | ||||
| 
 | ||||
|             try { | ||||
|                 await this.doRefresh(); | ||||
|             } finally { | ||||
|                 modal.dismiss(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch the module. | ||||
|      * | ||||
|      * @deprecated since 4.0 | ||||
|      */ | ||||
|     prefetch(): void { | ||||
|         CoreCourseHelper.contextMenuPrefetch(this, this.module, this.courseId); | ||||
|     async prefetch(): Promise<void> { | ||||
|         try { | ||||
|             // We need to call getDownloadSize, the package might have been updated.
 | ||||
|             const size = await CoreCourseModulePrefetchDelegate.getModuleDownloadSize(this.module, this.courseId, true); | ||||
| 
 | ||||
|             await CoreDomUtils.confirmDownloadSize(size); | ||||
| 
 | ||||
|             await CoreCourseModulePrefetchDelegate.prefetchModule(this.module, this.courseId, true); | ||||
|         } catch (error) { | ||||
|             if (!this.isDestroyed) { | ||||
|                 CoreDomUtils.showErrorModalDefault(error, 'core.errordownloading', true); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Confirm and remove downloaded files. | ||||
|      * | ||||
|      * @deprecated since 4.0 | ||||
|      */ | ||||
|     removeFiles(): void { | ||||
|         CoreCourseHelper.confirmAndRemoveFiles(this.module, this.courseId); | ||||
|     async removeFiles(): Promise<void> { | ||||
|         let modal: CoreIonLoadingElement | undefined; | ||||
| 
 | ||||
|         try { | ||||
|             await CoreDomUtils.showDeleteConfirm('addon.storagemanager.confirmdeletedatafrom', { name: this.module.name }); | ||||
| 
 | ||||
|             modal = await CoreDomUtils.showModalLoading(); | ||||
| 
 | ||||
|             await CoreCourseHelper.removeModuleStoredData(this.module, this.courseId); | ||||
|         } catch (error) { | ||||
|             if (error) { | ||||
|                 CoreDomUtils.showErrorModal(error); | ||||
|             } | ||||
|         } finally { | ||||
|             modal?.dismiss(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user