@saooti/octopus-sdk 42.3.0 → 42.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AdvancedSearch-DEh3iiuK.mjs → AdvancedSearch-BTbYmlMm.mjs} +8 -8
- package/dist/AdvancedSearch-C6BJzvGT.mjs.map +1 -0
- package/dist/AdvancedSearch-ChnJq71j.mjs.map +1 -0
- package/dist/AdvancedSearch-ChtUj3vS.mjs.map +1 -0
- package/dist/AdvancedSearch-D-9o5KzI.mjs.map +1 -0
- package/dist/AdvancedSearch-DH5YTENK.mjs.map +1 -0
- package/dist/AdvancedSearch-DN3WFduh.mjs.map +1 -0
- package/dist/AdvancedSearch-EpYd6K3d.mjs.map +1 -0
- package/dist/AdvancedSearch-PRJyRSID.mjs.map +1 -0
- package/dist/AdvancedSearch-_E2nwQ-A.mjs.map +1 -0
- package/dist/AdvancedSearch-cLjakm-6.mjs.map +1 -0
- package/dist/AdvancedSearch-k-fQfSBk.mjs.map +1 -0
- package/dist/AdvancedSearch-zFJq-WlO.mjs.map +1 -0
- package/dist/CategoryChooser-CSUjIA0D.mjs.map +1 -0
- package/dist/{CategoryChooser-CeF4n-nw.mjs → CategoryChooser-fAUMJNHu.mjs} +1 -1
- package/dist/CategoryFilter-B0S_nCvS.mjs.map +1 -0
- package/dist/CategoryFilter-BVrLO_pV.mjs.map +1 -0
- package/dist/{CategoryFilter-Djmal5bY.mjs → CategoryFilter-CsYCvEnz.mjs} +3 -3
- package/dist/CategoryFilter-DVwCpHLx.mjs.map +1 -0
- package/dist/CategoryList-B_9GG6Z9.mjs.map +1 -0
- package/dist/{CategoryList-Dksp79Lm.mjs → CategoryList-CDoIfrDw.mjs} +2 -2
- package/dist/CategoryList-CUae_phb.mjs.map +1 -0
- package/dist/CategoryList-DxR0fpKd.mjs.map +1 -0
- package/dist/CategoryPage-C7aKDtgs.mjs.map +1 -0
- package/dist/{CategoryPage-DC8fMny_.mjs → CategoryPage-Cl5Yuxnu.mjs} +2 -2
- package/dist/CategoryPage-DlnAp05t.mjs.map +1 -0
- package/dist/CategoryPage-Dlq5XQBS.mjs.map +1 -0
- package/dist/{CategorySearchFilter-KVYBscdd.mjs → CategorySearchFilter-Cce5zxZB.mjs} +1 -1
- package/dist/CategorySearchFilter-EULpSE2e.mjs.map +1 -0
- package/dist/ChapteringModal-BplEGZj2.mjs.map +1 -0
- package/dist/ChapteringModal-C9yuW_IU.mjs.map +1 -0
- package/dist/{ChapteringModal-Be9FF1yz.mjs → ChapteringModal-DiiVSG7s.mjs} +1 -1
- package/dist/{CheckIdentityModal-nMszYOsW.mjs → CheckIdentityModal-BrnYeGdk.mjs} +3 -3
- package/dist/CheckIdentityModal-BtGdsv2v.mjs.map +1 -0
- package/dist/CheckIdentityModal-CpRO7ehH.mjs.map +1 -0
- package/dist/CheckIdentityModal-Cry9ra4J.mjs.map +1 -0
- package/dist/ClassicDatePicker--q1yYb-S.mjs.map +1 -0
- package/dist/ClassicDatePicker-4ouU5ov9.mjs.map +1 -0
- package/dist/ClassicDatePicker-B8bI9QfF.mjs.map +1 -0
- package/dist/ClassicDatePicker-BTJWityQ.mjs +186 -0
- package/dist/ClassicDatePicker-CChR9LBd.mjs.map +1 -0
- package/dist/ClassicDatePicker-CopJVkF0.mjs.map +1 -0
- package/dist/ClassicDatePicker-DgcJCevR.mjs.map +1 -0
- package/dist/ClassicDatePicker-NxGNQxHE.mjs.map +1 -0
- package/dist/ClassicDatePicker-dgdGXcRk.mjs.map +1 -0
- package/dist/{ClassicEmojiPicker-B4TAlZvo.mjs → ClassicEmojiPicker-C0gm-DA2.mjs} +1 -1
- package/dist/ClassicEmojiPicker-CJZD8H7L.mjs.map +1 -0
- package/dist/{ClassicHelpButton-DT7T8tMe.mjs → ClassicHelpButton-BnRLmYuh.mjs} +1 -1
- package/dist/ClassicHelpButton-Qb4AwvWI.mjs.map +1 -0
- package/dist/{ClassicInputText-DJ5kURGM.mjs → ClassicInputText-YsntJkHk.mjs} +1 -1
- package/dist/ClassicInputText-npkVSUoH.mjs.map +1 -0
- package/dist/ClassicMultiselect-2I2K-o4R.mjs.map +1 -0
- package/dist/{ClassicMultiselect-CDHdJjjV.mjs → ClassicMultiselect-C0yzVQ8Y.mjs} +1 -1
- package/dist/{ClassicNotifications-DEpVRRHg.mjs → ClassicNotifications-8CVfGSqL.mjs} +1 -1
- package/dist/ClassicNotifications-BFQ-R6kO.mjs.map +1 -0
- package/dist/ClassicNotifications-DR0PM1Xp.mjs.map +1 -0
- package/dist/{ClassicPopover-DWR50Nxi.mjs → ClassicPopover-BUb-1WMB.mjs} +1 -1
- package/dist/ClassicPopover-BhMY2SMo.mjs.map +1 -0
- package/dist/ClipboardModal-B_SZ6jDk.mjs.map +1 -0
- package/dist/{ClipboardModal-BUKwZYOf.mjs → ClipboardModal-ByVXPcKD.mjs} +1 -1
- package/dist/ClipboardModal-DjrZQRtY.mjs.map +1 -0
- package/dist/{CommentInput-US8ZtNj1.mjs → CommentInput-CrRstzua.mjs} +4 -4
- package/dist/CommentInput-DPMj47uE.mjs.map +1 -0
- package/dist/CommentInput-DbhOyi7c.mjs.map +1 -0
- package/dist/CommentInput-I97yysBW.mjs.map +1 -0
- package/dist/CommentItem-AItzrTBi.mjs.map +1 -0
- package/dist/CommentItem-B7vvJwZI.mjs.map +1 -0
- package/dist/{CommentItem-CqWZPmbj.mjs → CommentItem-BYU67TIu.mjs} +4 -4
- package/dist/CommentItem-CvNbH7Hf.mjs.map +1 -0
- package/dist/CommentList-BTyyCcX4.mjs.map +1 -0
- package/dist/CommentList-CWrf45Di.mjs.map +1 -0
- package/dist/CommentList-DP6wk4PD.mjs.map +1 -0
- package/dist/{CommentList-CSYpqgNM.mjs → CommentList-snIIudVC.mjs} +2 -2
- package/dist/CommentMoreActions-BNajG7wk.mjs.map +1 -0
- package/dist/CommentMoreActions-C1l4Y_HY.mjs.map +1 -0
- package/dist/CommentMoreActions-DPbJnEEV.mjs.map +1 -0
- package/dist/{CommentMoreActions-T5RN6BGq.mjs → CommentMoreActions-y202UxL5.mjs} +3 -3
- package/dist/{CommentName-DslRo9jg.mjs → CommentName-CHBlEM7I.mjs} +3 -3
- package/dist/CommentName-D5HN8bGE.mjs.map +1 -0
- package/dist/CommentName-DMom_kwo.mjs.map +1 -0
- package/dist/CommentName-OJrxjSxu.mjs.map +1 -0
- package/dist/CommentParentInfo-DWVF5Ewh.mjs.map +1 -0
- package/dist/CommentParentInfo-Do3IlO95.mjs.map +1 -0
- package/dist/{CommentParentInfo-DMX3nkCb.mjs → CommentParentInfo-DoEeaQGU.mjs} +2 -2
- package/dist/CommentParentInfo-DqHfDpKs.mjs.map +1 -0
- package/dist/{CommentPlayer-D3JEVPKX.mjs → CommentPlayer-B4MXG-gG.mjs} +2 -2
- package/dist/CommentPlayer-B67saxPf.mjs.map +1 -0
- package/dist/CommentPlayer-BUtEvkoV.mjs.map +1 -0
- package/dist/CommentSection-BIZMRePu.mjs.map +1 -0
- package/dist/CommentSection-CSehg6MD.mjs.map +1 -0
- package/dist/{CommentSection-Brn0VQcc.mjs → CommentSection-DZf04NxT.mjs} +3 -3
- package/dist/CommentSection-MDKioQWf.mjs.map +1 -0
- package/dist/CommentStore-BBm8MjxW.mjs.map +1 -0
- package/dist/{CommentStore-hPTYaDGr.mjs → CommentStore-CysGkBHp.mjs} +8 -8
- package/dist/CommentStore-F5MVSrDw.mjs.map +1 -0
- package/dist/ContractPreviewModal-CFSkXgB4.mjs.map +1 -0
- package/dist/ContractPreviewModal-CKL6Rb_V.mjs.map +1 -0
- package/dist/{ContractPreviewModal-48Je4Wuy.mjs → ContractPreviewModal-Dd-1KasR.mjs} +2 -2
- package/dist/DateFilter-BwYSwGc-.mjs.map +1 -0
- package/dist/DateFilter-CGTz76bp.mjs.map +1 -0
- package/dist/DateFilter-CfeYepTO.mjs.map +1 -0
- package/dist/{DateFilter-DztHuPm8.mjs → DateFilter-Cnb_S8Up.mjs} +1 -1
- package/dist/DateFilter-DFw66D2V.mjs.map +1 -0
- package/dist/DateFilter-DMOUMeCh.mjs.map +1 -0
- package/dist/DateFilter-DdbvVu9Q.mjs.map +1 -0
- package/dist/DateFilter-Dr1nRuvZ.mjs.map +1 -0
- package/dist/DateFilter-QGaXHkcu.mjs.map +1 -0
- package/dist/{DownloadPodcastButton-BYWuLoNg.mjs → DownloadPodcastButton-6HtR84aE.mjs} +2 -2
- package/dist/DownloadPodcastButton-D2qeKDPT.mjs.map +1 -0
- package/dist/DownloadPodcastButton-Tr_Y4qMu.mjs.map +1 -0
- package/dist/{EditCommentModal-DacFxzLx.mjs → EditCommentModal-BQ03B6LC.mjs} +2 -2
- package/dist/EditCommentModal-BZitN0Ir.mjs.map +1 -0
- package/dist/EditCommentModal-CcmCx_My.mjs.map +1 -0
- package/dist/EditCommentModal-sj0yXd7-.mjs.map +1 -0
- package/dist/EmissionGroupChooser--428fdeK.mjs.map +1 -0
- package/dist/EmissionGroupChooser-BJCKekKM.mjs.map +1 -0
- package/dist/EmissionGroupChooser-ByqGmsGw.mjs.map +1 -0
- package/dist/EmissionGroupChooser-Cb3CF0uc.mjs.map +1 -0
- package/dist/EmissionGroupChooser-D4vMQH8g.mjs.map +1 -0
- package/dist/{EmissionGroupChooser-KmzQjp7d.mjs → EmissionGroupChooser-De_IpEhW.mjs} +2 -2
- package/dist/EmissionInlineList-CdHQBjfR.mjs.map +1 -0
- package/dist/EmissionInlineList-CnA0d_k2.mjs.map +1 -0
- package/dist/EmissionInlineList-DLUvPBNl.mjs.map +1 -0
- package/dist/{EmissionInlineList-BoEIAbLu.mjs → EmissionInlineList-dlb4gUOP.mjs} +5 -5
- package/dist/EmissionItem-B39oFnXF.mjs.map +1 -0
- package/dist/EmissionItem-BkPLFhAo.mjs.map +1 -0
- package/dist/EmissionItem-CjAUdLb7.mjs.map +1 -0
- package/dist/{EmissionItem-BeQWw-UT.mjs → EmissionItem-Dm_IGNkw.mjs} +4 -4
- package/dist/EmissionList-B0UntYdC.mjs.map +1 -0
- package/dist/EmissionList-BQSI4xbi.mjs.map +1 -0
- package/dist/{EmissionList-DB7O1nj5.mjs → EmissionList-C4JEYLyK.mjs} +4 -4
- package/dist/EmissionList-C7lQBdlW.mjs.map +1 -0
- package/dist/EmissionPage-BF6s2ySo.mjs.map +1 -0
- package/dist/EmissionPage-B_-nDP5x.mjs.map +1 -0
- package/dist/EmissionPage-C-ESprrZ.mjs.map +1 -0
- package/dist/{EmissionPage-CNYJ1Puo.mjs → EmissionPage-C4XUdzzm.mjs} +10 -10
- package/dist/EmissionPage-CPXcNHGS.mjs.map +1 -0
- package/dist/EmissionPage-EMgXCVhK.mjs.map +1 -0
- package/dist/EmissionPage-mXbUqOh9.mjs.map +1 -0
- package/dist/{EmissionPlayerItem-S_yqupad.mjs → EmissionPlayerItem-BLIdolRe.mjs} +3 -3
- package/dist/EmissionPlayerItem-C27zJBhY.mjs.map +1 -0
- package/dist/EmissionPlayerItem-C3fkgEaL.mjs.map +1 -0
- package/dist/EmissionPlayerItem-DxXG20G1.mjs.map +1 -0
- package/dist/EmissionPresentationItem-BNnDSWGQ.mjs.map +1 -0
- package/dist/EmissionPresentationItem-BeETY65I.mjs.map +1 -0
- package/dist/{EmissionPresentationItem-kJgKN7Ju.mjs → EmissionPresentationItem-DYDwfqwp.mjs} +1 -1
- package/dist/EmissionPresentationList-BD7rIUok.mjs.map +1 -0
- package/dist/EmissionPresentationList-CGMyY_iu.mjs.map +1 -0
- package/dist/{EmissionPresentationList-Bg9X3CJP.mjs → EmissionPresentationList-Cxi7QnIs.mjs} +3 -3
- package/dist/EmissionsPage-4To0aRBA.mjs.map +1 -0
- package/dist/{EmissionsPage-BLpGH_PR.mjs → EmissionsPage-B0bXLncg.mjs} +5 -5
- package/dist/EmissionsPage-BIspB5uq.mjs.map +1 -0
- package/dist/EmissionsPage-BhUjdpEu.mjs.map +1 -0
- package/dist/EmissionsPage-Bn1R_ipo.mjs.map +1 -0
- package/dist/EmissionsPage-CNXwdJuV.mjs.map +1 -0
- package/dist/EmissionsPage-CPmhIbFf.mjs.map +1 -0
- package/dist/EmissionsPage-Cgzvn2h8.mjs.map +1 -0
- package/dist/EmissionsPage-D09zTpGb.mjs.map +1 -0
- package/dist/EmissionsPage-Dl7qaQT1.mjs.map +1 -0
- package/dist/EmissionsPage-DyleZtu_.mjs.map +1 -0
- package/dist/EmissionsPage-OVpc7k1Z.mjs.map +1 -0
- package/dist/EmissionsPage-wjKBLFM6.mjs.map +1 -0
- package/dist/Error403Page-B6Q7ijY3.mjs.map +1 -0
- package/dist/Error403Page-DF08mgCL.mjs.map +1 -0
- package/dist/{Error403Page-BB69doEn.mjs → Error403Page-DVmC5AOd.mjs} +2 -2
- package/dist/FooterGarSection-BWahCyz0.mjs.map +1 -0
- package/dist/{FooterGarSection-B9nsnpfF.mjs → FooterGarSection-BqPggI3o.mjs} +3 -3
- package/dist/FooterGarSection-CN8ZfO7e.mjs.map +1 -0
- package/dist/FooterSection-BOjr1LRb.mjs.map +1 -0
- package/dist/{FooterSection-DdGtlbk-.mjs → FooterSection-C5FEIJlU.mjs} +11 -11
- package/dist/FooterSection-nVRzKSYN.mjs.map +1 -0
- package/dist/HomeDropdown-3fl_xltN.mjs.map +1 -0
- package/dist/HomeDropdown-DGNkJhG2.mjs.map +1 -0
- package/dist/{HomeDropdown-BqwwLStt.mjs → HomeDropdown-Fx6kQAuH.mjs} +3 -3
- package/dist/HomeDropdown-PvmOUzYb.mjs.map +1 -0
- package/dist/{HomePage-JOUAKKfP.mjs → HomePage-7PT7HmHs.mjs} +3 -3
- package/dist/HomePage-D0Pbu_h1.mjs.map +1 -0
- package/dist/HomePage-D6_D1f33.mjs.map +1 -0
- package/dist/HomePage-ry0NfX1M.mjs.map +1 -0
- package/dist/InlineRubriqueList-BdpS1pVc.mjs.map +1 -0
- package/dist/InlineRubriqueList-BlcjQ4wR.mjs.map +1 -0
- package/dist/{InlineRubriqueList-BzcHKvM4.mjs → InlineRubriqueList-ezgexR-O.mjs} +1 -1
- package/dist/{LikeSection-MmbHMunb.mjs → LikeSection-CGu4yOCr.mjs} +3 -3
- package/dist/LikeSection-Cqj4y7qZ.mjs.map +1 -0
- package/dist/LikeSection-D95IMsZE.mjs.map +1 -0
- package/dist/LikeSection-HJla-zgI.mjs.map +1 -0
- package/dist/{ListPaginate-5uRK_QKJ.mjs → ListPaginate-BPdnBcpe.mjs} +2 -2
- package/dist/ListPaginate-DYzRnp-2.mjs.map +1 -0
- package/dist/ListPaginate-DyR7HLIc.mjs.map +1 -0
- package/dist/LiveHorizontalList-Bqe351Ut.mjs.map +1 -0
- package/dist/{LiveHorizontalList-CpoIRd4C.mjs → LiveHorizontalList-Bs-Rz5Ws.mjs} +3 -3
- package/dist/LiveHorizontalList-CaujYMT3.mjs.map +1 -0
- package/dist/LiveHorizontalList-DhsOZPT3.mjs.map +1 -0
- package/dist/{LiveList-DYFBrNgg.mjs → LiveList-BVOEnAEc.mjs} +5 -5
- package/dist/LiveList-DMB3FxUM.mjs.map +1 -0
- package/dist/LiveList-DOi4GV1x.mjs.map +1 -0
- package/dist/LiveList-Dh1mJVs7.mjs.map +1 -0
- package/dist/LivesPage-BvDLscOE.mjs.map +1 -0
- package/dist/{LivesPage-FSkmBdVw.mjs → LivesPage-DG5VY4HF.mjs} +2 -2
- package/dist/LivesPage-DmSlg7iH.mjs.map +1 -0
- package/dist/LivesPage-yy_5pI8R.mjs.map +1 -0
- package/dist/MapPage-3n-rigBK.mjs.map +1 -0
- package/dist/MapPage-5GwE8Z4E.mjs.map +1 -0
- package/dist/{MapPage-DpBt2gWF.mjs → MapPage-bIe2a9O1.mjs} +2 -2
- package/dist/MobileMenu-BSos17v3.mjs.map +1 -0
- package/dist/{MobileMenu-CjNMfHUP.mjs → MobileMenu-BZ5nOrYw.mjs} +5 -5
- package/dist/MobileMenu-C6W37oJg.mjs.map +1 -0
- package/dist/MobileMenu-K0rNwrW1.mjs.map +1 -0
- package/dist/NewsletterModal-CFGXBtID.mjs.map +1 -0
- package/dist/NewsletterModal-CZNwpCK5.mjs.map +1 -0
- package/dist/{NewsletterModal-BurqHTFc.mjs → NewsletterModal-DZk0mSVC.mjs} +1 -1
- package/dist/OctopusMultiselect-CFUGyzeM.mjs.map +1 -0
- package/dist/OctopusMultiselect-Cn1lqbQo.mjs.map +1 -0
- package/dist/OctopusMultiselect-esu8BY0J.mjs.map +1 -0
- package/dist/{OctopusMultiselect-C8qljiaH.mjs → OctopusMultiselect-noQPQMZQ.mjs} +7 -5
- package/dist/OrganisationChooser-BKfXLT4G.mjs.map +1 -0
- package/dist/{OrganisationChooser-Dx-OT7MW.mjs → OrganisationChooser-C48cWqbY.mjs} +3 -3
- package/dist/OrganisationChooser-PpO7MD7f.mjs.map +1 -0
- package/dist/OrganisationChooser-Y_jO6oXv.mjs.map +1 -0
- package/dist/{OrganisationChooserLight-BF5fT5pV.mjs → OrganisationChooserLight-Bcltbv-v.mjs} +1 -1
- package/dist/OrganisationChooserLight-Dh7wMH40.mjs.map +1 -0
- package/dist/OrganisationChooserLight-Dx_rkvpP.mjs.map +1 -0
- package/dist/PageNotFound-DeW-K_hL.mjs.map +1 -0
- package/dist/{PageNotFound-Cj-3Gv8T.mjs → PageNotFound-DogaoIFX.mjs} +2 -2
- package/dist/PageNotFound-gRuMWYCp.mjs.map +1 -0
- package/dist/ParticipantInlineList-CY_s6aJm.mjs.map +1 -0
- package/dist/{ParticipantInlineList-DEWqM1Io.mjs → ParticipantInlineList-D9pkOlvP.mjs} +4 -4
- package/dist/ParticipantInlineList-DSatB75C.mjs.map +1 -0
- package/dist/ParticipantItem-BG7yqRvD.mjs.map +1 -0
- package/dist/ParticipantItem-BTK25HID.mjs.map +1 -0
- package/dist/{ParticipantItem-BZAUIeSR.mjs → ParticipantItem-CbHOfVon.mjs} +3 -3
- package/dist/ParticipantPage-B4VnV8Yc.mjs.map +1 -0
- package/dist/ParticipantPage-B6Gzg6ul.mjs.map +1 -0
- package/dist/ParticipantPage-CNRNKTtC.mjs.map +1 -0
- package/dist/ParticipantPage-CpkhQjN2.mjs.map +1 -0
- package/dist/ParticipantPage-D61CCIqy.mjs.map +1 -0
- package/dist/ParticipantPage-Dh4JJCmJ.mjs.map +1 -0
- package/dist/{ParticipantPage-CzaHoWij.mjs → ParticipantPage-nTp2MbgB.mjs} +6 -6
- package/dist/{ParticipantsPage-goxJZQZZ.mjs → ParticipantsPage-Bbz9lQ_0.mjs} +6 -6
- package/dist/ParticipantsPage-COaQrVID.mjs.map +1 -0
- package/dist/ParticipantsPage-DRVVU7qp.mjs.map +1 -0
- package/dist/ParticipantsPage-DhKCWwKE.mjs.map +1 -0
- package/dist/{PlayerAnonymousModal-By96BtpA.mjs → PlayerAnonymousModal-B1iZ34O8.mjs} +2 -2
- package/dist/PlayerAnonymousModal-CBZStK-L.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-Cq6-Dn49.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-Cu2GGoAh.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-DiXWtNmM.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-DrQvDDym.mjs.map +1 -0
- package/dist/PlayerCompact-B9oeGx_g.mjs.map +1 -0
- package/dist/PlayerCompact-DtMginEc.mjs.map +1 -0
- package/dist/PlayerCompact-E8ydrdJ4.mjs.map +1 -0
- package/dist/{PlayerCompact-CjU8xxVH.mjs → PlayerCompact-_39FpkWo.mjs} +4 -4
- package/dist/PlayerComponent-4Wj5XlrS.mjs.map +1 -0
- package/dist/{PlayerComponent-B58O6U6i.mjs → PlayerComponent-B1RsmSf0.mjs} +47 -47
- package/dist/PlayerComponent-BGVzhVz9.mjs.map +1 -0
- package/dist/PlayerComponent-BIshvul2.mjs.map +1 -0
- package/dist/PlayerComponent-BO7wUL2M.mjs.map +1 -0
- package/dist/PlayerComponent-C222I0kT.mjs.map +1 -0
- package/dist/PlayerComponent-CjNZNKKz.mjs.map +1 -0
- package/dist/PlayerComponent-UG_c6_yr.mjs.map +1 -0
- package/dist/{PlayerLarge-CWL5SDzD.mjs → PlayerLarge-BxdyYLOt.mjs} +5 -5
- package/dist/PlayerLarge-CPUAoR9q.mjs.map +1 -0
- package/dist/PlayerLarge-DP7RsA83.mjs.map +1 -0
- package/dist/PlayerLarge-DpiFO7gk.mjs.map +1 -0
- package/dist/PlayerLarge-Dwtmu4gz.mjs.map +1 -0
- package/dist/PlayerLarge-HvRHSw4j.mjs.map +1 -0
- package/dist/PlayerLarge-X5uYCbyS.mjs.map +1 -0
- package/dist/PlayerLarge-qwr3iWSX.mjs.map +1 -0
- package/dist/{PlayerPlayButton-DmvV2YDi.mjs → PlayerPlayButton-BIsfgj0d.mjs} +4 -4
- package/dist/PlayerPlayButton-BQ4zJOrE.mjs.map +1 -0
- package/dist/PlayerPlayButton-kh4ZCdWh.mjs.map +1 -0
- package/dist/PlayerProgressBar-C-I3dk3l.mjs.map +1 -0
- package/dist/PlayerProgressBar-Dr-aFk7O.mjs.map +1 -0
- package/dist/{PlayerProgressBar-Cl_mF4nD.mjs → PlayerProgressBar-dSschgez.mjs} +2 -2
- package/dist/PlayerProgressBar-xc1ZFPJY.mjs.map +1 -0
- package/dist/PlayerStore-Aq_ukXXS.mjs.map +1 -0
- package/dist/PlayerStore-C_QCHbT3.mjs.map +1 -0
- package/dist/{PlayerStore-CKprkxa0.mjs → PlayerStore-DggKki80.mjs} +1 -1
- package/dist/PlayerVideo-BNfhaNUn.mjs.map +1 -0
- package/dist/{PlayerVideo-CVUU7nHT.mjs → PlayerVideo-BWyvKlJT.mjs} +3 -3
- package/dist/PlayerVideo-Bhok6qYS.mjs.map +1 -0
- package/dist/PlayerVideo-CN609whx.mjs.map +1 -0
- package/dist/PlayerVideo-DXG_PsWA.mjs.map +1 -0
- package/dist/PlayerVideo-DzUapxuZ.mjs.map +1 -0
- package/dist/PlayerVideoDigiteka-B1rRVLzy.mjs.map +1 -0
- package/dist/PlayerVideoDigiteka-B6qODy7b.mjs.map +1 -0
- package/dist/{PlayerVideoDigiteka-DZIqqN8a.mjs → PlayerVideoDigiteka-Dxx63XHI.mjs} +2 -2
- package/dist/PlayerVideoHls-BoAbvi2b.mjs.map +1 -0
- package/dist/PlayerVideoHls-BsHaaJB-.mjs.map +1 -0
- package/dist/PlayerVideoHls-C0ddorEn.mjs.map +1 -0
- package/dist/PlayerVideoHls-DBODDRmV.mjs.map +1 -0
- package/dist/PlayerVideoHls-DVNHm_O2.mjs.map +1 -0
- package/dist/{PlayerVideoHls-BirHOkZD.mjs → PlayerVideoHls-DzbyXZsQ.mjs} +9 -7
- package/dist/{PlaylistPage-DljbABur.mjs → PlaylistPage-BdbqXFwR.mjs} +35 -35
- package/dist/PlaylistPage-BgUaPJet.mjs.map +1 -0
- package/dist/PlaylistPage-BwF2VdGb.mjs.map +1 -0
- package/dist/PlaylistPage-CINwx3zE.mjs.map +1 -0
- package/dist/PlaylistPage-CPB647jC.mjs.map +1 -0
- package/dist/PlaylistPage-DDzE5GQs.mjs.map +1 -0
- package/dist/PlaylistPage-bm1nWKMg.mjs.map +1 -0
- package/dist/PlaylistsPage-BwkVSYIp.mjs.map +1 -0
- package/dist/PlaylistsPage-C62NUvz4.mjs.map +1 -0
- package/dist/{PlaylistsPage-BSW-uPWF.mjs → PlaylistsPage-D08i24b2.mjs} +13 -13
- package/dist/PlaylistsPage-Dvh77ql6.mjs.map +1 -0
- package/dist/PodcastFilterList-BBhzOM64.mjs.map +1 -0
- package/dist/PodcastFilterList-BKBjd36i.mjs.map +1 -0
- package/dist/{PodcastFilterList-YM90eN60.mjs → PodcastFilterList-CL5ebQ69.mjs} +3 -3
- package/dist/PodcastFilterList-D9NTYS1v.mjs.map +1 -0
- package/dist/{PodcastImage-BtiQlrb3.mjs → PodcastImage-BFA22TgZ.mjs} +6 -6
- package/dist/PodcastImage-BhQKB5te.mjs.map +1 -0
- package/dist/PodcastImage-CHx3bUzt.mjs.map +1 -0
- package/dist/PodcastInlineList-CcNd_Hbs.mjs.map +1 -0
- package/dist/{PodcastInlineList-B32BSFqN.mjs → PodcastInlineList-H6BxXx0A.mjs} +1 -1
- package/dist/PodcastInlineList-akLivgog.mjs.map +1 -0
- package/dist/PodcastInlineList-jI2EvXSo.mjs.map +1 -0
- package/dist/{PodcastInlineListTemplate-DTrS1UiG.mjs → PodcastInlineListTemplate-Chbi8aME.mjs} +3 -3
- package/dist/PodcastInlineListTemplate-DT9ZRs61.mjs.map +1 -0
- package/dist/PodcastInlineListTemplate-Dh1xF6xT.mjs.map +1 -0
- package/dist/PodcastIsPlaying-C0jcpBQd.mjs.map +1 -0
- package/dist/PodcastIsPlaying-H6P1CHAI.mjs.map +1 -0
- package/dist/{PodcastIsPlaying-BtmHnQi9.mjs → PodcastIsPlaying-ugHcefCy.mjs} +1 -1
- package/dist/{PodcastItem-TdtzApJ6.mjs → PodcastItem-Baki7W0q.mjs} +6 -6
- package/dist/PodcastItem-BfvK4ion.mjs.map +1 -0
- package/dist/PodcastItem-DEhA78z9.mjs.map +1 -0
- package/dist/PodcastItem-DwK_Yu1G.mjs.map +1 -0
- package/dist/PodcastList-B4ic6Cij.mjs.map +1 -0
- package/dist/PodcastList-C2R92m6S.mjs.map +1 -0
- package/dist/PodcastList-DWl6zz_z.mjs.map +1 -0
- package/dist/PodcastList-Dbt4nmKg.mjs.map +1 -0
- package/dist/PodcastList-KaQBRbR9.mjs.map +1 -0
- package/dist/{PodcastList-BAOJhQ7G.mjs → PodcastList-N_XOE-hI.mjs} +5 -5
- package/dist/PodcastList-d3SGLPvF.mjs.map +1 -0
- package/dist/{PodcastList-Bbe3yWiu.mjs → PodcastList-yjd_exFg.mjs} +4 -4
- package/dist/PodcastPage-B0pbZ5o_.mjs.map +1 -0
- package/dist/PodcastPage-BOA44Us4.mjs.map +1 -0
- package/dist/PodcastPage-Bs1wz-0E.mjs.map +1 -0
- package/dist/PodcastPage-C37Wa-qH.mjs.map +1 -0
- package/dist/PodcastPage-D0HYJxaK.mjs.map +1 -0
- package/dist/PodcastPage-D0U6-etV.mjs.map +1 -0
- package/dist/PodcastPage-DwMPY4po.mjs.map +1 -0
- package/dist/{PodcastPage-CAxub2do.mjs → PodcastPage-SUEm-Enm.mjs} +26 -26
- package/dist/PodcastPlayBar-Bo-W_dSK.mjs.map +1 -0
- package/dist/PodcastPlayBar-CBtMWlVc.mjs.map +1 -0
- package/dist/{PodcastPlayBar-gAEttclo.mjs → PodcastPlayBar-COU17bnm.mjs} +3 -3
- package/dist/PodcastPlayBar-Cpr3Ff7J.mjs.map +1 -0
- package/dist/PodcastPlayBasicButton-BvJPrxpI.mjs.map +1 -0
- package/dist/PodcastPlayBasicButton-CS5TNlmX.mjs.map +1 -0
- package/dist/{PodcastPlayBasicButton-7w91y2ow.mjs → PodcastPlayBasicButton-CVXhEUHB.mjs} +1 -1
- package/dist/{PodcastPlayButton-CQY0d6f-.mjs → PodcastPlayButton--gjzxW0o.mjs} +3 -3
- package/dist/PodcastPlayButton-BqvE4ZUl.mjs.map +1 -0
- package/dist/PodcastPlayButton-DW5Feest.mjs.map +1 -0
- package/dist/PodcastPlaylistInlineList-BV31HaB2.mjs.map +1 -0
- package/dist/PodcastPlaylistInlineList-C-WYs6aE.mjs.map +1 -0
- package/dist/{PodcastPlaylistInlineList-BE5L8pSP.mjs → PodcastPlaylistInlineList-DsEHaYGZ.mjs} +7 -7
- package/dist/PodcastPlaylistInlineList-HEdFAq1l.mjs.map +1 -0
- package/dist/{PodcastPresentationList-DH6Rq0Z4.mjs → PodcastPresentationList-B9vORr36.mjs} +4 -4
- package/dist/PodcastPresentationList-ChqvdXY0.mjs.map +1 -0
- package/dist/PodcastPresentationList-Dit6HvJr.mjs.map +1 -0
- package/dist/{PodcastProgressBar-DoeG7lDj.mjs → PodcastProgressBar-B0FwZOTT.mjs} +3 -3
- package/dist/PodcastProgressBar-B8ONWq-Z.mjs.map +1 -0
- package/dist/PodcastProgressBar-BoGtJPAa.mjs.map +1 -0
- package/dist/PodcastProgressBar-DTRhKzW-.mjs.map +1 -0
- package/dist/{PodcastRawTranscript-Cktqtbcg.mjs → PodcastRawTranscript-BiuftXu-.mjs} +2 -2
- package/dist/PodcastRawTranscript-C8SJcaQE.mjs.map +1 -0
- package/dist/PodcastRawTranscript-nfzHM0k_.mjs.map +1 -0
- package/dist/PodcastRawTranscript-r5pRtZDg.mjs.map +1 -0
- package/dist/{PodcastSwiperList-DZ26-8xy.mjs → PodcastSwiperList-BKOYhrsH.mjs} +4 -4
- package/dist/PodcastSwiperList-Bsg0q89o.mjs.map +1 -0
- package/dist/PodcastSwiperList-BxsEv7_8.mjs.map +1 -0
- package/dist/PodcastSwiperList-Cju5VHcH.mjs.map +1 -0
- package/dist/PodcastmakerHeader-6fIwE70J.mjs.map +1 -0
- package/dist/PodcastmakerHeader-BBPEy__r.mjs.map +1 -0
- package/dist/{PodcastmakerHeader-MhdOrssb.mjs → PodcastmakerHeader-CIoJwm1L.mjs} +1 -1
- package/dist/PodcastsPage-967SI8kL.mjs.map +1 -0
- package/dist/{PodcastsPage-BXjTDNhn.mjs → PodcastsPage-B5NwPMyn.mjs} +5 -5
- package/dist/PodcastsPage-B7j2XxPZ.mjs.map +1 -0
- package/dist/PodcastsPage-BOzszXpc.mjs.map +1 -0
- package/dist/PodcastsPage-Bw0tzWoX.mjs.map +1 -0
- package/dist/PodcastsPage-D3TAYJV8.mjs.map +1 -0
- package/dist/PodcastsPage-DJsgHs7V.mjs.map +1 -0
- package/dist/PodcastsPage-DKWHzNNA.mjs.map +1 -0
- package/dist/PodcastsPage-DONqoMkB.mjs.map +1 -0
- package/dist/PodcastsPage-DUcfPeLD.mjs.map +1 -0
- package/dist/PodcastsPage-DWBgwD6o.mjs.map +1 -0
- package/dist/PodcastsPage-DZO4H1Ff.mjs.map +1 -0
- package/dist/PodcastsPage-DhEMPqCT.mjs.map +1 -0
- package/dist/ProductorSearch-BgmV_RCq.mjs.map +1 -0
- package/dist/{ProductorSearch-Z36zTZK4.mjs → ProductorSearch-BiUEs7mG.mjs} +3 -3
- package/dist/ProductorSearch-C4Nv2HzS.mjs.map +1 -0
- package/dist/ProductorSearch-DtVe_rU9.mjs.map +1 -0
- package/dist/ProgressBar-BMeSiueh.mjs.map +1 -0
- package/dist/ProgressBar-C15ih0uL.mjs.map +1 -0
- package/dist/{ProgressBar-CTOa-MDz.mjs → ProgressBar-CXB5q3-H.mjs} +2 -2
- package/dist/ProgressBar-DAUOWol1.mjs.map +1 -0
- package/dist/QrCode-BYLxjhwi.mjs.map +1 -0
- package/dist/QrCode-CCigeTaZ.mjs +109 -0
- package/dist/QrCode-CaXoOjo-.mjs.map +1 -0
- package/dist/QrCode-CcQR60hB.mjs.map +1 -0
- package/dist/QrCode-S_eLVZoz.mjs.map +1 -0
- package/dist/QrCode-XZMMiaX5.mjs.map +1 -0
- package/dist/QrCodeModal-BJOu1pAV.mjs.map +1 -0
- package/dist/QrCodeModal-BjT-0P0w.mjs.map +1 -0
- package/dist/QrCodeModal-BrabSTzq.mjs.map +1 -0
- package/dist/QrCodeModal-CjvbRYLW.mjs.map +1 -0
- package/dist/{QrCodeModal-DE3juCsN.mjs → QrCodeModal-Dpw_tCQ6.mjs} +1 -1
- package/dist/QrCodeModal-N2fjbP4S.mjs.map +1 -0
- package/dist/RadioCurrently-B_b8DV2w.mjs.map +1 -0
- package/dist/RadioCurrently-DufvDqm1.mjs.map +1 -0
- package/dist/{RadioCurrently-BlAhcc9E.mjs → RadioCurrently-ysRKhxKU.mjs} +3 -3
- package/dist/RadioHistory-B03bYMxm.mjs.map +1 -0
- package/dist/{RadioHistory-C7S79sZD.mjs → RadioHistory-DjsqvRgH.mjs} +2 -2
- package/dist/RadioHistory-Dv4gt9TM.mjs.map +1 -0
- package/dist/RadioImage-BFdiGgi_.mjs.map +1 -0
- package/dist/{RadioImage-BTn2Lquc.mjs → RadioImage-CSseYIVb.mjs} +4 -4
- package/dist/RadioImage-CrtD33dM.mjs.map +1 -0
- package/dist/RadioList--f7RDhHJ.mjs.map +1 -0
- package/dist/{RadioList-BD3zNwmk.mjs → RadioList-BZFFAobk.mjs} +4 -4
- package/dist/RadioList-De9NQ23Q.mjs.map +1 -0
- package/dist/RadioPage-BK1N--Kr.mjs.map +1 -0
- package/dist/RadioPage-BTtNFJI2.mjs.map +1 -0
- package/dist/RadioPage-CcK0y_5s.mjs.map +1 -0
- package/dist/RadioPage-Cqas0JX6.mjs.map +1 -0
- package/dist/{RadioPage-Bv3oupa1.mjs → RadioPage-Cwooj0wF.mjs} +4 -4
- package/dist/RadioPage-DhSB0sX5.mjs.map +1 -0
- package/dist/RadioPage-DlahFXYC.mjs.map +1 -0
- package/dist/RadioPlanning-BU1E8i4t.mjs.map +1 -0
- package/dist/{RadioPlanning-nkv_Mb_t.mjs → RadioPlanning-BmIxuUBI.mjs} +2 -2
- package/dist/RadioPlanning-Bx-N-xqX.mjs.map +1 -0
- package/dist/RadioProgressBar-0XM3ZTGU.mjs.map +1 -0
- package/dist/{RadioProgressBar-B2EgCOrK.mjs → RadioProgressBar-CQRGuPpC.mjs} +1 -1
- package/dist/RadioProgressBar-oyeS56mV.mjs.map +1 -0
- package/dist/{RecaptchaModal-w-9MlZ45.mjs → RecaptchaModal-BdW4xNlX.mjs} +1 -1
- package/dist/RecaptchaModal-DFlFQcHs.mjs.map +1 -0
- package/dist/RecaptchaModal-iLQ4UYOL.mjs.map +1 -0
- package/dist/ReportAbuseModal-BaPt2DLK.mjs.map +1 -0
- package/dist/ReportAbuseModal-BdZRe29L.mjs.map +1 -0
- package/dist/ReportAbuseModal-CH7Y153n.mjs.map +1 -0
- package/dist/{ReportAbuseModal-O1K7j7NV.mjs → ReportAbuseModal-jjGeXbB9.mjs} +4 -4
- package/dist/RightsIndicator-4pUsBq5j.mjs.map +1 -0
- package/dist/RightsIndicator-BH3jm_1O.mjs.map +1 -0
- package/dist/{RightsIndicator-D0cSu8j2.mjs → RightsIndicator-CPzWpH5Z.mjs} +1 -1
- package/dist/RightsIndicator-d8ffUFIj.mjs.map +1 -0
- package/dist/{RightsWrapper-BUj_1bwR.mjs → RightsWrapper-BTQ8GGUi.mjs} +5 -5
- package/dist/RightsWrapper-C3BRHqqo.mjs.map +1 -0
- package/dist/RightsWrapper-DJG9Ds6c.mjs.map +1 -0
- package/dist/RightsWrapper-nBURBTJX.mjs.map +1 -0
- package/dist/{RubriqueChoice-DaTWiDbl.mjs → RubriqueChoice-C-S-veJJ.mjs} +1 -1
- package/dist/RubriqueChoice-DsmnrUNs.mjs.map +1 -0
- package/dist/{RubriqueChooser-C33LorHa.mjs → RubriqueChooser-CNGn8LcP.mjs} +1 -1
- package/dist/RubriqueChooser-WmzcajTt.mjs.map +1 -0
- package/dist/RubriqueFilter-C9C_OiF5.mjs.map +1 -0
- package/dist/RubriqueFilter-DDI7DjMR.mjs.map +1 -0
- package/dist/RubriqueFilter-_8V1n9-x.mjs.map +1 -0
- package/dist/{RubriqueFilter-RgardNnQ.mjs → RubriqueFilter-rxiG8Wci.mjs} +3 -3
- package/dist/RubriqueList-99-nWSvq.mjs.map +1 -0
- package/dist/RubriqueList-BiRimk17.mjs.map +1 -0
- package/dist/RubriqueList-H_NHILuj.mjs.map +1 -0
- package/dist/{RubriqueList-DA9OYqUl.mjs → RubriqueList-rJj2IycY.mjs} +4 -4
- package/dist/RubriquePage-6KFPBPz8.mjs.map +1 -0
- package/dist/{RubriquePage-xgTOce7c.mjs → RubriquePage-BNEWnk3-.mjs} +4 -4
- package/dist/RubriquePage-Bpt-x7IK.mjs.map +1 -0
- package/dist/RubriquePage-Cwz9OqLO.mjs.map +1 -0
- package/dist/SearchPage-BtZnj3sA.mjs.map +1 -0
- package/dist/SearchPage-CbbbcXxs.mjs.map +1 -0
- package/dist/SearchPage-DMIV2AgJ.mjs.map +1 -0
- package/dist/{SearchPage-C3o5RPP0.mjs → SearchPage-DsZzPoEw.mjs} +2 -2
- package/dist/ShareAnonymous-BeSQozvM.mjs.map +1 -0
- package/dist/ShareAnonymous-BgsR6Ahp.mjs.map +1 -0
- package/dist/ShareAnonymous-CNWR1v6X.mjs.map +1 -0
- package/dist/{ShareAnonymous-bOwwEjPv.mjs → ShareAnonymous-DK2rnLl1.mjs} +3 -3
- package/dist/ShareAnonymous-DVpKBKbi.mjs.map +1 -0
- package/dist/ShareAnonymous-DWArDFT0.mjs.map +1 -0
- package/dist/ShareAnonymous-IaVbb-rp.mjs.map +1 -0
- package/dist/ShareModalPlayer-BHmsvxXF.mjs.map +1 -0
- package/dist/{ShareModalPlayer-D2oBrSly.mjs → ShareModalPlayer-Cfnk68-U.mjs} +1 -1
- package/dist/ShareModalPlayer-DLBU3lsU.mjs.map +1 -0
- package/dist/ShareModalPlayer-O-CmDObW.mjs.map +1 -0
- package/dist/ShareModalPlayer-QYu8Q9ks.mjs.map +1 -0
- package/dist/ShareModalPlayer-Vga-96DM.mjs.map +1 -0
- package/dist/{ShareNewsletter-CNw1LziN.mjs → ShareNewsletter-BWIAt47D.mjs} +1 -1
- package/dist/ShareNewsletter-BhFk6ARk.mjs.map +1 -0
- package/dist/ShareNewsletter-JCO4h7rk.mjs.map +1 -0
- package/dist/SharePlayer-C-RgIOh1.mjs.map +1 -0
- package/dist/{SharePlayer-CRri0YED.mjs → SharePlayer-C0aveOwy.mjs} +2 -2
- package/dist/SharePlayer-CNXrUj8M.mjs.map +1 -0
- package/dist/SharePlayer-D0-qY2dS.mjs.map +1 -0
- package/dist/SharePlayer-DQoFa7iv.mjs.map +1 -0
- package/dist/SharePlayer-DwNl3E7o.mjs.map +1 -0
- package/dist/{SharePlayerRadio-DVsegQMu.mjs → SharePlayerRadio-BqaeyEls.mjs} +2 -2
- package/dist/SharePlayerRadio-CHvCtKdZ.mjs.map +1 -0
- package/dist/SharePlayerRadio-CIsy-rCC.mjs.map +1 -0
- package/dist/SharePlayerRadio-ChfNulnf.mjs.map +1 -0
- package/dist/SharePlayerRadio-DA-W-306.mjs.map +1 -0
- package/dist/SharePlayerRadio-DwPeLUsk.mjs.map +1 -0
- package/dist/SharePlayerTypes-CeMV4n10.mjs.map +1 -0
- package/dist/SharePlayerTypes-DdyoQZDi.mjs.map +1 -0
- package/dist/{SharePlayerTypes-BxkEoBSL.mjs → SharePlayerTypes-DyrqFDVJ.mjs} +1 -1
- package/dist/ShareSocialsButtons-BHWzJVne.mjs.map +1 -0
- package/dist/ShareSocialsButtons-Bjx2ONvj.mjs.map +1 -0
- package/dist/{ShareSocialsButtons-BJ3DqvIO.mjs → ShareSocialsButtons-PqMXhFEk.mjs} +1 -1
- package/dist/{SimpleLayout-BJlcQjx9.mjs → SimpleLayout-9O9FZ69Q.mjs} +2 -2
- package/dist/SimpleLayout-B-QSfHeQ.mjs.map +1 -0
- package/dist/SimpleLayout-BauUacaf.mjs.map +1 -0
- package/dist/SimpleLayout-C29bPtbd.mjs.map +1 -0
- package/dist/SimpleLayout-Cjc3Q9Mb.mjs.map +1 -0
- package/dist/SimpleLayout-D4sVjQGu.mjs.map +1 -0
- package/dist/SimpleLayout-DaoXS--3.mjs.map +1 -0
- package/dist/SimpleLayout-vkWEZHLi.mjs.map +1 -0
- package/dist/{SmartLinkPage-DpD90wc7.mjs → SmartLinkPage-6HgX8LDv.mjs} +16 -16
- package/dist/SmartLinkPage-BcQmox7e.mjs.map +1 -0
- package/dist/SmartLinkPage-M_zB_Xp1.mjs.map +1 -0
- package/dist/SubscribeButtons-CyGYD1B1.mjs.map +1 -0
- package/dist/SubscribeButtons-DjjZQfOU.mjs.map +1 -0
- package/dist/{SubscribeButtons-zlRDGEzS.mjs → SubscribeButtons-IpzqDGIn.mjs} +3 -3
- package/dist/SubscribeButtons-yA2wowFc.mjs.map +1 -0
- package/dist/SwiperList-BNODHhLF.mjs.map +1 -0
- package/dist/SwiperList-Cqklwlg9.mjs.map +1 -0
- package/dist/{SwiperList-BlF3rPq5.mjs → SwiperList-O8nUg87R.mjs} +1 -1
- package/dist/TagList-4RDriU1J.mjs.map +1 -0
- package/dist/TagList-B5JPfT6j.mjs.map +1 -0
- package/dist/TagList-DVjqXiaA.mjs.map +1 -0
- package/dist/{TagList-BBHyaKp-.mjs → TagList-V9fAFATL.mjs} +2 -2
- package/dist/TagPage-BOsz6Bot.mjs.map +1 -0
- package/dist/TagPage-CALmJwxW.mjs.map +1 -0
- package/dist/{TagPage-DLpNBBjP.mjs → TagPage-CsFwN4sE.mjs} +3 -3
- package/dist/TagPage-DMuxYu6y.mjs.map +1 -0
- package/dist/{TopBar-CLWWRgr7.mjs → TopBar-0oG6YPlW.mjs} +37 -37
- package/dist/TopBar-CUCBss7X.mjs.map +1 -0
- package/dist/TopBar-CeQQ1hgH.mjs.map +1 -0
- package/dist/TopBar-DdxThCLR.mjs.map +1 -0
- package/dist/{UserButtonContent-BR3Rlqwp.mjs → UserButtonContent--VK68UsY.mjs} +6 -6
- package/dist/UserButtonContent-067qGenf.mjs.map +1 -0
- package/dist/UserButtonContent-Dqgyrgzv.mjs.map +1 -0
- package/dist/VideoModuleBox-9QgBI-Q-.mjs.map +1 -0
- package/dist/{VideoModuleBox-DxYJVwy3.mjs → VideoModuleBox-Bcqman6a.mjs} +1 -1
- package/dist/VideoModuleBox-BrVK2bDZ.mjs.map +1 -0
- package/dist/VideoModuleBox-DWO47_bZ.mjs.map +1 -0
- package/dist/VideoPage-4MB4zmnA.mjs.map +1 -0
- package/dist/VideoPage-BDGvtr1o.mjs.map +1 -0
- package/dist/{VideoPage-BaeTduNB.mjs → VideoPage-BjlaP2DU.mjs} +6 -6
- package/dist/VideoPage-C-yjvvhl.mjs.map +1 -0
- package/dist/VideoPage-C0_t7XMC.mjs.map +1 -0
- package/dist/VideoPage-CIDpzbkb.mjs.map +1 -0
- package/dist/VideoPage-D2V1oXGC.mjs.map +1 -0
- package/dist/VideoPage-DEJSfeFy.mjs.map +1 -0
- package/dist/{classicApi-pmODlqv5.mjs → classicApi-CGipMqf7.mjs} +267 -256
- package/dist/classicApi-CW1Z-HoF.mjs.map +1 -0
- package/dist/classicApi-OzToKuW1.mjs.map +1 -0
- package/dist/{downloadHelper-BAI-eqgA.mjs → downloadHelper-C3QooCxr.mjs} +1 -1
- package/dist/downloadHelper-D7dUpp5l.mjs.map +1 -0
- package/dist/downloadHelper-DwV3Mmd3.mjs.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.mjs +183 -183
- package/dist/src/components/form/ClassicDatePicker.vue.d.ts +24 -14
- package/dist/src/components/form/OctopusMultiselect.vue.d.ts +2 -0
- package/dist/src/i18n.d.ts +2 -0
- package/dist/tests.mjs +2 -2
- package/dist/useAdvancedParamInit-BKw9VZ53.mjs.map +1 -0
- package/dist/useAdvancedParamInit-CyRmbqqe.mjs.map +1 -0
- package/dist/{useAdvancedParamInit-Bgvt8758.mjs → useAdvancedParamInit-D5roUdHI.mjs} +10 -10
- package/dist/useDayjs-BKBB00TF.mjs.map +1 -0
- package/dist/useDayjs-UQLGUbw5.mjs.map +1 -0
- package/dist/{useDayjs-DGb3L4kJ.mjs → useDayjs-VUs19G9T.mjs} +1 -1
- package/dist/useErrorHandler-BKN3lhJ5.mjs.map +1 -0
- package/dist/useErrorHandler-C3XnRTmp.mjs.map +1 -0
- package/dist/{useErrorHandler-D9W2BURn.mjs → useErrorHandler-x9sjDYSz.mjs} +1 -1
- package/dist/useImageProxy-AEcmDpvW.mjs.map +1 -0
- package/dist/useImageProxy-BzTG_GCn.mjs.map +1 -0
- package/dist/{useImageProxy-8ndy_oTo.mjs → useImageProxy-CCpDzPmQ.mjs} +1 -1
- package/dist/useOrgaComputed-4PduqYTq.mjs.map +1 -0
- package/dist/useOrgaComputed-C2n0FBbv.mjs.map +1 -0
- package/dist/{useOrgaComputed-CBJ5sDOm.mjs → useOrgaComputed-D81Jihm-.mjs} +2 -2
- package/dist/{usePlayerLogicProgress-C2L7cMdd.mjs → usePlayerLogicProgress-BybmSAcs.mjs} +2 -2
- package/dist/usePlayerLogicProgress-CKoCod6g.mjs.map +1 -0
- package/dist/usePlayerLogicProgress-DZaPRo6p.mjs.map +1 -0
- package/dist/usePodcastView-B-2HPFAo.mjs.map +1 -0
- package/dist/{usePodcastView-CoDJJr6Y.mjs → usePodcastView-CkM-n6iO.mjs} +3 -3
- package/dist/usePodcastView-jdYTK1cW.mjs.map +1 -0
- package/dist/{usePresentationItem-DZZVm3hh.mjs → usePresentationItem-CLEGZwI3.mjs} +3 -3
- package/dist/usePresentationItem-Com4i40U.mjs.map +1 -0
- package/dist/usePresentationItem-OpMean0v.mjs.map +1 -0
- package/dist/{useRights-DOXtpjv5.mjs → useRights-BI2tXXjR.mjs} +1 -1
- package/dist/useRights-Bsv9hr7w.mjs.map +1 -0
- package/dist/useRights-DfudFDI6.mjs.map +1 -0
- package/dist/{useRubriquesFilterComputed-DoUOqOrJ.mjs → useRubriquesFilterComputed-D1yqLnK4.mjs} +1 -1
- package/dist/useRubriquesFilterComputed-DGDJp2gc.mjs.map +1 -0
- package/dist/useRubriquesFilterComputed-NNE-FElk.mjs.map +1 -0
- package/dist/{useRubriquesFilterParam-BE8BbmAQ.mjs → useRubriquesFilterParam-2eMd5ND7.mjs} +1 -1
- package/dist/useRubriquesFilterParam-DE5dYl6c.mjs.map +1 -0
- package/dist/useRubriquesFilterParam-DXYD4G0D.mjs.map +1 -0
- package/dist/useSharePlatforms-CrQ8r5vT.mjs.map +1 -0
- package/dist/useSharePlatforms-D124fJ_v.mjs.map +1 -0
- package/dist/{useSharePlatforms-ZWYDJZBy.mjs → useSharePlatforms-sXgVxsL5.mjs} +5 -5
- package/dist/{useSimplePageParam-DFKSEyiE.mjs → useSimplePageParam-BrtYXOUt.mjs} +1 -1
- package/dist/useSimplePageParam-CruL7rLG.mjs.map +1 -0
- package/dist/useSimplePageParam-SaBaPhb8.mjs.map +1 -0
- package/dist/{useTranslation-Dr7KU7Y4.mjs → useTranslation-BVQwv02Q.mjs} +9 -9
- package/dist/useTranslation-Bf2zP_6C.mjs.map +1 -0
- package/dist/useTranslation-BuhzZoI8.mjs.map +1 -0
- package/dist/useTranslation-OWqckMEl.mjs.map +1 -0
- package/dist/usefetchRadioData-D01ws733.mjs.map +1 -0
- package/dist/usefetchRadioData-DDRPoD4s.mjs.map +1 -0
- package/dist/{usefetchRadioData-SLWfXkYt.mjs → usefetchRadioData-zyQNqiV3.mjs} +1 -1
- package/package.json +1 -1
- package/src/components/composable/useTranslation.ts +2 -2
- package/src/components/display/sharing/QrCode.vue +63 -64
- package/src/components/form/ClassicDatePicker.vue +32 -20
- package/src/components/form/OctopusMultiselect.vue +3 -4
- package/src/components/misc/ClassicPopover.vue +1 -1
- package/src/components/misc/player/video/PlayerVideoHls.vue +160 -159
- package/src/i18n.ts +38 -29
- package/tests/components/form/ClassicDatePicker.spec.ts +32 -0
- package/tests/components/form/OctopusMultiselect.spec.ts +5 -4
- package/dist/ClassicDatePicker-B7UA9CqR.mjs +0 -187
- package/dist/QrCode-DuScZ7PD.mjs +0 -105
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapPage-5GwE8Z4E.mjs","names":["_resolveComponent","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createTextVNode","_toDisplayString","_createElementVNode","_Fragment","_renderList","_createVNode","_createCommentVNode","_sfc_main"],"sources":["../src/components/pages/MapPage.vue","../src/components/pages/MapPage.vue"],"sourcesContent":["<template>\n <section class=\"page-box map-page\">\n <component :is=\"titleTag\">\n {{ t(\"Site map\") }}\n </component>\n <nav :aria-label=\"t('Site menu')\" class=\"d-flex flex-column align-items-center\">\n <ul class=\"my-1\">\n <template v-for=\"linkItem in siteMap\" :key=\"linkItem.id\">\n <li\n v-if=\"linkItem.condition\"\n :id=\"linkItem.id\"\n class=\"my-1\"\n >\n <router-link class=\"text-dark\" :to=\"linkItem.href\">\n {{\n linkItem.title\n }}\n </router-link>\n <ul v-if=\"linkItem.links\">\n <template v-for=\"subLink in linkItem.links\" :key=\"subLink.id\">\n <li\n v-if=\"subLink.condition\"\n :id=\"subLink.id\"\n class=\"my-1\"\n >\n <router-link class=\"text-dark\" :to=\"subLink.href\">\n {{\n subLink.title\n }}\n </router-link>\n </li>\n </template>\n </ul>\n </li>\n </template>\n </ul>\n </nav>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAuthStore } from \"../../stores/AuthStore\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useGeneralStore } from \"../../stores/GeneralStore\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { useI18n } from \"vue-i18n\";\ninterface LinkMapSite {\n id: string;\n title: string;\n href: string;\n condition: boolean;\n links: Array<{\n id: string;\n title: string;\n href: string;\n condition: boolean;\n }>;\n}\n\n\n//Props\nconst props = defineProps({\n externLinks: { default: () => [], type: Array as () => Array<LinkMapSite> },\n titleTag: { default: \"h1\", type: String },\n});\n\n//Data\nconst studioAuthorized = ref(true);\nconst radioAuthorized = ref(true);\n\n\n//Composables\nconst { t } = useI18n();\nconst authStore = useAuthStore();\nconst filterStore = useFilterStore();\nconst generalStore = useGeneralStore();\n\n\n//Computed\nconst isAuthenticated = computed(() =>undefined !== authStore.authProfile?.userId);\nconst isStudioAuth = computed(() =>(authStore.isRoleLive || authStore.isRoleContribution) && studioAuthorized.value);\nconst isPodcastmaker = computed(() =>state.generalParameters.podcastmaker);\nconst organisationsAvailable = computed(() =>authStore.authProfile?.organisations ?? []);\nconst siteMap = computed(() =>[\n ...contentSection.value,\n ...props.externLinks,\n ...userLinks.value,\n ...adminSection.value,\n ...footerLinks.value,\n]);\nconst contentSection = computed(() =>[\n {\n title: t(\"Home\"),\n id: \"link-page-home\",\n href: \"/main/pub/home\",\n condition: true,\n },\n {\n title: isPodcastmaker.value? t(\"Live\"): t(\"Radio & Live\"),\n id: \"link-page-lives\",\n href: \"/main/pub/lives\",\n condition: true,\n },\n {\n title: t(\"Podcasts\"),\n id: \"link-page-podcasts\",\n href: \"/main/pub/podcasts\",\n condition: true,\n },\n {\n title: t(\"Emissions\"),\n id: \"link-page-emissions\",\n href: \"/main/pub/emissions\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n id: \"link-page-participants\",\n href: \"/main/pub/participants\",\n condition: true,\n },\n {\n title: t(\"Playlists\"),\n id: \"link-page-playlists\",\n href: \"/main/pub/playlists\",\n condition: true,\n },\n {\n title: t(\"Productors\"),\n id: \"link-page-productors\",\n href: \"/main/pub/productors\",\n condition:!isPodcastmaker.value && (!filterStore.filterOrgaId || generalStore.platformEducation),\n },\n]);\nconst userLinks = computed(() =>[\n {\n title: t(\"Edit my profile\"),\n href: { name: 'my-profile' },\n id: \"link-page-profile\",\n condition: !isPodcastmaker.value && isAuthenticated.value,\n },\n {\n title: t(\"Edit my organisation\"),\n href: \"/main/priv/edit/organisation\",\n id: \"link-page-organisation\",\n condition:\n !isPodcastmaker.value &&\n isAuthenticated.value &&\n (authStore.isRoleOrganisation || 1 < organisationsAvailable.value.length),\n },\n]);\nconst footerLinks = computed(() =>{\n if (isPodcastmaker.value || authStore.isGarRole) {\n return [];\n }\n return [\n {\n title: t(\"Contact\"),\n href: \"/main/pub/contact\",\n id: \"link-page-contact\",\n condition: true,\n },\n {\n title: t(\"Term of use\"),\n href: \"/main/pub/cgu\",\n id: \"link-page-cgu\",\n condition: true,\n },\n {\n title: t(\"Used libraries\"),\n href: \"/main/pub/libraries\",\n id: \"link-page-libraries\",\n condition: true,\n },\n ];\n});\nconst adminSection = computed(() =>{\n if (isPodcastmaker.value) {\n return [];\n }\n return [\n {\n title: t(\"Welcome in the Backoffice\"),\n href: \"/main/priv/backoffice\",\n id: \"link-page-backoffice\",\n condition: isAuthenticated.value,\n links: [\n {\n title: t(\"Upload\"),\n href: \"/main/priv/upload\",\n id: \"link-page-upload\",\n condition: authStore.isRoleContribution,\n },\n {\n title: t(\"Media library\"),\n href: \"/main/priv/media\",\n id: \"link-page-media\",\n condition: isStudioAuth.value,\n },\n {\n title: t(\"Studio\"),\n href: \"/main/priv/records\",\n id: \"link-page-records\",\n condition: isStudioAuth.value,\n },\n {\n title: t(\"Radio planning\"),\n href: \"/main/priv/radio/\",\n id: \"link-page-radio\",\n condition: authStore.isRoleRadio && radioAuthorized.value,\n },\n {\n title: t(\"Edit / Delete episodes\"),\n href: \"/main/pub/podcasts\",\n id: \"link-page-edit-podcast\",\n condition: true,\n },\n {\n title: t(\"Handle my players\"),\n href: \"/main/priv/players\",\n id: \"link-page-players\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Monetization\"),\n href: \"/main/priv/edit/adserv\",\n id: \"link-page-adserv\",\n condition: authStore.isRoleAdvertising && !generalStore.platformEducation,\n },\n {\n title: t(\"Handle FTP\"),\n href: \"/main/priv/edit/ftp\",\n id: \"link-page-ftp\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Topics and rubrics\"),\n href: \"/main/priv/edit/rubrics\",\n id: \"link-page-rubrics\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Handle RSS\"),\n href: \"/main/priv/edit/rss\",\n id: \"link-page-rss\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Handle my participants\"),\n href: \"/main/priv/participants/handle\",\n id: \"link-page-edit-participants\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Handle comments\"),\n href: \"/main/priv/comments\",\n id: \"link-page-comments\",\n condition: authStore.isRoleComments,\n },\n {\n title: t(\"See my statistics\"),\n href: \"/main/priv/show/stats\",\n id: \"link-page-stats\",\n condition: authStore.isRoleAnalytics,\n },\n {\n title: t(\"Organisations management\"),\n href: \"/main/priv/edit/contract\",\n id: \"link-page-contract\",\n condition: authStore.isRoleAdmin,\n },\n {\n title: t(\"My account\"),\n href: \"/main/priv/account\",\n id: \"link-page-account\",\n condition: true,\n },\n {\n title: t(\"Handle my users\"),\n href: \"/main/priv/user/handle\",\n id: \"link-page-users\",\n condition: authStore.isRoleUsers,\n },\n ],\n },\n ];\n});\n\n\nonMounted(() => {\n studioAuthorized.value = checkOrgaAttribute(\"studio.active\");\n radioAuthorized.value = checkOrgaAttribute(\"radio.active\");\n})\n\n\n//Methods\nfunction checkOrgaAttribute(attribute: string): boolean {\n return \"true\" == authStore.authOrganisation.attributes?.[attribute]?.toString();\n}\n</script>\n","<template>\n <section class=\"page-box map-page\">\n <component :is=\"titleTag\">\n {{ t(\"Site map\") }}\n </component>\n <nav :aria-label=\"t('Site menu')\" class=\"d-flex flex-column align-items-center\">\n <ul class=\"my-1\">\n <template v-for=\"linkItem in siteMap\" :key=\"linkItem.id\">\n <li\n v-if=\"linkItem.condition\"\n :id=\"linkItem.id\"\n class=\"my-1\"\n >\n <router-link class=\"text-dark\" :to=\"linkItem.href\">\n {{\n linkItem.title\n }}\n </router-link>\n <ul v-if=\"linkItem.links\">\n <template v-for=\"subLink in linkItem.links\" :key=\"subLink.id\">\n <li\n v-if=\"subLink.condition\"\n :id=\"subLink.id\"\n class=\"my-1\"\n >\n <router-link class=\"text-dark\" :to=\"subLink.href\">\n {{\n subLink.title\n }}\n </router-link>\n </li>\n </template>\n </ul>\n </li>\n </template>\n </ul>\n </nav>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAuthStore } from \"../../stores/AuthStore\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useGeneralStore } from \"../../stores/GeneralStore\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { useI18n } from \"vue-i18n\";\ninterface LinkMapSite {\n id: string;\n title: string;\n href: string;\n condition: boolean;\n links: Array<{\n id: string;\n title: string;\n href: string;\n condition: boolean;\n }>;\n}\n\n\n//Props\nconst props = defineProps({\n externLinks: { default: () => [], type: Array as () => Array<LinkMapSite> },\n titleTag: { default: \"h1\", type: String },\n});\n\n//Data\nconst studioAuthorized = ref(true);\nconst radioAuthorized = ref(true);\n\n\n//Composables\nconst { t } = useI18n();\nconst authStore = useAuthStore();\nconst filterStore = useFilterStore();\nconst generalStore = useGeneralStore();\n\n\n//Computed\nconst isAuthenticated = computed(() =>undefined !== authStore.authProfile?.userId);\nconst isStudioAuth = computed(() =>(authStore.isRoleLive || authStore.isRoleContribution) && studioAuthorized.value);\nconst isPodcastmaker = computed(() =>state.generalParameters.podcastmaker);\nconst organisationsAvailable = computed(() =>authStore.authProfile?.organisations ?? []);\nconst siteMap = computed(() =>[\n ...contentSection.value,\n ...props.externLinks,\n ...userLinks.value,\n ...adminSection.value,\n ...footerLinks.value,\n]);\nconst contentSection = computed(() =>[\n {\n title: t(\"Home\"),\n id: \"link-page-home\",\n href: \"/main/pub/home\",\n condition: true,\n },\n {\n title: isPodcastmaker.value? t(\"Live\"): t(\"Radio & Live\"),\n id: \"link-page-lives\",\n href: \"/main/pub/lives\",\n condition: true,\n },\n {\n title: t(\"Podcasts\"),\n id: \"link-page-podcasts\",\n href: \"/main/pub/podcasts\",\n condition: true,\n },\n {\n title: t(\"Emissions\"),\n id: \"link-page-emissions\",\n href: \"/main/pub/emissions\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n id: \"link-page-participants\",\n href: \"/main/pub/participants\",\n condition: true,\n },\n {\n title: t(\"Playlists\"),\n id: \"link-page-playlists\",\n href: \"/main/pub/playlists\",\n condition: true,\n },\n {\n title: t(\"Productors\"),\n id: \"link-page-productors\",\n href: \"/main/pub/productors\",\n condition:!isPodcastmaker.value && (!filterStore.filterOrgaId || generalStore.platformEducation),\n },\n]);\nconst userLinks = computed(() =>[\n {\n title: t(\"Edit my profile\"),\n href: { name: 'my-profile' },\n id: \"link-page-profile\",\n condition: !isPodcastmaker.value && isAuthenticated.value,\n },\n {\n title: t(\"Edit my organisation\"),\n href: \"/main/priv/edit/organisation\",\n id: \"link-page-organisation\",\n condition:\n !isPodcastmaker.value &&\n isAuthenticated.value &&\n (authStore.isRoleOrganisation || 1 < organisationsAvailable.value.length),\n },\n]);\nconst footerLinks = computed(() =>{\n if (isPodcastmaker.value || authStore.isGarRole) {\n return [];\n }\n return [\n {\n title: t(\"Contact\"),\n href: \"/main/pub/contact\",\n id: \"link-page-contact\",\n condition: true,\n },\n {\n title: t(\"Term of use\"),\n href: \"/main/pub/cgu\",\n id: \"link-page-cgu\",\n condition: true,\n },\n {\n title: t(\"Used libraries\"),\n href: \"/main/pub/libraries\",\n id: \"link-page-libraries\",\n condition: true,\n },\n ];\n});\nconst adminSection = computed(() =>{\n if (isPodcastmaker.value) {\n return [];\n }\n return [\n {\n title: t(\"Welcome in the Backoffice\"),\n href: \"/main/priv/backoffice\",\n id: \"link-page-backoffice\",\n condition: isAuthenticated.value,\n links: [\n {\n title: t(\"Upload\"),\n href: \"/main/priv/upload\",\n id: \"link-page-upload\",\n condition: authStore.isRoleContribution,\n },\n {\n title: t(\"Media library\"),\n href: \"/main/priv/media\",\n id: \"link-page-media\",\n condition: isStudioAuth.value,\n },\n {\n title: t(\"Studio\"),\n href: \"/main/priv/records\",\n id: \"link-page-records\",\n condition: isStudioAuth.value,\n },\n {\n title: t(\"Radio planning\"),\n href: \"/main/priv/radio/\",\n id: \"link-page-radio\",\n condition: authStore.isRoleRadio && radioAuthorized.value,\n },\n {\n title: t(\"Edit / Delete episodes\"),\n href: \"/main/pub/podcasts\",\n id: \"link-page-edit-podcast\",\n condition: true,\n },\n {\n title: t(\"Handle my players\"),\n href: \"/main/priv/players\",\n id: \"link-page-players\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Monetization\"),\n href: \"/main/priv/edit/adserv\",\n id: \"link-page-adserv\",\n condition: authStore.isRoleAdvertising && !generalStore.platformEducation,\n },\n {\n title: t(\"Handle FTP\"),\n href: \"/main/priv/edit/ftp\",\n id: \"link-page-ftp\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Topics and rubrics\"),\n href: \"/main/priv/edit/rubrics\",\n id: \"link-page-rubrics\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Handle RSS\"),\n href: \"/main/priv/edit/rss\",\n id: \"link-page-rss\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Handle my participants\"),\n href: \"/main/priv/participants/handle\",\n id: \"link-page-edit-participants\",\n condition: authStore.isRoleEditor,\n },\n {\n title: t(\"Handle comments\"),\n href: \"/main/priv/comments\",\n id: \"link-page-comments\",\n condition: authStore.isRoleComments,\n },\n {\n title: t(\"See my statistics\"),\n href: \"/main/priv/show/stats\",\n id: \"link-page-stats\",\n condition: authStore.isRoleAnalytics,\n },\n {\n title: t(\"Organisations management\"),\n href: \"/main/priv/edit/contract\",\n id: \"link-page-contract\",\n condition: authStore.isRoleAdmin,\n },\n {\n title: t(\"My account\"),\n href: \"/main/priv/account\",\n id: \"link-page-account\",\n condition: true,\n },\n {\n title: t(\"Handle my users\"),\n href: \"/main/priv/user/handle\",\n id: \"link-page-users\",\n condition: authStore.isRoleUsers,\n },\n ],\n },\n ];\n});\n\n\nonMounted(() => {\n studioAuthorized.value = checkOrgaAttribute(\"studio.active\");\n radioAuthorized.value = checkOrgaAttribute(\"radio.active\");\n})\n\n\n//Methods\nfunction checkOrgaAttribute(attribute: string): boolean {\n return \"true\" == authStore.authOrganisation.attributes?.[attribute]?.toString();\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as e, j as t, r as n } from "./classicApi-CGipMqf7.mjs";
|
|
2
2
|
import { t as r } from "./GeneralStore-Darfv4af.mjs";
|
|
3
3
|
import { Fragment as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createTextVNode as u, createVNode as d, defineComponent as f, onMounted as p, openBlock as m, ref as h, renderList as g, resolveComponent as _, resolveDynamicComponent as v, toDisplayString as y, unref as b, withCtx as x } from "vue";
|
|
4
4
|
import { useI18n as S } from "vue-i18n";
|
|
@@ -16,7 +16,7 @@ var C = { class: "page-box map-page" }, w = ["aria-label"], T = { class: "my-1"
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
setup(f) {
|
|
19
|
-
let k = f, A = h(!0), j = h(!0), { t: M } = S(), N =
|
|
19
|
+
let k = f, A = h(!0), j = h(!0), { t: M } = S(), N = e(), P = n(), F = r(), I = a(() => N.authProfile?.userId !== void 0), L = a(() => (N.isRoleLive || N.isRoleContribution) && A.value), R = a(() => t.generalParameters.podcastmaker), z = a(() => N.authProfile?.organisations ?? []), B = a(() => [
|
|
20
20
|
...V.value,
|
|
21
21
|
...k.externLinks,
|
|
22
22
|
...H.value,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileMenu-BSos17v3.mjs","names":["_openBlock","_createElementBlock","_withDirectives","_createElementVNode","_createVNode","_vShow","_createBlock","_withCtx","_createCommentVNode","_sfc_main"],"sources":["../src/components/misc/MobileMenu.vue","../src/components/misc/MobileMenu.vue"],"sourcesContent":["<template>\n <div>\n <button\n v-show=\"show\"\n id=\"mobile-menu-dropdown\"\n class=\"btn-transparent text-white c-hand m-2 h2\"\n :title=\"t('open left Menu')\"\n @click=\"handleMenuClick\"\n >\n <MenuIcon :size=\"34\" />\n </button>\n <ClassicPopover\n v-if=\"firstLoaded\"\n target=\"mobile-menu-dropdown\"\n popover-class=\"popover-z-index\"\n :only-click=\"true\"\n :is-fixed=\"true\"\n :left-pos=\"true\"\n :is-top-layer=\"true\"\n >\n <UserButtonContent \n :isEducation=\"isEducation\" \n :navLabel=\"t('User menu')\" \n :specificRoutes=\"routerLinkArray\"\n :displayUserContent=\"displayUserContent\"/>\n </ClassicPopover>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport MenuIcon from \"vue-material-design-icons/Menu.vue\";\nimport { useRubriquesFilterComputed } from \"../composable/route/useRubriquesFilterComputed\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { defineAsyncComponent, ref, computed } from \"vue\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../composable/useResizePhone\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nconst ClassicPopover = defineAsyncComponent(\n () => import(\"../misc/ClassicPopover.vue\"),\n);\nconst UserButtonContent = defineAsyncComponent(\n () => import(\"./UserButtonContent.vue\"),\n);\n\n//Props \nconst props = defineProps({\n isEducation: { default: false, type: Boolean },\n show: { default: false, type: Boolean },\n notPodcastAndEmission: { default: false, type: Boolean },\n inContentDisplayPage: { default: false, type: Boolean },\n})\n\n//Data \nconst firstLoaded = ref(false);\n\n//Composables\nconst { t } = useI18n();\nconst { rubriqueQueryParam } = useRubriquesFilterComputed();\nconst filterStore = useFilterStore();\nconst authStore = useAuthStore();\nconst { windowWidth } = useResizePhone();\n\n\n//Computed\nconst isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);\nconst displayUserContent = computed(() =>{\n if(isAuthenticatedWithOrga.value){\n return 500>=windowWidth.value;\n }\n return props.show;\n});\nconst routerLinkArray = computed(() =>{\n return [\n { \n title: t(\"Home\"),\n path:{\n name: \"home\",\n query: getQueriesRouter(false),\n },\n class:\"octopus-dropdown-item show-phone-flex\", \n condition: true\n },\n {\n title: t(\"Radio & Live\"),\n path:{\n name: \"lives\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n state.generalParameters.isLiveTab &&\n ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),\n },\n {\n title: t(\"Podcasts\"),\n path:{\n name: \"podcasts\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Emissions\"),\n path:{\n name: \"emissions\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Productors\"),\n path:{\n name: \"productors\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),\n },\n {\n title: t(\"Playlists\"),\n path:{\n name: \"playlists\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n path:{\n name: \"participants\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n ];\n});\n\n\n//Methods\nfunction handleMenuClick() {\n if (firstLoaded.value) {\n return;\n }\n firstLoaded.value = true;\n setTimeout(() => {\n document.getElementById(\"mobile-menu-dropdown\")?.click();\n }, 200);\n}\nfunction getQueriesRouter(onlyProductor:boolean) {\n if (onlyProductor) {\n return { productor: filterStore.filterOrgaId };\n }\n return {\n productor: filterStore.filterOrgaId,\n iabId: filterStore.filterIab?.id,\n rubriquesId: rubriqueQueryParam.value,\n };\n}\n</script>\n","<template>\n <div>\n <button\n v-show=\"show\"\n id=\"mobile-menu-dropdown\"\n class=\"btn-transparent text-white c-hand m-2 h2\"\n :title=\"t('open left Menu')\"\n @click=\"handleMenuClick\"\n >\n <MenuIcon :size=\"34\" />\n </button>\n <ClassicPopover\n v-if=\"firstLoaded\"\n target=\"mobile-menu-dropdown\"\n popover-class=\"popover-z-index\"\n :only-click=\"true\"\n :is-fixed=\"true\"\n :left-pos=\"true\"\n :is-top-layer=\"true\"\n >\n <UserButtonContent \n :isEducation=\"isEducation\" \n :navLabel=\"t('User menu')\" \n :specificRoutes=\"routerLinkArray\"\n :displayUserContent=\"displayUserContent\"/>\n </ClassicPopover>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport MenuIcon from \"vue-material-design-icons/Menu.vue\";\nimport { useRubriquesFilterComputed } from \"../composable/route/useRubriquesFilterComputed\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { defineAsyncComponent, ref, computed } from \"vue\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../composable/useResizePhone\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nconst ClassicPopover = defineAsyncComponent(\n () => import(\"../misc/ClassicPopover.vue\"),\n);\nconst UserButtonContent = defineAsyncComponent(\n () => import(\"./UserButtonContent.vue\"),\n);\n\n//Props \nconst props = defineProps({\n isEducation: { default: false, type: Boolean },\n show: { default: false, type: Boolean },\n notPodcastAndEmission: { default: false, type: Boolean },\n inContentDisplayPage: { default: false, type: Boolean },\n})\n\n//Data \nconst firstLoaded = ref(false);\n\n//Composables\nconst { t } = useI18n();\nconst { rubriqueQueryParam } = useRubriquesFilterComputed();\nconst filterStore = useFilterStore();\nconst authStore = useAuthStore();\nconst { windowWidth } = useResizePhone();\n\n\n//Computed\nconst isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);\nconst displayUserContent = computed(() =>{\n if(isAuthenticatedWithOrga.value){\n return 500>=windowWidth.value;\n }\n return props.show;\n});\nconst routerLinkArray = computed(() =>{\n return [\n { \n title: t(\"Home\"),\n path:{\n name: \"home\",\n query: getQueriesRouter(false),\n },\n class:\"octopus-dropdown-item show-phone-flex\", \n condition: true\n },\n {\n title: t(\"Radio & Live\"),\n path:{\n name: \"lives\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n state.generalParameters.isLiveTab &&\n ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),\n },\n {\n title: t(\"Podcasts\"),\n path:{\n name: \"podcasts\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Emissions\"),\n path:{\n name: \"emissions\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Productors\"),\n path:{\n name: \"productors\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),\n },\n {\n title: t(\"Playlists\"),\n path:{\n name: \"playlists\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n path:{\n name: \"participants\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n ];\n});\n\n\n//Methods\nfunction handleMenuClick() {\n if (firstLoaded.value) {\n return;\n }\n firstLoaded.value = true;\n setTimeout(() => {\n document.getElementById(\"mobile-menu-dropdown\")?.click();\n }, 200);\n}\nfunction getQueriesRouter(onlyProductor:boolean) {\n if (onlyProductor) {\n return { productor: filterStore.filterOrgaId };\n }\n return {\n productor: filterStore.filterOrgaId,\n iabId: filterStore.filterIab?.id,\n rubriquesId: rubriqueQueryParam.value,\n };\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as e, j as t, r as n } from "./classicApi-CGipMqf7.mjs";
|
|
2
2
|
import { t as r } from "./useResizePhone-4hSkK5pa.mjs";
|
|
3
|
-
import { t as i } from "./useRubriquesFilterComputed-
|
|
3
|
+
import { t as i } from "./useRubriquesFilterComputed-D1yqLnK4.mjs";
|
|
4
4
|
import { computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createVNode as u, defineAsyncComponent as d, defineComponent as f, openBlock as p, ref as m, unref as h, vShow as g, withCtx as _, withDirectives as v } from "vue";
|
|
5
5
|
import { useI18n as y } from "vue-i18n";
|
|
6
6
|
import b from "vue-material-design-icons/Menu.vue";
|
|
@@ -26,7 +26,7 @@ var x = ["title"], S = /* @__PURE__ */ f({
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
setup(f) {
|
|
29
|
-
let S = d(() => import("./ClassicPopover-
|
|
29
|
+
let S = d(() => import("./ClassicPopover-BUb-1WMB.mjs").then((e) => e.n)), C = d(() => import("./UserButtonContent--VK68UsY.mjs").then((e) => e.n)), w = f, T = m(!1), { t: E } = y(), { rubriqueQueryParam: D } = i(), O = n(), k = e(), { windowWidth: A } = r(), j = a(() => k.authOrgaId !== void 0), M = a(() => j.value ? 500 >= A.value : w.show), N = a(() => [
|
|
30
30
|
{
|
|
31
31
|
title: E("Home"),
|
|
32
32
|
path: {
|
|
@@ -43,7 +43,7 @@ var x = ["title"], S = /* @__PURE__ */ f({
|
|
|
43
43
|
query: F(!0)
|
|
44
44
|
},
|
|
45
45
|
class: "octopus-dropdown-item",
|
|
46
|
-
condition:
|
|
46
|
+
condition: t.generalParameters.isLiveTab && (O.filterOrgaId && O.filterLive || !O.filterOrgaId)
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
title: E("Podcasts"),
|
|
@@ -70,7 +70,7 @@ var x = ["title"], S = /* @__PURE__ */ f({
|
|
|
70
70
|
query: F(!0)
|
|
71
71
|
},
|
|
72
72
|
class: "octopus-dropdown-item",
|
|
73
|
-
condition: !
|
|
73
|
+
condition: !t.generalParameters.podcastmaker && (!O.filterOrgaId || w.isEducation)
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
76
|
title: E("Playlists"),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileMenu-C6W37oJg.mjs","names":["_openBlock","_createElementBlock","_withDirectives","_createElementVNode","_createVNode","_vShow","_createBlock","_withCtx","_createCommentVNode","_sfc_main"],"sources":["../src/components/misc/MobileMenu.vue","../src/components/misc/MobileMenu.vue"],"sourcesContent":["<template>\n <div>\n <button\n v-show=\"show\"\n id=\"mobile-menu-dropdown\"\n class=\"btn-transparent text-white c-hand m-2 h2\"\n :title=\"t('open left Menu')\"\n @click=\"handleMenuClick\"\n >\n <MenuIcon :size=\"34\" />\n </button>\n <ClassicPopover\n v-if=\"firstLoaded\"\n target=\"mobile-menu-dropdown\"\n popover-class=\"popover-z-index\"\n :only-click=\"true\"\n :is-fixed=\"true\"\n :left-pos=\"true\"\n :is-top-layer=\"true\"\n >\n <UserButtonContent \n :isEducation=\"isEducation\" \n :navLabel=\"t('User menu')\" \n :specificRoutes=\"routerLinkArray\"\n :displayUserContent=\"displayUserContent\"/>\n </ClassicPopover>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport MenuIcon from \"vue-material-design-icons/Menu.vue\";\nimport { useRubriquesFilterComputed } from \"../composable/route/useRubriquesFilterComputed\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { defineAsyncComponent, ref, computed } from \"vue\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../composable/useResizePhone\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nconst ClassicPopover = defineAsyncComponent(\n () => import(\"../misc/ClassicPopover.vue\"),\n);\nconst UserButtonContent = defineAsyncComponent(\n () => import(\"./UserButtonContent.vue\"),\n);\n\n//Props \nconst props = defineProps({\n isEducation: { default: false, type: Boolean },\n show: { default: false, type: Boolean },\n notPodcastAndEmission: { default: false, type: Boolean },\n inContentDisplayPage: { default: false, type: Boolean },\n})\n\n//Data \nconst firstLoaded = ref(false);\n\n//Composables\nconst { t } = useI18n();\nconst { rubriqueQueryParam } = useRubriquesFilterComputed();\nconst filterStore = useFilterStore();\nconst authStore = useAuthStore();\nconst { windowWidth } = useResizePhone();\n\n\n//Computed\nconst isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);\nconst displayUserContent = computed(() =>{\n if(isAuthenticatedWithOrga.value){\n return 500>=windowWidth.value;\n }\n return props.show;\n});\nconst routerLinkArray = computed(() =>{\n return [\n { \n title: t(\"Home\"),\n path:{\n name: \"home\",\n query: getQueriesRouter(false),\n },\n class:\"octopus-dropdown-item show-phone-flex\", \n condition: true\n },\n {\n title: t(\"Radio & Live\"),\n path:{\n name: \"lives\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n state.generalParameters.isLiveTab &&\n ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),\n },\n {\n title: t(\"Podcasts\"),\n path:{\n name: \"podcasts\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Emissions\"),\n path:{\n name: \"emissions\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Productors\"),\n path:{\n name: \"productors\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),\n },\n {\n title: t(\"Playlists\"),\n path:{\n name: \"playlists\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n path:{\n name: \"participants\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n ];\n});\n\n\n//Methods\nfunction handleMenuClick() {\n if (firstLoaded.value) {\n return;\n }\n firstLoaded.value = true;\n setTimeout(() => {\n document.getElementById(\"mobile-menu-dropdown\")?.click();\n }, 200);\n}\nfunction getQueriesRouter(onlyProductor:boolean) {\n if (onlyProductor) {\n return { productor: filterStore.filterOrgaId };\n }\n return {\n productor: filterStore.filterOrgaId,\n iabId: filterStore.filterIab?.id,\n rubriquesId: rubriqueQueryParam.value,\n };\n}\n</script>\n","<template>\n <div>\n <button\n v-show=\"show\"\n id=\"mobile-menu-dropdown\"\n class=\"btn-transparent text-white c-hand m-2 h2\"\n :title=\"t('open left Menu')\"\n @click=\"handleMenuClick\"\n >\n <MenuIcon :size=\"34\" />\n </button>\n <ClassicPopover\n v-if=\"firstLoaded\"\n target=\"mobile-menu-dropdown\"\n popover-class=\"popover-z-index\"\n :only-click=\"true\"\n :is-fixed=\"true\"\n :left-pos=\"true\"\n :is-top-layer=\"true\"\n >\n <UserButtonContent \n :isEducation=\"isEducation\" \n :navLabel=\"t('User menu')\" \n :specificRoutes=\"routerLinkArray\"\n :displayUserContent=\"displayUserContent\"/>\n </ClassicPopover>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport MenuIcon from \"vue-material-design-icons/Menu.vue\";\nimport { useRubriquesFilterComputed } from \"../composable/route/useRubriquesFilterComputed\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { defineAsyncComponent, ref, computed } from \"vue\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../composable/useResizePhone\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nconst ClassicPopover = defineAsyncComponent(\n () => import(\"../misc/ClassicPopover.vue\"),\n);\nconst UserButtonContent = defineAsyncComponent(\n () => import(\"./UserButtonContent.vue\"),\n);\n\n//Props \nconst props = defineProps({\n isEducation: { default: false, type: Boolean },\n show: { default: false, type: Boolean },\n notPodcastAndEmission: { default: false, type: Boolean },\n inContentDisplayPage: { default: false, type: Boolean },\n})\n\n//Data \nconst firstLoaded = ref(false);\n\n//Composables\nconst { t } = useI18n();\nconst { rubriqueQueryParam } = useRubriquesFilterComputed();\nconst filterStore = useFilterStore();\nconst authStore = useAuthStore();\nconst { windowWidth } = useResizePhone();\n\n\n//Computed\nconst isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);\nconst displayUserContent = computed(() =>{\n if(isAuthenticatedWithOrga.value){\n return 500>=windowWidth.value;\n }\n return props.show;\n});\nconst routerLinkArray = computed(() =>{\n return [\n { \n title: t(\"Home\"),\n path:{\n name: \"home\",\n query: getQueriesRouter(false),\n },\n class:\"octopus-dropdown-item show-phone-flex\", \n condition: true\n },\n {\n title: t(\"Radio & Live\"),\n path:{\n name: \"lives\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n state.generalParameters.isLiveTab &&\n ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),\n },\n {\n title: t(\"Podcasts\"),\n path:{\n name: \"podcasts\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Emissions\"),\n path:{\n name: \"emissions\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Productors\"),\n path:{\n name: \"productors\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),\n },\n {\n title: t(\"Playlists\"),\n path:{\n name: \"playlists\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n path:{\n name: \"participants\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n ];\n});\n\n\n//Methods\nfunction handleMenuClick() {\n if (firstLoaded.value) {\n return;\n }\n firstLoaded.value = true;\n setTimeout(() => {\n document.getElementById(\"mobile-menu-dropdown\")?.click();\n }, 200);\n}\nfunction getQueriesRouter(onlyProductor:boolean) {\n if (onlyProductor) {\n return { productor: filterStore.filterOrgaId };\n }\n return {\n productor: filterStore.filterOrgaId,\n iabId: filterStore.filterIab?.id,\n rubriquesId: rubriqueQueryParam.value,\n };\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileMenu-K0rNwrW1.mjs","names":["_openBlock","_createElementBlock","_withDirectives","_createElementVNode","_createVNode","_vShow","_createBlock","_withCtx","_createCommentVNode","_sfc_main"],"sources":["../src/components/misc/MobileMenu.vue","../src/components/misc/MobileMenu.vue"],"sourcesContent":["<template>\n <div>\n <button\n v-show=\"show\"\n id=\"mobile-menu-dropdown\"\n class=\"btn-transparent text-white c-hand m-2 h2\"\n :title=\"t('open left Menu')\"\n @click=\"handleMenuClick\"\n >\n <MenuIcon :size=\"34\" />\n </button>\n <ClassicPopover\n v-if=\"firstLoaded\"\n target=\"mobile-menu-dropdown\"\n popover-class=\"popover-z-index\"\n :only-click=\"true\"\n :is-fixed=\"true\"\n :left-pos=\"true\"\n :is-top-layer=\"true\"\n >\n <UserButtonContent \n :isEducation=\"isEducation\" \n :navLabel=\"t('User menu')\" \n :specificRoutes=\"routerLinkArray\"\n :displayUserContent=\"displayUserContent\"/>\n </ClassicPopover>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport MenuIcon from \"vue-material-design-icons/Menu.vue\";\nimport { useRubriquesFilterComputed } from \"../composable/route/useRubriquesFilterComputed\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { defineAsyncComponent, ref, computed } from \"vue\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../composable/useResizePhone\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nconst ClassicPopover = defineAsyncComponent(\n () => import(\"../misc/ClassicPopover.vue\"),\n);\nconst UserButtonContent = defineAsyncComponent(\n () => import(\"./UserButtonContent.vue\"),\n);\n\n//Props \nconst props = defineProps({\n isEducation: { default: false, type: Boolean },\n show: { default: false, type: Boolean },\n notPodcastAndEmission: { default: false, type: Boolean },\n inContentDisplayPage: { default: false, type: Boolean },\n})\n\n//Data \nconst firstLoaded = ref(false);\n\n//Composables\nconst { t } = useI18n();\nconst { rubriqueQueryParam } = useRubriquesFilterComputed();\nconst filterStore = useFilterStore();\nconst authStore = useAuthStore();\nconst { windowWidth } = useResizePhone();\n\n\n//Computed\nconst isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);\nconst displayUserContent = computed(() =>{\n if(isAuthenticatedWithOrga.value){\n return 500>=windowWidth.value;\n }\n return props.show;\n});\nconst routerLinkArray = computed(() =>{\n return [\n { \n title: t(\"Home\"),\n path:{\n name: \"home\",\n query: getQueriesRouter(false),\n },\n class:\"octopus-dropdown-item show-phone-flex\", \n condition: true\n },\n {\n title: t(\"Radio & Live\"),\n path:{\n name: \"lives\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n state.generalParameters.isLiveTab &&\n ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),\n },\n {\n title: t(\"Podcasts\"),\n path:{\n name: \"podcasts\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Emissions\"),\n path:{\n name: \"emissions\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Productors\"),\n path:{\n name: \"productors\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),\n },\n {\n title: t(\"Playlists\"),\n path:{\n name: \"playlists\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n path:{\n name: \"participants\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n ];\n});\n\n\n//Methods\nfunction handleMenuClick() {\n if (firstLoaded.value) {\n return;\n }\n firstLoaded.value = true;\n setTimeout(() => {\n document.getElementById(\"mobile-menu-dropdown\")?.click();\n }, 200);\n}\nfunction getQueriesRouter(onlyProductor:boolean) {\n if (onlyProductor) {\n return { productor: filterStore.filterOrgaId };\n }\n return {\n productor: filterStore.filterOrgaId,\n iabId: filterStore.filterIab?.id,\n rubriquesId: rubriqueQueryParam.value,\n };\n}\n</script>\n","<template>\n <div>\n <button\n v-show=\"show\"\n id=\"mobile-menu-dropdown\"\n class=\"btn-transparent text-white c-hand m-2 h2\"\n :title=\"t('open left Menu')\"\n @click=\"handleMenuClick\"\n >\n <MenuIcon :size=\"34\" />\n </button>\n <ClassicPopover\n v-if=\"firstLoaded\"\n target=\"mobile-menu-dropdown\"\n popover-class=\"popover-z-index\"\n :only-click=\"true\"\n :is-fixed=\"true\"\n :left-pos=\"true\"\n :is-top-layer=\"true\"\n >\n <UserButtonContent \n :isEducation=\"isEducation\" \n :navLabel=\"t('User menu')\" \n :specificRoutes=\"routerLinkArray\"\n :displayUserContent=\"displayUserContent\"/>\n </ClassicPopover>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport MenuIcon from \"vue-material-design-icons/Menu.vue\";\nimport { useRubriquesFilterComputed } from \"../composable/route/useRubriquesFilterComputed\";\nimport { state } from \"../../stores/ParamSdkStore\";\nimport { defineAsyncComponent, ref, computed } from \"vue\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../composable/useResizePhone\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nconst ClassicPopover = defineAsyncComponent(\n () => import(\"../misc/ClassicPopover.vue\"),\n);\nconst UserButtonContent = defineAsyncComponent(\n () => import(\"./UserButtonContent.vue\"),\n);\n\n//Props \nconst props = defineProps({\n isEducation: { default: false, type: Boolean },\n show: { default: false, type: Boolean },\n notPodcastAndEmission: { default: false, type: Boolean },\n inContentDisplayPage: { default: false, type: Boolean },\n})\n\n//Data \nconst firstLoaded = ref(false);\n\n//Composables\nconst { t } = useI18n();\nconst { rubriqueQueryParam } = useRubriquesFilterComputed();\nconst filterStore = useFilterStore();\nconst authStore = useAuthStore();\nconst { windowWidth } = useResizePhone();\n\n\n//Computed\nconst isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);\nconst displayUserContent = computed(() =>{\n if(isAuthenticatedWithOrga.value){\n return 500>=windowWidth.value;\n }\n return props.show;\n});\nconst routerLinkArray = computed(() =>{\n return [\n { \n title: t(\"Home\"),\n path:{\n name: \"home\",\n query: getQueriesRouter(false),\n },\n class:\"octopus-dropdown-item show-phone-flex\", \n condition: true\n },\n {\n title: t(\"Radio & Live\"),\n path:{\n name: \"lives\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n state.generalParameters.isLiveTab &&\n ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),\n },\n {\n title: t(\"Podcasts\"),\n path:{\n name: \"podcasts\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Emissions\"),\n path:{\n name: \"emissions\",\n query: getQueriesRouter(false),\n },\n class: \"octopus-dropdown-item\",\n condition: !props.notPodcastAndEmission,\n },\n {\n title: t(\"Productors\"),\n path:{\n name: \"productors\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition:\n !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),\n },\n {\n title: t(\"Playlists\"),\n path:{\n name: \"playlists\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n {\n title: t(\"Speakers\"),\n path:{\n name: \"participants\",\n query: getQueriesRouter(true),\n },\n class: \"octopus-dropdown-item\",\n condition: true,\n },\n ];\n});\n\n\n//Methods\nfunction handleMenuClick() {\n if (firstLoaded.value) {\n return;\n }\n firstLoaded.value = true;\n setTimeout(() => {\n document.getElementById(\"mobile-menu-dropdown\")?.click();\n }, 200);\n}\nfunction getQueriesRouter(onlyProductor:boolean) {\n if (onlyProductor) {\n return { productor: filterStore.filterOrgaId };\n }\n return {\n productor: filterStore.filterOrgaId,\n iabId: filterStore.filterIab?.id,\n rubriquesId: rubriqueQueryParam.value,\n };\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewsletterModal-CFGXBtID.mjs","names":["_openBlock","_createBlock","_withCtx","_createVNode","_createElementVNode","_toDisplayString","_sfc_main"],"sources":["../src/components/misc/modal/NewsletterModal.vue","../src/components/misc/modal/NewsletterModal.vue"],"sourcesContent":["<template>\n <ClassicModal\n id-modal=\"newsletter-modal\"\n :title-modal=\"modalTitle\"\n :closable=\"false\"\n @close=\"closePopup\"\n >\n <template #body>\n <ShareNewsletter\n :podcast=\"podcast\"\n :emission=\"emission\"\n :playlist=\"playlist\"\n />\n </template>\n <template #footer>\n <button class=\"btn btn-primary m-1\" @click=\"closePopup\">\n {{ t(\"Close\") }}\n </button>\n </template>\n </ClassicModal>\n</template>\n\n<script setup lang=\"ts\">\nimport ClassicModal from \"../modal/ClassicModal.vue\";\nimport ShareNewsletter from \"../../display/sharing/ShareNewsletter.vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport { computed } from \"vue\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport { Playlist } from \"@/stores/class/general/playlist\";\nimport { useI18n } from \"vue-i18n\";\n\n\n//Props \nconst props = defineProps({\n podcast: { default: undefined, type: Object as () => Podcast },\n emission: { default: undefined, type: Object as () => Emission },\n playlist: { default: undefined, type: Object as () => Playlist },\n})\n\n//Emits\nconst emit = defineEmits([\"close\"]);\n\n//Composables\nconst { t } = useI18n();\n\n//Computed\nconst modalTitle = computed(() => {\n if (props.podcast) {\n return t(\"Share the episode in your newsletter\");\n }\n if (props.emission) {\n return t(\"Share the series in your newsletter\");\n }\n return t(\"Share the playlist in your newsletter\");\n});\n\n//Methods\nfunction closePopup(): void {\n emit(\"close\");\n}\n</script>","<template>\n <ClassicModal\n id-modal=\"newsletter-modal\"\n :title-modal=\"modalTitle\"\n :closable=\"false\"\n @close=\"closePopup\"\n >\n <template #body>\n <ShareNewsletter\n :podcast=\"podcast\"\n :emission=\"emission\"\n :playlist=\"playlist\"\n />\n </template>\n <template #footer>\n <button class=\"btn btn-primary m-1\" @click=\"closePopup\">\n {{ t(\"Close\") }}\n </button>\n </template>\n </ClassicModal>\n</template>\n\n<script setup lang=\"ts\">\nimport ClassicModal from \"../modal/ClassicModal.vue\";\nimport ShareNewsletter from \"../../display/sharing/ShareNewsletter.vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport { computed } from \"vue\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport { Playlist } from \"@/stores/class/general/playlist\";\nimport { useI18n } from \"vue-i18n\";\n\n\n//Props \nconst props = defineProps({\n podcast: { default: undefined, type: Object as () => Podcast },\n emission: { default: undefined, type: Object as () => Emission },\n playlist: { default: undefined, type: Object as () => Playlist },\n})\n\n//Emits\nconst emit = defineEmits([\"close\"]);\n\n//Composables\nconst { t } = useI18n();\n\n//Computed\nconst modalTitle = computed(() => {\n if (props.podcast) {\n return t(\"Share the episode in your newsletter\");\n }\n if (props.emission) {\n return t(\"Share the series in your newsletter\");\n }\n return t(\"Share the playlist in your newsletter\");\n});\n\n//Methods\nfunction closePopup(): void {\n emit(\"close\");\n}\n</script>"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAGb,MAAM,EAAE,MAAM,QAAQ;EAGtB,MAAM,aAAa,eAAe;GAChC,IAAI,MAAM,SACR,OAAO,EAAE,sCAAsC;GAEjD,IAAI,MAAM,UACR,OAAO,EAAE,qCAAqC;GAEhD,OAAO,EAAE,uCAAuC;EAClD,CAAC;EAGD,SAAS,aAAmB;GAC1B,KAAK,OAAO;EACd;;;;;;;;;;;;;;;;;;;;CC1DE,OAAAA,UAAA,GAAAC,YAkBe,OAAA,iBAAA;EAjBb,YAAS;EACR,eAAa,OAAA;EACb,UAAU;EACV,SAAO,OAAA;;EAEG,MAAIC,cAKX,CAJFC,YAIE,OAAA,oBAAA;GAHC,SAAS,OAAA;GACT,UAAU,OAAA;GACV,UAAU,OAAA;;;;;;EAGJ,QAAMD,cAGN,CAFTE,mBAES,UAAA;GAFD,OAAM;GAAuB,SAAO,OAAA;EACvC,GAAAC,gBAAA,OAAA,EAAC,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewsletterModal-CZNwpCK5.mjs","names":["_openBlock","_createBlock","_withCtx","_createVNode","_createElementVNode","_toDisplayString","_sfc_main"],"sources":["../src/components/misc/modal/NewsletterModal.vue","../src/components/misc/modal/NewsletterModal.vue"],"sourcesContent":["<template>\n <ClassicModal\n id-modal=\"newsletter-modal\"\n :title-modal=\"modalTitle\"\n :closable=\"false\"\n @close=\"closePopup\"\n >\n <template #body>\n <ShareNewsletter\n :podcast=\"podcast\"\n :emission=\"emission\"\n :playlist=\"playlist\"\n />\n </template>\n <template #footer>\n <button class=\"btn btn-primary m-1\" @click=\"closePopup\">\n {{ t(\"Close\") }}\n </button>\n </template>\n </ClassicModal>\n</template>\n\n<script setup lang=\"ts\">\nimport ClassicModal from \"../modal/ClassicModal.vue\";\nimport ShareNewsletter from \"../../display/sharing/ShareNewsletter.vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport { computed } from \"vue\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport { Playlist } from \"@/stores/class/general/playlist\";\nimport { useI18n } from \"vue-i18n\";\n\n\n//Props \nconst props = defineProps({\n podcast: { default: undefined, type: Object as () => Podcast },\n emission: { default: undefined, type: Object as () => Emission },\n playlist: { default: undefined, type: Object as () => Playlist },\n})\n\n//Emits\nconst emit = defineEmits([\"close\"]);\n\n//Composables\nconst { t } = useI18n();\n\n//Computed\nconst modalTitle = computed(() => {\n if (props.podcast) {\n return t(\"Share the episode in your newsletter\");\n }\n if (props.emission) {\n return t(\"Share the series in your newsletter\");\n }\n return t(\"Share the playlist in your newsletter\");\n});\n\n//Methods\nfunction closePopup(): void {\n emit(\"close\");\n}\n</script>","<template>\n <ClassicModal\n id-modal=\"newsletter-modal\"\n :title-modal=\"modalTitle\"\n :closable=\"false\"\n @close=\"closePopup\"\n >\n <template #body>\n <ShareNewsletter\n :podcast=\"podcast\"\n :emission=\"emission\"\n :playlist=\"playlist\"\n />\n </template>\n <template #footer>\n <button class=\"btn btn-primary m-1\" @click=\"closePopup\">\n {{ t(\"Close\") }}\n </button>\n </template>\n </ClassicModal>\n</template>\n\n<script setup lang=\"ts\">\nimport ClassicModal from \"../modal/ClassicModal.vue\";\nimport ShareNewsletter from \"../../display/sharing/ShareNewsletter.vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport { computed } from \"vue\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport { Playlist } from \"@/stores/class/general/playlist\";\nimport { useI18n } from \"vue-i18n\";\n\n\n//Props \nconst props = defineProps({\n podcast: { default: undefined, type: Object as () => Podcast },\n emission: { default: undefined, type: Object as () => Emission },\n playlist: { default: undefined, type: Object as () => Playlist },\n})\n\n//Emits\nconst emit = defineEmits([\"close\"]);\n\n//Composables\nconst { t } = useI18n();\n\n//Computed\nconst modalTitle = computed(() => {\n if (props.podcast) {\n return t(\"Share the episode in your newsletter\");\n }\n if (props.emission) {\n return t(\"Share the series in your newsletter\");\n }\n return t(\"Share the playlist in your newsletter\");\n});\n\n//Methods\nfunction closePopup(): void {\n emit(\"close\");\n}\n</script>"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAGb,MAAM,EAAE,MAAM,QAAQ;EAGtB,MAAM,aAAa,eAAe;GAChC,IAAI,MAAM,SACR,OAAO,EAAE,sCAAsC;GAEjD,IAAI,MAAM,UACR,OAAO,EAAE,qCAAqC;GAEhD,OAAO,EAAE,uCAAuC;EAClD,CAAC;EAGD,SAAS,aAAmB;GAC1B,KAAK,OAAO;EACd;;;;;;;;;;;;;;;;;;;;CC1DE,OAAAA,UAAA,GAAAC,YAkBe,OAAA,iBAAA;EAjBb,YAAS;EACR,eAAa,OAAA;EACb,UAAU;EACV,SAAO,OAAA;;EAEG,MAAIC,cAKX,CAJFC,YAIE,OAAA,oBAAA;GAHC,SAAS,OAAA;GACT,UAAU,OAAA;GACV,UAAU,OAAA;;;;;;EAGJ,QAAMD,cAGN,CAFTE,mBAES,UAAA;GAFD,OAAM;GAAuB,SAAO,OAAA;EACvC,GAAAC,gBAAA,OAAA,EAAC,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "./ClassicModal-Dl2IdzXZ.mjs";
|
|
2
|
-
import { t } from "./ShareNewsletter-
|
|
2
|
+
import { t } from "./ShareNewsletter-BWIAt47D.mjs";
|
|
3
3
|
import { computed as n, createBlock as r, createElementVNode as i, createVNode as a, defineComponent as o, openBlock as s, toDisplayString as c, unref as l, withCtx as u } from "vue";
|
|
4
4
|
import { useI18n as d } from "vue-i18n";
|
|
5
5
|
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OctopusMultiselect-CFUGyzeM.mjs","names":["_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_createElementVNode","_withDirectives","_vShow","_withKeys","_vModelText","_withModifiers","_createVNode","_createBlock","_Teleport","_normalizeStyle","_Fragment","_renderList","_sfc_main"],"sources":["../src/components/composable/form/useOctopusDropdown.ts","../src/components/form/OctopusMultiselect.vue","../src/components/form/OctopusMultiselect.vue"],"sourcesContent":["import { computed, getCurrentInstance, nextTick, ref } from 'vue';\nimport { type MaybeElementRef, onClickOutside } from '@vueuse/core';\nimport { useI18n } from 'vue-i18n';\n\nexport interface OctopusDropdownProps<T> {\n options: T[];\n optionLabel?: keyof T & string;\n optionKey?: keyof T;\n isDisabled?: boolean;\n placeholder?: string;\n}\n\nexport function useOctopusDropdown<T>(\n props: OctopusDropdownProps<T>,\n emitSearch: (query: string) => void,\n idPrefix: string = 'octopus-dropdown',\n // Extra elements to exclude from the click-outside check.\n // Needed when the dropdown is teleported outside containerRef (e.g. to body):\n // without this, clicking inside the teleported dropdown triggers closeDropdown\n // because it is no longer a DOM descendant of containerRef.\n ignore?: MaybeElementRef[]\n) {\n const { t } = useI18n();\n const instance = getCurrentInstance();\n\n const searchQuery = ref('');\n const isOpen = ref(false);\n const isHovered = ref(false);\n const containerRef = ref<HTMLElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n // Where the dropdown/options list (teleported out of normal flow) should land. Defaults\n // to the app root, but when this component is used inside a ClassicPopover, teleporting\n // there instead keeps the dropdown a real DOM descendant of it — otherwise both end up as\n // siblings under the same teleport target, and ClassicPopover's outside-click/blur checks\n // (which rely on DOM containment) see clicks inside the dropdown as \"outside\" and close it.\n const teleportTarget = ref<string | HTMLElement>('.octopus-app');\n\n const computedId = computed(() => `${idPrefix}-${instance?.uid}`);\n\n // vnode.props contains the raw parent-provided props before defineEmits strips them\n // from attrs, so onSearch is present whenever the parent writes @search=\"...\".\n const hasSearchListener = computed(() => !!instance?.vnode.props?.onSearch);\n\n const displayedOptions = computed((): T[] => {\n if (hasSearchListener.value) {\n return props.options;\n }\n const query = searchQuery.value.toLowerCase();\n if (!query) {\n return props.options;\n }\n return props.options.filter((option) =>\n getLabel(option).toLowerCase().includes(query)\n );\n });\n\n const inputPlaceholder = computed(() => props.placeholder ?? t('Search'));\n\n function getLabel(option: T): string {\n if (props.optionLabel) {\n return option[props.optionLabel] as string;\n }\n return option as unknown as string;\n }\n\n function openDropdown(): void {\n if (props.isDisabled) {\n return;\n }\n teleportTarget.value = containerRef.value?.closest<HTMLElement>('.octopus-popover') ?? '.octopus-app';\n isOpen.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n });\n }\n\n function closeDropdown(): void {\n isOpen.value = false;\n searchQuery.value = '';\n }\n\n function toggleDropdown(): void {\n if (isOpen.value) {\n closeDropdown();\n } else {\n openDropdown();\n }\n }\n\n function handleInput(): void {\n if (hasSearchListener.value) {\n emitSearch(searchQuery.value);\n }\n }\n\n onClickOutside(containerRef, closeDropdown, ignore?.length ? { ignore } : undefined);\n\n return {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n hasSearchListener,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n closeDropdown,\n toggleDropdown,\n handleInput,\n };\n}\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(', ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n //const customOption = value as unknown as T;\n emit('add-custom', value);\n //if (!isSelected(customOption)) {\n // emit('update:selected', [...(props.selected ?? []), customOption]);\n //}\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(', ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n //const customOption = value as unknown as T;\n emit('add-custom', value);\n //if (!isSelected(customOption)) {\n // emit('update:selected', [...(props.selected ?? []), customOption]);\n //}\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OctopusMultiselect-Cn1lqbQo.mjs","names":["_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_createElementVNode","_withDirectives","_vShow","_withKeys","_vModelText","_withModifiers","_createVNode","_createBlock","_Teleport","_normalizeStyle","_Fragment","_renderList","_sfc_main"],"sources":["../src/components/composable/form/useOctopusDropdown.ts","../src/components/form/OctopusMultiselect.vue","../src/components/form/OctopusMultiselect.vue"],"sourcesContent":["import { computed, getCurrentInstance, nextTick, ref } from 'vue';\nimport { type MaybeElementRef, onClickOutside } from '@vueuse/core';\nimport { useI18n } from 'vue-i18n';\n\nexport interface OctopusDropdownProps<T> {\n options: T[];\n optionLabel?: keyof T & string;\n optionKey?: keyof T;\n isDisabled?: boolean;\n placeholder?: string;\n}\n\nexport function useOctopusDropdown<T>(\n props: OctopusDropdownProps<T>,\n emitSearch: (query: string) => void,\n idPrefix: string = 'octopus-dropdown',\n // Extra elements to exclude from the click-outside check.\n // Needed when the dropdown is teleported outside containerRef (e.g. to body):\n // without this, clicking inside the teleported dropdown triggers closeDropdown\n // because it is no longer a DOM descendant of containerRef.\n ignore?: MaybeElementRef[]\n) {\n const { t } = useI18n();\n const instance = getCurrentInstance();\n\n const searchQuery = ref('');\n const isOpen = ref(false);\n const isHovered = ref(false);\n const containerRef = ref<HTMLElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n // Where the dropdown/options list (teleported out of normal flow) should land. Defaults\n // to the app root, but when this component is used inside a ClassicPopover, teleporting\n // there instead keeps the dropdown a real DOM descendant of it — otherwise both end up as\n // siblings under the same teleport target, and ClassicPopover's outside-click/blur checks\n // (which rely on DOM containment) see clicks inside the dropdown as \"outside\" and close it.\n const teleportTarget = ref<string | HTMLElement>('.octopus-app');\n\n const computedId = computed(() => `${idPrefix}-${instance?.uid}`);\n\n // vnode.props contains the raw parent-provided props before defineEmits strips them\n // from attrs, so onSearch is present whenever the parent writes @search=\"...\".\n const hasSearchListener = computed(() => !!instance?.vnode.props?.onSearch);\n\n const displayedOptions = computed((): T[] => {\n if (hasSearchListener.value) {\n return props.options;\n }\n const query = searchQuery.value.toLowerCase();\n if (!query) {\n return props.options;\n }\n return props.options.filter((option) =>\n getLabel(option).toLowerCase().includes(query)\n );\n });\n\n const inputPlaceholder = computed(() => props.placeholder ?? t('Search'));\n\n function getLabel(option: T): string {\n if (props.optionLabel) {\n return option[props.optionLabel] as string;\n }\n return option as unknown as string;\n }\n\n function openDropdown(): void {\n if (props.isDisabled) {\n return;\n }\n teleportTarget.value = containerRef.value?.closest<HTMLElement>('.octopus-popover') ?? '.octopus-app';\n isOpen.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n });\n }\n\n function closeDropdown(): void {\n isOpen.value = false;\n searchQuery.value = '';\n }\n\n function toggleDropdown(): void {\n if (isOpen.value) {\n closeDropdown();\n } else {\n openDropdown();\n }\n }\n\n function handleInput(): void {\n if (hasSearchListener.value) {\n emitSearch(searchQuery.value);\n }\n }\n\n onClickOutside(containerRef, closeDropdown, ignore?.length ? { ignore } : undefined);\n\n return {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n hasSearchListener,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n closeDropdown,\n toggleDropdown,\n handleInput,\n };\n}\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n /** Emitted when the user enters a custom value */\n (e: 'add-custom', value: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(',?? ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n emit('add-custom', value);\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n /** Emitted when the user enters a custom value */\n (e: 'add-custom', value: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(',?? ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n emit('add-custom', value);\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n"],"mappings":"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"}
|