2
0
Fork 0

MOBILE-3954 storage: Move space usage from preferences

main
Pau Ferrer Ocaña 2022-01-27 22:53:00 +01:00
parent 9caa1f06d5
commit e97f70d1fb
4 changed files with 57 additions and 69 deletions

View File

@ -10,12 +10,31 @@
</ion-header> </ion-header>
<ion-content> <ion-content>
<core-loading [hideUntil]="loaded"> <core-loading [hideUntil]="loaded">
<ion-card>
<ion-item class="ion-text-wrap">
<ion-label>{{ 'addon.storagemanager.info' | translate }}</ion-label>
</ion-item>
<ion-item class="ion-text-wrap" *ngIf="spaceUsage">
<ion-label>
<p class="item-heading ion-text-wrap">{{ 'core.settings.spaceusage' | translate }}</p>
<ion-badge color="light" *ngIf="spaceUsage.spaceUsage">{{ spaceUsage.spaceUsage | coreBytesToSize }}</ion-badge>
<p>
{{ 'core.settings.spaceusagehelp' | translate }}
</p>
</ion-label>
<ion-button fill="clear" color="danger" slot="end" (click)="deleteSiteStorage()"
[hidden]="spaceUsage.spaceUsage! + spaceUsage.cacheEntries! <= 0"
[attr.aria-label]="'core.settings.deletesitefilestitle' | translate">
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
</ion-button>
</ion-item>
</ion-card>
<ion-card> <ion-card>
<ion-card-header> <ion-card-header>
<p class="ion-text-wrap">{{ 'addon.storagemanager.info' | translate }}</p>
<ion-card-title class="ion-text-wrap">{{ 'core.courses.courses' | translate }}</ion-card-title> <ion-card-title class="ion-text-wrap">{{ 'core.courses.courses' | translate }}</ion-card-title>
<ion-item class="size ion-text-wrap ion-no-padding" lines="none"> <ion-item class="size ion-text-wrap ion-no-padding" lines="none">
<ion-icon name="fas-archive" slot="start" aria-hidden="true"></ion-icon>
<ion-label> <ion-label>
<h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2> <h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2>
<ion-badge color="light">{{ totalSize | coreBytesToSize }}</ion-badge> <ion-badge color="light">{{ totalSize | coreBytesToSize }}</ion-badge>
@ -28,10 +47,11 @@
</ion-item> </ion-item>
</ion-card-header> </ion-card-header>
</ion-card> </ion-card>
<ion-card *ngIf="downloadedCourses.length"> <ion-card *ngIf="downloadedCourses.length">
<ion-card-content class="ion-no-padding"> <ion-card-content class="ion-no-padding">
<ion-list> <ion-list>
<ion-item *ngFor="let course of downloadedCourses" class="course" (click)="openCourse(course.id)" button> <ion-item *ngFor="let course of downloadedCourses" class="course" (click)="openCourse(course.id, course.title)" button>
<ion-label class="ion-text-wrap"> <ion-label class="ion-text-wrap">
<p class="item-heading">{{ course.title }}</p> <p class="item-heading">{{ course.title }}</p>
<p class="item-heading item-heading-secondary" *ngIf="course.isDownloading"> <p class="item-heading item-heading-secondary" *ngIf="course.isDownloading">

View File

