Skip to content

Commit

Permalink
Merge pull request learningequality#13014 from ozer550/refactor-facil…
Browse files Browse the repository at this point in the history
…ityconfig-facility-actions-into-composables

Refactor facilityconfig facility actions into composables
  • Loading branch information
rtibbles authored Feb 6, 2025
2 parents 4260da7 + e1a13d4 commit ec90f08
Show file tree
Hide file tree
Showing 62 changed files with 409 additions and 233 deletions.
38 changes: 0 additions & 38 deletions kolibri/core/assets/src/state/modules/core/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import pick from 'lodash/pick';
import client from 'kolibri/client';
import heartbeat from 'kolibri/heartbeat';
import logger from 'kolibri-logging';
import FacilityResource from 'kolibri-common/apiResources/FacilityResource';
import FacilityDatasetResource from 'kolibri-common/apiResources/FacilityDatasetResource';
import UserSyncStatusResource from 'kolibri-common/apiResources/UserSyncStatusResource';
import { setServerTime } from 'kolibri/utils/serverClock';
import urls from 'kolibri/urls';
Expand Down Expand Up @@ -163,42 +161,6 @@ export function setPageVisibility(store) {
_setPageVisibility(store, document.visibilityState === 'visible');
}

export function getFacilities(store) {
return FacilityResource.fetchCollection({ force: true }).then(facilities => {
store.commit('CORE_SET_FACILITIES', [...facilities]);
});
}

export function getFacilityConfig(store, facilityId) {
const { userFacilityId, selectedFacility } = store.getters;
const facId = facilityId || userFacilityId;
if (!facId) {
// No facility Id, so nothing good is going to happen here.
// Redirect and let Kolibri sort it out.
return Promise.resolve(redirectBrowser());
}
let datasetPromise;
if (selectedFacility && typeof selectedFacility.dataset !== 'object') {
datasetPromise = Promise.resolve([selectedFacility.dataset]);
} else {
datasetPromise = FacilityDatasetResource.fetchCollection({
getParams: {
// fetchCollection for currentSession's facilityId if none was passed
facility_id: facId,
},
});
}

return datasetPromise.then(facilityConfig => {
let config = {};
const facility = facilityConfig[0];
if (facility) {
config = { ...facility };
}
store.commit('CORE_SET_FACILITY_CONFIG', config);
});
}

