analytica-frontend-lib 1.2.70 → 1.2.72

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.
Files changed (57) hide show
  1. package/dist/ActivitiesHistory/index.js +14 -3
  2. package/dist/ActivitiesHistory/index.js.map +1 -1
  3. package/dist/ActivitiesHistory/index.mjs +14 -3
  4. package/dist/ActivitiesHistory/index.mjs.map +1 -1
  5. package/dist/ActivityDetails/index.d.ts +4 -11
  6. package/dist/ActivityDetails/index.d.ts.map +1 -1
  7. package/dist/ActivityDetails/index.js +176 -69
  8. package/dist/ActivityDetails/index.js.map +1 -1
  9. package/dist/ActivityDetails/index.mjs +143 -36
  10. package/dist/ActivityDetails/index.mjs.map +1 -1
  11. package/dist/ActivityFilters/index.js +5 -5
  12. package/dist/ActivityFilters/index.js.map +1 -1
  13. package/dist/ActivityFilters/index.mjs +5 -5
  14. package/dist/ActivityFilters/index.mjs.map +1 -1
  15. package/dist/CorrectActivityModal/index.d.ts.map +1 -1
  16. package/dist/CorrectActivityModal/index.js +1 -2
  17. package/dist/CorrectActivityModal/index.js.map +1 -1
  18. package/dist/CorrectActivityModal/index.mjs +1 -2
  19. package/dist/CorrectActivityModal/index.mjs.map +1 -1
  20. package/dist/RecommendedLessonsHistory/index.js +14 -3
  21. package/dist/RecommendedLessonsHistory/index.js.map +1 -1
  22. package/dist/RecommendedLessonsHistory/index.mjs +14 -3
  23. package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
  24. package/dist/TableProvider/index.d.ts +10 -1
  25. package/dist/TableProvider/index.d.ts.map +1 -1
  26. package/dist/TableProvider/index.js +14 -3
  27. package/dist/TableProvider/index.js.map +1 -1
  28. package/dist/TableProvider/index.mjs +14 -3
  29. package/dist/TableProvider/index.mjs.map +1 -1
  30. package/dist/hooks/useActivitiesHistory/index.d.ts +14 -14
  31. package/dist/hooks/useActivitiesHistory.d.ts +14 -14
  32. package/dist/hooks/useActivityDetails.d.ts +59 -0
  33. package/dist/hooks/useActivityDetails.d.ts.map +1 -0
  34. package/dist/hooks/useActivityModels/index.d.ts +6 -6
  35. package/dist/hooks/useActivityModels.d.ts +6 -6
  36. package/dist/index.d.ts +3 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +537 -421
  39. package/dist/index.js.map +1 -1
  40. package/dist/index.mjs +390 -276
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/types/activityDetails.d.ts +29 -0
  43. package/dist/types/activityDetails.d.ts.map +1 -1
  44. package/dist/types/activityFilters.d.ts +1 -1
  45. package/dist/types/activityFilters.d.ts.map +1 -1
  46. package/dist/types/questions.d.ts +6 -7
  47. package/dist/types/questions.d.ts.map +1 -1
  48. package/dist/utils/activityDetailsUtils.d.ts +4 -4
  49. package/dist/utils/activityDetailsUtils.d.ts.map +1 -1
  50. package/dist/utils/index.js +13 -10
  51. package/dist/utils/index.js.map +1 -1
  52. package/dist/utils/index.mjs +13 -10
  53. package/dist/utils/index.mjs.map +1 -1
  54. package/dist/utils/questionFiltersConverter.d.ts.map +1 -1
  55. package/dist/utils/studentActivityCorrection/types.d.ts +5 -5
  56. package/dist/utils/studentActivityCorrection/types.d.ts.map +1 -1
  57. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
  * Activity Details Types
3
3
  * Types and helper functions for activity details components
4
4
  */
5
+ import { z } from 'zod';
5
6
  /**
6
7
  * Student activity status enum
7
8
  */
@@ -12,6 +13,10 @@ export declare const STUDENT_ACTIVITY_STATUS: {
12
13
  readonly NAO_ENTREGUE: "NAO_ENTREGUE";
13
14
  };
14
15
  export type StudentActivityStatus = (typeof STUDENT_ACTIVITY_STATUS)[keyof typeof STUDENT_ACTIVITY_STATUS];
16
+ /**
17
+ * Zod schema for student activity status
18
+ */
19
+ export declare const studentActivityStatusSchema: z.ZodEnum<["CONCLUIDO", "AGUARDANDO_CORRECAO", "AGUARDANDO_RESPOSTA", "NAO_ENTREGUE"]>;
15
20
  /**
16
21
  * Student data interface
17
22
  */
