forked from EVOgeek/Vmeda.Online
		
	
						commit
						ba50fb8d6e
					
				| @ -15,7 +15,7 @@ | |||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ import { CoreCoursesHelper, CoreEnrolledCourseDataWithExtraInfoAndOptions } from | |||||||
| import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; | import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; | ||||||
| import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; | import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; | ||||||
| import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; | import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ import { CoreCourseOptionsDelegate } from '@features/course/services/course-opti | |||||||
| import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; | import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; | ||||||
| import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; | import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Component to render a recent courses block. |  * Component to render a recent courses block. | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreCourse } from '@features/course/services/course'; | import { CoreCourse } from '@features/course/services/course'; | ||||||
| import { CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; | import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ import { CoreCourseOptionsDelegate } from '@features/course/services/course-opti | |||||||
| import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; | import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; | ||||||
| import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; | import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { AddonBlockStarredCourse, AddonBlockStarredCourses } from '../../services/starredcourses'; | import { AddonBlockStarredCourse, AddonBlockStarredCourses } from '../../services/starredcourses'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'AddonBlockStarredCourses:'; | const ROOT_CACHE_KEY = 'AddonBlockStarredCourses:'; | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ import { | |||||||
| } from '@addons/calendar/services/calendar'; | } from '@addons/calendar/services/calendar'; | ||||||
| import moment from 'moment-timezone'; | import moment from 'moment-timezone'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| // Cache key was maintained from block myoverview when blocks were splitted.
 | // Cache key was maintained from block myoverview when blocks were splitted.
 | ||||||
| const ROOT_CACHE_KEY = 'myoverview:'; | const ROOT_CACHE_KEY = 'myoverview:'; | ||||||
|  | |||||||
| @ -13,7 +13,8 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreTagItem } from '@features/tag/services/tag'; | import { CoreTagItem } from '@features/tag/services/tag'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
|  | |||||||
| @ -34,7 +34,7 @@ import { | |||||||
| import { AddonCalendarOffline } from '../../services/calendar-offline'; | import { AddonCalendarOffline } from '../../services/calendar-offline'; | ||||||
| import { AddonCalendarEventTypeOption, AddonCalendarHelper } from '../../services/calendar-helper'; | import { AddonCalendarEventTypeOption, AddonCalendarHelper } from '../../services/calendar-helper'; | ||||||
| import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync'; | import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { Translate } from '@singletons'; | import { Translate } from '@singletons'; | ||||||
| import { CoreFilterHelper } from '@features/filter/services/filter-helper'; | import { CoreFilterHelper } from '@features/filter/services/filter-helper'; | ||||||
| import { AddonCalendarOfflineEventDBRecord } from '../../services/database/calendar-offline'; | import { AddonCalendarOfflineEventDBRecord } from '../../services/database/calendar-offline'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
| import { CoreTimeUtils } from '@services/utils/time'; | import { CoreTimeUtils } from '@services/utils/time'; | ||||||
| @ -50,6 +50,7 @@ import { | |||||||
| } from '@features/reminders/services/reminders'; | } from '@features/reminders/services/reminders'; | ||||||
| import { CoreReminderDBRecord } from '@features/reminders/services/database/reminders'; | import { CoreReminderDBRecord } from '@features/reminders/services/database/reminders'; | ||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaCalendar:'; | const ROOT_CACHE_KEY = 'mmaCalendar:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,7 +13,8 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCommentsArea } from '@features/comments/services/comments'; | import { CoreCommentsArea } from '@features/comments/services/comments'; | ||||||
| import { CoreCourseSummary, CoreCourseModuleSummary } from '@features/course/services/course'; | import { CoreCourseSummary, CoreCourseModuleSummary } from '@features/course/services/course'; | ||||||
| import { CoreUserSummary } from '@features/user/services/user'; | import { CoreUserSummary } from '@features/user/services/user'; | ||||||
|  | |||||||
| @ -17,12 +17,13 @@ import { CoreLogger } from '@singletons/logger'; | |||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreCourses } from '@features/courses/services/courses'; | import { CoreCourses } from '@features/courses/services/courses'; | ||||||
| import { CoreSite, CoreSiteWSPreSets, WSObservable } from '@classes/site'; | import { CoreSite  } from '@classes/sites/site'; | ||||||
| import { CoreStatusWithWarningsWSResponse, CoreWSExternalWarning } from '@services/ws'; | import { CoreStatusWithWarningsWSResponse, CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; | import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
|  | import { CoreSiteWSPreSets, WSObservable } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaCourseCompletion:'; | const ROOT_CACHE_KEY = 'mmaCourseCompletion:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,7 +13,8 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSiteWSPreSets, CoreSite } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreEnrolEnrolmentInfo } from '@features/enrol/services/enrol'; | import { CoreEnrolEnrolmentInfo } from '@features/enrol/services/enrol'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
|  | |||||||
| @ -14,7 +14,8 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { CoreSiteWSPreSets, CoreSite } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCoursesProvider } from '@features/courses/services/courses'; | import { CoreCoursesProvider } from '@features/courses/services/courses'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreStatusWithWarningsWSResponse } from '@services/ws'; | import { CoreStatusWithWarningsWSResponse } from '@services/ws'; | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ import { CoreSites } from '@services/sites'; | |||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; | |||||||
| import { CoreLang } from '@services/lang'; | import { CoreLang } from '@services/lang'; | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFilter, CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFilter, CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; | ||||||
| import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | import { CoreFilterFormatTextOptions } from '@features/filter/services/filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; | |||||||
| import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } from '@/core/constants'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| @ -25,6 +25,7 @@ import { CoreEvents, CoreEventSiteData } from '@singletons/events'; | |||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CorePath } from '@singletons/path'; | import { CorePath } from '@singletons/path'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaMessageOutputAirnotifier:'; | const ROOT_CACHE_KEY = 'mmaMessageOutputAirnotifier:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,7 +31,7 @@ import { CoreConstants } from '@/core/constants'; | |||||||
| import { CoreUser } from '@features/user/services/user'; | import { CoreUser } from '@features/user/services/user'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreTextErrorObject, CoreTextUtils } from '@services/utils/text'; | import { CoreTextErrorObject, CoreTextUtils } from '@services/utils/text'; | ||||||
| import { CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Service to sync messages. |  * Service to sync messages. | ||||||
|  | |||||||
| @ -26,13 +26,14 @@ import { | |||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreTimeUtils } from '@services/utils/time'; | import { CoreTimeUtils } from '@services/utils/time'; | ||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { AddonMessagesSyncEvents, AddonMessagesSyncProvider } from './messages-sync'; | import { AddonMessagesSyncEvents, AddonMessagesSyncProvider } from './messages-sync'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons/notifications/services/notifications'; | import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons/notifications/services/notifications'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaMessages:'; | const ROOT_CACHE_KEY = 'mmaMessages:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { Component, Optional, OnDestroy, OnInit, ViewChild } from '@angular/core'; | import { Component, Optional, OnDestroy, OnInit, ViewChild } from '@angular/core'; | ||||||
| import { Params } from '@angular/router'; | import { Params } from '@angular/router'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite } from '@classes/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'; | ||||||
| import { IonContent } from '@ionic/angular'; | import { IonContent } from '@ionic/angular'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreInterceptor } from '@classes/interceptor'; | import { CoreInterceptor } from '@classes/interceptor'; | ||||||
| import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; | import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| @ -35,6 +35,7 @@ import { AddonModAssignAutoSyncData, AddonModAssignManualSyncData, AddonModAssig | |||||||
| import { CoreFormFields } from '@singletons/form'; | import { CoreFormFields } from '@singletons/form'; | ||||||
| import { CoreFileHelper } from '@services/file-helper'; | import { CoreFileHelper } from '@services/file-helper'; | ||||||
| import { CoreIonicColorNames } from '@singletons/colors'; | import { CoreIonicColorNames } from '@singletons/colors'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModAssign:'; | const ROOT_CACHE_KEY = 'mmaModAssign:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,7 +15,8 @@ | |||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreTagItem } from '@features/tag/services/tag'; | import { CoreTagItem } from '@features/tag/services/tag'; | ||||||
| import { CoreWSExternalWarning, CoreWSExternalFile, CoreWS } from '@services/ws'; | import { CoreWSExternalWarning, CoreWSExternalFile, CoreWS } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| @ -26,6 +26,7 @@ import { CoreTextUtils } from '@services/utils/text'; | |||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreFile } from '@services/file'; | import { CoreFile } from '@services/file'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Constants to define how the chapters and subchapters of a book should be displayed in that table of contents. |  * Constants to define how the chapters and subchapters of a book should be displayed in that table of contents. | ||||||
|  | |||||||
| @ -14,7 +14,8 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreUser } from '@features/user/services/user'; | import { CoreUser } from '@features/user/services/user'; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| @ -26,6 +26,7 @@ import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWar | |||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { AddonModChoiceOffline } from './choice-offline'; | import { AddonModChoiceOffline } from './choice-offline'; | ||||||
| import { AddonModChoiceAutoSyncData, AddonModChoiceSyncProvider } from './choice-sync'; | import { AddonModChoiceAutoSyncData, AddonModChoiceSyncProvider } from './choice-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModChoice:'; | const ROOT_CACHE_KEY = 'mmaModChoice:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreRatingInfo } from '@features/rating/services/rating'; | import { CoreRatingInfo } from '@features/rating/services/rating'; | ||||||
| @ -29,6 +29,7 @@ import { makeSingleton, Translate } from '@singletons'; | |||||||
| import { AddonModDataFieldsDelegate } from './data-fields-delegate'; | import { AddonModDataFieldsDelegate } from './data-fields-delegate'; | ||||||
| import { AddonModDataOffline } from './data-offline'; | import { AddonModDataOffline } from './data-offline'; | ||||||
| import { AddonModDataAutoSyncData, AddonModDataSyncProvider } from './data-sync'; | import { AddonModDataAutoSyncData, AddonModDataSyncProvider } from './data-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModData:'; | const ROOT_CACHE_KEY = 'mmaModData:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; | import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourse, CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourse, CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseModuleData } from '@features/course/services/course-helper'; | import { CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||||
| import { CanLeave } from '@guards/can-leave'; | import { CanLeave } from '@guards/can-leave'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| @ -25,6 +25,7 @@ import { CoreWSExternalFile, CoreWSExternalWarning, CoreWSStoredFile } from '@se | |||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { AddonModFeedbackOffline } from './feedback-offline'; | import { AddonModFeedbackOffline } from './feedback-offline'; | ||||||
| import { AddonModFeedbackAutoSyncData, AddonModFeedbackSyncProvider } from './feedback-sync'; | import { AddonModFeedbackAutoSyncData, AddonModFeedbackSyncProvider } from './feedback-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'AddonModFeedback:'; | const ROOT_CACHE_KEY = 'AddonModFeedback:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,8 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourse } from '@features/course/services/course'; | import { CoreCourse } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
|  | |||||||
| @ -86,7 +86,7 @@ export class AddonModForumPostOptionsMenuComponent implements OnInit { | |||||||
|      */ |      */ | ||||||
|     protected setOpenInBrowserUrl(): void { |     protected setOpenInBrowserUrl(): void { | ||||||
|         const site = CoreSites.getRequiredCurrentSite(); |         const site = CoreSites.getRequiredCurrentSite(); | ||||||
|         if (!CoreSites.shouldDisplayInformativeLinks(site)) { |         if (!site.shouldDisplayInformativeLinks()) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -167,7 +167,7 @@ export class AddonModForumDiscussionPage implements OnInit, AfterViewInit, OnDes | |||||||
| 
 | 
 | ||||||
|         const currentSite = CoreSites.getCurrentSite(); |         const currentSite = CoreSites.getCurrentSite(); | ||||||
|         this.isOnline = CoreNetwork.isOnline(); |         this.isOnline = CoreNetwork.isOnline(); | ||||||
|         this.externalUrl = currentSite && CoreSites.shouldDisplayInformativeLinks(currentSite) ? |         this.externalUrl = currentSite && currentSite.shouldDisplayInformativeLinks() ? | ||||||
|             currentSite.createSiteUrl('/mod/forum/discuss.php', { d: this.discussionId.toString() }) : |             currentSite.createSiteUrl('/mod/forum/discuss.php', { d: this.discussionId.toString() }) : | ||||||
|             undefined; |             undefined; | ||||||
|         this.onlineObserver = CoreNetwork.onChange().subscribe(() => { |         this.onlineObserver = CoreNetwork.onChange().subscribe(() => { | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreRatingInfo } from '@features/rating/services/rating'; | import { CoreRatingInfo } from '@features/rating/services/rating'; | ||||||
| @ -29,6 +29,7 @@ import { CoreUtils } from '@services/utils/utils'; | |||||||
| import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning, CoreWSStoredFile } from '@services/ws'; | import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning, CoreWSStoredFile } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { AddonModForumOffline, AddonModForumOfflineDiscussion, AddonModForumReplyOptions } from './forum-offline'; | import { AddonModForumOffline, AddonModForumOfflineDiscussion, AddonModForumReplyOptions } from './forum-offline'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModForum:'; | const ROOT_CACHE_KEY = 'mmaModForum:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader'; | import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader'; | ||||||
| @ -28,6 +28,7 @@ import { makeSingleton, Translate } from '@singletons'; | |||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
| import { AddonModGlossaryEntryDBRecord, ENTRIES_TABLE_NAME } from './database/glossary'; | import { AddonModGlossaryEntryDBRecord, ENTRIES_TABLE_NAME } from './database/glossary'; | ||||||
| import { AddonModGlossaryOffline } from './glossary-offline'; | import { AddonModGlossaryOffline } from './glossary-offline'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| export const GLOSSARY_ENTRY_ADDED = 'addon_mod_glossary_entry_added'; | export const GLOSSARY_ENTRY_ADDED = 'addon_mod_glossary_entry_added'; | ||||||
| export const GLOSSARY_ENTRY_UPDATED = 'addon_mod_glossary_entry_updated'; | export const GLOSSARY_ENTRY_UPDATED = 'addon_mod_glossary_entry_updated'; | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Component, Optional, OnInit, OnDestroy, Output, EventEmitter } from '@a | |||||||
| import { IonContent } from '@ionic/angular'; | import { IonContent } from '@ionic/angular'; | ||||||
| 
 | 
 | ||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } from '@/core/constants'; | ||||||
| import { CoreSite } from '@classes/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'; | ||||||
| import { CoreH5PDisplayOptions } from '@features/h5p/classes/core'; | import { CoreH5PDisplayOptions } from '@features/h5p/classes/core'; | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; | |||||||
| import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
| import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; | import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreH5P } from '@features/h5p/services/h5p'; | import { CoreH5P } from '@features/h5p/services/h5p'; | ||||||
| import { CoreH5PDisplayOptions } from '@features/h5p/classes/core'; | import { CoreH5PDisplayOptions } from '@features/h5p/classes/core'; | ||||||
| @ -27,6 +27,7 @@ import { CoreWSError } from '@classes/errors/wserror'; | |||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { AddonModH5PActivityAutoSyncData, AddonModH5PActivitySyncProvider } from './h5pactivity-sync'; | import { AddonModH5PActivityAutoSyncData, AddonModH5PActivitySyncProvider } from './h5pactivity-sync'; | ||||||
| import { CoreTime } from '@singletons/time'; | import { CoreTime } from '@singletons/time'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| export const MOD_H5PACTIVITY_STATE_ID = 'state'; | export const MOD_H5PACTIVITY_STATE_ID = 'state'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourse, CoreCourseModuleContentFile } from '@features/course/services/course'; | import { CoreCourse, CoreCourseModuleContentFile } from '@features/course/services/course'; | ||||||
| import { CoreCourseModuleData } from '@features/course/services/course-helper'; | import { CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| @ -26,6 +26,7 @@ import { CoreUtils } from '@services/utils/utils'; | |||||||
| import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { CorePath } from '@singletons/path'; | import { CorePath } from '@singletons/path'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModImscp:'; | const ROOT_CACHE_KEY = 'mmaModImscp:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,8 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreFilepool } from '@services/filepool'; | import { CoreFilepool } from '@services/filepool'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreGradesProvider } from '@features/grades/services/grades'; | import { CoreGradesProvider } from '@features/grades/services/grades'; | ||||||
| @ -28,6 +28,7 @@ import { CoreEvents } from '@singletons/events'; | |||||||
| import { AddonModLessonPasswordDBRecord, PASSWORD_TABLE_NAME } from './database/lesson'; | import { AddonModLessonPasswordDBRecord, PASSWORD_TABLE_NAME } from './database/lesson'; | ||||||
| import { AddonModLessonOffline, AddonModLessonPageAttemptRecord } from './lesson-offline'; | import { AddonModLessonOffline, AddonModLessonPageAttemptRecord } from './lesson-offline'; | ||||||
| import { AddonModLessonAutoSyncData, AddonModLessonSyncProvider } from './lesson-sync'; | import { AddonModLessonAutoSyncData, AddonModLessonSyncProvider } from './lesson-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModLesson:'; | const ROOT_CACHE_KEY = 'mmaModLesson:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,7 +15,8 @@ | |||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| 
 | 
 | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreFile } from '@services/file'; | import { CoreFile } from '@services/file'; | ||||||
