Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Ability to load components dynamically based on configuration 
  2. Ability to load components dynamically on multiple levels based on configuration

Solution: 

Program

...

configuration based on components and its action. 

Since each tool (comprises of multiple components and tools can share the same components between each other) is going to solve the purpose of each activity in a program, the program can have its configurations based on the input that each component in the tool is expecting. 

Say for example, if the purpose of the program is to just see the coverage of textbooks, then the tool that is used in the program would expect a scope to be defined i.e: Board, Class, Medium, Subject, Framework. This can be the program configuration and nothing else would be required by the admin to see the coverage. 

The expected config of a tool will reside as a manifest inside each high level components.

Image Removed

toolmanifest.json for the above example would be: 

Code Block
languagejs
themeMidnight
{
  "Configuration": {
    "scope": {
      "classes":"",
      "subject":"",
      "board":"",
      "medium":"",
      "framework":""
    }
  }  
}

Let us take an example of a program whose purpose is to create content for different contentTypes such as PracticeSet, ExplanationExperientialCuriositySet, etc for each chapter in a given textbook. 

The workflow of the above mentioned program can be split into two parts

  1. Creation
  2. Review and Publish

Creation: 

In creation, a contributor with creator access visits the program and does the following

  1. Chooses a textbook of a particular class and subject
  2. Chooses a contentType of a particular chapter that is to be created
  3. Chooses a questionCategory if the contentType is either PracticeSets/CuriositySet
  4. Creates a content or assessment based on the chosen content type 
  5. Previews the created assessment or content and submits for preview

Review

  1. Chooses a textbook of a particular class and subject
  2. Chooses a content of a chapter that are up for review
  3. Sees the preview of the content before doing Accept/Reject and publishing
  4. If rejecting, leaves a the reason as a comment to reject. 

The above listed actions can more or less be broken down into the following components. 

  1. Collection Component Component
  2. ChapterList Component
  3. ContentCreation Component
  4. ContentUpload Component
  5. Preview Component

Each component will take its own configuration.

For example: The Collection component would expect CollectionType, Board, Class, Medium, Subject, Framework to list the textbook.

Image Removed

Similarly, ChapterList component would expect CollectionId and List of content types

Image Removed

If we put together all the component and its required configurations, actions and possible enhancements into a module/highlevel component the following would be the overall component hierarchy and configuration.

Image Removed

Code Block
languagejs
themeMidnight
  {
  "pageAssemblyId":"",
  "board":"",
  "class":"",
  "subject":"",
  "medium":"",
  "framework":"",
  "collectionType":{
    "name": "Collection type",
    "type": "string",
    "enum": "Textbook, Course"  
  },
  "contentTypes": {
    "name": "List of contentTypes",
    "type": "List",
    "enum": ["PracticeQuestionSet", "Lessonplan", "ExperientialResource", "FocusSpot", "CuriosityQuestionSet", "ExplanationResource"]
  },
  "questionCategories":{
    "name": "List of AssessmentItem Categorys",
    "type": "List",
    "enum": ["VSA", "SA", "LA", "MCQ", "CuriosityQuestion"],
    "hints": "When PracticeQuestionSet is set for contentTypes AssessmentItem Categorys must be"
  },
  "ckEditorConfig": {}
}

Image Removed

With this basic set of configurations, a program can be created by an admin of the program. 

...

themeMidnight

...

Let us take an example of a program whose purpose is to create content for different contentTypes such as PracticeSet, ExplanationExperientialCuriositySet, etc for each chapter in a given textbook. 

The workflow of the above mentioned program can be split into two parts

  1. Creation
  2. Review and Publish

Creation: 

In creation, a contributor with creator access visits the program and does the following actions

  1. Selects a textbook of a particular class and subject
  2. Selects a contentType of a particular chapter that is to be created
  3. Selects a questionCategory if the contentType is either PracticeSets/CuriositySet
  4. Creates a content or assessment based on the chosen content type 
  5. Previews the created assessment or content and submits for preview

Review

  1. Selects a textbook of a particular class and subject
  2. Selects a content of a chapter that are up for review
  3. Sees the preview of the content before doing Accept/Reject and publishing
  4. If rejecting, leaves a the reason as a comment to reject. 

The above listed actions can more or less be broken down into the following highlevel components. 

  1. Collection Component
  2. ChapterList Component
  3. ContentCreation Component
  4. ContentUpload Component
  5. Preview Component

Each component will take its own configuration and has a set of actions that the user can perform

For example:

  1. The Collection component would expect CollectionType, Board, Class, Medium, Subject, Framework to list the textbook and it would have actions such as showFilters

