forked from CIT/Vmeda.Online
		
	
						commit
						345ff293c1
					
				@ -56,11 +56,11 @@
 | 
			
		||||
                        "duration_finish": day.haslastdayofevent
 | 
			
		||||
                    }'
 | 
			
		||||
                    [class.addon-calendar-event-past-day]="isPastMonth || day.ispast"
 | 
			
		||||
                    role="button cell"
 | 
			
		||||
                    role="cell"
 | 
			
		||||
                    tabindex="0"
 | 
			
		||||
                    (ariaButtonClick)="dayClicked(day.mday)"
 | 
			
		||||
                >
 | 
			
		||||
                    <p class="addon-calendar-day-number">
 | 
			
		||||
                    <p class="addon-calendar-day-number" role="button">
 | 
			
		||||
                        <span aria-hidden="true">{{ day.mday }}</span>
 | 
			
		||||
                        <span class="sr-only">{{ day.periodName | translate }}</span>
 | 
			
		||||
                    </p>
 | 
			
		||||
 | 
			
		||||
@ -802,14 +802,14 @@ export class AddonModDataHelperProvider {
 | 
			
		||||
        offline: boolean,
 | 
			
		||||
        siteId?: string,
 | 
			
		||||
    ): Promise<number | CoreFileUploaderStoreFilesResult> {
 | 
			
		||||
        if (!files.length) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (offline) {
 | 
			
		||||
            return this.storeFiles(dataId, entryId, fieldId, files, siteId);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!files.length) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return CoreFileUploader.uploadOrReuploadFiles(files, AddonModDataProvider.COMPONENT, itemId, siteId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -215,7 +215,6 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy, CanLeave {
 | 
			
		||||
            // Reload the current page.
 | 
			
		||||
            const scrollElement = await this.content?.getScrollElement();
 | 
			
		||||
            const scrollTop = scrollElement?.scrollTop || -1;
 | 
			
		||||
            const scrollLeft = scrollElement?.scrollLeft || -1;
 | 
			
		||||
 | 
			
		||||
            this.loaded = false;
 | 
			
		||||
            this.content?.scrollToTop(); // Scroll top so the spinner is seen.
 | 
			
		||||
@ -224,8 +223,11 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy, CanLeave {
 | 
			
		||||
                await this.loadPage(this.attempt!.currentpage!);
 | 
			
		||||
            } finally {
 | 
			
		||||
                this.loaded = true;
 | 
			
		||||
                if (scrollTop != -1 && scrollLeft != -1) {
 | 
			
		||||
                    this.content?.scrollToPoint(scrollLeft, scrollTop);
 | 
			
		||||
                if (scrollTop != -1) {
 | 
			
		||||
                    // Wait for content to be rendered.
 | 
			
		||||
                    setTimeout(() => {
 | 
			
		||||
                        this.content?.scrollToPoint(0, scrollTop);
 | 
			
		||||
                    }, 50);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,12 @@ import {
 | 
			
		||||
} from '../../services/survey';
 | 
			
		||||
import { AddonModSurveyHelper, AddonModSurveyQuestionFormatted } from '../../services/survey-helper';
 | 
			
		||||
import { AddonModSurveyOffline } from '../../services/survey-offline';
 | 
			
		||||
import { AddonModSurveyAutoSyncData, AddonModSurveySync, AddonModSurveySyncResult } from '../../services/survey-sync';
 | 
			
		||||
import {
 | 
			
		||||
    AddonModSurveyAutoSyncData,
 | 
			
		||||
    AddonModSurveySync,
 | 
			
		||||
    AddonModSurveySyncProvider,
 | 
			
		||||
    AddonModSurveySyncResult,
 | 
			
		||||
} from '../../services/survey-sync';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Component that displays a survey.
 | 
			
		||||
@ -52,6 +57,7 @@ export class AddonModSurveyIndexComponent extends CoreCourseModuleMainActivityCo
 | 
			
		||||
    answers: Record<string, string> = {};
 | 
			
		||||
 | 
			
		||||
    protected currentUserId?: number;
 | 
			
		||||
    protected syncEventName = AddonModSurveySyncProvider.AUTO_SYNCED;
 | 
			
		||||
 | 
			
		||||
    constructor(
 | 
			
		||||
        protected content?: IonContent,
 | 
			
		||||
 | 
			
		||||
@ -590,7 +590,7 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
 | 
			
		||||
        if (modalData) {
 | 
			
		||||
            if (modalData.home) {
 | 
			
		||||
                // Go back to the initial page of the wiki.
 | 
			
		||||
                CoreNavigator.navigateToSitePath(modalData.home);
 | 
			
		||||
                CoreNavigator.navigateToSitePath(modalData.home, { animationDirection: 'back' });
 | 
			
		||||
            } else if (modalData.page) {
 | 
			
		||||
                this.goToPage(modalData.page);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@
 | 
			
		||||
                    elementId="content_editor" [draftExtraParams]="editorExtraParams"></core-rich-text-editor>
 | 
			
		||||
            </ion-item>
 | 
			
		||||
 | 
			
		||||
            <core-attachments *ngIf="fileAvailable" [files]="submission?.attachmentfiles || []" [maxSize]="workshop.maxbytes"
 | 
			
		||||
            <core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes"
 | 
			
		||||
                [maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule"
 | 
			
		||||
                allowOffline="true" [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired">
 | 
			
		||||
            </core-attachments>
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,6 @@ import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fi
 | 
			
		||||
import { CanLeave } from '@guards/can-leave';
 | 
			
		||||
import { CoreFile } from '@services/file';
 | 
			
		||||
import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
 | 
			
		||||
import { CoreFileSession } from '@services/file-session';
 | 
			
		||||
import { CoreNavigator } from '@services/navigator';
 | 
			
		||||
import { CoreSites } from '@services/sites';
 | 
			
		||||
import { CoreSync } from '@services/sync';
 | 
			
		||||
@ -67,6 +66,7 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
    textRequired = false;
 | 
			
		||||
    fileAvailable = false;
 | 
			
		||||
    fileRequired = false;
 | 
			
		||||
    attachments: CoreFileEntry[] = [];
 | 
			
		||||
 | 
			
		||||
    protected workshopId!: number;
 | 
			
		||||
    protected submissionId = 0;
 | 
			
		||||
@ -211,14 +211,9 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
 | 
			
		||||
                this.editForm.controls['title'].setValue(this.submission.title);
 | 
			
		||||
                this.editForm.controls['content'].setValue(this.submission.content);
 | 
			
		||||
                this.attachments = this.submission.attachmentfiles || [];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            CoreFileSession.setFiles(
 | 
			
		||||
                this.component,
 | 
			
		||||
                this.getFilesComponentId(),
 | 
			
		||||
                this.submission?.attachmentfiles || [],
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            this.loaded = true;
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            this.loaded = false;
 | 
			
		||||
@ -254,7 +249,7 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this.fileAvailable) {
 | 
			
		||||
            values.attachmentfiles = CoreFileSession.getFiles(this.component, this.getFilesComponentId()) || [];
 | 
			
		||||
            values.attachmentfiles = this.attachments;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return values;
 | 
			
		||||
@ -337,7 +332,9 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
        // Upload attachments first if any.
 | 
			
		||||
        let allowOffline = !inputData.attachmentfiles.length;
 | 
			
		||||
        try {
 | 
			
		||||
            let attachmentsId: CoreFileUploaderStoreFilesResult | number | undefined;
 | 
			
		||||
            let attachmentsId: number | undefined;
 | 
			
		||||
            let storeFilesResult: CoreFileUploaderStoreFilesResult | undefined;
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                attachmentsId = await AddonModWorkshopHelper.uploadOrStoreSubmissionFiles(
 | 
			
		||||
                    this.workshopId,
 | 
			
		||||
@ -349,7 +346,7 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
                saveOffline = true;
 | 
			
		||||
                allowOffline = true;
 | 
			
		||||
 | 
			
		||||
                attachmentsId = await AddonModWorkshopHelper.uploadOrStoreSubmissionFiles(
 | 
			
		||||
                storeFilesResult = await AddonModWorkshopHelper.uploadOrStoreSubmissionFiles(
 | 
			
		||||
                    this.workshopId,
 | 
			
		||||
                    inputData.attachmentfiles,
 | 
			
		||||
                    true,
 | 
			
		||||
@ -369,7 +366,7 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
                        this.courseId,
 | 
			
		||||
                        inputData.title,
 | 
			
		||||
                        inputData.content,
 | 
			
		||||
                        attachmentsId as CoreFileUploaderStoreFilesResult,
 | 
			
		||||
                        storeFilesResult,
 | 
			
		||||
                        submissionId,
 | 
			
		||||
                        AddonModWorkshopAction.UPDATE,
 | 
			
		||||
                    );
 | 
			
		||||
@ -396,7 +393,7 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy, Ca
 | 
			
		||||
                        this.courseId,
 | 
			
		||||
                        inputData.title,
 | 
			
		||||
                        inputData.content,
 | 
			
		||||
                        attachmentsId as CoreFileUploaderStoreFilesResult,
 | 
			
		||||
                        storeFilesResult,
 | 
			
		||||
                        undefined,
 | 
			
		||||
                        AddonModWorkshopAction.ADD,
 | 
			
		||||
                    );
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ import { CoreError } from '@classes/errors/error';
 | 
			
		||||
import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
 | 
			
		||||
import { CoreCourseCommonModWSOptions } from '@features/course/services/course';
 | 
			
		||||
import { CoreCourseLogHelper } from '@features/course/services/log-helper';
 | 
			
		||||
import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
 | 
			
		||||
import { CoreGradesMenuItem } from '@features/grades/services/grades-helper';
 | 
			
		||||
import { CoreApp } from '@services/app';
 | 
			
		||||
import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites';
 | 
			
		||||
@ -718,7 +717,7 @@ export class AddonModWorkshopProvider {
 | 
			
		||||
        courseId: number,
 | 
			
		||||
        title: string,
 | 
			
		||||
        content: string,
 | 
			
		||||
        attachmentsId?: number | CoreFileUploaderStoreFilesResult,
 | 
			
		||||
        attachmentsId?: number,
 | 
			
		||||
        siteId?: string,
 | 
			
		||||
        allowOffline: boolean = false,
 | 
			
		||||
    ): Promise<number | false> {
 | 
			
		||||
@ -731,7 +730,7 @@ export class AddonModWorkshopProvider {
 | 
			
		||||
                courseId,
 | 
			
		||||
                title,
 | 
			
		||||
                content,
 | 
			
		||||
                attachmentsId as CoreFileUploaderStoreFilesResult,
 | 
			
		||||
                undefined,
 | 
			
		||||
                undefined,
 | 
			
		||||
                AddonModWorkshopAction.ADD,
 | 
			
		||||
                siteId,
 | 
			
		||||
@ -814,7 +813,7 @@ export class AddonModWorkshopProvider {
 | 
			
		||||
        courseId: number,
 | 
			
		||||
        title: string,
 | 
			
		||||
        content: string,
 | 
			
		||||
        attachmentsId?: CoreFileUploaderStoreFilesResult | number | undefined,
 | 
			
		||||
        attachmentsId?: number | undefined,
 | 
			
		||||
        siteId?: string,
 | 
			
		||||
        allowOffline: boolean = false,
 | 
			
		||||
    ): Promise<number | false> {
 | 
			
		||||
@ -827,7 +826,7 @@ export class AddonModWorkshopProvider {
 | 
			
		||||
                courseId,
 | 
			
		||||
                title,
 | 
			
		||||
                content,
 | 
			
		||||
                attachmentsId as CoreFileUploaderStoreFilesResult,
 | 
			
		||||
                undefined,
 | 
			
		||||
                submissionId,
 | 
			
		||||
                AddonModWorkshopAction.UPDATE,
 | 
			
		||||
                siteId,
 | 
			
		||||
 | 
			
		||||
@ -188,7 +188,7 @@ export class CoreExternalContentDirective implements AfterViewInit, OnChanges {
 | 
			
		||||
        if (tagName == 'VIDEO' && targetAttr != 'poster') {
 | 
			
		||||
            const video = <HTMLVideoElement> this.element;
 | 
			
		||||
            if (video.textTracks) {
 | 
			
		||||
                // It's a video with subtitles. In iOS, subtitles position is wrong so it needs to be fixed.
 | 
			
		||||
                // It's a video with subtitles. Fix some issues with subtitles.
 | 
			
		||||
                video.textTracks.onaddtrack = (event): void => {
 | 
			
		||||
                    const track = <TextTrack> event.track;
 | 
			
		||||
                    if (track) {
 | 
			
		||||
@ -248,6 +248,11 @@ export class CoreExternalContentDirective implements AfterViewInit, OnChanges {
 | 
			
		||||
                true,
 | 
			
		||||
                downloadUnknown,
 | 
			
		||||
            );
 | 
			
		||||
        } else if (tagName === 'TRACK') {
 | 
			
		||||
            // Download tracks right away. Using an online URL for tracks can give a CORS error in Android.
 | 
			
		||||
            finalUrl = await CoreFilepool.downloadUrl(site.getId(), url, false, this.component, this.componentId);
 | 
			
		||||
 | 
			
		||||
            finalUrl = CoreFile.convertFileSrc(finalUrl);
 | 
			
		||||
        } else {
 | 
			
		||||
            finalUrl = await CoreFilepool.getUrlByUrl(
 | 
			
		||||
                site.getId(),
 | 
			
		||||
@ -277,6 +282,13 @@ export class CoreExternalContentDirective implements AfterViewInit, OnChanges {
 | 
			
		||||
                this.loaded = false;
 | 
			
		||||
                this.waitForLoad();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (targetAttr == 'poster') {
 | 
			
		||||
                // Setting the poster immediately doesn't display it in some cases. Set it to empty and then set the right one.
 | 
			
		||||
                this.element.setAttribute(targetAttr, '');
 | 
			
		||||
                await CoreUtils.nextTick();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.element.setAttribute(targetAttr, finalUrl);
 | 
			
		||||
            this.element.setAttribute('data-original-' + targetAttr, url);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -44,8 +44,7 @@ export type CoreRedirectPayload = {
 | 
			
		||||
/**
 | 
			
		||||
 * Navigation options.
 | 
			
		||||
 */
 | 
			
		||||
export type CoreNavigationOptions = {
 | 
			
		||||
    animated?: boolean;
 | 
			
		||||
export type CoreNavigationOptions = Pick<NavigationOptions, 'animated'|'animation'|'animationDirection'> & {
 | 
			
		||||
    params?: Params;
 | 
			
		||||
    reset?: boolean;
 | 
			
		||||
    preferCurrentTab?: boolean; // Default true.
 | 
			
		||||
@ -132,6 +131,8 @@ export class CoreNavigatorService {
 | 
			
		||||
        const url: string[] = [/^[./]/.test(path) ? path : `./${path}`];
 | 
			
		||||
        const navigationOptions: NavigationOptions = CoreObject.withoutEmpty({
 | 
			
		||||
            animated: options.animated,
 | 
			
		||||
            animation: options.animation,
 | 
			
		||||
            animationDirection: options.animationDirection,
 | 
			
		||||
            queryParams: CoreObject.isEmpty(options.params ?? {}) ? null : CoreObject.withoutEmpty(options.params),
 | 
			
		||||
            relativeTo: path.startsWith('/') ? null : this.getCurrentRoute(),
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user