export function loading(store) {
return new Promise(resolve => {
store.commit('CORE_SET_PAGE_LOADING', true);
Expand Down
8 changes: 0 additions & 8 deletions kolibri/core/assets/src/state/modules/core/getters.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
import useUser from 'kolibri/composables/useUser';
import { get } from '@vueuse/core';

export function facilityConfig(state) {
return state.facilityConfig;
}

export function facilities(state) {
return state.facilities;
}

export function pageSessionId(state) {
return state.pageSessionId;
}
Expand Down
2 changes: 0 additions & 2 deletions kolibri/core/assets/src/state/modules/core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ export default {
notifications: [],
allowRemoteAccess: plugin_data.allowRemoteAccess,
// facility
facilityConfig: {},
facilities: [],
pageVisible: true,
};
},
Expand Down
6 changes: 0 additions & 6 deletions kolibri/core/assets/src/state/modules/core/mutations.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
export default {
CORE_SET_FACILITY_CONFIG(state, facilityConfig) {
state.facilityConfig = facilityConfig;
},
CORE_SET_FACILITIES(state, facilities) {
state.facilities = facilities;
},
CORE_SET_PAGE_LOADING(state, value) {
const update = { loading: value };
if (value) {
Expand Down
4 changes: 0 additions & 4 deletions kolibri/core/assets/src/state/modules/session.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,6 @@ export default {
isFacilityAdmin(state) {
return state.kind.includes(UserKinds.ADMIN);
},
// An "Multi-Facility Admin" is a superuser for a device with 2+ facilities
userIsMultiFacilityAdmin(state, getters, rootState) {
return getters.isSuperuser && rootState.core.facilities.length > 1;
},
getUserPermissions(state) {
const permissions = {};
permissions.can_manage_content = state.can_manage_content;
Expand Down
7 changes: 5 additions & 2 deletions kolibri/plugins/coach/assets/src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ import router from 'kolibri/router';
import ChannelResource from 'kolibri-common/apiResources/ChannelResource';
import KolibriApp from 'kolibri-app';
import useSnackbar from 'kolibri/composables/useSnackbar';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { PageNames } from './constants';
import routes from './routes';
import pluginModule from './modules/pluginModule';
import HomeActivityPage from './views/home/HomeActivityPage';

const { getFacilities, facilities } = useFacilities();

function _channelListState(data) {
return data.map(channel => ({
id: channel.id,
Expand Down Expand Up @@ -139,8 +142,8 @@ class CoachToolsModule extends KolibriApp {
promises.push(this.store.dispatch('initClassInfo', to.params.classId));
}

if (get(isSuperuser) && this.store.state.core.facilities.length === 0) {
promises.push(this.store.dispatch('getFacilities').catch(() => {}));
if (get(isSuperuser) && facilities.value.length === 0) {
promises.push(getFacilities().catch(() => {}));
}

if (promises.length > 0) {
Expand Down
6 changes: 4 additions & 2 deletions kolibri/plugins/coach/assets/src/composables/useCoreCoach.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { get } from '@vueuse/core';
import { computed, getCurrentInstance } from 'vue';
import { currentLanguage, isRtl } from 'kolibri/utils/i18n';
import useUser from 'kolibri/composables/useUser';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { coachStrings } from '../views/common/commonCoachStrings';

const logging = logger.getLogger(__filename);
Expand All @@ -17,14 +18,15 @@ export default function useCoreCoach(store) {
const classId = computed(() => get(route).params.classId);
const groups = computed(() => store.getters['classSummary/groups']);
const { isSuperuser } = useUser();
const { facilities } = useFacilities();

function getAppBarTitle() {
let facilityName;
// Using coachStrings.$tr() here because mixins are not applied
// prior to props being processed.
const { facility_id, name } = store.state.classSummary;
if (facility_id && store.state.core.facilities.length > 1 && get(isSuperuser)) {
const match = find(store.state.core.facilities, { id: facility_id }) || {};
if (facility_id && get(facilities).length > 1 && get(isSuperuser)) {
const match = find(get(facilities), { id: facility_id }) || {};
facilityName = match.name;
}
if (facilityName && name) {
Expand Down
6 changes: 4 additions & 2 deletions kolibri/plugins/coach/assets/src/composables/useGroups.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ import samePageCheckGenerator from 'kolibri-common/utils/samePageCheckGenerator'
import LearnerGroupResource from 'kolibri-common/apiResources/LearnerGroupResource';
import FacilityUserResource from 'kolibri-common/apiResources/FacilityUserResource';
import useUser from 'kolibri/composables/useUser';
import useFacilities from 'kolibri-common/composables/useFacilities';

// Place outside the function to keep the state
const groupsAreLoading = ref(false);
const { getFacilities, facilities } = useFacilities();

export function useGroups() {
function setGroupsLoading(loading) {
Expand All @@ -15,8 +17,8 @@ export function useGroups() {
async function showGroupsPage(store, classId) {
const initClassInfoPromise = store.dispatch('initClassInfo', classId);
const getFacilitiesPromise =
useUser().isSuperuser.value && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
useUser().isSuperuser.value && facilities.value.length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

await Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand Down
6 changes: 4 additions & 2 deletions kolibri/plugins/coach/assets/src/composables/useLessons.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { ref } from 'vue';
import LearnerGroupResource from 'kolibri-common/apiResources/LearnerGroupResource';
import useUser from 'kolibri/composables/useUser';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { PageNames } from '../constants';

// Place outside the function to keep the state
const lessonsAreLoading = ref(false);
const { getFacilities, facilities } = useFacilities();

export function useLessons() {
function setLessonsLoading(loading) {
Expand All @@ -15,8 +17,8 @@ export function useLessons() {
async function showLessonsRootPage(store, classId) {
const initClassInfoPromise = store.dispatch('initClassInfo', classId);
const getFacilitiesPromise =
useUser().isSuperuser.value && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
useUser().isSuperuser.value && facilities.value.length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

await Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ import { ContentNodeKinds } from 'kolibri/constants';
import chunk from 'lodash/chunk';
import useUser from 'kolibri/composables/useUser';
import { get } from '@vueuse/core';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { PageNames } from '../../constants';

const { getFacilities, facilities } = useFacilities();

async function showResourceSelectionPage(store, params) {
const {
lessonId,
Expand All @@ -22,8 +25,8 @@ async function showResourceSelectionPage(store, params) {
const initClassInfoPromise = store.dispatch('initClassInfo', params.classId);
const { isSuperuser } = useUser();
const getFacilitiesPromise =
get(isSuperuser) && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
get(isSuperuser) && get(facilities).length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

await Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand Down Expand Up @@ -186,8 +189,8 @@ export async function showLessonResourceContentPreview(store, params) {
const initClassInfoPromise = store.dispatch('initClassInfo', classId);
const { isSuperuser } = useUser();
const getFacilitiesPromise =
get(isSuperuser) && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
get(isSuperuser) && get(facilities).length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

await Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand All @@ -203,8 +206,8 @@ export async function showLessonSelectionContentPreview(store, params, query = {
const initClassInfoPromise = store.dispatch('initClassInfo', classId);
const { isSuperuser } = useUser();
const getFacilitiesPromise =
get(isSuperuser) && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
get(isSuperuser) && get(facilities).length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

await Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import LearnerGroupResource from 'kolibri-common/apiResources/LearnerGroupResource';
import useUser from 'kolibri/composables/useUser';
import { get } from '@vueuse/core';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { PageNames } from '../../constants';

export async function setLessonSummaryState(store, params) {
const { getFacilities, facilities } = useFacilities();
const { classId, lessonId } = params;
store.commit('lessonSummary/resources/RESET_STATE');
store.commit('lessonSummary/SET_STATE', {
Expand All @@ -16,8 +18,8 @@ export async function setLessonSummaryState(store, params) {
const initClassInfoPromise = store.dispatch('initClassInfo', classId);
const { isSuperuser } = useUser();
const getFacilitiesPromise =
get(isSuperuser) && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
get(isSuperuser) && get(facilities).length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

await Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand Down
11 changes: 7 additions & 4 deletions kolibri/plugins/coach/assets/src/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import store from 'kolibri/store';
import router from 'kolibri/router';
import useUser from 'kolibri/composables/useUser';
import { get } from '@vueuse/core';
import useFacilities from 'kolibri-common/composables/useFacilities';
import AllFacilitiesPage from '../views/AllFacilitiesPage';
import CoachClassListPage from '../views/CoachClassListPage';
import ClassLearnersListPage from '../views/ClassLearnersListPage';
Expand All @@ -20,9 +21,11 @@ import groupsRoutes from './groupsRoutes';
function showHomePage(toRoute) {
const initClassInfoPromise = store.dispatch('initClassInfo', toRoute.params.classId);
const { isSuperuser } = useUser();
const { getFacilities, facilities } = useFacilities();

const getFacilitiesPromise =
get(isSuperuser) && store.state.core.facilities.length === 0
? store.dispatch('getFacilities').catch(() => {})
get(isSuperuser) && get(facilities).length === 0
? getFacilities().catch(() => {})
: Promise.resolve();

return Promise.all([initClassInfoPromise, getFacilitiesPromise]);
Expand Down Expand Up @@ -124,8 +127,8 @@ export default [
path: '/',
// Redirect to AllFacilitiesPage if a superuser and device has > 1 facility
beforeEnter(to, from, next) {
const { userIsMultiFacilityAdmin } = useUser();
if (get(userIsMultiFacilityAdmin)) {
const { userIsMultiFacilityAdmin } = useFacilities();
if (userIsMultiFacilityAdmin.value) {
next({ name: 'AllFacilitiesPage', replace: true });
} else {
next({ name: 'CoachClassListPage', replace: true });
Expand Down
9 changes: 5 additions & 4 deletions kolibri/plugins/coach/assets/src/routes/utils.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import store from 'kolibri/store';
import useUser from 'kolibri/composables/useUser';
import { get } from '@vueuse/core';
import useFacilities from 'kolibri-common/composables/useFacilities';

export function classIdParamRequiredGuard(toRoute, subtopicName, next) {
if (!toRoute.params.classId) {
const { userIsMultiFacilityAdmin } = useUser();
const redirectPage = get(userIsMultiFacilityAdmin) ? 'AllFacilitiesPage' : 'CoachClassListPage';
const { userIsMultiFacilityAdmin } = useFacilities();
const redirectPage = userIsMultiFacilityAdmin.value
? 'AllFacilitiesPage'
: 'CoachClassListPage';

next({
name: redirectPage,
Expand Down
11 changes: 4 additions & 7 deletions kolibri/plugins/coach/assets/src/views/AllFacilitiesPage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import CoreTable from 'kolibri/components/CoreTable';
import commonCoreStrings from 'kolibri/uiText/commonCoreStrings';
import useUser from 'kolibri/composables/useUser';
import useFacilities from 'kolibri-common/composables/useFacilities';
import commonCoach from './common';
import CoachAppBarPage from './CoachAppBarPage';
Expand All @@ -53,8 +54,9 @@
},
mixins: [commonCoach, commonCoreStrings],
setup() {
const { facility_id, userIsMultiFacilityAdmin } = useUser();
return { facility_id, userIsMultiFacilityAdmin };
const { facility_id } = useUser();
const { facilities, userIsMultiFacilityAdmin } = useFacilities();
return { facility_id, userIsMultiFacilityAdmin, facilities };
},
props: {
subtopicName: {
Expand All @@ -63,11 +65,6 @@
default: null,
},
},
computed: {
facilities() {
return this.$store.state.core.facilities;
},
},
beforeMount() {
if (!this.userIsMultiFacilityAdmin) {
const singleFacility = { id: this.facility_id };
Expand Down
8 changes: 5 additions & 3 deletions kolibri/plugins/coach/assets/src/views/CoachClassListPage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
import commonCoreStrings from 'kolibri/uiText/commonCoreStrings';
import urls from 'kolibri/urls';
import useUser from 'kolibri/composables/useUser';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { PageNames } from '../constants';
import CoachAppBarPage from './CoachAppBarPage';
import commonCoach from './common';
Expand All @@ -81,8 +82,9 @@
},
mixins: [commonCoach, commonCoreStrings],
setup() {
const { isClassCoach, isFacilityCoach, userIsMultiFacilityAdmin } = useUser();
return { isClassCoach, isFacilityCoach, userIsMultiFacilityAdmin };
const { isClassCoach, isFacilityCoach } = useUser();
const { facilities, userIsMultiFacilityAdmin } = useFacilities();
return { isClassCoach, isFacilityCoach, userIsMultiFacilityAdmin, facilities };
},
props: {
subtopicName: {
Expand Down Expand Up @@ -127,7 +129,7 @@
const { facility_id } = this.$route.params;
if (facility_id) {
const match = find(this.$store.state.core.facilities, { id: facility_id }) || {};
const match = find(this.facilities, { id: facility_id }) || {};
facilityName = match.name;
}
if (facilityName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
import { mapGetters } from 'vuex';
import pickBy from 'lodash/pickBy';
import commonCoreStrings from 'kolibri/uiText/commonCoreStrings';
import useUser from 'kolibri/composables/useUser';
import useFacilities from 'kolibri-common/composables/useFacilities';
import { ClassesPageNames } from '../../../../../../learn/assets/src/constants';
import commonCoach from '../../common';
import { LastPages } from '../../../constants/lastPagesConstants';
Expand All @@ -71,7 +71,7 @@
name: 'OverviewBlock',
mixins: [commonCoach, commonCoreStrings],
setup() {
const { userIsMultiFacilityAdmin } = useUser();
const { userIsMultiFacilityAdmin } = useFacilities();
return { userIsMultiFacilityAdmin };
},
computed: {
Expand Down
Loading

0 comments on commit ec90f08

Please sign in to comment.