From b47412167f8e3f61a80bc4d44ba0efd851f4968b Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 3 Sep 2024 11:05:43 -0500 Subject: [PATCH] Rebranding to new look --- README.md | 19 +- .../ally/about-api-documentation.md | 6 +- docs/{rest-apis => }/ally/auth.md | 4 - docs/{rest-apis => }/ally/check-status.md | 4 - .../ally/feedback-definitions.md | 4 - .../ally/get-batched-feedback.md | 4 - docs/{rest-apis => }/ally/get-feedback.md | 6 +- docs/{rest-apis => }/ally/getting-started.md | 6 +- docs/{rest-apis => }/ally/ui-integration.md | 4 - docs/{rest-apis => }/ally/uploading-files.md | 4 - .../b2/getting-started/api-documentation.md | 2 - .../b2/getting-started/api-overview.md | 2 - .../b2/getting-started/dev-life-cycle.md | 2 - docs/archive/b2/getting-started/faq.md | 2 - .../archive/b2/getting-started/first-steps.md | 2 - docs/archive/b2/getting-started/intro.md | 2 - .../b2/getting-started/rosetta-stone.md | 2 - docs/archive/b2/getting-started/starter-b2.md | 2 - .../b2/resources/enabling-remote-debugging.md | 2 - .../first-project-using-gradle-and-git.md | 2 - docs/archive/b2/resources/java11-faq.md | 2 - .../b2/resources/prepare-for-java11.md | 4 +- .../resources/preparing-for-learn-q2-2016.md | 2 - ...eparing-for-saas-and-new-learn-versions.md | 4 +- .../b2/resources/scan-tool-learn-saas.md | 2 - docs/archive/b2/resources/useful-links.md | 2 - docs/blackboard/caliper/caliper-intro.md | 7 + .../caliper/events/assessment-events.md | 4 - .../caliper/events/assignable-events.md | 4 - .../caliper/events/blog-events.md | 4 - .../calculated-grade-snapshot-events.md | 4 - .../caliper/events/content-events.md | 4 - .../caliper/events/course-group-events.md | 4 - .../caliper/events/event-guide.md | 4 - .../caliper/events/forum-events.md | 4 - .../caliper/events/grade-events.md | 4 - .../caliper/events/lti-events.md | 4 - .../caliper/events/session-events.md | 4 - .../caliper/events/view-events.md | 4 - .../caliper/events/wiki-events.md | 4 - .../caliper-event-store-for-learn.md | 4 - .../getting-started-with-caliper.md | 4 - .../getting-started/metric-profiles.md | 4 - docs/{ => blackboard}/lti/core/id-token.md | 3 - docs/{ => blackboard}/lti/core/oidc-login.md | 4 - .../core/poidc-login-lti_storage_target.md | 3 - .../lti/deep-linking-two-json.md | 4 - .../lti/getting-started-with-lti.md | 22 +- docs/{ => blackboard}/lti/lti-intro.md | 4 - .../lti/lti-registration-and-deployment.md | 10 +- .../lti/migrating/migrating-11.md | 4 - .../ultra-proctoring-service-integration.md | 6 +- .../ultra-proctoring-service-tutorials.md | 4 - .../sanctioned-lti-registration-deployment.md | 4 - .../lti/turn-on-all-switches.md | 4 - .../develop-lti-advantage-solution.md | 4 - .../lti/tutorials/implementation-guide.md | 6 +- .../lti/tutorials/names-and-roles.md | 4 - .../lti/tutorials/py-lti-1p3.md | 4 - .../lti/tutorials/testing-tool.md | 4 - .../premium-apis/requesting-premium-apis.md | 26 +- .../communication_page_lvl_analytics-id.md | 4 - .../uef/tutorials/configure-uef.md | 4 - .../uef/tutorials/lti-to-uef-tutorial.md | 4 - .../uef/tutorials/lti_launch_context_added.md | 4 - .../uef/tutorials/security-and-tokens.md | 4 - .../uef/tutorials/tutorials-course-leftnav.md | 10 +- .../premium-apis/uef/tutorials/tutorials.md | 4 - .../downloads/demo-integration.zip | Bin .../images/create_integration.png | Bin .../images/create_placement.png | Bin .../images/integration_workflow.png | Bin .../images/manage_placements.png | Bin .../images/portal_workflow.png | Bin .../images/register_provider_domain.png | Bin .../premium-apis/uef/uef_getting_started.md | 4 - docs/blackboard/premium-apis/what-are-they.md | 9 + .../[review]merge-and-crosslist-courses.md} | 4 - .../advanced/[review]ultra-assignments.md} | 4 - .../advanced}/bbapp-students-launch-schema.md | 4 - .../rest-apis}/advanced/bbml.md | 4 - .../advanced/contenthandler-datatypes.md | 4 - ...namic-rendering-with-template-variables.md | 4 - .../advanced/soap-to-rest-mapping.md | 4 - docs/{ => blackboard}/rest-apis/apis-intro.md | 4 - docs/blackboard/rest-apis/best-practices.md | 57 + ...ccessing-content-attachments-with-cURL.md} | 3 - .../rest-apis/demo-code/csharp.md} | 9 +- .../rest-apis/demo-code/curl.md} | 9 +- .../rest-apis/demo-code/golang.md} | 4 - .../rest-apis/demo-code/java.md} | 6 +- .../rest-apis/demo-code/php.md} | 4 - .../rest-apis/demo-code/python.md} | 4 - .../rest-api-with-java-command-line.md} | 5 +- .../rest-apis/demo-code/ruby.md} | 4 - .../rest-apis}/getting-started/3lo.md | 6 +- .../getting-started/basic-authentication.md | 4 - .../rest-apis}/getting-started/first-steps.md | 8 +- .../rest-apis}/getting-started/framework.md | 3 - .../rest-apis}/getting-started/lti-or-rest.md | 10 +- .../mapping-entitlements-to-privileges.md | 4 - .../releasing-your-integration.md | 4 - .../getting-started}/rest-and-learn.md | 6 +- ...est-integrations-and-other-integrations.md | 7 +- .../getting-started}/rest3LO-and-learnSSO.md | 4 - .../rest-apis}/getting-started/tutorials.md | 4 - .../rest-apis/hands-on}/adaptive-release.md | 6 +- .../rest-apis/hands-on}/attendance.md | 4 - .../rest-apis/hands-on/calendar-api.md | 737 +++++++ .../rest-apis/hands-on/content.md} | 4 - .../rest-apis/hands-on}/copying-courses.md | 150 +- .../rest-apis/hands-on}/course-toc.md | 4 - .../rest-apis/hands-on/gradebook.md} | 510 ++--- .../hands-on}/groups-and-rest-api.md | 4 - .../rest-apis/hands-on/rubrics.md} | 630 +++--- .../rest-apis/learn-intro-[review].md} | 4 - .../standards-intro.md | 4 - docs/community/community-intro.md | 4 - docs/community/contact.md | 4 - docs/community/getting-involved.md | 4 - .../learn/sandbox => }/developer-ami.md | 13 +- docs/developer-portal/best-practices.md | 6 +- .../creating-and-managing-groups.md | 9 +- .../creating-rest-or-lti-application.md | 29 +- .../dev-portal-maintenance.md | 8 +- .../developer-portal/dev-portal-start-here.md | 12 +- docs/developer-portal/faq.md | 4 - ...ion-groups-rest-api-and-site-reg-limits.md | 4 - docs/developer-portal/rate-limit-migration.md | 4 - docs/maintenance-and-releases.md | 127 ++ docs/partners/become-a-partner.md | 4 - docs/partners/blackboard-app-catalog-faq.md | 4 - .../using-calendar-api.md | 742 ------- docs/rest-apis/rest-api-best-practices.md | 54 - .../PaymentVendorPartnerOverview.md | 197 -- docs/site-intro.md | 80 - docs/standards/caliper/caliper-intro.md | 11 - .../PaymentVendorPartnerOverview.md | 188 ++ .../SaveStudentTransferCredit .md | 10 +- .../StudentQueryModelMetadata.md | 10 +- .../create-savenew-operations.md | 8 +- .../best-practices/get-save-operations.md | 8 +- .../getting-started/student-first-steps.md | 4 - .../about-student-service-catalog.md | 4 - .../student/tutorials/training-videos.md | 4 - docusaurus.config.js | 172 +- package-lock.json | 682 +++--- package.json | 3 +- sidebars.js | 376 ---- src/Components/Community/Community.jsx | 35 + src/Components/Community/Community.module.css | 72 + src/Components/ExternalLinks/Card/Card.jsx | 27 + .../ExternalLinks/Card/Card.module.css | 11 + .../ExternalLinks/ExternalLinks.jsx | 37 + .../ExternalLinks/ExternalLinks.module.css | 48 + src/Components/Footer/Footer.jsx | 66 + src/Components/Footer/Footer.module.css | 137 ++ .../LandingHeader/LandingHeader.jsx | 20 + .../LandingHeader/LandingHeader.module.css | 76 + src/Components/Solutions/Card/Card.jsx | 39 + src/Components/Solutions/Card/Card.module.css | 61 + src/Components/Solutions/Solutions.jsx | 34 + src/Components/Solutions/Solutions.module.css | 35 + src/Components/Widgets/Card/Card.jsx | 25 + src/Components/Widgets/Card/Card.module.css | 19 + .../Widgets/ReleaseNotes/ReleaseNotes.jsx | 36 + .../ReleaseNotes/ReleaseNotes.module.css | 26 + src/Components/Widgets/WhatsNew/WhatsNew.jsx | 39 + .../Widgets/WhatsNew/WhatsNew.module.css | 13 + src/Components/Widgets/Widgets.jsx | 28 + src/Components/Widgets/Widgets.module.css | 69 + src/components/HomepageFeatures/index.js | 61 - .../HomepageFeatures/styles.module.css | 11 - src/css/custom.css | 105 +- src/css/footer.css | 188 ++ src/modules/AuthorBox/AuthorBox.jsx | 48 + .../AuthorBox}/AuthorBox.module.css | 0 .../AuthorBox/OldVersions/AuthorBox.jsx} | 10 +- .../OldVersions/AuthorBox.module.css | 164 ++ .../AuthorBox/components/AuthorCard.jsx | 36 + .../components/AuthorCard.module.css | 66 + .../PasswordChecker/PasswordChecker.js | 0 .../PasswordChecker.module.css | 0 .../VersioningTracker/VersioningTracker.jsx} | 0 .../VersioningTracker.module.css | 0 src/pages/index.js | 36 - src/pages/index.jsx | 24 + src/pages/index.module.css | 27 +- src/pages/markdown-page.md | 7 - src/sidebar.js | 285 +++ src/theme/DocItem/Content/index.js | 52 + src/theme/Footer/index.js | 6 + src/theme/MDXComponents.js | 18 +- src/theme/SearchBar.js | 10 + static/.nojekyll | 0 static/assets/css/main.css | 1393 ------------ static/assets/css/print.css | 136 -- static/assets/js/accordion-menu.js | 53 - static/assets/js/search-script.js | 260 --- static/assets/js/toc.bundle.js | 791 ------- static/assets/js/toc.bundle.js.map | 8 - static/assets/js/toc.js | 105 - static/assets/js/toc.min.js | 28 - static/assets/tipuesearch/css/normalize.css | 461 ---- static/assets/tipuesearch/css/tipuesearch.css | 250 --- static/assets/tipuesearch/search.png | Bin 1366 -> 0 bytes static/assets/tipuesearch/tipuesearch.min.js | 178 -- .../assets/tipuesearch/tipuesearch_content.js | 83 - static/assets/tipuesearch/tipuesearch_set.js | 79 - static/img/ANTHOLOGY-Logo-RGB.svg | 19 - static/img/anthology-logo-dark.svg | 33 + static/img/anthology-logo-light.svg | 37 + static/img/anthologydevdocs-apis.svg | 169 -- static/img/anthologydevdocs-explore.svg | 1866 ----------------- static/img/anthologydevdocs-register.svg | 149 -- static/img/author-card-background-dark.png | Bin 7397 -> 0 bytes static/img/author-card-background-light.png | Bin 7924 -> 0 bytes static/img/author-card-background.png | Bin 2589 -> 0 bytes static/img/author-card-default-picture.png | Bin 2301 -> 0 bytes static/img/author-default-picture.png | Bin 0 -> 140929 bytes static/img/blackboard-learn-dark.svg | 47 + static/img/blackboard-learn-light.svg | 45 + static/img/browse-apis.png | Bin 4684 -> 0 bytes static/img/chat-bubbles-dark.svg | 3 + static/img/chat-bubbles-light.svg | 3 + static/img/computer-dark.svg | 3 + static/img/computer-light.svg | 3 + static/img/content-dark.svg | 72 + static/img/content-light.svg | 72 + static/img/docusaurus-social-card.jpg | Bin 122087 -> 0 bytes static/img/docusaurus.png | Bin 5142 -> 0 bytes static/img/explore-docs.png | Bin 11942 -> 0 bytes static/img/favicon.ico | Bin 15086 -> 10863 bytes static/img/{gh.png => github-logo.png} | Bin static/img/github-logo.svg | 1 - static/img/hero.png | Bin 0 -> 59064 bytes static/img/image.png | Bin 0 -> 10119 bytes static/img/link-dark.svg | 3 + static/img/link-light.svg | 3 + static/img/logo.svg | 1 - static/img/registerapp.png | Bin 4442 -> 0 bytes static/img/right-arrow-dark.svg | 3 + static/img/right-arrow-light.svg | 3 + static/img/social-card.png | Bin 0 -> 210067 bytes static/img/student-dark.svg | 42 + static/img/student-light.svg | 42 + static/img/undraw_docusaurus_mountain.svg | 171 -- static/img/undraw_docusaurus_react.svg | 170 -- static/img/undraw_docusaurus_tree.svg | 40 - {src/components => widgets}/authorInfo.json | 14 +- widgets/latestMaintenance.json | 6 + widgets/newDocs.json | 22 + 252 files changed, 4664 insertions(+), 9688 deletions(-) rename docs/{rest-apis => }/ally/about-api-documentation.md (86%) rename docs/{rest-apis => }/ally/auth.md (98%) rename docs/{rest-apis => }/ally/check-status.md (95%) rename docs/{rest-apis => }/ally/feedback-definitions.md (99%) rename docs/{rest-apis => }/ally/get-batched-feedback.md (96%) rename docs/{rest-apis => }/ally/get-feedback.md (97%) rename docs/{rest-apis => }/ally/getting-started.md (93%) rename docs/{rest-apis => }/ally/ui-integration.md (98%) rename docs/{rest-apis => }/ally/uploading-files.md (98%) create mode 100644 docs/blackboard/caliper/caliper-intro.md rename docs/{standards => blackboard}/caliper/events/assessment-events.md (99%) rename docs/{standards => blackboard}/caliper/events/assignable-events.md (98%) rename docs/{standards => blackboard}/caliper/events/blog-events.md (98%) rename docs/{standards => blackboard}/caliper/events/calculated-grade-snapshot-events.md (98%) rename docs/{standards => blackboard}/caliper/events/content-events.md (99%) rename docs/{standards => blackboard}/caliper/events/course-group-events.md (98%) rename docs/{standards => blackboard}/caliper/events/event-guide.md (99%) rename docs/{standards => blackboard}/caliper/events/forum-events.md (99%) rename docs/{standards => blackboard}/caliper/events/grade-events.md (98%) rename docs/{standards => blackboard}/caliper/events/lti-events.md (98%) rename docs/{standards => blackboard}/caliper/events/session-events.md (97%) rename docs/{standards => blackboard}/caliper/events/view-events.md (97%) rename docs/{standards => blackboard}/caliper/events/wiki-events.md (98%) rename docs/{standards => blackboard}/caliper/getting-started/caliper-event-store-for-learn.md (98%) rename docs/{standards => blackboard}/caliper/getting-started/getting-started-with-caliper.md (94%) rename docs/{standards => blackboard}/caliper/getting-started/metric-profiles.md (98%) rename docs/{ => blackboard}/lti/core/id-token.md (98%) rename docs/{ => blackboard}/lti/core/oidc-login.md (95%) rename docs/{ => blackboard}/lti/core/poidc-login-lti_storage_target.md (97%) rename docs/{ => blackboard}/lti/deep-linking-two-json.md (93%) rename docs/{ => blackboard}/lti/getting-started-with-lti.md (96%) rename docs/{ => blackboard}/lti/lti-intro.md (97%) rename docs/{ => blackboard}/lti/lti-registration-and-deployment.md (97%) rename docs/{ => blackboard}/lti/migrating/migrating-11.md (94%) rename docs/{ => blackboard}/lti/proctoring/ultra-proctoring-service-integration.md (97%) rename docs/{ => blackboard}/lti/proctoring/ultra-proctoring-service-tutorials.md (95%) rename docs/{ => blackboard}/lti/sanctioned-lti-registration-deployment.md (97%) rename docs/{ => blackboard}/lti/turn-on-all-switches.md (93%) rename docs/{ => blackboard}/lti/tutorials/develop-lti-advantage-solution.md (95%) rename docs/{ => blackboard}/lti/tutorials/implementation-guide.md (97%) rename docs/{ => blackboard}/lti/tutorials/names-and-roles.md (92%) rename docs/{ => blackboard}/lti/tutorials/py-lti-1p3.md (99%) rename docs/{ => blackboard}/lti/tutorials/testing-tool.md (96%) rename docs/{rest-apis => blackboard}/premium-apis/requesting-premium-apis.md (91%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md (97%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/configure-uef.md (97%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/lti-to-uef-tutorial.md (99%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/lti_launch_context_added.md (95%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/security-and-tokens.md (99%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/tutorials-course-leftnav.md (94%) rename docs/{rest-apis => blackboard}/premium-apis/uef/tutorials/tutorials.md (95%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/downloads/demo-integration.zip (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/images/create_integration.png (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/images/create_placement.png (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/images/integration_workflow.png (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/images/manage_placements.png (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/images/portal_workflow.png (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef-documentation/images/register_provider_domain.png (100%) rename docs/{rest-apis => blackboard}/premium-apis/uef/uef_getting_started.md (97%) create mode 100644 docs/blackboard/premium-apis/what-are-they.md rename docs/{rest-apis/learn/advanced/merge-and-crosslist-courses.md => blackboard/rest-apis/advanced/[review]merge-and-crosslist-courses.md} (96%) rename docs/{rest-apis/learn/advanced/ultra-assignments.md => blackboard/rest-apis/advanced/[review]ultra-assignments.md} (97%) rename docs/{rest-apis/learn/learn-app => blackboard/rest-apis/advanced}/bbapp-students-launch-schema.md (99%) rename docs/{rest-apis/learn => blackboard/rest-apis}/advanced/bbml.md (99%) rename docs/{rest-apis/learn => blackboard/rest-apis}/advanced/contenthandler-datatypes.md (98%) rename docs/{rest-apis/learn => blackboard/rest-apis}/advanced/dynamic-rendering-with-template-variables.md (99%) rename docs/{rest-apis/learn => blackboard/rest-apis}/advanced/soap-to-rest-mapping.md (99%) rename docs/{ => blackboard}/rest-apis/apis-intro.md (95%) create mode 100644 docs/blackboard/rest-apis/best-practices.md rename docs/{rest-apis/learn/examples/curl-attachments-demo.md => blackboard/rest-apis/demo-code/accessing-content-attachments-with-cURL.md} (99%) rename docs/{rest-apis/learn/examples/csharp-demo.md => blackboard/rest-apis/demo-code/csharp.md} (98%) rename docs/{rest-apis/learn/examples/curl-demo.md => blackboard/rest-apis/demo-code/curl.md} (99%) rename docs/{rest-apis/learn/examples/golang-demo.md => blackboard/rest-apis/demo-code/golang.md} (86%) rename docs/{rest-apis/learn/examples/java-demo.md => blackboard/rest-apis/demo-code/java.md} (98%) rename docs/{rest-apis/learn/examples/php-demo.md => blackboard/rest-apis/demo-code/php.md} (99%) rename docs/{rest-apis/learn/examples/python-demo.md => blackboard/rest-apis/demo-code/python.md} (99%) rename docs/{rest-apis/learn/examples/java-command-line.md => blackboard/rest-apis/demo-code/rest-api-with-java-command-line.md} (99%) rename docs/{rest-apis/learn/examples/ruby-demo.md => blackboard/rest-apis/demo-code/ruby.md} (99%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/3lo.md (98%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/basic-authentication.md (98%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/first-steps.md (98%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/framework.md (98%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/lti-or-rest.md (96%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/mapping-entitlements-to-privileges.md (97%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/releasing-your-integration.md (97%) rename docs/{rest-apis/learn/admin => blackboard/rest-apis/getting-started}/rest-and-learn.md (98%) rename docs/{rest-apis/learn/working-with-learn-apis => blackboard/rest-apis/getting-started}/rest-integrations-and-other-integrations.md (96%) rename docs/{rest-apis/learn/admin => blackboard/rest-apis/getting-started}/rest3LO-and-learnSSO.md (97%) rename docs/{rest-apis/learn => blackboard/rest-apis}/getting-started/tutorials.md (93%) rename docs/{rest-apis/learn/working-with-learn-apis => blackboard/rest-apis/hands-on}/adaptive-release.md (98%) rename docs/{rest-apis/learn/working-with-learn-apis => blackboard/rest-apis/hands-on}/attendance.md (99%) create mode 100644 docs/blackboard/rest-apis/hands-on/calendar-api.md rename docs/{rest-apis/learn/working-with-learn-apis/creating-content.md => blackboard/rest-apis/hands-on/content.md} (99%) rename docs/{rest-apis/learn/working-with-learn-apis => blackboard/rest-apis/hands-on}/copying-courses.md (56%) rename docs/{rest-apis/learn/working-with-learn-apis => blackboard/rest-apis/hands-on}/course-toc.md (98%) rename docs/{rest-apis/learn/working-with-learn-apis/pulling-grades.md => blackboard/rest-apis/hands-on/gradebook.md} (56%) rename docs/{rest-apis/learn/working-with-learn-apis => blackboard/rest-apis/hands-on}/groups-and-rest-api.md (99%) rename docs/{rest-apis/learn/working-with-learn-apis/working-with-rubrics.md => blackboard/rest-apis/hands-on/rubrics.md} (52%) rename docs/{rest-apis/learn/learn-intro.md => blackboard/rest-apis/learn-intro-[review].md} (97%) rename docs/{standards => blackboard}/standards-intro.md (98%) rename docs/{rest-apis/learn/sandbox => }/developer-ami.md (96%) create mode 100644 docs/maintenance-and-releases.md delete mode 100644 docs/rest-apis/learn/working-with-learn-apis/using-calendar-api.md delete mode 100644 docs/rest-apis/rest-api-best-practices.md delete mode 100644 docs/rest-apis/student/best-practices/PaymentVendorPartnerOverview.md delete mode 100644 docs/site-intro.md delete mode 100644 docs/standards/caliper/caliper-intro.md create mode 100644 docs/student/best-practices/PaymentVendorPartnerOverview.md rename docs/{rest-apis => }/student/best-practices/SaveStudentTransferCredit .md (97%) rename docs/{rest-apis => }/student/best-practices/StudentQueryModelMetadata.md (95%) rename docs/{rest-apis => }/student/best-practices/create-savenew-operations.md (99%) rename docs/{rest-apis => }/student/best-practices/get-save-operations.md (99%) rename docs/{rest-apis => }/student/getting-started/student-first-steps.md (95%) rename docs/{rest-apis => }/student/service-catalog/about-student-service-catalog.md (91%) rename docs/{rest-apis => }/student/tutorials/training-videos.md (62%) delete mode 100644 sidebars.js create mode 100644 src/Components/Community/Community.jsx create mode 100644 src/Components/Community/Community.module.css create mode 100644 src/Components/ExternalLinks/Card/Card.jsx create mode 100644 src/Components/ExternalLinks/Card/Card.module.css create mode 100644 src/Components/ExternalLinks/ExternalLinks.jsx create mode 100644 src/Components/ExternalLinks/ExternalLinks.module.css create mode 100644 src/Components/Footer/Footer.jsx create mode 100644 src/Components/Footer/Footer.module.css create mode 100644 src/Components/LandingHeader/LandingHeader.jsx create mode 100644 src/Components/LandingHeader/LandingHeader.module.css create mode 100644 src/Components/Solutions/Card/Card.jsx create mode 100644 src/Components/Solutions/Card/Card.module.css create mode 100644 src/Components/Solutions/Solutions.jsx create mode 100644 src/Components/Solutions/Solutions.module.css create mode 100644 src/Components/Widgets/Card/Card.jsx create mode 100644 src/Components/Widgets/Card/Card.module.css create mode 100644 src/Components/Widgets/ReleaseNotes/ReleaseNotes.jsx create mode 100644 src/Components/Widgets/ReleaseNotes/ReleaseNotes.module.css create mode 100644 src/Components/Widgets/WhatsNew/WhatsNew.jsx create mode 100644 src/Components/Widgets/WhatsNew/WhatsNew.module.css create mode 100644 src/Components/Widgets/Widgets.jsx create mode 100644 src/Components/Widgets/Widgets.module.css delete mode 100644 src/components/HomepageFeatures/index.js delete mode 100644 src/components/HomepageFeatures/styles.module.css create mode 100644 src/css/footer.css create mode 100644 src/modules/AuthorBox/AuthorBox.jsx rename src/{components => modules/AuthorBox}/AuthorBox.module.css (100%) rename src/{components/AuthorBox.js => modules/AuthorBox/OldVersions/AuthorBox.jsx} (89%) create mode 100644 src/modules/AuthorBox/OldVersions/AuthorBox.module.css create mode 100644 src/modules/AuthorBox/components/AuthorCard.jsx create mode 100644 src/modules/AuthorBox/components/AuthorCard.module.css rename src/{components => modules}/PasswordChecker/PasswordChecker.js (100%) rename src/{components => modules}/PasswordChecker/PasswordChecker.module.css (100%) rename src/{components/VersioningTracker.js => modules/VersioningTracker/VersioningTracker.jsx} (100%) rename src/{components => modules/VersioningTracker}/VersioningTracker.module.css (100%) delete mode 100644 src/pages/index.js create mode 100644 src/pages/index.jsx delete mode 100644 src/pages/markdown-page.md create mode 100644 src/sidebar.js create mode 100644 src/theme/DocItem/Content/index.js create mode 100644 src/theme/Footer/index.js create mode 100644 src/theme/SearchBar.js delete mode 100644 static/.nojekyll delete mode 100644 static/assets/css/main.css delete mode 100644 static/assets/css/print.css delete mode 100644 static/assets/js/accordion-menu.js delete mode 100644 static/assets/js/search-script.js delete mode 100644 static/assets/js/toc.bundle.js delete mode 100644 static/assets/js/toc.bundle.js.map delete mode 100644 static/assets/js/toc.js delete mode 100644 static/assets/js/toc.min.js delete mode 100644 static/assets/tipuesearch/css/normalize.css delete mode 100644 static/assets/tipuesearch/css/tipuesearch.css delete mode 100644 static/assets/tipuesearch/search.png delete mode 100644 static/assets/tipuesearch/tipuesearch.min.js delete mode 100644 static/assets/tipuesearch/tipuesearch_content.js delete mode 100644 static/assets/tipuesearch/tipuesearch_set.js delete mode 100644 static/img/ANTHOLOGY-Logo-RGB.svg create mode 100644 static/img/anthology-logo-dark.svg create mode 100644 static/img/anthology-logo-light.svg delete mode 100644 static/img/anthologydevdocs-apis.svg delete mode 100644 static/img/anthologydevdocs-explore.svg delete mode 100644 static/img/anthologydevdocs-register.svg delete mode 100644 static/img/author-card-background-dark.png delete mode 100644 static/img/author-card-background-light.png delete mode 100644 static/img/author-card-background.png delete mode 100644 static/img/author-card-default-picture.png create mode 100644 static/img/author-default-picture.png create mode 100644 static/img/blackboard-learn-dark.svg create mode 100644 static/img/blackboard-learn-light.svg delete mode 100644 static/img/browse-apis.png create mode 100644 static/img/chat-bubbles-dark.svg create mode 100644 static/img/chat-bubbles-light.svg create mode 100644 static/img/computer-dark.svg create mode 100644 static/img/computer-light.svg create mode 100644 static/img/content-dark.svg create mode 100644 static/img/content-light.svg delete mode 100644 static/img/docusaurus-social-card.jpg delete mode 100644 static/img/docusaurus.png delete mode 100644 static/img/explore-docs.png rename static/img/{gh.png => github-logo.png} (100%) delete mode 100644 static/img/github-logo.svg create mode 100644 static/img/hero.png create mode 100644 static/img/image.png create mode 100644 static/img/link-dark.svg create mode 100644 static/img/link-light.svg delete mode 100644 static/img/logo.svg delete mode 100644 static/img/registerapp.png create mode 100644 static/img/right-arrow-dark.svg create mode 100644 static/img/right-arrow-light.svg create mode 100644 static/img/social-card.png create mode 100644 static/img/student-dark.svg create mode 100644 static/img/student-light.svg delete mode 100644 static/img/undraw_docusaurus_mountain.svg delete mode 100644 static/img/undraw_docusaurus_react.svg delete mode 100644 static/img/undraw_docusaurus_tree.svg rename {src/components => widgets}/authorInfo.json (92%) create mode 100644 widgets/latestMaintenance.json create mode 100644 widgets/newDocs.json diff --git a/README.md b/README.md index 19fd86ce2..15bcdc1fa 100644 --- a/README.md +++ b/README.md @@ -6,22 +6,19 @@ With this move to Docusaurus we are adding full site search capability and looki ## IMPORTANT: -When creating new documentation using MD, please copy and paste the layout within `/docs/templates/example.md` since that includes two additional trackers that will show information or add the following tags to the top and bottom of your page respectively: +When creating new documentation using MD, please add the following information to the top of the document: -```html +```md --- -Metadata +title: +id: +categories: +published: "YYYY-MM-DD" +edited: "YYYY-MM-DD" +author: --- - - - -Your content goes here - - ``` -Please also make sure to fill out the metadata at the top of the page with the appropriate information - ## Getting Started :warning: Do not push, pull, fetch, or otherwise "manage" the gh-pages branch. This branch is auto maintained by main PRs and merge actions. diff --git a/docs/rest-apis/ally/about-api-documentation.md b/docs/ally/about-api-documentation.md similarity index 86% rename from docs/rest-apis/ally/about-api-documentation.md rename to docs/ally/about-api-documentation.md index 1aebe8797..e76c2d313 100644 --- a/docs/rest-apis/ally/about-api-documentation.md +++ b/docs/ally/about-api-documentation.md @@ -7,13 +7,11 @@ edited: "" author: Scott Hurrey --- - - # How to use the Ally as a Service API Document to Test API The API documentation for Ally as a Service allows a developer to test the API real-time inline on the page. It is a quick and easy way to not only get high-level information about the API itself, but also see how it works. You can upload a file, check the status of processing, and retrieve the report when finished. Doing so and then testing your application with the same file is a quick, easy, and powerful way to validate your work. -To do this, you will need your client ID and your secret. See the [Getting Started Guide](/docs/rest-apis/ally/getting-started.md) for information on how to request your credentials. At the top of the page you will see two text boxes, one for each of these values. Simply plug them in and you are all ready to. +To do this, you will need your client ID and your secret. See the [Getting Started Guide](/docs/ally/getting-started.md) for information on how to request your credentials. At the top of the page you will see two text boxes, one for each of these values. Simply plug them in and you are all ready to. At the bottom of the documentation for the `Upload a File to Ally` endpoint, there is a **Try it now** section, where you can select a file and click submit to upload that file to be processed. @@ -26,5 +24,3 @@ Finally, at the bottom of the documentation for the `Retrieve the feedback for a For a walkthrough, check out this video: - - diff --git a/docs/rest-apis/ally/auth.md b/docs/ally/auth.md similarity index 98% rename from docs/rest-apis/ally/auth.md rename to docs/ally/auth.md index 839bff8ab..09f20f753 100644 --- a/docs/rest-apis/ally/auth.md +++ b/docs/ally/auth.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - Blackboard Ally as a Service relies on JSON web tokens (JWT) to authenticate and authorize incoming REST API calls. You can read more about the JWT standard [here](https:////tools.ietf.org/html/rfc7519). The JSON web token must be signed with HMAC. HMAC allows the JWT to be signed with a shared secret. The data can be trusted because it is digitally signed with mutually known credentials. @@ -167,5 +165,3 @@ thus, there are a ton of resources available for developers interested in JWT be - [JWT.io](https://jwt.io/): This site is dedicated to assisting developers trying to build JWT-enabled applications. There is a debugger that allows you to manually input your secret and your header and payload and generate an assertion. There is also an extensive list of available libraries in multiple languages that handle the bulk of the JWT creation. - [RFC 7519](https://tools.ietf.org/html/rfc7519): This is the actual standard specification document. - - diff --git a/docs/rest-apis/ally/check-status.md b/docs/ally/check-status.md similarity index 95% rename from docs/rest-apis/ally/check-status.md rename to docs/ally/check-status.md index e28cd34e1..53b05ba9c 100644 --- a/docs/rest-apis/ally/check-status.md +++ b/docs/ally/check-status.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - Ally processes files asynchronously. We aim to process files in near-realtime, but some delays might be present. This endpoint can be used to poll for status updates. ### Endpoint @@ -64,5 +62,3 @@ curl \ -H "Authorization: Bearer myJwtToken" \ https://prod.ally.ac/api/v2/clients/:clientId/content/:contentHash/status ``` - - diff --git a/docs/rest-apis/ally/feedback-definitions.md b/docs/ally/feedback-definitions.md similarity index 99% rename from docs/rest-apis/ally/feedback-definitions.md rename to docs/ally/feedback-definitions.md index e831cbd8d..7dd8bda0e 100644 --- a/docs/rest-apis/ally/feedback-definitions.md +++ b/docs/ally/feedback-definitions.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - # Feedback parameter definitions Here are the feedback parameters returned when the feedback endpoint is called. The full and meta columns defines which fields are included based on the feedback query parameter. If it is set to true, you get the full response, and the full column will have a check. If it is set to false or omitted, you receive just the meta data, and Meta column will have an check @@ -100,5 +98,3 @@ Here are the feedback parameters returned when the feedback endpoint is called. | metadata.libraryReference | **Deprecated** Not used. This will always be null and will be removed in a future release | check | check | For more information about the Ally accessibility tests, visit the [Accessibility Checklist](https://help.blackboard.com/ally/Ally_for_LMS/Administrator/Institution_Report/Accessibility_Checklist) page on help.blackboard.com. - - diff --git a/docs/rest-apis/ally/get-batched-feedback.md b/docs/ally/get-batched-feedback.md similarity index 96% rename from docs/rest-apis/ally/get-batched-feedback.md rename to docs/ally/get-batched-feedback.md index 21dcde2ab..93201e7cf 100644 --- a/docs/rest-apis/ally/get-batched-feedback.md +++ b/docs/ally/get-batched-feedback.md @@ -7,8 +7,6 @@ edited: "" author: Simon Gaeremynck --- - - The batch endpoint allows you to retrieve content for more than one content hash ## Endpoint @@ -89,5 +87,3 @@ curl \ -d '{"references": [{"hash": "a1b2c3d..."},{"hash": "QWxseSs..."},{"hash": "e1f2123..."}]}' \ https://prod.ally.ac/api/v2/clients/:clientId/content/bash ``` - - diff --git a/docs/rest-apis/ally/get-feedback.md b/docs/ally/get-feedback.md similarity index 97% rename from docs/rest-apis/ally/get-feedback.md rename to docs/ally/get-feedback.md index 9497e2f54..3a62a0315 100644 --- a/docs/rest-apis/ally/get-feedback.md +++ b/docs/ally/get-feedback.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - Once the file is processed, the feedback can be retrieved ## Endpoint @@ -37,7 +35,7 @@ GET /api/v2/clients/:clientId/content/:contentHash ## Expected response -For more information on the contents of this JSON, visit the [feedback definitions page](/docs/rest-apis/ally/feedback-definitions.md). +For more information on the contents of this JSON, visit the [feedback definitions page](/docs/ally/feedback-definitions.md). **feedback=true** @@ -204,5 +202,3 @@ curl \ -H "Authorization: Bearer myJwtToken" \ https://prod.ally.ac/api/v2/clients/:clientId/content/:contentHash ``` - - diff --git a/docs/rest-apis/ally/getting-started.md b/docs/ally/getting-started.md similarity index 93% rename from docs/rest-apis/ally/getting-started.md rename to docs/ally/getting-started.md index 2aab4ea88..5fbb7ed79 100644 --- a/docs/rest-apis/ally/getting-started.md +++ b/docs/ally/getting-started.md @@ -8,8 +8,6 @@ author: Scott Hurrey sidebar_position: 1 --- - - Ally as a Service provides separatly licensed, stand-alone API access to allow an application to process files for accessibility. Many of you are using this power in your LMS to help instructors improve the accessibility of their content, and to give students, regardless of ability, access to the content that meets their needs and learning style the best. To get started, the first thing you need is a client ID, key, and secret. At this time, the best way to obtain this information is to engage your Account Executive to discuss pricing and request credentials. As the API continues to grow, this process may change, so be sure to check back here often. @@ -20,7 +18,7 @@ Click here to learn more about [authorization and authentication](auth.md) for A There are a number of ways to test out the API. The easiest is to use the Ally API. You can enter your client ID and your secret, and then interact with the available API directly from the documentation. -Click here to learn more about [using the API documentation](/docs/rest-apis/ally/about-api-documentation.md) in this way. +Click here to learn more about [using the API documentation](/docs/ally/about-api-documentation.md) in this way. Here are the operations currently available in the API (each page has a sample cURL command at the bottom): @@ -37,5 +35,3 @@ As we create tutorials and sample code, we will list them here. - [Ally as a Service API documentation](https://ally.ac/api/) - Includes sample cURL Commands - [Postman Collection](https://github.com/blackboard/BBDN-AaaS-Postman) - [Python](https://github.com/blackboard/BBDN-AaaS-Python) - - diff --git a/docs/rest-apis/ally/ui-integration.md b/docs/ally/ui-integration.md similarity index 98% rename from docs/rest-apis/ally/ui-integration.md rename to docs/ally/ui-integration.md index 184dbcb7e..f0709ebf5 100644 --- a/docs/rest-apis/ally/ui-integration.md +++ b/docs/ally/ui-integration.md @@ -7,8 +7,6 @@ edited: "" author: Simon Gaeremynck --- - - The UI API is a specification for HTML attributes that can be used to introduce consistent patterns of Ally functionality. ## Set-up @@ -148,5 +146,3 @@ The following example contains two links. The first link is a download link your height="20" /> ``` - - diff --git a/docs/rest-apis/ally/uploading-files.md b/docs/ally/uploading-files.md similarity index 98% rename from docs/rest-apis/ally/uploading-files.md rename to docs/ally/uploading-files.md index d76d7dc0b..fc63950a5 100644 --- a/docs/rest-apis/ally/uploading-files.md +++ b/docs/ally/uploading-files.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - Start the process by uploading the file you would like to get feedback for. This is a multipart POST request. The response will contain the statusUrl that you can poll to check whether the file has been processed. If the file was processed previously, a resourceUrl will be provided through which you can fetch the feedback information immediately. ## Supported content types @@ -127,5 +125,3 @@ This section contains answers to many of the common questions we field as develo - No, see next answer. - **Q: The meta data contains a “name”, “description” and other parameters. But these are not reflections of arguments in the initial POST. Is this just an indication that there’s a richer set of arguments for the submission phase?** - These parameters are artifacts from our LMS API. They will be removed shortly as they carry no function in a standalone function. - - diff --git a/docs/archive/b2/getting-started/api-documentation.md b/docs/archive/b2/getting-started/api-documentation.md index c9fd76e8a..5e1309498 100644 --- a/docs/archive/b2/getting-started/api-documentation.md +++ b/docs/archive/b2/getting-started/api-documentation.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -88,4 +87,3 @@ database object inBlackboard Learn. The following information is not included: | Q4 2016 | [View API](https://library.blackboard.com/d/%3F78e2d337-a6b3-4483-98b0-ac2a491f1135) | [View Taglibs](https://library.blackboard.com/d/%3F2af249ea-1073-4c77-97ea-90d14c80f2a5) | [View Schema](https://library.blackboard.com/d/%3Fb292c30f-4e6d-4211-8a2c-f28a12bfd3fd) | | Q2 2016 | [View API](https://library.blackboard.com/ref/16ce28ed-bbca-4c63-8a85-8427e135a710/index.htm) | [View Taglibs](https://library.blackboard.com/ref/ece618d2-a7c2-488d-a816-c5a92ff09cd6/index.htm) | [View Schema](https://library.blackboard.com/ref/a8859dd1-b28a-40e0-9aa4-763cf0d65e04/index.htm) | | Q4 2015 | [View API](https://library.blackboard.com/ref/564b246f-4b44-4e85-881e-3731b8a3fe45/index.html) | [View Taglibs](https://library.blackboard.com/ref/8ff5b468-6512-46a3-bc0b-2309de00b802/index.html) | [View Schema](https://library.blackboard.com/ref/589ebf8f-b007-425d-91ec-27d53e40fde4/index.html) | - diff --git a/docs/archive/b2/getting-started/api-overview.md b/docs/archive/b2/getting-started/api-overview.md index 5337baf7e..c4ab1eda6 100644 --- a/docs/archive/b2/getting-started/api-overview.md +++ b/docs/archive/b2/getting-started/api-overview.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -150,4 +149,3 @@ possible with the Snapshot enterprise data integration tool. Various classes to support functions such as byte->kilobyte conversion and localized number representation. - diff --git a/docs/archive/b2/getting-started/dev-life-cycle.md b/docs/archive/b2/getting-started/dev-life-cycle.md index e0cb26808..61b7ac786 100644 --- a/docs/archive/b2/getting-started/dev-life-cycle.md +++ b/docs/archive/b2/getting-started/dev-life-cycle.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -345,4 +344,3 @@ Block which may be lost should you uninstall a previous version to install the new version. Always thoroughly test any changes you make to your Building Blocks. - diff --git a/docs/archive/b2/getting-started/faq.md b/docs/archive/b2/getting-started/faq.md index 258071de1..7ae69e2e8 100644 --- a/docs/archive/b2/getting-started/faq.md +++ b/docs/archive/b2/getting-started/faq.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -87,4 +86,3 @@ issue: 2. If the vendor instructs you to submit a help ticket with Blackboard, please work with your Blackboard Administrator to do so on Behind the Blackboard 3. Our Support team will attempt to collaborate with the vendor to resolve the issue 4. Issues that cannot be resolved are escalated as appropriate via our support process - diff --git a/docs/archive/b2/getting-started/first-steps.md b/docs/archive/b2/getting-started/first-steps.md index 8deb3fd13..f0c2adc73 100644 --- a/docs/archive/b2/getting-started/first-steps.md +++ b/docs/archive/b2/getting-started/first-steps.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -68,4 +67,3 @@ Block development: - [Building Block Development Life Cycle](./dev-life-cycle.md) - [Enabling Debugging](../resources/enabling-remote-debugging.md) - [First Project: Gradle, Git, and basic-b2-template](../resources/first-project-using-gradle-and-git.md) - diff --git a/docs/archive/b2/getting-started/intro.md b/docs/archive/b2/getting-started/intro.md index f1a597347..ea6a76669 100644 --- a/docs/archive/b2/getting-started/intro.md +++ b/docs/archive/b2/getting-started/intro.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -66,4 +65,3 @@ administrator) or contact your sales representative. If you are interested in becoming a Blackboard partner visit the [Blackboard Partnerships](https://www.blackboard.com/partnership/index.aspx)™ program site. Partnering with Blackboard provides access to design guidance and support among other benefits. - diff --git a/docs/archive/b2/getting-started/rosetta-stone.md b/docs/archive/b2/getting-started/rosetta-stone.md index 6dc4bcd20..8fc10365a 100644 --- a/docs/archive/b2/getting-started/rosetta-stone.md +++ b/docs/archive/b2/getting-started/rosetta-stone.md @@ -7,7 +7,6 @@ authors: Mark Kauffman status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -73,4 +72,3 @@ You want to know this because this page is infrequently updated. Just log in to - [9.1 Q4 2015 Cumulative Update 2](https://blackboard.secure.force.com/btbb_articleview?id=kA0390000004fs7) (Build: 9.1.201510.1175205) - [9.1 Q4 2015 Cumulative Update 1](https://blackboard.secure.force.com/btbb_articleview?id=kA0390000000Djn) (LRNSI-21344) - [9.1 Q4 2015](https://blackboard.secure.force.com/btbb_articleview?id=kA47000000002kA) (Build: 9.1.201510.1171621) - diff --git a/docs/archive/b2/getting-started/starter-b2.md b/docs/archive/b2/getting-started/starter-b2.md index 9e1eae2d6..2766cb15b 100644 --- a/docs/archive/b2/getting-started/starter-b2.md +++ b/docs/archive/b2/getting-started/starter-b2.md @@ -7,7 +7,6 @@ author: Kelley MacEwen status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -89,4 +88,3 @@ commented out by default since the task is new to Ant 1.7 and will not work unless you have that version of Ant or newer. If its use is necessary for you, make sure you have Ant 1.7, uncomment out the task, and then update the setting of deploy.url to use warfile.url in place of warfile. - diff --git a/docs/archive/b2/resources/enabling-remote-debugging.md b/docs/archive/b2/resources/enabling-remote-debugging.md index d45aec1bb..4d67cb95b 100644 --- a/docs/archive/b2/resources/enabling-remote-debugging.md +++ b/docs/archive/b2/resources/enabling-remote-debugging.md @@ -7,7 +7,6 @@ author: Scott Hurrey status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -55,4 +54,3 @@ button “Debug” and Eclipse will connect with the Learn instance of Tomcat (Learn must be running). Now when you put the breakpoints inside the Eclipse project you may debug as you would normally with a regular project only now it is remote code running in the Learn Tomcat container. - diff --git a/docs/archive/b2/resources/first-project-using-gradle-and-git.md b/docs/archive/b2/resources/first-project-using-gradle-and-git.md index 79291b311..586602430 100644 --- a/docs/archive/b2/resources/first-project-using-gradle-and-git.md +++ b/docs/archive/b2/resources/first-project-using-gradle-and-git.md @@ -6,7 +6,6 @@ id: archive-b2-resources-first_project_gradle author: Scott Hurrey displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -292,4 +291,3 @@ While average build-times may not significantly decrease, the significant time savings resulting from improved general project management and from the deployment feature of the Learn/Gradle dev environment adds up quickly when compared to a manual deploy cycle. - diff --git a/docs/archive/b2/resources/java11-faq.md b/docs/archive/b2/resources/java11-faq.md index c374e26a4..cb39d4ab5 100644 --- a/docs/archive/b2/resources/java11-faq.md +++ b/docs/archive/b2/resources/java11-faq.md @@ -6,7 +6,6 @@ id: archive-b2-resources-java_11 author: Scott Hurrey displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -54,4 +53,3 @@ As with prior Java version changes, it is generally expected that Building Block 8. **How can I avoid having to do frequent testing and recompiling of Building Blocks?** - As noted above, including copies of dependent libraries in the Building Block rather than referencing them in the Learn application will help. To avoid the overhead of maintaining Building Blocks through these frequent library changes, we encourage you to also consider our ever-expanding support for LTI and REST APIs to determine when it would appropriate for you to transition your solution to these integration frameworks that aren’t impacted by library changes. The LTI/REST framework has the added benefit of being supported across all Learn deployments and UX options enabling your integration to also be Ultra ready. - diff --git a/docs/archive/b2/resources/prepare-for-java11.md b/docs/archive/b2/resources/prepare-for-java11.md index 834e28a95..67144ff35 100644 --- a/docs/archive/b2/resources/prepare-for-java11.md +++ b/docs/archive/b2/resources/prepare-for-java11.md @@ -6,7 +6,6 @@ id: archive-b2-resources-prepare_for_java_11 author: Scott Hurrey displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -38,7 +37,7 @@ Deployed in February 2020. When collecting updated Building Blocks, make sure you have the latest version of the B2 from the provider (vendor, open source, or internal). Check vendor websites or contact vendors’ support and get the latest versions of B2s from them. Confirm that the updates have been tested to be Java 11 compatible and validate in your test or stage environment. For open source Building Blocks you use, check community sources such as [OSCELOT](https://github.com/oscelot) to see if updates are available. If you have B2s created by Blackboard Consulting and supported under an ICM contract, contact Blackboard Product Support for the latest version that is Java 11 compatible. -3. **Transition integrations to different integration types**. Some solution providers have transitioned their integrations to other methods, such as leveraging the [Learning Tools Interoperability (LTI) standard](https://imsglobal.org/lti) or [REST APIs](/docs/rest-apis/learn/getting-started/first-steps.md) instead of Building Block APIs. In some cases, they may have completely different B2 integrations than the one you’re using. Working with these vendors, determine whether this is appropriate for you. Examples of these integrations requiring transition include Lynda.com and Turning Technologies. +3. **Transition integrations to different integration types**. Some solution providers have transitioned their integrations to other methods, such as leveraging the [Learning Tools Interoperability (LTI) standard](https://imsglobal.org/lti) or [REST APIs](/docs/blackboard/rest-apis/getting-started/first-steps.md) instead of Building Block APIs. In some cases, they may have completely different B2 integrations than the one you’re using. Working with these vendors, determine whether this is appropriate for you. Examples of these integrations requiring transition include Lynda.com and Turning Technologies. 4. **Test and update in-house Building Blocks**. If you have B2s created at your institution, you should confirm their functionality in test/stage and prepare to update them. Guidance about updating Building Blocks can be found [here](preparing-for-saas-and-new-learn-versions.md). We’ve created an automated tool to assist with identifying potential library incompatibilities. While this tool doesn’t necessarily inform you of the functional behavior of the Building Block with Java 11, it provides guidance around library incompatibilities that could lead to a non-functional B2. See the section about the Building Block Scan Tool in the Resources section below. @@ -70,4 +69,3 @@ Deployed in February 2020. - [Preparing a Building Block for a newer version of Learn and ensuring it works with Learn SaaS](preparing-for-saas-and-new-learn-versions.md) - [B2 development frequently asked questions](../getting-started/faq.md) - diff --git a/docs/archive/b2/resources/preparing-for-learn-q2-2016.md b/docs/archive/b2/resources/preparing-for-learn-q2-2016.md index 81248a4fa..044f85f50 100644 --- a/docs/archive/b2/resources/preparing-for-learn-q2-2016.md +++ b/docs/archive/b2/resources/preparing-for-learn-q2-2016.md @@ -7,7 +7,6 @@ author: Mark Bykerk Kauffman status: deprecated displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -83,4 +82,3 @@ newer version of Learn. You now must set the max version of Learn in the v2 B2 so that it can not be installed in this new version of Learn. You create a new version of your B2, v3, and set the min version of Learn in the bb-manifest. B2 v3 does not yet need to have a max version of Learn set in the manifest. - diff --git a/docs/archive/b2/resources/preparing-for-saas-and-new-learn-versions.md b/docs/archive/b2/resources/preparing-for-saas-and-new-learn-versions.md index 0763b0b5e..3ff4ea7a5 100644 --- a/docs/archive/b2/resources/preparing-for-saas-and-new-learn-versions.md +++ b/docs/archive/b2/resources/preparing-for-saas-and-new-learn-versions.md @@ -7,8 +7,6 @@ author: Scott Hurrey displayed_sidebar: documentationSidebar --- - - :warning: This document is deprecated! # Preparing Your Building Blocks For Learn SaaS and Newer Learn Versions @@ -660,5 +658,5 @@ Note the brackets are indicating how the iframes are nested. Summary - If your B2 provides a mashup for use in an Original Course's TinyMCE editor you will need to re-architect as described above, or mirgrate users to an LTI-based solution. ``` - + ``` diff --git a/docs/archive/b2/resources/scan-tool-learn-saas.md b/docs/archive/b2/resources/scan-tool-learn-saas.md index 80ddb6552..ae720c2c4 100644 --- a/docs/archive/b2/resources/scan-tool-learn-saas.md +++ b/docs/archive/b2/resources/scan-tool-learn-saas.md @@ -7,7 +7,6 @@ id: archive-b2-resources-scan_tool author: Scott Hurrey displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -67,4 +66,3 @@ https:///learn/api/v1/healthCheck/deepb2s?handle=myB2&ve The result of loading this endpoint is a JSON body containing information about the Building Block and any reported discrepancies. Here is an [example](/assets/files/b2-scan-output-example.zip) of the output from running this scanner against the youtube mashup Building Block. - diff --git a/docs/archive/b2/resources/useful-links.md b/docs/archive/b2/resources/useful-links.md index 489dbc4a6..d055c39e8 100644 --- a/docs/archive/b2/resources/useful-links.md +++ b/docs/archive/b2/resources/useful-links.md @@ -6,7 +6,6 @@ id: archive-b2-resources-useful_links author: Scott Hurrey displayed_sidebar: documentationSidebar --- - :warning: This document is deprecated! @@ -24,4 +23,3 @@ Building Blocks framework. - [Blackboard Github Repository](https://github.com/blackboard){: target='\_blank'} - [Java 11](./prepare-for-java11.md) - [Java 11 FAQs](./java11-faq.md) - diff --git a/docs/blackboard/caliper/caliper-intro.md b/docs/blackboard/caliper/caliper-intro.md new file mode 100644 index 000000000..8532f0612 --- /dev/null +++ b/docs/blackboard/caliper/caliper-intro.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 1 +published: "" +edited: "" +--- + +# Welcome to caliper! diff --git a/docs/standards/caliper/events/assessment-events.md b/docs/blackboard/caliper/events/assessment-events.md similarity index 99% rename from docs/standards/caliper/events/assessment-events.md rename to docs/blackboard/caliper/events/assessment-events.md index 1d3d56267..440334dbd 100644 --- a/docs/standards/caliper/events/assessment-events.md +++ b/docs/blackboard/caliper/events/assessment-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream has two event types dedicated to assessments: - **AssessmentEvent** @@ -492,5 +490,3 @@ Here is some of the key data that is associated with these events: ] } ``` - - diff --git a/docs/standards/caliper/events/assignable-events.md b/docs/blackboard/caliper/events/assignable-events.md similarity index 98% rename from docs/standards/caliper/events/assignable-events.md rename to docs/blackboard/caliper/events/assignable-events.md index 114934dcc..b34d3c484 100644 --- a/docs/standards/caliper/events/assignable-events.md +++ b/docs/blackboard/caliper/events/assignable-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits an AssignableEvent in four cases: @@ -162,5 +160,3 @@ lower in group.subOrganizationOf ] } ``` - - diff --git a/docs/standards/caliper/events/blog-events.md b/docs/blackboard/caliper/events/blog-events.md similarity index 98% rename from docs/standards/caliper/events/blog-events.md rename to docs/blackboard/caliper/events/blog-events.md index 7bc0b6496..2a2710d87 100644 --- a/docs/standards/caliper/events/blog-events.md +++ b/docs/blackboard/caliper/events/blog-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a BlogEvent whenever a student submits a blog entry in an original experience course. Here is some of the key data that is associated with these events: @@ -133,5 +131,3 @@ Here is a sample of what an event payload might look like: ] } ``` - - diff --git a/docs/standards/caliper/events/calculated-grade-snapshot-events.md b/docs/blackboard/caliper/events/calculated-grade-snapshot-events.md similarity index 98% rename from docs/standards/caliper/events/calculated-grade-snapshot-events.md rename to docs/blackboard/caliper/events/calculated-grade-snapshot-events.md index fa520665d..68925b926 100644 --- a/docs/standards/caliper/events/calculated-grade-snapshot-events.md +++ b/docs/blackboard/caliper/events/calculated-grade-snapshot-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a CalculatedGradeSnapshotEvent nightly for any grade that is recalculated. Here is some of the key data that is associated with these events: @@ -122,5 +120,3 @@ Here is a sample of what a payload might look like: ] } ``` - - diff --git a/docs/standards/caliper/events/content-events.md b/docs/blackboard/caliper/events/content-events.md similarity index 99% rename from docs/standards/caliper/events/content-events.md rename to docs/blackboard/caliper/events/content-events.md index b915c71ff..8909b78af 100644 --- a/docs/standards/caliper/events/content-events.md +++ b/docs/blackboard/caliper/events/content-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a ContentEvent to cover a plethora of use cases. Here is when a message will be sent: @@ -297,5 +295,3 @@ Here is a sample of what a payload might look like: ] } ``` - - diff --git a/docs/standards/caliper/events/course-group-events.md b/docs/blackboard/caliper/events/course-group-events.md similarity index 98% rename from docs/standards/caliper/events/course-group-events.md rename to docs/blackboard/caliper/events/course-group-events.md index edec70c2c..019678a31 100644 --- a/docs/standards/caliper/events/course-group-events.md +++ b/docs/blackboard/caliper/events/course-group-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a CourseGroupEvent whenever an instructor creates, updates, or deletes a group in a course. @@ -138,5 +136,3 @@ Here is a sample of what a payload might look like: ] } ``` - - diff --git a/docs/standards/caliper/events/event-guide.md b/docs/blackboard/caliper/events/event-guide.md similarity index 99% rename from docs/standards/caliper/events/event-guide.md rename to docs/blackboard/caliper/events/event-guide.md index 52f1876ff..f40a5a9bd 100644 --- a/docs/standards/caliper/events/event-guide.md +++ b/docs/blackboard/caliper/events/event-guide.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - This document contains a map of the Caliper events emitted by Learn. If you are interested in learning more about Moodle's Caliper implementation, please visit the [Moodle Documentation](https://docs.moodle.org/dev/Caliper). @@ -163,5 +161,3 @@ For more information, see [Blog Events](./blog-events.md). | Post to a Wiki in an Original Experience Course | Student | Immediately | For more information, see [Wiki Events](./wiki-events.md). - - diff --git a/docs/standards/caliper/events/forum-events.md b/docs/blackboard/caliper/events/forum-events.md similarity index 99% rename from docs/standards/caliper/events/forum-events.md rename to docs/blackboard/caliper/events/forum-events.md index dc46c9d59..be36acb81 100644 --- a/docs/standards/caliper/events/forum-events.md +++ b/docs/blackboard/caliper/events/forum-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a ForumEvent to cover five use cases: @@ -287,5 +285,3 @@ Here is some of the key data that is associated with these events: ] } ``` - - diff --git a/docs/standards/caliper/events/grade-events.md b/docs/blackboard/caliper/events/grade-events.md similarity index 98% rename from docs/standards/caliper/events/grade-events.md rename to docs/blackboard/caliper/events/grade-events.md index 799ecdd3e..61b998b91 100644 --- a/docs/standards/caliper/events/grade-events.md +++ b/docs/blackboard/caliper/events/grade-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a GradeEvent to cover the following use cases: @@ -177,5 +175,3 @@ Here is a sample of what a workflow might look like: ] } ``` - - diff --git a/docs/standards/caliper/events/lti-events.md b/docs/blackboard/caliper/events/lti-events.md similarity index 98% rename from docs/standards/caliper/events/lti-events.md rename to docs/blackboard/caliper/events/lti-events.md index 7634cb0a2..a73932c2a 100644 --- a/docs/standards/caliper/events/lti-events.md +++ b/docs/blackboard/caliper/events/lti-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits an LTIEvent when any user: - **Clicks an LTI link** @@ -129,5 +127,3 @@ Here is some of the key data that is associated with these events: } } ``` - - diff --git a/docs/standards/caliper/events/session-events.md b/docs/blackboard/caliper/events/session-events.md similarity index 97% rename from docs/standards/caliper/events/session-events.md rename to docs/blackboard/caliper/events/session-events.md index bc9a5bd57..2a58b94d2 100644 --- a/docs/standards/caliper/events/session-events.md +++ b/docs/blackboard/caliper/events/session-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a SessionEvent to cover three use cases: @@ -97,5 +95,3 @@ Here is some of the key data that is associated with these events: "extensions": {} } ``` - - diff --git a/docs/standards/caliper/events/view-events.md b/docs/blackboard/caliper/events/view-events.md similarity index 97% rename from docs/standards/caliper/events/view-events.md rename to docs/blackboard/caliper/events/view-events.md index e56a02668..04c965085 100644 --- a/docs/standards/caliper/events/view-events.md +++ b/docs/blackboard/caliper/events/view-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream sends ViewEvent messages to cover four use cases: @@ -119,5 +117,3 @@ Here is some of the key data that is associated with all ViewEvents: "extensions": {} } ``` - - diff --git a/docs/standards/caliper/events/wiki-events.md b/docs/blackboard/caliper/events/wiki-events.md similarity index 98% rename from docs/standards/caliper/events/wiki-events.md rename to docs/blackboard/caliper/events/wiki-events.md index 29c8f3443..e65e78fb6 100644 --- a/docs/standards/caliper/events/wiki-events.md +++ b/docs/blackboard/caliper/events/wiki-events.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn's Caliper Analytics stream emits a WikiEvent whenever a student posts to a wiki in an original experience course. Here is some of the key data that is associated with these events: @@ -131,5 +129,3 @@ Here is a sample of what an event payload might look like: ] } ``` - - diff --git a/docs/standards/caliper/getting-started/caliper-event-store-for-learn.md b/docs/blackboard/caliper/getting-started/caliper-event-store-for-learn.md similarity index 98% rename from docs/standards/caliper/getting-started/caliper-event-store-for-learn.md rename to docs/blackboard/caliper/getting-started/caliper-event-store-for-learn.md index 6539b494a..5ae514453 100644 --- a/docs/standards/caliper/getting-started/caliper-event-store-for-learn.md +++ b/docs/blackboard/caliper/getting-started/caliper-event-store-for-learn.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Learn was the first Learning Management System to be certified for Caliper Learning Analytics. Caliper is an IMS Global standard that allows a provider, in this case Learn, to stream usage data to an external system. This @@ -96,5 +94,3 @@ to process all of the incoming messages and have ample space and processing power to store the data and run reports against it. If you want more information about what types of data is included, check out the rest of this space for documents tagged for caliper.

- - diff --git a/docs/standards/caliper/getting-started/getting-started-with-caliper.md b/docs/blackboard/caliper/getting-started/getting-started-with-caliper.md similarity index 94% rename from docs/standards/caliper/getting-started/getting-started-with-caliper.md rename to docs/blackboard/caliper/getting-started/getting-started-with-caliper.md index 922ad6f96..5dd7dd739 100644 --- a/docs/standards/caliper/getting-started/getting-started-with-caliper.md +++ b/docs/blackboard/caliper/getting-started/getting-started-with-caliper.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - Caliper Analytics is an IMS Global standard focused on the delivery of consistent event tracking across campus applications. @@ -32,5 +30,3 @@ to the Learn Activity Stream, and subscribing to the Learn Activity Stream as an additional Event Store. This section of the Anthology standards Developer Community will dive into both of these options, with sample code and supporting documentation. - - diff --git a/docs/standards/caliper/getting-started/metric-profiles.md b/docs/blackboard/caliper/getting-started/metric-profiles.md similarity index 98% rename from docs/standards/caliper/getting-started/metric-profiles.md rename to docs/blackboard/caliper/getting-started/metric-profiles.md index 504aa66fb..a01305b35 100644 --- a/docs/standards/caliper/getting-started/metric-profiles.md +++ b/docs/blackboard/caliper/getting-started/metric-profiles.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Caliper Metric Profiles provide a basic, consistent format for emitting and consuming learning events regardless of the Learning Management System or Educational Tool. These profiles leverage other IMS Global standards like LTI @@ -148,5 +146,3 @@ concept of an event envelope. This envelope contains three entities: - sensor - The sensor is the library creating and sending the events. - sendTime - This is the ISO-compliant date and time the envelope was sent. - data - an array containing one or more Caliper events. - - diff --git a/docs/lti/core/id-token.md b/docs/blackboard/lti/core/id-token.md similarity index 98% rename from docs/lti/core/id-token.md rename to docs/blackboard/lti/core/id-token.md index fe1b33ccb..c47783216 100644 --- a/docs/lti/core/id-token.md +++ b/docs/blackboard/lti/core/id-token.md @@ -7,7 +7,6 @@ edited: "" categories: Standards author: Eric Preston --- - ### Overview @@ -144,5 +143,3 @@ exports.handleIdToken = function(id_token) { "family_name": "Cool" } ``` - - diff --git a/docs/lti/core/oidc-login.md b/docs/blackboard/lti/core/oidc-login.md similarity index 95% rename from docs/lti/core/oidc-login.md rename to docs/blackboard/lti/core/oidc-login.md index 1dde61cb7..7b8fbaa22 100644 --- a/docs/lti/core/oidc-login.md +++ b/docs/blackboard/lti/core/oidc-login.md @@ -8,8 +8,6 @@ edited: "" author: Eric Preston --- - - ### Overview The Open ID Connect 3rd-party-initiated login is the first step in handling an LTI 1.3 launch. @@ -52,5 +50,3 @@ exports.oidcLogin = function(req, res) { res.redirect(url); }; ``` - - diff --git a/docs/lti/core/poidc-login-lti_storage_target.md b/docs/blackboard/lti/core/poidc-login-lti_storage_target.md similarity index 97% rename from docs/lti/core/poidc-login-lti_storage_target.md rename to docs/blackboard/lti/core/poidc-login-lti_storage_target.md index 53cd01232..49b831fc5 100644 --- a/docs/lti/core/poidc-login-lti_storage_target.md +++ b/docs/blackboard/lti/core/poidc-login-lti_storage_target.md @@ -7,7 +7,6 @@ published: "2024-01-05" edited: "2024-01-05" author: Mark Kauffman --- - ### Motivation @@ -24,5 +23,3 @@ In response to these challenges, 1EdTech (formerly IMS Global) has developed new An essential aspect of this new specification is that it does not require the inclusion of the lti_storage_target parameter in the tool launch process following the OIDC login. Instead, the specifications offer alternative ways to achieve the necessary functionality without relying on this parameter. For example, the LMS can indicate its support for an additional iframe for shared storage through a capabilities endpoint. This flexibility is particularly crucial for platforms like Learn, which adheres strictly to the guidelines that redirect URIs should not be modified from their registered value, as indicated by OAuth 2.0 standards. These changes represent a significant advancement in addressing the challenges posed by the evolving web privacy landscape, ensuring that LTI integrations can continue to provide seamless and secure user experiences in online learning environments. For developers and institutions, it's essential to stay informed about these updates and consider implementing them to maintain the efficacy and security of their LTI integrations. - - diff --git a/docs/lti/deep-linking-two-json.md b/docs/blackboard/lti/deep-linking-two-json.md similarity index 93% rename from docs/lti/deep-linking-two-json.md rename to docs/blackboard/lti/deep-linking-two-json.md index e0517a710..22ba90b32 100644 --- a/docs/lti/deep-linking-two-json.md +++ b/docs/blackboard/lti/deep-linking-two-json.md @@ -8,8 +8,6 @@ edited: "" sidebar_position: 5 --- - - ### Overview This document documents sample JSON between the Learn LMS and an @@ -54,5 +52,3 @@ about is doing video embeds in Learn content. That will be our first, and for no } } ``` - - diff --git a/docs/lti/getting-started-with-lti.md b/docs/blackboard/lti/getting-started-with-lti.md similarity index 96% rename from docs/lti/getting-started-with-lti.md rename to docs/blackboard/lti/getting-started-with-lti.md index 149c44a35..fc89cc4c9 100644 --- a/docs/lti/getting-started-with-lti.md +++ b/docs/blackboard/lti/getting-started-with-lti.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - ### Overview Learning Tools Interoperability (LTI) is a standard from the IMS Global consortium. @@ -92,7 +90,7 @@ The LTI 1.3 spec defines the information you must provide to a Platform (LMS) su The LTI spec supports the notion of custom parameters with a launch. These are arbitrary `name=value` tuples that you can provide to uniquely identify the launch, or any other piece of information you need from the platform at launch time. See the following two documents on how to use substitution parameters within custom parameters to receive context-specific data on an LTI launch: [IMS LTI 1.3 Parameter Substitution](https://www.imsglobal.org/spec/lti/v1p3/#customproperty) -[Learn Template Variables](../rest-apis/learn/advanced/dynamic-rendering-with-template-variables.md) +[Learn Template Variables](/docs/blackboard/rest-apis/advanced/dynamic-rendering-with-template-variables.md) #### Information you Receive @@ -110,14 +108,14 @@ Once you have registered your application with the Blackboard Developer Portal, In Learn the way an LTI tool is surfaced in the user interface (UI) is through the definition of one or more `Placements`. An application developer can define these placements so a Learn admin doesn't have to. There are currently six types of placements you can create: -| Type | Description | Options | -| -------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- | -| Deep Linking | Supports [LTI Deep Linking](https://www.imsglobal.org/spec/lti-dl/v2p0) to get content in outline or editor | Allow student access | -| Course Content | Can be placed in the course outline or editor | Can be graded | -| Course | Appears in Ultra Books & Tools, Original Tools | Allow student access | -| System | Appears in Ultra Base Nav Tools, Original Institution module | | -| Admin | Appears in Admin Tools module | | -| UEF | Special type for extending the Ultra UI; see [UEF docs](../../docs/rest-apis/premium-apis/uef/uef_getting_started.md) | | +| Type | Description | Options | +| -------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------- | +| Deep Linking | Supports [LTI Deep Linking](https://www.imsglobal.org/spec/lti-dl/v2p0) to get content in outline or editor | Allow student access | +| Course Content | Can be placed in the course outline or editor | Can be graded | +| Course | Appears in Ultra Books & Tools, Original Tools | Allow student access | +| System | Appears in Ultra Base Nav Tools, Original Institution module | | +| Admin | Appears in Admin Tools module | | +| UEF | Special type for extending the Ultra UI; see [UEF docs](/docs/blackboard/premium-apis/uef/uef_getting_started.md) | | #### Placement properties @@ -168,5 +166,3 @@ Deleting a registered LTI domain and/or the associated managed placements from t If you create an LTI 1.3 Tool that uses the same domain as a currently registered LTI 1.1 tool on a Learn system, there is code in Learn that will prompt you to migrate from LTI 1.1 to LTI 1.3. Generally that's a great option. Finally, only very brave people make changes on a production system without testing first on a test or staging system. We recommend you be more cautious than brave. - - diff --git a/docs/lti/lti-intro.md b/docs/blackboard/lti/lti-intro.md similarity index 97% rename from docs/lti/lti-intro.md rename to docs/blackboard/lti/lti-intro.md index cab80170b..db0ff8ab3 100644 --- a/docs/lti/lti-intro.md +++ b/docs/blackboard/lti/lti-intro.md @@ -6,8 +6,6 @@ edited: "" author: Eric Preston --- - - # Welcome to LTI 1.3 for Blackboard Learn! Blackboard Learn supports the latest version of the Learning Tools Interoperability (LTI) specification, which is LTI 1.3. This version of LTI provides enhanced security features and improved interoperability between learning management systems (LMSs) and external tools. @@ -37,5 +35,3 @@ Here are some of the key features and benefits of LTI 1.3: **Streamlined user experience**: LTI 1.3 introduces a new Deep Linking feature, which enables instructors to create links to specific resources within external tools and embed them directly within their course content. This makes it easier for students to access external tools and content without leaving the LMS environment, improving the overall user experience. **Easier implementation**: LTI 1.3 introduces a new Developer Key and Secret mechanism, which simplifies the process of creating and managing LTI integrations. This makes it easier for developers to implement LTI integrations and reduces the time and effort required to maintain them. - - diff --git a/docs/lti/lti-registration-and-deployment.md b/docs/blackboard/lti/lti-registration-and-deployment.md similarity index 97% rename from docs/lti/lti-registration-and-deployment.md rename to docs/blackboard/lti/lti-registration-and-deployment.md index be90e7858..df0fcb7f4 100644 --- a/docs/lti/lti-registration-and-deployment.md +++ b/docs/blackboard/lti/lti-registration-and-deployment.md @@ -1,15 +1,13 @@ --- -title: 'LTI Registration and Deployment with Learn' +title: "LTI Registration and Deployment with Learn" id: registration-deployment categories: Standards -published: '' -edited: '' +published: "" +edited: "" author: Eric Preston sidebar_position: 4 --- - - ## Why do we use a central service at Anthology? We believe that having Tool vendors register an LTI Tool _once_ through [the Developer Portal](https://developer.anthology.com/) is the best approach. It allows Learn admins to deploy that tool by entering just one piece of information (the Client ID) in the Admin Panel and sharing another piece of information (the Deployment ID) with the Tool vendor. @@ -85,5 +83,3 @@ Learn has the concept of LTI Placements to support this. Blackboard allows a Too ![LTI diagram](/assets/img/ltidiagram.png) If you have any other questions about LTI Registration and Deployment with Learn, let us know. - - diff --git a/docs/lti/migrating/migrating-11.md b/docs/blackboard/lti/migrating/migrating-11.md similarity index 94% rename from docs/lti/migrating/migrating-11.md rename to docs/blackboard/lti/migrating/migrating-11.md index df922273c..58eea0ba2 100644 --- a/docs/lti/migrating/migrating-11.md +++ b/docs/blackboard/lti/migrating/migrating-11.md @@ -7,8 +7,6 @@ edited: "" author: Eric Preston --- - - ### Overview For the first time in LTI's history we need to handle migrating from one version to another. Before 1.3 the changes were all @@ -29,5 +27,3 @@ tool the admin is prompted to migrate the links. If they choose "yes" then we mi new LTI 1.3 application, effectively removing the LTI 1.1 domain configuration. The links remain and should work fine if the tool developer has done their job correctly. The target_link_uri for the 1.3 tool is the same as the launch URL defined in the LTI 1.1 placement or link. - - diff --git a/docs/lti/proctoring/ultra-proctoring-service-integration.md b/docs/blackboard/lti/proctoring/ultra-proctoring-service-integration.md similarity index 97% rename from docs/lti/proctoring/ultra-proctoring-service-integration.md rename to docs/blackboard/lti/proctoring/ultra-proctoring-service-integration.md index 5c23591a4..4d8c292bb 100644 --- a/docs/lti/proctoring/ultra-proctoring-service-integration.md +++ b/docs/blackboard/lti/proctoring/ultra-proctoring-service-integration.md @@ -7,8 +7,6 @@ edited: "" author: Mark Kauffman --- - - ## Overview There are many proctoring solutions available in the market today. Our clients license a variety of these services and would like to continue to use them in Ultra. Given the sheer number of proctoring services out there, it is not feasible for Blackboard to build and maintain customized integrations with each one. Therefore there was a need for us to develop a solution that would allow all proctoring solutions to be able to integrate with Ultra. @@ -53,7 +51,7 @@ Two types of LTI placements will need to be created to successfully integrates a id: rest_apis-premium-apis-uef-getting_started id: rest_apis-premium-apis-uef-getting_started -This placement will be the primary means of communication between your application and Ultra Extension Framework. Ultra Extension Framework will be used to render the settings of each proctoring service inside the assessment settings of Ultra. Once your application is authorized with Ultra Extension Framework, your app will be able to use the API to register as a proctoring service and provide HTML to display. [See for more information](../../rest-apis/premium-apis/uef/uef_getting_started.md) about UEF including tutorials on how to get started. +This placement will be the primary means of communication between your application and Ultra Extension Framework. Ultra Extension Framework will be used to render the settings of each proctoring service inside the assessment settings of Ultra. Once your application is authorized with Ultra Extension Framework, your app will be able to use the API to register as a proctoring service and provide HTML to display. [See for more information](/docs/blackboard/premium-apis/uef/uef_getting_started.md) about UEF including tutorials on how to get started. ##### Create new Ultra Extension placement: @@ -227,5 +225,3 @@ Pre-requisites: - Ultra Extension placement has not been created or is set to unavailable - Authorization with Ultra Extension Framework failed - Error in your JS script Ultra Extension Framework is calling - - diff --git a/docs/lti/proctoring/ultra-proctoring-service-tutorials.md b/docs/blackboard/lti/proctoring/ultra-proctoring-service-tutorials.md similarity index 95% rename from docs/lti/proctoring/ultra-proctoring-service-tutorials.md rename to docs/blackboard/lti/proctoring/ultra-proctoring-service-tutorials.md index 7c8fc8acb..42f2f3f89 100644 --- a/docs/lti/proctoring/ultra-proctoring-service-tutorials.md +++ b/docs/blackboard/lti/proctoring/ultra-proctoring-service-tutorials.md @@ -6,8 +6,6 @@ edited: "" author: Mark Kauffman, Scott Hurrey, Eric Preston --- - - # Ultra Proctoring Service Tutorials - IMS Proctoring Spec + UEF #### Overview @@ -29,5 +27,3 @@ In the [Part 3 video](https://youtu.be/DciK1YoaE6E) we show how to display your #### Recap and Review In the [Recap and Review video](https://youtu.be/MRkJ3PHYoJo) we review the fundamentals of the setup and demonstrate it working on the cookieless solution provided with Learn(tm) build 3900.13.rel31. Also shown is that the solution works great with the student preview feature. - - diff --git a/docs/lti/sanctioned-lti-registration-deployment.md b/docs/blackboard/lti/sanctioned-lti-registration-deployment.md similarity index 97% rename from docs/lti/sanctioned-lti-registration-deployment.md rename to docs/blackboard/lti/sanctioned-lti-registration-deployment.md index 1ce4b758c..7754b0dcf 100644 --- a/docs/lti/sanctioned-lti-registration-deployment.md +++ b/docs/blackboard/lti/sanctioned-lti-registration-deployment.md @@ -8,8 +8,6 @@ edited: "" sidebar_position: 3 --- - - ## Motivation At Anthology we want our clients to have the best possible experience with Learn and the products that are integrated with it. To that end we developed a central registration service on our developer portal for use by 3rd-party vendors that are LTI 1.3 Tool providers. Using the central registration service, the Tool provider can go through the complexities of Tool registration and get a Client ID. That Client ID is all our mutual clients need to deploy a Tool. When the Tool is deployed a Deployment ID is generated that the client then provides the Tool vendor. The Client ID and Deployment ID are included in all LTI 1.3 communication, giving the Tool everything needed to identify the client's LMS. Reference [LTI Registration and Deployment](./lti-registration-and-deployment.md). @@ -29,5 +27,3 @@ The bottom line is that having the vendor register their Tool(s) to get Client I ## tl;dr For LTI 1.3 only integrations the best client experience is given by a vendor when the vendor registers on the Anthology central registration portal and shares the client_id with the client. There are other processes that involve the vendor asking the client to register the LTI-1.3-only integration. While not ideal, that’s OK, as long as the integration is not using the associated REST API key/secret. - - diff --git a/docs/lti/turn-on-all-switches.md b/docs/blackboard/lti/turn-on-all-switches.md similarity index 93% rename from docs/lti/turn-on-all-switches.md rename to docs/blackboard/lti/turn-on-all-switches.md index 161a6ad32..8106298f5 100644 --- a/docs/lti/turn-on-all-switches.md +++ b/docs/blackboard/lti/turn-on-all-switches.md @@ -8,8 +8,6 @@ author: Scott Hurrey sidebar_position: 6 --- - - ### Overview We often hear about this message "The Tool Provider has been disabled by the System Administrator" The usual cause is that one of the 3 LTI switches is disabled. There are 3 places you need to enable LTI: (1) at the tool level, (2) at the course/organization level, and (3) at the LTI Global Properties level. Screenshots follow. **LAST, BUT NOT LEAST - Make certain you are enrolled in the course, as an instructor or student, before using the LTI placements you create in a course! Your launch will fail if you don't have a role in the course.** @@ -27,5 +25,3 @@ We often hear about this message "The Tool Provider has been disabled by the Sys (3) Administrator Panel -> Integrations section -> LTI Tool Providers -> Manage Global Properties ![3-LTIConfigManageGlobal.png](/assets/img/turn-on-all-switches-3.png) - - diff --git a/docs/lti/tutorials/develop-lti-advantage-solution.md b/docs/blackboard/lti/tutorials/develop-lti-advantage-solution.md similarity index 95% rename from docs/lti/tutorials/develop-lti-advantage-solution.md rename to docs/blackboard/lti/tutorials/develop-lti-advantage-solution.md index 18e8abdf0..f259b9df0 100644 --- a/docs/lti/tutorials/develop-lti-advantage-solution.md +++ b/docs/blackboard/lti/tutorials/develop-lti-advantage-solution.md @@ -7,8 +7,6 @@ edited: "" author: Mark Kauffman --- - - # ### Caveat @@ -24,5 +22,3 @@ On April 10, 2019, Eric Preston, Blackboard's resident LTI expert, spoke with us On May 1, 2019, Eric followed up with another, deeper dive into coding an LTI integration. [Watch the recording in Bb Collaborate](https://us.bbcollab.com/recording/e193c6cb59cb4ed1a776c271665d4154). [This is the associated slide deck.](https://slack-files.com/TFA153DM0-FJFEJH8NB-fbe304b473)) Here is the sample code referenced in the presentations: https://github.com/blackboard/BBDN-LTI-Tool-Provider-Node - - diff --git a/docs/lti/tutorials/implementation-guide.md b/docs/blackboard/lti/tutorials/implementation-guide.md similarity index 97% rename from docs/lti/tutorials/implementation-guide.md rename to docs/blackboard/lti/tutorials/implementation-guide.md index 92ce94e23..80889fea1 100644 --- a/docs/lti/tutorials/implementation-guide.md +++ b/docs/blackboard/lti/tutorials/implementation-guide.md @@ -7,8 +7,6 @@ edited: "" author: Eric Preston --- - - ### Overview Implementing an LTI 1.3 + Advantage tool is involved, but we'll break down the steps here. There are many good resources @@ -124,7 +122,7 @@ There are two optional steps in the sequence diagram above. ##### Learn REST Token -If your tool is going to use the Learn public REST API in order to get or set information it can't via LTI then it should retrive a Learn OAuth 2 access token at this time and cache it. There are choices as to what OAuth 2 flow you can use, so please refer to this document on how to [retrieve a Learn OAuth 2 access token](/docs/rest-apis/learn/getting-started/first-steps.md). In the diagram above we show using the AuthCode flow as its the most common for UI-based work where you want the API call to be done on behalf of the interacting user. See this document on using [three-legged oauth](/docs/rest-apis/learn/getting-started/3lo.md). +If your tool is going to use the Learn public REST API in order to get or set information it can't via LTI then it should retrive a Learn OAuth 2 access token at this time and cache it. There are choices as to what OAuth 2 flow you can use, so please refer to this document on how to [retrieve a Learn OAuth 2 access token](/docs/blackboard/rest-apis/getting-started/first-steps.md). In the diagram above we show using the AuthCode flow as its the most common for UI-based work where you want the API call to be done on behalf of the interacting user. See this document on using [three-legged oauth](/docs/blackboard/rest-apis/getting-started/3lo.md). ##### LTI Rest Token @@ -143,5 +141,3 @@ This claim contains information about what the platform accepts, and a data fiel The tool then presents a UI allowing the user to select or create content the tool provides. It can be LTI links, web links, files, images, or html. Learn only supports LTI links and web links at the moment. You can return one or more content items, and depending on from where the tool was launched the links will appear in the course outline or the rich text editor. If returned to the rich text editor they can be displayed as hyperlinks or embedded in the editor. See [Deep Linking JSON](../deep-linking-two-json.md) for details on how to configure the rendering of LTI links in the rich text editor. - - diff --git a/docs/lti/tutorials/names-and-roles.md b/docs/blackboard/lti/tutorials/names-and-roles.md similarity index 92% rename from docs/lti/tutorials/names-and-roles.md rename to docs/blackboard/lti/tutorials/names-and-roles.md index 004f66c81..6f1506649 100644 --- a/docs/lti/tutorials/names-and-roles.md +++ b/docs/blackboard/lti/tutorials/names-and-roles.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - ### Overview This document documents gives updates on Names and Roles as new features become available. For the definitive specifications, always refer to the published IMS documenation. @@ -24,5 +22,3 @@ This new functionality is seen in the Names and Roles service as implemented in ``` As of this writing, 2020.04.07, this addition to the Names and Roles service has not yet been added to the IMS Names and Role Provisioning Services documentation. It will likely be added as an addendum soon. - - diff --git a/docs/lti/tutorials/py-lti-1p3.md b/docs/blackboard/lti/tutorials/py-lti-1p3.md similarity index 99% rename from docs/lti/tutorials/py-lti-1p3.md rename to docs/blackboard/lti/tutorials/py-lti-1p3.md index be4143482..a9a56bcd7 100644 --- a/docs/lti/tutorials/py-lti-1p3.md +++ b/docs/blackboard/lti/tutorials/py-lti-1p3.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - LTI 1.3 is a much better, much more secure option for integrating one application with another in a standard way. Python is an industry-standard language and is in use by many Blackboard institutions for building integrations. The purpose of this document is to demonstrate how to use the [pyLTI1p3](https://pypi.org/project/PyLTI1p3) library, built by [Dmitry Viskov](https://github.com/dmitry-viskov) to easily integrate a Python application with Learn's Ultra Experience. For the purposes of this demonstration, we will use Dmitry's [pylti1.3 flask example](https://github.com/dmitry-viskov/pylti1.3-flask-example). @@ -169,5 +167,3 @@ You should now have a content item called `Breakout m In the background, the tool uses the Names and Roles Provisioning service to create a leaderboard with the course members. Further, it uses the Assignments and Grades Service to store your latest score. Pretty fancy, right? - - diff --git a/docs/lti/tutorials/testing-tool.md b/docs/blackboard/lti/tutorials/testing-tool.md similarity index 96% rename from docs/lti/tutorials/testing-tool.md rename to docs/blackboard/lti/tutorials/testing-tool.md index 9e0b85e47..46a52f09c 100644 --- a/docs/lti/tutorials/testing-tool.md +++ b/docs/blackboard/lti/tutorials/testing-tool.md @@ -7,8 +7,6 @@ edited: "" author: Mark Kauffman --- - - ## Overview This document contains links to a complete demonstration of setting up and using https://github.com/blackboard/BBDN-LTI-Tool-Provider-Node. Shout out to Scott Hurrey & Eric Preston and the team (everyone you see on the commit list at the repo!) for all their work and help with this. @@ -34,5 +32,3 @@ The most important thing you can do to begin is to read, and understand [the spe [Video Part IV is a demonstration](https://youtu.be/Xu1vI-wGIhA) of custom parameters from the Deep Link launch request and also a review of Names and Roles in that request. The purpose of Names and Roles is to let the Tool Provider get all of the memberships in the course, and the role of each member with a call to one endpoint using LTI 1.3 security. Comming soon: A screenshot of how this looks from the BLTPN - showing the first two members and their roles that were retrieved from the course. - - diff --git a/docs/rest-apis/premium-apis/requesting-premium-apis.md b/docs/blackboard/premium-apis/requesting-premium-apis.md similarity index 91% rename from docs/rest-apis/premium-apis/requesting-premium-apis.md rename to docs/blackboard/premium-apis/requesting-premium-apis.md index fcecca73c..778dd9c41 100644 --- a/docs/rest-apis/premium-apis/requesting-premium-apis.md +++ b/docs/blackboard/premium-apis/requesting-premium-apis.md @@ -1,5 +1,5 @@ --- -title: "Requesting Premium APIs" +title: "What are Premium APIs" id: requesting-premium-apis categories: REST UEF author: Hernan Ortiz @@ -8,11 +8,19 @@ edited: "" sidebar_position: 1 --- - - Premium APIs offer several new capabilities for integrations with Learn Ultra experience. +## Our Premium APIs + +### Ultra Extension Framework + +UEF is a set of Premium APIs that augment the Ultra experience of +Learn. We designed a robust set of capabilities such as +telemetry, help provider registration, and UI element rendering to +enable better integrations and richer user experience. +Take a look at [First steps with UEF](./uef/uef_getting_started.md) to get started. + ## How to request a Premium API If you’re an Anthology client or a partner in Bronze level or above, @@ -24,15 +32,3 @@ Partner or a third-party developer interested in our Premium APIs, we offer a variety of partnership levels in the [Anthology Partnership Program](https://www.blackboard.com/partnerships/become-a-partner). Once you upgrade your partnership level, please [submit a Behind the Blackboard ticket](https://blackboard.secure.force.com/). - -## Our Premium APIs - -### Ultra Extension Framework - -UEF is a set of Premium APIs that augment the Ultra experience of -Learn. We designed a robust set of capabilities such as -telemetry, help provider registration, and UI element rendering to -enable better integrations and richer user experience. -Take a look at [First steps with UEF](./uef/uef_getting_started.md) to get started. - - diff --git a/docs/rest-apis/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md b/docs/blackboard/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md similarity index 97% rename from docs/rest-apis/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md rename to docs/blackboard/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md index a45d71cbf..626d6e2ac 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md +++ b/docs/blackboard/premium-apis/uef/tutorials/communication_page_lvl_analytics-id.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - ## Introduction This enhancement to the UEF integration allows the framework to know if an analytics-id exists (or not) on the page, so should partners want to add functionality onto a page based on an elements visibility they are sure of the object they want to target. @@ -114,5 +112,3 @@ IntegrationPageAnalytics ### Const: 1. ANALYTICS_VISIBLE_TYPE = 'analytics:visible'; - - diff --git a/docs/rest-apis/premium-apis/uef/tutorials/configure-uef.md b/docs/blackboard/premium-apis/uef/tutorials/configure-uef.md similarity index 97% rename from docs/rest-apis/premium-apis/uef/tutorials/configure-uef.md rename to docs/blackboard/premium-apis/uef/tutorials/configure-uef.md index b1e94c0c0..aa3e6fc3a 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/configure-uef.md +++ b/docs/blackboard/premium-apis/uef/tutorials/configure-uef.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - The Ultra Extension Framework (UEF) encompasses a broad array of features and functionality, and as such, each UEF-enabled integration will have its own specific configuration settings. However, the setup process followed by a Learn System Administrator leverages existing standard configuration workflows already in place. Adding a UEF-enabled integration to a Learn environment requires a System Admin to make configuration changes to one or more of the following areas: **REST API Integrations**: UEF-enabled integrations will need to be added as a REST API integration [Administrator Panel ⇨ REST API Integrations ⇨ Create Integration]. @@ -49,5 +47,3 @@ The Tool Provider Key and Tool Provider Secret would be the ones given by the de Cross-Origin Resource Sharing: For UEF-enabled integrations that make direct calls to their Learn instance's REST API will need be be configured via the Cross-Origin Resource Sharing (CORS) tool [Administrator Panel ⇨ Cross-Origin Resource Sharing ⇨ Create Configuration]. Cross Origin Resource Sharing Configuration - - diff --git a/docs/rest-apis/premium-apis/uef/tutorials/lti-to-uef-tutorial.md b/docs/blackboard/premium-apis/uef/tutorials/lti-to-uef-tutorial.md similarity index 99% rename from docs/rest-apis/premium-apis/uef/tutorials/lti-to-uef-tutorial.md rename to docs/blackboard/premium-apis/uef/tutorials/lti-to-uef-tutorial.md index e3e44b2a4..fa2e9c668 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/lti-to-uef-tutorial.md +++ b/docs/blackboard/premium-apis/uef/tutorials/lti-to-uef-tutorial.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - In this tutorial, we will be taking a basic Hello World LTI tool, and through various steps, create an Ultra Extension Framework integration, that opens a panel when a particular content item is clicked, and provides a button that allows the user to communicate back to Ultra to request that the panel be closed. We will be using Python 3 and Flask for this exercise, but most of the work is done in Javascript that can be used with any language. @@ -220,5 +218,3 @@ Cool, right? But let's put the finishing touches on this thing. We might need da I hope you found that fun and enlightening. As always, if you have questions, comments, or concerns, reach out to us at [developers@anthology.com](mailto:developers@anthology.com) and let us know! -Happy Coding - - diff --git a/docs/rest-apis/premium-apis/uef/tutorials/lti_launch_context_added.md b/docs/blackboard/premium-apis/uef/tutorials/lti_launch_context_added.md similarity index 95% rename from docs/rest-apis/premium-apis/uef/tutorials/lti_launch_context_added.md rename to docs/blackboard/premium-apis/uef/tutorials/lti_launch_context_added.md index 17a47fbb6..ec7d7aae8 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/lti_launch_context_added.md +++ b/docs/blackboard/premium-apis/uef/tutorials/lti_launch_context_added.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - ## Introduction This enhancement to the UEF integration framework provides the ability for an integration to send a newEvent **lti:launch** even when the route is directed to new window launch from the LTI service, which inclujdes toolHref (launchUrl) and the placementId along with it. @@ -58,5 +56,3 @@ As expected the LTI launch in a new window will have the new mentioned events an ``` ![LTI launch context added](/assets/img/lti_launch_context_added_1.png) - - diff --git a/docs/rest-apis/premium-apis/uef/tutorials/security-and-tokens.md b/docs/blackboard/premium-apis/uef/tutorials/security-and-tokens.md similarity index 99% rename from docs/rest-apis/premium-apis/uef/tutorials/security-and-tokens.md rename to docs/blackboard/premium-apis/uef/tutorials/security-and-tokens.md index e3e3877b9..4b5444e03 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/security-and-tokens.md +++ b/docs/blackboard/premium-apis/uef/tutorials/security-and-tokens.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Using the Ultra Extension Framework (UEF) is a powerful way to enhance the way students learn and teachers teach. The framework itself is pretty easy to use. As with most integration types, the biggest hurdle is figuring out the proper method of authenticating your tool and authorizing its use. The purpose of this document is to shed some light on this process in the hopes that it will help you get building your code faster. This document makes a few assumptions. @@ -159,5 +157,3 @@ Assuming the scopes provided allow you access to the events you are subscribing ### Tips and Tricks The best tip we can give is that all of the communication happens in the browser, so if you are having trouble with the javascript, using console.log() will print messages to the javascript console in the Chrome or Firefox developer tools. In addition, you can click things in the Ultra UI and see interactions in the Network tab of those same developer tools. This helps you identify the routeName for route events or the analyticsId in click events. These are how your application knows where they user is and what they are doing so you can insert your functionality in the right place. - - diff --git a/docs/rest-apis/premium-apis/uef/tutorials/tutorials-course-leftnav.md b/docs/blackboard/premium-apis/uef/tutorials/tutorials-course-leftnav.md similarity index 94% rename from docs/rest-apis/premium-apis/uef/tutorials/tutorials-course-leftnav.md rename to docs/blackboard/premium-apis/uef/tutorials/tutorials-course-leftnav.md index 7bde22604..c5ce13d28 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/tutorials-course-leftnav.md +++ b/docs/blackboard/premium-apis/uef/tutorials/tutorials-course-leftnav.md @@ -7,17 +7,15 @@ published: "2023-10-10" edited: "2023-10-10" --- - - ### Overview We've had a lot of requests asking about how to add an LTI launch to an Ultra course's left navigation (Details & Actions). If you have that question, this page is for you. ### Prerequisites -1. The Group your application is in must be UEF enabled. If it's not, file a Behind the Blackboard Support ticket. Provide the developer email address and the Group your UEF application will be in, NOT the application ID. The application ID is usless informaiton for this. If you are a vendor, you must have a Partnership level that is Bronze or higher. See See [Become a Blackboard Partner](../../../../partners/become-a-partner.md). +1. The Group your application is in must be UEF enabled. If it's not, file a Behind the Blackboard Support ticket. Provide the developer email address and the Group your UEF application will be in, NOT the application ID. The application ID is usless informaiton for this. If you are a vendor, you must have a Partnership level that is Bronze or higher. See See [Become a Blackboard Partner](/docs/partners/become-a-partner.md). -2. Complete the [Ultra Extension Framework](/docs/rest-apis/premium-apis/uef/tutorials/tutorials.md) tutorial. +2. Complete the [Ultra Extension Framework](/docs/blackboard/premium-apis/uef/tutorials/tutorials.md) tutorial. 3. You know the handle of the managed placement for your LTI tool that you want the click on the link in the left nav to launch. You can find this by going to the Learn admin page, opening the LTI tools, looking at your tool's managed placements, click edit on the one you want, and copy the handle. You'll see where this is used in the code in number six of the explanation below. @@ -146,6 +144,4 @@ function renderPanelContents(message) { ### Notice -Before releasing a UEF integration, that uses the UEF Premium APIs, to production you will be required to meet a certain level of Blackboard Partnership. See [Become a Blackboard Partner](../../../../partners/become-a-partner.md). - - +Before releasing a UEF integration, that uses the UEF Premium APIs, to production you will be required to meet a certain level of Blackboard Partnership. See [Become a Blackboard Partner](/docs/partners/become-a-partner.md). diff --git a/docs/rest-apis/premium-apis/uef/tutorials/tutorials.md b/docs/blackboard/premium-apis/uef/tutorials/tutorials.md similarity index 95% rename from docs/rest-apis/premium-apis/uef/tutorials/tutorials.md rename to docs/blackboard/premium-apis/uef/tutorials/tutorials.md index 37558cbde..819dae640 100644 --- a/docs/rest-apis/premium-apis/uef/tutorials/tutorials.md +++ b/docs/blackboard/premium-apis/uef/tutorials/tutorials.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - You will find these tutorials very helpful as you start your Ultra Extension Framework (UEF) developement. #### How To Ultra Extension Framework - Scott Hurrey DevCon 2020 @@ -34,5 +32,3 @@ Add a course banner. [See this tutorial/demo video](https://youtu.be/pxddXC-I4UI ### Notice Before releasing a UEF integration, that uses the UEF Premium APIs, to production you will be required to meet a certain level of Blackboard Partnership. See [Become a Blackboard Partner](../../../../partners/become-a-partner.md). - - diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/downloads/demo-integration.zip b/docs/blackboard/premium-apis/uef/uef-documentation/downloads/demo-integration.zip similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/downloads/demo-integration.zip rename to docs/blackboard/premium-apis/uef/uef-documentation/downloads/demo-integration.zip diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/images/create_integration.png b/docs/blackboard/premium-apis/uef/uef-documentation/images/create_integration.png similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/images/create_integration.png rename to docs/blackboard/premium-apis/uef/uef-documentation/images/create_integration.png diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/images/create_placement.png b/docs/blackboard/premium-apis/uef/uef-documentation/images/create_placement.png similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/images/create_placement.png rename to docs/blackboard/premium-apis/uef/uef-documentation/images/create_placement.png diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/images/integration_workflow.png b/docs/blackboard/premium-apis/uef/uef-documentation/images/integration_workflow.png similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/images/integration_workflow.png rename to docs/blackboard/premium-apis/uef/uef-documentation/images/integration_workflow.png diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/images/manage_placements.png b/docs/blackboard/premium-apis/uef/uef-documentation/images/manage_placements.png similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/images/manage_placements.png rename to docs/blackboard/premium-apis/uef/uef-documentation/images/manage_placements.png diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/images/portal_workflow.png b/docs/blackboard/premium-apis/uef/uef-documentation/images/portal_workflow.png similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/images/portal_workflow.png rename to docs/blackboard/premium-apis/uef/uef-documentation/images/portal_workflow.png diff --git a/docs/rest-apis/premium-apis/uef/uef-documentation/images/register_provider_domain.png b/docs/blackboard/premium-apis/uef/uef-documentation/images/register_provider_domain.png similarity index 100% rename from docs/rest-apis/premium-apis/uef/uef-documentation/images/register_provider_domain.png rename to docs/blackboard/premium-apis/uef/uef-documentation/images/register_provider_domain.png diff --git a/docs/rest-apis/premium-apis/uef/uef_getting_started.md b/docs/blackboard/premium-apis/uef/uef_getting_started.md similarity index 97% rename from docs/rest-apis/premium-apis/uef/uef_getting_started.md rename to docs/blackboard/premium-apis/uef/uef_getting_started.md index f7a5b030d..d2abcc5dd 100644 --- a/docs/rest-apis/premium-apis/uef/uef_getting_started.md +++ b/docs/blackboard/premium-apis/uef/uef_getting_started.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - ## Introducing Learn's Ultra Extension Framework We’re excited to introduce a new means of integration with the Learn Ultra Experience, known as the Ultra Extension Framework (UEF). The UEF is a set of Premium APIs that augment the Ultra experience of Learn with a robust set of capabilities including telemetry, help provider registration, and UI element rendering - all designed to enable better integrations and richer user experience. @@ -43,5 +41,3 @@ We gave several partners early access to the UEF. The following videos are examp If you are a developer and interested in pursuing use of the UEF Premium APIs in your integration with the Learn Ultra Experience, what are your next steps? Send an email to BbPartnerTeam with the subject "Interested in Partnership That Includes Premium API Access." Ask for time to discuss such with a member of our partnership team. Note that if you are a partner with a partnership-level of Bronze or higher, or you are a client, then you can simply file a Behind the Blackbaord ticket requesting UEF access. In the ticket include the email used to register the REST application, and the name of the group where you will place applications that you want UEF enabled. Check back here often as this page will be updated frequently with more details. - - diff --git a/docs/blackboard/premium-apis/what-are-they.md b/docs/blackboard/premium-apis/what-are-they.md new file mode 100644 index 000000000..48c9d2568 --- /dev/null +++ b/docs/blackboard/premium-apis/what-are-they.md @@ -0,0 +1,9 @@ +--- +title: Service Maintenances and Releases +id: maintenance-page +sidebar_position: 1 +hide_table_of_contents: true +published: "2024-07-26" +edited: "2024-07-26" +author: Sebastian Silva +--- diff --git a/docs/rest-apis/learn/advanced/merge-and-crosslist-courses.md b/docs/blackboard/rest-apis/advanced/[review]merge-and-crosslist-courses.md similarity index 96% rename from docs/rest-apis/learn/advanced/merge-and-crosslist-courses.md rename to docs/blackboard/rest-apis/advanced/[review]merge-and-crosslist-courses.md index d1da2a34b..e15980dce 100644 --- a/docs/rest-apis/learn/advanced/merge-and-crosslist-courses.md +++ b/docs/blackboard/rest-apis/advanced/[review]merge-and-crosslist-courses.md @@ -7,8 +7,6 @@ edited: "" author: Ryan Haber --- - - ### Overview Your institution often needs to manage many courses or sections together. The @@ -59,5 +57,3 @@ To identify the children courses of a course: To get a list of all the courses merged with a particular course, regardless of which are children and which is the parent, make a GET request to /learn/api/public/v1/courses/{courseId}/crossListSet. - - diff --git a/docs/rest-apis/learn/advanced/ultra-assignments.md b/docs/blackboard/rest-apis/advanced/[review]ultra-assignments.md similarity index 97% rename from docs/rest-apis/learn/advanced/ultra-assignments.md rename to docs/blackboard/rest-apis/advanced/[review]ultra-assignments.md index 2aa6e2912..bbcf30007 100644 --- a/docs/rest-apis/learn/advanced/ultra-assignments.md +++ b/docs/blackboard/rest-apis/advanced/[review]ultra-assignments.md @@ -7,8 +7,6 @@ edited: "" author: Ryan Haber --- - - ### Overview Learn Ultra experience offers a REST API for managing assessments. @@ -79,5 +77,3 @@ returns the ID and title of questions if the request succeeds because only those fields are included in the success response object. The method returns status and message if the request fails because only those fields are included in the error response object. - - diff --git a/docs/rest-apis/learn/learn-app/bbapp-students-launch-schema.md b/docs/blackboard/rest-apis/advanced/bbapp-students-launch-schema.md similarity index 99% rename from docs/rest-apis/learn/learn-app/bbapp-students-launch-schema.md rename to docs/blackboard/rest-apis/advanced/bbapp-students-launch-schema.md index 0c2dade47..400e7a47c 100644 --- a/docs/rest-apis/learn/learn-app/bbapp-students-launch-schema.md +++ b/docs/blackboard/rest-apis/advanced/bbapp-students-launch-schema.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - You can link into the Blackboard app from other applications. With deep linking, a uniform resource identifier (URI) links to a specific location within the mobile app rather than simply launching the app. Use the provided schemas to link to specific features in the Blackboard app. > **Note**: _the app-to-app launch schema changed from the bbstudent:// prefix to the blackboard:// prefix in June, 2017. Please be sure your schema is updated. This functionality is not available for the Blackboard Instructor app._ @@ -436,5 +434,3 @@ You can link into the Blackboard app from other applications. With deep linking, - [folder_id] is the folder id of the content folder **Version**: "Blackboard 3.2+" - - diff --git a/docs/rest-apis/learn/advanced/bbml.md b/docs/blackboard/rest-apis/advanced/bbml.md similarity index 99% rename from docs/rest-apis/learn/advanced/bbml.md rename to docs/blackboard/rest-apis/advanced/bbml.md index ea5f44559..ebed31c1e 100644 --- a/docs/rest-apis/learn/advanced/bbml.md +++ b/docs/blackboard/rest-apis/advanced/bbml.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - ### Overview BbML is a subset of HTML. The parameters of some methods accept BbML-formatted @@ -397,5 +395,3 @@ Notes: 2. `title` is the description of the video. 3. `alt` is the alt text of the image. 4. It is beyond the scope of this document to describe the collab service api. - - diff --git a/docs/rest-apis/learn/advanced/contenthandler-datatypes.md b/docs/blackboard/rest-apis/advanced/contenthandler-datatypes.md similarity index 98% rename from docs/rest-apis/learn/advanced/contenthandler-datatypes.md rename to docs/blackboard/rest-apis/advanced/contenthandler-datatypes.md index e44de3a7a..668f557bf 100644 --- a/docs/rest-apis/learn/advanced/contenthandler-datatypes.md +++ b/docs/blackboard/rest-apis/advanced/contenthandler-datatypes.md @@ -7,8 +7,6 @@ edited: "" author: Ryan Haber --- - - Learn's `/contents` endpoints accommodate different types of content by using different handlers. Use the contentHandler field of requests and responses to indicate which content handler should be used. Available @@ -113,5 +111,3 @@ Representation of a file uploaded to course content. - id (string, read-only) of the object in Learn - gradeColumnId (string, read only) ID of the associated grade column - groupContent (boolean) specifies whether or not the content is group content. - - diff --git a/docs/rest-apis/learn/advanced/dynamic-rendering-with-template-variables.md b/docs/blackboard/rest-apis/advanced/dynamic-rendering-with-template-variables.md similarity index 99% rename from docs/rest-apis/learn/advanced/dynamic-rendering-with-template-variables.md rename to docs/blackboard/rest-apis/advanced/dynamic-rendering-with-template-variables.md index 32dd9d071..cc81c499c 100644 --- a/docs/rest-apis/learn/advanced/dynamic-rendering-with-template-variables.md +++ b/docs/blackboard/rest-apis/advanced/dynamic-rendering-with-template-variables.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - Using template variables you can create URLs to integrate with other systems by including information about the user's context. Template variables are represented by a series of values given the special syntax: @X@object.attribute@X@. These variables are expanded when rendered into their corresponding values. Within the UI, they can be used in portal modules and within the body of content items in courses. @@ -52,5 +50,3 @@ Note that not all of these variables will resolve on all pages. For example, if | Request return URL | @X@request.return@X@ | | System host name | @X@system.site_id@X@ | | Raw course id | @X@course.raw_course_id@X@ | Returns the course.getCourseId() for the current course ignoring the rule that a student is supposed to see the id of the course they are actually enrolled in. Effectively gives the parent course ID to a student LTI launch from the parent of a cross listed corse, not the child section course ID the are enrolled in. | - - diff --git a/docs/rest-apis/learn/advanced/soap-to-rest-mapping.md b/docs/blackboard/rest-apis/advanced/soap-to-rest-mapping.md similarity index 99% rename from docs/rest-apis/learn/advanced/soap-to-rest-mapping.md rename to docs/blackboard/rest-apis/advanced/soap-to-rest-mapping.md index 2d03477de..fcd7bf744 100644 --- a/docs/rest-apis/learn/advanced/soap-to-rest-mapping.md +++ b/docs/blackboard/rest-apis/advanced/soap-to-rest-mapping.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - The purpose of this document is to provide a mapping from SOAP Web Service calls to REST API Endpoints. This is meant to be a quick-start guide to the migration process. With SOAP being deprecated in the near term future and @@ -258,5 +256,3 @@ and check the individual endpoints you need. | Load a Setting | UtilWS.loadSetting() | N/A | | Update a Setting | UtilWS.saveSetting() | N/A | | Delete a Setting | UtilWS.deleteSetting() | N/A | - - diff --git a/docs/rest-apis/apis-intro.md b/docs/blackboard/rest-apis/apis-intro.md similarity index 95% rename from docs/rest-apis/apis-intro.md rename to docs/blackboard/rest-apis/apis-intro.md index cb6caab0d..31d735860 100644 --- a/docs/rest-apis/apis-intro.md +++ b/docs/blackboard/rest-apis/apis-intro.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Many Anthology products offer integration capabilities through the use of RESTful APIs. These products are listed to the left under **REST APIs**. We expect this list to grow over time so check in frequently! ## What are RESTful APIs? @@ -30,5 +28,3 @@ There are several reasons why RESTful APIs are important: **Security**: RESTful APIs can be secured using various authentication mechanisms such as OAuth and SSL/TLS. This ensures that the data being transmitted is secure and only accessible to authorized users. Overall, RESTful APIs provide a simple and effective way to expose data and services over the web, making them an important tool for modern software development. - - diff --git a/docs/blackboard/rest-apis/best-practices.md b/docs/blackboard/rest-apis/best-practices.md new file mode 100644 index 000000000..0d4903f9c --- /dev/null +++ b/docs/blackboard/rest-apis/best-practices.md @@ -0,0 +1,57 @@ +--- +title: "Best Practices" +id: rest-api-best-practices +sidebar_position: 2 +published: "2023-10-11" +edited: "2023-10-11" +author: Davey Herrera, Mark O'Neil +--- + +## General Best Practices + +- Learn System Administrators should be enrolled in courses only using a non-Admin enabled user. + + - System Administrator information is generally only available to 3LO Administrator requests. + +- Always monitor your API usage using the x-header information returned on non-oauth requests + + - Details on rate_limits and x-headers are available [here](/docs/developer-portal/production-groups-rest-api-and-site-reg-limits.md). + +- Not all data operations are best done Just-In-Time (JIT). + Some operations, such as backfilling data warehouses or refreshing caches are best done during off-peak Learn hours. + + - JIT calling or repeatedly calling for the same "static" data is inefficient. + - Checking whether a student is still in a course or getting their course grades are reasonable JIT activities as that is data that may change between now and their last access. + +- Cache infrequently changed or “static” data and refresh periodically. + + - This reduces repetitive calls. + - This reduces integration performance impact. + - Don’t JIT retrieve ALL Courses for example as that data changes infrequently. Instead do this once and then periodically retrieve course data created or modified since you last request. + +- Always "optimize" your requests. + + - reduce your “search” criteria to as small a set of data as possible. + - This limits the number of pages of returned data set. + - E.g. use `?dataSourceId=` to reduce your search to objects created using a specific DSK and follow caching practices. + - Use the fields parameter to reduce the returned data set to only data points you require. + - This limits the data transmitted and system load + +- Always try to logically bound your requests or before acting on request results: + + - Check if dates are within bounds + - Check if attempts exist of if items are graded + - Check availability + +- Do not use Collection Gets to test for a specific object. + + E.g.: don't use `GET /learn/api/public/v1/courses/{courseId}/users` to get all the course memberships to test if a student is enrolled. + + Instead use: `GET /learn/api/public/v1/courses/{courseId}/users/{userId}` and branch your code based on the result. + +## Best Practices per Product and API + +| Learn | +| ------------------------------------------------------------------ | +| \* [Calendar](/docs/blackboard/rest-apis/hands-on/calendar-api.md) | +| \* [Gradebook](/docs/blackboard/rest-apis/hands-on/gradebook.md) | diff --git a/docs/rest-apis/learn/examples/curl-attachments-demo.md b/docs/blackboard/rest-apis/demo-code/accessing-content-attachments-with-cURL.md similarity index 99% rename from docs/rest-apis/learn/examples/curl-attachments-demo.md rename to docs/blackboard/rest-apis/demo-code/accessing-content-attachments-with-cURL.md index 87dc324e1..8080eb024 100644 --- a/docs/rest-apis/learn/examples/curl-attachments-demo.md +++ b/docs/blackboard/rest-apis/demo-code/accessing-content-attachments-with-cURL.md @@ -6,7 +6,6 @@ published: "" edited: "" author: Mark O'Neil --- - The Learn REST API supports accessing Content Item information and URLs for downloading content attachments. @@ -497,5 +496,3 @@ Rinse-repeat for additional folder or document content items. ## Uploading files to content You can do so by following this guide: https://docs.anthology.com/docs/rest-apis/learn/advanced/rest_apis-learn-advanced-bbml#uploaded-files ![image](https://user-images.githubusercontent.com/2322778/158894421-3eaf4125-ff17-4bff-8a1f-55d10101e30e.png) - - diff --git a/docs/rest-apis/learn/examples/csharp-demo.md b/docs/blackboard/rest-apis/demo-code/csharp.md similarity index 98% rename from docs/rest-apis/learn/examples/csharp-demo.md rename to docs/blackboard/rest-apis/demo-code/csharp.md index 9c7e6fd98..9f29e84ba 100644 --- a/docs/rest-apis/learn/examples/csharp-demo.md +++ b/docs/blackboard/rest-apis/demo-code/csharp.md @@ -6,7 +6,6 @@ published: "" edited: "" author: Scott Hurrey --- - The rest demo script demonstrates authenticating a REST application, management and use of the authorization token, and creating, updating, @@ -16,7 +15,7 @@ discovering, and deleting supported Learn objects - You must [register a developer account and application](/rest-apis/learn/Getting Started/registry) in the Developer Portal - You must - [register your application](/docs/rest-apis/learn/admin/rest-and-learn.md) in Learn + [register your application](/docs/blackboard/rest-apis/getting-started/rest-and-learn.md) in Learn - You must also configure the script as outlined in the README for the project ### Overview @@ -44,14 +43,14 @@ This help topic assumes the Developer: - is familiar with C# - has installed Microsoft Visual Studio - has obtained a copy of the [source code](https://github.com/blackboard/BBDN-REST-Demo-CSharp) and built it in conjunction with the project [README.md](https://github.com/blackboard/BBDN-REST-Demo-CSharp/blob/master/README.md) file. -- has a REST-enabled Learn instance, like the [Developer AMI](/docs/rest-apis/learn/sandbox/developer-ami.md). +- has a REST-enabled Learn instance, like the [Developer AMI](developer-ami.md). ### Code Walkthrough To build an integration with the Learn REST Web Services, regardless of the programming language of choice, can really be summed up in two steps: -1. Use the Application Key and Secret to obtain an OAuth 2.0 access token, as described in the [Basic Authentication](/docs/rest-apis/learn/getting-started/basic-authentication.md) document. +1. Use the Application Key and Secret to obtain an OAuth 2.0 access token, as described in the [Basic Authentication](/docs/blackboard/rest-apis/getting-started/basic-authentication.md) document. 2. Call the appropriate REST endpoint with the appropriate data to perform the appropriate action. #### Authorization and Authentication @@ -691,5 +690,3 @@ REST Demo C# application available on There is a README.html included that talks more specifically about building and running the code. Feel free to review the code and run it against a test or development Learn instance to see how it works. - - diff --git a/docs/rest-apis/learn/examples/curl-demo.md b/docs/blackboard/rest-apis/demo-code/curl.md similarity index 99% rename from docs/rest-apis/learn/examples/curl-demo.md rename to docs/blackboard/rest-apis/demo-code/curl.md index fd65b7a31..212d87756 100644 --- a/docs/rest-apis/learn/examples/curl-demo.md +++ b/docs/blackboard/rest-apis/demo-code/curl.md @@ -6,7 +6,6 @@ published: "" edited: "" author: Mark Kauffman --- - ## Introduction @@ -46,14 +45,14 @@ make a complete set of CRUD operations to the Learn REST endpoints. This help topic assumes the Developer: - is familiar with cURL. -- has a REST-enabled [Learn instance](../sandbox/developer-ami.md). +- has a REST-enabled [Learn instance](developer-ami.md). ### Walkthrough To build an integration with the Learn REST Web Services, regardless of the programming language of choice, can really be summed up in two steps: -1. Use the Application Key and Secret to obtain an **OAuth 2.0 access token**, as described in the [Basic Authentication](../getting-started/basic-authentication.md) document. +1. Use the Application Key and Secret to obtain an **OAuth 2.0 access token**, as described in the [Basic Authentication](/docs/blackboard/rest-apis/getting-started/basic-authentication.md) document. **OR** @@ -571,7 +570,7 @@ columns/_129_1/users/_66_1 ### ACCESS CONTENT -- See [Access Content Attachments](curl-attachments-demo.md) +- See [Access Content Attachments](accessing-content-attachments-with-cURL.md) ### COURSE COPY @@ -922,5 +921,3 @@ take these cURL commands and use them to make all of the REST calls documented here: [Explore APIs](https://developer.anthology.com/portal/displayApi). - You must [register a developer account and application](/docs/developer-portal/dev-portal-start-here.md) in the Developer Portal - - diff --git a/docs/rest-apis/learn/examples/golang-demo.md b/docs/blackboard/rest-apis/demo-code/golang.md similarity index 86% rename from docs/rest-apis/learn/examples/golang-demo.md rename to docs/blackboard/rest-apis/demo-code/golang.md index 95a808347..5b4add417 100644 --- a/docs/rest-apis/learn/examples/golang-demo.md +++ b/docs/blackboard/rest-apis/demo-code/golang.md @@ -7,12 +7,8 @@ edited: "" author: Scott Hurrey --- - - In August 2016, our friends at [AllTheDucks](https://www.alltheducks.com) presented on their work integrating with the Learn REST APIs using [Golang](https://golang.org). Following DevCon ANZ, the Ducks were kind enough to open source their project and write a blog to help developers learn the Golang REST Application they wrote. The blog can be found [here](https://www.alltheducks.com/blog/using-the-learn-rest-api-from-golang). - - diff --git a/docs/rest-apis/learn/examples/java-demo.md b/docs/blackboard/rest-apis/demo-code/java.md similarity index 98% rename from docs/rest-apis/learn/examples/java-demo.md rename to docs/blackboard/rest-apis/demo-code/java.md index fea0e4a05..881b97587 100644 --- a/docs/rest-apis/learn/examples/java-demo.md +++ b/docs/blackboard/rest-apis/demo-code/java.md @@ -7,11 +7,9 @@ edited: "" author: Scott Hurrey --- - - The rest demo script demonstrates authenticating a REST application, management and use of the authorization token, and creating, updating, -discovering, and deleting supported Learn objects. For a more complete tutorial, check out this [page](/docs/rest-apis/learn/examples/java-command-line.md) to walkthrough building a Java command-line application. +discovering, and deleting supported Learn objects. For a more complete tutorial, check out this [page](rest-api-with-java-command-line.md) to walkthrough building a Java command-line application. ### Prerequisites @@ -509,5 +507,3 @@ REST Demo Java Webapp application available on [GitHub](https://github.com/blackboard/BBDN-REST-Demo-Java-Webapp). There is a README.html included that talks more specifically about building and running the code. Feel free to review the code and run it against a test or development Learn instance to see how it works. - - diff --git a/docs/rest-apis/learn/examples/php-demo.md b/docs/blackboard/rest-apis/demo-code/php.md similarity index 99% rename from docs/rest-apis/learn/examples/php-demo.md rename to docs/blackboard/rest-apis/demo-code/php.md index 74a0624b9..be16ba807 100644 --- a/docs/rest-apis/learn/examples/php-demo.md +++ b/docs/blackboard/rest-apis/demo-code/php.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - The rest demo script demonstrates authenticating a REST application, management and use of the authorization token, and creating, updating, discovering, and deleting supported Learn objects. @@ -792,5 +790,3 @@ REST Demo PHP application available on There is a README.html included that talks more specifically about building and running the code. Feel free to review the code and run it against a test or development Learn instance to see how it works. - - diff --git a/docs/rest-apis/learn/examples/python-demo.md b/docs/blackboard/rest-apis/demo-code/python.md similarity index 99% rename from docs/rest-apis/learn/examples/python-demo.md rename to docs/blackboard/rest-apis/demo-code/python.md index 2d74aacc4..d51bc5257 100644 --- a/docs/rest-apis/learn/examples/python-demo.md +++ b/docs/blackboard/rest-apis/demo-code/python.md @@ -7,8 +7,6 @@ edited: "" author: Mark O'Neil --- - - The rest demo script demonstrates authenticating a REST application, management and use of the authorization token, and creating, updating, discovering, and deleting supported Learn objects. @@ -439,5 +437,3 @@ REST Demo Python command line application available on There is a README.html included that talks more specifically running the code. Feel free to review the code and run it against a test or development Learn instance to see how it works. - - diff --git a/docs/rest-apis/learn/examples/java-command-line.md b/docs/blackboard/rest-apis/demo-code/rest-api-with-java-command-line.md similarity index 99% rename from docs/rest-apis/learn/examples/java-command-line.md rename to docs/blackboard/rest-apis/demo-code/rest-api-with-java-command-line.md index 291cef2e6..87287982f 100644 --- a/docs/rest-apis/learn/examples/java-command-line.md +++ b/docs/blackboard/rest-apis/demo-code/rest-api-with-java-command-line.md @@ -6,7 +6,6 @@ published: "" edited: "" author: Scott Hurrey --- - The purpose of this document is to allow a developer to walk through the REST Workshop from DevCon 2016. Please note that this sample code was built and @@ -16,7 +15,7 @@ agnostic, but it has not been tested on Windows. In order to begin this tutorial, there are a few pre-requisites that are assumed to be in place: -- User has installed and started the latest [Developer AMI](/docs/rest-apis/learn/sandbox/developer-ami.md). +- User has installed and started the latest [Developer AMI](developer-ami.md). - User has installed and configured [GIT](https://git-scm.com/downloads). - User has cloned the [repository](https://github.com/blackboard/BBDN-DevCon-REST-Workshop) to their local working directory. - User has Java 11 installed and configured to JAVA_HOME. @@ -777,5 +776,3 @@ users, and memberships. Along the way, we learned how to institute OAuth, create HTTP messages and interact with the Learn REST APIs, how to use Jackson to serialize and deserialize objects, and how to use Gradle to build and run command line Java applications. - - diff --git a/docs/rest-apis/learn/examples/ruby-demo.md b/docs/blackboard/rest-apis/demo-code/ruby.md similarity index 99% rename from docs/rest-apis/learn/examples/ruby-demo.md rename to docs/blackboard/rest-apis/demo-code/ruby.md index 7ee254448..efe51aec4 100644 --- a/docs/rest-apis/learn/examples/ruby-demo.md +++ b/docs/blackboard/rest-apis/demo-code/ruby.md @@ -7,8 +7,6 @@ edited: "" author: Scott Hurrey --- - - The rest demo script demonstrates authenticating a REST application, management and use of the authorization token, and creating, updating, discovering, and deleting supported Learn objects. @@ -444,5 +442,3 @@ REST Demo Ruby application available on There is a README.html included that talks more specifically about building and running the code. Feel free to review the code and run it against a test or development Learn instance to see how it works. - - diff --git a/docs/rest-apis/learn/getting-started/3lo.md b/docs/blackboard/rest-apis/getting-started/3lo.md similarity index 98% rename from docs/rest-apis/learn/getting-started/3lo.md rename to docs/blackboard/rest-apis/getting-started/3lo.md index 26025efde..e9625dfc9 100644 --- a/docs/rest-apis/learn/getting-started/3lo.md +++ b/docs/blackboard/rest-apis/getting-started/3lo.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - # Three-Legged OAuth One of the drawbacks associated with [Basic Authentication](basic-authentication.md) is that the application requires broad access, as the tool @@ -150,7 +148,5 @@ client that sent the authorization code request. ### Examples -- [Three-legged OAuth in Curl](../examples/curl-demo.md) +- [Three-legged OAuth in Curl](/docs/blackboard/rest-apis/demo-code/curl.md) - [BBDN-3LO-REST-Swift](https://github.com/blackboard/BBDN-3LO-REST-Swift) - - diff --git a/docs/rest-apis/learn/getting-started/basic-authentication.md b/docs/blackboard/rest-apis/getting-started/basic-authentication.md similarity index 98% rename from docs/rest-apis/learn/getting-started/basic-authentication.md rename to docs/blackboard/rest-apis/getting-started/basic-authentication.md index 81b79c11d..be6db8635 100644 --- a/docs/rest-apis/learn/getting-started/basic-authentication.md +++ b/docs/blackboard/rest-apis/getting-started/basic-authentication.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - ### Overview Authentication for REST Integrations follows the [OAuth 2.0 RFC Standard](https://tools.ietf.org/html/rfc6749). Each developer has a unique key and secret associated with each application they create. The developer makes an HTTP Post directly to the REST-enabled Learn server requesting an OAuth access token. The Learn instance forwards the request to Anthology's Developer Portal, adding its own siteId to the request so that the portal can determine whether the application is registered with the server. The Portal returns an authorization token that grants the application access to the Learn REST API for one hour. The developer uses this token in subsequent REST calls until the token expires. This workflow is illustrated in the following diagram: @@ -143,5 +141,3 @@ you. - Tokens are associated with a specific Learn site. - Any application may have only one token per Learn site. Asking for a token returns the existing one with an updated expiry time if it has not expired yet. - Check the [Learn REST API Documentation](https://developer.anthology.com/portal/displayApi/Learn) for error codes. - - diff --git a/docs/rest-apis/learn/getting-started/first-steps.md b/docs/blackboard/rest-apis/getting-started/first-steps.md similarity index 98% rename from docs/rest-apis/learn/getting-started/first-steps.md rename to docs/blackboard/rest-apis/getting-started/first-steps.md index 7d75fd5f9..2f4fc3409 100644 --- a/docs/rest-apis/learn/getting-started/first-steps.md +++ b/docs/blackboard/rest-apis/getting-started/first-steps.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - Anthology offers a suite of education technology tools, both software and hardware. REST stands for **Re**presentational **S**tate **T**ransfer. It is a lightweight, flexible web service architecture that allows HTTP commands to be @@ -51,7 +49,7 @@ registered Anthology developer. To register as a Anthology developer: 2. Provide your email address, a password, your first name and last, and select the checkbox to prove you are human. 3. Select **Create Account** and you're on your way. -For more information about the Developer Portal please see [this document](/rest-apis/learn/Getting Started/registry) +For more information about the Developer Portal please see [this document](/docs/developer-portal/dev-portal-start-here.md) **Note:** If you are an Anthology client, an Anthology Partner / Vendor / Developer of a REST Application should NEVER tell you to go to the developer portal and create an App ID with the associated key/secret to install their application. They should never tell you to apply for a Rate/Site increase for their application. Anthology DOES NOT support that model. Every REST Application developer should give you an App ID to install their REST App and tell you how to configure a system role for its use. Period. The REST Application developer needs to request the increases they need to run their application themselves. If they ask you to go to developer.anthology.com and get an App ID/Key/Secret, please tell them that is wrong. They should have exactly one App ID for their production REST application that they are asking you to install. @@ -108,7 +106,7 @@ Anthology makes available instances of Anthology applications that you can use to build projects that integrate with Anthology applications. Among others, we offer these popular developer instances. -- [AWS instance of Learn](/docs/rest-apis/learn/sandbox/developer-ami.md) +- [AWS instance of Learn](developer-ami.md) While Blackboard does not charge for entry-level use, AWS may charge various fees for their services. @@ -166,5 +164,3 @@ sure to check these links regularly. - [Developer Portal](https://developer.anthology.com/) - [REST Documentation](https://developer.anthology.com/portal/displayApi) - - diff --git a/docs/rest-apis/learn/getting-started/framework.md b/docs/blackboard/rest-apis/getting-started/framework.md similarity index 98% rename from docs/rest-apis/learn/getting-started/framework.md rename to docs/blackboard/rest-apis/getting-started/framework.md index 70ac274a8..ecbb918c3 100644 --- a/docs/rest-apis/learn/getting-started/framework.md +++ b/docs/blackboard/rest-apis/getting-started/framework.md @@ -7,7 +7,6 @@ author: Mark O'Neil published: "" edited: "" --- - Anthology's new REST API Framework is a giant step forward for integrating with Learn. By moving the integration from in-process code to a @@ -132,5 +131,3 @@ developers suite of applications to individual institution integrations at will be collecting data on usage which will be analyzed to determine Customer and third party developer production grade rate limits when the Technical Preview is lifted. - - diff --git a/docs/rest-apis/learn/getting-started/lti-or-rest.md b/docs/blackboard/rest-apis/getting-started/lti-or-rest.md similarity index 96% rename from docs/rest-apis/learn/getting-started/lti-or-rest.md rename to docs/blackboard/rest-apis/getting-started/lti-or-rest.md index 68aaa6f21..6f35a906d 100644 --- a/docs/rest-apis/learn/getting-started/lti-or-rest.md +++ b/docs/blackboard/rest-apis/getting-started/lti-or-rest.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - We are often asked questions like, "When should I use LTI and when should I use REST?" "What is the difference?" "What can I do with REST that I can't with LTI (or vise-versa)?" In this document we discuss the differences, the similarities, and how you can best design your integration with Learn using LTI, @@ -40,11 +38,11 @@ everything with Learn is done over HTTPS.) Anthology has developed and published ## LTI DISCUSSION -When talking about LTI, we use terms like launch, platform, and tool. A Learn administrator can set up your tool in Learn, following documentation that you provide. Anthology provides documentation applicable to any LTI tool on help.blackboard.com. Rather than reference a link that may change your best bet for finding such documentation is to use your favorite internet search engine and look for "Learn LTI documentation." I just did and the help page for our LTI documentation for admins was the top result! Once your LTI tool has been configured on a Learn system by the admin for that system, course instructors can then place links to your Tool in their courses. Search this site for LTI and you will find demonstrations and tutorials on LTI in Learn. The most common, and likley the best, way for and instructor to place content from your tool in their course is to use Deep-Linking 2.0. The point of this discussion is that once configured by the administrator, use of your tool and the content it provides looks like it is a part of Learn, including when the instructor is selecting content to be 'placed' in the course, and then when the student views and uses that content. And, using the LTI Advantage Names and Roles Provisioning Service (NPRS) and the Assignment and Grades Service (AGS), your tool can integrate closely with the course roster and the gradebook for the course. In summary, you can do a lot with LTI 1.3 & LTI Advantage, where the users of the LMS can use your web-application seamlessly from within the LMS and then with the aforementioned services even manipulate the course roster and gradebook. Get started with [this documentation](/docs/lti/getting-started-with-lti.md). +When talking about LTI, we use terms like launch, platform, and tool. A Learn administrator can set up your tool in Learn, following documentation that you provide. Anthology provides documentation applicable to any LTI tool on help.blackboard.com. Rather than reference a link that may change your best bet for finding such documentation is to use your favorite internet search engine and look for "Learn LTI documentation." I just did and the help page for our LTI documentation for admins was the top result! Once your LTI tool has been configured on a Learn system by the admin for that system, course instructors can then place links to your Tool in their courses. Search this site for LTI and you will find demonstrations and tutorials on LTI in Learn. The most common, and likley the best, way for and instructor to place content from your tool in their course is to use Deep-Linking 2.0. The point of this discussion is that once configured by the administrator, use of your tool and the content it provides looks like it is a part of Learn, including when the instructor is selecting content to be 'placed' in the course, and then when the student views and uses that content. And, using the LTI Advantage Names and Roles Provisioning Service (NPRS) and the Assignment and Grades Service (AGS), your tool can integrate closely with the course roster and the gradebook for the course. In summary, you can do a lot with LTI 1.3 & LTI Advantage, where the users of the LMS can use your web-application seamlessly from within the LMS and then with the aforementioned services even manipulate the course roster and gradebook. Get started with [this documentation](/docs/blackboard/lti/getting-started-with-lti.md). ## REST DISCUSSION -Given how much you can do with LTI, why REST APIs? Well, the LMS is also a web application and it can be represented by many different types of 'objects'. Users, courses, enrollments, calendars, announcements, content items, assignments, quizes, etc. If you want a complete view of the representation of a user or course member in Learn, you need to use our REST APIs because LTI is written to apply to all platforms, while each platform has it's own nuanced way of representing the different 'objects' in the system. For example a User in Learn has a uuuid identifier, an external ID, a datasource ID, a set of system role IDs, a URL for an avatar, etc. Some other LMS may or may not have these. LTI won't give you everything about a User object in Learn, REST APIs will. LTI may give you a subset. Another thing is that LTI doesn't cover things like creating a document in Learn, or pulling a list of all of the different types of content in a course, or creating, reading and deleting announcements. Here's a short-list of 'objects' you can read and manipulate in Learn with our REST APIs: Announcements, Attendance/meetings, Calendar, content (in the LMS) & attached files, Assessments, Course Categories, Course Groups, Course Memberships (LTI does have Names & Roles, REST give more information about the membership object), Course Messages, Courses, Data Sources, Institutional Hierarchy Nodes, LTI Placements, Course Roles, Institution Roles, System Roles, User Sessions, Terms, Users. You can get started building your REST Application with [this documentation](/docs/rest-apis/learn/getting-started/first-steps.md). +Given how much you can do with LTI, why REST APIs? Well, the LMS is also a web application and it can be represented by many different types of 'objects'. Users, courses, enrollments, calendars, announcements, content items, assignments, quizes, etc. If you want a complete view of the representation of a user or course member in Learn, you need to use our REST APIs because LTI is written to apply to all platforms, while each platform has it's own nuanced way of representing the different 'objects' in the system. For example a User in Learn has a uuuid identifier, an external ID, a datasource ID, a set of system role IDs, a URL for an avatar, etc. Some other LMS may or may not have these. LTI won't give you everything about a User object in Learn, REST APIs will. LTI may give you a subset. Another thing is that LTI doesn't cover things like creating a document in Learn, or pulling a list of all of the different types of content in a course, or creating, reading and deleting announcements. Here's a short-list of 'objects' you can read and manipulate in Learn with our REST APIs: Announcements, Attendance/meetings, Calendar, content (in the LMS) & attached files, Assessments, Course Categories, Course Groups, Course Memberships (LTI does have Names & Roles, REST give more information about the membership object), Course Messages, Courses, Data Sources, Institutional Hierarchy Nodes, LTI Placements, Course Roles, Institution Roles, System Roles, User Sessions, Terms, Users. You can get started building your REST Application with [this documentation](/docs/blackboard/rest-apis/getting-started/first-steps.md). ## REST AND LTI @@ -69,6 +67,4 @@ sure to check these links regularly. - [Developer Portal](https://developer.anthology.com/) - [REST Documentation](https://developer.anthology.com/portal/displayApi) - [LTI Documentation](https://www.imsglobal.org/activity/learning-tools-interoperability) -- [Learn & LTI Documentation](/docs/lti/getting-started-with-lti.md) - - +- [Learn & LTI Documentation](/docs/blackboard/lti/getting-started-with-lti.md) diff --git a/docs/rest-apis/learn/getting-started/mapping-entitlements-to-privileges.md b/docs/blackboard/rest-apis/getting-started/mapping-entitlements-to-privileges.md similarity index 97% rename from docs/rest-apis/learn/getting-started/mapping-entitlements-to-privileges.md rename to docs/blackboard/rest-apis/getting-started/mapping-entitlements-to-privileges.md index 5d2093d9c..41e3a9218 100644 --- a/docs/rest-apis/learn/getting-started/mapping-entitlements-to-privileges.md +++ b/docs/blackboard/rest-apis/getting-started/mapping-entitlements-to-privileges.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - If you are looking forward to map entitlements with privileges when integrating a new application with a Learn instance, you are in the right place! You probably saw this: - "/learn/api/public/v1/courses/{courseId}/meetings" or this "course.attendance.VIEW" @@ -81,5 +79,3 @@ And if you click your bookmark **while still on the privileges page** you should ![A screenshot of Learn privileges with entitlements](/assets/img/mapping-entitlements-to-privileges-3.png) > Make sure that the Show all privileges button was clicked first - - diff --git a/docs/rest-apis/learn/getting-started/releasing-your-integration.md b/docs/blackboard/rest-apis/getting-started/releasing-your-integration.md similarity index 97% rename from docs/rest-apis/learn/getting-started/releasing-your-integration.md rename to docs/blackboard/rest-apis/getting-started/releasing-your-integration.md index ba0e4b3f9..94f39fab3 100644 --- a/docs/rest-apis/learn/getting-started/releasing-your-integration.md +++ b/docs/blackboard/rest-apis/getting-started/releasing-your-integration.md @@ -8,8 +8,6 @@ published: "" edited: "" --- - - You have taken the time to build a great integration now there are a few steps that should be followed to ensure a successful product release. These fall into two categories: @@ -66,5 +64,3 @@ E.G: You needed to find the entitlements (from the API documentation) and the Pr - Providing the required Privileges to Learn Admins reduces the risk of a failure in integration installation and operation. Anthology nor you should want to burden clients with figuring out from the API Docs which Entitlements are needed and look up these Privileges on their own so that your application works as expected. - Following secure practices around key:secret management create a safer more secure www. - - diff --git a/docs/rest-apis/learn/admin/rest-and-learn.md b/docs/blackboard/rest-apis/getting-started/rest-and-learn.md similarity index 98% rename from docs/rest-apis/learn/admin/rest-and-learn.md rename to docs/blackboard/rest-apis/getting-started/rest-and-learn.md index 8ef372f3b..93b569763 100644 --- a/docs/rest-apis/learn/admin/rest-and-learn.md +++ b/docs/blackboard/rest-apis/getting-started/rest-and-learn.md @@ -7,8 +7,6 @@ edited: "" author: Mark O'Neil --- - - ### Overview of the REST API Integrations Tool For the other tasks related in this document, use the REST API Integrations. @@ -119,7 +117,7 @@ There are a number of ways to accomplish this. ### Delivering your REST Integration -For a more detailed process please see [Releasing your REST Integration](/docs/rest-apis/learn/getting-started/releasing-your-integration.md) +For a more detailed process please see [Releasing your REST Integration](/docs/blackboard/rest-apis/getting-started/releasing-your-integration.md) **Step 1:** NEVER USE OR REQUIRE SYSTEM ADMINISTRATOR as your REST application user. @@ -136,5 +134,3 @@ For a more detailed process please see [Releasing your REST Integration](/docs/r **Step 7:** Include information from Step 6 in your client facing documentation. _**Key takeaway:**_ Providing the required Privileges to Learn Admins reduces the risk of a failure in integration installation and operation. Anthology nor you should want to burden clients with figuring out from the API Docs which Entitlements are needed and look up these Privileges on their own so that your application works as expected. - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/rest-integrations-and-other-integrations.md b/docs/blackboard/rest-apis/getting-started/rest-integrations-and-other-integrations.md similarity index 96% rename from docs/rest-apis/learn/working-with-learn-apis/rest-integrations-and-other-integrations.md rename to docs/blackboard/rest-apis/getting-started/rest-integrations-and-other-integrations.md index 66ec0856b..2a1e8ba8f 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/rest-integrations-and-other-integrations.md +++ b/docs/blackboard/rest-apis/getting-started/rest-integrations-and-other-integrations.md @@ -7,21 +7,18 @@ edited: "2023-09-27" author: Mark Kauffman --- - - ## Introduction Let's say you have developed a RESTful API integration with Blackboard Learn. Now you have clients asking about the relationship between your REST Application and the several other mechanisms of integration with Blackboard Learn. This document provides the details. ### What is the relationship between my RESTFul Application and other integration mechanisms? + Blackboard Learn provides several mechanisms for integration with it to 3rd-party developers. Examples include the Learn implementation of the LTI 1.3 standard, the Learn implementation of the LIS 2.0 Data Integration standard, and the Learn REST APIs. None of these integration types will know anything about the configuration settings of a different integration type, ever. What is the impact of this in a real-world scenario? One example is that, built into Learn’s implementation of the LIS 2.0 Data Integration Standard is the ability for the Learn administrator to configure a special script, to create a new course from a template, that runs when an external vendor feeds in data for course creation. Ex: Admin>Data Integration>Student Information System Integrations>’LIS20 Integration’>Advanced Configuration>Courses>Field Mapping> Source Course Copy Key. Learn only runs this script for LIS 2.0 data feeds. The REST API implementation in Learn doesn’t know about this script that was set for the LIS 2.0 integration. The REST API course creation won’t cause the script to execute. This is how Learn works, and there’s nothing the 3rd-party integrator can do to make the integration systems built into Learn behave differently. This means then that if I, as a 3rd-party developer, have been using LIS 2.0 to create courses and relying on the Learn admin to set up a script in Learn’s LIS 2.0 Data Integration, and I want to switch to the REST API mechanism to create courses I cannot expect Learn’s LIS 2.0 script to run for the REST API create course, because Learn doesn’t do that. Instead, I will need to add code to my new RESTful application code that uses Learn’s REST integration mechanism, where the Learn admin can configure the template Source Course on my application server to replace what the Learn admin had been configuring in Blackboard Learn or find some other means of achieving the same. - ### Summary -Any given integration type in Learn will never automatically know anything about the configuration settings of a different integration type, ever. - +Any given integration type in Learn will never automatically know anything about the configuration settings of a different integration type, ever. diff --git a/docs/rest-apis/learn/admin/rest3LO-and-learnSSO.md b/docs/blackboard/rest-apis/getting-started/rest3LO-and-learnSSO.md similarity index 97% rename from docs/rest-apis/learn/admin/rest3LO-and-learnSSO.md rename to docs/blackboard/rest-apis/getting-started/rest3LO-and-learnSSO.md index c274d2db9..73c82f0aa 100644 --- a/docs/rest-apis/learn/admin/rest3LO-and-learnSSO.md +++ b/docs/blackboard/rest-apis/getting-started/rest3LO-and-learnSSO.md @@ -7,8 +7,6 @@ edited: "" author: Mark Kauffman --- - - ## Your Custom Login Page and REST 3-Legged OAuth This article is to help Learn administrators ensure that a custom SSO login page works with REST 3LO applications. Several clients have reported that when trying to complete the following workflow with a 3rd-party REST Application their users get stuck on the Learn landing page. Expected 3-legged authentication workflow: @@ -35,5 +33,3 @@ Note that you may also need to study how your SSO system needs to be configured _**Key takeaway:**_ A custom login page can work with REST API integrations only if the Learn-provided tag is used to generate the link a user access to sign in. You may customize how that looks with some CSS, but you can never use other HTML to provide the user a login link. \*Credits to Chris Bray from the University of Arkansas for the UARKexampleCustomLogin.jsp example and Dan Gioia of St. Louis Community College for much of the CSS Chris used in the .jsp. Thank you both! - - diff --git a/docs/rest-apis/learn/getting-started/tutorials.md b/docs/blackboard/rest-apis/getting-started/tutorials.md similarity index 93% rename from docs/rest-apis/learn/getting-started/tutorials.md rename to docs/blackboard/rest-apis/getting-started/tutorials.md index 2750ed8de..b7a28d1e8 100644 --- a/docs/rest-apis/learn/getting-started/tutorials.md +++ b/docs/blackboard/rest-apis/getting-started/tutorials.md @@ -9,8 +9,6 @@ published: "" edited: "" --- - - # REST Tutorials You will find these tutorials very helpful as you start developement. @@ -28,5 +26,3 @@ You will find these tutorials very helpful as you start developement. #### [Download the slides](/assets/files/DevCon2020-MBK-SimpleRESTwebApp.pdf) - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/adaptive-release.md b/docs/blackboard/rest-apis/hands-on/adaptive-release.md similarity index 98% rename from docs/rest-apis/learn/working-with-learn-apis/adaptive-release.md rename to docs/blackboard/rest-apis/hands-on/adaptive-release.md index 4d4064934..8a60552a0 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/adaptive-release.md +++ b/docs/blackboard/rest-apis/hands-on/adaptive-release.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - > Using Bb Learn 3900.34.0-rel.24+41a9160 ## Ultra courses @@ -41,7 +39,7 @@ Yes, we need to create a rule that will contain our criteria (We assume the cour For specific messages that may be returned by the api, please review: https://developer.anthology.com/portal/displayApi -Also, please make sure to always review the entitlements required for each endpoint, you can check this document [How to map entitlements with privileges](/docs/rest-apis/learn/getting-started/mapping-entitlements-to-privileges.md) to get more information about entitlements. +Also, please make sure to always review the entitlements required for each endpoint, you can check this document [How to map entitlements with privileges](/docs/blackboard/rest-apis/getting-started/mapping-entitlements-to-privileges.md) to get more information about entitlements. For the rules you need course_id and Content_id @@ -662,5 +660,3 @@ Specifies a content of the same course. The referenced content must be set to a "reviewedContentId": "_2_1" } ``` - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/attendance.md b/docs/blackboard/rest-apis/hands-on/attendance.md similarity index 99% rename from docs/rest-apis/learn/working-with-learn-apis/attendance.md rename to docs/blackboard/rest-apis/hands-on/attendance.md index c6fcf95a4..399fb79d5 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/attendance.md +++ b/docs/blackboard/rest-apis/hands-on/attendance.md @@ -7,8 +7,6 @@ published: "2022-10-21" edited: "" --- - - > Tested Using Blackboard Learn Release 3900.50.0-rel.21+840a19d ## Introduction @@ -467,5 +465,3 @@ This endpoint is very powerful, be careful when using it since it will remove AL #### CSV Export endpoint Unfortunately at the moment of writing, this endpoint is not working properly so, I am unable to tell you how it works, however, once this is fixed I will update this, for now, the GUI is the best place to get the information. - - diff --git a/docs/blackboard/rest-apis/hands-on/calendar-api.md b/docs/blackboard/rest-apis/hands-on/calendar-api.md new file mode 100644 index 000000000..cc45a1940 --- /dev/null +++ b/docs/blackboard/rest-apis/hands-on/calendar-api.md @@ -0,0 +1,737 @@ +--- +title: "Working with Calendar APIs" +id: calendar-apis +categories: Learn REST Working-with APIs Calendar +published: "2022-10-03" +edited: "2023-10-20" +author: Davey Herrera, Mark O'Neil +--- + +> Tested with Blackboard Learn version 3900.48.0 +> +> Note: non-3LO capabilities available in Blackboard Learn version 3900.78.0 + +## Topic + +Learn provides an internal calendar system for Institutional, Course, and Personal calendar items. Learn Public REST APIs for this calendar system allow external integrations to manage Institutional and Course Calendars. For Personal calendars use of three-legged-oauth (3LO) is required. + +Notes: + +- All Learn Calendar APIs work the same for either Original or Ultra course experiences. + +- Learn Public REST APIs are documented at https://developer.anthology.com/portal/displayAPI/Learn + +- All Calendar APIs are accessible based on the integration Privileges whether using 3LO or basic OAuth 2.0. + +This document covers General API Use and Best Practices to meet use cases for using the Learn REST APIs for the Learn Calendar. + +It is strongly recommended to follow the Best Practices outlined below. + +# General API Use + +Details follow below but in general, the workflow for accessing and processing calendar items is best broken down by calendar type and desired action – Create, Read, Update, or Delete calendarItems. + +Mapping a calendar Item to the API payload +This is an example of how a Course schedule item looks like in the GUI and in the payload when calling it using: +GET /learn/api/public/v1/calendars/items?courseId=\_905_1 + +## General Usage Notes for all endpoints + +We are not able to create, update or delete Calendars BUT We can create new calendarItems on those calendars. + +Please keep in mind that: + +- All 3LO users can view their own institutional items in calendar. +- All 3LO users can view their own personal items in calendar. +- Non-3LO applications can view all calendarTypes and calendarItems except for the Personal Calendar. +- If SINCE and UNTIL are not provided, the endpoint will default to the upcoming two weeks timeframe from NOW. +- If only SINCE is provided, this endpoint will default the UNTIL parameter two weeks after SINCE. +- If only UNTIL is provided the endpoint will default the SINCE parameter two weeks prior to UNTIL. +- Maximum timespan between SINCE and UNTIL is 16 weeks. +- The course calendar must be enabled for the course GradebookColumn associate with OfficeHours. +- If OfficeHours are created for a course calendar (calendarId == a course_id). +- The course calendar must be enabled for course calendar items associated with GradebookColumn. +- CalendarItems of type GradebookColumn are a representation of a specific gradable item and there read-only. Modifications to GradebookColumn items performed via the GradebokColumn endpoints will be reflected in the CalentarItems endoints. +- If you want to use the `columnIds` from Gradebook Column as a calendar Item id, you can get those from `/learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}` +- _You cannot read/create calendar items when there is no calendar._ + +### Institutional + +#### Create + +1. Call the create endpoint specifying the Institutional Calendar Type. + +#### Read, Update, Delete + +1. **Read**: Call the read endpoint specifying the Institutional Calendar Item Type. +2. **Update**: Call the patch endpoint specifying the Institutional Calendar Item Type and the calendar item Id you wish to update. +3. **Delete**: Call the delete endpoint specifying the Institutional Calendar Item Type and the calendar item Id you wish to delete. + +### Course + +#### Create + +If using 3LO and using calendarItems of type OfficeHours, those will be assigned to the current user. Non-3LO created items may only be managed by the integration. + +##### Course Calendar Items + +- The specified courseId must not be for an organization. + +##### GradebookColumn Calendar Items + +- GradebookColumn items must be created using the Gradebook API endpoint: `POST /learn/api/public/v2/courses/{courseId}/gradebook/columns` + +##### OfficeHours Calendar Items + +1. Get the Id(s) of course(s) for which you need to manage the calendar(s). +2. Call the create endpoint specifying the Course Calendar Item Type and the courseId of the course for which you wish to create the calendar item. + +#### Read, Update, Delete + +1. **Read**: + a. Call the read endpoint specifying the Course Calendar Item Type and the courseId of the course for which you want the calendarItems (returns a collection of calendarItems). + b. Call the read {calendarItemId} endpoint specifying the Course Calendar Item Type and the courseId of the course for which you want the calendarItem (returns a single of calendarItem). +2. **Update**: Call the patch endpoint specifying the Course Calendar Item Type and the calendar item Id you wish to update. +3. **Delete**: Call the delete endpoint specifying the Course Calendar Item Type and the calendar item Id you wish to delete. + +### Personal + +**_Only 3LO applications may create Personal calendarItems._** + +Personal calendars are personal and as such we do not offer Public APIs for external management of Personal calendar Items. If your use case calls for providing individuals with calendar items – e.g. a meeting scheduler – then you should utilize email and the ICS calendar format\* for providing individuals with calendar data. The individual may then add the item to their calendar of choice, optionally sharing their external calendar with their Learn calendar. + +- https://www.ietf.org/rfc/rfc2445.txt; https://icalendar.org/RFC-Specifications/iCalendar-RFC-5545/ + +- iCalendar Libraries + - Python: https://pypi.org/project/icalendar/ + - Javascript: https://www.npmjs.com/package/ical-generator + - Java: https://www.ical4j.org + - C#: https://www.nuget.org/packages/Ical.Net/ + +The below sections further elaborate on each of the above steps. + +## General Use Examples + +The differentiator between using any calendar is to replace the `calendarType` with your target calendar. Supported calendarTypes are: + +- Course +- GradebookColumn **_(READ ONLY)_** +- Institution +- OfficeHours +- Personal **_(only available via 3LO)_** + +### CREATE a calendarItem + +`POST /learn/api/public/v1/calendars/items` +requires a payload with calendarItem settings + +#### _Create Example_ + +`POST /learn/api/public/v1/calendars/items` + +```json +{ + "type": "Course", + "calendarId": "string", + "title": "string", + "description": "string", + "location": "string", + "start": "2022-09-29T20:30:04.346Z", + "end": "2022-09-29T20:30:04.346Z", + "disableResizing": true, + "recurrence": { + "count": 0, + "frequency": "Monthly", + "interval": 0, + "monthRepeatDay": 0, + "monthPosition": 0, + "originalStart": "2022-09-29T20:30:04.346Z", + "originalEnd": "2022-09-29T20:30:04.346Z", + "repeatBroken": true, + "repeatDay": "Sunday", + "until": "2022-09-29T20:30:04.346Z", + "weekDays": ["Sunday"] + } +} +``` + +#### READ calendarItems + +(For a course with an id of `_12594_1`) + +`GET /learn/api/public/v1/calendars/items` + +#### _Read Examples_ + +**Get all calendarItems for a given course (including Course, OfficeHours, GradebookColumn types):** + +`GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&courseId=_12594_1` + +Results: + +```json +{ + "results": [ + { + "id": "_91571_1", + "type": "OfficeHours", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Office Hours - Mark O'Neil", + "description": "Use the signup sheet on my door for office hours.", + "start": "2023-10-25T19:00:00.000Z", + "end": "2023-10-25T19:30:00.000Z", + "modified": "2023-10-10T19:07:39.334Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-25T19:00:00.000Z", + "originalEnd": "2023-10-25T19:30:00.000Z", + "repeatBroken": false, + "weekDays": ["Wednesday"] + } + }, + { + "id": "_91572_1", + "type": "OfficeHours", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Office Hours - Mark O'Neil", + "description": "Use the signup sheet on my door for office hours.", + "start": "2023-11-01T19:00:00.000Z", + "end": "2023-11-01T19:30:00.000Z", + "modified": "2023-10-10T19:07:39.353Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-25T19:00:00.000Z", + "originalEnd": "2023-10-25T19:30:00.000Z", + "repeatBroken": false, + "weekDays": ["Wednesday"] + } + }, + { + "id": "_91573_1", + "type": "OfficeHours", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Office Hours - Mark O'Neil", + "description": "Use the signup sheet on my door for office hours.", + "start": "2023-11-08T20:00:00.000Z", + "end": "2023-11-08T20:30:00.000Z", + "modified": "2023-10-10T19:07:39.382Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-25T19:00:00.000Z", + "originalEnd": "2023-10-25T19:30:00.000Z", + "repeatBroken": false, + "weekDays": ["Wednesday"] + } + }, + { + "id": "_91583_1", + "type": "Course", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Calendar Demo: My Calendar Course", + "start": "2023-10-20T20:00:00.000Z", + "end": "2023-10-20T21:00:00.000Z", + "modified": "2023-10-10T19:08:12.224Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-06T20:00:00.000Z", + "originalEnd": "2023-10-06T21:00:00.000Z", + "repeatBroken": false, + "weekDays": ["Friday"] + } + }, + { + "id": "_91584_1", + "type": "Course", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Calendar Demo: My Calendar Course", + "start": "2023-10-27T20:00:00.000Z", + "end": "2023-10-27T21:00:00.000Z", + "modified": "2023-10-10T19:08:12.230Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-06T20:00:00.000Z", + "originalEnd": "2023-10-06T21:00:00.000Z", + "repeatBroken": false, + "weekDays": ["Friday"] + } + }, + { + "id": "_91585_1", + "type": "Course", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Calendar Demo: My Calendar Course", + "start": "2023-11-03T20:00:00.000Z", + "end": "2023-11-03T21:00:00.000Z", + "modified": "2023-10-10T19:08:12.238Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-06T20:00:00.000Z", + "originalEnd": "2023-10-06T21:00:00.000Z", + "repeatBroken": false, + "weekDays": ["Friday"] + } + }, + { + "id": "_91586_1", + "type": "Course", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Calendar Demo: My Calendar Course", + "start": "2023-11-10T21:00:00.000Z", + "end": "2023-11-10T22:00:00.000Z", + "modified": "2023-10-10T19:08:12.247Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-06T20:00:00.000Z", + "originalEnd": "2023-10-06T21:00:00.000Z", + "repeatBroken": false, + "weekDays": ["Friday"] + } + }, + { + "id": "_120127_1", + "type": "GradebookColumn", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Sample Assignment [rubric] (Learning Module)", + "start": "2023-10-31T04:00:00.000Z", + "end": "2023-10-31T04:00:00.000Z", + "modified": null, + "color": "#670033", + "disableResizing": true, + "createdByUserId": null, + "dynamicCalendarItemProps": { + "attemptable": true, + "categoryId": "_172683_1", + "dateRangeLimited": false, + "eventType": "Test", + "gradable": true + } + }, + { + "id": "_120129_1", + "type": "GradebookColumn", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Test (Learning Module)", + "start": "2023-10-31T04:00:00.000Z", + "end": "2023-10-31T04:00:00.000Z", + "modified": null, + "color": "#670033", + "disableResizing": true, + "createdByUserId": null, + "dynamicCalendarItemProps": { + "attemptable": true, + "categoryId": "_172685_1", + "dateRangeLimited": false, + "eventType": "Test", + "gradable": true + } + } + ] +} +``` + +**Get all OfficeHours calendarItems for a course:** + +`GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&courseId=_12594_1 &type=OfficeHours` + +Results: + +```json +{ + "results": [ + { + "id": "_91571_1", + "type": "OfficeHours", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Office Hours - Mark O'Neil", + "description": "Use the signup sheet on my door for office hours.", + "start": "2023-10-25T19:00:00.000Z", + "end": "2023-10-25T19:30:00.000Z", + "modified": "2023-10-10T19:07:39.334Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-25T19:00:00.000Z", + "originalEnd": "2023-10-25T19:30:00.000Z", + "repeatBroken": false, + "weekDays": ["Wednesday"] + } + }, + { + "id": "_91572_1", + "type": "OfficeHours", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Office Hours - Mark O'Neil", + "description": "Use the signup sheet on my door for office hours.", + "start": "2023-11-01T19:00:00.000Z", + "end": "2023-11-01T19:30:00.000Z", + "modified": "2023-10-10T19:07:39.353Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-25T19:00:00.000Z", + "originalEnd": "2023-10-25T19:30:00.000Z", + "repeatBroken": false, + "weekDays": ["Wednesday"] + } + }, + { + "id": "_91573_1", + "type": "OfficeHours", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Office Hours - Mark O'Neil", + "description": "Use the signup sheet on my door for office hours.", + "start": "2023-11-08T20:00:00.000Z", + "end": "2023-11-08T20:30:00.000Z", + "modified": "2023-10-10T19:07:39.382Z", + "color": "#670033", + "disableResizing": false, + "createdByUserId": "_1354_1", + "recurrence": { + "count": 10, + "frequency": "Weekly", + "interval": 1, + "originalStart": "2023-10-25T19:00:00.000Z", + "originalEnd": "2023-10-25T19:30:00.000Z", + "repeatBroken": false, + "weekDays": ["Wednesday"] + } + } + ] +} +``` + +**Get all gradebook columns due within the given timeframe:** + +`GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&courseId=_12594_1&type=GradebookColumn` + +Results: + +```json +{ + "results": [ + { + "id": "_120127_1", + "type": "GradebookColumn", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Sample Assignment [rubric] (Learning Module)", + "start": "2023-10-31T04:00:00.000Z", + "end": "2023-10-31T04:00:00.000Z", + "modified": null, + "color": "#670033", + "disableResizing": true, + "createdByUserId": null, + "dynamicCalendarItemProps": { + "attemptable": true, + "categoryId": "_172683_1", + "dateRangeLimited": false, + "eventType": "Test", + "gradable": true + } + }, + { + "id": "_120129_1", + "type": "GradebookColumn", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Test (Learning Module)", + "start": "2023-10-31T04:00:00.000Z", + "end": "2023-10-31T04:00:00.000Z", + "modified": null, + "color": "#670033", + "disableResizing": true, + "createdByUserId": null, + "dynamicCalendarItemProps": { + "attemptable": true, + "categoryId": "_172685_1", + "dateRangeLimited": false, + "eventType": "Test", + "gradable": true + } + }, + { + "id": "_120130_1", + "type": "GradebookColumn", + "calendarId": "_12594_1", + "calendarName": "Calendar Demo: My Calendar Course", + "title": "Assignment [rubrics] (Conditional Release)", + "start": "2023-10-31T04:00:00.000Z", + "end": "2023-10-31T04:00:00.000Z", + "modified": null, + "color": "#670033", + "disableResizing": true, + "createdByUserId": null, + "dynamicCalendarItemProps": { + "attemptable": true, + "categoryId": "_172683_1", + "dateRangeLimited": false, + "eventType": "Test", + "gradable": true + } + } + ] +} +``` + +- Note in this demo the gradebook column related grades are due on 2023-10-31 so requesting the range as shown previously will return the data. If we changed the until date to 2023-10-25 the results would be an empty set: + + ``` + {"results" : []} + ``` + +- For the Institution calendarType exclude the courseId and add/change the type to Institution in the request. + E.g. Get all Institution calendarItems within the given timeframe: + + ``` + GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&type=Institution + ``` + +Results: + +```json +{ + "results": [ + { + "id": "_84428_1", + "type": "Institution", + "calendarId": "INSTITUTION", + "calendarName": "Institution", + "title": "Holiday Celebration - Stevens Commons ", + "description": "Come celebrate with your fellow Monument students as we have a holiday celebration. Student groups will be present and will host different fun-filled activities. Food and drink will be provided! Wear your best ugly Christmas sweater and compete for a prize!", + "location": "Stevens Commons", + "start": "2022-12-15T19:00:00.000Z", + "end": "2022-12-15T22:00:00.000Z", + "modified": "2022-12-08T19:12:06.160Z", + "color": "#b65151", + "disableResizing": false, + "createdByUserId": "_30005_1" + } + ] +} +``` + +### UPDATE a calendarItem + +To update a calendarItem you must know the calendarItem Id. This may be found by calling the appropriate READ endpoint as outlined above. Once you have a collection of calendarItems you may then update using the Update endpoint: + +`PATCH /learn/api/public/v1/calendars/items/{calendarItemType}/{calendarItemId}` + +#### Payload example + +```json +{ + "type": "Course", + "calendarId": "_12594_1", + "title": "Study Group 2 Session", + "description": "Meeting for Study Group 3", + "location": "Castle Room 2-202", + "start": "2022-09-30T16:36:40.313Z", + "end": "2022-09-30T16:36:40.313Z", + "modified": "2022-09-30T16:36:40.313Z", + "disableResizing": true, + "dynamicCalendarItemProps": { + "attemptable": true, + "categoryId": "string", + "dateRangeLimited": true, + "eventType": "string", + "gradable": true + }, + "recurrence": { + "count": 0, + "frequency": "Monthly", + "interval": 0, + "monthRepeatDay": 0, + "monthPosition": 0, + "originalStart": "2022-09-30T16:36:40.313Z", + "originalEnd": "2022-09-30T16:36:40.313Z", + "repeatBroken": true, + "repeatDay": "Sunday", + "until": "2022-09-30T16:36:40.313Z", + "weekDays": ["Sunday"] + } +} +``` + +**Success** 200 - results match above payload if calendarType were Course with the additional data of "id": "string", "calendarName": "string", "color": "string", "createdByUserId": "string". + +### DELETE a calendarItem + +As with Update you must know the calendarItem Id of the calendarItem you wish to delete. This may be found by calling the appropriate READ endpoint as outlined above. Once you have a collection of calendarItems you may then delete one using the delete endpoint: + +`DELETE /learn/api/public/v1/calendars/items/{calendarItemType}/{calendarItemId}` + +#### _Delete Example_ + +`DELETE /learn/api/public/v1/calendars/items/{calendarItemType}/{calendarItemId}` + +**Success** +204 No content + +## A Sidebar on ISO-8601, UTC, and REST APIs + +Public REST APIs always return ISO 8601 UTC Zulu time zone formatted date/time data. To properly manage conversion to your time zone to display and use dates in your requests it is important to understand the relationship between UTC and the ISO 8601 date-time format and how the REST APIs handle date/times. + +### In brief: + +- All Learn instances store date-times in the database as localized server time – which may or may not be the consumers time zone – this is why… +- All REST APIs return date-times in UTC Zulu format and as such developers need to adjust to the appropriate time zone for their UI. +- UTC stands for Coordinated Universal Time, a standard used to set all time zones around the world. +- All REST API requests intake ISO 8601 date-time format allowing for specifying the UTC offset for time zone adjustment (see below).ISO 8601 provides a standardized way of presenting dates and times: + - Date + - Time of day + - Coordinated Universal Time (UTC) + - Local time with offset to UTC + - Date and time + - Time intervals + - Recurring time intervals +- UTC could be considered a subset of the ISO 8601 standard – a date without a specified time zone is referred to as UTC time and may use the optional ‘Z’ (Zulu) time zone indicator. Zulu date-times are what are returned by the REST APIs. + - 2023-10-15T13:15:30Z represents 1:15:30 PM in Greenwich England (previously called Greenwich Mean Time) +- ISO 8601 may be used with an optional offset to designate the time zone. Following the above example: + - 2023-10-15T13:15:30Z represents 1:15:30 PM in Greenwich England + - 2023-10-15T13:15:30Z-05:00 corresponds to October 10, 2023, 8:15:30 am, US Eastern Standard Time. + +The ISO 8601 standard provides the following format for a date-time: + +`[yyyy-MM-dd|yyyyMMdd][T(hh:mm[:ss[.sss]]|hhmm[ss[.sss]])]?[Z|[+-]hh:mm]]` + +Following the above formatting these are all the same date and time (October 10, 2023, 1:15:30 pm): + +- 2023-10-15T13:15:30Z << this is the format returned in REST API results +- 20231015T15T13:15:30Z +- 20231015T15T131530Z +- 2023-10-15T13:15:30 +- 20231015T15T13:15:30 +- 20231015T15T131530 +- 20231015T15T13:15:30 +- 2023-10-15T18:15:30-5:00 +- 20231015T15T18:15:30Z-5:00 +- 20231015T15T181530Z-5:00 +- 2023-10-15T18:15:30 -5:00 +- 20231015T15T18:15:30-5:00 +- 20231015T15T181530-5:00 +- 20231015T15T18:15:30-5:00 + +Some useful URLs to help with better understanding dates: + +- ISO 8601 standard: https://www.rfc-editor.org/rfc/rfc3339, https://www.w3.org/TR/NOTE-datetime and https://en.wikipedia.org/wiki/ISO_8601 +- Time zones: +- A useful conversion tool: https://www.calculator.net/time-zone-calculator.html + +## Entitlements and System Role Privileges + +### Three-Legged-OAuth (3LO) + +Calling Calendar APIs in a 3LO context enables access based on the privileges of the 3LO authenticated user. You do not need to do anything privileges specific to enable your application when using 3LO. + +### Non-3LO + +Calling Calendar APIs when not using 3LO requires that you have a REST Application user configured in Learn with the necessary privileges assigned to that user’s role. These privileges are derived from the entitlements required. For mapping entitlements to privileges see: [How to map entitlements to privileges](/docs/blackboard/rest-apis/getting-started/mapping-entitlements-to-privileges.md). + +#### Necessary Entitlements + +Calendar entitlements required per endpoint are listed in the calendar API documentation. + +1. To create a calendar event in Course, + - `course.calendar-entry.CREATE` +2. To edit a calendar event in Course, + - `course.calendar-entry.MODIFY` +3. To delete a calendar event in Course + - `course.calendar-entry.DELETE` +4. To create/edit/delete calendar event in Institution + - `system.calendar-item.EXECUTE` + +#### Necessary System Role Privileges + +**Note**: You must share these System Role Privileges with Learn System Admins via documentation for deployment of your application on their Learn server. + +1. To create a calendar event in Course, + - `Course/Organization Control Panel (Tools) > Calendar > Create Entry` +2. To edit a calendar event in Course, + - `Course/Organization Control Panel (Tools) > Calendar > Edit Entry` +3. To delete a calendar event in Course + - `Course/Organization Control Panel (Tools) > Calendar > Delete Entry` +4. To create/edit/delete calendar event in Institution + - `Administrator Panel (Tools and Utilities) > Calendar` + +## Calendar API Best Practices + +Note: Please review our General REST API Best Practices which are outlined in our [REST API Best Practices](/docs/blackboard/rest-apis/best-practices.md) guide. + +1. Never, use GET /learn/api/public/v1/calendars/items in a non-3LO capacity! + +> 3LO always limits calendar data to what a specific user may view. Non-3LO use of the calendar endpoints is more data inclusive. While safe to use as a 3LO authenticated user, using the /calendars/items endpoint as a non-3LO user will attempt to dump the entire calendar db for the the specified timebox (maximum of 14 week’s worth for every course). THIS WILL POTENTIALLY IMPAIR SYSTEM PERFORMANCE. DO NOT DO THIS! + +2. Target your requests based on calendarType and Ids + +> Always target your requests based on the Id of the target course and use calendarTypes to limit the scope of the request. Failure to do so may have negative performance impact. + +> Use calendarType, calendarItem, or courseId as required to manage the impacted data set. + +3. Timebox your requests + +> Always timebox your requests. Failure to do so may have negative performance impact. By default all requests are timeboxed to 14 weeks ahead of the date/time of the request. + +> Use the since and until parameters to timebox your requests: + +| **since** | | +| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- | ------------ | +| Query parameter: `string($date-time)` | Specifies only calendar items after the 'since' date (inclusive) are to be returned. Maximum of 16 weeks after the 'since' date will be returned. ISO-8601 date-time format is expected: `[yyyy-MM-dd | yyyyMMdd][T(hh:mm[:ss[.sss]] | hhmm[ss[.sss]])]?[Z | [+-]hh:mm]]` | + +| **until** | | +| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- | ------------ | +| Query parameter: `string($date-time)` | Specifies only calendar items before the 'until' date (inclusive) are to be returned. Maximum of 16 weeks prior to the 'until' date will be returned. ISO-8601 date-time format is expected: `[yyyy-MM-dd | yyyyMMdd][T(hh:mm[:ss[.sss]] | hhmm[ss[.sss]])]?[Z | [+-]hh:mm]]` | diff --git a/docs/rest-apis/learn/working-with-learn-apis/creating-content.md b/docs/blackboard/rest-apis/hands-on/content.md similarity index 99% rename from docs/rest-apis/learn/working-with-learn-apis/creating-content.md rename to docs/blackboard/rest-apis/hands-on/content.md index c7304166b..0d5bec68c 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/creating-content.md +++ b/docs/blackboard/rest-apis/hands-on/content.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - > This guide was created using Learn Release 3900.37.0-rel.2+bf4004cd We do talk about original at the end, however, the main process is the same, we focus a bit more in Ultra since there is a bit of difference. @@ -491,5 +489,3 @@ Returns The main difference about managing content in original is that you will always find two specific items created by default on toc: Information and content, those become the parents of content and you may create children content under those, you may create new parents and those should be reflected under the TOC, however those items cannot display information but contain it: ![Creating content with the api](/assets/img/manage-content-8.png) - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/copying-courses.md b/docs/blackboard/rest-apis/hands-on/copying-courses.md similarity index 56% rename from docs/rest-apis/learn/working-with-learn-apis/copying-courses.md rename to docs/blackboard/rest-apis/hands-on/copying-courses.md index d13dfe6c9..10f9e88f7 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/copying-courses.md +++ b/docs/blackboard/rest-apis/hands-on/copying-courses.md @@ -7,43 +7,47 @@ edited: "2023-09-19" author: Mark Kauffman, Mark O'Neil --- - - -# Using Learn Public REST APIs to Copy Courses - -> Notes: -> -> * The Learn Course Copy APIs work the same for either Original or Ultra course experiences. -> * Learn Public REST APIs are documented at https;//developer.anthology.com/portal/displayAPI/Learn -> * Information on System Administrators is not generally available via Public REST APIs, thus it is a Best Practice for Learn Administrators who are teaching or taking courses be enrolled using a non-Admininistrator Role privileged user. - +# Using Learn Public REST APIs to Copy Courses + +> Notes: +> +> - The Learn Course Copy APIs work the same for either Original or Ultra course experiences. +> - Learn Public REST APIs are documented at https;//developer.anthology.com/portal/displayAPI/Learn +> - Information on System Administrators is not generally available via Public REST APIs, thus it is a Best Practice for Learn Administrators who are teaching or taking courses be enrolled using a non-Admininistrator Role privileged user. + ## Topic -This document covers General API Use and Best Practices to meet use cases for using the Learn REST APIs to copy courses. - -We strongly recommended you follow the Best Practices outlined below. -# General API Use -Details follow below but in general, the workflow for copying a course consists of: +This document covers General API Use and Best Practices to meet use cases for using the Learn REST APIs to copy courses. + +We strongly recommended you follow the Best Practices outlined below. + +# General API Use + +Details follow below but in general, the workflow for copying a course consists of: -1. POST to the course copy endpoint. +1. POST to the course copy endpoint. 2. Poll via GET to the Location task endpiont that was returned in the header of the course copy response. Wait for a response other than 200. This is so that when you attempt to update the copied course with step #3 that the copy has completed. 3. PATCH to update the copied course's externaId, name, description, dates, and any other values that are to be different for the copied course. Any of these values are optional to update, but the copied course won't look any different to the instructor as the copied course is an EXACT copy of the source course except for the courseId. -DO NOT POST to UPDATE THE COPIED COURSE UNTIL CERTAIN THE COPY IS COMPLETE VIA STEP #2 ABOVE. +DO NOT POST to UPDATE THE COPIED COURSE UNTIL CERTAIN THE COPY IS COMPLETE VIA STEP #2 ABOVE. + +The below sections further elaborate on each of the above steps. + +## 1. POST to the course copy endpoint. + +`POST /learn/api/public/v2/courses/:courseId/copy` -The below sections further elaborate on each of the above steps. - -## 1. POST to the course copy endpoint. -`POST /learn/api/public/v2/courses/:courseId/copy` - ### Best Practices + 1. Keep track of your copy requests and the Location header in the response from each. You will need the Location to monitor the status of the copy as the course copy will take time. It is not immediate. - + ### Example -`POST /learn/api/public/v2/courses/courseId:mbk-original-template/copy` -Body: + +`POST /learn/api/public/v2/courses/courseId:mbk-original-template/copy` +Body: + ```json -{ +{ "targetCourse": { "courseId": "mbk-original-target2" }, @@ -79,28 +83,33 @@ Body: } ``` -will return all ‘{}’ and the response Location header might look like `/learn/api/public/v1/courses/_12_1/tasks/_127_1`. +will return all ‘{}’ and the response Location header might look like `/learn/api/public/v1/courses/_12_1/tasks/_127_1`. -You may now proceed to step 2 and query the given tasks endpoint. - -## 2. Poll the Location tasks endpoint. -`GET /learn/api/public/v1/courses/{courseId}/tasks/{taskId}` +You may now proceed to step 2 and query the given tasks endpoint. + +## 2. Poll the Location tasks endpoint. + +`GET /learn/api/public/v1/courses/{courseId}/tasks/{taskId}` + +### Best Practices -### Best Practices If task is complete this endpoint will return a 303 SEE OTHER with a Location header providing a URI to the GET Course endpoint. Statistical data shows that the average copy task duration is under a second. However, very large courses can take several minutes. Also important to note is that these background tasks can potentially be queued behind other system tasks therefore prolonging the time a task stays in the Queued status. We recommend that this endpoint be polled every 60 seconds while waiting for a Course copy to complete. Experience is that some operations - such as managing memberships - may be handled before full copy completion… which can dramatically improve integration performance. Typically you can start to work with the copied course around 15% completion… the remaining 85% is around copying content, discussions and so on. - + ### Example + `GET /learn/api/public/v1/courses/_12_1/tasks/_127_1` - -## 3. (Optional) PATCH to update the copied course +## 3. (Optional) PATCH to update the copied course + `PATCH /learn/api/public/v3/courses/{courseId}` ### Example + `PATCH https://kauffman390071b2.ddns.net/learn/api/public/v2/courses/_12_1` Body: + ```json { "externalId": "mbk-original-target2", @@ -108,37 +117,40 @@ Body: "description": "my copied course" } ``` - -# Best Practices - -## General Best Practices -* Learn System Administrators should be enrolled in courses only using a non-Admin enabled user. - * System Administrator information is generally only available to 3LO Administrator requests. - -* Always monitor your API usage using the x-header information returned on non-oauth requests - * Details on rate_limits and x-headers are available [here](https://docs.anthology.com/docs/developer-portal/production-groups-rest-api-and-site-registration-limits#rest-api-calls-limit). - -* Not all data operations are best done JIT. -Some operations, such as backfilling data warehouses or refreshing caches are best done during off-peak Learn hours. - * JIT calling or repeatedly calling for the same "static" data is inefficient. - * Checking whether a student is still in a course or getting their course grades are reasonable JIT activities as that is data that may change between now and their last access. - -* Cache infrequently changed or “static” data and refresh periodically. - * This reduces repetitive calls. - * This reduces integration performance impact. - * Don’t JIT retrieve ALL Courses for example as that data changes infrequently. Instead do this once and then periodically retrieve course data created or modified since you last request. - -* Always "optimize" your requests. - * reduce your “search” criteria to as small a set of data as possible. - * This limits the number of pages of returned data set. - * E.g. use `?dataSourceId=` to reduce your search to objects created using a specific DSK and follow caching practices. - * Use the fields parameter to reduce the returned data set to only data points you require. - * This limits the data transmitted and system load - -* Always try to logically bound your requests or before acting on request results - * Check if dates are within bounds - * Check if attempts exist of if items are graded - * Check availability - - - \ No newline at end of file + +# Best Practices + +## General Best Practices + +- Learn System Administrators should be enrolled in courses only using a non-Admin enabled user. + + - System Administrator information is generally only available to 3LO Administrator requests. + +- Always monitor your API usage using the x-header information returned on non-oauth requests + + - Details on rate_limits and x-headers are available [here](https://docs.anthology.com/docs/developer-portal/production-groups-rest-api-and-site-registration-limits#rest-api-calls-limit). + +- Not all data operations are best done JIT. + Some operations, such as backfilling data warehouses or refreshing caches are best done during off-peak Learn hours. + + - JIT calling or repeatedly calling for the same "static" data is inefficient. + - Checking whether a student is still in a course or getting their course grades are reasonable JIT activities as that is data that may change between now and their last access. + +- Cache infrequently changed or “static” data and refresh periodically. + + - This reduces repetitive calls. + - This reduces integration performance impact. + - Don’t JIT retrieve ALL Courses for example as that data changes infrequently. Instead do this once and then periodically retrieve course data created or modified since you last request. + +- Always "optimize" your requests. + + - reduce your “search” criteria to as small a set of data as possible. + - This limits the number of pages of returned data set. + - E.g. use `?dataSourceId=` to reduce your search to objects created using a specific DSK and follow caching practices. + - Use the fields parameter to reduce the returned data set to only data points you require. + - This limits the data transmitted and system load + +- Always try to logically bound your requests or before acting on request results + - Check if dates are within bounds + - Check if attempts exist of if items are graded + - Check availability diff --git a/docs/rest-apis/learn/working-with-learn-apis/course-toc.md b/docs/blackboard/rest-apis/hands-on/course-toc.md similarity index 98% rename from docs/rest-apis/learn/working-with-learn-apis/course-toc.md rename to docs/blackboard/rest-apis/hands-on/course-toc.md index e5aea7767..28e7a4efa 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/course-toc.md +++ b/docs/blackboard/rest-apis/hands-on/course-toc.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - This guide is only intended to be used in courses that use the original course view. > Tested with Blackboard Learn Release 3900.48.0-rel.18+c7edfda @@ -178,5 +176,3 @@ The payload looks like this: Also, please keep in mind the following guideline: "Updates a specific TOC entry. Only allowGuests and allowObservers flags are modifiable, the remaining fields are read-only. User should keep in mind that in order to modify such TOC fields, Course's allowGuest and allowObservers configuration must be enabled. Also, if user wants to update a TOC register's allowGuest flag and TOC is associated to a CONTENT or APPLICATION target type, Course Tool Settings must have allowGuests flag enabled. If user wants to update a TOC register's allowObserver flag and TOC is associated to an APPLICATION target type, Course Tool Settings must have allowObservers flag enabled." - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/pulling-grades.md b/docs/blackboard/rest-apis/hands-on/gradebook.md similarity index 56% rename from docs/rest-apis/learn/working-with-learn-apis/pulling-grades.md rename to docs/blackboard/rest-apis/hands-on/gradebook.md index 03234bf50..5235f782d 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/pulling-grades.md +++ b/docs/blackboard/rest-apis/hands-on/gradebook.md @@ -7,317 +7,331 @@ edited: "2023-10-13" author: Mark O'Neil --- - - -# Using Learn Public REST APIs to Pull Gradebook Data and Assessment Grades - -> Notes: -> -> * All Learn Gradebook APIs work the same for either Original or Ultra course experiences. -> * Learn Public REST APIs are documented at https;//developer.anthology.com/portal/displayAPI/Learn -> * Information on System Administrators is not generally available via Public REST APIs, thus it is a Best Practice for Learn Administrators who are teaching or taking courses be enrolled using a non-Admininistrator Role privileged user. - +# Using Learn Public REST APIs to Pull Gradebook Data and Assessment Grades + +> Notes: +> +> - All Learn Gradebook APIs work the same for either Original or Ultra course experiences. +> - Learn Public REST APIs are documented at https;//developer.anthology.com/portal/displayAPI/Learn +> - Information on System Administrators is not generally available via Public REST APIs, thus it is a Best Practice for Learn Administrators who are teaching or taking courses be enrolled using a non-Admininistrator Role privileged user. + ## Topic -This document covers General API Use and Best Practices to meet use cases for using the Learn REST APIs for Gradebook and Assessment grades. Specifically pulling data from Learn, though in general setting data follows similar patterns. - -In both cases it is strongly recommended to follow the Best Practices outlined below. - -# General API Use -Details follow below but in general, the workflow for accessing and processing course grades consists of: - -1. Get a list of courses from which you wish to pull grades. -2. Get a list of course memberships. -3. Get the gradebook columns of interest. - - 1. if desired get list of course Gradebook Categories and - 2. map column to category. - -4. Get the column grades -Process grades taking note of Parent/Child relationships if present. - -The below sections further elaborate on each of the above steps. - -## 1. Get Target Courses -`GET /learn/api/public/v3/courses` + +This document covers General API Use and Best Practices to meet use cases for using the Learn REST APIs for Gradebook and Assessment grades. Specifically pulling data from Learn, though in general setting data follows similar patterns. + +In both cases it is strongly recommended to follow the Best Practices outlined below. + +# General API Use + +Details follow below but in general, the workflow for accessing and processing course grades consists of: + +1. Get a list of courses from which you wish to pull grades. +2. Get a list of course memberships. +3. Get the gradebook columns of interest. + + 1. if desired get list of course Gradebook Categories and + 2. map column to category. + +4. Get the column grades + Process grades taking note of Parent/Child relationships if present. + +The below sections further elaborate on each of the above steps. + +## 1. Get Target Courses + +`GET /learn/api/public/v3/courses` + ### Example -`GET /learn/api/public/v3/courses?availability.available=Yes&fields=”id, created, availability.available, hasChildren”` will return all ‘active courses’ and the results will have only the `id`, `created date`, `availability.available` (which will always be yes in this case due to the availability search), and whether the course `hasChildren`. -You may then programmatically remove courses based on the date created if out of scope. - +`GET /learn/api/public/v3/courses?availability.available=Yes&fields=”id, created, availability.available, hasChildren”` will return all ‘active courses’ and the results will have only the `id`, `created date`, `availability.available` (which will always be yes in this case due to the availability search), and whether the course `hasChildren`. + +You may then programmatically remove courses based on the date created if out of scope. + To get courses for a specific year you may use -`?created=2022-08-07T21:17:40.626Z&createdCompare=greaterOrEqual` which will return all courses created after August 7, 2022 -OR -You may search using a specific `dataSourceId. ?dataSourceId=_123_4` - -Note that the `dataSourceId` may optionally be the data source's externalId using the syntax `externalId:Courses-Year-2023-2024`. E.g.: `?dataSourceId= externalId:Courses-Year-2023-2024` - -You may also further reduce the target set by removing courses that are disabled or unavailable based on `availability.available`. - -In all cases the `hasChildren` element may be significant for correctly aligning grade information with SIS systems pending your use case. - -NOTE: Cache this data because in the queries below you will iterate over the results from your courses request and use each course item’s id in place of `{courseId}` (with one exception which will be called out). - -## 2. Get Target Course Memberships +`?created=2022-08-07T21:17:40.626Z&createdCompare=greaterOrEqual` which will return all courses created after August 7, 2022 +OR +You may search using a specific `dataSourceId. ?dataSourceId=_123_4` + +Note that the `dataSourceId` may optionally be the data source's externalId using the syntax `externalId:Courses-Year-2023-2024`. E.g.: `?dataSourceId= externalId:Courses-Year-2023-2024` + +You may also further reduce the target set by removing courses that are disabled or unavailable based on `availability.available`. + +In all cases the `hasChildren` element may be significant for correctly aligning grade information with SIS systems pending your use case. + +NOTE: Cache this data because in the queries below you will iterate over the results from your courses request and use each course item’s id in place of `{courseId}` (with one exception which will be called out). + +## 2. Get Target Course Memberships + `GET /learn/api/public/v1/courses/{courseId}/users -` +` + ### Example -To optimize the number of requests used we will pull the course memberships along with a limited user data set using the `expand` and `fields` parameters: + +To optimize the number of requests used we will pull the course memberships along with a limited user data set using the `expand` and `fields` parameters: `GET /learn/api/public/v1/courses/{courseId}/users?expand=users&fields=”id, user.id, childCourseId” ` - -We use `fields` here because we want some specific information from our memberships so that we can ensure we process the grades correctly and because the user data is rather large and, in this case, mostly not pertinent to our needs. Notably we only need the `userId` to link the grade back to the correct membership `childCourseId` if present. - -NOTE: Cache this data because it will be used in processing the retrieved grades. - -## 3. Get Gradebook Columns + +We use `fields` here because we want some specific information from our memberships so that we can ensure we process the grades correctly and because the user data is rather large and, in this case, mostly not pertinent to our needs. Notably we only need the `userId` to link the grade back to the correct membership `childCourseId` if present. + +NOTE: Cache this data because it will be used in processing the retrieved grades. + +## 3. Get Gradebook Columns + `GET /learn/api/public/v2/courses/{courseId}/gradebook/columns ` -You may use the `fields` parameter to return specific elements e.g.: `?fields=”id, externalId, name, displayName, gradebookCategoryId, score.possible, grading.due, availability.available”` +You may use the `fields` parameter to return specific elements e.g.: `?fields=”id, externalId, name, displayName, gradebookCategoryId, score.possible, grading.due, availability.available”` Where: - -1. id == the columnId, -1. externalId == as referenced by external systems, -1. externalGrade == whether the column is an external grade -1. name or displayName (original only) == Title, -1. score.possible == Points Possible, -1. grading.due == Due Date, -1. gradebookCategoryId == Gradebook Category id (used to lookup Category details), -1. availability.available == whether the column is visible to students. - -E.g. using the above request: + +1. id == the columnId, +1. externalId == as referenced by external systems, +1. externalGrade == whether the column is an external grade +1. name or displayName (original only) == Title, +1. score.possible == Points Possible, +1. grading.due == Due Date, +1. gradebookCategoryId == Gradebook Category id (used to lookup Category details), +1. availability.available == whether the column is visible to students. + +E.g. using the above request: ```json -{ - "results": [ - { - "id": "string", - "externalId": "string", - "name": "string", - "displayName": "string", - "externalGrade": true, - "created": "2023-09-08T15:35:05.817Z", - "score": { - "possible": 0 - }, - "availability": { - "available": "Yes" - }, - "grading": { - "due": "2023-09-08T15:35:05.817Z", - }, - "gradebookCategoryId": "string", - } - ], - ... +{ + "results": [ + { + "id": "string", + "externalId": "string", + "name": "string", + "displayName": "string", + "externalGrade": true, + "created": "2023-09-08T15:35:05.817Z", + "score": { + "possible": 0 + }, + "availability": { + "available": "Yes" + }, + "grading": { + "due": "2023-09-08T15:35:05.817Z", + }, + "gradebookCategoryId": "string", + } + ], + ... ``` - -You may further reduce whether a column should be included in the target set based on its availability, due date, or whether there are any lastChanged results (see Best Practices). - -## 4. (optional) Get Course Gradebook Categories -To work with gradebook categories, you must get the list of categories used in the course and then map the gradebookCategoryId on gradebook column results back to that list as shown below. - -Aligning gradebook categories with assessments (columns) is a four-step process: + +You may further reduce whether a column should be included in the target set based on its availability, due date, or whether there are any lastChanged results (see Best Practices). + +## 4. (optional) Get Course Gradebook Categories + +To work with gradebook categories, you must get the list of categories used in the course and then map the gradebookCategoryId on gradebook column results back to that list as shown below. + +Aligning gradebook categories with assessments (columns) is a four-step process: 4.1 `GET /learn/api/public/v1/courses/{courseId}/gradebook/categories ` - + ```json -{ - "results": [ - { - "id": "string", - "title": "string" - } - ], - ... +{ + "results": [ + { + "id": "string", + "title": "string" + } + ], + ... ``` - -Then you may map an assessment (gradebook column) to a category by: - -Getting the column or columns (which has already been done in the above step 3): + +Then you may map an assessment (gradebook column) to a category by: + +Getting the column or columns (which has already been done in the above step 3): 4.2 `GET /learn/api/public/v2/courses/{courseId}/gradebook/columns?fields=”id, gradebookCategoryId” ` -*(this is recommended)* +_(this is recommended)_ -or +or `GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}? fields=”id, gradebookCategoryId” ` - -and inspecting the results: + +and inspecting the results: ```json -{ - "results": [ - { - "id": "string", - ... - "gradebookCategoryId": "string", - ... - } - ], - ... +{ + "results": [ + { + "id": "string", + ... + "gradebookCategoryId": "string", + ... + } + ], + ... ``` -Finally, for the category details, you must map `gradebookCategoryId` back to an `id` in the category results obtained in step 4.1 above. - -Now you know to which gradebook category a column is associated and may add this detail to your integration logic. - -## 5. Get Column (Assessment) Grades -PLEASE: Read the Best Practices section below, noting specifically identifying whether a column requires posting of grades or not. - -Grades are stored at the course level on a per assessment (column basis) so you access them by getting the course columns and then by getting the grades on the column(s) of interest. - -`GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}/users` +Finally, for the category details, you must map `gradebookCategoryId` back to an `id` in the category results obtained in step 4.1 above. + +Now you know to which gradebook category a column is associated and may add this detail to your integration logic. + +## 5. Get Column (Assessment) Grades -This returns all the grades ready on this column for all the users in the course: +PLEASE: Read the Best Practices section below, noting specifically identifying whether a column requires posting of grades or not. + +Grades are stored at the course level on a per assessment (column basis) so you access them by getting the course columns and then by getting the grades on the column(s) of interest. + +`GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}/users` + +This returns all the grades ready on this column for all the users in the course: ```json -{ - "results": [ - { - "userId": "string", - "columnId": "string", - "status": "Graded", - "displayGrade": { - "scaleType": "Percent", - "score": 0, - "possible": 0, - "text": "string" - }, - "text": "string", - "score": 0, - "overridden": "2023-09-07T20:24:04.778Z", - "notes": "string", - "feedback": "string", - "exempt": true, - "corrupt": true, - "gradeNotationId": "string", - "changeIndex": 0 - } - ], - "paging": { - "nextPage": "string" - } -} +{ + "results": [ + { + "userId": "string", + "columnId": "string", + "status": "Graded", + "displayGrade": { + "scaleType": "Percent", + "score": 0, + "possible": 0, + "text": "string" + }, + "text": "string", + "score": 0, + "overridden": "2023-09-07T20:24:04.778Z", + "notes": "string", + "feedback": "string", + "exempt": true, + "corrupt": true, + "gradeNotationId": "string", + "changeIndex": 0 + } + ], + "paging": { + "nextPage": "string" + } +} ``` - -Note: By default, membership results *do not include disabled memberships*. If those are of interest, then you must use the `includeDisabledMemberships=true` parameter. - -Once you have acquired the grades for the column your application may then, based on the results, take appropriate action. - -### Parent/Child Courses and Grades + +Note: By default, membership results _do not include disabled memberships_. If those are of interest, then you must use the `includeDisabledMemberships=true` parameter. + +Once you have acquired the grades for the column your application may then, based on the results, take appropriate action. + +### Parent/Child Courses and Grades + Details on Parent Child course relationships and how they work may be found here: [Merge and Separate Courses](https://help.blackboard.com/Learn/Administrator/SaaS/Courses/Manage_Courses/Merge_and_Separate_Courses) - -All grades are presented at the parent course view but are collected on the child course in which the student is enrolled, thus when pulling grades if the course has childred, you likely (based on your use case) must disambiguate the grade from the Parent `courseId` to the Child `courseId` when processing to store it against the correct child course identifier. *Failure to do so may push the grade to the wrong course in your records system.* - -## 6. Process Grades -Process grade information considering whether the user is a child course member. - -Check whether the Course consists of a Parent/Child relationship using the above requested course information. If the course `hasChildren` then you must use the `childCourseId` presented on the above membership record for the user to correctly handle the setting of the `courseId` for the grade. - + +All grades are presented at the parent course view but are collected on the child course in which the student is enrolled, thus when pulling grades if the course has childred, you likely (based on your use case) must disambiguate the grade from the Parent `courseId` to the Child `courseId` when processing to store it against the correct child course identifier. _Failure to do so may push the grade to the wrong course in your records system._ + +## 6. Process Grades + +Process grade information considering whether the user is a child course member. + +Check whether the Course consists of a Parent/Child relationship using the above requested course information. If the course `hasChildren` then you must use the `childCourseId` presented on the above membership record for the user to correctly handle the setting of the `courseId` for the grade. + Thus if `”hasChildren”:false` you will use the `courseId` as used for accessing the grades. -If `”hasChildren”:true` you will use the membership information gotten above to find the *child* courseId by the presence of the `childCourseId` element. E.g.: +If `”hasChildren”:true` you will use the membership information gotten above to find the _child_ courseId by the presence of the `childCourseId` element. E.g.: ```json -{ - "results": [ - { - "id": "string", - "userId": "string", - "user": { - "id": "string", - . . . - "courseId": "string", - "childCourseId": "string", - . . . +{ + "results": [ + { + "id": "string", + "userId": "string", + "user": { + "id": "string", + . . . + "courseId": "string", + "childCourseId": "string", + . . . ``` -If membership has `childCourseId` then that user is a member of a child course, and this is the id which should be used for processing *not the parent courseId as returned in courseId*. - -You now may handle the remaining processing workflow for this user’s assignment grade. - -## Calulating API Use -Using the above we can calculate API usage. Let’s keep the math simple by assuming we have -10 courses, 10 columns per course, 10 students per course and every time we check there are grades to pull for every column*: - -1. 1 to get all Courses (nCourses = 10) -2. 3 requests per course to get all Courses Memberships and User data, Gradebook Categories, and Gradebook Columns -3. Sum of gradebook column counts *2 = nColumns@two requests/column = 200 (note if not using Categories this would be nColumns). - -The number of requests to access all the grades is calculable via: - -Total Requests = 1+(nCourses*3)+(nColumns) or 1=(10*3)+(100) for a total of 231 requests each time you pull all the grades per the above example. - -*This would be the largest requests needed, but pulling all the grades all the time is rarely the case – as in many cases columns may not have any grades posted, it may be past due and grades already collected, or it may not have been released or graded at all. In each of these cases the number of requests has dropped. Always try to logically bound your requests – don’t make requests “just because you can”. - -## Gradebook API Best Practices +If membership has `childCourseId` then that user is a member of a child course, and this is the id which should be used for processing _not the parent courseId as returned in courseId_. + +You now may handle the remaining processing workflow for this user’s assignment grade. + +## Calulating API Use + +Using the above we can calculate API usage. Let’s keep the math simple by assuming we have +10 courses, 10 columns per course, 10 students per course and every time we check there are grades to pull for every column\*: + +1. 1 to get all Courses (nCourses = 10) +2. 3 requests per course to get all Courses Memberships and User data, Gradebook Categories, and Gradebook Columns +3. Sum of gradebook column counts \*2 = nColumns@two requests/column = 200 (note if not using Categories this would be nColumns). + +The number of requests to access all the grades is calculable via: + +Total Requests = 1+(nCourses*3)+(nColumns) or 1=(10*3)+(100) for a total of 231 requests each time you pull all the grades per the above example. + +\*This would be the largest requests needed, but pulling all the grades all the time is rarely the case – as in many cases columns may not have any grades posted, it may be past due and grades already collected, or it may not have been released or graded at all. In each of these cases the number of requests has dropped. Always try to logically bound your requests – don’t make requests “just because you can”. + +## Gradebook API Best Practices + ### General Best Practices + 1. Limit the number of courses in your list of target courses via our search parameters. -E.g.: `?created=2023-09-07T21:17:40.626Z&createdCompare=greaterOrEqual` or -`?availability.available=Yes` + E.g.: `?created=2023-09-07T21:17:40.626Z&createdCompare=greaterOrEqual` or + `?availability.available=Yes` -2. Use Fields parameter to limit the data per course in your list to that which is needed. E.g.: `?...&fields=”id, created, availability.available, hasChildren”` -Pulling grades as can be seen by the above Calculating API Usage section can be costly from a rate limit perspective. You can limit the number of requests by targeting specific courses and columns, and pulling grades only when there are new grade changes on existing columns. Meeting this efficiency requires caching of previous request results. You will always have to establish a baseline which will require iterating across all courses, after which your total requests for maintaining your data will be less. - -4. Reduce target range. -Reducing the number of targets is important with all API requests, but even more so with Gradebook requests – this is due to the potential for a large volume of requests. Target reduction may be done by dropping gradebook columns based on due date information: +2. Use Fields parameter to limit the data per course in your list to that which is needed. E.g.: `?...&fields=”id, created, availability.available, hasChildren”` + Pulling grades as can be seen by the above Calculating API Usage section can be costly from a rate limit perspective. You can limit the number of requests by targeting specific courses and columns, and pulling grades only when there are new grade changes on existing columns. Meeting this efficiency requires caching of previous request results. You will always have to establish a baseline which will require iterating across all courses, after which your total requests for maintaining your data will be less. -* don’t pull data on columns that are well past the due or graded window, as it is unlikely those grades will have changed. -* don’t pull data on columns that are not yet due – pull data only on columns that are within a due/gradable window based on your understanding of your use case. - -### Use changeIndex and lastChanged as Grade change indicators -The `changeIndex` element for user grades is contained in the result set from: +3. Reduce target range. + Reducing the number of targets is important with all API requests, but even more so with Gradebook requests – this is due to the potential for a large volume of requests. Target reduction may be done by dropping gradebook columns based on due date information: + +- don’t pull data on columns that are well past the due or graded window, as it is unlikely those grades will have changed. +- don’t pull data on columns that are not yet due – pull data only on columns that are within a due/gradable window based on your understanding of your use case. + +### Use changeIndex and lastChanged as Grade change indicators + +The `changeIndex` element for user grades is contained in the result set from: + +`GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}/users` -`GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}/users` +and supplies an indicator of whether the grade presented for a specific user has changed. -and supplies an indicator of whether the grade presented for a specific user has changed. - `GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}/users/lastChanged ` - -Supplies the highest index indicator of whether the grades in a column have changed and the information for that grade. Note that you should not assume this is the only grade that changed – only that there has been a change. -> **Important Note**: Columns of type "Calculated" will always return a changeIndex of zero and an empty lastChanged index. Therefore it is not useful to check for these on a calculated column. +Supplies the highest index indicator of whether the grades in a column have changed and the information for that grade. Note that you should not assume this is the only grade that changed – only that there has been a change. + +> **Important Note**: Columns of type "Calculated" will always return a changeIndex of zero and an empty lastChanged index. Therefore it is not useful to check for these on a calculated column. > See GET column results for the column type: -> "Attempt", "Calculated", or "Manual" -> +> "Attempt", "Calculated", or "Manual" +> > ```json > ... > "grading": { > "type": "Calculated", > ... > ``` -> +> > and when a column is of `"type": "Calculated"` you should process that column's grades as if they had all changed. - -If you cache your first `changeIndex` value when requesting column grades, then on future grading cycles, you call `lastChanged` and only pull grades if your cached value is less than the most recent `lastChanged` value you will find you save a substantial number of requests and also reduce system load. - -### Example -When a course grade book column is created it will have no change index – calling the lastChanged endpoint on that new column will return an empty result. - -After a while when you check if any grades have been submitted on that column you may still get back an empty result. - -But, if you get back something similar to this: + +If you cache your first `changeIndex` value when requesting column grades, then on future grading cycles, you call `lastChanged` and only pull grades if your cached value is less than the most recent `lastChanged` value you will find you save a substantial number of requests and also reduce system load. + +### Example + +When a course grade book column is created it will have no change index – calling the lastChanged endpoint on that new column will return an empty result. + +After a while when you check if any grades have been submitted on that column you may still get back an empty result. + +But, if you get back something similar to this: ``` { - "userId":"_28626_1", - "columnId":"_86244_1", - "status":"Graded", + "userId":"_28626_1", + "columnId":"_86244_1", + "status":"Graded", "displayGrade":{ - "scaleType":"Score", + "scaleType":"Score", "score":3.33333, "possible":10.000000000000000 - }, - "exempt":false, - "changeIndex":7904733} + }, + "exempt":false, + "changeIndex":7904733} } ``` - + You would cache the changeIndex of `7904733` and process the grades on that column using: `GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}/users` -Then later when you want to check grades again, first make a `lastChanged` request on the column – if it comes back the same as your cached value then just skip to the next target column. If it is higher, then cache the new value and fetch the column grades. Note that each grade will have a `changedIndex` – you may further perfect your application to act only on user records which have a differing per column per user `changedIndex` value from your cache. - -Remember, in the event there is a new `changedIndex` returned by `lastChanged` there may be other grade changes; the `lastChanged` index result reflects the most recent change and you should inspect the whole column as shown above. +Then later when you want to check grades again, first make a `lastChanged` request on the column – if it comes back the same as your cached value then just skip to the next target column. If it is higher, then cache the new value and fetch the column grades. Note that each grade will have a `changedIndex` – you may further perfect your application to act only on user records which have a differing per column per user `changedIndex` value from your cache. - \ No newline at end of file +Remember, in the event there is a new `changedIndex` returned by `lastChanged` there may be other grade changes; the `lastChanged` index result reflects the most recent change and you should inspect the whole column as shown above. diff --git a/docs/rest-apis/learn/working-with-learn-apis/groups-and-rest-api.md b/docs/blackboard/rest-apis/hands-on/groups-and-rest-api.md similarity index 99% rename from docs/rest-apis/learn/working-with-learn-apis/groups-and-rest-api.md rename to docs/blackboard/rest-apis/hands-on/groups-and-rest-api.md index b5bd33bad..afe00342c 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/groups-and-rest-api.md +++ b/docs/blackboard/rest-apis/hands-on/groups-and-rest-api.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Using Learn ULTRA on Ultra Course view on Release 3900.34.0-rel.24+41a9160 On a course, it is possible to create groups to divide students according to the study plan, we have APIs available to perform this task, although this document is written thinking in differentiating Ultra and Original, all group set endpoints work with original, even thought it is displayed in a different way. @@ -708,5 +706,3 @@ It returns 204: ``` No content ``` - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/working-with-rubrics.md b/docs/blackboard/rest-apis/hands-on/rubrics.md similarity index 52% rename from docs/rest-apis/learn/working-with-learn-apis/working-with-rubrics.md rename to docs/blackboard/rest-apis/hands-on/rubrics.md index 5b5ad2ca4..b01f97e12 100644 --- a/docs/rest-apis/learn/working-with-learn-apis/working-with-rubrics.md +++ b/docs/blackboard/rest-apis/hands-on/rubrics.md @@ -7,22 +7,22 @@ edited: "2023-10-20" author: Mark O'Neil --- - - > Tested with Blackboard Learn version 3900.69.0 ## Topic -Learn supports the use of Rubrics to provide consistency in grading which enhances the consistency, transparency, and fairness for assessing student work. + +Learn supports the use of Rubrics to provide consistency in grading which enhances the consistency, transparency, and fairness for assessing student work. Our Public APIs support the reading of Rubric information and enables the development of analytic tooling for validating rubrics use and fine-tuning the adoption of rubrics. ## General API Use + There are several use cases supported by our Rubrics APIs and they share a common workflow. Some use cases are determining: -* which, if any, Rubric(s) a course is using. -* the details of a specific Rubric. -* the selected Rubric cells used for a grade. -* the feedback provided on the rubric selection and graded item. +- which, if any, Rubric(s) a course is using. +- the details of a specific Rubric. +- the selected Rubric cells used for a grade. +- the feedback provided on the rubric selection and graded item. The general workflow for using rubrics is based on the goal of the use case, but goes something like this: @@ -31,7 +31,7 @@ The general workflow for using rubrics is based on the goal of the use case, but 2. Get the rubricId 1. Use appropriate Get `/courses/rubric` API 3. Get the rubric to gradebookColumnId association(s) - 1. Use appropriate get `/courses/rubric/associations` api + 1. Use appropriate get `/courses/rubric/associations` api 4. Get the attempt rubric evaluation: 1. Use `/courses/gradebook/attempt` API 2. Use `/courses/gradebook/attempts/rubric/evaluations` or `/courses/rubric/associations/evaluations` API @@ -41,43 +41,48 @@ The API you use in the above steps is largely determined by data previously coll Let's look at each of the steps assuming you have already completed step 1 and identified the course of interest. ### Rubrics used by a course -Not all courses may be using rubrics as part of their grading process. Identifying whether a course is using rubrics is straight forward. + +Not all courses may be using rubrics as part of their grading process. Identifying whether a course is using rubrics is straight forward. You may discover rubrics use either via the courseId alone or via a gradebookColumnId. #### 1. Starting with an identified course -Assuming a courseId of `_12345_1` you would call the Get Rubrics endpoint ```GET /learn/api/public/v1/courses/{courseId}/rubrics```: -```GET /learn/api/public/v1/courses/_12345_1/rubrics``` +Assuming a courseId of `_12345_1` you would call the Get Rubrics endpoint `GET /learn/api/public/v1/courses/{courseId}/rubrics`: + +`GET /learn/api/public/v1/courses/_12345_1/rubrics` which would either return Rubric(s) information or an empty set: ```json { - "results" : [ - { - "id" : "_11964_1", - "courseId" : "_12345_1", - "title" : "DEMO-RUBRIC", - "created" : "2023-10-03T18:55:23.332Z", - "modified" : "2023-10-03T18:55:23.332Z", - "rubricType" : "Percentage", - "readOnly" : false - } - ] + "results": [ + { + "id": "_11964_1", + "courseId": "_12345_1", + "title": "DEMO-RUBRIC", + "created": "2023-10-03T18:55:23.332Z", + "modified": "2023-10-03T18:55:23.332Z", + "rubricType": "Percentage", + "readOnly": false + } + ] } ``` + or + ```json -{"results":[]} +{ "results": [] } ``` -In the above results `id` is the `rubricId` - this should be noted as it and the `courseId` are used in *nearly* every rubrics API request. A course may be using multiple rubrics and the rubicId is used to differentiate between them. +In the above results `id` is the `rubricId` - this should be noted as it and the `courseId` are used in _nearly_ every rubrics API request. A course may be using multiple rubrics and the rubicId is used to differentiate between them. For example once you know the rubricId for a rubric used by a course you may call `GET /learn/api/public/v1/courses/{courseId}/rubrics/{rubricId}` to request a specific rubric. #### 2. Starting with an identified gradebook column -Step 1 helps identify whether a course is potentially using rubrics, but it does not tell us if the instructor has a gradeable item using a rubric. The next step is to determine if the rubric has been applied to a gradeable item or `gradeColumn`. + +Step 1 helps identify whether a course is potentially using rubrics, but it does not tell us if the instructor has a gradeable item using a rubric. The next step is to determine if the rubric has been applied to a gradeable item or `gradeColumn`. There are a couple ways of determining this. You may get get a course's grade columns and inspect the following elements which will exist if a rubric is being used, the `gradebookColumnId` associated, and whether it is currently being `usedForGrading`: @@ -106,6 +111,7 @@ There are a couple ways of determining this. You may get get a course's grade co You may also use the Rubric associations APIs to determine the columns in the course which have rubrics applied as shown below. ##### A known column: + `GET /learn/api/public/v1/courses/{courseId}/gradebook/columns/{columnId}/rubrics/associations ` `/learn/api/public/v1/courses/_12594_1/gradebook/columns/_120127_1/rubrics/associations @@ -127,7 +133,9 @@ You may also use the Rubric associations APIs to determine the columns in the co ] } ``` + ##### A known rubricId + `GET /learn/api/public/v1/courses/{courseId}/rubrics/{rubricId}/associations` `/learn/api/public/v1/courses/_12594_1/rubrics/_11964_1/associations` @@ -148,6 +156,7 @@ You may also use the Rubric associations APIs to determine the columns in the co ] } ``` + Notice the same data is returned regardless of the endpoint used - the difference is the data which you had on hand to make the request. Of note in each of the above results examples is the `"gradebookColumnId": "string",` and `"rubricId" : "_11964_1",` which will be required for further investigation into rubrics use and most importantly the applied evaluations which used the rubric. @@ -155,14 +164,16 @@ Of note in each of the above results examples is the `"gradebookColumnId": "stri Additionally the associationId or id in the get /associations results is used in evaluations requests. The pertinent data we have collected thus far on our rubric quest is: -* `"courseId":"_1234_1` -* `"rubricId": "_11964_1"` -* `"gradebookColumnId": "_120127_1"` -* and `"associationId": "_15388_1"` + +- `"courseId":"_1234_1` +- `"rubricId": "_11964_1"` +- `"gradebookColumnId": "_120127_1"` +- and `"associationId": "_15388_1"` With the above derived information you now know which rubric(s) a course is using and which columns are using which rubric. ### Rubric Details + Using the above information you may also pull the full rubric details by expanding the `GET /learn/api/public/v1/courses/{courseId}/rubrics/{rubricId}` to include the `cells, columns, and rows`. `/learn/api/public/v1/courses/_12594_1/rubrics/_11964_1?expand=cells,columns,rows` @@ -171,160 +182,161 @@ Results: ```json { - "id" : "_11964_1", - "courseId" : "_12594_1", - "title" : "Demo-Rubric", - "description" : "Created via the Original Rubric UI", - "created" : "2023-10-13T12:24:10.696Z", - "modified" : "2023-10-13T12:27:18.899Z", - "rubricType" : "Percentage", - "readOnly" : false, - "columns" : [ - { - "id" : "_43512_1", - "header" : "Novice 1", - "position" : 0 - }, - { - "id" : "_43513_1", - "header" : "Competent 2", - "position" : 1 - }, - { - "id" : "_43514_1", - "header" : "Proficient 3", - "position" : 2 - } - ], - "rows" : [ - { - "id" : "_45496_1", - "header" : "Formatting A", - "position" : 0, - "percentage" : 33.00000 - }, - { - "id" : "_45497_1", - "header" : "Organization B", - "position" : 1, - "percentage" : 34.00000 - }, - { - "id" : "_45498_1", - "header" : "Grammar C", - "position" : 2, - "percentage" : 33.00000 - } - ], - "cells" : [ - { - "id" : "_168718_1", - "rowId" : "_45496_1", - "columnId" : "_43512_1", - "description" : "", - "rowPosition" : 0, - "columnPosition" : 0, - "percentage" : { - "value" : 0.00000 - } - }, - { - "id" : "_168719_1", - "rowId" : "_45496_1", - "columnId" : "_43513_1", - "description" : "", - "rowPosition" : 0, - "columnPosition" : 1, - "percentage" : { - "value" : 50.00000 - } - }, - { - "id" : "_168720_1", - "rowId" : "_45496_1", - "columnId" : "_43514_1", - "description" : "", - "rowPosition" : 0, - "columnPosition" : 2, - "percentage" : { - "value" : 100.00000 - } - }, - { - "id" : "_168721_1", - "rowId" : "_45497_1", - "columnId" : "_43512_1", - "description" : "", - "rowPosition" : 1, - "columnPosition" : 0, - "percentage" : { - "value" : 0.00000 - } - }, - { - "id" : "_168722_1", - "rowId" : "_45497_1", - "columnId" : "_43513_1", - "description" : "", - "rowPosition" : 1, - "columnPosition" : 1, - "percentage" : { - "value" : 50.00000 - } - }, - { - "id" : "_168723_1", - "rowId" : "_45497_1", - "columnId" : "_43514_1", - "description" : "", - "rowPosition" : 1, - "columnPosition" : 2, - "percentage" : { - "value" : 100.00000 - } - }, - { - "id" : "_168724_1", - "rowId" : "_45498_1", - "columnId" : "_43512_1", - "description" : "", - "rowPosition" : 2, - "columnPosition" : 0, - "percentage" : { - "value" : 0.00000 - } - }, - { - "id" : "_168725_1", - "rowId" : "_45498_1", - "columnId" : "_43513_1", - "description" : "", - "rowPosition" : 2, - "columnPosition" : 1, - "percentage" : { - "value" : 50.00000 - } - }, - { - "id" : "_168726_1", - "rowId" : "_45498_1", - "columnId" : "_43514_1", - "description" : "", - "rowPosition" : 2, - "columnPosition" : 2, - "percentage" : { - "value" : 100.00000 - } - } - ] + "id": "_11964_1", + "courseId": "_12594_1", + "title": "Demo-Rubric", + "description": "Created via the Original Rubric UI", + "created": "2023-10-13T12:24:10.696Z", + "modified": "2023-10-13T12:27:18.899Z", + "rubricType": "Percentage", + "readOnly": false, + "columns": [ + { + "id": "_43512_1", + "header": "Novice 1", + "position": 0 + }, + { + "id": "_43513_1", + "header": "Competent 2", + "position": 1 + }, + { + "id": "_43514_1", + "header": "Proficient 3", + "position": 2 + } + ], + "rows": [ + { + "id": "_45496_1", + "header": "Formatting A", + "position": 0, + "percentage": 33.0 + }, + { + "id": "_45497_1", + "header": "Organization B", + "position": 1, + "percentage": 34.0 + }, + { + "id": "_45498_1", + "header": "Grammar C", + "position": 2, + "percentage": 33.0 + } + ], + "cells": [ + { + "id": "_168718_1", + "rowId": "_45496_1", + "columnId": "_43512_1", + "description": "", + "rowPosition": 0, + "columnPosition": 0, + "percentage": { + "value": 0.0 + } + }, + { + "id": "_168719_1", + "rowId": "_45496_1", + "columnId": "_43513_1", + "description": "", + "rowPosition": 0, + "columnPosition": 1, + "percentage": { + "value": 50.0 + } + }, + { + "id": "_168720_1", + "rowId": "_45496_1", + "columnId": "_43514_1", + "description": "", + "rowPosition": 0, + "columnPosition": 2, + "percentage": { + "value": 100.0 + } + }, + { + "id": "_168721_1", + "rowId": "_45497_1", + "columnId": "_43512_1", + "description": "", + "rowPosition": 1, + "columnPosition": 0, + "percentage": { + "value": 0.0 + } + }, + { + "id": "_168722_1", + "rowId": "_45497_1", + "columnId": "_43513_1", + "description": "", + "rowPosition": 1, + "columnPosition": 1, + "percentage": { + "value": 50.0 + } + }, + { + "id": "_168723_1", + "rowId": "_45497_1", + "columnId": "_43514_1", + "description": "", + "rowPosition": 1, + "columnPosition": 2, + "percentage": { + "value": 100.0 + } + }, + { + "id": "_168724_1", + "rowId": "_45498_1", + "columnId": "_43512_1", + "description": "", + "rowPosition": 2, + "columnPosition": 0, + "percentage": { + "value": 0.0 + } + }, + { + "id": "_168725_1", + "rowId": "_45498_1", + "columnId": "_43513_1", + "description": "", + "rowPosition": 2, + "columnPosition": 1, + "percentage": { + "value": 50.0 + } + }, + { + "id": "_168726_1", + "rowId": "_45498_1", + "columnId": "_43514_1", + "description": "", + "rowPosition": 2, + "columnPosition": 2, + "percentage": { + "value": 100.0 + } + } + ] } ``` ### Rubrics Evaluations -Evaluations are part of the grading workflow and as such require accessing gradebook data - specifically attempts. +Evaluations are part of the grading workflow and as such require accessing gradebook data - specifically attempts. #### Attempts + `GET /learn/api/public/v2/courses/{courseId}/gradebook/columns/gradebookColumnId/attempts` `/learn/api/public/v2/courses/_12594_1/gradebook/columns/_120127_1/attempts` @@ -333,45 +345,46 @@ Results: ```json { - "results" : [ - { - "id" : "_844981_1", - "userId" : "_28497_1", - "status" : "Completed", - "displayGrade" : { - "scaleType" : "Score", - "score" : 62.50000 - }, - "text" : "62.50000", - "score" : 62.500000000000000, - "feedback" : "
Overall Feedback
", - "studentSubmission" : "

your 200 word story

", - "exempt" : false, - "created" : "2023-10-09T18:40:34.278Z", - "attemptDate" : "2023-10-09T18:41:00.562Z", - "modified" : "2023-10-12T13:03:14.372Z", - "attemptReceipt" : { - "receiptId" : "eec942431d4f4266b5571ecade1fe4c1", - "submissionDate" : "2023-10-09T18:41:00.562Z", - "submissionTotalSize" : 26 - } - } - ] + "results": [ + { + "id": "_844981_1", + "userId": "_28497_1", + "status": "Completed", + "displayGrade": { + "scaleType": "Score", + "score": 62.5 + }, + "text": "62.50000", + "score": 62.5, + "feedback": "
Overall Feedback
", + "studentSubmission": "

your 200 word story

", + "exempt": false, + "created": "2023-10-09T18:40:34.278Z", + "attemptDate": "2023-10-09T18:41:00.562Z", + "modified": "2023-10-12T13:03:14.372Z", + "attemptReceipt": { + "receiptId": "eec942431d4f4266b5571ecade1fe4c1", + "submissionDate": "2023-10-09T18:41:00.562Z", + "submissionTotalSize": 26 + } + } + ] } ``` The pertinent data we have collected thus far on our rubric quest is: -* `"courseId":"_1234_1` -* `"rubricId": "_11964_1"` -* `"gradebookColumnId": "_120127_1"` -* `"associationId": "_15388_1"` -* `"attemptId" : "_844981_1"` -* and `"userId" : "_28497_1"` +- `"courseId":"_1234_1` +- `"rubricId": "_11964_1"` +- `"gradebookColumnId": "_120127_1"` +- `"associationId": "_15388_1"` +- `"attemptId" : "_844981_1"` +- and `"userId" : "_28497_1"` Note: You may leverage the grade `status` to determine whether to proceed with pulling any evaluation data. There is really no point in making the evaluation requests if the status is not "Completed". #### Evaluations + You may use the attempt information, notably the `attemptId` and the `gradebookColumnId` to find the instructor entered evaluation data: `GET /learn/api/public/v1/courses/{courseId}/gradebook/columns/{columnId}/attempts/{attemptId}/rubric/evaluations` @@ -381,35 +394,36 @@ Results: ```json { - "results" : [ - { - "id" : "_47213_1", - "rubricAssociationId" : "_15388_1", - "evaluationEntity" : { - "attemptId" : "_844981_1" - }, - "possibleScore" : { - "numerator" : 100, - "denominator" : 1 - }, - "totalScore" : { - "numerator" : 125, - "denominator" : 2 - }, - "submitted" : "2023-10-11T19:56:19.483Z" - } - ] + "results": [ + { + "id": "_47213_1", + "rubricAssociationId": "_15388_1", + "evaluationEntity": { + "attemptId": "_844981_1" + }, + "possibleScore": { + "numerator": 100, + "denominator": 1 + }, + "totalScore": { + "numerator": 125, + "denominator": 2 + }, + "submitted": "2023-10-11T19:56:19.483Z" + } + ] } ``` + The pertinent data we have collected thus far on our rubric quest is: -* `"courseId":"_1234_1` -* `"rubricId": "_11964_1"` -* `"gradebookColumnId": "_120127_1"` -* `"associationId": "_15388_1"` -* `"attemptId" : "_844981_1"` -* `"userId" : "_28497_1"` -* and `"evaluationId": "_47213_1"` +- `"courseId":"_1234_1` +- `"rubricId": "_11964_1"` +- `"gradebookColumnId": "_120127_1"` +- `"associationId": "_15388_1"` +- `"attemptId" : "_844981_1"` +- `"userId" : "_28497_1"` +- and `"evaluationId": "_47213_1"` To access the actual rubric criteria applied for the evaluation and any feedback provided by the grader you need to expand the evaluation cells: @@ -421,62 +435,62 @@ Results: ```json { - "id" : "_47213_1", - "rubricAssociationId" : "_15388_1", - "evaluationEntity" : { - "attemptId" : "_844981_1" - }, - "possibleScore" : { - "numerator" : 100, - "denominator" : 1 - }, - "totalScore" : { - "numerator" : 125, - "denominator" : 2 - }, - "submitted" : "2023-10-11T19:56:19.483Z", - "cells" : [ - { - "id" : "_95594_1", - "rubricCellId" : "_167078_1", - "rubricRowId" : "_45050_1", - "selectedScore" : { - "numerator" : 100, - "denominator" : 1 - }, - "feedback" : "

comment 1

" - }, - { - "id" : "_95596_1", - "rubricCellId" : "_167083_1", - "rubricRowId" : "_45051_1", - "selectedScore" : { - "numerator" : 75, - "denominator" : 1 - }, - "feedback" : "

comment 2

" - }, - { - "id" : "_95599_1", - "rubricCellId" : "_167088_1", - "rubricRowId" : "_45052_1", - "selectedScore" : { - "numerator" : 50, - "denominator" : 1 - }, - "feedback" : "

comment 3

" - }, - { - "id" : "_95603_1", - "rubricCellId" : "_167093_1", - "rubricRowId" : "_45053_1", - "selectedScore" : { - "numerator" : 25, - "denominator" : 1 - }, - "feedback" : "

comment 4

" - } - ] + "id": "_47213_1", + "rubricAssociationId": "_15388_1", + "evaluationEntity": { + "attemptId": "_844981_1" + }, + "possibleScore": { + "numerator": 100, + "denominator": 1 + }, + "totalScore": { + "numerator": 125, + "denominator": 2 + }, + "submitted": "2023-10-11T19:56:19.483Z", + "cells": [ + { + "id": "_95594_1", + "rubricCellId": "_167078_1", + "rubricRowId": "_45050_1", + "selectedScore": { + "numerator": 100, + "denominator": 1 + }, + "feedback": "

comment 1

" + }, + { + "id": "_95596_1", + "rubricCellId": "_167083_1", + "rubricRowId": "_45051_1", + "selectedScore": { + "numerator": 75, + "denominator": 1 + }, + "feedback": "

comment 2

" + }, + { + "id": "_95599_1", + "rubricCellId": "_167088_1", + "rubricRowId": "_45052_1", + "selectedScore": { + "numerator": 50, + "denominator": 1 + }, + "feedback": "

comment 3

" + }, + { + "id": "_95603_1", + "rubricCellId": "_167093_1", + "rubricRowId": "_45053_1", + "selectedScore": { + "numerator": 25, + "denominator": 1 + }, + "feedback": "

comment 4

" + } + ] } ``` @@ -485,33 +499,45 @@ Now that you know the rubricCellId and rubricRowId you may inspect the original Also, by this point you have collected sufficient information (course, user, grade column, grade, rubric, etc) to inform any additional logic such as passing data to your SIS, Reporting, or User facing interfaces! ## Entitlements and System Role Privileges -### Necessary Entitlements + +### Necessary Entitlements + Rubrics entitlements required per endpoint are listed in the rubrics API documentation. #### Read Rubrics -* course.rubrics.VIEW + +- course.rubrics.VIEW + #### Read Associations -* course.rubrics.VIEW -* course.gradebook-metadata.VIEW -* course.gradebook.MODIFY + +- course.rubrics.VIEW +- course.gradebook-metadata.VIEW +- course.gradebook.MODIFY + #### Read Evaluations, and Columns and Attempts -* course.gradebook.MODIFY +- course.gradebook.MODIFY + +### Necessary Role Privileges -### Necessary Role Privileges **Note**: You must share these System Role Privileges with Learn System Admins via your documentation for successful deployment of your application on their Learn server. + #### Read Rubrics -* Course/Organization Control Panel (Tools) > Rubrics > View Rubric + +- Course/Organization Control Panel (Tools) > Rubrics > View Rubric + #### Read Associations -* Course/Organization Control Panel (Tools) > Rubrics > View Rubric -* Course/Organization Control Panel (Grade Center) > View Grade Center Items and Settings -* Course/Organization Control Panel (Grade Center) > Full Control + +- Course/Organization Control Panel (Tools) > Rubrics > View Rubric +- Course/Organization Control Panel (Grade Center) > View Grade Center Items and Settings +- Course/Organization Control Panel (Grade Center) > Full Control + #### Read Evaluations, and Columns and Attempts -* Course/Organization Control Panel (Grade Center) > Full Control + +- Course/Organization Control Panel (Grade Center) > Full Control ## Rubrics APIs Best Practices -Note: Please review our General REST API Best Practices which are outlined in our [REST API Best Practices](/docs/rest-apis/rest-api-best-practices) guide. -* Cache rubrics and gradebook data when working within a specific course and gradebook to reduce the number of requests required. +Note: Please review our General REST API Best Practices which are outlined in our [REST API Best Practices](/docs/blackboard/rest-apis/best-practices.md) guide. - \ No newline at end of file +- Cache rubrics and gradebook data when working within a specific course and gradebook to reduce the number of requests required. diff --git a/docs/rest-apis/learn/learn-intro.md b/docs/blackboard/rest-apis/learn-intro-[review].md similarity index 97% rename from docs/rest-apis/learn/learn-intro.md rename to docs/blackboard/rest-apis/learn-intro-[review].md index 6f354020b..8b419cb0b 100644 --- a/docs/rest-apis/learn/learn-intro.md +++ b/docs/blackboard/rest-apis/learn-intro-[review].md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Blackboard Learn has a long history of integration development support. Over the years since the Learn LMS (Learning Management System) was released in 1997, Blackboard has continued to enhance its integration capabilities. Starting with Java™ Building Blocks, SOAP Web Services, Learning Tools Interoperability (LTI), and adding RESTful APIs in 2016. Blackboard Learn integrations are similar to plugins or add-ons in other software platforms, and are designed to extend the core functionality of the Blackboard Learn platform to meet the specific needs of individual institutions. @@ -38,5 +36,3 @@ Blackboard Learn REST APIs support a wide range of functionality for integrating Anthology provides comprehensive [REST API documentation](https://developer.anthology.com/portal/displayApi/Learn) that describes the various endpoints, request and response formats, and authentication methods that are available. The documentation on this site includes examples and code snippets to help you get started with using the REST APIs in your integrations. Also provided is a [github repo](https://github.com/search?q=org%3Ablackboard+blackboard%2FBBDN-) containing useful application code for getting started. - - diff --git a/docs/standards/standards-intro.md b/docs/blackboard/standards-intro.md similarity index 98% rename from docs/standards/standards-intro.md rename to docs/blackboard/standards-intro.md index 32472b116..c685565a7 100644 --- a/docs/standards/standards-intro.md +++ b/docs/blackboard/standards-intro.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Anthology believes in that support for standards is a necessary component of our integration strategy and in the delivery of our products. ## What are Standards? @@ -48,5 +46,3 @@ Anthology supports many standards across our our product portfolio. Some of the **QTI**: Question and Test Interoperability is a standard from [1EduTech](https://www.1edtech.org) for creating and sharing assessment items and tests. Blackboard Learn supports QTI 1.2 and 2.1, which enables users to create and import QTI-compliant assessment content and deliver it within Blackboard Learn. Anthology also supports other standards related to accessibility, security, data privacy, and other aspects of e-learning and educational technology. - - diff --git a/docs/community/community-intro.md b/docs/community/community-intro.md index d615c3b33..e5d6f386d 100644 --- a/docs/community/community-intro.md +++ b/docs/community/community-intro.md @@ -7,8 +7,6 @@ edited: "2023-05-09" author: Scott Hurrey --- - - Welcome you to Anthology's developer community! As a community of developers, we are committed to working together to build innovative and cutting-edge solutions that push the boundaries of what is possible in education. Anthology is a platform that connects edutech software and content developers with their audiences, allowing them to monetize their content while providing Anthology clients with a seamless experience. We believe that developers like you are critical to our and our clients success in delivering education, and we are excited to collaborate with you to build the future of edutech. @@ -28,5 +26,3 @@ Thank you for joining us on this journey. We look forward to working with you to Live and in person in Music City, Nashville, Tennessee at the Gaylord Opryland Resort [Information and Registration](https://www2.anthology.com/together) - - diff --git a/docs/community/contact.md b/docs/community/contact.md index 370fb1149..0f7d992bd 100644 --- a/docs/community/contact.md +++ b/docs/community/contact.md @@ -8,8 +8,6 @@ edited: "2023-05-09" sidebar_position: 3 --- - - There are many ways to get in touch with us: - E-mail the Anthology Developers Network Team: [developers@anthology.com](mailto:developers@anthology.com) @@ -18,5 +16,3 @@ There are many ways to get in touch with us: - Join the [Anthology Techies Slack channel.](https://join.slack.com/t/blackboardtechies/shared_invite/zt-21ayvh4af-FMtP3g~MTHY0aay6CvcZtw) - Tell us in person at a conference - Provide your feedback through one of our many users groups - - diff --git a/docs/community/getting-involved.md b/docs/community/getting-involved.md index 58b4f71c8..a8e3a0fc5 100644 --- a/docs/community/getting-involved.md +++ b/docs/community/getting-involved.md @@ -8,8 +8,6 @@ edited: "2023-05-09" sidebar_position: 2 --- - - Getting involved in the Developer community is easy and with options to suit your goals… - If you have not already done so, register for an Anthology Developer Community account to interact. Its free, and gives you the ability to participate in all of the Anthology Communities. If you are interested in contributing to the blogs here on the Community site, let us know. @@ -30,5 +28,3 @@ Getting involved in the Developer community is easy and with options to suit you ### Tech office hours call Join our call, every wednesday at 10:00 AM Central on Microsoft Teams! please follow ->[this link](https://bit.ly/AT-Techies-office-hours-MS-TEAMS) - - diff --git a/docs/rest-apis/learn/sandbox/developer-ami.md b/docs/developer-ami.md similarity index 96% rename from docs/rest-apis/learn/sandbox/developer-ami.md rename to docs/developer-ami.md index 6ab7da63f..2d077dbb3 100644 --- a/docs/rest-apis/learn/sandbox/developer-ami.md +++ b/docs/developer-ami.md @@ -1,13 +1,18 @@ --- -title: Using the Learn AMI for REST and LTI Development +title: Blackboard Learn Sandbox environment id: developer-ami categories: AMI author: Mark O'Neil published: "2018-07-04" -edited: "2023-09-12" +edited: "2024-07-26" --- - +:::danger AMI availability + +As of July 26th, 2024, the last available image is Blackboard Learn 3900.95.0 and will be the latest image available while we review and align the publishing process with Amazon Web Services. + +Once the review is completed, we'll resume publishing with the latest version of Blackboard Learn as an Amazon Marketplace Image +::: This document outlines usage of the [Learn REST and LTI Developer AMI](https://aws.amazon.com/marketplace/pp/prodview-fdbvv2vvikoq4) made available via the Amazon AWS Marketplace. @@ -213,5 +218,3 @@ Currently, there is no formal migration/transfer tool to port Learn data between #### Notice - AVG on Windows Systems While using the AVG antivirus product on a Windows system and attempting to create a course using Learn, AVG may manifest what we believe is a false positive dialog regarding CVE-2014-0286-A. This can occur while using any browser, though the error message is specific to now unsupported versions of Microsoft Internet Explorer 6 through 11. Our security team has indicated that this is an issue with the AVG software. See the AVG website for questions about configuring the AVG software, and for their contact information. - - diff --git a/docs/developer-portal/best-practices.md b/docs/developer-portal/best-practices.md index d001821f8..16f6c0ce2 100644 --- a/docs/developer-portal/best-practices.md +++ b/docs/developer-portal/best-practices.md @@ -8,15 +8,13 @@ edited: "2024-03-20" author: Davey Herrera, Dan Magers --- - - ## How to name your groups Your group name is displayed in the Blackboard Learn system associated with the application ID once the Blackboard Learn Administrator configures the integration. You want the group name to include at minimum: 1. The name of the company/vendor that owns the application. -2. The name of the application or product (optional). +2. The name of the application or product (optional). Below is an example for one application ID group name. Included are the company name, product name, and group associated with it: @@ -47,5 +45,3 @@ following: **Do not add unnecessary information to a production group name. For example, including text indicating that the group name is associated with Blackboard REST APIs is not necessary, nor is an indication of server type such as '-test', '-stage', or '-production'.** It doesn't matter if you have a SOAP Web Service proxy of the same name as that shows up on a different page. **We will only assign site and rate limits higher than the defaults to Production Groups that meet these naming requirements.** - - diff --git a/docs/developer-portal/creating-and-managing-groups.md b/docs/developer-portal/creating-and-managing-groups.md index 75450526f..456e84ae3 100644 --- a/docs/developer-portal/creating-and-managing-groups.md +++ b/docs/developer-portal/creating-and-managing-groups.md @@ -8,7 +8,6 @@ edited: "2024-03-20" date: 2023-05-09 author: Davey Herrera, Dan Magers --- - ## What are Groups? @@ -35,8 +34,6 @@ You can create groups for individual and team development. You can target a spec 4. **Add a new developer to the group.** Add a developer to a group using the developer's email address. 5. **Change the administrator status.** You can give administrator privileges to exisiting group members. An administrator is empowered to: - - Add new developers to the group - - Edit, Delete or manage keys of the application. - - Manage placements and see which schools have the application deployed. - - + - Add new developers to the group + - Edit, Delete or manage keys of the application. + - Manage placements and see which schools have the application deployed. diff --git a/docs/developer-portal/creating-rest-or-lti-application.md b/docs/developer-portal/creating-rest-or-lti-application.md index e93edbe6e..29a69fd54 100644 --- a/docs/developer-portal/creating-rest-or-lti-application.md +++ b/docs/developer-portal/creating-rest-or-lti-application.md @@ -7,7 +7,6 @@ published: "2023-05-09" edited: "2024-03-20" author: Davey Herrera, Dan Magers --- - This page explains how to register and manage a REST API or LTI application. @@ -21,7 +20,7 @@ You can take two actions: 1. **Register a REST or LTI application.** Select to register a new REST or LTI application. If you already have an application registered, the button’s text is replaced by a **+** to add another application. -2. **LTI Dynamic Registration.** Read more about this topic in our documentation: [LTI Dynamic Registration](/docs/lti/sanctioned-lti-registration-deployment.md). +2. **LTI Dynamic Registration.** Read more about this topic in our documentation: [LTI Dynamic Registration](/docs/blackboard/lti/sanctioned-lti-registration-deployment.md). ## Register a REST or LTI application @@ -29,7 +28,7 @@ Select **Register a REST or LTI application** to manually register a new REST AP ### Manual Registration of a REST API Integration -In the application form, enter your application information. **Fields with a red asterisk (*) are required.** +In the application form, enter your application information. **Fields with a red asterisk (\*) are required.** ![Registering a REST application](/assets/img/create-rest-or-lti-app-3.png) 1. **Application Name.** Enter your application's name. @@ -46,7 +45,7 @@ In the application form, enter your application information. **Fields with a red ### Manual registration of an LTI integration -To register an LTI integration, enter your application's information in the form as described in [Manual registration of a REST API integration](#manual-registration-of-a-rest-api-integration). Switch **My integreaton supports LTI 1.3** to ON. This enables a second part of the form. Enter information required for the integration to communicate with your application on your end. These fields are explained in [LTI 1.3 Fields](/docs/lti/getting-started-with-lti.md#lti-13-fields). +To register an LTI integration, enter your application's information in the form as described in [Manual registration of a REST API integration](#manual-registration-of-a-rest-api-integration). Switch **My integreaton supports LTI 1.3** to ON. This enables a second part of the form. Enter information required for the integration to communicate with your application on your end. These fields are explained in [LTI 1.3 Fields](/docs/blackboard/lti/getting-started-with-lti.md#lti-13-fields). 1. **Login Initiation URL** 2. **Tool Redirect URL(s)** @@ -62,7 +61,7 @@ Once you have filled out and submitted the form, add the following information d #### Register REST API application -When you register a REST API application, you see three values that the developer portal returns. **These are shown only once, and Anthology cannot retrieve them. Make sure to document them for your records**: +When you register a REST API application, you see three values that the developer portal returns. **These are shown only once, and Anthology cannot retrieve them. Make sure to document them for your records**: 1. Application Key 2. Secret @@ -113,17 +112,18 @@ Here you will be able to: - The following data cannot be edited: - - Data as Issuer - - Public keyset URL - - Auth token endpoint - - OIDC auth request endpoint + - Data as Issuer + - Public keyset URL + - Auth token endpoint + - OIDC auth request endpoint 4. **Delete your application.** This removes your application. This is a one-way operation and cannot be undone. 5. **Manage your keys.** You can create new keys (keys and secrets), but the application keeps the same application ID. This can be used when you want to rotate your keys or make an old key and secret unusuable. You may never need to create additional keys. When you select **+**, it will generate new values that will be shown only once. Document and store them in a safe place because Anthology is unable to retrieve this data. - ![Manage keys](/assets/img/create-rest-or-lti-app-8.png) -6. **Manage your application's placements.** Register a placement (LTI) that is applied whenever a new client adds this placement to their own Blackboard Learn instance and switches it ON. Enter the following data: + ![Manage keys](/assets/img/create-rest-or-lti-app-8.png) + +6. **Manage your application's placements.** Register a placement (LTI) that is applied whenever a new client adds this placement to their own Blackboard Learn instance and switches it ON. Enter the following data: - Placement name - Description - Type (Course Tool, Course content tool, deep linking content tool, System tool, administrator, ultra extension) @@ -132,9 +132,10 @@ Here you will be able to: - Custom parameters ![registering a new placement](/assets/img/create-rest-or-lti-app-9.png) 7. **Review the schools that have integrated your application.** At the top right of the page, view a list of sites that are registered and using your application. this is how it looks by default: - ![What schools](/assets/img/create-rest-or-lti-app-10.png) + ![What schools](/assets/img/create-rest-or-lti-app-10.png) + - This is how it looks like when you have already registered an application: - ![What schools with a registered school](/assets/img/create-rest-or-lti-app-11.png) + ![What schools with a registered school](/assets/img/create-rest-or-lti-app-11.png) ## My Site Registrations @@ -143,5 +144,3 @@ On this tab, can delete the registrations for sites that are no longer using you When a site is registered it will be displayed here and it will look like this: ![Registrations](/assets/img/create-rest-or-lti-app-12.png) - - diff --git a/docs/developer-portal/dev-portal-maintenance.md b/docs/developer-portal/dev-portal-maintenance.md index 474883e31..b868a440a 100644 --- a/docs/developer-portal/dev-portal-maintenance.md +++ b/docs/developer-portal/dev-portal-maintenance.md @@ -3,13 +3,11 @@ title: Developer Portal Maintenance and Releases sidebar_position: 8 displayed_sidebar: documentationSidebar id: devportal-maintenance -published: '2023-05-09' -edited: '2024-03-20' +published: "2023-05-09" +edited: "2024-03-20" author: Mark O'Neil, Davey Herrera, Dan Magers, Camilo Dominguez --- - - ### Maintenance and Update Window The Developer Portal has an _optional_ maintenance window scheduled every month on the Tuesday of the second week (after SaaS updates). The exception to this monthly maintenance schedule is when critical patches are required. @@ -95,5 +93,3 @@ Release Name: 2023.2 Features: - **Announcement Panel**: The Announcement Panel provides Developer facing Portal, APIs, and Event information. When a new announcement is available it will be indicated via a red dot on the Announcements icon in the Portal task bar. Clicking on the Announcements icon displays active announcements - latest at the top. - - diff --git a/docs/developer-portal/dev-portal-start-here.md b/docs/developer-portal/dev-portal-start-here.md index fe8047087..3196338b5 100644 --- a/docs/developer-portal/dev-portal-start-here.md +++ b/docs/developer-portal/dev-portal-start-here.md @@ -1,15 +1,13 @@ --- -title: 'Start here' -id: 'start-here' +title: "Start here" +id: "start-here" categories: Developer Portal -published: '2023-05-09' -edited: '2024-03-19' +published: "2023-05-09" +edited: "2024-03-19" sidebar_position: 1 author: Davey Herrera, Dan Magers --- - - On this page learn about the Anthology Developer Portal. Learn how to register for and navigate in the Portal. Selecting a navigation link on the side panel of this page takes you to that section. ## What is the Anthology Developer Portal? @@ -171,5 +169,3 @@ This applies to our Learn, Ally and Student APIs that user Swagger for documenta 5. Description of the value of the attribute. ![Response model](/assets/img/dev-portal-start-here-18.png) - - diff --git a/docs/developer-portal/faq.md b/docs/developer-portal/faq.md index 2f985e63c..32743fbf6 100644 --- a/docs/developer-portal/faq.md +++ b/docs/developer-portal/faq.md @@ -8,8 +8,6 @@ edited: "2024-03-20" author: Davey Herrera, Dan Magers --- - - This page is an ongoing collection of frequently asked questions about the Developer Portal. ## How do I change the ownership of my application? @@ -17,5 +15,3 @@ This page is an ongoing collection of frequently asked questions about the Devel Sometimes the owner of an application is a person and not a group. When that person leaves the company, the application continues under that person's email address. You can follow this video to change ownership. Anthology is unable to make changes to ownership of any application. - - diff --git a/docs/developer-portal/production-groups-rest-api-and-site-reg-limits.md b/docs/developer-portal/production-groups-rest-api-and-site-reg-limits.md index e9b4c8b3c..44da56831 100644 --- a/docs/developer-portal/production-groups-rest-api-and-site-reg-limits.md +++ b/docs/developer-portal/production-groups-rest-api-and-site-reg-limits.md @@ -8,8 +8,6 @@ edited: "2024-03-20" author: Davey Herrera, Dan Magers --- - - You can create as many groups as you need to manage your application. Additionally, you can create a **production group** to centralize the management of your application. ## Production groups @@ -54,5 +52,3 @@ application level using the http headers provided in each request response._ Inf | X-Rate-Limit-Limit | The rate limit ceiling for the given development group. | | X-Rate-Limit-Remaining | The number of requests left for the 24-hour period for the development group. | | X-Rate-Limit-Reset | The remaining time before the rate limit resets, given in UTC epoch seconds. | - - diff --git a/docs/developer-portal/rate-limit-migration.md b/docs/developer-portal/rate-limit-migration.md index b42189893..eb3e18679 100644 --- a/docs/developer-portal/rate-limit-migration.md +++ b/docs/developer-portal/rate-limit-migration.md @@ -8,8 +8,6 @@ edited: "2024-01-30" author: Daniel Nieto --- - - ## Background The [Anthology Developer Portal](https://developer.anthology.com) plays a crucial role in the integrations with the Anthology product portfolio, as such it handles millions of requests each day, making the implementation of a rate limit mechanism essential. @@ -51,5 +49,3 @@ In our ongoing effort to optimize and enhance our system's performance, we are t | X-Rate-Limit-Remaining | The number of requests left for the 24-hour period for the development group | > Please note that the current 24 hours refresh period may be shortened in the future. - - diff --git a/docs/maintenance-and-releases.md b/docs/maintenance-and-releases.md new file mode 100644 index 000000000..de547a832 --- /dev/null +++ b/docs/maintenance-and-releases.md @@ -0,0 +1,127 @@ +--- +title: Service Maintenances and Releases +id: maintenance-page +sidebar_position: 1 +hide_table_of_contents: true +published: "2024-07-26" +edited: "2024-07-26" +author: Mark O'Neil, Davey Herrera, Dan Magers, Camilo Dominguez, Sebastian Silva +--- + +## Developer Portal + +The Developer Portal has an _optional_ maintenance window scheduled every month on the Tuesday of the second week (after SaaS updates). The exception to this monthly maintenance schedule is when critical patches are required. + +You may monitor the Portal maintenance schedule and progress at [https://status.blackboard.com](https://status.blackboard.com) and review any update release notes below. + +When maintenance is executed or we set a release date/time (which usually happens on a maintenance window) our production system will not be able to take requests and any calls that rely on the Developer Portal. During this time, any request will fail. + +:::warning Outages + +Should a critical outage\* take place, we will release a detailed post-mortem on Behind the Blackboard as soon as possible (typically within four days post event). + +Any non-critical outage\*\* will be covered using our in-Portal announcements feature only. +::: + +
+Release Notes + +#### May 28th 2024 - 02:30 AM EST + +The Developer Portal will undergo a maintenance update at this time. There is no downtime involved. + +- Release Name: DP2024.3 +- Release Date : 05/28 +- Release Time : 02:30 AM EST (6:30 AM UTC) (12:00 PM IST) +- Downtime : 0 Mins + +**Purpose:** + +**Rate Limiting**: +A more effective method for managing rate limits of API usage with enhanced control. Enjoy the flexibility to adjust from a 24-hour cycle to any time interval that better fits developer's requirements. + +**Performance issue fix:** +SQL Query optimization to address the Performance issue + +--- + +#### 25 February 2024 @ 1:30 am EST + +We moved this maintenance and feature release due to questions and requests from different sources to Feb 20th 2024. Maintenance release. + +- **Admin to create groups**: Enable Portal Administrators to create/view/edit Portal Account Groups and to manage the created groups. + +- **Audit Trail**: Admin to track events and actions done by both the registered developers and admins. This feature also includes downloadable log as a spreadsheet(csv) over a specified timeframe. + +--- + +#### 17 October 2023 + +Maintenance only. + +In order to improve performance during peak usage periods and mitigate the risk of database connection failures due to over utilization we are upgrading our database instance type. + +The Developer Portal will remain available during this time. Though some database related features such as creating new accounts or applications will be unavailable during the maintenance period. The _actual expected duration_ of the maintenance period is 2 minutes or less. + +Maintenance Date : 10/17/2023 + +Maintenance Time : 06:30 AM UTC (2023-10-17T06:30:00Z) + +Maintenance window : 10 Mins + +You may follow status and updates at [https://status.blackboard.com](https://status.blackboard.com). + +--- + +#### 11 July 2023 + +Release Name: 2023.3 + +:exclamation: The length of this maintenance window, 12:30 am - 02:30 am EST, is due to the Redis Upgrade, but may complete in ~45 minutes. We apologize in advance for the short notice. + +Features: + +- **Redis Upgrade**: For security and performance purposes we are upgrading to the latest version of Redis. This will have no impact on current Developer-facing functionality. +- **LTI Dynamic Registration**: For performance and forward looking enhancements we are improving the backend which supports the dynamic registration of LTI integrations with Learn. This will have no impact on current Developer-facing functionality. + +--- + +#### 6 June 2023 + +Release Name: 2023.2 + +Features: + +- **Announcement Panel**: The Announcement Panel provides Developer facing Portal, APIs, and Event information. When a new announcement is available it will be indicated via a red dot on the Announcements icon in the Portal task bar. Clicking on the Announcements icon displays active announcements - latest at the top. + +
+ +--- + +## Blackboard Learn + +Learn release dates and release notes can be found through [Behind the Blackboard](https://behind.blackboard.com) or through our Help Documentation: + +- Release schedules for Blackboard Learn: [Release Schedule](https://help.blackboard.com/Learn/Administrator/SaaS/Release_Notes/Learn_SaaS_Release_Schedule) +- Release Notes: [Release Notes](https://help.blackboard.com/Learn/Administrator/SaaS/Release_Notes) + +--- + +## Student + +Anthology Student releases and docs are published through the Student Suite here: [Anthology Student Suite](https://help.anthology.com/Content/DocSets/CNSDocSet.htm) + +--- + +## Reach + +Anthology Release releases and docs are published through the Reach Suite here: [Anthology Reach Suite](https://help.campusmanagement.com/Content/DocSets/ENGDocSet.htm) + +--- + +:::note Annotations + +\* critical outage: service is unavailable or operating outside of usable performance or functional parameters. + +\*\* non-critical outage: service is available, but operating at reduced performance. +::: diff --git a/docs/partners/become-a-partner.md b/docs/partners/become-a-partner.md index 292d7d6a0..674fd4e2f 100644 --- a/docs/partners/become-a-partner.md +++ b/docs/partners/become-a-partner.md @@ -8,8 +8,6 @@ author: Mark Kauffman sidebar_position: 1 --- - - Our Community partnership level is FREE to developers and provides access to the Learn AMI (Amazon Machine Images) for developers to build REST and LTI applications\*, API limits apply and Behind the Blackboard support is not included. [Community support is available](https://community.blackboard.com). Consider investing in one of our other partnership levels to receive added benefits that help partners deepen integrations, promote solutions, and connect with Blackboard clients. The Blackboard Developers Network (BbDN) is Blackboard’s standard partnership and is available for $3,000 annually. BbDN Partnerships include the following benefits: @@ -36,5 +34,3 @@ Purchase your BbDN partnership [here for US Companies](https://shop.blackboard.c Blackboard Partnerships Team \*REST is an acronym for REpresentational State Transfer and an architectural style for distributed hypermedia systems. Learn has a complete suite of APIs based on this standard. See [developer.anthology.com](https://developer.anthology.com). LTI is an industry standard developed by the IMS. Learn supports LTI 1.1 and LTI 1.3 Advantage. See www.imsglobal.org/activity/learning-tools-interoperability - - diff --git a/docs/partners/blackboard-app-catalog-faq.md b/docs/partners/blackboard-app-catalog-faq.md index 19f0e6961..6d8944198 100644 --- a/docs/partners/blackboard-app-catalog-faq.md +++ b/docs/partners/blackboard-app-catalog-faq.md @@ -11,8 +11,6 @@ redirect_from: sidebar_position: 2 --- - - ## What is the Blackboard App Catalog? Partner integrations continue to play a critical and vital role within the Learn ecosystem, and we’ve always strived to maintain a current and detailed inventory of our partners and their available integrations. The new App Catalog directly enables our partner community to manage their own App listings—ultimately providing our clients with a current, comprehensive, and detailed list of available integrations across all flavors of Learn. As our partner community continues to expand, and our clients navigate their transitions from the Original to Ultra experience of Learn, partner integrations are more important than ever before. Our partners and clients deserved a scalable, dynamic, and comprehensive resource for partner integrations – and we’ve delivered. @@ -72,5 +70,3 @@ Reach out to the [Blackboard App Catalog Team](mailto:appcatalog@blackboard.com? --- > †† The 3rd party Ultra Ready integrations available through the Blackboard App Catalog allow you to use the named 3rd party service with the Ultra experience in Learn. By enabling any 3rd party integrations you agree that any use of the a 3rd party service is governed solely by the terms of use by the named 3rd party (and you shall comply with all such terms of use). Any contract entered into, services provided, or any transaction completed via the named 3rd party is between you and that party, and not Blackboard. Blackboard makes no representation with respect to the named 3rd parties and shall have no liability or obligation whatsoever in relation to the content provided to or available at, use of, or correspondence with, the named 3rd party or any transactions completed and any contract entered into by you with any named 3rd party. Further, by authorizing a 3rd party integration, you authorize Blackboard to provide limited personal information required for the named 3rd party ("Integration Information"). You agree that Blackboard is not responsible for the data privacy and security practices of named 3rd party and Blackboard is not liable for any unauthorized access to the Integration Information. You accept that you are solely responsible for meeting any applicable requirements and the consequences of authorizing named 3rd party to access the Integration Information. - - diff --git a/docs/rest-apis/learn/working-with-learn-apis/using-calendar-api.md b/docs/rest-apis/learn/working-with-learn-apis/using-calendar-api.md deleted file mode 100644 index 7d30fdd14..000000000 --- a/docs/rest-apis/learn/working-with-learn-apis/using-calendar-api.md +++ /dev/null @@ -1,742 +0,0 @@ ---- -title: "Working with Calendar APIs" -id: calendar-apis -categories: Learn REST Working-with APIs Calendar -published: "2022-10-03" -edited: "2023-10-20" -author: Davey Herrera, Mark O'Neil ---- - - - -> Tested with Blackboard Learn version 3900.48.0 -> -> Note: non-3LO capabilities available in Blackboard Learn version 3900.78.0 - -## Topic -Learn provides an internal calendar system for Institutional, Course, and Personal calendar items. Learn Public REST APIs for this calendar system allow external integrations to manage Institutional and Course Calendars. For Personal calendars use of three-legged-oauth (3LO) is required. - -Notes: - -* All Learn Calendar APIs work the same for either Original or Ultra course experiences. - -* Learn Public REST APIs are documented at https://developer.anthology.com/portal/displayAPI/Learn - -* All Calendar APIs are accessible based on the integration Privileges whether using 3LO or basic OAuth 2.0. - -This document covers General API Use and Best Practices to meet use cases for using the Learn REST APIs for the Learn Calendar. - -It is strongly recommended to follow the Best Practices outlined below. - -# General API Use -Details follow below but in general, the workflow for accessing and processing calendar items is best broken down by calendar type and desired action – Create, Read, Update, or Delete calendarItems. - -Mapping a calendar Item to the API payload -This is an example of how a Course schedule item looks like in the GUI and in the payload when calling it using: -GET /learn/api/public/v1/calendars/items?courseId=_905_1 - - - -## General Usage Notes for all endpoints -We are not able to create, update or delete Calendars BUT We can create new calendarItems on those calendars. - -Please keep in mind that: - -* All 3LO users can view their own institutional items in calendar. -* All 3LO users can view their own personal items in calendar. -* Non-3LO applications can view all calendarTypes and calendarItems except for the Personal Calendar. -* If SINCE and UNTIL are not provided, the endpoint will default to the upcoming two weeks timeframe from NOW. -* If only SINCE is provided, this endpoint will default the UNTIL parameter two weeks after SINCE. -* If only UNTIL is provided the endpoint will default the SINCE parameter two weeks prior to UNTIL. -* Maximum timespan between SINCE and UNTIL is 16 weeks. -* The course calendar must be enabled for the course GradebookColumn associate with OfficeHours. -* If OfficeHours are created for a course calendar (calendarId == a course_id). -* The course calendar must be enabled for course calendar items associated with GradebookColumn. -* CalendarItems of type GradebookColumn are a representation of a specific gradable item and there read-only. Modifications to GradebookColumn items performed via the GradebokColumn endpoints will be reflected in the CalentarItems endoints. -* If you want to use the `columnIds` from Gradebook Column as a calendar Item id, you can get those from `/learn/api/public/v2/courses/{courseId}/gradebook/columns/{columnId}` -* *You cannot read/create calendar items when there is no calendar.* - -### Institutional - -#### Create -1. Call the create endpoint specifying the Institutional Calendar Type. - -#### Read, Update, Delete -1. **Read**: Call the read endpoint specifying the Institutional Calendar Item Type. -2. **Update**: Call the patch endpoint specifying the Institutional Calendar Item Type and the calendar item Id you wish to update. -3. **Delete**: Call the delete endpoint specifying the Institutional Calendar Item Type and the calendar item Id you wish to delete. - -### Course -#### Create -If using 3LO and using calendarItems of type OfficeHours, those will be assigned to the current user. Non-3LO created items may only be managed by the integration. - -##### Course Calendar Items - -* The specified courseId must not be for an organization. - -##### GradebookColumn Calendar Items - -* GradebookColumn items must be created using the Gradebook API endpoint: `POST /learn/api/public/v2/courses/{courseId}/gradebook/columns` - -##### OfficeHours Calendar Items -1. Get the Id(s) of course(s) for which you need to manage the calendar(s). -2. Call the create endpoint specifying the Course Calendar Item Type and the courseId of the course for which you wish to create the calendar item. - -#### Read, Update, Delete -1. **Read**: -a. Call the read endpoint specifying the Course Calendar Item Type and the courseId of the course for which you want the calendarItems (returns a collection of calendarItems). -b. Call the read {calendarItemId} endpoint specifying the Course Calendar Item Type and the courseId of the course for which you want the calendarItem (returns a single of calendarItem). -2. **Update**: Call the patch endpoint specifying the Course Calendar Item Type and the calendar item Id you wish to update. -3. **Delete**: Call the delete endpoint specifying the Course Calendar Item Type and the calendar item Id you wish to delete. - -### Personal -***Only 3LO applications may create Personal calendarItems.*** - -Personal calendars are personal and as such we do not offer Public APIs for external management of Personal calendar Items. If your use case calls for providing individuals with calendar items – e.g. a meeting scheduler – then you should utilize email and the ICS calendar format* for providing individuals with calendar data. The individual may then add the item to their calendar of choice, optionally sharing their external calendar with their Learn calendar. - -* https://www.ietf.org/rfc/rfc2445.txt; https://icalendar.org/RFC-Specifications/iCalendar-RFC-5545/ - -* iCalendar Libraries - * Python: https://pypi.org/project/icalendar/ - * Javascript: https://www.npmjs.com/package/ical-generator - * Java: https://www.ical4j.org - * C#: https://www.nuget.org/packages/Ical.Net/ - -The below sections further elaborate on each of the above steps. - -## General Use Examples -The differentiator between using any calendar is to replace the `calendarType` with your target calendar. Supported calendarTypes are: - - * Course - * GradebookColumn ***(READ ONLY)*** - * Institution - * OfficeHours - * Personal ***(only available via 3LO)*** - -### CREATE a calendarItem -```POST /learn/api/public/v1/calendars/items``` -requires a payload with calendarItem settings - -#### *Create Example* -```POST /learn/api/public/v1/calendars/items``` - -```json -{ - "type": "Course", - "calendarId": "string", - "title": "string", - "description": "string", - "location": "string", - "start": "2022-09-29T20:30:04.346Z", - "end": "2022-09-29T20:30:04.346Z", - "disableResizing": true, - "recurrence": { - "count": 0, - "frequency": "Monthly", - "interval": 0, - "monthRepeatDay": 0, - "monthPosition": 0, - "originalStart": "2022-09-29T20:30:04.346Z", - "originalEnd": "2022-09-29T20:30:04.346Z", - "repeatBroken": true, - "repeatDay": "Sunday", - "until": "2022-09-29T20:30:04.346Z", - "weekDays": ["Sunday"] - } -} -``` - -#### READ calendarItems -(For a course with an id of `_12594_1`) - -```GET /learn/api/public/v1/calendars/items``` - -#### *Read Examples* -**Get all calendarItems for a given course (including Course, OfficeHours, GradebookColumn types):** - -```GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&courseId=_12594_1``` - -Results: - -```json -{ - "results" : [ - { - "id" : "_91571_1", - "type" : "OfficeHours", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Office Hours - Mark O'Neil", - "description" : "Use the signup sheet on my door for office hours.", - "start" : "2023-10-25T19:00:00.000Z", - "end" : "2023-10-25T19:30:00.000Z", - "modified" : "2023-10-10T19:07:39.334Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-25T19:00:00.000Z", - "originalEnd" : "2023-10-25T19:30:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Wednesday" - ] - } - }, - { - "id" : "_91572_1", - "type" : "OfficeHours", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Office Hours - Mark O'Neil", - "description" : "Use the signup sheet on my door for office hours.", - "start" : "2023-11-01T19:00:00.000Z", - "end" : "2023-11-01T19:30:00.000Z", - "modified" : "2023-10-10T19:07:39.353Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-25T19:00:00.000Z", - "originalEnd" : "2023-10-25T19:30:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Wednesday" - ] - } - }, - { - "id" : "_91573_1", - "type" : "OfficeHours", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Office Hours - Mark O'Neil", - "description" : "Use the signup sheet on my door for office hours.", - "start" : "2023-11-08T20:00:00.000Z", - "end" : "2023-11-08T20:30:00.000Z", - "modified" : "2023-10-10T19:07:39.382Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-25T19:00:00.000Z", - "originalEnd" : "2023-10-25T19:30:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Wednesday" - ] - } - }, - { - "id" : "_91583_1", - "type" : "Course", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Calendar Demo: My Calendar Course", - "start" : "2023-10-20T20:00:00.000Z", - "end" : "2023-10-20T21:00:00.000Z", - "modified" : "2023-10-10T19:08:12.224Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-06T20:00:00.000Z", - "originalEnd" : "2023-10-06T21:00:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Friday" - ] - } - }, - { - "id" : "_91584_1", - "type" : "Course", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Calendar Demo: My Calendar Course", - "start" : "2023-10-27T20:00:00.000Z", - "end" : "2023-10-27T21:00:00.000Z", - "modified" : "2023-10-10T19:08:12.230Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-06T20:00:00.000Z", - "originalEnd" : "2023-10-06T21:00:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Friday" - ] - } - }, - { - "id" : "_91585_1", - "type" : "Course", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Calendar Demo: My Calendar Course", - "start" : "2023-11-03T20:00:00.000Z", - "end" : "2023-11-03T21:00:00.000Z", - "modified" : "2023-10-10T19:08:12.238Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-06T20:00:00.000Z", - "originalEnd" : "2023-10-06T21:00:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Friday" - ] - } - }, - { - "id" : "_91586_1", - "type" : "Course", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Calendar Demo: My Calendar Course", - "start" : "2023-11-10T21:00:00.000Z", - "end" : "2023-11-10T22:00:00.000Z", - "modified" : "2023-10-10T19:08:12.247Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-06T20:00:00.000Z", - "originalEnd" : "2023-10-06T21:00:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Friday" - ] - } - }, - { - "id" : "_120127_1", - "type" : "GradebookColumn", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Sample Assignment [rubric] (Learning Module)", - "start" : "2023-10-31T04:00:00.000Z", - "end" : "2023-10-31T04:00:00.000Z", - "modified" : null, - "color" : "#670033", - "disableResizing" : true, - "createdByUserId" : null, - "dynamicCalendarItemProps" : { - "attemptable" : true, - "categoryId" : "_172683_1", - "dateRangeLimited" : false, - "eventType" : "Test", - "gradable" : true - } - }, - { - "id" : "_120129_1", - "type" : "GradebookColumn", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Test (Learning Module)", - "start" : "2023-10-31T04:00:00.000Z", - "end" : "2023-10-31T04:00:00.000Z", - "modified" : null, - "color" : "#670033", - "disableResizing" : true, - "createdByUserId" : null, - "dynamicCalendarItemProps" : { - "attemptable" : true, - "categoryId" : "_172685_1", - "dateRangeLimited" : false, - "eventType" : "Test", - "gradable" : true - } - } ] -} -``` - -**Get all OfficeHours calendarItems for a course:** - -```GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&courseId=_12594_1 &type=OfficeHours``` - -Results: - -```json -{ - "results" : [ - { - "id" : "_91571_1", - "type" : "OfficeHours", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Office Hours - Mark O'Neil", - "description" : "Use the signup sheet on my door for office hours.", - "start" : "2023-10-25T19:00:00.000Z", - "end" : "2023-10-25T19:30:00.000Z", - "modified" : "2023-10-10T19:07:39.334Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-25T19:00:00.000Z", - "originalEnd" : "2023-10-25T19:30:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Wednesday" - ] - } - }, - { - "id" : "_91572_1", - "type" : "OfficeHours", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Office Hours - Mark O'Neil", - "description" : "Use the signup sheet on my door for office hours.", - "start" : "2023-11-01T19:00:00.000Z", - "end" : "2023-11-01T19:30:00.000Z", - "modified" : "2023-10-10T19:07:39.353Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-25T19:00:00.000Z", - "originalEnd" : "2023-10-25T19:30:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Wednesday" - ] - } - }, - { - "id" : "_91573_1", - "type" : "OfficeHours", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Office Hours - Mark O'Neil", - "description" : "Use the signup sheet on my door for office hours.", - "start" : "2023-11-08T20:00:00.000Z", - "end" : "2023-11-08T20:30:00.000Z", - "modified" : "2023-10-10T19:07:39.382Z", - "color" : "#670033", - "disableResizing" : false, - "createdByUserId" : "_1354_1", - "recurrence" : { - "count" : 10, - "frequency" : "Weekly", - "interval" : 1, - "originalStart" : "2023-10-25T19:00:00.000Z", - "originalEnd" : "2023-10-25T19:30:00.000Z", - "repeatBroken" : false, - "weekDays" : [ - "Wednesday" - ] - } - } - ] -} -``` - -**Get all gradebook columns due within the given timeframe:** - -```GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&courseId=_12594_1&type=GradebookColumn``` - -Results: - -```json -{ - "results" : [ - { - "id" : "_120127_1", - "type" : "GradebookColumn", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Sample Assignment [rubric] (Learning Module)", - "start" : "2023-10-31T04:00:00.000Z", - "end" : "2023-10-31T04:00:00.000Z", - "modified" : null, - "color" : "#670033", - "disableResizing" : true, - "createdByUserId" : null, - "dynamicCalendarItemProps" : { - "attemptable" : true, - "categoryId" : "_172683_1", - "dateRangeLimited" : false, - "eventType" : "Test", - "gradable" : true - } - }, - { - "id" : "_120129_1", - "type" : "GradebookColumn", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Test (Learning Module)", - "start" : "2023-10-31T04:00:00.000Z", - "end" : "2023-10-31T04:00:00.000Z", - "modified" : null, - "color" : "#670033", - "disableResizing" : true, - "createdByUserId" : null, - "dynamicCalendarItemProps" : { - "attemptable" : true, - "categoryId" : "_172685_1", - "dateRangeLimited" : false, - "eventType" : "Test", - "gradable" : true - } - }, - { - "id" : "_120130_1", - "type" : "GradebookColumn", - "calendarId" : "_12594_1", - "calendarName" : "Calendar Demo: My Calendar Course", - "title" : "Assignment [rubrics] (Conditional Release)", - "start" : "2023-10-31T04:00:00.000Z", - "end" : "2023-10-31T04:00:00.000Z", - "modified" : null, - "color" : "#670033", - "disableResizing" : true, - "createdByUserId" : null, - "dynamicCalendarItemProps" : { - "attemptable" : true, - "categoryId" : "_172683_1", - "dateRangeLimited" : false, - "eventType" : "Test", - "gradable" : true - } - } - ] -} -``` - -* Note in this demo the gradebook column related grades are due on 2023-10-31 so requesting the range as shown previously will return the data. If we changed the until date to 2023-10-25 the results would be an empty set: - - ``` - {"results" : []} - ``` - - -* For the Institution calendarType exclude the courseId and add/change the type to Institution in the request. -E.g. Get all Institution calendarItems within the given timeframe: - - ``` - GET /learn/api/public/v1/calendars/items?since=2023-10-15T00:00:00.000Z&until=2023-11-15T00:00:00.000Z&type=Institution - ``` - -Results: - -```json -{ - "results" : [ - { - "id" : "_84428_1", - "type" : "Institution", - "calendarId" : "INSTITUTION", - "calendarName" : "Institution", - "title" : "Holiday Celebration - Stevens Commons ", - "description" : "Come celebrate with your fellow Monument students as we have a holiday celebration. Student groups will be present and will host different fun-filled activities. Food and drink will be provided! Wear your best ugly Christmas sweater and compete for a prize!", - "location" : "Stevens Commons", - "start" : "2022-12-15T19:00:00.000Z", - "end" : "2022-12-15T22:00:00.000Z", - "modified" : "2022-12-08T19:12:06.160Z", - "color" : "#b65151", - "disableResizing" : false, - "createdByUserId" : "_30005_1" - } - ] -} -``` - - -### UPDATE a calendarItem - -To update a calendarItem you must know the calendarItem Id. This may be found by calling the appropriate READ endpoint as outlined above. Once you have a collection of calendarItems you may then update using the Update endpoint: - -```PATCH /learn/api/public/v1/calendars/items/{calendarItemType}/{calendarItemId}``` - -#### Payload example - -```json -{ - - "type": "Course", - "calendarId": "_12594_1", - "title": "Study Group 2 Session", - "description": "Meeting for Study Group 3", - "location": "Castle Room 2-202", - "start": "2022-09-30T16:36:40.313Z", - "end": "2022-09-30T16:36:40.313Z", - "modified": "2022-09-30T16:36:40.313Z", - "disableResizing": true, - "dynamicCalendarItemProps": { - "attemptable": true, - "categoryId": "string", - "dateRangeLimited": true, - "eventType": "string", - "gradable": true - }, - "recurrence": { - "count": 0, - "frequency": "Monthly", - "interval": 0, - "monthRepeatDay": 0, - "monthPosition": 0, - "originalStart": "2022-09-30T16:36:40.313Z", - "originalEnd": "2022-09-30T16:36:40.313Z", - "repeatBroken": true, - "repeatDay": "Sunday", - "until": "2022-09-30T16:36:40.313Z", - "weekDays": ["Sunday"] - } -} -``` - -**Success** 200 - results match above payload if calendarType were Course with the additional data of "id": "string", "calendarName": "string", "color": "string", "createdByUserId": "string". - -### DELETE a calendarItem - -As with Update you must know the calendarItem Id of the calendarItem you wish to delete. This may be found by calling the appropriate READ endpoint as outlined above. Once you have a collection of calendarItems you may then delete one using the delete endpoint: - -`DELETE /learn/api/public/v1/calendars/items/{calendarItemType}/{calendarItemId}` - -#### *Delete Example* - -`DELETE /learn/api/public/v1/calendars/items/{calendarItemType}/{calendarItemId}` - -**Success** -204 No content - -## A Sidebar on ISO-8601, UTC, and REST APIs -Public REST APIs always return ISO 8601 UTC Zulu time zone formatted date/time data. To properly manage conversion to your time zone to display and use dates in your requests it is important to understand the relationship between UTC and the ISO 8601 date-time format and how the REST APIs handle date/times. - -### In brief: -* All Learn instances store date-times in the database as localized server time – which may or may not be the consumers time zone – this is why… -* All REST APIs return date-times in UTC Zulu format and as such developers need to adjust to the appropriate time zone for their UI. -* UTC stands for Coordinated Universal Time, a standard used to set all time zones around the world. -* All REST API requests intake ISO 8601 date-time format allowing for specifying the UTC offset for time zone adjustment (see below).ISO 8601 provides a standardized way of presenting dates and times: - * Date - * Time of day - * Coordinated Universal Time (UTC) - * Local time with offset to UTC - * Date and time - * Time intervals - * Recurring time intervals -* UTC could be considered a subset of the ISO 8601 standard – a date without a specified time zone is referred to as UTC time and may use the optional ‘Z’ (Zulu) time zone indicator. Zulu date-times are what are returned by the REST APIs. - * 2023-10-15T13:15:30Z represents 1:15:30 PM in Greenwich England (previously called Greenwich Mean Time) -* ISO 8601 may be used with an optional offset to designate the time zone. Following the above example: - * 2023-10-15T13:15:30Z represents 1:15:30 PM in Greenwich England - * 2023-10-15T13:15:30Z-05:00 corresponds to October 10, 2023, 8:15:30 am, US Eastern Standard Time. - -The ISO 8601 standard provides the following format for a date-time: - -`[yyyy-MM-dd|yyyyMMdd][T(hh:mm[:ss[.sss]]|hhmm[ss[.sss]])]?[Z|[+-]hh:mm]]` - -Following the above formatting these are all the same date and time (October 10, 2023, 1:15:30 pm): - - * 2023-10-15T13:15:30Z << this is the format returned in REST API results - * 20231015T15T13:15:30Z - * 20231015T15T131530Z - * 2023-10-15T13:15:30 - * 20231015T15T13:15:30 - * 20231015T15T131530 - * 20231015T15T13:15:30 - * 2023-10-15T18:15:30-5:00 - * 20231015T15T18:15:30Z-5:00 - * 20231015T15T181530Z-5:00 - * 2023-10-15T18:15:30 -5:00 - * 20231015T15T18:15:30-5:00 - * 20231015T15T181530-5:00 - * 20231015T15T18:15:30-5:00 - -Some useful URLs to help with better understanding dates: - - * ISO 8601 standard: https://www.rfc-editor.org/rfc/rfc3339, https://www.w3.org/TR/NOTE-datetime and https://en.wikipedia.org/wiki/ISO_8601 - * Time zones: - * A useful conversion tool: https://www.calculator.net/time-zone-calculator.html - -## Entitlements and System Role Privileges -### Three-Legged-OAuth (3LO) -Calling Calendar APIs in a 3LO context enables access based on the privileges of the 3LO authenticated user. You do not need to do anything privileges specific to enable your application when using 3LO. - -### Non-3LO -Calling Calendar APIs when not using 3LO requires that you have a REST Application user configured in Learn with the necessary privileges assigned to that user’s role. These privileges are derived from the entitlements required. For mapping entitlements to privileges see: [How to map entitlements to privileges](../getting-started/getting-started-with-entitlements). - -#### Necessary Entitlements -Calendar entitlements required per endpoint are listed in the calendar API documentation. - -1. To create a calendar event in Course, - * `course.calendar-entry.CREATE` -2. To edit a calendar event in Course, - * `course.calendar-entry.MODIFY` -3. To delete a calendar event in Course - * `course.calendar-entry.DELETE` -4. To create/edit/delete calendar event in Institution - * `system.calendar-item.EXECUTE` - -#### Necessary System Role Privileges -**Note**: You must share these System Role Privileges with Learn System Admins via documentation for deployment of your application on their Learn server. - -1. To create a calendar event in Course, - * `Course/Organization Control Panel (Tools) > Calendar > Create Entry` -2. To edit a calendar event in Course, - * `Course/Organization Control Panel (Tools) > Calendar > Edit Entry` -3. To delete a calendar event in Course - * `Course/Organization Control Panel (Tools) > Calendar > Delete Entry` -4. To create/edit/delete calendar event in Institution - * `Administrator Panel (Tools and Utilities) > Calendar` - -## Calendar API Best Practices -Note: Please review our General REST API Best Practices which are outlined in our [REST API Best Practices](/docs/rest-apis/rest-api-best-practices) guide. - -1. Never, use GET /learn/api/public/v1/calendars/items in a non-3LO capacity! - - > 3LO always limits calendar data to what a specific user may view. Non-3LO use of the calendar endpoints is more data inclusive. While safe to use as a 3LO authenticated user, using the /calendars/items endpoint as a non-3LO user will attempt to dump the entire calendar db for the the specified timebox (maximum of 14 week’s worth for every course). THIS WILL POTENTIALLY IMPAIR SYSTEM PERFORMANCE. DO NOT DO THIS! - -2. Target your requests based on calendarType and Ids - - > Always target your requests based on the Id of the target course and use calendarTypes to limit the scope of the request. Failure to do so may have negative performance impact. - - > Use calendarType, calendarItem, or courseId as required to manage the impacted data set. - -3. Timebox your requests - - > Always timebox your requests. Failure to do so may have negative performance impact. By default all requests are timeboxed to 14 weeks ahead of the date/time of the request. - - > Use the since and until parameters to timebox your requests: - -| **since** | | -|--------------------|-------------------------------------| -| Query parameter: `string($date-time)` | Specifies only calendar items after the 'since' date (inclusive) are to be returned. Maximum of 16 weeks after the 'since' date will be returned. ISO-8601 date-time format is expected: `[yyyy-MM-dd|yyyyMMdd][T(hh:mm[:ss[.sss]]|hhmm[ss[.sss]])]?[Z|[+-]hh:mm]]` | - -| **until** | | -|--------------------|-------------------------------------| -| Query parameter: `string($date-time)` | Specifies only calendar items before the 'until' date (inclusive) are to be returned. Maximum of 16 weeks prior to the 'until' date will be returned. ISO-8601 date-time format is expected: `[yyyy-MM-dd|yyyyMMdd][T(hh:mm[:ss[.sss]]|hhmm[ss[.sss]])]?[Z|[+-]hh:mm]]`| - - \ No newline at end of file diff --git a/docs/rest-apis/rest-api-best-practices.md b/docs/rest-apis/rest-api-best-practices.md deleted file mode 100644 index cbdf8855e..000000000 --- a/docs/rest-apis/rest-api-best-practices.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "REST API Best Practices" -id: rest-api-best-practices -sidebar_position: 2 -published: "2023-10-11" -edited: "2023-10-11" -author: Davey Herrera, Mark O'Neil ---- - - - -## General Best Practices -* Learn System Administrators should be enrolled in courses only using a non-Admin enabled user. - * System Administrator information is generally only available to 3LO Administrator requests. - -* Always monitor your API usage using the x-header information returned on non-oauth requests - * Details on rate_limits and x-headers are available [here](https://docs.anthology.com/docs/developer-portal/production-groups-rest-api-and-site-registration-limits#rest-api-calls-limit). - -* Not all data operations are best done Just-In-Time (JIT). -Some operations, such as backfilling data warehouses or refreshing caches are best done during off-peak Learn hours. - * JIT calling or repeatedly calling for the same "static" data is inefficient. - * Checking whether a student is still in a course or getting their course grades are reasonable JIT activities as that is data that may change between now and their last access. - -* Cache infrequently changed or “static” data and refresh periodically. - * This reduces repetitive calls. - * This reduces integration performance impact. - * Don’t JIT retrieve ALL Courses for example as that data changes infrequently. Instead do this once and then periodically retrieve course data created or modified since you last request. - -* Always "optimize" your requests. - * reduce your “search” criteria to as small a set of data as possible. - * This limits the number of pages of returned data set. - * E.g. use `?dataSourceId=` to reduce your search to objects created using a specific DSK and follow caching practices. - * Use the fields parameter to reduce the returned data set to only data points you require. - * This limits the data transmitted and system load - -* Always try to logically bound your requests or before acting on request results: - * Check if dates are within bounds - * Check if attempts exist of if items are graded - * Check availability - -* Do not use Collection Gets to test for a specific object. - - E.g.: don't use `GET /learn/api/public/v1/courses/{courseId}/users` to get all the course memberships to test if a student is enrolled. - - Instead use: `GET /learn/api/public/v1/courses/{courseId}/users/{userId}` and branch your code based on the result. - -## Best Practices per Product and API -| Learn | -|-------| -| * [Calendar](./learn/working-with-learn-apis/using-calendar-api.md#calendar-api-best-practices) | -| * [Gradebook](./learn/working-with-learn-apis/pulling-grades.md#gradebook-api-best-practices) | - - - \ No newline at end of file diff --git a/docs/rest-apis/student/best-practices/PaymentVendorPartnerOverview.md b/docs/rest-apis/student/best-practices/PaymentVendorPartnerOverview.md deleted file mode 100644 index dbecfbf2e..000000000 --- a/docs/rest-apis/student/best-practices/PaymentVendorPartnerOverview.md +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: "Payment Partner Overview" -id: studentapi-paymentpartner-overview -sidebar_position: 1 -author: Jim Burns -published: "" -edited: "" ---- - - - -The Anthology Student API library has a number of APIs that are designed to support the most common use cases for facilitating an integration between a payment provider and the Anthology student application. The purpose of this document is to provided the details needed for a payment provider to build an integration with the Anthology Student product that supports the base use cases that are common for most payment providers. These common use cases will be discussed below providing details in how to implement utilizing the Anthology Student APIs. An additional section on authorization permissions that are required for executing the APIs will also be included. - - -## Common Payment vendor use cases - -Common integration use cases between a payment vendor and Anthology Student are: - - - Post Payments - - Post Charges and Adjustments - - Apply posted payments - - Process/post scheduled refunds - - Create a payment plan - - Update an existing payment plan - - Post misc cash receipt transactions that are not associated to a student ledger card in the SIS. - -This section will outline the API endpoint(s) that can be used to satisfy each of these use cases. Additional details relevant to the execution logic for each API will be included. - -To see additional details for the APIs within Student, access the Swagger output. This can be done while logged into the Student web application. Append 'swagger' to the base URI used to launch the Student application. For purposes of this document, all of the APIs that will be referenced can be found in the Swagger output by using the Type filter. Choose "Integration" from this drop down and click Refresh. All of the APIs referenced in this document will be documented in the Student Accounting and Student Payment Plan sections. - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview1.png) - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview2.png) - -### Post Payment - -The most basic use case for an integration between a payment provider and Anthology Student is to be able to process a payment within the payment vendor application and then post that payment to the student's ledger card within Anthology Student. At a high level, there are two different kinds of payments within the Student application. The first is a payment that is not associated with expected funding and the second is a payment that is associated to an expected disbursement. One of the features in Student is the ability to package a student for Financial Aid which results in a list of scheduled disbursements being created. Included in this are Student payment plans. A student payment plan will have 1 or more expected payments/installments created as part of the payment plan data. When posting a payment that is made against a payment plan, the payment will be "associated" with the expected disbursement record. Regardless of whether the payment being posted is for an expected disbursement or is not associated to an expected disbursement, the same API endpoint will be used. There are properies in the request payload that inform the API execution logic as to if the payment being posted is associated to an expected disbursement record or is not associated to an expected disbursement record. - -The API to use for posting payments is POST api/student-accounting/ledger-payment-transactions - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview3.png) - -#### Installment on Payment Plan - -If a payment is being posted for an expected installment on a payment plan, then the request payload will include this information either by providing the Id of the expected installment record the payment is for (ScheduledDisbursementId property) or setting the UseNextScheduledPayment property to true. If this is not done in the request, then the API execution logic will assume that the payment being posted is NOT for an expected disbursement. If UseNextScheduledPayment property is true, then the payment being posted will be associated to the expected disbursement record for the payment plan that has a status of scheduled and the earliest expected payment date. If the amount of the payment being posted does not match the amount of the expected disbursement it is being associated to, then the expected payment schedule will be auto adjusted accordingly. If the amount of payment is less than the amount of the expected disbursement, then a new expected disbursement record with a status of scheduled will be created with an amount that is the difference between the amount that was expected and the payment amount. If the amount of the payment being posted is greater than the the amount of the expected payment it is being associated to, then the difference will be applied to the next expected payment. See examples below: - -Expected payment schedule: - -Payment # Expected Amount Expected Date Paid Amount Status -1 $100 04/01/2024 $0 Scheduled -2 $100 05/01/2024 $0 Scheduled -3 $100 06/01/2024 $0 Scheduled - -Payment is posted and is associated to Expected payment # 1 above. Payment amount is $125. Payment schedule after API execution completes is as follows: - -Payment # Expected Amount Expected Date Paid Amount Status -1 $100 04/01/2024 $100 Paid -2 $25 05/01/2024 $25 Paid -2 $75 05/01/2024 $0 Scheduled -3 $100 06/01/2024 $0 Scheduled - -Payment is posted and is associated to Expected payment # 1 above. Payment amount is $75. Payment schedule after API execution completes is as follows: - -Payment # Expected Amount Expected Date Paid Amount Status -1 $75 04/01/2024 $75 Paid -1 $25 04/01/2024 $0 Scheduled -2 $75 05/01/2024 $0 Scheduled -3 $100 06/01/2024 $0 Scheduled - -The above auto adjust logic will execute as part of the post payment transaction unit of work. If the Payment vendor application creates and manages payment plans for students and is considered the system of record for payment plans, then the Payment Plan APIs will be utilized to push the payment plan data into Student. These APIs are designed to allow for data to be pushed into Student and replace the expected payment plan data that is auto adjusted per logic explained above keeping the payment plan data in Student synchronized with the payment plan data in the Payment provider data store. - -#### Cashiering - -If the school is using the Cashiering feature in Anthology Student, then a couple of additional properties in the request payload will be required. The Cashiering feature is enabled by campus. To see if cashiering is enabled for a given campus, navigate to Settings - System - Campuses. Select the campus you want to check. Choose the Student Accounts tile. The setting will be on the General tab. - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview5.png) - -As a best practice, it is recommended that a cash drawer be created for exclusive use by the payment provider. After creating the cash drawer, create a cash drawer session and associate it to the user that the payment provider will be authenticating under. This user needs to be configured as a cashier user within the Staff configuration. Once the Cash Drawer is created then the Id of the Cash Drawer is the value that will be used for the CashDrawerId property in the post payment request payload. There is also the option to just create the Cash Drawer record without creating the cash drawer session. For this to work, a CashierUserId must also be specified when executing the post payment API. This Id would be the Id of the Staff user the API call is being authenticated under. - -### Post Charges or Adjustments - -Another common use case is to be able to post charges and/or adjustments to a student's ledger card. Many times a student will be making a payment for a fee that is charged via the Payment Vendor application. There also may be some instances where a credit adjustment will need to be posted to a student's ledger card as well. - -The API to use for posting charges and credit adustments is POST api/student-accounting/ledger-chargeoradjustment-transactions - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview4.png) - -The minimum required properties for this payload are StudentId, BillingTransactionCodeId, Type, TransactionAmount, TransactionDate and Description. Other properties are conditionally required dependent on Student configuration settings. For example, TermId may be required if the setting to require term when posting charges is set to true. Other time period based properties (StudentAcademcYearId, StudentAcademicYearPaymentPeriodId) may or may not need to be provided depending on the time frame(s) that the school bases revenue/refund calculations on. Clarifying if/how to populate these properties in the payload will likely need to be worked out on a case by case basis via collaboration with the institution being worked with. - -### Apply Posted Payments - -The apply payments endpoint is used when there is a need to explicitly specify which charge/adjustment transactions a given payment transaction will be applied to. Anthology has a feature that allows for payments to be automatically applied to charge and adjustment transactions using the auto apply configuration. If all of the institutions requrements for how payments should be applied to charges are satisfied via the configuration, then this endpoint is not needed. However, if there are cases, where the rules for how to apply payments are not fully covered via the auto payment apply configuration OR the setting to auto apply payments is turned off, then there may be a need to utilize this endpoint. If/how this endpoint is utilized will need to be clarified with the institution being worked with. - -The API to use for applying payments is POST api/student-accounting/ledger-transactions-applypayments - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview6.png) - -The request payload for this API is pretty straight forward. The payment or credit adjustment transaction you are applying is specified along with the charge/debit adjustment transaction ids you are applying the payment/credit adjustment transaction to. There is built in validation logic that will not allow you to apply an amount that is greater than the amount left to apply for a given charge/debit adjustment transaction. - -IMPORTANT: If the institution has the setting to auto apply payments on, and a payment is applied using this API, a flag will be set on the payment and charge transactions specifying that manual applyment was done. This will prevent the applied transaction data from being overwritten by subsequent auto applyment processes that execute. The only way to edit this information will be via the manual apply page within the Student web client UI. - -### Process and Post Scheduled Refunds - -Many Payment providers have a capability for processing refunds that are scheduled. The concept is similar to the payment plan installment payments discussed above. A refund is owed to a student, the refund is scheduled in the Student application and then that refund is paid on or before the refund due date. The high level flow of this use case for Payment providers who process refunds is as follows: - -- Retrieve batch of refunds that are due to be paid and need to be processed -- Flag the scheduled refund records that were retrieved indicating that these refunds have been selected for processing -- Process the refunds in the Payment provider software -- Post the refunds as processed back into the Student application - -#### Retrieve scheduled refunds - -The first step is to retrieve the scheduled refunds that need to be processed. The best way to do this is to constuct an odata query to retrieve the needed information. The scheduled refunds will reside in the Refunds entity. One of the filters needed in the query will be on the Status property. A value of 'N' in the Status property indicates that the refund is scheduled but has not yet been processed/paid. Other valid values for this property are P= Processed/Paid, V= Was paid but has since been Voided and S= Selected for Processing. The other key filters needed in the OData query will be on the DueDate property which indicates the date that the refund is due. Also, there will likely need to be filtering based on the fund source the refund is for. In many cases, refunds that are being returned to Title IV fund sources are not processed by Payment providers. The StudentAward navigation property on the Refunds entity will need to be utilized to construct the filtering condition needed to filter on the fund source(s) that should be included. - -#### Flag the selected refund records - -The next step after selecting the refunds to be processed is to utilize an API to mark these refunds as selected for processing. This is critical to ensure the refunds retrieved in the prior step are not eligible to be processed within the Student application and/or included in a subsequent query for retrieving refunds to be processed. There is an API that allows for manipulation of the Status property on the Refunds entity. - -The API to use for setting the Status value on the Refund entity is PATCH api/student-accounting/scheduled-refunds-status - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview7.png) - -This API is very easy to use. There are only two units of work that occur. Change the Status on the Refund entity row from N to S or change the Status on the Refund row from S to N. There may be some times where for whatever reason the processing of the refund in the Payment provider application was not successful. For these cases, where the refund is not able to be processed in the Payment provider software, the Status on that scheduled refund record will need to be changed from Selected for processing back to Not Processed. - -#### Post the Processed/Paid Refunds - -After the refunds have been processed in the Payment Provider application, these refunds need to be posted in Student utilizing an API. - -The API to use for posting these scheduled refunds is POST api/student-accounting/ledger-scheduled-refund-transactions - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview8.png) - -It is important to note that there is another API that allows for posting refunds. However, this API is used when posting a refund to a student's ledger card that is NOT scheduled. If there is a need to post a refund that is not scheduled and has no row in the Refunds entity then use the POST api/student-accounting/ledger-refund-transactions endpoint. - -The request payload for posting scheduled refunds is a collection allowing for all refunds that have been processed in the Payment provider application to be posted via a single API call. The key property that must be specified in the request for each refund posted is the RefundId value which identifies the row in the Refund entity that has been paid/posted. The high level unit of work that will occur within the execution of this API will be to post a refund transaction on the student's ledger card AND also update the Status on the Refund entity row from Selected for processing to P= Processed/Paid. - -The response returned will be a collection having one element for each element that was provided in the request. The success/failure for each individual refund record provided in the request will be articulated in the response. - -### Create a payment plan - -Another common use case for Payment providers is to create and manage payment plans for Students. If the payment plan data is persisted in the Payment provider data store, then the Payment Provider application will be considered the system of record for student payment plan data. Because there are numerous reports and other processes in Student that have a dependency on ALL expected funding to be represented for a student, it is imperative that the payment plan data stored in Anthology Student is kept in synch with the payment plan data in the Payment Provider software. The create payment plan and update existing payment plan APIs will be used for this purpose. - -The API to use for creating a new payment plan in Anthology Student is POST api/student-accounting/student-payment-plan - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview9.png) - -Payment Plans can be interest bearing or non-interest bearing plans in Anthology Student. Several properties in the request payload can be ignored for non-interest bearing payment plans. The request payload needed should be able to be created fairly easily by using the property level documentation found in the swagger output. - -### Update an existing payment plan - -This API will be used to ensure existing payment plans are kept in sync between the Payment provider application and Anthology Student. A very common use case is when a student makes an installment payment but the amount of the payment does not match the amount of the expected installment. In these cases, the remainder of the expected payment schedule needs to be adjusted. Assuming the Payment Provider application is the system of record, this adjustment would occur in the Payment provider application. The resulting data would then be pushed into Anthology Student using the API to update an existing payment plan. - -The API to use for updating an existing payment plan in Anthology Student is PATCH api/student-accounting/student-payment-plan - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview10.png) - -One of the key capabilities with this API is to be able to remove ALL expected payments for a payment plan and replace them with the scheduled payments that are specified in the request. The IsScheduledPaymentsRemoved property in the request is used for this purpose. It is important to note that ONLY rows with a Status of S or C in the payment plan expected payments entity (ScheduledDisbursements) can be removed. Any expected disbursement record that has been marked as Paid will not be touched. The request payload has property level documentation and should be reviewed carefully as a guide for constructing the desired request payload for this API. - -### Post misc cash receipts - -Another common use case is the need to post transactions in Anthology Student that will not appear on an individual student's ledger card. These transactions are labeled in Anthology Student as miscellaneous cash receipts. - -The API to use for posting a miscellaneous cash receipt is POST api/student-accounting/misc-cash-receipts - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview11.png) - -One of the required properties for the request is to specify the transaction billing code that the misc cash receipt will be applied to. This controls how the transaction will ultimately be posted to the general ledger. Not all transaction billing codes are eligible to be used when posting miscellaneous cash receipts. Validation logic in this API requires that the transaction billing code specified in the request has been configured in Student to be able to be used for miscellaneous cash receipt posting. An OData query can be used to retrieve the transaction billing codes that are able to be used for miscellaneous cash receipt posting. The entity to query is BillingTransactionCodes. All rows from this entity where Usage is equal to M or A can be used. - -There is also a PATCH endpoint that allows for updating a previously posted miscellaneous cash receipt transaction. Validation is in place that will not allow any updates to a miscellaneous cash receipt transaction that has already been release to the general ledger. - -## Authorization - -In order to execute the APIs that have been discussed above, proper authorization needs to be configured. Whether using Basic Auth or OAuth with application key to authenticate, the user context the APIs are executing under will be a user record from the Staff entity. This is the user that authorization needs to be configured for. Access to the security console application is needed in order to set the needed permissions. Unlike the Anthology Student command APIs, the API endpoints discussed above have separate explicit tasks that need to be authorized. The Anthology Student command APIs are coupled with UI tasks. In order to properly authorize an API user to execute a command API, the applicable UI task needs to be identified and added for that user. For the APIs discussed in this document that exercise is not needed. Details are outlined below. - -Within the Security console, the API - Student Accounting and API - Student Payment Plan tasks should be added for the user. These 2 tasks will authorize the user to execute every operation contained within the Student Accounting and Student Payment Plan sections within the swagger document. If more refined permissions are needed and you want to authorize the execution of specific operations with Student Accounting or Student Payment Plan, then the applicable individual operations will need to be authorized. Typically, this level of granularity is not needed and authorizing the two tasks mentioned above is all that is needed. - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview12.png) - -For any OData queries that will be executed, additional authorization is needed. The authorization model for the odata endpoint is to either grant permission to query all entities contained within the data model or to authorize each individual entity that data will be extracted from. Currently there are no tasks available for authorizing by business area of domain. Best practice is to NOT authorize access to the entire query data model so it will be necessary to create an inventoried list of each entity that data will be retrieved from and add the applicable operation for the user. In order to authorize at the operation level, select the role that the user is a member of. Then select Add Permissions. On the resulting page that is displayed, check the Show Operations checkbox. To make the resulting list easier to navigate, you may want to uncheck the Show Tasks, Show Built In Tasks and Show Roles check boxes. Click Apply. - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview13.png) - -All of the odata query model operations are named as follows: domain + entity name (singluar) + query. So to authorize the permission to retrieve data from the BillingCodeTransaction entity, the StudentAccounts.BillingTransactionCode.Query operation would need to be added for the user. - -![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview14.png) - -Once all query model operations for the list of entities are added for the user, then the authorization permissions should be complete for the user being authenticated when executing the APIs/OData queries. - - - -## Conclusion - -The purpose of this document is to provide enough information to provide a Payment provider new to Anthology Student a jump start on building an integration that satisfy common integration requirements. This document is not intended to include all of the finer points and nuances for utilizing the APIs that have been covered. If there are questions after reviewing this document and the corresponding swagger documentation, you can submit any questions by sending an email to developers@anthology.com. - - - - \ No newline at end of file diff --git a/docs/site-intro.md b/docs/site-intro.md deleted file mode 100644 index 05c768ff3..000000000 --- a/docs/site-intro.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Welcome to our Developer Documentation! -id: site-intro -sidebar_position: 1 -hide_table_of_contents: true -published: "" -edited: "" ---- - - - -# - -Explore the latest Anthology developer documentation, including tutorials, sample code, articles, and API reference. - -## REST APIs - -Use Anthology REST APIs to make calls and get the data you need to integrate your application with our platform. - -
-
-   -
-
-
- Screenshot for the course content view of the Learn Platform. -

Learn

-
- Expand on our LMS' capabilities by using the API to create users, pull assessments, grade data, manage calendars, and more. -
-
 
- - -
-   -
-
-
- The Anthology Student Logo. -

Student

-
- Use Anthology Student APIs to increase institution efficiency through automation and optimization. -
-
 
- - -
-   -
-
-
- Screenshot showing an image of the Large Hadron Collider. The image is missing a description which results in a 25% accessibility score. -

Ally

-
- Improve the accessibility of their content by using the API to upload files, check the status, and retrieve reports. -
-
 
- - -
-   -
-
-
-
- - diff --git a/docs/standards/caliper/caliper-intro.md b/docs/standards/caliper/caliper-intro.md deleted file mode 100644 index c1efb8d61..000000000 --- a/docs/standards/caliper/caliper-intro.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 1 -published: "" -edited: "" ---- - - - -# Welcome to caliper! - - diff --git a/docs/student/best-practices/PaymentVendorPartnerOverview.md b/docs/student/best-practices/PaymentVendorPartnerOverview.md new file mode 100644 index 000000000..185e95d9a --- /dev/null +++ b/docs/student/best-practices/PaymentVendorPartnerOverview.md @@ -0,0 +1,188 @@ +--- +title: "Payment Partner Overview" +id: studentapi-paymentpartner-overview +sidebar_position: 1 +author: Jim Burns +published: "" +edited: "" +--- + +The Anthology Student API library has a number of APIs that are designed to support the most common use cases for facilitating an integration between a payment provider and the Anthology student application. The purpose of this document is to provided the details needed for a payment provider to build an integration with the Anthology Student product that supports the base use cases that are common for most payment providers. These common use cases will be discussed below providing details in how to implement utilizing the Anthology Student APIs. An additional section on authorization permissions that are required for executing the APIs will also be included. + +## Common Payment vendor use cases + +Common integration use cases between a payment vendor and Anthology Student are: + +- Post Payments +- Post Charges and Adjustments +- Apply posted payments +- Process/post scheduled refunds +- Create a payment plan +- Update an existing payment plan +- Post misc cash receipt transactions that are not associated to a student ledger card in the SIS. + +This section will outline the API endpoint(s) that can be used to satisfy each of these use cases. Additional details relevant to the execution logic for each API will be included. + +To see additional details for the APIs within Student, access the Swagger output. This can be done while logged into the Student web application. Append 'swagger' to the base URI used to launch the Student application. For purposes of this document, all of the APIs that will be referenced can be found in the Swagger output by using the Type filter. Choose "Integration" from this drop down and click Refresh. All of the APIs referenced in this document will be documented in the Student Accounting and Student Payment Plan sections. + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview1.png) + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview2.png) + +### Post Payment + +The most basic use case for an integration between a payment provider and Anthology Student is to be able to process a payment within the payment vendor application and then post that payment to the student's ledger card within Anthology Student. At a high level, there are two different kinds of payments within the Student application. The first is a payment that is not associated with expected funding and the second is a payment that is associated to an expected disbursement. One of the features in Student is the ability to package a student for Financial Aid which results in a list of scheduled disbursements being created. Included in this are Student payment plans. A student payment plan will have 1 or more expected payments/installments created as part of the payment plan data. When posting a payment that is made against a payment plan, the payment will be "associated" with the expected disbursement record. Regardless of whether the payment being posted is for an expected disbursement or is not associated to an expected disbursement, the same API endpoint will be used. There are properies in the request payload that inform the API execution logic as to if the payment being posted is associated to an expected disbursement record or is not associated to an expected disbursement record. + +The API to use for posting payments is POST api/student-accounting/ledger-payment-transactions + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview3.png) + +#### Installment on Payment Plan + +If a payment is being posted for an expected installment on a payment plan, then the request payload will include this information either by providing the Id of the expected installment record the payment is for (ScheduledDisbursementId property) or setting the UseNextScheduledPayment property to true. If this is not done in the request, then the API execution logic will assume that the payment being posted is NOT for an expected disbursement. If UseNextScheduledPayment property is true, then the payment being posted will be associated to the expected disbursement record for the payment plan that has a status of scheduled and the earliest expected payment date. If the amount of the payment being posted does not match the amount of the expected disbursement it is being associated to, then the expected payment schedule will be auto adjusted accordingly. If the amount of payment is less than the amount of the expected disbursement, then a new expected disbursement record with a status of scheduled will be created with an amount that is the difference between the amount that was expected and the payment amount. If the amount of the payment being posted is greater than the the amount of the expected payment it is being associated to, then the difference will be applied to the next expected payment. See examples below: + +Expected payment schedule: + +Payment # Expected Amount Expected Date Paid Amount Status +1 $100 04/01/2024 $0 Scheduled +2 $100 05/01/2024 $0 Scheduled +3 $100 06/01/2024 $0 Scheduled + +Payment is posted and is associated to Expected payment # 1 above. Payment amount is $125. Payment schedule after API execution completes is as follows: + +Payment # Expected Amount Expected Date Paid Amount Status +1 $100 04/01/2024 $100 Paid +2 $25 05/01/2024 $25 Paid +2 $75 05/01/2024 $0 Scheduled +3 $100 06/01/2024 $0 Scheduled + +Payment is posted and is associated to Expected payment # 1 above. Payment amount is $75. Payment schedule after API execution completes is as follows: + +Payment # Expected Amount Expected Date Paid Amount Status +1 $75 04/01/2024 $75 Paid +1 $25 04/01/2024 $0 Scheduled +2 $75 05/01/2024 $0 Scheduled +3 $100 06/01/2024 $0 Scheduled + +The above auto adjust logic will execute as part of the post payment transaction unit of work. If the Payment vendor application creates and manages payment plans for students and is considered the system of record for payment plans, then the Payment Plan APIs will be utilized to push the payment plan data into Student. These APIs are designed to allow for data to be pushed into Student and replace the expected payment plan data that is auto adjusted per logic explained above keeping the payment plan data in Student synchronized with the payment plan data in the Payment provider data store. + +#### Cashiering + +If the school is using the Cashiering feature in Anthology Student, then a couple of additional properties in the request payload will be required. The Cashiering feature is enabled by campus. To see if cashiering is enabled for a given campus, navigate to Settings - System - Campuses. Select the campus you want to check. Choose the Student Accounts tile. The setting will be on the General tab. + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview5.png) + +As a best practice, it is recommended that a cash drawer be created for exclusive use by the payment provider. After creating the cash drawer, create a cash drawer session and associate it to the user that the payment provider will be authenticating under. This user needs to be configured as a cashier user within the Staff configuration. Once the Cash Drawer is created then the Id of the Cash Drawer is the value that will be used for the CashDrawerId property in the post payment request payload. There is also the option to just create the Cash Drawer record without creating the cash drawer session. For this to work, a CashierUserId must also be specified when executing the post payment API. This Id would be the Id of the Staff user the API call is being authenticated under. + +### Post Charges or Adjustments + +Another common use case is to be able to post charges and/or adjustments to a student's ledger card. Many times a student will be making a payment for a fee that is charged via the Payment Vendor application. There also may be some instances where a credit adjustment will need to be posted to a student's ledger card as well. + +The API to use for posting charges and credit adustments is POST api/student-accounting/ledger-chargeoradjustment-transactions + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview4.png) + +The minimum required properties for this payload are StudentId, BillingTransactionCodeId, Type, TransactionAmount, TransactionDate and Description. Other properties are conditionally required dependent on Student configuration settings. For example, TermId may be required if the setting to require term when posting charges is set to true. Other time period based properties (StudentAcademcYearId, StudentAcademicYearPaymentPeriodId) may or may not need to be provided depending on the time frame(s) that the school bases revenue/refund calculations on. Clarifying if/how to populate these properties in the payload will likely need to be worked out on a case by case basis via collaboration with the institution being worked with. + +### Apply Posted Payments + +The apply payments endpoint is used when there is a need to explicitly specify which charge/adjustment transactions a given payment transaction will be applied to. Anthology has a feature that allows for payments to be automatically applied to charge and adjustment transactions using the auto apply configuration. If all of the institutions requrements for how payments should be applied to charges are satisfied via the configuration, then this endpoint is not needed. However, if there are cases, where the rules for how to apply payments are not fully covered via the auto payment apply configuration OR the setting to auto apply payments is turned off, then there may be a need to utilize this endpoint. If/how this endpoint is utilized will need to be clarified with the institution being worked with. + +The API to use for applying payments is POST api/student-accounting/ledger-transactions-applypayments + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview6.png) + +The request payload for this API is pretty straight forward. The payment or credit adjustment transaction you are applying is specified along with the charge/debit adjustment transaction ids you are applying the payment/credit adjustment transaction to. There is built in validation logic that will not allow you to apply an amount that is greater than the amount left to apply for a given charge/debit adjustment transaction. + +IMPORTANT: If the institution has the setting to auto apply payments on, and a payment is applied using this API, a flag will be set on the payment and charge transactions specifying that manual applyment was done. This will prevent the applied transaction data from being overwritten by subsequent auto applyment processes that execute. The only way to edit this information will be via the manual apply page within the Student web client UI. + +### Process and Post Scheduled Refunds + +Many Payment providers have a capability for processing refunds that are scheduled. The concept is similar to the payment plan installment payments discussed above. A refund is owed to a student, the refund is scheduled in the Student application and then that refund is paid on or before the refund due date. The high level flow of this use case for Payment providers who process refunds is as follows: + +- Retrieve batch of refunds that are due to be paid and need to be processed +- Flag the scheduled refund records that were retrieved indicating that these refunds have been selected for processing +- Process the refunds in the Payment provider software +- Post the refunds as processed back into the Student application + +#### Retrieve scheduled refunds + +The first step is to retrieve the scheduled refunds that need to be processed. The best way to do this is to constuct an odata query to retrieve the needed information. The scheduled refunds will reside in the Refunds entity. One of the filters needed in the query will be on the Status property. A value of 'N' in the Status property indicates that the refund is scheduled but has not yet been processed/paid. Other valid values for this property are P= Processed/Paid, V= Was paid but has since been Voided and S= Selected for Processing. The other key filters needed in the OData query will be on the DueDate property which indicates the date that the refund is due. Also, there will likely need to be filtering based on the fund source the refund is for. In many cases, refunds that are being returned to Title IV fund sources are not processed by Payment providers. The StudentAward navigation property on the Refunds entity will need to be utilized to construct the filtering condition needed to filter on the fund source(s) that should be included. + +#### Flag the selected refund records + +The next step after selecting the refunds to be processed is to utilize an API to mark these refunds as selected for processing. This is critical to ensure the refunds retrieved in the prior step are not eligible to be processed within the Student application and/or included in a subsequent query for retrieving refunds to be processed. There is an API that allows for manipulation of the Status property on the Refunds entity. + +The API to use for setting the Status value on the Refund entity is PATCH api/student-accounting/scheduled-refunds-status + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview7.png) + +This API is very easy to use. There are only two units of work that occur. Change the Status on the Refund entity row from N to S or change the Status on the Refund row from S to N. There may be some times where for whatever reason the processing of the refund in the Payment provider application was not successful. For these cases, where the refund is not able to be processed in the Payment provider software, the Status on that scheduled refund record will need to be changed from Selected for processing back to Not Processed. + +#### Post the Processed/Paid Refunds + +After the refunds have been processed in the Payment Provider application, these refunds need to be posted in Student utilizing an API. + +The API to use for posting these scheduled refunds is POST api/student-accounting/ledger-scheduled-refund-transactions + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview8.png) + +It is important to note that there is another API that allows for posting refunds. However, this API is used when posting a refund to a student's ledger card that is NOT scheduled. If there is a need to post a refund that is not scheduled and has no row in the Refunds entity then use the POST api/student-accounting/ledger-refund-transactions endpoint. + +The request payload for posting scheduled refunds is a collection allowing for all refunds that have been processed in the Payment provider application to be posted via a single API call. The key property that must be specified in the request for each refund posted is the RefundId value which identifies the row in the Refund entity that has been paid/posted. The high level unit of work that will occur within the execution of this API will be to post a refund transaction on the student's ledger card AND also update the Status on the Refund entity row from Selected for processing to P= Processed/Paid. + +The response returned will be a collection having one element for each element that was provided in the request. The success/failure for each individual refund record provided in the request will be articulated in the response. + +### Create a payment plan + +Another common use case for Payment providers is to create and manage payment plans for Students. If the payment plan data is persisted in the Payment provider data store, then the Payment Provider application will be considered the system of record for student payment plan data. Because there are numerous reports and other processes in Student that have a dependency on ALL expected funding to be represented for a student, it is imperative that the payment plan data stored in Anthology Student is kept in synch with the payment plan data in the Payment Provider software. The create payment plan and update existing payment plan APIs will be used for this purpose. + +The API to use for creating a new payment plan in Anthology Student is POST api/student-accounting/student-payment-plan + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview9.png) + +Payment Plans can be interest bearing or non-interest bearing plans in Anthology Student. Several properties in the request payload can be ignored for non-interest bearing payment plans. The request payload needed should be able to be created fairly easily by using the property level documentation found in the swagger output. + +### Update an existing payment plan + +This API will be used to ensure existing payment plans are kept in sync between the Payment provider application and Anthology Student. A very common use case is when a student makes an installment payment but the amount of the payment does not match the amount of the expected installment. In these cases, the remainder of the expected payment schedule needs to be adjusted. Assuming the Payment Provider application is the system of record, this adjustment would occur in the Payment provider application. The resulting data would then be pushed into Anthology Student using the API to update an existing payment plan. + +The API to use for updating an existing payment plan in Anthology Student is PATCH api/student-accounting/student-payment-plan + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview10.png) + +One of the key capabilities with this API is to be able to remove ALL expected payments for a payment plan and replace them with the scheduled payments that are specified in the request. The IsScheduledPaymentsRemoved property in the request is used for this purpose. It is important to note that ONLY rows with a Status of S or C in the payment plan expected payments entity (ScheduledDisbursements) can be removed. Any expected disbursement record that has been marked as Paid will not be touched. The request payload has property level documentation and should be reviewed carefully as a guide for constructing the desired request payload for this API. + +### Post misc cash receipts + +Another common use case is the need to post transactions in Anthology Student that will not appear on an individual student's ledger card. These transactions are labeled in Anthology Student as miscellaneous cash receipts. + +The API to use for posting a miscellaneous cash receipt is POST api/student-accounting/misc-cash-receipts + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview11.png) + +One of the required properties for the request is to specify the transaction billing code that the misc cash receipt will be applied to. This controls how the transaction will ultimately be posted to the general ledger. Not all transaction billing codes are eligible to be used when posting miscellaneous cash receipts. Validation logic in this API requires that the transaction billing code specified in the request has been configured in Student to be able to be used for miscellaneous cash receipt posting. An OData query can be used to retrieve the transaction billing codes that are able to be used for miscellaneous cash receipt posting. The entity to query is BillingTransactionCodes. All rows from this entity where Usage is equal to M or A can be used. + +There is also a PATCH endpoint that allows for updating a previously posted miscellaneous cash receipt transaction. Validation is in place that will not allow any updates to a miscellaneous cash receipt transaction that has already been release to the general ledger. + +## Authorization + +In order to execute the APIs that have been discussed above, proper authorization needs to be configured. Whether using Basic Auth or OAuth with application key to authenticate, the user context the APIs are executing under will be a user record from the Staff entity. This is the user that authorization needs to be configured for. Access to the security console application is needed in order to set the needed permissions. Unlike the Anthology Student command APIs, the API endpoints discussed above have separate explicit tasks that need to be authorized. The Anthology Student command APIs are coupled with UI tasks. In order to properly authorize an API user to execute a command API, the applicable UI task needs to be identified and added for that user. For the APIs discussed in this document that exercise is not needed. Details are outlined below. + +Within the Security console, the API - Student Accounting and API - Student Payment Plan tasks should be added for the user. These 2 tasks will authorize the user to execute every operation contained within the Student Accounting and Student Payment Plan sections within the swagger document. If more refined permissions are needed and you want to authorize the execution of specific operations with Student Accounting or Student Payment Plan, then the applicable individual operations will need to be authorized. Typically, this level of granularity is not needed and authorizing the two tasks mentioned above is all that is needed. + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview12.png) + +For any OData queries that will be executed, additional authorization is needed. The authorization model for the odata endpoint is to either grant permission to query all entities contained within the data model or to authorize each individual entity that data will be extracted from. Currently there are no tasks available for authorizing by business area of domain. Best practice is to NOT authorize access to the entire query data model so it will be necessary to create an inventoried list of each entity that data will be retrieved from and add the applicable operation for the user. In order to authorize at the operation level, select the role that the user is a member of. Then select Add Permissions. On the resulting page that is displayed, check the Show Operations checkbox. To make the resulting list easier to navigate, you may want to uncheck the Show Tasks, Show Built In Tasks and Show Roles check boxes. Click Apply. + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview13.png) + +All of the odata query model operations are named as follows: domain + entity name (singluar) + query. So to authorize the permission to retrieve data from the BillingCodeTransaction entity, the StudentAccounts.BillingTransactionCode.Query operation would need to be added for the user. + +![PaymentVendorPartnerOverview](/assets/img/PaymentVendorPartnerOverview14.png) + +Once all query model operations for the list of entities are added for the user, then the authorization permissions should be complete for the user being authenticated when executing the APIs/OData queries. + +## Conclusion + +The purpose of this document is to provide enough information to provide a Payment provider new to Anthology Student a jump start on building an integration that satisfy common integration requirements. This document is not intended to include all of the finer points and nuances for utilizing the APIs that have been covered. If there are questions after reviewing this document and the corresponding swagger documentation, you can submit any questions by sending an email to developers@anthology.com. diff --git a/docs/rest-apis/student/best-practices/SaveStudentTransferCredit .md b/docs/student/best-practices/SaveStudentTransferCredit .md similarity index 97% rename from docs/rest-apis/student/best-practices/SaveStudentTransferCredit .md rename to docs/student/best-practices/SaveStudentTransferCredit .md index 1242c7017..efab97970 100644 --- a/docs/rest-apis/student/best-practices/SaveStudentTransferCredit .md +++ b/docs/student/best-practices/SaveStudentTransferCredit .md @@ -1,14 +1,12 @@ --- -title: 'Using the SaveStudentTransferCredit command API' +title: "Using the SaveStudentTransferCredit command API" id: studentapi-savestudenttransfercredit-details sidebar_position: 1 author: Jim Burns -published: '2024-06-26' -edited: '2024-06-26' +published: "2024-06-26" +edited: "2024-06-26" --- - - A common use case for integrators is to persist data for courses completed at other institutions. There is capability in Anthology Student for a student to have course requirements satisfied with course work that has been completed at other institutions. The high level process is for a user to create a student transfer credit record which consists of the course(s) that have been completed at other institutions as well as the internal course(s) that the external course work will be satifying. There are many cases where the process of articulating which external courses satisfy which internal courses is handled outside of the Anthology Student applicatuin boundary. In this case, it is critical to be able to persist this data into Anthology Student so that business processes that have dependencies on transfer credit data will operate as expected. The command API endpoint that is used for persisting this data is api/commands/Admissions/StudentTransferCredit/SaveStudentTransferCredit. This document will document the pertinent details for being able to successfully leverage and execute this API. ## Swagger documentation @@ -120,5 +118,3 @@ In order to be able to execute this API endpoint, the user that the API call is There are a number of properties in the request payload that are optional. The nuances of if/how to populate these will need to be determine via iterative testing and validation with the client. The sample request payload provided above can be used as a starting point but will likely need to be fine tuned in order to satisfy all requirements for recording student transfer credit data. If there are questions after reviewing this document and the corresponding swagger documentation, you can submit them by sending an email to developers@anthology.com. - - diff --git a/docs/rest-apis/student/best-practices/StudentQueryModelMetadata.md b/docs/student/best-practices/StudentQueryModelMetadata.md similarity index 95% rename from docs/rest-apis/student/best-practices/StudentQueryModelMetadata.md rename to docs/student/best-practices/StudentQueryModelMetadata.md index 5a97cb7d6..b972cd485 100644 --- a/docs/rest-apis/student/best-practices/StudentQueryModelMetadata.md +++ b/docs/student/best-practices/StudentQueryModelMetadata.md @@ -1,14 +1,12 @@ --- -title: 'Student query model metadata' +title: "Student query model metadata" id: studentapi-querymodel-metadata sidebar_position: 4 author: Jim Burns -published: '2024-06-26' -edited: '2024-06-26' +published: "2024-06-26" +edited: "2024-06-26" --- - - The student data model is comprised of hundreds and hundreds of entities. One of the fundamental requirements for integration partners is to be able to retrieve data out of the query model. There are numerous OData controller methods implemented that can be used to retrieve data. However, the purpose of these methods is to supply the needed data for the web client UI pages. Thus, the design and function of these methods are extremely prescribed. In most cases, when there is a need to retrieve data from Anthology Student, the solution will be to write a custom OData query using the ds/odata endpoint. To maximize the power of this capability, it is important to understand the query data model and specifically, the navigation properties available on each entity in the model. The Data Views feature in the Anthology Student web client is a very powerful tool and can be very helpful in gaining an increased understanding of the query data model. However, one of the limitations in this tool is that many navigation properties for entities are not visible. The only navigation properties that are exposed in the Data Views UI are ones that have a one to one multiplicity with the base entity. Navigation properties that have a one to many multiplicity are hidden from the UI. In order to see a complete inventory of all navigation properties available in the query model, you can use an endpoint that returns the complete metadata for the query model. ## Metadata endpoint @@ -34,5 +32,3 @@ The next area of the output lists all of the navigation properties defined for t ![Query Model Metadata](/assets/img/StudentQueryModelMetadata3.png) In conclusion, the Data Views feature in the web client UI can be utilized as a starting point for building custom odata queries and visually seeing available properties and relationships between entities. However, it is important to always review the output from the $metadata endpoint to ensure you are seeing the complete model metadata including ALL available navigation properties for a given entity. - - diff --git a/docs/rest-apis/student/best-practices/create-savenew-operations.md b/docs/student/best-practices/create-savenew-operations.md similarity index 99% rename from docs/rest-apis/student/best-practices/create-savenew-operations.md rename to docs/student/best-practices/create-savenew-operations.md index 2c31a6854..f06d75988 100644 --- a/docs/rest-apis/student/best-practices/create-savenew-operations.md +++ b/docs/student/best-practices/create-savenew-operations.md @@ -4,12 +4,10 @@ id: create-savenew-bestpractices categories: Student REST sidebar_position: 3 author: Jim Burns -published: '2024-03-26' -edited: '2024-03-26' +published: "2024-03-26" +edited: "2024-03-26" --- - - A large subset of the available APIs in Anthology Student have a scope of inserting and updating single instances of an entity. Every entity in the Student data model inherits from a base entity service. The available operations in the base entity service are Get, Create, SaveNew, Save and Delete. There are some entities in the model that have additional APIs implemented for inserting and updating data. These will be reflected with additional endpoints that are documented in Swagger. The focus of this document will outline best practices for how to insert a new instance into an entity utilizing the Create and SaveNew endpoints. ## Swagger documentation @@ -532,5 +530,3 @@ The value provided in this property may or may not impact the execution logic of ### Id property The primary key for every entity in the Student data model is called Id. In most cases, this property will be populated with -1 in the response returned from the Create operation. If not, it is recommended that you set the value for this property to -1 prior to calling the SaveNew operation. - - diff --git a/docs/rest-apis/student/best-practices/get-save-operations.md b/docs/student/best-practices/get-save-operations.md similarity index 99% rename from docs/rest-apis/student/best-practices/get-save-operations.md rename to docs/student/best-practices/get-save-operations.md index 2582bad70..ec2edf6f1 100644 --- a/docs/rest-apis/student/best-practices/get-save-operations.md +++ b/docs/student/best-practices/get-save-operations.md @@ -3,12 +3,10 @@ title: Tips for using the Get and Save API operations id: get-save-bestpractices sidebar_position: 2 author: Jim Burns -published: '2024-04-23' -edited: '2024-04-23' +published: "2024-04-23" +edited: "2024-04-23" --- - - A large subset of the available APIs in Anthology Student have a scope of inserting and updating single instances of an entity. Every entity in the Student data model inherits from a base entity service. The available operations in the base entity service are Get, Create, SaveNew, Save and Delete. There are some entities in the model that have additional APIs implemented for inserting and updating data. These will be reflected with additional endpoints that are documented in Swagger. The focus of this document will outline best practices for how to update an existing instance of an entity utilizing the Get and Save endpoints. ## Swagger documentation @@ -372,5 +370,3 @@ EntityState is a property that exists on the base entity class that every entity 3= Record is unchanged The value provided in this property may or may not impact the execution logic of the API you are calling. The use of this property in the API execution logic is not consistent across all of the Delete, Save and SaveNew operations. It is recommended that this property be populated correctly to align with the action that is occurring to ensure expected behavior in the API if there is dependent execution logic on this property. - - diff --git a/docs/rest-apis/student/getting-started/student-first-steps.md b/docs/student/getting-started/student-first-steps.md similarity index 95% rename from docs/rest-apis/student/getting-started/student-first-steps.md rename to docs/student/getting-started/student-first-steps.md index d3101b06d..544c0739c 100644 --- a/docs/rest-apis/student/getting-started/student-first-steps.md +++ b/docs/student/getting-started/student-first-steps.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - Anthology offers a suite of education technology tools, both software and hardware. REST stands for Representational State Transfer. It is a lightweight, flexible web service architecture that allows HTTP commands to be sent to Web Applications without unnecessary overhead. ## Before You Get Started @@ -41,5 +39,3 @@ We will continue to add new examples, tutorials, and code samples so make sure t - [Student Developer Docs](https://docs.anthology.com) (navigate to REST APIs>Student) - [Developer Portal](https://developer.anthology.com/) - [REST Documentation](https://developer.anthology.com/portal/displayApi) - - diff --git a/docs/rest-apis/student/service-catalog/about-student-service-catalog.md b/docs/student/service-catalog/about-student-service-catalog.md similarity index 91% rename from docs/rest-apis/student/service-catalog/about-student-service-catalog.md rename to docs/student/service-catalog/about-student-service-catalog.md index ec478123f..0a359438c 100644 --- a/docs/rest-apis/student/service-catalog/about-student-service-catalog.md +++ b/docs/student/service-catalog/about-student-service-catalog.md @@ -7,8 +7,6 @@ published: "" edited: "" --- - - The Service Catalog is a collection of Web Services made available to customers who license Anthology® products. Note: An Anthology MyCampusInsight account is required to access. https://www.mycampusinsight.com/Documentation-Center/Help/Help_Home/Content/helphome.htm @@ -17,5 +15,3 @@ The Service Catalog system contains the Application Programming Intertace (API) (WCF) services. Ihe documentation is intended to be used by programmers familiar with consuming SOAP and WCF services. For Anthology Student, this help system supports the current CampusLink API version and two prior versions. Topics that have been added or modified during the release cycle display a version selector at the top of the topic pane. Use the version selector to reveal content for prior versions. - - diff --git a/docs/rest-apis/student/tutorials/training-videos.md b/docs/student/tutorials/training-videos.md similarity index 62% rename from docs/rest-apis/student/tutorials/training-videos.md rename to docs/student/tutorials/training-videos.md index 1fbfeccc2..6bf159802 100644 --- a/docs/rest-apis/student/tutorials/training-videos.md +++ b/docs/student/tutorials/training-videos.md @@ -5,8 +5,4 @@ published: "" edited: "" --- - - This page contains a list of Student training videos. - - diff --git a/docusaurus.config.js b/docusaurus.config.js index beae3415b..a7317e7c5 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,45 +1,44 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -const lightCodeTheme = require('prism-react-renderer/themes/github'); -const darkCodeTheme = require('prism-react-renderer/themes/dracula'); +const lightCodeTheme = require("prism-react-renderer/themes/github"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); /** @type {import('@docusaurus/types').Config} */ const config = { - title: 'Anthology Developer Documentation', - tagline: 'APIs are cool!', - favicon: 'img/favicon.ico', + title: "Anthology Developer Docs", + tagline: "Developer Documentation", + favicon: "img/favicon.ico", // Set the production url of your site here // url: 'https://blackboard.github.io', // url: 'https://anthologydevdocs.github.io', - url: 'https://docs.anthology.com', + url: "https://docs.anthology.com", // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' // baseUrl: '/', - baseUrl: '/', - projectName: 'anthologydevdocs', - organizationName: 'Anthology', + baseUrl: "/", + projectName: "anthologydevdocs", + organizationName: "Anthology", trailingSlash: false, // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. // organizationName: 'blackboard', // Usually your GitHub org/user name. //projectName: 'docusaurus', // Usually your repo name. - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'throw', + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "throw", // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want // to replace "en" with "zh-Hans". i18n: { - defaultLocale: 'en', - locales: ['en'], + defaultLocale: "en", + locales: ["en"], }, - presets: [ [ - 'classic', + "classic", /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { @@ -49,22 +48,25 @@ const config = { // autoCollapseCategories: true, //}, - sidebarPath: require.resolve('./sidebars.js'), + sidebarPath: require.resolve("./src/sidebar.js"), // Please change this to your repo. // Remove this to remove the "edit this page" links. - //editUrl: - // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + editUrl: + "https://github.com/OneComputerGuy/anthologydevdocs/tree/main", }, blog: { showReadingTime: true, - postsPerPage: 'ALL', + postsPerPage: "ALL", // Please change this to your repo. // Remove this to remove the "edit this page" links. //editUrl: // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', }, theme: { - customCss: require.resolve('./src/css/custom.css'), + customCss: [ + require.resolve("./src/css/custom.css"), + require.resolve("./src/css/footer.css"), + ], }, }), ], @@ -74,114 +76,38 @@ const config = { /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ // Replace with your project's social card - image: 'img/docusaurus-social-card.jpg', + image: "img/social-card.png", navbar: { - title: 'anthology', logo: { - alt: 'Anthology Logo', - src: 'img/ANTHOLOGY-Logo-RGB.svg', + alt: "Anthology Logo", + src: "/img/anthology-logo-light.svg", + srcDark: "/img/anthology-logo-dark.svg", }, items: [ { - to: '/docs/site-intro', - // type: 'docSidebar', - // sidebarId: 'documentationSidebar', - position: 'left', - label: 'Documentation', + to: "/", + position: "right", + label: "Home", }, - { to: '/blog', label: 'Blog', position: 'left' }, + { to: "/blog", label: "Blog", position: "right" }, { - href: 'https://github.com/search?q=org%3Ablackboard+blackboard%2FBBDN-', - label: 'GitHub', - position: 'right', + type: "html", + position: "right", + value: + '', + }, + { + type: "search", + position: "left", }, ], }, - announcementBar: { - id: 'support_us', - content: - '🚨 Please remember: The Developer Portal has an optional maintenance window scheduled every month on the Tuesday of the second week', - backgroundColor: '#262626', - textColor: '#d5d5d5', - isCloseable: false, - }, sidebar: { + sidebarCollapsed: true, + sidebarCollapsible: true, hideable: true, autoCollapseCategories: true, }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { - label: 'Home', - to: '/', - }, - { - label: 'REST APIs', - to: '/docs/rest-apis/start-here', - }, - { - label: 'LTI', - to: '/docs/lti/introduction', - }, - { - label: 'Standards', - to: '/docs/standards/standards-intro', - }, - { - label: 'Developer Portal', - to: '/docs/developer-portal/start-here', - }, - { - label: 'Partners', - to: '/docs/partners/partners-become_a_partner', - }, - { - label: 'Community', - to: '/docs/community/community-intro', - }, - { - label: 'Blog', - to: '/blog', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'Slack - Blackboard Techies', - href: 'https://join.slack.com/t/blackboardtechies/shared_invite/zt-nheykjth-wLgONrE58MS53H~oySYk1g', - }, - { - label: 'Anthology Developer Support', - href: 'mailto:developers@anthology.com', - }, - ], - }, - { - title: 'More...', - items: [ - { - label: 'Developer AMI', - href: 'https://aws.amazon.com/marketplace/seller-profile?id=f6f7de05-e6d2-47f8-96e8-51cc4b38182b', - }, - { - label: 'GitHub - These docs', - href: 'https://github.com/blackboard/anthologydevdocs', - }, - { - label: 'GitHub - Example projects', - href: 'https://github.com/search?q=org%3Ablackboard+blackboard%2FBBDN-', - }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} Anthology, Inc. Built with Docusaurus.`, - }, prism: { theme: lightCodeTheme, darkTheme: darkCodeTheme, @@ -189,22 +115,10 @@ const config = { }), plugins: [ [ - require.resolve('@cmfcmf/docusaurus-search-local'), + require.resolve("docusaurus-lunr-search"), { - // whether to index docs pages - indexDocs: true, - // Whether to also index the titles of the parent categories in the sidebar of a doc page. - indexDocSidebarParentCategories: 0, - // whether to index blog pages - indexBlog: true, - // whether to index static pages - indexPages: false, - // language of your documentation, see next section - language: 'en', - // The maximum number of search results shown to the user. This does _not_ affect performance of - // searches, but simply does not display additional search results that have been found. - maxSearchResults: 50, - style: undefined, + languages: ["en"], + disableVersioning: true, }, ], ], diff --git a/package-lock.json b/package-lock.json index 9aeaa6fb2..43a59391b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,11 @@ "name": "anthology-dev-docs", "version": "0.0.0", "dependencies": { - "@cmfcmf/docusaurus-search-local": "^1.1.0", "@docusaurus/core": "^2.4.3", "@docusaurus/preset-classic": "^2.4.3", - "@easyops-cn/docusaurus-search-local": "^0.35.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", + "docusaurus-lunr-search": "^3.4.0", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2" @@ -34,47 +33,6 @@ "@algolia/autocomplete-shared": "1.9.3" } }, - "node_modules/@algolia/autocomplete-js": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.8.3.tgz", - "integrity": "sha512-h5v/qp8CwmCUOCaNkUa+vaybnIpIoJGEfwE2Ks/84KAqIHYCBgcylwn92PkIL3gbQCok2sc6JoSIlUo0eAgPsQ==", - "dependencies": { - "@algolia/autocomplete-core": "1.8.3", - "@algolia/autocomplete-preset-algolia": "1.8.3", - "@algolia/autocomplete-shared": "1.8.3", - "htm": "^3.1.1", - "preact": "^10.0.0" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.5.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-core": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.3.tgz", - "integrity": "sha512-DpNL4PZTes+6pg2ysJQzZZBQUvHSYP1q8IkiJA7UoNqFMf0pdq2bSIehuiMTxNegpMjSszaB7G+o5UgxavKhWA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.8.3" - } - }, - "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.3.tgz", - "integrity": "sha512-M5B9VZtMtBFS8KSIzv8m0gtwVYtFBBjCvr8boBi+orbQUqzdoj5f70CqhQxUtnNcFGizHUaShUDV571F33/m7g==", - "dependencies": { - "@algolia/autocomplete-shared": "1.8.3" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-shared": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.3.tgz", - "integrity": "sha512-llwPEemKzVhOjL9AsoZPejkaTTAsCB/2HHBQapC8LgQ2E/ipD5M1kTT6oSJskSVO5zI0YbBOCxAigZhgpPJ3eA==" - }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", @@ -107,11 +65,6 @@ "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@algolia/autocomplete-theme-classic": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.8.3.tgz", - "integrity": "sha512-sZt8uyBp5bwPTbqM+2cn/T7/OX8y8neEEtX10wWBgD7gakacn3//VEIdD1/+Yu1TJ2frWoP+SwuEbloe/zsMDg==" - }, "node_modules/@algolia/cache-browser-local-storage": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", @@ -2014,30 +1967,6 @@ "node": ">=6.9.0" } }, - "node_modules/@cmfcmf/docusaurus-search-local": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cmfcmf/docusaurus-search-local/-/docusaurus-search-local-1.1.0.tgz", - "integrity": "sha512-0IVb/aA0IK8ZlktuxmgXmluXfcSpo6Vdd2nG21y1aOH9nVYnPP231Dn0H8Ng9Qf9ronQQCDWHnuWpYOr9rUrEQ==", - "dependencies": { - "@algolia/autocomplete-js": "^1.8.2", - "@algolia/autocomplete-theme-classic": "^1.8.2", - "@algolia/client-search": "^4.12.0", - "algoliasearch": "^4.12.0", - "cheerio": "^1.0.0-rc.9", - "clsx": "^1.1.1", - "lunr-languages": "^1.4.0", - "mark.js": "^8.11.1" - }, - "peerDependencies": { - "@docusaurus/core": "^2.0.0", - "nodejieba": "^2.5.0" - }, - "peerDependenciesMeta": { - "nodejieba": { - "optional": true - } - } - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2693,46 +2622,6 @@ "node": ">=16.14" } }, - "node_modules/@easyops-cn/autocomplete.js": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", - "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", - "dependencies": { - "cssesc": "^3.0.0", - "immediate": "^3.2.3" - } - }, - "node_modules/@easyops-cn/docusaurus-search-local": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.35.0.tgz", - "integrity": "sha512-sHQ8jxsVgHH8MNXJlj20nZZfP/Q0peNTAJwKCN2aPuBwfRIoO0i7LmZFaYKenZmVAW/BD2MtfVd65SREmm3zxg==", - "dependencies": { - "@docusaurus/plugin-content-docs": "^2.0.0-rc.1", - "@docusaurus/theme-translations": "^2.0.0-rc.1", - "@docusaurus/utils": "^2.0.0-rc.1", - "@docusaurus/utils-common": "^2.0.0-rc.1", - "@docusaurus/utils-validation": "^2.0.0-rc.1", - "@easyops-cn/autocomplete.js": "^0.38.1", - "@node-rs/jieba": "^1.6.0", - "cheerio": "^1.0.0-rc.3", - "clsx": "^1.1.1", - "debug": "^4.2.0", - "fs-extra": "^10.0.0", - "klaw-sync": "^6.0.0", - "lunr": "^2.3.9", - "lunr-languages": "^1.4.0", - "mark.js": "^8.11.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@docusaurus/theme-common": "^2.0.0-rc.1", - "react": "^16.14.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -2960,228 +2849,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@node-rs/jieba": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.6.2.tgz", - "integrity": "sha512-1GA3RqfGgjemgMoh2wajdiApYEGZ7mjzsqIqEjHv7rHuIpSJSEgV+Jt81popd0DK0HLPNShVV3T3fSmTgv20Zw==", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@node-rs/jieba-android-arm-eabi": "1.6.2", - "@node-rs/jieba-android-arm64": "1.6.2", - "@node-rs/jieba-darwin-arm64": "1.6.2", - "@node-rs/jieba-darwin-x64": "1.6.2", - "@node-rs/jieba-freebsd-x64": "1.6.2", - "@node-rs/jieba-linux-arm-gnueabihf": "1.6.2", - "@node-rs/jieba-linux-arm64-gnu": "1.6.2", - "@node-rs/jieba-linux-arm64-musl": "1.6.2", - "@node-rs/jieba-linux-x64-gnu": "1.6.2", - "@node-rs/jieba-linux-x64-musl": "1.6.2", - "@node-rs/jieba-win32-arm64-msvc": "1.6.2", - "@node-rs/jieba-win32-ia32-msvc": "1.6.2", - "@node-rs/jieba-win32-x64-msvc": "1.6.2" - } - }, - "node_modules/@node-rs/jieba-android-arm-eabi": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.6.2.tgz", - "integrity": "sha512-DWRjc+RmSsiALdS7Ay1dI/Qh86M9tP20UKNeKKHKQLeVCl8isupUVLFxBdSLqmarPBJImh6nI67TTRpPfcOYMg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-android-arm64": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.6.2.tgz", - "integrity": "sha512-3T6+mG9ZR28eu1qe3Sh2DTR/eZVIaAQaaR5C2UHTsJfxVZSeGcd1ogoLgBom9iU3QDIa0kJCliH+GHiOmqr1xw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-darwin-arm64": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.6.2.tgz", - "integrity": "sha512-CvYmRSYebd4gpBYzmLivB17M4faNAe3o3BQ1E3MvjmlEu/J43XD59rOTdSkbe5ZykstC4i/xhaXKWRG2gcaOig==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-darwin-x64": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.6.2.tgz", - "integrity": "sha512-YcI9nNnYrNMhh2onnWnEkNdByYj0JbqPD4yF4GCmF4SsFRcEUEEnJrFE42FZoWzhDhUrE3hSU0uBjL+8iggr9w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-freebsd-x64": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.6.2.tgz", - "integrity": "sha512-iaH/F6JWEkE1DCeC0MEsglBuHbRj03Rj/PMAMhLZBruQyVJaQU7WHVFEt+eN+FbR0cPLUhvj4oltPF2nGlVYFQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.6.2.tgz", - "integrity": "sha512-T2V1KZ7Xhorm3xVG4k52xw0pH8Q4UevAey4mEdA6NDwlCnScqqENfzgMpt8Egv5xpBExte8tebB1+LLACD6Khg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-linux-arm64-gnu": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.6.2.tgz", - "integrity": "sha512-sZcAa/MGy6LTlEIU6uON9uY/AorQLbWVEEZ3g4W8FHAyqtdEeOByNNZG84qZzjXlWZbsjKRETArpGH2QBaXeWQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-linux-arm64-musl": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.6.2.tgz", - "integrity": "sha512-k+T34g1Pwr5sfpOSyjaCa9Mp4JCZ2XbP4pzrRsbc6ri7Y1tf9QzFR/fXgG5H24qRdLhzuXOJqdnJ6xVHTVUU9Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-linux-x64-gnu": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.6.2.tgz", - "integrity": "sha512-jcbrneEACIhZkVs3VOwhDWn7X8q18kfUugF3hhxW9ZzymuEMTUvcBFRWR18hk/WoHA5/MbcStr3ufteI+Wy5aw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-linux-x64-musl": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.6.2.tgz", - "integrity": "sha512-DbvAGsU+LNIiC7cK7uHsbM6ptwb0MMe4DSfYYhxJgt7GqDeWoDEd/fIGFO6GAgBLzFUpjAQgP6PBhCl55X2Avg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-win32-arm64-msvc": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.6.2.tgz", - "integrity": "sha512-I62/aVCCKxuTmCagvjyfj4rCbUaJTEjVModv2iWDw9lzt8UJtPd8C4XDe112r5I5AfkTfAHNZBe4k0zcE2NeuQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-win32-ia32-msvc": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.6.2.tgz", - "integrity": "sha512-MizaOJGcYxHgeiGj/dEap+E0LZNuCxejh2NSjY5QMDMPOv8O7I0PdXSgdnOPypDTQE0dnO99r+TI2EUB0TDHxw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/jieba-win32-x64-msvc": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.6.2.tgz", - "integrity": "sha512-d2W0IoxJ176jODE8wF6nNxfddYEaCtQ1xckJjIve/xHwUiBElnt81A41wZnfeyGx3pUaWMo4132s9EYJlN0Umg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3971,6 +3638,11 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4211,6 +3883,11 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -4247,6 +3924,14 @@ "node": ">= 4.0.0" } }, + "node_modules/autocomplete.js": { + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.37.1.tgz", + "integrity": "sha512-PgSe9fHYhZEsm/9jggbjtVsGXJkPLvd+9mC7gZJ662vVL5CRWEtm/mIrrzCx0MrNxHVwxD5d00UOn6NsmL2LUQ==", + "dependencies": { + "immediate": "^3.2.3" + } + }, "node_modules/autoprefixer": { "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", @@ -4423,6 +4108,15 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, + "node_modules/bcp-47-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", + "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4691,9 +4385,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", + "version": "1.0.30001647", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001647.tgz", + "integrity": "sha512-n83xdNiyeNcHpzWY+1aFbqCK7LuLfBricc4+alSQL2Xb6OR3XpnQAmlDG+pQcdTfiHRuLcQ96VOfrPSGiNJYSg==", "funding": [ { "type": "opencollective", @@ -4963,6 +4657,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -5091,6 +4793,11 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -5493,6 +5200,11 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-selector-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" + }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -5834,6 +5546,18 @@ "node": ">=8" } }, + "node_modules/direction": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", + "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -5850,6 +5574,35 @@ "node": ">=6" } }, + "node_modules/docusaurus-lunr-search": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/docusaurus-lunr-search/-/docusaurus-lunr-search-3.4.0.tgz", + "integrity": "sha512-GfllnNXCLgTSPH9TAKWmbn8VMfwpdOAZ1xl3T2GgX8Pm26qSDLfrrdVwjguaLfMJfzciFL97RKrAJlgrFM48yw==", + "dependencies": { + "autocomplete.js": "^0.37.0", + "clsx": "^1.2.1", + "gauge": "^3.0.0", + "hast-util-select": "^4.0.0", + "hast-util-to-text": "^2.0.0", + "hogan.js": "^3.0.2", + "lunr": "^2.3.8", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "minimatch": "^3.0.4", + "rehype-parse": "^7.0.1", + "to-vfile": "^6.1.0", + "unified": "^9.0.0", + "unist-util-is": "^4.0.2" + }, + "engines": { + "node": ">= 8.10.0" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0-alpha.60 || ^2.0.0 || ^3.0.0", + "react": "^16.8.4 || ^17 || ^18", + "react-dom": "^16.8.4 || ^17 || ^18" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6698,6 +6451,44 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6979,6 +6770,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -7022,6 +6818,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-has-property": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz", + "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", @@ -7057,6 +6871,31 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "node_modules/hast-util-select": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-4.0.2.tgz", + "integrity": "sha512-8EEG2//bN5rrzboPWD2HdS3ugLijNioS1pqOTIolXNf67xxShYw4SQEmVXd3imiBG+U2bC2nVTySr/iRAA7Cjg==", + "dependencies": { + "bcp-47-match": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "css-selector-parser": "^1.0.0", + "direction": "^1.0.0", + "hast-util-has-property": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-to-string": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "not": "^0.1.0", + "nth-check": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", @@ -7073,6 +6912,38 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", + "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz", + "integrity": "sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==", + "dependencies": { + "hast-util-is-element": "^1.0.0", + "repeat-string": "^1.0.0", + "unist-util-find-after": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hastscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", @@ -7110,6 +6981,18 @@ "value-equal": "^1.0.1" } }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -7161,11 +7044,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" - }, "node_modules/html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", @@ -7948,14 +7826,6 @@ "node": ">=0.10.0" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -8116,9 +7986,9 @@ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" }, "node_modules/lunr-languages": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.10.0.tgz", - "integrity": "sha512-BBjKKcwrieJlzwwc9M5H/MRXGJ2qyOSDx/NXYiwkuKjiLOOoouh0WsDzeqcLoUWcX31y7i8sb8IgsZKObdUCkw==" + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==" }, "node_modules/make-dir": { "version": "3.1.0", @@ -8418,6 +8288,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "engines": { + "node": "*" + } + }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -8522,6 +8401,20 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -8549,6 +8442,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/not": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", + "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -9595,15 +9493,6 @@ "postcss": "^8.2.15" } }, - "node_modules/preact": { - "version": "10.13.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz", - "integrity": "sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -10258,6 +10147,24 @@ "jsesc": "bin/jsesc" } }, + "node_modules/rehype-parse": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-7.0.1.tgz", + "integrity": "sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw==", + "dependencies": { + "hast-util-from-parse5": "^6.0.0", + "parse5": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -11674,6 +11581,19 @@ "node": ">=8.0" } }, + "node_modules/to-vfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.1.0.tgz", + "integrity": "sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==", + "dependencies": { + "is-buffer": "^2.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -11944,6 +11864,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-find-after": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz", + "integrity": "sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-generated": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", @@ -12889,6 +12821,32 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", diff --git a/package.json b/package.json index 7b9cba075..129ff9dbf 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cmfcmf/docusaurus-search-local": "^1.1.0", "@docusaurus/core": "^2.4.3", "@docusaurus/preset-classic": "^2.4.3", - "@easyops-cn/docusaurus-search-local": "^0.35.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", + "docusaurus-lunr-search": "^3.4.0", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2" diff --git a/sidebars.js b/sidebars.js deleted file mode 100644 index de2959690..000000000 --- a/sidebars.js +++ /dev/null @@ -1,376 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ - -const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - //tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - //documentationSidebar: [{type: 'autogenerated', dirName: '.'}], - // But you can create a sidebar manually - // documentationSidebar: - - documentationSidebar: [ - 'site-intro', - { - type: 'category', - label: 'Developer Portal', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'developer-portal', // Generate sidebar slice from docs path - }, - ], - }, - // REST APIs - { - type: 'category', - label: 'REST APIs', - collapsible: true, - collapsed: true, - items: [ - 'rest-apis/start-here', - 'rest-apis/rest-api-best-practices', - // Learn - { - type: 'category', - label: 'Learn', - collapsible: true, - // collapsed: true, - items: [ - 'rest-apis/learn/learn-intro', - // Getting Started - { - type: 'category', - label: 'Getting Started', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/learn/getting-started', // Generate sidebar slice from docs path - }, - ], - }, - // Admin - { - type: 'category', - label: 'Admin', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/learn/admin', // Generate sidebar slice from docs path - }, - ], - }, - // Working with Learn APIs - { - type: 'category', - label: 'Working with Learn APIs', - collapsible: true, - collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/learn/working-with-learn-apis', // Generate sidebar slice from docs path - }, - ], - }, - // Examples - { - type: 'category', - label: 'Examples', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/learn/examples', // Generate sidebar slice from path - }, - ], - }, - // Advanced - { - type: 'category', - label: 'Advanced', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/learn/advanced', // Generate sidebar slice from docs path - }, - ], - }, - // Sandbox - { - type: 'category', - label: 'Sandbox', - collapsible: true, - // collapsed: true, - items: ['rest-apis/learn/sandbox/developer-ami'], - }, - // Learn App - { - type: 'category', - label: 'Learn App', - collapsible: true, - // collapsed: true, - items: ['rest-apis/learn/learn-app/student-launch-schema'], - }, - ], - }, - // Ally - { - type: 'category', - label: 'Ally', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/ally', // Generate sidebar slice from docs path - }, - ], - }, - // Student - { - type: 'category', - label: 'Student', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'category', - label: 'Getting Started', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/student/getting-started', // Generate sidebar slice from docs path - }, - ], - }, - { - type: 'category', - label: 'Best Practices', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/student/best-practices', // Generate sidebar slice from docs path - }, - ], - }, - { - type: 'category', - label: 'Service Catalog', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'rest-apis/student/service-catalog', // Generate sidebar slice from docs path - }, - { - type: 'link', - label: 'Log into My Campus Insight ', - href: 'https://www.mycampusinsight.com/_layouts/CampusManagement/login.aspx?ReturnUrl=%2f_layouts%2fAuthenticate.aspx%3fSource%3d%252F&Source=%2F', - }, - ], - }, - // { - // type: 'category', - // label: 'Examples', - // collapsible: true, - // items: [ - // { - // type: 'autogenerated', - // dirName: 'REST APIs/Student/Examples', // Generate sidebar slice from docs path - // }, - // ] - // }, - // { - // type: 'category', - // label: 'Tutorials', - // collapsible: true, - // items: [ - // 'REST APIs/Student/tutorials/student-training-videos' - // ] - // }, - ], - }, - // Premium APIs - { - type: 'category', - label: 'Premium APIs', - collapsible: true, - // collapsed: true, - items: [ - 'rest-apis/premium-apis/requesting-premium-apis', - { - type: 'category', - label: 'UEF', - collapsible: true, - items: [ - 'rest-apis/premium-apis/uef/getting-started', - { - type: 'autogenerated', - dirName: 'rest-apis/premium-apis/uef/tutorials', // Generate sidebar slice from docs path - }, - { - type: 'link', - label: 'UEF Documentation', - href: 'https://docs.anthology.com/uef-documentation/start.html', - }, - ], - }, - // { - // type: 'autogenerated', - // dirName: 'REST APIs/Premium APIs', // Generate sidebar slice from docs path - // }, - ], - }, - ], - }, - // LTI - { - type: 'category', - label: 'LTI', - collapsible: true, - // collapsed: true, - items: [ - 'lti/introduction', - 'lti/getting-started-with-lti', - 'lti/lti-registration-deployment', - 'lti/registration-deployment', - 'lti/lti-deep-linking', - 'lti/turn-on-all-switches', - { - type: 'category', - label: 'Core', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'lti/core', // Generate sidebar slice from docs path - }, - ], - }, - { - type: 'category', - label: 'Migrating', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'lti/migrating', // Generate sidebar slice from docs path - }, - ], - }, - { - type: 'category', - label: 'Proctoring', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'lti/proctoring', // Generate sidebar slice from docs path - }, - ], - }, - { - type: 'category', - label: 'Tutorials', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'lti/tutorials', // Generate sidebar slice from docs path - }, - ], - }, - ], - }, - // Standards - { - type: 'category', - label: 'Standards', - collapsible: true, - // collapsed: true, - items: [ - 'standards/standards-intro', - { - type: 'category', - label: 'Caliper', - collapsible: true, - items: [ - // 'Standards/Caliper/caliper-intro', - { - type: 'category', - label: 'Getting Started', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'standards/caliper/getting-started', // Generate sidebar slice from docs path - }, - ], - }, - { - type: 'category', - label: 'Events', - collapsible: true, - items: [ - { - type: 'autogenerated', - dirName: 'standards/caliper/events', // Generate sidebar slice from docs path - }, - ], - }, - ], - }, - ], - }, - // Partners - { - type: 'category', - label: 'Partners', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'partners', // Generate sidebar slice from docs path - }, - ], - }, - // Community - { - type: 'category', - label: 'Community', - collapsible: true, - // collapsed: true, - items: [ - { - type: 'autogenerated', - dirName: 'community', // Generate sidebar slice from docs path - }, - ], - }, - ], -}; - -module.exports = sidebars; diff --git a/src/Components/Community/Community.jsx b/src/Components/Community/Community.jsx new file mode 100644 index 000000000..d8e068d23 --- /dev/null +++ b/src/Components/Community/Community.jsx @@ -0,0 +1,35 @@ +import React from "react"; +import styles from "./Community.module.css"; + +const Community = () => { + return ( +
+
+ image showing three characters interacting via text message +
+
+

Join our community!

+

+ Connect with other developers, learn from their experiences, and share + your knowledge. +

+ + Visit our community  + Chevron pointing to the right + +
+
+ ); +}; + +export default Community; diff --git a/src/Components/Community/Community.module.css b/src/Components/Community/Community.module.css new file mode 100644 index 000000000..8606c78a6 --- /dev/null +++ b/src/Components/Community/Community.module.css @@ -0,0 +1,72 @@ +.community-outer { + color: #fff; + padding: 3rem; + display: flex; + align-items: center; + border-radius: 0.5rem; + gap: 4rem; + background-color: var(--custom-anth-accent-secondary-dark); +} + +.community-section { + width: 100%; +} + +.community-link:link, +.community-link:visited, +.community-link:hover, +.community-link:active { + display: flex; + color: #fff; + font-weight: 700; +} + +.community-link-icon { + width: 1.3rem; + filter: invert(100%) sepia(0%) saturate(7479%) hue-rotate(248deg) + brightness(101%) contrast(102%); +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 500px) { + .community-outer { + flex-direction: column; + align-items: center; + } + + .community-section-image { + width: 18rem; + } +} + +/*/ Tablets */ +@media (min-width: 501px) and (max-width: 768px) { + .community-outer { + justify-content: center; + padding: 2rem 1rem; + } + + .community-section { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + } + + .community-section-image { + width: 18rem; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { +} + +/*/ Laptopts */ +@media (min-width: 1025px) and (max-width: 1400px) { +} + +@media (min-width: 1401px) and (max-width: 1920px) { +} + +/*/ Desktops above 1920px will use the regular CSS created above media queries*/ diff --git a/src/Components/ExternalLinks/Card/Card.jsx b/src/Components/ExternalLinks/Card/Card.jsx new file mode 100644 index 000000000..61d16022b --- /dev/null +++ b/src/Components/ExternalLinks/Card/Card.jsx @@ -0,0 +1,27 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./Card.module.css"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const Card = (props) => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( +
+ {props.imgAlt} +

{props.title}

+

{props.message}

+ + {props.aMessage}  + An arrow pointing to the right + +
+ ); +}; + +export default Card; diff --git a/src/Components/ExternalLinks/Card/Card.module.css b/src/Components/ExternalLinks/Card/Card.module.css new file mode 100644 index 000000000..e7a236fb4 --- /dev/null +++ b/src/Components/ExternalLinks/Card/Card.module.css @@ -0,0 +1,11 @@ +.card { + padding: 2rem; +} + +.card > img:first-child { + margin-bottom: 0.4rem; +} + +.card h2 { + font-weight: 700; +} diff --git a/src/Components/ExternalLinks/ExternalLinks.jsx b/src/Components/ExternalLinks/ExternalLinks.jsx new file mode 100644 index 000000000..0b9eb6bb2 --- /dev/null +++ b/src/Components/ExternalLinks/ExternalLinks.jsx @@ -0,0 +1,37 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./ExternalLinks.module.css"; +import Card from "./Card/Card"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const ExternalLinks = () => { + const { colorMode } = useColorMode(); + + const hasHydrated = useIsBrowser(); + + return ( +
+ + + +
+ ); +}; + +export default ExternalLinks; diff --git a/src/Components/ExternalLinks/ExternalLinks.module.css b/src/Components/ExternalLinks/ExternalLinks.module.css new file mode 100644 index 000000000..cd845e9ed --- /dev/null +++ b/src/Components/ExternalLinks/ExternalLinks.module.css @@ -0,0 +1,48 @@ +.links-section { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 5rem; + margin: 4rem 0rem; +} + +.links-section > div { + grid-row: 1/-1; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .links-section { + margin: 1rem 0rem; + gap: 2rem; + } + + .links-section > div:first-child { + grid-column: 1/-1; + grid-row: 1; + } + + .links-section > div:last-child { + grid-column: 1/-1; + grid-row: 2; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 768px) { + .links-section { + margin: 1rem 0rem; + gap: 2rem; + } + + .links-section > div:first-child { + grid-column: 1/-1; + grid-row: 1; + } + + .links-section > div:last-child { + grid-column: 1/-1; + grid-row: 2; + } +} diff --git a/src/Components/Footer/Footer.jsx b/src/Components/Footer/Footer.jsx new file mode 100644 index 000000000..369a0a8a2 --- /dev/null +++ b/src/Components/Footer/Footer.jsx @@ -0,0 +1,66 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./Footer.module.css"; +import clsx from "clsx"; + +const Footer = () => { + return ( + + ); +}; + +export default Footer; diff --git a/src/Components/Footer/Footer.module.css b/src/Components/Footer/Footer.module.css new file mode 100644 index 000000000..49d0e671f --- /dev/null +++ b/src/Components/Footer/Footer.module.css @@ -0,0 +1,137 @@ +.custom-footer-bg { + background: linear-gradient( + 300deg, + var(--custom-anth-light-blue) 7%, + var(--custom-anth-dark-blue) 7% + ); + color: #fff; +} + +.custom-footer-bg > div { + max-width: 90rem; + margin: 0rem auto 1rem auto; +} + +.custom-footer { + padding: 3rem 3rem 1rem 3rem; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 9rem; +} + +.custom-footer > img { + grid-row: 1/-1; + width: 12rem; +} + +.footer-section > div > p { + margin-bottom: 0.5rem; +} + +.custom-footer ul { + list-style: none; + text-decoration: none; + padding: 0; +} +.custom-footer ul li { + margin-bottom: 0.3rem; +} + +.footer-section { + grid-row: 1/-1; + display: flex; + gap: 6rem; +} + +.footer-section span { + grid-column: 1/-1; +} + +.footer-section a:visited, +.footer-section a:link, +.footer-section a:active, +.footer-section a:hover { + color: #fff; +} + +.footer-copyright { + margin: 1rem 3rem; + font-size: 0.8rem; + color: #ffffffb2; +} + +.footer-copyright a:visited, +.footer-copyright a:link, +.footer-copyright a:active, +.footer-copyright a:hover { + color: #ffffffb2; + text-decoration: underline; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .custom-footer { + grid-template-rows: 1fr 3fr; + gap: 1rem; + } + + .custom-footer > img { + grid-column: 1/-1; + grid-row: 1; + } + + .footer-section { + flex-direction: column; + grid-column: 1/-1; + grid-row: 2; + gap: 3rem; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 768px) { + .custom-footer { + grid-template-rows: 1fr 3fr; + gap: 1rem; + } + + .custom-footer > img { + grid-column: 1/-1; + grid-row: 1; + } + + .footer-section { + flex-direction: column; + grid-column: 1/-1; + grid-row: 2; + gap: 3rem; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { + .custom-footer { + grid-template-rows: 3fr 3fr; + gap: 1rem; + } + + .custom-footer > img { + grid-column: 1/-1; + grid-row: 1; + } + + .footer-section { + grid-column: 1/-1; + grid-row: 2; + gap: 3rem; + } +} + +/*/ Laptopts */ +@media (min-width: 1025px) and (max-width: 1400px) { + .custom-footer { + grid-template-rows: 1fr 3fr; + gap: 1rem; + } +} diff --git a/src/Components/LandingHeader/LandingHeader.jsx b/src/Components/LandingHeader/LandingHeader.jsx new file mode 100644 index 000000000..c754026b9 --- /dev/null +++ b/src/Components/LandingHeader/LandingHeader.jsx @@ -0,0 +1,20 @@ +import React from "react"; +import clsx from "clsx"; +import { useColorMode } from "@docusaurus/theme-common"; +import styles from "./LandingHeader.module.css"; + +import heroImage from "../../../static/img/hero.png"; + +/// Monolithic Layout +const LandingHeader = () => { + return ( +
+
+

Anthology Developer Documentation

+

Discover everything you need to build for Anthology Solutions.

+
+
+ ); +}; + +export default LandingHeader; diff --git a/src/Components/LandingHeader/LandingHeader.module.css b/src/Components/LandingHeader/LandingHeader.module.css new file mode 100644 index 000000000..1b137d8de --- /dev/null +++ b/src/Components/LandingHeader/LandingHeader.module.css @@ -0,0 +1,76 @@ +.hero-banner { + color: #fff; + width: 100%; + height: 25rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-image: url("/img/hero.png"); + background-repeat: no-repeat; + background-size: cover; + text-align: center; +} + +.hero-banner h1 { + font-weight: 700; + font-size: 3.2rem; +} + +.hero-banner p { + font-size: 1.4rem; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .hero-banner { + height: 22rem; + flex-direction: column; + } + + .hero-banner h1 { + font-size: 2.3rem; + } + + .hero-banner p { + font-size: 1.2rem; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 768px) { + .hero-banner { + height: 22rem; + flex-direction: column; + text-align: center; + } + + .hero-banner h1 { + text-align: center; + font-size: 2.3rem; + } + + .hero-banner p { + font-size: 1.2rem; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { + .hero-banner h1 { + font-size: 2.8rem; + } + + .hero-banner p { + font-size: 1.3rem; + } +} + +/*/ Laptopts */ +@media (min-width: 1025px) and (max-width: 1400px) { +} + +@media (min-width: 1401px) and (max-width: 1920px) { +} + +/*/ Desktops above 1920px will use the regular CSS created above media queries*/ diff --git a/src/Components/Solutions/Card/Card.jsx b/src/Components/Solutions/Card/Card.jsx new file mode 100644 index 000000000..94653a09a --- /dev/null +++ b/src/Components/Solutions/Card/Card.jsx @@ -0,0 +1,39 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; +import styles from "./Card.module.css"; +import clsx from "clsx"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const Card = (props) => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( +
+ {props.imgSrc ? ( + {props.altText} + ) : ( +

{props.cardTitle}

+ )} +

{props.message}

+ + Documentation{" "} + icon of an arrow pointing to the right + +
+ ); +}; + +export default Card; diff --git a/src/Components/Solutions/Card/Card.module.css b/src/Components/Solutions/Card/Card.module.css new file mode 100644 index 000000000..1944ea7d4 --- /dev/null +++ b/src/Components/Solutions/Card/Card.module.css @@ -0,0 +1,61 @@ +.card { + width: 33%; + padding: 3rem; + border-radius: 4px; +} +.card > img { + width: 10.5rem; +} + +.card-light { + box-shadow: 0px 2px 10px 0px #0000001a; +} + +.card-dark { + box-shadow: 0px 2px 10px 0px #000000; +} + +.card p { + margin: 1rem 0 0.6rem 0; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .card { + width: 90%; + margin: 0rem auto; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 768px) { + .card { + width: clamp(10rem, 90%, 30rem); + margin: 0rem auto; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { + .card { + width: clamp(10rem, 90%, 30rem); + margin: 0rem auto; + } + + .card > img { + width: 10.5rem; + } +} + +/*/ Laptopts */ +@media (min-width: 1025px) and (max-width: 1400px) { + .card { + width: clamp(8rem, 90%, 30%); + margin: 0rem auto; + } +} + +@media (min-width: 1401px) and (max-width: 1920px) { +} + +/*/ Desktops above 1920px will use the regular CSS created above media queries*/ diff --git a/src/Components/Solutions/Solutions.jsx b/src/Components/Solutions/Solutions.jsx new file mode 100644 index 000000000..707a475e9 --- /dev/null +++ b/src/Components/Solutions/Solutions.jsx @@ -0,0 +1,34 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./Solutions.module.css"; +import Card from "./Card/Card"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const Solutions = () => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( +
+ + + +
+ ); +}; + +export default Solutions; diff --git a/src/Components/Solutions/Solutions.module.css b/src/Components/Solutions/Solutions.module.css new file mode 100644 index 000000000..df62e0735 --- /dev/null +++ b/src/Components/Solutions/Solutions.module.css @@ -0,0 +1,35 @@ +.solutions-grid { + justify-content: center; + margin: 4rem auto; + display: flex; + gap: 2rem; +} + +.solutions-grid h1 { + font-weight: 800; +} + +.solutions-card-override > img { + width: 14rem !important; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .solutions-grid { + flex-direction: column; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 768px) { + .solutions-grid { + flex-direction: column; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { + .solutions-grid { + flex-direction: column; + } +} diff --git a/src/Components/Widgets/Card/Card.jsx b/src/Components/Widgets/Card/Card.jsx new file mode 100644 index 000000000..c0bf3353e --- /dev/null +++ b/src/Components/Widgets/Card/Card.jsx @@ -0,0 +1,25 @@ +import React from "react"; +import styles from "./Card.module.css"; +import { useColorMode } from "@docusaurus/theme-common"; +import clsx from "clsx"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const Card = (props) => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( +
+
+

{props.title}

+
{props.children}
+
+
+ ); +}; + +export default Card; diff --git a/src/Components/Widgets/Card/Card.module.css b/src/Components/Widgets/Card/Card.module.css new file mode 100644 index 000000000..beea041f6 --- /dev/null +++ b/src/Components/Widgets/Card/Card.module.css @@ -0,0 +1,19 @@ +.card-outer { + width: 100%; +} + +.card-wrapper { + height: 100%; + border-radius: 0.5rem; + padding: 2rem; +} + +@media (max-width: 768px) { + .card-title { + font-size: 1.2rem; + } + + .card-contents { + font-size: 0.9rem; + } +} diff --git a/src/Components/Widgets/ReleaseNotes/ReleaseNotes.jsx b/src/Components/Widgets/ReleaseNotes/ReleaseNotes.jsx new file mode 100644 index 000000000..b3a9b832c --- /dev/null +++ b/src/Components/Widgets/ReleaseNotes/ReleaseNotes.jsx @@ -0,0 +1,36 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./ReleaseNotes.module.css"; +import Card from "../Card/Card"; +import latest from "../../../../widgets/latestMaintenance.json"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const ReleaseNotes = () => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( + +
+
+ + {latest.service} + + {latest.startDate} + Expected Downtime: {latest.expectedDowntime} + {latest.description} +
+ + More information + icon of an arrow pointing to the right + +
+
+ ); +}; + +export default ReleaseNotes; diff --git a/src/Components/Widgets/ReleaseNotes/ReleaseNotes.module.css b/src/Components/Widgets/ReleaseNotes/ReleaseNotes.module.css new file mode 100644 index 000000000..c1d5e3456 --- /dev/null +++ b/src/Components/Widgets/ReleaseNotes/ReleaseNotes.module.css @@ -0,0 +1,26 @@ +.releases-inner { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.releases-entry { + display: flex; + flex-direction: column; + gap: 0.1rem; +} + +.releases-entry span:first-child { + font-size: 1.1rem; +} + +.releases-entry span:last-child { + margin: 0.5rem 0; +} + +.releases-link { + text-decoration: none; + display: flex; + align-items: center; + gap: 0.4rem; +} diff --git a/src/Components/Widgets/WhatsNew/WhatsNew.jsx b/src/Components/Widgets/WhatsNew/WhatsNew.jsx new file mode 100644 index 000000000..dc7d0ddb7 --- /dev/null +++ b/src/Components/Widgets/WhatsNew/WhatsNew.jsx @@ -0,0 +1,39 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./WhatsNew.module.css"; +2; +import Card from "../Card/Card"; +import newDocs from "../../../../widgets/newDocs.json"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const WhatsNew = () => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + const buildNewEntry = (index, name, url) => { + return ( +
  • + icon of a chain link + + {name} + +
  • + ); + }; + + return ( + +
      + {Object.keys(newDocs).map((docId) => { + return buildNewEntry(docId, newDocs[docId].name, newDocs[docId].url); + })} +
      + ); +}; + +export default WhatsNew; diff --git a/src/Components/Widgets/WhatsNew/WhatsNew.module.css b/src/Components/Widgets/WhatsNew/WhatsNew.module.css new file mode 100644 index 000000000..5ac5bdf22 --- /dev/null +++ b/src/Components/Widgets/WhatsNew/WhatsNew.module.css @@ -0,0 +1,13 @@ +.whatsnew-list { + list-style-type: none; +} + +.whatsnew-item { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.whatsnew-item-link span { + align-content: center; +} diff --git a/src/Components/Widgets/Widgets.jsx b/src/Components/Widgets/Widgets.jsx new file mode 100644 index 000000000..8a10e01ae --- /dev/null +++ b/src/Components/Widgets/Widgets.jsx @@ -0,0 +1,28 @@ +import React from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +import styles from "./Widgets.module.css"; +import WhatsNew from "./WhatsNew/WhatsNew"; +import ReleaseNotes from "./ReleaseNotes/ReleaseNotes"; +import useIsBrowser from "@docusaurus/useIsBrowser"; + +const ContentGrid = () => { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( +
      + An image of program windows orbiting around a common center +
      + + +
      +
      + ); +}; + +export default ContentGrid; diff --git a/src/Components/Widgets/Widgets.module.css b/src/Components/Widgets/Widgets.module.css new file mode 100644 index 000000000..66550b256 --- /dev/null +++ b/src/Components/Widgets/Widgets.module.css @@ -0,0 +1,69 @@ +.content-grid { + margin: 3rem 0rem; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr 1fr; + justify-items: center; + align-items: center; + gap: 1rem; +} + +.widget-filler { + grid-row: 1/-1; + width: 80%; +} + +.content-inner { + grid-row: 1/-1; + display: flex; + grid-column: 2/-1; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .content-grid { + width: 100%; + } + + .content-inner { + flex-direction: column; + grid-row: 1/-1; + grid-column: 1/-1; + } + + .widget-filler { + display: none; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 768px) { + .content-grid { + width: 100%; + } + + .content-inner { + flex-direction: column; + grid-row: 2/-1; + grid-column: 1/-1; + } + + .widget-filler { + width: 60%; + grid-row: 1; + grid-column: 1/-1; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { +} + +/*/ Laptopts */ +@media (min-width: 1025px) and (max-width: 1400px) { +} + +@media (min-width: 1401px) and (max-width: 1920px) { +} + +/*/ Desktops above 1920px will use the regular CSS created above media queries*/ diff --git a/src/components/HomepageFeatures/index.js b/src/components/HomepageFeatures/index.js deleted file mode 100644 index b19180445..000000000 --- a/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: 'Learn to integrate with Anthology products!', - Svg: require('@site/static/img/anthologydevdocs-explore.svg').default, - description: ( - <> - Explore the latest Anthology developer documentation, including tutorials, sample code, articles, and API reference. - - ), - }, - { - title: 'Example driven documentation and code!', - Svg: require('@site/static/img/anthologydevdocs-apis.svg').default, - description: ( - <> - Learn with our examples and code available via our GitHub repository. - - ), - }, - { - title: 'Sign Up!', - Svg: require('@site/static/img/anthologydevdocs-register.svg').default, - description: ( - <> - Don't forget to sign up for a free account on our Developer Portal: https://developer.anthology.com! - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
      -
      - -
      -
      -

      {title}

      -

      {description}

      -
      -
      - ); -} - -export default function HomepageFeatures() { - return ( -
      -
      -
      - {FeatureList.map((props, idx) => ( - - ))} -
      -
      -
      - ); -} diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e5..000000000 --- a/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/src/css/custom.css b/src/css/custom.css index 8f127d5be..2af400386 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -1,3 +1,5 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"); + /** * Any CSS included here will be global. The classic template * bundles Infima by default. Infima is a CSS framework designed to @@ -6,10 +8,10 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #BA6DD3; - --ifm-color-primary-dark: #B46ED4; - --ifm-color-primary-darker: #A263D4; - --ifm-color-primary-darkest: #924DE7; + --ifm-color-primary: #2959a9; + --ifm-color-primary-dark: #2959a9; + --ifm-color-primary-darker: #2959a9; + --ifm-color-primary-darkest: #2959a9; --ifm-color-primary-light: #ca9cd8; --ifm-color-primary-lighter: #e5b5e6; --ifm-color-primary-lightest: #efc4f5; @@ -18,13 +20,98 @@ } /* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - --ifm-color-primary: #C56ED4; - --ifm-color-primary-dark: #B46ED4; - --ifm-color-primary-darker: #A263D4; - --ifm-color-primary-darkest: #924DE7; +[data-theme="dark"] { + --ifm-color-primary: #2c9ede; + --ifm-color-primary-dark: #2c9ede; + --ifm-color-primary-darker: #2c9ede; + --ifm-color-primary-darkest: #2c9ede; --ifm-color-primary-light: #ca9cd8; --ifm-color-primary-lighter: #e5b5e6; --ifm-color-primary-lightest: #efc4f5; --docusaurus-highlighted-code-line-bg: rgba(217, 171, 220, 0.435); } + +/* Branding guidelines indicates that Poppins needs to be used for headlines and Inter for the body */ + +:root { + --custom-anth-light-blue: #10224b; + --custom-anth-dark-blue: #091834; + --custom-anth-accent-blue: #2959a9; + --custom-anth-accent-secondary-light: #2959a9; + --custom-anth-accent-secondary-dark: #2959a9; + --custom-anth-author-dark: #344966; + --custom-anth-author-light: #b4cded; + --custom-anth-author-dark: #10224bdd; + --custom-anth-author-light: #091834dd; +} + +* { + font-family: "Inter", sans-serif !important; +} + +.navbar-home-link { + color: #ffffff; +} + +.navbar-home-link:hover, +.navbar-home-link:link, +.navbar-home-link:visited { + color: #ffffff; + text-decoration: none; +} + +.navbar-gh-img-link { + padding: 0; + margin: 0; + width: 2rem; + height: 2rem; +} + +.navbar-gh-link { + width: 2rem; + height: 2rem; + display: flex; + align-self: center; + align-items: center; + border-radius: 3rem; +} + +.navbar__search-input { + width: 20rem; +} + +.docs-custom-link-icon { + width: 1.2rem; + filter: invert(100%) sepia(0%) saturate(7479%) hue-rotate(248deg) + brightness(101%) contrast(102%); +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 360px) { + .navbar__search-input { + width: 6.5rem; + } +} + +/*/ Tablets */ +@media (min-width: 361px) and (max-width: 500px) { + .navbar__search-input { + width: 8rem; + } +} + +@media (min-width: 501px) and (max-width: 768px) { + .navbar__search-input { + width: 15rem; + } +} + +/*/ Laptopts */ +@media (min-width: 769px) and (max-width: 1400px) { + .navbar__search-input { + width: 20rem; + } +} + +/*/ Desktops above 1920px will use the regular CSS created above media queries*/ diff --git a/src/css/footer.css b/src/css/footer.css new file mode 100644 index 000000000..0c00972e7 --- /dev/null +++ b/src/css/footer.css @@ -0,0 +1,188 @@ +.docs-custom-footer { + margin-top: 3rem; +} + +.docs-footer-theme-dark { +} + +.docs-footer-theme-light { +} + +.docs-custom-footer div:first-child { + width: 90rem; + height: 16rem; + margin: 0 auto; + display: flex; + align-items: center; + gap: 2rem; + color: #fff; +} +.docs-custom-footer div:last-child { + display: flex; + align-items: center; + justify-content: center; + height: 3rem; + color: #fff; + background-color: #021023; +} + +.docs-custom-footer div:last-child p { + margin: 0; +} + +.docs-custom-footer div section { + padding: 1rem; + width: 30%; + height: 70%; +} + +.docs-custom-footer div section:nth-child(2) { + padding-left: 5rem; + width: 30%; + height: 70%; +} + +.docs-custom-footer div section:first-child { + align-content: center; +} + +.footer-section ul { + padding: 0; + margin-top: 2rem; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.footer-docs-copy { + text-align: center; + font-size: 0.8rem; +} + +.footer-docs-copy a:active, +.footer-docs-copy a:link, +.footer-docs-copy a:visited { + color: #fff; + text-decoration: underline; +} + +.footer-docs-copy a:hover { + color: #fff; + text-decoration: none; +} + +.footer-section ul { + list-style: none; +} + +.footer-link a:active, +.footer-link a:link, +.footer-link a:visited, +.footer-link a:hover { + color: #fff; + text-decoration: none; +} + +.footer-email { + text-decoration: underline !important; +} + +/*/ Responsive styles */ +/*/ Mobile */ +@media (max-width: 500px) { + .docs-custom-footer div:first-child { + margin-top: 3rem; + width: 18rem; + height: auto; + display: flex; + flex-direction: column; + } + + .docs-custom-footer div section { + font-size: 0.9rem; + width: 15rem; + } + .docs-custom-footer div section:nth-child(2) { + padding-left: 1rem; + width: 15rem; + } +} + +/*/ Tablets */ +@media (min-width: 501px) and (max-width: 768px) { + .docs-custom-footer div:first-child { + margin-bottom: 2rem; + max-width: 44rem; + width: auto; + display: grid; + align-items: center; + height: auto; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 0.5rem; + } + + .docs-custom-footer div section { + min-width: 16rem; + height: 10rem; + place-self: center; + } + + .docs-custom-footer div section:nth-child(2) { + padding-left: 1rem; + } +} + +@media (min-width: 769px) and (max-width: 1024px) { + .docs-custom-footer div:first-child { + max-width: 44rem; + margin-bottom: 2rem; + width: auto; + display: grid; + align-items: center; + height: auto; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 0.5rem; + } + + .docs-custom-footer div section { + min-width: 16rem; + height: 10rem; + place-self: center; + } + + .docs-custom-footer div section:nth-child(2) { + padding-left: 1rem; + } +} + +/*/ Laptopts */ +@media (min-width: 1025px) and (max-width: 1400px) { + .docs-custom-footer div:first-child { + margin-bottom: 2rem; + max-width: 62rem; + gap: 0.5rem; + } + + .docs-custom-footer div section { + padding: 0.5rem; + max-width: 15rem; + height: 13rem; + place-self: center; + } + + .docs-custom-footer div section:nth-child(2) { + padding-left: 2.3rem; + height: 13rem; + } +} + +@media (min-width: 1401px) and (max-width: 1920px) { + .docs-custom-footer div:first-child { + margin-bottom: 2rem; + max-width: 80rem; + } +} + +/*/ Desktops above 1920px will use the regular CSS created above media queries*/ diff --git a/src/modules/AuthorBox/AuthorBox.jsx b/src/modules/AuthorBox/AuthorBox.jsx new file mode 100644 index 000000000..eacdb9e90 --- /dev/null +++ b/src/modules/AuthorBox/AuthorBox.jsx @@ -0,0 +1,48 @@ +import React from "react"; +import styles from "./AuthorBox.module.css"; +import authors from "../../../widgets/authorInfo.json"; +import AuthorCard from "./components/AuthorCard"; + +const getAuthorInfo = (authorString) => { + const authorArray = []; + const authorNames = authorString.split(","); + authorNames.forEach((authorName) => { + if (authors[`${authorName.trim().toLowerCase()}`] === undefined) { + authorArray.push(authors["default"]); + } else { + authorArray.push(authors[`${authorName.trim().toLowerCase()}`]); + } + }); + + return authorArray; +}; + +const AuthorBox = (props) => { + /// Loads the author data based on the metadata of the document + let userData; + + if (props.frontMatter.author === undefined || props.frontMatter.author === "") + userData = getAuthorInfo("default"); + else userData = getAuthorInfo(props.frontMatter.author); + + /// Builds and returns the widget + return ( +
      +

      Contributors on this article:

      +
      + {userData.map((user) => { + return ( + + ); + })} +
      +
      + ); +}; + +export default AuthorBox; diff --git a/src/components/AuthorBox.module.css b/src/modules/AuthorBox/AuthorBox.module.css similarity index 100% rename from src/components/AuthorBox.module.css rename to src/modules/AuthorBox/AuthorBox.module.css diff --git a/src/components/AuthorBox.js b/src/modules/AuthorBox/OldVersions/AuthorBox.jsx similarity index 89% rename from src/components/AuthorBox.js rename to src/modules/AuthorBox/OldVersions/AuthorBox.jsx index 86da8f831..559540ab7 100644 --- a/src/components/AuthorBox.js +++ b/src/modules/AuthorBox/OldVersions/AuthorBox.jsx @@ -1,7 +1,8 @@ import React from "react"; import styles from "./AuthorBox.module.css"; -import authors from "./authorInfo.json"; +import authors from "../authorInfo.json"; import { useColorMode } from "@docusaurus/theme-common"; +import useIsBrowser from "@docusaurus/useIsBrowser"; const getAuthorInfo = (authorString) => { const authorArray = []; @@ -19,10 +20,11 @@ const getAuthorInfo = (authorString) => { const AuthorCard = (user, index) => { const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); const userProfilePic = user.img === undefined || user.img === "" - ? "/img/author-card-default-picture.png" + ? "/img/author-default-picture.png" : user.img; const profileStyles = @@ -33,7 +35,9 @@ const AuthorCard = (user, index) => {
      Background image of the author card { + const { colorMode } = useColorMode(); + const hasHydrated = useIsBrowser(); + + return ( +
      +
      + Profile picture of the contributor +
      +
      +

      {name}

      + {position} + {area} +
      +
      + ); +}; + +export default AuthorCard; diff --git a/src/modules/AuthorBox/components/AuthorCard.module.css b/src/modules/AuthorBox/components/AuthorCard.module.css new file mode 100644 index 000000000..0a3e565eb --- /dev/null +++ b/src/modules/AuthorBox/components/AuthorCard.module.css @@ -0,0 +1,66 @@ +.author-wrapper { + width: 15rem; + display: flex; + flex-direction: column; + align-items: center; +} + +.author-avatar { + width: 5rem; + height: 5rem; + border-radius: 50%; + overflow: hidden; +} + +.author-avatar-dropshadow-light { + -webkit-box-shadow: 0px 0px 29px 0px rgba(36, 36, 36, 0.44); + -moz-box-shadow: 0px 0px 29px 0px rgba(36, 36, 36, 0.44); + box-shadow: 0px 0px 29px 0px rgba(36, 36, 36, 0.44); +} + +.author-avatar-dropshadow-dark { + -webkit-box-shadow: 0px 0px 29px 0px rgba(217, 217, 217, 0.44); + -moz-box-shadow: 0px 0px 29px 0px rgba(217, 217, 217, 0.44); + box-shadow: 0px 0px 29px 0px rgba(217, 217, 217, 0.44); +} + +.author-info { + color: #fff; + width: 100%; + height: 7.5rem; + padding: 1.5rem 1rem 0.5rem 1rem; + transform: translateY(-1rem); + z-index: -1; + display: flex; + flex-direction: column; + text-align: center; + align-items: center; + border-radius: 1rem; + align-content: stretch; +} + +.author-info-dropshadow { + background: linear-gradient( + 240deg, + var(--custom-anth-author-light) 20%, + var(--custom-anth-author-dark) 20% + ); +} + +.author-info h3 { + font-size: 1rem; + margin-bottom: 0.3rem; +} + +.author-info span { + font-size: 0.8rem; + font-weight: 600; + color: #fffc; +} + +.author-info span:last-child { + max-width: 10rem; + font-size: 0.75rem; + margin-bottom: 0.3rem; + color: #fff5; +} diff --git a/src/components/PasswordChecker/PasswordChecker.js b/src/modules/PasswordChecker/PasswordChecker.js similarity index 100% rename from src/components/PasswordChecker/PasswordChecker.js rename to src/modules/PasswordChecker/PasswordChecker.js diff --git a/src/components/PasswordChecker/PasswordChecker.module.css b/src/modules/PasswordChecker/PasswordChecker.module.css similarity index 100% rename from src/components/PasswordChecker/PasswordChecker.module.css rename to src/modules/PasswordChecker/PasswordChecker.module.css diff --git a/src/components/VersioningTracker.js b/src/modules/VersioningTracker/VersioningTracker.jsx similarity index 100% rename from src/components/VersioningTracker.js rename to src/modules/VersioningTracker/VersioningTracker.jsx diff --git a/src/components/VersioningTracker.module.css b/src/modules/VersioningTracker/VersioningTracker.module.css similarity index 100% rename from src/components/VersioningTracker.module.css rename to src/modules/VersioningTracker/VersioningTracker.module.css diff --git a/src/pages/index.js b/src/pages/index.js deleted file mode 100644 index f833197a5..000000000 --- a/src/pages/index.js +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; - -import styles from './index.module.css'; - -function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); - return ( -
      -
      -

      {siteConfig.title}

      -

      {siteConfig.tagline}

      - Explore the latest Anthology developer documentation, including - tutorials, sample code, articles, and APIs. -
      -
      - ); -} - -export default function Home() { - const { siteConfig } = useDocusaurusContext(); - return ( - - -
      - -
      -
      - ); -} diff --git a/src/pages/index.jsx b/src/pages/index.jsx new file mode 100644 index 000000000..6e18da72f --- /dev/null +++ b/src/pages/index.jsx @@ -0,0 +1,24 @@ +import React from "react"; +import Layout from "@theme/Layout"; +import clsx from "clsx"; +import styles from "./index.module.css"; + +import LandingHeader from "../Components/LandingHeader/LandingHeader"; +import Widgets from "../Components/Widgets/Widgets"; +import Solutions from "../Components/Solutions/Solutions"; +import ExternalLinks from "../Components/ExternalLinks/ExternalLinks"; + +export default function Home() { + return ( + +
      + +
      + + + +
      +
      +
      + ); +} diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 9f71a5da7..146123740 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -1,23 +1,8 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } +.main-landing-page { + max-width: 90rem; + margin: 0 auto; } -.buttons { - display: flex; - align-items: center; - justify-content: center; -} +/* .index-page-bg { + background-color: #f9f9f9; +} */ diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b66..000000000 --- a/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/src/sidebar.js b/src/sidebar.js new file mode 100644 index 000000000..35dacbe65 --- /dev/null +++ b/src/sidebar.js @@ -0,0 +1,285 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ + +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + //tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + //documentationSidebar: [{type: 'autogenerated', dirName: '.'}], + // But you can create a sidebar manually + // documentationSidebar: + + documentationSidebar: [ + { + // Developer Portal + type: "category", + label: "Developer Portal", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "developer-portal", // Generate sidebar slice from docs path + }, + ], + }, + // Blackboard + { + type: "category", + label: "Blackboard Learn", + collapsible: true, + collapsed: true, + items: [ + "blackboard/rest-apis/start-here", + "blackboard/rest-apis/rest-api-best-practices", + // Rest APIs + { + type: "category", + label: "REST APIs", + collapsible: true, + // collapsed: true, + items: [ + // Getting Started + { + type: "category", + label: "Getting Started", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/rest-apis/getting-started", // Generate sidebar slice from docs path + }, + ], + }, + // Hands on Blackboard APIs + { + type: "category", + label: "Hands on", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/rest-apis/hands-on", // Generate sidebar slice from docs path + }, + ], + }, + // Advanced + { + type: "category", + label: "Advanced", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/rest-apis/advanced", // Generate sidebar slice from docs path + }, + ], + }, + // Demo code + { + type: "category", + label: "Demo code", + collapsible: true, + collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/rest-apis/demo-code", // Generate sidebar slice from docs path + }, + ], + }, + ], + }, + { + type: "category", + label: "LTI", + collapsible: true, + // collapsed: true, + items: [ + "blackboard/lti/introduction", + "blackboard/lti/getting-started-with-lti", + "blackboard/lti/lti-registration-deployment", + "blackboard/lti/registration-deployment", + "blackboard/lti/lti-deep-linking", + "blackboard/lti/turn-on-all-switches", + { + type: "category", + label: "Core", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/lti/core", // Generate sidebar slice from docs path + }, + ], + }, + { + type: "category", + label: "Migrating", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/lti/migrating", // Generate sidebar slice from docs path + }, + ], + }, + { + type: "category", + label: "Proctoring", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/lti/proctoring", // Generate sidebar slice from docs path + }, + ], + }, + { + type: "category", + label: "Tutorials", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "blackboard/lti/tutorials", // Generate sidebar slice from docs path + }, + ], + }, + ], + }, + // Premium APIs + { + type: "category", + label: "Premium APIs", + collapsible: true, + // collapsed: true, + items: [ + "blackboard/premium-apis/requesting-premium-apis", + { + type: "category", + label: "UEF", + collapsible: true, + items: [ + "blackboard/premium-apis/uef/getting-started", + { + type: "autogenerated", + dirName: "blackboard/premium-apis/uef/tutorials", // Generate sidebar slice from docs path + }, + { + type: "link", + label: "UEF Documentation", + href: "https://docs.anthology.com/uef-documentation/start.html", + }, + ], + }, + ], + }, + "developer-ami", + ], + }, + // Student + { + type: "category", + label: "Student", + collapsible: true, + // collapsed: true, + items: [ + { + type: "category", + label: "Getting Started", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "student/getting-started", // Generate sidebar slice from docs path + }, + ], + }, + { + type: "category", + label: "Best Practices", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "student/best-practices", // Generate sidebar slice from docs path + }, + ], + }, + { + type: "category", + label: "Service Catalog", + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "student/service-catalog", // Generate sidebar slice from docs path + }, + { + type: "link", + label: "Log into My Campus Insight ", + href: "https://www.mycampusinsight.com/_layouts/CampusManagement/login.aspx?ReturnUrl=%2f_layouts%2fAuthenticate.aspx%3fSource%3d%252F&Source=%2F", + }, + ], + }, + ], + }, + // Ally + { + type: "category", + label: "Ally", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "ally", // Generate sidebar slice from docs path + }, + ], + }, + // Partners + { + type: "category", + label: "Partners", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "partners", // Generate sidebar slice from docs path + }, + ], + }, + // Community + { + type: "category", + label: "Community", + collapsible: true, + // collapsed: true, + items: [ + { + type: "autogenerated", + dirName: "community", // Generate sidebar slice from docs path + }, + ], + }, + "maintenance-page", + ], +}; + +module.exports = sidebars; diff --git a/src/theme/DocItem/Content/index.js b/src/theme/DocItem/Content/index.js new file mode 100644 index 000000000..6248aa25c --- /dev/null +++ b/src/theme/DocItem/Content/index.js @@ -0,0 +1,52 @@ +import React from "react"; +import clsx from "clsx"; +import { ThemeClassNames } from "@docusaurus/theme-common"; +import { useDoc } from "@docusaurus/theme-common/internal"; +import Heading from "@theme/Heading"; +import MDXContent from "@theme/MDXContent"; +import VersioningTracker from "../../../modules/VersioningTracker/VersioningTracker"; +import AuthorBox from "../../../modules/AuthorBox/AuthorBox"; +/** + Title can be declared inside md content or declared through + front matter and added manually. To make both cases consistent, + the added title is added under the same div.markdown block + See https://github.com/facebook/docusaurus/pull/4882#issuecomment-853021120 + + We render a "synthetic title" if: + - user doesn't ask to hide it with front matter + - the markdown content does not already contain a top-level h1 heading +*/ +function useSyntheticTitle() { + const { metadata, frontMatter, contentTitle } = useDoc(); + const shouldRender = + !frontMatter.hide_title && typeof contentTitle === "undefined"; + if (!shouldRender) { + return null; + } + return metadata.title; +} +export default function DocItemContent({ children }) { + const { frontMatter } = useDoc(); + + const syntheticTitle = useSyntheticTitle(); + return ( +
      + {syntheticTitle && ( +
      + {syntheticTitle} + {frontMatter.id !== "site-intro" ? ( + + ) : ( + "" + )} +
      + )} + {children} + {frontMatter.id !== "site-intro" ? ( + + ) : ( + "" + )} +
      + ); +} diff --git a/src/theme/Footer/index.js b/src/theme/Footer/index.js new file mode 100644 index 000000000..89b24ac59 --- /dev/null +++ b/src/theme/Footer/index.js @@ -0,0 +1,6 @@ +import React from "react"; +import Footer from "../../Components/Footer/Footer"; + +export default function FooterWrapper() { + return
      ; +} diff --git a/src/theme/MDXComponents.js b/src/theme/MDXComponents.js index ee49e218f..fd8b498d6 100644 --- a/src/theme/MDXComponents.js +++ b/src/theme/MDXComponents.js @@ -1,9 +1,13 @@ -import React from 'react'; +import React from "react"; // Import the original mapper -import MDXComponents from '@theme-original/MDXComponents'; -import AuthorBox from '../components/AuthorBox'; -import VersioningTracker from '../components/VersioningTracker'; -import PasswordChecker from '../components/PasswordChecker/PasswordChecker'; +import MDXComponents from "@theme-original/MDXComponents"; +import AuthorBox from "../modules/AuthorBox/AuthorBox"; +import VersioningTracker from "../modules/VersioningTracker/VersioningTracker"; +import PasswordChecker from "../modules/PasswordChecker/PasswordChecker"; +// import Card from "../pages/Components/Card/Card"; +// import LandingHeader from "../pages/Components/LandingHeader/LandingHeader"; +// import WhatsNew from "../pages/Components/WhatsNew/WhatsNew"; +// import ReleaseNotes from "../pages/Components/ReleaseNotes/ReleaseNotes"; export default { // Re-use the default mapping @@ -13,4 +17,8 @@ export default { AuthorBox, VersioningTracker, PasswordChecker, + // Card, + // LandingHeader, + // WhatsNew, + // ReleaseNotes, }; diff --git a/src/theme/SearchBar.js b/src/theme/SearchBar.js new file mode 100644 index 000000000..ba58424e9 --- /dev/null +++ b/src/theme/SearchBar.js @@ -0,0 +1,10 @@ +import React from "react"; +import SearchBar from "@theme-original/SearchBar"; + +export default function SearchBarWrapper(props) { + return ( + <> + + + ); +} diff --git a/static/.nojekyll b/static/.nojekyll deleted file mode 100644 index e69de29bb..000000000 diff --git a/static/assets/css/main.css b/static/assets/css/main.css deleted file mode 100644 index 633621e92..000000000 --- a/static/assets/css/main.css +++ /dev/null @@ -1,1393 +0,0 @@ -.display { - display: block; -} - -.hidden { - display: none; -} - -.btn:visited, -.btn:focus, -.btn:active { - background-color: #000 !important; - color: white; -} - -body { - font-family: "Open Sans", sans-serif; - font-family: "Source Sans Pro", sans-serif; - margin: 0px; - font-size: 16px; -} - -code { - padding: 5px; - margin-top: 10px; - margin-bottom: 10px; - margin-left: 10px; - font-size: 14px; -} - -iframe { - width: 100%; - height: 800px; - border-color: white; - border-width: 0px; -} - -code { - word-break: break-all !important; - display: inline-block !important; - max-width: 100%; - white-space: pre-wrap; -} - -table { - margin-top: 10px; - margin-bottom: 10px; -} - -.code-text-to-normal { - white-space: normal !important; -} - -main p { - text-align: left; -} - -.embed-video { - height: 400px !important; -} -.sidenav li.active { - background-color: #bf69bf; -} - -main ul { - padding-left: 40px !important ; -} - -main img { - max-width: 90%; - margin: 0% 0% 0% 0%; -} - -main li { - list-style: disc !important; - list-style-type: disc !important; -} - -ul:not(.browser-default) > li { - list-style-type: disc !important; -} -strong { - font-weight: bold; -} - -.hidden { - display: none; -} - -.center-image { - margin: 0 auto; - display: block; -} - -/* HEADER */ - -header { - background-color: #262626; - height: 60px; - width: 100%; - position: fixed; - z-index: 999; -} - -#anthologylogo { - display: flex; - justify-content: center; - align-items: center; - height: 210px; - margin: 22px 0px 0px 30px; -} - -#anthologylogoheader { - height: 30px; - width: auto; - margin: 22px 20px 20px 30px; -} - -#dev-docs-span-text { - font-weight: 600; - font-size: 18px; - color: white; - margin-left: 5px; - min-height: 100px; - display: inline-flex; - align-items: center; -} - -.download-button { - height: 30px; - width:auto; -} - -.download-btn-placement { - display: flex; - justify-content: center; - align-items: center; - object-position: 50px 100px; -} - -.header-logo-and-title { - float: left; -} - -.header-buttons { - float: right; -} -.header-buttons i { - color: white; - margin: 16px 10px 0px 0px; -} - -/* MENU */ - - -.menu { - float: left; - background-color: #f8f8f8; - padding-top: 75px; - display: block; - z-index: 2; -} - -#menu-trigger { - display: none; -} -.col-menu { - width: 290px; -} - -.accordion-menu ul { - list-style: none; - margin: 0; - padding: 0; -} -.accordion-menu li.open > ul { - display: block; -} -.accordion-menu li > ul { - /* position: absolute; */ - display: none; - height: 0; - overflow: hidden; - transition: height 350ms ease-in-out; - /*margin-left: 25px;*/ -} -.accordion-menu ul.is-visible { - display: block; - /* height: auto; */ -} -.accordion-menu li { - /*border-bottom: 1px solid rgba(194, 194, 194, 0.333); */ - position: relative; - overflow: hidden; - transition: all 0.4s ease; - color: black; -} -.accordion-menu li:last-child { - border: none; -} -.accordion-menu li::after { - content: ""; - display: block; - clear: both; -} -/* -.accordion-menu li > a > svg { - display: block; - position: relative; - fill: rgb(48, 48, 48); - width: 10px; - float: right; - transition: all .3s ease; - margin-top: 17px; -} -.accordion-menu li.open > a > svg { - transform: rotate(90deg); -} -*/ -.accordion-menu a { - padding: 7px 20px; - display: flex; - flex-direction: row; - /* justify-content: space-between;*/ - align-items: center; - text-decoration: none; - color: black; -} -.accordion-menu * { - box-sizing: border-box; -} - -.first-level { - font-weight: 500; - font-size: 17px; - line-height: 30px; -} - -.second-level { - font-weight: 500; - font-size: 16px; - line-height: 24px; - margin-left: 40px; -} - -.third-level { - font-weight: 500; - font-size: 14px; - line-height: 21px; - margin-left: 20px; -} - -.content { - font-weight: 300; - font-size: 14px; - line-height: 21px; - margin-left: 20px; - background-color: rgb(255, 255, 255); -} -.content a { - border-left-color: #cdcdcd; - border-left-style: solid; - border-left-width: 6px; -} - -/* Main menu header */ -.main-mainContent { - padding-left: 4%; - width: 77%; - float: left; - padding-right: 2%; -} -.mainContent { - /* Container for the blog post in individal blog view */ - padding-left: 2%; - width: 71%; - float: left; - padding-right: 2%; -} - -/* HOME PAGE*/ - -.homeContent { - /* Container for the blog post in individal blog view */ - padding-left: 2%; - width: 78%; - float: left; - padding-right: 2%; - margin-top: 50px; - font-size: 18px; - padding-bottom: 4%; -} - -#home-title { - font-weight: 800; -} -.home-left { - margin: 0px; - float: left; - width: 30%; - height: auto; - margin-left: 5%; -} -.home-right { - width: 60%; - margin: 0px; - padding: 0px; - float: right; -} - -.home-right h1 { - margin: 0px; - font-size: 60px; -} - -.home-right p { - font-size: 25px; -} - -#search-container input { - width: 50% !important; - border: solid !important; - border-width: 1px !important; - padding-left: 10px !important; - background-color: black; - color: white; - height: 46px !important; -} - -#search-container input:active { - border-color: #000000 !important; - border: solid !important; - box-shadow: none !important; -} -#search-container input:focus { - border-color: #000000 !important; - border: solid !important; - box-shadow: none !important; - border-bottom: 1px solid #000 !important; - box-shadow: 0 1px 0 0 #000 !important; -} - -.icon-for-input { - float: left; - padding-top: 12px; - padding-left: 6px; - padding-right: 6px; - margin-right: 0px; - margin-top: 1px; - height: 46px; - background-color: black; - color: white; -} -input:not([type]):focus:not([readonly]), -input[type="text"]:not(.browser-default):focus:not([readonly]), -input[type="password"]:not(.browser-default):focus:not([readonly]), -input[type="email"]:not(.browser-default):focus:not([readonly]), -input[type="url"]:not(.browser-default):focus:not([readonly]), -input[type="time"]:not(.browser-default):focus:not([readonly]), -input[type="date"]:not(.browser-default):focus:not([readonly]), -input[type="datetime"]:not(.browser-default):focus:not([readonly]), -input[type="datetime-local"]:not(.browser-default):focus:not([readonly]), -input[type="tel"]:not(.browser-default):focus:not([readonly]), -input[type="number"]:not(.browser-default):focus:not([readonly]), -input[type="search"]:not(.browser-default):focus:not([readonly]), -textarea.materialize-textarea:focus:not([readonly]) { - /* border-bottom: 1px solid black !important; - -webkit-box-shadow: 0 1px 0 0 black !important; - box-shadow: 0 1px 0 0 black !important; */ - border-bottom: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} - -.home-right i { - padding-top: 1%; -} -.home-right button { - height: 47px; - padding: 0px 12px 0 12px; - margin-left: 8px; - background-color: black; - color: white; - border-radius: 6px; -} - -.home-h2 { - font-weight: 800; - margin-bottom: 0px; - padding-bottom: 0px; -} - -.home-secondPart { - margin-left: 5%; -} - -.home-secondary-buttons { - background-color: white; - color: black; - padding-top: 7px; - padding-left: 30px; - padding-right: 30px; - height: 50px; - text-transform: none; - box-shadow: none; - border-style: solid; - border-width: 1px; - margin-right: 25px; -} - -.home-secondary-buttons:hover { - /* background-color: #a35ca3; */ - background-color: #e8e8e8; - color: black; - border-color: black; -} -.home-secondPart ul { - padding-left: 0px !important; - list-style-type: none !important; -} -.home-secondPart li { - list-style-type: none !important; -} -ul:not(.browser-default) > li { - list-style-type: none !important; -} -.home-secondPart li a { - color: black; - text-decoration: underline; -} - -.home-secondPart li a:hover { - text-decoration: none; -} -#content #sidebar { - /* Sidebar*/ - width: 19%; - padding-left: 2%; - padding-right: 2%; - float: left; - background-color: rgba(246, 246, 246, 1); -} - -#sidebar ul a { - color: #000000 !important; - text-decoration: none !important; -} - -#sidebar ul a:hover { - color: #000000 !important; - text-decoration: underline !important; -} - -svg { - display: none; -} - -.menu i { - margin-right: 15px; -} - -/* BODY */ - -main { - padding-top: 30px; - display: block; - width: 66%; - float: left; - padding-left: 40px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0px; -} - -h1 { - font-size: 42px; - margin-bottom: 50px; - line-height: 45px; - font-weight: 400; - margin-top: 60px; -} - -h2 { - font-size: 30px; - margin-bottom: 30px; - margin-top: 30px; - line-height: 36px; - font-weight: 400; -} - -h3, -h4, -h5, -h6 { - font-size: 24px; - margin-top: 12px; - margin-bottom: 12px; - line-height: 36px; - font-weight: 400; -} - -.toc-parent { - float: right; - display: block; - margin-right: 3%; - margin-top: 1%; -} -.table-of-contents { - word-break: break-word; - position: sticky; - top: 90px; -} - -.table-of-contents li { - list-style: none !important; - list-style-type: none !important; -} - -/* #body_before_container { - background-color: white; - border: 0px; - padding: 30px 0px 0px 0px; - margin: 0px; -} */ - -.home_welcome_rows { - text-align: justify; -} -.home_welcome_rows_icons { - text-align: center; -} - -.page-footer { - background-color: #000000; -} -.page-footer a:hover { - color: #bb72bb !important; -} - -/* ---- ROUGIFY STYLES ---- */ - -.highlight table td { - padding: 5px; -} -.highlight table pre { - margin: 0; -} - -.highlight { - color: #faf6e4; - background-color: #212529; - margin-top: 15px; - margin-bottom: 15px; -} -.highlight .gl { - color: #dee5e7; - background-color: #4e5d62; -} -.highlight .gp { - color: #a8e1fe; - font-weight: bold; -} -.highlight .c, -.highlight .ch, -.highlight .cd, -.highlight .cm, -.highlight .cpf, -.highlight .c1, -.highlight .cs { - color: #6c8b9f; - font-style: italic; -} -.highlight .cp { - color: #b2fd6d; - font-weight: bold; -} -.highlight .err { - color: #fefeec; -} -.highlight .gr { - color: #cc0000; - font-weight: bold; - font-style: italic; -} -.highlight .k, -.highlight .kd, -.highlight .kv { - color: #f6dd62; - font-weight: bold; -} -.highlight .o, -.highlight .ow { - color: #4df4ff; - font-weight: bold; -} -.highlight .p, -.highlight .pi { - color: #4df4ff; -} -.highlight .gd { - color: #cc0000; -} -.highlight .gi { - color: #b2fd6d; -} -.highlight .ge { - font-style: italic; -} -.highlight .gs { - font-weight: bold; -} -.highlight .gt { - color: #dee5e7; - background-color: #4e5d62; -} -.highlight .kc { - color: #f696db; - font-weight: bold; -} -.highlight .kn { - color: #ffb000; - font-weight: bold; -} -.highlight .kp { - color: #ffb000; - font-weight: bold; -} -.highlight .kr { - color: #ffb000; - font-weight: bold; -} -.highlight .gh { - color: #ffb000; - font-weight: bold; -} -.highlight .gu { - color: #ffb000; - font-weight: bold; -} -.highlight .kt { - color: #b2fd6d; - font-weight: bold; -} -.highlight .no { - color: #b2fd6d; - font-weight: bold; -} -.highlight .nc { - color: #b2fd6d; - font-weight: bold; -} -.highlight .nd { - color: #b2fd6d; - font-weight: bold; -} -.highlight .nn { - color: #b2fd6d; - font-weight: bold; -} -.highlight .bp { - color: #b2fd6d; - font-weight: bold; -} -.highlight .ne { - color: #b2fd6d; - font-weight: bold; -} -.highlight .nl { - color: #ffb000; - font-weight: bold; -} -.highlight .nt { - color: #ffb000; - font-weight: bold; -} -.highlight .m, -.highlight .mb, -.highlight .mf, -.highlight .mh, -.highlight .mi, -.highlight .il, -.highlight .mo, -.highlight .mx { - color: #f696db; - font-weight: bold; -} -.highlight .ld { - color: #f696db; - font-weight: bold; -} -.highlight .ss { - color: #f696db; - font-weight: bold; -} -.highlight .s, -.highlight .sa, -.highlight .sb, -.highlight .dl, -.highlight .sd, -.highlight .s2, -.highlight .sh, -.highlight .sx, -.highlight .sr, -.highlight .s1 { - color: #fff0a6; - /* font-weight: bold; */ -} -.highlight .se { - color: #4df4ff; - font-weight: bold; -} -.highlight .sc { - color: #4df4ff; - font-weight: bold; -} -.highlight .si { - color: #4df4ff; - /*font-weight: bold;*/ -} -.highlight .nb { - font-weight: bold; -} -.highlight .ni { - color: #999999; - font-weight: bold; -} -.highlight .w { - color: #bbbbbb; -} -.highlight .go { - color: #bbbbbb; -} -.highlight .nf, -.highlight .fm { - color: #a8e1fe; -} -.highlight .py { - color: #a8e1fe; -} -.highlight .na { - color: #a8e1fe; -} -.highlight .nv, -.highlight .vc, -.highlight .vg, -.highlight .vi, -.highlight .vm { - color: #a8e1fe; - font-weight: bold; -} - -/* end of code snipped highlighter */ - -footer h5 { - margin-top: 10px; - margin-bottom: 10px; -} - -.clearfix::after { - content: ""; - clear: both; - display: block; -} - -.table-of-contents a { - border-left-color: rgb(205, 205, 205); - border-left-style: solid; - border-left-width: thick; -} - -.table-of-contents a:hover { - border-left-color: #a234b5 !important; - border-left-style: solid; - border-left-width: thick; -} - -/* TABLE OF CONTENTS */ - -.table-of-contents ul:not(.browser-default) { - padding-left: 0; - width: 150px; - list-style-type: none; -} - -#table-of-contents { - word-break: break-word; -} - -.table-of-contents a.active { - font-weight: 500; - padding-left: 14px; - border-left: 2px solid #a234b5; -} - -/* Search box */ - -/* The overlay effect with black background */ -.overlay { - height: 100%; - width: 100%; - display: none; - position: fixed; - z-index: 1; - top: 0; - left: 0; - background-color: rgb(0, 0, 0); - background-color: rgba( - 0, - 0, - 0, - 0.9 - ); /* Black with a little bit see-through */ -} - -/* The content */ -.overlay-content { - position: relative; - top: 46%; - width: 80%; - text-align: center; - margin-top: 30px; - margin: auto; -} - -/* Close button */ -.overlay .closebtn { - position: absolute; - top: 20px; - right: 45px; - font-size: 60px; - cursor: pointer; - color: white; -} - -.overlay .closebtn:hover { - color: #ccc; -} - -/* Style the search field */ -.overlay input[type="text"] { - padding: 15px; - font-size: 17px; - border: none; - float: left; - width: 80%; - background: white; -} - -.overlay input[type="text"]:hover { - background: #f1f1f1; -} - -/* Style the submit button */ -.overlay button { - float: left; - width: 20%; - padding: 15px; - background: #ddd; - font-size: 17px; - border: none; - cursor: pointer; -} - -.overlay button:hover { - background: #bbb; -} - -/* STATUS IN PAGES */ - -.deprecatedPage { - height: 80px; - margin-top: 30px; - background-color: #b53434; - color: white; - font-size: 24px; -} - -.deprecatedPage p { - width: 100%; -} - -.draftPage { - height: 80px; - margin-top: 30px; - background-color: #b59f34; - color: white; - padding-left: 46%; - padding-top: 0px; - font-size: 24px; -} - -/* SEARCH */ - -.tipue_search_right input { - height: 1rem !important; -} - -#tipue_search_content nav { - background-color: #f8f8f8 !important; -} - -#tipue_search_content { - padding-bottom: 50px; -} - -.tab { - overflow: hidden; - border: 1px solid #ccc; - background-color: #f1f1f1; -} - -/* Style the buttons inside the tab */ -.tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 14px 16px; - transition: 0.3s; - font-size: 17px; -} - -/* Change background color of buttons on hover */ -.tab button:hover { - background-color: #ddd; -} - -/* Create an active/current tablink class */ -.tab button.active { - background-color: #ccc; -} - -/* Style the tab content */ -.tabcontent { - display: none; - padding: 6px 12px; - border: 1px solid #ccc; - border-top: none; -} - -.site-tag a { - display: inline-block; - margin-right: 12px; -} - -.purple-text { - color: #a235b5 !important; - font-size: smaller !important; -} - -a.purple-text:hover { - text-decoration: underline !important; -} - -/* Testing built in card with https://www.zeolearn.com/magazine/how-to-easily-create-modern-material-design-cards-with-html-and-css */ -.card { - background-color: #fff; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), - 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); - -webkit-box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), - 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); - box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), - 0 1px 5px 0 rgba(0, 0, 0, 0.12); - color: rgba(0, 0, 0, 0.87); - margin: 8px; - width: 290px; - overflow: hidden; - position: relative; -} -.card::after { - clear: both; -} -.card::after, -.card::before { - content: ""; - display: block; -} - -.optional-header { - min-height: 50px; - padding: 5px; - position: relative; - background-color: #000000; -} - -.optional-header .action-icons { - float: right; - position: relative; - right: -8px; - top: 2px; -} - -.optional-header .primary-title { - bottom: auto; - display: inline-block; - margin: 0 5px; - position: absolute; - top: 50%; - -moz-transform: translate(0, -50%); - -ms-transform: translate(0, -50%); - -o-transform: translate(0, -50%); - -webkit-transform: translate(0, -50%); - transform: translate(0, -50%); -} - -.optional-header + .primary-text { - margin-top: calc(24px / 2 / 2); -} - -.optional-header + .supporting-text { - padding-top: 0; -} - -.primary-title .optional-header { - padding-left: 5px; - padding-right: 0; -} - -.subhead, -.secondary-text { - color: rgba(0, 0, 0, 0.54); - font-size: 14px; -} - -.title { - font-size: 14px; - font-weight: 500; - color: #ffffff; -} - -.title + .subhead { - /* margin-top: 7px; */ - color: #ffffff; -} - -.title { - line-height: 1.2; -} - -.thumbnail { - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - border-radius: 50%; - float: left; - height: 40px; - position: relative; - width: 40px; - background-color: #fff; -} -.thumbnail img { - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - border-radius: 50%; - position: absolute; - top: 50%; - -moz-transform: translate(0, -50%); - -ms-transform: translate(0, -50%); - -o-transform: translate(0, -50%); - -webkit-transform: translate(0, -50%); - transform: translate(0, -50%); -} -.thumbnail--24x24 img { - height: 24px; - width: 24px; -} -.thumbnail--28x28 { - margin-right: 4px; -} -.thumbnail--28x28 img { - height: 28px; - width: 28px; -} -.thumbnail--32x32 { - margin-right: 8px; -} -.thumbnail--32x32 img { - height: 32px; - width: 32px; -} -.thumbnail--36x36 { - margin-right: 12px; -} -.thumbnail--36x36 img { - height: 36px; - width: 36px; -} -.thumbnail--40x40 { - margin-right: 16px; -} -.thumbnail--40x40 img { - height: 40px; - width: 40px; -} - -.primary-title + .supporting-text, -.optional-header + .supporting-text { - padding-top: 0; -} - -.primary-text { - font-size: 24px; - padding: 0 16px; - line-height: 28px; -} - -.supporting-text { - font-size: 14px; - line-height: 1.5; - padding: 16px; -} - -.action-buttons, -.action-icons { - display: inline-block; - vertical-align: middle; -} - -.action-icon { - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - border-radius: 50%; - box-sizing: border-box; - cursor: pointer; - margin: 0 2px; - outline: none; - padding: 6px; -} - -.action-icons { - color: rgba(0, 0, 0, 0.54); -} - -.actions { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - min-height: 52px; - padding: 8px; - position: relative; - z-index: 1; -} - -.card - .card-action - a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating) { - color: #000000 !important; - margin-right: 0 !important; -} - -.row .col { - margin-bottom: 20px; -} - -.center-content { - text-align: left; -} - -.homeContent ul li a:hover { - color: #000; -} -#results-container a { - color: #000; -} - -#results-container a:hover { - text-decoration: underline; - text-decoration-color: #000; -} - -/* 404 Page */ -.homeContent404 { - width: 75%; - text-align: center; - float: left; -} -.homeContent404 p { - text-align: center !important; - font-size: 23px; -} - -.homeContent404 h1 { - margin-top: 50px; - font-size: 60px; - font-weight: bolder; -} - -.home-rest-apis-ul ul { - padding-left: 0px !important; -} - -.home-rest-apis-ul ul a { - color: black; - text-decoration: underline; -} - -.home-rest-apis-ul ul a:hover { - text-decoration: none; -} - -.spacey-p { - margin-bottom: 50px; - margin-top: 50px; - font-size: 150%; -} - -.home-secondary-buttons-black { - background-color: black; - color: white; -} - -/* MOBILE */ - -@media only screen and (max-width: 1499px) { - .maincontent { - width: 60%; - } - .homeContent, - .homeContent404 { - width: 70%; - } - .secondImg { - display: none; - } - .home-left { - padding-top: 4%; - } -} - -@media only screen and (max-width: 1250px) { - .maincontent, - .homeContent, - .homeContent404 { - width: 55%; - } - - .home-left { - padding-top: 10%; - } - - .secondImg { - display: none; - } -} - -@media only screen and (max-width: 1100px) { - .maincontent, - .homeContent, - .homeContent404 { - width: 70%; - } - - .secondImg { - display: none; - } -} - -@media only screen and (max-width: 992px) { - .maincontent, - .homeContent404 { - width: 65%; - } - .center-content { - text-align: center; - } - .home-left { - display: none; - } - .home-right { - float: left; - width: 100%; - text-align: center !important; - } - .home-right p { - text-align: center !important; - } - .homeContent { - width: 63%; - } - .table-of-contents { - display: none; - } - .secondImg { - display: initial; - } -} - -@media only screen and (max-width: 970px) { - .mainContent { - width: 63%; - } -} - -@media only screen and (max-width: 852px) { - .maincontent { - width: 62%; - } - - .first-group-buttons a:first-of-type { - margin-bottom: 20px; - } - .center-content { - text-align: center; - } - .menu { - display: block; - } -} - -@media only screen and (max-width: 800px) { - .menu { - display: none; - } - - .maincontent { - width: 94%; - } - .homeContent, - .homeContent404 { - width: 100%; - } - .table-of-contents { - display: none; - } - .home-right h1 { - font-size: 200%; - } - - #menu-trigger { - display: inline; - } - .center-content a:first-of-type { - margin-bottom: 0px; - } - header { - text-align: center; - } - .header-buttons { - height: 31px; - background-color: #b5b5b5; - display: block; - z-index: 2; - float: none; - } - .header-buttons i { - margin: 5px 10px 0px 0px; - color: black; - } - #anthologylogoheader { - height: 30px; - margin: 0px 20px 0px 30px; - } -} -@media only screen and (max-width: 524px) { - .center-content a:first-of-type { - margin-bottom: 20px; - } - - .second-group-buttons a { - margin-bottom: 0px !important; - } -} - -@media only screen and (max-width: 483px) { - .second-group-buttons a { - margin-bottom: 20px !important; - } - #search-container input { - width: 70% !important; - } -} - -.grid-container { - display: inline-grid; - grid-template-columns: auto auto; - background-color: #2196f3; - padding: 10px; -} - -.grid-item { - background-color: rgba(255, 255, 255, 0.8); - border: 1px solid rgba(0, 0, 0, 0.8); - padding: 20px; -} diff --git a/static/assets/css/print.css b/static/assets/css/print.css deleted file mode 100644 index dded7d205..000000000 --- a/static/assets/css/print.css +++ /dev/null @@ -1,136 +0,0 @@ -@media print { - - /* Inhaltsbreite setzen, Floats und Margins aufheben */ - /* Achtung: Die Klassen und IDs variieren von Theme zu Theme. Hier also eigene Klassen setzen */ - #content, #page { - width: 100%; - margin: 0; - float: none; - } - - /** Seitenränder einstellen */ - @page { margin: 2cm } - - /* Font auf 16px/13pt setzen, Background auf Weiß und Schrift auf Schwarz setzen.*/ - /* Das spart Tinte */ - body { - font: 13pt Georgia, "Times New Roman", Times, serif; - line-height: 1.3; - background: #fff !important; - color: #000; - } - - h1 { - font-size: 24pt; - } - - h2, h3, h4 { - font-size: 14pt; - margin-top: 25px; - } - - /* Alle Seitenumbrüche definieren */ - a { - page-break-inside:avoid - } - blockquote { - page-break-inside: avoid; - } - h1, h2, h3, h4, h5, h6 { page-break-after:avoid; - page-break-inside:avoid } - img { page-break-inside:avoid; - page-break-after:avoid; } - table, pre { page-break-inside:avoid } - ul, ol, dl { page-break-before:avoid } - - /* Linkfarbe und Linkverhalten darstellen */ - a:link, a:visited, a { - background: transparent; - color: #520; - font-weight: bold; - text-decoration: underline; - text-align: left; - } - - a { - page-break-inside:avoid - } - - a[href^=http]:after { - content:" <" attr(href) "> "; - } - - a:after > img { - content: ""; - } - - article a[href^="#"]:after { - content: ""; - } - - a:not(:local-link):after { - content:" <" attr(href) "> "; - } - - /** - * Eingebundene Videos verschwinden lassen und den Whitespace der iframes auf null reduzieren. - */ - .entry iframe, ins { - display: none; - width: 0 !important; - height: 0 !important; - overflow: hidden !important; - line-height: 0pt !important; - white-space: nowrap; - } - .embed-youtube, .embed-responsive { - position: absolute; - height: 0; - overflow: hidden; - } - - /* Unnötige Elemente ausblenden für den Druck */ - - #header-widgets, nav, aside.mashsb-container, - .sidebar, .mashshare-top, .mashshare-bottom, - .content-ads, .make-comment, .author-bio, - .heading, .related-posts, #decomments-form-add-comment, - #breadcrumbs, #footer, .post-byline, .meta-single, - .site-title img, .post-tags, .readability - { - display: none; - } - - /* Benutzerdefinierte Nachrichten vor und nach dem Inhalt einfügen */ - .entry:after { - content: "\ Alle Rechte vorbehalten. (c) 2014 - 2016 TechBrain - techbrain.de"; - color: #999 !important; - font-size: 1em; - padding-top: 30px; - } - #header:before { - content: "\ Vielen herzlichen Dank für das Ausdrucken unseres Artikels. Wir hoffen, dass auch andere Artikel von uns Ihr Interesse wecken können."; - color: #777 !important; - font-size: 1em; - padding-top: 30px; - text-align: center !important; - } - - /* Wichtige Elemente definieren */ - p, address, li, dt, dd, blockquote { - font-size: 100% - } - - /* Zeichensatz fuer Code Beispiele */ - code, pre { font-family: "Courier New", Courier, mono} - - ul, ol { - list-style: square; margin-left: 18pt; - margin-bottom: 20pt; - } - - li { - line-height: 1.6em; - } - - } \ No newline at end of file diff --git a/static/assets/js/accordion-menu.js b/static/assets/js/accordion-menu.js deleted file mode 100644 index 3fcfefa83..000000000 --- a/static/assets/js/accordion-menu.js +++ /dev/null @@ -1,53 +0,0 @@ -let AccordionMenu = function(selector) { - this.colMenu = document.querySelectorAll(`${selector} li`); - let This = this; - this.colMenu.forEach(function(items) { - if (items.querySelector('ul')) { - items.firstElementChild.insertAdjacentHTML('beforeend', ' '); - - items.firstElementChild.onclick = function(e) { - e.preventDefault(); - - let isTrue = this.parentElement.classList.toggle('open'); - - if (isTrue) { - This.show(this.nextElementSibling); - } else { - This.hide(this.nextElementSibling); - } - } - } - }) -} - -// Show an element -AccordionMenu.prototype.show = function(elem) { - // Get the natural height of the element - var getHeight = function() { - elem.style.display = 'block'; // Make it visible - var height = elem.scrollHeight + 'px'; // Get it's height - return height; - }; - - var height = getHeight(); // Get the natural height - elem.style.height = height; // Update the height - - setTimeout(function() { - elem.style.height = 'auto'; - }, 350); -}; - -// Hide an element -AccordionMenu.prototype.hide = function(elem) { - // Give the element a height to change from - elem.style.height = elem.scrollHeight + 'px'; - - // Set the height back to 0 - setTimeout(function() { - elem.style.height = '0'; - }, 110); - - setTimeout(function() { - elem.style.display = ''; - }, 700); -}; \ No newline at end of file diff --git a/static/assets/js/search-script.js b/static/assets/js/search-script.js deleted file mode 100644 index 4c89dd0b9..000000000 --- a/static/assets/js/search-script.js +++ /dev/null @@ -1,260 +0,0 @@ -/*! - * Simple-Jekyll-Search - * Copyright 2015-2020, Christian Fei - * Licensed under the MIT License. - */ -!(function () { - "use strict"; - var f = { - compile: function (r) { - return i.template.replace(i.pattern, function (t, e) { - var n = i.middleware(e, r[e], i.template); - return void 0 !== n ? n : r[e] || t; - }); - }, - setOptions: function (t) { - (i.pattern = t.pattern || i.pattern), - (i.template = t.template || i.template), - "function" == typeof t.middleware && (i.middleware = t.middleware); - }, - }; - const i = { pattern: /\{(.*?)\}/g, template: "", middleware: function () {} }; - var n = function (t, e) { - var n = e.length, - r = t.length; - if (n < r) return !1; - if (r === n) return t === e; - t: for (var i = 0, o = 0; i < r; i++) { - for (var u = t.charCodeAt(i); o < n; ) - if (e.charCodeAt(o++) === u) continue t; - return !1; - } - return !0; - }, - e = new (function () { - this.matches = function (t, e) { - return n(e.toLowerCase(), t.toLowerCase()); - }; - })(), - r = new (function () { - this.matches = function (e, t) { - return ( - !!e && - ((e = e.trim().toLowerCase()), - (t = t.trim().toLowerCase()).split(" ").filter(function (t) { - return 0 <= e.indexOf(t); - }).length === t.split(" ").length) - ); - }; - })(), - d = { - put: function (t) { - if (l(t)) return a(t); - if ( - (function (t) { - return ( - Boolean(t) && - "[object Array]" === Object.prototype.toString.call(t) - ); - })(t) - ) - return (function (n) { - const r = []; - s(); - for (let t = 0, e = n.length; t < e; t++) - l(n[t]) && r.push(a(n[t])); - return r; - })(t); - return undefined; - }, - clear: s, - search: function (t) { - return t - ? (function (e, n, r, i) { - const o = []; - for (let t = 0; t < e.length && o.length < i.limit; t++) { - var u = (function (t, e, n, r) { - for (const i in t) - if ( - !(function (n, r) { - for (let t = 0, e = r.length; t < e; t++) { - var i = r[t]; - if (new RegExp(i).test(n)) return !0; - } - return !1; - })(t[i], r.exclude) && - n.matches(t[i], e) - ) - return t; - })(e[t], n, r, i); - u && o.push(u); - } - return o; - })(u, t, c.searchStrategy, c).sort(c.sort) - : []; - }, - setOptions: function (t) { - (c = t || {}), - (c.fuzzy = t.fuzzy || !1), - (c.limit = t.limit || 10), - (c.searchStrategy = t.fuzzy ? e : r), - (c.sort = t.sort || o), - (c.exclude = t.exclude || []); - }, - }; - function o() { - return 0; - } - const u = []; - let c = {}; - function s() { - return (u.length = 0), u; - } - function l(t) { - return ( - Boolean(t) && "[object Object]" === Object.prototype.toString.call(t) - ); - } - function a(t) { - return u.push(t), u; - } - (c.fuzzy = !1), - (c.limit = 10), - (c.searchStrategy = c.fuzzy ? e : r), - (c.sort = o), - (c.exclude = []); - var p = { - load: function (t, e) { - const n = window.XMLHttpRequest - ? new window.XMLHttpRequest() - : new ActiveXObject("Microsoft.XMLHTTP"); - n.open("GET", t, !0), (n.onreadystatechange = h(n, e)), n.send(); - }, - }; - function h(e, n) { - return function () { - if (4 === e.readyState && 200 === e.status) - try { - n(null, JSON.parse(e.responseText)); - } catch (t) { - n(t, null); - } - }; - } - var m = function y(t) { - if ( - !(e = t) || - !("undefined" != typeof e.required && e.required instanceof Array) - ) - throw new Error("-- OptionsValidator: required options missing"); - var e; - if (!(this instanceof y)) return new y(t); - const r = t.required; - (this.getRequiredOptions = function () { - return r; - }), - (this.validate = function (e) { - const n = []; - return ( - r.forEach(function (t) { - "undefined" == typeof e[t] && n.push(t); - }), - n - ); - }); - }, - w = { - merge: function (t, e) { - const n = {}; - for (const r in t) - (n[r] = t[r]), "undefined" != typeof e[r] && (n[r] = e[r]); - return n; - }, - isJSON: function (t) { - try { - return t instanceof Object && JSON.parse(JSON.stringify(t)) ? !0 : !1; - } catch (e) { - return !1; - } - }, - }; - !(function (t) { - let i = { - searchInput: null, - resultsContainer: null, - json: [], - success: Function.prototype, - searchResultTemplate: - '
    • {title}
    • ', - templateMiddleware: Function.prototype, - sortMiddleware: function () { - return 0; - }, - noResultsText: "No results found", - limit: 10, - fuzzy: !1, - debounceTime: null, - exclude: [], - }, - n; - const e = function (t, e) { - e ? (clearTimeout(n), (n = setTimeout(t, e))) : t.call(); - }; - var r = ["searchInput", "resultsContainer", "json"]; - const o = m({ required: r }); - function u(t) { - d.put(t), - i.searchInput.addEventListener("input", function (t) { - -1 === [13, 16, 20, 37, 38, 39, 40, 91].indexOf(t.which) && - (c(), - e(function () { - l(t.target.value); - }, i.debounceTime)); - }); - } - function c() { - i.resultsContainer.innerHTML = ""; - } - function s(t) { - i.resultsContainer.innerHTML += t; - } - function l(t) { - var e; - (e = t) && - 0 < e.length && - (c(), - (function (e, n) { - var r = e.length; - if (0 === r) return s(i.noResultsText); - for (let t = 0; t < r; t++) (e[t].query = n), s(f.compile(e[t])); - })(d.search(t), t)); - } - function a(t) { - throw new Error("SimpleJekyllSearch --- " + t); - } - t.SimpleJekyllSearch = function (t) { - var n; - 0 < o.validate(t).length && - a("You must specify the following required options: " + r), - (i = w.merge(i, t)), - f.setOptions({ - template: i.searchResultTemplate, - middleware: i.templateMiddleware, - }), - d.setOptions({ - fuzzy: i.fuzzy, - limit: i.limit, - sort: i.sortMiddleware, - exclude: i.exclude, - }), - w.isJSON(i.json) - ? u(i.json) - : ((n = i.json), - p.load(n, function (t, e) { - t && a("failed to get JSON (" + n + ")"), u(e); - })); - t = { search: l }; - return "function" == typeof i.success && i.success.call(t), t; - }; - })(window); -})(); diff --git a/static/assets/js/toc.bundle.js b/static/assets/js/toc.bundle.js deleted file mode 100644 index 86eb89d80..000000000 --- a/static/assets/js/toc.bundle.js +++ /dev/null @@ -1,791 +0,0 @@ -var FirstandthirdToc = (function () { - 'use strict'; - - function isWindow(obj) { - return obj != null && obj === obj.window; - } - - function find(selector, context) { - if (context === void 0) { - context = null; - } - - if (selector instanceof HTMLElement || selector instanceof Node || isWindow(selector)) { - return [selector]; - } else if (selector instanceof NodeList) { - return [].slice.call(selector); - } else if (typeof selector === 'string') { - var startElement = context ? find(context)[0] : document; - return [].slice.call(startElement.querySelectorAll(selector)); - } - - return []; - } - - function addClass(selector, cls) { - if (Array.isArray(selector)) { - return selector.forEach(function (item) { - return addClass(item, cls); - }); - } - - var els = find(selector); - - if (els.length) { - var clsArray = [].concat(cls); - els.forEach(function (el) { - clsArray.forEach(function (item) { - el.classList.add(item); - }); - }); - return els; - } - } - - function on(selector, event, cb, capture) { - if (capture === void 0) { - capture = false; - } - - if (Array.isArray(selector)) { - selector.forEach(function (item) { - return on(item, event, cb, capture); - }); - return; - } - - var data = { - cb: cb, - capture: capture - }; - - if (!window._domassistevents) { - window._domassistevents = {}; - } - - window._domassistevents["_" + event] = data; - var el = find(selector); - - if (el.length) { - el.forEach(function (item) { - item.addEventListener(event, cb, capture); - }); - } - } - - function findOne(selector, el) { - var found = find(selector, el); - - if (found.length) { - return found[0]; - } - - return null; - } // Check for the usage of native support for CustomEvents which is lacking - // completely on IE. - // - - - function canIuseNativeCustom() { - try { - var p = new CustomEvent('t', { - detail: { - a: 'b' - } - }); - return p.type === 't' && p.detail.a === 'b'; - } catch (e) { - return false; - } - } // Lousy polyfill for the Custom Event constructor for IE. - - - var IECustomEvent = function CustomEvent(type, params) { - var e = document.createEvent('CustomEvent'); - - if (params) { - e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); - } else { - e.initCustomEvent(type, false, false, undefined); - } - - return e; - }; - - var DomassistCustomEvent = false; - - function fire(selector, type, params) { - if (params === void 0) { - params = {}; - } - - if (Array.isArray(selector)) { - return selector.forEach(function (item) { - return fire(item, type, params); - }); - } - - if (!DomassistCustomEvent) { - DomassistCustomEvent = canIuseNativeCustom() ? CustomEvent : IECustomEvent; - } - - var els = find(selector); - - if (els.length) { - if (params.bubbles !== false) { - params.bubbles = true; - } - - els.forEach(function (el) { - var event = new DomassistCustomEvent(type, params); - el.dispatchEvent(event); - }); - return els; - } - } - - function removeClass(selector, cls) { - if (Array.isArray(selector)) { - return selector.forEach(function (item) { - return removeClass(item, cls); - }); - } - - var els = find(selector); - - if (els.length) { - var clsArray = [].concat(cls); - els.forEach(function (el) { - clsArray.forEach(function (item) { - el.classList.remove(item); - }); - }); - return els; - } - } - - var setupReady = function setupReady(callbacks) { - return function (callback) { - callbacks.push(callback); - - function execute() { - while (callbacks.length) { - var fn = callbacks.shift(); - - if (typeof fn === 'function') { - fn(); - } - } - } - - function loaded() { - document.removeEventListener('DOMContentLoaded', loaded); - execute(); - } - - setTimeout(function () { - if (document.readyState !== 'loading') { - return execute(); - } - }, 0); - document.addEventListener('DOMContentLoaded', loaded); - }; - }; - - var ready = setupReady([]); - - function styles(selector, css) { - if (Array.isArray(selector)) { - selector.forEach(function (item) { - return styles(item, css); - }); - } - - var els = find(selector); - - if (els.length) { - els.forEach(function (el) { - Object.keys(css).forEach(function (key) { - el.style[key] = css[key]; - }); - }); - } - } - - /* global window */ - function attrobj(key, el) { - var values = {}; - Object.keys(el.dataset).forEach(function (data) { - if (data.match(new RegExp("^" + key)) && data !== key) { - var optionName = data.replace(key, ''); - var isGlobal = false; - - if (optionName.match(/^Global/)) { - optionName = optionName.replace('Global', ''); - isGlobal = true; - } - - optionName = "" + optionName[0].toLowerCase() + optionName.slice(1); - - if (isGlobal) { - values[optionName] = window[el.dataset[data]]; - } else { - values[optionName] = el.dataset[data]; - } - - if (typeof values[optionName] === 'undefined' || values[optionName] === '') { - values[optionName] = true; - } - } - }); - return values; - } - - var debounce = function debounce(func, wait, immediate) { - var timeout; - return function () { - var context = this; - var args = arguments; // eslint-disable-line prefer-rest-params - - var later = function later() { - timeout = null; - - if (!immediate) { - func.apply(context, args); - } - }; - - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - - if (callNow) { - func.apply(context, args); - } - }; - }; - - var Events = { - In: 'scrolltriggers:inView', - Out: 'scrolltriggers:outOfView', - Pause: 'scrolltriggers:pause', - Resume: 'scrolltriggers:resume', - Bounds: 'scrolltriggers:bounds' - }; - - var ScrollTrigger = - /*#__PURE__*/ - function () { - function ScrollTrigger(el, options) { - var _this = this; - - if (el.hasAttribute('data-scroll-init')) { - return; - } - - this.added = false; - this.el = el; - this.options = options; - this.eventHandler = debounce(this.onScroll.bind(this), 10, true); - this.dCalcBounds = debounce(this.calcBounds.bind(this), 10); - this.paused = false; - this.disabled = false; - this.calcOffset(); // If images, once by default - - if (this.options.image || this.options.src || this.options.srcset) { - this.options.once = true; - } - - el.setAttribute('data-scroll-init', 'true'); - this.calcBounds(); - window.addEventListener('scroll', this.eventHandler); - window.addEventListener('resize', this.dCalcBounds); - on(this.el, Events.Pause, function () { - _this.paused = true; - }); - on(this.el, Events.Resume, function () { - _this.paused = false; - }); - /* - Prevents a bug on Blink+Webkit in which scroll is always 0 until around - 400 milliseconds due to anchor scrolling features. - */ - - setTimeout(this.eventHandler, 400); - } - - var _proto = ScrollTrigger.prototype; - - _proto.calcBounds = function calcBounds() { - this.calcOffset(); // Element is hidden and not fixed - - var isAllowedToBeFixed = this.options.progress === true || typeof this.options.fixed !== 'undefined'; - - if (!this.el.offsetParent && !isAllowedToBeFixed || this.added && this.options.once) { - // Don't even bother calculating - this.disabled = true; - return; - } - - this.disabled = false; - var position = this.options.position || 'bottom'; - this.startEl = this.options.start ? findOne(this.options.start) : this.el; - ScrollTrigger.checkElement(this.startEl, 'start', this.options.start); - var rect = this.startEl.getBoundingClientRect(); - var scrollY = ScrollTrigger.getScrollY(); - var start = rect.top + scrollY + (this.options.offset || 0); - this.start = ScrollTrigger.processPosition(position, start); - - if (this.options.end) { - var endEl = findOne(this.options.end); - var endRect = endEl.getBoundingClientRect(); - var end = endRect.top + scrollY; - var endPosition = this.options.positionEnd || 'bottom'; - - if (endPosition === 'auto') { - endPosition = 'top'; - } - - this.end = ScrollTrigger.processPosition(endPosition, end); - - if (this.options.positionEnd === 'auto') { - this.end -= this.el.offsetHeight; - } - - ScrollTrigger.checkElement(endEl, 'end', this.options.end); - } - - this.fire(Events.Bounds); - this.eventHandler(); - }; - - _proto.calcOffset = function calcOffset() { - this.options.offset = this.options.offset ? this.options.offset : this.el.dataset.scrollOffset; // Half a screen above loading - - if (this.options.image || this.options.srcset || this.options.offset === 'auto') { - this.options.offset = Math.max((document.documentElement.clientHeight, window.innerHeight || 0) / 2) * -1; - } else { - this.options.offset = parseInt(this.options.offset || 0, 10); - } - }; - - _proto.inView = function inView() { - var _this$options = this.options, - className = _this$options.className, - inView = _this$options.inView; - - if (className && this.el.classList) { - addClass(this.el, className); - } - - var image = this.options.image; - var src = this.options.src; - var srcset = this.options.srcset; - - if (image || src) { - if (this.el.tagName === 'IMG') { - this.el.setAttribute('src', image); - } else if (this.el.tagName === 'IFRAME' || this.el.tagName === 'VIDEO') { - this.el.setAttribute('src', src); - } else { - styles(this.el, { - backgroundImage: "url(" + image + ")", - backgroundRepeat: 'no-repeat' - }); - } - } - - if (srcset) { - this.el.setAttribute('srcset', srcset); - } - - if (typeof inView === 'function') { - inView(this.el, this.options); - } - - this.fire(Events.In); - - if (this.options.once) { - this.disabled = true; - window.removeEventListener('scroll', this.eventHandler); - window.removeEventListener('resize', this.dCalcBounds); - } - - this.added = true; - }; - - _proto.outOfView = function outOfView() { - var _this$options2 = this.options, - className = _this$options2.className, - outOfView = _this$options2.outOfView; - - if (className && this.el.classList) { - removeClass(this.el, className); - } - - if (typeof outOfView === 'function') { - outOfView(this.el, this.options); - } - - this.fire(Events.Out); - this.added = false; - }; - - _proto.fire = function fire$1(event) { - fire(this.el, event, { - detail: { - instance: this, - options: this.options - } - }); - }; - - _proto.onScroll = function onScroll() { - var scroll = ScrollTrigger.getScrollY(); - - if (this.paused || this.disabled) { - return; - } - - if (this.options.progress) { - var perc = scroll / (document.documentElement.scrollHeight - window.innerHeight); - this.el.style.width = perc * 100 + "%"; - } - - if (scroll < this.start || this.end && scroll > this.end) { - if (this.added) { - this.outOfView(); - } - - return; - } - - if (this.added) { - return; - } - - this.inView(); - }; - - ScrollTrigger.checkElement = function checkElement(element, position, selector) { - if (!element) { - throw new Error(position + " element doesn't match any element with selector: \"" + selector + "\""); - } - }; - - ScrollTrigger.getScrollY = function getScrollY() { - return window.pageYOffset || document.documentElement.scrollTop; - }; - - ScrollTrigger.processPosition = function processPosition(position, currentValue) { - if (position === 'top') { - return currentValue; - } - - if (position === 'middle') { - currentValue -= window.innerHeight / 2; - } else if (position === 'bottom') { - currentValue -= window.innerHeight; - } else { - currentValue -= window.innerHeight * (parseInt(position, 10) / 100); - } - - return currentValue; - }; - - return ScrollTrigger; - }(); - - var init = function init(items) { - var instances = []; - - if (items && Array.isArray(items)) { - items.forEach(function (item) { - var els = find(item.el); - - if (els === null) { - throw new Error('unknown element'); - } - - els.forEach(function (el) { - delete item.el; - instances.push(new ScrollTrigger(el, item)); - }); - }); - } else if (items) { - throw new Error('please convert object to array'); - } else { - var els = find('[data-scroll]'); - els.forEach(function (el) { - var options = attrobj('scroll', el); - - if (options.progress !== null && typeof options.progress !== 'undefined') { - options.progress = true; - } - - options.className = options["class"]; - - if (options.offset) { - options.offset = parseInt(options.offset, 10); - } - - if (typeof options.once !== 'undefined') { - options.once = true; - } - - instances.push(new ScrollTrigger(el, options)); - }); - } - - return instances; - }; - - if (document.readyState !== 'complete') { - // Avoid image loading impacting on calculations - document.addEventListener('readystatechange', function () { - if (document.readyState === 'complete') { - fire(window, 'resize'); - } - }); - } - - ready(init); - init.Events = Events; - init.ScrollTrigger = ScrollTrigger; - - /* global window,document */ - - var duration = 1000; - - var ease = function ease(t, b, c, d) { - if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; //eslint-disable-line - - return -c / 2 * ((t -= 2) * t * t * t - 2) + b; - }; - - var animate = function animate(startTime, start, end, callback) { - if (callback === void 0) { - callback = function callback() {}; - } - - var time = new Date().getTime(); - var difference = end - start; - var goingUp = difference < 0; - - if (difference === 0) { - return; - } - - var to = Math.round(ease(time - startTime, start, difference, duration)); - - if (!goingUp && to > end) { - to = end; - } - - if (goingUp && to < end) { - to = end; - } - - window.scrollTo(0, to); - - if (to === end) { - setTimeout(callback); - return; - } - - if (to < 0) { - return; - } - - window.requestAnimationFrame(function () { - return animate(startTime, start, end, callback); - }); - }; - - var scroll = function scroll(target, hash, offset, silent) { - if (offset === void 0) { - offset = 0; - } - - if (silent === void 0) { - silent = false; - } - - fire(target, 'smoothscroll:start', { - bubbles: true - }); - var rect = target.getBoundingClientRect(); - var scrollY = window.pageYOffset || document.documentElement.scrollTop; - var adjustedOffset = Math.round(rect.top + scrollY) + offset; - var startTime = new Date(); - - if (!target.hasAttribute('tabindex')) { - target.tabIndex = '-1'; - } - - if (!silent) { - window.history.pushState(null, 'Scroll', hash); - } - - animate(startTime.getTime(), scrollY, adjustedOffset, function () { - fire(target, 'smoothscroll:end', { - bubbles: true - }); - }); - target.focus(); - }; - - var listenEvent = function listenEvent(el, offset) { - if (el.dataset.smoothActive) { - return; - } - - el.dataset.smoothActive = true; - el.addEventListener('click', function (e) { - var hash = el.getAttribute('href'); - - if (hash[0] !== '#') { - return; - } - - e.preventDefault(); - scroll(document.querySelector(hash), hash, offset); - }); - }; - - var init$1 = function init(query, offset) { - if (query === void 0) { - query = '[data-smooth]'; - } - - if (offset === void 0) { - offset = 0; - } - - if (!window.requestAnimationFrame) { - return; - } - - var els = query; - - if (typeof query === 'string') { - els = document.querySelectorAll(query); - } - - if (els instanceof Element) { - els = [els]; - } - - for (var i = 0, c = els.length; i < c; i++) { - var el = els[i]; - listenEvent(el, offset); - } - }; - - window.addEventListener('DOMContentLoaded', function () { - init$1(); - }); - - function init$2(el) { - if (!el) { - el = find('[data-toc]'); - el.forEach(function (e) { - return init$2(e); - }); - return; - } - - if (!el) { - return; - } - - var container = el.dataset.tocContainer ? findOne(el.dataset.tocContainer) || document.body : document.body; - var selectors = el.dataset.toc.split(',').map(function (s) { - return s.trim(); - }); - var tocItems = []; - var offset = el.dataset.tocOffset ? parseInt(el.dataset.tocOffset, 10) : 1; - var i = 1; // Building dict - - selectors.forEach(function (selector) { - var items = find(selector, container); - items.forEach(function (item) { - // Keep the id if already there - var index = item.id || "toc-" + i++; - var text = item.dataset.tocTitle ? item.dataset.tocTitle.trim() : item.textContent.trim(); - var sanitizedClassName = selector.replace(/((:+[\w-\d]*)|[^A-z0-9-\s])/g, ' ').replace(/\s{2,}/g, ' ').trim(); - var className = "toc-" + sanitizedClassName; // Set it if none - - if (item.id !== index) { - item.id = index; - } - - tocItems.push({ - index: index, - text: text, - className: className - }); - }); - }); - var html = '
        '; - var triggerOptions = []; // Building markup - - tocItems.forEach(function (item, j) { - var nextEl = tocItems[j + 1]; - var options = { - el: ".toc-li-" + j, - fixed: 'true', - start: "#" + item.index, - position: 'top', - positionEnd: 'top', - className: 'toc-visible' - }; - html += "\n
      • " + item.text + "
      • "; - - if (nextEl) { - options.end = "#" + nextEl.index; - } - - triggerOptions.push(options); - }); - html += '
      '; - el.innerHTML = html; - var tocs = find('li', el); - var anchors = find('a', el); // Setting up scroll triggers and smooth scroll - - init(triggerOptions); - init$1(anchors, offset); // Pause scroll triggers while smoothscrolling - - on(document.body, 'smoothscroll:start', function () { - fire(tocs, 'scrolltriggers:pause'); - }); - on(document.body, 'smoothscroll:end', function () { - fire(tocs, 'scrolltriggers:resume'); - fire(window, 'scroll'); - }); - - if (window.location.hash) { - anchors.some(function (anchor) { - var found = anchor.getAttribute('href') === window.location.hash; - - if (found) { - setTimeout(function () { - var element = findOne(window.location.hash); - - if (element) { - // Silent scroll to element - scroll(element, null, offset, true); - } - }); - } - - return found; - }); - } - } - ready(init$2); - - return init$2; - -}()); -//# sourceMappingURL=toc.bundle.js.map diff --git a/static/assets/js/toc.bundle.js.map b/static/assets/js/toc.bundle.js.map deleted file mode 100644 index dafc50e50..000000000 --- a/static/assets/js/toc.bundle.js.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"toc.min.js", -"lineCount":28, -"mappings":"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", -"sources":[" [synthetic:base] "," [synthetic:es6/util/arrayiterator] "," [synthetic:util/defines] "," [synthetic:util/defineproperty] "," [synthetic:util/global] "," [synthetic:util/shouldpolyfill] "," [synthetic:util/polyfill] "," [synthetic:es6/symbol] "," [synthetic:es6/util/iteratorfromarray] "," [synthetic:es6/array/keys] ","toc.bundle.js"], -"names":["FirstandthirdToc","find","selector","context","HTMLElement","keys","forEach","data","window","split","position","NodeList","slice","call","element","addEventListener","onScroll","dCalcBounds","document","calcBounds","_proto.calcBounds","querySelectorAll","setAttribute","addClass","className","offset","round","isArray","duration","bubbles","focus","listenEvent","item","cls","els","length","clsArray","concat","el","classList","add","on","event","cb","capture","Array","_domassistevents","findOne","found","canIuseNativeCustom","p","CustomEvent","detail","a","type","e","fire","params","DomassistCustomEvent","IECustomEvent","dispatchEvent","removeClass","remove","styles","css","Object","key","style","attrobj","values","dataset","match","RegExp","optionName","replace","isGlobal","toLowerCase","init$2","container","tocContainer","body","selectors","toc","map","s","trim","tocItems","tocOffset","parseInt","i","items","index","id","text","tocTitle","textContent","sanitizedClassName","push","html","triggerOptions","j","nextEl","options","fixed","start","positionEnd","end","innerHTML","tocs","anchors","init","init$1","location","hash","some","anchor","getAttribute","setTimeout","scroll","createEvent","initCustomEvent","cancelable","undefined","ready","setupReady","callbacks","callback","execute","fn","shift","loaded","removeEventListener","readyState","debounce","func","wait","immediate","timeout","args","arguments","callNow","clearTimeout","later","apply","Events","In","Out","Pause","Resume","Bounds","ScrollTrigger","_this","hasAttribute","added","eventHandler","bind","disabled","paused","calcOffset","image","src","srcset","once","_proto","prototype","isAllowedToBeFixed","progress","offsetParent","startEl","checkElement","rect","getBoundingClientRect","scrollY","getScrollY","processPosition","top","endEl","endRect","endPosition","offsetHeight","_proto.calcOffset","scrollOffset","Math","max","documentElement","clientHeight","innerHeight","inView","_proto.inView","_this$options","tagName","backgroundImage","backgroundRepeat","outOfView","_proto.outOfView","_this$options2","_proto.fire","instance","_proto.onScroll","width","scrollHeight","ScrollTrigger.checkElement","Error","ScrollTrigger.getScrollY","pageYOffset","scrollTop","ScrollTrigger.processPosition","currentValue","instances","ease","t","b","c","d","animate","startTime","time","Date","getTime","difference","goingUp","to","scrollTo","requestAnimationFrame","target","silent","adjustedOffset","tabIndex","history","pushState","smoothActive","preventDefault","querySelector","query","Element"] -} diff --git a/static/assets/js/toc.js b/static/assets/js/toc.js deleted file mode 100644 index 1b744ae20..000000000 --- a/static/assets/js/toc.js +++ /dev/null @@ -1,105 +0,0 @@ -import { find, findOne, on, fire, ready } from 'domassist'; -import scrollTriggers from 'scroll-triggers'; -import { init as init$1, scroll } from 'smooth-scroller'; - -function init(el) { - if (!el) { - el = find('[data-toc]'); - el.forEach(function (e) { - return init(e); - }); - return; - } - - if (!el) { - return; - } - - var container = el.dataset.tocContainer ? findOne(el.dataset.tocContainer) || document.body : document.body; - var selectors = el.dataset.toc.split(',').map(function (s) { - return s.trim(); - }); - var tocItems = []; - var offset = el.dataset.tocOffset ? parseInt(el.dataset.tocOffset, 10) : 1; - var i = 1; // Building dict - - selectors.forEach(function (selector) { - var items = find(selector, container); - items.forEach(function (item) { - // Keep the id if already there - var index = item.id || "toc-" + i++; - var text = item.dataset.tocTitle ? item.dataset.tocTitle.trim() : item.textContent.trim(); - var sanitizedClassName = selector.replace(/((:+[\w-\d]*)|[^A-z0-9-\s])/g, ' ').replace(/\s{2,}/g, ' ').trim(); - var className = "toc-" + sanitizedClassName; // Set it if none - - if (item.id !== index) { - item.id = index; - } - - tocItems.push({ - index: index, - text: text, - className: className - }); - }); - }); - var html = '
        '; - var triggerOptions = []; // Building markup - - tocItems.forEach(function (item, j) { - var nextEl = tocItems[j + 1]; - var options = { - el: ".toc-li-" + j, - fixed: 'true', - start: "#" + item.index, - position: 'top', - positionEnd: 'top', - className: 'toc-visible' - }; - html += "\n
      • " + item.text + "
      • "; - - if (nextEl) { - options.end = "#" + nextEl.index; - } - - triggerOptions.push(options); - }); - html += '
      '; - el.innerHTML = html; - var tocs = find('li', el); - var anchors = find('a', el); // Setting up scroll triggers and smooth scroll - - scrollTriggers(triggerOptions); - init$1(anchors, offset); // Pause scroll triggers while smoothscrolling - - on(document.body, 'smoothscroll:start', function () { - fire(tocs, 'scrolltriggers:pause'); - }); - on(document.body, 'smoothscroll:end', function () { - fire(tocs, 'scrolltriggers:resume'); - fire(window, 'scroll'); - }); - - if (window.location.hash) { - anchors.some(function (anchor) { - var found = anchor.getAttribute('href') === window.location.hash; - - if (found) { - setTimeout(function () { - var element = findOne(window.location.hash); - - if (element) { - // Silent scroll to element - scroll(element, null, offset, true); - } - }); - } - - return found; - }); - } -} -ready(init); - -export default init; -//# sourceMappingURL=toc.js.map diff --git a/static/assets/js/toc.min.js b/static/assets/js/toc.min.js deleted file mode 100644 index 67e99ba6f..000000000 --- a/static/assets/js/toc.min.js +++ /dev/null @@ -1,28 +0,0 @@ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(e){var g=0;return function(){return g'+q.text+"";t&&(y.end="#"+t.index);u.push(y)});n+="";a.innerHTML=n;var x=e("li",a);a=e("a",a);z(u);E(a,f);h(document.body,"smoothscroll:start",function(){p(x,"scrolltriggers:pause")});h(document.body,"smoothscroll:end",function(){p(x,"scrolltriggers:resume");p(window,"scroll")});window.location.hash&&a.some(function(q){(q=q.getAttribute("href")===window.location.hash)&& -setTimeout(function(){var r=k(window.location.hash);r&&F(r,null,f,!0)});return q})}}var I=function(a,d){var c=document.createEvent("CustomEvent");d?c.initCustomEvent(a,d.bubbles,d.cancelable,d.detail):c.initCustomEvent(a,!1,!1,void 0);return c},A=!1,G=function(a){return function(d){function c(){for(;a.length;){var f=a.shift();"function"===typeof f&&f()}}function b(){document.removeEventListener("DOMContentLoaded",b);c()}a.push(d);setTimeout(function(){if("loading"!==document.readyState)return c()}, -0);document.addEventListener("DOMContentLoaded",b)}}([]),H=function(a,d,c){var b;return function(){var f=this,m=arguments,n=c&&!b;clearTimeout(b);b=setTimeout(function(){b=null;c||a.apply(f,m)},d);n&&a.apply(f,m)}},v={In:"scrolltriggers:inView",Out:"scrolltriggers:outOfView",Pause:"scrolltriggers:pause",Resume:"scrolltriggers:resume",Bounds:"scrolltriggers:bounds"},C=function(){function a(c,b){var f=this;if(!c.hasAttribute("data-scroll-init")){this.added=!1;this.el=c;this.options=b;this.eventHandler= -H(this.onScroll.bind(this),10,!0);this.dCalcBounds=H(this.calcBounds.bind(this),10);this.disabled=this.paused=!1;this.calcOffset();if(this.options.image||this.options.src||this.options.srcset)this.options.once=!0;c.setAttribute("data-scroll-init","true");this.calcBounds();window.addEventListener("scroll",this.eventHandler);window.addEventListener("resize",this.dCalcBounds);h(this.el,v.Pause,function(){f.paused=!0});h(this.el,v.Resume,function(){f.paused=!1});setTimeout(this.eventHandler,400)}}var d= -a.prototype;d.calcBounds=function(){this.calcOffset();var c=!0===this.options.progress||"undefined"!==typeof this.options.fixed;if(!this.el.offsetParent&&!c||this.added&&this.options.once)this.disabled=!0;else{this.disabled=!1;var b=this.options.position||"bottom";this.startEl=this.options.start?k(this.options.start):this.el;a.checkElement(this.startEl,"start",this.options.start);var f=this.startEl.getBoundingClientRect();c=a.getScrollY();this.start=a.processPosition(b,f.top+c+(this.options.offset|| -0));this.options.end&&(b=k(this.options.end),c=b.getBoundingClientRect().top+c,f=this.options.positionEnd||"bottom","auto"===f&&(f="top"),this.end=a.processPosition(f,c),"auto"===this.options.positionEnd&&(this.end-=this.el.offsetHeight),a.checkElement(b,"end",this.options.end));this.fire(v.Bounds);this.eventHandler()}};d.calcOffset=function(){this.options.offset=this.options.offset?this.options.offset:this.el.dataset.scrollOffset;this.options.offset=this.options.image||this.options.srcset||"auto"=== -this.options.offset?-1*Math.max((document.documentElement.clientHeight,window.innerHeight||0)/2):parseInt(this.options.offset||0,10)};d.inView=function(){var c=this.options,b=c.className;c=c.inView;b&&this.el.classList&&g(this.el,b);b=this.options.image;var f=this.options.src,m=this.options.srcset;if(b||f)"IMG"===this.el.tagName?this.el.setAttribute("src",b):"IFRAME"===this.el.tagName||"VIDEO"===this.el.tagName?this.el.setAttribute("src",f):D(this.el,{backgroundImage:"url("+b+")",backgroundRepeat:"no-repeat"}); -m&&this.el.setAttribute("srcset",m);"function"===typeof c&&c(this.el,this.options);this.fire(v.In);this.options.once&&(this.disabled=!0,window.removeEventListener("scroll",this.eventHandler),window.removeEventListener("resize",this.dCalcBounds));this.added=!0};d.outOfView=function(){var c=this.options,b=c.className;c=c.outOfView;b&&this.el.classList&&w(this.el,b);"function"===typeof c&&c(this.el,this.options);this.fire(v.Out);this.added=!1};d.fire=function(c){p(this.el,c,{detail:{instance:this,options:this.options}})}; -d.onScroll=function(){var c=a.getScrollY();this.paused||this.disabled||(this.options.progress&&(this.el.style.width=c/(document.documentElement.scrollHeight-window.innerHeight)*100+"%"),cthis.end?this.added&&this.outOfView():this.added||this.inView())};a.checkElement=function(c,b,f){if(!c)throw Error(b+" element doesn't match any element with selector: \""+f+'"');};a.getScrollY=function(){return window.pageYOffset||document.documentElement.scrollTop};a.processPosition=function(c, -b){return"top"===c?b:b="middle"===c?b-window.innerHeight/2:"bottom"===c?b-window.innerHeight:b-window.innerHeight*(parseInt(c,10)/100)};return a}(),z=function(a){var d=[];if(a&&Array.isArray(a))a.forEach(function(c){var b=e(c.el);if(null===b)throw Error("unknown element");b.forEach(function(f){delete c.el;d.push(new C(f,c))})});else{if(a)throw Error("please convert object to array");e("[data-scroll]").forEach(function(c){var b=J("scroll",c);null!==b.progress&&"undefined"!==typeof b.progress&&(b.progress= -!0);b.className=b["class"];b.offset&&(b.offset=parseInt(b.offset,10));"undefined"!==typeof b.once&&(b.once=!0);d.push(new C(c,b))})}return d};"complete"!==document.readyState&&document.addEventListener("readystatechange",function(){"complete"===document.readyState&&p(window,"resize")});G(z);z.Events=v;z.ScrollTrigger=C;var L=function(a,d,c,b){return 1>(a/=b/2)?c/2*a*a*a*a+d:-c/2*((a-=2)*a*a*a-2)+d},M=function m(d,c,b,f){void 0===f&&(f=function(){});var n=(new Date).getTime(),u=b-c,x=0>u;0!==u&&(n= -Math.round(L(n-d,c,u,1E3)),!x&&n>b&&(n=b),x&&nn||window.requestAnimationFrame(function(){return m(d,c,b,f)}))},F=function(d,c,b,f){void 0===b&&(b=0);void 0===f&&(f=!1);p(d,"smoothscroll:start",{bubbles:!0});var m=d.getBoundingClientRect(),n=window.pageYOffset||document.documentElement.scrollTop;b=Math.round(m.top+n)+b;m=new Date;d.hasAttribute("tabindex")||(d.tabIndex="-1");f||window.history.pushState(null,"Scroll",c);M(m.getTime(),n,b,function(){p(d, -"smoothscroll:end",{bubbles:!0})});d.focus()},N=function(d,c){d.dataset.smoothActive||(d.dataset.smoothActive=!0,d.addEventListener("click",function(b){var f=d.getAttribute("href");"#"===f[0]&&(b.preventDefault(),F(document.querySelector(f),f,c))}))},E=function(d,c){void 0===d&&(d="[data-smooth]");void 0===c&&(c=0);if(window.requestAnimationFrame){var b=d;"string"===typeof d&&(b=document.querySelectorAll(d));b instanceof Element&&(b=[b]);d=0;for(var f=b.length;d
      ';} -if(c==1) -{out+='
      '+tipuesearch_string_4;} -else -{c_c=c.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",");out+='
      '+c_c+' '+tipuesearch_string_5;} -if(set.showTime) -{var endTimer=new Date().getTime();var time=(endTimer-startTimer)/ 1000;out+=' ('+time.toFixed(2)+' '+tipuesearch_string_14+')';set.showTime=false;} -out+='
      ';found.sort(function(a,b){return b.score-a.score});var l_o=0;for(var i=0;i=start&&l_o'+found[i].title+'
      ';if(set.debug) -{out+='
      Score: '+found[i].score+'
      ';} -if(set.showURL) -{var s_u=found[i].url.toLowerCase();if(s_u.indexOf('http://')==0) -{s_u=s_u.slice(7);} -out+='';} -if(found[i].desc) -{var t=found[i].desc;if(set.showContext) -{d_w=d.split(' ');var s_1=found[i].desc.toLowerCase().indexOf(d_w[0]);if(s_1>set.contextStart) -{var t_1=t.substr(s_1-set.contextBuffer);var s_2=t_1.indexOf(' ');t_1=t.substr(s_1-set.contextBuffer+s_2);t_1=$.trim(t_1);if(t_1.length>set.contextLength) -{t='... '+t_1;}}} -if(standard) -{d_w=d.split(' ');for(var f=0;f$1");}}} -else if(set.highlightTerms) -{var patr=new RegExp('('+d+')','gi');t=t.replace(patr,"$1");} -var t_d='';var t_w=t.split(' ');if(t_w.length'+t_d+'';}} -l_o++;} -if(set.showRelated&&standard) -{f=0;for(var i=0;i'+d_o+'';}} -if(c>set.show) -{var pages=Math.ceil(c / set.show);var page=(start / set.show);out+='';}} -else -{out+='
      '+tipuesearch_string_8+'
      ';}} -else -{if(show_stop) -{out+='
      '+tipuesearch_string_8+'. '+tipuesearch_string_9+'
      ';} -else -{out+='
      '+tipuesearch_string_10+'
      ';if(set.minimumLength==1) -{out+='
      '+tipuesearch_string_11+'
      ';} -else -{out+='
      '+tipuesearch_string_12+' '+set.minimumLength+' '+tipuesearch_string_13+'
      ';}}} -$('#tipue_search_content').hide().html(out).slideDown(200);$('#tipue_search_replaced').click(function() -{getTipueSearch(0,false);});$('.tipue_search_related').click(function() -{$('#tipue_search_input').val($(this).attr('id'));getTipueSearch(0,true);});$('.tipue_search_foot_box').click(function() -{var id_v=$(this).attr('id');var id_a=id_v.split('_');getTipueSearch(parseInt(id_a[0]),id_a[1]);});}});};})(jQuery); \ No newline at end of file diff --git a/static/assets/tipuesearch/tipuesearch_content.js b/static/assets/tipuesearch/tipuesearch_content.js deleted file mode 100644 index d0be69129..000000000 --- a/static/assets/tipuesearch/tipuesearch_content.js +++ /dev/null @@ -1,83 +0,0 @@ ---- -# Content index for Tipue Search -# https://github.com/jekylltools/jekyll-tipue-search -# v1.4 -layout: null ---- -{%- assign index = "" | split: "" -%} -{%- assign excluded_files = site.tipue_search.exclude.files -%} -{%- assign excluded_tags = site.tipue_search.exclude.tags | uniq -%} -{%- assign excluded_categories = site.tipue_search.exclude.categories | uniq -%} -{%- assign excluded_taxonomies = excluded_tags | concat: excluded_categories | uniq -%} -{%- for post in site.posts -%} - {%- unless post.exclude_from_search == true or excluded_files contains post.path -%} - {%- assign has_excluded_taxonomy = false -%} - {%- for tag in post.tags -%} - {%- if excluded_taxonomies contains tag -%} - {%- assign has_excluded_taxonomy = true -%} - {%- endif -%} - {%- endfor -%} - {%- for category in post.categories -%} - {%- if excluded_taxonomies contains category -%} - {%- assign has_excluded_taxonomy = true -%} - {%- endif -%} - {%- endfor -%} - {%- unless has_excluded_taxonomy == true -%} - {%- assign index = index | push: post | uniq -%} - {%- endunless -%} - {%- endunless -%} -{%- endfor -%} -{%- if site.tipue_search.include.pages == true -%} - {%- for page in site.html_pages -%} - {%- unless page.exclude_from_search == true or excluded_files contains page.path -%} - {%- assign has_excluded_taxonomy = false -%} - {%- for tag in page.tags -%} - {%- if excluded_taxonomies contains tag -%} - {%- assign has_excluded_taxonomy = true -%} - {%- endif -%} - {%- endfor -%} - {%- for category in page.categories -%} - {%- if excluded_taxonomies contains category -%} - {%- assign has_excluded_taxonomy = true -%} - {%- endif -%} - {%- endfor -%} - {%- unless has_excluded_taxonomy == true -%} - {%- assign index = index | push: page | uniq -%} - {%- endunless -%} - {%- endunless -%} - {%- endfor -%} -{%- endif -%} -{%- for collection in site.tipue_search.include.collections -%} - {%- assign documents = site.documents | where:"collection",collection -%} - {%- for document in documents -%} - {%- unless document.exclude_from_search == true or excluded_files contains document.path -%} - {%- assign has_excluded_taxonomy = false -%} - {%- for tag in document.tags -%} - {%- if excluded_taxonomies contains tag -%} - {%- assign has_excluded_taxonomy = true -%} - {%- endif -%} - {%- endfor -%} - {%- for category in document.categories -%} - {%- if excluded_taxonomies contains category -%} - {%- assign has_excluded_taxonomy = true -%} - {%- endif -%} - {%- endfor -%} - {%- unless has_excluded_taxonomy == true -%} - {%- assign index = index | push: document | uniq -%} - {%- endunless -%} - {%- endunless -%} - {%- endfor -%} -{%- endfor -%} -var tipuesearch = {"pages": [ -{%- for document in index -%} - {%- assign tags = document.tags | uniq -%} - {%- assign categories = document.categories | uniq -%} - {%- assign taxonomies = tags | concat: categories | uniq -%} - { - "title": {{ document.title | smartify | strip_html | normalize_whitespace | jsonify }}, - "text": {{ document.content | strip_html | normalize_whitespace | jsonify }}, - "tags": {{ taxonomies | join: " " | normalize_whitespace | jsonify }}, - "url": {{ document.url | relative_url | jsonify }} - }{%- unless forloop.last -%},{%- endunless -%} -{%- endfor -%} -]}; \ No newline at end of file diff --git a/static/assets/tipuesearch/tipuesearch_set.js b/static/assets/tipuesearch/tipuesearch_set.js deleted file mode 100644 index ebabf121b..000000000 --- a/static/assets/tipuesearch/tipuesearch_set.js +++ /dev/null @@ -1,79 +0,0 @@ - -/* -Tipue Search 6.1 -Copyright (c) 2017 Tipue -Tipue Search is released under the MIT License -http://www.tipue.com/search -*/ - - -/* -Stop words -Stop words list from http://www.ranks.nl/stopwords -*/ - -var tipuesearch_stop_words = ["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]; - - -// Word replace - -var tipuesearch_replace = {'words': [ - {'word': 'tip', 'replace_with': 'tipue'}, - {'word': 'javscript', 'replace_with': 'javascript'}, - {'word': 'jqeury', 'replace_with': 'jquery'} -]}; - - -// Weighting - -var tipuesearch_weight = {'weight': [ - {'url': 'http://www.tipue.com', 'score': 20}, - {'url': 'http://www.tipue.com/search', 'score': 30}, - {'url': 'http://www.tipue.com/is', 'score': 10} -]}; - - -// Illogical stemming - -var tipuesearch_stem = {'words': [ - {'word': 'e-mail', 'stem': 'email'}, - {'word': 'javascript', 'stem': 'jquery'}, - {'word': 'javascript', 'stem': 'js'} -]}; - - -// Related searches - -var tipuesearch_related = {'searches': [ - {'search': 'tipue', 'related': 'Tipue Search'}, - {'search': 'tipue', 'before': 'Tipue Search', 'related': 'Getting Started'}, - {'search': 'tipue', 'before': 'Tipue', 'related': 'jQuery'}, - {'search': 'tipue', 'before': 'Tipue', 'related': 'Blog'} -]}; - - -// Internal strings - -var tipuesearch_string_1 = 'No title'; -var tipuesearch_string_2 = 'Showing results for'; -var tipuesearch_string_3 = 'Search instead for'; -var tipuesearch_string_4 = '1 result'; -var tipuesearch_string_5 = 'results'; -var tipuesearch_string_6 = 'Back'; -var tipuesearch_string_7 = 'More'; -var tipuesearch_string_8 = 'Nothing found.'; -var tipuesearch_string_9 = 'Common words are largely ignored.'; -var tipuesearch_string_10 = 'Search too short'; -var tipuesearch_string_11 = 'Should be one character or more.'; -var tipuesearch_string_12 = 'Should be'; -var tipuesearch_string_13 = 'characters or more.'; -var tipuesearch_string_14 = 'seconds'; -var tipuesearch_string_15 = 'Searches related to'; - - -// Internals - - -// Timer for showTime - -var startTimer = new Date().getTime(); diff --git a/static/img/ANTHOLOGY-Logo-RGB.svg b/static/img/ANTHOLOGY-Logo-RGB.svg deleted file mode 100644 index 5a658c193..000000000 --- a/static/img/ANTHOLOGY-Logo-RGB.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/static/img/anthology-logo-dark.svg b/static/img/anthology-logo-dark.svg new file mode 100644 index 000000000..12a3a6bff --- /dev/null +++ b/static/img/anthology-logo-dark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/anthology-logo-light.svg b/static/img/anthology-logo-light.svg new file mode 100644 index 000000000..cf78e0fd6 --- /dev/null +++ b/static/img/anthology-logo-light.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/anthologydevdocs-apis.svg b/static/img/anthologydevdocs-apis.svg deleted file mode 100644 index 2a03ad29d..000000000 --- a/static/img/anthologydevdocs-apis.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/anthologydevdocs-explore.svg b/static/img/anthologydevdocs-explore.svg deleted file mode 100644 index f7897e004..000000000 --- a/static/img/anthologydevdocs-explore.svg +++ /dev/null @@ -1,1866 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/anthologydevdocs-register.svg b/static/img/anthologydevdocs-register.svg deleted file mode 100644 index 2878a9b75..000000000 --- a/static/img/anthologydevdocs-register.svg +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/author-card-background-dark.png b/static/img/author-card-background-dark.png deleted file mode 100644 index e5a96760561858f06e43c05391e7251261ee7b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7397 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 diff --git a/static/img/author-card-background-light.png b/static/img/author-card-background-light.png deleted file mode 100644 index f32a1c5413d7b4c1f26c6b7497feb8ef9adb45d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7924 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 diff --git a/static/img/author-card-background.png b/static/img/author-card-background.png deleted file mode 100644 index b0a0bd933c2769db44b89034c8119e7cef24e9d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2589 zcmeAS@N?(olHy`uVBq!ia0y~yV1B{Cz&L?}4Jcyk>y-$kI14-?iy0WWg+Z8+Vb&Z8 zpde#$kh>GZx^prwfgF}}M_)$E)e-c@N8a8>lIEGX(zP;`!c))R1#*~ptbinoLSen^4b7f%OMN a#8>8YS!T_U;J#cSkHOQ`&t;ucLK6TT5rX{y diff --git a/static/img/author-card-default-picture.png b/static/img/author-card-default-picture.png deleted file mode 100644 index d333cfdbc3052eb4ce8800ec3e7ab264cace7720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 zcmb_eYfuwc7+tJY1gWi$4t0F2p;iY>HVF`5o4_Cmf)M0Y1Z@i;*@OkM8?zgeAU+C? zP797ktco&Ir&?ctw2mzzj+Llb3=pVV5pXox60M?Guv$Uw%?5cCwKJ_hHrad6`Of#c z_e(yHjalH~Hq{M+AdkohaXk3W1y7ml81PvI|73!o(Uo{&GMy}qM&+cMBU6y+7{{R2 z033pZAqI_1o`unHI;O%25$j&{k1QBhh**pLrCg~d49mbHa=>hSF(V`4YMV89~=%kTgkUkeY!6 zhPfDkM;Lf$EA_JigyQ(3GKQ0Dlk-BeO|u0ytI}Fk`kIwL>G-G8MKM zSI`-QYJ)&DMyMF1Ux`5+(Pir#?frGiC6)AWQe1b7eWKQK$-ZYqymKJ z%Y-)wMTUjNYDp!Y4KONx!F)JU5+>jU2?T6D$LRqy4h6Qj(kPbEfW_y6^T`#kdE7*v z0Ok6lzJYA6AIjx2$_yLa2ZfB5{TttLs$n6pkV?@AoT5psk=b${^#p90bLCuSh^5hz3Y{ENFwTLT6QxKct(R%BP!(vhh!v_-;-H*H7+fD*MPOQ($Ki1~ z{=<#*85j_Jd3s2HaERmLJ&#U^jEG;z5Qf}TVCUQe699}7WMGzn#lSSe2rz=QVAjCi zt1S@Z@)-^~Gom99G}ojvUG>S2^E?~U#^uFPHuIT@L}6{_vfa^BXXAUv2eeh|ceZY< ze0b$&ZE3sr!uChHn$(l!+VaV!%~4e!5KXs@Qt4rPPl=s6VHYm43&-9u6>j#=%-z&5 zrAIUOW^qB|ijs{Nn%C@{(Z@T}6ux)goCBF;Kuek7V%EijtL~;|MekoX>W3VgOmg1c ze8XI1d9&fV)Rr`RdX(!-_Z7OTU0vUQbJo(QSaz^}=DW8|U2|KOt`!|fo%Za^!X;KW zi{)0m@{4oUm1WzGUTD8lc>1mT%g3A7x?Y#%@xsS7SvS?Yv!dxn04QQ~w zp=m#ra%l5cSMzHYH(&BuV(0i(nCpy^0WS@~n}M-uR9%{6D^IS3jxls?GiIc&<*_$S(OS*Y@bfzA24C&9!+U zEA`#K)C-dXySr@<0v;v>s-%drqt(1&cd_xfnLVfV*Ga2z<=uJhkG`v&g`KeR^3J-> z@G=x$du=b(-M?Gb7hg_2+MPk9=2q2)_FZ}6W1XPts52K=RQpm~Oa47}pJ-0o&XDr0 lfw#YWz20AYI{!zoo)kw-dl2XSsk`G}OQa-5d}w}J-rw6oZqon& diff --git a/static/img/author-default-picture.png b/static/img/author-default-picture.png new file mode 100644 index 0000000000000000000000000000000000000000..4a69df4bc58da17713cbd0299b60f775021c3839 GIT binary patch literal 140929 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%0Ar}C!8*vX+|eV`>tqi5QkemFaZ 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 literal 0 HcmV?d00001 diff --git a/static/img/blackboard-learn-dark.svg b/static/img/blackboard-learn-dark.svg new file mode 100644 index 000000000..4e23ec6a6 --- /dev/null +++ b/static/img/blackboard-learn-dark.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/blackboard-learn-light.svg b/static/img/blackboard-learn-light.svg new file mode 100644 index 000000000..d6ede9606 --- /dev/null +++ b/static/img/blackboard-learn-light.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/browse-apis.png b/static/img/browse-apis.png deleted file mode 100644 index 185057adcb3bfda7f09e1973d44370589a689b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4684 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 + + \ No newline at end of file diff --git a/static/img/chat-bubbles-light.svg b/static/img/chat-bubbles-light.svg new file mode 100644 index 000000000..c9b74f75f --- /dev/null +++ b/static/img/chat-bubbles-light.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/computer-dark.svg b/static/img/computer-dark.svg new file mode 100644 index 000000000..b9536f940 --- /dev/null +++ b/static/img/computer-dark.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/computer-light.svg b/static/img/computer-light.svg new file mode 100644 index 000000000..180a84cbc --- /dev/null +++ b/static/img/computer-light.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/content-dark.svg b/static/img/content-dark.svg new file mode 100644 index 000000000..a37c5d87d --- /dev/null +++ b/static/img/content-dark.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/content-light.svg b/static/img/content-light.svg new file mode 100644 index 000000000..8d0233045 --- /dev/null +++ b/static/img/content-light.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/docusaurus-social-card.jpg b/static/img/docusaurus-social-card.jpg deleted file mode 100644 index 9915d89aa7d904bc4b41eb639d63c7a6585293e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122087 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 F{0H{b<4^zq diff --git a/static/img/explore-docs.png b/static/img/explore-docs.png deleted file mode 100644 index ff2823d92d5f134e207312c2790fee8fac818664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11942 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 diff --git a/static/img/favicon.ico b/static/img/favicon.ico index 0c2602ff1a17ad689b0308eb97c92083489d7f62..e9911bc077affbbc15f828435233c733cfd3f7c2 100644 GIT binary patch literal 10863 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 literal 15086 zcmeI3Uuaup6u>{bT4DV|i+k8WTx>cO)?znxi->JS=7SC#o3gcKG}tPF(`^+&rYMuS zhZ#X}3}G@RA{Od{^+A}*kfh6WgJo@BMAQeDB6JU~wQi-1e*R8!+g#)(y-98a%lY8f zb9=vgzH@SN?)NYE8gq+TW!l>fGGvA}7_-F~6AC&1HyZOB=Ngex|3bAfN4el$u0h2_ zLC$ANOIG;#dv(NYgi*K*DVTt_MYkjQ-s;X|>=PJ=6pX+m%R*2T{puakOw zJqp&vJjdIm4qqRG8(>|$FLn621}4C|xWsXj)E86A^#2`~@A5g+|6+pAwHklTf9D?7 z`#0Bzo|fClNB^n)Pi_p*{L%c;@mD&IB8rZ`I{xbTTk`rv$6p2qwnLx6;TU^1{T6h4qIz*7o z(hB>W%k6)b+W%MMYa48J(aJHq(!rHV`5&Bzgk5s(A%1s!4c>5g6Zv>K{sgUC$p4^iRiZuhzYW*aWb>U@OyLb zUwej|w>7awKMQI21s=tnf(4uVVe#3jGmiZjwilnNI_20O!glsqs)Rj^{oAk`hs^U+ z*zd=_?0ftK^4!!sJW|h^J=SyNlSEPB|KcR0FX4}`ti3gR5=9$A06 z?PuPf38HO3ZK(Z~6aTr<{`GT5!hv9qgl%4KvaR8P>{H0LLPPJt;pohZjC+4<+kXD(4_gPu81GKd>{4;`ze4{K`cd?6 zpg(~AdGxrY?b&~q*GP9pkMa;;ZEH?KZpM@HXEZ}A-Z zPr}v6xsy>>{_aC}3Laj(E}ulVsVjNx{*9yGuBSi0z#iV2(EiywTe>svQTl!_65V=` g_b|VKntb;1o%gGMVV5z>F}2&6`Mw+rvhVEh52Kk6GXMYp diff --git a/static/img/gh.png b/static/img/github-logo.png similarity index 100% rename from static/img/gh.png rename to static/img/github-logo.png diff --git a/static/img/github-logo.svg b/static/img/github-logo.svg deleted file mode 100644 index 424b6fba3..000000000 --- a/static/img/github-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/hero.png b/static/img/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..9723414c3b585421ca1b99044a53d51da6c3e790 GIT binary patch literal 59064 zcmZ_01y~i|+CB`MO?M+8ASvB!RHQ*#rMtTuq_=cRNFyQL-Q6u+n+8Eb1SF*SkH7Ps z_rQ7I@4AMIA!cUHT2I{f{XA=jzEgOEiAIVB2M32KEhVl92Zxvm2L~^P0s?*`rXvXa z00-}+_(l}2>>K$m@PoLCy0odhJRB2njsgcCYyk)U`!B#3DewgchmZ*mhX8zs|NFa4 z(7*qRn3;+2?{j#uzyJ6{kf;X^P8d#FTtwL&{%5O39BqHh4+{!4)9*Te;QgrJc~Y0D zUsqMVddpn3YSMo6t-Hb`XnEAsA1s9T<YjN0}dWXA0%|=yFNqNy^Cw^*CCHPe@!oN zC)B0y&35eR6#9|s(Y50rK>gS22leY0nJ4(2U}1e-@UMHe2tF}?lg$=CYK8EQY+uyd z+Jw_E(2Zg_3YP7|t7WCu&U}MDv3G;-+dWVZS@WC;LEWRm_x|1$4upCaejN+otL&ql zcEqd5QM)N}G;%YVU?Q+E+`kX~c$74XV6}T(!8VQD7e-}N_Vmy%>|Iy3JDA^iKH`Dd zq%(JeCluzduVQU~BxQFvU{Mu_{Lj^JVAYTgV>~R~Ab-m4<6y!R-aIsr8P1Mf!18Lq zSu3|(CI~8vPZHJrOU-GOJOI?6YX>I(&%@!s3CSJ1`A2uiKJO5bQT*U=Gy9SGG6Ijg zIg%E`@j6^)P{+F&H<1mlt6vDFeU*B@rhb+|w2l2>;@{zC?)BZhT{mw}$i@a0OZ%ja?p)od~{LOM<-bL4d~rmgir`&P!-qw*8UP{Qa|lsj|0- zm;N1IC=rx_qx}XP>2G<&HB3Ot?2GOMeCbPI1Ok5Bk4%Oi;ebK@e}{8gN59$)JywzP z8gM@<(2ZQDm=Avcji5VxS+SI#kC4?X?KKkH<(|{`YYnJHA*c^VJ?;RCi#s}YaliNO z&xf9h==*^AD1yJRAHRsdgx49AIz1-1dS)Zoo;3)}xR^ff!xhWi1e@a{dvl#%WNuCg zUr})|fNFSj@`=TKIP>jMs$;=*>BozZ9me?77w^^@o|J{4J$P^h7>u8%m2LLL_NOp(vu~W5<3BI!Cp?FmMiKZ&D5zUaCj+uTh1Cr1pI8W80QZyyjXngl)vTP>f(r6?r3mcrRgwfp9OSEh;en-+q(K~ zQVa_;g*twY3A>xZ$g}!ED*-i9pu$D^w}At;s{aC2u4^#=Xm7Q9upfth_=Us>8kkKY z6N1v*j%wAM6}S0KMxBer1^IQoUC;|Y{SArs|+mgJDjbIiaHP`~1R632`Gm>e9m5r_Z9 z#@jw05B!}{a(=)SLONC;1~vHRmthFtZ&boFk!L!0wM$+u{#C#tL}pg$9RCm~ohS=f%`*Dc$4Dvg6*#}n{QX-%^p@>OlXVnJY5heKbfAKHUyfCF=Z z?AkG}eTT2iKXzE+&tFno3&bL;sHP&A3WdYX@b+PMt;|)QIwfXzaJuE7pggpj9I#+3 zU?!A$?7OENtT+t<@S4qKhdL{m6vZO?UWa_eWIY6kQ8O0?1_=)*ZH_@$FYNUNXUqNF zRSXV1IN@UlZOK94v5}82Ef!7z3Pzv7O~{{%r41;kpS7#+-NS2j80?*Kuzb)cb)CH_ z1}MR0^1`|eix^$ACl$vReJsxL4_`NPAMlg@_5GvsF$2fR zvqCCgoFrr@sxOVvzJ+=_G>;f?xVH4g<%a;)uRQ|4uZ4U zxTvAjy(i{#&<-NCPK@$Xg`93?_(xV;<~*@wTc+jAV#dv^x3d<&$S!4mp*M_*7-hBY z&;8&w9ZY!qFE9?Na8k7td(A;Pmd%85<|th>(N%4dn2nV|l>ds!lcB7c7lpV{GX zJ;F)-;A-JNsA*nkLic08-Xd_rL5J}&zxD;(ZC2Z^j>Gw%Rh(G0*qm1JB#x&G7FM4W zbHLi-3IXF`nCE={@FxAJ0pg-C;v1)H>lo!*4r^ z$pln@wQ;IrP?ee{m98zcJ$haWv`_OO6f?WBGN88y7B!JGWELjm4msDKn|MBAkIU4 z;2eOZ?8uY1g!)q`{~eElFf-ZAIR<{;;M57@X_WMpv9*8icGW$FmydI~#b)2iTo$Cr z=c%pZE6kg1+hA@<_y_N%t_!*uoKJ-6z5?PwLW18REXnwgD7W6eVaZhC<7hr+YlMGW z@kb*G6d*I!*qH5KetAm_%ym1W)Pt-n3?vD`HY{YJ!0bOyGmwC_(g5d#J+I4Af7(g!ug-J^~Wno9p#k z?De%DQEw4;{e@Hg=Gae%8K()QJ+CEsriW>*eR26RYPvk$ZP>n>9k@0MEH*C9sXKMP&{kij#Lj(k@Q#vM&D?k5v>2cXJ)$`c=o*O z+{~b+n#xHOY9wL{o_usCerVj=_08g=JG*~PP@1sE9<2(S)M}ZVly`Qh3D%iq*Tu6| zdmf%!0czN=nBPj9NUC#Pn|hj71gQV_O%n(H!?^y6j$<9v-+YLm^3vX~LlHNr)?18W z7uFEkohJx@H`7}YZXbO-?Zj}n*J+}5t0ZjWKOBLeQ>I5^itx~sg24)(x`Hzhym^U` zQCJY*%e9r`ECwa?wFG1i%)==ScCd?Zc3jhi?FLo@bLC$eK#S1OKg;~Ey-Eg3O z%C2UiU?uB~j<*JkDC%2XVZ>aFrTU*wQZ0m2`TMX_YOix&cq}ti)OC+hV%8H`(m%In znLZHadgvQZ8HCxN+#WIgyl?#nYP^f*wAPcnJ;(H3?o&20eEz#rvigt8R5#2i)JM71 zXa3gFVTEFBe*y%n&4>;`CW!&!%r|2(snzBC?y!jn0T>c#Z;>$Ge z2zYbcvtnD^pH+ti*{*WwGf$k)rZC)_{gI;D)Bva7uc9}2`^N&dJ^R$3{836Q6It7$ z?3!rvmOmkNSVIH3iTds1X*M2R1#XKhYYPt6*)>3~Q*5Sq{2dNg=AbKbq1jX59jss8 zPm##NHROb$*;7Jnv=0$!MFBVpyDQbMd%aj<6#E0TLm8ylQjsF5+A_ZUB#%nXA_d+> z6Un+;(s(L5!IFGYj}PH0=Q&Z9(x98jJkROws{Os2Gvw0l80)5v=rEm%=AoI`ZJkfW1IMG#z85erzLOaEYR^~1=kawS+e`-;DtL2<0Pd-Mb zNihZCw|9;boj+tf$+<-jx&@(TlG+C z-BMXgTMsp|mG}>R<%2`rjMO39-Cs;kq^I(cRqUN3;ac5{PEdVu%%Io={6rVqRJ;%0 zxeTBG4!{8zls><%1fuWJaH7!y)2dp@l>47E6NA52Nb3eYUodmf=C|OZgw#m&ElNhJ zLCRW1=G_TgeXG|NzIIfuK~Q#~{|4@WK?2ylGyLdRFvpACzpw9zfAmtKNZc5oK5NLx zUypPT8Pduesf_>r!)3s*e)f}9JITfH%LJJWB2q-?1eV=uW^>&0vs`A4V-~V$V-(uRiu^ppg&)miACf@ z=2i+ce8(3(R6qIM8RE@fek>+Ch0X^G0XMwR3IIR6VUvQN>rY=VeBJxPzwuL6M%W5R z+izecMPv($Ra)KP<1{`WN9yW#-Fc4VycET+LL3022DC98TP zKZ{DpI{}=x(Sl9+9js9p8D#4}$0J7tTIV-EUD- z1){Ra9|R0sP@%Z&E7S3lcpO#d;Zea zF^fss^l1u(cYOB39ZOZ)b9y_r9XV)Tp4+EyGtRGQi#!9f8FDgTZwb1?K zH$wb<5VS~PeOZ+TO}i}aq>Qh{3if>9`y`7S=+vVo)TpAb7mGYxQlDenEqro$_Zu|h zz1uHBu7`L>9RzB>dFJIoT))TO>C6#WhQIc;JLmb!>A=wW4Abs5TtDq8J{){93SVsr zLdQJ(8D6B+*3lmq#wAeAB&(@_WxbPTiPZJ3@6JBd&+XI3P>3FmnTi7fVmQql$~YdJ zZ#)*yWX7w&6FW#Jq*A8)c&dq6WL_Y>zC&$i{B1C6G8R)d#dDR%-^F_4dB}=GKI-Z5 z=j--t?5hO^u1#3)&i|BD9>0f(X;*D)*kg+&rJvXf~SpG#4RNxTC7)wj(HHHqO^UFM3F(<#k(+ z{VVFGPG6l*24nOq@`MU4qg=V#%~2@4zXCFLZ#hofBUnQYUu669{)^Dxh++FlSj8|C zsxp~irBGc{{k?InL}Qes81gfc^0*t9|5tQ}eX0s}`~+$cRy7 zone`epYjZpu@d;#^)J$f0?j+kDZqK3NvbNUYuMN=@way*aHe1?7&+bfqC-W>&vC^B zc@1io7rpkpd2B=B)F2drD{Bcs&B+G;TeX1$5!2dV@ZDSpv6-WD<1{eAmx|bjcDkxa z<)|AD$YB2~X!r4IEq+*^!Gyd=zjX{lZ^f-G-3$7F2}vEzcgGJtX^KR8olte1s?hE& z#t0BRvUZ|~hkO?f#Qm2iQtAeLVmBofh6kO{P{oHk$zbrMq-e1JYNvWOTngIIv~-_O zh~_OCRas&yqBWhwfOt0R&F1Z_l0&cWNoEh1wJ)^70f1bZ)hGODb~yYyjtwq$eZP&1 zV1VXmg-!e|$T$_1OPNC=tyiD(=BX5(H?Xq8;9_YFahsdGvnP`izsDWmAMXXjl<-;bhwK3cK#smEWrfOti{M%8?K&gRO%24XFUeS3C^*g7nAQMyFu9fA2EA;Ez{JMLDy z*7t=!6$9z$5^wFJ=;hFuy5W%w0wl~#k{>F%->P~{%^jC_aA^OcUuNQaZJy~SDI_5X zb{c&9Wh_Nd@CozhZ68b0JJX?7J5gU7iz2D#_9M4uAN?NB6CH@*&H7e*V7FRnxvVxL zX_~OG6`tR*~sLvd;;u7f&eEsMXAKMc%!VFZ?szM5?G-L?>)%gl3sNn zv-UcSe1TJe%(`{2K%B6>g5d$JQ|y9-^pTg#fDZ3Tv2+9CKIIa;#%Z93FBg=Hbi%b6 zrbpxYFk54g7a|pJvs%E!XqjQdXK~efFqYaGgxKTa1Kz3pyj(73SI9Sz*}>VqicI|w z#QAlcp|;%ejaM`A3$HbSbJROt(Kp1@2}cJYe%*Rz7}|*;ZmV08?{7?<&=o*dpfE;F zpcJlTk?-+=Xz!QEQX*aJarO$#wpx4NK4bk0FYqit`90i!CA(&dBnjO#ZJ=g)oXR3Q z^4$#X^N)_tW?I$}L4@!{{8AI^dvr*pVj~6GMd&aQJAEEe|5)2#|Lx7lLX{_pcC>Zr_)Rg(Grz2Q$w|yiDc1baT+pKhkveaY*--SGRO*LviFKUEq_x6|5uUUq6ES<9$i(!4J|R9F&X( zV9KSZvyr)I`+Z-CS5#0|a)autnWS|N3oNNOx){!CQ5;`a$13*57>~S? z3||gf;e)Muz{dH&vmfJMCchxd)< zo^*B=??az0d|$6VARFvOHYxu(Lw1L+s`T>h;tM=kT7sMqb5y4uQ;uIY0y)d%f_S7q z0NI?&S^#bI$ZMEQE3;!_t2ub-;i9QRfq1xb&pPg=0ti9QAVu_wkA5?tfoXL7ytrb* zrv*-`p`9Z|&w9g6?rh&f#^0a*6tx?fG*!Wi+B=`DI3SajL6WztIQy_uF27(H`*VB< zRZIh*&E;_rT5)8prdI&VtT>-EYa7)>R%ICmx9ohE##`+**50PLf z;KOv6A7O6H*~rM%2Na7`k=!H;cGtNHRRmr@*zAN&+DRAWdGE4$JD74{dA8>vd#W0A zqXUa~7uW&+-;39L*cF^O-{XM%o!DEdlytn&W43#X51y!CoU~4YT5}))%~JMQlx2B| zWrMdb*;34Z+IFEq0&SD?&wQ8eg^tnEIt7u+ zhR>O);-4T>`70-7Dk7#To8F;e$K(ghu(Xl);JK~}V6`f3IB?HfC)~E;VVqhb+pLn< z1bQ-`PCNm)#)Z;G9sZ$8$pSeS|yB$f;so{j@eS;zopfeOMMn2+bfW8t; zyuSPg&}sh)hfdTTvOYTdi(x{Dt{;>aHYp5a!l=HMwibR|`$ZIksGL**@t$U5w0=*A z%U&p7(M&)uGiFYu8M@9Ot9~HM&Sxk+g^^Nwa0iR>%)&(l>PMw!1`Umh!vFV^2j5>@ zg#B??Q+EMb5c?B?0tQaI#Lp!$n9y_ff||xP!Vn$P`&7cw+YY+qzb;*y80FQ?+bLr2 zohZ7=k0Qizs7O0++^(zI9q3M-E~7*W+pW%jb_-WDijSH}Ibd4W7$JOMruvMiat$3K zsr(9ptXroXg|c`_8sgFXWwnMPxH@5oEQK{wG8lv6Ee)ySoJG^}0LS|}iH>jbf_}=8 z8%v(gG%vfRFARzL5Zg1G_3A|3Jm3r&s2Z1*lcEvus~$udJtCz~8SFg>1aHW9iYxh5 z6FW*wd}Y}_I)x*Gxd`cbBn`Fx#06>PmAVG17j{LAj$FCE*7B*FH5_-TSRoTKzw(!> z>5{+V`FVcA;X~3jRQgBFwu||OyMOv&_(}-um=JM4$+xd*XF2Hnc$)9(3oS0e->}>KO zuu&(?<@3HxVPF49LRvt7L0fT_d-7oVfI0=h%#P&Uum7nF=tcUm{>-j--Cf7BYDh!0 zU7D;)wwmduR2Wna40XQ9QJfm&Re|hP;4N8?LUfFVF-oX62MfBUQ!GfSEerc5R^7#a z6zDC;`U1)y;p|~4JsdELCv8Tv4*?ILY9Fq-U)udGA606CjbD#3T&IL8v}@i?UFp%P zvfyMJ8KyaZ z#!{N%UeBPWiE{J+(8+6mK};V@ak64-i9$!!Ov*nyDqn)#x5|s}OUOH>@@?7J-Cl|# z{NdF~7=BNLu1?TxrX^7XzYrwLPu^fRLv%5dz(&X^?O|g(TPy z6C_3!rZ)nYObVZVesjbuL`I0;riq>&n>pp2~7^*tTX z{TLoERqDc6+-uZCsS=psLM4MmHnex5_|pbvyj3)ed2a`Al%e&mLa1#{tF}H;(Z%SH zQuSn*aTn6D+M5gN-<}%RT9#*dfmQR+sf06){?gWav5O1Y{z=KEL>j7LH)hTp4-t%w zT0eC|4un6B{>tjn08RP6(BJ@+j%=h}%`nH4^nCMoH;%8_qDUYmUCWYv^(xhcxC zH?M9ohr-B#YVmP&;yJVLDX7&qP%yXp_6eUu$;~Htpx5d@PTeH!Cqsq|D2ijm8t+`4 zf|%25Synem)8EZ^t?)V1z8vfu8Bw)XWFRCENI8t9DkgZN=@l!331c0|W18%ZB^mRmiZ1TQ2x&Ag3L!KqH%3qn>abaP=jlw|c*$ZfBi!r)7|FT}ih z{&PEy17`bPM*>Q~e-T)$WpG%m0``01|De*~*MWzVIacW9g}dV04p!2Z&;@-(!9yPYQuxJfP_#LId@3z>M$J816~oeQY@EO~^0MCmov|2J8-GKW$CL2k zG>FXqY}s^IC|`6{BKH=JKfurXl^F+CbNhA|HrAu%hJ&)<@q6K~c#%b6HzmDt6#V2@ z2D3TP)oQNeIx6F7Azp4J(no8OiDP1Pm;$@W@B7PyW);K|(394AiCBawB`Hc3!wOnv zQ=k_6dqIP*>suyHcNyaaTfLn^u{|oEt3a--WCeO<B`ncQz9z;yyp{ zGtWLSaT1(;+_4(=*-LK>hmMx=yd$7DBySW)@U@aGbMpPhphBnpb3#dMxf-L`eTnYC z8evv$W>yz5xsDhxLI`=u!MS;LckI(s)%PC!CN+V*o<2q=px}XBOuEy4UM%weip4rK z_8#ObxA7S&S%%0_xm3{yh7~Hlg6yRT;?fg?CF;7FU!>siJX}II2oJ z{#Y#o3YORRpM(Mc$(|v2Dj`pnqgy3Ov{wC(Z80t)n;QShOpu#A8De}(iQlx$J+Dew zmDYLQ5}?f4T@^49$G5wTG9wy?TIBOcNyE&ADHXHSA}52563t>{7a^`bgh=y=(LT5^ zOG17rx$)Mqjc6#$I#;;_(S_h*|znu7d%KCXw@*wX) zQHbGGtOn1!&@`Q0k(>z_=eq0kIKOUVv~Uu;gf0L;J#t! zU5}zL6-(t0>OQ`uxIMg~<2PsTT2Z^PoiJ?xS0^75i3FFX<8LS28w5y{rX0DqGQF0yhXGkSNkxjy~s1ihOfIbrP3!RC7s+YwLxN8OMBxoaQYI*MHs1FjxwA`ucsRfoej46jLA!V+|74%YBg>*2PZk>2N zVXdSA@IJ=trha8C1LOnIg)e04kXd=IPxxw${3Lo- zyii{UK_h#65e}$_50V#f-XsMSC4g>2a!O~;KZIk+vp+0CZTC+iLRpu&-_N#GsA6XS z(4a$FY!kt%?9uO*4gs)2Re=0%FIMWu`4B#=(!}{^5@@1NPk!60Ds!?o(W}*Sm7*K^ zZ*?F0=dCWx$xk**9NyQZ6J0%lE&$$xx*2S+Up=lBMqFv^B#Hl@L<)>W^&^}&& zN+=PVso*7Q_}k=r#yeIOo~Je>@_heH_j8McH+$y5!?$7L6p7E?t?bku)B9(FAnHdW zK43stzq1Z^#)~y}z5nS?d^kCOXNJ{o>o_!eyj%u0BM_1QcP4gY|OXw2H!7(cIM z6M==^oNQqH2h#3)sQ;bEm#e-#{V#fyBJ4384)joNbn@>n=223|x-KS?MKT|$e*ltF z2A$Gl0c}WAcVD-ITSEL;W-oJ!&n*vr>G<;Z((SG5SWNGGv6~fWa4GbnCvLfAv#At( zlYec!9j84qQkIO%tCK>im~`}Oy3*8YA+1)!#edSt(?-1u)0@pT8vR?W?AH zS-K#vnR6hjQ|YM|5i83$MpMyOuhWps*D{P%2ol{wI3DUY$6=Nuh?*FQ1^A>P2d^Go z2_i1yhve+@-aIDV5PG59+)vQ-SQ}NEy|uFkh4+?WqT?} zsHmz!hgA7Zfub&2<4tyNlEh#TtEN$Ms&?hWdAnFG^o&AmWd9xyO_#O*22El2+x;0%y6ti|;gPNWW&8jOB*ft>THRPp=+-uLC@YnAv`uTj-Q4sp z^gt9(sw?Z|p7Gr`7~<;>?+@g!lI!fD09qd&@O;bIH;)Er)^NL$L6 zxEZ7V;N-DpG0QRDpz>gp9N8#P%ZoQnkXE6a7+G2&YfKA>*RF|^{$xphx-gC?L~-l1 zGo%oQNcEu-giI&H8})^~+df#ZxEjua2Jye3p)6h|X@B^=i!^1@>T`Gv&yzh*7+TsJ z)eqBoh9c7hFqWVJ3u3X;O<}JdTUc+V;VUhk6-*JnZEIaa$uFwvs!0x(71JL>h|!1q zzf4ao%laq7CS~jFXvYkHgohYiSZ`R0*^xc91>owS+k~bvY~G6$=~PgeoS51^*|Ha? zx_ja7L?AqhbHbTUK;v8YU(v`7%Jh`~SGsUzQAS;OCx*2*8>7;X5uXTR(A-8N%1uZNEc$8C^<`d8R`6PaUUukd+rHdKHf(MAbs4%GZN>odMb zi;|mF_Aymj%i7K+f-c?)?@TRZKOE@%iL|ZzmSMugx&VN%Y5@@I*vR{JxrsfEhQ z?6+8}0S!QwLt*(MCz>01XCHU&z@iz)$q{Q)BJ&Cnk}=&l4YUn2&v7dfy0qJHzpkO}|* zbHZRGbVE+hP>XiENb|0&(tGd=MMH&h7-FNlN}2V**P5U|=A1#V%*DQWef4F+ZDvgM z;3^HmgAx*GYStag$mGe(TO5bpo1j+blUvG|MP}d zMPkG2Uz_K4Ia3*!bP`|03Tz44|6rchk@iM?);M;va7WSZQ{>+3#*zOo8_ zD?NZb7j>TKl@k8ywMOmlP~vq}_7LWCE-OA6q&-}<>&ht)*udN+S6EP-sVX{$-Yh*g z*MROiXKT+p`pvfK=sI*~Z9GZo(&w?sy0gcj^)&tF5?l^F){=atq~UZ-ykE2j^?OqJ zB}b`S4n8_&GBEt|#-~)sB1Ik|-`!51YVv~mgC-&F^+NsC!ap(t9~Vc75<0Fa-SLs5 znrZc|e!fIb^mGwsRsN-ktN9iUf08p);;aoK*R6(MS8tajSrYyYBQ#`F`e0G_<(f5X zbH;%Q(%{fnx=>o&W@RC+KplyL{O6H&8|nebDm#?~SMEdS)gVMma-aTh*4l*~B0c?| zy3dKtB!loCd!PP$RG|Oat{oe>z+veQQ)b^9#vg6NCiOc>iC`x;chr?yD%z4dS#3*Z z`8+DrP^zw=%fW3URbD(*u0~=j>AB2hh2LGHNJI(-ZHZJidwuxfw5ke4rAoH5>oZ>K zl9O6ftCjBBFM{4x-@jpdXl``c#ed8(hpUX=1l4cLAYz5Rf}v^Y1$173#5x{#hzRQ+ zqZ~09wPT+isFT;r`Kgt(Va)}Zy&KL4YAWg@vBe)WLOZ*A&wRXaOeHIYTP78d(J9|# z;SdN$ZdKa6BbMskkek!YWL)pL)@J97R+8-dVPbH=#5esOA5n`RR4=!(E{A$ z@*-BR54w4da-q1S$MMW4-y=Ae+Dcu^GegCYgUsoBF`M75c4@Fqdb9gtZLJy;(FMvc z0%nxtk1a}YyY`9q(&Q&;e8(gDmIhsKCgAZDv6(Pe?F={EdCO%+8hLNm8{V>$w-!Sj zcv>sYq;!!dHbo`DBB9c$&9MT!M?Es$*M|4N5I@QTyMJu5YvK|9?x=cj2>(ElQ$ToK z@cYhg{j|WT(M`ZW$0*}fsD>%`_xEWQrHsrb2T9K{zr}u)QA|qPink=$#!LL(g!NV| zM>PTUL#o!a+VXdmy7>{LA>KVfW+}${ba{buGN8TPce=UQE~v~7LWZ3ZBgF9R75@eS zomdKAB45oHD<>@G2;8Mg5Mj4!&#iUW?;xK3xscAGiVbq9S1v?~VS(Szt2*ScBdhD-5A>bRy9+zlEcdvZd@ZEga(x-KC_OyFN=twncvHf<~LyUv{QOs+Q2fd-}-WLj*dRzZu zdoPNv*jzJXTXtHt)$iCCsV!)%A{P(g&G+sylYYvn=hLS0F&ehbB(!MgmPWFYTeY*J zN@-ofug}t<@ddvXg8aS>V8KSCH?lWMG)W=T9?O5U!wkK&Nc!AxpNBTOWxPlzpJJ+#~Yo z%}*bSzUHhqDww@^Cs}`>>RSUtt{O#4iggs=6=JF>L_+p&0#ATL7K>Om|^Pk@MMC;+5#U8|*b`M4ekYix$ z!QxK8+WJ|>QQbr_x4>|{fS>5z+L0#0rl9-3sNP$a`znfwm~{2_BIb2l^USFSAo zTMu+UzP7KiEAC`d(64mbMl58PDON`Rz(geeNtDdU-S0^+h?E(qBl$Jk`^#d~X%b1) z99L@g61)BuUeVW+O$zwM#<^*cuw=uw(aXmd&EID{twu)?O&aSfGmpvh&6?fS#98_6 z&Y5IAApNeG8TeBuWYsp(_SK?}jt`LwIN{19(V4(8yb# z&GGlut8Hk8rus`i?DX{OD8&VKcP<`+ywwo<1yBcMR1%AO@s`~kf>bglU`k=9lf#|aIt5K@0*>rve zPNS=MZECF)FPkoN@5GfCDZ|^Vd7ttHE^SC6b^^aDcEyyCXr!l4v%6apRT)f%(YZ+s z(|t1U>yseo)Ht641|48=!fCfbQo{O*a|HWQGEInq17hs<+x4kMju#qzyUUkp)~GLE z$7sN`%MM0-B`Z5vdeUuV-ozdaLGVpS%~^C+opCg3vchXN#;a1cj|BoChD3Nd=T#WX z?^`YP(1(A2mUH~pf~Lk!L8tU~oSqFUFi~MjmbPU7EXcpJAq(QSGA^PQuhts$QNMmzr5=?l+5AU*NSW7I-f*CuWqE zf)pXuV=3=-r5yFt0ANXvy=(fS$?;tzDdx#7{iXe&IZSvjt*=NRIGdHpiAPx>=~{#{ zc=KonQspLAgeMSSESl|LA-0(F`!r{?F(hGhM`+3sQGD@hB&yaci)=$i_7i4%ob==D zipy!;+osPA9E^_~Q{57D*oIE27c_XR`1bcK{f}aKov&7Nb4Rne&JDXdHtuRw@~`OS zY}HcbW)f}bhLJhz8P$$oI*CwjrpT+5A7?Fg|Hzi-HqzKN!G~PdRPygFm^`Jd$4LJ) zL!p`GaXVq(Fu?;k${f-!UHCvyN2%%f;e)8Lc6(+G?GN?FcZ)3}&v>KE^AcEMx<`Hr zR*oYS4NiXfp}CgXAIF!|H!;Hdb5f)~;IWz^f=d20z(1pFJrz;DT-IXHaw;K>@wmp& z?Frdd__)`y4Z0^}HmGMSkI#4^qc4^yLpc@VPIc{jmowu5O)U&2Mi)=VQ>|7vtO(#< zh&rqOCaWSH_Vcfh5&*XZX4Eh&T31&Wv+Hc=z9oa4Bdo%`v z&CE?bB31BQ-pg{Hn_{G1nGAQEZt$E2tZ>69%g(NxmU}o!gIP6SO#w+VbEK9Q_Xo`u zYPp_Nq`!0_AG@x(NKb6o9OU1h1wcI>zbaH@f`v=pW`-e>Fzhta+%a*AFvIWKu1z7D zg!%}Tln_AU!~jTgv?(KhwN1}#C8yPpXHt!6PP$9{v^r!?d07grHe z(4M(&uGyoxX6aW%W_M4n@Tn>3`s??RVksTTI^wwa7R|5Ctw6blVVn6}u2UZEt3w_ky84)8 z-LH6c4LIH7KB}*iaZ<26+DceJ&~uQeWBC!M(-4^-Z<3-Ss7V~p*<XckqO>_* zEZ0sHOEr3*Z}gJh^)v6dM<>D-lgp}<$1n;CVYJx^VB8lH&(BO((;Fn;?Zf&%Hq>$1 zH|ECZc(%Uxtq=?bDhO}P>L~+S-zd99lY%1+0CRfvt{eSHS`CRk7px9RRz|kWBwA`@ zK75#bl91bW-+)F^cCHEf#Pz^~8!^gsAVX=vUCyPf3|{0>?*>3h+-W{nryFRS;pMKn^z(7FPKy;blH-rea4JkIGZi)Z}QS%3dSoLK9f9d<#D?L z)311crPtKI2&p?n_Q?*8puJ{^P}gwNpEb_*)$|`<&k5@kEK?koDMq@~dchOYP;Eo; z#%nWV^4Iom5E^++pc&9gf&W)ld=$apz%Snb+w#fV(64>>wKv?pRFr7C9BAgm4(GBm zXe`9)l(8-q80|Y%%Xpm0+*X-rYJFuWwGdZyjvf8XSfF??c5Z3KzDZXnx=qfWJx4EA zSm!iwl6cO7uUhAV?=iNc->{O+N}?uMP*!dzadh{NFhr8~A5@yELXDzw2nK=qJ5 zD*JXTWoC3tlIYW!$Bf$Nmu(9<)=UVBJvPL)iW=_qOCNAY<5Uq#nL^15R{VitC@hRW z&TO^Srw29S$93N{)alXx}eJ)+mM;@y^C!%y|%g;uQ0unh1eOc_i z=hrjS*FgVk38XPnL6afIaKc$4CV|>{-#=bZmqs1QuE#<)vC4h_^hM^_~3wO zAoK^;NAh`o>fUzUnZjpNEeheUk@bf)D4J*9Y!VDau&P+Kr4VQp$<#EOl&BT}Irj}# zS3(VH=SDbfU(7pl@yK4aW+Kzha)|cY4rceSIRkIIPDZNNkI)Molo3pyzwR#7aE_ENlXmY- zL9I6BA!66%-|ysH8Xzm-CL{KsX@W_7XAB8tkLX3h>nC~BKREyp3PrM_zN!}Mjp=e3 zDbjpc+q%K%YFD1u*C6)O5VRTog2{E;A3R9iK}BR%`yx7%cPISA(TD@V3pwwl6 z^Lj*?fxh90j@|d}CpP?Eo@S^lR~=P1n{=EI_v9zoI-23CbbmLQ9WipRQMj3eY7X&& z$ckIEzrJC;cAA>~A#JUjOl#Md)EKhJ8D%Mv%=>|5FE4=E?$Z-ljIEw<;gl~VNot;G z6Ew{GIq%4ovv)9_| z{i?5ijyd}5(t2xc9;-((kuirF7*bPSBGhI299KqcG-`1v$E|sze^fvv{4OHg@86y$ZItK*Q2ygFG$cu*GBB~H@K^>U@G9Nn*|iD#>|6V?N%@Zl9uw3TVI}SzEef9>G za^Kp+nf5YcCN|b}Ts@{vn=FwxK#S2fxH2GJoxDZ$jx$r|pm8~~KM-nNRR<37Gy$Uz zPEAwKWOHlfQ`4!uXL0at&$g|e@`u*RUi42H3B!mI7-Cgh4bmBJA`8m$9py}(WuuDUf(&8YFm0q=3 z%QO!c%7vR9qBbGDvr$tjR2j*pQ>FX`TY##7^)p*0&ny{E><_qu_R1P^V`1_~Ox|Pj|*3z4#;; zy!j*KNc)Ed(H~W@b&Y|FDv-v&FVO;dyUdIs4war8Z9O^Z0}31M6}u0(3sb5MgOrolgYFSqLRI2b#&9^if(Up1L;qHA!+DXW^wJ$C$~ov8Fq{nkBjM5(taC?0M95?xORxUy*Y|&qyMU8HG_hD#C ztCoY_27_;5D6pZ5pOqo^uO)oEY!_5Skk8^U;;L>^TIc8eRH^u z5GK{=FOU;5T$~d*adQCTrF4C@Zg1d0Y^jN>vJfIT91flc)BMU^j&J$vh#JWlt1PL+ zf;zmt7_uVxnr^N@_!o_E;kI&-uM?>!2`r;ME&=9917|9(H^tn2)D&n^(4mepv`m{& zEiE6++K*+_;E^ms(c)Ih zD~Hl=o3>QEDm9*Zm+7u~B8mMNhG$_}P7Sn9&;G-Uc3%Kqg(6Xm$X3JVy;S0mn;oC_}L~HTRVKOyz z`0JrVb+dZV#sxFkz9SO{pUN{b5Qv6uQm5Hj=%aqNgifZ_yVwTd($=|@YfibR`VCRU z!*m5L5aR%|AjUh&4GZ+ewI3Njubo#)r0*kQwq3EFmv33zIY$+T|hImQ?w6O!9%n-9* zV(gX`P3TP-v1lR;NEzb?tKD6X10%cj7gWe2ZaK)Je-i>j1XLtJUO&SId4fFMs@MA& zdtKdvs^9HGC)f-L)=|Gia{Q75cm5Ag!g9X3r49VC(5u6QyUTG=_df7?^k++4UY?S=P9K+eb83WUIdiXlHHbr2UXSUj`O|6+ zp_kUySA@+c2&Q3%HJal{J@B`y?mL4R#39zbQUc~^&2|wFJtMxo%$aA|)c%+c_ez6j z)-!WSD!lc+j21)L-k z^Zdmkk_CJ_OT`>yVczVJhpZ;)rlhzV?@wara%YSc0rS0l`xia<3gxdDk{ti%*;09`4G zMKtx(i2BFUxB+%%Q+quQ^9&N*If140(_zLD?1ECOqyyKU1?W+0o>2GuY+6*s5t2)S&5 z_a*(X3&uyTcXstONYZD%z+C8!G!TXH?xsPg8{c;u$Z%bMhi3A0#XALS@(+B?F}E)! z00my?=VN)B&{w8$Z<)!s_OC^_f01GpWV0;Eh_6&XZAcPr?5or?t8p0>N@;a@YhxA9 zE@C<$?r=Bl*(Tbw9J5#GS*^w&ZwTwBeU=gDMIay!)NfAeQqFELx2*Lrb6jmjnrjSv zt>~|g!!Nz@p05X1GJD|txyc&$zCV7b^*)-0HMo`2s{j*1SU86Rcbv0CMDkCg^okyqO^R;_I%?_UtvH8@@78T7$RSB{-_Zl5r zK!=O!NhWTD6q!^7@euiwNy9Ni& zyJq0Z>YmDk-Sw=e9497Z_`^>Px-ujad89uW6zf=Bf||ok@DHW>JQR6N4pLvzeR>5EFD-$HKM3SIyy?Yh8m^y zm{>k{olaF4Y`BUHX-gXE%(fG-;`h8i&@A?;^6w zfIEsBt_fs^%(yPPO&oWCu;O~0qQFfTQ<$!ojn?Qok;;xcqR>L(RkqVIpRJfSKeweC?Ec&Jr1K5ou9#w%S2-BEX&Wy#h zNEK^Ny;f&HsCS6ot7%$Dhd-K}4PeqGL;S~ZiGCe3PnbrG1k`Ki7CvRN}0 zT63(x(BbFtWqU?kj6+OPtwl~}wVG{;){-eFk+k~UANxC1yHDBe*9sZ1%uXU4^_ri; z7?!{uv_-Gux9bVYt}&^ujl-@i@F;D&A{L^qpbpcr}x+j#8!+ zg@1HN3e-)OZJwL=m!RVtckl#wQn7v-id|?Ln&;6pZ@1=kNTrA$=Ks_A0X81}(GDUe zSbaV1wlDbGA_qc~mWGys-yT%jK0gzs@yabWuNa}VxliT@S1+(Gf#}NS22qAYK+Bm5 z>l6jHyiHb(^zX$(Dn#85PEyTv1(}0joGW;m*$NCGfad5#r=Xv0J@-^(a+MtN0g zV=TCyze)hrV_(UfDL$Sfny)bxwIwzD8c7bN$}*=Q-n8Nu7UKm(<*#aq8&R)f3LpsA zFqP5DR{@AhZgY<|XalS5__gSV}vwaQ$~&#wTwsW4y=+m z^O`qkpT6P)Y<9bjvB~v*1}Jug5LgWpTggDG(LhV8zYD}!Cs9LDESWBp#GEy2OdnZn zrhdm6+i@H_77YfN8y*af@aZ2AEhq*}TQkdlEa3S7F@s({g!qfOw0-?gP61TVFtu~@ zj8X-FWg#1AeNz&_-JOk8Q4_Og>;HRX@w~NKvZxKI1yaQz+lB>AGg}^1Vt&_(opSjQ z<*vvPIWs|q8pM~)b8!7Sg3zOvs=1_}=d7la18&S;IcQ8yp9sb!+f0TlX{7MaDm0z(6e836Kgc1l2!R#an!cuZtLtbs36T|IH|f zX`}%VMa>VU>2viNuJE*=urK2+Z_oo7#I5kLLKaY*pRZY;+Y$ephVwOH`1SISfxMsY zbYtTV)|*@mKkjN_%y(0M&J0~sV>RAI!31N%UQLZ;{o(aWC+PIgVkj+o2%q4_6)d#o zWd53+H}&y})`r~Bc--76WOf+x7}jk+n)y`9DwnaPDw4|>&NH~{3^1@Z|ME%VbodGE zZS(A8ueYaDB#})&Nt?yInimGhObz8;EdURQI9bAe(YctuqX=(|NhgvwHYv%+oUON| zI!hJ4OvUboO4?Ih9P8X{4x~qwkuQf+NkjS=sm|Vfd`OSwV(?wN9(vT7Q{cXgZL@Mg zob+!*7zlOqFGH!P05k|cBV~73>2`-;WQmwx`JzxiZMY@-FKuxPQ5=<`pna;`s%)*C zsMkzO@1mANL2_8Jri{GZO8Z#xvqW-o6r698TdKE1aJVw7T4bQ2raRd~b7Oq`5Q1fV z1*2gFn3-4BXMX~hp%VKv?Kk!vS61$B92h$-h`{jN_jzsFTwn`FFoD6OLZy1dze6!< z94xgY&lwZH1CGDM(;$?>Y8cy0iQRRs#F6{5EcROh(G--E06g&VgrT>U@R zDs~VjXswUAU?CbNBxXSw%Dk&_Y*$0q$GKZoJ?=zM8vf?szy{$wa>~25_Tat~^QP7+ zE7vH@5Loh`srsLCP<3T%4nwlY4COjlGQU%$;mezcAPFCfXKx1XgX+ho7(HlWS-!(^ zD^v2}EsxU>NN339Dc&tBwne10=PjpoqfAuXV;XD_=Gp-+qHsua(@%cURaDm5UXf94 z*Xq!4x}^gz4*PWp+Tx2uN=K5I+_7gyBbtDhz^J{i%gGGx@TIi1Y4^BB`TUx8uZOJU)U#;(y z!vAZ1OB*;w%cqNM24u*YZ`&mGB$6xG4Svj*nsco$@@t^DYu+7QjF`_t9GL10s3ygW z3uSjqy3Sz;(La3R_poSK?4lV`H)8@U0O z!oOSoLFlbPeW60dm$$6?2N|Hs@xAiF%y)ai6DL`>#& zyii{x^Yhdig9NSW!}%FFw1HW-so325Y=cE9@{1~h(lr&DI{5H!L_FC>2iZHo<8O&3?4K3O<~ZO*E| zsq9m_)L$3}_5l2`g}@1F4i#grjHC1Kj+lPq4%+`h=6IRb@QwUrajB9l6 zBW$BeD8{)vI&$f5-WE$OQdUBXqWqx>v>P?yL_A4@6_br;NN~9>1X=hBglg`WZ$FrW ze*G$P){->Ywa5N7Qk09F&N~T){A(?d4*tYxj)8Z;_XVGubT@_p$xSHnKfQM#0AYCF zv5WWJim*le__)O;ZolTTu}xf=fv#%DX0myZP0RKtPL=mM{VkhoBg7mvU;*hK!5QKy z>2CXqRaA18Ims4PQ|a(|NG$+kw%)UA%-cGMp6XOUG#outIj}PO$QocBr4lps_IjMn zkM{JrtyFLotgR?RDf9w%Cj>7D4nJ23b2b;sP~69JN29=}8ARmLj6NTi+f8v>n3C|^ zlmRFjy2)%!*mf>fW^L+5Nl0D|-l>Z@e5l zsw9Sp%%Z8$$lp;DIl5`RnOmdE86adZ4afH8ff)ojfICDHWO2H>!rTUv#DG)+e`$*= z9sHjwuDA&Qg+fLBWd^e~>U`ZR$9s~+z*6m=%X&OR$3EndKb_b!$vJXSt0Nv{s2U}* z)9%t$Ag6LwxV2e5dHq&$B3wM#GVd9bx!R(MJw61?jN@|HnIBKhOCwk%yRa?wR4{80 zFM;?fX;6z3eY8aXWRDfpiHDW0B9Xk)91^({rr5k__=i-8Sn2T^CQK8aE{D0vf7+^g zuc#ruw70^rPmfm>A#mUqy19MP5n!pyVH_dRLWgzMyx6es5nl~@q@GaGPp66jW2Cl{ zD&N{p?bgp6J2+Fo$fwEY}9S|-}U#Fjk1D8rJ(*p!?(a_7V zEW~E6SyeC?qUUQW%5;)%JS%x$>6Zn1FQ3vhxj%oNmw-cETJKnOv?XIZc#713RHdhk zZ$WRMY?!I=M=^YA{P($eLaUQ9VIBg3T^II*ZAi(knmz3(iA=qiN{t?KrqJbI*m? z3bBL6fxHyeW=Gp~a}*3EGr$e-Qfd5RToJBe9-BBYRc;Ej`bVQ{nnB zW_VIuhtoDDXx-3bPlw(ADLj^cUokD-W0k26iHkNnBxUqu4a{1in1sh+t?8o^v|hX4 zN;U3Bm0*5sY2O!m1tc`L1#p9=iQenM2XXcX*!hK|NUi|NeJyy~<1|+(1rXO1B*0^7)&mgwC5&f&M)_()yAlW{u z58^X&))r(qJ{J{&=hbUi$>G_-ZSHeKV`Ia-ZY^qiWgB6E^3p`@>w58(J+pbCf48Kb zTlB!ZkdJ~D^Fi6CCYSl!*L0Xvn{{ChO~7b)Qx!}}yrv9d#U?bUI4Y*#0E1ZPk3}vW z=ldwhOl=NO!dO^`j^Pg9+EM=RI2tn@5ikco?`WC;g82u?4o0GuI_HAOZIok1IT1nGKe^tTo zQMB;OTNK2h25-iQ=cxSZ2ZBWFo8`-2xy%oKx3Yq^Q}a7RHGrm_BRW2cj$|D{L@#Qx zguHZ|Wa=032d!V000tYg^#?j10C6q;T=*^>K+3aASq>8{WiyI_)}OXtWGOI&9SbA% zD$n@9|OBrq6>E8{?>Af1tp6wuT!Am&00USSJRbyu1aY*6zVkx>LY><)-;{ZI6C?g9&$bY_(V+)Y(kb_F8!>Di0p{6HLIjB zc^bynIT+i#1%Zc9?d`w+NJuuynoCl57j3!(g}mRy64BW$9Yx|_uZQ?CAFMbzZ)7!^ zE)&N6es;gd26687fuZSWYcskro9mJbOot*#YQYv~(No7|(k!=}d?L-|ckBe!a)e(r91H^T;xd8UexhBWg*;(aiJ63NfV z1qt5P3HvMSZwxM}v=a}d85E>G)~w(}!ktMo&d=B}E)H?)dH<}2n#n+v87h432!qT^X698L zgE7ASq~diq%|&s8T|CSDIg%eoKF8!NnZSPw;D$N&-_n9`0vnc&M z_fG=8P(H;Sk7X~+!(Fn?qm8PZFB?g*%}ftP1;&UFu?xaS?Ms^1qbO-#T+^5l2*?x) zhvu@U^A8gHt{Mm+n7slsq%*vE<&qP2nYZfQv`hEHRxYO4gFA99AK=VcU z!k5+J5-2l@jfj{MF_DxmBipp}W+B$$$1sg;?>~*x_nB<8V%o8MF@rU-ztI*l6n#lV zrxN$YwKKu%#77yZx>6kK3h3JOjrcjfDlMe<9~b{WVX#$6=lp8_@bcCIFzhyYaTOgz z5z9q0*he5`5hBJ{)9@CUkn*#IyEsqOCujc7zTzqzYyz;8gzD;2$zspX0cEkB$ID<= zJ-E_*#3C=tT;;le8^}{ruj(K$!8#zYFP&}AWW&dTi>KGcw&d_+7A92GB|)I;mCKHh z;z32LtK(@G>N-|7p4&S6NqcLo0lbPpzaV0q!*{J=NLR#EF!pgzPPl@Gx2<0phaQ_? zmzsPwGyv1pxaV-BGB_iCZJjzO`LT*NraVF-?kf%CEDBB?{{zE0u9Ed znlE3Q)-e!ZTBZ1e=kMcGSQE-e15~lt;7-6)RFB$)OVSz;h${DJdWbERQgG!ZEbp)> z>rdT%WK>Vm+SO8T59nHxiu>_k+>jFA`=9Uk|98y{4Ci%k9zGYq(pes}_ZbOXlnN=y z33W$vFZhj@>sAg;Uf(9R11}#(Xkhoo)_aD9zZE)8XYS6LTuKcdqy|L)=7~gH@Ze&^ zpd<{#_Z`M~Z$W^f}Wn{7F^bVg9;ROkT~3 z&H$Y2c_YuYh#2yRiik)=ORqQe_{iT$<3-As#svFgY7C0|voVxwahTf;F;oPwTy7Td z@-yP=$pT}uPN}o56~jf?sm3^*=fgwIJSs`}f=SOrjHg%F2@~cUlQ(cQBs;aUM1b{` zA|ocRpXqD=o#NU}5mzHz{BD$-M#|z`@pq@Vnxp7zcj2+R*7!NnxFt{4{uDzF`Rbp@ z2QT^XaIDjW#mMbP@i;*V2d0(0Dot@}dX6MdHK|#(EZ!o>1-!qnMQK@U|G>1rh>IDh z&ph!W4x;4fo2VIYv z*Et%rc^Sx7L~((6`;f~}z~DJEV$P_d@)2FyDV)t*!#p`-qc_A2I|?DOh8V#!wM@Mq zv=)-Jc zt?!G~eKX%{STnIn^i-Ggs9sLaIpF(NFf=_h9#gNFS3;*<={k zZ&$iv3b;DszI~LR~Ea_sHMM=e7Qk-DeT?C1CRc;?jY60aq)3h$*v2T2J@yzde|tgBcs= zMNq4E?4cvgw0JWz1_u5#Rle;UiH}P3h%n7n5^UsDOG4uVYl`%L9|G-fKk8=5lT9K2yM}a zeOwO0<23jwDB(tNOGoB@YY-bpD!OWc^+?VJ+$5F|clDm`cx#tY;2Z!&zyEzaq@PQPv+8|jgBiN=Qe2~{$K-Rkgr|$zP zB|(GmXbJ|4a|(~C-$*S1afZ1#?Plt5M!i$UYQLEJqHG?R!1LDm&*?KQ51X0Uq@~Iq z;qII&F$?t|g$xEL0ZQU(aj8o+&dcHuet8mhZ`|<|XNG;qH~m)o?@{0TdUJX26%ePiGlpR6lo2mTGbMQx6U%ESzrLMdwYPU=O_mcv zdmbsi7|TUznD?aZy(7bh*FMfaJTOkjE?DSG;AVjv=PM(B| zoJSx8h+dkg%5<_y6`&wZ6S83ZENa#tiTN!00q@6wu+Sv2^nRl(SwvE`J3zTL7B3j6yj|PynpyVPJKk)PO#|r;`3EufiyoI@_6v) zotI2x(67y-BWiFaa^IZ<4i(U8Ybwu4{6aclVk*L8DEWixxDL=SP;avcS`;ND#$u7k zICtlk9;es9`9C6E-(7IVqqH!CW6!ktEOu$->4&4xbMY^6aCE)+9*PJI(^knSSCXQ` z7dV;cs^d5-?=i%%`#BSf9!Jc;(7U2iIA5U1m3}BWCPvN$TBk{FY@kw5tf@;V&S~q< z{ng9s{b5222><`fb-gcxms8)KaRecsf}_g+l`tiztomhZq?+gX-Kyn=jxY^$91<#J zR8y2gG~2mi85Nei6tWv_u?EMVU0jqHQwoOrNJk}}0ipZKG!=Z6u}J|K4B@V6aXy!r za*BrNxD=|K(42Me@wV5FunK}9S_*3YgLp30_|Wc zI@AvXq481&&Au^Jg3WPxOkJQUzKE{wp-bOIxlhbM2l>pD2UVF6V8aUPdQ+0Mt@q2> z`H!`Sh!y%E42J`^*tKVMRI?`ZqSfwR^te{DUU%XnK56;4xYGz$Avi z`^=8m&a8KXt}`J{h`p!ZP!iJRr}q#r-`|5Mwe-`Z_6{yMaOg?8^irXy5M|7`l#>_; zp{Pb?(xm+;Lk<~8o%Oq-5(snah*mBfDYP$PKsPsj}5!L5)^rkeCMWb_#R!y@39*}`#$1qd@rgzk0h#i zZhP*0L?=aQmJlW>a>AYPGj>4oxG+`e+BUtW-)=ZCM6-USD?h-`)BDYS*tr5BC;WSH zwZdYj^W?kyLF^?-Pm6=`wc)f%_?ezt7#R^oMuHZW@|ClZRALq z>!S7Q5p$CL6BpXB%CPYI!cW~!u9OdhXuQh9+P^;K`o#nZB$bqvtq#77BF2>$ zae$K()AemW6qJ1Dd5wiLCXJvi41W5alM-O-oj)9vhHp8HG58f*=TnCBOklZb&had% zj+qOE9aOLr7pD`|PP%`sSM3^WS&mS15z0dBk>pVmf0uZBjnYdb?X+^$Zu$dcL)=59#%8USk+ubN@*Fqar$|VFLr= z6A1ku%Pd-ide76_M`q2J6yuM6iSKUqGNL$*z5pI>$*+c-f$(OFLOL-hQe1f<4&Dq- z7va24-NE1E73~RlrIhi+(^_Ue?c+UF9969FaDS5M@OB(X*C!Da;O}l?;z1DNILyw6 zWmC;2&tB-l`-+7rwK$oxG=(sYnR|+ofS-Fl#ty%uGVPP0x*<6nWz~FkOwzN-9uZVi zsEBQCoCJs4Zp+!bNC1;vq4H-+c(W@ac@}w%fLb-D?7D0~>n(85aL4-)4?Oh*ZmIf) z_Y{8f&rz*g1F`z>9w&|U)uiEDRU>KUt3ol|ZpziD`TmTyV~ zA}On|W_Lv1o1gw}8BC~UZmYK39v4~9!4(n1xS@X7;n75Ivx|wv9z&KA=V2#ZiC&qE2OhKdTpMkd#fq+&AQNT#hK(-N3t5PgPDDr&4~UNwfMgnhO-5By%$d} z1iX0A0&hS6EVWWpXg@9qq!VqMQ9plJkDxEuti?ko{i8IQ9;i)ciQ_hiiZG2pCNyLcQQ|X{&empl5G==}3^}?v>uIV%) zae59prvRCsX^KqeN%inU+Lzebssx4=&>-5*F7J#Z3tB+@Tgd(8#<$fN2lWQ0|9URx zxj6OjQJ>z%10K-8Q=h?WApp}}&bkjkwc+NEl7dsZUuZEQwm@UmNeHv}HTyHxgvEpc zI?iyDRWS6tzn?5Ab|gySarJb)ObRD6oC<_Z4w6S!X*j&PYQ3Skk9BGG0lA7ilF|Yt z7(h6Q&{4N@{ZPVtwPoL{b+D1XULB(%3-Y67dHz=a|MLP6hee*BL;C5qHJ`)nDyRDc zwh<5U-hU8?>h&cY$#4)oG>XmTI9njmU30G%aT=)kgqk#!bUK?fx_)a}os;-Xs`Khc zt}=yw=un90tR1b!#>a^_#fHZd+)xbWy{RY5sV!NDo6V7|O3v#mu|Dpf0^OoB=dz^% z$pg@xoL85B`-dv+)W3!NTf&rpJuQ;FkO8p1P5BoeTx!QIM4 z?&_{cLb!IA#5@UA!{YO;Bj@dT-8P_Qr~39VS6psy-a4L}fkRA>_S-ji)a{HD0Z=(M z-x6~oKdq=cg^EgnN10nHdOKM{n?fG5NuCj)iesI{qlX=5Y92b&O)X47EN3W-J#kH# z(1i=y&&83beLg^<#Mb0?(1_(Op!wpa@gD%EHEeA-^dT!~=56Eh?C_^uTTa+@-4Hhg zif!Dog=!%|Abk~8zf;DsePO8Cb(YjMf^nkiqS)o>3u1mGpHh?}%;r{-E|H>;>8gVt z*C$D7QYL1LN|yuLFo^)ewtQNb|#@m~HXHs}T?>nOUn=rpB zJ@_xJDn<40X^MRoV~u^2%)o=ohA|NY8(+@(A}1QyxzNLT%yeg70%^H3aX3$ zMMVx`Q(%&GeRv<-`rWuHD3DrJMQ$9N=(qI#jlYr#D$B9nDxMl?Nyv zbK(W+B4zRVA@_a#?+EW-|Eh`uU&gihx9W|w9(q|xi@1o_{0vK(LG!*RaV(1BMm|Hv z4^K@{$s-t1>`qxGHEFvRsjS~6BScQrs1Olqr24pmC?u84sV^$3q10RZeV7OZKLyov zG>E$2BGq+Cw7Zyo!15gM?sNjsXX?A8H?HWdXg=AiJgve#`=y!+>JmlKSRLaB2F21< zvUlz_a6-3cNr&WaU4Xm3ly^Xz{o8; znlz^H`_EkYo?48!_`3X^{xHryRhBP_Kep=6R;`>j-^@F{v$||`ZT_=Sa=yW?Ux*w1 zW@ISvI-NT@$sK9BLzriq8=ZH_=w(#moQIr;Oy&aZ9QWv~qOLF4;d5aC<$e`OOlM0Q&ffT_)+o=Ddf>Ful}kd}DUSyZeN& zxw*zx$YheY6-55I))c58yX@-f`x(Q7iUfFoZgSwecz<{m+%VeVuyqzaGD#MF@ zURWO#IkE{yoD+|HAg-GzK;}tB5=N`KM-!={l)54J{1tM_TmybR$8TNTS8J}fA@?V2 z7d^lJ3m#~tGtM8n*t`2{5R7?282{t9=A0UmGIo^d4NtTA8JSX0um1#{M336=q9GS}A4LxHVx>S0937sQ3!YQIr=BpR|`S(umk?yYahYe@sGJ#runJet!YVkM3^*_v5bcLY4ml04}NZ zy@Doof3nQv`$bIio^O?oTTKe>HCsHI#AdE>Vk%Keo+RzNe1h{nFHX35=Juv>Vj7{B z@vb(;48xcSX6Nh~?DGab2Pe=`c5F(tMZwr-uW`w9Z;EH{Sr#*sq=BEptwKy3Qx8g0 z>83Mz=~=mJnIj@@!Svv5mNJV#Gy4PO8Z%Ts9tZE+J|3w;#RpG0bx)K}mkGH7_NKT4KY? z*PB*1dbX;eTd_Cwa1Ds}T#*H_sI$YY0384G7AjCaQx6Sv_tq*DB_;z& zy<{vya^)mijq?IOQ)*JWRjS2+C`Oe$>@>%AE>+1+okd{9d5YC6Bvgf*}ye}_K6oiSHN7oX80 z!Nj*pRAJ&`s^$pqtT&&1=89dnwCS(6NR`BUPs5EA6pQCjRm)-W|a#|M1@xIRDa#zQ$9;xwCd#EMw; z%rU%7H8QdDe&3F~K{L$gVuTS*Yo@=&?UTlx>v+05$XQ)3rF1PcVqe^a+kg& z*gE&hB{4mcQJ$h;)})dlHO<@k)9g~-BU3O-aX|IMeRbhNP&rV;L=J}+ap}h%PJtEy zsbD8L*J-JP*4OJ44Q}cC9>m*-H+9F9&&_8=(rk`TLEx&Pf)T;=ytzKKKU(Tvq2J6; z6W+Ws|Lfu*wXm$OsSfn>B|kuOgD<3Sk5eg~ml&4uu&yt*`oriVT;AA{Tg(_9x@4fH zrNjKdx1cAEqHLzHDM+U<4eOZFrkJ&ovMFZR z??XCA%)B!Wg6l5Id>8oUQFk+adD(Px-kX&2)7#CLrwH{ydq;1EbwI%OqZJj1Kd+bq z4UC|fxEEE^K+V+HR*i|n$v0tx7loWGuG{jsU1S|jU&-N3XCAlQ%0pznAunt;TXq>q zRi#eS*SbNQ(8}a*juk$gSrFYSydg87?wujM8*$Ibuv-7}arZO0>znSW!@uo>AQkb| z@8K2=yddZ5?Mj~4U()e)s?PjVFP@-!>m9{f;H7Na%?k|_m&Oq4FDcQCL zAcT%!gdFs^!#fr-3Yc2zd$ZP}lpBqP9x{u;;W z1k>6a)V+Cip5oyHM0*%P9xohIp->Wjv1ZZfp7u|c{1VGEc-8e;C*cG2gnXIz(2Q^_rdsf z``L|3?aL2dM%bYQ{Px&QZ$)^lq`Nw*lCy{FB>)%sO!T=0YE$a(Ob2tFgqK#PS@^x4Gq}34# zs1cv3=Jd}NI}TM>Xss9%g&2=;3A`uAC9xM-!T1~ zkyKycp+cm}FuuPaTJUv$>G$HYo&J?htm6$D4Bi{N$A22!hY91P^Ph!_y2T0liURc_ zVERGz_NWE=lWAje4M3jE^h=m{mqK>olkrr|TnbU$*OmI2fY#c(mHleZs=0OPBY>D7 z52oA4LW}3ye8em7LwQyxAya86QL1YO5AhX*$inFm7F!`HpFV`m+NQ(HcXX^ z@|^Dx(DE0pUPN5*m~rOd5Y7+JacQb^NhJ;TdIE}#RTRn9m;&hVt!W>ow;n`Domabv z623I7vP*p%GWq%EzdA+6(!NfBAydF(04N=@OUo)^X$s0{Z(UXUvVCyWx;`g{F305d z${p4$l{-p=^hcUNbLcuXfb`S;H{i+6QM?-iczCbEzVWPAB$jEitgaK$a`38hlDD_F zt(KH@dE@%gSb(zLG)mP~(z(18OeVao(ltNHns=Q|z8;IYg&oVMRP3A#FN8UmDLMH- zLhZPEM5`+48&129~=i~UnBmx{vF>4 ziU9WiVe70PqUydbPIq?>-Q6HV$51jL9nvX1ATrY3-HmifhbY3(ASI!sbV^8fyz~9> z)#p#R_nvdl-fMlbU1!`W$3@t#OV*4yR zyLvci6T%9N8%Q5{sqi!H8R4WZw z=-_QJI`L5SuPov&ikAfgH_mtra*o>N28+xnvMh&$4auX^1yOE|-Qxm_b}^a50sW4n zaX*PdI223Eh@;z;Iw_$)=`P?V@qJ$*@3pk?gsa1k|L}>`u=2W1yB;FpnhN<-F;--u z0Ad*nQ)bSvGrQXJ6eU1=!U3};gvBJfx8+$-@u723IbC1{k>RdimkyV%>}~OML;9LnH`nK%_*T2-=6ABWor8|9J0tG+tCV=JIy< zW2E-uZz)Q=b?U0cqYbiUvaCaGND)ENd*6MUTpW5$gPO%ai)6(vR4TK!L46q6lQr{h zWdd^&<78|#?0PB>e8V+{$ZkD|L*wuM=diT{J_kMiN8?xqn|p2oJ{>`xE{f~?2iLpz zSb5P3-7Tc-xUN~F2BVqK=-Sid*T#fWDdK?E7fqBnNx0mZTeM~4liz6~XQbZa;N)Un zTzU146t5?j{jxDYOp=`Mw8_W_Qe`v@x?Mi{>}vYsY>Bx*CGjZyeJ+}P0Y=w`_+7oZ5etUL$%INYTN>Y%jg|KEw&G3aw%MRuE<-eVTSg)2 zu)g}KkDM9jNEczIG>kUSl?BlyOE(sHQ`P-(ii~{jF-iM-szzS#W4)?hPz8x^XNA7* zQIc0DfA#WPWbG@|iAtmf*}a=LbZ#LBb^EcFAgOei{ z;8C$|vw}dV+#gXIOX=w_@3Sa5V(l@dP}dt(L8KPtS#;S%Ppj2AtBd|xiZQ2KvB2~A zgkt^g2?21D4T(U*dM?VXBqY%;g?{>W*%o?{X8w9i`y<*B4bPK9R*=h2S8QbdTDdDu zCx3VGhh6fUk+nvof}1jY?FE17VS+dnqTQb0B+cUS%*~V@>lX^YdlaacYDrOHVuM}7 z``RX^^Z3xX+~{heHYquIc>!b^?aR$6<75s@g|~Y`J{AXy^r8KTt(4gNHCx4Duj%E! zb4~C1Pun3+c_-Q6Bdgl!Ws6>lKE%X?HFcLw7xpu7+^ziOC&Ezzz_aV^)%oj9nztL= zYd&e#>GIO{jsi`JDGR2?KM@pF2=N>RP?Xtg__^>%DB`)z=clEzogz$^WKWzQhr|B( zkQILt{H$8|Xi92(CKWr}#HJBf-hvXvo`=_9FPx`I^$DuaA>3rcGRu#sL;8mvF;m2~ z?x5tYf8~YXiS^))s-oIfpC^etx}!<)g7@k1_z06>+ooq%^jf7rD)GMAt0QQqnqp6m zo*DzqcNMzWV=x(`(!Rb@#4l}uYobT?YC8nw7dOq6Wz3053l!h0v&O#@SfpA1N*?8* z7l3e0=gHdXe$+3$W44g*Vu9<1S4S)fU+8%LJS>m>$D;VnadKEQ@KhZ0^_u|iIM8q@ ztIskTAd^KgMKQERh=zHN`Yc@N`^jb;vs8)}RlGz{u$zXAnKLwF`vm^vV}>sf)Lnss zi7qtAMMHcqve>tJGK~0VPgqf8UVBfjgsDDDZ-;P~WD|?kf<`nYkGwWdQqM0V{JFzr zmo|fLbfbvE9rcVT7M0MmU_!#+HL3~Pk!9JY+Tc*FvGi~1vz$%Yq`)cg`jkNA^Q)2Y z$63gt!;yWACQuw1>DAnF;-V%XNpYzSq{zed`Ij=Lh44ipr-@ApK@gF=vXGI|Be&Zm zVkD;D{rcG+`RGUVC*0qE+bnRpgaP&E`Su9iNi1is3?+5nR81S?G^%UVd$AV)(9n~1 zIBMD})KtZivw6w;YPk8b`8#Us&hG%>qzN7qG&|%5_Wr2d*Ll()Yf|dn7kS}cPh>c< zhD$tS`CU72zQSvTd^&0IEA)s)OTIUD@LPEQ=%gnom)yQgNwpf~e@reK6AW#!elNz4 z?qlJILQ1n{8B_dpuDqoUfE}t845Ql5#}I+oY7~Xd-fG{F;Fq+zxGQ5-zFBH3LN}X1 zck@hpIW-6%EF%%lFJ){FWJC<`4Nw|ri^~+3HUvB=o?U$Xw^YbN;w#`@eUg@TNn;{# z6~KO(o1Cg`<+n&=XQPA%ItUrLNS3XM+oK*vqv&5^YgS`$3Iw%yR(fg0^Fv!S?5T*# zxswakDL-Y}9g-%ZR2p}|iRW(u^8`G=vV^npTCZ{Cv;>_LUAvj-yti-Ow$;+nOayv$ zEl1^BJ&3mO+}e5}-LY#V)v2boSLD>-p99Ts$Cc%m%6b6L4id{F?$(pG$&b-qLJQ*5{zM{^Gz z`|f&1FV`g|>6P*GPQKC!?^p{--NoY+=JDv3*0{HBwcnkH+jqJ!0D63`0kSQ>S|#3)rZ;?P(^uOQ)4x&YN{Nle(?Pb_wZ$a} zW#{Ajpg2;7kc_~jYqsrp4R`beo92sUA8G2(_tv3CkPZv8%O8Sh~XR$EiabdI% zv^)A%eK+%TkR-lSpxtv`S&t8;DBnvQsz@B<-hx78f|cW~s8@CdQx+=t;PoyA9T7og zRI<2sPf7JyDOxv;eT7?{PA*5q2kT>zS4brPEfFh6r}~a@B|UW7BTGWBSNfnoX)4~H zLy=A1SQ$Ct2N8pCIJxpHbq$W@j+u2jyP)?_+iDXsUe(FdDqs8YwK~l$)0FbR=B&@{ z(b<5EdtPI({g}=d9{M*1c%~F}%M}=Z`k0(*v4=Ir%h*bUvOH-_qrnQYJYo}D{DEN` z*#gQ}D@?852GPx1kz_?HxW`f}Za`dS!e*kD7Dx~QXj)#K@LFQP7#!8)JQsX-Khtnf z0hghYQodoO$})XXik*;BF`*+AhWYVG;1wGw*V4R%HMA2E9lL&UJE z;$2S5zP>Q2#8%txOl{C>)=eu#EfR@@5S|hy^SJLIIjm6>HVHoGj_ol17=pMrc_1#aaZdq1UKcC z^#oXZlK?gfUD{IyHZlIbZ_Tshmz9L;}MrM3DmtgOaifjoO&e_~0)SJ>#5Pv387 z%R6Bz;5!4J>{NY+${l(pgx%$Dha^}=RZ;w2fnk1QKl_xdk3I*%^l%bsEL0_Ux*r(D z)ocf=Oh;IM3vQsQWAMOAYCy?5Gg$Q3k573fVLmXmST>w|KHh)d?x&%UpZ78e3Rro0 zwlEggLg_d5!+Dy;u6|9}?*doSM;C82M3(>nN+^USb7@AtI1|SoX)gZQS$QXC4cv)> zL`|a!E@glo(<&F0$raxthe7LtukB?I8N{--mqSUg1T&EdYuK?QExe~aI*$-g&RnF{ z_@T$o4juRFkWJCqgPMO2+Y}_x`9ePPhj%odS&d&IA&V$>-TIi6)`6dpg7#HY0sQNv zF(4dkS=^!!kyvK0PzC0mozbjVP;>{`&|pV)<>qARubWnysi`r9guTi{_DQW`g-DQj zqld{sCCh%)+5z=GXG=0&O9@>fiUqTI@8>Q+z{S}~@Z)w`7OdGOKW{wxy}rD8UJdOC z;!-hY&=G%NIGOXvmgWi&&y3nJ?Q5z_o>Sj%gZ6gKkpyMAL`>gy##!EfB zbIJ2q4xp>P`Wy84ACr&R*?&42`}jINk8G5T-((vVh7+R~XM_2R0<;RhCCY+Q74Fx{ zo3g5HDZ&P}C@*8Sqvmf8Y;ge36_=9zr0wk{yFpS%(K8p{e)gFuu3>a{72c`*vGdefDg>%XXY#DkIeqbFo?uKvWhT(b>=V#>F znK5~OUzV<=`)VlT=P2}W6A$NIy<@8i@^UI0Teu?MD5I*E7Kbpr8|`Z+Re_{|IE+}J zS}aY6RRKg1EX7&th+}xc^oIK|cXMHa8r`;ekPxBDZv_e>(iGOH96sJlYpxf;HtJZu z?Qt>v$DOc3U=18Ny$%h32|ojDWopcDKS#m&aWc|`-TM} zS=5FPxxgFlPtjzb5H<@`-n|?b2lsrBi}%zHF|uP^n2Sk63Bki0r}7eZuk??-n>asBtWcTR3`dVS&~h6Ub^mIwdhtk#xDLM96e z?r)jgNj#;%G4}<$m!%H7(#Tr)sT_?Y0&F>Ag@_#L1@(n5@1d*TgQY5Y={pf-C=u18 zbX1br=Nek+z;@Aqjg!CY_+rrW6C!PUsRX<(~tpDW%JVlLpAxbKyaIi3mQ?|b3VPp}_` zsvpi|Gl}zw&@%u)hLOu0VyhqBdr?boNiyF*6BRE6Y(mN?6KQ8tg$)TgMslf)r2<)A zsDX}8Fvy-#yr7<6eO>F_Xr%pm*1NSF5@(v)?J4xFyqNHrndq%c`Nuu9LR2R|k(t4T_udl^%7LmHUQfF_FypqIX_L=_xZ(D@+ z9!`G3<=WNpuE*oEiA0@h(SMH$PL7i^IR9;)Sy5PGUsyf+)KcW+Q{IfwBL%fscEP{d zk|9GqE|nP+Lu#u8V$Y*EQx^E3;m4%U$$r}Uc*yPu623+A#3UmozVxdK-D4^U&MsMR zWrJ!eBU5;t;ygP^uS&^0j5kwEcD}8Lyl?ic7G}RXMk`o0xc0cStx; zgN5)1xxxgVj?2xuR4)+{nxrPND*1S%Y+ziRv zs0gO^L5spO?01|wPr_b%1V#}1%&xe~+x6_uS*!y13GtF(GKMzU1;HVEZFZR-k+}C5 zxmudn)BJxeseji>yG*$dcx?taW}Yc4r7!1_ZmrbZXhY(iJ&7*pi7b(c>^@lnkuO%< zdf%~y(^tUgfj}+v`ysgY(K$&+hMPIamZ{(W17ZN}rd)p93&FddlqrKV47-~c8oF$4 zAGDM)GkH=%>!r4>%;FW%&_&u@QD(-um9xpUB5rJWtL1jPCi9=#trc9mH7xXR^gB0k zlC*QvT%;<82pMj4!))kr3%mRr)Y=oxs6XTQW(?2Ne2ASuNh|VrVg7wlNMo{>=s7*$ z!K+9fR}dNKM8d=)z?oD=yz$hV`oV^H2k9A&p!Ln54Z20Dn59{319vo-OGNaid zclV79pF8C{y0Ktf6Gl%S?FgVRAaU_JbVkxRcgTmX89Py>DTcDLSDm>|ygMB4{6@Ao zCIDk&`QsUdsa_KKuv$8)5GON{x{Tpjs02xTjNyU^gOO6e=Ca}s9I6JcJBGOKi9Tz3 z)WjAkbvCrE7`9>+o7a3F0tk-8#MzH7B}b9(QycNiJXinC^{H_*@PfMy0nek5CqGvc z9j!5?ye2IA-3N*cA`AlZC`DnRN7S$lKGu`5GeWQtGCi02?tHn?E%*e-H;O+StD7yiHNEi5g$c9C>Y@+>ueydDqx=4{1$Y`9xgE z>)~977JKW-TxZ?+Hav;J&lfpD_~nFW%Spdz2(wQc-B{zcfZuUu8(Ykf{GHWgLMfZ^ zrCV^g=4mBk@m1@t3*;rR7)rUA#)$w!aj}#NDA2wjM2|SxyON=Wykjx%ny**4ifnA*2h9(GE=qOR1 zjoIgy*TWPgKxo=!m)DTfUrcryqTy$nb5V|WC$V*9?9q9}siB93pCB-q3_yOPG~P=-RebJjt!#1w6n+E z?XCz+7JD%WK8V)i>SC8M_HBT`dwf$|aqN^$Yd^{sKEF5RZ)y|q?XrgDT ziyq2&c%|#otcZX93Oj^n&W-QSBhRr`&3`miui!}V!FhdVec*VxHSZbXNap5qN#SW; zQN$3&C)i7PDIlT3O_ls%_9TpSQXbpqggM$B`Q?P^F^>45%&p_6Na*MI(C9E|5Wa+E z6D99a#4ZM@P`+c*pd0ja&mLf7JS`}9Kp43C(mNuR~O1~ zBFBO|YDz=nAF?rQ-n&9=#U-XyNX(vuxJv~<4%zP|W#85;{d92vZV`HKNZJgh1kg3# zZ0UZmY_8jl0U0aFTq(ADr*j@_pOYm96tk~QV5X8&M=3?yX~(i8Dk2yU$&SUo{P12* zkPL9QEhp5W=t}4QN%zU;+AY)M&)ST^{hNPFhYHwjbKmZ>i^R1|#RhWjQEvo2b+~)U z_Pbgr+`tZrUPEAdhXk{HW~uOjOpv!1%kR7|AxJ7le|DFMdhY|QlxB|3Y}!i`t=&@!msk(WpSY!sF6L5S@2nJ z>Senrp53WR;Y~KmM~mOf$5VqM0RXilvf;iPG{j0%e@F}wbZk8!HiaNhQQw20sV!7% znEntMZ>Gf5UMv&TZS1t58T!9OZ-*(9u3NF-VJow~CUmdrmX^UJChqNm_*R-} zT;(CfUaoqH>uj7*^aJtKewOSaVP40>}vbWoBxiu;w@LUmB6 z5W}#{5ipT$KCF`b6md~Sjb^q7DhbvA^k6|?v+o#x;N&s)KrS}BlY@y+f-;nQHP0Fv z;~1xIgvfzc`5WY;(6pc!U4}nANtpbbx-uBs&l>WD@KFGhn#!UY0EG11?Rg6Gx6%Gb z$vbjCPuuQ;kiR+CUk9`IXXpGS?S|!Dl7*o85lgNbJ{@KJT}lub=zGMn8J4`f7I4Z;U18oABWMmS$-7%FnPoXH!ra zr2qn%2`Pg21haI>wUALjA zSF#rGKQc&}6kG8UDg)S75Zkn@bA!VT>~%pb;Kvi~SOs>ZR8WK;%OW~WicQz*d$*2j z)#u`G+-miIF9fb)*yp;{2RrCp#lVyI;Z6=7HpM6=2^VjhJ>t$vXIEqPq)-hFS=MBB zAC__9EMwlM!?Yk5ePt%_p_#R!ROdDJt0vYcZ{1=veAztQfzKq!5%q50K``0y)&=ob zZ-mm1iLNf+J}wO%d_CXRuolH*5?5N1sCP6wtZ+ z=zj3$Ki7nr^y}`Y-GQgdm~lCZU~#5_Qd-IHYc@3yenNqAnsG>z53{P>x8`eXtzzOZ z5YEaviG}gV29=PbnYDS?sj{pMuIv_l?={KVeBK;NMDf5rTK*UnHMxK9uc+c?8J~pR zvH2OUd-OZ>-N?Y}c}+2l>7vn843^uhaa7imQbxe218m3+(aJ)fB>F*~;E&OmH4tcJd)VYkvVlbB58OnEI_c@`%itMa7eurKN6kwnX4uUtrg#2u zbcJq9S{O%ucS|qP1|jAW|5kq=C%bmCLlah4?9Of?Ysz53?&6}G``PA!(N}pdtu{;ehXUJM%qo9 zBBD!qmKv0i+}V5C5iAGj@hOYX^jNL1-QJV)z$V*?=au){UBAbH)XQIYR(Mc)E=??N za`gR=Vrut?uY0#R4un(LAVOAy1?W>#h697yqZvb-Lp4~*CNsPaV;1C!guSQ%foap1 z2#f)Y3mrMT9mq55UYyudgLR=Xz&H?zkxrU$?w&va_bzF+m1aX^yjD_8jM4%aei#NU z4Yk4}!-<*qGG_k`y;XBG6v(_TdEW=!Z$eSAID!M9I6 zOlA9Gk2BHiEeFtnqpnA_zm#I-YmZ z;$%+d|NI_1PqBcHn|DWlZXHWD#jWSOvU|K6f7yFN9B8eVP+JCD?eX9@swH7BZ{=IT zFSN=MU}Ib`%~rDZ?N6db(*VmPYk#W~UQSR*W-^%0m}jT$xJZlGPIOTH8rQKB*b#8W z^CZk2@g~Khf1CWwwr?$%goD_qcfr69$(5{UQG-~tYh8q7a%Z6XYW%Cm(H-PE6kbecG#}hs`2M^8 zUmCyyWCq|v687o*UFE+BR1ACyqg2!MVZ^F1-#kK&#nT8|pFW`GU!(Qx;twDr078Xj z-DT58?Y0)rVde-U#6G?W$l>&fY;ql1eJqVR^oW8~qUSe*C6rUFPd}0%yZiGo5GF5ra74Sy#GB#qU_=l7zVOMh$9UTrQi0x^CE~ z8cHf};@vT1-4qI#^Ou`yB>jLRXmK9m_YU_djrHiZ3Vjy5t^tvEUQW&tyXNcppG6)R zByF^(^Z`2?6d2}jVyW36)$FBDKlze>ihf%#s6xVeF~w=gJRlJHu;%4*kBj%l^SAf; z)7b?0ZblhAGV}D8VX=m5VBvqYeK-Cm6#P)nqF zuB#hhy@JqNh?45TnZs<^pStir5SY!1`-+Xj7ragI(erLuD#p~*$pA=mU=PNZ32a)C zpiAuxN0aohzKf5Zn=J4`DVp}SC!w^w*Ls-}TLLE^8pf^hRv#!PoFw$+^wV?*(|&FP zSK@9tA!*GBs-jc4`0O23J;>x>0bPMM95?z%Ikwp>J|9s{XbYbmgLOnQ+XQ`z7I69P z-Ex%Ip*FcxN#XFgUD5N_A#y^}@$C8C$L-K=8B*uKe|N_eRxKO_%RJaz&0zIsq_WnH z9-zP8r4^t^9!?dQMCzpjGdeRMbPnAS=49ouBug|6_fa=8f3O8Hf71-(J6ipEwAeq5 z+>NL#lpM}%<3iNBEFOKi#Dz%e*W1+r?<9?6T6H+BH=X02Y&_pj);UvLLB)%o0EkPK z+VhL{^vNn&nHbcg>=kJCrT+Y3VoWy5+VadO7L+P!`oh)X(-~o?M6wUlAXsO6_E6sE zyk!iOgJ5jluqf78o}dFx!zS zyGt?zy$cF`|JqB^3Cl?93&Y;a?c`ZO|2ROigZfPcrWa(){? zdC5bKvZ{5ltu&rPzqpeNM!z1)Gmv_9&t0>WO+V_*Xtdlxozf=KZd74wC%u#8^| zzIf4wQl{!#Zzt%VRh}zO^zKdaV9B5VPpST22-7VGDKgV1dh;Mq-rS=6s{TG2Z;=^1Q5qhJ3)+x&5+19aw_~h{v!5;XIO84#5r$~qc8aeV&p$)aOLW{9r>=(oN~ta zt)hZa|9VVG*x9$BphgS`+(E$hX@kd6w5D3d5qw;!apy%&-Q&Qe>#cHBA)$&uvTE&9 zMG}S{!{U>M+T!#IEoe=$bY)h!pB@8(UYMfp<2ia<7$qrYhQ^Q}bWfex7&i+mJwW4G zdacN;zVjD6PV_7=DQ<@8^7k06?^vBi@V=WbbEwR^nSJL1=~W<2 zOPw#r3+PzCd+FWfHku1QR-`#5@A0dV*zr1Q0NO~piF%a=Mw9n#p<&ETd_IC)-ipg@ z|4SB2BroW82R$0@t;b#(B%Ur5vxbmPXj9I(3C>I)`oK_BN_mt*%&$-I&=XZKg4X1x zPr5LIXtgOnH4FR!0ewtt=m|L+DEIjr(r~GyEjfj+P$}ArXzIn&M`Ne~NokyDHF^!g znqKM_g3U?A2=fE95{3oxvBliX^M*u}ly+{0{tIdnGAYveZ zP9*w^sM0tzl3!*&iGB=KgMr7z5}>cGV#6+1DsMXnUk2g4?*cE*wzhajLP z9x@hYTBKtU697NY!Z6`67(&37o6j1Oknv!NZqF-3&%rucP-&>xW0K_wMJ%G%SZNX* z0$f!&Bf?Wa&W7>A2yLwClyuTrS6uks zjHF||4 zG6+RH6;s)YnG}0Jdwo-kVCZH*ET3@!ui5ZQ78ALTTn<#c!9mIxIKuc4_ z@^kBgDI)7~kIu-LF+6CPDyRe0S!$7KK}e;3Q$kRJhqE}A6}LI%u!{oX30- zg6s)`b(h$+Ib%Q^3mr)z(Ue9)_$3I8V#OQUF~7usc#^%yX#Q1dCu>sV=Ndqbcbvzl z7*x*t7+@q$u&$!kK4vIeT3FeN12Yk>``n{}F8!3#Yq8_?RPp106Ju4}|9Eo6;L8Q_ zgBclKzHX_-N#R0I2P_J5E<0d?r5C=ep+|p19|i$GTO*59GHL5FZDO(rLc`W72z;9^ z00Lbd)~9p##tRiTB$JA-%A+I|YxyAgR8{!5?FHUhb-bluBl%8SDqxqXy22^vnr_pP z=R=qS+E|mL2E2;IW9qK#WTY-o)fK3r*^CaDH>8(Kz%MA$!Nr%nlamrfSZry|o~IXA z*X00)T0}>^cSEHdcW$qLiHiS;I66se^G-z>!H2<^%ed}#T*1C~ORlb1SebF{_Dv8ZwWL=-_H3&GuiP^?B>-L zgU6k6zCQpMfTVTTgsluo*cB9rlai#r?$l9pGZ7G2o>Ud(bU`v?lx!Gbr=ke@+6$*J z;sSBPhH&I^Zdu738P#$JxTt0&&oeOsSCp0W|XCIXm(t#34^#*POdTR_jU)zyrg2X(>Pfj@n z%iXyU?X2H3?e!Gx<`$kxo#O&^QsC(0C2z`INQqvw!c}sO8|Xp^_B(GHDzl?4BRm$Z z->0l{hcZ^yT&DJ&o|`0UIUux;G~nYij3kOd3Z-@|)|GfnhRlk?{Ug~&NcD-7fMD7m+vi-{#l3WLU` zP8L&vl)uVd#JXb1%MEf5d?)7$1HUe}&56ZDnOeta;@dfEbUE-=yfgV8VGtcNU64eH zTUzWrG{EVNwmw9|9cs5hMd~Dh$X`gj%j}%k22G~WjyuiTYNk<$!_rS$u24ZL!nNu? zl#{X^;f%Yhp&5cUWlv4&mYrz0fRrAiiv6L60?t0>ZszP_FUaxz@9274>ZkE*NKo%^ z@i?E~w>ym?!Ztj7%N)2`2N?0@rdd78&)b;sc+(Xe7U| zs{kb)K6irOl~;^}PjDc5=kSLJY^yh)ZhirOa{6tY+E~O=V&^f%IU)3(A?GanSRp4R zj8a^i@fP}hdD6(5th|)br6@dFW?}JwT{pB z>>UrgcUTwjRJ$BFFvwm?z}pxq$q?8=Fkuh@D>#Z^HF%F_u=@6uMDxh1N_huSAsS6@3KgcJS+JT|iHH%vy9k54e+4 z9)=36W(V|W$>&c}3-6AFwo5c1ri*`mv<41qV=A}uoes0ouasNjb0bH+!zO0lc_;b; zEj^>Ngv=68U!}Xz$~*cST9zgf?ss&Wx_&1a*X7qM&)1`uCiVIAnE#eO1_l;V+>_nX ze&;GFR@sR^$@xw4Q?MkjJXe}nR`V^vA-CeU zZ9SU_RcbH43`?6Fd0F3Hj6i5Xn(Q(AnP|o%3x->9L_=4~vw|m_k>CkQK-f`imKO_2CQd_A>BmVjIA#9P@KExRep zcH=4kZ!FUyAh>@RW)nC#GtuR`Y_jtB1M;&_^v-^Gj^nQ#05dlVzC5vlUJaZbf)7J= z9_`wCU(Fb!Z0sxKe0?RCIGGaUr1Ku91u77=?GPFDNRANrTP{#BY0KdAw3e*;7q^GF z-prt?^5&lopVEw|@Dfnsu3r{c%2;O)k5V24-Y!4AIMf|vGaH@T(opy%e>|T?=`fq| zV5Rar-0h#<2Mr@}!8;N52Cm?%DN5*b6z243au!{cNGFe8V2!%k8cJfG6WN+?RH+1c zVhg9Z?_|HAqZS^&sba}o7trW!`c|Hef)E$*AcZ~2vji>`NDFA7M)#EL(dquEr>qh} z^M)Ge4?|RadKe9;TYdJW@icW}dG;ffZ2pVOym8{Nu&0TXd3>ik2iwEfe0f~;v5X5> zade3wbya9R_1TbwJ`rMZ&MdvdJrRm5lt95aus<3-R!*OBQ!h+2kROU^kq{VWFj%P+ z6e?o*hT)k6cebVwe#ZR-)79e_gc2e*bUEw-Yoo=KjgnqWb8D_4v5WbfkU;u2S>{h7 z&}Y3HBiDkFA0A%K2Iixr0%^Qy*Qb;(@>6MnYK^Aui&i>#dE!hb;QV0+dO|#THi>W6 zpNtzbtQEDhypwxa6p&Akg7*E3^}ZlQw{6PHe4dS7xZ#jT15n~}T5y38&;&~qU43xK zx~EcsQW*-ff4mk70m?E+nhwNB&tBpy0mS_5H%1Y~8yR@q-OQ@yN&&=zqHXJ(i<*ziy_?I$oeNosX%Gcp*+&iMx?w>2RtXW(+^H`=@lzZ zD;$9z-wW(^aco?xwsIfhTG`yvcMgCLLKaRm8VvXjLzM#0E?e*UtOwiTtiz-w+-{;S z*J%gt5J1=+^NPnEw4l_bsQ8v<7|%{e$aqnwulanVH}faq;idl| zQAu^zEa>_y%@5SC>Z&;GE0!k*H`T{XKP4!w_XP$od`OCNLU3-hWV9H(K@U{40iuJ` z?Be3&sJmY!Phg0T?-;U`Sl%2^8wuxP$}00(o0|W8zPLS0c!Xe0x7QO{$n4BzhWGI& zE|9%MIE+dlm{A`#Z$%KyQYVq#Qq~17z```<`xTz(p;7>m$(KJKkMGvo!M+Cghu+w5 z&rrzZqxWyLii`Gm`EvtT88Hm^Gt-twBf7Mna8sk7p_MILw0ceJC~U77Kv#$$!s9Pl zaIo??pkaPB;pjg=>pY~ZSWffj_x?{lMmJ(=62iA*W$VBDbtfH#yiJrp{$`wHEr$;X z?5<0BqHkbR2QyO(vLU89=DPD*=DB7y^oKYYCqb7(*uY}Sdm`LRKkirS0?)T0)_0*r zG|fuHo4i+(0b?f}#sH+CUy3e{3`(|KgrdU)R#-&XV^B3+6}KQ2X2CfH6F|Z#A^{Og zn#rQ{024FOKwdulat7tWW$3RoCaAkCV2(%pN5=@SL&pPe#y0}70`)0!Ol}^tKO8&}`k7$uLx5wAHf4Hw@Ub{*)G1dRk{E73|9){~W z@tM=xaE z+AcL~>uZms=PD?8a z!fo+Qp2Bq7%0iL==iu>b0g&KZVJ5)(ESn482Z+Y$Al9@-hE~=R*d~c)Tiav-KVy+F zcPgU?g-xrExQ#+tJ-N<5IKBW2yC5JGS*Vb*649!ryv378t}+=LVV3)2c#d~8l#UNBUHr<<`S92I<$(Hh zhE)qMV}Vbos z#sWSn`z4UcP`9xoF4g`by9$zfi+S+N{^0p)sWJJ{CvGa|56A3kR>Ml03ar>Hey|bA z=dhZgSweKEh6X^2GzxEjP*gU=- zn%DSuL1)5A`m1x&LeckTYCCyGexf#x5qZa??(k70l<9=WJ<2j}S-&2>U2`*z79jVb zW_TJsBg;b;&{ZLnLKhT4Zvv09uh`6J;(#D2Wz`&sDsHQ>etXIkC~Nlel~d-4{J z`geA+x-%@yc<=Er+a*-8RL7`Aq1zL%i&!KlKo&GgvnKP1!58!*X!trlXmXD(BX%fD z=QjcBN+s0|Opk^Xfm@{G*wHI%Tjc(&bn}##N0Ja25`WTNeEODO{*l|AT;ZE^y?Ol0 zU2xI0Y>@L>c!%JLb6gwMRwB1h>M-lDD0NfNRK}kw>z#>!Iy(TIOU2oEiZMYXhCaEQ?SyuqvlaFHmMjX~6sK@KspM5ItT z!uX{1>7>#{80O$IC~as{odv8qi2yN!d`xW;@d132dJJqxwHqIrI9ADvAJIUZPhTnK z$o@xn1U4-P+=-!k0rTs@R1DFKvyJn$uyVU~aUOX~B(3OADMhAq~ZqVOs#5lu^L# z_Sut;E>hKLl3Ixf#a@q~%gc$A-1^Qp3^uSUptUJJ^N!^`$1noX2p z6na|BQHv}){D)O&1WlvRn_eVZUjYBfr~TIn2k8{ zz9GTZwiN9wG<4FbVIP95vf$fX6KN z$XD6yJ^!8gZ>|9!fgNdYK5syIRon&+e1F4ebp_leFIB9V-2n66@e8r;rU`CBMB*@C z77%j%M2R(~TvZ(JzGl9e9)uG;3kC<1hv2@StH_-DdAg&Kh7QM9exo$(fA2)$G zNPbp)@E@2)hl@pByES$JCD~ib{99CDTe9=p?h@>3@%uV~n&w@()8)0sG(x>X0=57S zR><@7RoxRP;Xr(XHj$3?Qf{${MLpVjG@6z>(pZGqT_-|i# zldJv5?bKCXd}%Yy_s@H6!Y&1W|LW^V8Y)P6&D|!tO+?9cMtlgElp6#s5r;Tp*^sRE zVh)O^;P={CF>cI>$R@s~7yn`WVaS?1`H#Wt-Vu97;1Ax$v2~-VgdPYwgm|dljL-c4 z$~yCRD5JlRW2|MJOlZc~Bl{ki>}z&evQ#sMk)3Q~U$ZlIg%B-5_NZhZ`=BXmG$PAP z2xVy^+cV$m`Q>@O?tkE1*SXKR@Avt9&g=c|b}H}U&zF2|Ki(Fz_mLiIF1b!4OE7Zj z-IqwI%@alJh<$u0qfD)0OyWdDpN1v8VELe}EK>f}BdcHbyv|^Yus91%?ukT-F+~0^ zAg>GN+5kGwI=&E1J=IIsq$lA~pjUN80}%&6n{lHGN~J15ss(l&p&nV&u^hTq`s&PoA-lGhvfkhA z6}(GUufxs_f?02>-OoUzOOlbL@GYRU$fLsKfcO013xn#->YmDaPEXUb@QCMPBL08- z$by{B3kox?aR&nEcRjNwi-(&$jXZ~0w=|*(RHQD?K%LGBZ&i+p^NWP3$reLN%=qCy-r zTGd^BLh;!FF_huK7`37vLJ&RW`Pq6dQZnGr);j5QgZq1M$8rc0%J7J&{&6iCEMmAPerQRk9BN(?8v#YdbzoRQ;3Vlidf%3)KXvrvg z%E&F-f>iF_7JW6^bbAMDWvl93*DvvI4GzLIjyg507{(Su+KUpz&oajV^$VBWYV$G_ zAENJ}|KPGDj`o*0plMW+m*yuM`*d$ z7`6DkEfwG!V^_`x@p0Tnhf-x8b7WEFeS*3w|MU8Imi2mTU6fOiWFab!H>PLc8MNH) z_Sn+uo2y>id*i7~O5+p1+G7t;hb%qL)A!{=z`g~&ufo^*U=WISvPV`hP*mMR*imfo zrFE_wNc0!AJmb&E8APCc%0BS}Wz?`MUkii+72#xkTUf9n{#2EFOv0}fs|mHeunTz{ zz8?rgULpzYGN6U?8g5wB5+0nlx5of4d}yB?k|Nd{{&e ze_D{kl*>?FS4aQfw5R{gL9w)ouM;?V7yS#MjxvLkaeS*Bu%u?VrNztei{R^1y-G}R z1Xt$bIF+lK1~ySN2W`^7x}{kQ%P;&1^tP%>428Fh;{FLPFO*aFJ1o3u5xIruEMX?@ zckxDQ8y`2};_!~uO)@+%d4!Syn}aClvpHMqQL%N{EGujFtY~0)W{Xtg>V&pQPECdW zN2|p2eo75ydsJi~oPZE~%Q>EovOi`{mZyCnzK4kcs+TmE>G`%+RaLSBnc1EHEz4Nh zmT{4Y1Ki2CAwqqgMO9`3$NEYXjn^Ti19eGs$NUhRKes#%+wqpCRF{>#TSpWBAF%t+ z91PpSBmac%QeuniOeb$!o3xfLY@@>DdSR*D66R(BYKq>B`;Tt}1>aAy4Dr4V(zlmc z7ZgMNll*g;>OkAb@AzzC<8ycPa!=3gau?Yb;OZ7WjT3*Zx?f=TD|9J$aLo*4q|9Ta zC<+{p}@r%+x2xJN4Z9&r%wF%h?H&Ek<#JEmHdN7of z-um0EkRK}NL6a{$Ze6y2!4;`j1D5G|&)LbUnGQ98^HD8al%MBB8@)xbDfJU zz1f_JH8&i3EG78_i*K-u={nj_iXpDzZzu+F?j(lpE$7m(_JePE zl#+h_;yLuge}Z^tr4Z>QXu#6Q)n`l{Tq=OXElsxvRN_yau~9u=d@R1mj(xXM_L>mR z`9YRVsGTd_oT(Gx?TYp_4q2Q7piV;4t29xJ*PXG|OUtAMV>A(0wI>2Sp*dGUhT9tV z;o^ycbDdF``ynF5SwcxJ#N||9>7oEArbKG~rlF8+ZxU;{iCz*TkZ*_Zw&Hu-C8O&b zk%qpQ<;5wC)6>zj{R!i9K5|nXlpsk5iVg_MTfOsrVrA4y1=5GW9o5zA9caXa-Sc-9 zUuRgv=mr~nelwdd`Q@4w`m<1DXnuyTS5#E<(E*WkQaFXErLZC7W{Y89%==AUWprpQ zclmdRrPo=8+#$v#2E%$qIU($-lsSKjDFJ@~=Wprfr%a={b@?L(<2I>d{xb@>)HFbtN_=7P zT+HFt&h&lwb2=&xcO``gX#S(^PME_!N}yfjGJG0*V^W@u!?A?$109AVt7=B&YL_gl3)md&(B zcZ|_X*WkZLzzTPk2d-qYn_X0N&;;}+?JM69cI|k8mtK0!xNcZQxxKrZ^PxBJIi5ssJO9NLw)foC!jfmYIc*1oT{EHkfWm^uW#B z8Puz>(ae3~Qqdbd>Xa%MOQuchYN3Kn13YxlNRI_F@5kaNWwJdpsVd2h-c+ zpDF1LEfk~?67qzDyvygm#}yfAS!~I)4-*qF0j@m0 ziY^E18^M_lHB5s86su6#SSl;XoZB>i%~5zDXCa5?(^@;7y{>8d2S0T~S~puhPo#k; zH@tvzD)k>UXTa8?%nbrF)2Rqex?W|VmqA_k#xFY6w2p!g_QJ+z^E+#1RL-`X+ChZ( zhlrq)zwVKCsVd`ZE^~hKqFz?LQ3-mk)OYOb!Zn@AG_^uXl6 z6=sz;js>tO%TaORB}mHbCj*9ECFlBYw%wW=9}=a75LSla*bCNu`cdWp&?Z! zS7L}#K$n{`SnrK;BCuZAO{RnCQPQ+W$7a1vxGg*U`Iq~_jsU7Q7u#Bix*vP6x=X^h zYFznjaCQNNf(U+%^WS;w8e|7Eu4D!YPG0J4skAIvGuLDOc1q7@@!Dxhl76A?}+<#~abM|z8dUbR5N+x?rerZGE+QBQiVCc7rXOdu>0t%hLl>Jaw|XU-(Y$i*43COT{qMo@#yYqP+QZ%5$xQIlSW&d`!nV5?gKk!F<8wN zwebCulP^yDUhTcrx zd*GN{b&C$|+Q9xayeSJP;6#hdPW^m81)YPFTpu<~O>*mI>KhZe5qJN(wWwM1Cv7Js zNd(W=^nUM@;MS9@yT-CNh4jbsyerD3bTu-J-fF<4j-@#E3!kAz5-qSU1&%8Dpfv0! z;i2UeH4_P_oRIdFAEGrM!H_5O-&`!GiZI>%jYH-0ouvu4pPf0a`rVA5IGiZ`LHz6Q z(+%D&<#1OoeRU4Hb3Rn!-4sW~5m%OXK^c|fua9QK1l;m|_n%K6PP5Dv;}7fp{+!X{ zly~YC8*#Zw$F?H6_aQ8>HGbA^Db+$}4zfBM7+GD?dp=NMS&wg!AxO?Lv=ux7{Kvm9f{v;5+lb$tV7I=T4VMT}H)GHhP_4!Z>d!zk8TSySlD| zK-w$r$lp({N;*$-n7!ZEH>AUj)EK+mog4z7I-=rJ&Y>k9>Ij!AQBtXhePR;zW{GYP zdO92pCb1&RtOtkCU%9@KOe{nd9iX}N9D1)IIbX@W=YZt5@$?>sYx-%a{ngBm>5{-H|W9>{s-u0Zm|FW literal 0 HcmV?d00001 diff --git a/static/img/image.png b/static/img/image.png new file mode 100644 index 0000000000000000000000000000000000000000..878d88235d747f4d7d9597b015666e8de661b29c GIT binary patch literal 10119 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 + + \ No newline at end of file diff --git a/static/img/link-light.svg b/static/img/link-light.svg new file mode 100644 index 000000000..9507968e3 --- /dev/null +++ b/static/img/link-light.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/logo.svg b/static/img/logo.svg deleted file mode 100644 index 9db6d0d06..000000000 --- a/static/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/registerapp.png b/static/img/registerapp.png deleted file mode 100644 index b330b82d50ca29095ef896dfe05ababe6107bbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4442 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 diff --git a/static/img/right-arrow-dark.svg b/static/img/right-arrow-dark.svg new file mode 100644 index 000000000..95826e9cc --- /dev/null +++ b/static/img/right-arrow-dark.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/right-arrow-light.svg b/static/img/right-arrow-light.svg new file mode 100644 index 000000000..b3591f59f --- /dev/null +++ b/static/img/right-arrow-light.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/social-card.png b/static/img/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..610bb9b6e025800a838ac3eb602405878c2fc709 GIT binary patch literal 210067 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%0D$Fv0{Ksn!mT^=4 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 S9Rdac|8B}CNoQTt_xV4C{>2Ue literal 0 HcmV?d00001 diff --git a/static/img/student-dark.svg b/static/img/student-dark.svg new file mode 100644 index 000000000..539ceba0d --- /dev/null +++ b/static/img/student-dark.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/student-light.svg b/static/img/student-light.svg new file mode 100644 index 000000000..cfa32f7e8 --- /dev/null +++ b/static/img/student-light.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/undraw_docusaurus_mountain.svg b/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c49a..000000000 --- a/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/undraw_docusaurus_react.svg b/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf08f..000000000 --- a/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/undraw_docusaurus_tree.svg b/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d339..000000000 --- a/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/components/authorInfo.json b/widgets/authorInfo.json similarity index 92% rename from src/components/authorInfo.json rename to widgets/authorInfo.json index fd62bc1c2..d94932ee4 100644 --- a/src/components/authorInfo.json +++ b/widgets/authorInfo.json @@ -30,7 +30,7 @@ "sebastian silva": { "img": "https://avatars.githubusercontent.com/u/44152511?v=4", "name": "Sebastian Silva", - "role": "Software Engineer - Partnerships", + "role": "Software Engineer", "area": "Integrations, Developer Relations and Standards", "github": "onecomputerguy" }, @@ -52,7 +52,7 @@ "img": "", "name": "Kelley MacEwen", "role": "Former Sr. Content Designer", - "area": "Content Team", + "area": "Blackboard Learn - Content Team", "github": "blackboard" }, "hernan ortiz": { @@ -73,28 +73,28 @@ "img": "https://avatars.githubusercontent.com/u/63703963?v=4", "name": "Simon Gaeremynck", "role": "Software Engineer", - "area": "Blackboard Learn", + "area": "Product Development Blackboard Learn", "github": "bbsimong" }, "ryan haber": { "img": "https://avatars.githubusercontent.com/u/10554169?v=4", "name": "Ryan Haber", "role": "Sr. Content Designer", - "area": "Content Team", + "area": "Content Team - Blackboard Learn", "github": "ryanhaber" }, "gokulakrishnan raman": { "img": "", "name": "Gokulakrishnan Raman", "role": "Software Engineer", - "area": "Blackboard Learn", + "area": "Product Development Blackboard Learn", "github": "blackboard" }, "subitha muniasamy": { "img": "", "name": "Subitha Muniasamy", "role": "Sr. Software Engineer", - "area": "Blackboard Learn", + "area": "Product Development Blackboard Learn", "github": "blackboard" }, "sara lehnert": { @@ -122,7 +122,7 @@ "img": "", "name": "Daniel Magers", "role": "Sr. Technical Writer", - "area": "Blackboard Learn", + "area": "Product Development Blackboard Learn", "github": "jburns54712" }, "camilo dominguez": { diff --git a/widgets/latestMaintenance.json b/widgets/latestMaintenance.json new file mode 100644 index 000000000..5c21a764c --- /dev/null +++ b/widgets/latestMaintenance.json @@ -0,0 +1,6 @@ +{ + "service": "Developer Portal Maintenance", + "startDate": "May 28th, 2024 - 02:30AM EST", + "expectedDowntime": "No downtime", + "description": "The Developer Portal will undergo a maintenance update at this time. There is no downtime involved." +} diff --git a/widgets/newDocs.json b/widgets/newDocs.json new file mode 100644 index 000000000..7e96c70ff --- /dev/null +++ b/widgets/newDocs.json @@ -0,0 +1,22 @@ +{ + "0": { + "name": "Tips for using the Create and SaveNew API operations", + "url": "/docs/student/best-practices/create-savenew-bestpractices" + }, + "1": { + "name": "Tips for using the Get and Save API operations", + "url": "/docs/student/best-practices/get-save-bestpractices" + }, + "2": { + "name": "Working with groups and the API", + "url": "/docs/blackboard/rest-apis/hands-on/groups-in-rest-api" + }, + "3": { + "name": "Sanctioned LTI Registration and Deployment with Learn", + "url": "/docs/blackboard/lti/lti-registration-deployment" + }, + "4": { + "name": "What are Premium APIs", + "url": "/docs/blackboard/premium-apis/requesting-premium-apis" + } +}