commit
						0cff22ca30
					
				
							
								
								
									
										5
									
								
								.github/workflows/acceptance.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/acceptance.yml
									
									
									
									
										vendored
									
									
								
							| @ -16,6 +16,11 @@ on: | |||||||
|   pull_request: |   pull_request: | ||||||
|     branches: [ main, v*.x ] |     branches: [ main, v*.x ] | ||||||
| 
 | 
 | ||||||
|  | concurrency: | ||||||
|  |     group: acceptance-${{ github.ref }} | ||||||
|  |     cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
| 
 | 
 | ||||||
|   build: |   build: | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								.github/workflows/testing.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/testing.yml
									
									
									
									
										vendored
									
									
								
							| @ -2,6 +2,10 @@ name: Testing | |||||||
| 
 | 
 | ||||||
| on: [push, pull_request] | on: [push, pull_request] | ||||||
| 
 | 
 | ||||||
|  | concurrency: | ||||||
|  |     group: testing-${{ github.ref }} | ||||||
|  |     cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   test: |   test: | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,8 +17,6 @@ import { CoreContentLinksDelegate } from '@features/contentlinks/services/conten | |||||||
| import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; | import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; | ||||||
| import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate'; | import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate'; | ||||||
| import { CoreUserDelegate } from '@features/user/services/user-delegate'; | import { CoreUserDelegate } from '@features/user/services/user-delegate'; | ||||||
| import { AddonCompetencyProvider } from './services/competency'; |  | ||||||
| import { AddonCompetencyHelperProvider } from './services/competency-helper'; |  | ||||||
| import { AddonCompetencyCompetencyLinkHandler } from './services/handlers/competency-link'; | import { AddonCompetencyCompetencyLinkHandler } from './services/handlers/competency-link'; | ||||||
| import { AddonCompetencyCourseOptionHandler } from './services/handlers/course-option'; | import { AddonCompetencyCourseOptionHandler } from './services/handlers/course-option'; | ||||||
| import { AddonCompetencyPlanLinkHandler } from './services/handlers/plan-link'; | import { AddonCompetencyPlanLinkHandler } from './services/handlers/plan-link'; | ||||||
| @ -33,11 +31,20 @@ import { CoreCourseIndexRoutingModule } from '@features/course/course-routing.mo | |||||||
| import { COURSE_PAGE_NAME } from '@features/course/course.module'; | import { COURSE_PAGE_NAME } from '@features/course/course.module'; | ||||||
| import { PARTICIPANTS_PAGE_NAME } from '@features/user/user.module'; | import { PARTICIPANTS_PAGE_NAME } from '@features/user/user.module'; | ||||||
| 
 | 
 | ||||||