| import { CorePlatform } from '@services/platform'; | import { CorePlatform } from '@services/platform'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSitesCommonWSOptions, CoreSites } from '@services/sites'; | import { CoreSitesCommonWSOptions, CoreSites } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws'; | import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { CoreFilepool } from '@services/filepool'; | import { CoreFilepool } from '@services/filepool'; | ||||||
| @ -22,6 +22,7 @@ import { CoreCourse } from '@features/course/services/course'; | |||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModPage:'; | const ROOT_CACHE_KEY = 'mmaModPage:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper'; | import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper'; | ||||||
| @ -40,6 +40,7 @@ import { AddonModQuizAccessRuleDelegate } from './access-rules-delegate'; | |||||||
| import { AddonModQuizAttempt } from './quiz-helper'; | import { AddonModQuizAttempt } from './quiz-helper'; | ||||||
| import { AddonModQuizOffline, AddonModQuizQuestionsWithAnswers } from './quiz-offline'; | import { AddonModQuizOffline, AddonModQuizQuestionsWithAnswers } from './quiz-offline'; | ||||||
| import { AddonModQuizAutoSyncData, AddonModQuizSyncProvider } from './quiz-sync'; | import { AddonModQuizAutoSyncData, AddonModQuizSyncProvider } from './quiz-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModQuiz:'; | const ROOT_CACHE_KEY = 'mmaModQuiz:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,8 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
|  | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourse } from '@features/course/services/course'; | import { CoreCourse } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreFilepool } from '@services/filepool'; | import { CoreFilepool } from '@services/filepool'; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } 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, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreFilepool } from '@services/filepool'; | import { CoreFilepool } from '@services/filepool'; | ||||||
| @ -31,6 +31,7 @@ import { CoreEvents } from '@singletons/events'; | |||||||
| import { CorePath } from '@singletons/path'; | import { CorePath } from '@singletons/path'; | ||||||
| import { AddonModScormOffline } from './scorm-offline'; | import { AddonModScormOffline } from './scorm-offline'; | ||||||
| import { AddonModScormAutoSyncEventData, AddonModScormSyncProvider } from './scorm-sync'; | import { AddonModScormAutoSyncEventData, AddonModScormSyncProvider } from './scorm-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| // Private constants.
 | // Private constants.
 | ||||||
| const VALID_STATUSES = ['notattempted', 'passed', 'completed', 'failed', 'incomplete', 'browsed', 'suspend']; | const VALID_STATUSES = ['notattempted', 'passed', 'completed', 'failed', 'incomplete', 'browsed', 'suspend']; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| @ -24,6 +24,7 @@ import { CoreUtils } from '@services/utils/utils'; | |||||||
| import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; | import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { AddonModSurveyOffline } from './survey-offline'; | import { AddonModSurveyOffline } from './survey-offline'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModSurvey:'; | const ROOT_CACHE_KEY = 'mmaModSurvey:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws'; | import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } from '@/core/constants'; | ||||||
| @ -23,6 +23,7 @@ import { CoreCourse } from '@features/course/services/course'; | |||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModUrl:'; | const ROOT_CACHE_KEY = 'mmaModUrl:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreTagItem } from '@features/tag/services/tag'; | import { CoreTagItem } from '@features/tag/services/tag'; | ||||||
| @ -28,6 +28,7 @@ import { CoreEvents } from '@singletons/events'; | |||||||
| import { AddonModWikiPageDBRecord } from './database/wiki'; | import { AddonModWikiPageDBRecord } from './database/wiki'; | ||||||
| import { AddonModWikiOffline } from './wiki-offline'; | import { AddonModWikiOffline } from './wiki-offline'; | ||||||
| import { AddonModWikiAutoSyncData, AddonModWikiManualSyncData, AddonModWikiSyncProvider } from './wiki-sync'; | import { AddonModWikiAutoSyncData, AddonModWikiManualSyncData, AddonModWikiSyncProvider } from './wiki-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModWiki:'; | const ROOT_CACHE_KEY = 'mmaModWiki:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||||
| import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | import { CoreCourseLogHelper } from '@features/course/services/log-helper'; | ||||||
| import { CoreGradesMenuItem } from '@features/grades/services/grades-helper'; | import { CoreGradesMenuItem } from '@features/grades/services/grades-helper'; | ||||||
| @ -28,6 +28,7 @@ import { CoreFormFields } from '@singletons/form'; | |||||||
| import { AddonModWorkshopOffline } from './workshop-offline'; | import { AddonModWorkshopOffline } from './workshop-offline'; | ||||||
| import { AddonModWorkshopAutoSyncData, AddonModWorkshopSyncProvider } from './workshop-sync'; | import { AddonModWorkshopAutoSyncData, AddonModWorkshopSyncProvider } from './workshop-sync'; | ||||||
| import { ADDON_MOD_WORKSHOP_COMPONENT } from '@addons/mod/workshop/constants'; | import { ADDON_MOD_WORKSHOP_COMPONENT } from '@addons/mod/workshop/constants'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaModWorkshop:'; | const ROOT_CACHE_KEY = 'mmaModWorkshop:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreUser } from '@features/user/services/user'; | import { CoreUser } from '@features/user/services/user'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| @ -22,6 +22,7 @@ import { CoreUtils } from '@services/utils/utils'; | |||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { AddonNotesOffline } from './notes-offline'; | import { AddonNotesOffline } from './notes-offline'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaNotes:'; | const ROOT_CACHE_KEY = 'mmaNotes:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -19,11 +19,12 @@ import { CoreWSExternalWarning } from '@services/ws'; | |||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
| import { CoreTimeUtils } from '@services/utils/time'; | import { CoreTimeUtils } from '@services/utils/time'; | ||||||
| import { CoreUser, USER_NOREPLY_USER } from '@features/user/services/user'; | import { CoreUser, USER_NOREPLY_USER } from '@features/user/services/user'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| import { Translate, makeSingleton } from '@singletons'; | import { Translate, makeSingleton } from '@singletons'; | ||||||
| import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; | import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; | ||||||
| import { AddonNotificationsPushNotification } from './handlers/push-click'; | import { AddonNotificationsPushNotification } from './handlers/push-click'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| declare module '@singletons/events' { | declare module '@singletons/events' { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; | |||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreMimetypeUtils } from '@services/utils/mimetype'; | import { CoreMimetypeUtils } from '@services/utils/mimetype'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmaFiles:'; | const ROOT_CACHE_KEY = 'mmaFiles:'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } from '@/core/constants'; | ||||||
| import { CoreSitePublicConfigResponse } from '@classes/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'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| 
 | 
 | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreWSError } from '@classes/errors/wserror'; | import { CoreWSError } from '@classes/errors/wserror'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ import { Subscription } from 'rxjs'; | |||||||
| import { AsyncDirective } from './async-directive'; | import { AsyncDirective } from './async-directive'; | ||||||
| import { PageLoadsManager } from './page-loads-manager'; | import { PageLoadsManager } from './page-loads-manager'; | ||||||
| import { CorePromisedValue } from './promised-value'; | import { CorePromisedValue } from './promised-value'; | ||||||
| import { WSObservable } from './site'; | import { WSObservable } from './sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Class to watch requests from a page load (including requests from page sub-components). |  * Class to watch requests from a page load (including requests from page sub-components). | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										964
									
								
								src/core/classes/sites/site.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										964
									
								
								src/core/classes/sites/site.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,964 @@ | |||||||
|  | // (C) Copyright 2015 Moodle Pty Ltd.
 | ||||||
|  | //
 | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||||
|  | // you may not use this file except in compliance with the License.
 | ||||||
|  | // You may obtain a copy of the License at
 | ||||||
|  | //
 | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | //
 | ||||||
|  | // Unless required by applicable law or agreed to in writing, software
 | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||||
|  | // See the License for the specific language governing permissions and
 | ||||||
|  | // limitations under the License.
 | ||||||
|  | 
 | ||||||
|  | import { InAppBrowserObject, InAppBrowserOptions } from '@ionic-native/in-app-browser'; | ||||||
|  | 
 | ||||||