@ -18,6 +18,7 @@ import { CoreCourse, CoreCourseProvider } from '@features/course/services/course
import { CoreCourseHelper } from '@features/course/services/course-helper'; import { CoreCourseHelper } from '@features/course/services/course-helper';
import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate'; import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate';
import { CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses';
import { CoreSettingsHelper, CoreSiteSpaceUsage } from '@features/settings/services/settings-helper';
import { CoreSiteHome } from '@features/sitehome/services/sitehome'; import { CoreSiteHome } from '@features/sitehome/services/sitehome';
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
@ -41,8 +42,17 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
completelyDownloadedCourses: DownloadedCourse[] = []; completelyDownloadedCourses: DownloadedCourse[] = [];
totalSize = 0; totalSize = 0;
loaded = false; loaded = false;
spaceUsage: CoreSiteSpaceUsage = {
cacheEntries: 0,
spaceUsage: 0,
};
courseStatusObserver?: CoreEventObserver; courseStatusObserver?: CoreEventObserver;
siteId: string;
constructor() {
this.siteId = CoreSites.getCurrentSiteId();
}
/** /**
* @inheritdoc * @inheritdoc
@ -77,6 +87,8 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
} }
} }
this.spaceUsage = await CoreSettingsHelper.getSiteSpaceUsage(this.siteId);
this.setDownloadedCourses(downloadedCourses); this.setDownloadedCourses(downloadedCourses);
this.loaded = true; this.loaded = true;
@ -227,6 +239,21 @@ export class AddonStorageManagerCoursesStoragePage implements OnInit, OnDestroy
CoreNavigator.navigateToSitePath('/storage/' + courseId, { params: { title } }); CoreNavigator.navigateToSitePath('/storage/' + courseId, { params: { title } });
} }
/**
* Deletes files of a site and the tables that can be cleared.
*
* @param siteData Site object with space usage.
*/
async deleteSiteStorage(): Promise<void> {
try {
const siteName = CoreSites.getRequiredCurrentSite().getSiteName();
this.spaceUsage = await CoreSettingsHelper.deleteSiteStorage(siteName, this.siteId);
} catch {
// Ignore cancelled confirmation modal.
}
}
} }
/** /**

View File

@ -27,28 +27,15 @@
</ion-label> </ion-label>
</ion-item> </ion-item>
</ion-list> </ion-list>
<ion-card> <ion-card>
<ion-item class="ion-text-wrap" *ngIf="spaceUsage">
<ion-label>
<p class="item-heading ion-text-wrap">{{ 'core.settings.spaceusage' | translate }}</p>
<p *ngIf="spaceUsage.spaceUsage">{{ spaceUsage.spaceUsage | coreBytesToSize }}</p>
</ion-label>
<ion-button fill="clear" [attr.aria-label]="'core.info' | translate" (click)="showSpaceInfo()" slot="end">
<ion-icon name="fas-info-circle" color="info" slot="icon-only"></ion-icon>
</ion-button>
<ion-button fill="clear" color="danger" slot="end" (click)="deleteSiteStorage()"
[hidden]="spaceUsage.spaceUsage! + spaceUsage.cacheEntries! <= 0"
[attr.aria-label]="'core.settings.deletesitefilestitle' | translate">
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
</ion-button>
</ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
<ion-label> <ion-label>
<p class="item-heading">{{ 'core.settings.synchronizenow' | translate }}</p> <p class="item-heading">{{ 'core.settings.synchronizenow' | translate }}</p>
<p>
{{ 'core.settings.synchronizenowhelp' | translate }}
</p>
</ion-label> </ion-label>
<ion-button fill="clear" [attr.aria-label]="'core.info' | translate" (click)="showSyncInfo()" slot="end">
<ion-icon name="fas-info-circle" color="info" slot="icon-only"></ion-icon>
</ion-button>
<core-button-with-spinner [loading]="isSynchronizing()" slot="end"> <core-button-with-spinner [loading]="isSynchronizing()" slot="end">
<ion-button fill="clear" (click)="synchronize()" [attr.aria-label]="'core.settings.synchronizenow' | translate"> <ion-button fill="clear" (click)="synchronize()" [attr.aria-label]="'core.settings.synchronizenow' | translate">
<ion-icon name="fas-sync-alt" slot="icon-only" aria-hidden="true"></ion-icon> <ion-icon name="fas-sync-alt" slot="icon-only" aria-hidden="true"></ion-icon>

View File

@ -18,15 +18,13 @@ import { IonRefresher } from '@ionic/angular';
import { CoreSettingsHandlerToDisplay } from '../../services/settings-delegate'; import { CoreSettingsHandlerToDisplay } from '../../services/settings-delegate';
import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreSettingsHelper, CoreSiteSpaceUsage } from '../../services/settings-helper';
import { CoreApp } from '@services/app';
import { Translate } from '@singletons';
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker';
import { CoreSettingsHandlersSource } from '@features/settings/classes/settings-handlers-source'; import { CoreSettingsHandlersSource } from '@features/settings/classes/settings-handlers-source';
import { CoreSettingsHelper } from '@features/settings/services/settings-helper';
import { CoreDomUtils } from '@services/utils/dom';
/** /**
* Page that displays the list of site settings pages. * Page that displays the list of site settings pages.
@ -41,18 +39,11 @@ export class CoreSitePreferencesPage implements AfterViewInit, OnDestroy {
handlers: CoreListItemsManager<CoreSettingsHandlerToDisplay>; handlers: CoreListItemsManager<CoreSettingsHandlerToDisplay>;
isIOS: boolean; protected siteId: string;
siteId: string;
spaceUsage: CoreSiteSpaceUsage = {
cacheEntries: 0,
spaceUsage: 0,
};
protected sitesObserver: CoreEventObserver; protected sitesObserver: CoreEventObserver;
protected isDestroyed = false; protected isDestroyed = false;
constructor() { constructor() {
this.isIOS = CoreApp.isIOS();
this.siteId = CoreSites.getCurrentSiteId(); this.siteId = CoreSites.getCurrentSiteId();
const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource(CoreSettingsHandlersSource, []); const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource(CoreSettingsHandlersSource, []);
@ -90,8 +81,6 @@ export class CoreSitePreferencesPage implements AfterViewInit, OnDestroy {
*/ */
protected async fetchData(): Promise<void> { protected async fetchData(): Promise<void> {
await this.handlers.load(); await this.handlers.load();
this.spaceUsage = await CoreSettingsHelper.getSiteSpaceUsage(this.siteId);
} }
/** /**
@ -131,41 +120,6 @@ export class CoreSitePreferencesPage implements AfterViewInit, OnDestroy {
}); });
} }
/**
* Deletes files of a site and the tables that can be cleared.
*
* @param siteData Site object with space usage.
*/
async deleteSiteStorage(): Promise<void> {
try {
const siteName = CoreSites.getRequiredCurrentSite().getSiteName();
this.spaceUsage = await CoreSettingsHelper.deleteSiteStorage(siteName, this.siteId);
} catch {
// Ignore cancelled confirmation modal.
}
}
/**
* Show information about space usage actions.
*/
showSpaceInfo(): void {
CoreDomUtils.showAlert(
Translate.instant('core.help'),
Translate.instant('core.settings.spaceusagehelp'),
);
}
/**
* Show information about sync actions.
*/
showSyncInfo(): void {
CoreDomUtils.showAlert(
Translate.instant('core.help'),
Translate.instant('core.settings.synchronizenowhelp'),
);
}
/** /**
* Page destroyed. * Page destroyed.
*/ */