analytica-frontend-lib 1.5.21 → 1.5.23
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 +7 -7
- package/dist/ActivitiesHistory/index.mjs +6 -6
- package/dist/ActivityCardQuestionBanks/index.js +7 -7
- package/dist/ActivityCardQuestionBanks/index.mjs +6 -6
- package/dist/ActivityCardQuestionPreview/index.js +7 -7
- package/dist/ActivityCardQuestionPreview/index.mjs +6 -6
- package/dist/ActivityCreate/index.js +7 -7
- package/dist/ActivityCreate/index.mjs +6 -6
- package/dist/ActivityDetails/index.js +7 -7
- package/dist/ActivityDetails/index.mjs +6 -6
- package/dist/ActivityFilters/index.js +7 -7
- package/dist/ActivityFilters/index.mjs +6 -6
- package/dist/ActivityPageLayout/index.js +7 -7
- package/dist/ActivityPageLayout/index.mjs +6 -6
- package/dist/ActivityPreview/index.js +7 -7
- package/dist/ActivityPreview/index.mjs +6 -6
- package/dist/AlertManager/index.js +7 -7
- package/dist/AlertManager/index.mjs +6 -6
- package/dist/CheckBoxGroup/index.js +7 -7
- package/dist/CheckBoxGroup/index.mjs +6 -6
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +7 -7
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +6 -6
- package/dist/ExamPageLayout/index.js +7 -7
- package/dist/ExamPageLayout/index.mjs +6 -6
- package/dist/PrintableUsersTable/index.js +7 -7
- package/dist/PrintableUsersTable/index.mjs +6 -6
- package/dist/RecommendedLessonCreate/index.js +7 -7
- package/dist/RecommendedLessonCreate/index.mjs +6 -6
- package/dist/RecommendedLessonsHistory/index.js +7 -7
- package/dist/RecommendedLessonsHistory/index.mjs +6 -6
- package/dist/SendActivityModal/SendActivityModal.js +7 -7
- package/dist/SendActivityModal/SendActivityModal.mjs +6 -6
- package/dist/SendActivityModal/index.js +7 -7
- package/dist/SendActivityModal/index.mjs +6 -6
- package/dist/SendLessonModal/index.js +7 -7
- package/dist/SendLessonModal/index.mjs +6 -6
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +7 -7
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +6 -6
- package/dist/SimulationsPage/index.js +7 -7
- package/dist/SimulationsPage/index.mjs +6 -6
- package/dist/TableProvider/index.d.ts.map +1 -1
- package/dist/TableProvider/index.js +7 -7
- package/dist/TableProvider/index.mjs +6 -6
- package/dist/TimeReport/index.d.ts +6 -0
- package/dist/TimeReport/index.d.ts.map +1 -1
- package/dist/TimeReport/index.js +2 -2
- package/dist/TimeReport/index.mjs +1 -1
- package/dist/TypeSelector/TypeSelector.types/index.js +3 -3
- package/dist/TypeSelector/TypeSelector.types/index.mjs +2 -2
- package/dist/TypeSelector/index.js +4 -4
- package/dist/TypeSelector/index.mjs +3 -3
- package/dist/UnifiedDraftModelPage/index.js +7 -7
- package/dist/UnifiedDraftModelPage/index.mjs +6 -6
- package/dist/UnifiedHistoryPage/index.js +7 -7
- package/dist/UnifiedHistoryPage/index.mjs +6 -6
- package/dist/{chunk-CTRJ2BZP.mjs → chunk-3SHJQQCA.mjs} +2 -2
- package/dist/{chunk-ZSLJ6ZRR.mjs → chunk-BMJTQFRE.mjs} +59 -11
- package/dist/chunk-BMJTQFRE.mjs.map +1 -0
- package/dist/{chunk-ZHMW7GGL.js → chunk-CG7GWF5E.js} +60 -12
- package/dist/chunk-CG7GWF5E.js.map +1 -0
- package/dist/{chunk-CJ7XFBTY.mjs → chunk-DJG7DLCI.mjs} +1 -1
- package/dist/chunk-DJG7DLCI.mjs.map +1 -0
- package/dist/{chunk-ACKFNDCN.js → chunk-E4AWPRUB.js} +11 -2
- package/dist/chunk-E4AWPRUB.js.map +1 -0
- package/dist/{chunk-64NVMQCE.js → chunk-HLCT4MJA.js} +3 -3
- package/dist/{chunk-64NVMQCE.js.map → chunk-HLCT4MJA.js.map} +1 -1
- package/dist/{chunk-RDQN3TL4.js → chunk-KYHVFLN4.js} +3 -3
- package/dist/{chunk-RDQN3TL4.js.map → chunk-KYHVFLN4.js.map} +1 -1
- package/dist/{chunk-FF664NEZ.mjs → chunk-N26JL24O.mjs} +2 -2
- package/dist/{chunk-WUMJ2OIE.mjs → chunk-NTEW5ZW4.mjs} +23 -6
- package/dist/chunk-NTEW5ZW4.mjs.map +1 -0
- package/dist/{chunk-5H627GRH.mjs → chunk-QD6QSDVH.mjs} +11 -2
- package/dist/chunk-QD6QSDVH.mjs.map +1 -0
- package/dist/{chunk-CQ6FNWAU.js → chunk-TTSTAOIZ.js} +1 -1
- package/dist/chunk-TTSTAOIZ.js.map +1 -0
- package/dist/{chunk-4TROUHWW.js → chunk-YFNVFELP.js} +192 -175
- package/dist/chunk-YFNVFELP.js.map +1 -0
- package/dist/hooks/useActivitiesHistory/index.d.ts +12 -0
- package/dist/hooks/useActivitiesHistory/index.d.ts.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.js +4 -2
- package/dist/hooks/useActivitiesHistory/index.js.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.mjs +3 -1
- package/dist/hooks/useActivitiesHistory.d.ts +12 -0
- package/dist/hooks/useActivitiesHistory.d.ts.map +1 -1
- package/dist/hooks/useActivityDrafts/index.js +1 -1
- package/dist/hooks/useActivityDrafts/index.mjs +1 -1
- package/dist/hooks/useActivityModels/index.js +1 -1
- package/dist/hooks/useActivityModels/index.mjs +1 -1
- package/dist/hooks/useAppContent/index.js +7 -7
- package/dist/hooks/useAppContent/index.mjs +6 -6
- package/dist/index.js +7 -7
- package/dist/index.mjs +6 -6
- package/dist/types/activitiesHistory/index.d.ts +8 -3
- package/dist/types/activitiesHistory/index.d.ts.map +1 -1
- package/dist/types/activitiesHistory/index.js +2 -2
- package/dist/types/activitiesHistory/index.mjs +1 -1
- package/dist/types/activitiesHistory.d.ts +8 -3
- package/dist/types/activitiesHistory.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-4TROUHWW.js.map +0 -1
- package/dist/chunk-5H627GRH.mjs.map +0 -1
- package/dist/chunk-ACKFNDCN.js.map +0 -1
- package/dist/chunk-CJ7XFBTY.mjs.map +0 -1
- package/dist/chunk-CQ6FNWAU.js.map +0 -1
- package/dist/chunk-WUMJ2OIE.mjs.map +0 -1
- package/dist/chunk-ZHMW7GGL.js.map +0 -1
- package/dist/chunk-ZSLJ6ZRR.mjs.map +0 -1
- /package/dist/{chunk-CTRJ2BZP.mjs.map → chunk-3SHJQQCA.mjs.map} +0 -0
- /package/dist/{chunk-FF664NEZ.mjs.map → chunk-N26JL24O.mjs.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkYFNVFELPjs = require('../chunk-YFNVFELP.js');
|
|
4
4
|
require('../chunk-PSCV7KOT.js');
|
|
5
5
|
require('../chunk-MTZ6C74W.js');
|
|
6
6
|
require('../chunk-2KTRCWZQ.js');
|
|
@@ -23,11 +23,11 @@ require('../chunk-M4VITEXC.js');
|
|
|
23
23
|
require('../chunk-CGW6WT6Y.js');
|
|
24
24
|
require('../chunk-S6PM5UAE.js');
|
|
25
25
|
require('../chunk-4QPSGYYO.js');
|
|
26
|
-
require('../chunk-
|
|
26
|
+
require('../chunk-E4AWPRUB.js');
|
|
27
27
|
require('../chunk-RGRYY65K.js');
|
|
28
|
-
require('../chunk-
|
|
28
|
+
require('../chunk-KYHVFLN4.js');
|
|
29
29
|
require('../chunk-ORBLY3HS.js');
|
|
30
|
-
require('../chunk-
|
|
30
|
+
require('../chunk-HLCT4MJA.js');
|
|
31
31
|
require('../chunk-4DQBBXY3.js');
|
|
32
32
|
require('../chunk-KWHGQGBD.js');
|
|
33
33
|
require('../chunk-MWJWPCBK.js');
|
|
@@ -96,11 +96,11 @@ require('../chunk-TKR4INCJ.js');
|
|
|
96
96
|
require('../chunk-VQKKLUNW.js');
|
|
97
97
|
require('../chunk-PS3SDZMN.js');
|
|
98
98
|
require('../chunk-3GSGCLCO.js');
|
|
99
|
-
require('../chunk-
|
|
99
|
+
require('../chunk-CG7GWF5E.js');
|
|
100
100
|
require('../chunk-JLOAEKEJ.js');
|
|
101
101
|
require('../chunk-CDO3SEIT.js');
|
|
102
102
|
require('../chunk-3O47VPSO.js');
|
|
103
|
-
require('../chunk-
|
|
103
|
+
require('../chunk-TTSTAOIZ.js');
|
|
104
104
|
require('../chunk-NNMIVQMY.js');
|
|
105
105
|
require('../chunk-ZRTTIUKJ.js');
|
|
106
106
|
require('../chunk-R5QHGGXZ.js');
|
|
@@ -221,5 +221,5 @@ require('../chunk-AOUX6XXN.js');
|
|
|
221
221
|
require('../chunk-YQ3JVMVB.js');
|
|
222
222
|
|
|
223
223
|
|
|
224
|
-
exports.UnifiedDraftModelPage =
|
|
224
|
+
exports.UnifiedDraftModelPage = _chunkYFNVFELPjs.UnifiedDraftModelPage;
|
|
225
225
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UnifiedDraftModelPage
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-NTEW5ZW4.mjs";
|
|
4
4
|
import "../chunk-R5U4TBVJ.mjs";
|
|
5
5
|
import "../chunk-SIER6LRJ.mjs";
|
|
6
6
|
import "../chunk-PHWSYZ7F.mjs";
|
|
@@ -23,11 +23,11 @@ import "../chunk-OOFGQDRU.mjs";
|
|
|
23
23
|
import "../chunk-JLZKEHDF.mjs";
|
|
24
24
|
import "../chunk-J6IXFPOQ.mjs";
|
|
25
25
|
import "../chunk-FX3C2RF7.mjs";
|
|
26
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-QD6QSDVH.mjs";
|
|
27
27
|
import "../chunk-OYJ23TFO.mjs";
|
|
28
|
-
import "../chunk-
|
|
28
|
+
import "../chunk-N26JL24O.mjs";
|
|
29
29
|
import "../chunk-J2RPOBBI.mjs";
|
|
30
|
-
import "../chunk-
|
|
30
|
+
import "../chunk-3SHJQQCA.mjs";
|
|
31
31
|
import "../chunk-P7FCUXDE.mjs";
|
|
32
32
|
import "../chunk-T353CFBE.mjs";
|
|
33
33
|
import "../chunk-OPLL4I62.mjs";
|
|
@@ -96,11 +96,11 @@ import "../chunk-MNXZLMEA.mjs";
|
|
|
96
96
|
import "../chunk-W6OSOOGY.mjs";
|
|
97
97
|
import "../chunk-FXOZSHRV.mjs";
|
|
98
98
|
import "../chunk-37WFJLC5.mjs";
|
|
99
|
-
import "../chunk-
|
|
99
|
+
import "../chunk-BMJTQFRE.mjs";
|
|
100
100
|
import "../chunk-XRPLT7ML.mjs";
|
|
101
101
|
import "../chunk-F44EAWVH.mjs";
|
|
102
102
|
import "../chunk-5GEW7UKP.mjs";
|
|
103
|
-
import "../chunk-
|
|
103
|
+
import "../chunk-DJG7DLCI.mjs";
|
|
104
104
|
import "../chunk-FZJYX3LL.mjs";
|
|
105
105
|
import "../chunk-MMCTPGXO.mjs";
|
|
106
106
|
import "../chunk-KP6KKVAB.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkYFNVFELPjs = require('../chunk-YFNVFELP.js');
|
|
4
4
|
require('../chunk-PSCV7KOT.js');
|
|
5
5
|
require('../chunk-MTZ6C74W.js');
|
|
6
6
|
require('../chunk-2KTRCWZQ.js');
|
|
@@ -23,11 +23,11 @@ require('../chunk-M4VITEXC.js');
|
|
|
23
23
|
require('../chunk-CGW6WT6Y.js');
|
|
24
24
|
require('../chunk-S6PM5UAE.js');
|
|
25
25
|
require('../chunk-4QPSGYYO.js');
|
|
26
|
-
require('../chunk-
|
|
26
|
+
require('../chunk-E4AWPRUB.js');
|
|
27
27
|
require('../chunk-RGRYY65K.js');
|
|
28
|
-
require('../chunk-
|
|
28
|
+
require('../chunk-KYHVFLN4.js');
|
|
29
29
|
require('../chunk-ORBLY3HS.js');
|
|
30
|
-
require('../chunk-
|
|
30
|
+
require('../chunk-HLCT4MJA.js');
|
|
31
31
|
require('../chunk-4DQBBXY3.js');
|
|
32
32
|
require('../chunk-KWHGQGBD.js');
|
|
33
33
|
require('../chunk-MWJWPCBK.js');
|
|
@@ -96,11 +96,11 @@ require('../chunk-TKR4INCJ.js');
|
|
|
96
96
|
require('../chunk-VQKKLUNW.js');
|
|
97
97
|
require('../chunk-PS3SDZMN.js');
|
|
98
98
|
require('../chunk-3GSGCLCO.js');
|
|
99
|
-
require('../chunk-
|
|
99
|
+
require('../chunk-CG7GWF5E.js');
|
|
100
100
|
require('../chunk-JLOAEKEJ.js');
|
|
101
101
|
require('../chunk-CDO3SEIT.js');
|
|
102
102
|
require('../chunk-3O47VPSO.js');
|
|
103
|
-
require('../chunk-
|
|
103
|
+
require('../chunk-TTSTAOIZ.js');
|
|
104
104
|
require('../chunk-NNMIVQMY.js');
|
|
105
105
|
require('../chunk-ZRTTIUKJ.js');
|
|
106
106
|
require('../chunk-R5QHGGXZ.js');
|
|
@@ -221,5 +221,5 @@ require('../chunk-AOUX6XXN.js');
|
|
|
221
221
|
require('../chunk-YQ3JVMVB.js');
|
|
222
222
|
|
|
223
223
|
|
|
224
|
-
exports.UnifiedHistoryPage =
|
|
224
|
+
exports.UnifiedHistoryPage = _chunkYFNVFELPjs.UnifiedHistoryPage;
|
|
225
225
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UnifiedHistoryPage
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-NTEW5ZW4.mjs";
|
|
4
4
|
import "../chunk-R5U4TBVJ.mjs";
|
|
5
5
|
import "../chunk-SIER6LRJ.mjs";
|
|
6
6
|
import "../chunk-PHWSYZ7F.mjs";
|
|
@@ -23,11 +23,11 @@ import "../chunk-OOFGQDRU.mjs";
|
|
|
23
23
|
import "../chunk-JLZKEHDF.mjs";
|
|
24
24
|
import "../chunk-J6IXFPOQ.mjs";
|
|
25
25
|
import "../chunk-FX3C2RF7.mjs";
|
|
26
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-QD6QSDVH.mjs";
|
|
27
27
|
import "../chunk-OYJ23TFO.mjs";
|
|
28
|
-
import "../chunk-
|
|
28
|
+
import "../chunk-N26JL24O.mjs";
|
|
29
29
|
import "../chunk-J2RPOBBI.mjs";
|
|
30
|
-
import "../chunk-
|
|
30
|
+
import "../chunk-3SHJQQCA.mjs";
|
|
31
31
|
import "../chunk-P7FCUXDE.mjs";
|
|
32
32
|
import "../chunk-T353CFBE.mjs";
|
|
33
33
|
import "../chunk-OPLL4I62.mjs";
|
|
@@ -96,11 +96,11 @@ import "../chunk-MNXZLMEA.mjs";
|
|
|
96
96
|
import "../chunk-W6OSOOGY.mjs";
|
|
97
97
|
import "../chunk-FXOZSHRV.mjs";
|
|
98
98
|
import "../chunk-37WFJLC5.mjs";
|
|
99
|
-
import "../chunk-
|
|
99
|
+
import "../chunk-BMJTQFRE.mjs";
|
|
100
100
|
import "../chunk-XRPLT7ML.mjs";
|
|
101
101
|
import "../chunk-F44EAWVH.mjs";
|
|
102
102
|
import "../chunk-5GEW7UKP.mjs";
|
|
103
|
-
import "../chunk-
|
|
103
|
+
import "../chunk-DJG7DLCI.mjs";
|
|
104
104
|
import "../chunk-FZJYX3LL.mjs";
|
|
105
105
|
import "../chunk-MMCTPGXO.mjs";
|
|
106
106
|
import "../chunk-KP6KKVAB.mjs";
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-P7FCUXDE.mjs";
|
|
4
4
|
import {
|
|
5
5
|
ACTIVITY_FILTER_STATUS_OPTIONS
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DJG7DLCI.mjs";
|
|
7
7
|
|
|
8
8
|
// src/components/TypeSelector/TypeSelector.types.ts
|
|
9
9
|
var ATIVIDADE_LABELS = {
|
|
@@ -97,4 +97,4 @@ export {
|
|
|
97
97
|
getTabFromPath,
|
|
98
98
|
createActivityCategoryConfig
|
|
99
99
|
};
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
100
|
+
//# sourceMappingURL=chunk-3SHJQQCA.mjs.map
|
|
@@ -39,19 +39,63 @@ var transformActivityToTableItem = (activity) => {
|
|
|
39
39
|
};
|
|
40
40
|
};
|
|
41
41
|
var extractActivityFilterOptions = (activities) => extractBreakdownFilterOptions(activities);
|
|
42
|
-
var
|
|
42
|
+
var toCsv = (value) => {
|
|
43
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
44
|
+
return value.map(String).join(",");
|
|
45
|
+
}
|
|
46
|
+
return void 0;
|
|
47
|
+
};
|
|
48
|
+
var toSingle = (value) => {
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
return value.length > 0 ? String(value[0]) : void 0;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === "string" && value.length > 0) {
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
return void 0;
|
|
56
|
+
};
|
|
57
|
+
var assignIf = (params, key, value) => {
|
|
58
|
+
if (value) {
|
|
59
|
+
params[key] = value;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var PASSTHROUGH_KEYS = [
|
|
63
|
+
"page",
|
|
64
|
+
"limit",
|
|
65
|
+
"search",
|
|
66
|
+
"startDate",
|
|
67
|
+
"finalDate",
|
|
68
|
+
"sortBy",
|
|
69
|
+
"sortOrder"
|
|
70
|
+
];
|
|
71
|
+
var buildActivityHistoryQueryParams = (filters, activityCategory) => {
|
|
43
72
|
const params = {};
|
|
44
|
-
|
|
45
|
-
|
|
73
|
+
assignIf(params, "type", activityCategory);
|
|
74
|
+
if (!filters) {
|
|
75
|
+
return params;
|
|
46
76
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
params[key] = value;
|
|
52
|
-
}
|
|
77
|
+
for (const key of PASSTHROUGH_KEYS) {
|
|
78
|
+
const value = filters[key];
|
|
79
|
+
if (value !== void 0 && value !== null && value !== "") {
|
|
80
|
+
params[key] = value;
|
|
53
81
|
}
|
|
54
82
|
}
|
|
83
|
+
assignIf(params, "schoolIds", toCsv(filters.school));
|
|
84
|
+
assignIf(params, "classIds", toCsv(filters.class));
|
|
85
|
+
assignIf(params, "schoolYearIds", toCsv(filters.schoolYear));
|
|
86
|
+
if (!params.schoolIds) {
|
|
87
|
+
assignIf(params, "schoolId", toSingle(filters.schoolId));
|
|
88
|
+
}
|
|
89
|
+
if (!params.classIds) {
|
|
90
|
+
assignIf(params, "classId", toSingle(filters.classId));
|
|
91
|
+
}
|
|
92
|
+
assignIf(params, "status", toSingle(filters.status));
|
|
93
|
+
assignIf(
|
|
94
|
+
params,
|
|
95
|
+
"subjectId",
|
|
96
|
+
toSingle(filters.subject) ?? toSingle(filters.subjectId)
|
|
97
|
+
);
|
|
98
|
+
assignIf(params, "creatorType", toSingle(filters.creatorType));
|
|
55
99
|
return params;
|
|
56
100
|
};
|
|
57
101
|
var useActivitiesHistoryImpl = (apiClient, options) => {
|
|
@@ -66,7 +110,10 @@ var useActivitiesHistoryImpl = (apiClient, options) => {
|
|
|
66
110
|
async (filters) => {
|
|
67
111
|
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
68
112
|
try {
|
|
69
|
-
const params =
|
|
113
|
+
const params = buildActivityHistoryQueryParams(
|
|
114
|
+
filters,
|
|
115
|
+
options?.activityCategory
|
|
116
|
+
);
|
|
70
117
|
const response = await apiClient.get(
|
|
71
118
|
"/activities/history",
|
|
72
119
|
{ params }
|
|
@@ -121,7 +168,8 @@ export {
|
|
|
121
168
|
DEFAULT_ACTIVITY_FILTER_OPTIONS,
|
|
122
169
|
transformActivityToTableItem,
|
|
123
170
|
extractActivityFilterOptions,
|
|
171
|
+
buildActivityHistoryQueryParams,
|
|
124
172
|
createUseActivitiesHistory,
|
|
125
173
|
createActivitiesHistoryHook
|
|
126
174
|
};
|
|
127
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-BMJTQFRE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useActivitiesHistory.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\nimport type { BaseApiClient } from '../types/api';\nimport { mapApiStatusToDisplay } from '../types/common';\nimport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityPagination,\n ActivityFilterOption,\n} from '../types/activitiesHistory';\nimport {\n mergeFilterOptions,\n extractBreakdownFilterOptions,\n} from '../utils/filterHelpers';\n\n/**\n * Options for configuring the useActivitiesHistory hook\n */\nexport interface UseActivitiesHistoryOptions {\n /** Filter by activity category (PROVA, ATIVIDADE, etc.) */\n activityCategory?: 'PROVA' | 'ATIVIDADE';\n}\n\n/**\n * API filter options extracted from response\n */\nexport interface ActivityApiFilterOptions {\n schools: ActivityFilterOption[];\n classes: ActivityFilterOption[];\n subjects: ActivityFilterOption[];\n schoolYears: ActivityFilterOption[];\n}\n\n/**\n * Hook state interface\n */\nexport interface UseActivitiesHistoryState {\n activities: ActivityTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n apiFilterOptions: ActivityApiFilterOptions;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivitiesHistoryReturn extends UseActivitiesHistoryState {\n fetchActivities: (filters?: ActivityHistoryFilters) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_ACTIVITIES_PAGINATION: ActivityPagination = {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n};\n\n/**\n * Default API filter options\n */\nexport const DEFAULT_ACTIVITY_FILTER_OPTIONS: ActivityApiFilterOptions = {\n schools: [],\n classes: [],\n subjects: [],\n schoolYears: [],\n};\n\n/**\n * Transform API response to table item format\n * @param activity - Activity from API response\n * @returns Formatted activity for table display\n */\nexport const transformActivityToTableItem = (\n activity: ActivityHistoryResponse\n): ActivityTableItem => {\n const firstBreakdown = activity.breakdown?.[0];\n return {\n id: activity.id,\n startDate: activity.startDate\n ? dayjs(activity.startDate).format('DD/MM')\n : '-',\n deadline: activity.finalDate\n ? dayjs(activity.finalDate).format('DD/MM')\n : '-',\n creator: activity.creator?.name?.trim() ? activity.creator.name : '-',\n creatorId: activity.creator?.id ?? null,\n title: activity.title,\n school: firstBreakdown?.school?.name ?? '-',\n year: firstBreakdown?.schoolYear?.name ?? '-',\n subject: activity.subject?.name ?? '-',\n class: firstBreakdown?.class?.name ?? '-',\n status: mapApiStatusToDisplay(activity.status),\n completionPercentage: activity.completionPercentage,\n };\n};\n\n/**\n * Extract unique filter options from activities API response.\n * Delegates to the shared extractBreakdownFilterOptions helper.\n */\nexport const extractActivityFilterOptions = (\n activities: ActivityHistoryResponse[]\n): ActivityApiFilterOptions => extractBreakdownFilterOptions(activities);\n\n/**\n * Join an array of selected ids into the backend's comma-separated convention\n * (e.g. `schoolIds=a,b,c`). Returns undefined for empty / non-array input so the\n * query param is omitted entirely.\n */\nconst toCsv = (value: unknown): string | undefined => {\n if (Array.isArray(value) && value.length > 0) {\n return value.map(String).join(',');\n }\n return undefined;\n};\n\n/**\n * Collapse a single-select filter (emitted as an array by TableProvider) to its\n * first value. Also tolerates a bare string. Returns undefined when empty.\n */\nconst toSingle = (value: unknown): string | undefined => {\n if (Array.isArray(value)) {\n return value.length > 0 ? String(value[0]) : undefined;\n }\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n return undefined;\n};\n\n/**\n * Assign a resolved string value onto the params object only when it is present.\n * Keeps the builder free of repetitive `if (value) params[key] = value` blocks.\n */\nconst assignIf = (\n params: Record<string, unknown>,\n key: string,\n value: string | undefined\n): void => {\n if (value) {\n params[key] = value;\n }\n};\n\n/**\n * Raw scalar keys forwarded to the backend untouched (pagination, text search,\n * date range and sorting). Copied verbatim when present and non-empty.\n */\nconst PASSTHROUGH_KEYS = [\n 'page',\n 'limit',\n 'search',\n 'startDate',\n 'finalDate',\n 'sortBy',\n 'sortOrder',\n] as const;\n\n/**\n * Build the `/activities/history` query params from the raw TableProvider filter\n * keys. TableProvider emits UI-category keys (`subject`, `school`, `class`,\n * `schoolYear`, `status`, `creatorType`) as arrays; the backend expects a\n * different, mostly single-value contract. This adapter renames each key and\n * collapses/serializes to what the backend actually reads. Mirrors\n * `buildFiltersFromParams` in RecommendedLessonsHistory.\n *\n * @param filters - Raw table params (arrays under UI keys) plus page/limit/search/sort\n * @param activityCategory - Optional value forwarded as the `type` param\n */\nexport const buildActivityHistoryQueryParams = (\n filters?: Record<string, unknown>,\n activityCategory?: string\n): Record<string, unknown> => {\n const params: Record<string, unknown> = {};\n assignIf(params, 'type', activityCategory);\n\n if (!filters) {\n return params;\n }\n\n for (const key of PASSTHROUGH_KEYS) {\n const value = filters[key];\n if (value !== undefined && value !== null && value !== '') {\n params[key] = value;\n }\n }\n\n // Multi-select filters serialized as comma-separated ids. School and class each\n // fall back to their legacy singular key when the raw multi-select key is absent.\n assignIf(params, 'schoolIds', toCsv(filters.school));\n assignIf(params, 'classIds', toCsv(filters.class));\n assignIf(params, 'schoolYearIds', toCsv(filters.schoolYear));\n if (!params.schoolIds) {\n assignIf(params, 'schoolId', toSingle(filters.schoolId));\n }\n if (!params.classIds) {\n assignIf(params, 'classId', toSingle(filters.classId));\n }\n\n // Single-select filters (subject also honors the legacy singular key).\n assignIf(params, 'status', toSingle(filters.status));\n assignIf(\n params,\n 'subjectId',\n toSingle(filters.subject) ?? toSingle(filters.subjectId)\n );\n assignIf(params, 'creatorType', toSingle(filters.creatorType));\n\n return params;\n};\n\n/**\n * Hook implementation\n */\nconst useActivitiesHistoryImpl = (\n apiClient: BaseApiClient,\n options?: UseActivitiesHistoryOptions\n): UseActivitiesHistoryReturn => {\n const [state, setState] = useState<UseActivitiesHistoryState>({\n activities: [],\n loading: false,\n error: null,\n pagination: DEFAULT_ACTIVITIES_PAGINATION,\n apiFilterOptions: DEFAULT_ACTIVITY_FILTER_OPTIONS,\n });\n\n const fetchActivities = useCallback(\n async (filters?: ActivityHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const params = buildActivityHistoryQueryParams(\n filters as Record<string, unknown>,\n options?.activityCategory\n );\n const response = await apiClient.get<ActivitiesHistoryApiResponse>(\n '/activities/history',\n { params }\n );\n\n const { data } = response.data;\n\n const tableItems = data.activities.map(transformActivityToTableItem);\n const extracted = extractActivityFilterOptions(data.activities);\n\n setState((prev) => ({\n activities: tableItems,\n loading: false,\n error: null,\n pagination: data.pagination,\n apiFilterOptions: {\n schools: mergeFilterOptions(\n prev.apiFilterOptions.schools,\n extracted.schools\n ),\n classes: mergeFilterOptions(\n prev.apiFilterOptions.classes,\n extracted.classes\n ),\n subjects: mergeFilterOptions(\n prev.apiFilterOptions.subjects,\n extracted.subjects\n ),\n schoolYears: mergeFilterOptions(\n prev.apiFilterOptions.schoolYears,\n extracted.schoolYears\n ),\n },\n }));\n } catch (error) {\n console.error('Erro ao carregar histórico:', error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: 'Erro ao carregar histórico de atividades',\n }));\n }\n },\n [apiClient, options?.activityCategory]\n );\n\n return { ...state, fetchActivities };\n};\n\n/**\n * Factory function to create useActivitiesHistory hook\n *\n * @param apiClient - API client instance (axios, fetch wrapper, etc.)\n * @param options - Hook configuration options\n * @returns Hook for managing activities history\n *\n * @example\n * ```tsx\n * import { createUseActivitiesHistory } from 'analytica-frontend-lib';\n * import api from '@/services/apiService';\n *\n * const useActivitiesHistory = createUseActivitiesHistory(api, { activityCategory: 'ATIVIDADE' });\n *\n * // In your component\n * const { activities, loading, fetchActivities, apiFilterOptions } = useActivitiesHistory();\n * ```\n */\nexport const createUseActivitiesHistory = (\n apiClient: BaseApiClient,\n options?: UseActivitiesHistoryOptions\n) => {\n return (): UseActivitiesHistoryReturn =>\n useActivitiesHistoryImpl(apiClient, options);\n};\n\n/**\n * Alias for createUseActivitiesHistory\n */\nexport const createActivitiesHistoryHook = createUseActivitiesHistory;\n"],"mappings":"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","names":[]}
|
|
@@ -39,19 +39,63 @@ var transformActivityToTableItem = (activity) => {
|
|
|
39
39
|
};
|
|
40
40
|
};
|
|
41
41
|
var extractActivityFilterOptions = (activities) => _chunkJLOAEKEJjs.extractBreakdownFilterOptions.call(void 0, activities);
|
|
42
|
-
var
|
|
42
|
+
var toCsv = (value) => {
|
|
43
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
44
|
+
return value.map(String).join(",");
|
|
45
|
+
}
|
|
46
|
+
return void 0;
|
|
47
|
+
};
|
|
48
|
+
var toSingle = (value) => {
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
return value.length > 0 ? String(value[0]) : void 0;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === "string" && value.length > 0) {
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
return void 0;
|
|
56
|
+
};
|
|
57
|
+
var assignIf = (params, key, value) => {
|
|
58
|
+
if (value) {
|
|
59
|
+
params[key] = value;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var PASSTHROUGH_KEYS = [
|
|
63
|
+
"page",
|
|
64
|
+
"limit",
|
|
65
|
+
"search",
|
|
66
|
+
"startDate",
|
|
67
|
+
"finalDate",
|
|
68
|
+
"sortBy",
|
|
69
|
+
"sortOrder"
|
|
70
|
+
];
|
|
71
|
+
var buildActivityHistoryQueryParams = (filters, activityCategory) => {
|
|
43
72
|
const params = {};
|
|
44
|
-
|
|
45
|
-
|
|
73
|
+
assignIf(params, "type", activityCategory);
|
|
74
|
+
if (!filters) {
|
|
75
|
+
return params;
|
|
46
76
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
params[key] = value;
|
|
52
|
-
}
|
|
77
|
+
for (const key of PASSTHROUGH_KEYS) {
|
|
78
|
+
const value = filters[key];
|
|
79
|
+
if (value !== void 0 && value !== null && value !== "") {
|
|
80
|
+
params[key] = value;
|
|
53
81
|
}
|
|
54
82
|
}
|
|
83
|
+
assignIf(params, "schoolIds", toCsv(filters.school));
|
|
84
|
+
assignIf(params, "classIds", toCsv(filters.class));
|
|
85
|
+
assignIf(params, "schoolYearIds", toCsv(filters.schoolYear));
|
|
86
|
+
if (!params.schoolIds) {
|
|
87
|
+
assignIf(params, "schoolId", toSingle(filters.schoolId));
|
|
88
|
+
}
|
|
89
|
+
if (!params.classIds) {
|
|
90
|
+
assignIf(params, "classId", toSingle(filters.classId));
|
|
91
|
+
}
|
|
92
|
+
assignIf(params, "status", toSingle(filters.status));
|
|
93
|
+
assignIf(
|
|
94
|
+
params,
|
|
95
|
+
"subjectId",
|
|
96
|
+
_nullishCoalesce(toSingle(filters.subject), () => ( toSingle(filters.subjectId)))
|
|
97
|
+
);
|
|
98
|
+
assignIf(params, "creatorType", toSingle(filters.creatorType));
|
|
55
99
|
return params;
|
|
56
100
|
};
|
|
57
101
|
var useActivitiesHistoryImpl = (apiClient, options) => {
|
|
@@ -66,7 +110,10 @@ var useActivitiesHistoryImpl = (apiClient, options) => {
|
|
|
66
110
|
async (filters) => {
|
|
67
111
|
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
68
112
|
try {
|
|
69
|
-
const params =
|
|
113
|
+
const params = buildActivityHistoryQueryParams(
|
|
114
|
+
filters,
|
|
115
|
+
_optionalChain([options, 'optionalAccess', _17 => _17.activityCategory])
|
|
116
|
+
);
|
|
70
117
|
const response = await apiClient.get(
|
|
71
118
|
"/activities/history",
|
|
72
119
|
{ params }
|
|
@@ -123,5 +170,6 @@ var createActivitiesHistoryHook = createUseActivitiesHistory;
|
|
|
123
170
|
|
|
124
171
|
|
|
125
172
|
|
|
126
|
-
|
|
127
|
-
|
|
173
|
+
|
|
174
|
+
exports.DEFAULT_ACTIVITIES_PAGINATION = DEFAULT_ACTIVITIES_PAGINATION; exports.DEFAULT_ACTIVITY_FILTER_OPTIONS = DEFAULT_ACTIVITY_FILTER_OPTIONS; exports.transformActivityToTableItem = transformActivityToTableItem; exports.extractActivityFilterOptions = extractActivityFilterOptions; exports.buildActivityHistoryQueryParams = buildActivityHistoryQueryParams; exports.createUseActivitiesHistory = createUseActivitiesHistory; exports.createActivitiesHistoryHook = createActivitiesHistoryHook;
|
|
175
|
+
//# sourceMappingURL=chunk-CG7GWF5E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-CG7GWF5E.js","../src/hooks/useActivitiesHistory.ts"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-CG7GWF5E.js","sourcesContent":[null,"import { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\nimport type { BaseApiClient } from '../types/api';\nimport { mapApiStatusToDisplay } from '../types/common';\nimport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityPagination,\n ActivityFilterOption,\n} from '../types/activitiesHistory';\nimport {\n mergeFilterOptions,\n extractBreakdownFilterOptions,\n} from '../utils/filterHelpers';\n\n/**\n * Options for configuring the useActivitiesHistory hook\n */\nexport interface UseActivitiesHistoryOptions {\n /** Filter by activity category (PROVA, ATIVIDADE, etc.) */\n activityCategory?: 'PROVA' | 'ATIVIDADE';\n}\n\n/**\n * API filter options extracted from response\n */\nexport interface ActivityApiFilterOptions {\n schools: ActivityFilterOption[];\n classes: ActivityFilterOption[];\n subjects: ActivityFilterOption[];\n schoolYears: ActivityFilterOption[];\n}\n\n/**\n * Hook state interface\n */\nexport interface UseActivitiesHistoryState {\n activities: ActivityTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n apiFilterOptions: ActivityApiFilterOptions;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivitiesHistoryReturn extends UseActivitiesHistoryState {\n fetchActivities: (filters?: ActivityHistoryFilters) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_ACTIVITIES_PAGINATION: ActivityPagination = {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n};\n\n/**\n * Default API filter options\n */\nexport const DEFAULT_ACTIVITY_FILTER_OPTIONS: ActivityApiFilterOptions = {\n schools: [],\n classes: [],\n subjects: [],\n schoolYears: [],\n};\n\n/**\n * Transform API response to table item format\n * @param activity - Activity from API response\n * @returns Formatted activity for table display\n */\nexport const transformActivityToTableItem = (\n activity: ActivityHistoryResponse\n): ActivityTableItem => {\n const firstBreakdown = activity.breakdown?.[0];\n return {\n id: activity.id,\n startDate: activity.startDate\n ? dayjs(activity.startDate).format('DD/MM')\n : '-',\n deadline: activity.finalDate\n ? dayjs(activity.finalDate).format('DD/MM')\n : '-',\n creator: activity.creator?.name?.trim() ? activity.creator.name : '-',\n creatorId: activity.creator?.id ?? null,\n title: activity.title,\n school: firstBreakdown?.school?.name ?? '-',\n year: firstBreakdown?.schoolYear?.name ?? '-',\n subject: activity.subject?.name ?? '-',\n class: firstBreakdown?.class?.name ?? '-',\n status: mapApiStatusToDisplay(activity.status),\n completionPercentage: activity.completionPercentage,\n };\n};\n\n/**\n * Extract unique filter options from activities API response.\n * Delegates to the shared extractBreakdownFilterOptions helper.\n */\nexport const extractActivityFilterOptions = (\n activities: ActivityHistoryResponse[]\n): ActivityApiFilterOptions => extractBreakdownFilterOptions(activities);\n\n/**\n * Join an array of selected ids into the backend's comma-separated convention\n * (e.g. `schoolIds=a,b,c`). Returns undefined for empty / non-array input so the\n * query param is omitted entirely.\n */\nconst toCsv = (value: unknown): string | undefined => {\n if (Array.isArray(value) && value.length > 0) {\n return value.map(String).join(',');\n }\n return undefined;\n};\n\n/**\n * Collapse a single-select filter (emitted as an array by TableProvider) to its\n * first value. Also tolerates a bare string. Returns undefined when empty.\n */\nconst toSingle = (value: unknown): string | undefined => {\n if (Array.isArray(value)) {\n return value.length > 0 ? String(value[0]) : undefined;\n }\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n return undefined;\n};\n\n/**\n * Assign a resolved string value onto the params object only when it is present.\n * Keeps the builder free of repetitive `if (value) params[key] = value` blocks.\n */\nconst assignIf = (\n params: Record<string, unknown>,\n key: string,\n value: string | undefined\n): void => {\n if (value) {\n params[key] = value;\n }\n};\n\n/**\n * Raw scalar keys forwarded to the backend untouched (pagination, text search,\n * date range and sorting). Copied verbatim when present and non-empty.\n */\nconst PASSTHROUGH_KEYS = [\n 'page',\n 'limit',\n 'search',\n 'startDate',\n 'finalDate',\n 'sortBy',\n 'sortOrder',\n] as const;\n\n/**\n * Build the `/activities/history` query params from the raw TableProvider filter\n * keys. TableProvider emits UI-category keys (`subject`, `school`, `class`,\n * `schoolYear`, `status`, `creatorType`) as arrays; the backend expects a\n * different, mostly single-value contract. This adapter renames each key and\n * collapses/serializes to what the backend actually reads. Mirrors\n * `buildFiltersFromParams` in RecommendedLessonsHistory.\n *\n * @param filters - Raw table params (arrays under UI keys) plus page/limit/search/sort\n * @param activityCategory - Optional value forwarded as the `type` param\n */\nexport const buildActivityHistoryQueryParams = (\n filters?: Record<string, unknown>,\n activityCategory?: string\n): Record<string, unknown> => {\n const params: Record<string, unknown> = {};\n assignIf(params, 'type', activityCategory);\n\n if (!filters) {\n return params;\n }\n\n for (const key of PASSTHROUGH_KEYS) {\n const value = filters[key];\n if (value !== undefined && value !== null && value !== '') {\n params[key] = value;\n }\n }\n\n // Multi-select filters serialized as comma-separated ids. School and class each\n // fall back to their legacy singular key when the raw multi-select key is absent.\n assignIf(params, 'schoolIds', toCsv(filters.school));\n assignIf(params, 'classIds', toCsv(filters.class));\n assignIf(params, 'schoolYearIds', toCsv(filters.schoolYear));\n if (!params.schoolIds) {\n assignIf(params, 'schoolId', toSingle(filters.schoolId));\n }\n if (!params.classIds) {\n assignIf(params, 'classId', toSingle(filters.classId));\n }\n\n // Single-select filters (subject also honors the legacy singular key).\n assignIf(params, 'status', toSingle(filters.status));\n assignIf(\n params,\n 'subjectId',\n toSingle(filters.subject) ?? toSingle(filters.subjectId)\n );\n assignIf(params, 'creatorType', toSingle(filters.creatorType));\n\n return params;\n};\n\n/**\n * Hook implementation\n */\nconst useActivitiesHistoryImpl = (\n apiClient: BaseApiClient,\n options?: UseActivitiesHistoryOptions\n): UseActivitiesHistoryReturn => {\n const [state, setState] = useState<UseActivitiesHistoryState>({\n activities: [],\n loading: false,\n error: null,\n pagination: DEFAULT_ACTIVITIES_PAGINATION,\n apiFilterOptions: DEFAULT_ACTIVITY_FILTER_OPTIONS,\n });\n\n const fetchActivities = useCallback(\n async (filters?: ActivityHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const params = buildActivityHistoryQueryParams(\n filters as Record<string, unknown>,\n options?.activityCategory\n );\n const response = await apiClient.get<ActivitiesHistoryApiResponse>(\n '/activities/history',\n { params }\n );\n\n const { data } = response.data;\n\n const tableItems = data.activities.map(transformActivityToTableItem);\n const extracted = extractActivityFilterOptions(data.activities);\n\n setState((prev) => ({\n activities: tableItems,\n loading: false,\n error: null,\n pagination: data.pagination,\n apiFilterOptions: {\n schools: mergeFilterOptions(\n prev.apiFilterOptions.schools,\n extracted.schools\n ),\n classes: mergeFilterOptions(\n prev.apiFilterOptions.classes,\n extracted.classes\n ),\n subjects: mergeFilterOptions(\n prev.apiFilterOptions.subjects,\n extracted.subjects\n ),\n schoolYears: mergeFilterOptions(\n prev.apiFilterOptions.schoolYears,\n extracted.schoolYears\n ),\n },\n }));\n } catch (error) {\n console.error('Erro ao carregar histórico:', error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: 'Erro ao carregar histórico de atividades',\n }));\n }\n },\n [apiClient, options?.activityCategory]\n );\n\n return { ...state, fetchActivities };\n};\n\n/**\n * Factory function to create useActivitiesHistory hook\n *\n * @param apiClient - API client instance (axios, fetch wrapper, etc.)\n * @param options - Hook configuration options\n * @returns Hook for managing activities history\n *\n * @example\n * ```tsx\n * import { createUseActivitiesHistory } from 'analytica-frontend-lib';\n * import api from '@/services/apiService';\n *\n * const useActivitiesHistory = createUseActivitiesHistory(api, { activityCategory: 'ATIVIDADE' });\n *\n * // In your component\n * const { activities, loading, fetchActivities, apiFilterOptions } = useActivitiesHistory();\n * ```\n */\nexport const createUseActivitiesHistory = (\n apiClient: BaseApiClient,\n options?: UseActivitiesHistoryOptions\n) => {\n return (): UseActivitiesHistoryReturn =>\n useActivitiesHistoryImpl(apiClient, options);\n};\n\n/**\n * Alias for createUseActivitiesHistory\n */\nexport const createActivitiesHistoryHook = createUseActivitiesHistory;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/activitiesHistory.ts"],"sourcesContent":["/**\n * Activities History Type Definitions\n * Types and interfaces for activities history and models functionality\n * Based on /activities/history and /activity-drafts endpoints\n */\n\nimport { ActivityType } from '../components/ActivityCreate/ActivityCreate.types';\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n mapApiStatusToDisplay,\n} from './common';\n\n/**\n * Activity status from backend API /activities/history\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as ActivityApiStatus } from './common';\n\n/**\n * Activity status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as ActivityDisplayStatus } from './common';\n\n/**\n * Badge action types for activity status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as ActivityBadgeActionType } from './common';\n\n/**\n * Activity draft type enum (matches backend ACTIVITY_DRAFT_TYPE)\n */\nexport enum ActivityDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Generic entity reference with id and name\n */\ntype EntityRef = { id: string; name: string };\n\n/**\n * Subject object from backend API response\n */\nexport interface ActivitySubject extends EntityRef {\n areaKnowledgeId: string;\n}\n\n/**\n * Breakdown item per school/class for an activity response\n */\nexport interface ActivityBreakdownItem {\n school?: EntityRef | null;\n schoolYear?: EntityRef | null;\n class?: EntityRef | null;\n totalStudents: number;\n answeredStudents: number;\n completionPercentage: number;\n}\n\n/**\n * Activity history response from backend API /activities/history\n */\nexport interface ActivityHistoryResponse {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n status: GenericApiStatus;\n completionPercentage: number;\n subject: ActivitySubject | null;\n creator: EntityRef | null;\n totalStudents?: number;\n answeredStudents?: number;\n breakdown?: ActivityBreakdownItem[];\n}\n\n/**\n * Activity table item interface for activities list table\n */\nexport interface ActivityTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n creator: string;\n /** Creator user id, used to gate owner-only actions (e.g. delete) */\n creatorId?: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Pagination info from API\n */\nexport interface ActivityPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Activities history API complete response\n */\nexport interface ActivitiesHistoryApiResponse {\n message: string;\n data: {\n activities: ActivityHistoryResponse[];\n pagination: ActivityPagination;\n };\n}\n\n/**\n * Activity history filters for API query parameters\n */\nexport interface ActivityHistoryFilters {\n page?: number;\n limit?: number;\n type?:\n | 'ATIVIDADE'\n | 'PROVA'\n | 'SIMULADO'\n | 'QUESTIONARIO'\n | 'AULA_RECOMENDADA';\n search?: string;\n sortBy?: 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n\n // Raw TableProvider filter keys (arrays of selected ids/values).\n // Remapped to the backend contract by buildActivityHistoryQueryParams.\n status?: string[] | GenericApiStatus;\n subject?: string[];\n school?: string[];\n class?: string[];\n schoolYear?: string[];\n creatorType?: string[];\n\n // Legacy single-value fields, consumed by buildActivityHistoryQueryParams\n // as fallbacks when the raw multi-select keys above are absent.\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n classId?: string;\n}\n\n/**\n * Activity draft filters object from backend\n */\nexport interface ActivityDraftFilters {\n questionTypes?: string[];\n questionBanks?: string[];\n subjects?: string[];\n topics?: string[];\n subtopics?: string[];\n contents?: string[];\n}\n\n/**\n * Subject object with icon and color information\n */\nexport interface SubjectData {\n id: string;\n name: string;\n icon: string;\n color: string;\n}\n\n/**\n * Activity model response from backend API (/activity-drafts)\n */\nexport interface ActivityModelResponse {\n id: string;\n type: ActivityDraftType;\n title: string | null;\n creatorUserInstitutionId: string | null;\n subjectId: string | null;\n subject?: SubjectData | null;\n filters: ActivityDraftFilters | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Activity model table item for display\n */\nexport interface ActivityModelTableItem extends Record<string, unknown> {\n id: string;\n type: ActivityType;\n title: string;\n savedAt: string;\n subject: SubjectData | null;\n subjectId: string | null;\n}\n\n/**\n * Activity models API response\n */\nexport interface ActivityModelsApiResponse {\n message: string;\n data: {\n activityDrafts: ActivityModelResponse[];\n total: number;\n };\n}\n\n/**\n * Activity model filters for API query\n */\nexport interface ActivityModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: ActivityDraftType;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface ActivityFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface ActivityUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on activity display status\n * @param status - Activity display status\n * @returns Badge action type for styling\n */\nexport const getActivityStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Activity status options for filter\n */\nexport const ACTIVITY_FILTER_STATUS_OPTIONS: ActivityFilterOption[] = [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n];\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapActivityStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => mapApiStatusToDisplay(apiStatus);\n"],"mappings":";;;;;;AAoCO,IAAK,oBAAL,kBAAKA,uBAAL;AACL,EAAAA,mBAAA,YAAS;AACT,EAAAA,mBAAA,cAAW;AAFD,SAAAA;AAAA,GAAA;AAwNL,IAAM,+BAA+B,CAC1C,WACoB,qBAAqB,MAAM;AAK1C,IAAM,iCAAyD;AAAA,EACpE,EAAE,+BAA+B,MAAM,WAAW;AAAA,EAClD,EAAE,6BAA8B,MAAM,UAAU;AAAA,EAChD,EAAE,iCAAgC,MAAM,eAAY;AACtD;AAOO,IAAM,6BAA6B,CACxC,cACyB,sBAAsB,SAAS;","names":["ActivityDraftType"]}
|
|
@@ -41,7 +41,7 @@ var TREND_CONFIG = {
|
|
|
41
41
|
}
|
|
42
42
|
};
|
|
43
43
|
var TimeCard = ({ data, className, ...props }) => {
|
|
44
|
-
const { label, value, icon, trendValue, trendDirection } = data;
|
|
44
|
+
const { label, value, icon, trendValue, trendDirection, subtitle } = data;
|
|
45
45
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
46
46
|
"div",
|
|
47
47
|
{
|
|
@@ -72,6 +72,15 @@ var TimeCard = ({ data, className, ...props }) => {
|
|
|
72
72
|
children: value
|
|
73
73
|
}
|
|
74
74
|
),
|
|
75
|
+
subtitle && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
76
|
+
_chunk2LG54JYKjs.Text_default,
|
|
77
|
+
{
|
|
78
|
+
size: "sm",
|
|
79
|
+
className: "text-text-600 leading-[100%]",
|
|
80
|
+
"data-testid": `subtitle-${data.id}`,
|
|
81
|
+
children: subtitle
|
|
82
|
+
}
|
|
83
|
+
),
|
|
75
84
|
trendValue && trendDirection && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
76
85
|
"div",
|
|
77
86
|
{
|
|
@@ -132,4 +141,4 @@ var TimeReport_default = TimeReport;
|
|
|
132
141
|
|
|
133
142
|
|
|
134
143
|
exports.formatHoursToTime = formatHoursToTime; exports.getTrendDirection = getTrendDirection; exports.formatVariation = formatVariation; exports.TimeCard = TimeCard; exports.TimeReport = TimeReport; exports.TimeReport_default = TimeReport_default;
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
144
|
+
//# sourceMappingURL=chunk-E4AWPRUB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-E4AWPRUB.js","../src/components/TimeReport/TimeReport.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACTA,iEAA4B;AAC5B,qEAA8B;AAC9B,4EAAkB;AAClB,qGAAqB;AA8Kf,+CAAA;AAvKN,eAAA,CAAM,MAAA,CAAO,kBAAQ,CAAA;AA4Cd,IAAM,kBAAA,EAAoB,CAAC,KAAA,EAAA,GAA0B;AAC1D,EAAA,MAAM,EAAA,EAAI,eAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AACvC,EAAA,MAAM,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAChC,EAAA,MAAM,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,CAAA;AACtB,EAAA,OAAO,CAAA,EAAA;AACT;AAKa;AAGP,EAAA;AACG,EAAA;AACT;AAKa;AAGP,EAAA;AACE,EAAA;AACC,EAAA;AACT;AAsEM;AACA,EAAA;AACF,IAAA;AACM,IAAA;AACR,EAAA;AACM,EAAA;AACJ,IAAA;AACM,IAAA;AACR,EAAA;AACF;AAKa;AACH,EAAA;AAGN,EAAA;AAAC,IAAA;AAAA,IAAA;AACC,MAAA;AACE,QAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA;AACI,MAAA;AAGJ,MAAA;AAAA,wBAAA;AACE,0BAAA;AACA,0BAAA;AAAA,YAAA;AAAC,YAAA;AAAA,cAAA;AACQ,cAAA;AACG,cAAA;AAET,YAAA;AACH,UAAA;AAAA,QAAA;AAIF,wBAAA;AAAC,UAAA;AAAA,UAAA;AAAA,YAAA;AACM,YAAA;AACE,YAAA;AACG,YAAA;AAET,UAAA;AACH,QAAA;AAGC,QAAA;AACE,UAAA;AAAA,UAAA;AAAA,YAAA;AACM,YAAA;AACK,YAAA;AACsB,YAAA;AAE/B,UAAA;AACH,QAAA;AAID,QAAA;AACE,UAAA;AAAA,UAAA;AAAA,YAAA;AACY,cAAA;AACT,cAAA;AAC6B,YAAA;AAC/B,YAAA;AAC6B,YAAA;AAE3B,cAAA;AACA,gBAAA;AACA,gBAAA;AAA0C,cAAA;AACzC,8BAAA;AACH,gBAAA;AAAC,gBAAA;AAAA,kBAAA;AACM,kBAAA;AACE,kBAAA;AACD,kBAAA;AACI,kBAAA;AAET,gBAAA;AAAA,cAAA;AACH,YAAA;AAAA,UAAA;AACF,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAEJ;AAyBa;AACX,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACG,EAAA;AAEH;AAAC,EAAA;AAAA,EAAA;AACC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACI,IAAA;AAAA,EAAA;AACN;AAGK;ADhJG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-E4AWPRUB.js","sourcesContent":[null,"import { type HTMLAttributes, type ReactNode } from 'react';\nimport { TrendUpIcon } from '@phosphor-icons/react/dist/csr/TrendUp';\nimport { TrendDownIcon } from '@phosphor-icons/react/dist/csr/TrendDown';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { PROFILE_ROLES } from '../../types/chat';\nimport type { StudentsHighlightPeriod } from '../../hooks/useStudentsHighlight';\nimport { ReportLayout } from '../shared/ReportLayout';\n\ndayjs.extend(duration);\n\n/**\n * API types - reusing existing enums/types from the project\n */\nexport { PROFILE_ROLES } from '../../types/chat';\nexport type { StudentsHighlightPeriod as TimeReportPeriod } from '../../hooks/useStudentsHighlight';\n\nexport interface TimeReportRequest {\n period: StudentsHighlightPeriod;\n profile?: PROFILE_ROLES;\n school_group_ids?: string[];\n school_ids?: string[];\n all_school_groups?: boolean;\n}\n\nexport interface TimeMetric {\n hours: number;\n variation_percent: number | null;\n}\n\nexport interface CountMetric {\n count: number;\n variation_percent: number | null;\n}\n\nexport interface TimeReportData {\n total_platform_time: TimeMetric;\n activity_time: TimeMetric;\n exam_simulation_time?: TimeMetric;\n content_time?: TimeMetric;\n questionnaire_time?: TimeMetric;\n recommended_classes_time: TimeMetric;\n total_access_count?: CountMetric;\n}\n\nexport interface TimeReportResponse {\n message: string;\n data: TimeReportData;\n}\n\n/**\n * Format decimal hours to \"Xh Ymin\" display string\n */\nexport const formatHoursToTime = (hours: number): string => {\n const d = dayjs.duration(hours, 'hours');\n const h = Math.floor(d.asHours());\n const min = d.minutes();\n return `${h}h ${min}min`;\n};\n\n/**\n * Get trend direction from variation percentage\n */\nexport const getTrendDirection = (\n variationPercent: number | null\n): TimeCardTrend | undefined => {\n if (variationPercent === null) return undefined;\n return variationPercent >= 0 ? 'up' : 'down';\n};\n\n/**\n * Format variation percentage to display string (e.g., \"+12.3%\", \"-5.2%\")\n */\nexport const formatVariation = (\n variationPercent: number | null\n): string | undefined => {\n if (variationPercent === null) return undefined;\n const sign = variationPercent >= 0 ? '+' : '';\n return `${sign}${variationPercent}%`;\n};\n\n/**\n * Trend direction for time card indicators\n */\nexport type TimeCardTrend = 'up' | 'down';\n\n/**\n * Data for a single time card\n */\nexport interface TimeCardData {\n /** Unique identifier */\n id: string;\n /** Uppercase label (e.g., \"TEMPO NA PLATAFORMA\") */\n label: string;\n /** Formatted time value (e.g., \"12h 20min\") */\n value: string;\n /** Icon element for the card */\n icon: ReactNode;\n /** Trend percentage string (e.g., \"+10%\", \"-5%\") */\n trendValue?: string;\n /** Trend direction - determines color */\n trendDirection?: TimeCardTrend;\n /**\n * Plain gray line under the value (e.g., \"1 município • 134 escolas\"), for\n * cards whose context is a breakdown rather than a trend. Rendered alongside\n * the trend when both are present.\n */\n subtitle?: string;\n}\n\n/**\n * Tab configuration for the TimeReport component\n */\nexport interface TimeReportTab {\n /** Unique value identifying this tab */\n value: string;\n /** Display label */\n label: string;\n /** Icon element for the tab header */\n icon?: ReactNode;\n /** Cards to display when this tab is active */\n cards: TimeCardData[];\n}\n\n/**\n * Props for the TimeCard component\n */\nexport interface TimeCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Card data */\n data: TimeCardData;\n}\n\n/**\n * Props for the TimeReport component\n */\nexport interface TimeReportProps extends HTMLAttributes<HTMLDivElement> {\n /** Tab configurations with associated card data */\n tabs: TimeReportTab[];\n /** Default active tab value */\n defaultTab?: string;\n /** Controlled active tab value */\n activeTab?: string;\n /** Callback when active tab changes */\n onTabChange?: (value: string) => void;\n}\n\n/**\n * Trend styling configuration\n */\nconst TREND_CONFIG = {\n up: {\n colorClass: 'text-success-500',\n Icon: TrendUpIcon,\n },\n down: {\n colorClass: 'text-error-500',\n Icon: TrendDownIcon,\n },\n} as const;\n\n/**\n * TimeCard component - displays a single time statistic\n */\nexport const TimeCard = ({ data, className, ...props }: TimeCardProps) => {\n const { label, value, icon, trendValue, trendDirection, subtitle } = data;\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 p-5 bg-background border border-border-50 rounded-xl',\n className\n )}\n data-testid={`time-card-${data.id}`}\n {...props}\n >\n {/* Icon + Label */}\n <div className=\"flex flex-row items-center gap-2\">\n <span className=\"text-text-600 [&>svg]:w-4 [&>svg]:h-4\">{icon}</span>\n <Text\n weight=\"bold\"\n className=\"text-text-600 uppercase text-[8px] leading-[100%]\"\n >\n {label}\n </Text>\n </div>\n\n {/* Time value */}\n <Text\n size=\"2xl\"\n weight=\"bold\"\n className=\"text-primary-800 leading-[100%] tracking-[0.2px]\"\n >\n {value}\n </Text>\n\n {/* Context line (e.g., \"1 município • 134 escolas\") */}\n {subtitle && (\n <Text\n size=\"sm\"\n className=\"text-text-600 leading-[100%]\"\n data-testid={`subtitle-${data.id}`}\n >\n {subtitle}\n </Text>\n )}\n\n {/* Trend indicator */}\n {trendValue && trendDirection && (\n <div\n className={cn(\n 'flex flex-row items-center gap-1',\n TREND_CONFIG[trendDirection].colorClass\n )}\n data-testid={`trend-${data.id}`}\n >\n {(() => {\n const TrendIcon = TREND_CONFIG[trendDirection].Icon;\n return <TrendIcon size={16} weight=\"bold\" />;\n })()}\n <Text\n size=\"xs\"\n weight=\"bold\"\n color=\"inherit\"\n className=\"leading-[100%] uppercase\"\n >\n {trendValue}\n </Text>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * TimeReport component\n *\n * Displays time statistics organized in tabs, each with configurable cards.\n * Used in the manager report page to show platform access time metrics.\n *\n * @example\n * ```tsx\n * <TimeReport\n * tabs={[\n * {\n * value: 'student',\n * label: 'Estudante',\n * icon: <Student size={17} />,\n * cards: [\n * { id: 'platform', label: 'TEMPO NA PLATAFORMA', value: '12h 20min', icon: <Monitor />, trendValue: '+10%', trendDirection: 'up' },\n * ],\n * },\n * ]}\n * onTabChange={(tab) => console.log(tab)}\n * />\n * ```\n */\nexport const TimeReport = ({\n tabs,\n defaultTab,\n activeTab,\n onTabChange,\n className,\n ...props\n}: TimeReportProps) => (\n <ReportLayout\n tabs={tabs}\n defaultTab={defaultTab}\n activeTab={activeTab}\n onTabChange={onTabChange}\n renderCard={(card) => <TimeCard key={card.id} data={card} />}\n gridTestId=\"time-report-cards\"\n className={className}\n {...props}\n />\n);\n\nexport default TimeReport;\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var _chunk4DQBBXY3js = require('./chunk-4DQBBXY3.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkTTSTAOIZjs = require('./chunk-TTSTAOIZ.js');
|
|
7
7
|
|
|
8
8
|
// src/components/TypeSelector/TypeSelector.types.ts
|
|
9
9
|
var ATIVIDADE_LABELS = {
|
|
@@ -57,7 +57,7 @@ var PROVA_LABELS = {
|
|
|
57
57
|
statusLabel: "Status da Prova"
|
|
58
58
|
};
|
|
59
59
|
var DEFAULT_STATUS_OPTIONS = {
|
|
60
|
-
ATIVIDADE:
|
|
60
|
+
ATIVIDADE: _chunkTTSTAOIZjs.ACTIVITY_FILTER_STATUS_OPTIONS,
|
|
61
61
|
PROVA: _chunk4DQBBXY3js.EXAM_STATUS_OPTIONS
|
|
62
62
|
};
|
|
63
63
|
var getTabPath = (tab) => {
|
|
@@ -97,4 +97,4 @@ var createActivityCategoryConfig = (routes) => ({
|
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
exports.ATIVIDADE_LABELS = ATIVIDADE_LABELS; exports.PROVA_LABELS = PROVA_LABELS; exports.DEFAULT_STATUS_OPTIONS = DEFAULT_STATUS_OPTIONS; exports.getTabPath = getTabPath; exports.getTabFromPath = getTabFromPath; exports.createActivityCategoryConfig = createActivityCategoryConfig;
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
100
|
+
//# sourceMappingURL=chunk-HLCT4MJA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-HLCT4MJA.js","../src/components/TypeSelector/TypeSelector.types.ts"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-HLCT4MJA.js","sourcesContent":[null,"import { ACTIVITY_FILTER_STATUS_OPTIONS } from '../../types/activitiesHistory';\nimport { EXAM_STATUS_OPTIONS } from '../../utils/examFilterHelpers';\n\n/**\n * Activity type enum\n */\nexport type ActivityCategory = 'ATIVIDADE' | 'PROVA';\n\n/**\n * Active tab type for activity pages\n */\nexport type ActiveTab = 'history' | 'drafts' | 'models';\n\n/**\n * Labels configuration for each activity type\n */\nexport interface TypeLabels {\n pageTitle: Record<ActiveTab, string>;\n createButton: string;\n selectorLabel: string;\n itemLabel: Record<ActiveTab, string>;\n searchPlaceholder: Record<ActiveTab, string>;\n emptyState: {\n title: string;\n description: string;\n buttonText: string;\n };\n statusLabel: string;\n}\n\n/**\n * Routes configuration for each activity type\n */\nexport interface TypeRoutes {\n base: string;\n create: string;\n details: (id: string) => string;\n editDraft: (id: string) => string;\n editModel: (id: string) => string;\n}\n\n/**\n * Complete configuration for an activity type\n */\nexport interface TypeConfig {\n labels: TypeLabels;\n routes: TypeRoutes;\n statusOptions: Array<{ id: string; name: string }>;\n}\n\n/**\n * Default labels for ATIVIDADE type\n */\nexport const ATIVIDADE_LABELS: TypeLabels = {\n pageTitle: {\n history: 'Histórico de atividades',\n drafts: 'Rascunhos de atividades',\n models: 'Modelos de atividades',\n },\n createButton: 'Criar atividade',\n selectorLabel: 'Atividades',\n itemLabel: {\n history: 'atividades',\n drafts: 'rascunhos',\n models: 'modelos',\n },\n searchPlaceholder: {\n history: 'Buscar atividade',\n drafts: 'Buscar rascunho',\n models: 'Buscar modelo',\n },\n emptyState: {\n title: 'Incentive sua turma ao aprendizado',\n description:\n 'Crie uma nova atividade e ajude seus alunos a colocarem o conteúdo em prática!',\n buttonText: 'Criar atividade',\n },\n statusLabel: 'Status da Atividade',\n};\n\n/**\n * Default labels for PROVA type\n */\nexport const PROVA_LABELS: TypeLabels = {\n pageTitle: {\n history: 'Histórico de provas',\n drafts: 'Rascunhos de provas',\n models: 'Modelos de provas',\n },\n createButton: 'Criar prova',\n selectorLabel: 'Provas',\n itemLabel: {\n history: 'provas',\n drafts: 'rascunhos',\n models: 'modelos',\n },\n searchPlaceholder: {\n history: 'Buscar prova',\n drafts: 'Buscar rascunho',\n models: 'Buscar modelo',\n },\n emptyState: {\n title: 'Avalie o conhecimento da sua turma',\n description:\n 'Crie uma nova prova e acompanhe o desempenho dos seus alunos!',\n buttonText: 'Criar prova',\n },\n statusLabel: 'Status da Prova',\n};\n\n/**\n * Default status options by type\n */\nexport const DEFAULT_STATUS_OPTIONS: Record<\n ActivityCategory,\n Array<{ id: string; name: string }>\n> = {\n ATIVIDADE: ACTIVITY_FILTER_STATUS_OPTIONS,\n PROVA: EXAM_STATUS_OPTIONS,\n};\n\n/**\n * Get tab path segment based on active tab\n */\nexport const getTabPath = (tab: ActiveTab): string => {\n switch (tab) {\n case 'drafts':\n return '/rascunhos';\n case 'models':\n return '/modelos';\n default:\n return '';\n }\n};\n\n/**\n * Get tab value from URL path segment\n */\nexport const getTabFromPath = (pathname: string): ActiveTab => {\n const cleanPath = pathname.split('?')[0].split('#')[0];\n\n if (/(^|\\/)rascunhos(\\/|$)/.test(cleanPath)) return 'drafts';\n if (/(^|\\/)modelos(\\/|$)/.test(cleanPath)) return 'models';\n return 'history';\n};\n\n/**\n * Create activity type config with custom routes\n */\nexport const createActivityCategoryConfig = (\n routes: Record<ActivityCategory, TypeRoutes>\n): Record<ActivityCategory, TypeConfig> => ({\n ATIVIDADE: {\n labels: ATIVIDADE_LABELS,\n routes: routes.ATIVIDADE,\n statusOptions: DEFAULT_STATUS_OPTIONS.ATIVIDADE,\n },\n PROVA: {\n labels: PROVA_LABELS,\n routes: routes.PROVA,\n statusOptions: DEFAULT_STATUS_OPTIONS.PROVA,\n },\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkHLCT4MJAjs = require('./chunk-HLCT4MJA.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkIKLXUU4Njs = require('./chunk-IKLXUU4N.js');
|
|
@@ -38,7 +38,7 @@ var TypeSelector = ({
|
|
|
38
38
|
(newType) => {
|
|
39
39
|
if (newType === value) return;
|
|
40
40
|
const typeConfig = config[newType];
|
|
41
|
-
const tabPath =
|
|
41
|
+
const tabPath = _chunkHLCT4MJAjs.getTabPath.call(void 0, currentTab);
|
|
42
42
|
navigate(`${typeConfig.routes.base}${tabPath}`);
|
|
43
43
|
},
|
|
44
44
|
[value, currentTab, navigate, config]
|
|
@@ -55,4 +55,4 @@ var TypeSelector_default = TypeSelector;
|
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
exports.TypeSelector = TypeSelector; exports.TypeSelector_default = TypeSelector_default;
|
|
58
|
-
//# sourceMappingURL=chunk-
|
|
58
|
+
//# sourceMappingURL=chunk-KYHVFLN4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-KYHVFLN4.js","../src/components/TypeSelector/TypeSelector.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACA;ACdA,8BAAqC;AACrC,kDAA4B;AA0ExB,+CAAA;AApCG,IAAM,aAAA,EAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA,EAAmB;AACrB,CAAA,EAAA,GAAyB;AACvB,EAAA,MAAM,SAAA,EAAW,yCAAA,CAAY;AAC7B,EAAA,MAAM,EAAE,SAAS,EAAA,EAAI,yCAAA,CAAW;AAGhC,EAAA,MAAM,kBAAA,EAAoB,4BAAA,CAAQ,EAAA,GAAM;AAEtC,IAAA,GAAA,CAAI,qBAAA,EAAuB;AACzB,MAAA,OAAO,qBAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,EAAiC,CAAA,2BAA+B,CAAA;AACtE,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,IAAA,CAAA,mBAA+B,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,qBAAqB,CAAC,CAAA;AAEpC,EAAA,MAAM,iBAAA,EAAmB,gCAAA;AAAA,IACvB,CAAC,OAAA,EAAA,GAAoB;AACnB,MAAA,GAAA,CAAI,QAAA,IAAY,KAAA,EAAO,MAAA;AAEvB,MAAA,MAAM,WAAA,EAAa,MAAA,CAAO,OAA2B,CAAA;AACrD,MAAA,MAAM,QAAA,EAAU,yCAAA,UAAqB,CAAA;AACrC,MAAA,QAAA,CAAS,CAAA,EAAA;AACX,IAAA;AACQ,IAAA;AACV,EAAA;AAEM,EAAA;AAOJ,EAAA;AACE,oBAAA;AAGA,oBAAA;AACF,EAAA;AAEJ;AAEO;ADtCS;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-KYHVFLN4.js","sourcesContent":[null,"import { useCallback, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport Select, {\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from '../Select/Select';\nimport {\n type ActivityCategory,\n type ActiveTab,\n type TypeConfig,\n getTabPath,\n} from './TypeSelector.types';\nimport { useModules } from '../../hooks/useModules';\nimport { ExamActivityCategory } from '../../types/examDrafts';\n\n/**\n * Props for the TypeSelector component\n */\nexport interface TypeSelectorProps {\n /** Current activity type selected */\n value: ActivityCategory;\n /** Current active tab (to preserve when switching types) */\n currentTab: ActiveTab;\n /** Configuration for activity types (routes and labels) */\n config: Record<ActivityCategory, TypeConfig>;\n /**\n * Optional filter to include only specific categories.\n * If not provided, automatically calculated based on hasExams flag from useModules.\n * Only use this prop for special cases where you need to override the default behavior.\n */\n allowedCategories?: ActivityCategory[];\n}\n\n/**\n * Type selector dropdown for switching between Atividades and Provas\n * Navigates to the corresponding route while preserving the current tab\n */\nexport const TypeSelector = ({\n value,\n currentTab,\n config,\n allowedCategories: allowedCategoriesProp,\n}: TypeSelectorProps) => {\n const navigate = useNavigate();\n const { hasExams } = useModules();\n\n // Calculate allowed categories based on exams module\n const allowedCategories = useMemo(() => {\n // If prop is explicitly provided, use it\n if (allowedCategoriesProp) {\n return allowedCategoriesProp;\n }\n\n // Otherwise, calculate based on hasExams flag\n const categories: ActivityCategory[] = [ExamActivityCategory.ATIVIDADE];\n if (hasExams) {\n categories.push(ExamActivityCategory.PROVA);\n }\n return categories;\n }, [hasExams, allowedCategoriesProp]);\n\n const handleTypeChange = useCallback(\n (newType: string) => {\n if (newType === value) return;\n\n const typeConfig = config[newType as ActivityCategory];\n const tabPath = getTabPath(currentTab);\n navigate(`${typeConfig.routes.base}${tabPath}`);\n },\n [value, currentTab, navigate, config]\n );\n\n const selectItems = allowedCategories.map((category) => (\n <SelectItem key={category} value={category}>\n {config[category].labels.selectorLabel}\n </SelectItem>\n ));\n\n return (\n <Select value={value} onValueChange={handleTypeChange} size=\"small\">\n <SelectTrigger className=\"w-[160px] h-8 bg-background\" variant=\"outlined\">\n <SelectValue placeholder=\"Tipo\" />\n </SelectTrigger>\n <SelectContent>{selectItems}</SelectContent>\n </Select>\n );\n};\n\nexport default TypeSelector;\n"]}
|