| // List of providers (without handlers).
 | /** | ||||||
| export const ADDON_COMPETENCY_SERVICES: Type<unknown>[] = [ |  * Get competency services. | ||||||
|     AddonCompetencyProvider, |  * | ||||||
|     AddonCompetencyHelperProvider, |  * @returns Competency services. | ||||||
| ]; |  */ | ||||||
|  | export async function getCompetencyServices(): Promise<Type<unknown>[]> { | ||||||
|  |     const { AddonCompetencyProvider } = await import('@addons/competency/services/competency'); | ||||||
|  |     const { AddonCompetencyHelperProvider } = await import('@addons/competency/services/competency-helper'); | ||||||
|  | 
 | ||||||
|  |     return [ | ||||||
|  |         AddonCompetencyProvider, | ||||||
|  |         AddonCompetencyHelperProvider, | ||||||
|  |     ]; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| export const ADDON_COMPETENCY_LEARNING_PLANS_PAGE = 'learning-plans'; | export const ADDON_COMPETENCY_LEARNING_PLANS_PAGE = 'learning-plans'; | ||||||
| export const ADDON_COMPETENCY_COMPETENCIES_PAGE = 'competencies'; | export const ADDON_COMPETENCY_COMPETENCIES_PAGE = 'competencies'; | ||||||
|  | |||||||
| @ -42,18 +42,34 @@ export class AddonCompetencyProvider { | |||||||
|     static readonly REVIEW_STATUS_WAITING_FOR_REVIEW = 1; |     static readonly REVIEW_STATUS_WAITING_FOR_REVIEW = 1; | ||||||
|     static readonly REVIEW_STATUS_IN_REVIEW = 2; |     static readonly REVIEW_STATUS_IN_REVIEW = 2; | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if competencies are enabled in a certain site. | ||||||
|  |      * | ||||||
|  |      * @param options Site ID or site object. | ||||||
|  |      * @returns Whether competencies are enabled. | ||||||
|  |      */ | ||||||
|  |     async areCompetenciesEnabled(options?: {siteId?: string; site?: CoreSite}): Promise<boolean> { | ||||||
|  |         const site = options?.site ? options.site : await CoreSites.getSite(options?.siteId); | ||||||
|  | 
 | ||||||
|  |         if (!site) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return site.canUseAdvancedFeature('enablecompetencies') && | ||||||
|  |             !(site.isFeatureDisabled('CoreMainMenuDelegate_AddonCompetency') && | ||||||
|  |             site.isFeatureDisabled('CoreCourseOptionsDelegate_AddonCompetency') && | ||||||
|  |             site.isFeatureDisabled('CoreUserDelegate_AddonCompetency')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Check if all competencies features are disabled. |      * Check if all competencies features are disabled. | ||||||
|      * |      * | ||||||
|      * @param siteId Site ID. If not defined, current site. |      * @param siteId Site ID. If not defined, current site. | ||||||
|      * @returns Promise resolved with boolean: whether all competency features are disabled. |      * @returns Promise resolved with boolean: whether all competency features are disabled. | ||||||
|  |      * @deprecated since 4.4. Use areCompetenciesEnabled instead. | ||||||
|      */ |      */ | ||||||
|     async allCompetenciesDisabled(siteId?: string): Promise<boolean> { |     async allCompetenciesDisabled(siteId?: string): Promise<boolean> { | ||||||
|         const site = await CoreSites.getSite(siteId); |         return !(await this.areCompetenciesEnabled({ siteId })); | ||||||
| 
 |  | ||||||
|         return site.isFeatureDisabled('CoreMainMenuDelegate_AddonCompetency') && |  | ||||||
|             site.isFeatureDisabled('CoreCourseOptionsDelegate_AddonCompetency') && |  | ||||||
|             site.isFeatureDisabled('CoreUserDelegate_AddonCompetency'); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -69,6 +85,11 @@ export class AddonCompetencyProvider { | |||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         const enabled = await this.areCompetenciesEnabled({ siteId }); | ||||||
|  |         if (!enabled) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         try { |         try { | ||||||
|             const response = await this.getCourseCompetenciesPage(courseId, siteId); |             const response = await this.getCourseCompetenciesPage(courseId, siteId); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -70,10 +70,7 @@ export class AddonCompetencyCompetencyLinkHandlerService extends CoreContentLink | |||||||
|      * @inheritdoc |      * @inheritdoc | ||||||
|      */ |      */ | ||||||
|     async isEnabled(siteId: string): Promise<boolean> { |     async isEnabled(siteId: string): Promise<boolean> { | ||||||
|         // Handler is disabled if all competency features are disabled.
 |         return AddonCompetency.areCompetenciesEnabled({ siteId }); | ||||||
|         const disabled = await AddonCompetency.allCompetenciesDisabled(siteId); |  | ||||||
| 
 |  | ||||||
|         return !disabled; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -39,7 +39,7 @@ export class AddonCompetencyCourseOptionHandlerService implements CoreCourseOpti | |||||||
|      * @inheritdoc |      * @inheritdoc | ||||||
|      */ |      */ | ||||||
|     async isEnabled(): Promise<boolean> { |     async isEnabled(): Promise<boolean> { | ||||||
|         return true; |         return AddonCompetency.areCompetenciesEnabled(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -48,10 +48,7 @@ export class AddonCompetencyPlanLinkHandlerService extends CoreContentLinksHandl | |||||||
|      * @inheritdoc |      * @inheritdoc | ||||||
|      */ |      */ | ||||||
|     async isEnabled(siteId: string): Promise<boolean> { |     async isEnabled(siteId: string): Promise<boolean> { | ||||||
|         // Handler is disabled if all competency features are disabled.
 |         return AddonCompetency.areCompetenciesEnabled({ siteId }); | ||||||
|         const disabled = await AddonCompetency.allCompetenciesDisabled(siteId); |  | ||||||
| 
 |  | ||||||
|         return !disabled; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -49,10 +49,7 @@ export class AddonCompetencyPlansLinkHandlerService extends CoreContentLinksHand | |||||||
|      * @inheritdoc |      * @inheritdoc | ||||||
|      */ |      */ | ||||||
|     async isEnabled(siteId: string): Promise<boolean> { |     async isEnabled(siteId: string): Promise<boolean> { | ||||||
|         // Handler is disabled if all competency features are disabled.
 |         return AddonCompetency.areCompetenciesEnabled({ siteId }); | ||||||
|         const disabled = await AddonCompetency.allCompetenciesDisabled(siteId); |  | ||||||
| 
 |  | ||||||
|         return !disabled; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -39,7 +39,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat | |||||||
|         if (CoreUtils.isTrueOrOne(notification.notif) && notification.moodlecomponent == 'moodle' && |         if (CoreUtils.isTrueOrOne(notification.notif) && notification.moodlecomponent == 'moodle' && | ||||||
|                 (notification.name == 'competencyplancomment' || notification.name == 'competencyusercompcomment')) { |                 (notification.name == 'competencyplancomment' || notification.name == 'competencyusercompcomment')) { | ||||||
|             // If all competency features are disabled, don't handle the click.
 |             // If all competency features are disabled, don't handle the click.
 | ||||||
|             return AddonCompetency.allCompetenciesDisabled(notification.site).then((disabled) => !disabled); |             return AddonCompetency.areCompetenciesEnabled({ siteId: notification.site }); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return false; |         return false; | ||||||
|  | |||||||
| @ -48,10 +48,7 @@ export class AddonCompetencyUserCompetencyLinkHandlerService extends CoreContent | |||||||
|      * @inheritdoc |      * @inheritdoc | ||||||
|      */ |      */ | ||||||
|     async isEnabled(siteId: string): Promise<boolean> { |     async isEnabled(siteId: string): Promise<boolean> { | ||||||
|         // Handler is disabled if all competency features are disabled.
 |         return AddonCompetency.areCompetenciesEnabled({ siteId }); | ||||||
|         const disabled = await AddonCompetency.allCompetenciesDisabled(siteId); |  | ||||||
| 
 |  | ||||||
|         return !disabled; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -43,7 +43,7 @@ export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler | |||||||
|      * @inheritdoc |      * @inheritdoc | ||||||
|      */ |      */ | ||||||
|     async isEnabled(): Promise<boolean> { |     async isEnabled(): Promise<boolean> { | ||||||
|         return true; |         return AddonCompetency.areCompetenciesEnabled(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -175,6 +175,15 @@ Feature: Test competency navigation | |||||||
|     Then I should find "Desserts are important" in the app |     Then I should find "Desserts are important" in the app | ||||||
|     But I should not find "Cakes" in the app |     But I should not find "Cakes" in the app | ||||||
| 
 | 
 | ||||||
|  |     Given the following config values are set as admin: | ||||||
|  |       | enabled | 0 | core_competency | | ||||||
|  |     When I entered the course "Course 1" as "student1" in the app | ||||||
|  |     Then I should not find "Competencies" in the app | ||||||
|  | 
 | ||||||
|  |     When I press the back button in the app | ||||||
|  |     And I press the user menu button in the app | ||||||
|  |     And I should not find "Learning plans" in the app | ||||||
|  | 
 | ||||||
|   Scenario: Mobile navigation (teacher) |   Scenario: Mobile navigation (teacher) | ||||||
|     Given I entered the course "Course 1" as "teacher1" in the app |     Given I entered the course "Course 1" as "teacher1" in the app | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -127,7 +127,7 @@ import { CoreSitePluginsAssignSubmissionComponent } from '@features/siteplugins/ | |||||||
| import { ADDON_BADGES_SERVICES } from '@addons/badges/badges.module'; | import { ADDON_BADGES_SERVICES } from '@addons/badges/badges.module'; | ||||||
| import { ADDON_CALENDAR_SERVICES } from '@addons/calendar/calendar.module'; | import { ADDON_CALENDAR_SERVICES } from '@addons/calendar/calendar.module'; | ||||||
| import { getCourseCompletionServices } from '@addons/coursecompletion/coursecompletion.module'; | import { getCourseCompletionServices } from '@addons/coursecompletion/coursecompletion.module'; | ||||||
| import { ADDON_COMPETENCY_SERVICES } from '@addons/competency/competency.module'; | import { getCompetencyServices } from '@addons/competency/competency.module'; | ||||||
| import { ADDON_MESSAGEOUTPUT_SERVICES } from '@addons/messageoutput/messageoutput.module'; | import { ADDON_MESSAGEOUTPUT_SERVICES } from '@addons/messageoutput/messageoutput.module'; | ||||||
| import { ADDON_MESSAGES_SERVICES } from '@addons/messages/messages.module'; | import { ADDON_MESSAGES_SERVICES } from '@addons/messages/messages.module'; | ||||||
| import { ADDON_MOD_ASSIGN_SERVICES } from '@addons/mod/assign/assign.module'; | import { ADDON_MOD_ASSIGN_SERVICES } from '@addons/mod/assign/assign.module'; | ||||||
| @ -307,7 +307,6 @@ export class CoreCompileProvider { | |||||||
|             ...extraProviders, |             ...extraProviders, | ||||||
|             ...ADDON_BADGES_SERVICES, |             ...ADDON_BADGES_SERVICES, | ||||||
|             ...ADDON_CALENDAR_SERVICES, |             ...ADDON_CALENDAR_SERVICES, | ||||||
|             ...ADDON_COMPETENCY_SERVICES, |  | ||||||
|             ...ADDON_MESSAGEOUTPUT_SERVICES, |             ...ADDON_MESSAGEOUTPUT_SERVICES, | ||||||
|             ...ADDON_MESSAGES_SERVICES, |             ...ADDON_MESSAGES_SERVICES, | ||||||
|             ...ADDON_MOD_ASSIGN_SERVICES, |             ...ADDON_MOD_ASSIGN_SERVICES, | ||||||
| @ -407,6 +406,7 @@ export class CoreCompileProvider { | |||||||
|      */ |      */ | ||||||
|     async getLazyLibraries(): Promise<Type<unknown>[]> { |     async getLazyLibraries(): Promise<Type<unknown>[]> { | ||||||
|         const ADDON_MOD_WORKSHOP_SERVICES = await getWorkshopServices(); |         const ADDON_MOD_WORKSHOP_SERVICES = await getWorkshopServices(); | ||||||
|  |         const ADDON_COMPETENCY_SERVICES = await getCompetencyServices(); | ||||||
|         const ADDON_COURSECOMPLETION_SERVICES = await getCourseCompletionServices(); |         const ADDON_COURSECOMPLETION_SERVICES = await getCourseCompletionServices(); | ||||||
| 
 | 
 | ||||||
|         const CORE_COMMENTS_SERVICES = await getCommentsServices(); |         const CORE_COMMENTS_SERVICES = await getCommentsServices(); | ||||||
| @ -414,6 +414,7 @@ export class CoreCompileProvider { | |||||||
| 
 | 
 | ||||||
|         return [ |         return [ | ||||||
|             ...ADDON_MOD_WORKSHOP_SERVICES, |             ...ADDON_MOD_WORKSHOP_SERVICES, | ||||||
|  |             ...ADDON_COMPETENCY_SERVICES, | ||||||
|             ...ADDON_COURSECOMPLETION_SERVICES, |             ...ADDON_COURSECOMPLETION_SERVICES, | ||||||
|             ...CORE_COMMENTS_SERVICES, |             ...CORE_COMMENTS_SERVICES, | ||||||
|             ...CORE_TAG_SERVICES, |             ...CORE_TAG_SERVICES, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user