commit
ebbfe039c0
|
@ -35,6 +35,7 @@ import { IonSearchbar } from '@ionic/angular';
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
import { PageLoadWatcher } from '@classes/page-load-watcher';
|
import { PageLoadWatcher } from '@classes/page-load-watcher';
|
||||||
import { PageLoadsManager } from '@classes/page-loads-manager';
|
import { PageLoadsManager } from '@classes/page-loads-manager';
|
||||||
|
import { DownloadStatus } from '@/core/constants';
|
||||||
|
|
||||||
const FILTER_PRIORITY: AddonBlockMyOverviewTimeFilters[] =
|
const FILTER_PRIORITY: AddonBlockMyOverviewTimeFilters[] =
|
||||||
['all', 'inprogress', 'future', 'past', 'favourite', 'allincludinghidden', 'hidden'];
|
['all', 'inprogress', 'future', 'past', 'favourite', 'allincludinghidden', 'hidden'];
|
||||||
|
@ -54,7 +55,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
|
||||||
prefetchCoursesData: CorePrefetchStatusInfo = {
|
prefetchCoursesData: CorePrefetchStatusInfo = {
|
||||||
icon: '',
|
icon: '',
|
||||||
statusTranslatable: 'core.loading',
|
statusTranslatable: 'core.loading',
|
||||||
status: '',
|
status: DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
loading: true,
|
loading: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreSwipeSlidesItemsManager } from '@classes/items-management/swipe-slides-items-manager';
|
import { CoreSwipeSlidesItemsManager } from '@classes/items-management/swipe-slides-items-manager';
|
||||||
|
@ -180,7 +180,7 @@ export class AddonModBookContentsPage implements OnInit, OnDestroy {
|
||||||
// Get module status to determine if it needs to be downloaded.
|
// Get module status to determine if it needs to be downloaded.
|
||||||
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(module, this.courseId, undefined, refresh);
|
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(module, this.courseId, undefined, refresh);
|
||||||
|
|
||||||
if (status !== CoreConstants.DOWNLOADED) {
|
if (status !== DownloadStatus.DOWNLOADED) {
|
||||||
// Download content. This function also loads module contents if needed.
|
// Download content. This function also loads module contents if needed.
|
||||||
try {
|
try {
|
||||||
await CoreCourseModulePrefetchDelegate.downloadModule(module, this.courseId);
|
await CoreCourseModulePrefetchDelegate.downloadModule(module, this.courseId);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
import { Component, Optional, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';
|
import { Component, Optional, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';
|
||||||
import { IonContent } from '@ionic/angular';
|
import { IonContent } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { CoreSite } from '@classes/sites/site';
|
import { CoreSite } from '@classes/sites/site';
|
||||||
import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component';
|
import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component';
|
||||||
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
|
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
|
||||||
|
@ -161,12 +161,16 @@ export class AddonModH5PActivityIndexComponent extends CoreCourseModuleMainActiv
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.siteCanDownload || this.state == CoreConstants.DOWNLOADED) {
|
if (!this.siteCanDownload || this.state === DownloadStatus.DOWNLOADED) {
|
||||||
// Cannot download the file or already downloaded, play the package directly.
|
// Cannot download the file or already downloaded, play the package directly.
|
||||||
this.play();
|
this.play();
|
||||||
|
|
||||||
} else if ((this.state == CoreConstants.NOT_DOWNLOADED || this.state == CoreConstants.OUTDATED) && CoreNetwork.isOnline() &&
|
} else if (
|
||||||
this.deployedFile?.filesize && CoreFilepool.shouldDownload(this.deployedFile.filesize)) {
|
(this.state == DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED || this.state == DownloadStatus.OUTDATED) &&
|
||||||
|
CoreNetwork.isOnline() &&
|
||||||
|
this.deployedFile?.filesize &&
|
||||||
|
CoreFilepool.shouldDownload(this.deployedFile.filesize)
|
||||||
|
) {
|
||||||
// Package is small, download it automatically. Don't block this function for this.
|
// Package is small, download it automatically. Don't block this function for this.
|
||||||
this.downloadAutomatically();
|
this.downloadAutomatically();
|
||||||
}
|
}
|
||||||
|
@ -295,13 +299,13 @@ export class AddonModH5PActivityIndexComponent extends CoreCourseModuleMainActiv
|
||||||
* Displays some data based on the state of the main file.
|
* Displays some data based on the state of the main file.
|
||||||
*/
|
*/
|
||||||
protected async showFileState(): Promise<void> {
|
protected async showFileState(): Promise<void> {
|
||||||
if (this.state == CoreConstants.OUTDATED) {
|
if (this.state === DownloadStatus.OUTDATED) {
|
||||||
this.stateMessage = 'addon.mod_h5pactivity.filestateoutdated';
|
this.stateMessage = 'addon.mod_h5pactivity.filestateoutdated';
|
||||||
this.needsDownload = true;
|
this.needsDownload = true;
|
||||||
} else if (this.state == CoreConstants.NOT_DOWNLOADED) {
|
} else if (this.state === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
this.stateMessage = 'addon.mod_h5pactivity.filestatenotdownloaded';
|
this.stateMessage = 'addon.mod_h5pactivity.filestatenotdownloaded';
|
||||||
this.needsDownload = true;
|
this.needsDownload = true;
|
||||||
} else if (this.state == CoreConstants.DOWNLOADING) {
|
} else if (this.state === DownloadStatus.DOWNLOADING) {
|
||||||
this.stateMessage = '';
|
this.stateMessage = '';
|
||||||
|
|
||||||
if (!this.downloading) {
|
if (!this.downloading) {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/activity-prefetch-handler';
|
import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/activity-prefetch-handler';
|
||||||
|
@ -144,7 +144,7 @@ export class AddonModH5PActivityPrefetchHandlerService extends CoreCourseActivit
|
||||||
// If the file needs to be downloaded, delete the states because it means the package has changed or user deleted it.
|
// If the file needs to be downloaded, delete the states because it means the package has changed or user deleted it.
|
||||||
const fileState = await CoreFilepool.getFileStateByUrl(siteId, CoreFileHelper.getFileUrl(deployedFile));
|
const fileState = await CoreFilepool.getFileStateByUrl(siteId, CoreFileHelper.getFileUrl(deployedFile));
|
||||||
|
|
||||||
if (fileState !== CoreConstants.DOWNLOADED) {
|
if (fileState !== DownloadStatus.DOWNLOADED) {
|
||||||
await CoreUtils.ignoreErrors(CoreXAPIOffline.deleteStates(AddonModH5PActivityProvider.TRACK_COMPONENT, {
|
await CoreUtils.ignoreErrors(CoreXAPIOffline.deleteStates(AddonModH5PActivityProvider.TRACK_COMPONENT, {
|
||||||
itemId: h5pActivity.context,
|
itemId: h5pActivity.context,
|
||||||
siteId,
|
siteId,
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreNavigationBarItem } from '@components/navigation-bar/navigation-bar';
|
import { CoreNavigationBarItem } from '@components/navigation-bar/navigation-bar';
|
||||||
|
@ -173,7 +173,7 @@ export class AddonModImscpViewPage implements OnInit {
|
||||||
// Get module status to determine if it needs to be downloaded.
|
// Get module status to determine if it needs to be downloaded.
|
||||||
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(module, this.courseId, undefined, refresh);
|
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(module, this.courseId, undefined, refresh);
|
||||||
|
|
||||||
if (status !== CoreConstants.DOWNLOADED) {
|
if (status !== DownloadStatus.DOWNLOADED) {
|
||||||
// Download content. This function also loads module contents if needed.
|
// Download content. This function also loads module contents if needed.
|
||||||
try {
|
try {
|
||||||
await CoreCourseModulePrefetchDelegate.downloadModule(module, this.courseId);
|
await CoreCourseModulePrefetchDelegate.downloadModule(module, this.courseId);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { Component, Input, ViewChild, ElementRef, OnInit, OnDestroy, Optional } from '@angular/core';
|
import { Component, Input, ViewChild, ElementRef, OnInit, OnDestroy, Optional } from '@angular/core';
|
||||||
|
|
||||||
import { CoreTabsComponent } from '@components/tabs/tabs';
|
import { CoreTabsComponent } from '@components/tabs/tabs';
|
||||||
|
@ -575,8 +575,8 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
protected showStatus(status: string): void {
|
protected showStatus(status: TDownloadStatus): void {
|
||||||
this.showSpinner = status == CoreConstants.DOWNLOADING;
|
this.showSpinner = status === DownloadStatus.DOWNLOADING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -590,7 +590,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AddonModLesson.isLessonOffline(this.lesson) || this.currentStatus == CoreConstants.DOWNLOADED) {
|
if (!AddonModLesson.isLessonOffline(this.lesson) || this.currentStatus == DownloadStatus.DOWNLOADED) {
|
||||||
// Not downloadable or already downloaded, open it.
|
// Not downloadable or already downloaded, open it.
|
||||||
this.playLesson(continueLast);
|
this.playLesson(continueLast);
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { safeNumber, SafeNumber } from '@/core/utils/types';
|
import { safeNumber, SafeNumber } from '@/core/utils/types';
|
||||||
import { Component, OnDestroy, OnInit, Optional } from '@angular/core';
|
import { Component, OnDestroy, OnInit, Optional } from '@angular/core';
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ export class AddonModQuizIndexComponent extends CoreCourseModuleMainActivityComp
|
||||||
|
|
||||||
// Quiz supports offline, check if it needs to be downloaded.
|
// Quiz supports offline, check if it needs to be downloaded.
|
||||||
// If the site doesn't support check updates, always prefetch it because we cannot tell if there's something new.
|
// If the site doesn't support check updates, always prefetch it because we cannot tell if there's something new.
|
||||||
const isDownloaded = this.currentStatus == CoreConstants.DOWNLOADED;
|
const isDownloaded = this.currentStatus === DownloadStatus.DOWNLOADED;
|
||||||
|
|
||||||
if (isDownloaded) {
|
if (isDownloaded) {
|
||||||
// Already downloaded, open it.
|
// Already downloaded, open it.
|
||||||
|
@ -543,10 +543,10 @@ export class AddonModQuizIndexComponent extends CoreCourseModuleMainActivityComp
|
||||||
* @param status The current status.
|
* @param status The current status.
|
||||||
* @param previousStatus The previous status. If not defined, there is no previous status.
|
* @param previousStatus The previous status. If not defined, there is no previous status.
|
||||||
*/
|
*/
|
||||||
protected showStatus(status: string, previousStatus?: string): void {
|
protected showStatus(status: TDownloadStatus, previousStatus?: TDownloadStatus): void {
|
||||||
this.showStatusSpinner = status == CoreConstants.DOWNLOADING;
|
this.showStatusSpinner = status === DownloadStatus.DOWNLOADING;
|
||||||
|
|
||||||
if (status == CoreConstants.DOWNLOADED && previousStatus == CoreConstants.DOWNLOADING) {
|
if (status === DownloadStatus.DOWNLOADED && previousStatus === DownloadStatus.DOWNLOADING) {
|
||||||
// Quiz downloaded now, maybe a new attempt was created. Load content again.
|
// Quiz downloaded now, maybe a new attempt was created. Load content again.
|
||||||
this.showLoadingAndFetch();
|
this.showLoadingAndFetch();
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { isSafeNumber } from '@/core/utils/types';
|
import { isSafeNumber } from '@/core/utils/types';
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
@ -604,7 +604,7 @@ export class AddonModQuizPrefetchHandlerService extends CoreCourseActivityPrefet
|
||||||
// Check the current status of the quiz.
|
// Check the current status of the quiz.
|
||||||
const status = await CoreFilepool.getPackageStatus(options.siteId, this.component, quiz.coursemodule);
|
const status = await CoreFilepool.getPackageStatus(options.siteId, this.component, quiz.coursemodule);
|
||||||
|
|
||||||
if (status === CoreConstants.NOT_DOWNLOADED) {
|
if (status === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -612,7 +612,7 @@ export class AddonModQuizPrefetchHandlerService extends CoreCourseActivityPrefet
|
||||||
// If no attempts or last is finished we'll mark it as not downloaded to show download icon.
|
// If no attempts or last is finished we'll mark it as not downloaded to show download icon.
|
||||||
const lastAttempt = attempts[attempts.length - 1];
|
const lastAttempt = attempts[attempts.length - 1];
|
||||||
const isLastFinished = !lastAttempt || AddonModQuiz.isAttemptFinished(lastAttempt.state);
|
const isLastFinished = !lastAttempt || AddonModQuiz.isAttemptFinished(lastAttempt.state);
|
||||||
const newStatus = isLastFinished ? CoreConstants.NOT_DOWNLOADED : CoreConstants.DOWNLOADED;
|
const newStatus = isLastFinished ? DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED : DownloadStatus.DOWNLOADED;
|
||||||
|
|
||||||
await CoreFilepool.storePackageStatus(options.siteId, newStatus, this.component, quiz.coursemodule);
|
await CoreFilepool.storePackageStatus(options.siteId, newStatus, this.component, quiz.coursemodule);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { Component, OnDestroy, OnInit, Optional } from '@angular/core';
|
import { Component, OnDestroy, OnInit, Optional } from '@angular/core';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
|
import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
|
||||||
|
@ -66,7 +66,7 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource
|
||||||
timecreated = -1;
|
timecreated = -1;
|
||||||
timemodified = -1;
|
timemodified = -1;
|
||||||
isExternalFile = false;
|
isExternalFile = false;
|
||||||
outdatedStatus = CoreConstants.OUTDATED;
|
outdatedStatus = DownloadStatus.OUTDATED;
|
||||||
|
|
||||||
protected onlineObserver?: Subscription;
|
protected onlineObserver?: Subscription;
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource
|
||||||
downloadable = await AddonModResourceHelper.isMainFileDownloadable(this.module);
|
downloadable = await AddonModResourceHelper.isMainFileDownloadable(this.module);
|
||||||
|
|
||||||
if (downloadable) {
|
if (downloadable) {
|
||||||
if (this.currentStatus === CoreConstants.OUTDATED && !this.isOnline && !this.isExternalFile) {
|
if (this.currentStatus === DownloadStatus.OUTDATED && !this.isOnline && !this.isExternalFile) {
|
||||||
// Warn the user that the file isn't updated.
|
// Warn the user that the file isn't updated.
|
||||||
const alert = await CoreDomUtils.showAlert(
|
const alert = await CoreDomUtils.showAlert(
|
||||||
undefined,
|
undefined,
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants, ModPurpose } from '@/core/constants';
|
import { CoreConstants, DownloadStatus, ModPurpose } from '@/core/constants';
|
||||||
import { Injectable, Type } from '@angular/core';
|
import { Injectable, Type } from '@angular/core';
|
||||||
import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler';
|
import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler';
|
||||||
import { CoreCourse } from '@features/course/services/course';
|
import { CoreCourse } from '@features/course/services/course';
|
||||||
|
@ -76,7 +76,7 @@ export class AddonModResourceModuleHandlerService extends CoreModuleHandlerBase
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
handlerData.button.hidden = status !== CoreConstants.DOWNLOADED ||
|
handlerData.button.hidden = status !== DownloadStatus.DOWNLOADED ||
|
||||||
AddonModResourceHelper.isDisplayedInIframe(module);
|
AddonModResourceHelper.isDisplayedInIframe(module);
|
||||||
};
|
};
|
||||||
handlerData.button = {
|
handlerData.button = {
|
||||||
|
@ -124,7 +124,7 @@ export class AddonModResourceModuleHandlerService extends CoreModuleHandlerBase
|
||||||
|
|
||||||
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(module, module.course);
|
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(module, module.course);
|
||||||
|
|
||||||
return status !== CoreConstants.DOWNLOADED || AddonModResourceHelper.isDisplayedInIframe(module);
|
return status !== DownloadStatus.DOWNLOADED || AddonModResourceHelper.isDisplayedInIframe(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreCourseResourcePrefetchHandlerBase } from '@features/course/classes/resource-prefetch-handler';
|
import { CoreCourseResourcePrefetchHandlerBase } from '@features/course/classes/resource-prefetch-handler';
|
||||||
import { CoreCourse, CoreCourseAnyModuleData } from '@features/course/services/course';
|
import { CoreCourse, CoreCourseAnyModuleData } from '@features/course/services/course';
|
||||||
|
@ -36,18 +36,18 @@ export class AddonModResourcePrefetchHandlerService extends CoreCourseResourcePr
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
determineStatus(module: CoreCourseAnyModuleData, status: string): string {
|
determineStatus(module: CoreCourseAnyModuleData, status: TDownloadStatus): TDownloadStatus {
|
||||||
if (status == CoreConstants.DOWNLOADED && module) {
|
if (status === DownloadStatus.DOWNLOADED && module) {
|
||||||
// If the main file is an external file, always display the module as outdated.
|
// If the main file is an external file, always display the module as outdated.
|
||||||
if ('contentsinfo' in module && module.contentsinfo) {
|
if ('contentsinfo' in module && module.contentsinfo) {
|
||||||
if (module.contentsinfo.repositorytype) {
|
if (module.contentsinfo.repositorytype) {
|
||||||
// It's an external file.
|
// It's an external file.
|
||||||
return CoreConstants.OUTDATED;
|
return DownloadStatus.OUTDATED;
|
||||||
}
|
}
|
||||||
} else if (module.contents) {
|
} else if (module.contents) {
|
||||||
const mainFile = module.contents[0];
|
const mainFile = module.contents[0];
|
||||||
if (mainFile && mainFile.isexternalfile) {
|
if (mainFile && mainFile.isexternalfile) {
|
||||||
return CoreConstants.OUTDATED;
|
return DownloadStatus.OUTDATED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { Component, Input, OnInit, Optional } from '@angular/core';
|
import { Component, Input, OnInit, Optional } from '@angular/core';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component';
|
import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component';
|
||||||
|
@ -495,10 +495,10 @@ export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityCom
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isOutdated = this.currentStatus === CoreConstants.OUTDATED;
|
const isOutdated = this.currentStatus === DownloadStatus.OUTDATED;
|
||||||
const scorm = this.scorm;
|
const scorm = this.scorm;
|
||||||
|
|
||||||
if (!isOutdated && this.currentStatus !== CoreConstants.NOT_DOWNLOADED) {
|
if (!isOutdated && this.currentStatus !== DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// Already downloaded, open it.
|
// Already downloaded, open it.
|
||||||
this.openScorm(scoId, preview);
|
this.openScorm(scoId, preview);
|
||||||
|
|
||||||
|
@ -578,16 +578,16 @@ export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityCom
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
protected async showStatus(status: string): Promise<void> {
|
protected async showStatus(status: TDownloadStatus): Promise<void> {
|
||||||
|
|
||||||
if (status === CoreConstants.OUTDATED && this.scorm) {
|
if (status === DownloadStatus.OUTDATED && this.scorm) {
|
||||||
// Only show the outdated message if the file should be downloaded.
|
// Only show the outdated message if the file should be downloaded.
|
||||||
const download = await AddonModScorm.shouldDownloadMainFile(this.scorm, true);
|
const download = await AddonModScorm.shouldDownloadMainFile(this.scorm, true);
|
||||||
|
|
||||||
this.statusMessage = download ? 'addon.mod_scorm.scormstatusoutdated' : '';
|
this.statusMessage = download ? 'addon.mod_scorm.scormstatusoutdated' : '';
|
||||||
} else if (status === CoreConstants.NOT_DOWNLOADED) {
|
} else if (status === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
this.statusMessage = 'addon.mod_scorm.scormstatusnotdownloaded';
|
this.statusMessage = 'addon.mod_scorm.scormstatusnotdownloaded';
|
||||||
} else if (status === CoreConstants.DOWNLOADING) {
|
} else if (status === DownloadStatus.DOWNLOADING) {
|
||||||
if (!this.downloading) {
|
if (!this.downloading) {
|
||||||
// It's being downloaded right now but the view isn't tracking it. "Restore" the download.
|
// It's being downloaded right now but the view isn't tracking it. "Restore" the download.
|
||||||
this.downloadScormPackage();
|
this.downloadScormPackage();
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreSite } from '@classes/sites/site';
|
import { CoreSite } from '@classes/sites/site';
|
||||||
|
@ -1669,8 +1669,8 @@ export class AddonModScormProvider {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isOutdated = data.status == CoreConstants.OUTDATED ||
|
const isOutdated = data.status === DownloadStatus.OUTDATED ||
|
||||||
(data.status == CoreConstants.DOWNLOADING && data.previous == CoreConstants.OUTDATED);
|
(data.status === DownloadStatus.DOWNLOADING && data.previous === DownloadStatus.OUTDATED);
|
||||||
|
|
||||||
// Package needs to be downloaded if it's not outdated (not downloaded) or if the hash has changed.
|
// Package needs to be downloaded if it's not outdated (not downloaded) or if the hash has changed.
|
||||||
return !isOutdated || data.extra != scorm.sha1hash;
|
return !isOutdated || data.extra != scorm.sha1hash;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { CoreSitePublicConfigResponse } from '@classes/sites/unauthenticated-site';
|
import { CoreSitePublicConfigResponse } from '@classes/sites/unauthenticated-site';
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreFilepool } from '@services/filepool';
|
import { CoreFilepool } from '@services/filepool';
|
||||||
|
@ -124,7 +124,7 @@ export class AddonRemoteThemesHandlerService implements CoreStyleHandler {
|
||||||
// Check if the file is downloaded.
|
// Check if the file is downloaded.
|
||||||
const state = await CoreFilepool.getFileStateByUrl(siteId, url);
|
const state = await CoreFilepool.getFileStateByUrl(siteId, url);
|
||||||
|
|
||||||
if (state == CoreConstants.NOT_DOWNLOADED) {
|
if (state === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// File not downloaded, URL has changed or first time. Delete downloaded CSS files.
|
// File not downloaded, URL has changed or first time. Delete downloaded CSS files.
|
||||||
await CoreFilepool.removeFilesByComponent(siteId, COMPONENT, 1);
|
await CoreFilepool.removeFilesByComponent(siteId, COMPONENT, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit } from '@angular/core';
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { CoreCourse, CoreCourseProvider } from '@features/course/services/course';
|
import { CoreCourse, CoreCourseProvider } from '@features/course/services/course';
|
||||||
import {
|
import {
|
||||||
|
@ -58,11 +58,11 @@ export class AddonStorageManagerCourseStoragePage implements OnInit, OnDestroy {
|
||||||
prefetchCourseData: CorePrefetchStatusInfo = {
|
prefetchCourseData: CorePrefetchStatusInfo = {
|
||||||
icon: CoreConstants.ICON_LOADING,
|
icon: CoreConstants.ICON_LOADING,
|
||||||
statusTranslatable: 'core.course.downloadcourse',
|
statusTranslatable: 'core.course.downloadcourse',
|
||||||
status: '',
|
status: DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
loading: true,
|
loading: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
statusDownloaded = CoreConstants.DOWNLOADED;
|
statusDownloaded = DownloadStatus.DOWNLOADED;
|
||||||
|
|
||||||
protected initialSectionId?: number;
|
protected initialSectionId?: number;
|
||||||
protected siteUpdatedObserver?: CoreEventObserver;
|
protected siteUpdatedObserver?: CoreEventObserver;
|
||||||
|
@ -511,7 +511,7 @@ export class AddonStorageManagerCourseStoragePage implements OnInit, OnDestroy {
|
||||||
// We are currently marking as not downloaded if size is 0 but we should take into account that
|
// We are currently marking as not downloaded if size is 0 but we should take into account that
|
||||||
// resources without files can be downloaded and cached.
|
// resources without files can be downloaded and cached.
|
||||||
|
|
||||||
CoreCourse.setCourseStatus(this.courseId, CoreConstants.NOT_DOWNLOADED);
|
CoreCourse.setCourseStatus(this.courseId, DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -607,7 +607,7 @@ export class AddonStorageManagerCourseStoragePage implements OnInit, OnDestroy {
|
||||||
* @param module Module to update.
|
* @param module Module to update.
|
||||||
* @param status Module status.
|
* @param status Module status.
|
||||||
*/
|
*/
|
||||||
protected updateModuleStatus(module: AddonStorageManagerModule, status: string): void {
|
protected updateModuleStatus(module: AddonStorageManagerModule, status: TDownloadStatus): void {
|
||||||
if (!status) {
|
if (!status) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -649,7 +649,7 @@ export class AddonStorageManagerCourseStoragePage implements OnInit, OnDestroy {
|
||||||
*
|
*
|
||||||
* @param status Status to show.
|
* @param status Status to show.
|
||||||
*/
|
*/
|
||||||
protected updateCourseStatus(status: string): void {
|
protected updateCourseStatus(status: TDownloadStatus): void {
|
||||||
const statusData = CoreCourseHelper.getCoursePrefetchStatusInfo(status);
|
const statusData = CoreCourseHelper.getCoursePrefetchStatusInfo(status);
|
||||||
|
|
||||||
this.prefetchCourseData.status = statusData.status;
|
this.prefetchCourseData.status = statusData.status;
|
||||||
|
@ -758,5 +758,5 @@ type AddonStorageManagerModule = CoreCourseModuleData & {
|
||||||
calculatingSize: boolean;
|
calculatingSize: boolean;
|
||||||
prefetchHandler?: CoreCourseModulePrefetchHandler;
|
prefetchHandler?: CoreCourseModulePrefetchHandler;
|
||||||
spinner?: boolean;
|
spinner?: boolean;
|
||||||
downloadStatus?: string;
|
downloadStatus?: TDownloadStatus;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { CoreCourse, CoreCourseProvider } from '@features/course/services/course';
|
import { CoreCourse, CoreCourseProvider } from '@features/course/services/course';
|
||||||
import { CoreCourseHelper } from '@features/course/services/course-helper';
|
import { CoreCourseHelper } from '@features/course/services/course-helper';
|
||||||
|
@ -82,7 +82,7 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
|
||||||
id: siteHomeId,
|
id: siteHomeId,
|
||||||
title: Translate.instant('core.sitehome.sitehome'),
|
title: Translate.instant('core.sitehome.sitehome'),
|
||||||
totalSize: size,
|
totalSize: size,
|
||||||
isDownloading: status === CoreConstants.DOWNLOADING,
|
isDownloading: status === DownloadStatus.DOWNLOADING,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,7 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
|
||||||
*
|
*
|
||||||
* @param courseId Updated course id.
|
* @param courseId Updated course id.
|
||||||
*/
|
*/
|
||||||
private async onCourseUpdated(courseId: number, status: string): Promise<void> {
|
private async onCourseUpdated(courseId: number, status: TDownloadStatus): Promise<void> {
|
||||||
if (courseId == CoreCourseProvider.ALL_COURSES_CLEARED) {
|
if (courseId == CoreCourseProvider.ALL_COURSES_CLEARED) {
|
||||||
this.setDownloadedCourses([]);
|
this.setDownloadedCourses([]);
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
course.isDownloading = status === CoreConstants.DOWNLOADING;
|
course.isDownloading = status === DownloadStatus.DOWNLOADING;
|
||||||
course.totalSize = await this.calculateDownloadedCourseSize(course.id);
|
course.totalSize = await this.calculateDownloadedCourseSize(course.id);
|
||||||
|
|
||||||
this.setDownloadedCourses(this.downloadedCourses);
|
this.setDownloadedCourses(this.downloadedCourses);
|
||||||
|
@ -219,7 +219,7 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
|
||||||
id: course.id,
|
id: course.id,
|
||||||
title: course.displayname || course.fullname,
|
title: course.displayname || course.fullname,
|
||||||
totalSize,
|
totalSize,
|
||||||
isDownloading: status === CoreConstants.DOWNLOADING,
|
isDownloading: status === DownloadStatus.DOWNLOADING,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreAnimations } from '@components/animations';
|
import { CoreAnimations } from '@components/animations';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,17 +31,17 @@ import { CoreAnimations } from '@components/animations';
|
||||||
})
|
})
|
||||||
export class CoreDownloadRefreshComponent {
|
export class CoreDownloadRefreshComponent {
|
||||||
|
|
||||||
@Input() status?: string; // Download status.
|
@Input() status?: TDownloadStatus; // Download status.
|
||||||
@Input() statusTranslatable?: string; // Download status translatable string.
|
@Input() statusTranslatable?: string; // Download status translatable string.
|
||||||
@Input() enabled = false; // Whether the download is enabled.
|
@Input() enabled = false; // Whether the download is enabled.
|
||||||
@Input() loading = true; // Force loading status when is not downloading.
|
@Input() loading = true; // Force loading status when is not downloading.
|
||||||
@Input() canTrustDownload = false; // If false, refresh will be shown if downloaded.
|
@Input() canTrustDownload = false; // If false, refresh will be shown if downloaded.
|
||||||
@Output() action: EventEmitter<boolean>; // Will emit an event when the item clicked.
|
@Output() action: EventEmitter<boolean>; // Will emit an event when the item clicked.
|
||||||
|
|
||||||
statusDownloaded = CoreConstants.DOWNLOADED;
|
statusDownloaded = DownloadStatus.DOWNLOADED;
|
||||||
statusNotDownloaded = CoreConstants.NOT_DOWNLOADED;
|
statusNotDownloaded = DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
statusOutdated = CoreConstants.OUTDATED;
|
statusOutdated = DownloadStatus.OUTDATED;
|
||||||
statusDownloading = CoreConstants.DOWNLOADING;
|
statusDownloading = DownloadStatus.DOWNLOADING;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.action = new EventEmitter();
|
this.action = new EventEmitter();
|
||||||
|
|
|
@ -23,7 +23,7 @@ import { CoreMimetypeUtils } from '@services/utils/mimetype';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CoreUtils, CoreUtilsOpenFileOptions, OpenFileAction } from '@services/utils/utils';
|
import { CoreUtils, CoreUtilsOpenFileOptions, OpenFileAction } from '@services/utils/utils';
|
||||||
import { CoreTextUtils } from '@services/utils/text';
|
import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
import { CoreWSFile } from '@services/ws';
|
import { CoreWSFile } from '@services/ws';
|
||||||
import { CorePlatform } from '@services/platform';
|
import { CorePlatform } from '@services/platform';
|
||||||
|
@ -53,7 +53,7 @@ export class CoreFileComponent implements OnInit, OnDestroy {
|
||||||
fileIcon?: string;
|
fileIcon?: string;
|
||||||
fileName!: string;
|
fileName!: string;
|
||||||
fileSizeReadable?: string;
|
fileSizeReadable?: string;
|
||||||
state?: string;
|
state?: TDownloadStatus;
|
||||||
timemodified!: number;
|
timemodified!: number;
|
||||||
isIOS = false;
|
isIOS = false;
|
||||||
openButtonIcon = '';
|
openButtonIcon = '';
|
||||||
|
@ -138,7 +138,7 @@ export class CoreFileComponent implements OnInit, OnDestroy {
|
||||||
this.canDownload = site.canDownloadFiles();
|
this.canDownload = site.canDownloadFiles();
|
||||||
|
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.isDownloading = this.canDownload && state === CoreConstants.DOWNLOADING;
|
this.isDownloading = this.canDownload && state === DownloadStatus.DOWNLOADING;
|
||||||
this.isDownloaded = this.canDownload && CoreFileHelper.isStateDownloaded(state);
|
this.isDownloaded = this.canDownload && CoreFileHelper.isStateDownloaded(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ export class CoreFileComponent implements OnInit, OnDestroy {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.canDownload || !this.state || this.state == CoreConstants.NOT_DOWNLOADABLE) {
|
if (!this.canDownload || !this.state || this.state === DownloadStatus.NOT_DOWNLOADABLE) {
|
||||||
// File cannot be downloaded, just open it.
|
// File cannot be downloaded, just open it.
|
||||||
if (CoreUrlUtils.isLocalFileUrl(this.fileUrl)) {
|
if (CoreUrlUtils.isLocalFileUrl(this.fileUrl)) {
|
||||||
CoreUtils.openFile(this.fileUrl);
|
CoreUtils.openFile(this.fileUrl);
|
||||||
|
|
|
@ -46,6 +46,38 @@ export const enum ModPurpose {
|
||||||
MOD_PURPOSE_OTHER = 'other',
|
MOD_PURPOSE_OTHER = 'other',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* eslint-disable @typescript-eslint/naming-convention */
|
||||||
|
/**
|
||||||
|
* Possible statuses for downloaded modules/files.
|
||||||
|
*/
|
||||||
|
export const DownloadedStatus = {
|
||||||
|
DOWNLOADED: 'downloaded',
|
||||||
|
DOWNLOADING: 'downloading',
|
||||||
|
OUTDATED: 'outdated',
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible statuses for not downloaded modules/files.
|
||||||
|
*/
|
||||||
|
export const NotDownloadedStatus = {
|
||||||
|
DOWNLOADABLE_NOT_DOWNLOADED: 'notdownloaded',
|
||||||
|
NOT_DOWNLOADABLE: 'notdownloadable',
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible statuses for modules regarding download.
|
||||||
|
*/
|
||||||
|
export const DownloadStatus = {
|
||||||
|
...DownloadedStatus,
|
||||||
|
...NotDownloadedStatus,
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export type TDownloadedStatus = typeof DownloadedStatus[keyof typeof DownloadedStatus];
|
||||||
|
export type TNotDownloadedStatus = typeof NotDownloadedStatus[keyof typeof NotDownloadedStatus];
|
||||||
|
export type TDownloadStatus = typeof DownloadStatus[keyof typeof DownloadStatus];
|
||||||
|
|
||||||
|
/* eslint-enable @typescript-eslint/naming-convention */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static class to contain all the core constants.
|
* Static class to contain all the core constants.
|
||||||
*/
|
*/
|
||||||
|
@ -99,11 +131,26 @@ export class CoreConstants {
|
||||||
static readonly LOGIN_LAUNCH_DATA = 'CoreLoginLaunchData';
|
static readonly LOGIN_LAUNCH_DATA = 'CoreLoginLaunchData';
|
||||||
|
|
||||||
// Download status constants.
|
// Download status constants.
|
||||||
static readonly DOWNLOADED = 'downloaded';
|
/**
|
||||||
static readonly DOWNLOADING = 'downloading';
|
* @deprecated since 4.4. Use DownloadStatus.DOWNLOADED instead.
|
||||||
static readonly NOT_DOWNLOADED = 'notdownloaded';
|
*/
|
||||||
static readonly OUTDATED = 'outdated';
|
static readonly DOWNLOADED = DownloadStatus.DOWNLOADED;
|
||||||
static readonly NOT_DOWNLOADABLE = 'notdownloadable';
|
/**
|
||||||
|
* @deprecated since 4.4. Use DownloadStatus.DOWNLOADING instead.
|
||||||
|
*/
|
||||||
|
static readonly DOWNLOADING = DownloadStatus.DOWNLOADING;
|
||||||
|
/**
|
||||||
|
* @deprecated since 4.4. Use DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED instead.
|
||||||
|
*/
|
||||||
|
static readonly NOT_DOWNLOADED = DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
|
/**
|
||||||
|
* @deprecated since 4.4. Use DownloadStatus.OUTDATED instead.
|
||||||
|
*/
|
||||||
|
static readonly OUTDATED = DownloadStatus.OUTDATED;
|
||||||
|
/**
|
||||||
|
* @deprecated since 4.4. Use DownloadStatus.NOT_DOWNLOADABLE instead.
|
||||||
|
*/
|
||||||
|
static readonly NOT_DOWNLOADABLE = DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
|
|
||||||
// Download / prefetch status icon.
|
// Download / prefetch status icon.
|
||||||
static readonly ICON_DOWNLOADED = 'fam-cloud-done';
|
static readonly ICON_DOWNLOADED = 'fam-cloud-done';
|
||||||
|
|
|
@ -32,7 +32,7 @@ import { CoreLogger } from '@singletons/logger';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreSite } from '@classes/sites/site';
|
import { CoreSite } from '@classes/sites/site';
|
||||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
import { CoreConstants } from '../constants';
|
import { DownloadStatus } from '../constants';
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
import { Translate } from '@singletons';
|
import { Translate } from '@singletons';
|
||||||
import { AsyncDirective } from '@classes/async-directive';
|
import { AsyncDirective } from '@classes/async-directive';
|
||||||
|
@ -418,7 +418,7 @@ export class CoreExternalContentDirective implements AfterViewInit, OnChanges, O
|
||||||
}
|
}
|
||||||
|
|
||||||
state = newState;
|
state = newState;
|
||||||
if (state === CoreConstants.DOWNLOADING) {
|
if (state === DownloadStatus.DOWNLOADING) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,7 +442,7 @@ export class CoreExternalContentDirective implements AfterViewInit, OnChanges, O
|
||||||
clickableEl.addEventListener(eventName, () => {
|
clickableEl.addEventListener(eventName, () => {
|
||||||
// User played media or opened a downloadable link.
|
// User played media or opened a downloadable link.
|
||||||
// Download the file if in wifi and it hasn't been downloaded already (for big files).
|
// Download the file if in wifi and it hasn't been downloaded already (for big files).
|
||||||
if (state !== CoreConstants.DOWNLOADED && state !== CoreConstants.DOWNLOADING && CoreNetwork.isWifi()) {
|
if (state !== DownloadStatus.DOWNLOADED && state !== DownloadStatus.DOWNLOADING && CoreNetwork.isWifi()) {
|
||||||
// We aren't using the result, so it doesn't matter which of the 2 functions we call.
|
// We aren't using the result, so it doesn't matter which of the 2 functions we call.
|
||||||
CoreFilepool.getUrlByUrl(site.getId(), url, this.component, this.componentId, 0, false);
|
CoreFilepool.getUrlByUrl(site.getId(), url, this.component, this.componentId, 0, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ import { getXAPIServices } from '@features/xapi/xapi.module';
|
||||||
import { DomSanitizer } from '@angular/platform-browser';
|
import { DomSanitizer } from '@angular/platform-browser';
|
||||||
import { FormBuilder, Validators } from '@angular/forms';
|
import { FormBuilder, Validators } from '@angular/forms';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus } from '@/core/constants';
|
||||||
import moment from 'moment-timezone';
|
import moment from 'moment-timezone';
|
||||||
import { Md5 } from 'ts-md5/dist/md5';
|
import { Md5 } from 'ts-md5/dist/md5';
|
||||||
|
|
||||||
|
@ -305,6 +305,7 @@ export class CoreCompileProvider {
|
||||||
instance['injector'] = this.injector;
|
instance['injector'] = this.injector;
|
||||||
instance['Validators'] = Validators;
|
instance['Validators'] = Validators;
|
||||||
instance['CoreConstants'] = CoreConstants;
|
instance['CoreConstants'] = CoreConstants;
|
||||||
|
instance['DownloadStatus'] = DownloadStatus;
|
||||||
instance['CoreConfigConstants'] = CoreConstants.CONFIG;
|
instance['CoreConfigConstants'] = CoreConstants.CONFIG;
|
||||||
instance['CoreEventsProvider'] = CoreEvents;
|
instance['CoreEventsProvider'] = CoreEvents;
|
||||||
instance['CoreLoggerProvider'] = CoreLogger;
|
instance['CoreLoggerProvider'] = CoreLogger;
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { CoreNetworkError } from '@classes/errors/network-error';
|
import { CoreNetworkError } from '@classes/errors/network-error';
|
||||||
import { CoreFilterHelper } from '@features/filter/services/filter-helper';
|
import { CoreFilterHelper } from '@features/filter/services/filter-helper';
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
|
@ -150,7 +150,7 @@ export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefe
|
||||||
setDownloaded(id: number, siteId?: string, extra?: string): Promise<void> {
|
setDownloaded(id: number, siteId?: string, extra?: string): Promise<void> {
|
||||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
return CoreFilepool.storePackageStatus(siteId, CoreConstants.DOWNLOADED, this.component, id, extra);
|
return CoreFilepool.storePackageStatus(siteId, DownloadStatus.DOWNLOADED, this.component, id, extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,7 +163,7 @@ export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefe
|
||||||
setDownloading(id: number, siteId?: string): Promise<void> {
|
setDownloading(id: number, siteId?: string): Promise<void> {
|
||||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
return CoreFilepool.storePackageStatus(siteId, CoreConstants.DOWNLOADING, this.component, id);
|
return CoreFilepool.storePackageStatus(siteId, DownloadStatus.DOWNLOADING, this.component, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { OnInit, OnDestroy, Input, Output, EventEmitter, Component, Optional, Inject } from '@angular/core';
|
import { OnInit, OnDestroy, Input, Output, EventEmitter, Component, Optional, Inject } from '@angular/core';
|
||||||
import { CoreAnyError } from '@classes/errors/error';
|
import { CoreAnyError } from '@classes/errors/error';
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
|
@ -65,7 +65,7 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy,
|
||||||
protected isCurrentView = false; // Whether the component is in the current view.
|
protected isCurrentView = false; // Whether the component is in the current view.
|
||||||
protected siteId?: string; // Current Site ID.
|
protected siteId?: string; // Current Site ID.
|
||||||
protected statusObserver?: CoreEventObserver; // Observer of package status. Only if setStatusListener is called.
|
protected statusObserver?: CoreEventObserver; // Observer of package status. Only if setStatusListener is called.
|
||||||
currentStatus?: string; // The current status of the module. Only if setStatusListener is called.
|
currentStatus?: TDownloadStatus; // The current status of the module. Only if setStatusListener is called.
|
||||||
downloadTimeReadable?: string; // Last download time in a readable format. Only if setStatusListener is called.
|
downloadTimeReadable?: string; // Last download time in a readable format. Only if setStatusListener is called.
|
||||||
|
|
||||||
protected completionObserver?: CoreEventObserver;
|
protected completionObserver?: CoreEventObserver;
|
||||||
|
@ -242,7 +242,8 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy,
|
||||||
* @returns If module has been prefetched.
|
* @returns If module has been prefetched.
|
||||||
*/
|
*/
|
||||||
protected isPrefetched(): boolean {
|
protected isPrefetched(): boolean {
|
||||||
return this.currentStatus != CoreConstants.NOT_DOWNLOADABLE && this.currentStatus != CoreConstants.NOT_DOWNLOADED;
|
return this.currentStatus !== DownloadStatus.NOT_DOWNLOADABLE &&
|
||||||
|
this.currentStatus !== DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -281,7 +282,7 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy,
|
||||||
* @param previousStatus The previous status. If not defined, there is no previous status.
|
* @param previousStatus The previous status. If not defined, there is no previous status.
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
protected showStatus(status: string, previousStatus?: string): void {
|
protected showStatus(status: TDownloadStatus, previousStatus?: TDownloadStatus): void {
|
||||||
// To be overridden.
|
// To be overridden.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,7 +346,7 @@ export class CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy,
|
||||||
// Get module status to determine if it needs to be downloaded.
|
// Get module status to determine if it needs to be downloaded.
|
||||||
await this.setStatusListener(refresh);
|
await this.setStatusListener(refresh);
|
||||||
|
|
||||||
if (this.currentStatus != CoreConstants.DOWNLOADED) {
|
if (this.currentStatus !== DownloadStatus.DOWNLOADED) {
|
||||||
// Download content. This function also loads module contents if needed.
|
// Download content. This function also loads module contents if needed.
|
||||||
try {
|
try {
|
||||||
await CoreCourseModulePrefetchDelegate.downloadModule(this.module, this.courseId);
|
await CoreCourseModulePrefetchDelegate.downloadModule(this.module, this.courseId);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus } from '@/core/constants';
|
||||||
import { AddonBlog } from '@addons/blog/services/blog';
|
import { AddonBlog } from '@addons/blog/services/blog';
|
||||||
import { AddonBlogMainMenuHandlerService } from '@addons/blog/services/handlers/mainmenu';
|
import { AddonBlogMainMenuHandlerService } from '@addons/blog/services/handlers/mainmenu';
|
||||||
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
||||||
|
@ -216,15 +216,15 @@ export class CoreCourseModuleSummaryComponent implements OnInit, OnDestroy {
|
||||||
const moduleInfo =
|
const moduleInfo =
|
||||||
await CoreCourseHelper.getModulePrefetchInfo(this.module, this.courseId, refresh, this.component);
|
await CoreCourseHelper.getModulePrefetchInfo(this.module, this.courseId, refresh, this.component);
|
||||||
|
|
||||||
this.canPrefetch = moduleInfo.status != CoreConstants.NOT_DOWNLOADABLE;
|
this.canPrefetch = moduleInfo.status !== DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
this.downloadTimeReadable = '';
|
this.downloadTimeReadable = '';
|
||||||
|
|
||||||
if (this.canPrefetch) {
|
if (this.canPrefetch) {
|
||||||
if (moduleInfo.downloadTime && moduleInfo.downloadTime > 0) {
|
if (moduleInfo.downloadTime && moduleInfo.downloadTime > 0) {
|
||||||
this.downloadTimeReadable = CoreTextUtils.ucFirst(moduleInfo.downloadTimeReadable);
|
this.downloadTimeReadable = CoreTextUtils.ucFirst(moduleInfo.downloadTimeReadable);
|
||||||
}
|
}
|
||||||
this.prefetchLoading = moduleInfo.status == CoreConstants.DOWNLOADING;
|
this.prefetchLoading = moduleInfo.status === DownloadStatus.DOWNLOADING;
|
||||||
this.prefetchDisabled = moduleInfo.status == CoreConstants.DOWNLOADED;
|
this.prefetchDisabled = moduleInfo.status === DownloadStatus.DOWNLOADED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (moduleInfo.size && moduleInfo.size > 0) {
|
if (moduleInfo.size && moduleInfo.size > 0) {
|
||||||
|
|
|
@ -27,7 +27,7 @@ import {
|
||||||
CoreCourseModulePrefetchDelegate,
|
CoreCourseModulePrefetchDelegate,
|
||||||
CoreCourseModulePrefetchHandler,
|
CoreCourseModulePrefetchHandler,
|
||||||
} from '@features/course/services/module-prefetch-delegate';
|
} from '@features/course/services/module-prefetch-delegate';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
import { BehaviorSubject } from 'rxjs';
|
import { BehaviorSubject } from 'rxjs';
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.showDownloadStatus && this.module.handlerData.showDownloadButton) {
|
if (this.showDownloadStatus && this.module.handlerData.showDownloadButton) {
|
||||||
const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(this.module, this.module.course);
|
const status = await CoreCourseModulePrefetchDelegate.getDownloadedModuleStatus(this.module, this.module.course);
|
||||||
this.updateModuleStatus(status);
|
this.updateModuleStatus(status);
|
||||||
|
|
||||||
// Listen for changes on this module status, even if download isn't enabled.
|
// Listen for changes on this module status, even if download isn't enabled.
|
||||||
|
@ -144,19 +144,19 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
/**
|
/**
|
||||||
* Show module status.
|
* Show module status.
|
||||||
*
|
*
|
||||||
* @param prefetchstatus Module status.
|
* @param prefetchStatus Module status.
|
||||||
*/
|
*/
|
||||||
protected updateModuleStatus(prefetchstatus: string): void {
|
protected updateModuleStatus(prefetchStatus: TDownloadStatus | null): void {
|
||||||
if (!prefetchstatus) {
|
if (!prefetchStatus) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (prefetchstatus) {
|
switch (prefetchStatus) {
|
||||||
case CoreConstants.OUTDATED:
|
case DownloadStatus.OUTDATED:
|
||||||
this.prefetchStatusIcon$.next(CoreConstants.ICON_OUTDATED);
|
this.prefetchStatusIcon$.next(CoreConstants.ICON_OUTDATED);
|
||||||
this.prefetchStatusText$.next('core.outdated');
|
this.prefetchStatusText$.next('core.outdated');
|
||||||
break;
|
break;
|
||||||
case CoreConstants.DOWNLOADED:
|
case DownloadStatus.DOWNLOADED:
|
||||||
this.prefetchStatusIcon$.next(CoreConstants.ICON_DOWNLOADED);
|
this.prefetchStatusIcon$.next(CoreConstants.ICON_DOWNLOADED);
|
||||||
this.prefetchStatusText$.next('core.downloaded');
|
this.prefetchStatusText$.next('core.downloaded');
|
||||||
break;
|
break;
|
||||||
|
@ -166,7 +166,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.module.handlerData?.updateStatus?.(prefetchstatus);
|
this.module.handlerData?.updateStatus?.(prefetchStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,7 +28,7 @@ import {
|
||||||
CoreCourseModuleCompletionStatus,
|
CoreCourseModuleCompletionStatus,
|
||||||
CoreCourseGetContentsWSModule,
|
CoreCourseGetContentsWSModule,
|
||||||
} from './course';
|
} from './course';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import { ApplicationInit, makeSingleton, Translate } from '@singletons';
|
import { ApplicationInit, makeSingleton, Translate } from '@singletons';
|
||||||
import { CoreFilepool } from '@services/filepool';
|
import { CoreFilepool } from '@services/filepool';
|
||||||
|
@ -82,7 +82,7 @@ import { LazyRoutesModule } from '@/app/app-routing.module';
|
||||||
export type CoreCourseModulePrefetchInfo = CoreCourseModulePackageLastDownloaded & {
|
export type CoreCourseModulePrefetchInfo = CoreCourseModulePackageLastDownloaded & {
|
||||||
size: number; // Downloaded size.
|
size: number; // Downloaded size.
|
||||||
sizeReadable: string; // Downloadable size in a readable format.
|
sizeReadable: string; // Downloadable size in a readable format.
|
||||||
status: string; // Module status.
|
status: TDownloadStatus; // Module status.
|
||||||
statusIcon?: string; // Icon's name of the module status.
|
statusIcon?: string; // Icon's name of the module status.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ export type CoreCourseCoursesProgress = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CorePrefetchStatusInfo = {
|
export type CorePrefetchStatusInfo = {
|
||||||
status: string; // Status of the prefetch.
|
status: TDownloadStatus; // Status of the prefetch.
|
||||||
statusTranslatable: string; // Status translatable string.
|
statusTranslatable: string; // Status translatable string.
|
||||||
icon: string; // Icon based on the status.
|
icon: string; // Icon based on the status.
|
||||||
loading: boolean; // If it's a loading status.
|
loading: boolean; // If it's a loading status.
|
||||||
|
@ -291,13 +291,13 @@ export class CoreCourseHelperProvider {
|
||||||
// Check if it's being downloaded.
|
// Check if it's being downloaded.
|
||||||
const downloadId = this.getSectionDownloadId(section);
|
const downloadId = this.getSectionDownloadId(section);
|
||||||
if (CoreCourseModulePrefetchDelegate.isBeingDownloaded(downloadId)) {
|
if (CoreCourseModulePrefetchDelegate.isBeingDownloaded(downloadId)) {
|
||||||
result.status = CoreConstants.DOWNLOADING;
|
result.status = DownloadStatus.DOWNLOADING;
|
||||||
}
|
}
|
||||||
|
|
||||||
sectionWithStatus.downloadStatus = result.status;
|
sectionWithStatus.downloadStatus = result.status;
|
||||||
|
|
||||||
// Set this section data.
|
// Set this section data.
|
||||||
if (result.status !== CoreConstants.DOWNLOADING) {
|
if (result.status !== DownloadStatus.DOWNLOADING) {
|
||||||
sectionWithStatus.isDownloading = false;
|
sectionWithStatus.isDownloading = false;
|
||||||
sectionWithStatus.total = 0;
|
sectionWithStatus.total = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -328,7 +328,7 @@ export class CoreCourseHelperProvider {
|
||||||
checkUpdates: boolean = true,
|
checkUpdates: boolean = true,
|
||||||
): Promise<CoreCourseSectionWithStatus[]> {
|
): Promise<CoreCourseSectionWithStatus[]> {
|
||||||
let allSectionsSection: CoreCourseSectionWithStatus | undefined;
|
let allSectionsSection: CoreCourseSectionWithStatus | undefined;
|
||||||
let allSectionsStatus = CoreConstants.NOT_DOWNLOADABLE;
|
let allSectionsStatus = DownloadStatus.NOT_DOWNLOADABLE as TDownloadStatus;
|
||||||
|
|
||||||
const promises = sections.map(async (section: CoreCourseSectionWithStatus) => {
|
const promises = sections.map(async (section: CoreCourseSectionWithStatus) => {
|
||||||
section.isCalculating = true;
|
section.isCalculating = true;
|
||||||
|
@ -356,7 +356,7 @@ export class CoreCourseHelperProvider {
|
||||||
if (allSectionsSection) {
|
if (allSectionsSection) {
|
||||||
// Set "All sections" data.
|
// Set "All sections" data.
|
||||||
allSectionsSection.downloadStatus = allSectionsStatus;
|
allSectionsSection.downloadStatus = allSectionsStatus;
|
||||||
allSectionsSection.isDownloading = allSectionsStatus === CoreConstants.DOWNLOADING;
|
allSectionsSection.isDownloading = allSectionsStatus === DownloadStatus.DOWNLOADING;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sections;
|
return sections;
|
||||||
|
@ -389,7 +389,7 @@ export class CoreCourseHelperProvider {
|
||||||
|
|
||||||
data.downloadSucceeded = false;
|
data.downloadSucceeded = false;
|
||||||
data.icon = CoreConstants.ICON_DOWNLOADING;
|
data.icon = CoreConstants.ICON_DOWNLOADING;
|
||||||
data.status = CoreConstants.DOWNLOADING;
|
data.status = DownloadStatus.DOWNLOADING;
|
||||||
data.loading = true;
|
data.loading = true;
|
||||||
data.statusTranslatable = 'core.downloading';
|
data.statusTranslatable = 'core.downloading';
|
||||||
|
|
||||||
|
@ -632,9 +632,9 @@ export class CoreCourseHelperProvider {
|
||||||
* @param courses Courses
|
* @param courses Courses
|
||||||
* @returns Promise resolved with the status.
|
* @returns Promise resolved with the status.
|
||||||
*/
|
*/
|
||||||
async determineCoursesStatus(courses: CoreCourseBasicData[]): Promise<string> {
|
async determineCoursesStatus(courses: CoreCourseBasicData[]): Promise<TDownloadStatus> {
|
||||||
// Get the status of each course.
|
// Get the status of each course.
|
||||||
const promises: Promise<string>[] = [];
|
const promises: Promise<TDownloadStatus>[] = [];
|
||||||
const siteId = CoreSites.getCurrentSiteId();
|
const siteId = CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
courses.forEach((course) => {
|
courses.forEach((course) => {
|
||||||
|
@ -724,12 +724,12 @@ export class CoreCourseHelperProvider {
|
||||||
// Error opening the file, some apps don't allow opening online files.
|
// Error opening the file, some apps don't allow opening online files.
|
||||||
if (!CoreFile.isAvailable()) {
|
if (!CoreFile.isAvailable()) {
|
||||||
throw error;
|
throw error;
|
||||||
} else if (result.status === CoreConstants.DOWNLOADING) {
|
} else if (result.status === DownloadStatus.DOWNLOADING) {
|
||||||
throw new CoreError(Translate.instant('core.erroropenfiledownloading'));
|
throw new CoreError(Translate.instant('core.erroropenfiledownloading'));
|
||||||
}
|
}
|
||||||
|
|
||||||
let path: string | undefined;
|
let path: string | undefined;
|
||||||
if (result.status === CoreConstants.NOT_DOWNLOADED) {
|
if (result.status === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// Not downloaded, download it now and return the local file.
|
// Not downloaded, download it now and return the local file.
|
||||||
await this.downloadModule(module, courseId, component, componentId, files, siteId);
|
await this.downloadModule(module, courseId, component, componentId, files, siteId);
|
||||||
|
|
||||||
|
@ -817,7 +817,7 @@ export class CoreCourseHelperProvider {
|
||||||
files?: CoreCourseModuleContentFile[],
|
files?: CoreCourseModuleContentFile[],
|
||||||
siteId?: string,
|
siteId?: string,
|
||||||
options: CoreUtilsOpenFileOptions = {},
|
options: CoreUtilsOpenFileOptions = {},
|
||||||
): Promise<{ fixedUrl: string; path: string; status?: string }> {
|
): Promise<{ fixedUrl: string; path: string; status?: TDownloadStatus }> {
|
||||||
|
|
||||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
|
@ -843,16 +843,16 @@ export class CoreCourseHelperProvider {
|
||||||
|
|
||||||
let path = '';
|
let path = '';
|
||||||
|
|
||||||
if (status === CoreConstants.DOWNLOADING) {
|
if (status === DownloadStatus.DOWNLOADING) {
|
||||||
// Use the online URL.
|
// Use the online URL.
|
||||||
path = fixedUrl;
|
path = fixedUrl;
|
||||||
} else if (status === CoreConstants.DOWNLOADED) {
|
} else if (status === DownloadStatus.DOWNLOADED) {
|
||||||
try {
|
try {
|
||||||
// Get the local file URL.
|
// Get the local file URL.
|
||||||
path = await CoreFilepool.getInternalUrlByUrl(siteId, mainFile.fileurl);
|
path = await CoreFilepool.getInternalUrlByUrl(siteId, mainFile.fileurl);
|
||||||
} catch (error){
|
} catch (error){
|
||||||
// File not found, mark the module as not downloaded.
|
// File not found, mark the module as not downloaded.
|
||||||
await CoreFilepool.storePackageStatus(siteId, CoreConstants.NOT_DOWNLOADED, component, componentId);
|
await CoreFilepool.storePackageStatus(siteId, DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED, component, componentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -870,7 +870,7 @@ export class CoreCourseHelperProvider {
|
||||||
options,
|
options,
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (status !== CoreConstants.OUTDATED) {
|
if (status !== DownloadStatus.OUTDATED) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -910,7 +910,7 @@ export class CoreCourseHelperProvider {
|
||||||
courseId: number,
|
courseId: number,
|
||||||
fixedUrl: string,
|
fixedUrl: string,
|
||||||
files: CoreCourseModuleContentFile[],
|
files: CoreCourseModuleContentFile[],
|
||||||
status: string,
|
status: TDownloadStatus,
|
||||||
component?: string,
|
component?: string,
|
||||||
componentId?: string | number,
|
componentId?: string | number,
|
||||||
siteId?: string,
|
siteId?: string,
|
||||||
|
@ -922,7 +922,7 @@ export class CoreCourseHelperProvider {
|
||||||
const mainFile = files[0];
|
const mainFile = files[0];
|
||||||
const timemodified = mainFile.timemodified || 0;
|
const timemodified = mainFile.timemodified || 0;
|
||||||
|
|
||||||
if (!isOnline && status === CoreConstants.NOT_DOWNLOADED) {
|
if (!isOnline && status === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// Not downloaded and we're offline, reject.
|
// Not downloaded and we're offline, reject.
|
||||||
throw new CoreNetworkError();
|
throw new CoreNetworkError();
|
||||||
}
|
}
|
||||||
|
@ -1239,7 +1239,7 @@ export class CoreCourseHelperProvider {
|
||||||
* @param status Course status.
|
* @param status Course status.
|
||||||
* @returns Prefetch status info.
|
* @returns Prefetch status info.
|
||||||
*/
|
*/
|
||||||
getCoursePrefetchStatusInfo(status: string): CorePrefetchStatusInfo {
|
getCoursePrefetchStatusInfo(status: TDownloadStatus): CorePrefetchStatusInfo {
|
||||||
const prefetchStatus: CorePrefetchStatusInfo = {
|
const prefetchStatus: CorePrefetchStatusInfo = {
|
||||||
status: status,
|
status: status,
|
||||||
icon: this.getPrefetchStatusIcon(status, false),
|
icon: this.getPrefetchStatusIcon(status, false),
|
||||||
|
@ -1247,10 +1247,10 @@ export class CoreCourseHelperProvider {
|
||||||
loading: false,
|
loading: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (status == CoreConstants.DOWNLOADED) {
|
if (status === DownloadStatus.DOWNLOADED) {
|
||||||
// Always show refresh icon, we cannot know if there's anything new in course options.
|
// Always show refresh icon, we cannot know if there's anything new in course options.
|
||||||
prefetchStatus.statusTranslatable = 'core.course.refreshcourse';
|
prefetchStatus.statusTranslatable = 'core.course.refreshcourse';
|
||||||
} else if (status == CoreConstants.DOWNLOADING) {
|
} else if (status === DownloadStatus.DOWNLOADING) {
|
||||||
prefetchStatus.statusTranslatable = 'core.downloading';
|
prefetchStatus.statusTranslatable = 'core.downloading';
|
||||||
prefetchStatus.loading = true;
|
prefetchStatus.loading = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1266,7 +1266,7 @@ export class CoreCourseHelperProvider {
|
||||||
* @param status Courses status.
|
* @param status Courses status.
|
||||||
* @returns Prefetch status info.
|
* @returns Prefetch status info.
|
||||||
*/
|
*/
|
||||||
getCoursesPrefetchStatusInfo(status: string): CorePrefetchStatusInfo {
|
getCoursesPrefetchStatusInfo(status: TDownloadStatus): CorePrefetchStatusInfo {
|
||||||
const prefetchStatus: CorePrefetchStatusInfo = {
|
const prefetchStatus: CorePrefetchStatusInfo = {
|
||||||
status: status,
|
status: status,
|
||||||
icon: this.getPrefetchStatusIcon(status, false),
|
icon: this.getPrefetchStatusIcon(status, false),
|
||||||
|
@ -1274,10 +1274,10 @@ export class CoreCourseHelperProvider {
|
||||||
loading: false,
|
loading: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (status == CoreConstants.DOWNLOADED) {
|
if (status === DownloadStatus.DOWNLOADED) {
|
||||||
// Always show refresh icon, we cannot know if there's anything new in course options.
|
// Always show refresh icon, we cannot know if there's anything new in course options.
|
||||||
prefetchStatus.statusTranslatable = 'core.courses.refreshcourses';
|
prefetchStatus.statusTranslatable = 'core.courses.refreshcourses';
|
||||||
} else if (status == CoreConstants.DOWNLOADING) {
|
} else if (status === DownloadStatus.DOWNLOADING) {
|
||||||
prefetchStatus.statusTranslatable = 'core.downloading';
|
prefetchStatus.statusTranslatable = 'core.downloading';
|
||||||
prefetchStatus.loading = true;
|
prefetchStatus.loading = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1294,17 +1294,17 @@ export class CoreCourseHelperProvider {
|
||||||
* @param trustDownload True to show download success, false to show an outdated status when downloaded.
|
* @param trustDownload True to show download success, false to show an outdated status when downloaded.
|
||||||
* @returns Icon name.
|
* @returns Icon name.
|
||||||
*/
|
*/
|
||||||
getPrefetchStatusIcon(status: string, trustDownload: boolean = false): string {
|
getPrefetchStatusIcon(status: TDownloadStatus, trustDownload: boolean = false): string {
|
||||||
if (status == CoreConstants.NOT_DOWNLOADED) {
|
if (status === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
return CoreConstants.ICON_NOT_DOWNLOADED;
|
return CoreConstants.ICON_NOT_DOWNLOADED;
|
||||||
}
|
}
|
||||||
if (status == CoreConstants.OUTDATED || (status == CoreConstants.DOWNLOADED && !trustDownload)) {
|
if (status === DownloadStatus.OUTDATED || (status === DownloadStatus.DOWNLOADED && !trustDownload)) {
|
||||||
return CoreConstants.ICON_OUTDATED;
|
return CoreConstants.ICON_OUTDATED;
|
||||||
}
|
}
|
||||||
if (status == CoreConstants.DOWNLOADED && trustDownload) {
|
if (status === DownloadStatus.DOWNLOADED && trustDownload) {
|
||||||
return CoreConstants.ICON_DOWNLOADED;
|
return CoreConstants.ICON_DOWNLOADED;
|
||||||
}
|
}
|
||||||
if (status == CoreConstants.DOWNLOADING) {
|
if (status === DownloadStatus.DOWNLOADING) {
|
||||||
return CoreConstants.ICON_DOWNLOADING;
|
return CoreConstants.ICON_DOWNLOADING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1348,16 +1348,16 @@ export class CoreCourseHelperProvider {
|
||||||
const status = results[1];
|
const status = results[1];
|
||||||
let statusIcon: string | undefined;
|
let statusIcon: string | undefined;
|
||||||
switch (results[1]) {
|
switch (results[1]) {
|
||||||
case CoreConstants.NOT_DOWNLOADED:
|
case DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED:
|
||||||
statusIcon = CoreConstants.ICON_NOT_DOWNLOADED;
|
statusIcon = CoreConstants.ICON_NOT_DOWNLOADED;
|
||||||
break;
|
break;
|
||||||
case CoreConstants.DOWNLOADING:
|
case DownloadStatus.DOWNLOADING:
|
||||||
statusIcon = CoreConstants.ICON_DOWNLOADING;
|
statusIcon = CoreConstants.ICON_DOWNLOADING;
|
||||||
break;
|
break;
|
||||||
case CoreConstants.OUTDATED:
|
case DownloadStatus.OUTDATED:
|
||||||
statusIcon = CoreConstants.ICON_OUTDATED;
|
statusIcon = CoreConstants.ICON_OUTDATED;
|
||||||
break;
|
break;
|
||||||
case CoreConstants.DOWNLOADED:
|
case DownloadStatus.DOWNLOADED:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
statusIcon = '';
|
statusIcon = '';
|
||||||
|
@ -1391,7 +1391,12 @@ export class CoreCourseHelperProvider {
|
||||||
const packageData = await CoreUtils.ignoreErrors(CoreFilepool.getPackageData(siteId, component, module.id));
|
const packageData = await CoreUtils.ignoreErrors(CoreFilepool.getPackageData(siteId, component, module.id));
|
||||||
|
|
||||||
// Treat download time.
|
// Treat download time.
|
||||||
if (!packageData || !packageData.downloadTime || !CoreFileHelper.isStateDownloaded(packageData.status || '')) {
|
if (
|
||||||
|
!packageData ||
|
||||||
|
!packageData.downloadTime ||
|
||||||
|
!packageData.status ||
|
||||||
|
!CoreFileHelper.isStateDownloaded(packageData.status)
|
||||||
|
) {
|
||||||
// Not downloaded.
|
// Not downloaded.
|
||||||
return {
|
return {
|
||||||
downloadTime: 0,
|
downloadTime: 0,
|
||||||
|
@ -1598,7 +1603,7 @@ export class CoreCourseHelperProvider {
|
||||||
// First of all, mark the course as being downloaded.
|
// First of all, mark the course as being downloaded.
|
||||||
this.courseDwnPromises[requiredSiteId][course.id] = CoreCourse.setCourseStatus(
|
this.courseDwnPromises[requiredSiteId][course.id] = CoreCourse.setCourseStatus(
|
||||||
course.id,
|
course.id,
|
||||||
CoreConstants.DOWNLOADING,
|
DownloadStatus.DOWNLOADING,
|
||||||
requiredSiteId,
|
requiredSiteId,
|
||||||
).then(async () => {
|
).then(async () => {
|
||||||
|
|
||||||
|
@ -1636,7 +1641,7 @@ export class CoreCourseHelperProvider {
|
||||||
await CoreUtils.allPromises(promises);
|
await CoreUtils.allPromises(promises);
|
||||||
|
|
||||||
// Download success, mark the course as downloaded.
|
// Download success, mark the course as downloaded.
|
||||||
return CoreCourse.setCourseStatus(course.id, CoreConstants.DOWNLOADED, requiredSiteId);
|
return CoreCourse.setCourseStatus(course.id, DownloadStatus.DOWNLOADED, requiredSiteId);
|
||||||
}).catch(async (error) => {
|
}).catch(async (error) => {
|
||||||
// Error, restore previous status.
|
// Error, restore previous status.
|
||||||
await CoreCourse.setCoursePreviousStatus(course.id, requiredSiteId);
|
await CoreCourse.setCoursePreviousStatus(course.id, requiredSiteId);
|
||||||
|
@ -1709,7 +1714,7 @@ export class CoreCourseHelperProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Download all the sections except "All sections".
|
// Download all the sections except "All sections".
|
||||||
let allSectionsStatus = CoreConstants.NOT_DOWNLOADABLE;
|
let allSectionsStatus = DownloadStatus.NOT_DOWNLOADABLE as TDownloadStatus;
|
||||||
|
|
||||||
section.isDownloading = true;
|
section.isDownloading = true;
|
||||||
const promises = sections.map(async (section) => {
|
const promises = sections.map(async (section) => {
|
||||||
|
@ -1733,7 +1738,7 @@ export class CoreCourseHelperProvider {
|
||||||
|
|
||||||
// Set "All sections" data.
|
// Set "All sections" data.
|
||||||
section.downloadStatus = allSectionsStatus;
|
section.downloadStatus = allSectionsStatus;
|
||||||
section.isDownloading = allSectionsStatus === CoreConstants.DOWNLOADING;
|
section.isDownloading = allSectionsStatus === DownloadStatus.DOWNLOADING;
|
||||||
} finally {
|
} finally {
|
||||||
section.isDownloading = false;
|
section.isDownloading = false;
|
||||||
}
|
}
|
||||||
|
@ -1787,7 +1792,7 @@ export class CoreCourseHelperProvider {
|
||||||
// Validate the section needs to be downloaded and calculate amount of modules that need to be downloaded.
|
// Validate the section needs to be downloaded and calculate amount of modules that need to be downloaded.
|
||||||
const result = await CoreCourseModulePrefetchDelegate.getModulesStatus(section.modules, courseId, section.id);
|
const result = await CoreCourseModulePrefetchDelegate.getModulesStatus(section.modules, courseId, section.id);
|
||||||
|
|
||||||
if (result.status == CoreConstants.DOWNLOADED || result.status == CoreConstants.NOT_DOWNLOADABLE) {
|
if (result.status === DownloadStatus.DOWNLOADED || result.status === DownloadStatus.NOT_DOWNLOADABLE) {
|
||||||
// Section is downloaded or not downloadable, nothing to do.
|
// Section is downloaded or not downloadable, nothing to do.
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
@ -1819,8 +1824,8 @@ export class CoreCourseHelperProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// We only download modules with status notdownloaded, downloading or outdated.
|
// We only download modules with status notdownloaded, downloading or outdated.
|
||||||
const modules = result[CoreConstants.OUTDATED].concat(result[CoreConstants.NOT_DOWNLOADED])
|
const modules = result[DownloadStatus.OUTDATED].concat(result[DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED])
|
||||||
.concat(result[CoreConstants.DOWNLOADING]);
|
.concat(result[DownloadStatus.DOWNLOADING]);
|
||||||
const downloadId = this.getSectionDownloadId(section);
|
const downloadId = this.getSectionDownloadId(section);
|
||||||
|
|
||||||
section.isDownloading = true;
|
section.isDownloading = true;
|
||||||
|
@ -1914,7 +1919,7 @@ export class CoreCourseHelperProvider {
|
||||||
modules.map((module) => this.removeModuleStoredData(module, courseId)),
|
modules.map((module) => this.removeModuleStoredData(module, courseId)),
|
||||||
);
|
);
|
||||||
|
|
||||||
await CoreCourse.setCourseStatus(courseId, CoreConstants.NOT_DOWNLOADED);
|
await CoreCourse.setCourseStatus(courseId, DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2068,7 +2073,7 @@ export type CoreCourseSection = CoreCourseWSSection & {
|
||||||
* Section with data about prefetch.
|
* Section with data about prefetch.
|
||||||
*/
|
*/
|
||||||
export type CoreCourseSectionWithStatus = CoreCourseSection & {
|
export type CoreCourseSectionWithStatus = CoreCourseSection & {
|
||||||
downloadStatus?: string; // Section status.
|
downloadStatus?: TDownloadStatus; // Section status.
|
||||||
isDownloading?: boolean; // Whether section is being downloaded.
|
isDownloading?: boolean; // Whether section is being downloaded.
|
||||||
total?: number; // Total of modules being downloaded.
|
total?: number; // Total of modules being downloaded.
|
||||||
count?: number; // Number of downloaded modules.
|
count?: number; // Number of downloaded modules.
|
||||||
|
|
|
@ -22,7 +22,7 @@ import { CoreSitesCommonWSOptions, CoreSites, CoreSitesReadingStrategy } from '@
|
||||||
import { CoreTimeUtils } from '@services/utils/time';
|
import { CoreTimeUtils } from '@services/utils/time';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreSite } from '@classes/sites/site';
|
import { CoreSite } from '@classes/sites/site';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { makeSingleton, Translate } from '@singletons';
|
import { makeSingleton, Translate } from '@singletons';
|
||||||
import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
|
import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
|
||||||
|
|
||||||
|
@ -268,7 +268,11 @@ export class CoreCourseProvider {
|
||||||
this.logger.debug('Clear all course status for site ' + site.id);
|
this.logger.debug('Clear all course status for site ' + site.id);
|
||||||
|
|
||||||
await this.statusTables[site.getId()].delete();
|
await this.statusTables[site.getId()].delete();
|
||||||
this.triggerCourseStatusChanged(CoreCourseProvider.ALL_COURSES_CLEARED, CoreConstants.NOT_DOWNLOADED, site.id);
|
this.triggerCourseStatusChanged(
|
||||||
|
CoreCourseProvider.ALL_COURSES_CLEARED,
|
||||||
|
DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
|
site.id,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -473,13 +477,13 @@ export class CoreCourseProvider {
|
||||||
* @param siteId Site ID. If not defined, current site.
|
* @param siteId Site ID. If not defined, current site.
|
||||||
* @returns Promise resolved with the status.
|
* @returns Promise resolved with the status.
|
||||||
*/
|
*/
|
||||||
async getCourseStatus(courseId: number, siteId?: string): Promise<string> {
|
async getCourseStatus(courseId: number, siteId?: string): Promise<TDownloadStatus> {
|
||||||
try {
|
try {
|
||||||
const entry = await this.getCourseStatusData(courseId, siteId);
|
const entry = await this.getCourseStatusData(courseId, siteId);
|
||||||
|
|
||||||
return entry.status || CoreConstants.NOT_DOWNLOADED;
|
return entry.status || DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
} catch {
|
} catch {
|
||||||
return CoreConstants.NOT_DOWNLOADED;
|
return DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,7 +494,8 @@ export class CoreCourseProvider {
|
||||||
* @returns Resolves with an array containing downloaded course ids.
|
* @returns Resolves with an array containing downloaded course ids.
|
||||||
*/
|
*/
|
||||||
async getDownloadedCourseIds(siteId?: string): Promise<number[]> {
|
async getDownloadedCourseIds(siteId?: string): Promise<number[]> {
|
||||||
const downloadedStatuses = [CoreConstants.DOWNLOADED, CoreConstants.DOWNLOADING, CoreConstants.OUTDATED];
|
const downloadedStatuses: TDownloadStatus[] =
|
||||||
|
[DownloadStatus.DOWNLOADED, DownloadStatus.DOWNLOADING, DownloadStatus.OUTDATED];
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
const entries = await this.statusTables[site.getId()].getManyWhere({
|
const entries = await this.statusTables[site.getId()].getManyWhere({
|
||||||
sql: 'status IN (?,?,?)',
|
sql: 'status IN (?,?,?)',
|
||||||
|
@ -1398,7 +1403,7 @@ export class CoreCourseProvider {
|
||||||
* @param siteId Site ID. If not defined, current site.
|
* @param siteId Site ID. If not defined, current site.
|
||||||
* @returns Promise resolved when the status is changed. Resolve param: new status.
|
* @returns Promise resolved when the status is changed. Resolve param: new status.
|
||||||
*/
|
*/
|
||||||
async setCoursePreviousStatus(courseId: number, siteId?: string): Promise<string> {
|
async setCoursePreviousStatus(courseId: number, siteId?: string): Promise<TDownloadStatus> {
|
||||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
this.logger.debug(`Set previous status for course ${courseId} in site ${siteId}`);
|
this.logger.debug(`Set previous status for course ${courseId} in site ${siteId}`);
|
||||||
|
@ -1410,10 +1415,10 @@ export class CoreCourseProvider {
|
||||||
|
|
||||||
const newData = {
|
const newData = {
|
||||||
id: courseId,
|
id: courseId,
|
||||||
status: entry.previous || CoreConstants.NOT_DOWNLOADED,
|
status: entry.previous || DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
updated: Date.now(),
|
updated: Date.now(),
|
||||||
// Going back from downloading to previous status, restore previous download time.
|
// Going back from downloading to previous status, restore previous download time.
|
||||||
downloadTime: entry.status == CoreConstants.DOWNLOADING ? entry.previousDownloadTime : entry.downloadTime,
|
downloadTime: entry.status == DownloadStatus.DOWNLOADING ? entry.previousDownloadTime : entry.downloadTime,
|
||||||
};
|
};
|
||||||
|
|
||||||
await this.statusTables[site.getId()].update(newData, { id: courseId });
|
await this.statusTables[site.getId()].update(newData, { id: courseId });
|
||||||
|
@ -1431,7 +1436,7 @@ export class CoreCourseProvider {
|
||||||
* @param siteId Site ID. If not defined, current site.
|
* @param siteId Site ID. If not defined, current site.
|
||||||
* @returns Promise resolved when the status is stored.
|
* @returns Promise resolved when the status is stored.
|
||||||
*/
|
*/
|
||||||
async setCourseStatus(courseId: number, status: string, siteId?: string): Promise<void> {
|
async setCourseStatus(courseId: number, status: TDownloadStatus, siteId?: string): Promise<void> {
|
||||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
this.logger.debug(`Set status '${status}' for course ${courseId} in site ${siteId}`);
|
this.logger.debug(`Set status '${status}' for course ${courseId} in site ${siteId}`);
|
||||||
|
@ -1439,9 +1444,9 @@ export class CoreCourseProvider {
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
let downloadTime = 0;
|
let downloadTime = 0;
|
||||||
let previousDownloadTime = 0;
|
let previousDownloadTime = 0;
|
||||||
let previousStatus = '';
|
let previousStatus: TDownloadStatus | undefined;
|
||||||
|
|
||||||
if (status == CoreConstants.DOWNLOADING) {
|
if (status === DownloadStatus.DOWNLOADING) {
|
||||||
// Set download time if course is now downloading.
|
// Set download time if course is now downloading.
|
||||||
downloadTime = CoreTimeUtils.timestamp();
|
downloadTime = CoreTimeUtils.timestamp();
|
||||||
}
|
}
|
||||||
|
@ -1461,7 +1466,7 @@ export class CoreCourseProvider {
|
||||||
// New entry.
|
// New entry.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (previousStatus != status) {
|
if (previousStatus !== status) {
|
||||||
// Status has changed, update it.
|
// Status has changed, update it.
|
||||||
await this.statusTables[site.getId()].insert({
|
await this.statusTables[site.getId()].insert({
|
||||||
id: courseId,
|
id: courseId,
|
||||||
|
@ -1529,7 +1534,7 @@ export class CoreCourseProvider {
|
||||||
* @param status New course status.
|
* @param status New course status.
|
||||||
* @param siteId Site ID. If not defined, current site.
|
* @param siteId Site ID. If not defined, current site.
|
||||||
*/
|
*/
|
||||||
protected triggerCourseStatusChanged(courseId: number, status: string, siteId?: string): void {
|
protected triggerCourseStatusChanged(courseId: number, status: TDownloadStatus, siteId?: string): void {
|
||||||
CoreEvents.trigger(CoreEvents.COURSE_STATUS_CHANGED, {
|
CoreEvents.trigger(CoreEvents.COURSE_STATUS_CHANGED, {
|
||||||
courseId: courseId,
|
courseId: courseId,
|
||||||
status: status,
|
status: status,
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreSiteSchema } from '@services/sites';
|
import { CoreSiteSchema } from '@services/sites';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -120,8 +121,8 @@ export const OFFLINE_SITE_SCHEMA: CoreSiteSchema = {
|
||||||
|
|
||||||
export type CoreCourseStatusDBRecord = {
|
export type CoreCourseStatusDBRecord = {
|
||||||
id: number;
|
id: number;
|
||||||
status: string;
|
status: TDownloadStatus;
|
||||||
previous: string;
|
previous: TDownloadStatus | undefined;
|
||||||
updated: number;
|
updated: number;
|
||||||
downloadTime: number;
|
downloadTime: number;
|
||||||
previousDownloadTime: number;
|
previousDownloadTime: number;
|
||||||
|
|
|
@ -25,6 +25,7 @@ import { makeSingleton } from '@singletons';
|
||||||
import { CoreCourseModuleData } from './course-helper';
|
import { CoreCourseModuleData } from './course-helper';
|
||||||
import { CoreNavigationOptions } from '@services/navigator';
|
import { CoreNavigationOptions } from '@services/navigator';
|
||||||
import { CoreIonicColorNames } from '@singletons/colors';
|
import { CoreIonicColorNames } from '@singletons/colors';
|
||||||
|
import { TDownloadStatus } from '@/core/constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface that all course module handlers must implement.
|
* Interface that all course module handlers must implement.
|
||||||
|
@ -222,7 +223,7 @@ export interface CoreCourseModuleHandlerData {
|
||||||
*
|
*
|
||||||
* @param status Module status.
|
* @param status Module status.
|
||||||
*/
|
*/
|
||||||
updateStatus?(status: string): void;
|
updateStatus?(status: TDownloadStatus): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On Destroy function in case it's needed.
|
* On Destroy function in case it's needed.
|
||||||
|
|
|
@ -25,7 +25,7 @@ import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreCourse, CoreCourseAnyModuleData, CoreCourseModuleContentFile } from './course';
|
import { CoreCourse, CoreCourseAnyModuleData, CoreCourseModuleContentFile } from './course';
|
||||||
import { CoreCache } from '@classes/cache';
|
import { CoreCache } from '@classes/cache';
|
||||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus, TDownloadedStatus } from '@/core/constants';
|
||||||
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
|
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
|
||||||
import { makeSingleton } from '@singletons';
|
import { makeSingleton } from '@singletons';
|
||||||
import { CoreEvents, CoreEventSectionStatusChangedData } from '@singletons/events';
|
import { CoreEvents, CoreEventSectionStatusChangedData } from '@singletons/events';
|
||||||
|
@ -122,8 +122,8 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
|
|
||||||
const promises = modules.map(async (module) => {
|
const promises = modules.map(async (module) => {
|
||||||
try {
|
try {
|
||||||
const data = await this.getModuleStatusAndDownloadTime(module, courseId);
|
const data = await this.getModuleDownloadTime(module);
|
||||||
if (data.status != CoreConstants.DOWNLOADED) {
|
if (!data.downloadTime || data.outdated) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
* @param status Current status.
|
* @param status Current status.
|
||||||
* @returns Module status.
|
* @returns Module status.
|
||||||
*/
|
*/
|
||||||
determineModuleStatus(module: CoreCourseAnyModuleData, status: string): string {
|
determineModuleStatus(module: CoreCourseAnyModuleData, status: TDownloadStatus): TDownloadStatus {
|
||||||
const handler = this.getPrefetchHandlerFor(module.modname);
|
const handler = this.getPrefetchHandlerFor(module.modname);
|
||||||
const siteId = CoreSites.getCurrentSiteId();
|
const siteId = CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == CoreConstants.DOWNLOADING) {
|
if (status === DownloadStatus.DOWNLOADING) {
|
||||||
// Check if the download is being handled.
|
// Check if the download is being handled.
|
||||||
if (!CoreFilepool.getPackageDownloadPromise(siteId, handler.component, module.id)) {
|
if (!CoreFilepool.getPackageDownloadPromise(siteId, handler.component, module.id)) {
|
||||||
// Not handled, the app was probably restarted or something weird happened.
|
// Not handled, the app was probably restarted or something weird happened.
|
||||||
|
@ -346,7 +346,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
// Get the status of each module.
|
// Get the status of each module.
|
||||||
const data = await this.getModulesStatus(modules, courseId);
|
const data = await this.getModulesStatus(modules, courseId);
|
||||||
|
|
||||||
const downloadableModules = data[CoreConstants.NOT_DOWNLOADED].concat(data[CoreConstants.OUTDATED]);
|
const downloadableModules = data[DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED].concat(data[DownloadStatus.OUTDATED]);
|
||||||
const result: CoreFileSizeSum = {
|
const result: CoreFileSizeSum = {
|
||||||
size: 0,
|
size: 0,
|
||||||
total: true,
|
total: true,
|
||||||
|
@ -528,17 +528,17 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
updates?: CourseUpdates | false,
|
updates?: CourseUpdates | false,
|
||||||
refresh?: boolean,
|
refresh?: boolean,
|
||||||
sectionId?: number,
|
sectionId?: number,
|
||||||
): Promise<string> {
|
): Promise<TDownloadStatus> {
|
||||||
const handler = this.getPrefetchHandlerFor(module.modname);
|
const handler = this.getPrefetchHandlerFor(module.modname);
|
||||||
|
|
||||||
if (!handler) {
|
if (!handler) {
|
||||||
// No handler found, module not downloadable.
|
// No handler found, module not downloadable.
|
||||||
return CoreConstants.NOT_DOWNLOADABLE;
|
return DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the status is cached.
|
// Check if the status is cached.
|
||||||
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
||||||
const status = this.statusCache.getValue<string>(packageId, 'status');
|
const status = this.statusCache.getValue<TDownloadStatus>(packageId, 'status');
|
||||||
|
|
||||||
if (!refresh && status !== undefined) {
|
if (!refresh && status !== undefined) {
|
||||||
this.storeCourseAndSection(packageId, courseId, sectionId);
|
this.storeCourseAndSection(packageId, courseId, sectionId);
|
||||||
|
@ -554,6 +554,52 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
return this.determineModuleStatus(module, result.status);
|
return this.determineModuleStatus(module, result.status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a module is downloaded or downloading, return its status.
|
||||||
|
* This function has a better performance than getModuleStatus, but it doesn't allow you to differentiate betweeen
|
||||||
|
* NOT_DOWNLOADABLE and DOWNLOADABLE_NOT_DOWNLOADED.
|
||||||
|
*
|
||||||
|
* @param module Module.
|
||||||
|
* @param courseId Course ID the module belongs to.
|
||||||
|
* @param updates Result of getCourseUpdates for all modules in the course. If not provided, it will be
|
||||||
|
* calculated (slower). If it's false it means the site doesn't support check updates.
|
||||||
|
* @param refresh True if it should ignore the memory cache, not the WS cache.
|
||||||
|
* @param sectionId ID of the section the module belongs to.
|
||||||
|
* @returns Promise resolved with the status, null if not downloaded.
|
||||||
|
*/
|
||||||
|
async getDownloadedModuleStatus(
|
||||||
|
module: CoreCourseAnyModuleData,
|
||||||
|
courseId: number,
|
||||||
|
updates?: CourseUpdates | false,
|
||||||
|
refresh?: boolean,
|
||||||
|
sectionId?: number,
|
||||||
|
): Promise<TDownloadedStatus | null> {
|
||||||
|
const handler = this.getPrefetchHandlerFor(module.modname);
|
||||||
|
if (!handler) {
|
||||||
|
// No handler found, module not downloadable.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the status is cached.
|
||||||
|
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
||||||
|
const status = this.statusCache.getValue<TDownloadStatus>(packageId, 'status');
|
||||||
|
|
||||||
|
if (!refresh && status !== undefined) {
|
||||||
|
this.storeCourseAndSection(packageId, courseId, sectionId);
|
||||||
|
|
||||||
|
return this.filterDownloadedStatus(this.determineModuleStatus(module, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await this.calculateDownloadedModuleStatus(handler, module, courseId, updates, sectionId);
|
||||||
|
if (result.updateStatus && result.status) {
|
||||||
|
this.updateStatusCache(result.status, handler.component, module.id, courseId, sectionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.filterDownloadedStatus(
|
||||||
|
this.determineModuleStatus(module, result.status ?? DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate a module status.
|
* Calculate a module status.
|
||||||
*
|
*
|
||||||
|
@ -571,24 +617,52 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
courseId: number,
|
courseId: number,
|
||||||
updates?: CourseUpdates | false,
|
updates?: CourseUpdates | false,
|
||||||
sectionId?: number,
|
sectionId?: number,
|
||||||
): Promise<{status: string; updateStatus: boolean}> {
|
): Promise<{status: TDownloadStatus; updateStatus: boolean}> {
|
||||||
// Check if the module is downloadable.
|
// Check if the module is downloadable.
|
||||||
const downloadable = await this.isModuleDownloadable(module, courseId);
|
const downloadable = await this.isModuleDownloadable(module, courseId);
|
||||||
if (!downloadable) {
|
if (!downloadable) {
|
||||||
return {
|
return {
|
||||||
status: CoreConstants.NOT_DOWNLOADABLE,
|
status: DownloadStatus.NOT_DOWNLOADABLE,
|
||||||
updateStatus: true,
|
updateStatus: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const result = await this.calculateDownloadedModuleStatus(handler, module, courseId, updates, sectionId);
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: result.status ?? DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
|
updateStatus: result.updateStatus,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the status of a downloaded module.
|
||||||
|
* This function has a better performance than calculateModuleStatus, but it doesn't allow you to differentiate betweeen
|
||||||
|
* NOT_DOWNLOADABLE and DOWNLOADABLE_NOT_DOWNLOADED.
|
||||||
|
*
|
||||||
|
* @param handler Prefetch handler.
|
||||||
|
* @param module Module.
|
||||||
|
* @param courseId Course ID the module belongs to.
|
||||||
|
* @param updates Result of getCourseUpdates for all modules in the course. If not provided, it will be
|
||||||
|
* calculated (slower). If it's false it means the site doesn't support check updates.
|
||||||
|
* @param sectionId ID of the section the module belongs to.
|
||||||
|
* @returns Promise resolved with the status.
|
||||||
|
*/
|
||||||
|
protected async calculateDownloadedModuleStatus(
|
||||||
|
handler: CoreCourseModulePrefetchHandler,
|
||||||
|
module: CoreCourseAnyModuleData,
|
||||||
|
courseId: number,
|
||||||
|
updates?: CourseUpdates | false,
|
||||||
|
sectionId?: number,
|
||||||
|
): Promise<{status: TDownloadedStatus | null; updateStatus: boolean}> {
|
||||||
// Get the saved package status.
|
// Get the saved package status.
|
||||||
const siteId = CoreSites.getCurrentSiteId();
|
const siteId = CoreSites.getCurrentSiteId();
|
||||||
const currentStatus = await CoreFilepool.getPackageStatus(siteId, handler.component, module.id);
|
const currentStatus = await CoreFilepool.getPackageStatus(siteId, handler.component, module.id);
|
||||||
|
|
||||||
let status = handler.determineStatus ? handler.determineStatus(module, currentStatus, true) : currentStatus;
|
let status = handler.determineStatus ? handler.determineStatus(module, currentStatus, true) : currentStatus;
|
||||||
if (status != CoreConstants.DOWNLOADED || updates === false) {
|
if (status !== DownloadStatus.DOWNLOADED || updates === false) {
|
||||||
return {
|
return {
|
||||||
status,
|
status: this.filterDownloadedStatus(status),
|
||||||
updateStatus: true,
|
updateStatus: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -604,7 +678,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
this.storeCourseAndSection(packageId, courseId, sectionId);
|
this.storeCourseAndSection(packageId, courseId, sectionId);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: currentStatus,
|
status: this.filterDownloadedStatus(currentStatus),
|
||||||
updateStatus: false,
|
updateStatus: false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -613,7 +687,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
if (!updates || updates[module.id] === false) {
|
if (!updates || updates[module.id] === false) {
|
||||||
// Cannot check updates, always show outdated.
|
// Cannot check updates, always show outdated.
|
||||||
return {
|
return {
|
||||||
status: CoreConstants.OUTDATED,
|
status: DownloadStatus.OUTDATED,
|
||||||
updateStatus: true,
|
updateStatus: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -631,7 +705,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
}
|
}
|
||||||
|
|
||||||
// Has updates, mark the module as outdated.
|
// Has updates, mark the module as outdated.
|
||||||
status = CoreConstants.OUTDATED;
|
status = DownloadStatus.OUTDATED;
|
||||||
|
|
||||||
await CoreUtils.ignoreErrors(
|
await CoreUtils.ignoreErrors(
|
||||||
CoreFilepool.storePackageStatus(siteId, status, handler.component, module.id),
|
CoreFilepool.storePackageStatus(siteId, status, handler.component, module.id),
|
||||||
|
@ -644,15 +718,26 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
} catch {
|
} catch {
|
||||||
// Error checking if module has updates.
|
// Error checking if module has updates.
|
||||||
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
||||||
const status = this.statusCache.getValue<string>(packageId, 'status', true);
|
const status = this.statusCache.getValue<TDownloadStatus>(packageId, 'status', true);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: this.determineModuleStatus(module, status || CoreConstants.NOT_DOWNLOADED),
|
status: status ? this.filterDownloadedStatus(status) : null,
|
||||||
updateStatus: true,
|
updateStatus: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a download status, filter it to return only the downloaded statuses.
|
||||||
|
*
|
||||||
|
* @param status Status.
|
||||||
|
* @returns Filtered status, null for not downloaded statuses.
|
||||||
|
*/
|
||||||
|
protected filterDownloadedStatus(status: TDownloadStatus): TDownloadedStatus | null {
|
||||||
|
return status === DownloadStatus.NOT_DOWNLOADABLE || status === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED ?
|
||||||
|
null : status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the status of a list of modules, along with the lists of modules for each status.
|
* Get the status of a list of modules, along with the lists of modules for each status.
|
||||||
*
|
*
|
||||||
|
@ -676,11 +761,11 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
let updates: CourseUpdates | false = false;
|
let updates: CourseUpdates | false = false;
|
||||||
const result: CoreCourseModulesStatus = {
|
const result: CoreCourseModulesStatus = {
|
||||||
total: 0,
|
total: 0,
|
||||||
status: CoreConstants.NOT_DOWNLOADABLE,
|
status: DownloadStatus.NOT_DOWNLOADABLE,
|
||||||
[CoreConstants.NOT_DOWNLOADED]: [],
|
[DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED]: [],
|
||||||
[CoreConstants.DOWNLOADED]: [],
|
[DownloadStatus.DOWNLOADED]: [],
|
||||||
[CoreConstants.DOWNLOADING]: [],
|
[DownloadStatus.DOWNLOADING]: [],
|
||||||
[CoreConstants.OUTDATED]: [],
|
[DownloadStatus.OUTDATED]: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
if (checkUpdates) {
|
if (checkUpdates) {
|
||||||
|
@ -711,7 +796,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
result.total++;
|
result.total++;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
||||||
const cacheStatus = this.statusCache.getValue<string>(packageId, 'status', true);
|
const cacheStatus = this.statusCache.getValue<TDownloadStatus>(packageId, 'status', true);
|
||||||
if (cacheStatus === undefined) {
|
if (cacheStatus === undefined) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
@ -730,37 +815,28 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a module status and download time. It will only return the download time if the module is downloaded or outdated.
|
* Get the time a module was downloaded, and whether the download is outdated.
|
||||||
|
* It will only return the download time if the module is downloaded or outdated.
|
||||||
*
|
*
|
||||||
* @param module Module.
|
* @param module Module.
|
||||||
* @param courseId Course ID the module belongs to.
|
|
||||||
* @returns Promise resolved with the data.
|
* @returns Promise resolved with the data.
|
||||||
*/
|
*/
|
||||||
protected async getModuleStatusAndDownloadTime(
|
protected async getModuleDownloadTime(
|
||||||
module: CoreCourseAnyModuleData,
|
module: CoreCourseAnyModuleData,
|
||||||
courseId: number,
|
): Promise<{ downloadTime?: number; outdated?: boolean }> {
|
||||||
): Promise<{ status: string; downloadTime?: number }> {
|
|
||||||
const handler = this.getPrefetchHandlerFor(module.modname);
|
const handler = this.getPrefetchHandlerFor(module.modname);
|
||||||
const siteId = CoreSites.getCurrentSiteId();
|
const siteId = CoreSites.getCurrentSiteId();
|
||||||
|
|
||||||
if (!handler) {
|
if (!handler) {
|
||||||
// No handler found, module not downloadable.
|
return {};
|
||||||
return { status: CoreConstants.NOT_DOWNLOADABLE };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the status from the cache.
|
// Get the status from the cache.
|
||||||
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
const packageId = CoreFilepool.getPackageId(handler.component, module.id);
|
||||||
const status = this.statusCache.getValue<string>(packageId, 'status');
|
const status = this.statusCache.getValue<TDownloadStatus>(packageId, 'status');
|
||||||
|
|
||||||
if (status !== undefined && !CoreFileHelper.isStateDownloaded(status)) {
|
if (status !== undefined && !CoreFileHelper.isStateDownloaded(status)) {
|
||||||
// Module isn't downloaded, just return the status.
|
return {};
|
||||||
return { status };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the module is downloadable.
|
|
||||||
const downloadable = await this.isModuleDownloadable(module, courseId);
|
|
||||||
if (!downloadable) {
|
|
||||||
return { status: CoreConstants.NOT_DOWNLOADABLE };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -768,11 +844,11 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
const data = await CoreFilepool.getPackageData(siteId, handler.component, module.id);
|
const data = await CoreFilepool.getPackageData(siteId, handler.component, module.id);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: data.status || CoreConstants.NOT_DOWNLOADED,
|
downloadTime: data.downloadTime,
|
||||||
downloadTime: data.downloadTime || 0,
|
outdated: data.status === DownloadStatus.OUTDATED,
|
||||||
};
|
};
|
||||||
} catch {
|
} catch {
|
||||||
return { status: CoreConstants.NOT_DOWNLOADED };
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -795,8 +871,8 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
|
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
|
|
||||||
const data = await this.getModuleStatusAndDownloadTime(module, courseId);
|
const data = await this.getModuleDownloadTime(module);
|
||||||
if (!CoreFileHelper.isStateDownloaded(data.status)) {
|
if (!data.downloadTime) {
|
||||||
// Not downloaded, no updates.
|
// Not downloaded, no updates.
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1185,7 +1261,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await CoreFilepool.storePackageStatus(siteId, CoreConstants.NOT_DOWNLOADED, handler.component, module.id);
|
await CoreFilepool.storePackageStatus(siteId, DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED, handler.component, module.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1267,14 +1343,14 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo
|
||||||
* @param sectionId Section ID of the module.
|
* @param sectionId Section ID of the module.
|
||||||
*/
|
*/
|
||||||
updateStatusCache(
|
updateStatusCache(
|
||||||
status: string,
|
status: TDownloadStatus,
|
||||||
component: string,
|
component: string,
|
||||||
componentId?: string | number,
|
componentId?: string | number,
|
||||||
courseId?: number,
|
courseId?: number,
|
||||||
sectionId?: number,
|
sectionId?: number,
|
||||||
): void {
|
): void {
|
||||||
const packageId = CoreFilepool.getPackageId(component, componentId);
|
const packageId = CoreFilepool.getPackageId(component, componentId);
|
||||||
const cachedStatus = this.statusCache.getValue<string>(packageId, 'status', true);
|
const cachedStatus = this.statusCache.getValue<TDownloadStatus>(packageId, 'status', true);
|
||||||
|
|
||||||
// If courseId/sectionId is set, store it.
|
// If courseId/sectionId is set, store it.
|
||||||
this.storeCourseAndSection(packageId, courseId, sectionId);
|
this.storeCourseAndSection(packageId, courseId, sectionId);
|
||||||
|
@ -1413,7 +1489,7 @@ export interface CoreCourseModulePrefetchHandler extends CoreDelegateHandler {
|
||||||
* @param canCheck Whether the site allows checking for updates. This parameter was deprecated since app 4.0.
|
* @param canCheck Whether the site allows checking for updates. This parameter was deprecated since app 4.0.
|
||||||
* @returns Status to display.
|
* @returns Status to display.
|
||||||
*/
|
*/
|
||||||
determineStatus?(module: CoreCourseAnyModuleData, status: string, canCheck: true): string;
|
determineStatus?(module: CoreCourseAnyModuleData, status: TDownloadStatus, canCheck: true): TDownloadStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the downloaded size of a module. If not defined, we'll use getFiles to calculate it (it can be slow).
|
* Get the downloaded size of a module. If not defined, we'll use getFiles to calculate it (it can be slow).
|
||||||
|
@ -1506,11 +1582,11 @@ type CourseUpdates = Record<number, false | CheckUpdatesWSInstance>;
|
||||||
*/
|
*/
|
||||||
export type CoreCourseModulesStatus = {
|
export type CoreCourseModulesStatus = {
|
||||||
total: number; // Number of modules.
|
total: number; // Number of modules.
|
||||||
status: string; // Status of the list of modules.
|
status: TDownloadStatus; // Status of the list of modules.
|
||||||
[CoreConstants.NOT_DOWNLOADED]: CoreCourseModuleData[]; // Modules with state NOT_DOWNLOADED.
|
[DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED]: CoreCourseModuleData[]; // Modules with state NOT_DOWNLOADED.
|
||||||
[CoreConstants.DOWNLOADED]: CoreCourseModuleData[]; // Modules with state DOWNLOADED.
|
[DownloadStatus.DOWNLOADED]: CoreCourseModuleData[]; // Modules with state DOWNLOADED.
|
||||||
[CoreConstants.DOWNLOADING]: CoreCourseModuleData[]; // Modules with state DOWNLOADING.
|
[DownloadStatus.DOWNLOADING]: CoreCourseModuleData[]; // Modules with state DOWNLOADING.
|
||||||
[CoreConstants.OUTDATED]: CoreCourseModuleData[]; // Modules with state OUTDATED.
|
[DownloadStatus.OUTDATED]: CoreCourseModuleData[]; // Modules with state OUTDATED.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit } from '@angular/core';
|
import { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { CoreCourseProvider, CoreCourse } from '@features/course/services/course';
|
import { CoreCourseProvider, CoreCourse } from '@features/course/services/course';
|
||||||
import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper';
|
import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper';
|
||||||
|
@ -51,7 +51,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On
|
||||||
prefetchCourseData: CorePrefetchStatusInfo = {
|
prefetchCourseData: CorePrefetchStatusInfo = {
|
||||||
icon: '',
|
icon: '',
|
||||||
statusTranslatable: 'core.loading',
|
statusTranslatable: 'core.loading',
|
||||||
status: '',
|
status: DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
loading: true,
|
loading: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On
|
||||||
progress = -1;
|
progress = -1;
|
||||||
completionUserTracked: boolean | undefined = false;
|
completionUserTracked: boolean | undefined = false;
|
||||||
|
|
||||||
protected courseStatus = CoreConstants.NOT_DOWNLOADED;
|
protected courseStatus: TDownloadStatus = DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
protected isDestroyed = false;
|
protected isDestroyed = false;
|
||||||
protected courseStatusObserver?: CoreEventObserver;
|
protected courseStatusObserver?: CoreEventObserver;
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On
|
||||||
*
|
*
|
||||||
* @param status Status to show.
|
* @param status Status to show.
|
||||||
*/
|
*/
|
||||||
protected updateCourseStatus(status: string): void {
|
protected updateCourseStatus(status: TDownloadStatus): void {
|
||||||
const statusData = CoreCourseHelper.getCoursePrefetchStatusInfo(status);
|
const statusData = CoreCourseHelper.getCoursePrefetchStatusInfo(status);
|
||||||
|
|
||||||
this.courseStatus = status;
|
this.courseStatus = status;
|
||||||
|
@ -219,7 +219,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On
|
||||||
this.prefetchCourseData.icon = statusData.icon;
|
this.prefetchCourseData.icon = statusData.icon;
|
||||||
this.prefetchCourseData.statusTranslatable = statusData.statusTranslatable;
|
this.prefetchCourseData.statusTranslatable = statusData.statusTranslatable;
|
||||||
this.prefetchCourseData.loading = statusData.loading;
|
this.prefetchCourseData.loading = statusData.loading;
|
||||||
this.prefetchCourseData.downloadSucceeded = status === CoreConstants.DOWNLOADED;
|
this.prefetchCourseData.downloadSucceeded = status === DownloadStatus.DOWNLOADED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -295,7 +295,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if (this.courseStatus == CoreConstants.DOWNLOADED || this.courseStatus == CoreConstants.OUTDATED) {
|
if (this.courseStatus === DownloadStatus.DOWNLOADED || this.courseStatus === DownloadStatus.OUTDATED) {
|
||||||
this.deleteCourseStoredData();
|
this.deleteCourseStoredData();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -24,7 +24,7 @@ import { CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CoreH5P } from '@features/h5p/services/h5p';
|
import { CoreH5P } from '@features/h5p/services/h5p';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreSite } from '@classes/sites/site';
|
import { CoreSite } from '@classes/sites/site';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import { CoreH5PCore, CoreH5PDisplayOptions } from '../../classes/core';
|
import { CoreH5PCore, CoreH5PDisplayOptions } from '../../classes/core';
|
||||||
|
@ -100,7 +100,7 @@ export class CoreH5PIframeComponent implements OnChanges, OnDestroy {
|
||||||
*/
|
*/
|
||||||
protected async play(): Promise<void> {
|
protected async play(): Promise<void> {
|
||||||
let localUrl: string | undefined;
|
let localUrl: string | undefined;
|
||||||
let state: string;
|
let state: TDownloadStatus;
|
||||||
this.onlinePlayerUrl = this.onlinePlayerUrl || CoreH5P.h5pPlayer.calculateOnlinePlayerUrl(
|
this.onlinePlayerUrl = this.onlinePlayerUrl || CoreH5P.h5pPlayer.calculateOnlinePlayerUrl(
|
||||||
this.site.getURL(),
|
this.site.getURL(),
|
||||||
this.fileUrl || '',
|
this.fileUrl || '',
|
||||||
|
@ -111,7 +111,7 @@ export class CoreH5PIframeComponent implements OnChanges, OnDestroy {
|
||||||
if (this.fileUrl) {
|
if (this.fileUrl) {
|
||||||
state = await CoreFilepool.getFileStateByUrl(this.siteId, this.fileUrl);
|
state = await CoreFilepool.getFileStateByUrl(this.siteId, this.fileUrl);
|
||||||
} else {
|
} else {
|
||||||
state = CoreConstants.NOT_DOWNLOADABLE;
|
state = DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.siteCanDownload && CoreFileHelper.isStateDownloaded(state)) {
|
if (this.siteCanDownload && CoreFileHelper.isStateDownloaded(state)) {
|
||||||
|
|
|
@ -20,7 +20,7 @@ import { CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CorePluginFileDelegate } from '@services/plugin-file-delegate';
|
import { CorePluginFileDelegate } from '@services/plugin-file-delegate';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { CoreSite } from '@classes/sites/site';
|
import { CoreSite } from '@classes/sites/site';
|
||||||
import { CoreEvents, CoreEventObserver } from '@singletons/events';
|
import { CoreEvents, CoreEventObserver } from '@singletons/events';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
|
@ -94,7 +94,10 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
|
||||||
this.displayOptions = CoreH5P.h5pPlayer.getDisplayOptionsFromUrlParams(this.urlParams);
|
this.displayOptions = CoreH5P.h5pPlayer.getDisplayOptionsFromUrlParams(this.urlParams);
|
||||||
this.showPackage = true;
|
this.showPackage = true;
|
||||||
|
|
||||||
if (!this.canDownload$.getValue() || (this.state != CoreConstants.OUTDATED && this.state != CoreConstants.NOT_DOWNLOADED)) {
|
if (
|
||||||
|
!this.canDownload$.getValue() ||
|
||||||
|
(this.state !== DownloadStatus.OUTDATED && this.state !== DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED)
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreAppSchema } from '@services/app';
|
import { CoreAppSchema } from '@services/app';
|
||||||
import { CoreSiteSchema } from '@services/sites';
|
import { CoreSiteSchema } from '@services/sites';
|
||||||
|
|
||||||
|
@ -314,12 +315,12 @@ export type CoreFilepoolPackageEntry = {
|
||||||
/**
|
/**
|
||||||
* Package status.
|
* Package status.
|
||||||
*/
|
*/
|
||||||
status?: string;
|
status?: TDownloadStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Package previous status.
|
* Package previous status.
|
||||||
*/
|
*/
|
||||||
previous?: string;
|
previous?: TDownloadStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Timestamp when this package was updated.
|
* Timestamp when this package was updated.
|
||||||
|
|
|
@ -23,7 +23,7 @@ import { CoreWS, CoreWSFile } from '@services/ws';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CoreUtils, CoreUtilsOpenFileOptions, OpenFileAction } from '@services/utils/utils';
|
import { CoreUtils, CoreUtilsOpenFileOptions, OpenFileAction } from '@services/utils/utils';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants, DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { makeSingleton, Translate } from '@singletons';
|
import { makeSingleton, Translate } from '@singletons';
|
||||||
import { CoreNetworkError } from '@classes/errors/network-error';
|
import { CoreNetworkError } from '@classes/errors/network-error';
|
||||||
|
@ -63,7 +63,7 @@ export class CoreFileHelperProvider {
|
||||||
file: CoreWSFile,
|
file: CoreWSFile,
|
||||||
component?: string,
|
component?: string,
|
||||||
componentId?: string | number,
|
componentId?: string | number,
|
||||||
state?: string,
|
state?: TDownloadStatus,
|
||||||
onProgress?: CoreFileHelperOnProgress,
|
onProgress?: CoreFileHelperOnProgress,
|
||||||
siteId?: string,
|
siteId?: string,
|
||||||
options: CoreUtilsOpenFileOptions = {},
|
options: CoreUtilsOpenFileOptions = {},
|
||||||
|
@ -113,11 +113,11 @@ export class CoreFileHelperProvider {
|
||||||
state = await CoreFilepool.getFileStateByUrl(siteId, fileUrl, timemodified);
|
state = await CoreFilepool.getFileStateByUrl(siteId, fileUrl, timemodified);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == CoreConstants.DOWNLOADING) {
|
if (state === DownloadStatus.DOWNLOADING) {
|
||||||
throw new CoreError(Translate.instant('core.erroropenfiledownloading'));
|
throw new CoreError(Translate.instant('core.erroropenfiledownloading'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state === CoreConstants.NOT_DOWNLOADED) {
|
if (state === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// File is not downloaded, download and then return the local URL.
|
// File is not downloaded, download and then return the local URL.
|
||||||
url = await this.downloadFile(fileUrl, component, componentId, timemodified, onProgress, file, siteId);
|
url = await this.downloadFile(fileUrl, component, componentId, timemodified, onProgress, file, siteId);
|
||||||
} else {
|
} else {
|
||||||
|
@ -150,7 +150,7 @@ export class CoreFileHelperProvider {
|
||||||
component?: string,
|
component?: string,
|
||||||
componentId?: string | number,
|
componentId?: string | number,
|
||||||
timemodified?: number,
|
timemodified?: number,
|
||||||
state?: string,
|
state?: TDownloadStatus,
|
||||||
onProgress?: CoreFileHelperOnProgress,
|
onProgress?: CoreFileHelperOnProgress,
|
||||||
siteId?: string,
|
siteId?: string,
|
||||||
options: CoreUtilsOpenFileOptions = {},
|
options: CoreUtilsOpenFileOptions = {},
|
||||||
|
@ -174,7 +174,7 @@ export class CoreFileHelperProvider {
|
||||||
const isWifi = CoreNetwork.isWifi();
|
const isWifi = CoreNetwork.isWifi();
|
||||||
const isOnline = CoreNetwork.isOnline();
|
const isOnline = CoreNetwork.isOnline();
|
||||||
|
|
||||||
if (state == CoreConstants.DOWNLOADED) {
|
if (state === DownloadStatus.DOWNLOADED) {
|
||||||
// File is downloaded, get the local file URL.
|
// File is downloaded, get the local file URL.
|
||||||
return CoreFilepool.getUrlByUrl(siteId, fileUrl, component, componentId, timemodified, false, false, file);
|
return CoreFilepool.getUrlByUrl(siteId, fileUrl, component, componentId, timemodified, false, false, file);
|
||||||
} else {
|
} else {
|
||||||
|
@ -191,7 +191,7 @@ export class CoreFileHelperProvider {
|
||||||
const shouldDownloadFirst = await CoreFilepool.shouldDownloadFileBeforeOpen(fixedUrl, file.filesize || 0, options);
|
const shouldDownloadFirst = await CoreFilepool.shouldDownloadFileBeforeOpen(fixedUrl, file.filesize || 0, options);
|
||||||
if (shouldDownloadFirst) {
|
if (shouldDownloadFirst) {
|
||||||
// Download the file first.
|
// Download the file first.
|
||||||
if (state == CoreConstants.DOWNLOADING) {
|
if (state === DownloadStatus.DOWNLOADING) {
|
||||||
// It's already downloading, stop.
|
// It's already downloading, stop.
|
||||||
return fixedUrl;
|
return fixedUrl;
|
||||||
}
|
}
|
||||||
|
@ -304,8 +304,8 @@ export class CoreFileHelperProvider {
|
||||||
* @param state The state to check.
|
* @param state The state to check.
|
||||||
* @returns If file has been downloaded (or outdated).
|
* @returns If file has been downloaded (or outdated).
|
||||||
*/
|
*/
|
||||||
isStateDownloaded(state: string): boolean {
|
isStateDownloaded(state: TDownloadStatus): boolean {
|
||||||
return state === CoreConstants.DOWNLOADED || state === CoreConstants.OUTDATED;
|
return state === DownloadStatus.DOWNLOADED || state === DownloadStatus.OUTDATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,7 +29,7 @@ import { CoreTimeUtils } from '@services/utils/time';
|
||||||
import { CoreUrlUtils } from '@services/utils/url';
|
import { CoreUrlUtils } from '@services/utils/url';
|
||||||
import { CoreUtils, CoreUtilsOpenFileOptions } from '@services/utils/utils';
|
import { CoreUtils, CoreUtilsOpenFileOptions } from '@services/utils/utils';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus, TDownloadStatus } from '@/core/constants';
|
||||||
import { ApplicationInit, makeSingleton, NgZone, Translate } from '@singletons';
|
import { ApplicationInit, makeSingleton, NgZone, Translate } from '@singletons';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import {
|
import {
|
||||||
|
@ -593,7 +593,12 @@ export class CoreFilepoolProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger module status changed, setting it as not downloaded.
|
// Trigger module status changed, setting it as not downloaded.
|
||||||
this.triggerPackageStatusChanged(siteId, CoreConstants.NOT_DOWNLOADED, entry.component, entry.componentId);
|
this.triggerPackageStatusChanged(
|
||||||
|
siteId,
|
||||||
|
DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED,
|
||||||
|
entry.component,
|
||||||
|
entry.componentId,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -669,36 +674,36 @@ export class CoreFilepoolProvider {
|
||||||
/**
|
/**
|
||||||
* Given the current status of a list of packages and the status of one of the packages,
|
* Given the current status of a list of packages and the status of one of the packages,
|
||||||
* determine the new status for the list of packages. The status of a list of packages is:
|
* determine the new status for the list of packages. The status of a list of packages is:
|
||||||
* - CoreConstants.NOT_DOWNLOADABLE if there are no downloadable packages.
|
* - NOT_DOWNLOADABLE if there are no downloadable packages.
|
||||||
* - CoreConstants.NOT_DOWNLOADED if at least 1 package has status CoreConstants.NOT_DOWNLOADED.
|
* - DOWNLOADABLE_NOT_DOWNLOADED if at least 1 package has status DOWNLOADABLE_NOT_DOWNLOADED.
|
||||||
* - CoreConstants.DOWNLOADED if ALL the downloadable packages have status CoreConstants.DOWNLOADED.
|
* - DOWNLOADED if ALL the downloadable packages have status DOWNLOADED.
|
||||||
* - CoreConstants.DOWNLOADING if ALL the downloadable packages have status CoreConstants.DOWNLOADING or
|
* - DOWNLOADING if ALL the downloadable packages have status DOWNLOADING or DOWNLOADED, with at least 1 package
|
||||||
* CoreConstants.DOWNLOADED, with at least 1 package with CoreConstants.DOWNLOADING.
|
* with status DOWNLOADING.
|
||||||
* - CoreConstants.OUTDATED if ALL the downloadable packages have status CoreConstants.OUTDATED or CoreConstants.DOWNLOADED
|
* - OUTDATED if ALL the downloadable packages have status OUTDATED or DOWNLOADED or DOWNLOADING, with at least 1 package
|
||||||
* or CoreConstants.DOWNLOADING, with at least 1 package with CoreConstants.OUTDATED.
|
* with OUTDATED.
|
||||||
*
|
*
|
||||||
* @param current Current status of the list of packages.
|
* @param current Current status of the list of packages.
|
||||||
* @param packageStatus Status of one of the packages.
|
* @param packageStatus Status of one of the packages.
|
||||||
* @returns New status for the list of packages;
|
* @returns New status for the list of packages;
|
||||||
*/
|
*/
|
||||||
determinePackagesStatus(current: string, packageStatus: string): string {
|
determinePackagesStatus(current: TDownloadStatus, packageStatus: TDownloadStatus): TDownloadStatus {
|
||||||
if (!current) {
|
if (!current) {
|
||||||
current = CoreConstants.NOT_DOWNLOADABLE;
|
current = DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packageStatus === CoreConstants.NOT_DOWNLOADED) {
|
if (packageStatus === DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// If 1 package is not downloaded the status of the whole list will always be not downloaded.
|
// If 1 package is not downloaded the status of the whole list will always be not downloaded.
|
||||||
return CoreConstants.NOT_DOWNLOADED;
|
return DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
} else if (packageStatus === CoreConstants.DOWNLOADED && current === CoreConstants.NOT_DOWNLOADABLE) {
|
} else if (packageStatus === DownloadStatus.DOWNLOADED && current === DownloadStatus.NOT_DOWNLOADABLE) {
|
||||||
// If all packages are downloaded or not downloadable with at least 1 downloaded, status will be downloaded.
|
// If all packages are downloaded or not downloadable with at least 1 downloaded, status will be downloaded.
|
||||||
return CoreConstants.DOWNLOADED;
|
return DownloadStatus.DOWNLOADED;
|
||||||
} else if (packageStatus === CoreConstants.DOWNLOADING &&
|
} else if (packageStatus === DownloadStatus.DOWNLOADING &&
|
||||||
(current === CoreConstants.NOT_DOWNLOADABLE || current === CoreConstants.DOWNLOADED)) {
|
(current === DownloadStatus.NOT_DOWNLOADABLE || current === DownloadStatus.DOWNLOADED)) {
|
||||||
// If all packages are downloading/downloaded/notdownloadable with at least 1 downloading, status will be downloading.
|
// If all packages are downloading/downloaded/notdownloadable with at least 1 downloading, status will be downloading.
|
||||||
return CoreConstants.DOWNLOADING;
|
return DownloadStatus.DOWNLOADING;
|
||||||
} else if (packageStatus === CoreConstants.OUTDATED && current !== CoreConstants.NOT_DOWNLOADED) {
|
} else if (packageStatus === DownloadStatus.OUTDATED && current !== DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED) {
|
||||||
// If there are no packages notdownloaded and there is at least 1 outdated, status will be outdated.
|
// If there are no packages notdownloaded and there is at least 1 outdated, status will be outdated.
|
||||||
return CoreConstants.OUTDATED;
|
return DownloadStatus.OUTDATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status remains the same.
|
// Status remains the same.
|
||||||
|
@ -886,7 +891,7 @@ export class CoreFilepoolProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set package as downloading.
|
// Set package as downloading.
|
||||||
const promise = this.storePackageStatus(siteId, CoreConstants.DOWNLOADING, component, componentId).then(async () => {
|
const promise = this.storePackageStatus(siteId, DownloadStatus.DOWNLOADING, component, componentId).then(async () => {
|
||||||
const promises: Promise<string | void>[] = [];
|
const promises: Promise<string | void>[] = [];
|
||||||
let packageLoaded = 0;
|
let packageLoaded = 0;
|
||||||
|
|
||||||
|
@ -959,7 +964,7 @@ export class CoreFilepoolProvider {
|
||||||
try {
|
try {
|
||||||
await Promise.all(promises);
|
await Promise.all(promises);
|
||||||
// Success prefetching, store package as downloaded.
|
// Success prefetching, store package as downloaded.
|
||||||
await this.storePackageStatus(siteId, CoreConstants.DOWNLOADED, component, componentId, extra);
|
await this.storePackageStatus(siteId, DownloadStatus.DOWNLOADED, component, componentId, extra);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -1520,13 +1525,13 @@ export class CoreFilepoolProvider {
|
||||||
timemodified: number = 0,
|
timemodified: number = 0,
|
||||||
filePath?: string,
|
filePath?: string,
|
||||||
revision?: number,
|
revision?: number,
|
||||||
): Promise<string> {
|
): Promise<TDownloadStatus> {
|
||||||
let file: CoreWSFile;
|
let file: CoreWSFile;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
file = await this.fixPluginfileURL(siteId, fileUrl, timemodified);
|
file = await this.fixPluginfileURL(siteId, fileUrl, timemodified);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return CoreConstants.NOT_DOWNLOADABLE;
|
return DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
fileUrl = CoreUrl.removeUrlAnchor(CoreFileHelper.getFileUrl(file));
|
fileUrl = CoreUrl.removeUrlAnchor(CoreFileHelper.getFileUrl(file));
|
||||||
|
@ -1538,7 +1543,7 @@ export class CoreFilepoolProvider {
|
||||||
// Check if the file is in queue (waiting to be downloaded).
|
// Check if the file is in queue (waiting to be downloaded).
|
||||||
await this.hasFileInQueue(siteId, fileId);
|
await this.hasFileInQueue(siteId, fileId);
|
||||||
|
|
||||||
return CoreConstants.DOWNLOADING;
|
return DownloadStatus.DOWNLOADING;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Check if the file is being downloaded right now.
|
// Check if the file is being downloaded right now.
|
||||||
const extension = CoreMimetypeUtils.guessExtensionFromUrl(fileUrl);
|
const extension = CoreMimetypeUtils.guessExtensionFromUrl(fileUrl);
|
||||||
|
@ -1547,7 +1552,7 @@ export class CoreFilepoolProvider {
|
||||||
const downloadId = this.getFileDownloadId(fileUrl, filePath);
|
const downloadId = this.getFileDownloadId(fileUrl, filePath);
|
||||||
|
|
||||||
if (this.filePromises[siteId] && this.filePromises[siteId][downloadId] !== undefined) {
|
if (this.filePromises[siteId] && this.filePromises[siteId][downloadId] !== undefined) {
|
||||||
return CoreConstants.DOWNLOADING;
|
return DownloadStatus.DOWNLOADING;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -1555,12 +1560,12 @@ export class CoreFilepoolProvider {
|
||||||
const entry = await this.hasFileInPool(siteId, fileId);
|
const entry = await this.hasFileInPool(siteId, fileId);
|
||||||
|
|
||||||
if (this.isFileOutdated(entry, revision, timemodified)) {
|
if (this.isFileOutdated(entry, revision, timemodified)) {
|
||||||
return CoreConstants.OUTDATED;
|
return DownloadStatus.OUTDATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CoreConstants.DOWNLOADED;
|
return DownloadStatus.DOWNLOADED;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return CoreConstants.NOT_DOWNLOADED;
|
return DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1855,13 +1860,13 @@ export class CoreFilepoolProvider {
|
||||||
* @param componentId An ID to use in conjunction with the component.
|
* @param componentId An ID to use in conjunction with the component.
|
||||||
* @returns Promise resolved with the status.
|
* @returns Promise resolved with the status.
|
||||||
*/
|
*/
|
||||||
async getPackagePreviousStatus(siteId: string, component: string, componentId?: string | number): Promise<string> {
|
async getPackagePreviousStatus(siteId: string, component: string, componentId?: string | number): Promise<TDownloadStatus> {
|
||||||
try {
|
try {
|
||||||
const entry = await this.getPackageData(siteId, component, componentId);
|
const entry = await this.getPackageData(siteId, component, componentId);
|
||||||
|
|
||||||
return entry.previous || CoreConstants.NOT_DOWNLOADED;
|
return entry.previous || DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return CoreConstants.NOT_DOWNLOADED;
|
return DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1873,13 +1878,13 @@ export class CoreFilepoolProvider {
|
||||||
* @param componentId An ID to use in conjunction with the component.
|
* @param componentId An ID to use in conjunction with the component.
|
||||||
* @returns Promise resolved with the status.
|
* @returns Promise resolved with the status.
|
||||||
*/
|
*/
|
||||||
async getPackageStatus(siteId: string, component: string, componentId?: string | number): Promise<string> {
|
async getPackageStatus(siteId: string, component: string, componentId?: string | number): Promise<TDownloadStatus> {
|
||||||
try {
|
try {
|
||||||
const entry = await this.getPackageData(siteId, component, componentId);
|
const entry = await this.getPackageData(siteId, component, componentId);
|
||||||
|
|
||||||
return entry.status || CoreConstants.NOT_DOWNLOADED;
|
return entry.status || DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return CoreConstants.NOT_DOWNLOADED;
|
return DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2324,7 +2329,7 @@ export class CoreFilepoolProvider {
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
const state = await this.getFileStateByUrl(siteId, fileUrl, timemodified, filePath, revision);
|
const state = await this.getFileStateByUrl(siteId, fileUrl, timemodified, filePath, revision);
|
||||||
|
|
||||||
return state != CoreConstants.NOT_DOWNLOADABLE;
|
return state !== DownloadStatus.NOT_DOWNLOADABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2807,7 +2812,7 @@ export class CoreFilepoolProvider {
|
||||||
* @param componentId An ID to use in conjunction with the component.
|
* @param componentId An ID to use in conjunction with the component.
|
||||||
* @returns Promise resolved when the status is changed. Resolve param: new status.
|
* @returns Promise resolved when the status is changed. Resolve param: new status.
|
||||||
*/
|
*/
|
||||||
async setPackagePreviousStatus(siteId: string, component: string, componentId?: string | number): Promise<string> {
|
async setPackagePreviousStatus(siteId: string, component: string, componentId?: string | number): Promise<TDownloadStatus> {
|
||||||
componentId = this.fixComponentId(componentId);
|
componentId = this.fixComponentId(componentId);
|
||||||
this.logger.debug(`Set previous status for package ${component} ${componentId}`);
|
this.logger.debug(`Set previous status for package ${component} ${componentId}`);
|
||||||
|
|
||||||
|
@ -2816,11 +2821,11 @@ export class CoreFilepoolProvider {
|
||||||
// Get current stored data, we'll only update 'status' and 'updated' fields.
|
// Get current stored data, we'll only update 'status' and 'updated' fields.
|
||||||
const entry = await this.packagesTables[siteId].getOneByPrimaryKey({ id: packageId });
|
const entry = await this.packagesTables[siteId].getOneByPrimaryKey({ id: packageId });
|
||||||
const newData: CoreFilepoolPackageEntry = {};
|
const newData: CoreFilepoolPackageEntry = {};
|
||||||
if (entry.status == CoreConstants.DOWNLOADING) {
|
if (entry.status === DownloadStatus.DOWNLOADING) {
|
||||||
// Going back from downloading to previous status, restore previous download time.
|
// Going back from downloading to previous status, restore previous download time.
|
||||||
newData.downloadTime = entry.previousDownloadTime;
|
newData.downloadTime = entry.previousDownloadTime;
|
||||||
}
|
}
|
||||||
newData.status = entry.previous || CoreConstants.NOT_DOWNLOADED;
|
newData.status = entry.previous || DownloadStatus.DOWNLOADABLE_NOT_DOWNLOADED;
|
||||||
newData.updated = Date.now();
|
newData.updated = Date.now();
|
||||||
this.logger.debug(`Set previous status '${entry.status}' for package ${component} ${componentId}`);
|
this.logger.debug(`Set previous status '${entry.status}' for package ${component} ${componentId}`);
|
||||||
|
|
||||||
|
@ -2886,7 +2891,7 @@ export class CoreFilepoolProvider {
|
||||||
*/
|
*/
|
||||||
async storePackageStatus(
|
async storePackageStatus(
|
||||||
siteId: string,
|
siteId: string,
|
||||||
status: string,
|
status: TDownloadStatus,
|
||||||
component: string,
|
component: string,
|
||||||
componentId?: string | number,
|
componentId?: string | number,
|
||||||
extra?: string,
|
extra?: string,
|
||||||
|
@ -2898,12 +2903,12 @@ export class CoreFilepoolProvider {
|
||||||
let downloadTime: number | undefined;
|
let downloadTime: number | undefined;
|
||||||
let previousDownloadTime: number | undefined;
|
let previousDownloadTime: number | undefined;
|
||||||
|
|
||||||
if (status == CoreConstants.DOWNLOADING) {
|
if (status === DownloadStatus.DOWNLOADING) {
|
||||||
// Set download time if package is now downloading.
|
// Set download time if package is now downloading.
|
||||||
downloadTime = CoreTimeUtils.timestamp();
|
downloadTime = CoreTimeUtils.timestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
let previousStatus: string | undefined;
|
let previousStatus: TDownloadStatus | undefined;
|
||||||
// Search current status to set it as previous status.
|
// Search current status to set it as previous status.
|
||||||
try {
|
try {
|
||||||
const entry = await this.packagesTables[siteId].getOneByPrimaryKey({ id: packageId });
|
const entry = await this.packagesTables[siteId].getOneByPrimaryKey({ id: packageId });
|
||||||
|
@ -3050,7 +3055,12 @@ export class CoreFilepoolProvider {
|
||||||
* @param component Package's component.
|
* @param component Package's component.
|
||||||
* @param componentId An ID to use in conjunction with the component.
|
* @param componentId An ID to use in conjunction with the component.
|
||||||
*/
|
*/
|
||||||
protected triggerPackageStatusChanged(siteId: string, status: string, component: string, componentId?: string | number): void {
|
protected triggerPackageStatusChanged(
|
||||||
|
siteId: string,
|
||||||
|
status: TDownloadStatus,
|
||||||
|
component: string,
|
||||||
|
componentId?: string | number,
|
||||||
|
): void {
|
||||||
const data: CoreEventPackageStatusChanged = {
|
const data: CoreEventPackageStatusChanged = {
|
||||||
component,
|
component,
|
||||||
componentId: this.fixComponentId(componentId),
|
componentId: this.fixComponentId(componentId),
|
||||||
|
@ -3068,7 +3078,6 @@ export class CoreFilepoolProvider {
|
||||||
* @param siteId Site ID.
|
* @param siteId Site ID.
|
||||||
* @param component Package's component.
|
* @param component Package's component.
|
||||||
* @param componentId An ID to use in conjunction with the component.
|
* @param componentId An ID to use in conjunction with the component.
|
||||||
* @returns Promise resolved when status is stored.
|
|
||||||
*/
|
*/
|
||||||
async updatePackageDownloadTime(siteId: string, component: string, componentId?: string | number): Promise<void> {
|
async updatePackageDownloadTime(siteId: string, component: string, componentId?: string | number): Promise<void> {
|
||||||
componentId = this.fixComponentId(componentId);
|
componentId = this.fixComponentId(componentId);
|
||||||
|
|
|
@ -17,7 +17,7 @@ import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
|
||||||
|
|
||||||
import { CoreFilepool, CoreFilepoolOnProgressCallback } from '@services/filepool';
|
import { CoreFilepool, CoreFilepoolOnProgressCallback } from '@services/filepool';
|
||||||
import { CoreWSFile } from '@services/ws';
|
import { CoreWSFile } from '@services/ws';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { DownloadStatus } from '@/core/constants';
|
||||||
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
|
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
|
||||||
import { makeSingleton } from '@singletons';
|
import { makeSingleton } from '@singletons';
|
||||||
import { CoreSites } from './sites';
|
import { CoreSites } from './sites';
|
||||||
|
@ -141,7 +141,7 @@ export class CorePluginFileDelegateService extends CoreDelegate<CorePluginFileHa
|
||||||
await Promise.all(files.map(async (file) => {
|
await Promise.all(files.map(async (file) => {
|
||||||
const state = await CoreFilepool.getFileStateByUrl(siteIdentifier, CoreFileHelper.getFileUrl(file), file.timemodified);
|
const state = await CoreFilepool.getFileStateByUrl(siteIdentifier, CoreFileHelper.getFileUrl(file), file.timemodified);
|
||||||
|
|
||||||
if (state !== CoreConstants.DOWNLOADED && state !== CoreConstants.NOT_DOWNLOADABLE) {
|
if (state !== DownloadStatus.DOWNLOADED && state !== DownloadStatus.NOT_DOWNLOADABLE) {
|
||||||
filteredFiles.push(file);
|
filteredFiles.push(file);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -21,6 +21,7 @@ import { CoreRedirectPayload } from '@services/navigator';
|
||||||
import { CoreCourseModuleCompletionData } from '@features/course/services/course-helper';
|
import { CoreCourseModuleCompletionData } from '@features/course/services/course-helper';
|
||||||
import { CoreScreenOrientation } from '@services/screen';
|
import { CoreScreenOrientation } from '@services/screen';
|
||||||
import { CoreSiteInfoResponse, CoreSitePublicConfigResponse } from '@classes/sites/unauthenticated-site';
|
import { CoreSiteInfoResponse, CoreSitePublicConfigResponse } from '@classes/sites/unauthenticated-site';
|
||||||
|
import { TDownloadStatus } from '../constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Observer instance to stop listening to an event.
|
* Observer instance to stop listening to an event.
|
||||||
|
@ -326,7 +327,7 @@ export type CoreEventLoadingChangedData = {
|
||||||
*/
|
*/
|
||||||
export type CoreEventCourseStatusChanged = {
|
export type CoreEventCourseStatusChanged = {
|
||||||
courseId: number; // Course Id.
|
courseId: number; // Course Id.
|
||||||
status: string;
|
status: TDownloadStatus;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -335,7 +336,7 @@ export type CoreEventCourseStatusChanged = {
|
||||||
export type CoreEventPackageStatusChanged = {
|
export type CoreEventPackageStatusChanged = {
|
||||||
component: string;
|
component: string;
|
||||||
componentId: string | number;
|
componentId: string | number;
|
||||||
status: string;
|
status: TDownloadStatus;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue