@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.26 → 1.0.0-alpha.28

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 (102) hide show
  1. package/dist/certificates/CertificatesPage.js +106 -54
  2. package/dist/certificates/CertificatesPage.js.map +1 -1
  3. package/dist/certificates/CertificatesPage.scss +9 -0
  4. package/dist/certificates/components/CertificateTable.d.ts +1 -1
  5. package/dist/certificates/components/CertificateTable.js +9 -6
  6. package/dist/certificates/components/CertificateTable.js.map +1 -1
  7. package/dist/certificates/components/CertificatesPageHeader.js +3 -3
  8. package/dist/certificates/components/CertificatesPageHeader.js.map +1 -1
  9. package/dist/certificates/components/CertificatesToolbar.d.ts +2 -1
  10. package/dist/certificates/components/CertificatesToolbar.js +23 -3
  11. package/dist/certificates/components/CertificatesToolbar.js.map +1 -1
  12. package/dist/certificates/components/DisableCertificatesModal.js +1 -1
  13. package/dist/certificates/components/DisableCertificatesModal.js.map +1 -1
  14. package/dist/certificates/components/FilterDropdown.d.ts +1 -1
  15. package/dist/certificates/components/FilterDropdown.js +2 -2
  16. package/dist/certificates/components/FilterDropdown.js.map +1 -1
  17. package/dist/certificates/components/GenerationHistoryTable.d.ts +2 -2
  18. package/dist/certificates/components/GenerationHistoryTable.js +3 -18
  19. package/dist/certificates/components/GenerationHistoryTable.js.map +1 -1
  20. package/dist/certificates/components/GrantExceptionsModal.d.ts +1 -1
  21. package/dist/certificates/components/GrantExceptionsModal.js +2 -2
  22. package/dist/certificates/components/GrantExceptionsModal.js.map +1 -1
  23. package/dist/certificates/components/InvalidateCertificateModal.d.ts +1 -1
  24. package/dist/certificates/components/InvalidateCertificateModal.js +2 -2
  25. package/dist/certificates/components/InvalidateCertificateModal.js.map +1 -1
  26. package/dist/certificates/components/IssuedCertificatesTab.d.ts +1 -1
  27. package/dist/certificates/components/IssuedCertificatesTab.js +2 -2
  28. package/dist/certificates/components/IssuedCertificatesTab.js.map +1 -1
  29. package/dist/certificates/components/LearnerActionModal.d.ts +1 -1
  30. package/dist/certificates/components/LearnerActionModal.js +7 -2
  31. package/dist/certificates/components/LearnerActionModal.js.map +1 -1
  32. package/dist/certificates/components/RemoveExceptionModal.d.ts +9 -0
  33. package/dist/certificates/components/RemoveExceptionModal.js +10 -0
  34. package/dist/certificates/components/RemoveExceptionModal.js.map +1 -0
  35. package/dist/certificates/components/RemoveInvalidationModal.js +1 -1
  36. package/dist/certificates/components/RemoveInvalidationModal.js.map +1 -1
  37. package/dist/certificates/data/api.d.ts +17 -3
  38. package/dist/certificates/data/api.js +60 -8
  39. package/dist/certificates/data/api.js.map +1 -1
  40. package/dist/certificates/data/apiHook.d.ts +25 -5
  41. package/dist/certificates/data/apiHook.js +30 -2
  42. package/dist/certificates/data/apiHook.js.map +1 -1
  43. package/dist/certificates/data/queryKeys.d.ts +2 -1
  44. package/dist/certificates/data/queryKeys.js +1 -0
  45. package/dist/certificates/data/queryKeys.js.map +1 -1
  46. package/dist/certificates/messages.d.ts +30 -0
  47. package/dist/certificates/messages.js +30 -0
  48. package/dist/certificates/messages.js.map +1 -1
  49. package/dist/certificates/types.d.ts +7 -2
  50. package/dist/certificates/types.js.map +1 -1
  51. package/dist/certificates/utils/filterUtils.d.ts +1 -1
  52. package/dist/certificates/utils/filterUtils.js +1 -1
  53. package/dist/certificates/utils/filterUtils.js.map +1 -1
  54. package/dist/certificates/utils/index.d.ts +2 -2
  55. package/dist/certificates/utils/index.js +1 -1
  56. package/dist/certificates/utils/index.js.map +1 -1
  57. package/dist/components/SpecifyLearnerField.js +10 -4
  58. package/dist/components/SpecifyLearnerField.js.map +1 -1
  59. package/dist/components/messages.d.ts +5 -0
  60. package/dist/components/messages.js +6 -1
  61. package/dist/components/messages.js.map +1 -1
  62. package/dist/courseInfo/types.d.ts +1 -0
  63. package/dist/courseInfo/types.js.map +1 -1
  64. package/dist/specialExams/SpecialExamsPage.js +6 -2
  65. package/dist/specialExams/SpecialExamsPage.js.map +1 -1
  66. package/dist/specialExams/components/AddAllowanceModal.d.ts +6 -0
  67. package/dist/specialExams/components/AddAllowanceModal.js +84 -0
  68. package/dist/specialExams/components/AddAllowanceModal.js.map +1 -0
  69. package/dist/specialExams/components/Allowances.js +28 -2
  70. package/dist/specialExams/components/Allowances.js.map +1 -1
  71. package/dist/specialExams/components/AllowancesList.d.ts +8 -0
  72. package/dist/specialExams/components/AllowancesList.js +58 -0
  73. package/dist/specialExams/components/AllowancesList.js.map +1 -0
  74. package/dist/specialExams/components/AttemptsList.js +8 -7
  75. package/dist/specialExams/components/AttemptsList.js.map +1 -1
  76. package/dist/specialExams/components/DeleteAllowanceModal.d.ts +8 -0
  77. package/dist/specialExams/components/DeleteAllowanceModal.js +29 -0
  78. package/dist/specialExams/components/DeleteAllowanceModal.js.map +1 -0
  79. package/dist/specialExams/components/EditAllowanceModal.d.ts +8 -0
  80. package/dist/specialExams/components/EditAllowanceModal.js +62 -0
  81. package/dist/specialExams/components/EditAllowanceModal.js.map +1 -0
  82. package/dist/specialExams/constants.d.ts +43 -0
  83. package/dist/specialExams/constants.js +19 -0
  84. package/dist/specialExams/constants.js.map +1 -0
  85. package/dist/specialExams/data/api.d.ts +5 -1
  86. package/dist/specialExams/data/api.js +28 -2
  87. package/dist/specialExams/data/api.js.map +1 -1
  88. package/dist/specialExams/data/apiHook.d.ts +5 -1
  89. package/dist/specialExams/data/apiHook.js +30 -2
  90. package/dist/specialExams/data/apiHook.js.map +1 -1
  91. package/dist/specialExams/data/queryKeys.d.ts +4 -1
  92. package/dist/specialExams/data/queryKeys.js +4 -1
  93. package/dist/specialExams/data/queryKeys.js.map +1 -1
  94. package/dist/specialExams/messages.d.ts +165 -0
  95. package/dist/specialExams/messages.js +165 -0
  96. package/dist/specialExams/messages.js.map +1 -1
  97. package/dist/specialExams/types.d.ts +55 -4
  98. package/dist/specialExams/types.js.map +1 -1
  99. package/package.json +1 -1
  100. package/dist/certificates/data/dummyData.d.ts +0 -2
  101. package/dist/certificates/data/dummyData.js +0 -234
  102. package/dist/certificates/data/dummyData.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
2
- import { getInstructorTasks, getIssuedCertificates, grantBulkExceptions, invalidateCertificate, removeException, removeInvalidation, toggleCertificateGeneration, } from './api';
3
- import { certificatesQueryKeys } from './queryKeys';
2
+ import { getCertificateGenerationHistory, getInstructorTasks, getIssuedCertificates, grantBulkExceptions, invalidateCertificate, regenerateCertificates, removeException, removeInvalidation, toggleCertificateGeneration, } from '../../certificates/data/api';
3
+ import { certificatesQueryKeys } from '../../certificates/data/queryKeys';
4
4
  /**
5
5
  * Hook to fetch issued certificates
6
6
  */
@@ -17,6 +17,14 @@ export const useInstructorTasks = (courseId, params) => useQuery({
17
17
  queryFn: () => getInstructorTasks(courseId, params),
18
18
  enabled: !!courseId,
19
19
  });
20
+ /**
21
+ * Hook to fetch certificate generation history
22
+ */
23
+ export const useCertificateGenerationHistory = (courseId, params) => useQuery({
24
+ queryKey: certificatesQueryKeys.generationHistory(courseId, params),
25
+ queryFn: () => getCertificateGenerationHistory(courseId, params),
26
+ enabled: !!courseId,
27
+ });
20
28
  /**
21
29
  * Hook to grant bulk certificate exceptions
22
30
  */
@@ -27,6 +35,7 @@ export const useGrantBulkExceptions = (courseId) => {
27
35
  onSuccess: () => {
28
36
  queryClient.invalidateQueries({
29
37
  queryKey: certificatesQueryKeys.byCourse(courseId),
38
+ exact: false,
30
39
  });
31
40
  },
32
41
  });
@@ -41,6 +50,7 @@ export const useInvalidateCertificate = (courseId) => {
41
50
  onSuccess: () => {
42
51
  queryClient.invalidateQueries({
43
52
  queryKey: certificatesQueryKeys.byCourse(courseId),
53
+ exact: false,
44
54
  });
45
55
  },
46
56
  });
@@ -55,6 +65,7 @@ export const useRemoveException = (courseId) => {
55
65
  onSuccess: () => {
56
66
  queryClient.invalidateQueries({
57
67
  queryKey: certificatesQueryKeys.byCourse(courseId),
68
+ exact: false,
58
69
  });
59
70
  },
60
71
  });
@@ -69,6 +80,7 @@ export const useRemoveInvalidation = (courseId) => {
69
80
  onSuccess: () => {
70
81
  queryClient.invalidateQueries({
71
82
  queryKey: certificatesQueryKeys.byCourse(courseId),
83
+ exact: false,
72
84
  });
73
85
  },
74
86
  });