Image Added

Similarly, ChapterList component would expect CollectionId and List of content types as configuration and selectChapteraddResourcepreview etc as actions.

Image Added

If we put together all the component and its required configurations, actions and possible enhancements into a module/highlevel component the following would be the overall component hierarchy and configuration.


Image Added


With this basic set of configurations and actions a program can be created by an admin of a program. 

Code Block
themeMidnight
{
  "programId": "217bddc0-df59-11e9-8d82-2b7f2cdfa2fd",
  "description": "Test Prep program",
  "name": "Test Prep",
  "slug": "sunbird",
  "startDate": "2019-09-25T12:50:30.000Z",
  "endDate": null,
  "status": null,
  "type": "private",
  "roles": {
    "value": [
      "CONTRIBUTOR",
      "REVIEWER",
      "PUBLISHER"
    ]
  },
  "defaultRoles": [
    "CONTRIBUTOR"
  ],
  "onBoardingForm": {
    "templateName": "onBoardingForm",
    "action": "onboard",
    "fields": [
      {
        "code": "school",
        "dataType": "text",
        "name": "School",
        "label": "School",
        "description": "School",
        "inputType": "select",
        "required": false,
        "displayProperty": "Editable",
        "visible": true,
        "range": [
          {
            "identifier": "my_school",
            "code": "my_school",
            "name": "My School",
            "description": "My School",
            "index": 1,
            "category": "school",
            "status": "Live"
          }
        ],
        "index": 1
      }
    ]
  },
  "header": {
    "tabs": [
      {
        "index": 0,
        "label": "Contribute Questions",
        "onClick": {
          "component": "collectionComponent"
        },
        "actionRoleMap": {
          "show": {
            "roles": [
              "Contributor",
              "Reviewer"
            ]
          },
          "drag": {
            "roles": [
              "Contributor",
              "Reviewer"
            ]
          }
        }
      },
      {
        "index": 1,
        "label": "Issue Certificate",
        "onClick": {
          "component": "issueCertificateComponent"
        },
        "actionRoleMap": {
          "show": {
            "roles": [
              "Reviewer"
            ]
          }
        }
      },
      {
        "index": 2,
        "label": "Dashboard",
        "onClick": {
          "component": "dashboardComponent"
        },
        "actionRoleMap": {
          "show": {
            "roles": [
              "Admin"
            ]
          }
        }
      }
    ]
  },
  "actions": {
    "showFilters": {
      "roles": [
        "Contributor",
        "Reviewer",
        "Admin"
      ]
    },
    "addresource": {
      "roles": [
        "Contributor"
      ]
    },
    "preview": {
      "roles": [
        "Contributor",
        "Reviewer"
      ]
    },
    "move": {
      "roles": [
        "Contributor"
      ]
    },
    "delete": {
      "roles": [
        "Contributor"
      ]
    },
    "selectChapter": {
      "roles": [
        "Contributor",
        "Reviewer"
      ]
    },
    "showTotalContribution": {
      "lable": "Total Contributoion",
      "roles": [
        "Contributor",
        "Reviewer"
      ]
    },
    "showMyContribution": {
      "lable": "My Contribution",
      "roles": [
        "Contributor"
      ]
    },
    "showRejected": {
      "lable": "Rejected",
      "roles": [
        "Contributor"
      ]
    },
    "showUnderReview": {
      "lable": "Under Review",
      "roles": [
        "Contributor"
      ]
    },
    "showtotalUnderReview": {
      "lable": "Total under review",
      "roles": [
        "Reviewer"
      ]
    },
    "showAcceptedByMe": {
      "lable": "Rejected by me",
      "roles": [
        "Reviewer"
      ]
    },
    "showRejectedByMe": {
      "lable": "Accepted by me",
      "roles": [
        "Reviewer"
      ]
    },
    "savePracticeSet": {
      "roles": [
        "Contributor"
      ]
    },
    "previewPracticeSet": {
      "roles": [
        "Contributor",
        "Reviewer"
      ]
    },
    "submitPracticeSet": {
      "roles": [
        "Contributor"
      ]
    },
    "deletePracticeSet": {
      "roles": [
        "Contributor"
      ]
    },
    "acceptPracticeSet": {
      "roles": [
        "Reviewer"
      ]
    },
    "rejectPracticeSet": {
      "roles": [
        "Reviewer"
      ]
    },
    "addQuestionPracticeSet": {
      "roles": [
        "Contributor"
      ]
    },
    "addSolutionPracticeSet": {
      "roles": [
        "Contributor"
      ]
    },
    "changeUploadFile": {
      "roles": [
        "Contributor"
      ]
    },
    "submitUpload": {
      "roles": [
        "Contributor"
      ]
    },
    "acceptUpload": {
      "roles": [
        "Reviewer"
      ]
    },
    "rejectUpload": {
      "roles": [
        "Reviewer"
      ]
    },
    "showPreview": {
      "roles": [
        "Contributor",
        "Reviewer"
      ]
    },
    "showDashboard": {
      "roles": [
        {"Admin"
      ]
   "code": "school", },
    "reportSelection": {
      "dataTypelabel": "textSelect Report",
    },
     "namereportContentTypeSelection": "School",{
          "label": "SchoolSelect Content-Type",
    },
     "descriptionreportDownload": "School",
 {
        "inputTypelabel": "selectDownload",
     },
    "requiredreportRefresh": false,{
          "displayPropertylabel": "EditableRefresh",
    }
  },
  "visibleconfig": true,{
    "filters": {
      "rangeimplicit": [
        {
       {   "code": "framework",
          "identifierdefaultValue": "my_schoolNCF",
              "codelabel": "my_schoolFramework",
          "visibility": false
        },
  "name": "My School",    {
          "descriptioncode": "My Schoolboard",
   
          "indexdefaultValue": 1,
   "AP",
          "categorylabel": "schoolBoard",
          "visibility": false
    "status": "Live"   },
        {
}           ]"code": "medium",
          "indexdefaultValue": 1"English",
           }"label": "Medium",
      ]     },"visibility": false
    "framework": "NCF",   }
 "Board": "AP",    ],