@@ -55,6 +60,7 @@ export interface QuestionStats {
55
60
  export interface ActivityMetadata {
56
61
  id: string;
57
62
  title: string;
63
+ type?: string;
58
64
  startDate: string | null;
59
65
  finalDate: string | null;
60
66
  schoolName: string;
@@ -112,4 +118,27 @@ export declare const ACTIVITY_AVAILABILITY: {
112
118
  readonly EXPIRADA: "EXPIRADA";
113
119
  };
114
120
  export type ActivityAvailability = (typeof ACTIVITY_AVAILABILITY)[keyof typeof ACTIVITY_AVAILABILITY];
121
+ /**
122
+ * Quiz API response
123
+ */
124
+ export interface QuizResponse {
125
+ message: string;
126
+ data: ActivityMetadata;
127
+ }
128
+ /**
129
+ * Activity details API response (without activity)
130
+ */
131
+ export interface ActivityDetailsApiResponse {
132
+ message: string;
133
+ data: Omit<ActivityDetailsData, 'activity'>;
134
+ }
135
+ /**
136
+ * Presigned URL response
137
+ */
138
+ export interface PresignedUrlResponse {
139
+ data: {
140
+ url: string;
141
+ fields: Record<string, string>;
142
+ };
143
+ }
115
144
  //# sourceMappingURL=activityDetails.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activityDetails.d.ts","sourceRoot":"","sources":["../../src/types/activityDetails.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC;IACzC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;CAIxB,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAC9B,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"activityDetails.d.ts","sourceRoot":"","sources":["../../src/types/activityDetails.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export interface ActivityFiltersData {
7
7
  types: QUESTION_TYPE[];
8
8
  bankIds: string[];
9
9
  yearIds: string[];
10
- knowledgeIds: string[];
10
+ subjectIds: string[];
11
11
  topicIds: string[];
12
12
  subtopicIds: string[];
13
13
  contentIds: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"activityFilters.d.ts","sourceRoot":"","sources":["../../src/types/activityFilters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
1
+ {"version":3,"file":"activityFilters.d.ts","sourceRoot":"","sources":["../../src/types/activityFilters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
@@ -54,13 +54,12 @@ export interface Pagination {
54
54
  * Questions filter body interface
55
55
  */
56
56
  export interface QuestionsFilterBody {
57
- types?: QUESTION_TYPE[];
58
- bankIds?: string[];
59
- yearIds?: string[];
60
- knowledgeIds?: string[];
61
- topicIds?: string[];
62
- subtopicIds?: string[];
63
- contentIds?: string[];
57
+ questionType?: QUESTION_TYPE[];
58
+ questionBankYearId?: string[];
59
+ subjectId?: string[];
60
+ topicId?: string[];
61
+ subtopicId?: string[];
62
+ contentId?: string[];
64
63
  page?: number;
65
64
  pageSize?: number;
66
65
  selectedQuestionsIds?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../../src/types/questions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../../src/types/questions.ts"],"names":[],"mappings":"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"}
@@ -6,19 +6,19 @@ import type { StudentActivityStatus, StatusBadgeConfig } from '../types/activity
6
6
  /**
7
7
  * Get status badge configuration
8
8
  * @param status - Student activity status
9
- * @returns Status badge configuration object
9
+ * @returns Status badge configuration with label and colors
10
10
  */
11
11
  export declare const getStatusBadgeConfig: (status: StudentActivityStatus) => StatusBadgeConfig;
12
12
  /**
13
13
  * Format time spent in seconds to HH:MM:SS
14
14
  * @param seconds - Time in seconds
15
- * @returns Formatted time string
15
+ * @returns Formatted time string in HH:MM:SS format
16
16
  */
17
17
  export declare const formatTimeSpent: (seconds: number) => string;
18
18
  /**
19
19
  * Format question numbers to display
20
- * @param numbers - Array of question numbers (0-indexed)
21
- * @returns Formatted string of question numbers
20
+ * @param numbers - Array of zero-based question indices
21
+ * @returns Formatted string with question numbers (1-indexed, padded)
22
22
  */
23
23
  export declare const formatQuestionNumbers: (numbers: number[]) => string;
24
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"activityDetailsUtils.d.ts","sourceRoot":"","sources":["../../src/utils/activityDetailsUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAGlC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,qBAAqB,KAC5B,iBA8BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,MAMjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,EAAE,KAAG,MAGzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,MAM1D,CAAC"}
1
+ {"version":3,"file":"activityDetailsUtils.d.ts","sourceRoot":"","sources":["../../src/utils/activityDetailsUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAGlC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,qBAAqB,KAC5B,iBAyBF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,MAOjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,EAAE,KAAG,MAIzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,MAM1D,CAAC"}
@@ -74,7 +74,7 @@ function arraysEqual(a, b, comparator) {
74
74
  function areFiltersEqual(filters1, filters2) {
75
75
  if (filters1 === filters2) return true;
76
76
  if (!filters1 || !filters2) return false;
77
- return arraysEqual(filters1.types, filters2.types) && arraysEqual(filters1.bankIds, filters2.bankIds) && arraysEqual(filters1.yearIds, filters2.yearIds) && arraysEqual(filters1.knowledgeIds, filters2.knowledgeIds) && arraysEqual(filters1.topicIds, filters2.topicIds) && arraysEqual(filters1.subtopicIds, filters2.subtopicIds) && arraysEqual(filters1.contentIds, filters2.contentIds);
77
+ return arraysEqual(filters1.types, filters2.types) && arraysEqual(filters1.bankIds, filters2.bankIds) && arraysEqual(filters1.yearIds, filters2.yearIds) && arraysEqual(filters1.subjectIds, filters2.subjectIds) && arraysEqual(filters1.topicIds, filters2.topicIds) && arraysEqual(filters1.subtopicIds, filters2.subtopicIds) && arraysEqual(filters1.contentIds, filters2.contentIds);
78
78
  }
79
79
 
80
80
  // src/utils/questionTypeUtils.ts
@@ -96,12 +96,19 @@ function mapQuestionTypeToEnumRequired(type, fallback = "ALTERNATIVA" /* ALTERNA
96
96
  }
97
97
 
98
98
  // src/types/activityDetails.ts
99
+ var import_zod = require("zod");
99
100
  var STUDENT_ACTIVITY_STATUS = {
100
101
  CONCLUIDO: "CONCLUIDO",
101
102
  AGUARDANDO_CORRECAO: "AGUARDANDO_CORRECAO",
102
103
  AGUARDANDO_RESPOSTA: "AGUARDANDO_RESPOSTA",
103
104
  NAO_ENTREGUE: "NAO_ENTREGUE"
104
105
  };
106
+ var studentActivityStatusSchema = import_zod.z.enum([
107
+ STUDENT_ACTIVITY_STATUS.CONCLUIDO,
108
+ STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO,
109
+ STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA,
110
+ STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE
111
+ ]);
105
112
 
106
113
  // src/utils/activityDetailsUtils.ts
107
114
  var getStatusBadgeConfig = (status) => {
@@ -125,19 +132,15 @@ var getStatusBadgeConfig = (status) => {
125
132
  label: "N\xE3o Entregue",
126
133
  bgColor: "bg-red-50",
127
134
  textColor: "text-red-800"
128
- },
129
- default: {
130
- label: "Desconhecido",
131
- bgColor: "bg-gray-50",
132
- textColor: "text-gray-800"
133
135
  }
134
136
  };
135
- return configs[status] ?? configs.default;
137
+ return configs[status];
136
138
  };
137
139
  var formatTimeSpent = (seconds) => {
138
- const hours = Math.floor(seconds / 3600);
139
- const minutes = Math.floor(seconds % 3600 / 60);
140
- const secs = seconds % 60;
140
+ const totalSeconds = Math.floor(Math.abs(seconds));
141
+ const hours = Math.floor(totalSeconds / 3600);
142
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
143
+ const secs = totalSeconds % 60;
141
144
  return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
142
145
  };
143
146
  var formatQuestionNumbers = (numbers) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/utils.ts","../../src/utils/dropdown.ts","../../src/utils/activityFilters.ts","../../src/utils/questionTypeUtils.ts","../../src/types/activityDetails.ts","../../src/utils/activityDetailsUtils.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n} from './activityDetailsUtils';\n\n/**\n * Retorna a cor hexadecimal com opacidade 0.3 (4d) se não estiver em dark mode.\n * Se estiver em dark mode, retorna a cor original.\n *\n * @param hexColor - Cor hexadecimal (ex: \"#0066b8\" ou \"0066b8\")\n * @param isDark - booleano indicando se está em dark mode\n * @returns string - cor hexadecimal com opacidade se necessário\n */\nexport function getSubjectColorWithOpacity(\n hexColor: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!hexColor) return undefined;\n // Remove o '#' se existir\n let color = hexColor.replace(/^#/, '').toLowerCase();\n\n if (isDark) {\n // Se está em dark mode, sempre remove opacidade se existir\n if (color.length === 8) {\n color = color.slice(0, 6);\n }\n return `#${color}`;\n } else {\n // Se não está em dark mode (light mode)\n let resultColor: string;\n if (color.length === 6) {\n // Adiciona opacidade 0.3 (4D) para cores de 6 dígitos\n resultColor = `#${color}4d`;\n } else if (color.length === 8) {\n // Já tem opacidade, retorna como está\n resultColor = `#${color}`;\n } else {\n // Para outros tamanhos (3, 4, 5 dígitos), retorna como está\n resultColor = `#${color}`;\n }\n return resultColor;\n }\n}\n","import type { Dispatch, SetStateAction } from 'react';\n\n/**\n * Synchronizes dropdown state when it closes externally\n * This ensures the toggle button state matches the dropdown state\n *\n * @param open - Current dropdown open state\n * @param isActive - Current active state of the toggle button\n * @param setActiveStates - Function to update active states\n * @param key - Key identifier for the specific dropdown\n */\nexport const syncDropdownState = (\n open: boolean,\n isActive: boolean,\n setActiveStates: Dispatch<SetStateAction<Record<string, boolean>>>,\n key: string\n) => {\n if (!open && isActive) {\n setActiveStates((prev) => ({ ...prev, [key]: false }));\n }\n};\n","import type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type { ActivityFiltersData } from '../types/activityFilters';\n\n/**\n * Extracts selected IDs from knowledge categories by their keys\n * @param categories - Array of category configurations\n * @param keys - Object mapping output keys to category keys\n * @returns Object with extracted selected IDs for each output key\n */\nexport function getSelectedIdsFromCategories(\n categories: CategoryConfig[],\n keys: Record<string, string>\n): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const [outputKey, categoryKey] of Object.entries(keys)) {\n const category = categories.find((c) => c.key === categoryKey);\n result[outputKey] = category?.selectedIds || [];\n }\n\n return result;\n}\n\n/**\n * Toggles an item in an array (adds if not present, removes if present)\n * @param array - Current array\n * @param item - Item to toggle\n * @returns New array with item toggled\n */\nexport function toggleArrayItem<T>(array: T[], item: T): T[] {\n return array.includes(item)\n ? array.filter((i) => i !== item)\n : [...array, item];\n}\n\n/**\n * Toggles a single value (returns null if current value, otherwise returns new value)\n * @param currentValue - Current selected value\n * @param newValue - Value to toggle to\n * @returns New value or null if toggling off\n */\nexport function toggleSingleValue<T>(\n currentValue: T | null,\n newValue: T\n): T | null {\n return currentValue === newValue ? null : newValue;\n}\n\n/**\n * Compares two arrays for equality (order-independent)\n * @param a - First array\n * @param b - Second array\n * @param comparator - Optional comparator function. If not provided, uses string conversion and localeCompare\n * @returns true if arrays contain the same elements, false otherwise\n */\nfunction arraysEqual<T>(\n a: T[],\n b: T[],\n comparator?: (x: T, y: T) => number\n): boolean {\n if (a.length !== b.length) return false;\n\n if (comparator) {\n const sortedA = [...a].sort(comparator);\n const sortedB = [...b].sort(comparator);\n return sortedA.every((val, index) => val === sortedB[index]);\n }\n\n const sortedA = [...a].sort((x, y) => String(x).localeCompare(String(y)));\n const sortedB = [...b].sort((x, y) => String(x).localeCompare(String(y)));\n return sortedA.every((val, index) => val === sortedB[index]);\n}\n\nexport function areFiltersEqual(\n filters1: ActivityFiltersData | null,\n filters2: ActivityFiltersData | null\n): boolean {\n if (filters1 === filters2) return true;\n if (!filters1 || !filters2) return false;\n\n return (\n arraysEqual(filters1.types, filters2.types) &&\n arraysEqual(filters1.bankIds, filters2.bankIds) &&\n arraysEqual(filters1.yearIds, filters2.yearIds) &&\n arraysEqual(filters1.knowledgeIds, filters2.knowledgeIds) &&\n arraysEqual(filters1.topicIds, filters2.topicIds) &&\n arraysEqual(filters1.subtopicIds, filters2.subtopicIds) &&\n arraysEqual(filters1.contentIds, filters2.contentIds)\n );\n}\n","import { QUESTION_TYPE } from '../components/Quiz/useQuizStore';\n\n/**\n * Maps API question type string to QUESTION_TYPE enum\n * Converts input to uppercase for case-insensitive matching\n *\n * @param type - Question type string from API\n * @param fallback - Optional fallback QUESTION_TYPE if mapping fails. If not provided, returns null\n * @returns QUESTION_TYPE enum value or null/fallback if not found\n */\nexport function mapQuestionTypeToEnum(\n type: string,\n fallback?: QUESTION_TYPE\n): QUESTION_TYPE | null {\n const upperType = type.toUpperCase();\n\n const typeMap: Record<string, QUESTION_TYPE> = {\n ALTERNATIVA: QUESTION_TYPE.ALTERNATIVA,\n DISSERTATIVA: QUESTION_TYPE.DISSERTATIVA,\n MULTIPLA_ESCOLHA: QUESTION_TYPE.MULTIPLA_ESCOLHA,\n VERDADEIRO_FALSO: QUESTION_TYPE.VERDADEIRO_FALSO,\n IMAGEM: QUESTION_TYPE.IMAGEM,\n LIGAR_PONTOS: QUESTION_TYPE.LIGAR_PONTOS,\n PREENCHER: QUESTION_TYPE.PREENCHER,\n };\n\n return typeMap[upperType] ?? fallback ?? null;\n}\n\n/**\n * Maps API question type string to QUESTION_TYPE enum with required fallback\n * Always returns a QUESTION_TYPE (never null)\n *\n * @param type - Question type string from API\n * @param fallback - Fallback QUESTION_TYPE if mapping fails (defaults to ALTERNATIVA)\n * @returns QUESTION_TYPE enum value\n */\nexport function mapQuestionTypeToEnumRequired(\n type: string,\n fallback: QUESTION_TYPE = QUESTION_TYPE.ALTERNATIVA\n): QUESTION_TYPE {\n return mapQuestionTypeToEnum(type, fallback) ?? fallback;\n}\n","/**\n * Activity Details Types\n * Types and helper functions for activity details components\n */\n\n/**\n * Student activity status enum\n */\nexport const STUDENT_ACTIVITY_STATUS = {\n CONCLUIDO: 'CONCLUIDO',\n AGUARDANDO_CORRECAO: 'AGUARDANDO_CORRECAO',\n AGUARDANDO_RESPOSTA: 'AGUARDANDO_RESPOSTA',\n NAO_ENTREGUE: 'NAO_ENTREGUE',\n} as const;\n\nexport type StudentActivityStatus =\n (typeof STUDENT_ACTIVITY_STATUS)[keyof typeof STUDENT_ACTIVITY_STATUS];\n\n/**\n * Student data interface\n */\nexport interface ActivityStudentData {\n studentId: string;\n studentName: string;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n status: StudentActivityStatus;\n}\n\n/**\n * Pagination interface\n */\nexport interface Pagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n hasNext?: boolean;\n hasPrev?: boolean;\n}\n\n/**\n * General statistics interface\n */\nexport interface GeneralStats {\n averageScore: number;\n completionPercentage: number;\n}\n\n/**\n * Question statistics interface\n */\nexport interface QuestionStats {\n mostCorrect: number[];\n mostIncorrect: number[];\n notAnswered: number[];\n}\n\n/**\n * Activity metadata interface\n */\nexport interface ActivityMetadata {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n schoolName: string;\n year: string;\n subjectName: string;\n className: string;\n}\n\n/**\n * Activity details data interface\n */\nexport interface ActivityDetailsData {\n activity?: ActivityMetadata;\n students: ActivityStudentData[];\n pagination: Pagination;\n generalStats: GeneralStats;\n questionStats: QuestionStats;\n}\n\n/**\n * Activity details query params interface\n */\nexport interface ActivityDetailsQueryParams {\n page?: number;\n limit?: number;\n sortBy?: 'name' | 'score' | 'answeredAt';\n sortOrder?: 'asc' | 'desc';\n status?: StudentActivityStatus;\n}\n\n/**\n * Activity student table item interface\n */\nexport interface ActivityStudentTableItem extends Record<string, unknown> {\n id: string;\n studentId: string;\n studentName: string;\n status: StudentActivityStatus;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n}\n\n/**\n * Status badge configuration interface\n */\nexport interface StatusBadgeConfig {\n label: string;\n bgColor: string;\n textColor: string;\n}\n\n/**\n * Activity availability status enum\n * Used to determine if an activity is available based on start/end dates\n */\nexport const ACTIVITY_AVAILABILITY = {\n DISPONIVEL: 'DISPONIVEL',\n NAO_INICIADA: 'NAO_INICIADA',\n EXPIRADA: 'EXPIRADA',\n} as const;\n\nexport type ActivityAvailability =\n (typeof ACTIVITY_AVAILABILITY)[keyof typeof ACTIVITY_AVAILABILITY];\n","/**\n * Activity Details Utilities\n * Helper functions for activity details components\n */\n\nimport type {\n StudentActivityStatus,\n StatusBadgeConfig,\n} from '../types/activityDetails';\nimport { STUDENT_ACTIVITY_STATUS } from '../types/activityDetails';\n\n/**\n * Get status badge configuration\n * @param status - Student activity status\n * @returns Status badge configuration object\n */\nexport const getStatusBadgeConfig = (\n status: StudentActivityStatus\n): StatusBadgeConfig => {\n const configs: Record<string, StatusBadgeConfig> = {\n [STUDENT_ACTIVITY_STATUS.CONCLUIDO]: {\n label: 'Concluído',\n bgColor: 'bg-green-50',\n textColor: 'text-green-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO]: {\n label: 'Aguardando Correção',\n bgColor: 'bg-yellow-50',\n textColor: 'text-yellow-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA]: {\n label: 'Aguardando Resposta',\n bgColor: 'bg-blue-50',\n textColor: 'text-blue-800',\n },\n [STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE]: {\n label: 'Não Entregue',\n bgColor: 'bg-red-50',\n textColor: 'text-red-800',\n },\n default: {\n label: 'Desconhecido',\n bgColor: 'bg-gray-50',\n textColor: 'text-gray-800',\n },\n };\n\n return configs[status] ?? configs.default;\n};\n\n/**\n * Format time spent in seconds to HH:MM:SS\n * @param seconds - Time in seconds\n * @returns Formatted time string\n */\nexport const formatTimeSpent = (seconds: number): string => {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n};\n\n/**\n * Format question numbers to display\n * @param numbers - Array of question numbers (0-indexed)\n * @returns Formatted string of question numbers\n */\nexport const formatQuestionNumbers = (numbers: number[]): string => {\n if (numbers.length === 0) return '-';\n return numbers.map((n) => String(n + 1).padStart(2, '0')).join(', ');\n};\n\n/**\n * Format date string to Brazilian format (DD/MM/YYYY)\n * @param dateString - ISO date string\n * @returns Formatted date string\n */\nexport const formatDateToBrazilian = (dateString: string): string => {\n const date = new Date(dateString);\n const day = String(date.getUTCDate()).padStart(2, '0');\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const year = date.getUTCFullYear();\n return `${day}/${month}/${year}`;\n};\n"],"mappings":"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","names":["sortedA","sortedB"]}
1
+ {"version":3,"sources":["../../src/utils/utils.ts","../../src/utils/dropdown.ts","../../src/utils/activityFilters.ts","../../src/utils/questionTypeUtils.ts","../../src/types/activityDetails.ts","../../src/utils/activityDetailsUtils.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n} from './activityDetailsUtils';\n\n/**\n * Retorna a cor hexadecimal com opacidade 0.3 (4d) se não estiver em dark mode.\n * Se estiver em dark mode, retorna a cor original.\n *\n * @param hexColor - Cor hexadecimal (ex: \"#0066b8\" ou \"0066b8\")\n * @param isDark - booleano indicando se está em dark mode\n * @returns string - cor hexadecimal com opacidade se necessário\n */\nexport function getSubjectColorWithOpacity(\n hexColor: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!hexColor) return undefined;\n // Remove o '#' se existir\n let color = hexColor.replace(/^#/, '').toLowerCase();\n\n if (isDark) {\n // Se está em dark mode, sempre remove opacidade se existir\n if (color.length === 8) {\n color = color.slice(0, 6);\n }\n return `#${color}`;\n } else {\n // Se não está em dark mode (light mode)\n let resultColor: string;\n if (color.length === 6) {\n // Adiciona opacidade 0.3 (4D) para cores de 6 dígitos\n resultColor = `#${color}4d`;\n } else if (color.length === 8) {\n // Já tem opacidade, retorna como está\n resultColor = `#${color}`;\n } else {\n // Para outros tamanhos (3, 4, 5 dígitos), retorna como está\n resultColor = `#${color}`;\n }\n return resultColor;\n }\n}\n","import type { Dispatch, SetStateAction } from 'react';\n\n/**\n * Synchronizes dropdown state when it closes externally\n * This ensures the toggle button state matches the dropdown state\n *\n * @param open - Current dropdown open state\n * @param isActive - Current active state of the toggle button\n * @param setActiveStates - Function to update active states\n * @param key - Key identifier for the specific dropdown\n */\nexport const syncDropdownState = (\n open: boolean,\n isActive: boolean,\n setActiveStates: Dispatch<SetStateAction<Record<string, boolean>>>,\n key: string\n) => {\n if (!open && isActive) {\n setActiveStates((prev) => ({ ...prev, [key]: false }));\n }\n};\n","import type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type { ActivityFiltersData } from '../types/activityFilters';\n\n/**\n * Extracts selected IDs from knowledge categories by their keys\n * @param categories - Array of category configurations\n * @param keys - Object mapping output keys to category keys\n * @returns Object with extracted selected IDs for each output key\n */\nexport function getSelectedIdsFromCategories(\n categories: CategoryConfig[],\n keys: Record<string, string>\n): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const [outputKey, categoryKey] of Object.entries(keys)) {\n const category = categories.find((c) => c.key === categoryKey);\n result[outputKey] = category?.selectedIds || [];\n }\n\n return result;\n}\n\n/**\n * Toggles an item in an array (adds if not present, removes if present)\n * @param array - Current array\n * @param item - Item to toggle\n * @returns New array with item toggled\n */\nexport function toggleArrayItem<T>(array: T[], item: T): T[] {\n return array.includes(item)\n ? array.filter((i) => i !== item)\n : [...array, item];\n}\n\n/**\n * Toggles a single value (returns null if current value, otherwise returns new value)\n * @param currentValue - Current selected value\n * @param newValue - Value to toggle to\n * @returns New value or null if toggling off\n */\nexport function toggleSingleValue<T>(\n currentValue: T | null,\n newValue: T\n): T | null {\n return currentValue === newValue ? null : newValue;\n}\n\n/**\n * Compares two arrays for equality (order-independent)\n * @param a - First array\n * @param b - Second array\n * @param comparator - Optional comparator function. If not provided, uses string conversion and localeCompare\n * @returns true if arrays contain the same elements, false otherwise\n */\nfunction arraysEqual<T>(\n a: T[],\n b: T[],\n comparator?: (x: T, y: T) => number\n): boolean {\n if (a.length !== b.length) return false;\n\n if (comparator) {\n const sortedA = [...a].sort(comparator);\n const sortedB = [...b].sort(comparator);\n return sortedA.every((val, index) => val === sortedB[index]);\n }\n\n const sortedA = [...a].sort((x, y) => String(x).localeCompare(String(y)));\n const sortedB = [...b].sort((x, y) => String(x).localeCompare(String(y)));\n return sortedA.every((val, index) => val === sortedB[index]);\n}\n\nexport function areFiltersEqual(\n filters1: ActivityFiltersData | null,\n filters2: ActivityFiltersData | null\n): boolean {\n if (filters1 === filters2) return true;\n if (!filters1 || !filters2) return false;\n\n return (\n arraysEqual(filters1.types, filters2.types) &&\n arraysEqual(filters1.bankIds, filters2.bankIds) &&\n arraysEqual(filters1.yearIds, filters2.yearIds) &&\n arraysEqual(filters1.subjectIds, filters2.subjectIds) &&\n arraysEqual(filters1.topicIds, filters2.topicIds) &&\n arraysEqual(filters1.subtopicIds, filters2.subtopicIds) &&\n arraysEqual(filters1.contentIds, filters2.contentIds)\n );\n}\n","import { QUESTION_TYPE } from '../components/Quiz/useQuizStore';\n\n/**\n * Maps API question type string to QUESTION_TYPE enum\n * Converts input to uppercase for case-insensitive matching\n *\n * @param type - Question type string from API\n * @param fallback - Optional fallback QUESTION_TYPE if mapping fails. If not provided, returns null\n * @returns QUESTION_TYPE enum value or null/fallback if not found\n */\nexport function mapQuestionTypeToEnum(\n type: string,\n fallback?: QUESTION_TYPE\n): QUESTION_TYPE | null {\n const upperType = type.toUpperCase();\n\n const typeMap: Record<string, QUESTION_TYPE> = {\n ALTERNATIVA: QUESTION_TYPE.ALTERNATIVA,\n DISSERTATIVA: QUESTION_TYPE.DISSERTATIVA,\n MULTIPLA_ESCOLHA: QUESTION_TYPE.MULTIPLA_ESCOLHA,\n VERDADEIRO_FALSO: QUESTION_TYPE.VERDADEIRO_FALSO,\n IMAGEM: QUESTION_TYPE.IMAGEM,\n LIGAR_PONTOS: QUESTION_TYPE.LIGAR_PONTOS,\n PREENCHER: QUESTION_TYPE.PREENCHER,\n };\n\n return typeMap[upperType] ?? fallback ?? null;\n}\n\n/**\n * Maps API question type string to QUESTION_TYPE enum with required fallback\n * Always returns a QUESTION_TYPE (never null)\n *\n * @param type - Question type string from API\n * @param fallback - Fallback QUESTION_TYPE if mapping fails (defaults to ALTERNATIVA)\n * @returns QUESTION_TYPE enum value\n */\nexport function mapQuestionTypeToEnumRequired(\n type: string,\n fallback: QUESTION_TYPE = QUESTION_TYPE.ALTERNATIVA\n): QUESTION_TYPE {\n return mapQuestionTypeToEnum(type, fallback) ?? fallback;\n}\n","/**\n * Activity Details Types\n * Types and helper functions for activity details components\n */\n\nimport { z } from 'zod';\n\n/**\n * Student activity status enum\n */\nexport const STUDENT_ACTIVITY_STATUS = {\n CONCLUIDO: 'CONCLUIDO',\n AGUARDANDO_CORRECAO: 'AGUARDANDO_CORRECAO',\n AGUARDANDO_RESPOSTA: 'AGUARDANDO_RESPOSTA',\n NAO_ENTREGUE: 'NAO_ENTREGUE',\n} as const;\n\nexport type StudentActivityStatus =\n (typeof STUDENT_ACTIVITY_STATUS)[keyof typeof STUDENT_ACTIVITY_STATUS];\n\n/**\n * Zod schema for student activity status\n */\nexport const studentActivityStatusSchema = z.enum([\n STUDENT_ACTIVITY_STATUS.CONCLUIDO,\n STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO,\n STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA,\n STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE,\n]);\n\n/**\n * Student data interface\n */\nexport interface ActivityStudentData {\n studentId: string;\n studentName: string;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n status: StudentActivityStatus;\n}\n\n/**\n * Pagination interface\n */\nexport interface Pagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n hasNext?: boolean;\n hasPrev?: boolean;\n}\n\n/**\n * General statistics interface\n */\nexport interface GeneralStats {\n averageScore: number;\n completionPercentage: number;\n}\n\n/**\n * Question statistics interface\n */\nexport interface QuestionStats {\n mostCorrect: number[];\n mostIncorrect: number[];\n notAnswered: number[];\n}\n\n/**\n * Activity metadata interface\n */\nexport interface ActivityMetadata {\n id: string;\n title: string;\n type?: string;\n startDate: string | null;\n finalDate: string | null;\n schoolName: string;\n year: string;\n subjectName: string;\n className: string;\n}\n\n/**\n * Activity details data interface\n */\nexport interface ActivityDetailsData {\n activity?: ActivityMetadata;\n students: ActivityStudentData[];\n pagination: Pagination;\n generalStats: GeneralStats;\n questionStats: QuestionStats;\n}\n\n/**\n * Activity details query params interface\n */\nexport interface ActivityDetailsQueryParams {\n page?: number;\n limit?: number;\n sortBy?: 'name' | 'score' | 'answeredAt';\n sortOrder?: 'asc' | 'desc';\n status?: StudentActivityStatus;\n}\n\n/**\n * Activity student table item interface\n */\nexport interface ActivityStudentTableItem extends Record<string, unknown> {\n id: string;\n studentId: string;\n studentName: string;\n status: StudentActivityStatus;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n}\n\n/**\n * Status badge configuration interface\n */\nexport interface StatusBadgeConfig {\n label: string;\n bgColor: string;\n textColor: string;\n}\n\n/**\n * Activity availability status enum\n * Used to determine if an activity is available based on start/end dates\n */\nexport const ACTIVITY_AVAILABILITY = {\n DISPONIVEL: 'DISPONIVEL',\n NAO_INICIADA: 'NAO_INICIADA',\n EXPIRADA: 'EXPIRADA',\n} as const;\n\nexport type ActivityAvailability =\n (typeof ACTIVITY_AVAILABILITY)[keyof typeof ACTIVITY_AVAILABILITY];\n\n/**\n * Quiz API response\n */\nexport interface QuizResponse {\n message: string;\n data: ActivityMetadata;\n}\n\n/**\n * Activity details API response (without activity)\n */\nexport interface ActivityDetailsApiResponse {\n message: string;\n data: Omit<ActivityDetailsData, 'activity'>;\n}\n\n/**\n * Presigned URL response\n */\nexport interface PresignedUrlResponse {\n data: {\n url: string;\n fields: Record<string, string>;\n };\n}\n","/**\n * Activity Details Utilities\n * Helper functions for activity details components\n */\n\nimport type {\n StudentActivityStatus,\n StatusBadgeConfig,\n} from '../types/activityDetails';\nimport { STUDENT_ACTIVITY_STATUS } from '../types/activityDetails';\n\n/**\n * Get status badge configuration\n * @param status - Student activity status\n * @returns Status badge configuration with label and colors\n */\nexport const getStatusBadgeConfig = (\n status: StudentActivityStatus\n): StatusBadgeConfig => {\n const configs: Record<StudentActivityStatus, StatusBadgeConfig> = {\n [STUDENT_ACTIVITY_STATUS.CONCLUIDO]: {\n label: 'Concluído',\n bgColor: 'bg-green-50',\n textColor: 'text-green-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO]: {\n label: 'Aguardando Correção',\n bgColor: 'bg-yellow-50',\n textColor: 'text-yellow-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA]: {\n label: 'Aguardando Resposta',\n bgColor: 'bg-blue-50',\n textColor: 'text-blue-800',\n },\n [STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE]: {\n label: 'Não Entregue',\n bgColor: 'bg-red-50',\n textColor: 'text-red-800',\n },\n };\n\n return configs[status];\n};\n\n/**\n * Format time spent in seconds to HH:MM:SS\n * @param seconds - Time in seconds\n * @returns Formatted time string in HH:MM:SS format\n */\nexport const formatTimeSpent = (seconds: number): string => {\n const totalSeconds = Math.floor(Math.abs(seconds));\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const secs = totalSeconds % 60;\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n};\n\n/**\n * Format question numbers to display\n * @param numbers - Array of zero-based question indices\n * @returns Formatted string with question numbers (1-indexed, padded)\n */\nexport const formatQuestionNumbers = (numbers: number[]): string => {\n if (numbers.length === 0) return '-';\n\n return numbers.map((n) => String(n + 1).padStart(2, '0')).join(', ');\n};\n\n/**\n * Format date string to Brazilian format (DD/MM/YYYY)\n * @param dateString - ISO date string\n * @returns Formatted date string\n */\nexport const formatDateToBrazilian = (dateString: string): string => {\n const date = new Date(dateString);\n const day = String(date.getUTCDate()).padStart(2, '0');\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const year = date.getUTCFullYear();\n return `${day}/${month}/${year}`;\n};\n"],"mappings":"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","names":["sortedA","sortedB"]}
@@ -38,7 +38,7 @@ function arraysEqual(a, b, comparator) {
38
38
  function areFiltersEqual(filters1, filters2) {
39
39
  if (filters1 === filters2) return true;
40
40
  if (!filters1 || !filters2) return false;
41
- return arraysEqual(filters1.types, filters2.types) && arraysEqual(filters1.bankIds, filters2.bankIds) && arraysEqual(filters1.yearIds, filters2.yearIds) && arraysEqual(filters1.knowledgeIds, filters2.knowledgeIds) && arraysEqual(filters1.topicIds, filters2.topicIds) && arraysEqual(filters1.subtopicIds, filters2.subtopicIds) && arraysEqual(filters1.contentIds, filters2.contentIds);
41
+ return arraysEqual(filters1.types, filters2.types) && arraysEqual(filters1.bankIds, filters2.bankIds) && arraysEqual(filters1.yearIds, filters2.yearIds) && arraysEqual(filters1.subjectIds, filters2.subjectIds) && arraysEqual(filters1.topicIds, filters2.topicIds) && arraysEqual(filters1.subtopicIds, filters2.subtopicIds) && arraysEqual(filters1.contentIds, filters2.contentIds);
42
42
  }
43
43
 
44
44
  // src/utils/questionTypeUtils.ts
@@ -60,12 +60,19 @@ function mapQuestionTypeToEnumRequired(type, fallback = "ALTERNATIVA" /* ALTERNA
60
60
  }
61
61
 
62
62
  // src/types/activityDetails.ts
63
+ import { z } from "zod";
63
64
  var STUDENT_ACTIVITY_STATUS = {
64
65
  CONCLUIDO: "CONCLUIDO",
65
66
  AGUARDANDO_CORRECAO: "AGUARDANDO_CORRECAO",
66
67
  AGUARDANDO_RESPOSTA: "AGUARDANDO_RESPOSTA",
67
68
  NAO_ENTREGUE: "NAO_ENTREGUE"
68
69
  };
70
+ var studentActivityStatusSchema = z.enum([
71
+ STUDENT_ACTIVITY_STATUS.CONCLUIDO,
72
+ STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO,
73
+ STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA,
74
+ STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE
75
+ ]);
69
76
 
70
77
  // src/utils/activityDetailsUtils.ts
71
78
  var getStatusBadgeConfig = (status) => {
@@ -89,19 +96,15 @@ var getStatusBadgeConfig = (status) => {
89
96
  label: "N\xE3o Entregue",
90
97
  bgColor: "bg-red-50",
91
98
  textColor: "text-red-800"
92
- },
93
- default: {
94
- label: "Desconhecido",
95
- bgColor: "bg-gray-50",
96
- textColor: "text-gray-800"
97
99
  }
98
100
  };
99
- return configs[status] ?? configs.default;
101
+ return configs[status];
100
102
  };
101
103
  var formatTimeSpent = (seconds) => {
102
- const hours = Math.floor(seconds / 3600);
103
- const minutes = Math.floor(seconds % 3600 / 60);
104
- const secs = seconds % 60;
104
+ const totalSeconds = Math.floor(Math.abs(seconds));
105
+ const hours = Math.floor(totalSeconds / 3600);
106
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
107
+ const secs = totalSeconds % 60;
105
108
  return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
106
109
  };
107
110
  var formatQuestionNumbers = (numbers) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/utils.ts","../../src/utils/dropdown.ts","../../src/utils/activityFilters.ts","../../src/utils/questionTypeUtils.ts","../../src/types/activityDetails.ts","../../src/utils/activityDetailsUtils.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n} from './activityDetailsUtils';\n\n/**\n * Retorna a cor hexadecimal com opacidade 0.3 (4d) se não estiver em dark mode.\n * Se estiver em dark mode, retorna a cor original.\n *\n * @param hexColor - Cor hexadecimal (ex: \"#0066b8\" ou \"0066b8\")\n * @param isDark - booleano indicando se está em dark mode\n * @returns string - cor hexadecimal com opacidade se necessário\n */\nexport function getSubjectColorWithOpacity(\n hexColor: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!hexColor) return undefined;\n // Remove o '#' se existir\n let color = hexColor.replace(/^#/, '').toLowerCase();\n\n if (isDark) {\n // Se está em dark mode, sempre remove opacidade se existir\n if (color.length === 8) {\n color = color.slice(0, 6);\n }\n return `#${color}`;\n } else {\n // Se não está em dark mode (light mode)\n let resultColor: string;\n if (color.length === 6) {\n // Adiciona opacidade 0.3 (4D) para cores de 6 dígitos\n resultColor = `#${color}4d`;\n } else if (color.length === 8) {\n // Já tem opacidade, retorna como está\n resultColor = `#${color}`;\n } else {\n // Para outros tamanhos (3, 4, 5 dígitos), retorna como está\n resultColor = `#${color}`;\n }\n return resultColor;\n }\n}\n","import type { Dispatch, SetStateAction } from 'react';\n\n/**\n * Synchronizes dropdown state when it closes externally\n * This ensures the toggle button state matches the dropdown state\n *\n * @param open - Current dropdown open state\n * @param isActive - Current active state of the toggle button\n * @param setActiveStates - Function to update active states\n * @param key - Key identifier for the specific dropdown\n */\nexport const syncDropdownState = (\n open: boolean,\n isActive: boolean,\n setActiveStates: Dispatch<SetStateAction<Record<string, boolean>>>,\n key: string\n) => {\n if (!open && isActive) {\n setActiveStates((prev) => ({ ...prev, [key]: false }));\n }\n};\n","import type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type { ActivityFiltersData } from '../types/activityFilters';\n\n/**\n * Extracts selected IDs from knowledge categories by their keys\n * @param categories - Array of category configurations\n * @param keys - Object mapping output keys to category keys\n * @returns Object with extracted selected IDs for each output key\n */\nexport function getSelectedIdsFromCategories(\n categories: CategoryConfig[],\n keys: Record<string, string>\n): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const [outputKey, categoryKey] of Object.entries(keys)) {\n const category = categories.find((c) => c.key === categoryKey);\n result[outputKey] = category?.selectedIds || [];\n }\n\n return result;\n}\n\n/**\n * Toggles an item in an array (adds if not present, removes if present)\n * @param array - Current array\n * @param item - Item to toggle\n * @returns New array with item toggled\n */\nexport function toggleArrayItem<T>(array: T[], item: T): T[] {\n return array.includes(item)\n ? array.filter((i) => i !== item)\n : [...array, item];\n}\n\n/**\n * Toggles a single value (returns null if current value, otherwise returns new value)\n * @param currentValue - Current selected value\n * @param newValue - Value to toggle to\n * @returns New value or null if toggling off\n */\nexport function toggleSingleValue<T>(\n currentValue: T | null,\n newValue: T\n): T | null {\n return currentValue === newValue ? null : newValue;\n}\n\n/**\n * Compares two arrays for equality (order-independent)\n * @param a - First array\n * @param b - Second array\n * @param comparator - Optional comparator function. If not provided, uses string conversion and localeCompare\n * @returns true if arrays contain the same elements, false otherwise\n */\nfunction arraysEqual<T>(\n a: T[],\n b: T[],\n comparator?: (x: T, y: T) => number\n): boolean {\n if (a.length !== b.length) return false;\n\n if (comparator) {\n const sortedA = [...a].sort(comparator);\n const sortedB = [...b].sort(comparator);\n return sortedA.every((val, index) => val === sortedB[index]);\n }\n\n const sortedA = [...a].sort((x, y) => String(x).localeCompare(String(y)));\n const sortedB = [...b].sort((x, y) => String(x).localeCompare(String(y)));\n return sortedA.every((val, index) => val === sortedB[index]);\n}\n\nexport function areFiltersEqual(\n filters1: ActivityFiltersData | null,\n filters2: ActivityFiltersData | null\n): boolean {\n if (filters1 === filters2) return true;\n if (!filters1 || !filters2) return false;\n\n return (\n arraysEqual(filters1.types, filters2.types) &&\n arraysEqual(filters1.bankIds, filters2.bankIds) &&\n arraysEqual(filters1.yearIds, filters2.yearIds) &&\n arraysEqual(filters1.knowledgeIds, filters2.knowledgeIds) &&\n arraysEqual(filters1.topicIds, filters2.topicIds) &&\n arraysEqual(filters1.subtopicIds, filters2.subtopicIds) &&\n arraysEqual(filters1.contentIds, filters2.contentIds)\n );\n}\n","import { QUESTION_TYPE } from '../components/Quiz/useQuizStore';\n\n/**\n * Maps API question type string to QUESTION_TYPE enum\n * Converts input to uppercase for case-insensitive matching\n *\n * @param type - Question type string from API\n * @param fallback - Optional fallback QUESTION_TYPE if mapping fails. If not provided, returns null\n * @returns QUESTION_TYPE enum value or null/fallback if not found\n */\nexport function mapQuestionTypeToEnum(\n type: string,\n fallback?: QUESTION_TYPE\n): QUESTION_TYPE | null {\n const upperType = type.toUpperCase();\n\n const typeMap: Record<string, QUESTION_TYPE> = {\n ALTERNATIVA: QUESTION_TYPE.ALTERNATIVA,\n DISSERTATIVA: QUESTION_TYPE.DISSERTATIVA,\n MULTIPLA_ESCOLHA: QUESTION_TYPE.MULTIPLA_ESCOLHA,\n VERDADEIRO_FALSO: QUESTION_TYPE.VERDADEIRO_FALSO,\n IMAGEM: QUESTION_TYPE.IMAGEM,\n LIGAR_PONTOS: QUESTION_TYPE.LIGAR_PONTOS,\n PREENCHER: QUESTION_TYPE.PREENCHER,\n };\n\n return typeMap[upperType] ?? fallback ?? null;\n}\n\n/**\n * Maps API question type string to QUESTION_TYPE enum with required fallback\n * Always returns a QUESTION_TYPE (never null)\n *\n * @param type - Question type string from API\n * @param fallback - Fallback QUESTION_TYPE if mapping fails (defaults to ALTERNATIVA)\n * @returns QUESTION_TYPE enum value\n */\nexport function mapQuestionTypeToEnumRequired(\n type: string,\n fallback: QUESTION_TYPE = QUESTION_TYPE.ALTERNATIVA\n): QUESTION_TYPE {\n return mapQuestionTypeToEnum(type, fallback) ?? fallback;\n}\n","/**\n * Activity Details Types\n * Types and helper functions for activity details components\n */\n\n/**\n * Student activity status enum\n */\nexport const STUDENT_ACTIVITY_STATUS = {\n CONCLUIDO: 'CONCLUIDO',\n AGUARDANDO_CORRECAO: 'AGUARDANDO_CORRECAO',\n AGUARDANDO_RESPOSTA: 'AGUARDANDO_RESPOSTA',\n NAO_ENTREGUE: 'NAO_ENTREGUE',\n} as const;\n\nexport type StudentActivityStatus =\n (typeof STUDENT_ACTIVITY_STATUS)[keyof typeof STUDENT_ACTIVITY_STATUS];\n\n/**\n * Student data interface\n */\nexport interface ActivityStudentData {\n studentId: string;\n studentName: string;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n status: StudentActivityStatus;\n}\n\n/**\n * Pagination interface\n */\nexport interface Pagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n hasNext?: boolean;\n hasPrev?: boolean;\n}\n\n/**\n * General statistics interface\n */\nexport interface GeneralStats {\n averageScore: number;\n completionPercentage: number;\n}\n\n/**\n * Question statistics interface\n */\nexport interface QuestionStats {\n mostCorrect: number[];\n mostIncorrect: number[];\n notAnswered: number[];\n}\n\n/**\n * Activity metadata interface\n */\nexport interface ActivityMetadata {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n schoolName: string;\n year: string;\n subjectName: string;\n className: string;\n}\n\n/**\n * Activity details data interface\n */\nexport interface ActivityDetailsData {\n activity?: ActivityMetadata;\n students: ActivityStudentData[];\n pagination: Pagination;\n generalStats: GeneralStats;\n questionStats: QuestionStats;\n}\n\n/**\n * Activity details query params interface\n */\nexport interface ActivityDetailsQueryParams {\n page?: number;\n limit?: number;\n sortBy?: 'name' | 'score' | 'answeredAt';\n sortOrder?: 'asc' | 'desc';\n status?: StudentActivityStatus;\n}\n\n/**\n * Activity student table item interface\n */\nexport interface ActivityStudentTableItem extends Record<string, unknown> {\n id: string;\n studentId: string;\n studentName: string;\n status: StudentActivityStatus;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n}\n\n/**\n * Status badge configuration interface\n */\nexport interface StatusBadgeConfig {\n label: string;\n bgColor: string;\n textColor: string;\n}\n\n/**\n * Activity availability status enum\n * Used to determine if an activity is available based on start/end dates\n */\nexport const ACTIVITY_AVAILABILITY = {\n DISPONIVEL: 'DISPONIVEL',\n NAO_INICIADA: 'NAO_INICIADA',\n EXPIRADA: 'EXPIRADA',\n} as const;\n\nexport type ActivityAvailability =\n (typeof ACTIVITY_AVAILABILITY)[keyof typeof ACTIVITY_AVAILABILITY];\n","/**\n * Activity Details Utilities\n * Helper functions for activity details components\n */\n\nimport type {\n StudentActivityStatus,\n StatusBadgeConfig,\n} from '../types/activityDetails';\nimport { STUDENT_ACTIVITY_STATUS } from '../types/activityDetails';\n\n/**\n * Get status badge configuration\n * @param status - Student activity status\n * @returns Status badge configuration object\n */\nexport const getStatusBadgeConfig = (\n status: StudentActivityStatus\n): StatusBadgeConfig => {\n const configs: Record<string, StatusBadgeConfig> = {\n [STUDENT_ACTIVITY_STATUS.CONCLUIDO]: {\n label: 'Concluído',\n bgColor: 'bg-green-50',\n textColor: 'text-green-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO]: {\n label: 'Aguardando Correção',\n bgColor: 'bg-yellow-50',\n textColor: 'text-yellow-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA]: {\n label: 'Aguardando Resposta',\n bgColor: 'bg-blue-50',\n textColor: 'text-blue-800',\n },\n [STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE]: {\n label: 'Não Entregue',\n bgColor: 'bg-red-50',\n textColor: 'text-red-800',\n },\n default: {\n label: 'Desconhecido',\n bgColor: 'bg-gray-50',\n textColor: 'text-gray-800',\n },\n };\n\n return configs[status] ?? configs.default;\n};\n\n/**\n * Format time spent in seconds to HH:MM:SS\n * @param seconds - Time in seconds\n * @returns Formatted time string\n */\nexport const formatTimeSpent = (seconds: number): string => {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n};\n\n/**\n * Format question numbers to display\n * @param numbers - Array of question numbers (0-indexed)\n * @returns Formatted string of question numbers\n */\nexport const formatQuestionNumbers = (numbers: number[]): string => {\n if (numbers.length === 0) return '-';\n return numbers.map((n) => String(n + 1).padStart(2, '0')).join(', ');\n};\n\n/**\n * Format date string to Brazilian format (DD/MM/YYYY)\n * @param dateString - ISO date string\n * @returns Formatted date string\n */\nexport const formatDateToBrazilian = (dateString: string): string => {\n const date = new Date(dateString);\n const day = String(date.getUTCDate()).padStart(2, '0');\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const year = date.getUTCFullYear();\n return `${day}/${month}/${year}`;\n};\n"],"mappings":"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","names":["sortedA","sortedB"]}
1
+ {"version":3,"sources":["../../src/utils/utils.ts","../../src/utils/dropdown.ts","../../src/utils/activityFilters.ts","../../src/utils/questionTypeUtils.ts","../../src/types/activityDetails.ts","../../src/utils/activityDetailsUtils.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n} from './activityDetailsUtils';\n\n/**\n * Retorna a cor hexadecimal com opacidade 0.3 (4d) se não estiver em dark mode.\n * Se estiver em dark mode, retorna a cor original.\n *\n * @param hexColor - Cor hexadecimal (ex: \"#0066b8\" ou \"0066b8\")\n * @param isDark - booleano indicando se está em dark mode\n * @returns string - cor hexadecimal com opacidade se necessário\n */\nexport function getSubjectColorWithOpacity(\n hexColor: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!hexColor) return undefined;\n // Remove o '#' se existir\n let color = hexColor.replace(/^#/, '').toLowerCase();\n\n if (isDark) {\n // Se está em dark mode, sempre remove opacidade se existir\n if (color.length === 8) {\n color = color.slice(0, 6);\n }\n return `#${color}`;\n } else {\n // Se não está em dark mode (light mode)\n let resultColor: string;\n if (color.length === 6) {\n // Adiciona opacidade 0.3 (4D) para cores de 6 dígitos\n resultColor = `#${color}4d`;\n } else if (color.length === 8) {\n // Já tem opacidade, retorna como está\n resultColor = `#${color}`;\n } else {\n // Para outros tamanhos (3, 4, 5 dígitos), retorna como está\n resultColor = `#${color}`;\n }\n return resultColor;\n }\n}\n","import type { Dispatch, SetStateAction } from 'react';\n\n/**\n * Synchronizes dropdown state when it closes externally\n * This ensures the toggle button state matches the dropdown state\n *\n * @param open - Current dropdown open state\n * @param isActive - Current active state of the toggle button\n * @param setActiveStates - Function to update active states\n * @param key - Key identifier for the specific dropdown\n */\nexport const syncDropdownState = (\n open: boolean,\n isActive: boolean,\n setActiveStates: Dispatch<SetStateAction<Record<string, boolean>>>,\n key: string\n) => {\n if (!open && isActive) {\n setActiveStates((prev) => ({ ...prev, [key]: false }));\n }\n};\n","import type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type { ActivityFiltersData } from '../types/activityFilters';\n\n/**\n * Extracts selected IDs from knowledge categories by their keys\n * @param categories - Array of category configurations\n * @param keys - Object mapping output keys to category keys\n * @returns Object with extracted selected IDs for each output key\n */\nexport function getSelectedIdsFromCategories(\n categories: CategoryConfig[],\n keys: Record<string, string>\n): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const [outputKey, categoryKey] of Object.entries(keys)) {\n const category = categories.find((c) => c.key === categoryKey);\n result[outputKey] = category?.selectedIds || [];\n }\n\n return result;\n}\n\n/**\n * Toggles an item in an array (adds if not present, removes if present)\n * @param array - Current array\n * @param item - Item to toggle\n * @returns New array with item toggled\n */\nexport function toggleArrayItem<T>(array: T[], item: T): T[] {\n return array.includes(item)\n ? array.filter((i) => i !== item)\n : [...array, item];\n}\n\n/**\n * Toggles a single value (returns null if current value, otherwise returns new value)\n * @param currentValue - Current selected value\n * @param newValue - Value to toggle to\n * @returns New value or null if toggling off\n */\nexport function toggleSingleValue<T>(\n currentValue: T | null,\n newValue: T\n): T | null {\n return currentValue === newValue ? null : newValue;\n}\n\n/**\n * Compares two arrays for equality (order-independent)\n * @param a - First array\n * @param b - Second array\n * @param comparator - Optional comparator function. If not provided, uses string conversion and localeCompare\n * @returns true if arrays contain the same elements, false otherwise\n */\nfunction arraysEqual<T>(\n a: T[],\n b: T[],\n comparator?: (x: T, y: T) => number\n): boolean {\n if (a.length !== b.length) return false;\n\n if (comparator) {\n const sortedA = [...a].sort(comparator);\n const sortedB = [...b].sort(comparator);\n return sortedA.every((val, index) => val === sortedB[index]);\n }\n\n const sortedA = [...a].sort((x, y) => String(x).localeCompare(String(y)));\n const sortedB = [...b].sort((x, y) => String(x).localeCompare(String(y)));\n return sortedA.every((val, index) => val === sortedB[index]);\n}\n\nexport function areFiltersEqual(\n filters1: ActivityFiltersData | null,\n filters2: ActivityFiltersData | null\n): boolean {\n if (filters1 === filters2) return true;\n if (!filters1 || !filters2) return false;\n\n return (\n arraysEqual(filters1.types, filters2.types) &&\n arraysEqual(filters1.bankIds, filters2.bankIds) &&\n arraysEqual(filters1.yearIds, filters2.yearIds) &&\n arraysEqual(filters1.subjectIds, filters2.subjectIds) &&\n arraysEqual(filters1.topicIds, filters2.topicIds) &&\n arraysEqual(filters1.subtopicIds, filters2.subtopicIds) &&\n arraysEqual(filters1.contentIds, filters2.contentIds)\n );\n}\n","import { QUESTION_TYPE } from '../components/Quiz/useQuizStore';\n\n/**\n * Maps API question type string to QUESTION_TYPE enum\n * Converts input to uppercase for case-insensitive matching\n *\n * @param type - Question type string from API\n * @param fallback - Optional fallback QUESTION_TYPE if mapping fails. If not provided, returns null\n * @returns QUESTION_TYPE enum value or null/fallback if not found\n */\nexport function mapQuestionTypeToEnum(\n type: string,\n fallback?: QUESTION_TYPE\n): QUESTION_TYPE | null {\n const upperType = type.toUpperCase();\n\n const typeMap: Record<string, QUESTION_TYPE> = {\n ALTERNATIVA: QUESTION_TYPE.ALTERNATIVA,\n DISSERTATIVA: QUESTION_TYPE.DISSERTATIVA,\n MULTIPLA_ESCOLHA: QUESTION_TYPE.MULTIPLA_ESCOLHA,\n VERDADEIRO_FALSO: QUESTION_TYPE.VERDADEIRO_FALSO,\n IMAGEM: QUESTION_TYPE.IMAGEM,\n LIGAR_PONTOS: QUESTION_TYPE.LIGAR_PONTOS,\n PREENCHER: QUESTION_TYPE.PREENCHER,\n };\n\n return typeMap[upperType] ?? fallback ?? null;\n}\n\n/**\n * Maps API question type string to QUESTION_TYPE enum with required fallback\n * Always returns a QUESTION_TYPE (never null)\n *\n * @param type - Question type string from API\n * @param fallback - Fallback QUESTION_TYPE if mapping fails (defaults to ALTERNATIVA)\n * @returns QUESTION_TYPE enum value\n */\nexport function mapQuestionTypeToEnumRequired(\n type: string,\n fallback: QUESTION_TYPE = QUESTION_TYPE.ALTERNATIVA\n): QUESTION_TYPE {\n return mapQuestionTypeToEnum(type, fallback) ?? fallback;\n}\n","/**\n * Activity Details Types\n * Types and helper functions for activity details components\n */\n\nimport { z } from 'zod';\n\n/**\n * Student activity status enum\n */\nexport const STUDENT_ACTIVITY_STATUS = {\n CONCLUIDO: 'CONCLUIDO',\n AGUARDANDO_CORRECAO: 'AGUARDANDO_CORRECAO',\n AGUARDANDO_RESPOSTA: 'AGUARDANDO_RESPOSTA',\n NAO_ENTREGUE: 'NAO_ENTREGUE',\n} as const;\n\nexport type StudentActivityStatus =\n (typeof STUDENT_ACTIVITY_STATUS)[keyof typeof STUDENT_ACTIVITY_STATUS];\n\n/**\n * Zod schema for student activity status\n */\nexport const studentActivityStatusSchema = z.enum([\n STUDENT_ACTIVITY_STATUS.CONCLUIDO,\n STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO,\n STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA,\n STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE,\n]);\n\n/**\n * Student data interface\n */\nexport interface ActivityStudentData {\n studentId: string;\n studentName: string;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n status: StudentActivityStatus;\n}\n\n/**\n * Pagination interface\n */\nexport interface Pagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n hasNext?: boolean;\n hasPrev?: boolean;\n}\n\n/**\n * General statistics interface\n */\nexport interface GeneralStats {\n averageScore: number;\n completionPercentage: number;\n}\n\n/**\n * Question statistics interface\n */\nexport interface QuestionStats {\n mostCorrect: number[];\n mostIncorrect: number[];\n notAnswered: number[];\n}\n\n/**\n * Activity metadata interface\n */\nexport interface ActivityMetadata {\n id: string;\n title: string;\n type?: string;\n startDate: string | null;\n finalDate: string | null;\n schoolName: string;\n year: string;\n subjectName: string;\n className: string;\n}\n\n/**\n * Activity details data interface\n */\nexport interface ActivityDetailsData {\n activity?: ActivityMetadata;\n students: ActivityStudentData[];\n pagination: Pagination;\n generalStats: GeneralStats;\n questionStats: QuestionStats;\n}\n\n/**\n * Activity details query params interface\n */\nexport interface ActivityDetailsQueryParams {\n page?: number;\n limit?: number;\n sortBy?: 'name' | 'score' | 'answeredAt';\n sortOrder?: 'asc' | 'desc';\n status?: StudentActivityStatus;\n}\n\n/**\n * Activity student table item interface\n */\nexport interface ActivityStudentTableItem extends Record<string, unknown> {\n id: string;\n studentId: string;\n studentName: string;\n status: StudentActivityStatus;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n}\n\n/**\n * Status badge configuration interface\n */\nexport interface StatusBadgeConfig {\n label: string;\n bgColor: string;\n textColor: string;\n}\n\n/**\n * Activity availability status enum\n * Used to determine if an activity is available based on start/end dates\n */\nexport const ACTIVITY_AVAILABILITY = {\n DISPONIVEL: 'DISPONIVEL',\n NAO_INICIADA: 'NAO_INICIADA',\n EXPIRADA: 'EXPIRADA',\n} as const;\n\nexport type ActivityAvailability =\n (typeof ACTIVITY_AVAILABILITY)[keyof typeof ACTIVITY_AVAILABILITY];\n\n/**\n * Quiz API response\n */\nexport interface QuizResponse {\n message: string;\n data: ActivityMetadata;\n}\n\n/**\n * Activity details API response (without activity)\n */\nexport interface ActivityDetailsApiResponse {\n message: string;\n data: Omit<ActivityDetailsData, 'activity'>;\n}\n\n/**\n * Presigned URL response\n */\nexport interface PresignedUrlResponse {\n data: {\n url: string;\n fields: Record<string, string>;\n };\n}\n","/**\n * Activity Details Utilities\n * Helper functions for activity details components\n */\n\nimport type {\n StudentActivityStatus,\n StatusBadgeConfig,\n} from '../types/activityDetails';\nimport { STUDENT_ACTIVITY_STATUS } from '../types/activityDetails';\n\n/**\n * Get status badge configuration\n * @param status - Student activity status\n * @returns Status badge configuration with label and colors\n */\nexport const getStatusBadgeConfig = (\n status: StudentActivityStatus\n): StatusBadgeConfig => {\n const configs: Record<StudentActivityStatus, StatusBadgeConfig> = {\n [STUDENT_ACTIVITY_STATUS.CONCLUIDO]: {\n label: 'Concluído',\n bgColor: 'bg-green-50',\n textColor: 'text-green-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_CORRECAO]: {\n label: 'Aguardando Correção',\n bgColor: 'bg-yellow-50',\n textColor: 'text-yellow-800',\n },\n [STUDENT_ACTIVITY_STATUS.AGUARDANDO_RESPOSTA]: {\n label: 'Aguardando Resposta',\n bgColor: 'bg-blue-50',\n textColor: 'text-blue-800',\n },\n [STUDENT_ACTIVITY_STATUS.NAO_ENTREGUE]: {\n label: 'Não Entregue',\n bgColor: 'bg-red-50',\n textColor: 'text-red-800',\n },\n };\n\n return configs[status];\n};\n\n/**\n * Format time spent in seconds to HH:MM:SS\n * @param seconds - Time in seconds\n * @returns Formatted time string in HH:MM:SS format\n */\nexport const formatTimeSpent = (seconds: number): string => {\n const totalSeconds = Math.floor(Math.abs(seconds));\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const secs = totalSeconds % 60;\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n};\n\n/**\n * Format question numbers to display\n * @param numbers - Array of zero-based question indices\n * @returns Formatted string with question numbers (1-indexed, padded)\n */\nexport const formatQuestionNumbers = (numbers: number[]): string => {\n if (numbers.length === 0) return '-';\n\n return numbers.map((n) => String(n + 1).padStart(2, '0')).join(', ');\n};\n\n/**\n * Format date string to Brazilian format (DD/MM/YYYY)\n * @param dateString - ISO date string\n * @returns Formatted date string\n */\nexport const formatDateToBrazilian = (dateString: string): string => {\n const date = new Date(dateString);\n const day = String(date.getUTCDate()).padStart(2, '0');\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const year = date.getUTCFullYear();\n return `${day}/${month}/${year}`;\n};\n"],"mappings":"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","names":["sortedA","sortedB"]}
@@ -1 +1 @@
1
- {"version":3,"file":"questionFiltersConverter.d.ts","sourceRoot":"","sources":["../../src/utils/questionFiltersConverter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,uCAAuC,GAClD,SAAS,mBAAmB,KAC3B,mBAYF,CAAC"}
1
+ {"version":3,"file":"questionFiltersConverter.d.ts","sourceRoot":"","sources":["../../src/utils/questionFiltersConverter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,uCAAuC,GAClD,SAAS,mBAAmB,KAC3B,mBASF,CAAC"}
@@ -64,15 +64,15 @@ export interface StudentActivityCorrectionData {
64
64
  /**
65
65
  * Payload for saving question correction (for essay questions)
66
66
  */
67
- export interface SaveQuestionCorrectionPayload {
67
+ export interface SaveQuestionCorrectionPayload extends Record<string, unknown> {
68
68
  /** Question ID from Question interface */
69
69
  questionId: string;
70
- /** Question number in the activity (for reference) */
71
- questionNumber: number;
72
70
  /** Whether the answer is correct */
73
- isCorrect: boolean;
71
+ isCorrect?: boolean | null;
72
+ /** Score for the question */
73
+ score?: number | null;
74
74
  /** Teacher observation/feedback */
75
- teacherFeedback?: string;
75
+ teacherFeedback?: string | null;
76
76
  }
77
77
  /**
78
78
  * API response structure for fetchQuestionsAnswersByStudent
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/studentActivityCorrection/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,8CAA8C;IAC9C,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1C,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,cAAc,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/studentActivityCorrection/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,8CAA8C;IAC9C,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1C,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA8B,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5E,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,cAAc,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "analytica-frontend-lib",
3
- "version": "1.2.70",
3
+ "version": "1.2.72",
4
4
  "description": "Repositório público dos componentes utilizados nas plataformas da Analytica Ensino",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "./dist/index.js",