Merge pull request #2896 from dpalou/MOBILE-3780
MOBILE-3780 course: Use right max upload size when set to course limit
This commit is contained in:
		
						commit
						1658df1ea9
					
				@ -35,6 +35,7 @@ import { CoreGroups } from '@services/groups';
 | 
			
		||||
import { AddonModAssignSync, AddonModAssignSyncResult } from '../assign-sync';
 | 
			
		||||
import { CoreUser } from '@features/user/services/user';
 | 
			
		||||
import { CoreGradesHelper } from '@features/grades/services/grades-helper';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler to prefetch assigns.
 | 
			
		||||
@ -252,6 +253,8 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
 | 
			
		||||
        promises.push(this.prefetchSubmissions(assign, courseId, module.id, userId, siteId));
 | 
			
		||||
 | 
			
		||||
        promises.push(CoreCourseHelper.getModuleCourseIdByInstance(assign.id, 'assign', siteId));
 | 
			
		||||
        // Get course data, needed to determine upload max size if it's configured to be course limit.
 | 
			
		||||
        promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
 | 
			
		||||
 | 
			
		||||
        // Download intro files and attachments. Do not call getFiles because it'd call some WS twice.
 | 
			
		||||
        let files: CoreWSFile[] = assign.introattachments || [];
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
    <ion-item-divider class="ion-text-wrap" sticky="true">
 | 
			
		||||
        <ion-label><h2>{{ plugin.name }}</h2></ion-label>
 | 
			
		||||
    </ion-item-divider>
 | 
			
		||||
    <core-attachments [files]="files" [maxSize]="maxSize" [maxSubmissions]="maxSubmissions"
 | 
			
		||||
    <core-attachments [files]="files" [maxSize]="maxSize" [maxSubmissions]="maxSubmissions" [courseId]="assign.course"
 | 
			
		||||
        [component]="component" [componentId]="assign.cmid" [acceptedTypes]="acceptedTypes" [allowOffline]="allowOffline">
 | 
			
		||||
    </core-attachments>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
<span *ngIf="editMode && form">
 | 
			
		||||
    <span [core-mark-required]="field.required" class="core-mark-required"></span>
 | 
			
		||||
    <core-attachments [files]="files" [maxSize]="maxSizeBytes" maxSubmissions="1" [component]="component"
 | 
			
		||||
        [componentId]="componentId" [allowOffline]="true">
 | 
			
		||||
        [componentId]="componentId" [allowOffline]="true" [courseId]="database?.course">
 | 
			
		||||
    </core-attachments>
 | 
			
		||||
    <core-input-errors *ngIf="error" [errorText]="error"></core-input-errors>
 | 
			
		||||
</span>
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
<span *ngIf="editMode && form" [formGroup]="form">
 | 
			
		||||
    <span [core-mark-required]="field.required" class="core-mark-required"></span>
 | 
			
		||||
    <core-attachments [files]="files" [maxSize]="maxSizeBytes" maxSubmissions="1" [component]="component"
 | 
			
		||||
        [componentId]="componentId" [allowOffline]="true" acceptedTypes="image">
 | 
			
		||||
        [componentId]="componentId" [allowOffline]="true" acceptedTypes="image" [courseId]="database?.course">
 | 
			
		||||
    </core-attachments>
 | 
			
		||||
    <core-input-errors *ngIf="error" [errorText]="error"></core-input-errors>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,7 @@ import { Injectable } from '@angular/core';
 | 
			
		||||
import { CoreComments } from '@features/comments/services/comments';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { CoreCourseCommonModWSOptions, CoreCourse, CoreCourseAnyModuleData } from '@features/course/services/course';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
import { CoreFilepool } from '@services/filepool';
 | 
			
		||||
import { CoreGroup, CoreGroups } from '@services/groups';
 | 
			
		||||
import { CoreSitesCommonWSOptions, CoreSites, CoreSitesReadingStrategy } from '@services/sites';
 | 
			
		||||