|  | import { CoreNetwork } from '@services/network'; | ||||||
|  | import { CoreDB } from '@services/db'; | ||||||
|  | import { CoreEventData, CoreEvents } from '@singletons/events'; | ||||||
|  | import { CoreFile } from '@services/file'; | ||||||
|  | import { | ||||||
|  |     CoreWS, | ||||||
|  |     CoreWSFileUploadOptions, | ||||||
|  |     CoreWSExternalWarning, | ||||||
|  |     CoreWSUploadFileResult, | ||||||
|  | } from '@services/ws'; | ||||||
|  | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
|  | import { CoreTextUtils } from '@services/utils/text'; | ||||||
|  | import { CoreTimeUtils } from '@services/utils/time'; | ||||||
|  | import { CoreUrlUtils } from '@services/utils/url'; | ||||||
|  | import { CoreUtils, CoreUtilsOpenInBrowserOptions } from '@services/utils/utils'; | ||||||
|  | import { CoreConstants } from '@/core/constants'; | ||||||
|  | import { SQLiteDB } from '@classes/sqlitedb'; | ||||||
|  | import { CoreError } from '@classes/errors/error'; | ||||||
|  | import { CoreLogger } from '@singletons/logger'; | ||||||
|  | import { Translate } from '@singletons'; | ||||||
|  | import { CoreIonLoadingElement } from '../ion-loading'; | ||||||
|  | import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
|  | import { asyncInstance, AsyncInstance } from '../../utils/async-instance'; | ||||||
|  | import { CoreDatabaseTable } from '../database/database-table'; | ||||||
|  | import { CoreDatabaseCachingStrategy } from '../database/database-table-proxy'; | ||||||
|  | import { | ||||||
|  |     CONFIG_TABLE, | ||||||
|  |     CoreSiteConfigDBRecord, | ||||||
|  |     CoreSiteLastViewedDBRecord, | ||||||
|  |     CoreSiteWSCacheRecord, | ||||||
|  |     LAST_VIEWED_TABLE, | ||||||
|  |     WS_CACHE_TABLE, | ||||||
|  | } from '@services/database/sites'; | ||||||
|  | import { map } from 'rxjs/operators'; | ||||||
|  | import { firstValueFrom } from '../../utils/rxjs'; | ||||||
|  | import { CoreFilepool } from '@services/filepool'; | ||||||
|  | import { CoreSiteInfo } from './unauthenticated-site'; | ||||||
|  | import { CoreAuthenticatedSite, CoreAuthenticatedSiteOptionalData, CoreSiteWSPreSets, WSObservable } from './authenticated-site'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Class that represents a site (combination of site + user). | ||||||
|  |  * It will have all the site data and provide utility functions regarding a site. | ||||||
|  |  */ | ||||||
|  | export class CoreSite extends CoreAuthenticatedSite { | ||||||
|  | 
 | ||||||
|  |     id: string; | ||||||
|  |     config?: CoreSiteConfig; | ||||||
|  |     loggedOut?: boolean; | ||||||
|  | 
 | ||||||
|  |     protected db!: SQLiteDB; | ||||||
|  |     protected cacheTable: AsyncInstance<CoreDatabaseTable<CoreSiteWSCacheRecord>>; | ||||||
|  |     protected configTable: AsyncInstance<CoreDatabaseTable<CoreSiteConfigDBRecord, 'name'>>; | ||||||
|  |     protected lastViewedTable: AsyncInstance<CoreDatabaseTable<CoreSiteLastViewedDBRecord, 'component' | 'id'>>; | ||||||
|  |     protected lastAutoLogin = 0; | ||||||
|  |     protected tokenPluginFileWorks?: boolean; | ||||||
|  |     protected tokenPluginFileWorksPromise?: Promise<boolean>; | ||||||
|  |     protected oauthId?: number; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Create a site. | ||||||
|  |      * | ||||||
|  |      * @param id Site ID. | ||||||
|  |      * @param siteUrl Site URL. | ||||||
|  |      * @param token Site's WS token. | ||||||
|  |      * @param otherData Other data. | ||||||
|  |      */ | ||||||
|  |     constructor( | ||||||
|  |         id: string, | ||||||
|  |         siteUrl: string, | ||||||
|  |         token: string, | ||||||
|  |         otherData: CoreSiteOptionalData = {}, | ||||||
|  |     ) { | ||||||
|  |         super(siteUrl, token, otherData); | ||||||
|  | 
 | ||||||
|  |         this.id = id; | ||||||
|  |         this.config = otherData.config; | ||||||
|  |         this.loggedOut = otherData.loggedOut; | ||||||
|  |         this.logger = CoreLogger.getInstance('CoreSite'); | ||||||
|  | 
 | ||||||
|  |         this.cacheTable = asyncInstance(() => CoreSites.getSiteTable(WS_CACHE_TABLE, { | ||||||
|  |             siteId: this.getId(), | ||||||
|  |             database: this.getDb(), | ||||||
|  |             config: { cachingStrategy: CoreDatabaseCachingStrategy.None }, | ||||||
|  |         })); | ||||||
|  | 
 | ||||||
|  |         this.configTable = asyncInstance(() => CoreSites.getSiteTable(CONFIG_TABLE, { | ||||||
|  |             siteId: this.getId(), | ||||||
|  |             database: this.getDb(), | ||||||
|  |             config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager }, | ||||||
|  |             primaryKeyColumns: ['name'], | ||||||
|  |         })); | ||||||
|  | 
 | ||||||
|  |         this.lastViewedTable = asyncInstance(() => CoreSites.getSiteTable(LAST_VIEWED_TABLE, { | ||||||
|  |             siteId: this.getId(), | ||||||
|  |             database: this.getDb(), | ||||||
|  |             config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager }, | ||||||
|  |             primaryKeyColumns: ['component', 'id'], | ||||||
|  |         })); | ||||||
|  |         this.setInfo(otherData.info); | ||||||
|  |         this.calculateOfflineDisabled(); | ||||||
|  | 
 | ||||||