@@ -83,6 +95,22 @@ export const useToggleCertificateGeneration = (courseId) => {
83
95
  onSuccess: () => {
84
96
  queryClient.invalidateQueries({
85
97
  queryKey: certificatesQueryKeys.byCourse(courseId),
98
+ exact: false,
99
+ });
100
+ },
101
+ });
102
+ };
103
+ /**
104
+ * Hook to regenerate certificates
105
+ */
106
+ export const useRegenerateCertificates = (courseId) => {
107
+ const queryClient = useQueryClient();
108
+ return useMutation({
109
+ mutationFn: (filter) => regenerateCertificates(courseId, filter),
110
+ onSuccess: () => {
111
+ queryClient.invalidateQueries({
112
+ queryKey: certificatesQueryKeys.byCourse(courseId),
113
+ exact: false,
86
114
  });
87
115
  },
88
116
  });
@@ -1 +1 @@
1
- {"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/certificates/data/apiHook.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport type { PaginationParams } from '@src/types';\nimport type {\n CertificateQueryParams,\n GrantExceptionRequest,\n InvalidateCertificateRequest,\n RemoveExceptionRequest,\n RemoveInvalidationRequest,\n} from '../types';\nimport {\n getInstructorTasks,\n getIssuedCertificates,\n grantBulkExceptions,\n invalidateCertificate,\n removeException,\n removeInvalidation,\n toggleCertificateGeneration,\n} from './api';\nimport { certificatesQueryKeys } from './queryKeys';\n\n/**\n * Hook to fetch issued certificates\n */\nexport const useIssuedCertificates = (courseId: string, params: CertificateQueryParams) =>\n useQuery({\n queryKey: certificatesQueryKeys.issued(courseId, params),\n queryFn: () => getIssuedCertificates(courseId, params),\n enabled: !!courseId,\n });\n\n/**\n * Hook to fetch instructor tasks\n */\nexport const useInstructorTasks = (courseId: string, params: PaginationParams) =>\n useQuery({\n queryKey: certificatesQueryKeys.tasks(courseId, params),\n queryFn: () => getInstructorTasks(courseId, params),\n enabled: !!courseId,\n });\n\n/**\n * Hook to grant bulk certificate exceptions\n */\nexport const useGrantBulkExceptions = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: GrantExceptionRequest) => grantBulkExceptions(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n });\n },\n });\n};\n\n/**\n * Hook to invalidate certificate\n */\nexport const useInvalidateCertificate = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: InvalidateCertificateRequest) => invalidateCertificate(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n });\n },\n });\n};\n\n/**\n * Hook to remove certificate exception\n */\nexport const useRemoveException = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: RemoveExceptionRequest) => removeException(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n });\n },\n });\n};\n\n/**\n * Hook to remove certificate invalidation\n */\nexport const useRemoveInvalidation = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: RemoveInvalidationRequest) => removeInvalidation(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n });\n },\n });\n};\n\n/**\n * Hook to toggle certificate generation\n */\nexport const useToggleCertificateGeneration = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (enable: boolean) => toggleCertificateGeneration(courseId, enable),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n });\n },\n });\n};\n"]}
1
+ {"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/certificates/data/apiHook.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport type { PaginationParams } from '@src/types';\nimport type {\n CertificateQueryParams,\n GrantExceptionRequest,\n InvalidateCertificateRequest,\n RemoveExceptionRequest,\n RemoveInvalidationRequest,\n} from '@src/certificates/types';\nimport {\n getCertificateGenerationHistory,\n getInstructorTasks,\n getIssuedCertificates,\n grantBulkExceptions,\n invalidateCertificate,\n regenerateCertificates,\n removeException,\n removeInvalidation,\n toggleCertificateGeneration,\n} from '@src/certificates/data/api';\nimport { certificatesQueryKeys } from '@src/certificates/data/queryKeys';\n\n/**\n * Hook to fetch issued certificates\n */\nexport const useIssuedCertificates = (courseId: string, params: CertificateQueryParams) =>\n useQuery({\n queryKey: certificatesQueryKeys.issued(courseId, params),\n queryFn: () => getIssuedCertificates(courseId, params),\n enabled: !!courseId,\n });\n\n/**\n * Hook to fetch instructor tasks\n */\nexport const useInstructorTasks = (courseId: string, params: PaginationParams) =>\n useQuery({\n queryKey: certificatesQueryKeys.tasks(courseId, params),\n queryFn: () => getInstructorTasks(courseId, params),\n enabled: !!courseId,\n });\n\n/**\n * Hook to fetch certificate generation history\n */\nexport const useCertificateGenerationHistory = (courseId: string, params: PaginationParams) =>\n useQuery({\n queryKey: certificatesQueryKeys.generationHistory(courseId, params),\n queryFn: () => getCertificateGenerationHistory(courseId, params),\n enabled: !!courseId,\n });\n\n/**\n * Hook to grant bulk certificate exceptions\n */\nexport const useGrantBulkExceptions = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: GrantExceptionRequest) => grantBulkExceptions(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n exact: false,\n });\n },\n });\n};\n\n/**\n * Hook to invalidate certificate\n */\nexport const useInvalidateCertificate = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: InvalidateCertificateRequest) => invalidateCertificate(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n exact: false,\n });\n },\n });\n};\n\n/**\n * Hook to remove certificate exception\n */\nexport const useRemoveException = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: RemoveExceptionRequest) => removeException(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n exact: false,\n });\n },\n });\n};\n\n/**\n * Hook to remove certificate invalidation\n */\nexport const useRemoveInvalidation = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (request: RemoveInvalidationRequest) => removeInvalidation(courseId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n exact: false,\n });\n },\n });\n};\n\n/**\n * Hook to toggle certificate generation\n */\nexport const useToggleCertificateGeneration = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (enable: boolean) => toggleCertificateGeneration(courseId, enable),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n exact: false,\n });\n },\n });\n};\n\n/**\n * Hook to regenerate certificates\n */\nexport const useRegenerateCertificates = (courseId: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (filter: string) => regenerateCertificates(courseId, filter),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: certificatesQueryKeys.byCourse(courseId),\n exact: false,\n });\n },\n });\n};\n"]}
@@ -1,8 +1,9 @@
1
1
  import type { PaginationParams } from '../../types';
2
- import type { CertificateQueryParams } from '../types';
2
+ import type { CertificateQueryParams } from '../../certificates/types';
3
3
  export declare const certificatesQueryKeys: {
4
4
  all: readonly ["org.openedx.frontend.app.instructorDashboard", "certificates"];
5
5
  byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "certificates", string];
6
6
  issued: (courseId: string, params: CertificateQueryParams) => readonly ["org.openedx.frontend.app.instructorDashboard", "certificates", string, "issued", CertificateQueryParams];
7
7
  tasks: (courseId: string, params: PaginationParams) => readonly ["org.openedx.frontend.app.instructorDashboard", "certificates", string, "tasks", PaginationParams];
8
+ generationHistory: (courseId: string, params: PaginationParams) => readonly ["org.openedx.frontend.app.instructorDashboard", "certificates", string, "generationHistory", PaginationParams];
8
9
  };
@@ -4,5 +4,6 @@ export const certificatesQueryKeys = {
4
4
  byCourse: (courseId) => [...certificatesQueryKeys.all, courseId],
5
5
  issued: (courseId, params) => [...certificatesQueryKeys.byCourse(courseId), 'issued', params],
6
6
  tasks: (courseId, params) => [...certificatesQueryKeys.byCourse(courseId), 'tasks', params],
7
+ generationHistory: (courseId, params) => [...certificatesQueryKeys.byCourse(courseId), 'generationHistory', params],
7
8
  };
8
9
  //# sourceMappingURL=queryKeys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../../src/certificates/data/queryKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAIvC,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,CAAC,KAAK,EAAE,cAAc,CAAU;IACrC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAU;IACjF,MAAM,EAAE,CAAC,QAAgB,EAAE,MAA8B,EAAE,EAAE,CAC3D,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAU;IAC1E,KAAK,EAAE,CAAC,QAAgB,EAAE,MAAwB,EAAE,EAAE,CACpD,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAU;CAC1E,CAAC","sourcesContent":["import { appId } from '@src/constants';\nimport type { PaginationParams } from '@src/types';\nimport type { CertificateQueryParams } from '../types';\n\nexport const certificatesQueryKeys = {\n all: [appId, 'certificates'] as const,\n byCourse: (courseId: string) => [...certificatesQueryKeys.all, courseId] as const,\n issued: (courseId: string, params: CertificateQueryParams) =>\n [...certificatesQueryKeys.byCourse(courseId), 'issued', params] as const,\n tasks: (courseId: string, params: PaginationParams) =>\n [...certificatesQueryKeys.byCourse(courseId), 'tasks', params] as const,\n};\n"]}