@ -269,6 +270,9 @@ export class AddonModDataPrefetchHandlerService extends CoreCourseActivityPrefet
 | 
			
		||||
        // Add Basic Info to manage links.
 | 
			
		||||
        promises.push(CoreCourse.getModuleBasicInfoByInstance(database.id, 'data', siteId));
 | 
			
		||||
 | 
			
		||||
        // Get course data, needed to determine upload max size if it's configured to be course limit.
 | 
			
		||||
        promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
 | 
			
		||||
 | 
			
		||||
        await Promise.all(promises);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@
 | 
			
		||||
        <div *ngIf="advanced" id="addon-mod-forum-advanced">
 | 
			
		||||
            <core-attachments *ngIf="forum.id && forum.maxattachments > 0"
 | 
			
		||||
                [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments" [allowOffline]="true" [files]="replyData.files"
 | 
			
		||||
                [component]="component" [componentId]="forum.cmid">
 | 
			
		||||
                [component]="component" [componentId]="forum.cmid" [courseId]="forum.course">
 | 
			
		||||
            </core-attachments>
 | 
			
		||||
        </div>
 | 
			
		||||
        <ion-grid>
 | 
			
		||||
 | 
			
		||||
@ -139,7 +139,7 @@
 | 
			
		||||
            <div *ngIf="advanced" [id]="'addon-forum-reply-edit-form-advanced-' + uniqueId">
 | 
			
		||||
                <core-attachments
 | 
			
		||||
                    [files]="replyData.files" [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments"
 | 
			
		||||
                    [component]="component" [componentId]="forum.cmid" [allowOffline]="true">
 | 
			
		||||
                    [component]="component" [componentId]="forum.cmid" [allowOffline]="true" [courseId]="courseId">
 | 
			
		||||
                </core-attachments>
 | 
			
		||||
            </div>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
 | 
			
		||||
@ -68,7 +68,7 @@
 | 
			
		||||
                </ion-item>
 | 
			
		||||
                <core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0"
 | 
			
		||||
                    [files]="newDiscussion.files" [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments"
 | 
			
		||||
                    [component]="component" [componentId]="forum.cmid" [allowOffline]="true">
 | 
			
		||||
                    [component]="component" [componentId]="forum.cmid" [allowOffline]="true" [courseId]="courseId">
 | 
			
		||||
                </core-attachments>
 | 
			
		||||
            </div>
 | 
			
		||||
            <ion-item>
 | 
			
		||||
 | 
			
		||||
@ -86,8 +86,8 @@ export class AddonModForumNewDiscussionPage implements OnInit, OnDestroy, CanLea
 | 
			
		||||
 | 
			
		||||
    advanced = false; // Display all form fields.
 | 
			
		||||
    accessInfo: AddonModForumAccessInformation = {};
 | 
			
		||||
    courseId!: number;
 | 
			
		||||
 | 
			
		||||
    protected courseId!: number;
 | 
			
		||||
    protected cmId!: number;
 | 
			
		||||
    protected forumId!: number;
 | 
			
		||||
    protected timeCreated!: number;
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ import { CoreGroups, CoreGroupsProvider } from '@services/groups';
 | 
			
		||||
import { CoreUtils } from '@services/utils/utils';
 | 
			
		||||
import { AddonModForumSync } from '../forum-sync';
 | 
			
		||||
import { makeSingleton } from '@singletons';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler to prefetch forums.
 | 
			
		||||
@ -229,6 +230,9 @@ export class AddonModForumPrefetchHandlerService extends CoreCourseActivityPrefe
 | 
			
		||||
            promises.push(CoreUser.getUserPreference(AddonModForumProvider.PREFERENCE_SORTORDER, siteId));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get course data, needed to determine upload max size if it's configured to be course limit.
 | 
			
		||||
        promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
 | 
			
		||||
 | 
			
		||||
        await Promise.all(promises);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -50,7 +50,7 @@
 | 
			
		||||
                <ion-label><h2>{{ 'addon.mod_glossary.attachment' | translate }}</h2></ion-label>
 | 
			
		||||
            </ion-item-divider>
 | 
			
		||||
            <core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule"
 | 
			
		||||
                [allowOffline]="true">
 | 
			
		||||
                [allowOffline]="true" [courseId]="courseId">
 | 
			
		||||
            </core-attachments>
 | 
			
		||||
            <ng-container *ngIf="glossary.usedynalink">
 | 
			
		||||
                <ion-item-divider>
 | 
			
		||||
 | 
			
		||||
@ -16,9 +16,11 @@ import { Injectable } from '@angular/core';
 | 
			
		||||
import { CoreComments } from '@features/comments/services/comments';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { CoreCourse, CoreCourseAnyModuleData } from '@features/course/services/course';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
import { CoreUser } from '@features/user/services/user';
 | 
			
		||||
import { CoreFilepool } from '@services/filepool';
 | 
			
		||||
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
 | 
			
		||||
import { CoreUtils } from '@services/utils/utils';
 | 
			
		||||
import { CoreWSFile } from '@services/ws';
 | 
			
		||||
import { makeSingleton } from '@singletons';
 | 
			
		||||
import { AddonModGlossary, AddonModGlossaryEntry, AddonModGlossaryGlossary, AddonModGlossaryProvider } from '../glossary';
 | 
			
		||||
@ -210,6 +212,9 @@ export class AddonModGlossaryPrefetchHandlerService extends CoreCourseActivityPr
 | 
			
		||||
        promises.push(CoreCourse.getModuleBasicInfo(module.id, siteId));
 | 
			
		||||
        promises.push(CoreCourse.getModuleBasicInfoByInstance(glossary.id, 'glossary', siteId));
 | 
			
		||||
 | 
			
		||||
        // Get course data, needed to determine upload max size if it's configured to be course limit.
 | 
			
		||||
        promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
 | 
			
		||||
 | 
			
		||||
        await Promise.all(promises);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ import { Injectable } from '@angular/core';
 | 
			
		||||
import { CoreError } from '@classes/errors/error';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
import { CoreQuestionHelper } from '@features/question/services/question-helper';
 | 
			
		||||
import { CoreFilepool } from '@services/filepool';
 | 
			
		||||
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
 | 
			
		||||
@ -374,6 +375,9 @@ export class AddonModQuizPrefetchHandlerService extends CoreCourseActivityPrefet
 | 
			
		||||
        promises.push(this.prefetchGradeAndFeedback(quiz, modOptions, siteId));
 | 
			
		||||
        promises.push(AddonModQuiz.getAttemptAccessInformation(quiz.id, 0, modOptions)); // Last attempt.
 | 
			
		||||
 | 
			
		||||
        // Get course data, needed to determine upload max size if it's configured to be course limit.
 | 
			
		||||
        promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
 | 
			
		||||
 | 
			
		||||
        await Promise.all(promises);
 | 
			
		||||
 | 
			
		||||
        // We have quiz data, now we'll get specific data for each attempt.
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@
 | 
			
		||||
            </ion-item>
 | 
			
		||||
            <core-attachments *ngIf="edit && workshop.overallfeedbackfiles" [files]="data.assessment?.feedbackattachmentfiles"
 | 
			
		||||
                [maxSize]="workshop.overallfeedbackmaxbytes" [maxSubmissions]="workshop.overallfeedbackfiles"
 | 
			
		||||
                [component]="component" [componentId]="componentId" [allowOffline]="true">
 | 
			
		||||
                [component]="component" [componentId]="componentId" [allowOffline]="true" [courseId]="workshop.course">
 | 
			
		||||
            </core-attachments>
 | 
			
		||||
            <ion-item *ngIf="edit && access && access.canallocate">
 | 
			
		||||
                <ion-label position="stacked">
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,8 @@
 | 
			
		||||
 | 
			
		||||
            <core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes"
 | 
			
		||||
                [maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule"
 | 
			
		||||
                allowOffline="true" [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired">
 | 
			
		||||
                allowOffline="true" [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired"
 | 
			
		||||
                [courseId]="workshop.course">
 | 
			
		||||
            </core-attachments>
 | 
			
		||||
        </form>
 | 
			
		||||
    </core-loading>
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,7 @@ import { AddonModDataSyncResult } from '@addons/mod/data/services/data-sync';
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { CoreCourse, CoreCourseAnyModuleData } from '@features/course/services/course';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
import { CoreUser } from '@features/user/services/user';
 | 
			
		||||
import { CoreFilepool } from '@services/filepool';
 | 
			
		||||
import { CoreGroup, CoreGroups } from '@services/groups';
 | 
			
		||||
@ -372,6 +373,9 @@ export class AddonModWorkshopPrefetchHandlerService extends CoreCourseActivityPr
 | 
			
		||||
        promises.push(CoreCourse.getModuleBasicInfoByInstance(workshop.id, 'workshop', siteId));
 | 
			
		||||
        promises.push(CoreCourse.getModuleBasicGradeInfo(module.id, siteId));
 | 
			
		||||
 | 
			
		||||
        // Get course data, needed to determine upload max size if it's configured to be course limit.
 | 
			
		||||
        promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
 | 
			
		||||
 | 
			
		||||
        await Promise.all(promises);
 | 
			
		||||
 | 
			
		||||
        // Prefetch user profiles.
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@
 | 
			
		||||
            <core-attachments *ngIf="uploadFilesSupported && essayQuestion.attachmentsDraftIdInput" [files]="attachments"
 | 
			
		||||
                [component]="component" [componentId]="componentId" [maxSize]="essayQuestion.attachmentsMaxBytes"
 | 
			
		||||
                [maxSubmissions]="essayQuestion.attachmentsMaxFiles" [allowOffline]="offlineEnabled"
 | 
			
		||||
                [acceptedTypes]="essayQuestion.attachmentsAcceptedTypes">
 | 
			
		||||
                [acceptedTypes]="essayQuestion.attachmentsAcceptedTypes" [courseId]="courseId">
 | 
			
		||||
            </core-attachments>
 | 
			
		||||
 | 
			
		||||
            <input *ngIf="essayQuestion.attachmentsDraftIdInput" type="hidden" [name]="essayQuestion.attachmentsDraftIdInput.name"
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,8 @@ import { CoreApp } from '@services/app';
 | 
			
		||||
import { CoreDomUtils } from '@services/utils/dom';
 | 
			
		||||
import { CoreFileUploaderHelper } from '@features/fileuploader/services/fileuploader-helper';
 | 
			
		||||
import { CoreFileEntry } from '@services/file-helper';
 | 
			
		||||
import { CoreCourses } from '@features/courses/services/courses';
 | 
			
		||||
import { CoreUtils } from '@services/utils/utils';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Component to render attachments, allow adding more and delete the current ones.
 | 
			
		||||
@ -44,13 +46,14 @@ import { CoreFileEntry } from '@services/file-helper';
 | 
			
		||||
export class CoreAttachmentsComponent implements OnInit {
 | 
			
		||||
 | 
			
		||||
    @Input() files?: CoreFileEntry[]; // List of attachments. New attachments will be added to this array.
 | 
			
		||||
    @Input() maxSize?: number; // Max size for attachments. -1 means unlimited, 0 means user max size, not defined means unknown.
 | 
			
		||||
    @Input() maxSize?: number; // Max size. -1 means unlimited, 0 means course/user max size, not defined means unknown.
 | 
			
		||||
    @Input() maxSubmissions?: number; // Max number of attachments. -1 means unlimited, not defined means unknown limit.
 | 
			
		||||
    @Input() component?: string; // Component the downloaded files will be linked to.
 | 
			
		||||
    @Input() componentId?: string | number; // Component ID.
 | 
			
		||||
    @Input() allowOffline?: boolean | string; // Whether to allow selecting files in offline.
 | 
			
		||||
    @Input() acceptedTypes?: string; // List of supported filetypes. If undefined, all types supported.
 | 
			
		||||
    @Input() required?: boolean; // Whether to display the required mark.
 | 
			
		||||
    @Input() courseId?: number; // Course ID.
 | 
			
		||||
 | 
			
		||||
    maxSizeReadable?: string;
 | 
			
		||||
    maxSubmissionsReadable?: string;
 | 
			
		||||
@ -65,15 +68,7 @@ export class CoreAttachmentsComponent implements OnInit {
 | 
			
		||||
        this.maxSize = this.maxSize !== null ? Number(this.maxSize) : NaN;
 | 
			
		||||
 | 
			
		||||
        if (this.maxSize === 0) {
 | 
			
		||||
            const currentSite = CoreSites.getCurrentSite();
 | 
			
		||||
            const siteInfo = currentSite?.getInfo();
 | 
			
		||||
 | 
			
		||||
            if (siteInfo?.usermaxuploadfilesize) {
 | 
			
		||||
                this.maxSize = siteInfo.usermaxuploadfilesize;
 | 
			
		||||
                this.maxSizeReadable = CoreTextUtils.bytesToSize(this.maxSize, 2);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.maxSizeReadable = Translate.instant('core.unknown');
 | 
			
		||||
            }
 | 
			
		||||
            this.getMaxSizeOfArea();
 | 
			
		||||
        } else if (this.maxSize > 0) {
 | 
			
		||||
            this.maxSizeReadable = CoreTextUtils.bytesToSize(this.maxSize, 2);
 | 
			
		||||
        } else if (this.maxSize === -1) {
 | 
			
		||||
@ -97,6 +92,36 @@ export class CoreAttachmentsComponent implements OnInit {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get max size of the area.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    protected async getMaxSizeOfArea(): Promise<void> {
 | 
			
		||||
        if (this.courseId) {
 | 
			
		||||
            // Check course max size.
 | 
			
		||||
            const course = await CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', this.courseId));
 | 
			
		||||
 | 
			
		||||
            if (course?.maxbytes) {
 | 
			
		||||
                this.maxSize = course.maxbytes;
 | 
			
		||||
                this.maxSizeReadable = CoreTextUtils.bytesToSize(this.maxSize, 2);
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check user max size.
 | 
			
		||||
        const currentSite = CoreSites.getCurrentSite();
 | 
			
		||||
        const siteInfo = currentSite?.getInfo();
 | 
			
		||||
 | 
			
		||||
        if (siteInfo?.usermaxuploadfilesize) {
 | 
			
		||||
            this.maxSize = siteInfo.usermaxuploadfilesize;
 | 
			
		||||
            this.maxSizeReadable = CoreTextUtils.bytesToSize(this.maxSize, 2);
 | 
			
		||||
        } else {
 | 
			
		||||
            this.maxSizeReadable = Translate.instant('core.unknown');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a new attachment.
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user