├── docs ├── .vuepress │ ├── components │ │ ├── videos │ │ │ ├── skilltree-training-videos.json │ │ │ └── SkillTreeVideo.vue │ │ ├── ServiceUrl.vue │ │ ├── ReleaseDate.vue │ │ ├── SkillTreeVideos.vue │ │ ├── RequiresRole.vue │ │ ├── Conditional.vue │ │ ├── Since.vue │ │ ├── ExternalUrl.vue │ │ ├── HomePage.vue │ │ ├── home │ │ │ ├── RapidIntegrationSection.vue │ │ │ ├── InfoCards.vue │ │ │ ├── UserDisplaySection.vue │ │ │ ├── VueDocsSection.vue │ │ │ ├── HomePageHeader.vue │ │ │ └── DashboardSection.vue │ │ └── FormAndPki.vue │ ├── public │ │ └── img │ │ │ ├── skilltree.ico │ │ │ ├── browser-icons │ │ │ ├── edge.png │ │ │ ├── opera.png │ │ │ ├── chrome.png │ │ │ ├── firefox.png │ │ │ └── safari.png │ │ │ ├── home │ │ │ ├── Screenshot_JS_Integration.png │ │ │ └── Screenshot_2020-07-15_Vue_js_Integration_SkillTree_Docs.png │ │ │ └── skilltree_logo_v1.svg │ └── styles │ │ └── index.scss ├── videos │ └── README.md ├── screenshots │ ├── admin │ │ ├── page-quiz.png │ │ ├── page-badges.png │ │ ├── page-quizzes.png │ │ ├── page-skills.png │ │ ├── page-survey.png │ │ ├── modal-new-quiz.png │ │ ├── page-inception.png │ │ ├── page-projects.png │ │ ├── page-quiz-runs.png │ │ ├── page-subjects.png │ │ ├── modal-edit-skill.png │ │ ├── modal-new-group.png │ │ ├── modal-share_proj.png │ │ ├── page-admin-groups.png │ │ ├── page-quiz-access.png │ │ ├── page-quiz-grading.png │ │ ├── page-quiz-results.png │ │ ├── page-quiz-skills.png │ │ ├── page-skills-group.png │ │ ├── page-video-config.png │ │ ├── skill-tags-page.png │ │ ├── modal-new-question.png │ │ ├── page-project-access.png │ │ ├── page-project-issues.png │ │ ├── page-project-levels.png │ │ ├── page-quiz-settings.png │ │ ├── page-settings-email.png │ │ ├── rich-text-editor-1.png │ │ ├── rich-text-editor-2.png │ │ ├── rich-text-editor-3.png │ │ ├── rich-text-editor-4.png │ │ ├── rich-text-editor-5.png │ │ ├── component-quiz-skill.png │ │ ├── existing-tag-dropdown.png │ │ ├── modal-badges-new_badge.png │ │ ├── modal-edit-subjectIcon.png │ │ ├── modal-skills-new_skill.png │ │ ├── page-expiration-config.png │ │ ├── page-export-to-catalog.png │ │ ├── page-project-dark-mode.png │ │ ├── page-project-settings.png │ │ ├── page-projects-not-root.png │ │ ├── page-settings-security.png │ │ ├── page-settings-system.png │ │ ├── page-topSkill-metrics.png │ │ ├── component-settings-menu.png │ │ ├── component-users_archive.png │ │ ├── page-contact_proj_admins.png │ │ ├── page-global-badge-access.png │ │ ├── page-global-badge-levels.png │ │ ├── page-global-badge-skills.png │ │ ├── page-partial-share-proj.png │ │ ├── page-project-self_report.png │ │ ├── page-quiz-single-result.png │ │ ├── page-settings-preference.png │ │ ├── component-edit_skill_button.png │ │ ├── component-notifications-btn.png │ │ ├── component-project-settings.png │ │ ├── modal-edit_imported_skill.png │ │ ├── modal-import_catalog_skills.png │ │ ├── modal-new-survey-question.png │ │ ├── modal-projects-new_project.png │ │ ├── modal-subjects-new_subject.png │ │ ├── page-admin-groups-projects.png │ │ ├── page-admin-groups-quizzes.png │ │ ├── page-custom-headerAndFooter.png │ │ ├── page-project-learning-path.png │ │ ├── page-project-metrics-skills.png │ │ ├── page-project-notify_users.png │ │ ├── page-user-performed-skills.png │ │ ├── component-slides-config-empty.png │ │ ├── component-user_progress_table.png │ │ ├── page-project-metrics-subjects.png │ │ ├── component-catalog_finalize_alert.png │ │ ├── component-manage-learning-path.png │ │ ├── component-notifications-dropdown.png │ │ ├── page-admin-groups-global-badges.png │ │ ├── page-skills-exported-to-catalog.png │ │ ├── modal-new-question-hint-component.png │ │ ├── page-project-metrics-achievements.png │ │ ├── component-slides-config-with-slides.png │ │ ├── component-table_with_disabled_skills.png │ │ ├── modal-new-badge-component-bonus-award.png │ │ ├── modal-new-skill_self-report-checked.png │ │ ├── component-conf-approval-workload-skills.png │ │ ├── component-users_table_ready_to_archive.png │ │ ├── component-conf-approval-workload-fallback.png │ │ ├── component-quiz-grading-email-subscriptions.png │ │ └── component-conf-approval-workload-withSkillsAdded.png │ └── progress-and-ranking │ │ ├── client-display-proj.png │ │ ├── client-display-rank.png │ │ ├── client-display-subject.png │ │ ├── page-my-quiz-attempts.png │ │ ├── client-display-quiz-run.png │ │ ├── client-display-badge-page.png │ │ ├── client-display-themed-proj.png │ │ ├── page-my-quiz-single-attempt.png │ │ ├── page-progress-and-rankings.png │ │ ├── client-display-page-honor-tag.png │ │ ├── client-display-skillWithDeps.png │ │ ├── client-display-subject-comedy.png │ │ ├── client-display-skill-page-avatar.png │ │ ├── client-display-skills-selfReport.png │ │ ├── component-training-wide-search.png │ │ ├── client-display-card-prerequisites.png │ │ ├── client-display-single-skill-group.png │ │ ├── page-progress-and-rankings-badges.png │ │ ├── page-progress-and-rankings-my-rank.png │ │ ├── client-display-self-report-honor-tag.png │ │ ├── client-display-subject-expandedSkills.png │ │ ├── page-progress-and-rankings-my-badges.png │ │ ├── page-progress-and-rankings-view-my-usage.png │ │ ├── component-progress-and-rankings-badge-filter.png │ │ └── page-progress-and-rankings-manage-my-projects.png ├── contribution │ ├── diagrams │ │ ├── JsDeps.jpg │ │ └── SkillsServiceArchitecture.jpg │ └── architecture.md ├── overview │ └── diagrams │ │ ├── SkillsPlatformOverview.jpg │ │ ├── SkillTree-MajorComponents.jpg │ │ ├── SkillTree-PlatformOverview.jpg │ │ └── SkillTreePlatformOverview.png ├── skills-client │ ├── diagrams │ │ ├── AuthEndpointFlow.jpg │ │ ├── IntegratedApplication.jpg │ │ ├── Integration-Overview.jpg │ │ ├── Integration-Reporter.jpg │ │ └── Integration-SkillsDisplay.jpg │ ├── common │ │ ├── skillsReporter │ │ │ ├── responseObject.md │ │ │ ├── reporterConfiguration.md │ │ │ └── globalEventHandling.md │ │ ├── skillsConfiguration │ │ │ ├── js │ │ │ │ ├── configExamplePki.md │ │ │ │ ├── configExampleForm.md │ │ │ │ └── clientConfig.md │ │ │ ├── ng │ │ │ │ ├── configExamplePki.md │ │ │ │ ├── configExampleForm.md │ │ │ │ └── clientConfig.md │ │ │ ├── vuejs │ │ │ │ ├── configExamplePki.md │ │ │ │ ├── configExampleForm.md │ │ │ │ └── clientConfig.md │ │ │ ├── react │ │ │ │ ├── configExamplePki.md │ │ │ │ ├── configExampleForm.md │ │ │ │ └── clientConfig.md │ │ │ ├── skillsConfigurationHeader.md │ │ │ └── skillsConfigurationParameters.md │ │ ├── skillsDisplayIntro.md │ │ ├── skillsDisplayArguments.md │ │ └── skillsDisplayOptionsObject.md │ ├── auth │ │ ├── endpointsAuthPKI.md │ │ ├── authPKI.md │ │ ├── endpointParamsForm.md │ │ ├── endpointParamsPKI.md │ │ ├── endpointsFormPKI.md │ │ └── reportSkillJavaExamplePKI.md │ └── auth.md ├── dashboard │ ├── install-guide │ │ ├── common │ │ │ ├── prod-install-basic-jvm-props.md │ │ │ ├── prod-env-tip.md │ │ │ ├── install-tip.md │ │ │ ├── install-type-intro.md │ │ │ ├── user-info-service-props-ssl.md │ │ │ ├── ssl-props.md │ │ │ ├── user-info-service-props-endpoints.md │ │ │ ├── two-way-ssl-props.md │ │ │ ├── prod-install-basic-config.md │ │ │ ├── service-install-output-and-backend.md │ │ │ ├── services-explanations.md │ │ │ └── oath2-support.md │ │ ├── diagrams │ │ │ ├── ProdInstall-Pass.jpg │ │ │ └── ProdInstall-Pki.jpg │ │ ├── distributions.md │ │ ├── devInstall.md │ │ ├── README.md │ │ ├── prodInstall.md │ │ └── installModes.md │ └── user-guide │ │ ├── screenshots │ │ ├── copy_btn.png │ │ ├── concat_proj_btn.png │ │ ├── contact_admins_form.png │ │ ├── Component-Private-Project-Invite.png │ │ ├── Self_Report_Unsubscribe_20220720.png │ │ └── Component-Private-Project-Pending.png │ │ ├── diagrams │ │ ├── skills-catalog.jpg │ │ └── DashboardWithIntegratedApp.jpg │ │ ├── common │ │ ├── audio.md │ │ ├── projects-screenshot.md │ │ ├── rte.md │ │ ├── activity-history.md │ │ ├── videos-intro.md │ │ ├── slide-deck.md │ │ ├── videos-configure.md │ │ └── rte-features-table.md │ │ ├── rich-text-editor.md │ │ ├── inception.md │ │ ├── notifications.md │ │ ├── contact-admins.md │ │ ├── contact-project-users.md │ │ ├── admin-groups.md │ │ ├── icons.md │ │ ├── skills-groups.md │ │ ├── global-badges.md │ │ ├── learning-path.md │ │ ├── metrics.md │ │ ├── accessibility.md │ │ └── levels.md ├── README.md ├── training-participation │ ├── common │ │ ├── accessibility-visual-adjustments.md │ │ ├── accessibility-feedback.md │ │ ├── accessibility-basic-nav.md │ │ ├── accessibility-skip-to-content.md │ │ └── screen-reader-support.md │ ├── README.md │ ├── accessibility.md │ └── training-portfolio.md └── release-notes │ ├── README.md │ └── skills-client.md ├── babel.config.js ├── src ├── assets │ └── logo.png ├── main.js ├── App.vue └── components │ └── HelloWorld.vue ├── logos ├── skilltree_logo.png └── skilltree_log_v1.svg ├── diagrams_work ├── Diagrams.odp ├── js-deps.jpg ├── DashboardWithIntegratedApp.jpg ├── skills-catalog.drawio ├── AuthEndpointFlow(3).drawio ├── Integration-Overview(2).drawio └── Integration-Reporter(1).drawio ├── cypress ├── fixtures │ └── example.json └── support │ └── e2e.js ├── cypress.config.js ├── .gitignore ├── public └── index.html ├── README.md ├── .github └── workflows │ ├── scripts │ ├── move-screenshots.sh │ └── gen-screenshots.sh │ ├── verify-build.yml │ └── publish-docs.yml ├── INTENT.md ├── CONTRIBUTING_IO.md ├── package.json ├── .gitlab-ci.yml └── DISCLAIMER.md /docs/.vuepress/components/videos/skilltree-training-videos.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /docs/videos/README.md: -------------------------------------------------------------------------------- 1 | # SkillTree Videos 2 | 3 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /logos/skilltree_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/logos/skilltree_logo.png -------------------------------------------------------------------------------- /diagrams_work/Diagrams.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/diagrams_work/Diagrams.odp -------------------------------------------------------------------------------- /diagrams_work/js-deps.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/diagrams_work/js-deps.jpg -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz.png -------------------------------------------------------------------------------- /docs/.vuepress/public/img/skilltree.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/skilltree.ico -------------------------------------------------------------------------------- /docs/contribution/diagrams/JsDeps.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/contribution/diagrams/JsDeps.jpg -------------------------------------------------------------------------------- /docs/screenshots/admin/page-badges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-badges.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quizzes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quizzes.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-survey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-survey.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-quiz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-quiz.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-inception.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-inception.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-projects.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-runs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-runs.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-subjects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-subjects.png -------------------------------------------------------------------------------- /diagrams_work/DashboardWithIntegratedApp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/diagrams_work/DashboardWithIntegratedApp.jpg -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-edit-skill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-edit-skill.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-group.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-share_proj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-share_proj.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-admin-groups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-admin-groups.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-access.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-grading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-grading.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-results.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-skills-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-skills-group.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-video-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-video-config.png -------------------------------------------------------------------------------- /docs/screenshots/admin/skill-tags-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/skill-tags-page.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-question.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-access.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-issues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-issues.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-levels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-levels.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-settings.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-settings-email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-settings-email.png -------------------------------------------------------------------------------- /docs/screenshots/admin/rich-text-editor-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/rich-text-editor-1.png -------------------------------------------------------------------------------- /docs/screenshots/admin/rich-text-editor-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/rich-text-editor-2.png -------------------------------------------------------------------------------- /docs/screenshots/admin/rich-text-editor-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/rich-text-editor-3.png -------------------------------------------------------------------------------- /docs/screenshots/admin/rich-text-editor-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/rich-text-editor-4.png -------------------------------------------------------------------------------- /docs/screenshots/admin/rich-text-editor-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/rich-text-editor-5.png -------------------------------------------------------------------------------- /docs/.vuepress/public/img/browser-icons/edge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/browser-icons/edge.png -------------------------------------------------------------------------------- /docs/.vuepress/public/img/browser-icons/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/browser-icons/opera.png -------------------------------------------------------------------------------- /docs/overview/diagrams/SkillsPlatformOverview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/overview/diagrams/SkillsPlatformOverview.jpg -------------------------------------------------------------------------------- /docs/screenshots/admin/component-quiz-skill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-quiz-skill.png -------------------------------------------------------------------------------- /docs/screenshots/admin/existing-tag-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/existing-tag-dropdown.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-badges-new_badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-badges-new_badge.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-edit-subjectIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-edit-subjectIcon.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-skills-new_skill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-skills-new_skill.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-expiration-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-expiration-config.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-export-to-catalog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-export-to-catalog.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-dark-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-dark-mode.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-settings.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-projects-not-root.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-projects-not-root.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-settings-security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-settings-security.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-settings-system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-settings-system.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-topSkill-metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-topSkill-metrics.png -------------------------------------------------------------------------------- /docs/skills-client/diagrams/AuthEndpointFlow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/skills-client/diagrams/AuthEndpointFlow.jpg -------------------------------------------------------------------------------- /docs/.vuepress/public/img/browser-icons/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/browser-icons/chrome.png -------------------------------------------------------------------------------- /docs/.vuepress/public/img/browser-icons/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/browser-icons/firefox.png -------------------------------------------------------------------------------- /docs/.vuepress/public/img/browser-icons/safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/browser-icons/safari.png -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/prod-install-basic-jvm-props.md: -------------------------------------------------------------------------------- 1 | Java VM option to increase ``skills-service`` heap size: 2 | ```properties 3 | -Xmx2g -Xms2g 4 | ``` 5 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/screenshots/copy_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/screenshots/copy_btn.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-settings-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-settings-menu.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-users_archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-users_archive.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-contact_proj_admins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-contact_proj_admins.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-global-badge-access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-global-badge-access.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-global-badge-levels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-global-badge-levels.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-global-badge-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-global-badge-skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-partial-share-proj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-partial-share-proj.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-self_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-self_report.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-quiz-single-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-quiz-single-result.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-settings-preference.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-settings-preference.png -------------------------------------------------------------------------------- /docs/dashboard/user-guide/diagrams/skills-catalog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/diagrams/skills-catalog.jpg -------------------------------------------------------------------------------- /docs/overview/diagrams/SkillTree-MajorComponents.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/overview/diagrams/SkillTree-MajorComponents.jpg -------------------------------------------------------------------------------- /docs/overview/diagrams/SkillTree-PlatformOverview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/overview/diagrams/SkillTree-PlatformOverview.jpg -------------------------------------------------------------------------------- /docs/overview/diagrams/SkillTreePlatformOverview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/overview/diagrams/SkillTreePlatformOverview.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-edit_skill_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-edit_skill_button.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-notifications-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-notifications-btn.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-project-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-project-settings.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-edit_imported_skill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-edit_imported_skill.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-import_catalog_skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-import_catalog_skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-survey-question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-survey-question.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-projects-new_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-projects-new_project.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-subjects-new_subject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-subjects-new_subject.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-admin-groups-projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-admin-groups-projects.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-admin-groups-quizzes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-admin-groups-quizzes.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-custom-headerAndFooter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-custom-headerAndFooter.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-learning-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-learning-path.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-metrics-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-metrics-skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-notify_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-notify_users.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-user-performed-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-user-performed-skills.png -------------------------------------------------------------------------------- /docs/skills-client/diagrams/IntegratedApplication.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/skills-client/diagrams/IntegratedApplication.jpg -------------------------------------------------------------------------------- /docs/skills-client/diagrams/Integration-Overview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/skills-client/diagrams/Integration-Overview.jpg -------------------------------------------------------------------------------- /docs/skills-client/diagrams/Integration-Reporter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/skills-client/diagrams/Integration-Reporter.jpg -------------------------------------------------------------------------------- /docs/contribution/diagrams/SkillsServiceArchitecture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/contribution/diagrams/SkillsServiceArchitecture.jpg -------------------------------------------------------------------------------- /docs/screenshots/admin/component-slides-config-empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-slides-config-empty.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-user_progress_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-user_progress_table.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-metrics-subjects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-metrics-subjects.png -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | Vue.config.productionTip = false 5 | 6 | new Vue({ 7 | render: h => h(App), 8 | }).$mount('#app') 9 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/diagrams/ProdInstall-Pass.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/install-guide/diagrams/ProdInstall-Pass.jpg -------------------------------------------------------------------------------- /docs/dashboard/install-guide/diagrams/ProdInstall-Pki.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/install-guide/diagrams/ProdInstall-Pki.jpg -------------------------------------------------------------------------------- /docs/dashboard/user-guide/screenshots/concat_proj_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/screenshots/concat_proj_btn.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-catalog_finalize_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-catalog_finalize_alert.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-manage-learning-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-manage-learning-path.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-notifications-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-notifications-dropdown.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-admin-groups-global-badges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-admin-groups-global-badges.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-skills-exported-to-catalog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-skills-exported-to-catalog.png -------------------------------------------------------------------------------- /docs/skills-client/diagrams/Integration-SkillsDisplay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/skills-client/diagrams/Integration-SkillsDisplay.jpg -------------------------------------------------------------------------------- /docs/.vuepress/public/img/home/Screenshot_JS_Integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/home/Screenshot_JS_Integration.png -------------------------------------------------------------------------------- /docs/dashboard/user-guide/screenshots/contact_admins_form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/screenshots/contact_admins_form.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-question-hint-component.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-question-hint-component.png -------------------------------------------------------------------------------- /docs/screenshots/admin/page-project-metrics-achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/page-project-metrics-achievements.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-proj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-proj.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-rank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-rank.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-slides-config-with-slides.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-slides-config-with-slides.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-table_with_disabled_skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-table_with_disabled_skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-badge-component-bonus-award.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-badge-component-bonus-award.png -------------------------------------------------------------------------------- /docs/screenshots/admin/modal-new-skill_self-report-checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/modal-new-skill_self-report-checked.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-subject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-subject.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-my-quiz-attempts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-my-quiz-attempts.png -------------------------------------------------------------------------------- /docs/dashboard/user-guide/diagrams/DashboardWithIntegratedApp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/diagrams/DashboardWithIntegratedApp.jpg -------------------------------------------------------------------------------- /docs/screenshots/admin/component-conf-approval-workload-skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-conf-approval-workload-skills.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-users_table_ready_to_archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-users_table_ready_to_archive.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-quiz-run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-quiz-run.png -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /docs/screenshots/admin/component-conf-approval-workload-fallback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-conf-approval-workload-fallback.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-quiz-grading-email-subscriptions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-quiz-grading-email-subscriptions.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-badge-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-badge-page.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-themed-proj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-themed-proj.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-my-quiz-single-attempt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-my-quiz-single-attempt.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-progress-and-rankings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-progress-and-rankings.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-page-honor-tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-page-honor-tag.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-skillWithDeps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-skillWithDeps.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-subject-comedy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-subject-comedy.png -------------------------------------------------------------------------------- /docs/skills-client/common/skillsReporter/responseObject.md: -------------------------------------------------------------------------------- 1 | ``` js 2 | { 3 | "success": true, 4 | "skillApplied": true, 5 | "explanation": "Skill event was applied", 6 | "completed": [] 7 | } 8 | ``` 9 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/screenshots/Component-Private-Project-Invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/screenshots/Component-Private-Project-Invite.png -------------------------------------------------------------------------------- /docs/dashboard/user-guide/screenshots/Self_Report_Unsubscribe_20220720.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/screenshots/Self_Report_Unsubscribe_20220720.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-skill-page-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-skill-page-avatar.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-skills-selfReport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-skills-selfReport.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/component-training-wide-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/component-training-wide-search.png -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar: false 3 | externalLinkIcon: false 4 | home: true 5 | heroText: null 6 | tagline: null 7 | title: SkillTree Documentation 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/screenshots/Component-Private-Project-Pending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/dashboard/user-guide/screenshots/Component-Private-Project-Pending.png -------------------------------------------------------------------------------- /docs/screenshots/admin/component-conf-approval-workload-withSkillsAdded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/admin/component-conf-approval-workload-withSkillsAdded.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-card-prerequisites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-card-prerequisites.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-single-skill-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-single-skill-group.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-progress-and-rankings-badges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-progress-and-rankings-badges.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-progress-and-rankings-my-rank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-progress-and-rankings-my-rank.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-self-report-honor-tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-self-report-honor-tag.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/client-display-subject-expandedSkills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/client-display-subject-expandedSkills.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-progress-and-rankings-my-badges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-progress-and-rankings-my-badges.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-progress-and-rankings-view-my-usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-progress-and-rankings-view-my-usage.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/component-progress-and-rankings-badge-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/component-progress-and-rankings-badge-filter.png -------------------------------------------------------------------------------- /docs/screenshots/progress-and-ranking/page-progress-and-rankings-manage-my-projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/screenshots/progress-and-ranking/page-progress-and-rankings-manage-my-projects.png -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/js/configExamplePki.md: -------------------------------------------------------------------------------- 1 | ``` js 2 | SkillsConfiguration.configure({ 3 | serviceUrl: 'http://localhost:8080', 4 | projectId: 'your-project-id', 5 | authenticator: 'pki', 6 | }); 7 | ``` 8 | -------------------------------------------------------------------------------- /docs/.vuepress/public/img/home/Screenshot_2020-07-15_Vue_js_Integration_SkillTree_Docs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NationalSecurityAgency/skills-docs/HEAD/docs/.vuepress/public/img/home/Screenshot_2020-07-15_Vue_js_Integration_SkillTree_Docs.png -------------------------------------------------------------------------------- /docs/skills-client/common/skillsDisplayIntro.md: -------------------------------------------------------------------------------- 1 | The Skills Display component provides a comprehensive visualization of a user's skill and progress profile! 2 | 3 | ![User Skills Image](../../screenshots/progress-and-ranking/client-display-proj.png) 4 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/js/configExampleForm.md: -------------------------------------------------------------------------------- 1 | ``` js 2 | SkillsConfiguration.configure({ 3 | serviceUrl: 'http://localhost:8080', 4 | projectId: 'your-project-id', 5 | authenticator: 'http:///api/users/user1/token', 6 | }); 7 | ``` 8 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/audio.md: -------------------------------------------------------------------------------- 1 | The following audio formats are supported: 2 | - WAV 3 | - MPEG 4 | - MP4 5 | - AAC 6 | - AACP 7 | - OGG 8 | - WEBM 9 | - FLAC 10 | 11 | The Audio/Video settings also provide an option to add a Transcript, enhancing accessibility for users. -------------------------------------------------------------------------------- /cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress') 2 | 3 | module.exports = defineConfig({ 4 | retries: { 5 | runMode: 2, 6 | openMode: 0, 7 | }, 8 | e2e: { 9 | setupNodeEvents(on, config) { 10 | }, 11 | baseUrl: 'http://localhost:8080', 12 | }, 13 | }) 14 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/prod-env-tip.md: -------------------------------------------------------------------------------- 1 | :::tip 2 | In a production environment we'd configure these resources using the ``https`` protocol. 3 | Please review the [Authentication](/skills-client/auth.html) and [Configuration](/dashboard/install-guide/config.html) sections for greater detail. 4 | ::: 5 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/ng/configExamplePki.md: -------------------------------------------------------------------------------- 1 | ``` js 2 | import { SkillsConfiguration } from '@skilltree/skills-client-ng'; 3 | 4 | SkillsConfiguration.configure({ 5 | serviceUrl: 'http://localhost:8080', 6 | projectId: 'your-project-id', 7 | authenticator: 'pki', 8 | }); 9 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/vuejs/configExamplePki.md: -------------------------------------------------------------------------------- 1 | ``` js 2 | import { SkillsConfiguration } from '@skilltree/skills-client-vue'; 3 | 4 | SkillsConfiguration.configure({ 5 | serviceUrl: 'http://localhost:8080', 6 | projectId: 'your-project-id', 7 | authenticator: 'pki', 8 | }); 9 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/react/configExamplePki.md: -------------------------------------------------------------------------------- 1 | ``` js 2 | import { SkillsConfiguration } from '@skilltree/skills-client-react'; 3 | 4 | SkillsConfiguration.configure({ 5 | serviceUrl: 'http://localhost:8080', 6 | projectId: 'your-project-id', 7 | authenticator: 'pki', 8 | }); 9 | -------------------------------------------------------------------------------- /docs/training-participation/common/accessibility-visual-adjustments.md: -------------------------------------------------------------------------------- 1 | - The application supports browser zoom up to 200% 2 | - Text and interactive elements maintain a minimum 4.5:1 contrast ratio 3 | - Color is not used as the sole means of conveying information 4 | - All color combinations meet WCAG 2.1 AA level compliance -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/install-tip.md: -------------------------------------------------------------------------------- 1 | ::: tip 2 | Please note that this section is only applicable if you are installing the SkillTree platform from scratch. 3 | If your organization is already running a centralized service please proceed to the [Integration User Guide](/skills-client/) or the [Dashboard User Guide](/dashboard/user-guide/) 4 | ::: 5 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/install-type-intro.md: -------------------------------------------------------------------------------- 1 | Production-grade installation requires a cluster of ``skills-service`` daemons which must reside on multiple machines/instances with a load balancer in front of them. 2 | There are a number of products that need to be installed in high-availability mode in order to support a clustered SkillTree setup. 3 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/rich-text-editor.md: -------------------------------------------------------------------------------- 1 | # Description Editor 2 | 3 | The SkillTree description editor is a full-featured Rich Text Editor. The editor is used in the dashboard to provide descriptions 4 | for Projects, Subjects, Skills, Badges, and also for sending emails to users and project administrators. 5 | 6 | -------------------------------------------------------------------------------- /docs/skills-client/auth/endpointsAuthPKI.md: -------------------------------------------------------------------------------- 1 | When running in [PKI Auth Installation](/dashboard/install-guide/installModes.html#password-auth-mode), the user id will be implicitly retrieved from the client certificate. 2 | No extra work is needed when using programmatic endpoints. 3 | Please visit [PKI Mode](/dashboard/install-guide/installModes.html#pki-auth-mode) to learn more. 4 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/user-info-service-props-ssl.md: -------------------------------------------------------------------------------- 1 | ```properties 2 | # Keystore 3 | -Djavax.net.ssl.keyStore=/certs/keystore.p12 4 | -Djavax.net.ssl.keyStoreType=PKCS12 5 | -Djavax.net.ssl.keyStorePassword= 6 | 7 | # Truststore 8 | -Djavax.net.ssl.trustStore=/certs/truststore.p12 9 | -Djavax.net.ssl.trustStoreType=PKCS12 10 | -Djavax.net.ssl.trustStorePassword= 11 | ``` 12 | -------------------------------------------------------------------------------- /docs/training-participation/common/accessibility-feedback.md: -------------------------------------------------------------------------------- 1 | ## Feedback 2 | 3 | At SkillTree, we're committed to making our platform accessible to everyone. We regularly test our system using both 4 | automated tools and manual reviews. Your feedback is incredibly valuable to us! If you encounter any accessibility 5 | barriers or have suggestions for improvement, please don't hesitate to reach out. -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/ssl-props.md: -------------------------------------------------------------------------------- 1 | Configure ``https``: 2 | ```properties 3 | server.port=8443 4 | server.ssl.enabled=true 5 | server.ssl.key-store-type=PKCS12 6 | server.ssl.key-store=/path/to/keystore.p12 7 | server.ssl.key-store-password= 8 | 9 | # Force TLSv1.2 until https://bugs.openjdk.java.net/browse/JDK-8241248 is fixed 10 | server.ssl.enabled-protocols=TLSv1.2 11 | ``` 12 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/projects-screenshot.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![page-projects.png](../../../screenshots/admin/page-projects-not-root.png) 4 | 5 | 6 | 7 | 8 | 9 | ![page-projects.png](../../../screenshots/admin/page-projects.png) 10 | 11 | -------------------------------------------------------------------------------- /docs/.vuepress/components/ServiceUrl.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /docs/release-notes/README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | SkillTree produces two types of artifacts, here are the release notes for each: 4 | 5 | - [Dashboard and API](/release-notes/skills-service.html) 6 | - [Client Libraries](/release-notes/skills-client.html) 7 | 8 | 9 | 10 | To obtain deployable artifacts please visit [Distributions](/dashboard/install-guide/distributions.html) page. 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/skillsConfigurationHeader.md: -------------------------------------------------------------------------------- 1 | Step one is to globally configure the Skills client, we suggest including it in the application's entry point for single page 2 | applications, or as the first script tag import in multi-page applications. 3 | 4 | ::: warning Reminder 5 | SkillsConfiguration is a singleton and you only need to provide configuration information once per your application's 6 | runtime for single page applications. 7 | ::: 8 | -------------------------------------------------------------------------------- /docs/training-participation/common/accessibility-basic-nav.md: -------------------------------------------------------------------------------- 1 | - Use `Tab` to move forward through interactive elements 2 | - Use `Shift + Tab` to move backward 3 | - Press `Enter` or `Space` to activate buttons and links 4 | - Use arrow keys to navigate through menus and dropdowns 5 | - Use `Escape` to close modals and popups 6 | - Use `Alt + Left Arrow` to navigate to the previous page in the browser history 7 | - Use `Alt + Right Arrow` to navigate to the next page in the browser history -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/user-info-service-props-endpoints.md: -------------------------------------------------------------------------------- 1 | ```properties 2 | # To retrieve user info by DN 3 | skills.authorization.userInfoUri=https://:/userInfo?dn={dn} 4 | # Used by dashboard dropdowns to suggest existing users 5 | skills.authorization.userQueryUri=https://:/userQuery?query={query} 6 | # skills-service checks the health of User Info Service 7 | skills.authorization.userInfoHealthCheckUri=https://:/actuator/health 8 | ``` 9 | -------------------------------------------------------------------------------- /docs/skills-client/auth/authPKI.md: -------------------------------------------------------------------------------- 1 | 2 | If your platform is configured to run in [PKI Mode](/dashboard/install-guide/installModes.html#pki-auth-mode) then the user's id is derived from the certificate. 3 | No extra work is needed when integrating Skills Display and Skills reporting libraries. 4 | Please visit [PKI Mode](/dashboard/install-guide/installModes.html#pki-auth-mode) to learn more. 5 | 6 | ::: tip Important!! 7 | Please note that the Authentication Endpoint is not needed if you are running the dashboard in PKI mode. 8 | ::: 9 | -------------------------------------------------------------------------------- /docs/.vuepress/components/ReleaseDate.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /docs/.vuepress/dist 5 | *.iml 6 | 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | *.iml 11 | 12 | # Log files 13 | npm-debug.log* 14 | yarn-debug.log* 15 | yarn-error.log* 16 | 17 | # Editor directories and files 18 | .idea 19 | .vscode 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | package-lock.json 27 | /docs/.vuepress/public/img/average_accessibility_score.svg 28 | /docs/.vuepress/.cache 29 | /docs/.vuepress/.temp 30 | 31 | cypress/videos/** 32 | cypress/screenshots/** 33 | -------------------------------------------------------------------------------- /docs/.vuepress/components/SkillTreeVideos.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | 21 | 23 | 24 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/rte.md: -------------------------------------------------------------------------------- 1 | The editor offers the following features: 2 | 3 | 4 | 5 | ![Description Editor Image 1](../../../screenshots/admin/rich-text-editor-1.png) 6 | ![Description Editor Image 2](../../../screenshots/admin/rich-text-editor-2.png) 7 | ![Description Editor Image 3](../../../screenshots/admin/rich-text-editor-3.png) 8 | ![Description Editor Image 4](../../../screenshots/admin/rich-text-editor-4.png) 9 | ![Description Editor Image 5](../../../screenshots/admin/rich-text-editor-5.png) 10 | -------------------------------------------------------------------------------- /docs/.vuepress/components/RequiresRole.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 12 | 23 | -------------------------------------------------------------------------------- /docs/training-participation/common/accessibility-skip-to-content.md: -------------------------------------------------------------------------------- 1 | The "Skip to content" feature helps you quickly access the main content by bypassing repetitive navigation links. This button appears when you first press the `Tab` key on any page. 2 | 3 | To use this feature: 4 | 1. Press `Tab` when the page loads 5 | 2. The "Skip to content" button will appear in the top-left corner and be automatically selected 6 | 3. Press `Enter` to jump directly to the main content area 7 | 8 | ::: tip 9 | You can access this feature at any time by refreshing the page with `F5` and then pressing `Tab`. 10 | ::: -------------------------------------------------------------------------------- /docs/training-participation/common/screen-reader-support.md: -------------------------------------------------------------------------------- 1 | - Decorative images and icons are labeled to be skipped by screen readers 2 | - Many actions are announced to screen readers for better accessibility, this is in addition to the default announcements provided by the browser 3 | - All form fields have associated labels 4 | - Clicking on a form field label will focus the field 5 | - Required fields are clearly indicated 6 | - Error messages are announced by screen readers 7 | - Buttons have descriptive text 8 | - Interactive elements are keyboard accessible 9 | - Focus indicators are visible for keyboard navigation -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/two-way-ssl-props.md: -------------------------------------------------------------------------------- 1 | Configure ``https`` and 2-way SSL: 2 | ```properties 3 | server.port=8443 4 | server.ssl.enabled=true 5 | server.ssl.client-auth=want 6 | 7 | # Force TLSv1.2 until https://bugs.openjdk.java.net/browse/JDK-8241248 is fixed 8 | server.ssl.enabled-protocols=TLSv1.2 9 | 10 | # keystore 11 | server.ssl.key-store=/certs/keystore.p12 12 | server.ssl.key-store-password= 13 | server.ssl.keyStoreType=PKCS12 14 | 15 | # truststore 16 | server.ssl.trust-store=/certs/truststore.p12 17 | server.ssl.trust-store-password= 18 | server.ssl.trustStoreType=PKCS12 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsDisplayArguments.md: -------------------------------------------------------------------------------- 1 | | Prop | Type | Explanation | 2 | | ------------- |:------------ |:-------------| 3 | | version | Number | *(Optional)* version to use in [Skills Versioning](/dashboard/user-guide/skills.html#skills-versioning) paradigm | 4 | | options | Object | *(Optional)* options object to control various behaviors of skills-display. See [Skills Display Options Object](#skills-display-options-object) 5 | | theme | Object | *(Optional)* theme object to customize colors. See [Skills Display Theme Object](#skills-display-theme-object) 6 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 18 | 19 | 29 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/inception.md: -------------------------------------------------------------------------------- 1 | # Inception 2 | 3 | Inception is a special project within the dashboard that gamifies training for the dashboard itself. 4 | All the dashboard users will have a button on the top right of the application which navigates to your skills profile for the Inception project. 5 | This button will also display your current level standing. 6 | 7 | ![SkillTree Inception](../../screenshots/admin/page-inception.png) 8 | 9 | The Inception project by default is owned and managed by any Root Administrator of the dashboard. Root Administrators have the ability to add other users as administrators of the Inception project. 10 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | SkillTree Docs 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![SkillTree](logos/skilltree_logo.png) 2 | # SkillTree Docs 3 | SkillTree is an innovative approach to implementing application training. 4 | 5 | These docs are hosted on GitHub Pages. Please visit https://code.nsa.gov/skills-docs 6 | 7 | ## Commands 8 | 9 | To develop: 10 | 11 | ``` 12 | npm run docs:dev 13 | ``` 14 | To Build 15 | ``` 16 | npm run docs:build 17 | ``` 18 | 19 | # Workflows Status 20 | 21 | [![CI Badge](https://github.com/NationalSecurityAgency/skills-docs/workflows/Publish%20SkillTree%20Docs/badge.svg)](https://github.com/NationalSecurityAgency/skills-docs/actions?query=workflow%3A%22Publish+SkillTree+Docs%22) 22 | 23 | -------------------------------------------------------------------------------- /docs/.vuepress/components/Conditional.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | 21 | 24 | 25 | 28 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/activity-history.md: -------------------------------------------------------------------------------- 1 | Activity History includes the following fields: 2 | 3 | - **User**: the user who performed the action 4 | - **Action**: the type of change made by the user (e.g., Create, Edit, Delete) 5 | - **Item**: the item that was modified 6 | - **Item ID**: the identifier of the modified item (e.g., Quiz ID) 7 | - **Performed**: the date when the change was made 8 | - **Additional Attributes**: additional fields that can be expanded to view more details 9 | 10 | You can sort the Activity History by user, action, item, item ID, and performed fields. Additionally, you can filter the Activity History by user, action, item, and item ID. -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/videos-intro.md: -------------------------------------------------------------------------------- 1 | You can either embed externally hosted videos or upload videos directly to SkillTree. 2 | 3 | - **SkillTree Hosted**: Upload videos using the file-upload form (Browse button) or by drag-and-dropping video files 4 | - SkillTree supports the following video formats: 5 | - [WebM](https://www.webmproject.org/about/) - A free video format specifically created for the web 6 | - [MP4](https://en.wikipedia.org/wiki/MP4_file_format) - A common video format often used in web applications 7 | - **Externally Hosted**: Enter a URL that points to a video hosted on another web server (e.g., `https://example.com/video.mp4`) 8 | -------------------------------------------------------------------------------- /docs/.vuepress/components/videos/SkillTreeVideo.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /docs/.vuepress/components/Since.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 32 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/js/clientConfig.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | ``` js 10 | SkillsConfiguration.afterConfigure() 11 | .then(() => { 12 | // SkillsConfiguration.configure has been called 13 | }); 14 | 15 | axios.get('my/configuration/endpoint') 16 | .then((result) => { 17 | SkillsConfiguration.configure(result.data); 18 | }); 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/ng/configExampleForm.md: -------------------------------------------------------------------------------- 1 | ::: danger Stop 2 | 3 | ***SkillsConfiguration.logout()*** must be called when a user logs out of your 4 | application. SkillsConfiguration caches the authenticator end point which is more 5 | than likely specific to the currently logged in user. 6 | ::: 7 | 8 | ``` js 9 | import { SkillsConfiguration } from '@skilltree/skills-client-ng'; 10 | 11 | SkillsConfiguration.configure({ 12 | serviceUrl: 'http://localhost:8080', 13 | projectId: 'your-project-id', 14 | authenticator: 'http:///api/users/user1/token', 15 | }); 16 | 17 | . . . . 18 | 19 | // User logs out 20 | logoutButton.onClick(() => { 21 | // VERY IMPORTANT 22 | SkillsConfiguration.logout(); 23 | }); 24 | ``` 25 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/react/configExampleForm.md: -------------------------------------------------------------------------------- 1 | ::: danger Stop 2 | 3 | ***SkillsConfiguration.logout()*** must be called when a user logs out of your 4 | application. SkillsConfiguration caches the authenticator end point which is more 5 | than likely specific to the currently logged in user. 6 | ::: 7 | 8 | ``` js 9 | import { SkillsConfiguration } from '@skilltree/skills-client-react'; 10 | 11 | SkillsConfiguration.configure({ 12 | serviceUrl: 'http://localhost:8080', 13 | projectId: 'your-project-id', 14 | authenticator: 'http:///api/users/user1/token', 15 | }); 16 | 17 | . . . . 18 | 19 | // User logs out 20 | logoutButton.onClick(() => { 21 | // VERY IMPORTANT 22 | SkillsConfiguration.logout(); 23 | }); 24 | ``` 25 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/vuejs/configExampleForm.md: -------------------------------------------------------------------------------- 1 | ::: danger Stop 2 | 3 | ***SkillsConfiguration.logout()*** must be called when a user logs out of your 4 | application. SkillsConfiguration caches the authenticator end point which is more 5 | than likely specific to the currently logged in user. 6 | ::: 7 | 8 | ``` js 9 | import { SkillsConfiguration } from '@skilltree/skills-client-vue'; 10 | 11 | SkillsConfiguration.configure({ 12 | serviceUrl: 'http://localhost:8080', 13 | projectId: 'your-project-id', 14 | authenticator: 'http:///api/users/user1/token', 15 | }); 16 | 17 | . . . . 18 | 19 | // User logs out 20 | logoutButton.onClick(() => { 21 | // VERY IMPORTANT 22 | SkillsConfiguration.logout(); 23 | }); 24 | ``` 25 | -------------------------------------------------------------------------------- /docs/.vuepress/components/ExternalUrl.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | -------------------------------------------------------------------------------- /cypress/support/e2e.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | import "cypress-real-events/support"; 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /docs/.vuepress/components/HomePage.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | 28 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/ng/clientConfig.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | ``` js{3-6} 10 | import { SkillsConfiguration } from '@skilltree/skills-client-ng'; 11 | 12 | SkillsConfiguration.afterConfigure() 13 | .then(() => { 14 | // SkillsConfiguration.configure has been called 15 | }); 16 | 17 | axios.get('my/configuration/endpoint') 18 | .then((result) => { 19 | SkillsConfiguration.configure(result.data); 20 | }); 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/.vuepress/components/home/RapidIntegrationSection.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 22 | 23 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/vuejs/clientConfig.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | ``` js{3-6} 10 | import { SkillsConfiguration } from '@skilltree/skills-client-vue'; 11 | 12 | SkillsConfiguration.afterConfigure() 13 | .then(() => { 14 | // SkillsConfiguration.configure has been called 15 | }); 16 | 17 | axios.get('my/configuration/endpoint') 18 | .then((result) => { 19 | SkillsConfiguration.configure(result.data); 20 | }); 21 | ``` 22 | -------------------------------------------------------------------------------- /.github/workflows/scripts/move-screenshots.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | IN_DIR="cypress/screenshots/" 4 | OUT_DIR="docs/screenshots" 5 | 6 | rm -rf ${OUT_DIR} 7 | mkdir -p ${OUT_DIR} 8 | 9 | function getDir { 10 | filePath=$1; 11 | parentPath="$(dirname $filePath)"; 12 | parentName=${parentPath##*/}; 13 | updatedDocName=${parentName/'.js'/''} 14 | getDirRes="${updatedDocName}"; 15 | } 16 | 17 | function getFile { 18 | filePath=$1; 19 | fileName="$(basename "$filePath")" 20 | updatedFileName=${fileName/'.snap'/''} 21 | getFileRes="${updatedFileName}"; 22 | } 23 | 24 | 25 | for f in $(find ${IN_DIR} -depth -name "*.png"); do 26 | getDir $f; 27 | getFile $f; 28 | 29 | DIR_PATH="${OUT_DIR}/${getDirRes}" 30 | FILE_PATH="${DIR_PATH}/${getFileRes}" 31 | 32 | mkdir -p "$DIR_PATH"; 33 | mv "$f" "$FILE_PATH"; 34 | done 35 | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/react/clientConfig.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | ``` js{3-6} 10 | import { SkillsConfiguration } from '@skilltree/skills-client-react'; 11 | 12 | SkillsConfiguration.afterConfigure() 13 | .then(() => { 14 | // SkillsConfiguration.configure has been called 15 | }); 16 | 17 | axios.get('my/configuration/endpoint') 18 | .then((result) => { 19 | SkillsConfiguration.configure(result.data); 20 | }); 21 | ``` 22 | e 23 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/notifications.md: -------------------------------------------------------------------------------- 1 | # Notifications 2 | 3 | Unobtrusive alerts are displayed via the drop-down in the top right corner of the dashboard. These notifications 4 | are time-based, non-intrusive, and easily dismissed. 5 | 6 | ![component-notifications-btn.png](../../screenshots/admin/component-notifications-btn.png) 7 | 8 | Clicking the alert drop-down will display the notifications. 9 | 10 | ![component-notifications.png](../../screenshots/admin/component-notifications-dropdown.png) 11 | 12 | A single notification can be dismissed by clicking the "Dismiss" button next to it. All notifications can be dismissed 13 | by clicking the "Dismiss All" button. Once notifications are dismissed, they will no longer appear on the dashboard. 14 | 15 | Current alerts notify users about new SkillTree releases and features. Additional notification types may be added in the future. 16 | -------------------------------------------------------------------------------- /docs/skills-client/auth/endpointParamsForm.md: -------------------------------------------------------------------------------- 1 | 2 | | Parameter | Explanation | 3 | | ------------- | -------------| 4 | | userId | *(optional)* Report skill event on behalf of another user **(must be an admin of the project)**. | 5 | | timestamp | *(optional)* Report skill event in the past **(must be an admin of the project)**. | 6 | | notifyIfSkillNotApplied | *(optional)* If set to ```true```, notify all client global event handlers even if the reported skill is not applied. Defaults to ```false```. | 7 | 8 | Here is an example JSON payload for reporting a skill event for another user in the past: 9 | 10 | ```json 11 | { 12 | "userId":"valueForUserId", 13 | "timestamp":1581349194294, 14 | "notifyIfSkillNotApplied": false 15 | } 16 | ``` 17 | 18 | ::: warning Keep In Mind 19 | Only a project admin is allowed to supply ``userId`` and ``timestamp``. 20 | ::: -------------------------------------------------------------------------------- /docs/skills-client/auth.md: -------------------------------------------------------------------------------- 1 | # Authentication 2 | 3 | 4 | 5 | Authentication depends on the [Installation Mode](/dashboard/install-guide/installModes.html#password-auth-mode), please make sure to select 6 | the tab below based on your specific installation mode. 7 | - In [Password Auth Mode](/dashboard/install-guide/installModes.html#passwordauth-mode): Production based installation will require you to implement an authentication endpoint. The goal of the endpoint is to authenticate a specific user so that the skills display and skills reporting can be properly secured. 8 | - In [PKI Mode](/dashboard/install-guide/installModes.html#pki-auth-mode): User's id is derived implicitly from the certificate, an **authentication endpoint is not required** 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/prod-install-basic-config.md: -------------------------------------------------------------------------------- 1 | Here is a minimum required list of configurations in order to run production-grade skills-service instance(s). 2 | Please visit the [Configuration](/dashboard/install-guide/config.html) section to learn how to configure skills-service. 3 | Each skills-service instance should be configured with the following: 4 | 5 | DB configs: 6 | ```properties 7 | spring.datasource.url=jdbc:postgresql://:5432/skills 8 | spring.datasource.username= 9 | spring.datasource.password= 10 | ``` 11 | 12 | WebSocket Stomp: 13 | ```properties 14 | skills.websocket.enableStompBrokerRelay=true 15 | skills.websocket.relayHost= 16 | skills.websocket.relayPort= 17 | ``` 18 | 19 | Store HttpSession in JDBC: 20 | ```properties 21 | spring.session.store-type=jdbc 22 | spring.session.jdbc.initialize-schema=always 23 | ``` 24 | 25 | Keystore for JWT: 26 | ```properties 27 | security.oauth2.jwt.useKeystore=true 28 | ``` 29 | -------------------------------------------------------------------------------- /docs/.vuepress/components/home/InfoCards.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 27 | 28 | -------------------------------------------------------------------------------- /docs/.vuepress/components/home/UserDisplaySection.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 24 | 25 | -------------------------------------------------------------------------------- /INTENT.md: -------------------------------------------------------------------------------- 1 | ## Licensing Intent 2 | 3 | The intent is that this software and documentation ("Project") should be treated 4 | as if it is licensed under the license associated with the Project ("License") 5 | in the LICENSE file. However, because we are part of the United States (U.S.) 6 | Federal Government, it is not that simple. 7 | 8 | The portions of this Project written by U.S. Federal Government employees within 9 | the scope of their federal employment are ineligible for copyright protection in 10 | the U.S.; this is generally understood to mean that these portions of the 11 | Project are placed in the public domain. 12 | 13 | In countries where copyright protection is available (which does not include the 14 | U.S.), contributions made by U.S. Federal Government employees are released 15 | under the License. Merged contributions from private contributors are released 16 | under the License. 17 | 18 | The SkillTree software is released under the Apache License, Version 2.0 19 | ("Apache 2.0"). -------------------------------------------------------------------------------- /docs/.vuepress/components/home/VueDocsSection.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/contact-admins.md: -------------------------------------------------------------------------------- 1 | # Contact Admins 2 | 3 | The Contact Admins page allows root users to communicate with all Project Administrators in this instance of SkillTree. 4 | 5 | ::: warning Important 6 | This feature will only be enabled if the necessary [email configuration](/dashboard/user-guide/settings.html#email-notifications) properties have been set for this instance 7 | of SkillTree 8 | ::: 9 | 10 | ![SkillTree Issues](../../screenshots/admin/page-contact_proj_admins.png) 11 | 12 | Once a Root user has crafted an email, the content of the email can be be previewed using the ````Preview```` button which 13 | will send the specified email to the currently authenticated user to preview the content/formatting/display. Once satisfied, 14 | pressing the ```Email``` button will send the specified email to all users of this instance of SkillTree who have the Project Administrator 15 | role. 16 | 17 | ::: tip 18 | The email body supports markdown 19 | ::: 20 | -------------------------------------------------------------------------------- /CONTRIBUTING_IO.md: -------------------------------------------------------------------------------- 1 | 2 | ## Legal 3 | 4 | Consistent with Section D.6. of the GitHub Terms of Service as of 2019, and Section 5. of the Apache License, Version 2.0, the project maintainer for this project accepts contributions using the inbound=outbound model. 5 | When you submit a pull request to this repository (inbound), you are agreeing to license your contribution under the same terms as specified in [LICENSE] (outbound). 6 | 7 | This is an open source project. 8 | Contributions you make to this public U.S. Government ("USG") repository are completely voluntary. 9 | When you submit an issue, bug report, question, enhancement, pull request, etc., you are offering your contribution without expectation of payment, you expressly waive any future pay claims against the USG related to your contribution, and you acknowledge that this does not create an obligation on the part of the USG of any kind. 10 | Furthermore, your contributing to this project does not create an employer-employee relationship between the United States ("U.S.") Government and the contributor. 11 | 12 | [LICENSE]: LICENSE.txt -------------------------------------------------------------------------------- /docs/dashboard/install-guide/distributions.md: -------------------------------------------------------------------------------- 1 | # Distributions 2 | 3 | There are two categories of SkillTree artifacts: 4 | 5 | 1. SkillTree Centralized Service (``skills-service``) - SkillTree dashboard and API 6 | 2. Client libraries - Native JS libraries used by the SkillTree integrated applications as well as legacy libraries 7 | 8 | You can find release notes [here](/release-notes/). 9 | 10 | ## SkillTree Centralized Service 11 | 12 | There are two official types of distributions: 13 | 14 | - Jar-based: hosted on 15 | - Docker: hosted on 16 | 17 | ## Client Libraries Distributions 18 | 19 | Client libraries hosted on : 20 | 21 | 22 | 23 | - [Native JS Client Library](https://www.npmjs.com/package/@skilltree/skills-client-js) 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/service-install-output-and-backend.md: -------------------------------------------------------------------------------- 1 | Your output will look something like this (the majority of the output was omitted for brevity): 2 | ``` 3 | . ____ _ __ _ _ 4 | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ 5 | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 6 | \\/ ___)| |_)| | | | | || (_| | ) ) ) ) 7 | ' |____| .__|_| |_|_| |_\__, | / / / / 8 | =========|_|==============|___/=/_/_/_/ 9 | :: Spring Boot :: (vX.X.X.RELEASE) 10 | ... 11 | ... 12 | ... 13 | 2020-07-16 19:43:01.129 INFO 9103 --- [ main] o.s.m.s.b.SimpleBrokerMessageHandler : Started. 14 | 2020-07-16 19:43:01.189 INFO 9103 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 15 | 2020-07-16 19:43:01.192 INFO 9103 --- [ main] skills.SpringBootApp : Started SpringBootApp in 20.159 seconds (JVM running for 21.368) 16 | ``` 17 | 18 | The dashboard is now running on [http://localhost:8080](http://localhost:8080). 19 | 20 | Well... that's it! 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/.vuepress/styles/index.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | --vp-c-accent: #163f2c; 3 | 4 | --content-width: 1200px; 5 | --homepage-width: 1200px; 6 | 7 | } 8 | 9 | [data-theme='dark'] { 10 | --vp-c-accent: #ddfaee; 11 | } 12 | 13 | .st-home-button { 14 | display: inline-block; 15 | box-sizing: border-box; 16 | padding: 0.5rem 1.5rem; 17 | border-radius: 8px; 18 | background-color: #198754 !important; 19 | color: white !important; 20 | font-size: 1.2rem; 21 | text-decoration: none !important; 22 | } 23 | 24 | .st-home-button:hover { 25 | background-color: #2d7853; 26 | } 27 | 28 | .st-text-uppercase { 29 | text-transform: uppercase; 30 | } 31 | 32 | .st-flex-row { 33 | display: flex; 34 | gap: 3rem; 35 | } 36 | 37 | @media (max-width: 750px) { 38 | .st-flex-row { 39 | flex-direction: column; 40 | gap: 1rem; 41 | } 42 | } 43 | 44 | .st-mt-2rem { 45 | margin-top: 2rem; 46 | } 47 | 48 | .st-mt-3rem { 49 | margin-top: 3rem; 50 | } 51 | 52 | .token.comment { 53 | color: #dfdede; 54 | } 55 | .token.keyword { 56 | color: #afd6e6; 57 | } 58 | .token.number { 59 | color: #ecc3e4; 60 | } -------------------------------------------------------------------------------- /docs/.vuepress/components/home/HomePageHeader.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | -------------------------------------------------------------------------------- /.github/workflows/verify-build.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2020 SkillTree 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Verify Docs Build 16 | 17 | on: 18 | push: 19 | branches: 20 | - '**' # matches every branch 21 | - '!master' # excludes master 22 | 23 | jobs: 24 | 25 | build-and-deploy: 26 | runs-on: ubuntu-latest 27 | 28 | steps: 29 | - uses: actions/checkout@v4 30 | 31 | - uses: actions/setup-node@v4 32 | with: 33 | node-version: '20.17.0' 34 | 35 | - name: npm install 36 | run : npm install 37 | 38 | - name: build docs 39 | run: npm run docs:build 40 | -------------------------------------------------------------------------------- /docs/skills-client/auth/endpointParamsPKI.md: -------------------------------------------------------------------------------- 1 | 2 | | Parameter | Explanation | 3 | | ------------- |----------------------------------------------------------------------------------------------------------------------------------------------------| 4 | | userId | *(optional)* User certificate's **Distinguished Name (DN)** to report skill event on behalf of another user **(must be an admin of the project)**. | 5 | | timestamp | *(optional)* Report skill event in the past **(must be an admin of the project)**. | 6 | | notifyIfSkillNotApplied | *(optional)* If set to ```true```, notify all client global event handlers even if the reported skill is not applied. Defaults to ```false```. | 7 | 8 | Here is an example JSON payload for reporting a skill event for another user in the past: 9 | 10 | ```json 11 | { 12 | "userId":"cn=aaa@email.foo, ou=integration tests, o=skilltree test, c=us", 13 | "timestamp":1581349194294, 14 | "notifyIfSkillNotApplied": false 15 | } 16 | ``` 17 | -------------------------------------------------------------------------------- /docs/skills-client/auth/endpointsFormPKI.md: -------------------------------------------------------------------------------- 1 | In [Password Auth Installation](/dashboard/install-guide/installModes.html#passwordauth-mode), the OAuth2 protocol is utilized, you will need to: 2 | 1. retrieve user specific temporary client token 3 | - using project's ```Client ID``` and ```Client Secret``` (found in the dashboard under ```Project -> Access -> 'Trusted Client Properties'``` ). 4 | - ``user-to-proxy-for`` is provided in the request (this is the ``user id``). 5 | - result token encapsulates the ``user id`` so the service will know what user to perform this action for 6 | 1. call the endpoint and set the user token on the request. 7 | 8 | Here is a CURL based example: (please substitute your values of ``client-id``, ``client-secret``, ``dashboard-url`` and ``user-to-proxy-for``): 9 | 10 | ```bash 11 | curl client-id:client-secret@dashboard-url/oauth/token -d "grant_type=client_credentials&proxy_user=user-to-proxy-for" 12 | ``` 13 | 14 | and then (please substitute your values of ``access_token_from_first_call``, ``dashboard-url``): 15 | ```bash 16 | curl -H "Authorization: Bearer access_token_from_first_call" http://dashboard-url/api/projects/FirstProject/level 17 | ``` 18 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/contact-project-users.md: -------------------------------------------------------------------------------- 1 | # Contact Users 2 | 3 | A Project's Contact Users page gives Project Administrators the ability to communicate with the users of their project 4 | based off a variety of different filters. 5 | 6 | ::: warning Important 7 | This feature will only be enabled if the necessary [email configuration](/dashboard/user-guide/settings.html#email-notifications) properties have been set for this instance 8 | of SkillTree 9 | ::: 10 | 11 | ![SkillTree Issues](../../screenshots/admin/page-project-notify_users.png) 12 | 13 | Up to 15 different filters can be combined to target users of your project based on the achievement of levels across the Project/Subjects as well as the achievement specific Badges and Skills or the 14 | lack of achievement of specific Skills. 15 | 16 | Once a Project Administrator has selected the desired filters, they can create an email that can be sent to the selected users. The 17 | specified email can also be previewed using the ```Preview``` button. This will send the specified email to the currently authenticated 18 | user so that formatting, content, and display can be validated. 19 | 20 | ::: tip 21 | The email body supports markdown 22 | ::: 23 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/services-explanations.md: -------------------------------------------------------------------------------- 1 | **1: Clustered deployment of ``skills-service``** for high-availability and higher throughput 2 | - Route requests through a load balancer 3 | 4 | **2: Database** - We currently only support for a production-grade install 5 | - Make sure to install in high-availability mode 6 | - 's installation, setup and management is beyond the scope of this section, please visit . 7 | 8 | **3: WebSocket Stomp Brokers** 9 | - Some options include or 10 | - Make sure to configure high-availability setup 11 | - 's installation: 12 | - Docker based: 13 | - Native install: 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "skills-docs", 3 | "version": "0.1.0", 4 | "license": "Apache-2.0", 5 | "description": "SkillTree Docs", 6 | "author": "SkillTree Team", 7 | "scripts": { 8 | "licenseDepCheck": "license-checker --production --onlyAllow='MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC' --summary", 9 | "docs:dev": "vuepress dev docs", 10 | "docs:build": "npm run licenseDepCheck && vuepress build docs", 11 | "build": "npm run docs:build", 12 | "serve": "npm run docs:dev", 13 | "wait:skills-service": "npx wait-on -t 160000 http://localhost:8080/public/isAlive", 14 | "cy:open": "cypress open --env updateSnapshots=true", 15 | "cy:run": "cypress run --env updateSnapshots=true", 16 | "cy:run:single": "cypress run --env updateSnapshots=true --spec \"cypress/integration/admin.js\"" 17 | }, 18 | "dependencies": { 19 | "vue": "3.5.17" 20 | }, 21 | "devDependencies": { 22 | "@vuepress/bundler-vite": "2.0.0-rc.19", 23 | "@vuepress/plugin-register-components": "2.0.0-rc.66", 24 | "@vuepress/plugin-search": "2.0.0-rc.70", 25 | "@vuepress/theme-default": "2.0.0-rc.69", 26 | "cypress": "14.5.1", 27 | "cypress-real-events": "1.14.0", 28 | "license-checker": "25.0.1", 29 | "sass-embedded": "1.89.2", 30 | "vuepress": "2.0.0-rc.19" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - build 3 | - deploy 4 | 5 | build: 6 | image: node:9.11.1 7 | stage: build 8 | script: 9 | - npm install 10 | - npm run docs:build 11 | artifacts: 12 | paths: 13 | - docs/.vuepress/ 14 | 15 | deploy: 16 | image: alpine:latest 17 | stage: deploy 18 | before_script: 19 | - apk --update --no-cache add sshpass openssh git 20 | script: 21 | - git clone https://${GITLAB_DEPLOY_USERNAME}:${GITLAB_DEPLOY_PASSWORD}@gitlab.evoforge.org/skills/skills-deploy.git 22 | - TIMESTAMP=`date +%s` 23 | - TMP_DIR="deployDocs_${TIMESTAMP}" 24 | - DEST_PATH="/home/${CI_USERNAME}/$TMP_DIR" 25 | - sshpass -p $CI_PASSWORD ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o PubkeyAuthentication=no $CI_USERNAME@$CI_IP "rm -rf /home/${CI_USERNAME}/deployDocs_* && mkdir -p ${DEST_PATH}" 26 | - sshpass -p $CI_PASSWORD scp -r skills-deploy ${CI_USERNAME}@${CI_IP}:${DEST_PATH} 27 | - sshpass -p $CI_PASSWORD scp -r docs/.vuepress/dist ${CI_USERNAME}@${CI_IP}:${DEST_PATH}/skills-deploy/skills-docs 28 | - sshpass -p $CI_PASSWORD ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o PubkeyAuthentication=no $CI_USERNAME@$CI_IP "cd ${DEST_PATH}/skills-deploy/skills-docs && ./deployDocs.sh" 29 | only: 30 | - master 31 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/slide-deck.md: -------------------------------------------------------------------------------- 1 | ![component-slides-config-empty.png](../../../screenshots/admin/component-slides-config-empty.png) 2 | 3 | To upload slides from your computer, click the Browse button or drag and drop a file into the upload area. For externally 4 | hosted slides, click "Switch to External Link" and enter the file's URL. Don't forget to click "Save and Preview" to 5 | save your changes. 6 | 7 | A preview will appear in the Preview section once configured. 8 | 9 | ![component-slides-config-with-slides.png](../../../screenshots/admin/component-slides-config-with-slides.png) 10 | 11 | The built-in slide viewer offers: 12 | - Intuitive navigation between slides 13 | - PDF download capability 14 | - Full-screen presentation mode 15 | - Slide resizing (drag the bottom-right corner) 16 | 17 | ::: tip 18 | Resize slides by dragging the handle in the bottom-right corner. Click "Save Changes" to apply the new dimensions. 19 | Trainees can also adjust slide sizes to their preference. These custom settings are automatically saved in the browser's local storage and will override the default dimensions. 20 | ::: 21 | 22 | In **full-screen mode**, users can: 23 | - Navigate using `left`/`right` arrow keys 24 | - Access navigation controls by hovering near the bottom 25 | - Exit using the `Escape` key or the exit button in the navigation controls -------------------------------------------------------------------------------- /docs/skills-client/common/skillsReporter/reporterConfiguration.md: -------------------------------------------------------------------------------- 1 | The SkillReporter object allows for overriding the default behavior if required via the `configure()` method. 2 | 3 | The `configure()` method supports the following parameters: 4 | 5 | | Prop | Explanation | 6 | | ------------- | ----------- | 7 | | notifyIfSkillNotApplied | if set to true, invoke global success handler(s) even when a reported skill has not been applied. See Global Event Handling. | 8 | | retryInterval | If an error occurs when reporting a skill, the SkillsReporter will attempt to retry reporting the skill at a later time. This property allows you to set the time in milliseconds for how often a skill that failed to be reported will be retried. default is ``60000`` (every 60 seconds) | 9 | | maxRetryQueueSize | The maximum number of failed reported skill attempts that will be queued and retried. default is ``1000`` | 10 | | maxRetryAttempts | The maximum number of retry attempts for a given skillId before the SkillsReporter will no longer retry to report that skillId. default is ``1400`` | 11 | 12 | 13 | Below is an example of how to configure the SkillsReporter to only retry up to 100 failed reported skill attempts, and to retry every 5 minutes. 14 | ``` js{9-10} 15 | SkillsReporter.configure({ 16 | retryInterval: 300000, 17 | maxRetryQueueSize: 100, 18 | }); 19 | ``` -------------------------------------------------------------------------------- /docs/dashboard/user-guide/admin-groups.md: -------------------------------------------------------------------------------- 1 | # Admin Groups 2 | 3 | Admin Groups streamline the ability to manage a list of administrators for one or more projects, quizzes and global badges 4 | Once an Admin Group is created you can easily add and remove members to and from the group. A group can then be assigned to one or more projects, quizzes, or global badges 5 | which then allows the members of the group to have administrative privileges to the assigned projects, quizzes and global badges. 6 | 7 | To create an admin group please navigate to the ``Admin Groups`` page and then click the ``Admin Group +`` button. 8 | 9 | ![page-admin-groups.png](../../screenshots/admin/page-admin-groups.png) 10 | 11 | To assign a group to a project please navigate to ``Adming Groups -> Projects`` then select one of the existing projects from the dropdown. 12 | 13 | ![page-admin-groups-projects.png](../../screenshots/admin/page-admin-groups-projects.png) 14 | 15 | To assign a group to a quiz please navigate to ``Adming Groups -> Quizzes`` then select one of the existing quizzes from the dropdown. 16 | 17 | ![page-admin-groups-quizzes.png](../../screenshots/admin/page-admin-groups-quizzes.png) 18 | 19 | To assign a group to a global badge please navigate to ``Adming Groups -> Global Badges`` then select one of the existing global badges from the dropdown. 20 | 21 | ![page-admin-groups-global-badges.png](../../screenshots/admin/page-admin-groups-global-badges.png) 22 | -------------------------------------------------------------------------------- /docs/.vuepress/components/home/DashboardSection.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 36 | 37 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/videos-configure.md: -------------------------------------------------------------------------------- 1 | ![Video Config Page](../../../screenshots/admin/page-video-config.png) 2 | 3 | The only required field is `Video` and once the video is configured it will be presented on the training page above the skill's description. 4 | 5 | To upload a video from your computer you can click on the `Browse` button or `drag-n-drop` a video file into the video input box. 6 | To configure an externally hosted video click on the `Switch to External Link` button and then enter the URL that points to the externally hosted video. 7 | Please do not forget to click `Save and Preview` button to persist the changes. 8 | 9 | To make the video accessible, the settings page offers the ability to specify `Captions` and `Transcript` values. 10 | When captions are configured the video player will present an option to turn captions on or off. 11 | Captions utilize [Web Video Text Tracks Format (WebVTT)](https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API) format 12 | and its input form offers an ability to prefill an example in WebVTT format by clicking `Add Example` button above the `Captions` input field. 13 | 14 | ::: tip 15 | Configure the video size by dragging the button on the bottom-right corner of the video. After resizing, click the 16 | **Save Changes** button to persist the new dimensions. 17 | 18 | Trainees can also resize videos, and their personalized configurations will be automatically saved in the browser's 19 | local storage and will take priority over the default. 20 | ::: 21 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/icons.md: -------------------------------------------------------------------------------- 1 | # Icons 2 | 3 | The skills platform offers customization of icons for the following items: 4 | 5 | - [Subjects](/dashboard/user-guide/subjects.html) 6 | - [Skills](/dashboard/user-guide/skills.html) 7 | - [Badges](/dashboard/user-guide/badges.html) 8 | - [Global Badges](/dashboard/user-guide/global-badges.html) 9 | 10 | When creating or editing these items you can click on the default icon to bring up the icon selector: 11 | 12 | ![Select Icon](../../screenshots/admin/modal-edit-subjectIcon.png) 13 | 14 | The icon selector supports 2 icon packs: 15 | 16 | - 17 | - 18 | 19 | ::: tip 20 | To provide consistent branding, use the same icon packs for all of your items 21 | ::: 22 | 23 | ## Custom Icons 24 | 25 | The project administrator can upload their own custom images to be used as icons. Supported formats are: 26 | 27 | - 28 | - 29 | - 30 | - 31 | 32 | For the best user experience within the Client Display, custom icons are also constrained to: 33 | 34 | - square proportion 35 | - minimum of 48px X 48px 36 | - maximum of 100px X 100px 37 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/devInstall.md: -------------------------------------------------------------------------------- 1 | # Development Installation 2 | 3 | SkillTree's ``skills-service`` is configured with smart defaults and will work out-of-the-box, with 4 | the one exception that SkillTree requires that a properly configured PostgreSQL database be available. 5 | 's installation, setup and management is beyond the scope of this section, please visit . 6 | 7 | :::tip 8 | Please note that all of these example run in the [Password Auth Mode](/dashboard/install-guide/installModes.html#password-auth-mode). 9 | Please visit [PKI Auth Mode](/dashboard/install-guide/installModes.html#pki-auth-mode) if you are interested in that mode. However, definitely use the [Password Auth Mode](/dashboard/install-guide/installModes.html#password-auth-mode) if you are not sure which mode is applicable to you. 10 | ::: 11 | 12 | ## Docker Distribution Dev Install Examples 13 | 14 | Run ``skills-service`` with PostgreSQL: 15 | ```bash 16 | docker run --name skills-service -d -p 8080:8080 \ 17 | -e SPRING_PROPS="\ 18 | spring.datasource.url=jdbc:postgresql://:5432/skills,\ 19 | spring.datasource.username=,\ 20 | spring.datasource.password=" \ 21 | skilltree/skills-service: 22 | ``` 23 | 24 | ## Jar-Based distribution development installation 25 | 26 | Run ``skills-service`` with PostgreSQL: 27 | ```bash 28 | java -jar ~/Downloads/skills-service-X.X.X.jar \ 29 | --spring.datasource.url=jdbc:postgresql://:5432/skills \ 30 | --spring.datasource.username= \ 31 | --spring.datasource.password= 32 | ``` 33 | 34 | -------------------------------------------------------------------------------- /DISCLAIMER.md: -------------------------------------------------------------------------------- 1 | # Disclaimer of Warranty 2 | 3 | This Work is provided "AS IS." 4 | Any express or implied warranties, including but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. 5 | In no event shall the United States Government be liable for any direct, indirect, incidental, special, exemplary or consequential damages (including, but not limited to, procurement of substitute goods or services, loss of use, data or profits, or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Work, even if advised of the possibility of such damage. 6 | 7 | The User of this Work agrees to hold harmless and indemnify the United States Government, its agents and employees from every claim or liability (whether in tort or in contract), including attorney's fees, court costs, and expenses, arising in direct consequence of Recipient's use of the item, including, but not limited to, claims or liabilities made for injury to or death of personnel of User or third parties, damage to or destruction of property of User or third parties, and infringement or other violations of intellectual property or technical data rights. 8 | 9 | # Disclaimer of Endorsement 10 | 11 | Nothing in this Work is intended to constitute an endorsement, explicit or implied, by the United States Government of any particular manufacturer's product or service. 12 | 13 | Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, in this Work does not constitute an endorsement, recommendation, or favoring by the United States Government and shall not be used for advertising or product endorsement purposes. 14 | -------------------------------------------------------------------------------- /diagrams_work/skills-catalog.drawio: -------------------------------------------------------------------------------- 1 | 5VtRd6I4FP41PnYOJIL0sdruzsy253SPD7szbxECMkXCxlhxfv0GCWIMUdoRCoztA7mECN93782XXBzB2Sr9k6Jk+UQ8HI2A4aUjeD8CwDQBGGX/hrfLLbfQzg0BDT3RqTTMw59YGA1h3YQeXksdGSERCxPZ6JI4xi6TbIhSspW7+SSSvzVBAVYMcxdFqvWf0GPL3OpYRmn/jMNgWXyzaYgzK1R0Fob1Enlke2SCDyM4o4Sw/GiVznCUgVfgkl/3h+bs4cYojlmdC5LV89///fWYPn12XoyvN1+d7+78RozyiqKNeGBxs2xXIMBH4WDzxpQ/QZIZ3Yhs+KDT7TJkeJ4gNzNuOf/ctmSriLdMfuiHUTQjEaH7caCHsOO72TCMkhd8dMZ2Hbzw+RlxM5gynGqf0jxgx50OkxVmdMe7iAvArYBb+JtZwL8t2eP05bblMXO26IiExwSHsUtQ+YHA9Q0YOwrGOE0IZSrSHnc90eTnlyQgMYoeSuuUkk3s4ezLDN4q+zwSkgjUf2DGdiKO0IYRmROchuzfo+Nv2VCfLNG6T8XI+8ZONHwSMzGg6RxYym72PEf82ciGuvgMNBMR0YgGmF1yU5VziiPEwlf5Pq7O30Th75mSH1myAcadQmJJkVkjRE6gzVw/5MnnLgqDmBtZRutpIPlW9ieuPrLnn8oA23+uE2CHBCcCbKLGl1kkbym+YFPxZVqXk1jAaUm0Ty8mD7QouhtvRQVaJ2nHrIDFqoIFWA3BYiuozF+4I625bYYYikigoMRxYbKD6nO1Lrsj4bouRw7TCp9ehZ63T2ZVsSEnuOrMc8F9z/iISt8xPbCCnuacdtyG074Ji2IGlT3ZslRHrkJq0hRSQAFqnfnxDbpu6j1Nsr4P3Eq14tkL26qdTM+Qf9Yb7TadEWogXgwPYuHVYzU9t4q4Gv054u7wEE+1OqFVxFWRkCPuDR7xjri8qQqSUkfPrstCPR3tY1vDzeR2YRjN6GVoVyjDKiIaFMzqiqYB7XEBlkK1H7yzApZWdYaprtP7LzQm3RIa5u0AlYYG446k3SI0ByU1NJB3RGoAdVe1/1qjHuRdcXp10VhqjfvBag0IOqc1gLq2bF1rQNg1rQF0678ea42c6e5oDaBb8fVYa+gw7kraVZd4vdcaOsi7ojXUVUs50z0MdqazYOdmOqg6/5dVdZ039u6yVxNGWSkdrdehK+Nepwhyufx6NhNXlaIKW+2qqviGZxLGrKRmbMrUgNPCel4VFleVoCsDmSei8lBjKwbKy8bKQHv2Do/9C4TW2CYZOJWOdR0q7dNNsJapHKsrMl1scjIe0QJHMo/1q5oUr8OfQqxmnCfZM+2f0pqOrPu3VDXfXeGD5xdrN8YnPpZMbVFme6/HFF2I769xM+GoznS/Z361rpRfTxN16/lVt03SD4F+QaCML685263xqlsifdLm59G2a1QT2q3vqtseH//SX/Fm3we/9DfWlC1/MS9atiPnRaNljaHu6ZQrsel1g6wH7wna44lER+V7gqYaks0t0HS1p37suV0opwI5AVa9f9hupU9XdhrC5K6gbX30dKOrXQ9icp+Abvn2WJdJvCGi3Zxv82b585d8Gi5/RAQf/gc= -------------------------------------------------------------------------------- /docs/skills-client/common/skillsReporter/globalEventHandling.md: -------------------------------------------------------------------------------- 1 | In many cases, it is useful to define a **global** success and/or error handler function rather than defining event listeners on 2 | each element where you include the [reporting utility](#skillsreporter-js-utility). 3 | For example: 4 | - display messages congratulating users on skills completion as well as level and badge achievements 5 | - handle all reporting errors by sending them to a logging service 6 | 7 | Alongside standard, promise based, success and error handling, the SkillsReporter native javascript utility allows 8 | you to configure global success and error handlers utilizing the ***addSuccessHandler*** and ***addErrorHandler*** methods. 9 | 10 | ``` js{9-10} 11 | const myGlobalSuccessHandler = (result) => { 12 | toastr.success('skill successfully recorded!'); 13 | }; 14 | 15 | const myGlobalErrorHandler = (result) => { 16 | toastr.error('There was an error recording your skill'); 17 | }; 18 | 19 | SkillsConfiguration.afterConfigure().then(() => { 20 | SkillsReporter.addSuccessHandler(myGlobalSuccessHandler); 21 | SkillsReporter.addErrorHandler(myGlobalErrorHandler); 22 | }); 23 | ``` 24 | 25 | To avoid race conditions, please ensure that the configuration is loaded by adding global handlers within the 26 | `SkillsConfiguration.afterConfigure()` callback. 27 | 28 | Note: By default, a global success handler will only by invoked for results where a skill has been applied (``skillApplied=true``). 29 | To change the default behavior and enable notifications even when a reported skill has not been applied, set the ``notifyIfSkillNotApplied`` 30 | configuration option on the SkillReporter utility: 31 | 32 | ``` js{9-10} 33 | SkillsReporter.configure({ 34 | notifyIfSkillNotApplied: true, 35 | }); 36 | ``` 37 | 38 | For a full description of the success response object (named ``result`` in the above example) please see [Endpoint Result Object](/skills-client/endpoints.html#endpoint-result-object). 39 | -------------------------------------------------------------------------------- /.github/workflows/publish-docs.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2020 SkillTree 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Publish SkillTree Docs 16 | 17 | on: 18 | push: 19 | branches: 20 | - master 21 | 22 | jobs: 23 | build: 24 | runs-on: ubuntu-latest 25 | 26 | steps: 27 | - uses: actions/checkout@v4 28 | 29 | - uses: actions/setup-node@v4 30 | with: 31 | node-version: '20.17.0' 32 | 33 | - name: Print Versions 34 | run: | 35 | npm -version 36 | node -v 37 | 38 | - name: npm install 39 | run : npm install 40 | 41 | - name: build docs 42 | run: npm run docs:build 43 | 44 | - name: Upload artifacts to be deployed 45 | uses: actions/upload-pages-artifact@v3 46 | with: 47 | path: ./docs/.vuepress/dist 48 | 49 | deploy: 50 | needs: build 51 | 52 | # Grant GITHUB_TOKEN the permissions required to make a Pages deployment 53 | permissions: 54 | pages: write # to deploy to Pages 55 | id-token: write # to verify the deployment originates from an appropriate source 56 | 57 | # Deploy to the github-pages environment 58 | environment: 59 | name: github-pages 60 | url: ${{ steps.deployment.outputs.page_url }} 61 | 62 | # Specify runner + deployment step 63 | runs-on: ubuntu-latest 64 | steps: 65 | - name: Deploy to GitHub Pages 66 | id: deployment 67 | uses: actions/deploy-pages@v4 68 | with: 69 | token: ${{ secrets.GITHUB_TOKEN }} 70 | -------------------------------------------------------------------------------- /docs/skills-client/auth/reportSkillJavaExamplePKI.md: -------------------------------------------------------------------------------- 1 | When running in PKI Auth Installation, the user id will be implicitly retrieved from the client certificate. 2 | 3 | Here is a simple example of reporting a skill event: 4 | 5 | ```java 6 | import org.apache.http.client.methods.CloseableHttpResponse; 7 | import org.apache.http.client.methods.HttpPost; 8 | import org.apache.http.impl.client.CloseableHttpClient; 9 | import org.apache.http.impl.client.HttpClients; 10 | import org.apache.http.util.EntityUtils; 11 | 12 | public class ReportPKIExample { 13 | 14 | public static void main(String[] args) throws Exception { 15 | ReportPKIExample reportJavaExample = new ReportPKIExample(); 16 | String res = reportJavaExample.reportSkill("", "", ""); 17 | System.out.println(res); 18 | } 19 | 20 | public String reportSkill(String host, String projectId, String skillId) throws Exception { 21 | String reportUrl = "https://"+ host + "/api/projects/" + projectId + "/skills/" + skillId; 22 | 23 | HttpPost post = new HttpPost(reportUrl); 24 | try (CloseableHttpClient httpClient = HttpClients.createSystem(); 25 | CloseableHttpResponse response = httpClient.execute(post)) { 26 | return EntityUtils.toString(response.getEntity()); 27 | } 28 | } 29 | } 30 | ``` 31 | 32 | This example **requires** the following JVM parameters: 33 | 34 | ```properties 35 | -Djavax.net.ssl.keyStore=/certs/keyStore.p12 36 | -Djavax.net.ssl.keyStorePassword=password 37 | -Djavax.net.ssl.keyStoreType=PKCS12 38 | -Djavax.net.ssl.trustStore=/certs/truststore.jks 39 | -Djavax.net.ssl.trustStorePassword=password 40 | -Djavax.net.ssl.trustStoreType=JKS 41 | ``` 42 | 43 | This example is using [Apache HttpClient library](https://hc.apache.org/httpcomponents-client-5.0.x/index.html) so you will need to add it to your classpath. 44 | For example, in Maven it would look something like this: 45 | 46 | ```xml 47 | 48 | org.apache.httpcomponents 49 | httpclient 50 | ${version} 51 | 52 | ``` 53 | 54 | -------------------------------------------------------------------------------- /docs/training-participation/README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | Welcome to the SkillTree Training Platform! This guide will help you navigate and make the most of your learning experience. 4 | 5 | 6 | Your home page is your central hub for managing all your learning activities. Here you can: 7 | 8 | - **Browse Available Trainings**: Explore and add new training projects to your portfolio from the Projects Catalog 9 | - **Track Progress**: Monitor your overall advancement across all enrolled trainings 10 | - **Manage Trainings**: Easily add or remove trainings from your dashboard 11 | - **View Achievements**: Access your earned badges and certificates in one place 12 | - **Review History**: Check your quiz and survey attempts with detailed results 13 | - **Customize Settings**: Personalize your learning experience through user preferences 14 | 15 | Once you've added a training to your portfolio, you can: 16 | 17 | - **Track Skill Progress**: Monitor your advancement through individual skills and subjects 18 | - **Report Progress**: Utilize the self-report feature to mark skills as completed 19 | - **View Rankings**: See how you compare to other participants on the leaderboard 20 | - **Earn Badges**: Unlock achievements as you complete training milestones 21 | - **Access Learning Materials**: View skill descriptions, requirements, and additional resources 22 | 23 | ## Getting Started 24 | 25 | 1. Visit the **Projects Catalog** to browse available trainings 26 | 2. Add trainings that interest you to your portfolio 27 | 3. Start learning by selecting a training from your dashboard 28 | 4. Track your progress and celebrate your achievements! 29 | 30 | For detailed instructions on any feature, please refer to the corresponding section in this guide: 31 | - [Training Portfolio](/training-participation/training-portfolio.html) 32 | - [Taking a Training](/training-participation/take-training.html) 33 | - [Accessibility](/training-participation/accessibility.html) 34 | 35 | ::: tip Important Information 36 | If you're interested in creating gamified training experiences rather than earning credits in existing trainings, please check out our [Administrative Guide](/dashboard/user-guide/) for more details. 37 | ::: -------------------------------------------------------------------------------- /diagrams_work/AuthEndpointFlow(3).drawio: -------------------------------------------------------------------------------- 1 | 5VrZcts2FP0azbQP5oAAF/FRS9RM63TcKpMmfclAJExhTBEsCNlSvj4XXCSSoCM5oew00YMEXIJYzjn3YtOIzDa73yTN1m9ExJIRRtFuROYjjAPPhm9t2JeGsYNKQyx5VJrso2HJP7HKWBfb8ojlrYJKiETxrG0MRZqyULVsVErx0C52K5J2qxmNmWFYhjQxrf/wSK2rUbjoaH/NeLyuW7ZR9WRFw7tYim1atZeKlJVPNrSupiqar2kkHhom8mpEZlIIVaY2uxlLNKo1YuV7i0eeHrosWarOeiG7YSKNrxLkZ/9Or5dXb6K/rkhZyz1NthUUU40mk1Wf1b6GiOZZifwt3zGocrpWmwSyNiQzwVNVUOBOR+4cLDThcQqGEDoHlZEp3xQUTG9Fqir+bXy0z/kmhq4nfAXf9NNWMj2SmKVMUhjEouqVld/H8FLVaSYV2z2Khn3AGFTLxIYpuYci1Qu4Vmil2Dr7cKQfI2y5pXXdJN/DlfAq0cWHyo/oQ6Ii4Alk+AYZBgsgokwnaaiEhvVhzRVbZjTUxgfwzTYxTbS9YYDz2riNTdx8ZILmeRfCzLZ7QPMSaHYa8XtIxjr5QWxB0WiSZfVDaKzxvOeVKXg2A7fGaMnkvXaIsshKdl/qVtWhTGxVwlM2O4QupBui+Vp7UZHRfHAIRtd0xZIbkXPFhXaelVBKbBoFJpVXKZH1+ViD+Fonm12sA7ZFH3JiKUmjom6afMzLQYFEeJLMRKLVBL0l/tyf+TOwx7ow1Fw/KyLbRRRldyRFsKmpwOtzxTG5lKqwoaqmhNAvvy9HGKpGr9++uS5Ts+XyV4P7J7gneZTnIaKd24Y4MBG2xz1ue5jnBkfYBHh5x5O3ksH0if6m6R1PYw134YHveL4FtX+ihWNgpNFH13queBreVIZNuIcA1gtawNrYMZF1+wLipYC1ndOzCMS1iV416eCR0DznoQ4Zikplmr8gV8BI7t9D7gpZCNeGDzqqWQ72asN8V8W5Mrdv5m6Y5DBuHYkKY9lVFhnLtZOENADvw7u2SZaAiu7b1feRULVwo5c2jVhFvDbfdofHHMJEyKq3mquxTkWY2FbgouPHbdeLAgvZdnD4OO1mgKuYKaOZQjEHUL5BRO7ziWjH1ftCMm6V+1ALBNJH7ejMvpHpKucgRmRht6lF+4QOz5UcDL7g9ozFSMnOqej3YhoeuxYet+QGazYrCL5SyWPbwsSoDqGGet3nVa/3bOr93uMV9p0WM8T3vo5lZ3yioktzesbmaPCI5DdDkv3FkDRgFHnR4OB0FuN2d6FytmCCzqqeoOcVzNgQjG0oBhZ+qrNxUlLcse6mp7FHqkzG5qu7dt/wKNLN9G7Rm5Jz6nzVLXugXZV/csnv9MgIX2xdGhh8mB78A/OBO3wc8i9FSF1xgxDyMxFCOnti0nME+LyEmEdZzs9EiNP1EPelCTFPxw0+nvFYfJOHlMHvH2z/8R3dJiq/3HF4H/Z4bI1N9LvT+nDon3GQ8YOg75AO+uTl0T/jBOAHQZ+4rtU+1SE+eWn8iTk791xSHC4lasNkq9YwbAjr1VHpqzTKyiX24bJiZbwtT11p9DS82OZM5nqQ/lQnRz70caFgKkrPvBg5NZWNMIn8YIWQeUtxe8u8MBx8UhtATI/tek6dtDsXExI+7cjFBXZxHWU/gtQj2+WBQIO9ooWan4471oeuTRBxD4gXO1QnfbeMHRDrK7c6rBW/kzpEahEb8fIrL/66DNQBc62U/r/ERI8VL2Ku1tuVFUJFePEnLe/9lizcSq72k5ilIeCyyO/As/KrSITal1eJKKItzbU3QfAVscjrUkoy9lFbrCyF0LuQVB+pKKkRmWb1cawWjr67IXN/GHG4yLNs4j52Uk5IUF8NNuQx9q06hre8zL+UQPqWio2o2RCK999W/+WjYPEqL2gExpDtZ7sy1lbP+6L0ANV8IbR/Q+1zmq9Xgsrof9HbSvT6DpxDlLtoWxcG5DvZHh5nENQJUH5ns4gGCAnOuD1BOPV9fWuCwKb/4+DJ/g/Z43+0ysPJ41/gyKvP -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 41 | 42 | 43 | 59 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/skills-groups.md: -------------------------------------------------------------------------------- 1 | # Skill Groups 2 | 3 | 4 | Skill Groups is a way to group/organize skills under a subject. 5 | Projects are composed of Subjects which are made of either [Skills](/dashboard/user-guide/skills.html) or Skill Groups. 6 | A group is a collection of 2 or more skills that you want to keep and achieve together. 7 | A group is achieved when all of its skills are fully completed. 8 | Alternatively, a group can be configured to only require ``N`` number of the group's skills. 9 | 10 | ::: tip Partial Requirement Example 11 | If let's say a group has ``5`` skills, you can configure it to only require ``3`` skills. 12 | In this case, when any of the ``3`` skills under that group are completed then the group achievement is awarded! 13 | ::: 14 | 15 | ![Skills Group Screenshot](../../screenshots/admin/page-skills-group.png) 16 | 17 | To create a group, navigate to ``Project -> Subject`` then click on ``Group +``, the following group properties can be specified: 18 | 19 | ![New Skills Group Modal](../../screenshots/admin/modal-new-group.png) 20 | 21 | | Property | Explanation | 22 | |:------- |:----------- | 23 | | Group Name | Display name of the skill | 24 | | Group ID | Group ID that will be used to identify this group | 25 | | [Description](/dashboard/user-guide/rich-text-editor.html) | *(Optional)* Description of how to perform this skill. | 26 | 27 | After a group is created then skills can be added to the group. To add Skills to the group expand the group and click on the ``Add Skill To Group`` button. 28 | This will bring up a new skill dialog, to learn more about skills and their attributes please visit the [Skills Section](/dashboard/user-guide/skills.html). 29 | 30 | ::: tip 31 | When first created, a Group is not visible on the Skills Display because it has 0 skills. 32 | Once at least 1 skill is added the group will be rendered in the Skills Display. 33 | ::: 34 | 35 | ## Partial Skill Requirement 36 | 37 | Groups have an option to only require ``N`` skills out of the total available number of skills added to the group. 38 | For example, if a group has ``5`` skills, you can configure it to only require the completion of ``3`` skills. 39 | In this case, when any ``3`` skills under that group are completed then the group achievement is awarded! 40 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | This section focuses on installing the SkillTree platform. 4 | Once the service is installed you will have access to the management dashboard and API. 5 | 6 | 7 | 8 | There are two official distributions: 9 | 10 | - Jar-based: hosted on 11 | - Docker: hosted on 12 | 13 | [Quick Start](/dashboard/install-guide/quickStart.html#_2-install-start-dashboard-and-service) shows how to install and start each distribution type. 14 | 15 | Once a distribution has been selected, the next consideration is to select an installation mode. 16 | The SkillTree platform supports two modes: 17 | 18 | - [Password Auth Mode](/dashboard/install-guide/installModes.html#password-auth-mode): Accounts created and managed by SkillTree and/or delegated to OAuth2 authentication provider (ex. GitHub, Google, etc..) 19 | - [PKI Auth Mode](/dashboard/install-guide/installModes.html#pki-auth-mode): PKI Mode is for intranets where organizations utilize PKI with 2-way SSL certificates to implement authentication and authorization. User's browser must be setup with a personal PKI certificate and that certificate must be issued by a Certificate Authority trusted in the dashboard application's truststore. 20 | 21 | :::tip 22 | Use Password Auth Mode if you are not sure which mode is applicable to you. 23 | ::: 24 | Please visit the [Installation Modes](/dashboard/install-guide/installModes.html) section to learn more. 25 | 26 | So what's next? 27 | - [Quick Start](/dashboard/install-guide/quickStart.html#_2-install-start-dashboard-and-service): Become familiar with starting the service, the dashboard and what client-lib integration looks like. 28 | - [Development Installation](/dashboard/install-guide/devInstall.html): Run the dashboard and the service on your test and/or development environments. 29 | - [Production Installation](/dashboard/install-guide/prodInstall.html): Detailed documentation for production-grade installations. 30 | - [Configuration](/dashboard/install-guide/config.html): SkillTree configuration and catalog of options. 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /.github/workflows/scripts/gen-screenshots.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # dev mode: 4 | # ./.github/workflows/scripts/gen-screenshots.sh -d true 5 | 6 | NUM_SKILL_EVENTS=10000 7 | 8 | usage() { echo "Usage gen-screenshots.sh -i skilltree/skills-service -v 2.0.3" 1>&2; exit 1; } 9 | 10 | while getopts :d:r:i:v: flag 11 | do 12 | case "${flag}" in 13 | d) skipShutdown=${OPTARG};; 14 | r) shutdownAndMoveSnaps=${OPTARG};; 15 | i) imageName=${OPTARG};; 16 | v) imageVersion=${OPTARG};; 17 | *) usage;; 18 | esac 19 | done 20 | if [ -z "${imageName}" ] || [ -z "${imageVersion}" ]; then 21 | usage 22 | fi 23 | echo "Will use: ${imageName}:${imageVersion}"; 24 | echo "Skip Shutdown: $skipShutdown"; 25 | echo "Shutdown and remove snaps: $shutdownAndMoveSnaps"; 26 | 27 | # if image already exist remove - this is to support use of latest 28 | docker image rm -f ${imageName}:${imageVersion} 29 | 30 | # start skills-service 31 | echo "Will use [${imageName}:${imageVersion}]" 32 | SKILLS_SERVICE_CONTAINER_ID=$(docker run -d -p 8080:8080 -e SPRING_PROPS="skills.config.ui.disableScrollToTop=true" ${imageName}:${imageVersion}) 33 | npm run wait:skills-service 34 | echo "Started ${imageName}:${imageVersion} on port [8080] with container id [${SKILLS_SERVICE_CONTAINER_ID}]" 35 | 36 | # build latest backend examples 37 | mkdir tmp-work-dir 38 | cd tmp-work-dir 39 | git clone git@github.com:NationalSecurityAgency/skills-client-examples.git 40 | cd skills-client-examples/java-backend-example 41 | mvn package -DskipTests 42 | cd target 43 | 44 | # populate with sample data 45 | echo "Populating skills-service with data..." 46 | java -Dskills.service.numEvents=${NUM_SKILL_EVENTS} -Dskills.service.additionalRootUsers= -Dspring.main.web-application-type=NONE -jar java-backend-example-*.jar 47 | echo "Completed populating data!" 48 | cd ../../../../ 49 | rm -rf tmp-work-dir 50 | 51 | if [ "${skipShutdown}" = "true" ]; then 52 | echo "Dev mode: (1) started service (2) populated data" 53 | exit 1 54 | fi 55 | 56 | # remove existing screenshots 57 | rm -rf cypress/snapshots/* 58 | 59 | # generate screenshots 60 | npm run cy:run 61 | 62 | # move screenshots 63 | sh ./.github/workflows/scripts/move-screenshots.sh 64 | 65 | # stop and remove container 66 | docker stop ${SKILLS_SERVICE_CONTAINER_ID} 67 | docker rm ${SKILLS_SERVICE_CONTAINER_ID} 68 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/global-badges.md: -------------------------------------------------------------------------------- 1 | # Global Badges 2 | 3 | Global Badges recognize and reward users for achieving skills and levels across multiple projects. These badges help track and celebrate comprehensive skill development that spans different project boundaries. Global Badges can include skills and levels from any project you have Admin access to. 4 | 5 | ## Overview 6 | 7 | Global Badges are awarded when users meet specific criteria that can include: 8 | - Skills from multiple projects 9 | - Project level achievements 10 | - Any combination of the above 11 | 12 | ## Components of Global Badges 13 | 14 | ### Project Levels 15 | Earn badges by reaching specific levels across different projects. These levels demonstrate consistent growth and achievement within individual projects. 16 | 17 | ![Global Badge Levels](../../screenshots/admin/page-global-badge-levels.png) 18 | 19 | ### Skills 20 | Showcase expertise by completing specific skills from any project you have access to. These can be combined to create comprehensive achievement paths. 21 | 22 | ![Global Badge Skills](../../screenshots/admin/page-global-badge-skills.png) 23 | 24 | ## Access 25 | 26 | The Access page supports adding or removing Global Badges Administrators. To add and remove Administrators 27 | please navigate to ``Home -> Global Badges -> Manage -> Access`` page. 28 | 29 | ![Global BadgeAccess](../../screenshots/admin/page-global-badge-access.png) 30 | 31 | ## Creating Global Badges 32 | 33 | ### Step 1: Create a New Badge 34 | 1. Navigate to `Home -> Global Badges` 35 | 2. Click the `Badge +` button 36 | 3. **Recommended**: Add a descriptive [Icon](/dashboard/user-guide/icons.html) for better visual recognition 37 | 38 | ### Step 2: Configure Badge Requirements 39 | After creation, set up the badge criteria: 40 | - **Adding Skills**: `Home -> Global Badges -> Manage -> Skills` 41 | - **Setting Level Requirements**: `Home -> Global Badges -> Manage -> Levels` 42 | 43 | > **Note**: New badges start in a Disabled state, allowing you to fully configure all requirements before they become available to users. 44 | 45 | ### Step 3: Publish the Badge 46 | 1. Go to the `Global Badges` view 47 | 2. Locate your badge 48 | 3. Click the `Go Live` button in the bottom-right corner of the Badge overview 49 | 50 | > **Important**: When published, the system automatically awards the badge to all users who already meet the requirements. -------------------------------------------------------------------------------- /diagrams_work/Integration-Overview(2).drawio: -------------------------------------------------------------------------------- 1 | 1VpZk9o4EP41VO0+QPk2PHIMyW5NtmZDNpvkJSVsYbRjLEcWDOTXp2VLIF9cA0ktD2C15Jbc59dtOvZ4tX3DULp8R0Mcdywj3HbsScey+qYP34KwKwi+6RSEiJGwIJkHwox8x5JoSOqahDgrLeSUxpykZWJAkwQHvERDjNGX8rIFjcu7pijCNcIsQHGd+i8J+VI+lmsc6G8xiZZqZ9OQM3MUPEeMrhO5X0ITXMyskGIjl2ZLFNIXjWQ/dOwxo5QXV6vtGMdCqkpixX3Tltn9kRlO+Fk3pE+YJlE3Nvz0y+hx1n0X/t21Cy4bFK+lKEZCmpjJM/OdEhHK0kLyC7LFwHK05KsYhiZcppQkPFeBO+q4E6CgmEQJEAI4HDCzR2SVq2C0oAmX+gcb2dMnZBXB0WMyh2/0fc2weJIIJ5gheIipPFUv20Rw0wYzTkB7Q7nLnHJOVzARozmOn2hGOKGl7dUdj5UFnKYwWxellK64DW81khTtG0xXmLMdLJGzlucWt0gPcKTWXw7mZFlyyVI3pb5ciKQJR3vWB13ChVTnBar1a6qt6RRMMhWXKOBUSOllSTiepSgQxBfw9LKadd15txGbaRslsfl1sSmSLjXPe73Qsi9f+w/b/sJZp9/WAcF/JPyxazUIzYth11FINiXhed/WwnNzoXSzXCpDWGA66TYXjZqHq0j8PlIUwvyfM/h6jzO6ZgFEPMkczprzL5beassxTRYkAl+CRbNnEscfGMbqDGO6SikWbit3m7NXbdb2KBWTwyEEXjmkjC9pRBMUPxyoozyaiggzMWB0WPNIha/mhvgf5nwnLRGtOS2bKd4S/knc3nPl6LNkJq4nW32w0wZPmBGwIhEvCloCFvVJH+R8egNLjQ+88tFOH1W5VQNfIRkhjtZ4LkmFrRzxdFOlTMQizI8ttI46YxckZpoySDEcI0425dM1+Ztk9yRygLaELhYZHKbqkPtdrw9s6nHbnLSwvM8gNVg0TNMznKwgjSCZ40R46QyzjciBB8+4yMjpmsckweM9WhEGEKJsuTfrtny0z2TVFFckqlpa1cxeBfPVNhIYrYdeMrvHGQpz3ij+mhUPBaYIoWBMYxHy4bS2P/HH/hjokVgMnNVcDmbuE/a9cti3rXrcH3i9hnzZt++ULs320D9vsinjNxFGYS/j7Yd3j8XVeDb7XTOReauBXJBo7VZjuAVq8cuoZdCAWowm1GLdC7XUtaBnrppG8slsQrI0Rrtm0ReZLhFCulANiAW6Fipus1gsrCAQjscZfcbaTOjNPfdGnmL1rV5ZR6ZioinJHDSAJPsGIKnZVZzT0BLi6FAUZiJYxSjLSCEpxHidfMTy9zkYcpOxz7tFHnYs75pE3KqUSi6uq0QTuNsgb0W7NnMqjRteWd9Gv8yiwAPyLr3gqzLyzJ6hf2p8e4ZpDvYfp7xNgSZq29wsizfVJ5fj3jacHSKO8k7ABVn8Bru/R8kzSSIhxhxIfCTZGpL2d5Tn9/vt+5Hgl2uQ/NUw/uDeFDR4sW87Gk5XmP1zCbO34PQknBJhaMdd+SRkts50eelKEGwMpx527xgFXKOMkEy34p7nRgHXrUAtu5K6W/wcVCky6n6Z7PG0H7iyj2kPKmGj4PjTywW7CdhVzPlQc5qXtUGcY1Z4fpZ3BsaxUG2rVK6nfKupL3IvWGY31Vwt3STV6st/h6ptKPy11kO8sgxqayIuORcN46F4VmsaEb5cz3sBMLKmf6GiCprhYM0I3w0jnAQgl2mWI8huSINM4MaYig7kCmUCMFjTmEY0U6s4gNCvgtJLIcTbU4ZErONMSGSUKpghDEekAHvi38Y4XMPumbZ7MA63YhwDhRA18+j7Pd+uG4jj38tA6p3kSxObf6KzdGZaO8Xmddm3jfsEqvs5RSz8X5xWGr3oCBCIcnfd684CqQQh8Cle6YuUyjPV09BqOUmq9VaqsWdFwjDvUDblh3LXUg9QvhrLQxo3CAlOv5wgHNW9KCUIq+7/1uD1/t/YOK+7v163v8cpBWHmwPgfTmIIwDXN/ZxivCbjBk1cUox79dB7t2K8UfDX1uJnAHOj5+sddIXT25B5c7fcPVGjNwLxk6D+mA2ebIMXiPBX1ff2oALIBxXQdi6yd5wKI+c+yN6xKoBDvn1rRPZXoPZGXXrH4YSstvOw0tH6gpfU+FoHEVg8bPSXYWe8xcoxayVGnZ1CGIaUh+YyITS9QW+uMhrCl/xPhGTW2f/fQPeg9shx7GWQ4atu+6604694NQTDw18liuWHf6LYDz8A -------------------------------------------------------------------------------- /diagrams_work/Integration-Reporter(1).drawio: -------------------------------------------------------------------------------- 1 | 1Vpbk9o2FP41zLQPMLblCzxy2U3a7rbbkE6TvOwIWxglxnJksQv59T2yZXw37GKmGx7AOpKP5HP5zsUM0Hy7f8dxtLlnHgkGhubtB2gxMIyx7sC3JBxSgqObKcHn1EtJek5Y0h9EETVF3VGPxKWFgrFA0KhMdFkYEleUaJhz9lxetmZBedcI+6RGWLo4qFP/pZ7YqMeytJz+nlB/k+2sa2pmhd1vPme7UO0XspCkM1ucsVFL4w322HOBhG4GaM4ZE+nVdj8ngZRqJrH0vtuW2eOROQnFWTdED4SF/jDQnOjL7G45vPf+HqKUyxMOdkoUMylNwtWZxSETEY6jVPJruifAcrYR2wCGOlxGjIYiUYE1G1gLoOCA+iEQXDgcMEMzuk1UMFuzUCj9g40c6Qu69eHoAV3BN/6x40Q+iU9CwjE8xK061Sh+8uGmJ8IFBe1N1S4rJgTbwkSAVyR4YDEVlJW2z+64qywQLILZuiiVdOVtZF8gKdG+I2xLBD/AEjVr2FZ6i/IAU2n9OTcnw1BLNkVTGquFWJmwf2Sd6xIulDpfoFqnptqaTsEkI3mJXcGklJ43VJBlhF1JfAZPL6u5qDu7H7HpSCuJzamLLSMVpWbblwst/vI4vtmP1+Yu+r5zKfktFHdDo0FodgC7zjz6VBKe/X0nPTcRyjBOpDKFBboZ7RPRZPNw5cvfO4Y9mP99CV8fSMx23AXEU8zhrAn/dGlfW85ZuKY++BIsWn6jQfCRE5KdYc62ESPSbdVuK37RZm2PUjE54gHwqiHjYsN8FuLgJqfOEjSVCLPQYJSvuWPSVxND/EqEOChLxDvBymZK9lR8krePLDX6rJjJ68W+ODgUBg+EU7AiiRcpLQSL+lQcfM65ymHOKhllvKoQ1+omqRF0uLCexULMfSI6zFbBuBTuOV43hIfQdYVGnARY0KdyJGxyLMXuQYJ9YQlbr2M4XNXzjru+HsGyx2/zxtTEPoMUYdE0is7wppQ0g6hNQumOS8KfZLDLXeBF1sx2IqAhmR/TEql/D8ebo/22BZ5jyKrGsjQi1eJnwb4z1N7ufZmMjfBzjEaCYy/hjYPHOH0osETw+TkLJLbDaZGzcObOHOi+XAycs7kka7kOvttlfEdGHeAn9qghMI7RleKi3o7xqyab0n6ReAl7ae8/3t+lV/Pl8teCiaxaDeQFERW1GkMf6YlTTk8mDemJ1pSeGNdKT7IKoSs/AR+dyuxeOkKA45i60vwBDUWd3CHVI5AD7mlGGcxNwz4B58moGhtaVXISggsStxoym4z2WlTO9K3ZJX3r2rjMIo096q5i1VBlZOsjrfip8R1puj45fszyNmnkqm3TV4RATb5cMaI8n9BfluJ2xu7zXc8yzTIEIrvme0c3KyW513I91BRXW0qDrG5LfqdZDShdoFYQvjLUtVWEGyFk9T+VzwqlIBWb3WrkAiPj9k+cRrolcXecisMUCkUX5HIbyyw3HnrMjSUsB0yWk1scS8eF6hISyThbJSAXfpSUURRCTXnLscQTwaVEZlHm7tJSqJxfOD1Zg+WMdGRVLGKSRcCCTYydkYPqVmE617KKei/gpYWIc6I2OLPEOMXmsmqpjfsC0rYVw9z7KU6rLF2mehSw7Kp7XVkgFeQBRxKVhFdw9o1Uk9VCbqtItaS5Cjhb6nlJjdkUBcp1ZxGVnGysDqn1gQNmOTE2s7S0FBWMuv8bk8v9v6uGLLh/sWfwgURQiksoNLR/BA0AdV+a7GLuFrOySnGyXq8N161pG2Y8e2VbPdUjxtgYlcFXbwrHk4ZwjK7Vc3ptItyRtuQtkAnKxjLfhVwukWRHI6Sl6WGc6no0dVBaFVbsfHQZY7Hx0ZkAvpG0G00q5e6kksOdm3abFXhAZoVRS2INVoIPhWWqM996YLNan1t6xZ5Tjq/N2huVa3cnGmlcSAFnIBPjc5szNR4JgAGLm6dio/OMDmWSwlbQ6+zgwgkEQ7xSoaLp7cjpKqMTKKpod3wvpjYdFF8wtfT/NCdrsBxKnN5EN/DesXT/MZy8N//46v+14IbLzeEZRcspmGwDN+cccPs0yNvL6jZkdWNpKyRW4Kq/7nAHSP70mFhNmZBtnIWJfRlge9/w0hc1jVh3hXcx/Zy2GVV7OvKbfvK3HkHOjgxlwGmH264IYqAsglwIEJUbrhdB6hXOX1HSowKV15R4UduwUtt4Fhl7ZlNtMzZWyLa7FFiLDK06MY0yPjb9B2HcVNj00GdslHe9sDnKu+c27f8ib4ROv9vqSd4wzP8olLpD/j8sdPMf -------------------------------------------------------------------------------- /docs/skills-client/common/skillsConfiguration/skillsConfigurationParameters.md: -------------------------------------------------------------------------------- 1 | This configuration is used by the Skills Display and Skills Reporting libraries so you won't need to configure those separately. 2 | 3 | ```SkillsConfiguration``` ```configure``` parameters: 4 | 5 | | Parameter | Type | Explanation | 6 | |---------------|:--------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 7 | | serviceUrl | String (representing URL) | url to the skills service - this is the same url as the dashboard - the User Interface and service endpoints are co-located | 8 | | projectId | String | the id of the project that was created in the dashboard; visualize and report skills for the project with this id | 9 | | authenticator | String | url to your [Authentication Endpoint](/skills-client/auth.html#authentication)always set this value to ``pki`` (the SkillTree platform can be installed in other modes, that is when changing this value would come into play) | 10 | | enabled | Boolean | (optional, default is `true`) When set to false, when disabled, the skills-client library goes into a dormant state and does not attempt authentication, network communication, skill reporting, or any other activities. | 11 | SkillsConfiguration supplies the ***afterConfigure()*** method which returns a promise which will be resolved once the **SkillsConfiguration** ***configure*** method 12 | completes. This allows support, for example, for configuration options to be supplied by the server asynchronously. 13 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/learning-path.md: -------------------------------------------------------------------------------- 1 | # Learning Path 2 | 3 | The Learning Path feature adds another facet to the overall gamification profile, which forces users to complete skills in a specified order. 4 | Project administrators can configure a learning path using the project's [Badges](/dashboard/user-guide/badges.html) or [Skills](/dashboard/user-guide/skills.html). For example, 5 | if you set up a simple Learning Path of ``Skill A -> Skill B`` then ``Skill A`` will serve as a prerequisite to ``Skill B`` and no points will be awarded toward ``Skill B`` until ``Skill A`` is fully accomplished. 6 | 7 | ![Project Learning Path](../../screenshots/admin/page-project-learning-path.png) 8 | 9 | ::: tip 10 | Please note that setting up a Learning Path is an optional feature, so don't feel pressure to configure it right away or at all. 11 | You can always add at a later time. 12 | ::: 13 | 14 | To add a dependency, navigate to ``Project -> Learning Path`` then use the `Add a new item to the learning path` component 15 | to start adding skills and badges. 16 | 17 | ![Add Learning Path Route](../../screenshots/admin/component-manage-learning-path.png) 18 | 19 | Both `From` and `To` Input fields support [Badges](/dashboard/user-guide/badges.html) and [Skills](/dashboard/user-guide/skills.html). 20 | The skill/badge specified in the `From` field will serve as a prerequisite to the skill/badge specified in the `To` field. 21 | The great news is that you can build an extensive learning path for your students by mixing skills and badges. 22 | 23 | ::: tip Good To Know 24 | SkillTree will discover circular learning paths at the time of from and to selection and prevent administrators from adding an 25 | erroneous learning path route. 26 | ::: 27 | 28 | ## Best practices 29 | - Do not create very complex learning paths - a simple, direct and shallow prerequisite chain/tree is the best approach. 30 | - Instead of adding a large amount of prerequisite skills consider adding all of those skills to a badge and then using that badge in the Learning Path instead 31 | - Use prerequisites sparingly as they complicate the training profile 32 | 33 | 34 | ## Cross-Project Prerequisites 35 | 36 | Cross-Project Prerequisites facilitate cross-application training and enable users to become domain experts across several applications. 37 | These dependencies are critical when actions are required to be performed in more than one tool in order to complete a task. 38 | 39 | To create a cross-project skill: 40 | 1. In ``Project A`` navigate to ``Project -> Learning Path`` 41 | 2. Scroll down to the ``Share skills from this project with other projects`` section 42 | 3. Select a skill to share with other projects, for example, ``Skill A`` is selected 43 | 4. Select which project to share the skill with *OR* share will all projects, click ``Share`` button 44 | - for example, ``Skill A`` is shared with ``Project B`` 45 | 5. In ``Project B`` navigate to ``Project -> Learning Path``, you will see that ``Skill A`` was shared with this project under ``Available skills from other projects for use as prerequisites`` section 46 | 6. Now in ``Project B`` ``Skill A`` can be added as a prerequisite to any local skill 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/common/rte-features-table.md: -------------------------------------------------------------------------------- 1 | | Feature | Shortcut | Explanation | 2 | |----------------|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------| 3 | | Copy & Paste | Ctrl+C / Ctrl+V | Paste anything from browser, screenshot, excel, powerpoint, etc. | 4 | | Headings | Ctrl+Alt+t | Supports 6 different sized headings | 5 | | Bold | Ctrl+B | Apply **bold** formatting to text | 6 | | Italics | Ctrl+I | Apply *italic* formating to text | 7 | | Strike | Ctrl+S | Apply ~~strike-through~~ formating to text | 8 | | Font Size | Ctrl+Alt+s | Apply a specific font size to text | 9 | | Line | Ctrl+L | Insert a horizontal line seperator | 10 | | Blockquote | Alt+Q | Apply quote formatting to line(s) of text | 11 | | Unordered List | Ctrl+U | A bulleted list | 12 | | Ordered List | Ctrl+O | A numbered list | 13 | | Indent | Fn+Tab | When creating a list, this will indent the list one level | 14 | | Outdent | Fn+Shift+Tab | When creating a list, this will outdent the list one level | 15 | | Image | Ctrl+Alt+i | Insert an image. Images may be chosen from a local file, a URL, or copy and pasted. | 16 | | Link | Ctrl+Alt+r | A hyperlink to an external resource | 17 | | Attachments | Ctrl+Alt+a | Attach a file to the description. Attached files will be stored on the SkillTree server and a link for downloading the attachment will be provided. | 18 | | Inline Code | Ctrl+Shift+C | Apply `code style` formatting inline | 19 | | Code Block | Ctrl+Shift+P | Apply `code style` to a multiline section | -------------------------------------------------------------------------------- /docs/skills-client/common/skillsDisplayOptionsObject.md: -------------------------------------------------------------------------------- 1 | ``Options`` object optionally controls various behaviors of skills display with the following properties: 2 | 3 | | Prop | Type | Default | Explanation | 4 | |--------------------|---------|:---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 5 | | disableAutoScroll | boolean | false | As a convenience, by default, the Skills Client Display will auto scroll to the top whenever the user navigates to a new page (route) within the display. Disable auto scroll to top on route change. | 6 | | autoScrollStrategy | string | 'top-of-frame' | On route change, either scroll to the top of the entire document, or the top of skills-display ('top-of-page','top-of-frame', or 'top-offset' - 'top offset' must be used in conjunction with the 'scrollTopOffset' option) | 7 | | scrollTopOffset | number | 0 | Used in conjunction with the autoScrollStrategy 'top-offset', scrollTopOffset will be subtracted from the display's element offset as the scroll to target (relevant when fixed/statically positioned elements preceed the Skills Display container). 8 | | isSummaryOnly | boolean | false | When enabled, display renders overall summary only. This mode is not interactive, it provides a user's progress preview that can be displayed on a landing page. | 9 | | internalBackButton | boolean | false | When enabled, a back button is displayed to the left of the page title, allowing users to navigate back in the browser history within the Skills Client Display. Generally, it is not required to enable this button, as Skills Display updates the URL and utilizes browser history for navigating back. | 10 | | updateHistory | boolean | true | When `updateHistory` is disabled, the native browser history will not be updated when navigating within the Skills Client Display. It is generally recommended to leave this property enabled unless navigating within the Skills Client Display interferes with the hosting application. If disabled, it is recommended to also enable `internalBackButton` to allow users to navigate back. | 11 | 12 | 13 | Here is an example of an options object: 14 | ``` json 15 | { 16 | disableAutoScroll: false, 17 | autoScrollStrategy: 'top-of-page', 18 | } 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/.vuepress/components/FormAndPki.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 56 | 78 | 79 | 122 | 123 | -------------------------------------------------------------------------------- /docs/training-participation/accessibility.md: -------------------------------------------------------------------------------- 1 | # Accessibility 2 | 3 | SkillTree is committed to providing an accessible learning experience for all users. This guide outlines the accessibility features and best practices to enhance your experience with the platform. 4 | 5 | ::: tip Please Note 6 | If you're interested in creating gamified training experiences rather than earning credits in existing trainings, please check out our [Administrative Accessibility Guide](/dashboard/user-guide/accessibility.html) for more details. 7 | ::: 8 | 9 | ## Navigation 10 | 11 | ### Basic Navigation 12 | 13 | 14 | ### Productivity Shortcuts 15 | 16 | To initiate the training-wide search via a keyboard shortcut, press `Ctrl + K` to open the search box. 17 | [Training-wide search](/training-participation/take-training.html#training-wide-search) functionality enables users to quickly find and navigate to any skill, subject, or badge by name. 18 | This is an effective method to jump directly to any skill, subject, or badge from any page of the training. 19 | 20 | On the [Skill Page](/training-participation/take-training.html#skill-page): 21 | - `Ctrl + Alt + p` (p for previous): Navigate to the previous skill 22 | - `Ctrl + Alt + n` (n for next): Navigate to the next skill 23 | 24 | Please check back in often as we continue to add productivity shortcuts to the platform. 25 | 26 | ### Landmark Navigation 27 | 28 | The heading structure is organized hierarchically to facilitate easy navigation using screen reader landmark navigation. 29 | 30 | For example, on a single training entry page, the heading levels are organized as follows: 31 | - The training title serves as the main heading (Level 1) 32 | - Progress metrics and subject sections are organized under Level 2 headings: 33 | - Overall Points 34 | - My Level 35 | - Current Level Progress 36 | - My Rank 37 | - My Badges 38 | - Subjects (Level 2 heading that groups all subjects) 39 | - Each subject is a Level 3 heading 40 | 41 | This heading hierarchy enables efficient navigation through screen readers. For example, using JAWS Screen Reader: 42 | 1. List all headings with `INSERT+F6` 43 | 2. Navigate directly to the first subject by pressing `3` for the first Level 3 heading 44 | 3. Press `3` again to move to the next subject heading 45 | 4. Once you reach your desired subject, press `Tab` to access the `View` button 46 | 47 | ### Skip to Main Content 48 | 49 | 50 | 51 | ## Screen Reader Support 52 | 53 | 54 | 55 | ## Visual Adjustments 56 | 57 | 58 | 59 | ## Video, Multimedia and Images 60 | 61 | Please note that training content is managed by the creators who are responsible for ensuring their content is 62 | accessible. This is particularly important for skill descriptions, uploaded videos, multimedia, and meaningful images. 63 | 64 | SkillTree Platform provides features to enhance accessibility for training creators to utilize: 65 | - Add descriptive alt text to meaningful images 66 | - Add captions to uploaded videos 67 | - Add transcripts to video and audio files 68 | 69 | If you encounter any accessibility barriers, please contact either your [training's creators](/training-participation/take-training.html#contact) or the SkillTree support team. 70 | 71 | ## Rich Text Editor 72 | 73 | The Rich Text Editor enhances text entry across various pages, including self-reporting justifications and text input 74 | quiz/survey questions. It supports both tab-based navigation and keyboard shortcuts for text editing: 75 | 76 | 77 | -------------------------------------------------------------------------------- /docs/contribution/architecture.md: -------------------------------------------------------------------------------- 1 | # Architecture 2 | 3 | This section will dive into how the code is arranged and how that code relates to the deployed daemons and artifacts. 4 | Before you read this section please make sure that you are familiar with the [Install Guide](/dashboard/install-guide/), the 5 | [Dashboard User Guide](/dashboard/user-guide/) and the [Integration Guide](/skills-client/#client-display-integration). 6 | 7 | SkillTree's skills-service is designed with minimal runtime requirements. 8 | You can start the SkillTree skills-service with zero configuration other than datasource properties for connecting to an available database. 9 | Please visit the [Install Guide](/dashboard/install-guide/) to better understand your installation options. 10 | 11 | Let's now focus on what a production deployment would look like. A production installation of the skills-service will require the following infrastructure: 12 | - [PostgreSQL](https://www.postgresql.org/) - Relational store for project definitions and skill events. 13 | - [RabitMQ Stomp Brokers](https://www.rabbitmq.com/stomp.html) - Used to support [WebSocket](https://en.wikipedia.org/wiki/WebSocket) functionality. 14 | 15 | SkillTree's skills-service is then configured to use PostgeSQL and Stomp Brokers. 16 | 17 | ![Dashboard with Integrated Application](./diagrams/SkillsServiceArchitecture.jpg) 18 | 19 | Integrated clients utilize skills-client libs posted on the public NPM repositories. 20 | These libraries are very thin wrappers around an iFrame tag, they simply retrieve the Skills Display views and its associated data from the skills-service application. 21 | What that means is that the Skills Display is served as its own dedicated url from the Dashboard application of the skills-service and then inserted into an iFrame tag on the client's browser. 22 | Of course all of these details are 100% hidden from the skills-client library users. 23 | 24 | The skills-client libraries also enable integrators to report skill events. 25 | Skill reporting utilities will call the [Report Skill Event Endpoint](/skills-client/endpoints.html#report-skill-event-endpoint) which is exposed via the skills-service. 26 | SkillTree integrators can also call the [Report Skill Event Endpoint](/skills-client/endpoints.html#report-skill-event-endpoint) directly. 27 | Using the skills-client libraries users can register for global events so they can be notified any time a skill event is reported. 28 | An event response receives a [result object](/skills-client/endpoints.html#endpoint-result-object) that contains metadata about the event and the achievements that this event may have triggered. 29 | This is where WebSocket integration is critical. 30 | External clients may report skill events directly via the [Report Skill Event Endpoint](/skills-client/endpoints.html#report-skill-event-endpoint). WebSockets are utilized to propagate the outcome of that event to all the registered clients. 31 | 32 | ## SkillTree Repositories 33 | 34 | 1. [skills-service](https://github.com/NationalSecurityAgency/skills-service): has code for the skills service and dashboard. This is where the majority of code changes occur. 35 | 1. [skills-client](https://github.com/NationalSecurityAgency/skills-client): client JS libraries that provide skill event reporting utilities and a thin iFrame-based wrapper for the Skills Display. 36 | 1. [skills-docs](https://github.com/NationalSecurityAgency/skills-docs): Documentation, you are reading this now! 37 | 1. [skills-stress-test](https://github.com/NationalSecurityAgency/skills-stress-test): Web-based application that facilitates stress tests against the SkillTree service. 38 | 1. [call-stack-profiler](https://github.com/NationalSecurityAgency/call-stack-profiler): Groovy annotation-driven in-code profiling utility used by the services. 39 | 1. [skills-client-examples](https://github.com/NationalSecurityAgency/skills-client-examples): Simple Integration examples using client libraries. 40 | 41 | 42 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/metrics.md: -------------------------------------------------------------------------------- 1 | # Metrics 2 | 3 | Many project administrative pages in the SkillTree dashboard expose metrics and statistics about that particular entity/concept. 4 | These metrics are very much context aware so as an example, graphs and charts you see on a subject page will be for that specific subject and 5 | metrics on the project page will be for the entire project. 6 | 7 | ## Project Metrics 8 | 9 | Project's metrics are accessible via `Project -> Metrics`, providing an overview of project performance. 10 | Metrics can be further broken down by achievements, subjects, and skills, and can be accessed in two ways: 11 | 12 | - Via buttons at the bottom of the Project Metrics page 13 | - Using navigation icons in the top-right corner of the main content area 14 | 15 | ### Project Achievements Metrics 16 | 17 | Accessible via `Project -> Metrics -> Achievements`, displays a level breakdown chart, followed by a detailed achievements table. 18 | 19 | ![SkillTree Metrics](../../screenshots/admin/page-project-metrics-achievements.png) 20 | 21 | Supports filtering and sorting by column. Additionally, achievements can be exported to Excel format, with applied 22 | filters also applied to the exported data. 23 | 24 | ### Project Subject Metrics 25 | 26 | Accessible via Project -> Metrics -> Subjects, providing high-level metrics for each subject, including: 27 | 28 | - User Distribution by Level: A bar chart displaying the number of users who have achieved each level for a given subject. 29 | - Level Progression Over Time: A time-based chart, generated after selecting a subject, showing the number of users who have earned each level over time. 30 | 31 | ![SkillTree Metrics](../../screenshots/admin/page-project-metrics-subjects.png) 32 | 33 | ### Project Skills Metrics 34 | 35 | Accessible via `Project -> Metrics -> Skills`, providing high-level metrics pivoted by skills. The page features a table with the following columns: 36 | 37 | - **Skill Name**: The name of the skill. 38 | - **Links**: Deep link to the skill's administrative page and [Single Skill Metrics page](/dashboard/user-guide/metrics.html#single-skill-metrics) 39 | - **Users Achieved**: The number of users who have completed the skill. 40 | - **Users in Progress**: The number of users who have earned at least 1 point but have not yet completed all required occurrences. 41 | - **Last Reported**: The date when the skill was last reported by any user. 42 | - **Last Achieved**: The date when the skill was last achieved by any user. 43 | 44 | ![SkillTree Metrics](../../screenshots/admin/page-project-metrics-skills.png) 45 | 46 | In addition to the skill metrics table, the page offers several useful filters to help admins quickly identify trends and patterns: 47 | - **Overlooked Skill**: Filter skills that are rarely used or reported. 48 | - **Top Skill**: Filter skills that are most popular or frequently achieved. 49 | - **High Activity**: Filter skills with a high volume of user activity. 50 | - **Never Achieved**: Filter skills that have never been achieved by any user. 51 | - **Never Reported**: Filter skills that have never been reported by any user. 52 | 53 | Admins can also export the entire table to Excel format using the `Export All Rows` button located at the top right of the table. 54 | 55 | ## Single Skill Metrics 56 | 57 | The Single Skill Metrics Section provides detailed metrics for a specific skill, allowing admins to dive deeper into the performance and usage of that skill. 58 | 59 | This page can be accessed in several ways including: 60 | - `Project -> Subject -> Skill -> Metrics` 61 | - `Project -> Metrics -> Skills -> Skill Link` 62 | 63 | ![SkillTree Metrics](../../screenshots/admin/page-topSkill-metrics.png) 64 | 65 | This page showcases Post Achievement Metrics, offering administrators valuable insights into whether skills remain 66 | utilized after achievement. Note that these metrics are most effective for skills with automated achievement event 67 | reporting, which can be set up using the [Skills Reporter JS Utility](/skills-client/js.html#skillsreporter-js-utility) or by leveraging the [REST API endpoint](/skills-client/endpoints.html#report-skill-event-endpoint)." 68 | 69 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/common/oath2-support.md: -------------------------------------------------------------------------------- 1 | 2 | When using Password Auth Mode, the dashboard can also support OAuth2 based authentication. 3 | Currently, OAuth2 is only supported for Google, GitHub, GitLab and Azure Active Directory. 4 | Login buttons get automatically added to the Login page when configured. 5 | To configure, you will need a client ID and client Secret credentials. 6 | These credentials can be created and managed through the providers OAuth 7 | , , , or management pages. 8 | 9 | Once the client ID and secret are set up, they are enabled by adding the following properties: 10 | 11 | ```properties 12 | # Google 13 | spring.security.oauth2.client.registration.google.client-id= 14 | spring.security.oauth2.client.registration.google.client-secret= 15 | spring.security.oauth2.client.registration.google.redirectUriTemplate='https:///{action}/oauth2/code/{registrationId}' 16 | spring.security.oauth2.client.registration.google.iconClass=fab fa-google 17 | 18 | # GitHub 19 | spring.security.oauth2.client.registration.github.client-id= 20 | spring.security.oauth2.client.registration.github.client-secret= 21 | spring.security.oauth2.client.registration.github.redirectUriTemplate='https:///{action}/oauth2/code/{registrationId}' 22 | spring.security.oauth2.client.registration.github.iconClass=fab fa-github 23 | 24 | # GitLab 25 | spring.security.oauth2.client.registration.gitlab.client-id= 26 | spring.security.oauth2.client.registration.gitlab.client-secret= 27 | spring.security.oauth2.client.registration.gitlab.redirect-uri=https:///{action}/oauth2/code/{registrationId} 28 | spring.security.oauth2.client.registration.gitlab.authorization-grant-type=authorization_code 29 | spring.security.oauth2.client.registration.gitlab.clientName=GitLab 30 | spring.security.oauth2.client.registration.gitlab.iconClass=fab fa-gitlab 31 | spring.security.oauth2.client.provider.gitlab.authorization-uri=https://gitlab.com/oauth/authorize 32 | spring.security.oauth2.client.provider.gitlab.token-uri=https://gitlab.com/oauth/token 33 | spring.security.oauth2.client.provider.gitlab.user-info-uri=https://gitlab.com/api/v4/user 34 | spring.security.oauth2.client.provider.gitlab.user-name-attribute=username 35 | 36 | # Azure AD 37 | spring.security.oauth2.client.registration.azure.client-id= 38 | spring.security.oauth2.client.registration.azure.client-secret= 39 | spring.security.oauth2.client.registration.azure.redirect-uri=https:///{action}/oauth2/code/{registrationId} 40 | spring.security.oauth2.client.registration.azure.iconClass=fab fa-microsoft 41 | spring.security.oauth2.client.registration.azure.scope=openid,profile,email 42 | spring.security.oauth2.client.registration.azure.authorization-grant-type=authorization_code 43 | spring.security.oauth2.client.registration.azure.client-name=Azure 44 | spring.security.oauth2.client.registration.azure.provider=azuread 45 | spring.security.oauth2.client.provider.azuread.authorization-uri=https://login.microsoftonline.com/common/oauth2/v2.0/authorize 46 | spring.security.oauth2.client.provider.azuread.token-uri=https://login.microsoftonline.com/common/oauth2/v2.0/token 47 | spring.security.oauth2.client.provider.azuread.user-info-uri=https://graph.microsoft.com/oidc/userinfo 48 | spring.security.oauth2.client.provider.azuread.jwk-set-uri=https://login.microsoftonline.com/common/discovery/keys 49 | ``` 50 | Excluding a provider configuration section will prevent the respective OAuth login button from being added to the Login page. 51 | 52 | Note: To disable username/password authentication entirely and *only* support OAuth based authentication, set the following configuration property: 53 | ```properties 54 | skills.authorization.oAuthOnly=true 55 | ``` -------------------------------------------------------------------------------- /docs/dashboard/user-guide/accessibility.md: -------------------------------------------------------------------------------- 1 | # Accessibility 2 | 3 | At SkillTree, we're dedicated to creating an accessible learning environment that empowers everyone to succeed. This guide highlights our accessibility features and best practices to ensure you can navigate and engage with our platform effortlessly. 4 | 5 | This guide is broken down into two section where the first section outlines accessibility features of the SkillTree 6 | Dashboard and the second provides instructions about creating a SkillTree gamified accessible training in the platform. 7 | 8 | ## Dashboard Accessibility 9 | 10 | This section outlines the accessibility features and best practices for the SkillTree Dashboard. 11 | 12 | ::: tip 13 | Please Note that this accessibility guide is for users interested in creating gamified training experiences in SkillTree Platform. 14 | If you are interested in earning credits in existing trainings, please check out our [Taking a Training Accessibility Guide](/training-participation/accessibility.html#accessibility) for more details. 15 | ::: 16 | 17 | ### Navigation 18 | 19 | #### Basic Navigation 20 | 21 | 22 | #### Landmark Navigation 23 | 24 | The heading structure is organized hierarchically to facilitate easy navigation using screen reader landmark navigation. 25 | 26 | For example, on a project page, the heading levels are organized as follows: 27 | - The project title serves as the main heading (Level 1) 28 | - Subjects (Level 2 heading that groups all subjects) 29 | - Each subject is a Level 3 heading 30 | 31 | This heading hierarchy enables efficient navigation through screen readers. For example, using JAWS Screen Reader: 32 | 1. List all headings with `INSERT+F6` 33 | 2. Navigate directly to the first subject by pressing `3` for the first Level 3 heading 34 | 3. Press `3` again to move to the next subject heading 35 | 4. Once you reach your desired subject, press `Enter` to drill down into the subject 36 | 37 | #### Skip to Main Content 38 | 39 | 40 | 41 | ### Screen Reader Support 42 | 43 | 44 | 45 | ### Visual Adjustments 46 | 47 | 48 | 49 | ### Video, Multimedia and Images 50 | 51 | - Descriptive alt text is added to meaningful images 52 | - Video captions are provided where applicable 53 | - Video and audio transcripts are provided where applicable 54 | 55 | ### Rich Text Editor 56 | 57 | The SkillTree description editor is a full-featured Rich Text Editor. The editor is used in the dashboard to provide 58 | descriptions for Projects, Subjects, Skills, Badges, and also for sending emails to users and project administrators. 59 | 60 | It supports both tab-based navigation and keyboard shortcuts for text editing: 61 | 62 | 63 | ## How Make Accessible Trainings 64 | 65 | ### Video and Audio Content 66 | When creating training content, ensure accessibility for all users by: 67 | - Providing transcripts for video files 68 | - Including captions for audio content 69 | - Refer to the [Audio/Video](/dashboard/user-guide/skills.html#audio-video) section for detailed upload instructions 70 | 71 | ### Image Accessibility 72 | For meaningful images in descriptions: 73 | 1. Use the upload image feature 74 | - Click the `Insert Image` button 75 | - Or use the keyboard shortcut `CTRL+ALT+i` 76 | 2. Add descriptive alt text in the `Description` input box of the insert image popup 77 | 78 | ### Text Formatting 79 | When pasting content into the description editor: 80 | - Use `CTRL+SHIFT+v` or right-click and select `Paste as Plain Text` 81 | - Avoid default paste operations from sources like Microsoft Word 82 | - Default paste operations can: 83 | - Carry inaccessible styles and formatting 84 | - Alter background colors 85 | - Create inaccessible and unattractive displays in dark mode 86 | 87 | These practices ensure your content is accessible to all users, regardless of their needs or preferences. 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/prodInstall.md: -------------------------------------------------------------------------------- 1 | # Production Installation 2 | 3 | SkillTree encourages a high-availability and horizontally scalable production installation. 4 | To achieve both of these goals, multiple instances of skills-service must be installed on different nodes/instances. 5 | Each skills-service node will have the same configuration and is designed to scale-up or scale down horizontally. 6 | You can add or remove instances any time. 7 | 8 | 9 | 10 | There are two installation modes: 11 | 12 | - [Password Auth Mode](/dashboard/install-guide/prodInstall.html#password-auth-mode-install): Accounts created and managed by SkillTree and/or delegated to OAuth2 authentication provider (ex. GitHub, Google, etc..) 13 | - [PKI Auth Mode](/dashboard/install-guide/prodInstall.html#pki-auth-mode-install): PKI Mode is for intranets where organizations utilize PKI with 2-way SSL certificates to implement authentication and authorization. User's browser must be setup with a personal PKI certificate and that certificate must be issued by a Certificate Authority trusted in the dashboard application's truststore. 14 | 15 | :::tip 16 | Definitely use Password Auth Mode if you are not sure which mode is applicable to you. 17 | ::: 18 | 19 | ## Password Auth Mode Install 20 | 21 | 22 | 23 | ![Production Installation for Pass Auth Mode](./diagrams/ProdInstall-Pass.jpg) 24 | 25 | 26 | **4: Spring Session for HTTP Session Management:** Required for a clustered skills-service deployment to persist HttpSession 27 | - SkillTree uses for managing a user’s session information in a clustered environment without being tied to an application container-specific solution. 28 | :::tip 29 | SkillTree recommends using JDBC to store the HTTP session in a clustered environment due to its simplicity, and since a shared PostgreSQL instance is already required there is no need to run a separate product. 30 | For example, adding the following two properties is all that is required to utilize the existing SkillTree PostgreSQL database for session management: 31 | ```properties 32 | spring.session.store-type=jdbc 33 | spring.session.jdbc.initialize-schema=always 34 | ``` 35 | ::: 36 | 37 | **5: Shared keystore for JSON Web Token (JWT) Generation:** Required for a clustered skills-service deployment for JWT generation. If running your SkillTree server in [https SSL](/dashboard/install-guide/config.html#https-ssl-pass-auth-mode-only) mode, you can use the same keystore file for JWT by adding the following property: 38 | ```properties 39 | security.oauth2.jwt.useKeystore=true 40 | ``` 41 | ### Auth Mode skills-service Configuration 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | ## PKI Auth Mode Install 51 | 52 | 53 | ![Production Installation for Pass PKI Mode](./diagrams/ProdInstall-Pki.jpg) 54 | 55 | 56 | **4: User Info Service** - Provides user information based on PKI's Distinguished Name (DN) 57 | - You are responsible for implementing this service, please visit the [User Info Service](/dashboard/install-guide/installModes.html#user-info-service) section to learn more. 58 | - Make sure to run it in High Availibility mode 59 | 60 | ### PKI Mode skills-service configuration 61 | 62 | 63 | 64 | Enable PKI mode install: 65 | ```properties 66 | skills.authorization.authMode=PKI 67 | ``` 68 | 69 | 70 | 71 | ``User Info Service`` client properties: 72 | 73 | 74 | If ``User Info Service`` utilizes 2-way SSL then add the following client authentication properties (Java System Properties): 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /docs/release-notes/skills-client.md: -------------------------------------------------------------------------------- 1 | # Client Libraries Release Notes 2 | 3 | This page documents high-level release notes for libraries - JS libraries used by the SkillTree integrated applications 4 | 5 | 6 | 7 | To obtain deployable artifacts please visit [Distributions](/dashboard/install-guide/distributions.html) page. 8 | 9 | 10 | 11 | ::: tip Important Note: 12 | To enable seamless integration with Skills Display, this library utilizes an iFrame wrapper to retrieve 13 | the necessary views and data from the skills-service application. This deliberate architectural design choice is a key 14 | aspect of the SkillTree Platform, as it minimizes the need for frequent upgrades to the skills-client library. 15 | 16 | By decoupling the Skills Display functionality from the skills-client library, we've achieved a significant advantage: 17 | most updates and improvements to Skills Display will be automatically reflected in the skills-client library whenever 18 | the skills-service application is upgraded. This means that skills-client integrators can enjoy the benefits of new 19 | features and enhancements without the need for manual library updates. 20 | 21 | As a result, **the skills-client libraries are intentionally designed to be relatively static, with infrequent releases**. 22 | This approach ensures that integrators can rely on a stable and consistent library, while still benefiting from the 23 | ongoing evolution of the SkillTree Platform. 24 | ::: 25 | 26 | ## 3.6.0 27 | 28 | - Added the ability to place the skills-client library in a dormant state. When the library is in a dormant state, it 29 | becomes inactive and does not perform authentication, network communication, skill reporting, or any other activities. 30 | - Upgraded JS libraries 31 | - Bug Fixes 32 | 33 | ## 3.5.0 34 | 35 | - Ensure that skills-client react libraries work with React 18 36 | - Removed history package dependency 37 | - Addressed 3rd party library security vulnerabilities 38 | - Allowed options to be passed to the Skills Display component for future configuration options 39 | - Added ability to respond to scroll events from the Skills Display component 40 | 41 | ## 3.4.1 42 | 43 | - Detect when the web-socket connection errors, and if the message indicates an invalid_token, then obtain a new token and reconnect 44 | 45 | ## 3.4.0 46 | 47 | - Ensure that skills-client react libraries work with React 17 48 | 49 | ## 3.3.1 50 | 51 | - Implemented (``navigate``) method for programmatic navigation in the ``SkillsDisplay`` component 52 | 53 | ## 3.3.0 54 | 55 | - Improved resilience of skill event reporting. Failed attempts are stored in browser's local cache and are retried 56 | - Enhanced ``SkillsDisplay`` component to support browser's native back button as well as deep linking; this feature was added in all of the libraries 57 | - Implemented route changed event (``handleRouteChanged``) in the ``SkillsDisplay`` component 58 | - Bug Fixes 59 | 60 | ## 3.2.0 61 | 62 | - Allow ``SkillsConfiguration.configure`` to be called multiple times 63 | - Disabled automatic OAuth redirection by default 64 | - Improved Cypress.io tests 65 | 66 | ## 3.1.1 67 | 68 | - Upgraded axios 69 | 70 | ## 3.1.0 71 | 72 | - Added full OAuth support for the SkillTree platform (dashboard as well as client libraries) 73 | - Upgraded maven and npm dependencies 74 | 75 | ## 3.0.1 76 | 77 | - Added JS-based logging 78 | - Improved error messages 79 | - Bug fix where Existing Authorization headers can cause client-display rendering to fail 80 | 81 | ## 3.0.0 82 | 83 | - Implemented Angular SkillTree Integration libraries 84 | - Implemented process to publish releases to Npmjs 85 | - Implemented extensive GitHub Actions Continuous Integration (CI) 86 | - Native JS Level Component implementation 87 | - Improved error handling and enhanced error messages when bad configuration is supplied 88 | - Improved documentation 89 | - Changed Native JS SkillDisplayJS component to allow construction without specifying parameters 90 | - Added numerous new tests, fixed multitude of bugs and and improved overall stability 91 | 92 | 93 | -------------------------------------------------------------------------------- /docs/dashboard/user-guide/levels.md: -------------------------------------------------------------------------------- 1 | # Levels 2 | 3 | Levels are users' achievement path - the overall goal of the gameified training profile is to encourage users to achieve the highest level. 4 | Levels are tracked for the entire [project](/dashboard/user-guide/projects.html) as well as for each [subject](/dashboard/user-guide/subjects.html) which provides users many ways to progress forward. 5 | 6 | The Skills dashboard supports two flexible ways to manage levels: 7 | - [Percentage Based](#percentage-based-levels) *(default)*: Each level is defined as a percentage of **overall** points and the actual level's point range is calculated based on that percentage. 8 | - [Point based](#point-based-levels): Level's from and to points are configured explicitly. 9 | 10 | ::: tip 11 | There can be only one level strategy selected and it will apply to the **entire** project including project levels and subject levels. 12 | ::: 13 | 14 | Please visit ``Project -> Settings`` to configure a level management strategy. 15 | 16 | ![SkillTree Levels Page](../../screenshots/admin/page-project-levels.png) 17 | 18 | ## Best practices 19 | - Consider starting with the [Percentage Based](#percentage-based-levels) strategy as each level's points are generated from a percentage so it's quick to get started. Once the majority of skills are created and the overall points are stable then the switch to the [Point based](#point-based-levels) strategy may be considered. 20 | - Initially, play around with both strategies but then select one strategy and stick with it. Both strategies work very well so it's a matter of preference. 21 | - See the [Percentage Based vs. Points Based](#percentage-based-vs-points-based) section to determine which option works best for you. 22 | 23 | ## Percentage Based Levels 24 | 25 | Each level is defined as a percentage of **overall** points and the actual level's point range is calculated based on that percentage. 26 | By default, projects and subjects are created with **5** levels: 27 | 28 | | Level | Percentage | 29 | |:------- |:----------- | 30 | | 1 | 10% | 31 | | 2 | 25% | 32 | | 3 | 45% | 33 | | 4 | 67% | 34 | | 5 | 92% | 35 | 36 | 37 | This allows levels to be fluid as Skills are defined and **overall** points change. 38 | 39 | ## Point Based Levels 40 | 41 | Using ``Project -> Settings``, levels can be changed to a points based strategy, where each level requires the project administrator to define an explicit point range. From and to points are defined with ``from`` being exclusive and ``to`` being inclusive. 42 | 43 | ::: tip Please Note 44 | A project must have at least 100 total points defined before this setting can be enabled. 45 | ::: 46 | 47 | ::: warning Empty Project and Subject 48 | In the event that a project is switched to points based levels, any **empty** subjects (subjects with no skills) will have levels defined 49 | based on a theoretical points maximum of 1000 e.g., "Level 1" at 100-250 points, "Level 2" at 250-450 points, "Level 3" at 450-670, etc. These values can 50 | be easily edited after the configuration change if desired. 51 | ::: 52 | 53 | ## Percentage Based vs. Points Based 54 | 55 | So which strategy is right for your application? As always the answer is... it depends :)! 56 | 57 | The percentage based approach is the easiest to manage - the points are always calculated (and re-calculated) based on the defined percentages. 58 | As skills are added, and therefore the overall amount of points goes up, the point requirements for levels are re-calculated. 59 | 60 | But what about users that already achieved a particular level based on the previously defined points (as calculated based on the percentages)? 61 | The system's overall approach is to never take away achievements therefore that achieved level will persist. 62 | Users will simply need to earn those missing points in addition to the next level's point requirements in order to progress to the next level. 63 | 64 | ::: tip Please note 65 | Our overall methodology is to **never** take away achievements 66 | ::: 67 | 68 | If you don't like the idea that the point requirements to achieve a particular level will vary with time (as skills are added) then the points based management strategy is for you. 69 | Once you switch to the [Point based](#point-based-levels) strategy each level will have an explicit *from* and *to* points defined. 70 | 71 | As new skills are added, the extra points will *not* affect existing levels and without further actions will *not* influence what it takes to achieve those levels. 72 | You really have two options to address this issue: 73 | 1. change *from* and *to* points of each level *OR* 74 | 1. create additional levels that encapsulate the newly added points. 75 | 76 | Approach #1 has the same issues as the percentage based strategy. Approach #2 requires careful planning so that when new points are added a new level is created to accommodate those points. 77 | -------------------------------------------------------------------------------- /logos/skilltree_log_v1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 12 | 13 | 14 | 15 | 18 | 21 | 24 | 27 | 28 | 31 | 32 | 33 | 34 | 35 | 40 | 44 | 47 | 49 | 51 | 55 | 58 | 62 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /docs/.vuepress/public/img/skilltree_logo_v1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 12 | 13 | 14 | 15 | 18 | 21 | 24 | 27 | 28 | 31 | 32 | 33 | 34 | 35 | 40 | 44 | 47 | 49 | 51 | 55 | 58 | 62 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /docs/dashboard/install-guide/installModes.md: -------------------------------------------------------------------------------- 1 | # Installation Modes 2 | 3 | The SkillTree dashboard and service (skills-service) support two separate modes of authentication. The dashboard can be configured for password based authentication *or* PKI based authentication. 4 | 5 | 6 | - [Password Auth Mode](/dashboard/install-guide/installModes.html#password-auth-mode): Accounts created and managed by SkillTree and/or delegated to OAuth2 authentication provider (ex. GitHub, Google, etc..) 7 | - [PKI Auth Mode](/dashboard/install-guide/installModes.html#pki-auth-mode): PKI Mode is for intranets where organizations utilize PKI with 2-way SSL certificates to implement authentication and authorization. User's browser must be setup with a personal PKI certificate and that certificate must be issued by a Certificate Authority trusted in the dashboard application's truststore. 8 | 9 | :::tip 10 | Definitely use Password Auth Mode if you are not sure which mode is applicable to you. 11 | ::: 12 | 13 | ## Password Auth Mode 14 | When configured for password based authentication, users will need to manually create a SkillTree account by clicking on the "Sign Up" link on the main login page. After creating an account, users can login using the username and password that was used when creating the account. 15 | 16 | Password Auth Mode is enabled by default, or can be explicitly enabled by setting the following property: 17 | 18 | ```properties 19 | skills.authorization.authMode=FORM 20 | ``` 21 | 22 | ### OAuth Support 23 | 24 | 25 | ## PKI Auth Mode 26 | PKI Mode is for intranets where organizations utilize PKI with 2-way SSL certificates to implement authentication and authorization. 27 | When configured for PKI based authentication, the user's browser must be setup with a personal PKI certificate and that certificate must be issued by a Certificate Authority trusted in the dashboard application's truststore. 28 | 29 | To enable PKI Auth Mode, set the following configuration property: 30 | ```properties 31 | skills.authorization.authMode=PKI 32 | ``` 33 | 34 | PKI Mode requires: 35 | - running ``User Info Service`` 36 | - configuring client properties to communicate with ``User Info Service`` 37 | 38 | ### User Info Service 39 | 40 | In PKI Mode, users authenticate using PKI certificates - the only information that is extracted from a client certificate is the Distinguished Name (DN). 41 | The User Info Service provides a way to look up users' metadata by DN, such as name and email. 42 | It is your responsibility to implement and run an instance of User Info Service specific to your organization. 43 | 44 | The User Info Service is configured in the skills-service by adding the following configuration properties: 45 | 46 | 47 | 48 | The User Info Service will need to implement the following REST endpoints that can return user information for the client certificate's Distinguished Name (DN): 49 | - skills.authorization.userInfoUri 50 | - skills.authorization.userQueryUri 51 | - skills.authorization.userInfoHealthCheckUri 52 | 53 | #### skills.authorization.userInfoUri endpoint 54 | 55 | This endpoint returns user information by DN. The endpoint is configured via the ``skills.authorization.userInfoUri`` property and expects a DN parameter, for example ``/userInfo?dn={dn}``. 56 | This endpoint must return valid JSON with the following properties for a given user's DN: 57 | 58 | ``` json 59 | { 60 | "firstName":"", 61 | "lastFirstName":"", 62 | "email":"", 63 | "username":"", 64 | "userDn":"", 65 | "usernameForDisplay":"" 66 | } 67 | ``` 68 | - *username:* property is a user's unique identifier; can be a number formatted as a string, ex. ``000001`` 69 | - *usernameForDisplay:* this is how user will be display in the SkillTree dashboard 70 | 71 | #### skills.authorization.userQueryUri endpoint 72 | 73 | This endpoint is used by the SkillTree dashboard dropdowns to suggest existing users. 74 | 75 | The endpoint is configured via the ``skills.authorization.userQueryUri`` property and expects a query parameter, for example: ``/userQuery?query={query}``. 76 | This endpoint must return a list of the above JSON objects for user DN's that meet the query criteria. For example: 77 | 78 | ```json 79 | [ 80 | { 81 | "firstName":"", 82 | "lastFirstName":"", 83 | "email":"", 84 | "username":"", 85 | "userDn":"", 86 | "usernameForDisplay":"" 87 | }, 88 | { 89 | "firstName":"", 90 | "lastFirstName":"", 91 | "email":"", 92 | "username":"", 93 | "userDn":"", 94 | "usernameForDisplay":"" 95 | } 96 | ] 97 | ``` 98 | #### skills.authorization.userInfoHealthCheckUri endpoint 99 | 100 | Health check endpoint. 101 | The endpoint is configured via the ``skills.authorization.userInfoHealthCheckUri`` property and should return the following JSON object: 102 | 103 | ``` json 104 | {"status":"UP"} 105 | ``` 106 | 107 | #### optional 2-way SSL 108 | If your ``User Info Service`` is configured to use 2-way SSL then ``skills-service`` must add the following client authentication properties (Java System Properties): 109 | 110 | -------------------------------------------------------------------------------- /docs/training-participation/training-portfolio.md: -------------------------------------------------------------------------------- 1 | # Training Portfolio 2 | 3 | The first visit to SkillTree's training home page will display an introductory splash page. 4 | To get started, click the 'Projects Catalog' button to view all available training projects. 5 | 6 | ## Projects Catalog 7 | The **Projects Catalog** page lists available trainings that can be added to your Progress & Ranking view. 8 | 9 | ![Manage My Projects Page](../screenshots/progress-and-ranking/page-progress-and-rankings-manage-my-projects.png) 10 | 11 | To add a project to your Progress & Ranking view, click the **Add** button next to the project name. 12 | To remove a project, click the **Remove** button next to the project name. 13 | 14 | ::: tip 15 | - You can also Preview the project before adding it to your Progress & Ranking view by clicking the ``Preview`` button to the right of the project name. 16 | - If you have a question about the project, you can send a message to the project's administrators by clicking the **Contact** button next to the project name. 17 | - Each row in the projects table can be expanded to view the project's description and its requirements such as subject and skills counts. 18 | ::: 19 | 20 | Once you've added one or more projects to your Progress & Ranking view, click the **Back to My Progress** button to begin training. 21 | 22 | ## Home Page 23 | 24 | The home page displays your overall progress across all selected trainings. 25 | You can easily add or remove trainings, which will update what's shown on the home page. 26 | 27 | In addition to the overall progress, you can also drill down into a specific training by clicking the training cards at the bottom of the home page. 28 | For more details about making progress in an individual training, see the [Taking a Training](/training-participation/take-training.html) section. 29 | 30 | ![SkillTree Dashboard Progress And Ranking](../screenshots/progress-and-ranking/page-progress-and-rankings.png) 31 | 32 | From the home page, you can navigate to: 33 | - [Quizzes and Surveys History](/training-participation/training-portfolio.html#quizzes-and-surveys-history): View your completed quizzes and surveys 34 | - [My Badges](/training-participation/training-portfolio.html#my-badges): View your earned and available badges 35 | - [Usage Page](/training-participation/training-portfolio.html#training-usage): View your daily usage for selected projects 36 | - [Individual Training](/training-participation/take-training.html): Click the `View` button on a training card to proceed to that training 37 | 38 | ::: tip 39 | - You can remove trainings from your home page by clicking the "X" icon in the top-right corner of each training card. 40 | If accidentally removed, you can easily re-add a training by going back to the **Projects Catalog** page and clicking the **Add** button next to the project name. 41 | ::: 42 | 43 | ## Quizzes and Surveys History 44 | 45 | View your completed quizzes and surveys by clicking the **History** button on the Quizzes and Surveys card. 46 | 47 | ![page-my-quiz-attempts.png](../screenshots/progress-and-ranking/page-my-quiz-attempts.png) 48 | 49 | The **My Quizzes and Surveys** page features a searchable and sortable history table of all your passed and failed quizzes, as well as completed surveys. 50 | You can drill down into a quiz or survey attempt by clicking on its name. 51 | 52 | ![page-my-quiz-single-attempt.png](../screenshots/progress-and-ranking/page-my-quiz-single-attempt.png) 53 | 54 | A single quiz or survey attempt displays the results. For surveys, all questions and their associated selections are shown. 55 | 56 | For quizzes, the answers shown depend on the attempt's status: 57 | - `Passed` Quiz: all the questions and answers are shown 58 | - `Failed` Quiz: answers may be shown or not depending on how quiz administrator selected to configure the quiz 59 | - `Needs Grading` Quiz: answers are not displayed as they are not yet graded 60 | 61 | ## My Badges 62 | 63 | View your earned and available badges by visiting the **My Badges** page from the **My Projects** page. 64 | 65 | ![My Badges Page](../screenshots/progress-and-ranking/page-progress-and-rankings-badges.png) 66 | 67 | The **My Badges** page is divided into **My Earned Badges** and **Available Badges**. 68 | Click an earned badge to see the skills and points that earned it. 69 | 70 | Available badges lists all badges that haven't been fully achieved from Trainings added to **My Projects** and currently shown on the home page. 71 | 72 | ::: tip 73 | You can search badges by name and filter by **Project Badges**, **Gems**, or **Global Badges** 74 | ::: 75 | 76 | 77 | ## Training Usage 78 | 79 | View your daily usage for selected projects by clicking the **Usage** button on a Project card. 80 | 81 | ![My Usage Page](../screenshots/progress-and-ranking/page-progress-and-rankings-view-my-usage.png) 82 | 83 | ## Preferences 84 | 85 | To customize your personal preferences: 86 | 87 | 1. Click the User button in the top right corner of the page 88 | 2. Select **Settings** 89 | 3. Navigate to the **Preferences** tab 90 | 91 | ![page-settings-preference.png](../screenshots/admin/page-settings-preference.png) 92 | 93 | Available customization options: 94 | 95 | - **Rank and Leaderboard Opt-Out**: When enabled, you'll be excluded from the Leaderboard and won't receive a rank in any trainings you're taking 96 | - **Dark Mode**: Switch to a light-on-dark color scheme 97 | - **Keyboard Shortcuts**: Customize keyboard shortcuts for training navigation and search 98 | - **Default Home Page**: Choose your default landing page (only applicable to training creators) --------------------------------------------------------------------------------