analytica-frontend-lib 1.6.19 → 1.6.21
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/ActivitiesHistory/index.js +9 -9
- package/dist/ActivitiesHistory/index.mjs +8 -8
- package/dist/ActivityCardQuestionBanks/index.js +9 -9
- package/dist/ActivityCardQuestionBanks/index.mjs +8 -8
- package/dist/ActivityCardQuestionPreview/index.js +9 -9
- package/dist/ActivityCardQuestionPreview/index.mjs +8 -8
- package/dist/ActivityCreate/ActivityCreateContent/index.js +9 -9
- package/dist/ActivityCreate/ActivityCreateContent/index.mjs +8 -8
- package/dist/ActivityCreate/index.js +9 -9
- package/dist/ActivityCreate/index.mjs +8 -8
- package/dist/ActivityDetails/index.js +9 -9
- package/dist/ActivityDetails/index.mjs +8 -8
- package/dist/ActivityFilters/index.js +9 -9
- package/dist/ActivityFilters/index.mjs +8 -8
- package/dist/ActivityPageLayout/index.js +9 -9
- package/dist/ActivityPageLayout/index.mjs +8 -8
- package/dist/ActivityPreview/index.js +9 -9
- package/dist/ActivityPreview/index.mjs +8 -8
- package/dist/AlertManager/index.js +9 -9
- package/dist/AlertManager/index.mjs +8 -8
- package/dist/AppHeader/index.d.ts.map +1 -1
- package/dist/AppHeader/index.js +5 -5
- package/dist/AppHeader/index.mjs +4 -4
- package/dist/CalendarCard/index.js +3 -3
- package/dist/CalendarCard/index.mjs +2 -2
- package/dist/CheckBoxGroup/index.js +9 -9
- package/dist/CheckBoxGroup/index.mjs +8 -8
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +2 -2
- package/dist/DropdownMenu/index.mjs +1 -1
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +9 -9
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +8 -8
- package/dist/ExamPageLayout/index.js +9 -9
- package/dist/ExamPageLayout/index.mjs +8 -8
- package/dist/Forum/index.js +3 -3
- package/dist/Forum/index.mjs +2 -2
- package/dist/NotificationCard/index.js +3 -3
- package/dist/NotificationCard/index.mjs +2 -2
- package/dist/PrintableUsersTable/index.js +9 -9
- package/dist/PrintableUsersTable/index.mjs +8 -8
- package/dist/QuestionsPerformanceCard/index.js +9 -9
- package/dist/QuestionsPerformanceCard/index.mjs +8 -8
- package/dist/RecommendedLessonCreate/index.js +9 -9
- package/dist/RecommendedLessonCreate/index.mjs +8 -8
- package/dist/RecommendedLessonsHistory/index.js +9 -9
- package/dist/RecommendedLessonsHistory/index.mjs +8 -8
- package/dist/Search/index.js +3 -3
- package/dist/Search/index.mjs +2 -2
- package/dist/SendActivityModal/SendActivityModal.js +9 -9
- package/dist/SendActivityModal/SendActivityModal.mjs +8 -8
- package/dist/SendActivityModal/index.js +9 -9
- package/dist/SendActivityModal/index.mjs +8 -8
- package/dist/SendLessonModal/index.js +9 -9
- package/dist/SendLessonModal/index.mjs +8 -8
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +9 -9
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +8 -8
- package/dist/SimulatedStudentSimulationsModal/index.js +15 -15
- package/dist/SimulatedStudentSimulationsModal/index.mjs +1 -1
- package/dist/SimulationsPage/index.js +9 -9
- package/dist/SimulationsPage/index.mjs +8 -8
- package/dist/TableProvider/index.js +9 -9
- package/dist/TableProvider/index.mjs +8 -8
- package/dist/UnifiedDraftModelPage/index.js +9 -9
- package/dist/UnifiedDraftModelPage/index.mjs +8 -8
- package/dist/UnifiedHistoryPage/index.js +9 -9
- package/dist/UnifiedHistoryPage/index.mjs +8 -8
- package/dist/{chunk-OMNDC4BZ.js → chunk-7XWWI5EY.js} +25 -28
- package/dist/chunk-7XWWI5EY.js.map +1 -0
- package/dist/{chunk-6LJZGFSL.mjs → chunk-CFTQ24UT.mjs} +2 -2
- package/dist/{chunk-LLUJLIDC.mjs → chunk-CKSOC6YI.mjs} +5 -4
- package/dist/{chunk-LLUJLIDC.mjs.map → chunk-CKSOC6YI.mjs.map} +1 -1
- package/dist/{chunk-DXSNLRL4.mjs → chunk-CWGYVJTQ.mjs} +25 -28
- package/dist/chunk-CWGYVJTQ.mjs.map +1 -0
- package/dist/{chunk-OYEDIVC2.js → chunk-CWTCN6F7.js} +5 -5
- package/dist/{chunk-OYEDIVC2.js.map → chunk-CWTCN6F7.js.map} +1 -1
- package/dist/{chunk-QKRUOG3N.mjs → chunk-E4MLDRLD.mjs} +2 -2
- package/dist/{chunk-GP47TASX.mjs → chunk-ENCFJBY5.mjs} +2 -2
- package/dist/{chunk-FBA6QDJM.js → chunk-IUH7JW7H.js} +16 -15
- package/dist/chunk-IUH7JW7H.js.map +1 -0
- package/dist/{chunk-UEUGH2QZ.js → chunk-KYGFYAU7.js} +7 -7
- package/dist/{chunk-UEUGH2QZ.js.map → chunk-KYGFYAU7.js.map} +1 -1
- package/dist/{chunk-T3V5QTJZ.mjs → chunk-MUVQIQAG.mjs} +2 -2
- package/dist/{chunk-7HW4PZLV.js → chunk-MYQ2LJWO.js} +6 -6
- package/dist/{chunk-7HW4PZLV.js.map → chunk-MYQ2LJWO.js.map} +1 -1
- package/dist/{chunk-K2ILHIT6.mjs → chunk-NAOHJW6H.mjs} +4 -4
- package/dist/{chunk-S4CNM57F.js → chunk-QHXJB5QM.js} +10 -10
- package/dist/{chunk-S4CNM57F.js.map → chunk-QHXJB5QM.js.map} +1 -1
- package/dist/{chunk-IXZT6MKP.js → chunk-QN32O3J3.js} +19 -19
- package/dist/{chunk-IXZT6MKP.js.map → chunk-QN32O3J3.js.map} +1 -1
- package/dist/{chunk-PTFHHHQG.mjs → chunk-X2YQT5BS.mjs} +22 -7
- package/dist/chunk-X2YQT5BS.mjs.map +1 -0
- package/dist/{chunk-M5BZW7BG.js → chunk-Y64LT6BL.js} +22 -7
- package/dist/chunk-Y64LT6BL.js.map +1 -0
- package/dist/components/SimulationsPage/SimulationsDetailModal.d.ts.map +1 -1
- package/dist/hooks/useAppContent/index.js +9 -9
- package/dist/hooks/useAppContent/index.mjs +8 -8
- package/dist/index.js +9 -9
- package/dist/index.mjs +8 -8
- package/dist/utils/questionDuration.d.ts +14 -12
- package/dist/utils/questionDuration.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-DXSNLRL4.mjs.map +0 -1
- package/dist/chunk-FBA6QDJM.js.map +0 -1
- package/dist/chunk-M5BZW7BG.js.map +0 -1
- package/dist/chunk-OMNDC4BZ.js.map +0 -1
- package/dist/chunk-PTFHHHQG.mjs.map +0 -1
- /package/dist/{chunk-6LJZGFSL.mjs.map → chunk-CFTQ24UT.mjs.map} +0 -0
- /package/dist/{chunk-QKRUOG3N.mjs.map → chunk-E4MLDRLD.mjs.map} +0 -0
- /package/dist/{chunk-GP47TASX.mjs.map → chunk-ENCFJBY5.mjs.map} +0 -0
- /package/dist/{chunk-T3V5QTJZ.mjs.map → chunk-MUVQIQAG.mjs.map} +0 -0
- /package/dist/{chunk-K2ILHIT6.mjs.map → chunk-NAOHJW6H.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-S4CNM57F.js","../src/components/NotificationCard/NotificationCard.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;AC/BA,qFAAsC;AACtC,2DAAyB;AACzB,8BAA2D;ADiC3D;AACA;AACA,IAAI,qBAAqB,EAAE,wnNAAwnN;AACnpN;AACA;ACwPI,+CAAA;AAnQJ,IAAM,4BAAA,EAA8B,GAAA;AAyPpC,IAAM,kBAAA,EAAoB,CAAC;AAAA,EACzB,eAAA;AAAA,EACA,gBAAA,EAAkB,sCAAA;AAAA,EAClB,sBAAA,EAAwB;AAC1B,CAAA,EAAA,GAIM;AACJ,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,4DAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,gBAAA,mBACC,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,kBAAA,6BAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,eAAA;AAAA,QACL,GAAA,EAAI,wBAAA;AAAA,QACJ,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,SAAA,EAAU;AAAA,MAAA;AAAA,IACZ,EAAA,CACF,CAAA;AAAA,oBAIF,6BAAA,IAAC,EAAA,EAAG,SAAA,EAAU,gEAAA,EACX,QAAA,EAAA,gBAAA,CACH,CAAA;AAAA,oBAGA,6BAAA,GAAC,EAAA,EAAE,SAAA,EAAU,4EAAA,EACV,QAAA,EAAA,sBAAA,CACH;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;AAKA,IAAM,mBAAA,EAAqB,CAAC;AAAA,EAC1B,WAAA;AAAA,EACA,QAAA,EAAU;AACZ,CAAA,EAAA,GAGM;AACJ,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA,IAAY,QAAA,kBACX,6BAAA,6BAAC,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,qBAAA,CAExD,EAAA,kBAEA,6BAAA,IAAC,EAAA,EAAG,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,qBAAA,CAAY,CAAA;AAAA,IAEjE,YAAA,EAAc,EAAA,mBACb,6BAAA;AAAA,MAAC,8BAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,MAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAK,OAAA;AAAA,QACL,QAAA,kBAAU,6BAAA,cAAC,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,QAAA,CAAQ,CAAA;AAAA,QACnE,SAAA,EAAU,UAAA;AAAA,QAET,QAAA,EAAA,YAAA,IAAgB,EAAA,EAAI,gBAAA,EAAe,CAAA,EAAA;AAAc,MAAA;AACpD,IAAA;AAEJ,EAAA;AAEJ;AAoBE;AAE0C,EAAA;AACN,oBAAA;AACpC,EAAA;AACF;AAciC;AAC/B,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAQA;AAAC,EAAA;AAAA,EAAA;AACC,IAAA;AACA,IAAA;AAC8B,IAAA;AACtB,IAAA;AAC8B,IAAA;AACa,IAAA;AACX,IAAA;AAC5B,IAAA;AACgC,IAAA;AACvC,IAAA;AAAA,EAAA;AACP;AAM8B;AAC9B,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAWI;AACwC,EAAA;AACzB,IAAA;AACC,IAAA;AACL,IAAA;AACE,MAAA;AACf,IAAA;AACF,EAAA;AAEwC,EAAA;AACrB,IAAA;AACC,IAAA;AACT,IAAA;AACX,EAAA;AAE0C,EAAA;AACtB,IAAA;AACF,IAAA;AACH,MAAA;AACb,IAAA;AACF,EAAA;AAGE,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACT,QAAA;AACA,QAAA;AACA,QAAA;AACF,MAAA;AAGA,MAAA;AAAe,wBAAA;AAGN,UAAA;AAIO,0BAAA;AAMZ,0BAAA;AAAA,4BAAA;AAAC,cAAA;AAAA,cAAA;AACW,gBAAA;AACC,gBAAA;AAEV,gBAAA;AAAgC,cAAA;AACnC,YAAA;AACqB,4BAAA;AAEjB,cAAA;AAAC,gBAAA;AAAA,gBAAA;AACU,kBAAA;AACC,kBAAA;AACX,kBAAA;AAAA,gBAAA;AAED,cAAA;AAEgB,8BAAA;AAGpB,YAAA;AACF,UAAA;AACF,QAAA;AAGa,wBAAA;AAGE,wBAAA;AACG,0BAAA;AAGd,UAAA;AAAC,YAAA;AAAA,YAAA;AACM,cAAA;AACI,cAAA;AACC,cAAA;AAET,cAAA;AAAA,YAAA;AACH,UAAA;AAEJ,QAAA;AAAA,MAAA;AAAA,IAAA;AACF,EAAA;AAEJ;AAK0B;AACA,EAAA;AACd,EAAA;AACF,EAAA;AACR,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAmBI;AAE4B,EAAA;AAMO,EAAA;AACN,IAAA;AACS,MAAA;AACjC,IAAA;AAEsB,MAAA;AACjB,QAAA;AACR,QAAA;AACD,MAAA;AACH,IAAA;AACF,EAAA;AAKK,EAAA;AACkD,IAAA;AACpC,IAAA;AACnB,EAAA;AAEW,EAAA;AAEQ,IAAA;AACA,sBAAA;AAEX,MAAA;AAAC,QAAA;AAAA,QAAA;AACM,UAAA;AACI,UAAA;AACC,UAAA;AACX,UAAA;AAAA,QAAA;AAED,MAAA;AAEJ,IAAA;AAEJ,EAAA;AAIkD,EAAA;AAE/B,IAAA;AAGT,MAAA;AAAC,QAAA;AAAA,QAAA;AAEW,UAAA;AAAA,QAAA;AADL,QAAA;AAEP,MAAA;AAGN,IAAA;AAEJ,EAAA;AAGkD,EAAA;AAEzC,IAAA;AAIT,EAAA;AAGqB,EAAA;AAEf,IAAA;AAEiB,sBAAA;AAO4B,MAAA;AAGzB,QAAA;AAMZ,QAAA;AACsB,QAAA;AAEP,UAAA;AAGjB,QAAA;AAIE,UAAA;AAAe,YAAA;AACb,YAAA;AACuB,+BAAA;AACF,+BAAA;AACZ,cAAA;AACA,cAAA;AACT,YAAA;AACF,UAAA;AACJ,QAAA;AAGI,QAAA;AACsB,QAAA;AAEgB,UAAA;AACnC,QAAA;AAES,UAAA;AACe,6BAAA;AAC7B,UAAA;AACF,QAAA;AAGE,QAAA;AAAC,UAAA;AAAA,UAAA;AAEqB,YAAA;AACE,YAAA;AAGF,YAAA;AAEC,YAAA;AACkB,YAAA;AACK,YAAA;AAChC,YAAA;AACZ,YAAA;AAAA,UAAA;AAXkB,UAAA;AAYpB,QAAA;AAEH,MAAA;AAEJ,IAAA;AAGD,oBAAA;AAAC,MAAA;AAAA,MAAA;AACuC,QAAA;AACN,QAAA;AAED,QAAA;AAE/B,QAAA;AACA,QAAA;AAAA,MAAA;AACF,IAAA;AACF,EAAA;AAEJ;AAQ4B;AAC1B,EAAA;AACA,EAAA;AACc,EAAA;AACU,EAAA;AACd,EAAA;AACF,EAAA;AACR,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACoB,EAAA;AACS;AACE,EAAA;AACqB,EAAA;AACpB,EAAA;AAMA,EAAA;AACX,IAAA;AACI,oBAAA;AACzB,EAAA;AAGiC,EAAA;AACd,oBAAA;AACnB,EAAA;AAG4C,EAAA;AAEpB,IAAA;AAGH,oBAAA;AAGiC,IAAA;AACjC,sBAAA;AACnB,IAAA;AACF,EAAA;AAGgB,EAAA;AACA,IAAA;AACW,sBAAA;AACzB,IAAA;AACiC,EAAA;AAKmB,EAAA;AACtC,EAAA;AACgC,IAAA;AAC5C,MAAA;AACF,IAAA;AACqC,IAAA;AACd,MAAA;AACH,IAAA;AACiB,IAAA;AACC,EAAA;AAGtC,EAAA;AAAC,IAAA;AAAA,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AAAA,IAAA;AACF,EAAA;AAGY,EAAA;AAGR,IAAA;AAAA,sBAAA;AAAC,QAAA;AAAA,QAAA;AACS,UAAA;AACC,UAAA;AAGL,UAAA;AAAA,4BAAA;AAAC,cAAA;AAAA,cAAA;AACS,gBAAA;AAC0B,gBAAA;AACxB,gBAAA;AAAA,cAAA;AACZ,YAAA;AAEG,YAAA;AACE,cAAA;AAAY,cAAA;AACf,YAAA;AAEJ,UAAA;AAEF,UAAA;AAAA,QAAA;AACF,MAAA;AACA,sBAAA;AAAC,QAAA;AAAA,QAAA;AACS,UAAA;AAC2B,UAAA;AAC7B,UAAA;AACD,UAAA;AACY,UAAA;AACF,UAAA;AAEV,UAAA;AACY,4BAAA;AACO,8BAAA;AAElB,cAAA;AAAC,gBAAA;AAAA,gBAAA;AACM,kBAAA;AACI,kBAAA;AACC,kBAAA;AACX,kBAAA;AAAA,gBAAA;AAED,cAAA;AAEJ,YAAA;AACe,4BAAA;AACZ,cAAA;AAAA,cAAA;AACC,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AAI6B,gBAAA;AACP,kBAAA;AACI,kCAAA;AAC1B,gBAAA;AAC4B,gBAAA;AACN,kBAAA;AACO,kBAAA;AACjB,oBAAA;AACR,oBAAA;AACD,kBAAA;AACH,gBAAA;AACA,gBAAA;AACa,gBAAA;AACb,gBAAA;AAAA,cAAA;AAEJ,YAAA;AACF,UAAA;AAAA,QAAA;AACF,MAAA;AAEA,sBAAA;AAAC,QAAA;AAAA,QAAA;AACuC,UAAA;AACN,UAAA;AAED,UAAA;AAE/B,UAAA;AACA,UAAA;AAAA,QAAA;AACF,MAAA;AACF,IAAA;AAEJ,EAAA;AAII,EAAA;AAAA,oBAAA;AAAC,MAAA;AAAA,MAAA;AAEa,QAAA;AAGZ,QAAA;AAAqB,0BAAA;AAClB,YAAA;AAAA,YAAA;AACS,cAAA;AACC,cAAA;AAGL,cAAA;AAAA,gCAAA;AAAC,kBAAA;AAAA,kBAAA;AACS,oBAAA;AAC0B,oBAAA;AACD,oBAAA;AAAmB,kBAAA;AACtD,gBAAA;AAEG,gBAAA;AACE,kBAAA;AAAY,kBAAA;AACf,gBAAA;AAEJ,cAAA;AAEF,cAAA;AAAA,YAAA;AAEJ,UAAA;AACA,0BAAA;AAAC,YAAA;AAAA,YAAA;AACW,cAAA;AACL,cAAA;AACC,cAAA;AAED,cAAA;AACY,gCAAA;AACb,kCAAA;AAAC,oBAAA;AAAA,oBAAA;AACC,sBAAA;AACQ,sBAAA;AAAA,oBAAA;AACV,kBAAA;AAEE,kBAAA;AAAC,oBAAA;AAAA,oBAAA;AACM,sBAAA;AACI,sBAAA;AACC,sBAAA;AACX,sBAAA;AAAA,oBAAA;AAED,kBAAA;AAEJ,gBAAA;AACe,gCAAA;AACZ,kBAAA;AAAA,kBAAA;AACC,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AAC4B,oBAAA;AACC,sBAAA;AACjB,wBAAA;AACR,wBAAA;AACD,sBAAA;AACH,oBAAA;AACA,oBAAA;AACa,oBAAA;AACb,oBAAA;AAAA,kBAAA;AAEJ,gBAAA;AACF,cAAA;AAAA,YAAA;AACF,UAAA;AAAA,QAAA;AAAA,MAAA;AACF,IAAA;AAGA,oBAAA;AAAC,MAAA;AAAA,MAAA;AACuC,QAAA;AACN,QAAA;AAED,QAAA;AAE/B,QAAA;AACA,QAAA;AAAA,MAAA;AACF,IAAA;AACF,EAAA;AAEJ;AAQ2D;AAErC,EAAA;AACb,IAAA;AAED,MAAA;AAAC,QAAA;AAAA,QAAA;AACc,UAAA;AACE,UAAA;AACH,UAAA;AACE,UAAA;AACM,UAAA;AACJ,UAAA;AACE,UAAA;AACC,UAAA;AACF,UAAA;AAAA,QAAA;AACnB,MAAA;AAGC,IAAA;AAED,MAAA;AAAC,QAAA;AAAA,QAAA;AAES,UAAA;AAGA,YAAA;AACS,cAAA;AACc,cAAA;AACvB,YAAA;AAED,UAAA;AAEQ,UAAA;AACF,UAAA;AACE,UAAA;AACS,UAAA;AACJ,UAAA;AACE,UAAA;AACW,UAAA;AACX,UAAA;AACH,UAAA;AACF,UAAA;AACM,UAAA;AAAA,QAAA;AACzB,MAAA;AAGC,IAAA;AACyB,MAAA;AAE9B,IAAA;AAGmB,MAAA;AAMrB,EAAA;AACF;AAM8E;AAE5C,EAAA;AACc,IAAA;AACpC,MAAA;AACH,MAAA;AACL,IAAA;AAC+B,IAAA;AACjC,EAAA;AAKQ,EAAA;AAKJ,IAAA;AAAC,MAAA;AAAA,MAAA;AAES,QAAA;AAGA,UAAA;AACS,YAAA;AACc,YAAA;AACvB,UAAA;AAED,QAAA;AAEQ,QAAA;AACF,QAAA;AACE,QAAA;AACS,QAAA;AACJ,QAAA;AACE,QAAA;AACW,QAAA;AACX,QAAA;AACH,QAAA;AACF,QAAA;AACM,QAAA;AAAA,MAAA;AACzB,IAAA;AAEJ,EAAA;AAKoB,EAAA;AAM8B,IAAA;AACxC,MAAA;AACO,MAAA;AACE,MAAA;AACH,MAAA;AACE,MAAA;AACM,MAAA;AACJ,MAAA;AACE,MAAA;AACC,MAAA;AACF,MAAA;AACM,MAAA;AACA,MAAA;AACM,MAAA;AAC/B,IAAA;AAEE,IAAA;AAAC,MAAA;AAAA,MAAA;AACoB,QAAA;AACE,QAAA;AACH,QAAA;AACE,QAAA;AACM,QAAA;AACJ,QAAA;AACE,QAAA;AACC,QAAA;AACF,QAAA;AAAA,MAAA;AACzB,IAAA;AAEJ,EAAA;AAIiB,EAAA;AAInB;AAEe;ADxe0C;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-S4CNM57F.js","sourcesContent":[null,"import { DotsThreeVerticalIcon } from '@phosphor-icons/react/dist/csr/DotsThreeVertical';\nimport { BellIcon } from '@phosphor-icons/react/dist/csr/Bell';\nimport { MouseEvent, ReactNode, useState, useEffect } from 'react';\nimport { cn } from '../../utils/utils';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../DropdownMenu/DropdownMenu';\nimport { SkeletonCard } from '../Skeleton/Skeleton';\nimport IconButton from '../IconButton/IconButton';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Badge from '../Badge/Badge';\nimport { useMobile } from '../../hooks/useMobile';\nimport type {\n Notification,\n NotificationGroup,\n NotificationEntityType,\n NotificationEntityStatus,\n} from '../../types/notifications';\nimport { formatTimeAgo } from '../../store/notificationStore';\nimport mockContentImage from '../../assets/img/mock-content.png';\n\n/**\n * Default interval (in ms) to auto-refresh the notification center while it is\n * open, so newly received notifications appear without reopening it.\n */\nconst DEFAULT_REFRESH_INTERVAL_MS = 3000;\n\n// Extended notification item for component usage with time string\nexport interface NotificationItem extends Omit<Notification, 'createdAt'> {\n time: string;\n createdAt: string | Date;\n}\n\n// Base props shared across all modes\ninterface BaseNotificationProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Empty state image path\n */\n emptyStateImage?: string;\n /**\n * Empty state title\n */\n emptyStateTitle?: string;\n /**\n * Empty state description\n */\n emptyStateDescription?: string;\n}\n\n// Single notification card mode\ninterface SingleNotificationCardMode extends BaseNotificationProps {\n /**\n * Component mode - single card\n */\n mode: 'single';\n /**\n * The notification title\n */\n title: string;\n /**\n * The notification message content\n */\n message: string;\n /**\n * Time displayed (e.g., \"Há 3h\", \"12 Fev\")\n */\n time: string;\n /**\n * Whether the notification has been read\n */\n isRead: boolean;\n /**\n * Callback when user marks notification as read\n */\n onMarkAsRead: () => void;\n /**\n * Callback when user deletes notification\n */\n onDelete: () => void;\n /**\n * Optional callback for navigation action\n */\n onNavigate?: () => void;\n /**\n * Label for the action button (only shown if onNavigate is provided)\n */\n actionLabel?: string;\n}\n\n// List mode\ninterface NotificationListMode extends BaseNotificationProps {\n /**\n * Component mode - list\n */\n mode: 'list';\n /**\n * Array of notifications for list mode\n */\n notifications?: NotificationItem[];\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for list mode\n */\n loading?: boolean;\n /**\n * Error state for list mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Callback when user marks a notification as read in list mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in list mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in list mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n /**\n * Callback when user clicks on a global notification\n */\n onGlobalNotificationClick?: (notification: Notification) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Custom empty state component\n */\n renderEmpty?: () => ReactNode;\n}\n\n// NotificationCenter mode\ninterface NotificationCenterMode extends BaseNotificationProps {\n /**\n * Component mode - center\n */\n mode: 'center';\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for center mode\n */\n loading?: boolean;\n /**\n * Error state for center mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Whether center mode is currently active (controls dropdown/modal visibility)\n */\n isActive?: boolean;\n /**\n * Callback when center mode is toggled\n */\n onToggleActive?: () => void;\n /**\n * Number of unread notifications for badge display\n */\n unreadCount?: number;\n /**\n * Callback when all notifications should be marked as read\n */\n onMarkAllAsRead?: () => void;\n /**\n * Callback to fetch notifications (called when center opens)\n */\n onFetchNotifications?: () => void;\n /**\n * Callback when user marks a notification as read in center mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in center mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in center mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Callback when dropdown open state changes (for synchronization with parent)\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Interval (in ms) to auto-refresh the list while the center is open, so newly\n * received notifications appear without reopening it. Defaults to 3000 (3s).\n * Set to 0 to disable polling.\n */\n refreshIntervalMs?: number;\n}\n\n// Union type for all modes\nexport type NotificationCardProps =\n | SingleNotificationCardMode\n | NotificationListMode\n | NotificationCenterMode;\n\n// Legacy interface for backward compatibility\nexport interface LegacyNotificationCardProps extends BaseNotificationProps {\n // Single notification mode props\n title?: string;\n message?: string;\n time?: string;\n isRead?: boolean;\n onMarkAsRead?: () => void;\n onDelete?: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n\n // List mode props\n notifications?: NotificationItem[];\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n\n // NotificationCenter mode props\n variant?: 'card' | 'center';\n isActive?: boolean;\n onToggleActive?: () => void;\n unreadCount?: number;\n onMarkAllAsRead?: () => void;\n onFetchNotifications?: () => void;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Empty state component for notifications\n */\nconst NotificationEmpty = ({\n emptyStateImage,\n emptyStateTitle = 'Nenhuma notificação no momento',\n emptyStateDescription = 'Você está em dia com todas as novidades. Volte depois para conferir atualizações!',\n}: {\n emptyStateImage?: string;\n emptyStateTitle?: string;\n emptyStateDescription?: string;\n}) => {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-6 w-full\">\n {/* Notification Icon */}\n {emptyStateImage && (\n <div className=\"w-20 h-20 flex items-center justify-center\">\n <img\n src={emptyStateImage}\n alt=\"Sem notificações\"\n width={82}\n height={82}\n className=\"object-contain\"\n />\n </div>\n )}\n\n {/* Title */}\n <h3 className=\"text-xl font-semibold text-text-950 text-center leading-[23px]\">\n {emptyStateTitle}\n </h3>\n\n {/* Description */}\n <p className=\"text-sm font-normal text-text-400 text-center max-w-[316px] leading-[21px]\">\n {emptyStateDescription}\n </p>\n </div>\n );\n};\n\n/**\n * Notification header component\n */\nconst NotificationHeader = ({\n unreadCount,\n variant = 'modal',\n}: {\n unreadCount: number;\n variant?: 'modal' | 'dropdown';\n}) => {\n return (\n <div className=\"flex items-center justify-between gap-2\">\n {variant === 'modal' ? (\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Notificações\n </Text>\n ) : (\n <h3 className=\"text-sm font-semibold text-text-950\">Notificações</h3>\n )}\n {unreadCount > 0 && (\n <Badge\n variant=\"solid\"\n action=\"info\"\n size=\"small\"\n iconLeft={<BellIcon size={12} aria-hidden=\"true\" focusable=\"false\" />}\n className=\"border-0\"\n >\n {unreadCount === 1 ? '1 não lida' : `${unreadCount} não lidas`}\n </Badge>\n )}\n </div>\n );\n};\n\n/**\n * Marks a notification as read, if it is not already.\n *\n * Opening a notification is what \"viewed\" means to the sender, so every entry\n * point funnels through here: the card body and its \"Ver mais\" button, and the\n * action button inside the notification modal — in list mode and in the\n * notification center, mobile and desktop alike.\n *\n * Without this, the only path that ever reached `PATCH /notifications/:id` was\n * the \"Marcar como lida\" item in the kebab menu, so a student could read every\n * notice and still show up as \"Pendente\" on the teacher's screen.\n *\n * Lives at module level because the center renders its own modals rather than\n * delegating to `NotificationList`, and three copies of this guard is exactly\n * the kind of duplication that drifts apart.\n */\nconst markNotificationAsRead = (\n notification: Notification | null | undefined,\n onMarkAsReadById?: (id: string) => void\n) => {\n if (notification && !notification.isRead) {\n onMarkAsReadById?.(notification.id);\n }\n};\n\n/**\n * Modal that shows the full content of a notice (a notification with no entity\n * behind it).\n *\n * Rendered in three places — list mode, and the center's mobile and desktop\n * branches — which used to carry three near-identical copies of the same twenty\n * lines of `<Modal>` wiring. Keeping them apart meant every change to the notice\n * modal had to be made three times, and Sonar counted the block as duplicated.\n *\n * Closing is the caller's business (each owns its own state), so `onClose` stays\n * a prop; everything else is derived from the notification itself.\n */\nconst GlobalNotificationModal = ({\n notification,\n isOpen,\n onClose,\n onMarkAsReadById,\n emptyStateImage,\n}: {\n notification: Notification | null;\n isOpen: boolean;\n onClose: () => void;\n onMarkAsReadById?: (id: string) => void;\n emptyStateImage?: string;\n}) => (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={notification?.title || ''}\n variant=\"activity\"\n description={notification?.message || ''}\n image={notification?.linkImg || emptyStateImage || mockContentImage}\n actionLink={notification?.actionLink || undefined}\n actionLabel=\"Ver mais\"\n onActionClick={() => markNotificationAsRead(notification, onMarkAsReadById)}\n size=\"lg\"\n />\n);\n\n/**\n * Single notification card component\n */\nconst SingleNotificationCard = ({\n title,\n message,\n time,\n isRead,\n onMarkAsRead,\n onDelete,\n onNavigate,\n actionLabel,\n className,\n}: {\n title: string;\n message: string;\n time: string;\n isRead: boolean;\n onMarkAsRead: () => void;\n onDelete: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n className?: string;\n}) => {\n const handleMarkAsRead = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isRead) {\n onMarkAsRead();\n }\n };\n\n const handleDelete = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete();\n };\n\n const handleNavigate = (e: MouseEvent) => {\n e.stopPropagation();\n if (onNavigate) {\n onNavigate();\n }\n };\n\n return (\n <div\n className={cn(\n 'flex flex-col justify-center items-start p-4 gap-2 w-full bg-background border-b border-border-200',\n 'last:border-b-0',\n className\n )}\n >\n {/* Header with unread indicator and actions menu */}\n <div className=\"flex items-center gap-2 w-full\">\n {/* Unread indicator */}\n {!isRead && (\n <div className=\"w-[7px] h-[7px] bg-info-300 rounded-full flex-shrink-0\" />\n )}\n\n {/* Title */}\n <h3 className=\"font-bold text-sm leading-4 text-text-950 flex-grow\">\n {title}\n </h3>\n\n {/* Actions dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex-shrink-0 inline-flex items-center justify-center font-medium bg-transparent text-text-950 cursor-pointer hover:bg-info-50 w-6 h-6 rounded-lg\"\n aria-label=\"Menu de ações\"\n >\n <DotsThreeVerticalIcon size={24} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[160px]\">\n {!isRead && (\n <DropdownMenuItem\n onClick={handleMarkAsRead}\n className=\"text-text-950\"\n >\n Marcar como lida\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onClick={handleDelete} className=\"text-error-600\">\n Deletar\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Message */}\n <p className=\"text-sm leading-[21px] text-text-800 w-full\">{message}</p>\n\n {/* Time and action button */}\n <div className=\"flex items-center justify-between w-full\">\n <span className=\"text-sm font-medium text-text-400\">{time}</span>\n\n {onNavigate && actionLabel && (\n <button\n type=\"button\"\n onClick={handleNavigate}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer\"\n >\n {actionLabel}\n </button>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Notification list component for displaying grouped notifications\n */\nconst NotificationList = ({\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n onGlobalNotificationClick,\n getActionLabel,\n renderEmpty,\n className,\n emptyStateImage,\n}: {\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n className?: string;\n emptyStateImage?: string;\n}) => {\n // State for global notification modal when onGlobalNotificationClick is not provided\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Default handler for global notifications when onGlobalNotificationClick is not provided\n const handleGlobalNotificationClick = (notification: Notification) => {\n if (onGlobalNotificationClick) {\n onGlobalNotificationClick(notification);\n } else {\n // Open modal as fallback\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }\n };\n\n const markAsReadThen = (\n notification: Notification,\n open: (notification: Notification) => void\n ) => {\n markNotificationAsRead(notification, onMarkAsReadById);\n open(notification);\n };\n // Error state\n if (error) {\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-error-600\">{error}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"text-sm text-info-600 hover:text-info-700\"\n >\n Tentar novamente\n </button>\n )}\n </div>\n );\n }\n\n // Loading state — only show the skeleton on the initial load (empty list).\n // Background refreshes (e.g. while the center polls) keep the list visible.\n if (loading && groupedNotifications.length === 0) {\n return (\n <div className=\"flex flex-col gap-0 w-full\">\n {['skeleton-first', 'skeleton-second', 'skeleton-third'].map(\n (skeletonId) => (\n <SkeletonCard\n key={skeletonId}\n className=\"p-4 border-b border-border-200\"\n />\n )\n )}\n </div>\n );\n }\n\n // Empty state\n if (!groupedNotifications || groupedNotifications.length === 0) {\n return renderEmpty ? (\n <div className=\"w-full\">{renderEmpty()}</div>\n ) : (\n <NotificationEmpty />\n );\n }\n\n return (\n <div className={cn('flex flex-col gap-0 w-full', className)}>\n {groupedNotifications.map((group, idx) => (\n <div key={`${group.label}-${idx}`} className=\"flex flex-col\">\n {/* Group header */}\n <div className=\"flex items-end px-4 py-6 pb-4\">\n <h4 className=\"text-lg font-bold text-text-500 flex-grow\">\n {group.label}\n </h4>\n </div>\n\n {/* Notifications in group */}\n {group.notifications.map((notification) => {\n // Check if this is a global notification\n const isGlobalNotification =\n !notification.entityType &&\n !notification.entityId &&\n !notification.activity &&\n !notification.recommendedClass;\n\n // Determine navigation handler\n let navigationHandler: (() => void) | undefined;\n if (isGlobalNotification) {\n navigationHandler = () =>\n markAsReadThen(notification, handleGlobalNotificationClick);\n } else if (\n notification.entityType &&\n notification.entityId &&\n onNavigateById\n ) {\n navigationHandler = () =>\n markAsReadThen(notification, (opened) =>\n onNavigateById(\n opened.entityType ?? undefined,\n opened.entityId ?? undefined,\n opened.entityStatus,\n opened.questionId\n )\n );\n }\n\n // Determine action label\n let actionLabel: string | undefined;\n if (isGlobalNotification) {\n // For global notifications, call getActionLabel without parameters or with null\n actionLabel = getActionLabel?.(undefined);\n } else {\n // For entity-specific notifications, pass the entityType\n actionLabel = getActionLabel?.(\n notification.entityType ?? undefined\n );\n }\n\n return (\n <SingleNotificationCard\n key={notification.id}\n title={notification.title}\n message={notification.message}\n time={\n (notification as Partial<NotificationItem>).time ??\n formatTimeAgo(new Date(notification.createdAt))\n }\n isRead={notification.isRead}\n onMarkAsRead={() => onMarkAsReadById?.(notification.id)}\n onDelete={() => onDeleteById?.(notification.id)}\n onNavigate={navigationHandler}\n actionLabel={actionLabel}\n />\n );\n })}\n </div>\n ))}\n\n {/* Global notification modal for list mode */}\n <GlobalNotificationModal\n notification={globalNotificationModal.notification}\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n onMarkAsReadById={onMarkAsReadById}\n emptyStateImage={emptyStateImage}\n />\n </div>\n );\n};\n\n// Internal props type for NotificationCenter (without mode)\ntype NotificationCenterProps = Omit<NotificationCenterMode, 'mode'>;\n\n/**\n * NotificationCenter component for modal/dropdown mode\n */\nconst NotificationCenter = ({\n isActive,\n onToggleActive,\n unreadCount = 0,\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n getActionLabel,\n onFetchNotifications,\n onMarkAllAsRead,\n onOpenChange,\n emptyStateImage,\n emptyStateTitle,\n emptyStateDescription,\n className,\n refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS,\n}: NotificationCenterProps) => {\n const { isMobile } = useMobile();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Handle mobile click\n const handleMobileClick = () => {\n setIsModalOpen(true);\n onFetchNotifications?.();\n };\n\n // Handle desktop click\n const handleDesktopClick = () => {\n onToggleActive?.();\n };\n\n // Handle dropdown open change\n const handleOpenChange = (open: boolean) => {\n const controlledByParent =\n typeof isActive === 'boolean' && typeof onToggleActive === 'function';\n\n // Always notify parent if they want the signal.\n onOpenChange?.(open);\n\n // If parent controls via toggle only (no onOpenChange), keep them in sync on close.\n if (controlledByParent && !onOpenChange && !open && isActive) {\n onToggleActive?.();\n }\n };\n\n // Fetch notifications when dropdown opens\n useEffect(() => {\n if (isActive) {\n onFetchNotifications?.();\n }\n }, [isActive, onFetchNotifications]);\n\n // While the center is open, poll periodically so newly received notifications\n // appear without the user having to reopen it. The list is not replaced by a\n // skeleton on these background refreshes (see NotificationList loading gate).\n const isCenterOpen = isMobile ? isModalOpen : Boolean(isActive);\n useEffect(() => {\n if (!isCenterOpen || !onFetchNotifications || refreshIntervalMs <= 0) {\n return;\n }\n const intervalId = setInterval(() => {\n onFetchNotifications();\n }, refreshIntervalMs);\n return () => clearInterval(intervalId);\n }, [isCenterOpen, onFetchNotifications, refreshIntervalMs]);\n\n const renderEmptyState = () => (\n <NotificationEmpty\n emptyStateImage={emptyStateImage}\n emptyStateTitle={emptyStateTitle}\n emptyStateDescription={emptyStateDescription}\n />\n );\n\n if (isMobile) {\n return (\n <>\n <IconButton\n active={isModalOpen}\n onClick={handleMobileClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className=\"p-0\"\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title=\"Notificações\"\n size=\"md\"\n hideCloseButton={false}\n closeOnEscape={true}\n >\n <div className=\"flex flex-col h-full max-h-[80vh]\">\n <div className=\"px-0 pb-3 border-b border-border-200\">\n <NotificationHeader unreadCount={unreadCount} variant=\"modal\" />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n // Variadic on purpose: written out by hand, this forwarding\n // silently dropped `entityStatus` — and would drop the next\n // argument too.\n onNavigateById={(...args) => {\n setIsModalOpen(false);\n onNavigateById?.(...args);\n }}\n onGlobalNotificationClick={(notification) => {\n setIsModalOpen(false);\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </Modal>\n {/* Global Notification Modal (mobile) */}\n <GlobalNotificationModal\n notification={globalNotificationModal.notification}\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n onMarkAsReadById={onMarkAsReadById}\n emptyStateImage={emptyStateImage}\n />\n </>\n );\n }\n\n return (\n <>\n <DropdownMenu\n {...(typeof isActive === 'boolean'\n ? { open: isActive, onOpenChange: handleOpenChange }\n : { onOpenChange: handleOpenChange })}\n >\n <DropdownMenuTrigger className=\"text-primary cursor-pointer\" asChild>\n <IconButton\n active={isActive}\n onClick={handleDesktopClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className={cn('p-0', isActive && 'text-primary-950!')}\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"min-w-[320px] max-w-[400px] max-h-[500px] overflow-hidden\"\n side=\"bottom\"\n align=\"end\"\n >\n <div className=\"flex flex-col\">\n <div className=\"px-4 py-3 border-b border-border-200\">\n <NotificationHeader\n unreadCount={unreadCount}\n variant=\"dropdown\"\n />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"max-h-[350px] overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n onNavigateById={onNavigateById}\n onGlobalNotificationClick={(notification) => {\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Global Notification Modal */}\n <GlobalNotificationModal\n notification={globalNotificationModal.notification}\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n onMarkAsReadById={onMarkAsReadById}\n emptyStateImage={emptyStateImage}\n />\n </>\n );\n};\n\n/**\n * NotificationCard component - can display single notification, list of notifications, or center mode\n *\n * @param props - The notification card properties\n * @returns JSX element representing the notification card, list, or center\n */\nconst NotificationCard = (props: NotificationCardProps) => {\n // Use mode discriminator to determine which component to render\n switch (props.mode) {\n case 'single':\n return (\n <SingleNotificationCard\n title={props.title}\n message={props.message}\n time={props.time}\n isRead={props.isRead}\n onMarkAsRead={props.onMarkAsRead}\n onDelete={props.onDelete}\n onNavigate={props.onNavigate}\n actionLabel={props.actionLabel}\n className={props.className}\n />\n );\n\n case 'list':\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n\n case 'center':\n return <NotificationCenter {...props} />;\n\n default:\n // This should never happen with proper typing, but provides a fallback\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">\n Modo de notificação não reconhecido\n </p>\n </div>\n );\n }\n};\n\n/**\n * Legacy NotificationCard component for backward compatibility\n * Automatically detects mode based on provided props\n */\nexport const LegacyNotificationCard = (props: LegacyNotificationCardProps) => {\n // If variant is center, render NotificationCenter\n if (props.variant === 'center') {\n const centerProps: NotificationCenterMode = {\n mode: 'center',\n ...props,\n };\n return <NotificationCenter {...centerProps} />;\n }\n\n // If we have list-related props, render list mode\n if (\n props.groupedNotifications !== undefined ||\n props.notifications !== undefined ||\n props.loading ||\n props.error\n ) {\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n }\n\n // If we have single notification props, render single card mode\n if (\n props.title !== undefined &&\n props.message !== undefined &&\n props.time !== undefined &&\n props.isRead !== undefined &&\n props.onMarkAsRead &&\n props.onDelete\n ) {\n const singleProps: SingleNotificationCardMode = {\n mode: 'single',\n title: props.title,\n message: props.message,\n time: props.time,\n isRead: props.isRead,\n onMarkAsRead: props.onMarkAsRead,\n onDelete: props.onDelete,\n onNavigate: props.onNavigate,\n actionLabel: props.actionLabel,\n className: props.className,\n emptyStateImage: props.emptyStateImage,\n emptyStateTitle: props.emptyStateTitle,\n emptyStateDescription: props.emptyStateDescription,\n };\n return (\n <SingleNotificationCard\n title={singleProps.title}\n message={singleProps.message}\n time={singleProps.time}\n isRead={singleProps.isRead}\n onMarkAsRead={singleProps.onMarkAsRead}\n onDelete={singleProps.onDelete}\n onNavigate={singleProps.onNavigate}\n actionLabel={singleProps.actionLabel}\n className={singleProps.className}\n />\n );\n }\n\n // Default empty state if no valid props provided\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">Nenhuma notificação configurada</p>\n </div>\n );\n};\n\nexport default NotificationCard;\nexport type { NotificationGroup };\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-QHXJB5QM.js","../src/components/NotificationCard/NotificationCard.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-QHXJB5QM.js","sourcesContent":[null,"import { DotsThreeVerticalIcon } from '@phosphor-icons/react/dist/csr/DotsThreeVertical';\nimport { BellIcon } from '@phosphor-icons/react/dist/csr/Bell';\nimport { MouseEvent, ReactNode, useState, useEffect } from 'react';\nimport { cn } from '../../utils/utils';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../DropdownMenu/DropdownMenu';\nimport { SkeletonCard } from '../Skeleton/Skeleton';\nimport IconButton from '../IconButton/IconButton';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Badge from '../Badge/Badge';\nimport { useMobile } from '../../hooks/useMobile';\nimport type {\n Notification,\n NotificationGroup,\n NotificationEntityType,\n NotificationEntityStatus,\n} from '../../types/notifications';\nimport { formatTimeAgo } from '../../store/notificationStore';\nimport mockContentImage from '../../assets/img/mock-content.png';\n\n/**\n * Default interval (in ms) to auto-refresh the notification center while it is\n * open, so newly received notifications appear without reopening it.\n */\nconst DEFAULT_REFRESH_INTERVAL_MS = 3000;\n\n// Extended notification item for component usage with time string\nexport interface NotificationItem extends Omit<Notification, 'createdAt'> {\n time: string;\n createdAt: string | Date;\n}\n\n// Base props shared across all modes\ninterface BaseNotificationProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Empty state image path\n */\n emptyStateImage?: string;\n /**\n * Empty state title\n */\n emptyStateTitle?: string;\n /**\n * Empty state description\n */\n emptyStateDescription?: string;\n}\n\n// Single notification card mode\ninterface SingleNotificationCardMode extends BaseNotificationProps {\n /**\n * Component mode - single card\n */\n mode: 'single';\n /**\n * The notification title\n */\n title: string;\n /**\n * The notification message content\n */\n message: string;\n /**\n * Time displayed (e.g., \"Há 3h\", \"12 Fev\")\n */\n time: string;\n /**\n * Whether the notification has been read\n */\n isRead: boolean;\n /**\n * Callback when user marks notification as read\n */\n onMarkAsRead: () => void;\n /**\n * Callback when user deletes notification\n */\n onDelete: () => void;\n /**\n * Optional callback for navigation action\n */\n onNavigate?: () => void;\n /**\n * Label for the action button (only shown if onNavigate is provided)\n */\n actionLabel?: string;\n}\n\n// List mode\ninterface NotificationListMode extends BaseNotificationProps {\n /**\n * Component mode - list\n */\n mode: 'list';\n /**\n * Array of notifications for list mode\n */\n notifications?: NotificationItem[];\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for list mode\n */\n loading?: boolean;\n /**\n * Error state for list mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Callback when user marks a notification as read in list mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in list mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in list mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n /**\n * Callback when user clicks on a global notification\n */\n onGlobalNotificationClick?: (notification: Notification) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Custom empty state component\n */\n renderEmpty?: () => ReactNode;\n}\n\n// NotificationCenter mode\ninterface NotificationCenterMode extends BaseNotificationProps {\n /**\n * Component mode - center\n */\n mode: 'center';\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for center mode\n */\n loading?: boolean;\n /**\n * Error state for center mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Whether center mode is currently active (controls dropdown/modal visibility)\n */\n isActive?: boolean;\n /**\n * Callback when center mode is toggled\n */\n onToggleActive?: () => void;\n /**\n * Number of unread notifications for badge display\n */\n unreadCount?: number;\n /**\n * Callback when all notifications should be marked as read\n */\n onMarkAllAsRead?: () => void;\n /**\n * Callback to fetch notifications (called when center opens)\n */\n onFetchNotifications?: () => void;\n /**\n * Callback when user marks a notification as read in center mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in center mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in center mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Callback when dropdown open state changes (for synchronization with parent)\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Interval (in ms) to auto-refresh the list while the center is open, so newly\n * received notifications appear without reopening it. Defaults to 3000 (3s).\n * Set to 0 to disable polling.\n */\n refreshIntervalMs?: number;\n}\n\n// Union type for all modes\nexport type NotificationCardProps =\n | SingleNotificationCardMode\n | NotificationListMode\n | NotificationCenterMode;\n\n// Legacy interface for backward compatibility\nexport interface LegacyNotificationCardProps extends BaseNotificationProps {\n // Single notification mode props\n title?: string;\n message?: string;\n time?: string;\n isRead?: boolean;\n onMarkAsRead?: () => void;\n onDelete?: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n\n // List mode props\n notifications?: NotificationItem[];\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n\n // NotificationCenter mode props\n variant?: 'card' | 'center';\n isActive?: boolean;\n onToggleActive?: () => void;\n unreadCount?: number;\n onMarkAllAsRead?: () => void;\n onFetchNotifications?: () => void;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Empty state component for notifications\n */\nconst NotificationEmpty = ({\n emptyStateImage,\n emptyStateTitle = 'Nenhuma notificação no momento',\n emptyStateDescription = 'Você está em dia com todas as novidades. Volte depois para conferir atualizações!',\n}: {\n emptyStateImage?: string;\n emptyStateTitle?: string;\n emptyStateDescription?: string;\n}) => {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-6 w-full\">\n {/* Notification Icon */}\n {emptyStateImage && (\n <div className=\"w-20 h-20 flex items-center justify-center\">\n <img\n src={emptyStateImage}\n alt=\"Sem notificações\"\n width={82}\n height={82}\n className=\"object-contain\"\n />\n </div>\n )}\n\n {/* Title */}\n <h3 className=\"text-xl font-semibold text-text-950 text-center leading-[23px]\">\n {emptyStateTitle}\n </h3>\n\n {/* Description */}\n <p className=\"text-sm font-normal text-text-400 text-center max-w-[316px] leading-[21px]\">\n {emptyStateDescription}\n </p>\n </div>\n );\n};\n\n/**\n * Notification header component\n */\nconst NotificationHeader = ({\n unreadCount,\n variant = 'modal',\n}: {\n unreadCount: number;\n variant?: 'modal' | 'dropdown';\n}) => {\n return (\n <div className=\"flex items-center justify-between gap-2\">\n {variant === 'modal' ? (\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Notificações\n </Text>\n ) : (\n <h3 className=\"text-sm font-semibold text-text-950\">Notificações</h3>\n )}\n {unreadCount > 0 && (\n <Badge\n variant=\"solid\"\n action=\"info\"\n size=\"small\"\n iconLeft={<BellIcon size={12} aria-hidden=\"true\" focusable=\"false\" />}\n className=\"border-0\"\n >\n {unreadCount === 1 ? '1 não lida' : `${unreadCount} não lidas`}\n </Badge>\n )}\n </div>\n );\n};\n\n/**\n * Marks a notification as read, if it is not already.\n *\n * Opening a notification is what \"viewed\" means to the sender, so every entry\n * point funnels through here: the card body and its \"Ver mais\" button, and the\n * action button inside the notification modal — in list mode and in the\n * notification center, mobile and desktop alike.\n *\n * Without this, the only path that ever reached `PATCH /notifications/:id` was\n * the \"Marcar como lida\" item in the kebab menu, so a student could read every\n * notice and still show up as \"Pendente\" on the teacher's screen.\n *\n * Lives at module level because the center renders its own modals rather than\n * delegating to `NotificationList`, and three copies of this guard is exactly\n * the kind of duplication that drifts apart.\n */\nconst markNotificationAsRead = (\n notification: Notification | null | undefined,\n onMarkAsReadById?: (id: string) => void\n) => {\n if (notification && !notification.isRead) {\n onMarkAsReadById?.(notification.id);\n }\n};\n\n/**\n * Modal that shows the full content of a notice (a notification with no entity\n * behind it).\n *\n * Rendered in three places — list mode, and the center's mobile and desktop\n * branches — which used to carry three near-identical copies of the same twenty\n * lines of `<Modal>` wiring. Keeping them apart meant every change to the notice\n * modal had to be made three times, and Sonar counted the block as duplicated.\n *\n * Closing is the caller's business (each owns its own state), so `onClose` stays\n * a prop; everything else is derived from the notification itself.\n */\nconst GlobalNotificationModal = ({\n notification,\n isOpen,\n onClose,\n onMarkAsReadById,\n emptyStateImage,\n}: {\n notification: Notification | null;\n isOpen: boolean;\n onClose: () => void;\n onMarkAsReadById?: (id: string) => void;\n emptyStateImage?: string;\n}) => (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={notification?.title || ''}\n variant=\"activity\"\n description={notification?.message || ''}\n image={notification?.linkImg || emptyStateImage || mockContentImage}\n actionLink={notification?.actionLink || undefined}\n actionLabel=\"Ver mais\"\n onActionClick={() => markNotificationAsRead(notification, onMarkAsReadById)}\n size=\"lg\"\n />\n);\n\n/**\n * Single notification card component\n */\nconst SingleNotificationCard = ({\n title,\n message,\n time,\n isRead,\n onMarkAsRead,\n onDelete,\n onNavigate,\n actionLabel,\n className,\n}: {\n title: string;\n message: string;\n time: string;\n isRead: boolean;\n onMarkAsRead: () => void;\n onDelete: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n className?: string;\n}) => {\n const handleMarkAsRead = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isRead) {\n onMarkAsRead();\n }\n };\n\n const handleDelete = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete();\n };\n\n const handleNavigate = (e: MouseEvent) => {\n e.stopPropagation();\n if (onNavigate) {\n onNavigate();\n }\n };\n\n return (\n <div\n className={cn(\n 'flex flex-col justify-center items-start p-4 gap-2 w-full bg-background border-b border-border-200',\n 'last:border-b-0',\n className\n )}\n >\n {/* Header with unread indicator and actions menu */}\n <div className=\"flex items-center gap-2 w-full\">\n {/* Unread indicator */}\n {!isRead && (\n <div className=\"w-[7px] h-[7px] bg-info-300 rounded-full flex-shrink-0\" />\n )}\n\n {/* Title */}\n <h3 className=\"font-bold text-sm leading-4 text-text-950 flex-grow\">\n {title}\n </h3>\n\n {/* Actions dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex-shrink-0 inline-flex items-center justify-center font-medium bg-transparent text-text-950 cursor-pointer hover:bg-info-50 w-6 h-6 rounded-lg\"\n aria-label=\"Menu de ações\"\n >\n <DotsThreeVerticalIcon size={24} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[160px]\">\n {!isRead && (\n <DropdownMenuItem\n onClick={handleMarkAsRead}\n className=\"text-text-950\"\n >\n Marcar como lida\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onClick={handleDelete} className=\"text-error-600\">\n Deletar\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Message */}\n <p className=\"text-sm leading-[21px] text-text-800 w-full\">{message}</p>\n\n {/* Time and action button */}\n <div className=\"flex items-center justify-between w-full\">\n <span className=\"text-sm font-medium text-text-400\">{time}</span>\n\n {onNavigate && actionLabel && (\n <button\n type=\"button\"\n onClick={handleNavigate}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer\"\n >\n {actionLabel}\n </button>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Notification list component for displaying grouped notifications\n */\nconst NotificationList = ({\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n onGlobalNotificationClick,\n getActionLabel,\n renderEmpty,\n className,\n emptyStateImage,\n}: {\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n className?: string;\n emptyStateImage?: string;\n}) => {\n // State for global notification modal when onGlobalNotificationClick is not provided\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Default handler for global notifications when onGlobalNotificationClick is not provided\n const handleGlobalNotificationClick = (notification: Notification) => {\n if (onGlobalNotificationClick) {\n onGlobalNotificationClick(notification);\n } else {\n // Open modal as fallback\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }\n };\n\n const markAsReadThen = (\n notification: Notification,\n open: (notification: Notification) => void\n ) => {\n markNotificationAsRead(notification, onMarkAsReadById);\n open(notification);\n };\n // Error state\n if (error) {\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-error-600\">{error}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"text-sm text-info-600 hover:text-info-700\"\n >\n Tentar novamente\n </button>\n )}\n </div>\n );\n }\n\n // Loading state — only show the skeleton on the initial load (empty list).\n // Background refreshes (e.g. while the center polls) keep the list visible.\n if (loading && groupedNotifications.length === 0) {\n return (\n <div className=\"flex flex-col gap-0 w-full\">\n {['skeleton-first', 'skeleton-second', 'skeleton-third'].map(\n (skeletonId) => (\n <SkeletonCard\n key={skeletonId}\n className=\"p-4 border-b border-border-200\"\n />\n )\n )}\n </div>\n );\n }\n\n // Empty state\n if (!groupedNotifications || groupedNotifications.length === 0) {\n return renderEmpty ? (\n <div className=\"w-full\">{renderEmpty()}</div>\n ) : (\n <NotificationEmpty />\n );\n }\n\n return (\n <div className={cn('flex flex-col gap-0 w-full', className)}>\n {groupedNotifications.map((group, idx) => (\n <div key={`${group.label}-${idx}`} className=\"flex flex-col\">\n {/* Group header */}\n <div className=\"flex items-end px-4 py-6 pb-4\">\n <h4 className=\"text-lg font-bold text-text-500 flex-grow\">\n {group.label}\n </h4>\n </div>\n\n {/* Notifications in group */}\n {group.notifications.map((notification) => {\n // Check if this is a global notification\n const isGlobalNotification =\n !notification.entityType &&\n !notification.entityId &&\n !notification.activity &&\n !notification.recommendedClass;\n\n // Determine navigation handler\n let navigationHandler: (() => void) | undefined;\n if (isGlobalNotification) {\n navigationHandler = () =>\n markAsReadThen(notification, handleGlobalNotificationClick);\n } else if (\n notification.entityType &&\n notification.entityId &&\n onNavigateById\n ) {\n navigationHandler = () =>\n markAsReadThen(notification, (opened) =>\n onNavigateById(\n opened.entityType ?? undefined,\n opened.entityId ?? undefined,\n opened.entityStatus,\n opened.questionId\n )\n );\n }\n\n // Determine action label\n let actionLabel: string | undefined;\n if (isGlobalNotification) {\n // For global notifications, call getActionLabel without parameters or with null\n actionLabel = getActionLabel?.(undefined);\n } else {\n // For entity-specific notifications, pass the entityType\n actionLabel = getActionLabel?.(\n notification.entityType ?? undefined\n );\n }\n\n return (\n <SingleNotificationCard\n key={notification.id}\n title={notification.title}\n message={notification.message}\n time={\n (notification as Partial<NotificationItem>).time ??\n formatTimeAgo(new Date(notification.createdAt))\n }\n isRead={notification.isRead}\n onMarkAsRead={() => onMarkAsReadById?.(notification.id)}\n onDelete={() => onDeleteById?.(notification.id)}\n onNavigate={navigationHandler}\n actionLabel={actionLabel}\n />\n );\n })}\n </div>\n ))}\n\n {/* Global notification modal for list mode */}\n <GlobalNotificationModal\n notification={globalNotificationModal.notification}\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n onMarkAsReadById={onMarkAsReadById}\n emptyStateImage={emptyStateImage}\n />\n </div>\n );\n};\n\n// Internal props type for NotificationCenter (without mode)\ntype NotificationCenterProps = Omit<NotificationCenterMode, 'mode'>;\n\n/**\n * NotificationCenter component for modal/dropdown mode\n */\nconst NotificationCenter = ({\n isActive,\n onToggleActive,\n unreadCount = 0,\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n getActionLabel,\n onFetchNotifications,\n onMarkAllAsRead,\n onOpenChange,\n emptyStateImage,\n emptyStateTitle,\n emptyStateDescription,\n className,\n refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS,\n}: NotificationCenterProps) => {\n const { isMobile } = useMobile();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Handle mobile click\n const handleMobileClick = () => {\n setIsModalOpen(true);\n onFetchNotifications?.();\n };\n\n // Handle desktop click\n const handleDesktopClick = () => {\n onToggleActive?.();\n };\n\n // Handle dropdown open change\n const handleOpenChange = (open: boolean) => {\n const controlledByParent =\n typeof isActive === 'boolean' && typeof onToggleActive === 'function';\n\n // Always notify parent if they want the signal.\n onOpenChange?.(open);\n\n // If parent controls via toggle only (no onOpenChange), keep them in sync on close.\n if (controlledByParent && !onOpenChange && !open && isActive) {\n onToggleActive?.();\n }\n };\n\n // Fetch notifications when dropdown opens\n useEffect(() => {\n if (isActive) {\n onFetchNotifications?.();\n }\n }, [isActive, onFetchNotifications]);\n\n // While the center is open, poll periodically so newly received notifications\n // appear without the user having to reopen it. The list is not replaced by a\n // skeleton on these background refreshes (see NotificationList loading gate).\n const isCenterOpen = isMobile ? isModalOpen : Boolean(isActive);\n useEffect(() => {\n if (!isCenterOpen || !onFetchNotifications || refreshIntervalMs <= 0) {\n return;\n }\n const intervalId = setInterval(() => {\n onFetchNotifications();\n }, refreshIntervalMs);\n return () => clearInterval(intervalId);\n }, [isCenterOpen, onFetchNotifications, refreshIntervalMs]);\n\n const renderEmptyState = () => (\n <NotificationEmpty\n emptyStateImage={emptyStateImage}\n emptyStateTitle={emptyStateTitle}\n emptyStateDescription={emptyStateDescription}\n />\n );\n\n if (isMobile) {\n return (\n <>\n <IconButton\n active={isModalOpen}\n onClick={handleMobileClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className=\"p-0\"\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title=\"Notificações\"\n size=\"md\"\n hideCloseButton={false}\n closeOnEscape={true}\n >\n <div className=\"flex flex-col h-full max-h-[80vh]\">\n <div className=\"px-0 pb-3 border-b border-border-200\">\n <NotificationHeader unreadCount={unreadCount} variant=\"modal\" />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n // Variadic on purpose: written out by hand, this forwarding\n // silently dropped `entityStatus` — and would drop the next\n // argument too.\n onNavigateById={(...args) => {\n setIsModalOpen(false);\n onNavigateById?.(...args);\n }}\n onGlobalNotificationClick={(notification) => {\n setIsModalOpen(false);\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </Modal>\n {/* Global Notification Modal (mobile) */}\n <GlobalNotificationModal\n notification={globalNotificationModal.notification}\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n onMarkAsReadById={onMarkAsReadById}\n emptyStateImage={emptyStateImage}\n />\n </>\n );\n }\n\n return (\n <>\n <DropdownMenu\n {...(typeof isActive === 'boolean'\n ? { open: isActive, onOpenChange: handleOpenChange }\n : { onOpenChange: handleOpenChange })}\n >\n <DropdownMenuTrigger className=\"text-primary cursor-pointer\" asChild>\n <IconButton\n active={isActive}\n onClick={handleDesktopClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className={cn('p-0', isActive && 'text-primary-950!')}\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"min-w-[320px] max-w-[400px] max-h-[500px] overflow-hidden\"\n side=\"bottom\"\n align=\"end\"\n >\n <div className=\"flex flex-col\">\n <div className=\"px-4 py-3 border-b border-border-200\">\n <NotificationHeader\n unreadCount={unreadCount}\n variant=\"dropdown\"\n />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"max-h-[350px] overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n onNavigateById={onNavigateById}\n onGlobalNotificationClick={(notification) => {\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Global Notification Modal */}\n <GlobalNotificationModal\n notification={globalNotificationModal.notification}\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n onMarkAsReadById={onMarkAsReadById}\n emptyStateImage={emptyStateImage}\n />\n </>\n );\n};\n\n/**\n * NotificationCard component - can display single notification, list of notifications, or center mode\n *\n * @param props - The notification card properties\n * @returns JSX element representing the notification card, list, or center\n */\nconst NotificationCard = (props: NotificationCardProps) => {\n // Use mode discriminator to determine which component to render\n switch (props.mode) {\n case 'single':\n return (\n <SingleNotificationCard\n title={props.title}\n message={props.message}\n time={props.time}\n isRead={props.isRead}\n onMarkAsRead={props.onMarkAsRead}\n onDelete={props.onDelete}\n onNavigate={props.onNavigate}\n actionLabel={props.actionLabel}\n className={props.className}\n />\n );\n\n case 'list':\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n\n case 'center':\n return <NotificationCenter {...props} />;\n\n default:\n // This should never happen with proper typing, but provides a fallback\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">\n Modo de notificação não reconhecido\n </p>\n </div>\n );\n }\n};\n\n/**\n * Legacy NotificationCard component for backward compatibility\n * Automatically detects mode based on provided props\n */\nexport const LegacyNotificationCard = (props: LegacyNotificationCardProps) => {\n // If variant is center, render NotificationCenter\n if (props.variant === 'center') {\n const centerProps: NotificationCenterMode = {\n mode: 'center',\n ...props,\n };\n return <NotificationCenter {...centerProps} />;\n }\n\n // If we have list-related props, render list mode\n if (\n props.groupedNotifications !== undefined ||\n props.notifications !== undefined ||\n props.loading ||\n props.error\n ) {\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n }\n\n // If we have single notification props, render single card mode\n if (\n props.title !== undefined &&\n props.message !== undefined &&\n props.time !== undefined &&\n props.isRead !== undefined &&\n props.onMarkAsRead &&\n props.onDelete\n ) {\n const singleProps: SingleNotificationCardMode = {\n mode: 'single',\n title: props.title,\n message: props.message,\n time: props.time,\n isRead: props.isRead,\n onMarkAsRead: props.onMarkAsRead,\n onDelete: props.onDelete,\n onNavigate: props.onNavigate,\n actionLabel: props.actionLabel,\n className: props.className,\n emptyStateImage: props.emptyStateImage,\n emptyStateTitle: props.emptyStateTitle,\n emptyStateDescription: props.emptyStateDescription,\n };\n return (\n <SingleNotificationCard\n title={singleProps.title}\n message={singleProps.message}\n time={singleProps.time}\n isRead={singleProps.isRead}\n onMarkAsRead={singleProps.onMarkAsRead}\n onDelete={singleProps.onDelete}\n onNavigate={singleProps.onNavigate}\n actionLabel={singleProps.actionLabel}\n className={singleProps.className}\n />\n );\n }\n\n // Default empty state if no valid props provided\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">Nenhuma notificação configurada</p>\n </div>\n );\n};\n\nexport default NotificationCard;\nexport type { NotificationGroup };\n"]}
|
|
@@ -112,7 +112,7 @@ var _chunkK74NP7Q7js = require('./chunk-K74NP7Q7.js');
|
|
|
112
112
|
var _chunkEDYAMS5Tjs = require('./chunk-EDYAMS5T.js');
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
var
|
|
115
|
+
var _chunk7XWWI5EYjs = require('./chunk-7XWWI5EY.js');
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
var _chunkTZA4XQPOjs = require('./chunk-TZA4XQPO.js');
|
|
@@ -291,7 +291,7 @@ var _chunkJR4KWECXjs = require('./chunk-JR4KWECX.js');
|
|
|
291
291
|
var _chunk37P7JO3Sjs = require('./chunk-37P7JO3S.js');
|
|
292
292
|
|
|
293
293
|
|
|
294
|
-
var
|
|
294
|
+
var _chunkMYQ2LJWOjs = require('./chunk-MYQ2LJWO.js');
|
|
295
295
|
|
|
296
296
|
|
|
297
297
|
var _chunkCMUIZOUVjs = require('./chunk-CMUIZOUV.js');
|
|
@@ -333,7 +333,7 @@ var _chunkWWXDXIV7js = require('./chunk-WWXDXIV7.js');
|
|
|
333
333
|
|
|
334
334
|
|
|
335
335
|
|
|
336
|
-
var
|
|
336
|
+
var _chunkY64LT6BLjs = require('./chunk-Y64LT6BL.js');
|
|
337
337
|
|
|
338
338
|
|
|
339
339
|
|
|
@@ -1090,7 +1090,7 @@ var DateTimeInput = ({
|
|
|
1090
1090
|
};
|
|
1091
1091
|
const inputValue = date ? `${date}T${time || defaultTime}` : "";
|
|
1092
1092
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1093
|
-
|
|
1093
|
+
_chunkY64LT6BLjs.DropdownMenu_default,
|
|
1094
1094
|
{
|
|
1095
1095
|
open: !disabled && isCalendarOpen,
|
|
1096
1096
|
onOpenChange: (open) => {
|
|
@@ -1100,7 +1100,7 @@ var DateTimeInput = ({
|
|
|
1100
1100
|
},
|
|
1101
1101
|
children: [
|
|
1102
1102
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1103
|
-
|
|
1103
|
+
_chunkY64LT6BLjs.DropdownMenuTrigger,
|
|
1104
1104
|
{
|
|
1105
1105
|
className,
|
|
1106
1106
|
ref: triggerRef,
|
|
@@ -1124,7 +1124,7 @@ var DateTimeInput = ({
|
|
|
1124
1124
|
}
|
|
1125
1125
|
),
|
|
1126
1126
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
1127
|
-
|
|
1127
|
+
_chunkY64LT6BLjs.DropdownMenuContent,
|
|
1128
1128
|
{
|
|
1129
1129
|
align: "start",
|
|
1130
1130
|
className: "p-0 z-[100]",
|
|
@@ -2866,7 +2866,7 @@ var ActivityListQuestions = ({
|
|
|
2866
2866
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "bold", children: "Banco de quest\xF5es" })
|
|
2867
2867
|
] }),
|
|
2868
2868
|
appliedFilters && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2869
|
-
|
|
2869
|
+
_chunkMYQ2LJWOjs.Search_default,
|
|
2870
2870
|
{
|
|
2871
2871
|
value: searchTerm,
|
|
2872
2872
|
onChange: (e) => setSearchTerm(e.target.value),
|
|
@@ -7828,9 +7828,9 @@ var ColumnFilterMenu = ({
|
|
|
7828
7828
|
value.includes(optionValue) ? value.filter((v) => v !== optionValue) : [...value, optionValue]
|
|
7829
7829
|
);
|
|
7830
7830
|
};
|
|
7831
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "inline-flex", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
7831
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "inline-flex", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkY64LT6BLjs.DropdownMenu_default, { children: [
|
|
7832
7832
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
7833
|
-
|
|
7833
|
+
_chunkY64LT6BLjs.DropdownMenuTrigger,
|
|
7834
7834
|
{
|
|
7835
7835
|
ref: triggerRef,
|
|
7836
7836
|
"aria-label": `Filtrar por ${columnLabel}`,
|
|
@@ -7849,7 +7849,7 @@ var ColumnFilterMenu = ({
|
|
|
7849
7849
|
}
|
|
7850
7850
|
),
|
|
7851
7851
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
7852
|
-
|
|
7852
|
+
_chunkY64LT6BLjs.DropdownMenuContent,
|
|
7853
7853
|
{
|
|
7854
7854
|
portal: true,
|
|
7855
7855
|
triggerRef,
|
|
@@ -7857,7 +7857,7 @@ var ColumnFilterMenu = ({
|
|
|
7857
7857
|
onClick: (event) => event.stopPropagation(),
|
|
7858
7858
|
children: [
|
|
7859
7859
|
searchable && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
7860
|
-
|
|
7860
|
+
_chunkMYQ2LJWOjs.Search_default,
|
|
7861
7861
|
{
|
|
7862
7862
|
options: [],
|
|
7863
7863
|
value: query,
|
|
@@ -7873,7 +7873,7 @@ var ColumnFilterMenu = ({
|
|
|
7873
7873
|
}
|
|
7874
7874
|
) }),
|
|
7875
7875
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
7876
|
-
|
|
7876
|
+
_chunkY64LT6BLjs.DropdownMenuItem,
|
|
7877
7877
|
{
|
|
7878
7878
|
onClick: () => onChange([]),
|
|
7879
7879
|
className: _chunkTN3AYOMVjs.cn.call(void 0, !hasFilter && "font-bold"),
|
|
@@ -7885,7 +7885,7 @@ var ColumnFilterMenu = ({
|
|
|
7885
7885
|
!loading && visibleOptions.map((option) => {
|
|
7886
7886
|
const selected = value.includes(option.value);
|
|
7887
7887
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
7888
|
-
|
|
7888
|
+
_chunkY64LT6BLjs.DropdownMenuItem,
|
|
7889
7889
|
{
|
|
7890
7890
|
preventClose: multiple,
|
|
7891
7891
|
onClick: () => toggle(option.value),
|
|
@@ -9199,7 +9199,7 @@ function TableProvider({
|
|
|
9199
9199
|
{
|
|
9200
9200
|
className: _chunkTN3AYOMVjs.cn.call(void 0, "flex-1 flex justify-end", searchContainerClassName),
|
|
9201
9201
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
9202
|
-
|
|
9202
|
+
_chunkMYQ2LJWOjs.Search_default,
|
|
9203
9203
|
{
|
|
9204
9204
|
value: inputValue,
|
|
9205
9205
|
onChange: handleInputChange,
|
|
@@ -11109,10 +11109,10 @@ var ActivityFiltersPopover = ({
|
|
|
11109
11109
|
(state) => state.appliedFilters
|
|
11110
11110
|
);
|
|
11111
11111
|
const effectiveInitialFilters = _nullishCoalesce(appliedFilters, () => ( initialFilters));
|
|
11112
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
11113
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
11112
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkY64LT6BLjs.DropdownMenu_default, { open, onOpenChange: setOpen, children: [
|
|
11113
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkY64LT6BLjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN2HPVVHjs.Button_default, { variant: "outline", children: triggerLabel }) }),
|
|
11114
11114
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
11115
|
-
|
|
11115
|
+
_chunkY64LT6BLjs.DropdownMenuContent,
|
|
11116
11116
|
{
|
|
11117
11117
|
className: "w-[90vw] max-w-[400px] max-h-[calc(100vh-8rem)] overflow-y-auto p-0",
|
|
11118
11118
|
align: "start",
|
|
@@ -19268,7 +19268,7 @@ function SimulationsPage({ api, noSearchImage }) {
|
|
|
19268
19268
|
}
|
|
19269
19269
|
),
|
|
19270
19270
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
19271
|
-
|
|
19271
|
+
_chunk7XWWI5EYjs.SimulationsDetailModal,
|
|
19272
19272
|
{
|
|
19273
19273
|
api,
|
|
19274
19274
|
isOpen: selected !== null,
|
|
@@ -20668,4 +20668,4 @@ var CheckboxGroup = ({
|
|
|
20668
20668
|
|
|
20669
20669
|
|
|
20670
20670
|
exports.CheckboxGroup = CheckboxGroup; exports.DateTimeInput_default = DateTimeInput_default; exports.AlertsManager = AlertsManager; exports.useAudioSpectrum = useAudioSpectrum; exports.createUseActivityFiltersData = createUseActivityFiltersData; exports.createActivityFiltersDataHook = createActivityFiltersDataHook; exports.convertActivityFiltersToQuestionsFilter = convertActivityFiltersToQuestionsFilter; exports.ActivityListQuestions = ActivityListQuestions; exports.LoadingSkeleton = LoadingSkeleton; exports.SmallScreenLayout = SmallScreenLayout; exports.DesktopLayout = DesktopLayout; exports.CreateActivity = CreateActivity; exports.ActivityCardQuestionPreview = ActivityCardQuestionPreview; exports.ChooseActivityModelModal = ChooseActivityModelModal; exports.LessonPreview = LessonPreview; exports.useLessonFiltersStore = useLessonFiltersStore; exports.RecommendedLessonCreate = RecommendedLessonCreate; exports.ColumnFilterMenu_default = ColumnFilterMenu_default; exports.useColumnFilters = useColumnFilters; exports.FILTER_CATEGORY = FILTER_CATEGORY; exports.FILTER_GROUP = FILTER_GROUP; exports.FilterModal = FilterModal; exports.useUserAccessData = useUserAccessData; exports.useStudentsFilter = useStudentsFilter; exports.StudentsFilterSection = StudentsFilterSection; exports.SimulatedFiltersModal = SimulatedFiltersModal; exports.useSimulatedSubjects = useSimulatedSubjects; exports.SimulatedSubjectMenu = SimulatedSubjectMenu; exports.SimulatedRankingCard = SimulatedRankingCard; exports.SimulatedStudentRanking = SimulatedStudentRanking; exports.semTetoDeLargura = semTetoDeLargura; exports.isColumnSortable = isColumnSortable; exports.TableProvider = TableProvider; exports.TableProvider_default = TableProvider_default; exports.useSimulatedContentDetails = useSimulatedContentDetails; exports.SimulatedContentDetailsModal = SimulatedContentDetailsModal; exports.useEssayCompetenciesOverview = useEssayCompetenciesOverview; exports.useEssayCompetenceDetails = useEssayCompetenceDetails; exports.EssayCompetenceDetailsModal = EssayCompetenceDetailsModal; exports.EssayCompetenciesTable = EssayCompetenciesTable; exports.useEssayStudentDetails = useEssayStudentDetails; exports.EssayStudentDetailsModal = EssayStudentDetailsModal; exports.ActivityFilters = ActivityFilters; exports.ActivityFiltersPopover = ActivityFiltersPopover; exports.FillInBlanks = FillInBlanks; exports.ConnectDots = ConnectDots; exports.AudioMixerReadingFluency = AudioMixerReadingFluency; exports.AudioRecorderReadingFluency = AudioRecorderReadingFluency; exports.IconButtonReadingFluency = IconButtonReadingFluency; exports.ReadAloudPromptReadingFluency = ReadAloudPromptReadingFluency; exports.useAppContent = useAppContent; exports.ActivityCardQuestionBanks = ActivityCardQuestionBanks; exports.QuestionsPdfContent = QuestionsPdfContent; exports.useQuestionsPdfPrint = useQuestionsPdfPrint; exports.QuestionsPdfGenerator = QuestionsPdfGenerator; exports.ActivityPreview = ActivityPreview; exports.HierarchicalCheckboxGroup_default = HierarchicalCheckboxGroup_default; exports.useActivityDetails = useActivityDetails; exports.getStatsGridColsClass = getStatsGridColsClass; exports.ActivityDetails = ActivityDetails; exports.ActivityDetails_default = ActivityDetails_default; exports.SendActivityModal_default = SendActivityModal_default; exports.SaveActivityModelModal = SaveActivityModelModal; exports.useSendLessonModal = useSendLessonModal; exports.SendLessonModal_default = SendLessonModal_default; exports.RecommendedClassDraftsTab = RecommendedClassDraftsTab; exports.RecommendedClassPageTab = RecommendedClassPageTab; exports.RecommendedLessonsHistory = RecommendedLessonsHistory; exports.RecommendedLessonsHistory_default = RecommendedLessonsHistory_default; exports.recommendedClassApiResponseSchema = recommendedClassApiResponseSchema; exports.recommendedClassDetailsApiResponseSchema = recommendedClassDetailsApiResponseSchema; exports.historyApiResponseSchema = historyApiResponseSchema; exports.handleLessonDetailsFetchError = handleLessonDetailsFetchError; exports.createUseRecommendedLessonDetails = createUseRecommendedLessonDetails; exports.createRecommendedLessonDetailsHook = createRecommendedLessonDetailsHook; exports.ActivitiesHistory = ActivitiesHistory; exports.ActivitiesHistory_default = ActivitiesHistory_default; exports.ActivityTab = ActivityTab; exports.ActivityPageLayout = ActivityPageLayout; exports.ExamTab = ExamTab; exports.ExamPageLayout = ExamPageLayout; exports.UnifiedHistoryPage = UnifiedHistoryPage; exports.createExamDraftsModelsTableColumns = createExamDraftsModelsTableColumns; exports.createDraftsModelsFiltersConfig = createDraftsModelsFiltersConfig; exports.useActivityDraftModelPage = useActivityDraftModelPage; exports.UnifiedDraftModelPage = UnifiedDraftModelPage; exports.ChatLoading = ChatLoading; exports.createUseForum = createUseForum; exports.DEFAULT_PERIOD_SELECTION = DEFAULT_PERIOD_SELECTION; exports.getPeriodSelectionLabel = getPeriodSelectionLabel; exports.PeriodSelectorModal = PeriodSelectorModal; exports.PrintableUsersTable_default = PrintableUsersTable_default; exports.SimulatedPerformanceView = SimulatedPerformanceView; exports.SimulationsPage = SimulationsPage; exports.AnswerSheetPreview = AnswerSheetPreview; exports.AnswerSheetsBatchPreview = AnswerSheetsBatchPreview; exports.ExamDetailsHeader = ExamDetailsHeader; exports.formatQuestions = formatQuestions; exports.ExamStatsCards = ExamStatsCards; exports.getExamStudentStatusBadgeAction = getExamStudentStatusBadgeAction; exports.getExamStudentStatusDisplayText = getExamStudentStatusDisplayText; exports.createExamStudentsTableColumns = createExamStudentsTableColumns; exports.ExamStudentsTable = ExamStudentsTable; exports.ExamDetailsPage = ExamDetailsPage; exports.ExamDetailsPage_default = ExamDetailsPage_default;
|
|
20671
|
-
//# sourceMappingURL=chunk-
|
|
20671
|
+
//# sourceMappingURL=chunk-QN32O3J3.js.map
|