{"version":3,"file":"useSubOrganisations-CYdarHCA.mjs","names":[],"sources":["../src/helper/slugify.ts","../src/components/composable/useSubOrganisations.ts"],"sourcesContent":["export function slugify(name: string): string {\n    return name\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '')\n        .toLowerCase()\n        .replace(/[^a-z0-9]+/g, '-')\n        .replace(/^-+|-+$/g, '');\n}\n","import { rubriquesApi } from '@/api';\nimport { slugify } from '@/helper/slugify';\nimport { Annotations } from '@/stores/class/general';\nimport { Rubriquage } from '@/stores/class/rubrique/rubriquage';\nimport ParamSdkStore from '@/stores/ParamSdkStore';\nimport { effectScope, Ref, ref, watch } from 'vue';\n\nconst subOrganisations = ref<Array<SubOrganisation>>([]);\nconst selectedSubOrganisation = ref<SubOrganisation|null>(null);\n\n// Promise for retrieving suborganisations\nlet loadingPromise: Promise<Rubriquage|undefined>|null = null;\n\n// Whether the watch on organisationId has already been registered\nlet watchInitialized = false;\n\nexport interface SubOrganisation {\n    id: number;\n    name: string;\n    annotations: Annotations;\n    podcastCount: number;\n}\n\nfunction slugifySubOrganisation(subOrga: SubOrganisation): string {\n    return slugify(subOrga.name);\n}\n\n/**\n * Composable to manage suborganisation.\n * Allows for selecting (= focusing), unselecting, listing, etc\n * @param organisationId ID of the current organisation\n * @param slugFunc Function to slugify the suborganisation ids\n */\nexport const useSubOrganisations = (organisationId: Ref<string>, slugFunc = slugifySubOrganisation) => {\n\n    // Register the watch on organisationId only once, detached from any\n    // component's lifecycle, so it isn't stopped when the first caller unmounts\n    if (!watchInitialized) {\n        watchInitialized = true;\n\n        // Load suborganisations if necessary\n        if (subOrganisations.value.length === 0 && !loadingPromise) {\n            updateList();\n        }\n\n        effectScope(true).run(() => {\n            watch(organisationId, updateList);\n        });\n    }\n\n    async function updateList() {\n        unselectSubOrganisation();\n        loadingPromise = rubriquesApi.findRestrictiveRubriquage(organisationId.value);\n        const rubriquage = await loadingPromise;\n        loadingPromise = null;\n        if (rubriquage) {\n            subOrganisations.value = rubriquage.rubriques.map(r => ({\n                id: r.rubriqueId,\n                name: r.name,\n                podcastCount: r.podcastCount ?? 0,\n                annotations: r.annotations ?? {}\n            }));\n        } else {\n            subOrganisations.value = [];\n        }\n    }\n\n    async function getSubOrganisation(id: string|number): Promise<SubOrganisation> {\n        if (loadingPromise) {\n            await loadingPromise;\n        }\n\n        let findFunc;\n        if (typeof id === 'string') {\n            findFunc = (c: SubOrganisation) => slugFunc(c) === id;\n        } else {\n            findFunc = (c: SubOrganisation) => c.id === id;\n        }\n\n        const subOrga = subOrganisations.value.find(findFunc);\n        if (subOrga) {\n            return Promise.resolve(subOrga);\n        } else {\n            return Promise.reject(`Sub organisation ${id} not found`);\n        }\n    }\n\n    function selectSubOrganisation(subOrganisation: SubOrganisation): void {\n        if (selectedSubOrganisation.value) {\n            unselectSubOrganisation();\n        }\n\n        selectedSubOrganisation.value = subOrganisation;\n        // Force filtering on rubrique ID of the college\n        ParamSdkStore.state.generalParameters.forceRubriqueId = [\n            ParamSdkStore.state.generalParameters.forceRubriqueId ?? [],\n            subOrganisation.id\n        ].flat();\n    }\n\n    function unselectSubOrganisation(): void {\n        // Nothing to do if no org is selected\n        if (!selectedSubOrganisation.value) {\n            return;\n        }\n\n        // Restore the site's base rubrique filter instead of clearing it outright\n        const data = ParamSdkStore.state.generalParameters.forceRubriqueId;\n        if (Array.isArray(data)) {\n            const idx = data.findIndex(id => id === selectedSubOrganisation.value.id);\n            if (idx >= 0) {\n                data.splice(idx, 1);\n            }\n            ParamSdkStore.state.generalParameters.forceRubriqueId = data;\n        } else {\n            ParamSdkStore.state.generalParameters.forceRubriqueId = undefined;\n        }\n        selectedSubOrganisation.value = null;\n    }\n\n    return {\n        /** Currently selected/focused suborganisation */\n        selectSubOrganisation,\n        /** Change the currently selected/focused suborganisation */\n        selectedSubOrganisation,\n        /** Remove the focus on the suborganisation */\n        unselectSubOrganisation,\n        /** List of available suborganisations */\n        subOrganisations,\n        /**\n         * Get a suborganisation by its ID or sluggified name\n         * @param id Either the numeric ID or the sluggified name of the orga\n         * @returns A promise of the matching sub organisation\n         */\n        getSubOrganisation\n    };\n};\n"],"mappings":";;;AAAA,SAAgB,QAAQ,MAAsB;CAC1C,OAAO,KACF,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC/B;;;ACAA,IAAM,mBAAmB,IAA4B,CAAC,CAAC;AACvD,IAAM,0BAA0B,IAA0B,IAAI;AAG9D,IAAI,iBAAqD;AAGzD,IAAI,mBAAmB;AASvB,SAAS,uBAAuB,SAAkC;CAC9D,OAAO,QAAQ,QAAQ,IAAI;AAC/B;;;;;;;AAQA,IAAa,uBAAuB,gBAA6B,WAAW,2BAA2B;CAInG,IAAI,CAAC,kBAAkB;EACnB,mBAAmB;EAGnB,IAAI,iBAAiB,MAAM,WAAW,KAAK,CAAC,gBACxC,WAAW;EAGf,YAAY,IAAI,EAAE,UAAU;GACxB,MAAM,gBAAgB,UAAU;EACpC,CAAC;CACL;CAEA,eAAe,aAAa;EACxB,wBAAwB;EACxB,iBAAiB,aAAa,0BAA0B,eAAe,KAAK;EAC5E,MAAM,aAAa,MAAM;EACzB,iBAAiB;EACjB,IAAI,YACA,iBAAiB,QAAQ,WAAW,UAAU,KAAI,OAAM;GACpD,IAAI,EAAE;GACN,MAAM,EAAE;GACR,cAAc,EAAE,gBAAgB;GAChC,aAAa,EAAE,eAAe,CAAC;EACnC,EAAE;OAEF,iBAAiB,QAAQ,CAAC;CAElC;CAEA,eAAe,mBAAmB,IAA6C;EAC3E,IAAI,gBACA,MAAM;EAGV,IAAI;EACJ,IAAI,OAAO,OAAO,UACd,YAAY,MAAuB,SAAS,CAAC,MAAM;OAEnD,YAAY,MAAuB,EAAE,OAAO;EAGhD,MAAM,UAAU,iBAAiB,MAAM,KAAK,QAAQ;EACpD,IAAI,SACA,OAAO,QAAQ,QAAQ,OAAO;OAE9B,OAAO,QAAQ,OAAO,oBAAoB,GAAG,WAAW;CAEhE;CAEA,SAAS,sBAAsB,iBAAwC;EACnE,IAAI,wBAAwB,OACxB,wBAAwB;EAG5B,wBAAwB,QAAQ;EAEhC,sBAAc,MAAM,kBAAkB,kBAAkB,CACpD,sBAAc,MAAM,kBAAkB,mBAAmB,CAAC,GAC1D,gBAAgB,EACpB,EAAE,KAAK;CACX;CAEA,SAAS,0BAAgC;EAErC,IAAI,CAAC,wBAAwB,OACzB;EAIJ,MAAM,OAAO,sBAAc,MAAM,kBAAkB;EACnD,IAAI,MAAM,QAAQ,IAAI,GAAG;GACrB,MAAM,MAAM,KAAK,WAAU,OAAM,OAAO,wBAAwB,MAAM,EAAE;GACxE,IAAI,OAAO,GACP,KAAK,OAAO,KAAK,CAAC;GAEtB,sBAAc,MAAM,kBAAkB,kBAAkB;EAC5D,OACI,sBAAc,MAAM,kBAAkB,kBAAkB,KAAA;EAE5D,wBAAwB,QAAQ;CACpC;CAEA,OAAO;;EAEH;;EAEA;;EAEA;;EAEA;;;;;;EAMA;CACJ;AACJ"}