├── 01_cross_workstream
├── content_specification
│ ├── accordion-component.json
│ ├── component_text.md
│ ├── graphic-component.json
│ ├── graphical_mcq-component.json
│ ├── hot-graphic.json
│ ├── matching-component.json
│ ├── mcq-component.json
│ ├── narrative-component.json
│ ├── sub-objects.json
│ ├── text-component.json
│ └── text-input-component.json
├── developer_requirements.md
├── glossary_of_terms.docx
├── mvp_definition
│ └── supporting_docs
│ │ ├── learner_support_and_assessment.jpg
│ │ └── proposed_MVP_for_Adapt_output.pdf
├── principles_architecture.xlsx
├── process
│ └── gitflow.docx
├── style_guide.md
└── vision_breakdown.docx
├── 02_authoring_tool
├── 01_concept_and_vision
│ ├── adapt_authoring_concept_and_vision.docx
│ └── adapt_authoring_concept_and_vision.pdf
├── 02_requirements
│ ├── AT-MVP-reqs.pdf
│ ├── Adapt_authoring_requirements.mm
│ └── adapt_authoring_user_stories.xlsx
├── 03_ui_design
│ ├── v1
│ │ ├── 01-adapt-login.jpg
│ │ ├── 02-adapt-create-account.jpg
│ │ ├── 03-adapt-dashboard-grid.jpg
│ │ ├── 04-adapt-dashboard-list.jpg
│ │ ├── 05-adapt-course-structure.jpg
│ │ ├── 06-adapt-page-structure-1.jpg
│ │ ├── 07-adapt-select-components-1.jpg
│ │ ├── 08-adapt-select-components-2.jpg
│ │ ├── 09-adapt-select-components-3.jpg
│ │ ├── 10-adapt-page-structure-2.jpg
│ │ ├── 11-adapt-component-editing-single.jpg
│ │ ├── 12-adapt-component-editing-multiple.jpg
│ │ ├── 13-adapt-course-configuration.jpg
│ │ ├── 14-adapt-theme-setting.jpg
│ │ ├── 15-adapt-course-extensions.jpg
│ │ └── adapt ui v1.psd
│ ├── v2
│ │ ├── 01-dashboard.png
│ │ ├── 02-course-structure.png
│ │ ├── 03-page-editor.png
│ │ └── 04-editor-page.png
│ └── v3
│ │ ├── 01-login.png
│ │ ├── 02-create-account.png
│ │ ├── 03-dashboard.png
│ │ ├── 04-dashboard-menu.png
│ │ ├── 05-course-structure.png
│ │ ├── 06-page-structure.png
│ │ ├── 07-add-component.png
│ │ ├── 08-page-structure-cont.png
│ │ ├── 09-empty-dashboard.png
│ │ ├── 10-project-wizard.png
│ │ └── 11-editor-page.png
├── 04_feature_development
│ ├── import_export
│ │ ├── ImportExport.mm
│ │ └── import-export-reqs.md
│ ├── menu_editor
│ │ └── menu-editor-reqs.md
│ ├── multilanguage
│ │ └── multi-language-reqs.md
│ ├── multiple_frameworks
│ │ └── discussion_notes.md
│ ├── server_restructure
│ │ ├── AAT-boot.pdf
│ │ ├── AAT-module-boot.pdf
│ │ ├── Module-breakdown.pdf
│ │ ├── meeting-notes-19.04.25.pdf
│ │ ├── module-loader-changes-01.20.pdf
│ │ ├── mvp-definition.pdf
│ │ ├── proposal.pdf
│ │ ├── prototype-breakdown.pdf
│ │ ├── requirements.pdf
│ │ ├── update-19.08.pdf
│ │ └── user-stories.pdf
│ ├── tenant_management
│ │ └── tenant-management-reqs.md
│ ├── theme_editor
│ │ └── theme-editor-reqs.md
│ └── user_management
│ │ └── user-management-reqs.md
├── 05_architecture
│ ├── multitenancy.md
│ ├── structural-1.jpg
│ ├── structural-1.mdj
│ └── supporting_docs
│ │ ├── adapt_authoring_data_model.png
│ │ ├── adapt_authoring_subsystems.png
│ │ ├── adapt_authoring_ui_modules_admin.pdf
│ │ ├── adapt_authoring_ui_modules_content_creator.pdf
│ │ ├── editing_flow.png
│ │ └── technical_architecture_uses_view.png
├── 06_end_user_documentation
│ ├── api
│ │ └── swagger-spec.yaml
│ └── supporting_docs
│ │ ├── content_production_workflow_example_1.png
│ │ └── content_production_workflow_example_2.pdf
├── 07_community_discussion
│ ├── architecture.pdf
│ ├── roadmap-2016-12.pdf
│ ├── roadmap-2017-11.pdf
│ ├── roadmap-2018-06.pdf
│ └── roadmap.json
└── 08_test_cases
│ ├── README.md
│ ├── test runs
│ ├── 0.7.0.md
│ └── 0.9.0.md
│ └── test suites
│ ├── AssetManagement.md
│ ├── CourseImport.md
│ ├── CourseSharingDownloading.md
│ ├── Courses.md
│ ├── CoursesMenuLock.md
│ ├── CoursesThemeEditor.md
│ ├── Login.md
│ ├── PluginManagement.md
│ └── UserManagement.md
├── 03_framework_output
├── 01_concept_and_vision
│ └── adapt_framework_concept_and_vision.docx
├── 02_requirements
│ ├── Adapt_Framework_requirements.mm
│ └── Framework_release_1-0_definition.mm
├── 04_user_interface
│ └── supporting_docs
│ │ ├── adapt_course_progress_drop_down.png
│ │ ├── adapt_course_resources panel.png
│ │ ├── adapt_course_tools_tab_phone.png
│ │ ├── adapt_course_ui_example_wireframe.png
│ │ └── smartphone_active_resources.png
└── 05_architecture
│ ├── adapt_framework_architecture.docx
│ └── supporting_docs
│ ├── adapt_framework_data_model.png
│ └── adapt_framework_folder_structure.pdf
├── 04_wiki_assets
├── adapt_authoring
│ └── images
│ │ ├── cmd_basic.jpg
│ │ ├── cmd_cwd.jpg
│ │ ├── cmd_npm.jpg
│ │ ├── download_zip_btn.jpg
│ │ ├── mongo-activity-monitor.png
│ │ ├── mongo-brew-services-started-report.png
│ │ ├── mongo-brew-services-started.png
│ │ ├── mongo-brew-services-stopped.png
│ │ ├── mongo-window-mongo-exe-cmd.png
│ │ ├── mongo-window-mongo-exe-started.png
│ │ ├── mongo-window-services-running.png
│ │ ├── mongod-enable.png
│ │ ├── mongod-status-enabled.png
│ │ ├── mongod-status.png
│ │ ├── terminal_app.jpg
│ │ ├── terml_basic.jpg
│ │ ├── terml_cwd.jpg
│ │ ├── terml_npm.jpg
│ │ └── windows_search.jpg
├── adapt_framework
│ ├── Adapt-Accessibility-OS-Doc.pdf
│ ├── a-b-c_structure.png
│ ├── accessibility-notes.pdf
│ ├── adapt-a-b-c.jpg
│ ├── adapt-component-span.jpg
│ ├── adapt-learning-logo.jpg
│ ├── adapt-learning-logo_640x200.jpg
│ ├── adapt-learning-logo_850x200.jpg
│ ├── adapt-logo-mrgn-lft.jpg
│ ├── adapt-logo_208x200.gif
│ ├── deep-scroll01.png
│ └── ml-utf8-dialog.png
├── plug-ins
│ └── images
│ │ ├── accordion01.gif
│ │ ├── adapt-learning-logo.jpg
│ │ ├── adapt-learning-logo_640x200.jpg
│ │ ├── adapt-learning-logo_850x200.jpg
│ │ ├── adapt-logo-mrgn-lft.jpg
│ │ ├── adapt-logo_208x200.gif
│ │ ├── assessmentResults01.png
│ │ ├── assessmentResults02.png
│ │ ├── assessmentResultsTotal01.gif
│ │ ├── blank01.png
│ │ ├── bookmarking.gif
│ │ ├── boxmenu01.png
│ │ ├── boxmenu02.png
│ │ ├── colour_variables_v2.png
│ │ ├── colour_variables_v2_lft.png
│ │ ├── colours_v2.png
│ │ ├── glossary.gif
│ │ ├── gmcq01.gif
│ │ ├── gmcq05.png
│ │ ├── graphic01.png
│ │ ├── graphic02.jpg
│ │ ├── hotgraphic01.gif
│ │ ├── hotgraphic02.gif
│ │ ├── hotgraphic05.jpg
│ │ ├── hotgraphic06.png
│ │ ├── hotgraphic07.png
│ │ ├── language-picker.gif
│ │ ├── languagePicker01.gif
│ │ ├── languagePicker02.png
│ │ ├── matching01.gif
│ │ ├── matching05.jpg
│ │ ├── mcq01.gif
│ │ ├── media01.jpg
│ │ ├── media02.gif
│ │ ├── narrative01.gif
│ │ ├── narrative02.gif
│ │ ├── plp01.gif
│ │ ├── plp05.png
│ │ ├── resources01.gif
│ │ ├── slider01.gif
│ │ ├── text01.png
│ │ ├── textInput01.gif
│ │ ├── trickle01.gif
│ │ ├── vanilla-dir01.png
│ │ ├── vanilla-dir02.png
│ │ ├── vanilla-dir03.png
│ │ ├── vanilla-dir04.png
│ │ ├── vanilla-dir05.png
│ │ └── vanilla01.jpg
└── v2.0_templates
│ ├── Plug-ins_Boilerplate.pdf
│ └── RDME_wiki_wireframes.pdf
├── 05_style_guide
└── Adapt_style_guide.pdf
└── 06_style_guide
└── Adapt_style_guide.pdf
/01_cross_workstream/content_specification/accordion-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "accordion",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component",
12 | "items" : [
13 | {"content_item"}
14 | ]
15 | },
16 | "storage" : {
17 | "last_update" : "timestamp",
18 | "updated_by" : "user_id",
19 | "course_id" : "ref:id_of_project",
20 | "component_id" : "unique string",
21 | "_parentId" : "ref:another_component",
22 | "_type" : "enum:object_type",
23 | "_component" : "enum:component_type",
24 | "_classes" : [
25 | {"class_object"}
26 | ],
27 | "_layout" : "enum:layout_type",
28 | "title" : [
29 | {
30 | "_component" : "text_object",
31 | "format" : "plain",
32 | "content" : "title of component",
33 | "language" : "en-GB"
34 | }
35 | ],
36 | "intro_text" : [
37 | {
38 | "_component" : "text_object",
39 | "format" : "enum:markdown|html|json|plain",
40 | "content" : "richtext: body of component",
41 | "language" : "en-GB"
42 | }
43 | ],
44 | "items" : [
45 | {"item_object"}
46 | ]
47 | },
48 | "constraints" : [
49 | "title must only contain plain text objects",
50 | "body must contain at least one text object",
51 | "id is globally unique"
52 | ]
53 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/component_text.md:
--------------------------------------------------------------------------------
1 | # Content Specification - Text Component
2 |
3 | ## Output JSON
4 |
5 | {
6 | "_id" : "unique string, component_id in storage json",
7 | "_parentId" : "ref:another_component",
8 | "_type" : "enum:object_type",
9 | "_component" : "enum:component_type",
10 | "_classes" : "space separated string",
11 | "_layout" : "enum:layout_type",
12 | "title" : "plaintext: title of component",
13 | "body" : "richtext: body of component"
14 | }
15 | ## Storage JSON
16 | {
17 |
18 | "last_update" : "timestamp",
19 | "updated_by" : "user_id",
20 | "course_id" : "ref:id_of_project",
21 | "slug" : "unique-url-friendly-word",
22 | "component_id" : "unique string",
23 | "_parentId" : "ref:another_component",
24 | "_type" : "enum:object_type",
25 | "_component" : "enum:component_type",
26 | "_classes" : [
27 | {"class_object"}
28 | ],
29 | "_layout" : "enum:layout_type",
30 | "title" : [
31 | {
32 | "_component" : "text_object",
33 | "format" : "plain",
34 | "content" : "title of component",
35 | "language" : "en-GB"
36 | }
37 | ],
38 | "body" : [
39 | {
40 | "_component" : "text_object",
41 | "format" : "enum:markdown|html|json|plain",
42 | "content" : "richtext: body of component",
43 | "language" : "en-GB"
44 | }
45 | ]
46 | }
47 |
48 | ### Comments/Questions
49 | (These should be replaced with constraints/behaviours/statements of fact when we decide on the solution).
50 |
51 | * do we need both \_type and \_component? Can we coalesce these attributes?
52 | * I've suggested a text object schema, which should be used everywhere that there's some output text defined. This may require some validation rules around length (possibly on plain text only)
53 | * Should a title be plain text only or should we allow some formatting in there?
54 | * How do we handle language support? In this approach I've suggested that there is _one_ instance of a component and that its attributes have multiple values depending on the language. An alternative would be to clone the component instance, but I think that would cause problems with IDs and references. Also, there is only one thing here so we should represent it as a single object in our data model.
55 | * I've defined some values as ENUMs (even though I know JSON and javascript isn't strictly typed like that). We should define these elsewhere though (I anticipate the Authoring tool having validation rules based on the values used).
56 | * the richtext content of the content attribute may be HTML or it may be markdown or it may be a JSON array of rich text objects - it's flexible. I anticipate the "format" mapping to plugin types so we can change these per tenant.
57 | * I'm unclear on the behaviours of this component. Is the title required? Do we change the content on mobile devices? **Remember that truncation is not a content strate**
58 |
59 | ## Constraints/Behaviours
60 | * title must only contain plain text objects
61 | * body must contain at least one text object
62 | * id is globally unique
63 |
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/graphic-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "graphic",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component",
12 | "graphic" : {
13 | "large" : {
14 | "url" : "http://url",
15 | "alt" : "alt attribute"
16 | },
17 | "medium" : {
18 | "url" : "http://url",
19 | "alt" : "alt attribute"
20 | }
21 | "small" : {
22 | "url" : "http://url",
23 | "alt" : "alt attribute"
24 | }
25 | }
26 | },
27 | "storage" : {
28 | "last_update" : "timestamp",
29 | "updated_by" : "user_id",
30 | "course_id" : "ref:id_of_project",
31 | "component_id" : "unique string",
32 | "_parentId" : "ref:another_component",
33 | "_type" : "enum:object_type",
34 | "_component" : "enum:component_type",
35 | "_classes" : [
36 | {"class_object"}
37 | ],
38 | "_layout" : "enum:layout_type",
39 | "title" : [
40 | {
41 | "_component" : "text_object",
42 | "format" : "plain",
43 | "content" : "title of component",
44 | "language" : "en-GB"
45 | }
46 | ],
47 | "body" : [
48 | {
49 | "_component" : "text_object",
50 | "format" : "enum:markdown|html|json|plain",
51 | "content" : "richtext: body of component",
52 | "language" : "en-GB"
53 | }
54 | ],
55 | "graphic" : [
56 | {"image_object"}
57 | ]
58 | },
59 | "constraints" : [
60 | "title must only contain plain text objects",
61 | "body must contain at least one text object",
62 | "id is globally unique"
63 | ]
64 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/graphical_mcq-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "gmcq",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "intro_text" : "plaintext",
12 | "question" : "richtext: body of component",
13 | "attempts" : "number",
14 | "random" : "boolean",
15 | "selectable" : "number",
16 | "point" : "boolean",
17 | "graphic" : [{"image_object"}],
18 | "feedback" : {
19 | "correct" : "richtext",
20 | "incorrect" : "richtext",
21 | "partly" : "richtext"
22 | },
23 | "items" : [{"answer_item_object"}],
24 | "button" : {
25 | "submit" : {"text_object(plain)"},
26 | "reset" : {"text_object(plain)"},
27 | "model" : {"text_object(plain)"},
28 | "user" : {"text_object(plain)"},
29 | }
30 | },
31 | "storage" : {
32 | "last_update" : "timestamp",
33 | "updated_by" : "user_id",
34 | "course_id" : "ref:id_of_project",
35 | "slug" : "unique-url-friendly-word",
36 | "component_id" : "unique string",
37 | "_parentId" : "ref:another_component",
38 | "_type" : "enum:object_type",
39 | "_component" : "enum:component_type",
40 | "_classes" : [
41 | {"class_object"}
42 | ],
43 | "_layout" : "enum:layout_type",
44 | "title" : [
45 | {
46 | "object_type" : "text_object",
47 | "format" : "plain",
48 | "content" : "title of component",
49 | "language" : "en-GB"
50 | }
51 | ],
52 | "intro_text" : {"text_object(plain)"},
53 | "question" : [
54 | {
55 | "object_type" : "text_object",
56 | "format" : "enum:markdown|html|json|plain",
57 | "content" : "richtext: body of component",
58 | "language" : "en-GB"
59 | }
60 | ],
61 | "attempts" : "number",
62 | "random" : "boolean",
63 | "selectable" : "number",
64 | "graphic" : [{"image_object"}],
65 | "feedback" : {
66 | "correct" : {"text_object(rich)"},
67 | "incorrect" : {"text_object(rich)"},
68 | "partly" : {"text_object(rich)"}
69 | },
70 | "items" : [{"answer_item_object"}],
71 | "button" : {
72 | "submit" : {"text_object(plain)"},
73 | "reset" : {"text_object(plain)"},
74 | "model" : {"text_object(plain)"},
75 | "user" : {"text_object(plain)"},
76 | }
77 | },
78 | "constraints" : [
79 | "title must only contain plain text objects",
80 | "body must contain at least one text object",
81 | "id is globally unique"
82 | ]
83 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/hot-graphic.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "hot_graphic",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component",
12 | "graphic" : [
13 | {"image_object"}
14 | ],
15 | "items" : [
16 | {"content_item"}
17 | ]
18 | },
19 | "storage" : {
20 | "last_update" : "timestamp",
21 | "updated_by" : "user_id",
22 | "course_id" : "ref:id_of_project",
23 | "component_id" : "unique string",
24 | "_parentId" : "ref:another_component",
25 | "_type" : "enum:object_type",
26 | "_component" : "enum:component_type",
27 | "_classes" : [
28 | {"class_object"}
29 | ],
30 | "_layout" : "enum:layout_type",
31 | "title" : [
32 | {
33 | "_component" : "text_object",
34 | "format" : "plain",
35 | "content" : "title of component",
36 | "language" : "en-GB"
37 | }
38 | ],
39 | "intro_text" : [
40 | {
41 | "_component" : "text_object",
42 | "format" : "enum:markdown|html|json|plain",
43 | "content" : "richtext: body of component",
44 | "language" : "en-GB"
45 | }
46 | ],
47 | "graphic" : [
48 | {"image_object"}
49 | ],
50 | "items" : [
51 | {"item_object"}
52 | ]
53 | },
54 | "constraints" : [
55 | "title must only contain plain text objects",
56 | "body must contain at least one text object",
57 | "id is globally unique"
58 | ]
59 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/matching-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "matching",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component",
12 | "attempts" : "number",
13 | "random" : "boolean",
14 | "placeHolder" : "plaintext",
15 | "graphic" : {"image_object"},
16 | "feedback" : {
17 | "correct" : [{"rich_text"}],
18 | "incorrect" : [{"rich_text"}],
19 | "partly" : [{"rich_text"}]
20 | },
21 | "items" : [{"matching_item_object"}],
22 | "button" : {
23 | "submit" : "plaintext",
24 | "reset" : "plaintext",
25 | "model" : "plaintext",
26 | "user" : "plaintext",
27 | }
28 | },
29 | "storage" : {
30 | "last_update" : "timestamp",
31 | "updated_by" : "user_id",
32 | "course_id" : "ref:id_of_project",
33 | "slug" : "unique-url-friendly-word",
34 | "component_id" : "unique string",
35 | "_parentId" : "ref:another_component",
36 | "_type" : "enum:object_type",
37 | "_component" : "enum:component_type",
38 | "_classes" : [
39 | {"class_object"}
40 | ],
41 | "_layout" : "enum:layout_type",
42 | "title" : [
43 | {
44 | "object_type" : "text_object",
45 | "format" : "plain",
46 | "content" : "title of component",
47 | "language" : "en-GB"
48 | }
49 | ],
50 | "intro_text" : {"text_object(plain)"},
51 | "body" : [
52 | {
53 | "object_type" : "text_object",
54 | "format" : "enum:markdown|html|json|plain",
55 | "content" : "richtext: body of component",
56 | "language" : "en-GB"
57 | }
58 | ],
59 | "attempts" : "number",
60 | "random" : "boolean",
61 | "placeHolder" : [{"text_object(plain)"}],
62 | "graphic" : [{"image_object"}],
63 | "feedback" : {
64 | "correct" : [{"text_object"}],
65 | "incorrect" : [{"text_object"}],
66 | "partly" : [{"text_object"}]
67 | },
68 | "items" : [{"matching_item_object"}],
69 | "button" : {
70 | "submit" : {"text_object(plain)"},
71 | "reset" : {"text_object(plain)"},
72 | "model" : {"text_object(plain)"},
73 | "user" : {"text_object(plain)"},
74 | }
75 | },
76 | "constraints" : [
77 | "title must only contain plain text objects",
78 | "body must contain at least one text object",
79 | "id is globally unique"
80 | ]
81 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/mcq-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "mcq",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "intro_text" : "plaintext",
12 | "question" : "richtext: body of component",
13 | "attempts" : "number",
14 | "random" : "boolean",
15 | "selectable" : "number",
16 | "feedback" : {
17 | "correct" : "richtext",
18 | "incorrect" : "richtext",
19 | "partly" : "richtext"
20 | },
21 | "items" : [{"answer_item_object"}],
22 | "button" : {
23 | "submit" : {"text_object(plain)"},
24 | "reset" : {"text_object(plain)"},
25 | "model" : {"text_object(plain)"},
26 | "user" : {"text_object(plain)"},
27 | }
28 | },
29 | "storage" : {
30 | "last_update" : "timestamp",
31 | "updated_by" : "user_id",
32 | "course_id" : "ref:id_of_project",
33 | "slug" : "unique-url-friendly-word",
34 | "component_id" : "unique string",
35 | "_parentId" : "ref:another_component",
36 | "_type" : "enum:object_type",
37 | "_component" : "enum:component_type",
38 | "_classes" : [
39 | {"class_object"}
40 | ],
41 | "_layout" : "enum:layout_type",
42 | "title" : [
43 | {
44 | "object_type" : "text_object",
45 | "format" : "plain",
46 | "content" : "title of component",
47 | "language" : "en-GB"
48 | }
49 | ],
50 | "intro_text" : {"text_object(plain)"},
51 | "question" : [
52 | {
53 | "object_type" : "text_object",
54 | "format" : "enum:markdown|html|json|plain",
55 | "content" : "richtext: body of component",
56 | "language" : "en-GB"
57 | }
58 | ],
59 | "attempts" : "number",
60 | "selectable" : "number",
61 | "random" : "boolean",
62 | "feedback" : {
63 | "correct" : {"text_object(rich)"},
64 | "incorrect" : {"text_object(rich)"},
65 | "partly" : {"text_object(rich)"}
66 | },
67 | "items" : [{"answer_item_object"}],
68 | "button" : {
69 | "submit" : {"text_object(plain)"},
70 | "reset" : {"text_object(plain)"},
71 | "model" : {"text_object(plain)"},
72 | "user" : {"text_object(plain)"},
73 | }
74 | },
75 | "constraints" : [
76 | "title must only contain plain text objects",
77 | "body must contain at least one text object",
78 | "id is globally unique"
79 | ]
80 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/narrative-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "narrative",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component",
12 | "items" : [
13 | {"content_item"}
14 | ]
15 | },
16 | "storage" : {
17 | "last_update" : "timestamp",
18 | "updated_by" : "user_id",
19 | "course_id" : "ref:id_of_project",
20 | "component_id" : "unique string",
21 | "_parentId" : "ref:another_component",
22 | "_type" : "enum:object_type",
23 | "_component" : "enum:component_type",
24 | "_classes" : [
25 | {"class_object"}
26 | ],
27 | "_layout" : "enum:layout_type",
28 | "title" : [
29 | {
30 | "_component" : "text_object",
31 | "format" : "plain",
32 | "content" : "title of component",
33 | "language" : "en-GB"
34 | }
35 | ],
36 | "intro_text" : [
37 | {
38 | "_component" : "text_object",
39 | "format" : "enum:markdown|html|json|plain",
40 | "content" : "richtext: body of component",
41 | "language" : "en-GB"
42 | }
43 | ],
44 | "items" : [
45 | {"item_object"}
46 | ]
47 | },
48 | "constraints" : [
49 | "title must only contain plain text objects",
50 | "body must contain at least one text object",
51 | "id is globally unique"
52 | ]
53 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/sub-objects.json:
--------------------------------------------------------------------------------
1 | {
2 | "about" : "sub-objects used in storage",
3 | "objects" : [
4 | {
5 | "object_type" : "image",
6 | "name" : "large|medium|small|...",
7 | "url" : "ref:object_in_file_store_possibly_as_url",
8 | "alt" : "alt attribute",
9 | "dimensions" : {
10 | "width" : "pixel-width",
11 | "height" : "pixel-height"
12 | },
13 | "description" : "image description used for longdesc on web and as description in asset store/cms"
14 | },
15 | {
16 | "object_type" : "text_object",
17 | "format" : "enum:markdown|html|json|plain",
18 | "content" : "richtext: body of component",
19 | "language" : "en-GB"
20 | },
21 | {
22 | "object_type" : "class_object",
23 | "value" : "classname",
24 | "theme" : "theme-class-applies-to"
25 | },
26 | {
27 | "object_type" : "item_object",
28 | "title" : {"text_object(plain)"},
29 | "body" : [{"text_object"}],
30 | "alt" : {"text_object(plain)"},
31 | "strapline" : {"text_object"},
32 | "graphic" : [
33 | {"image_object"}
34 | ],
35 | "position" : {
36 | "top" : "pixel-value",
37 | "left" : "pixel-value"
38 | }
39 | },
40 | {
41 | "object_type" : "answer_item_object",
42 | "title" : {"text_object(plain)"},
43 | "body" : [{"text_object"}],
44 | "alt" : {"text_object(plain)"},
45 | "correct" : "boolean",
46 | "feedback" : [{"text_object(rich)"}],
47 | "graphic" : [
48 | {"image_object"}
49 | ],
50 | "position" : [{
51 | "name" : "large|medium|small - matches parent's graphic name",
52 | "top" : "pixel-value",
53 | "left" : "pixel-value"
54 | }]
55 | },
56 | {
57 | "object_type" : "matching_item_object",
58 | "text" : {"text_object"},
59 | "options" : [{"matching_item_option_object"}]
60 | },
61 | {
62 | "object_type" : "matching_item_option_object",
63 | "text" : {"text_object(plain)"},
64 | "correct" : "boolean"
65 | }
66 | {
67 | "object_type" : "input_answer_item_object",
68 | "prefix" : [{"text_object"}],
69 | "suffix" : [{"text_object"}],
70 | "answers" : [{"text_object"}]
71 | }
72 | ]
73 | }
74 |
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/text-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "text",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component"
12 | },
13 | "storage" : {
14 | "last_update" : "timestamp",
15 | "updated_by" : "user_id",
16 | "course_id" : "ref:id_of_project",
17 | "slug" : "unique-url-friendly-word",
18 | "component_id" : "unique string",
19 | "_parentId" : "ref:another_component",
20 | "_type" : "enum:object_type",
21 | "_component" : "enum:component_type",
22 | "_classes" : [
23 | {"class_object"}
24 | ],
25 | "_layout" : "enum:layout_type",
26 | "title" : [
27 | {
28 | "object_type" : "text_object",
29 | "format" : "plain",
30 | "content" : "title of component",
31 | "language" : "en-GB"
32 | }
33 | ],
34 | "intro_text" : {"text_object(plain)"},
35 | "text_content" : [
36 | {
37 | "object_type" : "text_object",
38 | "format" : "enum:markdown|html|json|plain",
39 | "content" : "richtext: body of component",
40 | "language" : "en-GB"
41 | }
42 | ]
43 | },
44 | "constraints" : [
45 | "title must only contain plain text objects",
46 | "body must contain at least one text object",
47 | "id is globally unique"
48 | ]
49 | }
--------------------------------------------------------------------------------
/01_cross_workstream/content_specification/text-input-component.json:
--------------------------------------------------------------------------------
1 | {
2 | "component" : "text_input",
3 | "output" : {
4 | "_id" : "unique string",
5 | "_parentId" : "ref:another_component",
6 | "_type" : "enum:object_type",
7 | "_component" : "enum:component_type",
8 | "_classes" : "space separated string",
9 | "_layout" : "enum:layout_type",
10 | "title" : "plaintext: title of component",
11 | "body" : "richtext: body of component",
12 | "attempts" : "number",
13 | "placeHolder" : [{"text_object"}],
14 | "allowAnyOrder" : "boolean",
15 | "allowAnyCase" : "boolean",
16 | "allowPunctuation" : "boolean",
17 | "feedback" : {
18 | "correct" : {"text_object(rich)"},
19 | "incorrect" : {"text_object(rich)"},
20 | "partly" : {"text_object(rich)"}
21 | },
22 | "items" : [{"input_answer_item_object"}],
23 | "button" : {
24 | "submit" : {"text_object(plain)"},
25 | "reset" : {"text_object(plain)"},
26 | "model" : {"text_object(plain)"},
27 | "user" : {"text_object(plain)"},
28 | }
29 | },
30 | "storage" : {
31 | "last_update" : "timestamp",
32 | "updated_by" : "user_id",
33 | "course_id" : "ref:id_of_project",
34 | "slug" : "unique-url-friendly-word",
35 | "component_id" : "unique string",
36 | "_parentId" : "ref:another_component",
37 | "_type" : "enum:object_type",
38 | "_component" : "enum:component_type",
39 | "_classes" : [
40 | {"class_object"}
41 | ],
42 | "_layout" : "enum:layout_type",
43 | "title" : [
44 | {
45 | "object_type" : "text_object",
46 | "format" : "plain",
47 | "content" : "title of component",
48 | "language" : "en-GB"
49 | }
50 | ],
51 | "intro_text" : {"text_object(plain)"},
52 | "attempts" : "number",
53 | "placeHolder" : [{"text_object"}],
54 | "allowAnyOrder" : "boolean",
55 | "allowAnyCase" : "boolean",
56 | "allowPunctuation" : "boolean",
57 | "feedback" : {
58 | "correct" : {"text_object(rich)"},
59 | "incorrect" : {"text_object(rich)"},
60 | "partly" : {"text_object(rich)"}
61 | },
62 | "items" : [{"input_answer_item_object"}],
63 | "button" : {
64 | "submit" : {"text_object(plain)"},
65 | "reset" : {"text_object(plain)"},
66 | "model" : {"text_object(plain)"},
67 | "user" : {"text_object(plain)"},
68 | }
69 | },
70 | "constraints" : [
71 | "title must only contain plain text objects",
72 | "body must contain at least one text object",
73 | "id is globally unique"
74 | ]
75 | }
--------------------------------------------------------------------------------
/01_cross_workstream/developer_requirements.md:
--------------------------------------------------------------------------------
1 | # Development Requirements for MVP
2 |
3 | This document describes the development requirements for the MVP release of the Adapt Learning Framework. These are needs not captured by user stories and form part of our "Definition of Done".
4 |
5 | ## Target Devices
6 | The framework and core components must support the set of user agents which accounts for at least 90% of the target user base.
7 |
8 | The currently supported browsers are:
9 |
10 | Desktop:
11 | Google Chrome (latest version)
12 | Firefox ESR (or latest version)
13 | IE11
14 | Safari v12 - v13
15 | Edge (latest version)
16 |
17 | Mobile:
18 | iOS12, iOS13 (running Safari)
19 | Android v4.4 – v10.0 (running Chrome)
20 |
21 | Due to the ongoing need in the community the Adapt Framework will continue to support an extended release candidate, v2.2.X that will offer support for the following legacy browsers:
22 |
23 | IE10
24 | IE9
25 | IE8
26 |
27 | ## Testing level
28 | All core code must have unit test coverage to 90%
29 |
30 | ## Accessibility
31 | All core framework and plugins must demonstrate [WCAG 2.0](http://www.w3.org/TR/2008/REC-WCAG20-20081211/) compliance at AA Level
32 |
33 | ## Render & Download Time
34 |
35 | *NOTE: THE TIMES LISTED BELOW ARE ASPIRATIONAL* - We value performance as an important aspect of User Experience and will review our code with performance in mind - significant performance degradation will result in Pull Requests being rejected. Further enhancements to this document will specify performance metrics in greater detail.
36 |
37 | For a given standard course (to be defined) not served by an LMS, content must be downloaded and rendered (details to be defined) within the following timescales
38 |
39 | * 10 seconds on an iPhone running on an Edge (2G) network
40 | * 1 second on Chrome (or whatever the most common User Agent is) running on a broadband (2MBit/s - as defined by Government) connection
41 |
42 | (These speeds should be tested with an empty cache)
43 |
44 | ## Coding Standards
45 |
46 | All code should comply with the [Style Guide](style_guide.md)
47 |
48 | ## Security
49 |
50 | All contributed plugins and extensions must include a security review before they can be included in the core package. This should at a minimum cover the [OWASP Top 10](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project) security flaws but should not be limited to those.
51 |
52 | The principle here is that developers should demonstrate that they have considered security implications when developing their plugin.
53 |
54 | We have published a review of the [Adapt Learning Framework](https://github.com/adaptlearning/adapt_framework/wiki/Web-Security-Audit)
55 |
56 | We have published a review of the [Adapt Learning Authoring Tool](https://github.com/adaptlearning/adapt_authoring/wiki/Web-Security-Audit)
57 |
--------------------------------------------------------------------------------
/01_cross_workstream/glossary_of_terms.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/01_cross_workstream/glossary_of_terms.docx
--------------------------------------------------------------------------------
/01_cross_workstream/mvp_definition/supporting_docs/learner_support_and_assessment.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/01_cross_workstream/mvp_definition/supporting_docs/learner_support_and_assessment.jpg
--------------------------------------------------------------------------------
/01_cross_workstream/mvp_definition/supporting_docs/proposed_MVP_for_Adapt_output.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/01_cross_workstream/mvp_definition/supporting_docs/proposed_MVP_for_Adapt_output.pdf
--------------------------------------------------------------------------------
/01_cross_workstream/principles_architecture.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/01_cross_workstream/principles_architecture.xlsx
--------------------------------------------------------------------------------
/01_cross_workstream/process/gitflow.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/01_cross_workstream/process/gitflow.docx
--------------------------------------------------------------------------------
/01_cross_workstream/style_guide.md:
--------------------------------------------------------------------------------
1 | # Adapt Learning Style Guide
2 |
3 | This is a guide for writing consistent and aesthetically pleasing code for the Adapt Learning project.
4 |
5 | This guide is based on the [Node.js styleguide](https://github.com/felixge/node-style-guide) created by [Felix Geisendörfer](http://felixge.de/), adapted to reflect the preferences of the various developers on the Adapt Learning project.
6 |
7 | ## Spacing
8 |
9 | We use **2 spaces** for indenting code.
10 |
11 | As a general rule, follow the style of the code you're working on and NEVER mix tabs and spaces!
12 |
13 | Include a space after commas and before the opening 'curly bracket' but don't include one before the round brackets associated with function calls/declarations.
14 |
15 | Please always include a space following a colon in JavaScript, JSON and CSS/LESS.
16 |
17 | *Right:*
18 |
19 | ```js
20 | doSomething: function(arg1, arg2) {
21 | if (arg2) {
22 | //do stuff
23 | }
24 | }
25 | ```
26 |
27 | *Wrong:*
28 |
29 | ```js
30 | doSomething:function (arg1,arg2){
31 | if (arg2){
32 | //do stuff
33 | }
34 | }
35 | ```
36 |
37 | ## No trailing whitespace
38 |
39 | Just like you brush your teeth after every meal, you clean up any trailing
40 | whitespace in your JS files before committing. Otherwise the rotten smell of
41 | careless neglect will eventually drive away contributors and/or co-workers.
42 |
43 | ## Use Semicolons
44 |
45 | According to [scientific research][hnsemicolons], the usage of semicolons is
46 | a core value of our community. Consider the points of [the opposition][], but
47 | be a traditionalist when it comes to abusing error correction mechanisms for
48 | cheap syntactic pleasures.
49 |
50 | [the opposition]: http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding
51 | [hnsemicolons]: http://news.ycombinator.com/item?id=1547647
52 |
53 | ## 80 characters per line
54 |
55 | Limit your lines to 80 characters. Yes, screens have gotten much bigger over the
56 | last few years, but your brain has not. Use the additional room for split screen,
57 | your editor supports that, right?
58 |
59 | ## Opening braces go on the same line
60 |
61 | Your opening braces go on the same line as the statement.
62 |
63 | *Right:*
64 |
65 | ```js
66 | if (true) {
67 | console.log('winning');
68 | }
69 | ```
70 |
71 | *Wrong:*
72 |
73 | ```js
74 | if (true)
75 | {
76 | console.log('losing');
77 | }
78 | ```
79 |
80 | Also, notice the use of whitespace before and after the condition statement.
81 |
82 | ## Declare one variable per var statement
83 |
84 | Declare one variable per var statement, it makes it easier to re-order the
85 | lines. Ignore [Crockford][crockfordconvention] on this, and put those
86 | declarations wherever they make sense.
87 |
88 | *Right:*
89 |
90 | ```js
91 | var keys = ['foo', 'bar'];
92 | var values = [23, 42];
93 |
94 | var object = {};
95 | while (items.length) {
96 | var key = keys.pop();
97 | object[key] = values.pop();
98 | }
99 | ```
100 |
101 | *Wrong:*
102 |
103 | ```js
104 | var keys = ['foo', 'bar'],
105 | values = [23, 42],
106 | object = {},
107 | key;
108 |
109 | while (items.length) {
110 | key = keys.pop();
111 | object[key] = values.pop();
112 | }
113 | ```
114 |
115 | [crockfordconvention]: http://javascript.crockford.com/code.html
116 |
117 | ## Use lowerCamelCase for variables, properties and function names
118 |
119 | Variables, properties and function names should use `lowerCamelCase`. They
120 | should also be descriptive. Single character variables and uncommon
121 | abbreviations should generally be avoided.
122 |
123 | *Right:*
124 |
125 | ```js
126 | var adminUser = db.query('SELECT * FROM users ...');
127 | ```
128 |
129 | *Wrong:*
130 |
131 | ```js
132 | var admin_user = db.query('SELECT * FROM users ...');
133 | ```
134 |
135 | ## Use UpperCamelCase for class names
136 |
137 | Class names should be capitalized using `UpperCamelCase`.
138 |
139 | *Right:*
140 |
141 | ```js
142 | function BankAccount() {
143 | }
144 | ```
145 |
146 | *Wrong:*
147 |
148 | ```js
149 | function bank_Account() {
150 | }
151 | ```
152 |
153 | ## Use UPPERCASE for Constants
154 |
155 | Constants should be declared as regular variables or static class properties,
156 | using all uppercase letters.
157 |
158 | Node.js / V8 actually supports mozilla's [const][const] extension, but
159 | unfortunately that cannot be applied to class members, nor is it part of any
160 | ECMA standard.
161 |
162 | *Right:*
163 |
164 | ```js
165 | var SECOND = 1 * 1000;
166 |
167 | function File() {
168 | }
169 | File.FULL_PERMISSIONS = 0777;
170 | ```
171 |
172 | *Wrong:*
173 |
174 | ```js
175 | const SECOND = 1 * 1000;
176 |
177 | function File() {
178 | }
179 | File.fullPermissions = 0777;
180 | ```
181 |
182 | ## JQuery
183 | [Cache JQuery selectors](https://ttmm.io/tech/selector-caching-jquery/) - and prefix variables/properties that contain JQuery selectors with `$`:
184 | ```js
185 | var $mydiv = $('.mydiv');
186 | ```
187 |
188 | [const]: https://developer.mozilla.org/en/JavaScript/Reference/Statements/const
189 |
190 | ## Object / Array creation
191 |
192 | Put *short* declarations on a single line. Only quote
193 | keys when your interpreter complains:
194 |
195 | *Right:*
196 |
197 | ```js
198 | var a = [ 'hello', 'world' ];
199 | var b = {
200 | good: 'code',
201 | 'reads well': 'for others'
202 | };
203 | ```
204 |
205 | *Wrong:*
206 |
207 | ```js
208 | var a = [
209 | 'hello', 'world'
210 | ];
211 | var b = {"good": 'code'
212 | , 'reads well': 'for others'
213 | };
214 | ```
215 |
216 | ## Use the === operator
217 |
218 | Programming is not about remembering [stupid rules][comparisonoperators]. Use
219 | the triple equality operator as it will work just as expected.
220 |
221 | *Right:*
222 |
223 | ```js
224 | var a = 0;
225 | if (a === '') {
226 | console.log('winning');
227 | }
228 |
229 | ```
230 |
231 | *Wrong:*
232 |
233 | ```js
234 | var a = 0;
235 | if (a == '') {
236 | console.log('losing');
237 | }
238 | ```
239 |
240 | [comparisonoperators]: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators
241 |
242 | ## Do not extend built-in prototypes
243 |
244 | Do not extend the prototype of native JavaScript objects. Your future self will
245 | be forever grateful.
246 |
247 | *Right:*
248 |
249 | ```js
250 | var a = [];
251 | if (!a.length) {
252 | console.log('winning');
253 | }
254 | ```
255 |
256 | *Wrong:*
257 |
258 | ```js
259 | Array.prototype.empty = function() {
260 | return !this.length;
261 | }
262 |
263 | var a = [];
264 | if (a.empty()) {
265 | console.log('losing');
266 | }
267 | ```
268 |
269 | ## Use descriptive conditions
270 |
271 | Any non-trivial conditions should be assigned to a descriptive variable:
272 |
273 | *Right:*
274 |
275 | ```js
276 | var isAuthorized = (user.isAdmin() || user.isModerator());
277 | if (isAuthorized) {
278 | console.log('winning');
279 | }
280 | ```
281 |
282 | *Wrong:*
283 |
284 | ```js
285 | if (user.isAdmin() || user.isModerator()) {
286 | console.log('losing');
287 | }
288 | ```
289 |
290 | ## Write small functions
291 |
292 | Keep your functions short. A good function fits on a slide that the people in
293 | the last row of a big room can comfortably read. So don't count on them having
294 | perfect vision and limit yourself to ~15 lines of code per function.
295 |
296 | ## Return early from functions
297 |
298 | To avoid deep nesting of if-statements, always return a functions value as early
299 | as possible.
300 |
301 | *Right:*
302 |
303 | ```js
304 | function isPercentage(val) {
305 | if (val < 0) {
306 | return false;
307 | }
308 |
309 | if (val > 100) {
310 | return false;
311 | }
312 |
313 | return true;
314 | }
315 | ```
316 |
317 | *Wrong:*
318 |
319 | ```js
320 | function isPercentage(val) {
321 | if (val >= 0) {
322 | if (val < 100) {
323 | return true;
324 | } else {
325 | return false;
326 | }
327 | } else {
328 | return false;
329 | }
330 | }
331 | ```
332 |
333 | Or for this particular example it may also be fine to shorten things even
334 | further:
335 |
336 | ```js
337 | function isPercentage(val) {
338 | var isInRange = (val >= 0 && val <= 100);
339 | return isInRange;
340 | }
341 | ```
342 |
343 | ## Name your closures
344 |
345 | Feel free to give your closures a name. It shows that you care about them, and
346 | will produce better stack traces, heap and cpu profiles.
347 |
348 | *Right:*
349 |
350 | ```js
351 | req.on('end', function onEnd() {
352 | console.log('winning');
353 | });
354 | ```
355 |
356 | *Wrong:*
357 |
358 | ```js
359 | req.on('end', function() {
360 | console.log('losing');
361 | });
362 | ```
363 |
364 | ## No nested closures
365 |
366 | Use closures, but don't nest them. Otherwise your code will become a mess.
367 |
368 | *Right:*
369 |
370 | ```js
371 | setTimeout(function() {
372 | client.connect(afterConnect);
373 | }, 1000);
374 |
375 | function afterConnect() {
376 | console.log('winning');
377 | }
378 | ```
379 |
380 | *Wrong:*
381 |
382 | ```js
383 | setTimeout(function() {
384 | client.connect(function() {
385 | console.log('losing');
386 | });
387 | }, 1000);
388 | ```
389 |
390 | ## Meaningful aliases
391 |
392 | To maintain a reference to a class during callbacks it is common to use
393 |
394 | ```js
395 | var self = this;
396 | //or
397 | var that = this;
398 | ```
399 |
400 | Although it makes sense that they point to an external *this* it is
401 | very difficult to quickly see which *this* *that* points to as your
402 | code grows. By using a meaningful alias inside a class it is quick
403 | to see and importantly trace the intended pointer.
404 |
405 | *Right:*
406 |
407 | ```js
408 | MyClass.prototype.something = function(){
409 |
410 | var myClass = this;
411 |
412 | myClass.on('event', function (ev) {
413 | //.... code
414 | var eventContext = ev.somevar;
415 |
416 | async.complete(function (ev) {
417 | eventContext.doSomething();
418 | });
419 | });
420 | }
421 | ```
422 |
423 | *Wrong:*
424 |
425 | ```js
426 | MyClass.prototype.something = function(){
427 |
428 | var self = this;
429 |
430 | self.on('event', function (ev) {
431 | //.... code
432 | var self = ev.somevar;
433 |
434 | async.complete(function (ev) {
435 | self.doSomething();
436 | });
437 | });
438 | }
439 | ```
440 | ## Use 'has' and 'is' for objects or functions which return a Boolean
441 |
442 | This improves code readability.
443 |
444 | *Right:*
445 |
446 | ```js
447 | var isAuthorized = true;
448 | ```
449 |
450 | *Wrong:*
451 |
452 | ```js
453 | var authorized = true;
454 | ```
455 |
456 |
457 | ## Comments
458 | Try to write your code so that it doesn't require comments, only using them when further explanation is needed. Comments like the following should be avoided at all costs!
459 | ```js
460 | // Check if the session is valid
461 | var isSessionValid = (session.expires < Date.now());
462 | // If the session is valid
463 | if (isSessionValid) {
464 | // ...
465 | }
466 | ```
467 |
468 | ## Object.freeze, Object.preventExtensions, Object.seal, with, eval
469 |
470 | Crazy shit that you will probably never need. Stay away from it.
471 |
--------------------------------------------------------------------------------
/01_cross_workstream/vision_breakdown.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/01_cross_workstream/vision_breakdown.docx
--------------------------------------------------------------------------------
/02_authoring_tool/01_concept_and_vision/adapt_authoring_concept_and_vision.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/01_concept_and_vision/adapt_authoring_concept_and_vision.docx
--------------------------------------------------------------------------------
/02_authoring_tool/01_concept_and_vision/adapt_authoring_concept_and_vision.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/01_concept_and_vision/adapt_authoring_concept_and_vision.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/02_requirements/AT-MVP-reqs.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/02_requirements/AT-MVP-reqs.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/02_requirements/adapt_authoring_user_stories.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/02_requirements/adapt_authoring_user_stories.xlsx
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/01-adapt-login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/01-adapt-login.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/02-adapt-create-account.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/02-adapt-create-account.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/03-adapt-dashboard-grid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/03-adapt-dashboard-grid.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/04-adapt-dashboard-list.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/04-adapt-dashboard-list.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/05-adapt-course-structure.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/05-adapt-course-structure.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/06-adapt-page-structure-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/06-adapt-page-structure-1.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/07-adapt-select-components-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/07-adapt-select-components-1.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/08-adapt-select-components-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/08-adapt-select-components-2.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/09-adapt-select-components-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/09-adapt-select-components-3.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/10-adapt-page-structure-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/10-adapt-page-structure-2.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/11-adapt-component-editing-single.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/11-adapt-component-editing-single.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/12-adapt-component-editing-multiple.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/12-adapt-component-editing-multiple.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/13-adapt-course-configuration.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/13-adapt-course-configuration.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/14-adapt-theme-setting.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/14-adapt-theme-setting.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/15-adapt-course-extensions.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/15-adapt-course-extensions.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v1/adapt ui v1.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v1/adapt ui v1.psd
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v2/01-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v2/01-dashboard.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v2/02-course-structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v2/02-course-structure.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v2/03-page-editor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v2/03-page-editor.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v2/04-editor-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v2/04-editor-page.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/01-login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/01-login.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/02-create-account.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/02-create-account.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/03-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/03-dashboard.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/04-dashboard-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/04-dashboard-menu.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/05-course-structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/05-course-structure.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/06-page-structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/06-page-structure.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/07-add-component.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/07-add-component.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/08-page-structure-cont.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/08-page-structure-cont.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/09-empty-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/09-empty-dashboard.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/10-project-wizard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/10-project-wizard.png
--------------------------------------------------------------------------------
/02_authoring_tool/03_ui_design/v3/11-editor-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/03_ui_design/v3/11-editor-page.png
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/import_export/import-export-reqs.md:
--------------------------------------------------------------------------------
1 | # Import/Export Feature
2 |
3 | #### Objective
4 | *To be able to move courses from one instance of the Adapt authoring tool to another for editing.*
5 |
6 | ## Definitions
7 | | Term | Definition |
8 | | ------------------ | ---------- |
9 | | AT | Authoring tool |
10 | | Course data | Refers to the structural elements of an Adapt course (i.e. content objects, articles, blocks and components) |
11 | | Course configuration data | Configuration options found in config.json and course.json |
12 | | Protected sections | In the case of custom functionality, sections may be protected (i.e. read-only), in which case, they can be moved and deleted, but not directly edited |
13 |
14 | ## Assumptions
15 |
16 | - This feature will be included in a new release of the AT.
17 | - Imported courses will be forced to adopt the Framework and core bundle versions used by the AT instance that is being imported into
18 | - The imported course should look as close to the original when published, although results will vary depending on whether the course has had to be auto-upgraded
19 |
20 | ## Exclusions
21 |
22 | - The feature will only be possible in future AT and framework versions (i.e. it is not intended to be made backwards-compatible at this point).
23 |
24 | ## Requirements
25 |
26 | Below is the list of requirements for the import/export feature. Those requirements in **bold** have been identified as necessary for the minimum viable product (MVP) release.
27 |
28 | ### Course Export
29 |
30 | **User story**: *As a course developer, I want to be able to export a course I have created in the AT in order to transfer to another AT instance.*
31 |
32 | **Requirements**:
33 | - **IMEX-001: Ability to export course data**
34 | - **IMEX-002: Ability to export course configuration data**
35 | - **IMEX-003: Ability to export assets**
36 | - **IMEX-004: Ability to export custom plugins**
37 |
38 | **User story**: *As a course developer, I want to be able to export a course I have created in the AT for standalone editing using the Adapt CLI tools.*
39 |
40 | **Requirements**:
41 | - **IMEX-001**, **IMEX-002**, **IMEX-003**, **IMEX-004** (see above)
42 | - **IMEX-005: Ability to export framework core**
43 | - **IMEX-006: Exported course should be in a widely-supported format to allow for human inspection/manipulation**
44 | - **IMEX-007: Exported course should be suitable for standalone development**
45 |
46 | **User story**: *As a tool vendor / plugin developer, I want to be able to restrict which plugins (inc components, menus and themes) are exported from the AT during course export to protect my investment in plugin development.*
47 |
48 | **Requirements**:
49 | - **IMEX-001**, **IMEX-002**, **IMEX-003**, **IMEX-004** (see above)
50 | - IMEX-028: Ability to specify which plugins are prevented from export
51 | - IMEX-029: System should notify the user which plugins will not be included in the export.
52 | - IMEX-030: The exported course will not contain the protected plugins, but should still contain the source/config data for plugins which were not exported as this could be used if imported into the exporting system (or other system with the plugins)
53 |
54 | ### Course Import
55 |
56 | **User story**: *As a course developer, I want to be able to import an exported course into another instance of the AT for editing.*
57 |
58 | **Requirements**:
59 | - **IMEX-008: Ability to import course data**
60 | - **IMEX-009: Ability to import course configuration data**
61 | - **IMEX-010: Ability to import course assets**
62 | - **IMEX-011: Ability to import custom plugins**
63 | - IMEX-012: As a course developer, I want to be able to choose what data is imported
64 | - **IMEX-013: Ability to flag incompatibilities with the JSON of my course and the AT instance it is imported into (e.g. version incompatabilities)**
65 | - IMEX-014: Ability to force-import a course, even if there are errors (see IMEX-013)
66 | - **IMEX-015: Ability for the Import function to deal with any name conflicts with existing courses/plugins**
67 | - **IMEX-016: Ability for import function to make any assets used in an imported course (along with their associated metadata) available in the asset manager**
68 | - **IMEX-017: Ability for import function to make any custom components used in an imported course available in the plugin manager**
69 | - **IMEX-018: Ability for import function to make any custom extensions used in an imported course available in the plugin manager**
70 | - **IMEX-019: Ability for import function to make any custom menus used in an imported course available in the plugin manager**
71 | - **IMEX-020: Ability for import function to make the theme used in an imported course available in the plugin manager**
72 | - IMEX-021: Ability to import a course developed outside of the AT
73 |
74 | ### Course Maintenance
75 |
76 | **User story**: *As a course developer, I want to be able to edit my imported course in the AT for maintenance.*
77 |
78 | **Requirements**:
79 | - **IMEX-022: Ability to modify the structure of an imported course**
80 | - **IMEX-023: Ability to edit text content in an imported course**
81 | - **IMEX-024: Ability to change any media content in a course (swap images, videos etc.)**
82 | - IMEX-025: Protected areas should be viewable
83 | - IMEX-026: Protected areas should be movable
84 | - IMEX-027: Protected areas should be deletable
85 |
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/menu_editor/menu-editor-reqs.md:
--------------------------------------------------------------------------------
1 | # Menu Editor Feature
2 |
3 | #### Objective
4 | *To be able to adjust settings for a selected menu without any prior knowledge of web technologies.*
5 |
6 | ## Definitions
7 | | Term | Definition |
8 | | -------------------------------- | ---------- |
9 | | AT | Authoring tool |
10 |
11 | ## Assumptions
12 |
13 | - This feature will be included in a new release of the AT.
14 |
15 | ## Requirements
16 |
17 | Below is the list of requirements for the menu editor feature. Those requirements in **bold** have been identified as necessary for the minimum viable product (MVP) release.
18 |
19 | **User story**: *As a __Course creator__ user, I want to be able to adjust my selected menu.*
20 |
21 | **Requirements**:
22 | - MNUE-001: Ability to view exposed settings for a selected menu
23 | - MNUE-002: Automatically add/remove global values when selecting/deselecting a menu
24 | - MNUE-003: Expose menu settings for config, course and contenObject collections only
25 |
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/multilanguage/multi-language-reqs.md:
--------------------------------------------------------------------------------
1 | # Multi-language Feature
2 |
3 | #### Objective
4 | *To enable the authoring tool to support non-English languages.*
5 |
6 | ## Definitions
7 | | Term | Definition |
8 | | ---- | ---------- |
9 | | AT | Authoring tool |
10 | | UI | User interface |
11 |
12 | ## Assumptions
13 |
14 | - This feature will be included in a new release of the AT.
15 |
16 | ## Requirements
17 |
18 | Below is the list of requirements for the multi-language feature. Those requirements in **bold** have been identified as necessary for the minimum viable product (MVP) release.
19 |
20 | **User story**: *As a __Course creator__ user, I want to be able to output my course in multiple languages.*
21 |
22 | **Requirements**:
23 | - MLNG-001: Ability to set output language
24 |
25 | **User story**: *As a *non-English-speaking* __Course creator__ user, I want to be able to switch the language used by the UI.*
26 |
27 | **Requirements**:
28 | - MLNG-002: Ability to set UI language
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/multiple_frameworks/discussion_notes.md:
--------------------------------------------------------------------------------
1 | # Future framework support in the authoring tool
2 |
3 | Supported version (2) is now very out of date. We need an upgrade path to allow users to make use of future versions of the framework.
4 |
5 | **Issues arising from framework incompatibility**:
6 | - Data/schema changes
7 | - Plugin functionality changes (menus/extensions/components)
8 | - Plugin cosmetic changes (themes)
9 | - Separate sets of schemas per framework
10 |
11 | **Approaches:**
12 | 1. Support multiple frameworks in a single server instance
13 | 2. Facilitate multiple versions of the framework via migration and separate server instances
14 |
15 | ## Approach 1
16 | Support multiple frameworks in a single server instance
17 |
18 | ### Pros
19 | - Less risk for the user (existing courses kept as they are)
20 | - Less risk for hosting, as upgrades/migrations can be planned/rolled back more easily
21 | - More efficient from a hosting and support perspective, as only one server needed
22 |
23 | ### Cons
24 | - The Adapt project will be more inclined to support a greater number of legacy framework versions
25 | - Adds complexity to the UI:
26 | - Course creation
27 | - Plugin management
28 | - Will inevitably lead to issues with future framework versions (5?) whereby content structure changes drastically, and the UI must cater to previous frameworks
29 |
30 | ### Solution
31 | #### Back-end:
32 | - Move from server content schemas to framework schemas
33 | - Introduce a way to manage multiple versions of schemas/mongoose models (this could just be a naming convention like `course-v1`)
34 | - Manage the ‘forked’ data (i.e. do we separate v2 and v3 courses, or keep them together in a single collection -- due to the way that mongoose validates using models, it probably doesn't make sense to try and merge the collections)
35 | - Update the `database.js` (and mongoose adapter `lib/dml/mongoose`) code to work with multiple models -- other server code may also need to be updated at this point
36 |
37 | #### Front-end:
38 | - Plugin management would need an overhaul:
39 | - Support a single set of framework plugins (i.e. for the latest FW)
40 | - Support all available/installed FW versions
41 | - Possibly move from global menu to course edit menu
42 | - Course creation/migration (i.e. choosing a base framework for a course)
43 | - Minor changes would be needed to how we load/process the schemas from the server
44 |
45 | ## Approach 2
46 | Facilitate multiple versions of the framework via migration and separate server instances
47 |
48 | ### Pros
49 | - Encourages users to update framework version regularly
50 | - Reduces the number of frameworks to be supported
51 | - Less UI complexity
52 | - Migration process is contained in the framework, so would also be useful to framework devs
53 | - Builds on the existing import/export code, so less overhead from the AAT side
54 |
55 | ### Cons
56 | - Courses on different frameworks must be physically separate
57 | - Multiple server instances must be maintained
58 | - Could lead to confusion from users as to where their courses are held
59 | - Enforced upgrades doesn't feel very 'open-source'
60 |
61 | ### Solution
62 | 1. Framework course exported
63 | 2. Framework scripts used to migrate exported course
64 | 3. Migrated course imported into new instance
65 |
66 | This process could be modified to automate much of the process:
67 | - Creating an API to communicate with an existing AAT server:
68 | - Removes the need to download/upload exports
69 | - Can then run the migration on the server
70 | - Allow batch migrations
71 |
72 | ### Other notes
73 | - Specifying changes will need to be done in code to allow full flexibility
74 | - Framework's scripting interface in grunt could be modified to perform migrations
75 | - Extra authoring tool UI will be required, but is being deferred until after the initial framework migration work
76 |
77 | #### Data migration
78 | - Property deletion
79 | - Value fixing (type shifting, default shifting)
80 | - Complex alterations (changing list types)
81 | - Moving values across plugins and core (spoor tracking)
82 |
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/AAT-boot.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/AAT-boot.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/AAT-module-boot.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/AAT-module-boot.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/Module-breakdown.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/Module-breakdown.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/meeting-notes-19.04.25.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/meeting-notes-19.04.25.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/module-loader-changes-01.20.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/module-loader-changes-01.20.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/mvp-definition.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/mvp-definition.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/proposal.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/proposal.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/prototype-breakdown.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/prototype-breakdown.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/requirements.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/requirements.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/update-19.08.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/update-19.08.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/server_restructure/user-stories.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/04_feature_development/server_restructure/user-stories.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/tenant_management/tenant-management-reqs.md:
--------------------------------------------------------------------------------
1 | # Tenant Management Feature
2 |
3 | #### Objective
4 | *To be able to administer the tenants in a single instance of the authoring tool.*
5 |
6 | ## Definitions
7 | | Term | Definition |
8 | | ------ | -------------- |
9 | | AT | Authoring tool |
10 | | Tenant | A tenant is a group of related users. A tenant in the AT system describes not only the users themselves, but also related data, such as the courses and system plugins. |
11 |
12 | ## Assumptions
13 |
14 | - This feature will be included in a new release of the AT.
15 |
16 | ## Exclusions
17 |
18 | - We will not support multiple master tenants.
19 |
20 | ## Requirements
21 |
22 | Below is the list of requirements for the tenant management feature. Those requirements in **bold** have been identified as necessary for the minimum viable product (MVP) release.
23 |
24 | **User story**: *As a __Super Admin__ user, I want to be able to administer __all__ tenants in the instance.*
25 |
26 | **Requirements**:
27 |
28 | - **TCYM01: Able to view existing tenancies**
29 | - **TCYM02: Able to create new tenancies**
30 | - **TCYM03: Able to update existing tenancies**
31 | - **TCYM04: Able to delete existing tenancies**
32 | - **TCYM05: Able to transfer an individual user from one tenant to another**
33 | - TCYM06: Able to set file upload limits
34 | - TCYM07: Able to define user creation options for tenancies
35 | - TCYM08: Able to define system role creation options for tenancies
36 | - TCYM09: Able to manage cross-tenancy user access
37 | - TCYM10: Able to show and hide plugins across all tenants
38 | - TCYM11: Able to show and hide plugins for specific tenants
39 | - TCYM12: Able to run usage reports on quota usage for tenancies (see below)
40 | - TCYM13: Able to set a quota for the number of users in tenants
41 | - TCYM14: Able to set a quota for file storage for tenants
42 | - TCYM15: Able to set a quota for the number of courses for tenants
43 | - TCYM16: Able to set a quota for bandwidth for tenants
44 | - TCYM17: Able to export a tenant
45 | - TCYM18: Able to import a tenant
46 | - TCYM19: Able to choose which installed publishing options to make available to the tenant's users
47 |
48 | **User story**: *As a __Tenant Admin__ user, I want to be able to administer my tenancy.*
49 |
50 | **Requirements**:
51 | - **TCYM20: Able to view users in the tenancy**
52 | - **TCYM21: Able to create new users in the tenancy**
53 | - **TCYM22: Able to update existing users in the tenancy**
54 | - **TCYM23: Able to delete existing users from the tenancy**
55 | - **TCYM24: Able to assign tenancy-scope system roles to users within the tenancy**
56 | - **TCYM25: Able to unassign tenancy-scope system roles to users within the tenancy**
57 | - **TCYM26: Able to remove any course in the tenancy**
58 | - **TCYM27: Able to change the owner of any course in the tenancy**
59 | - TCYM28: Able to view a log of actions by users in the tenancy
60 | - TCYM29: Able to see a usage for users in the tenancy
61 | - TCYM30: Able to see a usage for courses in the tenancy
62 | - TCYM31: Able to see a usage for file storage used by the tenancy
63 | - TCYM32: Able to see a usage for bandwidth used by the tenancy
64 | - TCYM33: Able to choose which installed component plug-ins to make available to the tenancy users
65 | - TCYM34: Able to choose which installed extension plug-ins to make available to the tenancy users
66 | - TCYM35: Able to choose which installed menu plug-ins to make available to the tenancy users
67 | - TCYM36: Able to choose which installed theme plug-ins to make available to the tenancy users
68 | - TCYM37: Able to upload themes specific to the tenancy
69 | - TCYM38: Able to choose which installed publishing options to make available to the tenancy users
70 |
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/theme_editor/theme-editor-reqs.md:
--------------------------------------------------------------------------------
1 | # Theme Editor Feature
2 |
3 | #### Objective
4 | *To be able to adjust settings for a selected theme without any prior knowledge of web technologies.*
5 |
6 | ## Definitions
7 | | Term | Definition |
8 | | -------------------------------- | ---------- |
9 | | AT | Authoring tool |
10 |
11 | ## Assumptions
12 |
13 | - This feature will be included in a new release of the AT.
14 |
15 | ## Requirements
16 |
17 | Below is the list of requirements for the theme editor feature. Those requirements in **bold** have been identified as necessary for the minimum viable product (MVP) release.
18 |
19 | **User story**: *As a __Course creator__ user, I want to be able to adjust my selected theme.*
20 |
21 | **Requirements**:
22 | - THME-001: Ability to view exposed settings for a selected theme
23 |
24 | ***
25 | ### InVision requirements
26 | - Ability to expose a theme to a user for modification via the UI
27 | - Ability to display theme-specific notes (rendered README.md?)
28 | - Ability to define a 'quick preview' of a theme, which is visible from the picker without having to apply the theme.
29 | - Ability to save presets (i.e. the current state of settings) for reuse in other courses.
30 | - Ability to view selected settings in rendered output. This could be a full course preview (possibly using live/instant preview), or a trivial, pre-defined 'template' course/page.
31 | - A theme should be able to opt-out of exposing theme settings, and still be selectable in the same way -- this also applies to 'old' themes.
32 | - Should be able to modify theme files directly (HTML/HBS, CSS/LESS, JS).
33 | - Any theme edits should be non-destructive (i.e. non-permanent).
34 | - Ability to restrict types of theme modification by role
35 |
36 | ## Forum requirements
37 | - When we double click on a theme, it should provide a pop-up or a new page with "back" button to return to the themes page.
38 | - The new page will contain all the variable names and a color-picker next to it.
39 | - If the user saves it will save all the updated values in the theme folder
40 | - The user should be able to duplicate theme and modify it with above steps
41 | - Regarding the pop-up Aniket describes, there should be some kind of help of info on the impact of the variables. For example the padding of the ABC elements, or no padding when titles are not used.
42 | - It would also be nice if there is some preview available to check the impact of your changes.
43 | - Ability to update (Background-) Images used in a Theme.
44 | - When working in the course, it would be nice to have a user-friendly way to use the `_classes` attribute of elements. When the Theme registers classes for a block, it would be nice to have a visual representation of the css-styles available when editing a block. Something like a style selector that uses images to preview the applied styles.
45 | - Ability to add a thumbnail image to a custom theme that is used in the theme-picker.
46 | - Regarding "User", I think if Tenant/User Management is active, there should be a restriction to the level what a user could change. As Admin, I would like to be able to create/setup certain templates that a team can use. As a user I might want to try and change little things, but that should not override the original theme.
47 | - Ability to save presets (i.e. the current state of settings) for reuse in other courses.Ability to view selected settings in rendered output. This could be a full course preview (possibly using live/instant preview), or a trivial, pre-defined 'template' course/page.A theme should be able to opt-out of exposing theme settings, and still be selectable in the same way -- this also applies to 'old' themes.Should be able to modify theme files directly (HTML/HBS, CSS/LESS, JS).Any edits should be non-destructive (i.e. non-permanent).
48 |
--------------------------------------------------------------------------------
/02_authoring_tool/04_feature_development/user_management/user-management-reqs.md:
--------------------------------------------------------------------------------
1 | # User Management Feature
2 |
3 | #### Objective
4 | *To be able to administer the users in a single instance of the authoring tool.*
5 |
6 | ## Definitions
7 | | Term | Definition |
8 | | -------------------------------- | ---------- |
9 | | AT | Authoring tool |
10 | | Disabling (in relation to users) | Blocking a user from accessing the system while still retaining their user account and data. |
11 |
12 | ## Assumptions
13 |
14 | - This feature will be included in a new release of the AT.
15 |
16 | ## Exclusions
17 |
18 | - This feature will not encompass tenant management or role management, which will themselves be self-contained releases.
19 |
20 | ## Requirements
21 |
22 | Below is the list of requirements for the user management feature. Those requirements in **bold** have been identified as necessary for the minimum viable product (MVP) release.
23 |
24 | **User story**: *As a __Super Admin__ user, I want to be able to administer __all__ users of the instance.*
25 |
26 | **Requirements**:
27 | - **USRM-001: Ability to view all users in the system**
28 | - **USRM-002: Ability to create a new user in the system**
29 | - **USRM-003: Ability to edit the email associated with a user in the system**
30 | - **USRM-004: Ability to change the tenant of a user in the system**
31 | - **USRM-005: Ability to change the role of a user in the system**
32 | - **USRM-006: Ability to reset the 'failed login count' of a user in the system**
33 | - **USRM-007: Ability to change the password of a user in the system**
34 | - **USRM-008: Ability to reset the password of a user in the system**
35 | - USRM-009: Ability to force a user to reset their password on login
36 | - USRM-010: Ability to terminate the session of a user in the system
37 | - **USRM-011: Ability to disable a user in the system**
38 | - **USRM-012: Ability to restore a disabled user in the system**
39 | - **USRM-013: Ability to remove a user from the system**
40 | - USRM-014: Ability to specify the lifespan of a user in the system
41 | - USRM-015: Ability to specify the lifespan of a tenant
42 |
43 | **User story**: *As a __Tenant Admin__ user, I want to be able to administer all users __in my tenant__.*
44 |
45 | **Requirements**:
46 | - USRM-016: Ability to view all users in my tenant
47 | - USRM-017: Ability to create a new user in my tenant
48 | - USRM-018: Ability to edit the email associated with a user in my tenant
49 | - USRM-019: Ability to change the role of a user in my tenant
50 | - USRM-020: Ability to reset the 'failed login count' of a user in my tenant
51 | - USRM-021: Ability to change the password of a user in my tenant
52 | - USRM-022: Ability to reset the password of a user in my tenant
53 | - USRM-023: Ability to force any user in my tenant to reset their password on login
54 | - USRM-024: Ability to terminate the session of a user in my tenant
55 | - USRM-025: Ability to disable a user in my tenant
56 | - USRM-026: Ability to restore a disabled user in my tenant
57 | - USRM-027: Ability to remove a user from my tenant
58 | - USRM-028: Ability to specify the lifespan of a user in my tenant
59 |
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/multitenancy.md:
--------------------------------------------------------------------------------
1 | # Multitenancy in the Adapt Editor
2 |
3 | ## Definitions
4 | **Actor** - A User in the context of a Tenancy
5 | **User** - An individual who has login credentials to the Editor
6 | **Tenancy** - A distinct view of the Editor interface, available to a group of users, which is independently managed and has restricted acccess.
7 | **Editor** - The web based interface used to construct Adapt Framework courses
8 | **Project** - The manifestation of a Course in the Editor
9 | **Course** - A standalone piece of E-Learning published in the Adapt Framework by the Editor
10 |
11 | ## What do we mean by Multitenancy?
12 | (or why do we want it?)
13 |
14 | Multitenancy will be referred to as MT from now on.
15 |
16 | We want to enable Groups of Users (Tenants) to log in to the Editor and to have their own setup. They should be able to administer (to some as yet undefined degree) their environment. They should have no sense that they are sharing a platform with other users.
17 |
18 | From a technical perspective, we want this to be delivered by a single installation. That installation may be multiple instances of a node application on one or many servers (load balanced) and hidden behind one or multiple URLS (a separate domain per tenant should be possible but not required).
19 |
20 | ### A brief aside
21 | There are multiple ways of achieving MT.
22 |
23 | 1. separate applications accessed via separate URLs - this isn't really MT, though if the same hardware platform is used it could be considered.
24 | 2. a single installation of code with separate databases
25 | 3. a single installation of code with a single database with tenants having separate tables (e.g. tenant1_users, tenant2_users etc.)
26 | 4. a single installation of code with a single database with a single set of tables with a tenantID column
27 |
28 | Layer on top of this a permissions management setting where users can have permissions in their tenant but not on the application as a whole, and a configuration system to allow permitted users to tweak the setup of their tenancy (but remember permissions and config are probably stored in a database)
29 |
30 | ## How we're delivering MT
31 |
32 | There are two complementary bits to this. They are **policies** and **data separation**
33 |
34 | Policies are complex, and we'll come to them in a moment.
35 |
36 | ### Data Separation
37 |
38 | We require data separation, both for issues of scalability (see the link at the end for some more information) and for ease of backup and restore. To achieve this, we intend to create a separate database for each tenant. The DataManager module will handle this for us so the main application doesn't need to worry about selecting the right database (Mongoose is happy to hold multiple database connections simultaneously).
39 |
40 | In order to manage a customer existing in multiple tenancies, and to facilitate
41 | login, we expect there to be a "Master" database. This will store userids, global config settings etc.
42 |
43 | In order to select the appropriate database we need to know the appropriate tenant. There are a number of ways of doing this, including DNS based selection (subdomains for example), a TenantID field on the User Object, or in a Session Variable.
44 |
45 |
46 | ### Policies
47 |
48 | To manage access to the system, we intend to use policies (Policies are unashamedly stolen from the AWS approach - again, see the link at the bottom)
49 |
50 | Policies are JSON files which depend on 4 concepts.
51 |
52 | 1. an Actor
53 | 2. an Effect
54 | 3. an Action
55 | 4. a Resource
56 |
57 | An **Actor** is a User in the context of a Tenant. This means that a User may exist as several Actors in the system.
58 |
59 | An **Effect** is a Statement of what the policy will do, it is either _Allow_ or _Deny_.
60 |
61 | An **Action** is what the policy statement allows the Actor to do (or doesn't in the Deny case)
62 |
63 | A **Resource** is the thing that the policy statement applies to. It can be either a piece of content, a plugin, a config setting or a behaviour.
64 |
65 | So a user has a number of policies, which are applied based on the tenancy that they are logged in to.
66 |
67 | The System will request All the policies that apply to USER@TENANT and all that apply to *@TENANT and apply them to the request.
68 |
69 |
70 | ### Sample Request Flow
71 | The system uses policies whenever it is asked to do anything. An example is editing a course. Here's a rough outline of the process:
72 |
73 | The App receives a request to edit course A1
74 |
75 | HTTP GET /courses/A1
76 |
77 | The App checks the User to see if they can view courses
78 |
79 | App->AuthModule
80 | Hi, I'm USER@TENANT, Can I VIEW A COURSE in TENANT?
81 |
82 | AuthModule->App
83 | yes/no
84 |
85 | The App asks the DataModule for the Course
86 |
87 | App->DataModule
88 | Hi, I'm USER@TENANT, Give me COURSE:A1
89 |
90 | DataModule->App
91 | Here you are, {json_content}
92 |
93 | The DataModule checks with the AuthModule to see if USER@TENANT is allowed to see COURSE:A1 - and returns it if so
94 |
95 | The App serves the JSON of Course:A1 to the User's Browser
96 |
97 | The User makes some changes, and submits their changes
98 |
99 | HTTP POST /courses/A1
100 |
101 | The App works through the same process as before, this time POSTing the data to the DataModule and getting a success/fail response
102 |
103 | App->AuthModule
104 | Hi, I'm USER@TENANT, Can I EDIT A COURSE in TENANT?
105 |
106 | AuthModule->App
107 | yes/no
108 |
109 | App->DataModule
110 | Hi, I'm USER@TENANT, Save this to COURSE:A1 please {json_content}
111 |
112 | DataModule->App
113 | success/failure
114 |
115 | ## Config
116 | It's important to talk about how we manage Configuration in a Multitenanted Application.
117 |
118 | Without getting into too much detail (much of our config is as yet undefined) we consider Config to be just another resource. It's accessed from the Database (or whatever Data Layer we choose to implement) and access is controlled by Policy.
119 |
120 | There probably exists a "Default" config which is stored in the Master database. Tenant specific config is then extracted from the Tenant DataStore and superposed to provide a unique configuration for that tenant.
121 |
122 | (_we could envisage a further development where a user config is further applied to deliver a unique configuration per user_)
123 |
124 |
125 |
126 |
127 | ## Related Reading
128 | [Multitenancy with MongoDB](http://support.mongohq.com/use-cases/multi-tenant.html)
129 | [Amazon Policies Overview](http://docs.aws.amazon.com/IAM/latest/UserGuide/PoliciesOverview.html)
130 |
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/structural-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/structural-1.jpg
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_data_model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_data_model.png
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_subsystems.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_subsystems.png
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_ui_modules_admin.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_ui_modules_admin.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_ui_modules_content_creator.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/supporting_docs/adapt_authoring_ui_modules_content_creator.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/supporting_docs/editing_flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/supporting_docs/editing_flow.png
--------------------------------------------------------------------------------
/02_authoring_tool/05_architecture/supporting_docs/technical_architecture_uses_view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/05_architecture/supporting_docs/technical_architecture_uses_view.png
--------------------------------------------------------------------------------
/02_authoring_tool/06_end_user_documentation/supporting_docs/content_production_workflow_example_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/06_end_user_documentation/supporting_docs/content_production_workflow_example_1.png
--------------------------------------------------------------------------------
/02_authoring_tool/06_end_user_documentation/supporting_docs/content_production_workflow_example_2.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/06_end_user_documentation/supporting_docs/content_production_workflow_example_2.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/07_community_discussion/architecture.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/07_community_discussion/architecture.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/07_community_discussion/roadmap-2016-12.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/07_community_discussion/roadmap-2016-12.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/07_community_discussion/roadmap-2017-11.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/07_community_discussion/roadmap-2017-11.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/07_community_discussion/roadmap-2018-06.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/02_authoring_tool/07_community_discussion/roadmap-2018-06.pdf
--------------------------------------------------------------------------------
/02_authoring_tool/07_community_discussion/roadmap.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "number": "v0.8.0",
4 | "name": "Theme editor",
5 | "description": "Full support for ediable themes",
6 | "milestone": 36,
7 | "owner": "canstudios-paulh"
8 | },
9 | {
10 | "number": "v0.9.0",
11 | "name": "Passwords",
12 | "description": "Improvements to user passwords",
13 | "milestone": 37,
14 | "owner": "lc-thomasberger"
15 | },
16 | {
17 | "number": "v0.10.0",
18 | "name": "Server refactor",
19 | "description": "A restructuring of the back-end code to make the codebase more maintainable and to better support 'pluggable' code.",
20 | "milestone": 30,
21 | "owner": "taylortom"
22 | },
23 | {
24 | "number": "v0.11.0",
25 | "name": "Tenant management",
26 | "description": "Will enable multiple tenants in a single authoring tool install, allowing you to maintain separate groups of users and courses in a single install.",
27 | "milestone": 24,
28 | "owner": "dancgray"
29 | },
30 | {
31 | "number": "v0.12.0",
32 | "name": "Asset manager revamp",
33 | "description": "A rethink to the built-in asset manager to make working with a large repository of assets more enjoyable.",
34 | "milestone": 23,
35 | "owner": "dancgray"
36 | },
37 | {
38 | "number": "v0.13.0",
39 | "name": "Multi-language support",
40 | "description": "In-tool support for the translation of your Adapt courses into multiple languages. Being able to create one course in multiple languages will not only give your learners a smoother experience, it'll also greatly simplify your international elearning course deployment.",
41 | "milestone": 13,
42 | "owner": "lc-thomasberger"
43 | }
44 | ]
45 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/README.md:
--------------------------------------------------------------------------------
1 | # Test cases
2 |
3 | This directory contains test cases for the adapt authoring tool. Before a release, a run-through of these test cases should be completed.
4 |
5 | ## How to use
6 |
7 | Tests are organised into suites, a suite should cover a particular area or feature and can be found in the test suites directory.
8 |
9 | Whenever we have a release we should have a test run, one checklist should exist per run and these can be found in the test runs directory. A test run checklist should contain a list of all the tests alongside the name of the person that carried out the test.
10 |
11 | These tests should be updated whenever new features are added.
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test runs/0.7.0.md:
--------------------------------------------------------------------------------
1 | 0.7.0 - Loose ends
2 | =====================================================
3 |
4 | Test case numbers are listed by test suite below.
5 | When a test has been completed this should be indicated with
6 |
7 | [Passed/Failed] - [github username] - [date]
8 |
9 | as in the following example:
10 | - X - Passed - canstudios-nicolaw - 21/02/19
11 |
12 | This release should be tested with both v2 and v4 of the framework. The list of tests is repeated so that one list can be used per framework.
13 |
14 | Framework v2
15 | ---
16 |
17 | ### Asset Management
18 | - 1 Passed - canstudios-kent - 05/03/19
19 | - 2 Passed - canstudios-kent - 05/03/19
20 | - 3 Passed - canstudios-kent - 05/03/19
21 | - 4 Passed - canstudios-kent - 05/03/19
22 | - 5 Passed - canstudios-kent - 05/03/19
23 | - 6 Passed - canstudios-kent - 05/03/19
24 |
25 |
26 | ### Course Import
27 | - 1 Passed - canstudios-kent - 05/03/19
28 | - 2 Passed - canstudios-kent - 07/03/19
29 | - 3 Passed - canstudios-kent - 07/03/19
30 | - 4 Passed - canstudios-kent - 07/03/19
31 | - 5 Passed - canstudios-kent - 07/03/19
32 | - 6 Passed - canstudios-kent - 07/03/19
33 | - 7 Passed - canstudios-kent - 07/03/19
34 |
35 | ### Courses
36 | - 1 Passed - canstudios-kent - 05/03/19
37 | - 2 Passed - canstudios-kent - 05/03/19
38 | - 3 Passed - canstudios-kent - 05/03/19
39 | - 4 Passed - canstudios-kent - 05/03/19
40 | - 5 Passed - canstudios-kent - 05/03/19
41 | - 6 Passed - canstudios-kent - 05/03/19
42 | - 7 Passed - canstudios-kent - 05/03/19
43 | - 8 Passed - canstudios-kent - 05/03/19
44 | - 9 Passed - canstudios-kent - 05/03/19
45 | - 10 Passed - canstudios-kent - 05/03/19
46 | - 11 Passed - canstudios-kent - 05/03/19
47 | - 12 Passed - canstudios-kent - 05/03/19
48 | - 13 Passed - canstudios-kent - 05/03/19
49 | - 14 Passed - canstudios-kent - 05/03/19
50 | - 15 Passed - canstudios-kent - 05/03/19
51 | - 16 Passed - canstudios-kent - 05/03/19
52 |
53 | ### Course Sharing and Downloading
54 | - 1 Passed - canstudios-kent - 05/03/19
55 | - 2 Passed - canstudios-kent - 05/03/19
56 | - 3 Passed - canstudios-kent - 05/03/19
57 | - 4 Passed - canstudios-kent - 05/03/19
58 | - 5 Passed - canstudios-kent - 05/03/19
59 |
60 | ### Login
61 | - 1 Passed - canstudios-kent - 05/03/19
62 | - 2 Passed - canstudios-kent - 05/03/19
63 | - 3 Passed - canstudios-kent - 05/03/19
64 | - 4 Passed - canstudios-kent - 05/03/19
65 | - 5 Passed - canstudios-kent - 05/03/19
66 |
67 | ### User Management
68 | - 1 Passed - canstudios-kent - 05/03/19
69 | - 2 Passed - canstudios-kent - 05/03/19
70 | - 3 Passed - canstudios-kent - 05/03/19
71 | - 4 Passed - canstudios-kent - 05/03/19
72 | - 5 Passed - canstudios-kent - 05/03/19
73 | - 6 Passed - canstudios-kent - 05/03/19
74 | - 7 Passed - canstudios-kent - 05/03/19
75 | - 8 Passed - canstudios-kent - 05/03/19
76 | - 9 Passed - canstudios-kent - 05/03/19
77 | - 10 Passed - canstudios-kent - 05/03/19
78 |
79 |
80 |
81 | Framework v4
82 | ---
83 |
84 | ### Asset Management
85 | - 1
86 | - 2
87 | - 3
88 | - 4
89 | - 5
90 | - 6
91 |
92 |
93 | ### Course Import
94 | - 1
95 | - 2
96 | - 3
97 | - 4
98 | - 5
99 | - 6
100 | - 7
101 |
102 | ### Courses
103 | - 1
104 | - 2
105 | - 3
106 | - 4
107 | - 5
108 | - 6
109 | - 7
110 | - 8
111 | - 9
112 | - 10
113 | - 11
114 | - 12
115 | - 13
116 | - 14
117 | - 15
118 | - 16
119 |
120 | ### Course Sharing and Downloading
121 | - 1
122 | - 2
123 | - 3
124 | - 4
125 | - 5
126 |
127 | ### Login
128 | - 1
129 | - 2
130 | - 3
131 | - 4
132 | - 5
133 |
134 | ### User Management
135 | - 1
136 | - 2
137 | - 3
138 | - 4
139 | - 5
140 | - 6
141 | - 7
142 | - 8
143 | - 9
144 | - 10
145 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test runs/0.9.0.md:
--------------------------------------------------------------------------------
1 | 0.9.0 - Theme Editor, Unused roles + fixes
2 | =====================================================
3 |
4 | Test case numbers are listed by test suite below.
5 | When a test has been completed this should be indicated with
6 |
7 | [Passed/Failed] - [github username] - [date]
8 |
9 | as in the following example:
10 | - X - Passed - canstudios-nicolaw - 21/02/19
11 |
12 | This release should be tested with both v2 and v4 of the framework. The list of tests is repeated so that one list can be used per framework.
13 |
14 | Framework v2
15 | ---
16 |
17 | ### Asset Management
18 | - 1 - Passed - canstudios-kent - 09/07/19
19 | - 2 - Passed - canstudios-kent - 09/07/19
20 | - 3 - Passed - canstudios-kent - 09/07/19
21 | - 4 - Passed - canstudios-kent - 09/07/19
22 | - 5 - Passed - canstudios-kent - 09/07/19
23 | - 6 - Passed - canstudios-kent - 09/07/19
24 |
25 |
26 | ### Course Import
27 | - 1 - Passed - canstudios-kent - 09/07/19
28 | - 2 - Passed - canstudios-kent - 10/07/19
29 | - 3 - Passed - canstudios-kent - 10/07/19
30 | - 4 - Passed - canstudios-kent - 10/07/19
31 | - 5 - Passed - canstudios-kent - 10/07/19
32 | - 6 - Passed - canstudios-kent - 10/07/19
33 | - 7 - Passed - canstudios-kent - 10/07/19
34 |
35 | ### Course Sharing and Downloading
36 | - 1 - Passed - canstudios-kent - 09/07/19
37 | - 2 - Passed - canstudios-kent - 09/07/19
38 | - 3 - Passed - canstudios-kent - 09/07/19
39 | - 4 - Passed - canstudios-kent - 09/07/19
40 | - 5 - Passed - canstudios-kent - 09/07/19
41 |
42 | ### Courses
43 | - 1 - Passed - canstudios-kent - 09/07/19 Minor issue with Preview image https://github.com/adaptlearning/adapt_authoring/issues/2336
44 | - 2 - Passed - canstudios-kent - 09/07/19
45 | - 3 - Passed - canstudios-kent - 09/07/19
46 | - 4 - Passed - canstudios-kent - 09/07/19
47 | - 5 - Passed - canstudios-kent - 09/07/19
48 | - 6 - Passed - canstudios-kent - 09/07/19
49 | - 7 - Passed - canstudios-kent - 09/07/19
50 | - 8 - Passed - canstudios-kent - 09/07/19
51 | - 9 - Passed - canstudios-kent - 09/07/19
52 | - 10 - Passed - canstudios-kent - 09/07/19
53 | - 11 - Passed - canstudios-kent - 09/07/19
54 | - 12 - Passed - canstudios-kent - 09/07/19
55 | - 13 - Passed - canstudios-kent - 09/07/19
56 | - 14 - Passed - canstudios-kent - 09/07/19
57 | - 15 - Passed - canstudios-kent - 10/07/19
58 | - 16 - Passed - canstudios-kent - 09/07/19
59 | - 17 - Passed - canstudios-kent - 09/07/19
60 |
61 | ### Login
62 | - 1 - Passed - canstudios-kent - 09/07/19
63 | - 2 - Passed - canstudios-kent - 09/07/19
64 | - 3 - Passed - canstudios-kent - 09/07/19
65 | - 4 - Passed - canstudios-kent - 09/07/19
66 | - 5 - Passed - canstudios-kent - 09/07/19
67 |
68 | ### Plugin Management
69 | - 1 - Passed - canstudios-kent - 09/07/19
70 | - 2 - Passed - canstudios-kent - 09/07/19
71 | - 3 - Passed - canstudios-kent - 09/07/19
72 |
73 | ### User Management
74 | - 1 - Passed - canstudios-kent - 10/07/19
75 | - 2 - Passed - canstudios-kent - 10/07/19
76 | - 3 - Passed - canstudios-kent - 10/07/19
77 | - 4 - Passed - canstudios-kent - 10/07/19
78 | - 5 - Passed - canstudios-kent - 10/07/19
79 | - 6 - Passed - canstudios-kent - 10/07/19
80 | - 7 - Passed - canstudios-kent - 10/07/19
81 | - 8 - Passed - canstudios-kent - 10/07/19
82 | - 9 - Passed - canstudios-kent - 10/07/19
83 | - 10 - Passed - canstudios-kent - 10/07/19
84 | - 11 - Passed - canstudios-kent - 10/07/19
85 |
86 | ----------------------------------
87 |
88 | Framework v4
89 | ---
90 |
91 | ### Asset Management
92 | - 1
93 | - 2
94 | - 3
95 | - 4
96 | - 5
97 | - 6
98 |
99 |
100 | ### Course Import
101 | - 1
102 | - 2
103 | - 3
104 | - 4
105 | - 5
106 | - 6
107 | - 7
108 |
109 | ### Course Sharing and Downloading
110 | - 1
111 | - 2
112 | - 3
113 | - 4
114 | - 5
115 |
116 | ### Courses
117 | - 1
118 | - 2
119 | - 3
120 | - 4
121 | - 5
122 | - 6
123 | - 7
124 | - 8
125 | - 9
126 | - 10
127 | - 11
128 | - 12
129 | - 13
130 | - 14
131 | - 15
132 | - 16
133 | - 17
134 |
135 | ### Login
136 | - 1
137 | - 2
138 | - 3
139 | - 4
140 | - 5
141 |
142 | ### Plugin Management ###
143 | - 1
144 | - 2
145 | - 3
146 |
147 | ### User Management
148 | - 1
149 | - 2
150 | - 3
151 | - 4
152 | - 5
153 | - 6
154 | - 7
155 | - 8
156 | - 9
157 | - 10
158 | - 11
159 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/AssetManagement.md:
--------------------------------------------------------------------------------
1 | Asset Management
2 | ==========================
3 |
4 | **Number of test cases:** 7
5 |
6 | 1 - Uploading a new asset
7 | -----------------------------
8 |
9 | Tests that you can upload a new asset
10 |
11 | ### Test steps
12 |
13 | 1. Navigate to asset management
14 | 2. Click Upload new asset
15 | 3. Enter a title, description, tag and select a file
16 | 4. Click save
17 |
18 | ### Expected result
19 |
20 | * Taken back to asset management page, asset is visible.
21 |
22 | 2 - Editing an asset
23 | ------------------------
24 |
25 | Tests that it is possible to edit an asset.
26 |
27 | ### Test steps
28 |
29 | 1. Click on the asset that's just been uploaded
30 | 2. Click edit
31 | 3. Rename the file and click save
32 | 4. Ensure the renamed asset is visible in the asset list
33 |
34 | ### Expected result
35 |
36 | Assets can be renamed.
37 |
38 | 3 - Searching by name
39 | -------------------------
40 |
41 | Ensures its possible to search for an asset by name.
42 |
43 | ### Test steps
44 |
45 | 1. On the asset page, enter the name of an asset
46 |
47 | ### Expected result
48 |
49 | Assets can be filtered by name.
50 |
51 | 4 - Searching by file type
52 | ------------------------------
53 |
54 | Test that user can filter assets by file type.
55 | Requires an asset of each available filter type to have been uploaded.
56 |
57 | ### Test steps
58 |
59 | 1. Click a file toggle. Check that only image type assets are shown.
60 | 2. Toggle off the filter.
61 | 3. Repeat for each toggle individually.
62 | 4. Select 2+ toggles at once.
63 |
64 | ### Expected result
65 |
66 | * Enabling a toggle will show that asset type.
67 | * When entering asset management, all asset type toggles will be off, and all assets (excluding deleted assets) will be shown.
68 |
69 | 5 - Searching by tags
70 | -------------------------
71 |
72 | Ensures that tags can be used to filter assets.
73 |
74 | ### Test steps
75 |
76 | 1. Click on search by tag
77 | 2. Select a tag
78 | 3. After checking the results are as expected, select another tag
79 | 4. Check the results again, and remove the tags by clicking the 'X'
80 |
81 | ### Expected result
82 |
83 | Assets can be filtered by one or more tags.
84 |
85 | 6 - Deleting and restoring asset
86 | ------------------------------------
87 |
88 | Tests that it is possible to delete assets.
89 | Begin this test as a Super Admin user.
90 |
91 | ### Test steps
92 |
93 | 1. Select our recently uploaded asset
94 | 2. Click Delete
95 | 3. Click yes when prompted
96 | 4. Click on the greyed out asset
97 | 5. Click restore
98 |
99 | ### Expected result
100 |
101 | * Assets can be deleted and then restored again (you might want to delete again after restoring to clean up).
102 | * Only Admins can:
103 | * Delete any user's assets.
104 | * Restore deleted assets.
105 | * See "deleted" assets, which are grayed out.
106 | * Non-Admins can upload, and edit assets, though they are limited to deleting only their own assets.
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/CourseImport.md:
--------------------------------------------------------------------------------
1 | Course imports
2 | ==============
3 |
4 | **Number of test cases:** 7
5 |
6 | 1 - Importing course - Admin only access
7 | --------------------------------------------
8 |
9 | Test that only specific users can access "Framework Import".
10 | Requires users of types Super Admin and Course Creator.
11 |
12 | ### Test steps
13 |
14 | 1. Login as a Super Admin. On the Dashboard, click "Import source".
15 | 2. Log out. Login as a Course Creator.
16 | 3. "On the Dashboard, attempt to find "Import source" button."
17 |
18 | ### Expected result
19 |
20 | * "Import Framework source" can be accessed through the "Import source" button in the Dashboard. This can only be done by Super Admin.
21 |
22 | 2 - Importing course - Valid source folder
23 | ----------------------------------------------
24 |
25 | Test that a user can import a course.
26 | **22/03/2018 Note**: Element properties that contain or use element ids will not update. They will still use the ids of the original course. Hero images, custom CSS/LESS, and course tags will not be imported either. Subfolders in the course will be brought to the top of lists, followed by pages.
27 |
28 | ### Test steps
29 |
30 | 1. Create a course. Add some tags. Add some graphic components with images to it.
31 | 2. Navigate to a course's menu editor. Click Export source.
32 | 3. Open the folder. Go to src -> course -> en and find the assets.json file.
33 | 4. Navigate back to Dashboard. Click Import source
34 | 5. Upload the source code folder downloaded in the previous steps.
35 | 6. Type "Imported" in the tags field. Click Import source.
36 | 7. Navigate to "Dashboard". Find the imported course.
37 | 8. Check that the course has the "Imported" tag. Check that the course content is similar to the original course.
38 |
39 | ### Expected result
40 |
41 | * Admin users can import courses using the source code folder from the Export source button. Additional tags can be added to the course during import.
42 | * An Asset's titles, descriptions and tags are contained in assets.json, and will be uploaded alongside the asset if an asset is not already in the server.
43 | * Assets and plugins will be uploaded if they are part of the course and are not already in the server.
44 |
45 | 3 - Importing course - Invalid files
46 | ----------------------------------------
47 |
48 | Test that system prevents invalid file uploads.
49 |
50 | ### Test steps
51 |
52 | 1. Enter a course and click Publish course.
53 | 2. Navigate to "Framework Import". With no file uploaded, click Import source. Error message appears.
54 | 3. Upload the zip folder downloaded in the previous step.
55 | 4. Click Import source. Close the error modal.
56 | 5. Attempt an import of a file that is not a zip folder. Close the error modal.
57 |
58 | ### Expected result
59 |
60 | * An error modal appears when the user attempts to import a file that is not the source code zip folder. The file that was used for the failed import will not be in the system.
61 |
62 | 4 - Importing Course - Successful Import
63 | --------------------------------------------
64 |
65 | Tests that it is possible to successfully upload a course.
66 |
67 | ### Test steps
68 |
69 | 1. Export a course.
70 | 2. Navigate to the course import page.
71 | 3. Successfully upload the course.
72 | 4. Open the course.
73 |
74 | ### Expected result
75 |
76 | * Course is visible on dashboard.
77 | * Course contains the correct content and can be edited.
78 |
79 | 5 - Importing course - Prevent asset and plugin duplication
80 | ---------------------------------------------------------------
81 |
82 | Test that framework imports prevent duplication of existing assets and plugins.
83 |
84 | ### Test steps
85 |
86 | 1. Create a new course. Add 2 graphic components. Use the same image file for both of them.
87 | 2. Find the name the of image files used. Check how many files of the same name currently exist in Asset Manager.
88 | 3. Add some extensions onto the course.
89 | 4. Back in the Menu editor of the course, click Export source.
90 | 5. Navigate to "Framework Import". Import the course.
91 | 6. Import the course a second time. Navigate to "Asset management".
92 | 7. Check that the number of image files from step (2) is the same.
93 | 8. Navigate to "Plugin Management". Check that there is only one version of the plugins that are part of the imported course.
94 |
95 | ### Expected result
96 |
97 | * When the system detects that an existing asset id in the imported course folder, then the course asset is not reuploaded into the server.
98 | * When a course contains an asset or plugin not located in the server, then the new asset or plugin will be uploaded.
99 |
100 | 6 - Importing course - Edge case - Uploading missing assets automatically
101 | -----------------------------------------------------------------------------
102 |
103 | Test that all aspects of the course are imported.
104 | Requires a component plugin that can be removed manually.
105 | Please ensure that the uploaded component that has been used is deleted at the end of the test so that it can be used for testing again.
106 |
107 | ### Test steps
108 |
109 | 1. In Plugin Management, upload a new plugin that can be used in courses.
110 | 2. Create a new course. Add and setup the newly uploaded component into this course.
111 | 3. Add 2 graphic components. Use the same image file for both of them.
112 | 4. In Asset manager, use the browser dev tool to find the asset id of the image that was used in step (2). Ensure it has some tags and a description.
113 | 5. Export the source code folder for this course.
114 | 6. Delete the image from the database.
115 | 7. Delete the course. Remove the plugin from the server.
116 | 8. Import the course using the source code folder.
117 | 9. Check that: the course has been imported; plugin has been uploaded; the image has been uploaded only _once_.
118 | 10. Delete the course or remove the plugin from the course.
119 | 11. Delete the plugin from the server.
120 |
121 | ### Expected result
122 |
123 | * Plugins and assets that were not already uploaded to the server will be uploaded as part of the import. Assets will have their associated title, tags and descriptions at the time of the course's export.
124 | * Assets used multiple times in a course will only be uploaded once.
125 | * Tags added during import will be appended to the course's and any re-uploaded asset's tag list. Please note that re-uploaded assets will not have the same asset id.
126 |
127 | 7 - Importing course - Edge case - Importing large courses for the first time
128 | ------------------------------------------------------------------------------------------------
129 |
130 | Test that large courses (150mb+) are imported correctly.
131 | Test that large courses can be previewed correctly.
132 |
133 | ### Test steps
134 |
135 | 1. In "Framework import", upload a large course file that contains assets that have not been used in this server.
136 | 2. Click Import source. Wait until the course has imported.
137 | 3. In "Dashboard", open the course. Click Preview course.
138 | 4. Check that the course looks correct.
139 |
140 | ### Expected result
141 |
142 | * Larger courses will eventually be imported.
143 | * Larger courses will eventually be built in preview.
144 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/CourseSharingDownloading.md:
--------------------------------------------------------------------------------
1 | Courses - Sharing / Downloading Content
2 | =======================================
3 |
4 | **Number of test cases:** 5
5 |
6 | 1 - Previewing courses
7 | -------------------------
8 |
9 | Test that users can preview courses.
10 |
11 | ### Test steps
12 |
13 | 1. From "My Courses" or "Shared Courses" select a course to preview.
14 | 2. Click "Preview course".
15 | 3. Navigate through the course and make sure content loads and looks alright.
16 | 4. Close the window.
17 |
18 | ### Expected result
19 |
20 | * Course should open on a new tab.
21 |
22 | 2 - Downloading courses
23 | --------------------------
24 |
25 | Test that users can download courses.
26 |
27 | ### Test steps
28 |
29 | 1. Go to Edit Course.
30 | 2. From the LHS navigation, click Publish course.
31 |
32 | ### Expected result
33 |
34 | * A zip file should download with the name of the course.
35 |
36 | 3 - Exporting Source Code
37 | ----------------------------
38 |
39 | Ensures that it is possible to export source code.
40 |
41 | ### Test steps
42 |
43 | 1. Go to Edit Course.
44 | 2. From the LHS navigate, click Export source.
45 | 3. Check contents
46 |
47 | ### Expected result
48 |
49 | * A zip file should download with the name of the course and appended with "-export".
50 |
51 | 4 - Courses Sharing - Shared Course
52 | ---------------------------------------
53 |
54 | Ensures you can make your course available for other people in your tenant to access.
55 |
56 | ### Test steps
57 |
58 | 1. Navigate to your course settings and change 'Share with others' to true.
59 | 2. Check that your course is now also listed within the 'shared courses' section.
60 | 3. Check that another user within your tenant can see it.
61 | 4. As the other user (not the course owner) attempt to delete the course.
62 | 5. As the course owner delete the shared course.
63 | 6. As an Admin user, delete another user's course that has "Share with all user" enabled.
64 |
65 | ### Expected result
66 |
67 | * Sharing a course displays it in the shared courses section for all users within your tenant.
68 | * Shared courses can be deleted by anyone.
69 | * Admin users can delete any shared courses.
70 |
71 |
72 | 5 - Courses Sharing - Specific users
73 | ---------------------------------------
74 |
75 | Test that courses can be shared with specific users.
76 | Requires at least 3 users in the same tenant.
77 |
78 | ### Test steps
79 |
80 | 1. As user 1, create or enter a course.
81 | 2. In "Project settings", click the field under "Share with specific users".
82 | 3. From the user list, select an account (user 2) that can be accessed.
83 | 4. In an incognito tab or different browser, log in as user 2. Check that the course is visible.
84 | 5. Edit and preview the course. Attempt to remove user 2 from the "Share with specific users" list.
85 | 6. Log out. Log in as a user that was not shared (user 3).
86 | 7. Check that the course is hidden.
87 | 8. As user 1, remove user 2, and add user 3.
88 | 9. As user 3, check that the course is visible. As user 2, check that the course is hidden.
89 | 10. As user 3, add user 2 to the list. As user 2, check that the course is visible.
90 |
91 | ### Expected result
92 |
93 | * Course author can select and remove specific users to share a course with.
94 | * Selectable users are the full list of users from User management.
95 | * Multiple users can be selected and removed from the sharing list.
96 | * Users that have been selected for sharing can interact with the course as though they were the original course author.
97 | * This includes course edits, course deletion, sharing with others etc.
98 | * Users cannot remove themselves from the shared list.
99 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/Courses.md:
--------------------------------------------------------------------------------
1 | Courses - Course Creation
2 | =========================================
3 |
4 | **Number of test cases:** 19
5 | -------------------------------------------------
6 |
7 | 1 - Creating a course
8 | -------------------------------------------------
9 |
10 | Tests that it is possible to create a valid course.
11 |
12 | ### Test steps
13 |
14 | 1. From the dashboard, click 'Add New Course'.
15 | 2. Under "Preview image", click Select an asset.
16 | 3. Select an asset. Click Done.
17 | 4. Enter a new course title, and some body text.
18 | 5. Click Save.
19 |
20 | ### Expected result
21 | * New courses can be created.
22 | * If a course does not have a "Preview Image" set, then they are given the system's default image.
23 | -----------------------
24 |
25 | 2 - Copying a course
26 | ------------------------
27 |
28 | Tests that it is possible to copy a course.
29 |
30 | ### Test steps
31 |
32 | 1. Navigate to the dashboard.
33 | 2. Click the cog next to the newly created course. Click Copy.
34 | 3. Ensure that the "Title" and "Display Title" are linked. Click Save.
35 | 4. Preview the copied course.
36 |
37 | ### Expected result
38 |
39 | * A copy of a course can be created. This should appear as 'Copy of _course title_'.
40 | * The "Updated" date on the copied course should be the date when the copying occurred.
41 |
42 | -----------------
43 | 3 - Dashboard - Course Sorting
44 | -----------------
45 |
46 | Test that courses in the dashboard are sorted by most recently updated.
47 | Test that courses can be sorted.
48 | Note: Issue with course date only updating when Project settings have been changed https://github.com/adaptlearning/adapt_authoring/issues/2057
49 |
50 | ### Test steps
51 |
52 | 1. Go to the dashboard.
53 | 1. Make sure the first course is the course you were just editing.
54 | 1. Sort by name. Sort by Recent.
55 | 1. Click List. Click Grid.
56 | 1. Refresh the page - should default to the last filter that you selected.
57 | 1. Make sure you can open a course with 1 click only. This applies for both Advanced and Lite.
58 | 1. Repeat for "Shared courses" area.
59 |
60 | ### Expected result
61 |
62 | * Default sorting is by most recently edited. Default layout is grid.
63 | * When in grid layout, the course tiles will be 3 to 5 courses per row. When in list layout, it will be a course per row.
64 | * When sorting by title (ascending), it will be ordered by: Numbers, Uppercase A to Z, and finally Lower case a to z.
65 | * When sorting by title (descending), it will be ordered by: Lowercase z to a, then Uppercase Z to A, and finally Numbers. 7th Dec 2017 Note: at the time of writing the update date would only change if the course was rebuilt. Adding components, blocks, articles does not update the date.
66 |
67 |
68 | -----------------
69 | 4 - Dashboard - Course filtering
70 | -----------------
71 |
72 | Test that courses can be filtered.
73 | Requires a course with tags.
74 | Note: Multiple course search methods are not applied at the same time https://github.com/adaptlearning/adapt_authoring/issues/2333
75 |
76 | ### Test steps
77 |
78 | 1. In "My courses", enter a term in the search field. Check that the courses list updates.
79 | 1. Partially delete the search term. Check that the courses list updates.
80 | 1. Empty the search field.
81 | 1. Click Search by tag. Select a tag used by a course.
82 | 1. Click the x on the tags.
83 | 1. Use both the search fields and the tag filter options.
84 | 1. Repeat previous steps for "Shared courses" area.
85 |
86 | ### Expected result
87 |
88 | * Courses can be filtered by the search field and by their tags.
89 | * Search field terms are case insensitive. Partially matching courses are also shown.
90 | * Tag searches only show courses with the desired tags.
91 |
92 | ----------------------
93 | 5 - Add components
94 | ----------------------
95 |
96 | Tests that it is possible to add components to the course.
97 |
98 | ### Test steps
99 |
100 | 1. Double click the newly created page.
101 | 2. Click Add block. Click Add component.
102 | 3. Select the BLANK component and click add full.
103 | 4. Click Add new block. Click Add component.
104 | 5. Select the TEXT component and click Add to left.
105 | 6. Add a few other components.
106 | 7. Click Preview course.
107 |
108 | ### Expected result
109 |
110 | * New components are visible in the preview.
111 | * Components can be positioned to be full or half a block width.
112 |
113 | ----------------------
114 | 6 - Components - Filtering
115 | ------------------------------------------------------------
116 |
117 | Test that users can search for a component.
118 |
119 | ### Test steps
120 |
121 | 1. On an empty block, click Add component.
122 | 2. In the search field, type in a term. Check list updates.
123 | 3. Clear the field. Type a term that results in nothing appearing in the list.
124 | 4. Clear the field. Type a term that partially matches a component e.g. "quest", "ment".
125 | 5. Select and add a component from the list.
126 |
127 | ### Expected result
128 |
129 | * User can search for specific components using the search field.
130 | * List updates dynamically as search term changes.
131 | * Search terms are case insensitive. Partial matches are shown.
132 |
133 | ----------------------
134 | 7 - Remember position in Page editor area
135 | ------------------------------------------------------------
136 |
137 | Test that Authoring tool returns the user to their original position in the Page editor area.
138 | Requires a course with a page that has 5+ blocks.
139 |
140 | ### Test steps
141 |
142 | 1. Navigate to a course page that has 5+ blocks.
143 | 2. Navigate to the lowest block on the page. Note the user's position on the web page.
144 | 3. Click Edit in the cog menu of the bottom most block.
145 | 4. Click Cancel. Check the user's page position.
146 | 5. Click Edit in the cog menu of the bottom most block.
147 | 6. Click Save. Check the user's page position.
148 |
149 | ### Expected result
150 |
151 | * When navigating from an element's property page to the Page editor, the user will be returned to the element on the page instead of the top of the page.
152 |
153 | ----------------------
154 | 8 - Copying elements inside a course
155 | ----------------------------------------
156 |
157 | Test that you can copy components, blocks, articles and pages.
158 |
159 | ### Test steps
160 |
161 | 1. In the Page Editor area, add an empty block.
162 | 2. Copy a component.
163 | 3. Copy a block.
164 | 4. Copy an article.
165 | 5. Copy a page.
166 | 6. Preview the course.
167 | 7. Open the copied page and make sure all copied elements are there.
168 |
169 | ### Expected result
170 |
171 | * Users can copy elements inside a course.
172 |
173 | ----------------------
174 | 9 - Copying list items within a component
175 | ---------------------------------------------
176 |
177 | Test that users can copy list items.
178 |
179 | ### Test steps
180 |
181 | 1. Add a component to a course that contains a list e.g. Accordion, Multiple Choice Question, Narrative.
182 | 2. Enter the component's settings page. Under "Properties", click Add to add an item/answer.
183 | 3. Add details for the item. Click OK.
184 | 4. In the newly created item, click the Copy button.
185 | 5. Check the details of the copied item. Edit the copied item.
186 | 6. On the original item, click the Copy button. Check the position of the new item.
187 |
188 | ### Expected result
189 |
190 | * Items and answers within components can be copied.
191 | * Copied items are at the bottom of the list.
192 |
193 | ----------------------
194 | 10 - Collapsing/ Expanding articles
195 | ---------------------------------------------
196 |
197 | Test that user can collapse and expand articles.
198 |
199 | ### Test steps
200 |
201 | 1. Navigate to a page within a course. Add multiple articles.
202 | 2. Click the "-" collapse button in the top right corner of a few articles.
203 | 3. Click the "+" next to collapsed articles.
204 | 4. Click the Collapse all articles button.
205 | 5. Click the Expand all articles button.
206 | 6. Collapse a few articles. Navigate to another page within the same course.
207 | 7. Return back to the page from step (1). Articles should remain collapsed.
208 |
209 | ### Expected result
210 |
211 | * User can collapse and expand individual articles.
212 | * "-" Button changes to "+" upon collapsing article, and vice versa when expanding.
213 | * User can collapse and expand all articles within the page.
214 | * State of article is remembered between pages and navigation.
215 |
216 | ### Expected result
217 |
218 | * Users can copy elements inside a course.
219 |
220 | ----------------------
221 | 11 - Rearranging course elements
222 | ---------------------------------------------
223 |
224 | Test that users can change the positions of course elements.
225 | Requires a course with:
226 | - 2+ submenus with unique titles.
227 | - A submenu containing 2+ pages with unique titles.
228 | - Each page containing 2+ articles with unique titles.
229 | - Each article containing 2+ blocks with unique titles, and components.
230 |
231 | ### Test steps
232 |
233 | 1. Preview a course that matches what was given in the description.
234 | 2. Back in the menu editor, click and drag the lowest subfolder to the top of the list.
235 | 3. Click a submenu. Click and drag a page from the left hand column into the middle column.
236 | 4. Within a submenu, click and drag the lowest page to the top of the list.
237 | 5. Navigate into a page. Click and drag the lowest article to the top of the list.
238 | 6. Within an article, click and drag the bottom most block to the top of that article.
239 | 7. Click either the "left" or "right arrows on a component.
240 | 8. Preview the course. Check that changes persist.
241 |
242 | ### Expected result
243 |
244 | * User can change the positions of submenu, pages, articles, blocks, and components.
245 | * Submenus, pages, articles and blocks can be moved by dragging them to areas between related elements.
246 | * Pages can be moved between submenus by dragging them between columns. At present, it is not possible to move submenus into or from other submenus.
247 | * Components can be repositioned to the left, right, or full width within a block by clicking the arrows.
248 |
249 | ----------------------
250 | 12 - Changing the course theme
251 | ---------------------------------------------
252 |
253 | Tests it is possible to change the course theme.
254 |
255 | ### Test steps
256 |
257 | 1. From the dashboard, click on the cog of the newly created course and click Edit Course
258 | 2. Click Theme picker
259 | 3. Select a new theme and click save
260 | 4. Click preview and marvel at your new theme!
261 |
262 | ### Expected result
263 |
264 | * New theme appears in the preview.
265 |
266 | ----------------------
267 | 13 - Fields - Reset to default
268 | ---------------------------------------------
269 |
270 | Test that reset button appears when appropriate.
271 | Test that reset button can reset fields.
272 |
273 | ### Test steps
274 |
275 | 1. Navigate to a page within a course.
276 | 2. Add a new component. Double click the component.
277 | 3. Note down the current values/settings of a few fields.
278 | 4. Edit a field, and enable a few check boxes.
279 | 5. Notice that a "Reset" arrow appears next to the field title.
280 | 6. Click the reset arrow. Check that the field contains the field/setting noted from step (3).
281 |
282 | ### Expected result
283 |
284 | * The reset button appears over fields that have been changed from their default values.
285 | * Clicking the reset button will return the value/settings of the field to their default values.
286 | * User still needs to click to confirm changes.
287 |
288 | ----------------------
289 | 14 - Course editor breadcrumbs
290 | ---------------------------------------------
291 |
292 | Tests that breadcrumbs can be used for navigation.
293 | Requires a course with 2 pages with unique titles.
294 |
295 | ### Test steps
296 |
297 | 1. Enter a course. Click Dashboard in the breadcrumbs.
298 | 2. Re-enter the course. Enter a page.
299 | 3. Under the breadcrumbs, check that the course title and the current page title are visible.
300 | 4. Click the cog menu, then select Edit.
301 | 5. Change the page title. Click Save.
302 | 6. Enter an article. Check that the article's title is shown under the breadcrumbs.
303 | 7. In the breadcrumbs, click Course structure.
304 |
305 | ### Expected result
306 |
307 | * Course breadcrumbs show the user's current location within the course structure.
308 | * Black text is the current location; green text is clickable and navigates the user that area.
309 | * Underneath the breadcrumbs is the course title.
310 | * When within an submenu, page, article, block or component, the element's current title will be shown under the course title.
311 |
312 | ----------------------
313 | 15 - Adding Extensions
314 | -------------------------------------
315 |
316 | Tests that it is possible to add an extension to the course
317 |
318 | ### Test steps
319 |
320 | 1. From the dashboard, click on the cog of the newly created course and click Edit Course.
321 | 2. Click Manage extensions.
322 | 3. Click Add next to an extension.
323 | 4. Click back to menu then preview the course.
324 |
325 | ### Expected result
326 |
327 | * Adding the extension makes it appear in the preview
328 |
329 | ----------------------
330 | 16 - Colour Labels
331 | -------------------------------------
332 |
333 | Tests that colour labels can be added to course elements.
334 |
335 | ### Test steps
336 |
337 | 1. In a shared course, click the cog menu on a page. Click "Colour label".
338 | 2. Select a colour. Click Apply.
339 | 3. Repeat previous step on a submenu, page, article, block, and component.
340 | 4. Check that the colour is applied to the left-hand side of the element.
341 | 5. In another course, check that the course elements are unaffected.
342 | 6. Log in as a different user. Check that the colour label are visible in the course.
343 | 7. Click Preview. Check that the colour is not applied.
344 | 8. Back in the main editor, click the cog menu > "Colour label".
345 | 9. Click Reset. Click Apply.
346 |
347 | ### Expected result
348 |
349 | * Colour labels can be added to course elements within the Authoring tool.
350 | * The labels are only applied to the specific course.
351 | * When the course is shared, the labels are visible for the shared users.
352 | * The labels are not visible in course preview.
353 | * The label can be changed or removed.
354 |
355 | ----------------------
356 | 17 - HTML inside CKeditor
357 | ----------------------------
358 |
359 | Test that you can add HTML inside the body of any element.
360 | Note: If one of the video or audio files do not work, check that the link is still valid.
361 |
362 | ### Test steps
363 |
364 | 1. From the Editor open a course.
365 | 2. Navigate to the body of any element.
366 | 3. Click source inside the CKeditor.
367 | 4. Add valid and working HTML for some of these elements (see attached file):
368 | * span
369 | * img
370 | * div
371 | * a
372 | * h\[1-6\]
373 | * embed
374 | * object
375 | * iframe
376 | * video
377 | * audio
378 | * source
379 | 5. Preview the course. Make sure all elements work.
380 |
381 | ### Expected result
382 |
383 | Users can edit hyperlink urls in a modal when Edit mode is On. When Edit mode is Off, hyperlinks will take the user to the specified url.
384 | Only allowed HTML should work when previewing a course.
385 | \- **This should work:**
386 | `Here's a link`
387 | \- **This should not work:**
388 | ```html
389 |
392 | ```
393 |
394 | ----------------------
395 | 18 - Change the Primary Colour on a course
396 | ---------------------------------------------
397 |
398 | Test that a user can change the primary colour of a course through the Custom CSS/LESS code setting.
399 |
400 | ### Test steps
401 |
402 | 1. Navigate to the project settings of a course.
403 | 2. Scroll down to the Custom CSS/LESS code field.
404 | 3. Enter: @primary-color: red;
405 | 4. Click Preview.
406 | 5. Check that pages and text are in red.
407 |
408 | ### Expected result
409 |
410 | * Can change the primary colour of a course.
411 | * Text within "Custom CSS/LESS code" code editor should be coloured for easier reading.
412 | * CSS/LESS box starts at (original) height of 14 lines, and can expand to 30 lines before requiring a scroll bar.
413 |
414 | ----------------------
415 | 19 - Find function while editing custom CSS
416 | ----------------------------------------------
417 |
418 | The find tool typical for most browsers and programmes should appear when the custom CSS field is selected. This is so that the content team can easily find classes used in a course.
419 |
420 | ### Test steps
421 |
422 | Navigate to the custom CSS field in the edit course section:
423 | 1. Click on the cog icon of your course
424 | 2. Scroll down to the 'Custom CSS/LESS code' field
425 | 3. Paste in the following CSS many times (until you have over 100 lines of code)
426 |
427 | ```css
428 | .text-inner{
429 | color: #ff0000;
430 | }
431 |
432 | .custom-class{
433 | color: #00ff00;
434 | }
435 | ```
436 |
437 | 1. On one of the lines, put a key phrase you wish to search for and scroll so this phrase is no longer visible in the Custom CSS field.
438 | 2. While still in the field (as if editing the pasted text) press Ctrl + F on windows or Cmd + F on Mac.
439 | 3. A small UI window should pop up allowing you to search for the classes
440 | 4. Try searching parts of the text pasted in from step 3).
441 | 5. Any matching text should become highlighted.
442 |
443 | ### Expected result
444 |
445 | * Custom CSS/LESS code" field will have it's own "Find in" function that's separate to the browser "Find in" page function.
446 | * Any text matched through the find method while editing the custom CSS field should become highlighted.
447 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/CoursesMenuLock.md:
--------------------------------------------------------------------------------
1 | Courses - Menu lock
2 | =========================================
3 |
4 | **Number of test cases:** 8
5 | -------------------------------------------------
6 |
7 | 1 - Menu lock - Course set up
8 | -------------------------------------------------
9 |
10 | Set up a course for menu lock tests. All subsequent menu lock tests will assume that the resultant course is being used.
11 | Can be skipped if the course has already been set-up.
12 |
13 | ### Test steps
14 |
15 | 1. Create a new course.
16 | 1. Alternate between adding pages and submenus until there are 2 of each.
17 | 1. In each of the level-1 submenus, add another submenu and 2 pages (level-2).
18 | 1. In the level-2 submenus, add 2 pages (level-3).
19 | 1. Ensure that each page has an article, block, and component.
20 |
21 | ### Expected result
22 | * Test course created for menu lock test scripts.
23 | * Level-1: contains 2 pages and 2 level-1 submenus.
24 | * Level-2: contains 2 pages and a level-2 submenu.
25 | * Level-3: contains 2 pages.
26 |
27 | -------------------------------------------------
28 |
29 | 2 - Menu lock - Level inheritance
30 | -------------------------------------------------
31 |
32 | Test that menu locks are applied at the correct level.
33 |
34 | ### Test steps
35 |
36 | 1. Navigate into Project settings.
37 | 1. Set “Menu lock” type to “sequential”. Click Save.
38 | 1. Navigate into a submenu’s settings page.
39 | 1. Set “Menu lock” type to “lockLast”. Click Save.
40 | 1. Click Preview. Check that only the first page is unlocked.
41 | 1. Keep completing course elements.
42 | 1. When in the submenu from step (2), check that only the last page is locked.
43 |
44 | ### Expected result
45 | * Setting the “Menu lock” in Project settings affects pages and submenus in level-1.
46 | * “Menu lock” settings are only applied to child pages and submenus. e.g. applying a lock to a submenu on level x will affect pages and submenus on level-x+1 within that submenu. The lock is not applied to the level-x submenu, and will not be applied to nested submenus and pages on level-x+2 and beyond.
47 |
48 | -------------------------------------------------
49 |
50 | 3 - Menu lock - "Last"
51 | -------------------------------------------------
52 |
53 | Setup last lock property on course.
54 | Test that correct course element is initially locked.
55 |
56 | ### Test steps
57 |
58 | 1. Navigate into Project settings.
59 | 1. Set “Menu lock” type to “lockLast”. Click Save.
60 | 1. Click Preview. Check that the first 3 course elements on level-1 are unlocked.
61 | 1. Check that the final course element on level-1 is locked.
62 | 1. Complete the first 3 course elements. Check that the final level-1 course element is now accessible.
63 |
64 | ### Expected result
65 | * When “lockLast” is set, the last course element for the level will be locked.
66 | * The last course element becomes unlocked when preceding course elements in the same level are completed.
67 | * Remember that the "last" lock will only be applied to course elements within the level it is set for.
68 | * Example: A course has last lock set at level-1 and the last element in a course is a submenu. The submenu will be locked instead of the very last nested element within the submenu.
69 |
70 | -------------------------------------------------
71 |
72 | 4 - Menu lock - “Sequential”
73 | -------------------------------------------------
74 |
75 | Setup sequential lock property on course.
76 | Test that correct course elements are initially locked.
77 |
78 | ### Test steps
79 |
80 | 1. Navigate into Project settings.
81 | 1. Set “Menu lock” type to “sequential”. Click Save.
82 | 1. Click Preview. Check that only the first course element on level-1 is unlocked.
83 | 1. Check that subsequent course elements are locked.
84 | 1. Complete the first course element.
85 | 1. Check that the second course element is now accessible.
86 |
87 | ### Expected result
88 | * When “sequential” type is set, pages and submenus are unlocked by completing the preceding course element.
89 | * The first course element should already be unlocked.
90 | * Remember that the "sequential" lock will only be applied to course elements within the level it is set for.
91 | * Example: A course has sequential lock set at level-1 and there are submenus between the first and final course elements. The course elements on level-1 need to completed in sequential order, but the course elements within the affected submenus can be completed in any order (unless a separate lock has been set for those elements).
92 |
93 |
94 | -------------------------------------------------
95 | 5 - Menu lock - “First”
96 | -------------------------------------------------
97 |
98 | Setup first lock property on course.
99 | Test that correct course elements are initially locked.
100 |
101 | ### Test steps
102 |
103 | 1. Navigate into Project settings.
104 | 1. Set “Menu lock” type to “lockFirst”. Click Save.
105 | 1. Click Preview. Check that only the first course element on level-1 is unlocked.
106 | 1. Check that subsequent course elements are locked.
107 | 1. Complete the first course element.
108 | 1. Check that the course elements in step 4 are now accessible.
109 |
110 | ### Expected result
111 | * When “lockFirst” type is set, only the first course element will be unlocked. The remaining pages and submenus on the same level will be locked.
112 | * Completing the first course element unlocks all the course elements on the same level.
113 | * Remember that the "first" lock will only be applied to course elements within the level it is set for.
114 | * Example: A course has sequential lock set at level-1 and the first course element is a submenu. All of the course elements within the submenu need to completed, and can be completed in any order (unless a separate lock has been set for those elements).
115 |
116 | -------------------------------------------------
117 | 6 - Menu lock - “Custom” - Setup
118 | -------------------------------------------------
119 |
120 | Set up custom locks within the course.
121 |
122 | ### Test steps
123 |
124 | 1. Navigate into Project settings.
125 | 1. Set “Menu lock” type to “custom”. Click Save.
126 | 1. Click the cog menu on a page on level-1. Click Copy ID to clipboard.
127 | 1. Click the cog menu on a submenu on level-1. Paste the page ID into the “Locked by…” field.
128 | 1. Click Save. Navigate into level-3 of the other level-1 submenu.
129 | 1. For both pages, note down the page ids.
130 | 1. Navigate to level-1. Enter the settings area of the page that was not used in step 3.
131 | 1. Paste the page ID into the “Locked by…” field.
132 | 1. Click Add. Paste the other page ID.
133 | 1. Click Save.
134 |
135 | ### Expected result
136 | * Course is set up to function with custom menu locks.
137 | * A Submenu on level-1 is set to be locked by a page on the same level.
138 | * A (different) page on level-1 is set to be locked by 2 pages on level-3.
139 |
140 | -------------------------------------------------
141 | 7 - Menu lock - “Custom” - Check
142 | -------------------------------------------------
143 |
144 | Test that course progress can be linked to specific pages.
145 | Note: Unconfirmed behaviour about how custom lock should work between submenus (steps 5-9)(https://github.com/adaptlearning/adapt_authoring/issues/2343)
146 |
147 | ### Test steps
148 |
149 | 1. Preview the course.
150 | 1. Attempt to navigate into the submenu and page that are locked.
151 | 1. Complete the other level-1 page that is not locked. Navigate back to the page menu.
152 | 1. Check that previously locked submenus are unlocked. Check that the locked page remains locked.
153 | 1. Navigate into the submenu that wasn’t locked at the start of the course.
154 | 1. Navigate into the level-2 submenu. Complete 1 of the pages.
155 | 1. Navigate back up to level-1. Check that the page is still locked.
156 | 1. Return back to the level-2 submenu and complete the other page.
157 | 1. Navigate back up to level-1. Check that the page is unlocked.
158 |
159 | ### Expected result
160 | * Accessibility of pages and submenus can be locked by the completion status of other pages and submenus within the same course.
161 | * Pages and submenus can be locked by multiple ids across different levels.
162 | * Course elements remain locked until all the specified course elements have been completed.
163 | * Note: it is possible to create a submenu that is locked by course elements within itself, thus rendering the course impossible to complete.
164 |
165 | -------------------------------------------------
166 | 8 - Menu lock - “Custom” - Removal
167 | -------------------------------------------------
168 |
169 | Test that custom locks can be removed.
170 |
171 | ### Test steps
172 |
173 | 1. Navigate to the settings page of an element that is custom locked.
174 | 1. Click the remove icon for all items under “Locked by”. Click Save.
175 | 1. Click Preview. Check that the element in the previous step can be accessed.
176 | 1. Back in Course structure area, custom lock the element again.
177 | 1. Navigate to “Project settings”. Set “Menu lock type” to blank.
178 | 1. Click Save. Navigate into a course element’s settings page.
179 | 1. Check that items under “Locked by” still remain.
180 | 1. Navigate back to Course structure. Click Preview.
181 | 1. Check that all pages and submenus within that level are unlocked.
182 |
183 | ### Expected result
184 | * Custom locks are disabled when lock settings have been changed.
185 | * Course elements that have been set with custom locks will still retain the “Locked by” IDs.
186 |
187 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/CoursesThemeEditor.md:
--------------------------------------------------------------------------------
1 | Courses - Theme Editor
2 | =========================================
3 |
4 | **Number of test cases:** 12
5 |
6 | 1 - Editable and non-editable themes
7 | -------------------------------------------------
8 |
9 | Ensures that preview works on editable and non-editable courses.
10 |
11 | ### Test steps
12 |
13 | 1. Navigate to 'Theme picker' and select a Base theme which is editable.
14 | 1. Check that ‘Colours’ section is visible. Click Save.
15 | 1. Preview the course. Ensure the course builds and theme has been applied.
16 | 1. Navigate to 'Theme picker' and select a theme which is not editable.
17 | 1. Check that ‘Colours’ section is hidden. Click Save.
18 | 1. Preview the course. Ensure the course builds and theme has been applied.
19 |
20 | ### Expected result
21 | * Editable and non-editable themes can be applied to courses.
22 | * Editable themes show a preset dropdown, and a section for editable colours and, if available, uploading assets.
23 | * Non-editable themes will only show the Base theme dropdown and a message: “Your currently selected theme is not editable.”.
24 |
25 | 2 - Editing visible theme variables
26 | ------------------------
27 |
28 | Test to ensure the user can make intended editable changes to the theme.
29 | Test that users can edit certain themes.
30 |
31 | ### Test steps
32 |
33 | 1. Create a new course. Click Theme picker.
34 | 1. In the Base theme dropdown, select 'Vanilla'.
35 | 1. Under Colour, change each one of the variables. Click Cancel.
36 | 1. Preview the course. Ensure the original Base theme has been applied.
37 | 1. Navigate back into Theme editor. Check that the theme variables have reverted.
38 | 1. Change each one of the variables. Click 'Save'.
39 | 1. Preview the course and ensure the changes have been applied.
40 |
41 | ### Expected result
42 |
43 | * Editable themes will list a set of variables that can be edited.
44 | * Editable theme variables are determined within the theme plugin’s properties.
45 | * Changes in colour and asset variables will be reflected in the course preview when changes have been saved.
46 | * It is still possible to edit and save the “No preset” preset. The values of “No preset”.
47 | * Contrary to the name, “No preset” is still a “preset” in that it is the base theme. Edits made to the “No preset” is unique to the course.
48 |
49 | 3 - Saving a preset
50 | ------------------------
51 |
52 | Test that presets can be saved and reused.
53 |
54 | ### Test steps
55 |
56 | 1. Create a new course. Navigate to Theme editor.
57 | 1. Select an editable Base theme. Check the value in the Preset dropdown.
58 | 1. Under Colours, alter some variables. Click Save as preset.
59 | 1. With the field empty, click Ok.
60 | 1. Enter the name of a preset that already exists for that Base theme. Click Ok.
61 | 1. Give preset a unique title. Click Ok.
62 | 1. Preview the course and check the selected variables have been applied.
63 | 1. Go back to theme picker and refresh the page, making sure that the preset has been saved.
64 |
65 | ### Expected result
66 |
67 | * Selecting an editable theme will show “No preset” in the Preset dropdown by default.
68 | * Presets can be created from base themes and other presets.
69 | * Preset name must be unique.
70 |
71 | 4 - Applying other user’s presets
72 | ------------------------
73 |
74 | Test that presets are accessible to other users.
75 | Requires 2 users: A Super admin and a Course creator.
76 |
77 | ### Test steps
78 |
79 | 1. Log in as the Super admin user (user 1). Create and apply a preset to a course.
80 | 1. Log out. Login as a Course creator (user 2).
81 | 1. Create a new course. Navigate to Theme editor.
82 | 1. Select the same Base theme and preset created in step (1). Click Save.
83 | 1. Preview the course. Check that the theme and preset has been applied.
84 | 1. As the Course creator, create and apply a preset to the course.
85 | 1. Log out. Login as user 1.
86 | 1. Navigate to Theme editor in a course.
87 | 1. Select and apply the same Base theme and preset created in step (6).
88 | 1. Preview the course. Check that the theme and preset is applied.
89 |
90 | ### Expected result
91 |
92 | * Presets can be used on other courses.
93 | * Presets can be used by other users and user types.
94 |
95 | 5 - Edit presets - Preset names
96 | ------------------------
97 |
98 | Test that preset names are unique to the Base theme.
99 | Note: Issue with being able to edit a preset name to be the same as another preset (for that base theme) https://github.com/adaptlearning/adapt_authoring/issues/2382
100 |
101 | ### Test steps
102 |
103 | 1. Create a preset called 'Pre-A' on Vanilla.
104 | 1. Switch themes to another theme.
105 | 1. Create a preset on this new theme also called Pre-A.
106 | 1. On the same base theme, attempt to create another preset called Pre-A.
107 | 1. Click ‘Manage presets’. Click Edit name next to a different preset.
108 | 1. Empty the field. Click Save changes.
109 | 1. Enter a preset name already in use on the base theme. Click Save changes.
110 | 1. Enter a preset name not in use on the base theme. Click Save changes.
111 |
112 | ### Expected result
113 |
114 | - Preset names are on a per base theme basis i.e. the same preset name can be used across different base themes.
115 | - Error message appears when attempting to save a preset name that has already been used for the current base theme.
116 | - The preset name needs to be unique and non-empty when confirming edits.
117 |
118 | 6 - Edit presets - Colours
119 | ------------------------
120 |
121 | Tests behaviour when changing preset values.
122 | Note: Feature to actually edit values of a preset is not available. https://github.com/adaptlearning/adapt_authoring/issues/2388
123 |
124 | ### Test steps
125 |
126 | 1. Navigate to 'Theme picker'. Select an editable theme preset.
127 | 1. Note down the original variable values.
128 | 1. Change some variables such as colours. Click Save.
129 | 1. Preview the course. Check that changes are present.
130 | 1. Navigate back to ‘Theme picker’. Check that preset changes are still visible.
131 | 1. In the Preset dropdown, select the preset selected during step (1).
132 | 1. Check that the values match those noted in step (2).
133 | 1. Edit at least one variable in the theme.
134 | 1. In the left hand side menu, click ‘Restore to preset’. Check that the default variables revert to the last saved state.
135 |
136 | ### Expected result
137 |
138 | * Users can quickly apply variable values from a custom preset onto the “No preset”.
139 | * Values of presets are not altered when changes have been made and saved.
140 | * Instead, the new values overwrite the “No preset” preset. The original preset remains the same.
141 | * Presets can be restored to the latest saved state by clicking Restore to preset.
142 | * Restore to preset will be hidden until a change to the preset has been made but not saved.
143 |
144 | 7 - Base theme - Default selected preset
145 | ------------------------
146 |
147 | Test default behaviour of settings when switching between Base themes.
148 | Requires 2+ editable Base themes with custom presets available.
149 |
150 | ### Test steps
151 |
152 | 1. Open the Theme editor. Select a Base theme (theme 1).
153 | 1. Select a preset. Click Save.
154 | 1. Open the Theme editor again. Select a different Base theme (theme 2)
155 | 1. Select a preset. Click save.
156 | 1. Open the theme editor. Select theme 1.
157 | 1. Check the selected preset and colour variable values.
158 |
159 | ### Expected result
160 |
161 | * The default preset selected when selecting different Base themes is currently “No preset”.
162 |
163 | 8 - Variables are in export
164 | ------------------------
165 |
166 | Test that preset variables are exported.
167 |
168 | ### Test steps
169 |
170 | 1. Create a new course. Navigate into Theme editor.
171 | 1. Change some colours in the theme. Note down the edited variables and new values.
172 | 1. Click Save as preset. Enter a name and click Ok.
173 | 1. Click Save. Export the course.
174 | 1. In the exported folder, navigate to src -> theme -> [Base_theme_name] -> less -> zzzzz.
175 | 1. Open the file named 1-themeVariables.less.
176 | 1. Check that the listed variables and values match those noted down in step (2).
177 |
178 | ### Expected result
179 |
180 | * Preset values are exported alongside the Base theme in a file called 1-themeVariables.less.
181 | * Variables inside the file match those selected within the theme picker.
182 | * Only edited variables are shown in the file.
183 |
184 | 9 - Importing courses with applied presets
185 | ------------------------
186 |
187 | Test that courses with applied presets can be imported.
188 | Requires a Super Admin user.
189 |
190 | ### Test steps
191 |
192 | 1. Create a new course. Create and apply a new preset.
193 | 1. Export the course.
194 | 1. Import and preview the course. Check that the preset is applied.
195 | 1. Navigate to Theme editor. Check that the preset appears only once.
196 | 1. Delete the preset.
197 | 1. Import and preview the course. Check that the preset is applied.
198 | 1. Navigate to Theme editor. Attempt to find the preset from step (1).
199 |
200 | ### Expected result
201 | * The preset is applied to the course when the export folder is imported.
202 | * Only the values and variables from the preset are imported and applied to the course.
203 | * The preset values are saved to the “No preset” preset - The preset name is not imported again.
204 |
205 | 10 - Ensures that the asset shows as a variable in the editable theme.
206 | ------------------------
207 |
208 | Ensures that the asset shows as a variable in the editable theme.
209 |
210 | ### Test steps
211 |
212 | 1. Navigate to 'Theme picker' and select a theme which has editable assets from the dropdown menu.
213 | 1. You should see an option to add an image asset, select this option and upload a new image that is not currently used in any courses.
214 | 1. Save and preview your course.
215 | 1. Your images should display when previewing the course.
216 |
217 | ### Expected result
218 |
219 | * When the theme allows it, users can upload assets as part of theme presets.
220 |
221 | 11 - Custom LESS overrides the editable theme
222 | ------------------------
223 |
224 | Test to check the order of priority between LESS fields and theme presets values.
225 |
226 | ### Test steps
227 |
228 | 1. Navigate to 'Theme picker' and select an editable theme.
229 | 1. Change some variables such as colours, which are likely to be styled by LESS.
230 | 1. Hover over the tooltip for one of the variables, make a note of its name e.g. `primary-color`.
231 | 1. Save and navigate to custom LESS in project settings.
232 | 1. Use this field to change the value of the variable you made note of e.g. `@primary-color: red;`.
233 | 1. Click Save. Preview the course. Check the variable from step (5) is applied.
234 | 1. Check that preset values from step (2) are also applied except for the one from step (3).
235 |
236 | ### Expected result
237 |
238 | * Any LESS entered in the custom LESS/CSS box in project settings will always override the themes variables, both editable and non-editable.
239 |
240 | 12 - Delete presets
241 | ------------------------
242 |
243 | Test behaviour when deleting presets.
244 |
245 | ### Test steps
246 |
247 | 1. Create 2 courses (course 1 and 2). Apply the same theme and preset to these courses.
248 | 1. Navigate to Theme editor for course 1. Click Manage presets.
249 | 1. Click Delete preset next to the applied preset. Click No.
250 | 1. Click Delete preset again. Click Yes, then click Save.
251 | 1. Navigate back into Theme editor. Attempt to find the preset.
252 | 1. Preview course 2. Check that the deleted theme is still applied.
253 | 1. Navigate back into Theme editor. Attempt to find the preset.
254 | 1. Click Save as preset. Use the same name as the deleted preset.
255 |
256 | ### Expected result
257 |
258 | * Presets can be deleted.
259 | * Courses using presets that were deleted will still have the colour scheme applied.
260 | * Warning appears and explains that this can affect other courses using the preset.
261 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/Login.md:
--------------------------------------------------------------------------------
1 | Login tests
2 | ===========
3 |
4 | **Number of test cases:** 6
5 |
6 | 1 - Logging in
7 | -----------------
8 |
9 | Ensuring the login functionality still behaves as expected.
10 |
11 | ### Test steps
12 |
13 | 1. Ensure that logging with with a combination of incorrect email/password display error message.
14 | 2. Ensure that it is possible to log in with correct email/password.
15 |
16 | ### Expected result
17 |
18 | * Incorrect logins display : 'Invalid e-mail address or password'.
19 | * Correct credentials log in as expected.
20 | * Email field is case insensitive.
21 |
22 | 2 - Reset password via email
23 | -------------------------------
24 |
25 | Test that you can reset your password via email.
26 |
27 | ### Test steps
28 |
29 | 1. From the login page, click "Forgot your password?".
30 | 2. Enter your email address and click "Continue".
31 | 3. Click the link on the email address.
32 | 4. Enter a password less than 8 characters.
33 | 5. Enter non-matching passwords.
34 | 6. Enter two valid passwords.
35 | 7. Attempt to login with old password.
36 | 8. Login with new password.
37 |
38 | ### Expected result
39 |
40 | * User can reset the password via email.
41 | * Email input is case insensitive.
42 |
43 | 3 - Change password
44 | --------------------------------------
45 |
46 | Ensures we can change a password that is strong and is at least 8 characters in length.
47 |
48 | Note: weak passwords are still valid
49 |
50 | ### Test steps
51 |
52 | 1. Once logged in you'll be on the 'Dashboard'.
53 | 2. Click the email at the top right of the screen.
54 | 3. Click Save.
55 | 4. Enter a password less than 8 characters. Click Save.
56 | 5. Enter a weak password eg 1111111111.
57 | 6. Enter a suitable valid password. Click Save.
58 |
59 | ### Expected result
60 |
61 | * User can change their password in the "User profile" page. Upon saving, the user is taken to the page they were on previously.
62 | * User will get an error message if password is invalid, and warnings about password strength and minimum length (currently 8 characters).
63 |
64 | 4 - Change email address
65 | --------------------------------------
66 |
67 | Check that user can change their email address.
68 |
69 | ### Test steps
70 |
71 | 1. Log in. Click the user's email address in the banner area.
72 | 2. Empty the email field. Click Save.
73 | 3. Enter an invalid email. Click Save.
74 | 4. Enter an email that's used by a different user. Click Save.
75 | 5. Enter a valid email that is not in use by a different user. Click Save.
76 | 6. Log back in with new email address.
77 |
78 | ### Expected result
79 |
80 | * User can change their own email address through the user profile area.
81 | * Changes propagate in relevant areas e.g. User management, shared course user list.
82 | * User will be logged out of their current session on successful email change.
83 | * Email changes are saved when the new email is a valid and is not associated with an existing user.
84 | * Error messages occur when the email is invalid, already associated with another user, or the field is empty.
85 |
86 |
87 | 5 - Framework and authoring version
88 | --------------------------------------
89 |
90 | Check that framework and authoring version is visible.
91 |
92 | ### Test steps
93 |
94 | 1. Open the browser dev tools. Click the element or element inspector tab.
95 | 2. Within the "html", check that the 2 properties are visible:
96 | * data-adapt-authoring-version
97 | * data-adapt-framework-version
98 | 3. Check that the values for the properties are correct.
99 |
100 | ### Expected result
101 |
102 | * Users can check the version number of the authoring tool and framework that is being used for that instance of Adapt.
103 | * Contact the system admin for the expected values *data-adapt-authoring-version* and *data-adapt-framework-version*.
104 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/PluginManagement.md:
--------------------------------------------------------------------------------
1 | Plugin Management
2 | ==========================
3 |
4 | **Number of test cases:** 3
5 |
6 | 1 - Course default extensions
7 | -----------------------------
8 |
9 | Test that extensions can be enabled on courses by default.
10 | Requires an Super or Tenant admin user.
11 |
12 | ### Test steps
13 |
14 | 1. Navigate to "Plugin management". Click Extensions.
15 | 2. Under the "Add to new courses by default?" header, ensure all boxes are unticked.
16 | 3. Create a new course. Enter the course.
17 | 4. Click Manage extensions. Check that no extensions are added.
18 | 5. Return back to "Extensions" within "Plugin management".
19 | 6. Under the "Add to new..." header, tick the box for some plugins.
20 | 7. Create a new course. Check that the extensions that were ticked in step (6) have been added.
21 | 8. Return back to "Extensions" within "Plugin management".
22 | 9. Under the "Add to new..." header, untick the box for a few of the selected plugins.
23 | 10. Create a new course. Check that only the ticked extensions have been added.
24 |
25 | ### Expected result
26 |
27 | * Admin level users can choose which extensions are added by default when creating new courses.
28 | * This does not apply to copied courses that are missing default extensions.
29 |
30 | --------------------------------
31 |
32 |
33 | 2 - Adding and deleting a plugin
34 | --------------------------------
35 |
36 | Test that you can add and delete plugins that you have uploaded.
37 | Plugins available for download can be found here: https://www.adaptlearning.org/index.php/plugin-browser/
38 |
39 | ### Test steps
40 |
41 | 1. Find a plugin that can be uploaded to the Authoring Tool (that has has been updated in the recent months) ex: https://github.com/cgkineo/adapt-articleBlockSlider.
42 | 2. Go to Plugin Management and install the plugin.
43 | 3. Remove the plugin.
44 | 4. Attempt to remove a core plugin, like the "Tutor" extension.
45 |
46 | ### Expected result
47 | * Admins can manually install, update, and remove installed plugins.
48 | * Modal appears to confirm removal decision.
49 | * This includes core plugins.
50 |
51 | --------------------------------
52 |
53 |
54 |
55 | 3 - Deleting a plugin in use
56 | --------------------------------
57 |
58 | Test behavior when deleting a plugin that is currently being used.
59 | Plugins available for download can be found here: https://www.adaptlearning.org/index.php/plugin-browser/
60 |
61 | ### Test steps
62 |
63 | 1. Re-install a non-core plugin.
64 | 2. Add it to a course.
65 | 3. Go to plugin management and click Remove.
66 | 4. Click ok.
67 | 5. Remove the plugin from the course.
68 | 6. Remove the plugin.
69 |
70 | ### Expected result
71 | * Plugins in use cannot be deleted.
72 | * Error modal appears when deleting a plugin that is in use in a course.
73 | * Error modal lists the courses that the plugin is being used in.
74 | * Error Modal also shows the course owners.
75 |
--------------------------------------------------------------------------------
/02_authoring_tool/08_test_cases/test suites/UserManagement.md:
--------------------------------------------------------------------------------
1 | User Management
2 | ===============================
3 |
4 | **Number of test cases:** 7
5 |
6 | 1 - User Management Permissions
7 | -----------------------------------
8 |
9 | Ensures only super admins can access user management.
10 |
11 | ### Test steps
12 |
13 | 1. Login as a course creator, ensure user management is not available
14 | 2. Login as a super admin, ensure user management is available
15 |
16 | ### Expected result
17 |
18 | * Only super admins can access user management.
19 |
20 | 2 - Adding New Users
21 | ------------------------
22 |
23 | Ensures admins can add new users.
24 |
25 | ### Test steps
26 |
27 | 1. Login as a super admin and navigate to user management.
28 | 2. Click Add new user. With the fields empty, click Save.
29 | 3. Enter existing email address, alongside a password, and first and last names. Click Save.
30 | 4. Enter an address not in the system.
31 | 5. Attempt to add a new super admin.
32 | 6. Attempt to add a new course creator.
33 |
34 | ### Expected result
35 |
36 | * Admins can create new users.
37 | * New users require a unique email address that is not used by an existing account.
38 | * Name and password fields need to be filled before submission.
39 |
40 | 3 - Invite user
41 | -----------------------------
42 |
43 | Test that Admins can invite users.
44 |
45 | ### Test steps
46 |
47 | 1. Click Invite next to a user whose email you can access. Click No.
48 | 1. Click Invite again. Click Yes.
49 | 1. Open the email. Click Reset password.
50 | 1. Click the url in the email. Check that the user is taken to the correct server.
51 | 1. Login as the user.
52 |
53 | ### Expected result
54 |
55 | * Admins can send out invitation emails to enabled account users.
56 | * Email should contain urls to correct server instance's login page and the forgotten password page. It also includes the inviter's
57 | * Login details are omitted in the email.
58 |
59 | 4 - Reset password emails
60 | -----------------------------
61 |
62 | Test that password reset emails are sent.
63 |
64 | ### Test steps
65 |
66 | 1. Click Reset password next to a user whose email you can access. Click No.
67 | 3. Click Reset password again. Click Yes.
68 | 4. Open the email. Click Reset password.
69 | 5. Enter passwords that do not match. Click Change password.
70 | 6. Enter matching passwords that are under 8 characters. Click Change password.
71 | 7. Enter matching passwords that are over 8 characters. Click Change password.
72 | 8. Log in as that user.
73 | 9. In the email, click the the Reset password link again.
74 |
75 | ### Expected result
76 |
77 | * Expected results: New bullet point "Admins cannot reset other users passwords.".
78 | * Password reset email is sent to the correct user.
79 | * Passwords need to be 8 characters in length.
80 | * "Warning modal appears when Reset password is clicked.".
81 | * Reset password link will unusable after password has been successfully changed.
82 |
83 | 5 - Account lockout - Admin unlocks it
84 | ------------------------------------------
85 |
86 | Test that login attempts are limited.
87 | Test that locked accounts can be unlocked by an Admin.
88 |
89 | ### Test steps
90 |
91 | 1. On the login screen enter the details of an account that you know.
92 | 2. Enter an incorrect password. Repeat until an "Account has been locked" message appears.
93 | 3. Attempt to use the correct login details. Should still be locked out.
94 | 4. Log in as an Admin. Navigate to "User Management".
95 | 5. Check the "Failed logins" value for the user. Check that the padlock icon is there.
96 | 6. Click Unlock user. Attempt to login as the user.
97 |
98 | ### Expected result
99 |
100 | * Users are allowed 3 login attempts. After the 3rd attempt, the account will be locked and the user will be shown a message explaining so. Passwords that were correct will become invalidated until the account is unlocked.
101 | * The account can be unlocked by an Admin in the User Management area. Locked accounts are red. The Unlock user button will now be visible.
102 |
103 | 6 - Account lockout - Password reset unlocks it
104 | ---------------------------------------------------
105 |
106 | Test that locked accounts can be unlocked by the user.
107 |
108 | ### Test steps
109 |
110 | 1. On the login screen, enter wrong login attempts for a user until the lock out message appears.
111 | 2. In an incognito tab, login as an Admin. Navigate to "User Management".
112 | 3. Check that the user's "Failed Login" attempt has a padlock next to it.
113 | 4. Back as the user, use forgotten password.
114 | 5. Complete the process of resetting the user's password.
115 | 6. Back as the Admin, check the user's "Failed Login" attempts.
116 |
117 | ### Expected result
118 |
119 | * The account can be unlocked by the user using the forgotten password function.
120 | * The account is unlocked once the user has confirmed a new password. In the "User Management" area, the "Failed Logins" value should be reset to 0.
121 | * An Admin manually resetting a password or the user following a password reset email sent by the Admin will achieve the same effect.
122 |
123 | 7 - Editing Users
124 | ---------------------
125 |
126 | Ensures admins can edit users
127 |
128 | ### Test steps
129 |
130 | 1. Login as a super admin and navigate to user management.
131 | 2. Edit a user's role.
132 | 3. Attempt to change the role of a course creator user to a super admin.
133 | 4. Attempt to edit current user.
134 |
135 | ### Expected result
136 |
137 | * Admins can edit other user's details.
138 | * Admin users cannot edit or delete their current account in User management.
139 |
140 |
141 | 8 - Filter Users
142 | ---------------------
143 |
144 | Test that user can search for specific user accounts.
145 | Requires 3 users that have different roles and, if possible, are in different tenants.
146 |
147 | ### Test steps
148 |
149 | 1. In "Search by email", start typing in an email address.
150 | 2. Check that the list updates. Clear the field.
151 | 3. Click the "Tenant" field". Select a Tenant.
152 | 4. Check that the list updates. Clear the field.
153 | 5. Enable some of the Role toggle switches.
154 | 6. Check that the list updates. Clear the field.
155 | 7. Use a combination of the previous search methods.
156 |
157 | ### Expected result
158 |
159 | * Emails can be filtered down with one or more of the following criteria:
160 | * Partial or complete email addresses.
161 | * Tenant.
162 | * User role.
163 | * Clearing the search fields refreshes the user list automatically.
164 | * Multiple tenants can be selected.
165 | * Enabling the Role toggles will only show the user's types that match the enabled toggles.
166 |
167 | 9 - Delete user - Orphaned courses - Transfer ownership to me
168 | ---------------------
169 |
170 | Test that ownership of courses can be transferred.
171 |
172 | ### Test steps
173 |
174 | 1. Create a new user as an Admin.
175 | 2. Log in as the user. Create 4 new courses with different share settings:
176 | * Enable "Share with all".
177 | * Partially share with other users.
178 | * Do not share with other users.
179 | * Partially share a course with the Admin from step (1).
180 | 3. As an Admin, navigate to "User management". Find the user.
181 | 4. Click the dropdown under the "Delete user" button. Select "Transfer ownership to me".
182 | 5. Click Delete user. Click Yes.
183 | 6. Navigate to Dashboard. Attempt to find the 4 courses.
184 |
185 | ### Expected result
186 |
187 | * When deleting a user, Admin has to select one of the following options: *Share with all*; *Delete unshared courses*; *Transfer to myself*.
188 | * By default, "Transfer ownership to me" is selected in the dropdown.
189 | * Ownership of all courses are transferred to deleter.
190 | * Admin gets a warning modal before confirming deletion, and a message stating the consequences of their selected action.
191 | * What should happen to the courses:
192 | * Enable "Share with all": Course should not be deleted. Course should be owned by deleter.
193 | * Partially share with other users: Course not deleted; Course appears in "My courses"; Users on the partially shared list can still see the course.
194 | * Do not share with other users: Course not deleted; Course appears in "My courses" of deleter.
195 | * Partially share a course with the deleter: Course not deleted; Ownership is transferred; Admin should not be on the share wtih specific users list. Note: if the admin was the only person on the list to begin with this is now a private course.
196 |
197 | 10 - Delete user - Orphaned courses - Delete all unshared courses
198 | ---------------------
199 |
200 | Test that Admins can delete users.
201 | Test that a deleted user's unshared courses are deleted.
202 |
203 | ### Test steps
204 |
205 | 1. Create a new user as an Admin.
206 | 2. Log in as the user. Create 4 new courses with different share settings:
207 | * Enable "Share with all".
208 | * Partially share with other users.
209 | * Do not share with other users.
210 | * Partially share a course with the Admin from step (1).
211 | 3. As an Admin, navigate to "User management". Find the user.
212 | 4. Click the dropdown under the "Delete user" button. Select "Delete all unshared courses".
213 | 5. Click Delete user. Click Yes.
214 | 6. Navigate to Dashboard. Attempt to find the 4 courses.
215 |
216 | ### Expected result
217 |
218 | * When deleting a user, the Admin can choose to delete that user's unshared courses.
219 | * Courses that are shared with all, and those that are shared with specific users are kept.
220 | * Unshared courses belonging to the deleted user are deleted.
221 | * Ownership of fully or partially shared courses are transferred to the deleter.
222 | * Partially shared courses that belong to the deleted user should retain their shared settings.
223 | * What should happen to the courses:
224 | * Enable "Share with all": Course not deleted. Owned by deleter.
225 | * Partially share with other users: Course not deleted. Owned by deleter. Still partially shared with the same people as before
226 | * Do not share with other users: Course deleted.
227 | * Partially share a course with the deleter: Code executes in following order: transfers ownership to me, deletes courses which are not shared with everyone or partially shared, removes me from the partially shared list. Note: If I was the only person on the partially shared list this will mean that the course will be private to me at the end.
228 |
229 | 11 - Delete user - Orphaned courses - Share all courses
230 | ---------------------
231 |
232 | Test that Admins can delete users.
233 | Test that courses of deleted user are shared.
234 |
235 | ### Test steps
236 |
237 | 1. Create a new user as an Admin.
238 | 2. Log in as the user. Create 4 new courses with different share settings:
239 | * Enable "Share with all".
240 | * Partially share with other users.
241 | * Do not share with other users.
242 | - Partially share a course with the Admin from step (1).
243 | 3. As an Admin, navigate to "User management". Find the user.
244 | 4. Click the dropdown under the "Delete user" button. Select "Share with all".
245 | 5. Click Delete user. Click Yes.
246 | 6. Navigate to Dashboard. Attempt to find the 4 courses.
247 |
248 | ### Expected result
249 |
250 | * Admin users can delete users.
251 | * Course ownership of all courses of the deleted user is transferred to the deleter.
252 | * What should happen to the courses:
253 | * Enable "Share with all": Course not deleted; Still Shared with all.
254 | * Partially share with other users: Course not deleted; shared with all; partially shared list will be the same as before this.
255 | * Do not share with other users: Course not deleted; shared with all; partially shared list will be the same as before this.
256 | * Partially share a course with the deleter: Course not deleted; shared with all; deleter is removed from partially shared list. If deleter was the only person on it in the first place, the course will no longer be shared partially but will still be shared with everyone.
257 |
--------------------------------------------------------------------------------
/03_framework_output/01_concept_and_vision/adapt_framework_concept_and_vision.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/01_concept_and_vision/adapt_framework_concept_and_vision.docx
--------------------------------------------------------------------------------
/03_framework_output/02_requirements/Adapt_Framework_requirements.mm:
--------------------------------------------------------------------------------
1 |
197 |
--------------------------------------------------------------------------------
/03_framework_output/04_user_interface/supporting_docs/adapt_course_progress_drop_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/04_user_interface/supporting_docs/adapt_course_progress_drop_down.png
--------------------------------------------------------------------------------
/03_framework_output/04_user_interface/supporting_docs/adapt_course_resources panel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/04_user_interface/supporting_docs/adapt_course_resources panel.png
--------------------------------------------------------------------------------
/03_framework_output/04_user_interface/supporting_docs/adapt_course_tools_tab_phone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/04_user_interface/supporting_docs/adapt_course_tools_tab_phone.png
--------------------------------------------------------------------------------
/03_framework_output/04_user_interface/supporting_docs/adapt_course_ui_example_wireframe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/04_user_interface/supporting_docs/adapt_course_ui_example_wireframe.png
--------------------------------------------------------------------------------
/03_framework_output/04_user_interface/supporting_docs/smartphone_active_resources.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/04_user_interface/supporting_docs/smartphone_active_resources.png
--------------------------------------------------------------------------------
/03_framework_output/05_architecture/adapt_framework_architecture.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/05_architecture/adapt_framework_architecture.docx
--------------------------------------------------------------------------------
/03_framework_output/05_architecture/supporting_docs/adapt_framework_data_model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/05_architecture/supporting_docs/adapt_framework_data_model.png
--------------------------------------------------------------------------------
/03_framework_output/05_architecture/supporting_docs/adapt_framework_folder_structure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/03_framework_output/05_architecture/supporting_docs/adapt_framework_folder_structure.pdf
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/cmd_basic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/cmd_basic.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/cmd_cwd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/cmd_cwd.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/cmd_npm.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/cmd_npm.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/download_zip_btn.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/download_zip_btn.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-activity-monitor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-activity-monitor.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-brew-services-started-report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-brew-services-started-report.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-brew-services-started.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-brew-services-started.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-brew-services-stopped.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-brew-services-stopped.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-window-mongo-exe-cmd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-window-mongo-exe-cmd.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-window-mongo-exe-started.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-window-mongo-exe-started.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongo-window-services-running.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongo-window-services-running.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongod-enable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongod-enable.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongod-status-enabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongod-status-enabled.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/mongod-status.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/mongod-status.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/terminal_app.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/terminal_app.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/terml_basic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/terml_basic.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/terml_cwd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/terml_cwd.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/terml_npm.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/terml_npm.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_authoring/images/windows_search.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_authoring/images/windows_search.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/Adapt-Accessibility-OS-Doc.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/Adapt-Accessibility-OS-Doc.pdf
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/a-b-c_structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/a-b-c_structure.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/accessibility-notes.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/accessibility-notes.pdf
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-a-b-c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-a-b-c.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-component-span.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-component-span.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-learning-logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-learning-logo.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-learning-logo_640x200.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-learning-logo_640x200.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-learning-logo_850x200.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-learning-logo_850x200.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-logo-mrgn-lft.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-logo-mrgn-lft.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/adapt-logo_208x200.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/adapt-logo_208x200.gif
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/deep-scroll01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/deep-scroll01.png
--------------------------------------------------------------------------------
/04_wiki_assets/adapt_framework/ml-utf8-dialog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/adapt_framework/ml-utf8-dialog.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/accordion01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/accordion01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/adapt-learning-logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/adapt-learning-logo.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/adapt-learning-logo_640x200.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/adapt-learning-logo_640x200.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/adapt-learning-logo_850x200.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/adapt-learning-logo_850x200.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/adapt-logo-mrgn-lft.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/adapt-logo-mrgn-lft.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/adapt-logo_208x200.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/adapt-logo_208x200.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/assessmentResults01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/assessmentResults01.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/assessmentResults02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/assessmentResults02.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/assessmentResultsTotal01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/assessmentResultsTotal01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/blank01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/blank01.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/bookmarking.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/bookmarking.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/boxmenu01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/boxmenu01.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/boxmenu02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/boxmenu02.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/colour_variables_v2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/colour_variables_v2.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/colour_variables_v2_lft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/colour_variables_v2_lft.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/colours_v2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/colours_v2.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/glossary.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/glossary.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/gmcq01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/gmcq01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/gmcq05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/gmcq05.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/graphic01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/graphic01.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/graphic02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/graphic02.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/hotgraphic01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/hotgraphic01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/hotgraphic02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/hotgraphic02.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/hotgraphic05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/hotgraphic05.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/hotgraphic06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/hotgraphic06.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/hotgraphic07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/hotgraphic07.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/language-picker.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/language-picker.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/languagePicker01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/languagePicker01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/languagePicker02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/languagePicker02.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/matching01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/matching01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/matching05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/matching05.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/mcq01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/mcq01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/media01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/media01.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/media02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/media02.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/narrative01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/narrative01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/narrative02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/narrative02.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/plp01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/plp01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/plp05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/plp05.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/resources01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/resources01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/slider01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/slider01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/text01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/text01.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/textInput01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/textInput01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/trickle01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/trickle01.gif
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/vanilla-dir01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/vanilla-dir01.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/vanilla-dir02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/vanilla-dir02.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/vanilla-dir03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/vanilla-dir03.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/vanilla-dir04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/vanilla-dir04.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/vanilla-dir05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/vanilla-dir05.png
--------------------------------------------------------------------------------
/04_wiki_assets/plug-ins/images/vanilla01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/plug-ins/images/vanilla01.jpg
--------------------------------------------------------------------------------
/04_wiki_assets/v2.0_templates/Plug-ins_Boilerplate.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/v2.0_templates/Plug-ins_Boilerplate.pdf
--------------------------------------------------------------------------------
/04_wiki_assets/v2.0_templates/RDME_wiki_wireframes.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/04_wiki_assets/v2.0_templates/RDME_wiki_wireframes.pdf
--------------------------------------------------------------------------------
/05_style_guide/Adapt_style_guide.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/05_style_guide/Adapt_style_guide.pdf
--------------------------------------------------------------------------------
/06_style_guide/Adapt_style_guide.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adaptlearning/documentation/5ceb7b76a57e4b04ea4b90a0f61d5025b19399d0/06_style_guide/Adapt_style_guide.pdf
--------------------------------------------------------------------------------