1
+ {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../../src/certificates/data/queryKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAIvC,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,CAAC,KAAK,EAAE,cAAc,CAAU;IACrC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAU;IACjF,MAAM,EAAE,CAAC,QAAgB,EAAE,MAA8B,EAAE,EAAE,CAC3D,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAU;IAC1E,KAAK,EAAE,CAAC,QAAgB,EAAE,MAAwB,EAAE,EAAE,CACpD,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAU;IACzE,iBAAiB,EAAE,CAAC,QAAgB,EAAE,MAAwB,EAAE,EAAE,CAChE,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAU;CACtF,CAAC","sourcesContent":["import { appId } from '@src/constants';\nimport type { PaginationParams } from '@src/types';\nimport type { CertificateQueryParams } from '@src/certificates/types';\n\nexport const certificatesQueryKeys = {\n all: [appId, 'certificates'] as const,\n byCourse: (courseId: string) => [...certificatesQueryKeys.all, courseId] as const,\n issued: (courseId: string, params: CertificateQueryParams) =>\n [...certificatesQueryKeys.byCourse(courseId), 'issued', params] as const,\n tasks: (courseId: string, params: PaginationParams) =>\n [...certificatesQueryKeys.byCourse(courseId), 'tasks', params] as const,\n generationHistory: (courseId: string, params: PaginationParams) =>\n [...certificatesQueryKeys.byCourse(courseId), 'generationHistory', params] as const,\n};\n"]}
@@ -189,6 +189,16 @@ declare const messages: {
189
189
  defaultMessage: string;
190
190
  description: string;
191
191
  };
192
+ removeExceptionModalTitle: {
193
+ id: string;
194
+ defaultMessage: string;
195
+ description: string;
196
+ };
197
+ removeExceptionModalMessage: {
198
+ id: string;
199
+ defaultMessage: string;
200
+ description: string;
201
+ };
192
202
  removeInvalidationModalTitle: {
193
203
  id: string;
194
204
  defaultMessage: string;
@@ -309,5 +319,25 @@ declare const messages: {
309
319
  defaultMessage: string;
310
320
  description: string;
311
321
  };
322
+ certificatesDisabledMessage: {
323
+ id: string;
324
+ defaultMessage: string;
325
+ description: string;
326
+ };
327
+ certificatesRegeneratedToast: {
328
+ id: string;
329
+ defaultMessage: string;
330
+ description: string;
331
+ };
332
+ errorRegenerateCertificates: {
333
+ id: string;
334
+ defaultMessage: string;
335
+ description: string;
336
+ };
337
+ regenerateCertificatesButtonWithFilter: {
338
+ id: string;
339
+ defaultMessage: string;
340
+ description: string;
341
+ };
312
342
  };
313
343
  export default messages;
@@ -190,6 +190,16 @@ const messages = defineMessages({
190
190
  defaultMessage: 'Enter usernames or emails, or upload a CSV file to invalidate certificates.',
191
191
  description: 'Description for invalidate certificate modal',
192
192
  },
193
+ removeExceptionModalTitle: {
194
+ id: 'instruct.certificates.removeExceptionModalTitle',
195
+ defaultMessage: 'Remove Exception',
196
+ description: 'Title for remove exception modal',
197
+ },
198
+ removeExceptionModalMessage: {
199
+ id: 'instruct.certificates.removeExceptionModalMessage',
200
+ defaultMessage: 'Are you sure you want to remove the certificate exception for {email}?',
201
+ description: 'Message for remove exception confirmation modal',
202
+ },
193
203
  removeInvalidationModalTitle: {
194
204
  id: 'instruct.certificates.removeInvalidationModalTitle',
195
205
  defaultMessage: 'Remove Invalidation',
@@ -310,6 +320,26 @@ const messages = defineMessages({
310
320
  defaultMessage: 'Certificate generation disabled',
311
321
  description: 'Success message when certificate generation is disabled',
312
322
  },
323
+ certificatesDisabledMessage: {
324
+ id: 'instruct.certificates.certificatesDisabledMessage',
325
+ defaultMessage: 'Certificate management features are not enabled for this course. Please contact your system administrator to enable certificate generation.',
326
+ description: 'Message displayed when certificate features are disabled',
327
+ },
328
+ certificatesRegeneratedToast: {
329
+ id: 'instruct.certificates.certificatesRegeneratedToast',
330
+ defaultMessage: 'Certificate regeneration started successfully',
331
+ description: 'Success message when certificates are regenerated',
332
+ },
333
+ errorRegenerateCertificates: {
334
+ id: 'instruct.certificates.errorRegenerateCertificates',
335
+ defaultMessage: 'Failed to regenerate certificates',
336
+ description: 'Error message when certificate regeneration fails',
337
+ },
338
+ regenerateCertificatesButtonWithFilter: {
339
+ id: 'instruct.certificates.regenerateCertificatesButtonWithFilter',
340
+ defaultMessage: 'Regenerate Certificates: {filter}',
341
+ description: 'Button to regenerate certificates with filter applied',
342
+ },
313
343
  });
314
344
  export default messages;
315
345
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/certificates/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n pageTitle: {\n id: 'instruct.certificates.pageTitle',\n defaultMessage: 'Certificates',\n description: 'Title for certificates page',\n },\n grantExceptionsButton: {\n id: 'instruct.certificates.grantExceptionsButton',\n defaultMessage: 'Grant Exception(s)',\n description: 'Button to grant certificate exceptions',\n },\n invalidateCertificateButton: {\n id: 'instruct.certificates.invalidateCertificateButton',\n defaultMessage: 'Invalidate Certificate',\n description: 'Button to invalidate certificates',\n },\n disableCertificatesButton: {\n id: 'instruct.certificates.disableCertificatesButton',\n defaultMessage: 'Disable Certificates',\n description: 'Button to disable certificate generation',\n },\n regenerateCertificatesButton: {\n id: 'instruct.certificates.regenerateCertificatesButton',\n defaultMessage: 'Regenerate Certificates',\n description: 'Button to regenerate certificates',\n },\n issuedCertificatesTab: {\n id: 'instruct.certificates.issuedCertificatesTab',\n defaultMessage: 'Issued Certificates',\n description: 'Tab label for issued certificates',\n },\n generationHistoryTab: {\n id: 'instruct.certificates.generationHistoryTab',\n defaultMessage: 'Certificate Generation History',\n description: 'Tab label for certificate generation history',\n },\n searchPlaceholder: {\n id: 'instruct.certificates.searchPlaceholder',\n defaultMessage: 'Search by username or email',\n description: 'Placeholder text for search input',\n },\n filterAllLearners: {\n id: 'instruct.certificates.filterAllLearners',\n defaultMessage: 'All Learners',\n description: 'Filter option for all learners',\n },\n filterReceived: {\n id: 'instruct.certificates.filterReceived',\n defaultMessage: 'Received',\n description: 'Filter option for learners who received certificates',\n },\n filterNotReceived: {\n id: 'instruct.certificates.filterNotReceived',\n defaultMessage: 'Not Received',\n description: 'Filter option for learners who did not receive certificates',\n },\n filterAuditPassing: {\n id: 'instruct.certificates.filterAuditPassing',\n defaultMessage: 'Audit - Passing',\n description: 'Filter option for audit learners who are passing',\n },\n filterAuditNotPassing: {\n id: 'instruct.certificates.filterAuditNotPassing',\n defaultMessage: 'Audit - Not Passing',\n description: 'Filter option for audit learners who are not passing',\n },\n filterErrorState: {\n id: 'instruct.certificates.filterErrorState',\n defaultMessage: 'Error State',\n description: 'Filter option for error states',\n },\n filterGrantedExceptions: {\n id: 'instruct.certificates.filterGrantedExceptions',\n defaultMessage: 'Granted Exceptions',\n description: 'Filter option for granted exceptions',\n },\n filterInvalidated: {\n id: 'instruct.certificates.filterInvalidated',\n defaultMessage: 'Invalidated',\n description: 'Filter option for invalidated certificates',\n },\n columnUsername: {\n id: 'instruct.certificates.columnUsername',\n defaultMessage: 'Username',\n description: 'Table column header for username',\n },\n columnEmail: {\n id: 'instruct.certificates.columnEmail',\n defaultMessage: 'Email',\n description: 'Table column header for email',\n },\n columnEnrollmentTrack: {\n id: 'instruct.certificates.columnEnrollmentTrack',\n defaultMessage: 'Enrollment Track',\n description: 'Table column header for enrollment track',\n },\n columnCertificateStatus: {\n id: 'instruct.certificates.columnCertificateStatus',\n defaultMessage: 'Certificate Status',\n description: 'Table column header for certificate status',\n },\n columnSpecialCase: {\n id: 'instruct.certificates.columnSpecialCase',\n defaultMessage: 'Special Case',\n description: 'Table column header for special case',\n },\n columnExceptionGranted: {\n id: 'instruct.certificates.columnExceptionGranted',\n defaultMessage: 'Exception Granted',\n description: 'Table column header for exception granted',\n },\n columnExceptionNotes: {\n id: 'instruct.certificates.columnExceptionNotes',\n defaultMessage: 'Exception Notes',\n description: 'Table column header for exception notes',\n },\n columnInvalidatedBy: {\n id: 'instruct.certificates.columnInvalidatedBy',\n defaultMessage: 'Invalidated By',\n description: 'Table column header for invalidated by',\n },\n columnInvalidationDate: {\n id: 'instruct.certificates.columnInvalidationDate',\n defaultMessage: 'Invalidation Date',\n description: 'Table column header for invalidation date',\n },\n columnInvalidationNote: {\n id: 'instruct.certificates.columnInvalidationNote',\n defaultMessage: 'Invalidation Note',\n description: 'Table column header for invalidation note',\n },\n columnActions: {\n id: 'instruct.certificates.columnActions',\n defaultMessage: 'Actions',\n description: 'Table column header for actions',\n },\n removeExceptionAction: {\n id: 'instruct.certificates.removeExceptionAction',\n defaultMessage: 'Remove Exception',\n description: 'Action menu item to remove exception',\n },\n removeInvalidationAction: {\n id: 'instruct.certificates.removeInvalidationAction',\n defaultMessage: 'Remove Invalidation',\n description: 'Action menu item to remove invalidation',\n },\n noDataMessage: {\n id: 'instruct.certificates.noDataMessage',\n defaultMessage: 'No certificates found',\n description: 'Message when no certificates are found',\n },\n exceptionRemovedToast: {\n id: 'instruct.certificates.exceptionRemovedToast',\n defaultMessage: 'Exception removed for {email}',\n description: 'Toast message when exception is removed',\n },\n invalidationRemovedToast: {\n id: 'instruct.certificates.invalidationRemovedToast',\n defaultMessage: 'The certificate for {email} has been re-validated and the system is re-running the grade for this learner.',\n description: 'Toast message when invalidation is removed',\n },\n exceptionsGrantedToast: {\n id: 'instruct.certificates.exceptionsGrantedToast',\n defaultMessage: 'Exceptions granted for {count} learner(s)',\n description: 'Toast message when exceptions are granted',\n },\n certificatesInvalidatedToast: {\n id: 'instruct.certificates.certificatesInvalidatedToast',\n defaultMessage: 'Certificates invalidated for {count} learner(s)',\n description: 'Toast message when certificates are invalidated',\n },\n grantExceptionsModalTitle: {\n id: 'instruct.certificates.grantExceptionsModalTitle',\n defaultMessage: 'Grant Certificate Exceptions',\n description: 'Title for grant exceptions modal',\n },\n grantExceptionsModalDescription: {\n id: 'instruct.certificates.grantExceptionsModalDescription',\n defaultMessage: 'Enter usernames or emails, or upload a CSV file to grant certificate exceptions.',\n description: 'Description for grant exceptions modal',\n },\n invalidateCertificateModalTitle: {\n id: 'instruct.certificates.invalidateCertificateModalTitle',\n defaultMessage: 'Invalidate Certificates',\n description: 'Title for invalidate certificate modal',\n },\n invalidateCertificateModalDescription: {\n id: 'instruct.certificates.invalidateCertificateModalDescription',\n defaultMessage: 'Enter usernames or emails, or upload a CSV file to invalidate certificates.',\n description: 'Description for invalidate certificate modal',\n },\n removeInvalidationModalTitle: {\n id: 'instruct.certificates.removeInvalidationModalTitle',\n defaultMessage: 'Remove Invalidation',\n description: 'Title for remove invalidation modal',\n },\n removeInvalidationModalMessage: {\n id: 'instruct.certificates.removeInvalidationModalMessage',\n defaultMessage: 'Are you sure you want to remove invalidation for {email}?',\n description: 'Message for remove invalidation confirmation modal',\n },\n disableCertificatesModalTitle: {\n id: 'instruct.certificates.disableCertificatesModalTitle',\n defaultMessage: 'Disable Certificate Generation',\n description: 'Title for disable certificates modal',\n },\n disableCertificatesModalMessage: {\n id: 'instruct.certificates.disableCertificatesModalMessage',\n defaultMessage: 'Students will not be able to receive certificates until certificate generation is re-enabled. Are you sure you want to disable certificate generation?',\n description: 'Message for disable certificates modal',\n },\n enableCertificatesModalTitle: {\n id: 'instruct.certificates.enableCertificatesModalTitle',\n defaultMessage: 'Enable Certificate Generation',\n description: 'Title for enable certificates modal',\n },\n enableCertificatesModalMessage: {\n id: 'instruct.certificates.enableCertificatesModalMessage',\n defaultMessage: 'Are you sure you want to enable certificate generation for this course?',\n description: 'Message for enable certificates modal',\n },\n notesLabel: {\n id: 'instruct.certificates.notesLabel',\n defaultMessage: 'Notes (Optional)',\n description: 'Label for notes field',\n },\n notesPlaceholder: {\n id: 'instruct.certificates.notesPlaceholder',\n defaultMessage: 'Enter notes...',\n description: 'Placeholder for notes field',\n },\n learnersLabel: {\n id: 'instruct.certificates.learnersLabel',\n defaultMessage: 'Username or Email',\n description: 'Label for learners field',\n },\n learnersPlaceholder: {\n id: 'instruct.certificates.learnersPlaceholder',\n defaultMessage: 'Enter usernames or emails (one per line)',\n description: 'Placeholder for learners field',\n },\n cancel: {\n id: 'instruct.certificates.cancel',\n defaultMessage: 'Cancel',\n description: 'Cancel button text',\n },\n confirm: {\n id: 'instruct.certificates.confirm',\n defaultMessage: 'Confirm',\n description: 'Confirm button text',\n },\n submit: {\n id: 'instruct.certificates.submit',\n defaultMessage: 'Submit',\n description: 'Submit button text',\n },\n columnTaskName: {\n id: 'instruct.certificates.columnTaskName',\n defaultMessage: 'Task Name',\n description: 'Table column header for task name',\n },\n columnDate: {\n id: 'instruct.certificates.columnDate',\n defaultMessage: 'Date',\n description: 'Table column header for date',\n },\n columnDetails: {\n id: 'instruct.certificates.columnDetails',\n defaultMessage: 'Details',\n description: 'Table column header for details',\n },\n noTasksMessage: {\n id: 'instruct.certificates.noTasksMessage',\n defaultMessage: 'No certificate generation tasks found',\n description: 'Message when no tasks are found',\n },\n errorGrantException: {\n id: 'instruct.certificates.errorGrantException',\n defaultMessage: 'Failed to grant exceptions',\n description: 'Error message when granting exceptions fails',\n },\n errorInvalidateCertificate: {\n id: 'instruct.certificates.errorInvalidateCertificate',\n defaultMessage: 'Failed to invalidate certificates',\n description: 'Error message when invalidating certificates fails',\n },\n errorRemoveException: {\n id: 'instruct.certificates.errorRemoveException',\n defaultMessage: 'Failed to remove exception',\n description: 'Error message when removing exception fails',\n },\n errorRemoveInvalidation: {\n id: 'instruct.certificates.errorRemoveInvalidation',\n defaultMessage: 'Failed to remove invalidation',\n description: 'Error message when removing invalidation fails',\n },\n errorToggleCertificateGeneration: {\n id: 'instruct.certificates.errorToggleCertificateGeneration',\n defaultMessage: 'Failed to toggle certificate generation',\n description: 'Error message when toggling certificate generation fails',\n },\n successEnableCertificates: {\n id: 'instruct.certificates.successEnableCertificates',\n defaultMessage: 'Certificate generation enabled',\n description: 'Success message when certificate generation is enabled',\n },\n successDisableCertificates: {\n id: 'instruct.certificates.successDisableCertificates',\n defaultMessage: 'Certificate generation disabled',\n description: 'Success message when certificate generation is disabled',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/certificates/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n pageTitle: {\n id: 'instruct.certificates.pageTitle',\n defaultMessage: 'Certificates',\n description: 'Title for certificates page',\n },\n grantExceptionsButton: {\n id: 'instruct.certificates.grantExceptionsButton',\n defaultMessage: 'Grant Exception(s)',\n description: 'Button to grant certificate exceptions',\n },\n invalidateCertificateButton: {\n id: 'instruct.certificates.invalidateCertificateButton',\n defaultMessage: 'Invalidate Certificate',\n description: 'Button to invalidate certificates',\n },\n disableCertificatesButton: {\n id: 'instruct.certificates.disableCertificatesButton',\n defaultMessage: 'Disable Certificates',\n description: 'Button to disable certificate generation',\n },\n regenerateCertificatesButton: {\n id: 'instruct.certificates.regenerateCertificatesButton',\n defaultMessage: 'Regenerate Certificates',\n description: 'Button to regenerate certificates',\n },\n issuedCertificatesTab: {\n id: 'instruct.certificates.issuedCertificatesTab',\n defaultMessage: 'Issued Certificates',\n description: 'Tab label for issued certificates',\n },\n generationHistoryTab: {\n id: 'instruct.certificates.generationHistoryTab',\n defaultMessage: 'Certificate Generation History',\n description: 'Tab label for certificate generation history',\n },\n searchPlaceholder: {\n id: 'instruct.certificates.searchPlaceholder',\n defaultMessage: 'Search by username or email',\n description: 'Placeholder text for search input',\n },\n filterAllLearners: {\n id: 'instruct.certificates.filterAllLearners',\n defaultMessage: 'All Learners',\n description: 'Filter option for all learners',\n },\n filterReceived: {\n id: 'instruct.certificates.filterReceived',\n defaultMessage: 'Received',\n description: 'Filter option for learners who received certificates',\n },\n filterNotReceived: {\n id: 'instruct.certificates.filterNotReceived',\n defaultMessage: 'Not Received',\n description: 'Filter option for learners who did not receive certificates',\n },\n filterAuditPassing: {\n id: 'instruct.certificates.filterAuditPassing',\n defaultMessage: 'Audit - Passing',\n description: 'Filter option for audit learners who are passing',\n },\n filterAuditNotPassing: {\n id: 'instruct.certificates.filterAuditNotPassing',\n defaultMessage: 'Audit - Not Passing',\n description: 'Filter option for audit learners who are not passing',\n },\n filterErrorState: {\n id: 'instruct.certificates.filterErrorState',\n defaultMessage: 'Error State',\n description: 'Filter option for error states',\n },\n filterGrantedExceptions: {\n id: 'instruct.certificates.filterGrantedExceptions',\n defaultMessage: 'Granted Exceptions',\n description: 'Filter option for granted exceptions',\n },\n filterInvalidated: {\n id: 'instruct.certificates.filterInvalidated',\n defaultMessage: 'Invalidated',\n description: 'Filter option for invalidated certificates',\n },\n columnUsername: {\n id: 'instruct.certificates.columnUsername',\n defaultMessage: 'Username',\n description: 'Table column header for username',\n },\n columnEmail: {\n id: 'instruct.certificates.columnEmail',\n defaultMessage: 'Email',\n description: 'Table column header for email',\n },\n columnEnrollmentTrack: {\n id: 'instruct.certificates.columnEnrollmentTrack',\n defaultMessage: 'Enrollment Track',\n description: 'Table column header for enrollment track',\n },\n columnCertificateStatus: {\n id: 'instruct.certificates.columnCertificateStatus',\n defaultMessage: 'Certificate Status',\n description: 'Table column header for certificate status',\n },\n columnSpecialCase: {\n id: 'instruct.certificates.columnSpecialCase',\n defaultMessage: 'Special Case',\n description: 'Table column header for special case',\n },\n columnExceptionGranted: {\n id: 'instruct.certificates.columnExceptionGranted',\n defaultMessage: 'Exception Granted',\n description: 'Table column header for exception granted',\n },\n columnExceptionNotes: {\n id: 'instruct.certificates.columnExceptionNotes',\n defaultMessage: 'Exception Notes',\n description: 'Table column header for exception notes',\n },\n columnInvalidatedBy: {\n id: 'instruct.certificates.columnInvalidatedBy',\n defaultMessage: 'Invalidated By',\n description: 'Table column header for invalidated by',\n },\n columnInvalidationDate: {\n id: 'instruct.certificates.columnInvalidationDate',\n defaultMessage: 'Invalidation Date',\n description: 'Table column header for invalidation date',\n },\n columnInvalidationNote: {\n id: 'instruct.certificates.columnInvalidationNote',\n defaultMessage: 'Invalidation Note',\n description: 'Table column header for invalidation note',\n },\n columnActions: {\n id: 'instruct.certificates.columnActions',\n defaultMessage: 'Actions',\n description: 'Table column header for actions',\n },\n removeExceptionAction: {\n id: 'instruct.certificates.removeExceptionAction',\n defaultMessage: 'Remove Exception',\n description: 'Action menu item to remove exception',\n },\n removeInvalidationAction: {\n id: 'instruct.certificates.removeInvalidationAction',\n defaultMessage: 'Remove Invalidation',\n description: 'Action menu item to remove invalidation',\n },\n noDataMessage: {\n id: 'instruct.certificates.noDataMessage',\n defaultMessage: 'No certificates found',\n description: 'Message when no certificates are found',\n },\n exceptionRemovedToast: {\n id: 'instruct.certificates.exceptionRemovedToast',\n defaultMessage: 'Exception removed for {email}',\n description: 'Toast message when exception is removed',\n },\n invalidationRemovedToast: {\n id: 'instruct.certificates.invalidationRemovedToast',\n defaultMessage: 'The certificate for {email} has been re-validated and the system is re-running the grade for this learner.',\n description: 'Toast message when invalidation is removed',\n },\n exceptionsGrantedToast: {\n id: 'instruct.certificates.exceptionsGrantedToast',\n defaultMessage: 'Exceptions granted for {count} learner(s)',\n description: 'Toast message when exceptions are granted',\n },\n certificatesInvalidatedToast: {\n id: 'instruct.certificates.certificatesInvalidatedToast',\n defaultMessage: 'Certificates invalidated for {count} learner(s)',\n description: 'Toast message when certificates are invalidated',\n },\n grantExceptionsModalTitle: {\n id: 'instruct.certificates.grantExceptionsModalTitle',\n defaultMessage: 'Grant Certificate Exceptions',\n description: 'Title for grant exceptions modal',\n },\n grantExceptionsModalDescription: {\n id: 'instruct.certificates.grantExceptionsModalDescription',\n defaultMessage: 'Enter usernames or emails, or upload a CSV file to grant certificate exceptions.',\n description: 'Description for grant exceptions modal',\n },\n invalidateCertificateModalTitle: {\n id: 'instruct.certificates.invalidateCertificateModalTitle',\n defaultMessage: 'Invalidate Certificates',\n description: 'Title for invalidate certificate modal',\n },\n invalidateCertificateModalDescription: {\n id: 'instruct.certificates.invalidateCertificateModalDescription',\n defaultMessage: 'Enter usernames or emails, or upload a CSV file to invalidate certificates.',\n description: 'Description for invalidate certificate modal',\n },\n removeExceptionModalTitle: {\n id: 'instruct.certificates.removeExceptionModalTitle',\n defaultMessage: 'Remove Exception',\n description: 'Title for remove exception modal',\n },\n removeExceptionModalMessage: {\n id: 'instruct.certificates.removeExceptionModalMessage',\n defaultMessage: 'Are you sure you want to remove the certificate exception for {email}?',\n description: 'Message for remove exception confirmation modal',\n },\n removeInvalidationModalTitle: {\n id: 'instruct.certificates.removeInvalidationModalTitle',\n defaultMessage: 'Remove Invalidation',\n description: 'Title for remove invalidation modal',\n },\n removeInvalidationModalMessage: {\n id: 'instruct.certificates.removeInvalidationModalMessage',\n defaultMessage: 'Are you sure you want to remove invalidation for {email}?',\n description: 'Message for remove invalidation confirmation modal',\n },\n disableCertificatesModalTitle: {\n id: 'instruct.certificates.disableCertificatesModalTitle',\n defaultMessage: 'Disable Certificate Generation',\n description: 'Title for disable certificates modal',\n },\n disableCertificatesModalMessage: {\n id: 'instruct.certificates.disableCertificatesModalMessage',\n defaultMessage: 'Students will not be able to receive certificates until certificate generation is re-enabled. Are you sure you want to disable certificate generation?',\n description: 'Message for disable certificates modal',\n },\n enableCertificatesModalTitle: {\n id: 'instruct.certificates.enableCertificatesModalTitle',\n defaultMessage: 'Enable Certificate Generation',\n description: 'Title for enable certificates modal',\n },\n enableCertificatesModalMessage: {\n id: 'instruct.certificates.enableCertificatesModalMessage',\n defaultMessage: 'Are you sure you want to enable certificate generation for this course?',\n description: 'Message for enable certificates modal',\n },\n notesLabel: {\n id: 'instruct.certificates.notesLabel',\n defaultMessage: 'Notes (Optional)',\n description: 'Label for notes field',\n },\n notesPlaceholder: {\n id: 'instruct.certificates.notesPlaceholder',\n defaultMessage: 'Enter notes...',\n description: 'Placeholder for notes field',\n },\n learnersLabel: {\n id: 'instruct.certificates.learnersLabel',\n defaultMessage: 'Username or Email',\n description: 'Label for learners field',\n },\n learnersPlaceholder: {\n id: 'instruct.certificates.learnersPlaceholder',\n defaultMessage: 'Enter usernames or emails (one per line)',\n description: 'Placeholder for learners field',\n },\n cancel: {\n id: 'instruct.certificates.cancel',\n defaultMessage: 'Cancel',\n description: 'Cancel button text',\n },\n confirm: {\n id: 'instruct.certificates.confirm',\n defaultMessage: 'Confirm',\n description: 'Confirm button text',\n },\n submit: {\n id: 'instruct.certificates.submit',\n defaultMessage: 'Submit',\n description: 'Submit button text',\n },\n columnTaskName: {\n id: 'instruct.certificates.columnTaskName',\n defaultMessage: 'Task Name',\n description: 'Table column header for task name',\n },\n columnDate: {\n id: 'instruct.certificates.columnDate',\n defaultMessage: 'Date',\n description: 'Table column header for date',\n },\n columnDetails: {\n id: 'instruct.certificates.columnDetails',\n defaultMessage: 'Details',\n description: 'Table column header for details',\n },\n noTasksMessage: {\n id: 'instruct.certificates.noTasksMessage',\n defaultMessage: 'No certificate generation tasks found',\n description: 'Message when no tasks are found',\n },\n errorGrantException: {\n id: 'instruct.certificates.errorGrantException',\n defaultMessage: 'Failed to grant exceptions',\n description: 'Error message when granting exceptions fails',\n },\n errorInvalidateCertificate: {\n id: 'instruct.certificates.errorInvalidateCertificate',\n defaultMessage: 'Failed to invalidate certificates',\n description: 'Error message when invalidating certificates fails',\n },\n errorRemoveException: {\n id: 'instruct.certificates.errorRemoveException',\n defaultMessage: 'Failed to remove exception',\n description: 'Error message when removing exception fails',\n },\n errorRemoveInvalidation: {\n id: 'instruct.certificates.errorRemoveInvalidation',\n defaultMessage: 'Failed to remove invalidation',\n description: 'Error message when removing invalidation fails',\n },\n errorToggleCertificateGeneration: {\n id: 'instruct.certificates.errorToggleCertificateGeneration',\n defaultMessage: 'Failed to toggle certificate generation',\n description: 'Error message when toggling certificate generation fails',\n },\n successEnableCertificates: {\n id: 'instruct.certificates.successEnableCertificates',\n defaultMessage: 'Certificate generation enabled',\n description: 'Success message when certificate generation is enabled',\n },\n successDisableCertificates: {\n id: 'instruct.certificates.successDisableCertificates',\n defaultMessage: 'Certificate generation disabled',\n description: 'Success message when certificate generation is disabled',\n },\n certificatesDisabledMessage: {\n id: 'instruct.certificates.certificatesDisabledMessage',\n defaultMessage: 'Certificate management features are not enabled for this course. Please contact your system administrator to enable certificate generation.',\n description: 'Message displayed when certificate features are disabled',\n },\n certificatesRegeneratedToast: {\n id: 'instruct.certificates.certificatesRegeneratedToast',\n defaultMessage: 'Certificate regeneration started successfully',\n description: 'Success message when certificates are regenerated',\n },\n errorRegenerateCertificates: {\n id: 'instruct.certificates.errorRegenerateCertificates',\n defaultMessage: 'Failed to regenerate certificates',\n description: 'Error message when certificate regeneration fails',\n },\n regenerateCertificatesButtonWithFilter: {\n id: 'instruct.certificates.regenerateCertificatesButtonWithFilter',\n defaultMessage: 'Regenerate Certificates: {filter}',\n description: 'Button to regenerate certificates with filter applied',\n },\n});\n\nexport default messages;\n"]}
@@ -41,16 +41,21 @@ export interface InstructorTask {
41
41
  created: string;
42
42
  updated: string;
43
43
  }
44
+ export interface CertificateGenerationHistory {
45
+ taskName: string;
46
+ date: string;
47
+ details: string;
48
+ }
44
49
  export interface CertificateQueryParams extends PaginationParams {
45
50
  filter: CertificateFilter;
46
51
  search: string;
47
52
  }
48
53
  export interface GrantExceptionRequest {
49
- learners: string;
54
+ learners: string[];
50
55
  notes?: string;
51
56
  }
52
57
  export interface InvalidateCertificateRequest {
53
- learners: string;
58
+ learners: string[];
54
59
  notes?: string;
55
60
  }
56
61
  export interface RemoveExceptionRequest {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/certificates/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,yCAAoB,CAAA;IACpB,0CAAqB,CAAA;IACrB,kDAA6B,CAAA;IAC7B,oDAA+B,CAAA;IAC/B,4DAAuC,CAAA;IACvC,0CAAqB,CAAA;IACrB,8DAAyC,CAAA;IACzC,gDAA2B,CAAA;AAC7B,CAAC,EATW,iBAAiB,KAAjB,iBAAiB,QAS5B;AAED,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,8CAAyB,CAAA;IACzB,gDAA2B,CAAA;IAC3B,oDAA+B,CAAA;IAC/B,2DAAsC,CAAA;IACtC,0CAAqB,CAAA;AACvB,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAED,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,wBAAS,CAAA;IACT,2CAA4B,CAAA;IAC5B,sCAAuB,CAAA;AACzB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB","sourcesContent":["import type { PaginationParams } from '@src/types';\n\nexport enum CertificateFilter {\n ALL_LEARNERS = 'all',\n RECEIVED = 'received',\n NOT_RECEIVED = 'not_received',\n AUDIT_PASSING = 'audit_passing',\n AUDIT_NOT_PASSING = 'audit_not_passing',\n ERROR_STATE = 'error',\n GRANTED_EXCEPTIONS = 'granted_exceptions',\n INVALIDATED = 'invalidated',\n}\n\nexport enum CertificateStatus {\n RECEIVED = 'downloadable',\n NOT_RECEIVED = 'notpassing',\n AUDIT_PASSING = 'audit_passing',\n AUDIT_NOT_PASSING = 'audit_notpassing',\n ERROR_STATE = 'error',\n}\n\nexport enum SpecialCase {\n NONE = '',\n INVALIDATION = 'invalidated',\n EXCEPTION = 'exception',\n}\n\nexport interface CertificateData {\n username: string,\n email: string,\n enrollmentTrack: string,\n certificateStatus: CertificateStatus,\n specialCase: SpecialCase,\n exceptionGranted?: string,\n exceptionNotes?: string,\n invalidatedBy?: string,\n invalidationDate?: string,\n invalidationNote?: string,\n}\n\nexport interface InstructorTask {\n taskId: string,\n taskName: string,\n taskState: string,\n taskOutput?: string,\n created: string,\n updated: string,\n}\n\nexport interface CertificateQueryParams extends PaginationParams {\n filter: CertificateFilter,\n search: string,\n}\n\nexport interface GrantExceptionRequest {\n learners: string,\n notes?: string,\n}\n\nexport interface InvalidateCertificateRequest {\n learners: string,\n notes?: string,\n}\n\nexport interface RemoveExceptionRequest {\n username: string,\n}\n\nexport interface RemoveInvalidationRequest {\n username: string,\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/certificates/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,yCAAoB,CAAA;IACpB,0CAAqB,CAAA;IACrB,kDAA6B,CAAA;IAC7B,oDAA+B,CAAA;IAC/B,4DAAuC,CAAA;IACvC,0CAAqB,CAAA;IACrB,8DAAyC,CAAA;IACzC,gDAA2B,CAAA;AAC7B,CAAC,EATW,iBAAiB,KAAjB,iBAAiB,QAS5B;AAED,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,8CAAyB,CAAA;IACzB,gDAA2B,CAAA;IAC3B,oDAA+B,CAAA;IAC/B,2DAAsC,CAAA;IACtC,0CAAqB,CAAA;AACvB,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAED,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,wBAAS,CAAA;IACT,2CAA4B,CAAA;IAC5B,sCAAuB,CAAA;AACzB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB","sourcesContent":["import type { PaginationParams } from '@src/types';\n\nexport enum CertificateFilter {\n ALL_LEARNERS = 'all',\n RECEIVED = 'received',\n NOT_RECEIVED = 'not_received',\n AUDIT_PASSING = 'audit_passing',\n AUDIT_NOT_PASSING = 'audit_not_passing',\n ERROR_STATE = 'error',\n GRANTED_EXCEPTIONS = 'granted_exceptions',\n INVALIDATED = 'invalidated',\n}\n\nexport enum CertificateStatus {\n RECEIVED = 'downloadable',\n NOT_RECEIVED = 'notpassing',\n AUDIT_PASSING = 'audit_passing',\n AUDIT_NOT_PASSING = 'audit_notpassing',\n ERROR_STATE = 'error',\n}\n\nexport enum SpecialCase {\n NONE = '',\n INVALIDATION = 'invalidated',\n EXCEPTION = 'exception',\n}\n\nexport interface CertificateData {\n username: string,\n email: string,\n enrollmentTrack: string,\n certificateStatus: CertificateStatus,\n specialCase: SpecialCase,\n exceptionGranted?: string,\n exceptionNotes?: string,\n invalidatedBy?: string,\n invalidationDate?: string,\n invalidationNote?: string,\n}\n\nexport interface InstructorTask {\n taskId: string,\n taskName: string,\n taskState: string,\n taskOutput?: string,\n created: string,\n updated: string,\n}\n\nexport interface CertificateGenerationHistory {\n taskName: string,\n date: string,\n details: string,\n}\n\nexport interface CertificateQueryParams extends PaginationParams {\n filter: CertificateFilter,\n search: string,\n}\n\nexport interface GrantExceptionRequest {\n learners: string[],\n notes?: string,\n}\n\nexport interface InvalidateCertificateRequest {\n learners: string[],\n notes?: string,\n}\n\nexport interface RemoveExceptionRequest {\n username: string,\n}\n\nexport interface RemoveInvalidationRequest {\n username: string,\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CertificateData, CertificateFilter } from '../types';
1
+ import { CertificateData, CertificateFilter } from '../../certificates/types';
2
2
  export declare const matchesFilter: (item: CertificateData, filter: CertificateFilter) => boolean;
3
3
  export declare const matchesSearch: (item: CertificateData, search: string) => boolean;
4
4
  export declare const filterCertificates: (data: CertificateData[], filter: CertificateFilter, search: string) => CertificateData[];
@@ -1,4 +1,4 @@
1
- import { CertificateFilter, CertificateStatus, SpecialCase } from '../types';
1
+ import { CertificateFilter, CertificateStatus, SpecialCase } from '../../certificates/types';
2
2
  export const matchesFilter = (item, filter) => {
3
3
  switch (filter) {
4
4
  case CertificateFilter.RECEIVED:
@@ -1 +1 @@
1
- {"version":3,"file":"filterUtils.js","sourceRoot":"","sources":["../../../src/certificates/utils/filterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE9F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAE,MAAyB,EAAW,EAAE;IACzF,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,iBAAiB,CAAC,QAAQ;YAC7B,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,QAAQ,CAAC;QAC/D,KAAK,iBAAiB,CAAC,YAAY;YACjC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,YAAY,CAAC;QACnE,KAAK,iBAAiB,CAAC,aAAa;YAClC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,aAAa,CAAC;QACpE,KAAK,iBAAiB,CAAC,iBAAiB;YACtC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,iBAAiB,CAAC;QACxE,KAAK,iBAAiB,CAAC,WAAW;YAChC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,WAAW,CAAC;QAClE,KAAK,iBAAiB,CAAC,kBAAkB;YACvC,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,SAAS,CAAC;QACpD,KAAK,iBAAiB,CAAC,WAAW;YAChC,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,YAAY,CAAC;QACvD,KAAK,iBAAiB,CAAC,YAAY,CAAC;QACpC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAE,MAAc,EAAW,EAAE;IAC9E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;WAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAClD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAuB,EACvB,MAAyB,EACzB,MAAc,EACK,EAAE,CACrB,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import { CertificateData, CertificateFilter, CertificateStatus, SpecialCase } from '../types';\n\nexport const matchesFilter = (item: CertificateData, filter: CertificateFilter): boolean => {\n switch (filter) {\n case CertificateFilter.RECEIVED:\n return item.certificateStatus === CertificateStatus.RECEIVED;\n case CertificateFilter.NOT_RECEIVED:\n return item.certificateStatus === CertificateStatus.NOT_RECEIVED;\n case CertificateFilter.AUDIT_PASSING:\n return item.certificateStatus === CertificateStatus.AUDIT_PASSING;\n case CertificateFilter.AUDIT_NOT_PASSING:\n return item.certificateStatus === CertificateStatus.AUDIT_NOT_PASSING;\n case CertificateFilter.ERROR_STATE:\n return item.certificateStatus === CertificateStatus.ERROR_STATE;\n case CertificateFilter.GRANTED_EXCEPTIONS:\n return item.specialCase === SpecialCase.EXCEPTION;\n case CertificateFilter.INVALIDATED:\n return item.specialCase === SpecialCase.INVALIDATION;\n case CertificateFilter.ALL_LEARNERS:\n default:\n return true;\n }\n};\n\nexport const matchesSearch = (item: CertificateData, search: string): boolean => {\n if (!search) return true;\n const searchLower = search.toLowerCase();\n return (\n item.username.toLowerCase().includes(searchLower)\n || item.email.toLowerCase().includes(searchLower)\n );\n};\n\nexport const filterCertificates = (\n data: CertificateData[],\n filter: CertificateFilter,\n search: string,\n): CertificateData[] =>\n data.filter((item) => matchesFilter(item, filter) && matchesSearch(item, search));\n"]}
1
+ {"version":3,"file":"filterUtils.js","sourceRoot":"","sources":["../../../src/certificates/utils/filterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE7G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAE,MAAyB,EAAW,EAAE;IACzF,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,iBAAiB,CAAC,QAAQ;YAC7B,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,QAAQ,CAAC;QAC/D,KAAK,iBAAiB,CAAC,YAAY;YACjC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,YAAY,CAAC;QACnE,KAAK,iBAAiB,CAAC,aAAa;YAClC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,aAAa,CAAC;QACpE,KAAK,iBAAiB,CAAC,iBAAiB;YACtC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,iBAAiB,CAAC;QACxE,KAAK,iBAAiB,CAAC,WAAW;YAChC,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,WAAW,CAAC;QAClE,KAAK,iBAAiB,CAAC,kBAAkB;YACvC,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,SAAS,CAAC;QACpD,KAAK,iBAAiB,CAAC,WAAW;YAChC,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,YAAY,CAAC;QACvD,KAAK,iBAAiB,CAAC,YAAY,CAAC;QACpC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAE,MAAc,EAAW,EAAE;IAC9E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;WAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAClD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAuB,EACvB,MAAyB,EACzB,MAAc,EACK,EAAE,CACrB,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import { CertificateData, CertificateFilter, CertificateStatus, SpecialCase } from '@src/certificates/types';\n\nexport const matchesFilter = (item: CertificateData, filter: CertificateFilter): boolean => {\n switch (filter) {\n case CertificateFilter.RECEIVED:\n return item.certificateStatus === CertificateStatus.RECEIVED;\n case CertificateFilter.NOT_RECEIVED:\n return item.certificateStatus === CertificateStatus.NOT_RECEIVED;\n case CertificateFilter.AUDIT_PASSING:\n return item.certificateStatus === CertificateStatus.AUDIT_PASSING;\n case CertificateFilter.AUDIT_NOT_PASSING:\n return item.certificateStatus === CertificateStatus.AUDIT_NOT_PASSING;\n case CertificateFilter.ERROR_STATE:\n return item.certificateStatus === CertificateStatus.ERROR_STATE;\n case CertificateFilter.GRANTED_EXCEPTIONS:\n return item.specialCase === SpecialCase.EXCEPTION;\n case CertificateFilter.INVALIDATED:\n return item.specialCase === SpecialCase.INVALIDATION;\n case CertificateFilter.ALL_LEARNERS:\n default:\n return true;\n }\n};\n\nexport const matchesSearch = (item: CertificateData, search: string): boolean => {\n if (!search) return true;\n const searchLower = search.toLowerCase();\n return (\n item.username.toLowerCase().includes(searchLower)\n || item.email.toLowerCase().includes(searchLower)\n );\n};\n\nexport const filterCertificates = (\n data: CertificateData[],\n filter: CertificateFilter,\n search: string,\n): CertificateData[] =>\n data.filter((item) => matchesFilter(item, filter) && matchesSearch(item, search));\n"]}
@@ -1,2 +1,2 @@
1
- export { getErrorMessage } from './errorHandling';
2
- export type { ApiError } from './errorHandling';
1
+ export { getErrorMessage } from '../../certificates/utils/errorHandling';
2
+ export type { ApiError } from '../../certificates/utils/errorHandling';
@@ -1,2 +1,2 @@
1
- export { getErrorMessage } from './errorHandling';
1
+ export { getErrorMessage } from '../../certificates/utils/errorHandling';
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/certificates/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export { getErrorMessage } from './errorHandling';\nexport type { ApiError } from './errorHandling';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/certificates/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC","sourcesContent":["export { getErrorMessage } from '@src/certificates/utils/errorHandling';\nexport type { ApiError } from '@src/certificates/utils/errorHandling';\n"]}
@@ -8,19 +8,25 @@ import { SpinnerIcon } from '@openedx/paragon/icons';
8
8
  import { useDebouncedFilter } from '../hooks/useDebouncedFilter';
9
9
  import { useCourseInfo, useLearner } from '../data/apiHook';
10
10
  import messages from './messages';
11
+ const initialLearnerState = {
12
+ username: '',
13
+ fullName: '',
14
+ email: '',
15
+ isEnrolled: false,
16
+ };
11
17
  const SpecifyLearnerField = forwardRef(({ learner, onClickSelect }, ref) => {
12
18
  var _a;
13
19
  const intl = useIntl();
14
20
  const { courseId = '' } = useParams();
15
21
  const [identifier, setIdentifier] = useState('');
16
- const [showLearner, enableShowLearner, disableShowLearner] = useToggle(false);
22
+ const [showLearner, enableShowLearner, disableShowLearner] = useToggle(!!learner);
17
23
  const { data: courseInfo } = useCourseInfo(courseId);
18
24
  const permissions = (courseInfo === null || courseInfo === void 0 ? void 0 : courseInfo.permissions) || { admin: false, dataResearcher: false };
19
25
  const { inputValue, handleChange, resetFilter } = useDebouncedFilter({
20
26
  filterValue: identifier,
21
27
  setFilter: setIdentifier,
22
28
  });
23
- const { data = { email: '', fullName: '', username: '', isEnrolled: false }, refetch, error } = useLearner(courseId, inputValue);
29
+ const { data, refetch, error } = useLearner(courseId, inputValue);
24
30
  const resetState = () => {
25
31
  resetFilter();
26
32
  onClickSelect('');
@@ -29,7 +35,7 @@ const SpecifyLearnerField = forwardRef(({ learner, onClickSelect }, ref) => {
29
35
  useImperativeHandle(ref, () => ({
30
36
  reset: resetState,
31
37
  }));
32
- const selectedLearner = learner || data;
38
+ const selectedLearner = learner || data || initialLearnerState;
33
39
  const handleInputChange = (event) => {
34
40
  handleChange(event.target.value);
35
41
  if (showLearner) {
@@ -48,7 +54,7 @@ const SpecifyLearnerField = forwardRef(({ learner, onClickSelect }, ref) => {
48
54
  });
49
55
  }
50
56
  };
51
- return (_jsxs(FormGroup, { className: "mb-0", size: "sm", children: [_jsx(FormLabel, { className: "text-primary-500 d-flex", children: intl.formatMessage(messages.specifyLearner) }), _jsxs("div", { className: "d-flex align-items-center", children: [_jsx(FormControl, { className: `mr-2 ${selectedLearner.username && showLearner ? 'd-none' : ''}`, name: "emailOrUsername", placeholder: intl.formatMessage(messages.specifyLearnerPlaceholder), size: "md", autoResize: true, value: inputValue, onChange: handleInputChange }), selectedLearner.username && showLearner ? (_jsxs(_Fragment, { children: [_jsx(Avatar, { className: "mr-2.5", size: "sm" }), _jsxs("div", { className: "d-flex flex-column mr-3 text-primary-500", children: [_jsx("p", { className: "mb-0", children: selectedLearner.username }), (permissions.admin || permissions.dataResearcher)
57
+ return (_jsxs(FormGroup, { className: "mb-0", size: "sm", children: [_jsx(FormLabel, { className: "text-primary-500 d-flex", children: selectedLearner.username ? intl.formatMessage(messages.selectedLearner) : intl.formatMessage(messages.specifyLearner) }), _jsxs("div", { className: "d-flex align-items-center", children: [_jsx(FormControl, { className: `mr-2 ${selectedLearner.username && showLearner ? 'd-none' : ''}`, name: "emailOrUsername", placeholder: intl.formatMessage(messages.specifyLearnerPlaceholder), size: "md", autoResize: true, value: inputValue, onChange: handleInputChange }), selectedLearner.username && showLearner ? (_jsxs(_Fragment, { children: [_jsx(Avatar, { className: "mr-2.5", size: "sm" }), _jsxs("div", { className: "d-flex flex-column mr-3 text-primary-500", children: [_jsx("p", { className: "mb-0", children: selectedLearner.username }), (permissions.admin || permissions.dataResearcher)
52
58
  && (_jsxs("div", { className: "d-flex x-small", children: [_jsx("p", { className: "mr-3 mb-0", children: selectedLearner.fullName }), _jsx("p", { className: "mb-0", children: selectedLearner.email })] }))] }), !learner && _jsx(Button, { iconBefore: SpinnerIcon, onClick: resetState, children: intl.formatMessage(messages.change) })] })) : (_jsx(Button, { onClick: handleClickSelect, disabled: !inputValue, children: intl.formatMessage(messages.select) }))] }), showLearner && error
53
59
  && isAxiosError(error)
54
60
  && ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 404 && (_jsx("p", { className: "text-danger-500 mb-0 x-small mt-2", children: intl.formatMessage(messages.learnerNotFound, { identifier }) })), showLearner && !error && !(selectedLearner === null || selectedLearner === void 0 ? void 0 : selectedLearner.isEnrolled) && (_jsx("p", { className: "text-danger-500 mb-0 x-small mt-2", children: intl.formatMessage(messages.learnerNotEnrolled, { identifier }) }))] }));
@@ -1 +1 @@
1
- {"version":3,"file":"SpecifyLearnerField.js","sourceRoot":"","sources":["../../src/components/SpecifyLearnerField.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, ChangeEvent, useImperativeHandle, forwardRef } from 'react';\nimport { isAxiosError } from 'axios';\nimport { useParams } from 'react-router-dom';\nimport { Avatar, Button, FormControl, FormGroup, FormLabel, useToggle } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { SpinnerIcon } from '@openedx/paragon/icons';\nimport { useDebouncedFilter } from '@src/hooks/useDebouncedFilter';\nimport { useCourseInfo, useLearner } from '@src/data/apiHook';\nimport { SelectedLearner } from '@src/types';\nimport messages from './messages';\n\ninterface SpecifyLearnerFieldProps {\n learner?: SelectedLearner,\n onClickSelect: (emailOrUsername: string) => void,\n}\n\ninterface SpecifyLearnerFieldRef {\n reset: () => void,\n}\n\nconst SpecifyLearnerField = forwardRef<SpecifyLearnerFieldRef, SpecifyLearnerFieldProps>(({ learner, onClickSelect }, ref) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const [identifier, setIdentifier] = useState('');\n const [showLearner, enableShowLearner, disableShowLearner] = useToggle(false);\n const { data: courseInfo } = useCourseInfo(courseId);\n const permissions = courseInfo?.permissions || { admin: false, dataResearcher: false };\n const { inputValue, handleChange, resetFilter } = useDebouncedFilter({\n filterValue: identifier,\n setFilter: setIdentifier,\n });\n const { data = { email: '', fullName: '', username: '', isEnrolled: false }, refetch, error } = useLearner(courseId, inputValue);\n\n const resetState = () => {\n resetFilter();\n onClickSelect('');\n disableShowLearner();\n };\n\n useImperativeHandle(ref, () => ({\n reset: resetState,\n }));\n\n const selectedLearner = learner || data;\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n handleChange(event.target.value);\n\n if (showLearner) {\n disableShowLearner();\n }\n };\n\n const handleClickSelect = () => {\n if (inputValue) {\n refetch().then((result) => {\n // Need to pass empty value if learner is not valid to clear out any previously selected learner\n // We could have other conditions/fields depending on valid learner\n const formValue = !result.error && result.data?.isEnrolled ? inputValue : '';\n onClickSelect(formValue);\n enableShowLearner();\n });\n }\n };\n\n return (\n <FormGroup className=\"mb-0\" size=\"sm\">\n <FormLabel className=\"text-primary-500 d-flex\">{intl.formatMessage(messages.specifyLearner)}</FormLabel>\n <div className=\"d-flex align-items-center\">\n <FormControl\n className={`mr-2 ${selectedLearner.username && showLearner ? 'd-none' : ''}`}\n name=\"emailOrUsername\"\n placeholder={intl.formatMessage(messages.specifyLearnerPlaceholder)}\n size=\"md\"\n autoResize\n value={inputValue}\n onChange={handleInputChange}\n />\n {selectedLearner.username && showLearner ? (\n <>\n <Avatar className=\"mr-2.5\" size=\"sm\" />\n <div className=\"d-flex flex-column mr-3 text-primary-500\">\n <p className=\"mb-0\">{selectedLearner.username}</p>\n {(permissions.admin || permissions.dataResearcher)\n && (\n <div className=\"d-flex x-small\">\n <p className=\"mr-3 mb-0\">{selectedLearner.fullName}</p>\n <p className=\"mb-0\">{selectedLearner.email}</p>\n </div>\n )}\n </div>\n {!learner && <Button iconBefore={SpinnerIcon} onClick={resetState}>{intl.formatMessage(messages.change)}</Button>}\n </>\n ) : (\n <Button onClick={handleClickSelect} disabled={!inputValue}>{intl.formatMessage(messages.select)}</Button>\n )}\n </div>\n {showLearner && error\n && isAxiosError(error)\n && error.response?.status === 404 && (\n <p className=\"text-danger-500 mb-0 x-small mt-2\">\n {intl.formatMessage(messages.learnerNotFound, { identifier })}\n </p>\n )}\n {\n showLearner && !error && !selectedLearner?.isEnrolled && (\n <p className=\"text-danger-500 mb-0 x-small mt-2\">\n {intl.formatMessage(messages.learnerNotEnrolled, { identifier })}\n </p>\n )\n }\n </FormGroup>\n );\n});\n\nSpecifyLearnerField.displayName = 'SpecifyLearnerField';\n\nexport default SpecifyLearnerField;\n"]}
1
+ {"version":3,"file":"SpecifyLearnerField.js","sourceRoot":"","sources":["../../src/components/SpecifyLearnerField.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAe,mBAAmB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAWlC,MAAM,mBAAmB,GAAG;IAC1B,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,mBAAmB,GAAG,UAAU,CAAmD,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,EAAE;;IAC3H,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,KAAI,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACvF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC;QACnE,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAElE,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,WAAW,EAAE,CAAC;QACd,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,kBAAkB,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,KAAK,EAAE,UAAU;KAClB,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAAG,OAAO,IAAI,IAAI,IAAI,mBAAmB,CAAC;IAE/D,MAAM,iBAAiB,GAAG,CAAC,KAAoC,EAAE,EAAE;QACjE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,WAAW,EAAE,CAAC;YAChB,kBAAkB,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;;gBACxB,gGAAgG;gBAChG,mEAAmE;gBACnE,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,KAAI,MAAA,MAAM,CAAC,IAAI,0CAAE,UAAU,CAAA,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,aAAa,CAAC,SAAS,CAAC,CAAC;gBACzB,iBAAiB,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,SAAS,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,aACnC,KAAC,SAAS,IAAC,SAAS,EAAC,yBAAyB,YAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAa,EAClL,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,WAAW,IACV,SAAS,EAAE,QAAQ,eAAe,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5E,IAAI,EAAC,iBAAiB,EACtB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EACnE,IAAI,EAAC,IAAI,EACT,UAAU,QACV,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,GAC3B,EACD,eAAe,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CACzC,8BACE,KAAC,MAAM,IAAC,SAAS,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,GAAG,EACvC,eAAK,SAAS,EAAC,0CAA0C,aACvD,YAAG,SAAS,EAAC,MAAM,YAAE,eAAe,CAAC,QAAQ,GAAK,EACjD,CAAC,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,cAAc,CAAC;2CAC/C,CACD,eAAK,SAAS,EAAC,gBAAgB,aAC7B,YAAG,SAAS,EAAC,WAAW,YAAE,eAAe,CAAC,QAAQ,GAAK,EACvD,YAAG,SAAS,EAAC,MAAM,YAAE,eAAe,CAAC,KAAK,GAAK,IAC3C,CACP,IACG,EACL,CAAC,OAAO,IAAI,KAAC,MAAM,IAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAU,IAChH,CACJ,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,UAAU,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAU,CAC1G,IACG,EACL,WAAW,IAAI,KAAK;mBAClB,YAAY,CAAC,KAAK,CAAC;mBACnB,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,IAAI,CACnC,YAAG,SAAS,EAAC,mCAAmC,YAC7C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,CAAC,GAC3D,CACL,EAEC,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,UAAU,CAAA,IAAI,CACvD,YAAG,SAAS,EAAC,mCAAmC,YAC7C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,UAAU,EAAE,CAAC,GAC9D,CACL,IAEO,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,mBAAmB,CAAC,WAAW,GAAG,qBAAqB,CAAC;AAExD,eAAe,mBAAmB,CAAC","sourcesContent":["import { useState, ChangeEvent, useImperativeHandle, forwardRef } from 'react';\nimport { isAxiosError } from 'axios';\nimport { useParams } from 'react-router-dom';\nimport { Avatar, Button, FormControl, FormGroup, FormLabel, useToggle } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { SpinnerIcon } from '@openedx/paragon/icons';\nimport { useDebouncedFilter } from '@src/hooks/useDebouncedFilter';\nimport { useCourseInfo, useLearner } from '@src/data/apiHook';\nimport { SelectedLearner } from '@src/types';\nimport messages from './messages';\n\ninterface SpecifyLearnerFieldProps {\n learner?: SelectedLearner,\n onClickSelect: (emailOrUsername: string) => void,\n}\n\ninterface SpecifyLearnerFieldRef {\n reset: () => void,\n}\n\nconst initialLearnerState = {\n username: '',\n fullName: '',\n email: '',\n isEnrolled: false,\n};\n\nconst SpecifyLearnerField = forwardRef<SpecifyLearnerFieldRef, SpecifyLearnerFieldProps>(({ learner, onClickSelect }, ref) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const [identifier, setIdentifier] = useState('');\n const [showLearner, enableShowLearner, disableShowLearner] = useToggle(!!learner);\n const { data: courseInfo } = useCourseInfo(courseId);\n const permissions = courseInfo?.permissions || { admin: false, dataResearcher: false };\n const { inputValue, handleChange, resetFilter } = useDebouncedFilter({\n filterValue: identifier,\n setFilter: setIdentifier,\n });\n const { data, refetch, error } = useLearner(courseId, inputValue);\n\n const resetState = () => {\n resetFilter();\n onClickSelect('');\n disableShowLearner();\n };\n\n useImperativeHandle(ref, () => ({\n reset: resetState,\n }));\n\n const selectedLearner = learner || data || initialLearnerState;\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n handleChange(event.target.value);\n\n if (showLearner) {\n disableShowLearner();\n }\n };\n\n const handleClickSelect = () => {\n if (inputValue) {\n refetch().then((result) => {\n // Need to pass empty value if learner is not valid to clear out any previously selected learner\n // We could have other conditions/fields depending on valid learner\n const formValue = !result.error && result.data?.isEnrolled ? inputValue : '';\n onClickSelect(formValue);\n enableShowLearner();\n });\n }\n };\n\n return (\n <FormGroup className=\"mb-0\" size=\"sm\">\n <FormLabel className=\"text-primary-500 d-flex\">{selectedLearner.username ? intl.formatMessage(messages.selectedLearner) : intl.formatMessage(messages.specifyLearner)}</FormLabel>\n <div className=\"d-flex align-items-center\">\n <FormControl\n className={`mr-2 ${selectedLearner.username && showLearner ? 'd-none' : ''}`}\n name=\"emailOrUsername\"\n placeholder={intl.formatMessage(messages.specifyLearnerPlaceholder)}\n size=\"md\"\n autoResize\n value={inputValue}\n onChange={handleInputChange}\n />\n {selectedLearner.username && showLearner ? (\n <>\n <Avatar className=\"mr-2.5\" size=\"sm\" />\n <div className=\"d-flex flex-column mr-3 text-primary-500\">\n <p className=\"mb-0\">{selectedLearner.username}</p>\n {(permissions.admin || permissions.dataResearcher)\n && (\n <div className=\"d-flex x-small\">\n <p className=\"mr-3 mb-0\">{selectedLearner.fullName}</p>\n <p className=\"mb-0\">{selectedLearner.email}</p>\n </div>\n )}\n </div>\n {!learner && <Button iconBefore={SpinnerIcon} onClick={resetState}>{intl.formatMessage(messages.change)}</Button>}\n </>\n ) : (\n <Button onClick={handleClickSelect} disabled={!inputValue}>{intl.formatMessage(messages.select)}</Button>\n )}\n </div>\n {showLearner && error\n && isAxiosError(error)\n && error.response?.status === 404 && (\n <p className=\"text-danger-500 mb-0 x-small mt-2\">\n {intl.formatMessage(messages.learnerNotFound, { identifier })}\n </p>\n )}\n {\n showLearner && !error && !selectedLearner?.isEnrolled && (\n <p className=\"text-danger-500 mb-0 x-small mt-2\">\n {intl.formatMessage(messages.learnerNotEnrolled, { identifier })}\n </p>\n )\n }\n </FormGroup>\n );\n});\n\nSpecifyLearnerField.displayName = 'SpecifyLearnerField';\n\nexport default SpecifyLearnerField;\n"]}
@@ -149,5 +149,10 @@ declare const messages: {
149
149
  defaultMessage: string;
150
150
  description: string;
151
151
  };
152
+ selectedLearner: {
153
+ id: string;
154
+ defaultMessage: string;
155
+ description: string;
156
+ };
152
157
  };
153
158
  export default messages;
@@ -149,7 +149,12 @@ const messages = defineMessages({
149
149
  id: 'instruct.specifyLearner.learnerNotEnrolled',
150
150
  defaultMessage: '{identifier} is not enrolled in this course',
151
151
  description: 'Error message displayed when a learner is found based on the provided identifier (email or username) but is not enrolled in the course',
152
- }
152
+ },
153
+ selectedLearner: {
154
+ id: 'instruct.specifyLearner.selectedLearner',
155
+ defaultMessage: 'Selected Learner:',
156
+ description: 'Label for specify learner field when a learner has been selected',
157
+ },
153
158
  });
154
159
  export default messages;
155
160
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/components/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n select: {\n id: 'instruct.specifyLearner.select',\n defaultMessage: 'Select',\n description: 'Label for select dropdown in specify learner field',\n },\n specifyLearner: {\n id: 'instruct.specifyLearner.label',\n defaultMessage: 'Specify Learner:',\n description: 'Label for specify learner field',\n },\n specifyLearnerPlaceholder: {\n id: 'instruct.specifyLearner.placeholder',\n defaultMessage: 'Learner email address or username',\n description: 'Placeholder text for specify learner input field',\n },\n pageNotFoundHeader: {\n id: 'instruct.pageNotFound.header',\n defaultMessage: 'Page not found',\n description: 'Header for page not found error',\n },\n pageNotFoundBody: {\n id: 'instruct.pageNotFound.body',\n defaultMessage: \"The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.\",\n description: 'Body text for page not found error',\n },\n pendingTasksTitle: {\n id: 'instruct.pendingTasks.section.title',\n defaultMessage: 'Pending Tasks',\n description: 'Title for the pending tasks section',\n },\n noTasksMessage: {\n id: 'instruct.pendingTasks.section.noTasks',\n defaultMessage: 'No tasks currently running.',\n description: 'Message displayed when there are no pending tasks',\n },\n taskTypeColumnName: {\n id: 'instruct.pendingTasks.table.column.taskType',\n defaultMessage: 'Task Type',\n description: 'Column name for task type in pending tasks table',\n },\n taskInputColumnName: {\n id: 'instruct.pendingTasks.table.column.taskInput',\n defaultMessage: 'Task Input',\n description: 'Column name for task input in pending tasks table',\n },\n taskIdColumnName: {\n id: 'instruct.pendingTasks.table.column.taskId',\n defaultMessage: 'Task ID',\n description: 'Column name for task ID in pending tasks table',\n },\n requesterColumnName: {\n id: 'instruct.pendingTasks.table.column.requester',\n defaultMessage: 'Requester',\n description: 'Column name for requester in pending tasks table',\n },\n taskStateColumnName: {\n id: 'instruct.pendingTasks.table.column.taskState',\n defaultMessage: 'Task State',\n description: 'Column name for task state in pending tasks table',\n },\n createdColumnName: {\n id: 'instruct.pendingTasks.table.column.created',\n defaultMessage: 'Created',\n description: 'Column name for created date in pending tasks table',\n },\n taskOutputColumnName: {\n id: 'instruct.pendingTasks.table.column.taskOutput',\n defaultMessage: 'Task Output',\n description: 'Column name for task output in pending tasks table',\n },\n durationColumnName: {\n id: 'instruct.pendingTasks.table.column.duration',\n defaultMessage: 'Duration (sec)',\n description: 'Column name for duration in pending tasks table',\n },\n statusColumnName: {\n id: 'instruct.pendingTasks.table.column.status',\n defaultMessage: 'Status',\n description: 'Column name for status in pending tasks table',\n },\n taskMessageColumnName: {\n id: 'instruct.pendingTasks.table.column.taskMessage',\n defaultMessage: 'Task Message',\n description: 'Column name for task message in pending tasks table',\n },\n downloadCSVTitle: {\n id: 'instruct.csvComponent.downloadCSVTitle',\n defaultMessage: 'Upload CSV File',\n description: 'Title for the upload CSV file section'\n },\n downloadCSVDescription: {\n id: 'instruct.csvComponent.downloadCSVDescription',\n defaultMessage: 'Only properly formatted CSV files will be accepted',\n description: 'Description for the upload CSV file section'\n },\n viewCSVTemplate: {\n id: 'instruct.csvComponent.viewCSVTemplate',\n defaultMessage: 'View Template',\n description: 'Label for the view CSV template link'\n },\n uploadingFileMessage: {\n id: 'instruct.csvComponent.uploadingFileMessage',\n defaultMessage: 'File chosen: {fileName}',\n description: 'Message displayed when a file is being uploaded, with the file name included'\n },\n change: {\n id: 'instruct.specifyLearner.change',\n defaultMessage: 'Change',\n description: 'Label for change button in specify learner field',\n },\n learnerNotFound: {\n id: 'instruct.specifyLearner.learnerNotFound',\n defaultMessage: 'Could not find student matching identifier: {identifier}',\n description: 'Error message displayed when a learner cannot be found based on the provided identifier (email or username)',\n },\n problemNotFound: {\n id: 'instruct.specifyProblemField.problemNotFound',\n defaultMessage: 'Could not find problem matching identifier: {identifier}',\n description: 'Error message displayed when a problem cannot be found based on the provided identifier',\n },\n searchPlaceholder: {\n id: 'instruct.usernameFilter.searchPlaceholder',\n defaultMessage: 'Search By Username or Email',\n description: 'Placeholder text for the username filter input',\n },\n problemLocationPlaceholder: {\n id: 'instruct.specifyProblemField.locationPlaceholder',\n defaultMessage: 'Problem location',\n description: 'Placeholder text for problem location input',\n },\n problemLocationInfoIconLabel: {\n id: 'instruct.specifyProblemField.infoIconLabel',\n defaultMessage: 'Example format for problem location',\n description: 'Aria label for the info icon next to the problem location input',\n },\n problemLocationTooltip: {\n id: 'instruct.specifyProblemField.locationTooltip',\n defaultMessage: 'Example: block-v1:edX+DemoX+2015+type@problem+block@618c5933b8b544e4a4cc103d3e508378',\n description: 'Tooltip text showing an example problem location format',\n },\n selectedProblem: {\n id: 'instruct.specifyProblemField.selectedProblem',\n defaultMessage: 'Selected Problem:',\n description: 'Label for specify problem field when a problem has been selected',\n },\n learnerNotEnrolled: {\n id: 'instruct.specifyLearner.learnerNotEnrolled',\n defaultMessage: '{identifier} is not enrolled in this course',\n description: 'Error message displayed when a learner is found based on the provided identifier (email or username) but is not enrolled in the course',\n }\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/components/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n select: {\n id: 'instruct.specifyLearner.select',\n defaultMessage: 'Select',\n description: 'Label for select dropdown in specify learner field',\n },\n specifyLearner: {\n id: 'instruct.specifyLearner.label',\n defaultMessage: 'Specify Learner:',\n description: 'Label for specify learner field',\n },\n specifyLearnerPlaceholder: {\n id: 'instruct.specifyLearner.placeholder',\n defaultMessage: 'Learner email address or username',\n description: 'Placeholder text for specify learner input field',\n },\n pageNotFoundHeader: {\n id: 'instruct.pageNotFound.header',\n defaultMessage: 'Page not found',\n description: 'Header for page not found error',\n },\n pageNotFoundBody: {\n id: 'instruct.pageNotFound.body',\n defaultMessage: \"The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.\",\n description: 'Body text for page not found error',\n },\n pendingTasksTitle: {\n id: 'instruct.pendingTasks.section.title',\n defaultMessage: 'Pending Tasks',\n description: 'Title for the pending tasks section',\n },\n noTasksMessage: {\n id: 'instruct.pendingTasks.section.noTasks',\n defaultMessage: 'No tasks currently running.',\n description: 'Message displayed when there are no pending tasks',\n },\n taskTypeColumnName: {\n id: 'instruct.pendingTasks.table.column.taskType',\n defaultMessage: 'Task Type',\n description: 'Column name for task type in pending tasks table',\n },\n taskInputColumnName: {\n id: 'instruct.pendingTasks.table.column.taskInput',\n defaultMessage: 'Task Input',\n description: 'Column name for task input in pending tasks table',\n },\n taskIdColumnName: {\n id: 'instruct.pendingTasks.table.column.taskId',\n defaultMessage: 'Task ID',\n description: 'Column name for task ID in pending tasks table',\n },\n requesterColumnName: {\n id: 'instruct.pendingTasks.table.column.requester',\n defaultMessage: 'Requester',\n description: 'Column name for requester in pending tasks table',\n },\n taskStateColumnName: {\n id: 'instruct.pendingTasks.table.column.taskState',\n defaultMessage: 'Task State',\n description: 'Column name for task state in pending tasks table',\n },\n createdColumnName: {\n id: 'instruct.pendingTasks.table.column.created',\n defaultMessage: 'Created',\n description: 'Column name for created date in pending tasks table',\n },\n taskOutputColumnName: {\n id: 'instruct.pendingTasks.table.column.taskOutput',\n defaultMessage: 'Task Output',\n description: 'Column name for task output in pending tasks table',\n },\n durationColumnName: {\n id: 'instruct.pendingTasks.table.column.duration',\n defaultMessage: 'Duration (sec)',\n description: 'Column name for duration in pending tasks table',\n },\n statusColumnName: {\n id: 'instruct.pendingTasks.table.column.status',\n defaultMessage: 'Status',\n description: 'Column name for status in pending tasks table',\n },\n taskMessageColumnName: {\n id: 'instruct.pendingTasks.table.column.taskMessage',\n defaultMessage: 'Task Message',\n description: 'Column name for task message in pending tasks table',\n },\n downloadCSVTitle: {\n id: 'instruct.csvComponent.downloadCSVTitle',\n defaultMessage: 'Upload CSV File',\n description: 'Title for the upload CSV file section'\n },\n downloadCSVDescription: {\n id: 'instruct.csvComponent.downloadCSVDescription',\n defaultMessage: 'Only properly formatted CSV files will be accepted',\n description: 'Description for the upload CSV file section'\n },\n viewCSVTemplate: {\n id: 'instruct.csvComponent.viewCSVTemplate',\n defaultMessage: 'View Template',\n description: 'Label for the view CSV template link'\n },\n uploadingFileMessage: {\n id: 'instruct.csvComponent.uploadingFileMessage',\n defaultMessage: 'File chosen: {fileName}',\n description: 'Message displayed when a file is being uploaded, with the file name included'\n },\n change: {\n id: 'instruct.specifyLearner.change',\n defaultMessage: 'Change',\n description: 'Label for change button in specify learner field',\n },\n learnerNotFound: {\n id: 'instruct.specifyLearner.learnerNotFound',\n defaultMessage: 'Could not find student matching identifier: {identifier}',\n description: 'Error message displayed when a learner cannot be found based on the provided identifier (email or username)',\n },\n problemNotFound: {\n id: 'instruct.specifyProblemField.problemNotFound',\n defaultMessage: 'Could not find problem matching identifier: {identifier}',\n description: 'Error message displayed when a problem cannot be found based on the provided identifier',\n },\n searchPlaceholder: {\n id: 'instruct.usernameFilter.searchPlaceholder',\n defaultMessage: 'Search By Username or Email',\n description: 'Placeholder text for the username filter input',\n },\n problemLocationPlaceholder: {\n id: 'instruct.specifyProblemField.locationPlaceholder',\n defaultMessage: 'Problem location',\n description: 'Placeholder text for problem location input',\n },\n problemLocationInfoIconLabel: {\n id: 'instruct.specifyProblemField.infoIconLabel',\n defaultMessage: 'Example format for problem location',\n description: 'Aria label for the info icon next to the problem location input',\n },\n problemLocationTooltip: {\n id: 'instruct.specifyProblemField.locationTooltip',\n defaultMessage: 'Example: block-v1:edX+DemoX+2015+type@problem+block@618c5933b8b544e4a4cc103d3e508378',\n description: 'Tooltip text showing an example problem location format',\n },\n selectedProblem: {\n id: 'instruct.specifyProblemField.selectedProblem',\n defaultMessage: 'Selected Problem:',\n description: 'Label for specify problem field when a problem has been selected',\n },\n learnerNotEnrolled: {\n id: 'instruct.specifyLearner.learnerNotEnrolled',\n defaultMessage: '{identifier} is not enrolled in this course',\n description: 'Error message displayed when a learner is found based on the provided identifier (email or username) but is not enrolled in the course',\n },\n selectedLearner: {\n id: 'instruct.specifyLearner.selectedLearner',\n defaultMessage: 'Selected Learner:',\n description: 'Label for specify learner field when a learner has been selected',\n },\n});\n\nexport default messages;\n"]}
@@ -27,6 +27,7 @@ export interface CourseInfoResponse {
27
27
  };
28
28
  gradebookUrl: string;
29
29
  studioGradingUrl?: string;
30
+ certificatesEnabled?: boolean;
30
31
  adminConsoleUrl: string | null;
31
32
  }
32
33
  interface EnrollmentCounts extends Record<string, number> {