commit
0cff22ca30
|
@ -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:
|
||||||
|
|
|
@ -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…
Reference in New Issue