@ueu/ueu-canvas 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Account.d.ts +22 -0
- package/dist/Account.d.ts.map +1 -0
- package/dist/NotImplementedException.d.ts +4 -0
- package/dist/NotImplementedException.d.ts.map +1 -0
- package/dist/__mocks__/Account.d.ts +17 -0
- package/dist/__mocks__/Account.d.ts.map +1 -0
- package/dist/__mocks__/index.d.ts +9 -0
- package/dist/__mocks__/index.d.ts.map +1 -0
- package/dist/__mocks__/mockAccountData.d.ts +6 -0
- package/dist/__mocks__/mockAccountData.d.ts.map +1 -0
- package/dist/__mocks__/mockEnrollment.d.ts +3 -0
- package/dist/__mocks__/mockEnrollment.d.ts.map +1 -0
- package/dist/__mocks__/mockRubricData.d.ts +20 -0
- package/dist/__mocks__/mockRubricData.d.ts.map +1 -0
- package/dist/__mocks__/mockTabData.d.ts +4 -0
- package/dist/__mocks__/mockTabData.d.ts.map +1 -0
- package/dist/__mocks__/mockTermData.d.ts +3 -0
- package/dist/__mocks__/mockTermData.d.ts.map +1 -0
- package/dist/__mocks__/mockUserData.d.ts +3 -0
- package/dist/__mocks__/mockUserData.d.ts.map +1 -0
- package/dist/__mocks__/utils.d.ts +3 -0
- package/dist/__mocks__/utils.d.ts.map +1 -0
- package/dist/__tests__/canvasUtils.test.d.ts +2 -0
- package/dist/__tests__/canvasUtils.test.d.ts.map +1 -0
- package/dist/__tests__/fetch.test.d.ts +2 -0
- package/dist/__tests__/fetch.test.d.ts.map +1 -0
- package/dist/__tests__/profile.test.d.ts +2 -0
- package/dist/__tests__/profile.test.d.ts.map +1 -0
- package/dist/__tests__/rubrics.test.d.ts +2 -0
- package/dist/__tests__/rubrics.test.d.ts.map +1 -0
- package/dist/baseCanvasObject.d.ts +41 -0
- package/dist/baseCanvasObject.d.ts.map +1 -0
- package/dist/canvasDataDefs.d.ts +97 -0
- package/dist/canvasDataDefs.d.ts.map +1 -0
- package/dist/canvasUtils.d.ts +65 -0
- package/dist/canvasUtils.d.ts.map +1 -0
- package/dist/consts.d.ts +3 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/content/BaseContentItem.d.ts +32 -0
- package/dist/content/BaseContentItem.d.ts.map +1 -0
- package/dist/content/ContentKind.d.ts +28 -0
- package/dist/content/ContentKind.d.ts.map +1 -0
- package/dist/content/__mocks__/determineContent.d.ts +65 -0
- package/dist/content/__mocks__/determineContent.d.ts.map +1 -0
- package/dist/content/__mocks__/mockAssignmentSubmission.d.ts +4 -0
- package/dist/content/__mocks__/mockAssignmentSubmission.d.ts.map +1 -0
- package/dist/content/__mocks__/mockContentData.d.ts +8 -0
- package/dist/content/__mocks__/mockContentData.d.ts.map +1 -0
- package/dist/content/__mocks__/openThisContentInTarget.d.ts +3 -0
- package/dist/content/__mocks__/openThisContentInTarget.d.ts.map +1 -0
- package/dist/content/__testingUtils__/utils.d.ts +6 -0
- package/dist/content/__testingUtils__/utils.d.ts.map +1 -0
- package/dist/content/__tests__/determineContent.test.d.ts +2 -0
- package/dist/content/__tests__/determineContent.test.d.ts.map +1 -0
- package/dist/content/__tests__/getContentFuncs.test.d.ts +2 -0
- package/dist/content/__tests__/getContentFuncs.test.d.ts.map +1 -0
- package/dist/content/assignments/Assignment.d.ts +15 -0
- package/dist/content/assignments/Assignment.d.ts.map +1 -0
- package/dist/content/assignments/AssignmentKind.d.ts +14 -0
- package/dist/content/assignments/AssignmentKind.d.ts.map +1 -0
- package/dist/content/assignments/__tests__/AssignmentKind.test.d.ts +2 -0
- package/dist/content/assignments/__tests__/AssignmentKind.test.d.ts.map +1 -0
- package/dist/content/assignments/__tests__/assignments.test.d.ts +2 -0
- package/dist/content/assignments/__tests__/assignments.test.d.ts.map +1 -0
- package/dist/content/assignments/deleteAssignmentGroup.d.ts +3 -0
- package/dist/content/assignments/deleteAssignmentGroup.d.ts.map +1 -0
- package/dist/content/assignments/genAssignmentGroups.d.ts +5 -0
- package/dist/content/assignments/genAssignmentGroups.d.ts.map +1 -0
- package/dist/content/assignments/index.d.ts +11 -0
- package/dist/content/assignments/index.d.ts.map +1 -0
- package/dist/content/assignments/legacy.d.ts +4 -0
- package/dist/content/assignments/legacy.d.ts.map +1 -0
- package/dist/content/assignments/updateAssignmentDueDates.d.ts +7 -0
- package/dist/content/assignments/updateAssignmentDueDates.d.ts.map +1 -0
- package/dist/content/determineContent.d.ts +19 -0
- package/dist/content/determineContent.d.ts.map +1 -0
- package/dist/content/discussions/Discussion.d.ts +13 -0
- package/dist/content/discussions/Discussion.d.ts.map +1 -0
- package/dist/content/discussions/DiscussionKind.d.ts +14 -0
- package/dist/content/discussions/DiscussionKind.d.ts.map +1 -0
- package/dist/content/discussions/__tests__/DiscussionKind.test.d.ts +2 -0
- package/dist/content/discussions/__tests__/DiscussionKind.test.d.ts.map +1 -0
- package/dist/content/discussions/genEquivalentDiscussionData.d.ts +32 -0
- package/dist/content/discussions/genEquivalentDiscussionData.d.ts.map +1 -0
- package/{src/content/discussions/index.ts → dist/content/discussions/index.d.ts} +1 -0
- package/dist/content/discussions/index.d.ts.map +1 -0
- package/dist/content/getContentFuncs.d.ts +3 -0
- package/dist/content/getContentFuncs.d.ts.map +1 -0
- package/{src/content/index.ts → dist/content/index.d.ts} +3 -3
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/openThisContentInTarget.d.ts +4 -0
- package/dist/content/openThisContentInTarget.d.ts.map +1 -0
- package/dist/content/pages/Page.d.ts +15 -0
- package/dist/content/pages/Page.d.ts.map +1 -0
- package/dist/content/pages/PageKind.d.ts +15 -0
- package/dist/content/pages/PageKind.d.ts.map +1 -0
- package/dist/content/pages/__tests__/PageKind.test.d.ts +2 -0
- package/dist/content/pages/__tests__/PageKind.test.d.ts.map +1 -0
- package/dist/content/pages/__tests__/learningMaterialsForModule.d.ts +2 -0
- package/dist/content/pages/__tests__/learningMaterialsForModule.d.ts.map +1 -0
- package/dist/content/pages/index.d.ts +14 -0
- package/dist/content/pages/index.d.ts.map +1 -0
- package/dist/content/pages/learningMaterialsForModule.d.ts +7 -0
- package/dist/content/pages/learningMaterialsForModule.d.ts.map +1 -0
- package/dist/content/pages/types.d.ts +11 -0
- package/dist/content/pages/types.d.ts.map +1 -0
- package/dist/content/quizzes/Quiz.d.ts +9 -0
- package/dist/content/quizzes/Quiz.d.ts.map +1 -0
- package/dist/content/quizzes/QuizKind.d.ts +13 -0
- package/dist/content/quizzes/QuizKind.d.ts.map +1 -0
- package/dist/content/quizzes/__tests__/QuizKind.test.d.ts +2 -0
- package/dist/content/quizzes/__tests__/QuizKind.test.d.ts.map +1 -0
- package/dist/content/quizzes/index.d.ts +2 -0
- package/dist/content/quizzes/index.d.ts.map +1 -0
- package/dist/content/quizzes/types.d.ts +45 -0
- package/dist/content/quizzes/types.d.ts.map +1 -0
- package/dist/content/types.d.ts +229 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/course/Course.d.ts +87 -0
- package/dist/course/Course.d.ts.map +1 -0
- package/dist/course/IBlueprintCourse.d.ts +7 -0
- package/dist/course/IBlueprintCourse.d.ts.map +1 -0
- package/dist/course/__mocks__/blueprint.d.ts +14 -0
- package/dist/course/__mocks__/blueprint.d.ts.map +1 -0
- package/dist/course/__mocks__/mockCourseData.d.ts +3 -0
- package/dist/course/__mocks__/mockCourseData.d.ts.map +1 -0
- package/dist/course/__mocks__/mockLatePolicy.d.ts +4 -0
- package/dist/course/__mocks__/mockLatePolicy.d.ts.map +1 -0
- package/dist/course/__mocks__/mockModuleData.d.ts +7 -0
- package/dist/course/__mocks__/mockModuleData.d.ts.map +1 -0
- package/dist/course/__mocks__/mockProgressData.d.ts +3 -0
- package/dist/course/__mocks__/mockProgressData.d.ts.map +1 -0
- package/dist/course/__tests__/Course.test.d.ts +2 -0
- package/dist/course/__tests__/Course.test.d.ts.map +1 -0
- package/dist/course/__tests__/blueprint.test.d.ts +2 -0
- package/dist/course/__tests__/blueprint.test.d.ts.map +1 -0
- package/dist/course/__tests__/changeStartDate.test.d.ts +2 -0
- package/dist/course/__tests__/changeStartDate.test.d.ts.map +1 -0
- package/dist/course/__tests__/index.test.d.ts +2 -0
- package/dist/course/__tests__/index.test.d.ts.map +1 -0
- package/dist/course/blueprint.d.ts +21 -0
- package/dist/course/blueprint.d.ts.map +1 -0
- package/dist/course/cachedGetAssociatedCoursesFunc.d.ts +4 -0
- package/dist/course/cachedGetAssociatedCoursesFunc.d.ts.map +1 -0
- package/dist/course/changeStartDate.d.ts +25 -0
- package/dist/course/changeStartDate.d.ts.map +1 -0
- package/dist/course/code.d.ts +9 -0
- package/dist/course/code.d.ts.map +1 -0
- package/dist/course/courseTypes.d.ts +102 -0
- package/dist/course/courseTypes.d.ts.map +1 -0
- package/dist/course/getCourseIdFromUrl.d.ts +3 -0
- package/dist/course/getCourseIdFromUrl.d.ts.map +1 -0
- package/dist/course/getSections.d.ts +5 -0
- package/dist/course/getSections.d.ts.map +1 -0
- package/dist/course/getTermNameFromSections.d.ts +3 -0
- package/dist/course/getTermNameFromSections.d.ts.map +1 -0
- package/dist/course/index.d.ts +12 -0
- package/dist/course/index.d.ts.map +1 -0
- package/dist/course/migration/__mocks__/mockMigrationData.d.ts +6 -0
- package/dist/course/migration/__mocks__/mockMigrationData.d.ts.map +1 -0
- package/dist/course/migration/__tests__/migration.test.d.ts +2 -0
- package/dist/course/migration/__tests__/migration.test.d.ts.map +1 -0
- package/dist/course/migration/__tests__/migrationCache.test.d.ts +2 -0
- package/dist/course/migration/__tests__/migrationCache.test.d.ts.map +1 -0
- package/dist/course/migration/index.d.ts +47 -0
- package/dist/course/migration/index.d.ts.map +1 -0
- package/dist/course/migration/migrationCache.d.ts +12 -0
- package/dist/course/migration/migrationCache.d.ts.map +1 -0
- package/dist/course/modules.d.ts +35 -0
- package/dist/course/modules.d.ts.map +1 -0
- package/dist/course/notABlueprintError.d.ts +4 -0
- package/dist/course/notABlueprintError.d.ts.map +1 -0
- package/dist/course/references/getReferencesForText.d.ts +4 -0
- package/dist/course/references/getReferencesForText.d.ts.map +1 -0
- package/dist/course/references/getReferencesForText.test.d.ts +2 -0
- package/dist/course/references/getReferencesForText.test.d.ts.map +1 -0
- package/dist/course/references/getReferencesTemplate.d.ts +13 -0
- package/dist/course/references/getReferencesTemplate.d.ts.map +1 -0
- package/dist/course/references/mockCiteAsResponse.d.ts +127 -0
- package/dist/course/references/mockCiteAsResponse.d.ts.map +1 -0
- package/dist/course/retireBlueprint.d.ts +4 -0
- package/dist/course/retireBlueprint.d.ts.map +1 -0
- package/dist/course/toolbox.d.ts +18 -0
- package/dist/course/toolbox.d.ts.map +1 -0
- package/dist/date.d.ts +18 -0
- package/dist/date.d.ts.map +1 -0
- package/dist/enrollments/EnrollmentTypes.d.ts +60 -0
- package/dist/enrollments/EnrollmentTypes.d.ts.map +1 -0
- package/dist/enrollments/enrollmentRole.d.ts +5 -0
- package/dist/enrollments/enrollmentRole.d.ts.map +1 -0
- package/dist/enrollments/getEnrollmentGenerator.d.ts +40 -0
- package/dist/enrollments/getEnrollmentGenerator.d.ts.map +1 -0
- package/dist/enrollments/index.d.ts +4 -0
- package/dist/enrollments/index.d.ts.map +1 -0
- package/dist/fetch/__mocks__/fetchJson.d.ts +4 -0
- package/dist/fetch/__mocks__/fetchJson.d.ts.map +1 -0
- package/dist/fetch/__mocks__/getPagedDataGenerator.d.ts +4 -0
- package/dist/fetch/__mocks__/getPagedDataGenerator.d.ts.map +1 -0
- package/dist/fetch/__mocks__/index.d.ts +4 -0
- package/dist/fetch/__mocks__/index.d.ts.map +1 -0
- package/dist/fetch/apiGetConfig.d.ts +4 -0
- package/dist/fetch/apiGetConfig.d.ts.map +1 -0
- package/dist/fetch/apiWriteConfig.d.ts +4 -0
- package/dist/fetch/apiWriteConfig.d.ts.map +1 -0
- package/dist/fetch/canvasDataFetchGenFunc.d.ts +6 -0
- package/dist/fetch/canvasDataFetchGenFunc.d.ts.map +1 -0
- package/dist/fetch/fetchJson.d.ts +3 -0
- package/dist/fetch/fetchJson.d.ts.map +1 -0
- package/dist/fetch/getPagedDataGenerator.d.ts +63 -0
- package/dist/fetch/getPagedDataGenerator.d.ts.map +1 -0
- package/{src/fetch/index.ts → dist/fetch/index.d.ts} +1 -0
- package/dist/fetch/index.d.ts.map +1 -0
- package/dist/fetch/utils.d.ts +4 -0
- package/dist/fetch/utils.d.ts.map +1 -0
- package/dist/files.d.ts +29 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/fixes/annotations.d.ts +15 -0
- package/dist/fixes/annotations.d.ts.map +1 -0
- package/dist/fixes/index.d.ts +36 -0
- package/dist/fixes/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +5 -10
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8966 -0
- package/dist/profile.d.ts +24 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/rubricTypes.d.ts +71 -0
- package/dist/rubricTypes.d.ts.map +1 -0
- package/dist/rubrics.d.ts +9 -0
- package/dist/rubrics.d.ts.map +1 -0
- package/dist/term/Term.d.ts +21 -0
- package/dist/term/Term.d.ts.map +1 -0
- package/dist/term/__tests__/dateFromTermName.test.d.ts +2 -0
- package/dist/term/__tests__/dateFromTermName.test.d.ts.map +1 -0
- package/dist/term/__tests__/getTermsGenerator.test.d.ts +2 -0
- package/dist/term/__tests__/getTermsGenerator.test.d.ts.map +1 -0
- package/dist/term/dateFromTermName.d.ts +4 -0
- package/dist/term/dateFromTermName.d.ts.map +1 -0
- package/dist/term/getTermsGenerator.d.ts +7 -0
- package/dist/term/getTermsGenerator.d.ts.map +1 -0
- package/dist/term/index.d.ts +4 -0
- package/dist/term/index.d.ts.map +1 -0
- package/dist/toolbox.d.ts +5 -0
- package/dist/toolbox.d.ts.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/users/getUserGenerator.d.ts +19 -0
- package/dist/users/getUserGenerator.d.ts.map +1 -0
- package/dist/users/index.d.ts +2 -0
- package/dist/users/index.d.ts.map +1 -0
- package/package.json +51 -45
- package/LICENSE +0 -21
- package/html-loader.js +0 -7
- package/jest.config.js +0 -20
- package/src/Account.ts +0 -69
- package/src/NotImplementedException.ts +0 -3
- package/src/__mocks__/Account.ts +0 -55
- package/src/__mocks__/index.ts +0 -8
- package/src/__mocks__/mockAccountData.ts +0 -43
- package/src/__mocks__/mockEnrollment.ts +0 -22
- package/src/__mocks__/mockRubricData.ts +0 -71
- package/src/__mocks__/mockTabData.ts +0 -13
- package/src/__mocks__/mockTermData.ts +0 -7
- package/src/__mocks__/mockUserData.ts +0 -14
- package/src/__mocks__/utils.ts +0 -9
- package/src/__tests__/canvasUtils.test.ts +0 -527
- package/src/__tests__/fetch.test.ts +0 -310
- package/src/__tests__/profile.test.ts +0 -19
- package/src/__tests__/rubrics.test.ts +0 -131
- package/src/baseCanvasObject.ts +0 -139
- package/src/canvasDataDefs.ts +0 -124
- package/src/canvasUtils.ts +0 -420
- package/src/consts.ts +0 -2
- package/src/content/BaseContentItem.ts +0 -219
- package/src/content/ContentKind.ts +0 -85
- package/src/content/__mocks__/determineContent.ts +0 -27
- package/src/content/__mocks__/mockAssignmentSubmission.ts +0 -37
- package/src/content/__mocks__/mockContentData.ts +0 -98
- package/src/content/__mocks__/openThisContentInTarget.ts +0 -2
- package/src/content/__testingUtils__/utils.ts +0 -47
- package/src/content/__tests__/determineContent.test.ts +0 -101
- package/src/content/__tests__/getContentFuncs.test.ts +0 -78
- package/src/content/assignments/Assignment.ts +0 -69
- package/src/content/assignments/AssignmentKind.ts +0 -29
- package/src/content/assignments/__tests__/AssignmentKind.test.ts +0 -31
- package/src/content/assignments/__tests__/assignments.test.ts +0 -72
- package/src/content/assignments/deleteAssignmentGroup.ts +0 -15
- package/src/content/assignments/genAssignmentGroups.ts +0 -15
- package/src/content/assignments/index.ts +0 -31
- package/src/content/assignments/legacy.ts +0 -11
- package/src/content/assignments/updateAssignmentDueDates.ts +0 -25
- package/src/content/determineContent.ts +0 -72
- package/src/content/discussions/Discussion.ts +0 -32
- package/src/content/discussions/DiscussionKind.ts +0 -30
- package/src/content/discussions/__tests__/DiscussionKind.test.ts +0 -31
- package/src/content/discussions/genEquivalentDiscussionData.ts +0 -97
- package/src/content/getContentFuncs.ts +0 -30
- package/src/content/openThisContentInTarget.ts +0 -38
- package/src/content/pages/Page.ts +0 -35
- package/src/content/pages/PageKind.ts +0 -39
- package/src/content/pages/__tests__/PageKind.test.ts +0 -86
- package/src/content/pages/__tests__/learningMaterialsForModule.ts +0 -57
- package/src/content/pages/index.ts +0 -12
- package/src/content/pages/learningMaterialsForModule.ts +0 -16
- package/src/content/pages/types.ts +0 -11
- package/src/content/quizzes/Quiz.ts +0 -25
- package/src/content/quizzes/QuizKind.ts +0 -23
- package/src/content/quizzes/__tests__/QuizKind.test.ts +0 -30
- package/src/content/quizzes/index.ts +0 -3
- package/src/content/quizzes/types.ts +0 -101
- package/src/content/types.ts +0 -302
- package/src/course/Course.ts +0 -538
- package/src/course/IBlueprintCourse.ts +0 -8
- package/src/course/__mocks__/blueprint.ts +0 -31
- package/src/course/__mocks__/mockCourseData.ts +0 -49
- package/src/course/__mocks__/mockLatePolicy.ts +0 -14
- package/src/course/__mocks__/mockModuleData.ts +0 -60
- package/src/course/__mocks__/mockProgressData.ts +0 -28
- package/src/course/__mocks__/syllabus.gallant.html +0 -302
- package/src/course/__mocks__/syllabus.goofus.html +0 -288
- package/src/course/__mocks__/syllabus.grad.html +0 -282
- package/src/course/__tests__/Course.test.ts +0 -91
- package/src/course/__tests__/blueprint.test.ts +0 -292
- package/src/course/__tests__/changeStartDate.test.ts +0 -180
- package/src/course/__tests__/index.test.ts +0 -104
- package/src/course/blueprint.ts +0 -116
- package/src/course/cachedGetAssociatedCoursesFunc.ts +0 -13
- package/src/course/changeStartDate.ts +0 -139
- package/src/course/code.ts +0 -32
- package/src/course/courseTypes.ts +0 -161
- package/src/course/getCourseIdFromUrl.ts +0 -7
- package/src/course/getSections.ts +0 -9
- package/src/course/getTermNameFromSections.ts +0 -9
- package/src/course/index.ts +0 -12
- package/src/course/migration/__mocks__/mockMigrationData.ts +0 -39
- package/src/course/migration/__tests__/migration.test.ts +0 -173
- package/src/course/migration/__tests__/migrationCache.test.ts +0 -45
- package/src/course/migration/index.ts +0 -134
- package/src/course/migration/migrationCache.ts +0 -56
- package/src/course/modules.ts +0 -113
- package/src/course/notABlueprintError.ts +0 -3
- package/src/course/references/getReferencesForText.test.ts +0 -18
- package/src/course/references/getReferencesForText.ts +0 -12
- package/src/course/references/getReferencesTemplate.ts +0 -28
- package/src/course/references/mockCiteAsResponse.ts +0 -320
- package/src/course/retireBlueprint.ts +0 -21
- package/src/course/toolbox.ts +0 -107
- package/src/date.ts +0 -119
- package/src/enrollments/EnrollmentTypes.ts +0 -76
- package/src/enrollments/enrollmentRole.ts +0 -6
- package/src/enrollments/getEnrollmentGenerator.ts +0 -79
- package/src/enrollments/index.ts +0 -3
- package/src/fetch/__mocks__/fetchJson.ts +0 -1
- package/src/fetch/__mocks__/getPagedDataGenerator.ts +0 -8
- package/src/fetch/__mocks__/index.ts +0 -6
- package/src/fetch/apiGetConfig.ts +0 -10
- package/src/fetch/apiWriteConfig.ts +0 -13
- package/src/fetch/canvasDataFetchGenFunc.ts +0 -20
- package/src/fetch/fetchJson.ts +0 -22
- package/src/fetch/getPagedDataGenerator.ts +0 -157
- package/src/fetch/utils.ts +0 -16
- package/src/files.ts +0 -60
- package/src/fixes/annotations.ts +0 -105
- package/src/fixes/index.ts +0 -81
- package/src/profile.ts +0 -253
- package/src/rubricTypes.ts +0 -82
- package/src/rubrics.ts +0 -48
- package/src/term/Term.ts +0 -77
- package/src/term/__tests__/dateFromTermName.test.ts +0 -22
- package/src/term/__tests__/getTermsGenerator.test.ts +0 -24
- package/src/term/dateFromTermName.ts +0 -17
- package/src/term/getTermsGenerator.ts +0 -21
- package/src/term/index.ts +0 -3
- package/src/toolbox.ts +0 -19
- package/src/types.ts +0 -134
- package/src/users/getUserGenerator.ts +0 -39
- package/src/users/index.ts +0 -1
- package/tsconfig.json +0 -46
- package/webpack.config.js +0 -122
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { getFileLinks, getExternalLinks } from "@/content/getContentFuncs";
|
|
2
|
-
|
|
3
|
-
describe("Canvas Link Tests", () => {
|
|
4
|
-
const courseId = 12345;
|
|
5
|
-
|
|
6
|
-
it("should correctly identify file links within the course", () => {
|
|
7
|
-
const body = `
|
|
8
|
-
<div>
|
|
9
|
-
<a href="https://unity.instructure.com/files/12345">Course File 1</a>
|
|
10
|
-
<a href="https://unity.instructure.com/courses/12345/files/67890">Course File 2</a>
|
|
11
|
-
<a href="https://www.example.com/files/12345">External File</a>
|
|
12
|
-
</div>
|
|
13
|
-
`;
|
|
14
|
-
|
|
15
|
-
const fileLinks = getFileLinks(body, courseId);
|
|
16
|
-
expect(fileLinks.length).toBe(2);
|
|
17
|
-
expect(fileLinks[0]).toBe("https://unity.instructure.com/files/12345");
|
|
18
|
-
expect(fileLinks[1]).toBe("https://unity.instructure.com/courses/12345/files/67890");
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("should correctly identify external links", () => {
|
|
22
|
-
const body = `
|
|
23
|
-
<div>
|
|
24
|
-
<a href="https://unity.instructure.com/files/12345">Course File</a>
|
|
25
|
-
<a href="https://unity.instructure.com/courses/12345/files/67890">Course File</a>
|
|
26
|
-
<a href="https://www.example.com/page">External Page</a>
|
|
27
|
-
<a href="https://anotherexample.com/page">Another External Page</a>
|
|
28
|
-
</div>
|
|
29
|
-
`;
|
|
30
|
-
|
|
31
|
-
const externalLinks = getExternalLinks(body, courseId);
|
|
32
|
-
expect(externalLinks.length).toBe(2);
|
|
33
|
-
expect(externalLinks[0]).toBe("https://www.example.com/page");
|
|
34
|
-
expect(externalLinks[1]).toBe("https://anotherexample.com/page");
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("should handle an empty body", () => {
|
|
38
|
-
const body = ``;
|
|
39
|
-
|
|
40
|
-
const fileLinks = getFileLinks(body, courseId);
|
|
41
|
-
const externalLinks = getExternalLinks(body, courseId);
|
|
42
|
-
|
|
43
|
-
expect(fileLinks.length).toBe(0);
|
|
44
|
-
expect(externalLinks.length).toBe(0);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("should handle a body with no links", () => {
|
|
48
|
-
const body = `<div>No links here</div>`;
|
|
49
|
-
|
|
50
|
-
const fileLinks = getFileLinks(body, courseId);
|
|
51
|
-
const externalLinks = getExternalLinks(body, courseId);
|
|
52
|
-
|
|
53
|
-
expect(fileLinks.length).toBe(0);
|
|
54
|
-
expect(externalLinks.length).toBe(0);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("should handle mixed content correctly", () => {
|
|
58
|
-
const body = `
|
|
59
|
-
<div>
|
|
60
|
-
<a href="https://unity.instructure.com/files/12345">Course File</a>
|
|
61
|
-
<a href="https://www.example.com/page">External Page</a>
|
|
62
|
-
<a href="https://unity.instructure.com/courses/12345/files/67890">Course File</a>
|
|
63
|
-
<a href="https://anotherexample.com/page">Another External Page</a>
|
|
64
|
-
</div>
|
|
65
|
-
`;
|
|
66
|
-
|
|
67
|
-
const fileLinks = getFileLinks(body, courseId);
|
|
68
|
-
const externalLinks = getExternalLinks(body, courseId);
|
|
69
|
-
|
|
70
|
-
expect(fileLinks.length).toBe(2);
|
|
71
|
-
expect(fileLinks[0]).toBe("https://unity.instructure.com/files/12345");
|
|
72
|
-
expect(fileLinks[1]).toBe("https://unity.instructure.com/courses/12345/files/67890");
|
|
73
|
-
|
|
74
|
-
expect(externalLinks.length).toBe(2);
|
|
75
|
-
expect(externalLinks[0]).toBe("https://www.example.com/page");
|
|
76
|
-
expect(externalLinks[1]).toBe("https://anotherexample.com/page");
|
|
77
|
-
});
|
|
78
|
-
});
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import {BaseContentItem} from "@/content/BaseContentItem";
|
|
2
|
-
import {ICanvasCallConfig} from "@/canvasUtils";
|
|
3
|
-
import {Temporal} from "temporal-polyfill";
|
|
4
|
-
import assert from "assert";
|
|
5
|
-
import AssignmentKind from "@/content/assignments/AssignmentKind";
|
|
6
|
-
import {IAssignmentData} from "@canvas/content/types";
|
|
7
|
-
|
|
8
|
-
export class Assignment extends BaseContentItem {
|
|
9
|
-
static kind = AssignmentKind;
|
|
10
|
-
static nameProperty = 'name';
|
|
11
|
-
static bodyProperty = 'description';
|
|
12
|
-
static contentUrlTemplate = "/api/v1/courses/{course_id}/assignments/{content_id}";
|
|
13
|
-
static allContentUrlTemplate = "/api/v1/courses/{course_id}/assignments";
|
|
14
|
-
|
|
15
|
-
constructor(assignmentData: IAssignmentData, courseId: number) {
|
|
16
|
-
super(assignmentData, courseId);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async setDueAt(dueAt: Date, config?: ICanvasCallConfig) {
|
|
20
|
-
const sourceDueAt = this.rawData.due_at ? Temporal.Instant.from(this.rawData.due_at) : null;
|
|
21
|
-
const targetDueAt = Temporal.Instant.from(dueAt.toISOString());
|
|
22
|
-
|
|
23
|
-
const payload: Record<string, { due_at: string, peer_reviews_assign_at?: string }> = {
|
|
24
|
-
assignment: {
|
|
25
|
-
due_at: dueAt.toISOString(),
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (this.rawData.peer_reviews && 'automatic_peer_reviews' in this.rawData) {
|
|
30
|
-
const peerReviewTime = this.rawData.peer_reviews_assign_at ? Temporal.Instant.from(this.rawData.peer_reviews_assign_at) : null;
|
|
31
|
-
assert(sourceDueAt, "Trying to set peer review date without a due date for the assignment.")
|
|
32
|
-
if (peerReviewTime) {
|
|
33
|
-
const peerReviewOffset = sourceDueAt.until(peerReviewTime);
|
|
34
|
-
const newPeerReviewTime = targetDueAt.add(peerReviewOffset);
|
|
35
|
-
payload.assignment.peer_reviews_assign_at =
|
|
36
|
-
new Date(newPeerReviewTime.epochMilliseconds).toISOString();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const data = await this.saveData(payload, config);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.canvasData['due_at'] = dueAt.toISOString();
|
|
45
|
-
return data;
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
get rawData() {
|
|
50
|
-
return this.canvasData as IAssignmentData;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
async updateContent(text?: string | null, name?: string | null, config?: ICanvasCallConfig) {
|
|
55
|
-
const assignmentData: Record<string, any> = {};
|
|
56
|
-
if (text) {
|
|
57
|
-
assignmentData.description = text
|
|
58
|
-
this.rawData.description = text
|
|
59
|
-
}
|
|
60
|
-
if (name) {
|
|
61
|
-
assignmentData.name = name;
|
|
62
|
-
this.rawData.name = name;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return await this.saveData({
|
|
66
|
-
assignment: assignmentData
|
|
67
|
-
}, config)
|
|
68
|
-
}
|
|
69
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import {CanvasData} from "@/canvasDataDefs";
|
|
2
|
-
import {ICanvasCallConfig} from "@/canvasUtils";
|
|
3
|
-
import {fetchJson} from "@/fetch/fetchJson";
|
|
4
|
-
import {getPagedDataGenerator} from "@/fetch/getPagedDataGenerator";
|
|
5
|
-
import {ContentKind, contentUrlFuncs, putContentFunc} from "@/content/ContentKind";
|
|
6
|
-
import {IAssignmentData, UpdateAssignmentDataOptions} from "@canvas/content/types";
|
|
7
|
-
|
|
8
|
-
export const assignmentUrlFuncs = contentUrlFuncs('assignments');
|
|
9
|
-
const AssignmentKind: ContentKind<
|
|
10
|
-
IAssignmentData,
|
|
11
|
-
CanvasData,
|
|
12
|
-
UpdateAssignmentDataOptions
|
|
13
|
-
> = {
|
|
14
|
-
getId: (data) => data.id,
|
|
15
|
-
dataIsThisKind: (data): data is IAssignmentData => {
|
|
16
|
-
return 'submission_types' in data
|
|
17
|
-
},
|
|
18
|
-
getName: (data) => data.name,
|
|
19
|
-
getBody: (data) => data.description,
|
|
20
|
-
async get(courseId: number, contentId: number, config?: ICanvasCallConfig<Record<string, any>>) {
|
|
21
|
-
const data = await fetchJson(assignmentUrlFuncs.getApiUrl(courseId, contentId), config) as IAssignmentData;
|
|
22
|
-
return data;
|
|
23
|
-
},
|
|
24
|
-
...assignmentUrlFuncs,
|
|
25
|
-
dataGenerator: (courseId, config) => getPagedDataGenerator<IAssignmentData>(assignmentUrlFuncs.getAllApiUrl(courseId), config),
|
|
26
|
-
put: putContentFunc<UpdateAssignmentDataOptions, IAssignmentData>(assignmentUrlFuncs.getApiUrl),
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export default AssignmentKind;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import {mockAssignmentData} from "@/content/__mocks__/mockContentData";
|
|
2
|
-
import AssignmentKind, {assignmentUrlFuncs} from "@/content/assignments/AssignmentKind";
|
|
3
|
-
import {getDataTests, kindUrlTests} from "@/content/__testingUtils__/utils";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
jest.mock('@/fetch/fetchJson')
|
|
7
|
-
jest.mock('@/fetch/getPagedDataGenerator')
|
|
8
|
-
describe('AssignmentKind', () => {
|
|
9
|
-
it('getId works', () => expect(AssignmentKind.getId({...mockAssignmentData, id: 100})).toEqual(100))
|
|
10
|
-
it('getName works', () => expect(AssignmentKind.getName({
|
|
11
|
-
...mockAssignmentData,
|
|
12
|
-
name: "Assignment"
|
|
13
|
-
})).toEqual('Assignment'))
|
|
14
|
-
it('getBody works', () => expect(AssignmentKind.getBody({
|
|
15
|
-
...mockAssignmentData,
|
|
16
|
-
description: "<p>Instructions</p>"
|
|
17
|
-
})).toEqual("<p>Instructions</p>"))
|
|
18
|
-
|
|
19
|
-
describe('get Data Tests', getDataTests(AssignmentKind, [
|
|
20
|
-
{...mockAssignmentData, id: 1},
|
|
21
|
-
], { name: "x" }));
|
|
22
|
-
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
describe('AssignmentUrlFuncs', kindUrlTests(assignmentUrlFuncs,
|
|
26
|
-
1, 3,
|
|
27
|
-
'/api/v1/courses/1/assignments/3',
|
|
28
|
-
'/courses/1/assignments/3',
|
|
29
|
-
'/api/v1/courses/1/assignments'
|
|
30
|
-
))
|
|
31
|
-
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import {mockCourseData} from "../../../course/__mocks__/mockCourseData";
|
|
2
|
-
import {formDataify, ICanvasCallConfig, range} from "../../../canvasUtils";
|
|
3
|
-
import {updateAssignmentData} from "../index";
|
|
4
|
-
import {mockAssignmentData} from "../../__mocks__/mockContentData";
|
|
5
|
-
import fetchMock from "jest-fetch-mock";
|
|
6
|
-
import {assignmentDataGen} from "@/content/assignments";
|
|
7
|
-
import {returnMockAsyncGen} from "@/__mocks__/utils";
|
|
8
|
-
|
|
9
|
-
import * as canvasUtils from '@/canvasUtils';
|
|
10
|
-
import {getPagedDataGenerator} from "@/fetch/getPagedDataGenerator";
|
|
11
|
-
import {fetchJson} from "@/fetch/fetchJson";
|
|
12
|
-
import {putContentConfig} from "@/content/BaseContentItem";
|
|
13
|
-
import AssignmentKind from "@/content/assignments/AssignmentKind";
|
|
14
|
-
import {UpdateAssignmentDataOptions} from "@canvas/content/types";
|
|
15
|
-
|
|
16
|
-
fetchMock.enableMocks();
|
|
17
|
-
|
|
18
|
-
jest.mock('@/fetch/getPagedDataGenerator', () => ({
|
|
19
|
-
getPagedDataGenerator: jest.fn(),
|
|
20
|
-
|
|
21
|
-
}));
|
|
22
|
-
|
|
23
|
-
jest.mock('@/fetch/fetchJson', () => ({
|
|
24
|
-
fetchJson: jest.fn(),
|
|
25
|
-
}))
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
it('gets assignments from course id', async () => {
|
|
29
|
-
const {id} = mockCourseData;
|
|
30
|
-
const config: ICanvasCallConfig = {
|
|
31
|
-
queryParams: {
|
|
32
|
-
bunnies: true,
|
|
33
|
-
},
|
|
34
|
-
fetchInit: {}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const responseDatas = [...range(0, 10)].map(id => ({...mockAssignmentData, id}));
|
|
39
|
-
(getPagedDataGenerator as jest.Mock).mockImplementation(returnMockAsyncGen(responseDatas));
|
|
40
|
-
const i = range(0, 10);
|
|
41
|
-
for await (const assignment of assignmentDataGen(id, config)) {
|
|
42
|
-
expect(assignment.id).toEqual(i.next().value);
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('gets assignment HTML url', () => {
|
|
47
|
-
expect(AssignmentKind.getHtmlUrl(1, 2)).toEqual('/courses/1/assignments/2');
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('updates assignment data', async () => {
|
|
51
|
-
const mockData = {...mockAssignmentData, name: "X"};
|
|
52
|
-
const updateData: UpdateAssignmentDataOptions = {
|
|
53
|
-
assignment: {
|
|
54
|
-
name: "Y"
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
const formData = {
|
|
58
|
-
data: "FormData"
|
|
59
|
-
}
|
|
60
|
-
const config = {};
|
|
61
|
-
const formDataify = jest.spyOn(canvasUtils, 'formDataify');
|
|
62
|
-
(fetchJson as jest.Mock).mockResolvedValue(mockData);
|
|
63
|
-
(formDataify as jest.Mock).mockReturnValue(formData)
|
|
64
|
-
const result = await updateAssignmentData(0, 0, updateData);
|
|
65
|
-
expect(formDataify).toHaveBeenCalledWith((updateData));
|
|
66
|
-
expect(fetchJson).toHaveBeenCalledWith('/api/v1/courses/0/assignments/0', putContentConfig(formData, config));
|
|
67
|
-
|
|
68
|
-
expect(result).toEqual(mockData);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
})
|
|
72
|
-
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {fetchJson} from "@canvas/fetch/fetchJson";
|
|
2
|
-
import {formDataify} from "@canvas/canvasUtils";
|
|
3
|
-
|
|
4
|
-
export default async function(courseId:number, groupId:number, moveAssignmentsTo?: number) {
|
|
5
|
-
const data = moveAssignmentsTo? { move_assignments_to: moveAssignmentsTo} : {};
|
|
6
|
-
|
|
7
|
-
const result = await fetchJson(`/api/v1/courses/${courseId}/assignment_groups/${groupId}`, {
|
|
8
|
-
fetchInit: {
|
|
9
|
-
method: 'DELETE',
|
|
10
|
-
body: formDataify(data),
|
|
11
|
-
}
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {getPagedDataGenerator} from "@canvas/fetch/getPagedDataGenerator";
|
|
2
|
-
|
|
3
|
-
import {AssignmentGroup} from "@canvas/content/types";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export type AssignmentGroupInclude = 'assignments' | 'discussion_topic' | 'all_dates' |
|
|
7
|
-
'assignment_visibility' | 'overrides' | 'submission' | 'observed_users' | 'can_edit' | 'score_statistics'
|
|
8
|
-
|
|
9
|
-
export default function(courseId:number, include: AssignmentGroupInclude[] = ['assignments']) {
|
|
10
|
-
return getPagedDataGenerator<AssignmentGroup>(`/api/v1/courses/${courseId}/assignment_groups`, {
|
|
11
|
-
queryParams: {
|
|
12
|
-
include,
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import AssignmentKind from "@/content/assignments/AssignmentKind";
|
|
2
|
-
import {ICanvasCallConfig} from "@/canvasUtils";
|
|
3
|
-
import {Assignment} from "@/content/assignments/Assignment";
|
|
4
|
-
import {IAssignmentData} from "@canvas/content/types";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export const assignmentDataGen = AssignmentKind.dataGenerator;
|
|
8
|
-
export const updateAssignmentData = AssignmentKind.put!;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
type UpdateAssignmentDueDatesOptions = {
|
|
13
|
-
courseId?: number,
|
|
14
|
-
}
|
|
15
|
-
export async function updateAssignmentDueDates(offset: number, assignments:IAssignmentData[], options?: UpdateAssignmentDueDatesOptions) {
|
|
16
|
-
|
|
17
|
-
const promises: Promise<any>[] = [];
|
|
18
|
-
const returnAssignments: Assignment[] = [];
|
|
19
|
-
let { courseId } = options ?? {};
|
|
20
|
-
if (!courseId && courseId !== 0) {
|
|
21
|
-
courseId = assignments[0].course_id;
|
|
22
|
-
}
|
|
23
|
-
if (offset === 0 || offset) {
|
|
24
|
-
for await (const data of assignments) {
|
|
25
|
-
const assignment = new Assignment(data, courseId);
|
|
26
|
-
returnAssignments.push(assignment);
|
|
27
|
-
promises.push(assignment.dueAtTimeDelta(Number(offset)));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return returnAssignments;
|
|
31
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// noinspection JSUnusedGlobalSymbols
|
|
2
|
-
|
|
3
|
-
import AssignmentKind from "@/content/assignments/AssignmentKind";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export const assignmentDataGen = AssignmentKind.dataGenerator;
|
|
7
|
-
export const updateAssignmentData = AssignmentKind.put!;
|
|
8
|
-
export const getAssignmentData = AssignmentKind.get;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import {Assignment} from "@/content/assignments/Assignment";
|
|
2
|
-
import {IAssignmentData} from "@canvas/content/types";
|
|
3
|
-
|
|
4
|
-
export type UpdateAssignmentDueDatesOptions = {
|
|
5
|
-
courseId?: number,
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export async function updateAssignmentDueDates(offset: number, assignments: IAssignmentData[], options?: UpdateAssignmentDueDatesOptions) {
|
|
9
|
-
|
|
10
|
-
const promises: Promise<any>[] = [];
|
|
11
|
-
const returnAssignments: Assignment[] = [];
|
|
12
|
-
let {courseId} = options ?? {};
|
|
13
|
-
if (!courseId && courseId !== 0) {
|
|
14
|
-
courseId = assignments[0].course_id;
|
|
15
|
-
}
|
|
16
|
-
if (offset === 0 || offset) {
|
|
17
|
-
for await (const data of assignments) {
|
|
18
|
-
const assignment = new Assignment(data, courseId);
|
|
19
|
-
returnAssignments.push(assignment);
|
|
20
|
-
promises.push(assignment.dueAtTimeDelta(Number(offset)));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
await Promise.all(promises);
|
|
24
|
-
return returnAssignments;
|
|
25
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import {Quiz} from "@/content/quizzes/Quiz";
|
|
2
|
-
import {Page} from "@/content/pages/Page";
|
|
3
|
-
import {Discussion} from "@/content/discussions/Discussion";
|
|
4
|
-
import {ICanvasCallConfig} from "@/canvasUtils";
|
|
5
|
-
import {Assignment} from "@/content/assignments/Assignment";
|
|
6
|
-
import {ContentData} from "@/content/types";
|
|
7
|
-
import AssignmentKind from "@/content/assignments/AssignmentKind";
|
|
8
|
-
import QuizKind from "@/content/quizzes/QuizKind";
|
|
9
|
-
import PageKind from "@/content/pages/PageKind";
|
|
10
|
-
import DiscussionKind from "@/content/discussions/DiscussionKind";
|
|
11
|
-
import {ContentKind} from "@/content/ContentKind";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export const CONTENT_KINDS = [
|
|
15
|
-
DiscussionKind,
|
|
16
|
-
AssignmentKind,
|
|
17
|
-
PageKind,
|
|
18
|
-
QuizKind,
|
|
19
|
-
]
|
|
20
|
-
|
|
21
|
-
export const ContentKinds = {
|
|
22
|
-
fromUrl: getContentKindFromUrl,
|
|
23
|
-
fromContent: getContentKindFromContent,
|
|
24
|
-
getBody<Type extends ContentData>(contentData:Type) {
|
|
25
|
-
const kind = getContentKindFromContent(contentData);
|
|
26
|
-
return (kind?.getBody as (a:any) => string)(contentData);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
export function getContentClassFromUrl(url: string | null = null) {
|
|
32
|
-
if (!url) url = document.documentURI;
|
|
33
|
-
for (const class_ of [Assignment, Quiz, Page, Discussion]) {
|
|
34
|
-
if (class_.contentUrlPart && url.includes(class_.contentUrlPart)) return class_;
|
|
35
|
-
}
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export async function getContentItemFromUrl(url: string | null = null) {
|
|
40
|
-
const ContentClass = getContentClassFromUrl(url);
|
|
41
|
-
if (!ContentClass) return null;
|
|
42
|
-
return await ContentClass.getFromUrl(url);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function getContentKindFromUrl(url:string) {
|
|
46
|
-
return CONTENT_KINDS.find(a => a.isValidUrl(url))
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
export type ContentKindInPractice = (typeof CONTENT_KINDS[number]);
|
|
51
|
-
export type ContentDataType<Kind extends ContentKindInPractice> = Awaited<ReturnType<Kind['get']>>
|
|
52
|
-
export function getContentKindFromContent<Kind extends ContentKindInPractice>(contentData:ContentDataType<Kind>) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const result = CONTENT_KINDS.find(a => a.dataIsThisKind(contentData)) as Kind;
|
|
56
|
-
function typeGuard(result: ContentKindInPractice) : result is Kind{
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
if(!typeGuard(result)) throw new Error("Faulty content type coercion");
|
|
60
|
-
return result;
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
export async function getContentDataFromUrl(url:string, config:ICanvasCallConfig) {
|
|
67
|
-
const kind = getContentKindFromUrl(url);
|
|
68
|
-
if(!kind) return;
|
|
69
|
-
const [courseId, id] = kind.getCourseAndContentIdFromUrl(url);
|
|
70
|
-
if(!courseId || !id) return;
|
|
71
|
-
return await kind.get(courseId, id, config);
|
|
72
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {BaseContentItem} from "@/content/BaseContentItem";
|
|
2
|
-
import {ICanvasCallConfig} from "@/canvasUtils";
|
|
3
|
-
import {Temporal} from "temporal-polyfill";
|
|
4
|
-
import DiscussionKind from "@/content/discussions/DiscussionKind";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {IDiscussionData} from "@canvas/content/types";
|
|
8
|
-
|
|
9
|
-
export class Discussion extends BaseContentItem {
|
|
10
|
-
static kindInfo = DiscussionKind;
|
|
11
|
-
static nameProperty = 'title';
|
|
12
|
-
static bodyProperty = 'message';
|
|
13
|
-
static contentUrlTemplate = "/api/v1/courses/{course_id}/discussion_topics/{content_id}";
|
|
14
|
-
static allContentUrlTemplate = "/api/v1/courses/{course_id}/discussion_topics"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
async offsetPublishDelay(days: number, config?: ICanvasCallConfig) {
|
|
18
|
-
const data = this.rawData
|
|
19
|
-
if (!this.rawData.delayed_post_at) return;
|
|
20
|
-
let delayedPostAt = Temporal.Instant.from(this.rawData.delayed_post_at).toZonedDateTimeISO('UTC');
|
|
21
|
-
delayedPostAt = delayedPostAt.add({days})
|
|
22
|
-
|
|
23
|
-
const payload = {
|
|
24
|
-
delayed_post_at: new Date(delayedPostAt.epochMilliseconds).toISOString()
|
|
25
|
-
}
|
|
26
|
-
await this.saveData(payload, config);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
get rawData() {
|
|
30
|
-
return this.canvasData as IDiscussionData;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import {ICanvasCallConfig} from "@/canvasUtils";
|
|
2
|
-
import {fetchJson} from "@/fetch/fetchJson";
|
|
3
|
-
import {getPagedDataGenerator} from "@/fetch/getPagedDataGenerator";
|
|
4
|
-
import {ContentKind, contentUrlFuncs, putContentFunc} from "@/content/ContentKind";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {IDiscussionData, SaveDiscussionData} from "@canvas/content/types";
|
|
8
|
-
|
|
9
|
-
export type GetDiscussionOptions = Record<string, any>;
|
|
10
|
-
export const discussionUrlFuncs = contentUrlFuncs('discussion_topics');
|
|
11
|
-
const DiscussionKind: ContentKind<
|
|
12
|
-
IDiscussionData,
|
|
13
|
-
GetDiscussionOptions,
|
|
14
|
-
SaveDiscussionData
|
|
15
|
-
> = {
|
|
16
|
-
...discussionUrlFuncs,
|
|
17
|
-
dataIsThisKind(data): data is IDiscussionData {
|
|
18
|
-
return data.hasOwnProperty('discussion_type');
|
|
19
|
-
},
|
|
20
|
-
getId: (data) => data.id,
|
|
21
|
-
getName: (data) => data.title,
|
|
22
|
-
getBody: (data) => data.message,
|
|
23
|
-
async get(courseId: number, contentId: number, config?: ICanvasCallConfig<GetDiscussionOptions>) {
|
|
24
|
-
return await fetchJson(discussionUrlFuncs.getApiUrl(courseId, contentId), config) as IDiscussionData;
|
|
25
|
-
},
|
|
26
|
-
dataGenerator: (courseId, config) => getPagedDataGenerator<IDiscussionData>(discussionUrlFuncs.getAllApiUrl(courseId), config),
|
|
27
|
-
put: putContentFunc<SaveDiscussionData, IDiscussionData>(discussionUrlFuncs.getApiUrl),
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export default DiscussionKind;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import AssignmentKind, {assignmentUrlFuncs} from "@/content/assignments/AssignmentKind";
|
|
2
|
-
import {mockAssignmentData, mockDiscussionData} from "@/content/__mocks__/mockContentData";
|
|
3
|
-
import {getDataTests, kindUrlTests} from "@/content/__testingUtils__/utils";
|
|
4
|
-
import DiscussionKind, {discussionUrlFuncs} from "@/content/discussions/DiscussionKind";
|
|
5
|
-
|
|
6
|
-
jest.mock('@/fetch/fetchJson')
|
|
7
|
-
jest.mock('@/fetch/getPagedDataGenerator')
|
|
8
|
-
describe('DiscussionKind', () => {
|
|
9
|
-
it('getId works', () => expect(DiscussionKind.getId({...mockDiscussionData, id: 100})).toEqual(100))
|
|
10
|
-
it('getName works', () => expect(DiscussionKind.getName({
|
|
11
|
-
...mockDiscussionData,
|
|
12
|
-
title: "Discussion"
|
|
13
|
-
})).toEqual('Discussion'))
|
|
14
|
-
it('getBody works', () => expect(DiscussionKind.getBody({
|
|
15
|
-
...mockDiscussionData,
|
|
16
|
-
message: "<p>Instructions</p>"
|
|
17
|
-
})).toEqual("<p>Instructions</p>"))
|
|
18
|
-
|
|
19
|
-
describe('get Data Tests', getDataTests(DiscussionKind, [
|
|
20
|
-
{...mockDiscussionData, id: 1},
|
|
21
|
-
], { title: "x" }));
|
|
22
|
-
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
describe('DiscussionUrlFuncs', kindUrlTests(discussionUrlFuncs,
|
|
27
|
-
1, 3,
|
|
28
|
-
'/api/v1/courses/1/discussion_topics/3',
|
|
29
|
-
'/courses/1/discussion_topics/3',
|
|
30
|
-
'/api/v1/courses/1/discussion_topics'
|
|
31
|
-
))
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
// import {genBlueprintDataForCode} from "@canvas/course/blueprint";
|
|
2
|
-
// import {Course} from "@canvas/course/Course";
|
|
3
|
-
// import AssignmentKind from "@canvas/content/assignments/AssignmentKind";
|
|
4
|
-
// import {ContentData, IAssignmentData, IDiscussionData} from "@canvas/content/types";
|
|
5
|
-
// import {Assignment} from "@canvas/content/assignments/Assignment";
|
|
6
|
-
// import DiscussionKind from "@canvas/content/discussions/DiscussionKind";
|
|
7
|
-
// import {getModuleWeekNumber, moduleGenerator} from "@canvas/course/modules";
|
|
8
|
-
// import {ContentKind} from "@canvas/content/ContentKind";
|
|
9
|
-
// import {
|
|
10
|
-
// CONTENT_KINDS,
|
|
11
|
-
// ContentKindInPractice,
|
|
12
|
-
// ContentDataType,
|
|
13
|
-
// getContentKindFromContent
|
|
14
|
-
// } from "@canvas/content/determineContent";
|
|
15
|
-
// import {getModuleInfo} from "@/ui/speedGrader/modules";
|
|
16
|
-
// import {renderAsyncGen} from "@canvas/canvasUtils";
|
|
17
|
-
// import {IModuleItemData} from "@canvas/canvasDataDefs";
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Retrieves the equivalent discussion data for a given assignment across multiple course blueprints.
|
|
21
|
-
*
|
|
22
|
-
* This function searches through the assignments in various blueprints of a course, attempting to find
|
|
23
|
-
* discussions that were originally associated with a given assignment (identified by its `assignmentId`).
|
|
24
|
-
* If a matching discussion is found in any blueprint, the corresponding discussion data (`IDiscussionData`) is yielded.
|
|
25
|
-
* This is useful for recovering lost or missing discussion data when the original discussion ID is not available,
|
|
26
|
-
* but the assignment information is accessible.
|
|
27
|
-
*
|
|
28
|
-
* The function processes the blueprints lazily, yielding results one by one as they are found. This ensures efficient memory usage
|
|
29
|
-
* when dealing with large sets of blueprint data.
|
|
30
|
-
*
|
|
31
|
-
* @param {Course} course - The course from which the blueprint data is being retrieved. This course is used to find
|
|
32
|
-
* the relevant blueprints through the `genBlueprintDataForCode` function.
|
|
33
|
-
* @param {number} assignmentId - The ID of the assignment whose associated discussion data is being retrieved.
|
|
34
|
-
* The function will search across blueprints to find discussions linked to this assignment.
|
|
35
|
-
*
|
|
36
|
-
* @yields {IDiscussionData} - The `IDiscussionData` object that corresponds to the found discussion, if any.
|
|
37
|
-
* This data includes the discussion properties like `discussion_type`, `require_initial_post`, etc.
|
|
38
|
-
*
|
|
39
|
-
* @remarks
|
|
40
|
-
* - If no discussion is found for the given assignment ID across the blueprints, the generator will complete without yielding any values.
|
|
41
|
-
* - If the discussion is found, the function will yield the associated `discussion_topic` object, which can then be processed or restored as needed.
|
|
42
|
-
* - The function operates asynchronously and uses a generator to lazily fetch and yield discussion data, ensuring efficient handling of large datasets.
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* const generator = getEquivalentDiscussionData(course, 123);
|
|
46
|
-
* for await (const discussion of generator) {
|
|
47
|
-
* console.log(discussion); // Process each matching discussion found
|
|
48
|
-
* }
|
|
49
|
-
*/
|
|
50
|
-
|
|
51
|
-
// export async function* genEquivalentDiscussionData(course: {id: number, courseCode: string, accountId: number }, assignmentId: number): AsyncGenerator {
|
|
52
|
-
// const blueprintGen = genBlueprintDataForCode(course.courseCode, [course.accountId]);
|
|
53
|
-
// if (!blueprintGen) throw new Error("Blueprint generator not found");
|
|
54
|
-
// const assignmentData = await AssignmentKind.get(course.id, assignmentId, { });
|
|
55
|
-
// if(!assignmentData) return;
|
|
56
|
-
// for await (const blueprint of blueprintGen) {
|
|
57
|
-
// const bpModules = await renderAsyncGen(moduleGenerator(blueprint.id));
|
|
58
|
-
// for await (const bpModule of bpModules) {
|
|
59
|
-
// const items = bpModule.items;
|
|
60
|
-
// for(const item of items) {
|
|
61
|
-
// if(item.title == assignmentData.name) {
|
|
62
|
-
// let analogAssignment: IAssignmentData;
|
|
63
|
-
// const contentKind = item.type === 'Assignment' ? AssignmentKind :
|
|
64
|
-
// item.type === 'Discussion' ? DiscussionKind :
|
|
65
|
-
// undefined;
|
|
66
|
-
// if(!contentKind) continue; //this is not a relevant data type
|
|
67
|
-
// const primaryData = await contentKind.get(blueprint.id, item.content_id);
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
// if (!analogDiscussionId) return undefined;
|
|
71
|
-
// const analogDiscussionData = await DiscussionKind.get(analogAssignment.courseId, analogDiscussionId);
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
// }
|
|
75
|
-
// }
|
|
76
|
-
//
|
|
77
|
-
// }
|
|
78
|
-
// // Iterate through assignments in this blueprint
|
|
79
|
-
// // Find assignments in the blueprint that match the given assignmentId
|
|
80
|
-
// const moduleItem = getModuleInfo(analogAssignment.id);
|
|
81
|
-
// // If a match is found, yield the associated discussion
|
|
82
|
-
// }
|
|
83
|
-
// }
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
// async function getByName<Kind extends ContentKindInPractice>(items: AsyncGenerator<ContentDataType<Kind>>, search: string | ((toCheck: string) => boolean)) {
|
|
87
|
-
//
|
|
88
|
-
// const checkFunc = typeof search != 'string' ? search : (toCheck:string) => search == toCheck;
|
|
89
|
-
// for await (const item of items) {
|
|
90
|
-
// const contentKind = getContentKindFromContent(item) as Kind & { getByName: (name:string) => typeof item};
|
|
91
|
-
// if(!contentKind) continue;
|
|
92
|
-
// if(!contentKind.dataIsThisKind(item)) throw new Error("Data constraint violation in getting content by name");
|
|
93
|
-
// const name = (contentKind as { getName: (data:ContentDataType<Kind>) => string|undefined}).getName(item);
|
|
94
|
-
// if(name && checkFunc(name)) return item;
|
|
95
|
-
// }
|
|
96
|
-
// return undefined;
|
|
97
|
-
// }
|