"Medium": "English",     "filterCategoryexplicit": [
        {
          "code": "class",
          "range": [
            "Class 6",
            "Class 7",
            "Class 8"
          ],
          "label": "Class",
          "multiselect": false,
          "defaultValue": [
          "Class 6",
          "Class 7",            "Class 86"
          ],
          "visibility": true
        },
        {
          "code": "subject",
          "range": [
            "English",
            "Maths"
          ],
          "label": "Subject",
          "multiselect": false,
          "defaultValue": [
            "Class 6English",
          "Class 7"],
          "Class 8visibility": true
       ], }
      ]
"visibility": true   },
   } "groupBy": {
  ],     "groupByvalue": {"Subject",
      "valuedefaultValue": "SubjectClass",
    },
    "defaultValuecontentTypes": "Class",{
      "enumvalue": [
        "Class",{
          "Subjectname": "Explanation",
          "contentType": "BoardExplanationResource",
          "MediummimeType": [
      ]     }, "application/pdf"
   "contentTypes": {      ],
"name": "List of contentTypes",       "typethumbnail": "List",
          "valuedescription": "description",
  [         {"marks": 5,
          "nameresourceType": "Explanation",
          "contentTypeAudience": "ExplanationResource",
          "mimeTypeformConfiguration": [
            "application/pdf"
    {
     ],           "thumbnailcode": "LearningOutcome",
              "descriptionrange": "description"[],
          "marks": 5,           "resourceType"label": "Learning Outcome",
              "Audiencemultiselect": true
"",           "formConfiguration": [ },
            {
              "code": "LearningOutcomebloomslevel",
              "range": [],
              "label": "Learning OutcomeLevel",
              "multiselect": true
            },
          ],
 {               "code"filesConfig": "bloomslevel",{
              "rangeaccepted": [],
 "pdf",
            "labelsize": "50"Learning
Level",          }
    "multiselect": true   },
        {
}           ]"name": "Experimental",
          "filesConfigcontentType": {
 "ExperientialResource",
          "acceptedmimeType": [
            "pdfvideo/mp4",
            "sizevideo/webm":,
"50"           } "video/x-youtube"
       },         {],
          "namethumbnail": "Experimental",
          "contentTypedescription": "ExperientialResourcedescription",
          "mimeTypemarks": [5,
          "resourceType":  "video/mp4",
           "Audience": "video/webm",
            "video/x-youtube"
 "formConfiguration": [
        ],       {
   "thumbnail": "",             "descriptioncode": "descriptionLearningOutcome",
              "marksrange": 5[],
              "resourceTypelabel": "Learning Outcome",
              "Audiencemultiselect": true
"",           "formConfiguration": [ },
            {
              "code": "LearningOutcomebloomslevel",
              "range": [],
              "label": "Learning OutcomeLevel",
              "multiselect": true
            },
            {
 ],
            "codefilesConfig": "bloomslevel",
{
             "rangeaccepted": [],
 "mp4, webm, youtube",
             "labelsize": "Learning Level50",
          }
   "multiselect": true    },
        }{
          ]"name": "Practice Sets",
          "filesConfigcontentType": {"PracticeQuestionSet",
            "acceptedmimeType": "mp4,[
webm, youtube",             "size": "50""application/vnd.ekstep.ecml-archive"
          ],
}         },         {"questionCategories": [
           "name": "Practice Setsvsa",
          "contentType":  "PracticeQuestionSetsa",
            "mimeTypela":,
[             "application/vnd.ekstep.ecml-archive"mcq"
          ],
          "questionCategoriesthumbnail": ["",
           "description": "vsadescription",
            "samarks": 5,
          "resourceType":  "la",
          "Audience":  "mcq",
          "formConfiguration": [
   ],         {
 "thumbnail": "",             "descriptioncode": "descriptionLearningOutcome",
              "marksrange": 5[],
              "resourceTypelabel": "Learning Outcome",
              "Audiencemultiselect": true
"",           "formConfiguration": [ },
            {
              "code": "LearningOutcomebloomslevel",
              "range": [],
              "label": "Learning OutcomeLevel",
              "multiselect": true
            },
          ]
        },
   {     {
          "codename": "bloomslevelCuriosity",

             "rangecontentType": [],
  "CuriosityQuestionSet",
           "labelmimeType": "Learning[
Level",            "application/vnd.ekstep.ecml-archive"
  "multiselect":  true      ],
      }    "questionCategories": [
     ]       "curiosity"
 },         {],
          "namethumbnail": "Curiosity",
          "contentTypedescription": "CuriosityQuestionSetdescription",
          "mimeTypemarks": [5,
            "application/vnd.ekstep.ecml-archive"
          ]"resourceType": "",
          "questionCategoriesAudience": ["",
            "curiosityformConfiguration": [
         ],   {
       "thumbnail": "",
          "descriptioncode": "descriptionLearningOutcome",
              "marksrange": 5[],
              "resourceTypelabel": "Learning Outcome",
              "Audiencemultiselect": "",true
           "formConfiguration": [ },
            {
              "code": "LearningOutcomebloomslevel",
              "range": [],
              "label": "Learning OutcomeLevel",
              "multiselect": true: true
            }
     },     ]
       { }
      ],
      "codedefaultValue": "bloomslevel", [
        {
          "rangename": [],
    "Practice Sets",
          "labelcontentType": "Learning LevelPracticeQuestionSet",
  
           "multiselectmimeType": true[
            }"application/vnd.ekstep.ecml-archive"
          ],
        }
  "questionCategories": [
     ],       "defaultValue": [vsa",
            "sa",
{           "name": "Practice Setsla",
          "contentType":  "PracticeQuestionSetmcq",
          "mimeType": [],
          "thumbnail":   "application/vnd.ekstep.ecml-archive"",
          ]"description": "description",
          "questionCategoriesmarks": [2,
          "resourceType":  "vsa",
          "Audience":  "sa",
          "formConfiguration": [
    "la",        {
    "mcq"           ],"code": "LearningOutcome",
              "thumbnailrange": "",[],
              "descriptionlabel": "descriptionLearning Outcome",
              "marksmultiselect": false
2,           "resourceType": "" },
          "Audience": "",  {
              "formConfigurationcode": "bloomslevel",
  [             {"range": [],
              "codelabel": "LearningOutcomeLearning Level",
              "rangemultiselect": [],true
            }
 "label": "Learning Outcome",       ]
       "multiselect": false }
      ]
    },
    "textbookList": [],
    "filesConfig": {
  {    "accepted": "pdf, mp4, webm, youtube",
      "codesize": "bloomslevel",50"
    },
    "practiceSetConfig": {
      "No of options": 4,
      "rangesolutionType": [],
        "Video",
        "label": "Learning Level",Text & image"
       ],
      "multiselectquestionCategory": true [
        "vsa",
        }"sa",
        "ls",
 ]       "mcq",
 }       ],"curiosity"
      "enum":]
[    },
    "PracticeQuestionSetformConfiguration",: [
       "Lessonplan",{
        "ExperientialResource"code": "LearningOutcome",
        "FocusSpotrange": [],
        "label": "CuriosityQuestionSetLearning Outcome",
        "ExplanationResourcemultiselect": false
     ] },
   },   {
 "questionLimit": {       "valuecode": "bloomslevel",
        "defaultValuerange": ""[],
    },    "label": "optionsLimit": {Learning Level",
        "valuemultiselect": "",true
      "defaultValue": ""}
     }]
  }
}