|  |         this.db = CoreDB.getDB('Site-' + this.id); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get site ID. | ||||||
|  |      * | ||||||
|  |      * @returns Site ID. | ||||||
|  |      */ | ||||||
|  |     getId(): string { | ||||||
|  |         return this.id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get site DB. | ||||||
|  |      * | ||||||
|  |      * @returns Site DB. | ||||||
|  |      */ | ||||||
|  |     getDb(): SQLiteDB { | ||||||
|  |         return this.db; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if user logged out from the site and needs to authenticate again. | ||||||
|  |      * | ||||||
|  |      * @returns Whether is logged out. | ||||||
|  |      */ | ||||||
|  |     isLoggedOut(): boolean { | ||||||
|  |         return !!this.loggedOut; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get OAuth ID. | ||||||
|  |      * | ||||||
|  |      * @returns OAuth ID. | ||||||
|  |      */ | ||||||
|  |     getOAuthId(): number | undefined { | ||||||
|  |         return this.oauthId; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Set site config. | ||||||
|  |      * | ||||||
|  |      * @param config Config. | ||||||
|  |      */ | ||||||
|  |     setConfig(config: CoreSiteConfig): void { | ||||||
|  |         if (config) { | ||||||
|  |             config.tool_mobile_disabledfeatures = CoreTextUtils.treatDisabledFeatures(config.tool_mobile_disabledfeatures); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.config = config; | ||||||
|  |         this.calculateOfflineDisabled(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Set site logged out. | ||||||
|  |      * | ||||||
|  |      * @param loggedOut True if logged out and needs to authenticate again, false otherwise. | ||||||
|  |      */ | ||||||
|  |     setLoggedOut(loggedOut: boolean): void { | ||||||
|  |         this.loggedOut = !!loggedOut; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Set OAuth ID. | ||||||
|  |      * | ||||||
|  |      * @param oauthId OAuth ID. | ||||||
|  |      */ | ||||||
|  |     setOAuthId(oauthId: number | undefined): void { | ||||||
|  |         this.oauthId = oauthId; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if the user authenticated in the site using an OAuth method. | ||||||
|  |      * | ||||||
|  |      * @returns Whether the user authenticated in the site using an OAuth method. | ||||||
|  |      */ | ||||||
|  |     isOAuth(): boolean { | ||||||
|  |         return this.oauthId != null && this.oauthId !== undefined; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     protected async getCacheEntryById(id: string): Promise<CoreSiteWSCacheRecord> { | ||||||
|  |         return this.cacheTable.getOneByPrimaryKey({ id }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     protected async getCacheEntriesByKey(key: string): Promise<CoreSiteWSCacheRecord[]> { | ||||||
|  |         return this.cacheTable.getMany({ key }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     protected async storeCacheEntry(entry: CoreSiteWSCacheRecord): Promise<void> { | ||||||
|  |         await this.cacheTable.insert(entry); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | ||||||
|  |     protected async deleteFromCache(method: string, data: any, preSets: CoreSiteWSPreSets, allCacheKey?: boolean): Promise<void> { | ||||||
|  |         if (allCacheKey) { | ||||||
|  |             await this.cacheTable.delete({ key: preSets.cacheKey }); | ||||||
|  |         } else { | ||||||
|  |             await this.cacheTable.deleteByPrimaryKey({ id: this.getCacheId(method, data) }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Gets the size of cached data for a specific component or component instance. | ||||||
|  |      * | ||||||
|  |      * @param component Component name | ||||||
|  |      * @param componentId Optional component id (if not included, returns sum for whole component) | ||||||
|  |      * @returns Promise resolved when we have calculated the size | ||||||
|  |      */ | ||||||
|  |     async getComponentCacheSize(component: string, componentId?: number): Promise<number> { | ||||||
|  |         const params: Array<string | number> = [component]; | ||||||
|  |         let extraClause = ''; | ||||||
|  |         if (componentId !== undefined && componentId !== null) { | ||||||
|  |             params.push(componentId); | ||||||
|  |             extraClause = ' AND componentId = ?'; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return this.cacheTable.reduce( | ||||||
|  |             { | ||||||
|  |                 sql: 'SUM(length(data))', | ||||||
|  |                 js: (size, record) => size + record.data.length, | ||||||
|  |                 jsInitialValue: 0, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 sql: 'WHERE component = ?' + extraClause, | ||||||
|  |                 sqlParams: params, | ||||||
|  |                 js: record => record.component === component && (params.length === 1 || record.componentId === componentId), | ||||||
|  |             }, | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Deletes WS cache entries for all methods relating to a specific component (and | ||||||
|  |      * optionally component id). | ||||||
|  |      * | ||||||
|  |      * @param component Component name. | ||||||
|  |      * @param componentId Component id. | ||||||
|  |      * @returns Promise resolved when the entries are deleted. | ||||||
|  |      */ | ||||||
|  |     async deleteComponentFromCache(component: string, componentId?: number): Promise<void> { | ||||||
|  |         if (!component) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const params = { component }; | ||||||
|  | 
 | ||||||
|  |         if (componentId) { | ||||||
|  |             params['componentId'] = componentId; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         await this.cacheTable.delete(params); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* | ||||||
|  |      * Uploads a file using Cordova File API. | ||||||
|  |      * | ||||||
|  |      * @param filePath File path. | ||||||
|  |      * @param options File upload options. | ||||||
|  |      * @param onProgress Function to call on progress. | ||||||
|  |      * @returns Promise resolved when uploaded. | ||||||
|  |      */ | ||||||
|  |     uploadFile( | ||||||
|  |         filePath: string, | ||||||
|  |         options: CoreWSFileUploadOptions, | ||||||
|  |         onProgress?: (event: ProgressEvent) => void, | ||||||
|  |     ): Promise<CoreWSUploadFileResult> { | ||||||
|  |         if (!options.fileArea) { | ||||||
|  |             options.fileArea = 'draft'; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return CoreWS.uploadFile(filePath, options, { | ||||||
|  |             siteUrl: this.siteUrl, | ||||||
|  |             wsToken: this.token || '', | ||||||
|  |         }, onProgress); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Invalidates all caches related to the site. | ||||||
|  |      */ | ||||||
|  |     async invalidateCaches(): Promise<void> { | ||||||
|  |         await Promise.all([ | ||||||
|  |             CoreFilepool.invalidateAllFiles(this.getId()), | ||||||
|  |             this.invalidateWsCache(), | ||||||
|  |         ]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     async invalidateWsCache(): Promise<void> { | ||||||
|  |         this.logger.debug('Invalidate all the cache for site: ' + this.id); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             await this.cacheTable.update({ expirationTime: 0 }); | ||||||
|  |         } finally { | ||||||
|  |             CoreEvents.trigger(CoreEvents.WS_CACHE_INVALIDATED, {}, this.getId()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     async invalidateWsCacheForKey(key: string): Promise<void> { | ||||||
|  |         if (!key) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.logger.debug('Invalidate cache for key: ' + key); | ||||||
|  | 
 | ||||||
|  |         await this.cacheTable.update({ expirationTime: 0 }, { key }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     async invalidateWsCacheForKeyStartingWith(key: string): Promise<void> { | ||||||
|  |         if (!key) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.logger.debug('Invalidate cache for key starting with: ' + key); | ||||||
|  | 
 | ||||||
|  |         await this.cacheTable.updateWhere({ expirationTime: 0 }, { | ||||||
|  |             sql: 'key LIKE ?', | ||||||
|  |             sqlParams: [key + '%'], | ||||||
|  |             js: record => !!record.key?.startsWith(key), | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if tokenpluginfile can be used, and fix the URL afterwards. | ||||||
|  |      * | ||||||
|  |      * @param url The url to be fixed. | ||||||
|  |      * @returns Promise resolved with the fixed URL. | ||||||
|  |      */ | ||||||
|  |     checkAndFixPluginfileURL(url: string): Promise<string> { | ||||||
|  |         return this.checkTokenPluginFile(url).then(() => this.fixPluginfileURL(url)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Generic function for adding the wstoken to Moodle urls and for pointing to the correct script. | ||||||
|  |      * Uses CoreUtilsProvider.fixPluginfileURL, passing site's token. | ||||||
|  |      * | ||||||
|  |      * @param url The url to be fixed. | ||||||
|  |      * @returns Fixed URL. | ||||||
|  |      */ | ||||||
|  |     fixPluginfileURL(url: string): string { | ||||||
|  |         const accessKey = this.tokenPluginFileWorks || this.tokenPluginFileWorks === undefined ? | ||||||
|  |             this.infos && this.infos.userprivateaccesskey : undefined; | ||||||
|  | 
 | ||||||
|  |         return CoreUrlUtils.fixPluginfileURL(url, this.token || '', this.siteUrl, accessKey); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Deletes site's DB. | ||||||
|  |      * | ||||||
|  |      * @returns Promise to be resolved when the DB is deleted. | ||||||
|  |      */ | ||||||
|  |     async deleteDB(): Promise<void> { | ||||||
|  |         await CoreDB.deleteDB('Site-' + this.id); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Deletes site's folder. | ||||||
|  |      * | ||||||
|  |      * @returns Promise to be resolved when the DB is deleted. | ||||||
|  |      */ | ||||||
|  |     async deleteFolder(): Promise<void> { | ||||||
|  |         if (!CoreFile.isAvailable() || !this.id) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const siteFolder = CoreFile.getSiteFolder(this.id); | ||||||
|  | 
 | ||||||
|  |         // Ignore any errors, removeDir fails if folder doesn't exists.
 | ||||||
|  |         await CoreUtils.ignoreErrors(CoreFile.removeDir(siteFolder)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get space usage of the site. | ||||||
|  |      * | ||||||
|  |      * @returns Promise resolved with the site space usage (size). | ||||||
|  |      */ | ||||||
|  |     getSpaceUsage(): Promise<number> { | ||||||
|  |         if (CoreFile.isAvailable() && this.id) { | ||||||
|  |             const siteFolderPath = CoreFile.getSiteFolder(this.id); | ||||||
|  | 
 | ||||||
|  |             return CoreFile.getDirectorySize(siteFolderPath).catch(() => 0); | ||||||
|  |         } else { | ||||||
|  |             return Promise.resolve(0); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Gets an approximation of the cache table usage of the site. | ||||||
|  |      * | ||||||
|  |      * Currently this is just the total length of the data fields in the cache table. | ||||||
|  |      * | ||||||
|  |      * @returns Promise resolved with the total size of all data in the cache table (bytes) | ||||||
|  |      */ | ||||||
|  |     async getCacheUsage(): Promise<number> { | ||||||
|  |         return this.cacheTable.reduce({ | ||||||
|  |             sql: 'SUM(length(data))', | ||||||
|  |             js: (size, record) => size + record.data.length, | ||||||
|  |             jsInitialValue: 0, | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Gets a total of the file and cache usage. | ||||||
|  |      * | ||||||
|  |      * @returns Promise with the total of getSpaceUsage and getCacheUsage | ||||||
|  |      */ | ||||||
|  |     async getTotalUsage(): Promise<number> { | ||||||
|  |         const space = await this.getSpaceUsage(); | ||||||
|  |         const cache = await this.getCacheUsage(); | ||||||
|  | 
 | ||||||
|  |         return space + cache; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if GET method is supported for AJAX calls. | ||||||
|  |      * | ||||||
|  |      * @returns Whether it's supported. | ||||||
|  |      */ | ||||||
|  |     protected isAjaxGetSupported(): boolean { | ||||||
|  |         return !!this.getInfo() && this.isVersionGreaterEqualThan('3.8'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Open a URL in browser using auto-login in the Moodle site if available. | ||||||
|  |      * | ||||||
|  |      * @param url The URL to open. | ||||||
|  |      * @param alertMessage If defined, an alert will be shown before opening the browser. | ||||||
|  |      * @param options Other options. | ||||||
|  |      * @returns Promise resolved when done, rejected otherwise. | ||||||
|  |      */ | ||||||
|  |     async openInBrowserWithAutoLogin( | ||||||
|  |         url: string, | ||||||
|  |         alertMessage?: string, | ||||||
|  |         options: CoreUtilsOpenInBrowserOptions = {}, | ||||||
|  |     ): Promise<void> { | ||||||
|  |         await this.openWithAutoLogin(false, url, options, alertMessage); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Open a URL in browser using auto-login in the Moodle site if available and the URL belongs to the site. | ||||||
|  |      * | ||||||
|  |      * @param url The URL to open. | ||||||
|  |      * @param alertMessage If defined, an alert will be shown before opening the browser. | ||||||
|  |      * @param options Other options. | ||||||
|  |      * @returns Promise resolved when done, rejected otherwise. | ||||||
|  |      * @deprecated since 4.1. Use openInBrowserWithAutoLogin instead, now it always checks that URL belongs to same site. | ||||||
|  |      */ | ||||||
|  |     async openInBrowserWithAutoLoginIfSameSite( | ||||||
|  |         url: string, | ||||||
|  |         alertMessage?: string, | ||||||
|  |         options: CoreUtilsOpenInBrowserOptions = {}, | ||||||
|  |     ): Promise<void> { | ||||||
|  |         return this.openInBrowserWithAutoLogin(url, alertMessage, options); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Open a URL in inappbrowser using auto-login in the Moodle site if available. | ||||||
|  |      * | ||||||
|  |      * @param url The URL to open. | ||||||
|  |      * @param options Override default options passed to InAppBrowser. | ||||||
|  |      * @param alertMessage If defined, an alert will be shown before opening the inappbrowser. | ||||||
|  |      * @returns Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     async openInAppWithAutoLogin(url: string, options?: InAppBrowserOptions, alertMessage?: string): Promise<InAppBrowserObject> { | ||||||
|  |         const iabInstance = <InAppBrowserObject> await this.openWithAutoLogin(true, url, options, alertMessage); | ||||||
|  | 
 | ||||||
|  |         return iabInstance; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Open a URL in inappbrowser using auto-login in the Moodle site if available and the URL belongs to the site. | ||||||
|  |      * | ||||||
|  |      * @param url The URL to open. | ||||||
|  |      * @param options Override default options passed to inappbrowser. | ||||||
|  |      * @param alertMessage If defined, an alert will be shown before opening the inappbrowser. | ||||||
|  |      * @returns Promise resolved when done. | ||||||
|  |      * @deprecated since 4.1. Use openInAppWithAutoLogin instead, now it always checks that URL belongs to same site. | ||||||
|  |      */ | ||||||
|  |     async openInAppWithAutoLoginIfSameSite( | ||||||
|  |         url: string, | ||||||
|  |         options?: InAppBrowserOptions, | ||||||
|  |         alertMessage?: string, | ||||||
|  |     ): Promise<InAppBrowserObject> { | ||||||
|  |         return this.openInAppWithAutoLogin(url, options, alertMessage); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Open a URL in browser or InAppBrowser using auto-login in the Moodle site if available. | ||||||
|  |      * | ||||||
|  |      * @param inApp True to open it in InAppBrowser, false to open in browser. | ||||||
|  |      * @param url The URL to open. | ||||||
|  |      * @param options Override default options passed to $cordovaInAppBrowser#open. | ||||||
|  |      * @param alertMessage If defined, an alert will be shown before opening the browser/inappbrowser. | ||||||
|  |      * @returns Promise resolved when done. Resolve param is returned only if inApp=true. | ||||||
|  |      */ | ||||||
|  |     async openWithAutoLogin( | ||||||
|  |         inApp: boolean, | ||||||
|  |         url: string, | ||||||
|  |         options: InAppBrowserOptions & CoreUtilsOpenInBrowserOptions = {}, | ||||||
|  |         alertMessage?: string, | ||||||
|  |     ): Promise<InAppBrowserObject | void> { | ||||||
|  |         // Get the URL to open.
 | ||||||
|  |         const autoLoginUrl = await this.getAutoLoginUrl(url); | ||||||
|  | 
 | ||||||
|  |         if (alertMessage) { | ||||||
|  |             // Show an alert first.
 | ||||||
|  |             const alert = await CoreDomUtils.showAlert( | ||||||
|  |                 Translate.instant('core.notice'), | ||||||
|  |                 alertMessage, | ||||||
|  |                 undefined, | ||||||
|  |                 3000, | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             await alert.onDidDismiss(); | ||||||
|  |             options.showBrowserWarning = false; // A warning already shown, no need to show another.
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         options.originalUrl = url; | ||||||
|  | 
 | ||||||
|  |         // Open the URL.
 | ||||||
|  |         if (inApp) { | ||||||
|  |             return CoreUtils.openInApp(autoLoginUrl, options); | ||||||
|  |         } else { | ||||||
|  |             return CoreUtils.openInBrowser(autoLoginUrl, options); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Open a URL in browser or InAppBrowser using auto-login in the Moodle site if available and the URL belongs to the site. | ||||||
|  |      * | ||||||
|  |      * @param inApp True to open it in InAppBrowser, false to open in browser. | ||||||
|  |      * @param url The URL to open. | ||||||
|  |      * @param options Override default options passed to inappbrowser. | ||||||
|  |      * @param alertMessage If defined, an alert will be shown before opening the browser/inappbrowser. | ||||||
|  |      * @returns Promise resolved when done. Resolve param is returned only if inApp=true. | ||||||
|  |      * @deprecated since 4.1. Use openWithAutoLogin instead, now it always checks that URL belongs to same site. | ||||||
|  |      */ | ||||||
|  |     async openWithAutoLoginIfSameSite( | ||||||
|  |         inApp: boolean, | ||||||
|  |         url: string, | ||||||
|  |         options: InAppBrowserOptions & CoreUtilsOpenInBrowserOptions = {}, | ||||||
|  |         alertMessage?: string, | ||||||
|  |     ): Promise<InAppBrowserObject | void> { | ||||||
|  |         return this.openWithAutoLogin(inApp, url, options, alertMessage); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get the config of this site. | ||||||
|  |      * It is recommended to use getStoredConfig instead since it's faster and doesn't use network. | ||||||
|  |      * | ||||||
|  |      * @param name Name of the setting to get. If not set or false, all settings will be returned. | ||||||
|  |      * @param ignoreCache True if it should ignore cached data. | ||||||
|  |      * @returns Promise resolved with site config. | ||||||
|  |      */ | ||||||
|  |     getConfig(name?: undefined, ignoreCache?: boolean): Promise<CoreSiteConfig>; | ||||||
|  |     getConfig(name: string, ignoreCache?: boolean): Promise<string>; | ||||||
|  |     getConfig(name?: string, ignoreCache?: boolean): Promise<string | CoreSiteConfig> { | ||||||
|  |         return firstValueFrom( | ||||||
|  |             this.getConfigObservable(<string> name, ignoreCache ? CoreSitesReadingStrategy.ONLY_NETWORK : undefined), | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get the config of this site. | ||||||
|  |      * It is recommended to use getStoredConfig instead since it's faster and doesn't use network. | ||||||
|  |      * | ||||||
|  |      * @param name Name of the setting to get. If not set or false, all settings will be returned. | ||||||
|  |      * @param readingStrategy Reading strategy. | ||||||
|  |      * @returns Observable returning site config. | ||||||
|  |      */ | ||||||
|  |     getConfigObservable(name?: undefined, readingStrategy?: CoreSitesReadingStrategy): WSObservable<CoreSiteConfig>; | ||||||
|  |     getConfigObservable(name: string, readingStrategy?: CoreSitesReadingStrategy): WSObservable<string>; | ||||||
|  |     getConfigObservable(name?: string, readingStrategy?: CoreSitesReadingStrategy): WSObservable<string | CoreSiteConfig> { | ||||||
|  |         const preSets: CoreSiteWSPreSets = { | ||||||
|  |             cacheKey: this.getConfigCacheKey(), | ||||||
|  |             ...CoreSites.getReadingStrategyPreSets(readingStrategy), | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         return this.readObservable<CoreSiteConfigResponse>('tool_mobile_get_config', {}, preSets).pipe(map(config => { | ||||||
|  |             if (name) { | ||||||
|  |                 // Return the requested setting.
 | ||||||
|  |                 for (const x in config.settings) { | ||||||
|  |                     if (config.settings[x].name == name) { | ||||||
|  |                         return String(config.settings[x].value); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 throw new CoreError('Site config not found: ' + name); | ||||||
|  |             } else { | ||||||
|  |                 // Return all settings in the same array.
 | ||||||
|  |                 const settings: CoreSiteConfig = {}; | ||||||
|  |                 config.settings.forEach((setting) => { | ||||||
|  |                     settings[setting.name] = String(setting.value); | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|  |                 return settings; | ||||||
|  |             } | ||||||
|  |         })); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Invalidates config WS call. | ||||||
|  |      * | ||||||
|  |      * @returns Promise resolved when the data is invalidated. | ||||||
|  |      */ | ||||||
|  |     async invalidateConfig(): Promise<void> { | ||||||
|  |         await this.invalidateWsCacheForKey(this.getConfigCacheKey()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get cache key for getConfig WS calls. | ||||||
|  |      * | ||||||
|  |      * @returns Cache key. | ||||||
|  |      */ | ||||||
|  |     protected getConfigCacheKey(): string { | ||||||
|  |         return 'tool_mobile_get_config'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get the stored config of this site. | ||||||
|  |      * | ||||||
|  |      * @param name Name of the setting to get. If not set, all settings will be returned. | ||||||
|  |      * @returns Site config or a specific setting. | ||||||
|  |      */ | ||||||
|  |     getStoredConfig(): CoreSiteConfig | undefined; | ||||||
|  |     getStoredConfig(name: string): string | undefined; | ||||||
|  |     getStoredConfig(name?: string): string | CoreSiteConfig | undefined { | ||||||
|  |         if (!this.config) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (name) { | ||||||
|  |             return this.config[name]; | ||||||
|  |         } else { | ||||||
|  |             return this.config; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     protected getDisabledFeatures(): string | undefined { | ||||||
|  |         return this.config ? this.getStoredConfig('tool_mobile_disabledfeatures') : super.getDisabledFeatures(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @inheritdoc | ||||||
|  |      */ | ||||||
|  |     protected triggerSiteEvent<Fallback = unknown, Event extends string = string>( | ||||||
|  |         eventName: Event, | ||||||
|  |         data?: CoreEventData<Event, Fallback>, | ||||||
|  |     ): void { | ||||||
|  |         CoreEvents.trigger(eventName, data, this.id); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Calculate if offline is disabled in the site. | ||||||
|  |      */ | ||||||
|  |     calculateOfflineDisabled(): void { | ||||||
|  |         this.offlineDisabled = this.isFeatureDisabled('NoDelegate_CoreOffline'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get whether offline is disabled in the site. | ||||||
|  |      * | ||||||
|  |      * @returns Whether it's disabled. | ||||||
|  |      */ | ||||||
|  |     isOfflineDisabled(): boolean { | ||||||
|  |         return this.offlineDisabled; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Given a URL, convert it to a URL that will auto-login if supported. | ||||||
|  |      * | ||||||
|  |      * @param url The URL to convert. | ||||||
|  |      * @param showModal Whether to show a loading modal. | ||||||
|  |      * @returns Promise resolved with the converted URL. | ||||||
|  |      */ | ||||||
|  |     async getAutoLoginUrl(url: string, showModal: boolean = true): Promise<string> { | ||||||
|  |         if (!this.privateToken) { | ||||||
|  |             // No private token, don't change the URL.
 | ||||||
|  |             return url; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!this.containsUrl(url)) { | ||||||
|  |             // URL doesn't belong to the site, don't auto login.
 | ||||||
|  |             return url; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (this.lastAutoLogin > 0) { | ||||||
|  |             const timeBetweenRequests = await CoreUtils.ignoreErrors( | ||||||
|  |                 this.getConfig('tool_mobile_autologinmintimebetweenreq'), | ||||||
|  |                 CoreConstants.SECONDS_MINUTE * 6, | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             if (CoreTimeUtils.timestamp() - this.lastAutoLogin < Number(timeBetweenRequests)) { | ||||||
|  |                 // Not enough time has passed since last auto login.
 | ||||||
|  |                 return url; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const userId = this.getUserId(); | ||||||
|  |         const params = { | ||||||
|  |             privatetoken: this.privateToken, | ||||||
|  |         }; | ||||||
|  |         let modal: CoreIonLoadingElement | undefined; | ||||||
|  | 
 | ||||||
|  |         if (showModal) { | ||||||
|  |             modal = await CoreDomUtils.showModalLoading(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             // Use write to not use cache.
 | ||||||
|  |             const data = await this.write<CoreSiteAutologinKeyResult>('tool_mobile_get_autologin_key', params); | ||||||
|  | 
 | ||||||
|  |             if (!data.autologinurl || !data.key) { | ||||||
|  |                 // Not valid data, return the same URL.
 | ||||||
|  |                 return url; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             this.lastAutoLogin = CoreTimeUtils.timestamp(); | ||||||
|  | 
 | ||||||
|  |             return data.autologinurl + '?userid=' + userId + '&key=' + data.key + '&urltogo=' + encodeURIComponent(url); | ||||||
|  |         } catch (error) { | ||||||
|  |             // Couldn't get autologin key, return the same URL.
 | ||||||
|  |             return url; | ||||||
|  |         } finally { | ||||||
|  |             modal?.dismiss(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Deletes a site setting. | ||||||
|  |      * | ||||||
|  |      * @param name The config name. | ||||||
|  |      * @returns Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     async deleteSiteConfig(name: string): Promise<void> { | ||||||
|  |         await this.configTable.deleteByPrimaryKey({ name }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get a site setting on local device. | ||||||
|  |      * | ||||||
|  |      * @param name The config name. | ||||||
|  |      * @param defaultValue Default value to use if the entry is not found. | ||||||
|  |      * @returns Resolves upon success along with the config data. Reject on failure. | ||||||
|  |      */ | ||||||
|  |     async getLocalSiteConfig<T extends number | string>(name: string, defaultValue?: T): Promise<T> { | ||||||
|  |         try { | ||||||
|  |             const entry = await this.configTable.getOneByPrimaryKey({ name }); | ||||||
|  | 
 | ||||||
|  |             return <T> entry.value; | ||||||
|  |         } catch (error) { | ||||||
|  |             if (defaultValue !== undefined) { | ||||||
|  |                 return defaultValue; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             throw error; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Set a site setting on local device. | ||||||
|  |      * | ||||||
|  |      * @param name The config name. | ||||||
|  |      * @param value The config value. Can only store number or strings. | ||||||
|  |      * @returns Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     async setLocalSiteConfig(name: string, value: number | string): Promise<void> { | ||||||
|  |         await this.configTable.insert({ name, value }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* | ||||||
|  |      * Check if tokenpluginfile script works in the site. | ||||||
|  |      * | ||||||
|  |      * @param url URL to check. | ||||||
|  |      * @returns Promise resolved with boolean: whether it works or not. | ||||||
|  |      */ | ||||||
|  |     checkTokenPluginFile(url: string): Promise<boolean> { | ||||||
|  |         if (!CoreUrlUtils.canUseTokenPluginFile(url, this.siteUrl, this.infos && this.infos.userprivateaccesskey)) { | ||||||
|  |             // Cannot use tokenpluginfile.
 | ||||||
|  |             return Promise.resolve(false); | ||||||
|  |         } else if (this.tokenPluginFileWorks !== undefined) { | ||||||
|  |             // Already checked.
 | ||||||
|  |             return Promise.resolve(this.tokenPluginFileWorks); | ||||||
|  |         } else if (this.tokenPluginFileWorksPromise) { | ||||||
|  |             // Check ongoing, use the same promise.
 | ||||||
|  |             return this.tokenPluginFileWorksPromise; | ||||||
|  |         } else if (!CoreNetwork.isOnline()) { | ||||||
|  |             // Not online, cannot check it. Assume it's working, but don't save the result.
 | ||||||
|  |             return Promise.resolve(true); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         url = this.fixPluginfileURL(url); | ||||||
|  | 
 | ||||||
|  |         this.tokenPluginFileWorksPromise = CoreWS.urlWorks(url).then((result) => { | ||||||
|  |             this.tokenPluginFileWorks = result; | ||||||
|  | 
 | ||||||
|  |             return result; | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         return this.tokenPluginFileWorksPromise; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Deletes last viewed records based on some conditions. | ||||||
|  |      * | ||||||
|  |      * @param conditions Conditions. | ||||||
|  |      * @returns Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     async deleteLastViewed(conditions?: Partial<CoreSiteLastViewedDBRecord>): Promise<void> { | ||||||
|  |         await this.lastViewedTable.delete(conditions); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get a last viewed record for a component+id. | ||||||
|  |      * | ||||||
|  |      * @param component The component. | ||||||
|  |      * @param id ID. | ||||||
|  |      * @returns Resolves with last viewed record, undefined if not found. | ||||||
|  |      */ | ||||||
|  |     async getLastViewed(component: string, id: number): Promise<CoreSiteLastViewedDBRecord | undefined> { | ||||||
|  |         try { | ||||||
|  |             return await this.lastViewedTable.getOneByPrimaryKey({ component, id }); | ||||||
|  |         } catch { | ||||||
|  |             // Not found.
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get several last viewed for a certain component. | ||||||
|  |      * | ||||||
|  |      * @param component The component. | ||||||
|  |      * @param ids IDs. If not provided or empty, return all last viewed for a component. | ||||||
|  |      * @returns Resolves with last viewed records, undefined if error. | ||||||
|  |      */ | ||||||
|  |     async getComponentLastViewed(component: string, ids: number[] = []): Promise<CoreSiteLastViewedDBRecord[] | undefined> { | ||||||
|  |         try { | ||||||
|  |             if (!ids.length) { | ||||||
|  |                 return await this.lastViewedTable.getMany({ component }); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             const whereAndParams = SQLiteDB.getInOrEqual(ids); | ||||||
|  | 
 | ||||||
|  |             whereAndParams.sql = 'id ' + whereAndParams.sql + ' AND component = ?'; | ||||||
|  |             whereAndParams.params.push(component); | ||||||
|  | 
 | ||||||
|  |             return await this.lastViewedTable.getManyWhere({ | ||||||
|  |                 sql: whereAndParams.sql, | ||||||
|  |                 sqlParams: whereAndParams.params, | ||||||
|  |                 js: (record) => record.component === component && ids.includes(record.id), | ||||||
|  |             }); | ||||||
|  |         } catch { | ||||||
|  |             // Not found.
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Store a last viewed record. | ||||||
|  |      * | ||||||
|  |      * @param component The component. | ||||||
|  |      * @param id ID. | ||||||
|  |      * @param value Last viewed item value. | ||||||
|  |      * @param options Options. | ||||||
|  |      * @returns Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     async storeLastViewed( | ||||||
|  |         component: string, | ||||||
|  |         id: number, | ||||||
|  |         value: string | number, | ||||||
|  |         options: CoreSiteStoreLastViewedOptions = {}, | ||||||
|  |     ): Promise<void> { | ||||||
|  |         await this.lastViewedTable.insert({ | ||||||
|  |             component, | ||||||
|  |             id, | ||||||
|  |             value: String(value), | ||||||
|  |             data: options.data, | ||||||
|  |             timeaccess: options.timeaccess ?? Date.now(), | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Optional data to create a site. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteOptionalData = CoreAuthenticatedSiteOptionalData & { | ||||||
|  |     info?: CoreSiteInfo; | ||||||
|  |     config?: CoreSiteConfig; | ||||||
|  |     loggedOut?: boolean; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Result of WS tool_mobile_get_config. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteConfigResponse = { | ||||||
|  |     settings: { // Settings.
 | ||||||
|  |         name: string; // The name of the setting.
 | ||||||
|  |         value: string | number; // The value of the setting.
 | ||||||
|  |     }[]; | ||||||
|  |     warnings?: CoreWSExternalWarning[]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Site config indexed by name. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteConfig = Record<string, string> & { | ||||||
|  |     supportavailability?: string; // String representation of CoreSiteConfigSupportAvailability.
 | ||||||
|  |     searchbanner?: string; // Search banner text.
 | ||||||
|  |     searchbannerenable?: string; // Whether search banner is enabled.
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Result of WS tool_mobile_get_autologin_key. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteAutologinKeyResult = { | ||||||
|  |     key: string; // Auto-login key for a single usage with time expiration.
 | ||||||
|  |     autologinurl: string; // Auto-login URL.
 | ||||||
|  |     warnings?: CoreWSExternalWarning[]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Options for storeLastViewed. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteStoreLastViewedOptions = { | ||||||
|  |     data?: string; // Other data.
 | ||||||
|  |     timeaccess?: number; // Accessed time. If not set, current time.
 | ||||||
|  | }; | ||||||
							
								
								
									
										483
									
								
								src/core/classes/sites/unauthenticated-site.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										483
									
								
								src/core/classes/sites/unauthenticated-site.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,483 @@ | |||||||
|  | // (C) Copyright 2015 Moodle Pty Ltd.
 | ||||||
|  | //
 | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||||
|  | // you may not use this file except in compliance with the License.
 | ||||||
|  | // You may obtain a copy of the License at
 | ||||||
|  | //
 | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | //
 | ||||||
|  | // Unless required by applicable law or agreed to in writing, software
 | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||||
|  | // See the License for the specific language governing permissions and
 | ||||||
|  | // limitations under the License.
 | ||||||
|  | 
 | ||||||
|  | import { CoreConstants } from '@/core/constants'; | ||||||
|  | import { CoreError } from '@classes/errors/error'; | ||||||
|  | import { CoreLoginHelper } from '@features/login/services/login-helper'; | ||||||
|  | import { CoreSitesReadingStrategy } from '@services/sites'; | ||||||
|  | import { CoreTextUtils } from '@services/utils/text'; | ||||||
|  | import { CoreUrlUtils } from '@services/utils/url'; | ||||||
|  | import { CoreWS, CoreWSAjaxPreSets, CoreWSExternalWarning } from '@services/ws'; | ||||||
|  | import { CorePath } from '@singletons/path'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Class that represents a Moodle site where the user still hasn't authenticated. | ||||||
|  |  */ | ||||||
|  | export class CoreUnauthenticatedSite { | ||||||
|  | 
 | ||||||
|  |     siteUrl: string; | ||||||
|  | 
 | ||||||
|  |     protected publicConfig?: CoreSitePublicConfigResponse; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Create a site. | ||||||
|  |      * | ||||||
|  |      * @param siteUrl Site URL. | ||||||
|  |      * @param publicConfig Site public config. | ||||||
|  |      */ | ||||||
|  |     constructor(siteUrl: string, publicConfig?: CoreSitePublicConfigResponse) { | ||||||
|  |         this.siteUrl = CoreUrlUtils.removeUrlParams(siteUrl); // Make sure the URL doesn't have params.
 | ||||||
|  |         if (publicConfig) { | ||||||
|  |             this.setPublicConfig(publicConfig); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get site URL. | ||||||
|  |      * | ||||||
|  |      * @returns Site URL. | ||||||
|  |      */ | ||||||
|  |     getURL(): string { | ||||||
|  |         return this.siteUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Set site URL. | ||||||
|  |      * | ||||||
|  |      * @param url Site URL. | ||||||
|  |      */ | ||||||
|  |     setURL(url: string): void { | ||||||
|  |         this.siteUrl = url; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get site info. | ||||||
|  |      * | ||||||
|  |      * @returns Site info. | ||||||
|  |      */ | ||||||
|  |     getInfo(): CoreSiteInfo | undefined { | ||||||
|  |         // Cannot retrieve info for unauthenticated sites.
 | ||||||
|  |         return undefined; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if the site has info with the given key and it doesn't contain an empty value. | ||||||
|  |      * | ||||||
|  |      * @param key Info key. | ||||||
|  |      * @returns Whether the key is filled within site info. | ||||||
|  |      */ | ||||||
|  |     hasInfo(key: string): boolean { | ||||||
|  |         const info = this.getInfo()?.[key] ?? null; | ||||||
|  | 
 | ||||||
|  |         return info === false || info === 0 || !!info; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get site name. | ||||||
|  |      * | ||||||
|  |      * @returns Site name. | ||||||
|  |      */ | ||||||
|  |     async getSiteName(): Promise<string> { | ||||||
|  |         if (this.isDemoModeSite()) { | ||||||
|  |             return CoreConstants.CONFIG.appname; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const siteName = this.getInfo()?.sitename || this.publicConfig?.sitename; | ||||||
|  |         if (siteName) { | ||||||
|  |             return siteName; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Fallback.
 | ||||||
|  |         const isSingleFixedSite = await CoreLoginHelper.isSingleFixedSite(); | ||||||
|  | 
 | ||||||
|  |         if (isSingleFixedSite) { | ||||||
|  |             const sites = await CoreLoginHelper.getAvailableSites(); | ||||||
|  | 
 | ||||||
|  |             return sites[0].name; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return ''; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check whether the app should use the local logo instead of the remote one. | ||||||
|  |      * | ||||||
|  |      * @returns Whether local logo is forced. | ||||||
|  |      */ | ||||||
|  |     forcesLocalLogo(): boolean { | ||||||
|  |         return CoreConstants.CONFIG.forceLoginLogo || this.isDemoModeSite(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get logo URL from a site public config. | ||||||
|  |      * | ||||||
|  |      * @param config Site public config. | ||||||
|  |      * @returns Logo URL. | ||||||
|  |      */ | ||||||
|  |     getLogoUrl(config?: CoreSitePublicConfigResponse): string | undefined { | ||||||
|  |         config = config ?? this.publicConfig; | ||||||
|  |         if (!config || this.forcesLocalLogo()) { | ||||||
|  |             return 'assets/img/login_logo.png'; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return config.logourl || config.compactlogourl || 'assets/img/login_logo.png'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns a url to link an specific page on the site. | ||||||
|  |      * | ||||||
|  |      * @param path Path of the url to go to. | ||||||
|  |      * @param params Object with the params to add. | ||||||
|  |      * @param anchor Anchor text if needed. | ||||||
|  |      * @returns URL with params. | ||||||
|  |      */ | ||||||
|  |     createSiteUrl(path: string, params?: Record<string, unknown>, anchor?: string): string { | ||||||
|  |         return CoreUrlUtils.addParamsToUrl(CorePath.concatenatePaths(this.siteUrl, path), params, anchor); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if a URL belongs to this site. | ||||||
|  |      * | ||||||
|  |      * @param url URL to check. | ||||||
|  |      * @returns Whether the URL belongs to this site. | ||||||
|  |      */ | ||||||
|  |     containsUrl(url?: string): boolean { | ||||||
|  |         if (!url) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const siteUrl = CoreTextUtils.addEndingSlash(CoreUrlUtils.removeProtocolAndWWW(this.siteUrl)); | ||||||
|  |         url = CoreTextUtils.addEndingSlash(CoreUrlUtils.removeProtocolAndWWW(url)); | ||||||
|  | 
 | ||||||
|  |         return url.indexOf(siteUrl) == 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get the public config of this site. | ||||||
|  |      * | ||||||
|  |      * @param options Options. | ||||||
|  |      * @returns Promise resolved with public config. Rejected with an object if error, see CoreWSProvider.callAjax. | ||||||
|  |      */ | ||||||
|  |     async getPublicConfig(options: { readingStrategy?: CoreSitesReadingStrategy } = {}): Promise<CoreSitePublicConfigResponse> { | ||||||
|  |         const ignoreCache = options.readingStrategy === CoreSitesReadingStrategy.ONLY_NETWORK || | ||||||
|  |             options.readingStrategy ===  CoreSitesReadingStrategy.PREFER_NETWORK; | ||||||
|  |         if (!ignoreCache && this.publicConfig) { | ||||||
|  |             return this.publicConfig; | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         if (options.readingStrategy === CoreSitesReadingStrategy.ONLY_CACHE) { | ||||||
|  |             throw new CoreError('Cache not available to read public config'); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             const config = await this.requestPublicConfig(); | ||||||
|  | 
 | ||||||
|  |             this.setPublicConfig(config); | ||||||
|  | 
 | ||||||
|  |             return config; | ||||||
|  |         } catch (error) { | ||||||
|  |             if (options.readingStrategy === CoreSitesReadingStrategy.ONLY_NETWORK || !this.publicConfig) { | ||||||
|  |                 throw error; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return this.publicConfig; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Set public config. | ||||||
|  |      * | ||||||
|  |      * @param publicConfig Public config. | ||||||
|  |      */ | ||||||
|  |     setPublicConfig(publicConfig: CoreSitePublicConfigResponse): void { | ||||||
|  |         publicConfig.tool_mobile_disabledfeatures = | ||||||
|  |             CoreTextUtils.treatDisabledFeatures(publicConfig.tool_mobile_disabledfeatures ?? ''); | ||||||
|  |         this.publicConfig = publicConfig; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Perform a request to the server to get the public config of this site. | ||||||
|  |      * | ||||||
|  |      * @returns Promise resolved with public config. | ||||||
|  |      */ | ||||||
|  |     protected async requestPublicConfig(): Promise<CoreSitePublicConfigResponse> { | ||||||
|  |         const preSets: CoreWSAjaxPreSets = { | ||||||
|  |             siteUrl: this.siteUrl, | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let config: CoreSitePublicConfigResponse; | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             config = await CoreWS.callAjax<CoreSitePublicConfigResponse>('tool_mobile_get_public_config', {}, preSets); | ||||||
|  |         } catch (error) { | ||||||
|  |             if (!error || error.errorcode !== 'codingerror' || (this.getInfo() && !this.isAjaxGetSupported())) { | ||||||
|  |                 throw error; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // This error probably means that there is a redirect in the site. Try to use a GET request.
 | ||||||
|  |             preSets.noLogin = true; | ||||||
|  |             preSets.useGet = true; | ||||||
|  | 
 | ||||||
|  |             try { | ||||||
|  |                 config = await CoreWS.callAjax<CoreSitePublicConfigResponse>('tool_mobile_get_public_config', {}, preSets); | ||||||
|  |             } catch (error2) { | ||||||
|  |                 if (this.isAjaxGetSupported()) { | ||||||
|  |                     // GET is supported, return the second error.
 | ||||||
|  |                     throw error2; | ||||||
|  |                 } else { | ||||||
|  |                     // GET not supported or we don't know if it's supported. Return first error.
 | ||||||
|  |                     throw error; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Use the wwwroot returned by the server.
 | ||||||
|  |         if (config.httpswwwroot) { | ||||||
|  |             this.siteUrl = CoreUrlUtils.removeUrlParams(config.httpswwwroot); // Make sure the URL doesn't have params.
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return config; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if GET method is supported for AJAX calls. | ||||||
|  |      * | ||||||
|  |      * @returns Whether it's supported. | ||||||
|  |      * @since Moodle 3.8 | ||||||
|  |      */ | ||||||
|  |     protected isAjaxGetSupported(): boolean { | ||||||
|  |         // We don't know if it's supported, assume it's not.
 | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if a URL to a file belongs to the site and uses the pluginfileurl or tokenpluginfileurl endpoints. | ||||||
|  |      * | ||||||
|  |      * @param url File URL to check. | ||||||
|  |      * @returns Whether it's a site file URL. | ||||||
|  |      */ | ||||||
|  |     isSitePluginFileUrl(url: string): boolean { | ||||||
|  |         const isPluginFileUrl = CoreUrlUtils.isPluginFileUrl(url) || CoreUrlUtils.isTokenPluginFileUrl(url); | ||||||
|  |         if (!isPluginFileUrl) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return this.containsUrl(url); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if a URL to a file belongs to the site and is a theme image file. | ||||||
|  |      * | ||||||
|  |      * @param url File URL to check. | ||||||
|  |      * @returns Whether it's a site theme image URL. | ||||||
|  |      */ | ||||||
|  |     isSiteThemeImageUrl(url: string): boolean { | ||||||
|  |         if (!CoreUrlUtils.isThemeImageUrl(url)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return this.containsUrl(url); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if the site is a demo mode site. | ||||||
|  |      * | ||||||
|  |      * @returns Whether the site is a demo mode site. | ||||||
|  |      */ | ||||||
|  |     isDemoModeSite(): boolean { | ||||||
|  |         const demoSiteData = CoreLoginHelper.getDemoModeSiteInfo(); | ||||||
|  | 
 | ||||||
|  |         return this.containsUrl(demoSiteData?.url); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check whether informative links should be displayed for this site. | ||||||
|  |      * | ||||||
|  |      * @returns Whether informative links should be displayed. | ||||||
|  |      */ | ||||||
|  |     shouldDisplayInformativeLinks(): boolean { | ||||||
|  |         return !CoreConstants.CONFIG.hideInformativeLinks && !this.isDemoModeSite(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if a certain feature is disabled in the site. | ||||||
|  |      * | ||||||
|  |      * @param name Name of the feature to check. | ||||||
|  |      * @returns Whether it's disabled. | ||||||
|  |      */ | ||||||
|  |     isFeatureDisabled(name: string): boolean { | ||||||
|  |         const disabledFeatures = this.getDisabledFeatures(); | ||||||
|  |         if (!disabledFeatures) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const regEx = new RegExp('(,|^)' + CoreTextUtils.escapeForRegex(name) + '(,|$)', 'g'); | ||||||
|  | 
 | ||||||
|  |         return !!disabledFeatures.match(regEx); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Get disabled features string. | ||||||
|  |      * | ||||||
|  |      * @returns Disabled features. | ||||||
|  |      */ | ||||||
|  |     protected getDisabledFeatures(): string | undefined { | ||||||
|  |         return this.publicConfig?.tool_mobile_disabledfeatures; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Result of WS core_webservice_get_site_info. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteInfoResponse = { | ||||||
|  |     sitename: string; // Site name.
 | ||||||
|  |     username: string; // Username.
 | ||||||
|  |     firstname: string; // First name.
 | ||||||
|  |     lastname: string; // Last name.
 | ||||||
|  |     fullname: string; // User full name.
 | ||||||
|  |     lang: string; // Current language.
 | ||||||
|  |     userid: number; // User id.
 | ||||||
|  |     siteurl: string; // Site url.
 | ||||||
|  |     userpictureurl: string; // The user profile picture.
 | ||||||
|  |     functions: { | ||||||
|  |         name: string; // Function name.
 | ||||||
|  |         version: string; // The version number of the component to which the function belongs.
 | ||||||
|  |     }[]; | ||||||
|  |     downloadfiles?: number; // 1 if users are allowed to download files, 0 if not.
 | ||||||
|  |     uploadfiles?: number; // 1 if users are allowed to upload files, 0 if not.
 | ||||||
|  |     release?: string; // Moodle release number.
 | ||||||
|  |     version?: string; // Moodle version number.
 | ||||||
|  |     mobilecssurl?: string; // Mobile custom CSS theme.
 | ||||||
|  |     advancedfeatures?: { // Advanced features availability.
 | ||||||
|  |         name: string; // Feature name.
 | ||||||
|  |         value: number; // Feature value. Usually 1 means enabled.
 | ||||||
|  |     }[]; | ||||||
|  |     usercanmanageownfiles?: boolean; // True if the user can manage his own files.
 | ||||||
|  |     userquota?: number; // User quota (bytes). 0 means user can ignore the quota.
 | ||||||
|  |     usermaxuploadfilesize?: number; // User max upload file size (bytes). -1 means the user can ignore the upload file size.
 | ||||||
|  |     userhomepage?: CoreSiteInfoUserHomepage; // The default home page for the user.
 | ||||||
|  |     userprivateaccesskey?: string; // Private user access key for fetching files.
 | ||||||
|  |     siteid?: number; // Site course ID.
 | ||||||
|  |     sitecalendartype?: string; // Calendar type set in the site.
 | ||||||
|  |     usercalendartype?: string; // Calendar typed used by the user.
 | ||||||
|  |     userissiteadmin?: boolean; // Whether the user is a site admin or not.
 | ||||||
|  |     theme?: string; // Current theme for the user.
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Site info, including some calculated data. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteInfo = CoreSiteInfoResponse & { | ||||||
|  |     functionsByName?: { | ||||||
|  |         [name: string]: { | ||||||
|  |             name: string; // Function name.
 | ||||||
|  |             version: string; // The version number of the component to which the function belongs.
 | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Enum constants that define default user home page. | ||||||
|  |  */ | ||||||
|  | export enum CoreSiteInfoUserHomepage { | ||||||
|  |     HOMEPAGE_SITE = 0, // Site home.
 | ||||||
|  |     HOMEPAGE_MY = 1, // Dashboard.
 | ||||||
|  |     HOMEPAGE_MYCOURSES = 3, // My courses.
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Possible values for 'supportavailability' config. | ||||||
|  |  */ | ||||||
|  | export const enum CoreSiteConfigSupportAvailability { | ||||||
|  |     Disabled = 0, | ||||||
|  |     Authenticated = 1, | ||||||
|  |     Anyone = 2, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Result of WS tool_mobile_get_public_config. | ||||||
|  |  */ | ||||||
|  | export type CoreSitePublicConfigResponse = { | ||||||
|  |     wwwroot: string; // Site URL.
 | ||||||
|  |     httpswwwroot: string; // Site https URL (if httpslogin is enabled).
 | ||||||
|  |     sitename: string; // Site name.
 | ||||||
|  |     guestlogin: number; // Whether guest login is enabled.
 | ||||||
|  |     rememberusername: number; // Values: 0 for No, 1 for Yes, 2 for optional.
 | ||||||
|  |     authloginviaemail: number; // Whether log in via email is enabled.
 | ||||||
|  |     registerauth: string; // Authentication method for user registration.
 | ||||||
|  |     forgottenpasswordurl: string; // Forgotten password URL.
 | ||||||
|  |     authinstructions: string; // Authentication instructions.
 | ||||||
|  |     authnoneenabled: number; // Whether auth none is enabled.
 | ||||||
|  |     enablewebservices: number; // Whether Web Services are enabled.
 | ||||||
|  |     enablemobilewebservice: number; // Whether the Mobile service is enabled.
 | ||||||
|  |     maintenanceenabled: number; // Whether site maintenance is enabled.
 | ||||||
|  |     maintenancemessage: string; // Maintenance message.
 | ||||||
|  |     logourl?: string; // The site logo URL.
 | ||||||
|  |     compactlogourl?: string; // The site compact logo URL.
 | ||||||
|  |     typeoflogin: TypeOfLogin; // The type of login. 1 for app, 2 for browser, 3 for embedded.
 | ||||||
|  |     launchurl?: string; // SSO login launch URL.
 | ||||||
|  |     mobilecssurl?: string; // Mobile custom CSS theme.
 | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/naming-convention
 | ||||||
|  |     tool_mobile_disabledfeatures?: string; // Disabled features in the app.
 | ||||||
|  |     identityproviders?: CoreSiteIdentityProvider[]; // Identity providers.
 | ||||||
|  |     country?: string; // Default site country.
 | ||||||
|  |     agedigitalconsentverification?: boolean; // Whether age digital consent verification is enabled.
 | ||||||
|  |     supportname?: string; // Site support contact name (only if age verification is enabled).
 | ||||||
|  |     supportemail?: string; // Site support contact email (only if age verification is enabled).
 | ||||||
|  |     supportavailability?: CoreSiteConfigSupportAvailability; | ||||||
|  |     supportpage?: string; // Site support contact url.
 | ||||||
|  |     autolang?: number; // Whether to detect default language from browser setting.
 | ||||||
|  |     lang?: string; // Default language for the site.
 | ||||||
|  |     langmenu?: number; // Whether the language menu should be displayed.
 | ||||||
|  |     langlist?: string; // Languages on language menu.
 | ||||||
|  |     locale?: string; // Sitewide locale.
 | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/naming-convention
 | ||||||
|  |     tool_mobile_minimumversion?: string; // Minimum required version to access.
 | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/naming-convention
 | ||||||
|  |     tool_mobile_iosappid?: string; // IOS app's unique identifier.
 | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/naming-convention
 | ||||||
|  |     tool_mobile_androidappid?: string; // Android app's unique identifier.
 | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/naming-convention
 | ||||||
|  |     tool_mobile_setuplink?: string; // App download page.
 | ||||||
|  |     tool_mobile_qrcodetype?: CoreSiteQRCodeType; // eslint-disable-line @typescript-eslint/naming-convention
 | ||||||
|  |     warnings?: CoreWSExternalWarning[]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * QR Code type enumeration. | ||||||
|  |  */ | ||||||
|  | export enum CoreSiteQRCodeType { | ||||||
|  |     QR_CODE_DISABLED = 0, // QR code disabled value
 | ||||||
|  |     QR_CODE_URL = 1, // QR code type URL value
 | ||||||
|  |     QR_CODE_LOGIN = 2, // QR code type login value
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Identity provider. | ||||||
|  |  */ | ||||||
|  | export type CoreSiteIdentityProvider = { | ||||||
|  |     name: string; // The identity provider name.
 | ||||||
|  |     iconurl: string; // The icon URL for the provider.
 | ||||||
|  |     url: string; // The URL of the provider.
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type of login. 1 for app, 2 for browser, 3 for embedded. | ||||||
|  |  */ | ||||||
|  | export enum TypeOfLogin { | ||||||
|  |     APP = 1, | ||||||
|  |     BROWSER = 2, // SSO in browser window is required.
 | ||||||
|  |     EMBEDDED = 3, // SSO in embedded browser is required.
 | ||||||
|  | } | ||||||
| @ -14,8 +14,9 @@ | |||||||
| 
 | 
 | ||||||
| import { Component, ContentChild, Input, Output, TemplateRef, EventEmitter } from '@angular/core'; | import { Component, ContentChild, Input, Output, TemplateRef, EventEmitter } from '@angular/core'; | ||||||
| 
 | 
 | ||||||
| import { CoreSiteBasicInfo, CoreSites } from '@services/sites'; | import { CoreSiteBasicInfo } from '@services/sites'; | ||||||
| import { CoreAccountsList } from '@features/login/services/login-helper'; | import { CoreAccountsList } from '@features/login/services/login-helper'; | ||||||
|  | import { CoreSitesFactory } from '@services/sites-factory'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Component to display a list of sites (accounts). |  * Component to display a list of sites (accounts). | ||||||
| @ -84,7 +85,7 @@ export class CoreSitesListComponent<T extends CoreSiteBasicInfo> { | |||||||
|      * @returns Whether to display URL. |      * @returns Whether to display URL. | ||||||
|      */ |      */ | ||||||
|     displaySiteUrl(site: CoreSiteBasicInfo): boolean { |     displaySiteUrl(site: CoreSiteBasicInfo): boolean { | ||||||
|         return CoreSites.shouldDisplayInformativeLinks(site.siteUrl); |         return CoreSitesFactory.makeSite(site.id, site.siteUrl, '', { info: site.info }).shouldDisplayInformativeLinks(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ import { CoreNavigator } from '@services/navigator'; | |||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| import { CoreUserHelper } from '@features/user/services/user-helper'; | import { CoreUserHelper } from '@features/user/services/user-helper'; | ||||||
| import { CoreUrlUtils } from '@services/utils/url'; | import { CoreUrlUtils } from '@services/utils/url'; | ||||||
| import { CoreSiteInfo } from '@classes/site'; | import { CoreSiteInfo } from '@classes/sites/unauthenticated-site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Component to display a "user avatar". |  * Component to display a "user avatar". | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ import { CoreUrlUtils } from '@services/utils/url'; | |||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreEventObserver, CoreEvents } from '@singletons/events'; | import { CoreEventObserver, CoreEvents } from '@singletons/events'; | ||||||
| import { CoreConstants } from '../constants'; | import { CoreConstants } from '../constants'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
|  | |||||||
| @ -34,7 +34,7 @@ import { CoreDomUtils } from '@services/utils/dom'; | |||||||
| import { CoreIframeUtils, CoreIframeUtilsProvider } from '@services/utils/iframe'; | import { CoreIframeUtils, CoreIframeUtilsProvider } from '@services/utils/iframe'; | ||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { NgZone, Translate } from '@singletons'; | import { NgZone, Translate } from '@singletons'; | ||||||
| import { CoreExternalContentDirective } from './external-content'; | import { CoreExternalContentDirective } from './external-content'; | ||||||
| import { CoreLinkDirective } from './link'; | import { CoreLinkDirective } from './link'; | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ import { CoreFilepool } from '@services/filepool'; | |||||||
| import { CoreFilter } from '@features/filter/services/filter'; | import { CoreFilter } from '@features/filter/services/filter'; | ||||||
| import { CoreFilterHelper } from '@features/filter/services/filter-helper'; | import { CoreFilterHelper } from '@features/filter/services/filter-helper'; | ||||||
| import { CoreFormatTextDirective } from '@directives/format-text'; | import { CoreFormatTextDirective } from '@directives/format-text'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CorePlatform } from '@services/platform'; | import { CorePlatform } from '@services/platform'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreStorage } from '@services/storage'; | import { CoreStorage } from '@services/storage'; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { Injectable, Type } from '@angular/core'; | import { Injectable, Type } from '@angular/core'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { Subject } from 'rxjs'; | import { Subject } from 'rxjs'; | ||||||
| import { CoreCourseBlock } from '@features/course/services/course'; | import { CoreCourseBlock } from '@features/course/services/course'; | ||||||
| import { Params } from '@angular/router'; | import { Params } from '@angular/router'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| @ -23,6 +23,7 @@ import { makeSingleton } from '@singletons'; | |||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
| import { CoreCommentsOffline } from './comments-offline'; | import { CoreCommentsOffline } from './comments-offline'; | ||||||
| import { CoreCommentsSyncAutoSyncData, CoreCommentsSyncProvider } from './comments-sync'; | import { CoreCommentsSyncAutoSyncData, CoreCommentsSyncProvider } from './comments-sync'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmComments:'; | const ROOT_CACHE_KEY = 'mmComments:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ import { CoreContentLinksAction } from '../../services/contentlinks-delegate'; | |||||||
| import { CoreContentLinksHelper } from '../../services/contentlinks-helper'; | import { CoreContentLinksHelper } from '../../services/contentlinks-helper'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreNavigator } from '@services/navigator'; | import { CoreNavigator } from '@services/navigator'; | ||||||
|  | import { CoreSitesFactory } from '@services/sites-factory'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Page to display the list of sites to choose one to perform a content link action. |  * Page to display the list of sites to choose one to perform a content link action. | ||||||
| @ -73,7 +74,7 @@ export class CoreContentLinksChooseSiteModalComponent implements OnInit { | |||||||
|             this.sites = await CoreSites.getSites(siteIds); |             this.sites = await CoreSites.getSites(siteIds); | ||||||
| 
 | 
 | ||||||
|             // All sites have the same URL, use the first one.
 |             // All sites have the same URL, use the first one.
 | ||||||
|             this.displaySiteUrl = CoreSites.shouldDisplayInformativeLinks(this.sites[0].siteUrl); |             this.displaySiteUrl = CoreSitesFactory.makeUnauthenticatedSite(this.sites[0].siteUrl).shouldDisplayInformativeLinks(); | ||||||
|         } catch (error) { |         } catch (error) { | ||||||
|             CoreDomUtils.showErrorModalDefault(error, 'core.contentlinks.errornosites', true); |             CoreDomUtils.showErrorModalDefault(error, 'core.contentlinks.errornosites', true); | ||||||
|             this.closeModal(); |             this.closeModal(); | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; | |||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreContentLinksDelegate, CoreContentLinksAction } from './contentlinks-delegate'; | import { CoreContentLinksDelegate, CoreContentLinksAction } from './contentlinks-delegate'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton, Translate } from '@singletons'; | import { makeSingleton, Translate } from '@singletons'; | ||||||
| import { CoreNavigator } from '@services/navigator'; | import { CoreNavigator } from '@services/navigator'; | ||||||
| import { CoreContentLinksChooseSiteModalComponent } from '../components/choose-site-modal/choose-site-modal'; | import { CoreContentLinksChooseSiteModalComponent } from '../components/choose-site-modal/choose-site-modal'; | ||||||
|  | |||||||
| @ -101,7 +101,7 @@ export class CoreCourseModuleSummaryComponent implements OnInit, OnDestroy { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         this.displayOptions = Object.assign({ |         this.displayOptions = Object.assign({ | ||||||
|             displayOpenInBrowser: CoreSites.shouldDisplayInformativeLinks(), |             displayOpenInBrowser: !!CoreSites.getCurrentSite()?.shouldDisplayInformativeLinks(), | ||||||
|             displayDescription: true, |             displayDescription: true, | ||||||
|             displayRefresh: true, |             displayRefresh: true, | ||||||
|             displayPrefetch: true, |             displayPrefetch: true, | ||||||
|  | |||||||
| @ -138,7 +138,7 @@ export class CoreCourseSummaryPage implements OnInit, OnDestroy { | |||||||
|         const currentSiteUrl = CoreSites.getRequiredCurrentSite().getURL(); |         const currentSiteUrl = CoreSites.getRequiredCurrentSite().getURL(); | ||||||
|         this.enrolUrl = CorePath.concatenatePaths(currentSiteUrl, 'enrol/index.php?id=' + this.courseId); |         this.enrolUrl = CorePath.concatenatePaths(currentSiteUrl, 'enrol/index.php?id=' + this.courseId); | ||||||
|         this.courseUrl = CorePath.concatenatePaths(currentSiteUrl, 'course/view.php?id=' + this.courseId); |         this.courseUrl = CorePath.concatenatePaths(currentSiteUrl, 'course/view.php?id=' + this.courseId); | ||||||
|         this.displayOpenInBrowser = CoreSites.shouldDisplayInformativeLinks(); |         this.displayOpenInBrowser = CoreSites.getRequiredCurrentSite().shouldDisplayInformativeLinks(); | ||||||
| 
 | 
 | ||||||
|         await this.getCourse(); |         await this.getCourse(); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -63,7 +63,7 @@ export class CoreCourseModulePreviewPage implements OnInit { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         this.displayOpenInBrowser = CoreSites.shouldDisplayInformativeLinks(); |         this.displayOpenInBrowser = !!CoreSites.getCurrentSite()?.shouldDisplayInformativeLinks(); | ||||||
|         this.debouncedUpdateModule = CoreUtils.debounce(() => { |         this.debouncedUpdateModule = CoreUtils.debounce(() => { | ||||||
|             this.doRefresh(); |             this.doRefresh(); | ||||||
|         }, 10000); |         }, 10000); | ||||||
|  | |||||||
| @ -58,7 +58,7 @@ import { | |||||||
| import { CoreFileSizeSum } from '@services/plugin-file-delegate'; | import { CoreFileSizeSum } from '@services/plugin-file-delegate'; | ||||||
| import { CoreFileHelper } from '@services/file-helper'; | import { CoreFileHelper } from '@services/file-helper'; | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreFile } from '@services/file'; | import { CoreFile } from '@services/file'; | ||||||
| import { CoreUrlUtils } from '@services/utils/url'; | import { CoreUrlUtils } from '@services/utils/url'; | ||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ import { CoreLogger } from '@singletons/logger'; | |||||||
| import { CoreSitesCommonWSOptions, CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | import { CoreSitesCommonWSOptions, CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
| 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 { CoreSiteWSPreSets, CoreSite, WSObservable } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } 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'; | ||||||
| @ -55,6 +55,7 @@ import { SQLiteDB } from '@classes/sqlitedb'; | |||||||
| import { CorePlatform } from '@services/platform'; | import { CorePlatform } from '@services/platform'; | ||||||
| import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; | import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
|  | import { CoreSiteWSPreSets, WSObservable } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmCourse:'; | const ROOT_CACHE_KEY = 'mmCourse:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { Injectable, Type } from '@angular/core'; | import { Injectable, Type } from '@angular/core'; | ||||||
| import { SafeUrl } from '@angular/platform-browser'; | import { SafeUrl } from '@angular/platform-browser'; | ||||||
| 
 | 
 | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseModuleDefaultHandler } from './handlers/default-module'; | import { CoreCourseModuleDefaultHandler } from './handlers/default-module'; | ||||||
| import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | ||||||
| import { CoreCourseAnyCourseData } from '@features/courses/services/courses'; | import { CoreCourseAnyCourseData } from '@features/courses/services/courses'; | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ import { CoreTimeUtils } from '@services/utils/time'; | |||||||
| import { CoreUtils } from '@services/utils/utils'; | 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/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| import { CoreConstants } from '@/core/constants'; | import { CoreConstants } from '@/core/constants'; | ||||||
| import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
|  | |||||||
| @ -29,7 +29,7 @@ import moment from 'moment-timezone'; | |||||||
| import { of } from 'rxjs'; | import { of } from 'rxjs'; | ||||||
| import { firstValueFrom, zipIncludingComplete } from '@/core/utils/rxjs'; | import { firstValueFrom, zipIncludingComplete } from '@/core/utils/rxjs'; | ||||||
| import { catchError, map } from 'rxjs/operators'; | import { catchError, map } from 'rxjs/operators'; | ||||||
| import { chainRequests, WSObservable } from '@classes/site'; | import { chainRequests, WSObservable } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| // Id for a course item representing all courses (for example, for course filters).
 | // Id for a course item representing all courses (for example, for course filters).
 | ||||||
| export const ALL_COURSES_ID = -1; | export const ALL_COURSES_ID = -1; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets, WSObservable } from '@classes/site'; | import { CoreSite  } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; | import { CoreWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreEvents } from '@singletons/events'; | import { CoreEvents } from '@singletons/events'; | ||||||
| @ -25,6 +25,7 @@ import { map } from 'rxjs/operators'; | |||||||
| import { AddonEnrolGuest, AddonEnrolGuestInfo } from '@addons/enrol/guest/services/guest'; | import { AddonEnrolGuest, AddonEnrolGuestInfo } from '@addons/enrol/guest/services/guest'; | ||||||
| import { AddonEnrolSelf } from '@addons/enrol/self/services/self'; | import { AddonEnrolSelf } from '@addons/enrol/self/services/self'; | ||||||
| import { CoreEnrol, CoreEnrolEnrolmentInfo, CoreEnrolEnrolmentMethod } from '@features/enrol/services/enrol'; | import { CoreEnrol, CoreEnrolEnrolmentInfo, CoreEnrolEnrolmentMethod } from '@features/enrol/services/enrol'; | ||||||
|  | import { CoreSiteWSPreSets, WSObservable } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'mmCourses:'; | const ROOT_CACHE_KEY = 'mmCourses:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,13 +14,14 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets, WSObservable } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseBlock } from '@features/course/services/course'; | import { CoreCourseBlock } from '@features/course/services/course'; | ||||||
| import { CoreStatusWithWarningsWSResponse } from '@services/ws'; | import { CoreStatusWithWarningsWSResponse } from '@services/ws'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; | import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; | ||||||
|  | import { CoreSiteWSPreSets, WSObservable } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| const ROOT_CACHE_KEY = 'CoreCoursesDashboard:'; | const ROOT_CACHE_KEY = 'CoreCoursesDashboard:'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { CoreSiteInfoUserHomepage } from '@classes/site'; | import { CoreSiteInfoUserHomepage } from '@classes/sites/unauthenticated-site'; | ||||||
| import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu/services/mainmenu-delegate'; | import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu/services/mainmenu-delegate'; | ||||||
| import { CoreSiteHomeHomeHandler } from '@features/sitehome/services/handlers/sitehome-home'; | import { CoreSiteHomeHomeHandler } from '@features/sitehome/services/handlers/sitehome-home'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| 
 | 
 | ||||||
| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { CoreEnrolAction, CoreEnrolDelegate } from './enrol-delegate'; | import { CoreEnrolAction, CoreEnrolDelegate } from './enrol-delegate'; | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ import { CoreWSFile, CoreWSFileUploadOptions, CoreWSUploadFileResult } from '@se | |||||||
| import { makeSingleton, Translate, MediaCapture, Camera } from '@singletons'; | import { makeSingleton, Translate, MediaCapture, Camera } from '@singletons'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreFileEntry, CoreFileHelper } from '@services/file-helper'; | import { CoreFileEntry, CoreFileHelper } from '@services/file-helper'; | ||||||
| import { CorePath } from '@singletons/path'; | import { CorePath } from '@singletons/path'; | ||||||
| import { CorePlatform } from '@services/platform'; | import { CorePlatform } from '@services/platform'; | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ import { CoreSites } from '@services/sites'; | |||||||
| import { CoreFilterFilter, CoreFilterFormatTextOptions } from './filter'; | import { CoreFilterFilter, CoreFilterFormatTextOptions } from './filter'; | ||||||
| import { CoreFilterDefaultHandler } from './handlers/default-filter'; | import { CoreFilterDefaultHandler } from './handlers/default-filter'; | ||||||
| import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -29,7 +29,7 @@ import { CoreCourses } from '@features/courses/services/courses'; | |||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreEvents, CoreEventSiteData } from '@singletons/events'; | import { CoreEvents, CoreEventSiteData } from '@singletons/events'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreCourseHelper } from '@features/course/services/course-helper'; | import { CoreCourseHelper } from '@features/course/services/course-helper'; | ||||||
| import { firstValueFrom } from '@/core/utils/rxjs'; | import { firstValueFrom } from '@/core/utils/rxjs'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,13 +16,14 @@ import { Injectable } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreNetwork } from '@services/network'; | import { CoreNetwork } from '@services/network'; | ||||||
| import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreTextUtils } from '@services/utils/text'; | import { CoreTextUtils } from '@services/utils/text'; | ||||||
| import { CoreFilterDelegate } from './filter-delegate'; | import { CoreFilterDelegate } from './filter-delegate'; | ||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreEvents, CoreEventSiteData } from '@singletons/events'; | import { CoreEvents, CoreEventSiteData } from '@singletons/events'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Service to provide filter functionalities. |  * Service to provide filter functionalities. | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { Injectable, ViewContainerRef } from '@angular/core'; | |||||||
| 
 | 
 | ||||||
| import { CoreFilterHandler } from '../filter-delegate'; | import { CoreFilterHandler } from '../filter-delegate'; | ||||||
| import { CoreFilterFilter, CoreFilterFormatTextOptions } from '../filter'; | import { CoreFilterFilter, CoreFilterFormatTextOptions } from '../filter'; | ||||||
| import { CoreSite } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Default handler used when the module doesn't have a specific implementation. |  * Default handler used when the module doesn't have a specific implementation. | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ import { CoreSites } from '@services/sites'; | |||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| import { CoreWSExternalWarning } from '@services/ws'; | import { CoreWSExternalWarning } from '@services/ws'; | ||||||
| import { CoreSiteWSPreSets } from '@classes/site'; | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { SafeNumber } from '@/core/utils/types'; | import { SafeNumber } from '@/core/utils/types'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ 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 { CoreConstants } from '@/core/constants'; | ||||||
| import { CoreSite } from '@classes/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'; | ||||||
| import { CoreH5PHelper } from '../../classes/helper'; | import { CoreH5PHelper } from '../../classes/helper'; | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ 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 { CoreConstants } from '@/core/constants'; | ||||||
| import { CoreSite } from '@classes/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'; | ||||||
| import { CoreH5P } from '@features/h5p/services/h5p'; | import { CoreH5P } from '@features/h5p/services/h5p'; | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ import { CoreSites } from '@services/sites'; | |||||||
| import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; | import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; | ||||||
| import { CoreUrlUtils } from '@services/utils/url'; | import { CoreUrlUtils } from '@services/utils/url'; | ||||||
| import { CoreQueueRunner } from '@classes/queue-runner'; | import { CoreQueueRunner } from '@classes/queue-runner'; | ||||||
| import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
| 
 | 
 | ||||||
| import { CoreH5PCore } from '../classes/core'; | import { CoreH5PCore } from '../classes/core'; | ||||||
| import { CoreH5PFramework } from '../classes/framework'; | import { CoreH5PFramework } from '../classes/framework'; | ||||||
| @ -29,6 +29,7 @@ import { CoreH5PValidator } from '../classes/validator'; | |||||||
| import { makeSingleton } from '@singletons'; | import { makeSingleton } from '@singletons'; | ||||||
| import { CoreError } from '@classes/errors/error'; | import { CoreError } from '@classes/errors/error'; | ||||||
| import { CorePath } from '@singletons/path'; | import { CorePath } from '@singletons/path'; | ||||||
|  | import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Service to provide H5P functionalities. |  * Service to provide H5P functionalities. | ||||||
|  | |||||||
| @ -13,10 +13,11 @@ | |||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
| import { Component, Input, OnInit } from '@angular/core'; | import { Component, Input, OnInit } from '@angular/core'; | ||||||
| import { CoreSiteIdentityProvider, CoreSitePublicConfigResponse } from '@classes/site'; | import { CoreSiteIdentityProvider, CoreSitePublicConfigResponse } from '@classes/sites/unauthenticated-site'; | ||||||
| import { CoreLoginHelper, CoreLoginMethod } from '@features/login/services/login-helper'; | import { CoreLoginHelper, CoreLoginMethod } from '@features/login/services/login-helper'; | ||||||
| import { CoreRedirectPayload } from '@services/navigator'; | import { CoreRedirectPayload } from '@services/navigator'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
|  | import { CoreSitesFactory } from '@services/sites-factory'; | ||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
| @ -53,11 +54,11 @@ export class CoreLoginMethodsComponent implements OnInit { | |||||||
|         if (this.siteConfig) { |         if (this.siteConfig) { | ||||||
|             this.isBrowserSSO = CoreLoginHelper.isSSOLoginNeeded(this.siteConfig.typeoflogin); |             this.isBrowserSSO = CoreLoginHelper.isSSOLoginNeeded(this.siteConfig.typeoflogin); | ||||||
| 
 | 
 | ||||||
|  |             // Identity providers won't be shown if login on browser.
 | ||||||
|             if (!this.isBrowserSSO) { |             if (!this.isBrowserSSO) { | ||||||
|                 // Identity providers won't be shown if login on browser.
 |                 this.identityProviders = await CoreLoginHelper.getValidIdentityProvidersForSite( | ||||||
|                 const disabledFeatures = CoreLoginHelper.getDisabledFeatures(this.siteConfig); |                     CoreSitesFactory.makeUnauthenticatedSite(this.siteUrl, this.siteConfig), | ||||||
| 
 |                 ); | ||||||
|                 this.identityProviders = CoreLoginHelper.getValidIdentityProviders(this.siteConfig, disabledFeatures); |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (this.reconnect) { |             if (this.reconnect) { | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ import { AfterViewInit, Component, ElementRef, HostBinding, OnDestroy } from '@a | |||||||
| 
 | 
 | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { ModalController, Translate } from '@singletons'; | import { ModalController, Translate } from '@singletons'; | ||||||
| import { CoreLoginHelperProvider, GET_STARTED_URL } from '@features/login/services/login-helper'; | import { FAQ_QRCODE_IMAGE_HTML, FAQ_URL_IMAGE_HTML, GET_STARTED_URL } from '@features/login/constants'; | ||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreCancellablePromise } from '@classes/cancellable-promise'; | import { CoreCancellablePromise } from '@classes/cancellable-promise'; | ||||||
| 
 | 
 | ||||||
| @ -39,8 +39,8 @@ export class CoreLoginSiteHelpComponent implements AfterViewInit, OnDestroy { | |||||||
|     constructor(protected el: ElementRef<HTMLElement>) { |     constructor(protected el: ElementRef<HTMLElement>) { | ||||||
|         const getStartedTitle = Translate.instant('core.login.faqsetupsitelinktitle'); |         const getStartedTitle = Translate.instant('core.login.faqsetupsitelinktitle'); | ||||||
|         const canScanQR = CoreUtils.canScanQR(); |         const canScanQR = CoreUtils.canScanQR(); | ||||||
|         const urlImageHtml = CoreLoginHelperProvider.FAQ_URL_IMAGE_HTML; |         const urlImageHtml = FAQ_URL_IMAGE_HTML; | ||||||
|         const qrCodeImageHtml = CoreLoginHelperProvider.FAQ_QRCODE_IMAGE_HTML; |         const qrCodeImageHtml = FAQ_QRCODE_IMAGE_HTML; | ||||||
|         const setupLinkHtml = `<a href="${GET_STARTED_URL}" title="${getStartedTitle}">${GET_STARTED_URL}</a>`; |         const setupLinkHtml = `<a href="${GET_STARTED_URL}" title="${getStartedTitle}">${GET_STARTED_URL}</a>`; | ||||||
|         const questions: Array<QuestionDefinition | false> = [ |         const questions: Array<QuestionDefinition | false> = [ | ||||||
|             { |             { | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user