From bdffe51660776de17175b8fb8bad7b2ce90d91b1 Mon Sep 17 00:00:00 2001 From: Kartheek Palla Date: Thu, 31 Mar 2022 16:59:48 +0530 Subject: [PATCH 1/3] Revert "Issue #SB-0000: Merge 4.8.0 into main branch" --- README.md | 357 +- angular.json | 15 +- docs/Architecture.md | 2 - docs/CONFIGURATION.md | 276 -- docs/CONTRIBUTING.md | 96 - docs/Course.json | 648 --- docs/Digital Textbook.json | 1381 ------ .../collection-editor-architecture.drawio.png | Bin 55538 -> 0 bytes package-lock.json | 185 +- package.json | 12 +- .../collection-editor-library/package.json | 4 +- .../lib/collection-editor-library.module.ts | 27 +- .../components/answer/answer.component.html | 10 +- .../lib/components/answer/answer.component.ts | 1 - .../app-loader/app-loader.component.html | 9 - .../app-loader/app-loader.component.spec.ts | 30 - .../app-loader/app-loader.component.ts | 30 - .../asset-browser.component.html | 11 +- .../asset-browser.component.spec.ts | 44 +- .../asset-browser/asset-browser.component.ts | 71 +- .../bulk-upload/bulk-upload.component.html | 210 - .../bulk-upload/bulk-upload.component.scss | 40 - .../bulk-upload/bulk-upload.component.spec.ts | 64 - .../bulk-upload/bulk-upload.component.ts | 468 -- .../ckeditor-tool.component.html | 19 +- .../ckeditor-tool/ckeditor-tool.component.ts | 73 +- .../collection-icon.component.html | 6 +- .../collection-icon.component.spec.ts | 1 + .../contentplayer-page.component.html | 5 +- .../csv-upload/csv-upload.component.scss | 15 +- .../components/editor/editor.component.html | 31 +- .../components/editor/editor.component.scss | 988 ++-- .../editor/editor.component.spec.data.ts | 4172 +++++------------ .../editor/editor.component.spec.ts | 441 +- .../lib/components/editor/editor.component.ts | 410 +- .../fancy-tree/fancy-tree.component.html | 17 +- .../fancy-tree/fancy-tree.component.scss | 46 +- .../fancy-tree.component.spec.data.ts | 1821 ++----- .../fancy-tree/fancy-tree.component.spec.ts | 164 +- .../fancy-tree/fancy-tree.component.ts | 137 +- .../components/header/header.component.html | 84 +- .../header/header.component.spec.data.ts | 1 - .../header/header.component.spec.ts | 9 +- .../lib/components/header/header.component.ts | 32 +- .../library-list/library-list.component.html | 4 +- .../library-list/library-list.component.ts | 2 +- .../library-player.component.html | 4 +- .../library-player.component.ts | 2 +- .../components/library/library.component.ts | 5 +- .../meta-form/meta-form.component.scss | 33 +- .../meta-form.component.spec.data.ts | 256 +- .../meta-form/meta-form.component.spec.ts | 62 +- .../meta-form/meta-form.component.ts | 44 +- .../components/options/options.component.html | 123 +- .../components/options/options.component.scss | 7 - .../options/options.component.spec.data.ts | 30 - .../options/options.component.spec.ts | 83 +- .../components/options/options.component.ts | 77 +- .../publish-checklist.component.html | 6 +- .../publish-checklist.component.spec.ts | 6 +- .../publish-checklist.component.ts | 3 +- .../question-option-sub-menu.component.css | 6 - .../question-option-sub-menu.component.html | 31 - ...question-option-sub-menu.component.spec.ts | 49 - .../question-option-sub-menu.component.ts | 37 - .../question-option-sub-menu.spec.data.ts | 31 - .../question/question.component.html | 244 +- .../question/question.component.scss | 43 +- .../question/question.component.spec.data.ts | 3240 ++----------- .../question/question.component.spec.ts | 1709 +------ .../components/question/question.component.ts | 910 +--- .../quml-player/quml-player.component.ts | 2 +- .../qumlplayer-page.component.html | 7 +- .../relational-metadata.component.css | 0 .../relational-metadata.component.html | 1 - ...relational-metadata.component.spec.data.ts | 80 - .../relational-metadata.component.spec.ts | 105 - .../relational-metadata.component.ts | 80 - .../resource-reorder.component.html | 4 +- .../components/slider/slider.component.html | 17 - .../components/slider/slider.component.scss | 38 - .../slider/slider.component.spec.data.ts | 30 - .../slider/slider.component.spec.ts | 57 - .../lib/components/slider/slider.component.ts | 45 - .../template/template.component.html | 4 +- .../translations/translations.component.html | 25 - .../translations/translations.component.scss | 14 - .../translations.component.spec.data.ts | 23 - .../translations.component.spec.ts | 48 - .../translations/translations.component.ts | 129 - .../date-format/date-format.pipe.spec.ts | 29 - .../date-format/date-format.pipe.ts | 28 - .../src/lib/interfaces/CreationContext.ts | 10 - .../src/lib/interfaces/editor.ts | 27 +- .../src/lib/interfaces/loader.ts | 11 - .../src/lib/pipes/interpolate.pipe.ts | 11 - .../src/lib/pipes/sanitize-html.pipe.spec.ts | 17 - .../src/lib/pipes/sanitize-html.pipe.ts | 11 - .../bulk-job/bulk-job.service.spec.ts | 44 - .../lib/services/bulk-job/bulk-job.service.ts | 65 - .../lib/services/config/category.config.json | 1 - .../services/config/config.service.spec.ts | 2 +- .../lib/services/config/editor.config.json | 37 +- .../src/lib/services/config/label.config.json | 80 +- .../lib/services/config/player.config.json | 3 - .../src/lib/services/config/url.config.json | 32 +- .../services/editor/editor.service.spec.ts | 222 +- .../src/lib/services/editor/editor.service.ts | 251 +- .../question/question.service.spec.ts | 11 - .../lib/services/question/question.service.ts | 34 +- .../lib/services/tree/tree.service.spec.ts | 83 +- .../src/lib/services/tree/tree.service.ts | 29 +- proxy.conf.json | 18 - server.js | 97 +- src/app/app.component.html | 7 +- src/app/app.component.ts | 19 +- src/app/data.ts | 814 +--- src/assets/styles/legacy.scss | 5 - .../styles/vendors/_fine-uploader-new.scss | 6 +- .../bulk-question-upload-sample-format.csv | 62 - 120 files changed, 3277 insertions(+), 19008 deletions(-) delete mode 100644 docs/Architecture.md delete mode 100644 docs/CONFIGURATION.md delete mode 100644 docs/CONTRIBUTING.md delete mode 100644 docs/Course.json delete mode 100644 docs/Digital Textbook.json delete mode 100644 docs/collection-editor-architecture.drawio.png delete mode 100644 projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.html delete mode 100644 projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.ts delete mode 100644 projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.html delete mode 100644 projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.scss delete mode 100644 projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.ts mode change 100644 => 100755 projects/collection-editor-library/src/lib/components/editor/editor.component.scss delete mode 100644 projects/collection-editor-library/src/lib/components/header/header.component.spec.data.ts delete mode 100644 projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.css delete mode 100644 projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.html delete mode 100644 projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.ts delete mode 100644 projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.spec.data.ts delete mode 100644 projects/collection-editor-library/src/lib/components/relational-metadata/relational-metadata.component.css delete mode 100644 projects/collection-editor-library/src/lib/components/relational-metadata/relational-metadata.component.html delete mode 100644 projects/collection-editor-library/src/lib/components/relational-metadata/relational-metadata.component.spec.data.ts delete mode 100644 projects/collection-editor-library/src/lib/components/relational-metadata/relational-metadata.component.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/components/relational-metadata/relational-metadata.component.ts delete mode 100644 projects/collection-editor-library/src/lib/components/slider/slider.component.html delete mode 100644 projects/collection-editor-library/src/lib/components/slider/slider.component.scss delete mode 100644 projects/collection-editor-library/src/lib/components/slider/slider.component.spec.data.ts delete mode 100644 projects/collection-editor-library/src/lib/components/slider/slider.component.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/components/slider/slider.component.ts delete mode 100644 projects/collection-editor-library/src/lib/components/translations/translations.component.html delete mode 100644 projects/collection-editor-library/src/lib/components/translations/translations.component.scss delete mode 100644 projects/collection-editor-library/src/lib/components/translations/translations.component.spec.data.ts delete mode 100644 projects/collection-editor-library/src/lib/components/translations/translations.component.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/components/translations/translations.component.ts delete mode 100644 projects/collection-editor-library/src/lib/directives/date-format/date-format.pipe.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/directives/date-format/date-format.pipe.ts delete mode 100644 projects/collection-editor-library/src/lib/interfaces/CreationContext.ts delete mode 100644 projects/collection-editor-library/src/lib/interfaces/loader.ts delete mode 100644 projects/collection-editor-library/src/lib/pipes/interpolate.pipe.ts delete mode 100644 projects/collection-editor-library/src/lib/pipes/sanitize-html.pipe.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/pipes/sanitize-html.pipe.ts delete mode 100644 projects/collection-editor-library/src/lib/services/bulk-job/bulk-job.service.spec.ts delete mode 100644 projects/collection-editor-library/src/lib/services/bulk-job/bulk-job.service.ts delete mode 100644 utils/hierarchy/bulk-question-upload-sample-format.csv diff --git a/README.md b/README.md index d15372926..279c6237d 100644 --- a/README.md +++ b/README.md @@ -1,315 +1,126 @@ +# Sunbird Collection Editor -# :diamond_shape_with_a_dot_inside: Collection Editor library for Sunbird platform -Contains Collection Editor library components powered by angular. These components are designed to be used in the sunbirdEd portal and web portal to drive reusability, maintainability hence reducing the redundant development effort significantly. +## Run Locally -![image](https://user-images.githubusercontent.com/36467967/153172086-5552cfe4-ad39-4b70-b015-e7553610a6fa.png) +`Use node version 14.15.0` -# :bookmark_tabs: Getting Started -This guide explains how to set up your Angular project to begin using the collection editor library. It includes information on prerequisites, installing editor library, and optionally displaying a sample editor library component in your application to verify your setup. +Fork the project -If you are new to Angular or getting started with a new Angular application, see [Angular's full Getting Started Guide](https://angular.io/start) and [Setting up your environment](https://angular.io/guide/setup-local). - -For existing applications, follow the steps below to begin using Collection editor library. - - - -## :label: Step 1: Install the packages - -The following commands will add `sunbird-collection-editor-v9` library to your package.json file along with its dependencies. - -```red -npm i @project-sunbird/sunbird-collection-editor-v9 --save +```bash + https://github.com/Sunbird-Ed/sunbird-collection-editor.git ``` -Don't forget to install the below peer dependencies of the library in your application. that need to be installed in order to use the library in your angular project. +### Setting up the Collection Editor Library +Go to the root directory -``` -npm i common-form-elements-web-v9 --save -npm i ng2-semantic-ui-v9 --save -npm i ngx-infinite-scroll --save -npm i lodash-es --save -npm i jquery.fancytree --save -npm i angular2-uuid --save -npm i @project-sunbird/client-services --save -npm i export-to-csv --save -npm i moment --save -npm i @project-sunbird/ckeditor-build-classic --save -npm i @project-sunbird/sunbird-pdf-player-v9 --save -npm i @project-sunbird/sunbird-epub-player-v9 --save -npm i @project-sunbird/sunbird-video-player-v9 --save -npm i @project-sunbird/sunbird-quml-player-v9 --save -npm i ngx-bootstrap@6.0.0 --save -npm i ng2-cache-service --save -npm i fine-uploader --save -npm i ngx-chips@2.2.0 --save -npm i epubjs --save -npm i videojs-contrib-quality-levels --save -npm i videojs-http-source-selector --save -npm i jquery --save -npm i express-http-proxy --save -npm i mathjax-full --save -npm i svg2img --save -npm i font-awesome --save -npm i @project-sunbird/sb-styles +```bash + cd sunbird-collection-editor ``` +Install dependencies -Note: *As Collection library is build with angular version 9, we are using **bootstrap@4.6.1** and **ngx-bootstrap@6.0.0** which are the compatible versions. -For more reference Check compatibility document for ng-bootstrap [here](https://valor-software.com/ngx-bootstrap/#/documentation#compatibility)* - -## :label: Step 2: create and copy required assests - -After installing the above dependencies, now we have to copy the required assets from the given folder to the assets folder of your angular application. It contains styles and plugins. - -- Copy the assets from: [assets](https://github.com/Sunbird-Ed/sunbird-collection-editor/tree/release-4.8.0/src/assets) - -image - -- Create a latexService.js in the root folder. Refer: [latexService.js](https://github.com/Sunbird-Ed/sunbird-collection-editor/blob/release-4.8.0/latexService.js) - -- Create a proxy.conf.json in the root folder. Refer: [proxy.conf.json](https://github.com/Sunbird-Ed/sunbird-collection-editor/blob/release-4.8.0/proxy.conf.json) - -- Create server.js in the root folder. Refer: [server.js](https://github.com/Sunbird-Ed/sunbird-collection-editor/blob/release-4.8.0/server.js) - - -## :label: Step 3: Include the styles, scripts and assets in angular.json - -Now open the `angular.json` file and add the following under `architect.build.assets` for default project - -```diff -{ - ... - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - ... - ... - "aot": false, - "assets": [ - ... - ... -+ { -+ "glob": "**/*", -+ "input": "node_modules/@project-sunbird/sunbird-pdf-player-v9/lib/assets/", -+ "output": "/assets/" -+ }, -+ { -+ "glob": "**/*", -+ "input": "node_modules/@project-sunbird/sunbird-video-player-v9/lib/assets/", -+ "output": "/assets/" -+ }, -+ { -+ "glob": "**/*", -+ "input": "node_modules/@project-sunbird/sunbird-collection-editor-v9/lib/assets", -+ "output": "/assets/" -+ }, -+ { -+ "glob": "**/*", -+ "input": "node_modules/@project-sunbird/sunbird-quml-player-v9/lib/assets/", -+ "output": "/assets/" -+ } - ], - "styles": [ - ... -+ "src/assets/quml-styles/quml-carousel.css", -+ "node_modules/@project-sunbird/sb-styles/assets/_styles.scss", -+ "src/assets/lib/semantic/semantic.min.css", -+ "src/assets/styles/styles.scss", -+ "node_modules/font-awesome/css/font-awesome.css", -+ "node_modules/video.js/dist/video-js.min.css", -+ "node_modules/@project-sunbird/sunbird-video-player-v9/lib/assets/videojs.markers.min.css", -+ "node_modules/videojs-http-source-selector/dist/videojs-http-source-selector.css" - ], - "scripts": [ - ... -+ "node_modules/epubjs/dist/epub.js", -+ "src/assets/libs/iziToast/iziToast.min.js", -+ "node_modules/jquery/dist/jquery.min.js", -+ "node_modules/jquery.fancytree/dist/jquery.fancytree-all-deps.min.js", -+ "src/assets/lib/dimmer.min.js", -+ "src/assets/lib/transition.min.js", -+ "src/assets/lib/modal.min.js", -+ "src/assets/lib/semantic-ui-tree-picker.js", -+ "node_modules/@project-sunbird/client-services/index.js", -+ "node_modules/video.js/dist/video.js", -+ "node_modules/@project-sunbird/sunbird-video-player-v9/lib/assets/videojs-markers.js", -+ "node_modules/videojs-contrib-quality-levels/dist/videojs-contrib-quality-levels.min.js", -+ "node_modules/videojs-http-source-selector/dist/videojs-http-source-selector.min.js" - ] - } - } - ... - ... -} +```bash + npm install ``` - -## :label: Step 4: Add question-cursor-implementation.service -Create a **`question-cursor-implementation.service.ts`** in a project and which will implement the `QuestionCursor` and `EditorCursor` abstract class. -`QuestionCursor` and `EditorCursor` is an abstract class, exported from the library, which needs to be implemented. Basically it has some methods which should make an API request over HTTP +Build the library -Let's create the `question-cursor-implementation` service by running the following command: -``` -cd src/app -ng g service question-cursor-implementation +```bash + npm run build-lib ``` -Now open `app.module.ts` file and import like this: - -```diff -+ import { EditorCursor } from 'collection-editor-library'; -+ import { QuestionCursor } from '@project-sunbird/sunbird-quml-player-v9'; -+ import { EditorCursorImplementationService } from './editor-cursor-implementation.service'; - -@NgModule({ - providers: [ -+ { provide: QuestionCursor, useExisting: EditorCursorImplementationService }, -+ { provide: EditorCursor, useExisting: EditorCursorImplementationService } - ], -}) -export class AppModule { } - -``` - - -For more information refer [question-cursor-implementation.service.ts](https://github.com/Sunbird-Ed/sunbird-collection-editor/blob/release-4.7.0/src/app/editor-cursor-implementation.service.ts) and do not forgot to add your question list API URL -**For example:** `https://staging.sunbirded.org/api/question/v1/list` - - - - -## :label: Step 5: Import the modules and components +It will create a `/dist/collection-editor-library` folder at the root directory and also copy all the required assets. -Include `CollectionEditorLibraryModule` in your app module: -```diff - import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -+ import { CollectionEditorLibraryModule, EditorCursor } from '@project-sunbird/sunbird-collection-editor-v9'; - import { RouterModule } from '@angular/router'; - import { QuestionCursor } from '@project-sunbird/sunbird-quml-player-v9'; - import { EditorCursorImplementationService } from './editor-cursor-implementation.service'; +### Starting up Sample application - @NgModule({ - ... +A sample angular application is included as part of this repo - imports: [ -+ CollectionEditorLibraryModule, - BrowserAnimationsModule, - RouterModule.forRoot([]) - ], - providers: [ - { provide: QuestionCursor, useExisting: EditorCursorImplementationService }, - { provide: EditorCursor, useExisting: EditorCursorImplementationService } - ] +In another terminal tab - - ... - }) +From the root directory - Start the server - export class AppModule { } +```bash + npm run start ``` +The demo app will launch at `http://localhost:4200` -Once your library is imported, you can use its main component, `lib-editor` in your Angular application. +### Run Node server to proxy the APIs +From the root directory - go to `server.js` file +```bash +Update the host variable to which env your pointing. example if you are pointing sunbird dev instance update veriable like below +const host = 'dev.sunbirded.org' -Add the tag to the `app.component.html` like so: - -``` - -``` - -## :label: Step 6: Send input to render Collection Editor - -Create a data.ts file which contains the `collectionEditorConfig` Refer: [data.ts](https://github.com/Sunbird-Ed/sunbird-collection-editor/blob/release-4.8.0/src/app/data.ts) - -(Note: `data.ts` contains the mock config used in component to send it as input to collection Editor. We need only [collectionEditorConfig](https://github.com/Sunbird-Ed/sunbird-collection-editor/blob/release-4.8.0/src/app/data.ts#L143).Use the mock config in your component to send input to collection editor as `editorConfig`) - -**app.component.ts** -```diff - ... -+ import { collectionEditorConfig } from './data'; - @Component({ - ... - }) - export class AppComponent { - ... -+ public editorConfig: any = collectionEditorConfig; - } +add `authorization` token as shown below +proxyReqOpts.headers['authorization'] = 'Bearer XXXX' ``` -**app.component.html** +### How to use NPM Sunbird-Questionset-Editor library in your Project -```html - -``` +For help getting started with a new Angular app, check out the Angular CLI. -## :orange_circle: Available components -|Feature| Notes| Selector|Code|Input|Output -|--|--|--|------------------------------------------------------------------------------------------|---|--| -| Collection Editor | Can be used to render Editor | lib-editor| *``*|editorConfig|editorEmitter| - -### :small_red_triangle_down: Input Parameters -1. editorConfig: Object - [`Required`] -```javascript -{ - context: Object // Information about the telemetry and default settings for editor API requests - config: Object // default editor config such as sidebar menu list -} -``` -For more information refer this documentation: [CONFIGURATION.MD](/docs/CONFIGURATION.md) +For existing apps, follow these steps to begin using . -### :small_red_triangle_down: Output Events -1. editorEmitter() - It emits event for each action performed in the editor. ---- +###### Step 1: Install the following packages + npm i @project-sunbird/sunbird-collection-editor-v9 -## :label: Step 7: Set the auth token and collection identifier -Go to the root directory - Open `server.js` file +###### Step 2: Include the Sunbird assets in angular.json + "assets": [ + "src/favicon.ico", + "src/assets", + { + "glob": "**/*", + "input": "./node_modules/@project-sunbird/sunbird-collection-editor-v9/lib/assets/", + "output": "/assets/" + } + ], -Update the host variable to which env your pointing. example if you are pointing sunbird dev instance update variable like below -```javascript -const BASE_URL = 'dev.sunbirded.org' -const API_AUTH_TOKEN = 'XXXX' -const USER_TOKEN= 'YYYY' -``` -Note: You will need actual `API_AUTH_TOKEN` and `USER_TOKEN` - -If you are pointing to sunbird dev -> [dev.sunbirded.org](https://dev.sunbirded.org/), create a textbook in sunbird dev, copy the `textbook_id` from the browser url and set the do_id of textbook in the `data.ts` file - -```javascript -export const collectionEditorConfig = { - context: { - ... - identifier: 'do_id', // identifier of textbook created in sunbird dev - ... - }, - config: { - ... - } -``` -## :label: Step 8: Build the library - -Run `npm run build-lib` to build the library. The build artifacts will be stored in the dist/ directory. - -## :label: Step 9: Run the application - -Before running the application, we have to start the node server to proxy the APIs by running the following command: +###### Step 3: Import the modules and components -``` -nodemon server.js -``` +Add to `NgModule` for the application in which you want to use: -Once that is done, Use the following CLI command to run your application locally + import { CollectionEditorLibraryModule } from 'sunbird-collection-editor-v9'; -``` -npm run start -``` + @NgModule({ + ... + imports: [ + CollectionEditorLibraryModule, + ... + }) -To see your application in the browser, go to [http://localhost:4200](http://localhost:4200). +### How to use question editor +In your template add + -# :bookmark_tabs: Editor Contribution and Configuration Guide +#### Input for library -[Contribution guidelines for this project](docs/CONTRIBUTING.md) +A sample config file is included in the demo app at `src/app/data.ts` -[Configuration guidelines for this project](docs/CONFIGURATION.md) + editorConfig: { + context: { + identifier: 'do_1132125506761932801130', + user: {}, + framework: '', + channel: '', + uid: " + }, + config: { + mode: 'edit', // edit / review / read + maxDepth: 0, + objectType: 'QuestionSet', + primaryCategory: 'Practice Question Set', + isRoot: true, + iconClass: 'fa fa-book', + children: { + Question: [ + 'Multiple Choice Question', + 'Subjective Question' + ] + }, + hierarchy: {} + } + } diff --git a/angular.json b/angular.json index 999de9efb..d1c13458d 100644 --- a/angular.json +++ b/angular.json @@ -56,12 +56,9 @@ "src/assets/styles/styles.scss", "node_modules/font-awesome/css/font-awesome.css", "node_modules/katex/dist/katex.min.css", - "node_modules/video.js/dist/video-js.min.css", - "node_modules/@project-sunbird/sunbird-video-player-v9/lib/assets/videojs.markers.min.css", - "node_modules/videojs-http-source-selector/dist/videojs-http-source-selector.css" + "node_modules/video.js/dist/video-js.min.css" ], "scripts": [ - "node_modules/epubjs/dist/epub.js", "src/assets/libs/iziToast/iziToast.min.js", "node_modules/jquery/dist/jquery.min.js", "node_modules/jquery.fancytree/dist/jquery.fancytree-all-deps.min.js", @@ -71,11 +68,7 @@ "src/assets/lib/modal.min.js", "src/assets/lib/semantic-ui-tree-picker.js", "node_modules/@project-sunbird/telemetry-sdk/index.js", - "node_modules/@project-sunbird/client-services/index.js", - "node_modules/video.js/dist/video.js", - "node_modules/@project-sunbird/sunbird-video-player-v9/lib/assets/videojs-markers.js", - "node_modules/videojs-contrib-quality-levels/dist/videojs-contrib-quality-levels.min.js", - "node_modules/videojs-http-source-selector/dist/videojs-http-source-selector.min.js" + "node_modules/@project-sunbird/client-services/index.js" ] }, "configurations": { @@ -137,9 +130,7 @@ "styles": [ "src/styles.scss" ], - "scripts": [ - "node_modules/epubjs/dist/epub.js" - ], + "scripts": [], "assets": [ "src/favicon.ico", "src/assets" diff --git a/docs/Architecture.md b/docs/Architecture.md deleted file mode 100644 index a7ec8eeb3..000000000 --- a/docs/Architecture.md +++ /dev/null @@ -1,2 +0,0 @@ - -![Architecture](https://github.com/vaibhavbhuva/sunbird-collection-editor-1/blob/1df579f51f29a8a255bc502a2af327ab0ed3fb56/docs/collection-editor-architecture.drawio.png) diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md deleted file mode 100644 index 4dd9e0963..000000000 --- a/docs/CONFIGURATION.md +++ /dev/null @@ -1,276 +0,0 @@ -# Configuration Documentation - -Collection Editor is an angular library built with Angular version 9, and it exports some modules and components. - -**Component:** `editor` - -For example: -``` - -``` - -This is the main editor component that accepts some configuration based on it loads the editor. - -Let's deep dive into the editor input [configuration](/projects/collection-editor-library/src/lib/interfaces/editor.ts): - - -```javascript -export interface IEditorConfig { - context: Context; - config: any; -} -``` - -## Context - `Required` - -This required property from the `collectionEditorConfig` provides the context to the editor mostly in terms of the telemetry and it used these properties when the editor launch. - -```javascript -export interface Context { - programId?: string; - contributionOrgId?: string; - user: User; - identifier?: string; - mode?: string; - authToken?: string; - sid: string; - did: string; - uid: string; - channel: string; - pdata: Pdata; - contextRollup: ContextRollup; - tags: string[]; - cdata?: Cdata[]; - timeDiff?: number; - objectRollup?: ObjectRollup; - host?: string; - endpoint?: string; - userData?: { - firstName: string; - lastName: string; - }; - env: string; - defaultLicense?: any; - board?: any; - medium?: any; - gradeLevel?: any; - subject?: any; - topic?: any; - framework: string; - cloudStorageUrls?: string[]; - additionalCategories?: any[]; - labels?: any; - actor?: any; - channelData?: any; - correctionComments?: any; - sourcingResourceStatus?: string; - sourcingResourceStatusClass?: string; - collectionIdentifier?: string; - unitIdentifier?: string; - collectionObjectType?: string; - collectionPrimaryCategory?: string; - targetFWIds?: string[]; -} -``` - -The context has been classified into two parts as below: -1. Telemetry Context -2. Editor Context - -### 1. Telemetry Context: -It provides the context to the editor mostly in terms of the telemetry. -Let's understand the description of the following properties: - -|Property Name | Description | Required | Default Value -|--|------------------------------------------------------------------------------------------|---|--| -| `env` | It is `string` and Unique environment where the event has occured **For example:** in case of collection editor its `collection_editor` | true | `collection_editor OR questionset_editor` | -| `sid` | It is `string` and session id of the requestor stamped by portal **For example:** `vLpZ1rFl6-sxMVHi4RrmrlHw0HsX9ggC` | true | | -| `did` | It is `string` and uuid of the device, created during app installation or browser **For example:** `1d8e290dd3c2a6a9eeac58568cdef28d` | true | | -| `uid` | It is `string` and Current logged in user id **For example:** `5a587cc1-e018-4859-a0a8-e842650b9d64` | true | | -| `channel` | It is `string` which defines channel identifier to know which channel is currently using. **For example:** `01309282781705830427` | true | | -| `pdata` | It is an `object` which defines the producer information it should have identifier and version and canvas will log in the telemetry. **For example:** `{ id: 'local.sunbird.portal', ver: '4.1.0', pid: 'sunbird-portal' }` | true | | -| `contextRollup` | It is an `object` which defines collection roll up data For example: `{ l1: 'do_1234567890' }` | true | | -| `tags` | It is an `object` and Encrypted dimension tags passed by respective channels. For example: `['01307938306521497658']` | true | | -| `identifier` | It is `string` and Identifier of collection. | false | `''` | -| `authToken` | It is `string` and Auth key to make api calls. | false | `''` | -| `cdata` | It is an `array` which defines the correlation data | false | `[]` | -| `timeDiff` | It is `number` and timeDiff (in sec) is diff of server date and local date | false | `''` | -| `objectRollup` | It is an `object` which defines object rollup data (Only 4 levels are allowed) | false | `{}` | -| `host` | It is `string` which defines the from which domain collection should be load. **For example:** `https://dev.sunbirded.org` | false | `''` | -| `endpoint` | It is `string` and Telemetry API endpoint. **For example:** `/data/v3/telemetry` | false | `''` | -| `userData` | It is `object` and first and last name of logged in user | false | `{}` | - - -### 2. Editor Context: -The editor context is used while launching the editor. -Let's understand the description of the following properties: -|Property Name | Description | Required | Default Value -|--|------------------------------------------------------------------------------------------|---|--| -| `framework` | It is `string` and Organisation framework id. **For example:** `ekstep_ncert_k-12` | true | | -| `user` | It is an `object` which defines user data which contains users id, fullName, lastName, orgIds. | true | **For example:** ``` { id: '5a587cc1-e018-4859-a0a8-e842650b9d64', orgIds: [ '01309282781705830427' ], organisations: {}, fullName: 'Vaibhav Bhuva', firstName: 'Vaibhav', lastName: 'Bhuva', isRootOrgAdmin: true } ``` | -| `programId` | It is `string` and program id in which questionset is created. For example: `f72ad8b0-36df-11ec-a56f-4b503455085f` | false | `''` | -| `contributionOrgId` | It is `string` and Organisation id of the contributor. | false | `''` | -| `identifier` | It is `string` and Identifier of collection. For example: `do_1134357224765685761203`| false | `''` | -| `defaultLicense` | It is `string` and default license of editor. For example: `CC BY 4.0` | false | `''` | -| `cloudStorageUrls` | It is `array` and Array of cloud storage urls | false | `[]` | -| `additionalCategories` | It is `array` and Array of objects of additional categories. For example: `[ { value: 'Classroom Teaching Video', label: 'Classroom Teaching Video' }, { value: 'Concept Map', label: 'Concept Map' }]` | false | `[]` | -| `labels` | It is `object` and Additional labels to be used in editor| false | `{}` | -| `targetFWIds` | It is `array` and Array of target framework ids | false | `[]` | - - -## Config - `Required` -This required property from the `collectionEditorConfig` provides the configuration for the editor to enable/disable some functionalities. - -```javascript -config: { - mode: 'string', //Ex.: 'edit'/'review'/'read'/'sourcingReview'/'orgReview' - editableFields: { - sourcingreview: string[], //Ex.: ["name","description"] - orgreview: string[], - review: string[], - }, - maxDepth: number, //Ex.: 1 - dialcodeMinLength: number, //Ex.: 2 - dialcodeMaxLength: number, //Ex.: 250 - showAddCollaborator: 'boolen', // true | false - enableBulkUpload: 'boolen', - publicStorageAccount: 'url', //Ex.: https://dockstorage.blob.core.windows.net/ - assetConfig: object, - objectType: 'string', //Ex.: Collection - primaryCategory: 'string', //Ex.: Digital Textbook - isRoot: boolean, //Ex.: true - iconClass: 'string', //Ex.: 'fa fa-book' - children: { - Content: [ - 'Explanation Content', - 'Learning Resource', - 'eTextbook', - 'Teacher Resource', - 'Course Assessment' - ] - }, - hierarchy: { - level1: { - name: '', //ex: 'name of the section' - type: '', //ex: 'Unit' - mimeType: 'string', //Ex.: application/vnd.ekstep.content-collection - contentType: 'string', //Ex.: TextBookUnit - primaryCategory: 'string', //ex: 'Textbook Unit' - iconClass: 'string' //ex: 'fa fa-folder-o', - children: {} - }, - level2: { - name: 'string', //Ex.: 'Sub Section' - ... - ... - }, - level3: { - ... - ... - } - }, - contentPolicyUrl: 'string' //Ex.: '/term-of-use.html' - } -``` - -Note: If any of the property is added in object-category-definition. It will take the config from there, otherwise editor will take the mock config passed as input to the editor. - -Description of the properties for the config: - -|Property Name | Description | Required | Default Value -|--|------------------------------------------------------------------------------------------|---|--| -| `isRoot` | It is `boolen` and that defines the node is root node. | true | `true` | -| `objectType` | It is `string` and that defines the object type of collection | true | | -| `iconClass` | It is `string` and that defines the icon of root node | true | `fa fa-book` | -| `children` | It is an `object` and If maxdepth is 0 than children inside the root node defines the content type. **For example:** `children: { Content: [ 'Explanation Content', 'Learning Resource', 'eTextbook' ] }` | true | | -| `contentPolicyUrl` | It is `string` and It defines where should the content policy link will be redirected. | true | `/term-of-use.html` | -| `publicStorageAccount` | It is `url` and URL of the blob storage **For example:** `https://dockstorage.blob.core.windows.net/` | true | | -| `mode` | It is `string` and that defines the mode in editor is to be loaded. **For example:** `edit / review / read / sourcingReview / orgReview` | false | `edit` | -| `editableFields` | It is an `object` and that defines the mode in editor is to be loaded. | false | `{ sourcingreview: [], orgreview: [], review: [], }` | -| `maxDepth` | It is `number` and Defines the depth to which the textbook is to be created. If the depth is 1, hierarchy should have level1 described. | false | **For example:** `1` | -| `dialcodeMinLength` | It is `number` and it specifies the minimum number of characters required in an input field | false | `2` | -| `dialcodeMaxLength` | It is `number` and it specifies the maximum number of characters required in an input field | false | `250` | -| `showAddCollaborator` | It is `boolen` and this is to enable/disable the functionality of add collaborator in editor. If it is true add collobrorator button will be enabled and created can add the collolaborator to collaborate in textbook. | false | `false` | -| `assetConfig` | It is an `object` and `assetConfig` sets the max size limit and type for image and videos to be uploaded in the editor. **For example:** `{ "image": { "size": "1", "sizeType": "MB", "accepted": "png, jpeg" }, "video": { "size": "50", "sizeType": "MB", "accepted": "mp4, webm" } }` | false | `{}` | -| `hierarchy` | It is an `object` and If maxdepth is > 0 then hierarchy should have definiton of the levels. **For example:** `{ level1: { name: 'Textbook Unit', type: 'Unit', mimeType: 'application/vnd.ekstep.content-collection', contentType: 'TextBookUnit', primaryCategory: 'Textbook Unit', iconClass: 'fa fa-folder-o', children: { Content: [ 'Explanation Content', 'Learning Resource' ] } }}` | false | `{}` | - -Following are the configuration for different types of collections. - -**1. Digital Textbook** -```json -{ - "maxDepth": 2, - "objectType": "Collection", - "primaryCategory": "Digital Textbook", - "isRoot": true, - "iconClass": "fa fa-book", - "children": {}, - "hierarchy": { - "level1": { - "name": "Chapter", - "type": "unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "Textbook Unit", - "iconClass": "fa fa-folder-o", - "children": {} - }, - "level2": { - "name": "Sub-Chapter", - "type": "unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "Textbook Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [] - } - } - } -} -``` - -**2. Course** -```json -{ - "maxDepth": 2, - "objectType": "Collection", - "primaryCategory": "Course", - "isRoot": true, - "iconClass": "fa fa-book", - "children": {}, - "hierarchy": { - "level1": { - "name": "Chapter", - "type": "unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": {} - }, - "level2": { - "name": "Sub-Chapter", - "type": "unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [ - "Explanation Content", - "Learning Resource", - "eTextbook", - "Teacher Resource", - "Course Assessment" - ], - "QuestionSet": [ - "Practice Question Set" - ] - } - } - } -} -``` - - -### References: - -https://project-sunbird.atlassian.net/wiki/spaces/SingleSource/pages/2696183813/How+to+configure+forms+in+primaryCategory#Overview -https://project-sunbird.atlassian.net/wiki/spaces/SingleSource/pages/2118451214/Editor+Generalisation+Configurations diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md deleted file mode 100644 index 51ade33b1..000000000 --- a/docs/CONTRIBUTING.md +++ /dev/null @@ -1,96 +0,0 @@ -# Welcome to Editor contributing guide - -In this guide you will get an overview of the contribution workflow of the editor. - -**If you don't have git on your machine,** [install it](https://help.github.com/articles/set-up-git/). - -## Getting started - -#### Fork the project -Go to GitHub and [fork the repository](https://github.com/Sunbird-Ed/sunbird-collection-editor.git). -The forked repository will appear in your GitHub account as - -`https://github.com//sunbird-collection-editor` -#### Clone the repository - -Now clone the forked repository to your machine. Go to your GitHub account, open the forked repository, click on the code button and then click the copy to clipboard icon. - -Open a terminal and run the following git command: - -``` -git clone "url you just copied" -``` -For example: `git clone https://github.com/Sunbird-Ed/sunbird-collection-editor.git` - -#### Go to the root directory and run the following command - -``` -cd sunbird-collection-editor -``` - -#### Install dependencies - -``` -npm install -``` - -#### Build the library - -``` -npm run build-lib -``` - -It will create a `/dist/collection-editor-library` folder at the root directory and also copy all the required assets. - -#### Starting up the sample application - -A sample angular application is included as part of this repo - -Open your terminal, then start the server - - -``` -npm run start -``` - -The demo app will launch at http://localhost:4200 - - -#### Set the auth token and collection identifier - -Go to the root directory - Open `server.js` file - - -Update the host variable to which env your pointing. example if you are pointing sunbird dev instance update variable like below -```javascript -const BASE_URL = 'dev.sunbirded.org' -const API_AUTH_TOKEN = 'XXXX' -const USER_TOKEN= 'YYYY' -``` -Note: You will need actual `API_AUTH_TOKEN` and `USER_TOKEN` - -If you are pointing to sunbird dev ([dev.sunbirded.org](https://dev.sunbirded.org/)), create a collection in sunbird dev and set the do_id of created collection in `data.ts` file - -```javascript -export const collectionEditorConfig = { - context: { - ... - identifier: 'do_id', // identifier of collection created in sunbird dev - ... - }, - config: { - ... - ... - } -} -``` -Run Node server to proxy the APIs (Open one more terminal in root folder and run the server.js ) as: - - - ``` -nodemon server.js -``` - -#### Now make the changes. Stick to the code-style guidelines and remember about tests and 100% code coverage! -#### Commit your changes and Push your changes to your forked repository -#### Go to your forked repository on GitHub. Use the pull request button to create the pull request of your changes. \ No newline at end of file diff --git a/docs/Course.json b/docs/Course.json deleted file mode 100644 index 8271bea01..000000000 --- a/docs/Course.json +++ /dev/null @@ -1,648 +0,0 @@ -{ - "request": { - "objectCategoryDefinition": { - "objectMetadata": { - "config": { - "frameworkMetadata": { - "orgFWType": ["K-12", "TPD"], - "targetFWType": ["K-12"] - }, - "sourcingSettings": { - "collection": { - "maxDepth": 4, - "objectType": "Collection", - "primaryCategory": "Course", - "isRoot": true, - "iconClass": "fa fa-book", - "children": {}, - "hierarchy": { - "level1": { - "name": "Course Unit", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": {"Content": []} - }, - "level2": { - "name": "Course Unit", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": {"Content": []} - }, - "level3": { - "name": "Course Unit", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": {"Content": []} - }, - "level4": { - "name": "Course Unit", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": {"Content": []} - } - } - } - } - }, - "schema": { - "properties": { - "trackable": { - "type": "object", - "properties": { - "enabled": { - "type": "string", - "enum": ["Yes", "No"], - "default": "Yes" - }, - "autoBatch": { - "type": "string", - "enum": ["Yes", "No"], - "default": "Yes" - } - }, - "default": {"enabled": "Yes", "autoBatch": "Yes"}, - "additionalProperties": false - }, - "monitorable": { - "type": "array", - "items": { - "type": "string", - "enum": ["progress-report", "score-report"] - } - }, - "credentials": { - "type": "object", - "properties": { - "enabled": { - "type": "string", - "enum": ["Yes", "No"], - "default": "Yes" - } - }, - "default": {"enabled": "Yes"}, - "additionalProperties": false - }, - "userConsent": { - "type": "string", - "enum": ["Yes", "No"], - "default": "Yes" - }, - "mimeType": { - "type": "string", - "enum": ["application/vnd.ekstep.content-collection"] - } - } - } - }, - "languageCode": [], - "forms": { - "create": { - "templateName": "", - "required": [], - "properties": [ - { - "name": "First Section", - "fields": [ - { - "code": "appIcon", - "dataType": "text", - "description": "appIcon of the content", - "editable": true, - "inputType": "appIcon", - "label": "Icon", - "name": "Icon", - "placeholder": "Icon", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "required": true, - "visible": true - }, - { - "code": "name", - "dataType": "text", - "description": "Name of the content", - "editable": true, - "inputType": "text", - "label": "Title", - "name": "Name", - "placeholder": "Title", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "required": true, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "80", - "message": "Input is Exceeded" - }, - {"type": "required", "message": "Title is required"} - ] - }, - { - "code": "description", - "dataType": "text", - "description": "Description of the content", - "editable": true, - "inputType": "textarea", - "label": "Description", - "name": "Description", - "placeholder": "Description", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "required": false, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "256", - "message": "Input is Exceeded" - } - ] - }, - { - "code": "keywords", - "visible": true, - "editable": true, - "dataType": "list", - "name": "Keywords", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "description": "Keywords for the content", - "inputType": "keywords", - "label": "Keywords", - "placeholder": "Enter Keywords", - "required": false, - "validations": [] - } - ] - }, - { - "name": "Second Section", - "fields": [ - { - "code": "primaryCategory", - "dataType": "text", - "description": "Type", - "editable": false, - "renderingHints": {}, - "inputType": "select", - "label": "Category", - "name": "Type", - "placeholder": "", - "required": true, - "visible": true, - "validations": [] - }, - { - "code": "additionalCategories", - "dataType": "list", - "depends": ["primaryCategory"], - "description": "Additonal Category of the Content", - "editable": true, - "inputType": "nestedselect", - "label": "Additional Category", - "name": "Additional Category", - "placeholder": "Select Additional Category", - "renderingHints": {}, - "required": false, - "visible": true - } - ] - }, - { - "name": "Organisation Framework Terms", - "fields": [ - { - "code": "framework", - "visible": true, - "editable": true, - "dataType": "text", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "description": "", - "label": "Course Type", - "required": true, - "name": "Framework", - "inputType": "framework", - "placeholder": "Select Course Type", - "output": "identifier", - "validations": [ - {"type": "required", "message": "Course Type is required"} - ] - }, - { - "code": "subjectIds", - "visible": true, - "editable": true, - "dataType": "list", - "depends": ["framework"], - "sourceCategory": "subject", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "description": "", - "label": "Subjects covered in the course", - "required": true, - "name": "Subject", - "inputType": "frameworkCategorySelect", - "placeholder": "Select Subject(s)", - "output": "identifier", - "validations": [ - { - "type": "required", - "message": "Subjects Taught is required" - } - ] - }, - { - "code": "topicsIds", - "visible": true, - "editable": true, - "dataType": "list", - "depends": ["framework", "subjectIds"], - "sourceCategory": "topic", - "renderingHints": {}, - "name": "Topic", - "description": "Choose a Topics", - "inputType": "topicselector", - "label": "Topics covered in the course", - "placeholder": "Choose Topics", - "required": false, - "output": "identifier" - } - ] - }, - { - "name": "Target Framework Terms", - "fields": [ - { - "code": "audience", - "dataType": "list", - "description": "Audience", - "editable": true, - "inputType": "nestedselect", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "label": "Audience Type", - "name": "Audience Type", - "placeholder": "Select Audience Type", - "required": false, - "visible": true, - "range": ["Student", "Teacher", "Parent", "Administrator"] - }, - { - "code": "targetBoardIds", - "visible": true, - "depends": [], - "editable": true, - "dataType": "list", - "sourceCategory": "board", - "output": "identifier", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "description": "Board", - "label": "Board/Syllabus of the audience", - "required": true, - "name": "Board/Syllabus", - "inputType": "select", - "placeholder": "Select Board/Syllabus", - "validations": [ - {"type": "required", "message": "Board is required"} - ] - }, - { - "code": "targetMediumIds", - "visible": true, - "depends": ["targetBoardIds"], - "editable": true, - "dataType": "list", - "sourceCategory": "medium", - "output": "identifier", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "description": "", - "label": "Medium(s) of the audience", - "required": true, - "name": "Medium", - "inputType": "nestedselect", - "placeholder": "Select Medium", - "validations": [ - {"type": "required", "message": "Medium is required"} - ] - }, - { - "code": "targetGradeLevelIds", - "visible": true, - "depends": ["targetBoardIds", "targetMediumIds"], - "editable": true, - "dataType": "list", - "sourceCategory": "gradeLevel", - "output": "identifier", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "description": "Class", - "label": "Class(es) of the audience", - "required": true, - "name": "Class", - "inputType": "nestedselect", - "placeholder": "Select Class", - "validations": [ - {"type": "required", "message": "Class is required"} - ] - }, - { - "code": "targetSubjectIds", - "visible": true, - "depends": [ - "targetBoardIds", - "targetMediumIds", - "targetGradeLevelIds" - ], - "editable": true, - "dataType": "list", - "sourceCategory": "subject", - "output": "identifier", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "description": "", - "label": "Subject(s) of the audience", - "required": true, - "name": "Subject", - "inputType": "nestedselect", - "placeholder": "Select Subject", - "validations": [ - {"type": "required", "message": "Subject is required"} - ] - } - ] - }, - { - "name": "Fourth Section", - "fields": [ - { - "code": "author", - "dataType": "text", - "description": "Author of the content", - "editable": true, - "inputType": "text", - "label": "Author", - "name": "Author", - "placeholder": "Author", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "required": false, - "visible": true - }, - { - "code": "attributions", - "dataType": "text", - "description": "Attributions", - "editable": true, - "inputType": "text", - "label": "Attributions", - "name": "Attributions", - "placeholder": "Attributions", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "required": false, - "visible": true - }, - { - "code": "copyright", - "dataType": "text", - "description": "Copyright", - "editable": true, - "inputType": "text", - "label": "Copyright", - "name": "Copyright & year", - "placeholder": "Copyright", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "required": true, - "visible": true, - "validations": [ - {"type": "required", "message": "Copyright is required"} - ] - }, - { - "code": "copyrightYear", - "dataType": "number", - "description": "Year", - "editable": true, - "inputType": "text", - "label": "Copyright Year", - "name": "Copyright Year", - "placeholder": "Copyright Year", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "required": true, - "visible": true, - "validations": [ - { - "type": "required", - "message": "Copyright Year is required" - } - ] - }, - { - "code": "license", - "dataType": "text", - "description": "license", - "editable": true, - "inputType": "select", - "label": "License", - "name": "license", - "placeholder": "Select License", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "required": true, - "visible": true, - "defaultValue": "CC BY 4.0", - "validations": [ - {"type": "required", "message": "License is required"} - ] - } - ] - } - ] - }, - "search": { - "templateName": "", - "required": [], - "properties": [ - { - "code": "primaryCategory", - "dataType": "list", - "description": "Type", - "editable": true, - "default": [], - "renderingHints": {"class": "sb-g-col-lg-1"}, - "inputType": "nestedselect", - "label": "Content Type(s)", - "name": "Type", - "placeholder": "Select ContentType", - "required": false, - "visible": true - }, - { - "code": "board", - "visible": true, - "depends": [], - "editable": true, - "dataType": "list", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "description": "Board", - "label": "Board", - "required": false, - "name": "Board", - "inputType": "select", - "placeholder": "Select Board", - "output": "name" - }, - { - "code": "medium", - "visible": true, - "depends": ["board"], - "editable": true, - "dataType": "list", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "description": "", - "label": "Medium(s)", - "required": false, - "name": "Medium", - "inputType": "nestedselect", - "placeholder": "Select Medium", - "output": "name" - }, - { - "code": "gradeLevel", - "visible": true, - "depends": ["board", "medium"], - "editable": true, - "default": "", - "dataType": "list", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "description": "Class", - "label": "Class(es)", - "required": false, - "name": "Class", - "inputType": "nestedselect", - "placeholder": "Select Class", - "output": "name" - }, - { - "code": "subject", - "visible": true, - "depends": ["board", "medium", "gradeLevel"], - "editable": true, - "default": "", - "dataType": "list", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "description": "", - "label": "Subject(s)", - "required": false, - "name": "Subject", - "inputType": "nestedselect", - "placeholder": "Select Subject", - "output": "name" - }, - { - "code": "topic", - "visible": true, - "editable": true, - "dataType": "list", - "depends": ["board", "medium", "gradeLevel", "subject"], - "default": "", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "name": "Topic", - "description": "Choose a Topics", - "inputType": "topicselector", - "label": "Topic(s)", - "placeholder": "Choose Topics", - "required": false - } - ] - }, - "unitMetadata": { - "templateName": "", - "required": [], - "properties": [ - { - "name": "First Section", - "fields": [ - { - "code": "name", - "dataType": "text", - "description": "Name of the content", - "editable": true, - "inputType": "text", - "label": "Title", - "name": "Title", - "placeholder": "Title", - "renderingHints": {"class": "sb-g-col-lg-1 required"}, - "required": true, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "120", - "message": "Input is Exceeded" - }, - {"type": "required", "message": "Title is required"} - ] - }, - { - "code": "description", - "dataType": "text", - "description": "Description of the content", - "editable": true, - "inputType": "textarea", - "label": "Description", - "name": "Description", - "placeholder": "Description", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "required": false, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "256", - "message": "Input is Exceeded" - } - ] - }, - { - "code": "keywords", - "visible": true, - "editable": true, - "dataType": "list", - "name": "Keywords", - "renderingHints": {"class": "sb-g-col-lg-1"}, - "index": 3, - "description": "Keywords for the content", - "inputType": "keywords", - "label": "Keywords", - "placeholder": "Enter Keywords", - "required": false, - "validations": [] - }, - { - "code": "topic", - "visible": true, - "depends": [], - "editable": true, - "dataType": "list", - "renderingHints": {}, - "name": "Topic", - "description": "Choose a Topics", - "index": 11, - "inputType": "topicselector", - "label": "Topics", - "placeholder": "Choose Topics", - "required": false, - "validations": [] - } - ] - } - ] - } - } - } - } -} \ No newline at end of file diff --git a/docs/Digital Textbook.json b/docs/Digital Textbook.json deleted file mode 100644 index 6f4c461e0..000000000 --- a/docs/Digital Textbook.json +++ /dev/null @@ -1,1381 +0,0 @@ -{ - "request": { - "objectCategoryDefinition": { - "objectMetadata": { - "config": { - "sourcingSettings": { - "collection": { - "maxDepth": 4, - "objectType": "Collection", - "primaryCategory": "Digital Textbook", - "isRoot": true, - "iconClass": "fa fa-book", - "children": {}, - "hierarchy": { - "level1": { - "name": "Textbook Unit", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "TextBookUnit", - "primaryCategory": "Textbook Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [], - "Collection": [] - } - }, - "level2": { - "name": "Section", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "TextBookUnit", - "primaryCategory": "Textbook Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [], - "Collection": [] - } - }, - "level3": { - "name": "Section", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "TextBookUnit", - "primaryCategory": "Textbook Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [], - "Collection": [] - } - }, - "level4": { - "name": "Section", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "TextBookUnit", - "primaryCategory": "Textbook Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [], - "Collection": [] - } - } - } - } - } - }, - "schema": { - "properties": { - "generateDIALCodes": { - "type": "string", - "enum": [ - "Yes", - "No" - ], - "default": "Yes" - }, - "trackable": { - "type": "object", - "properties": { - "enabled": { - "type": "string", - "enum": [ - "Yes", - "No" - ], - "default": "No" - }, - "autoBatch": { - "type": "string", - "enum": [ - "Yes", - "No" - ], - "default": "No" - } - }, - "default": { - "enabled": "No", - "autoBatch": "No" - }, - "additionalProperties": false - }, - "additionalCategories": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "Textbook" - ] - }, - "userConsent": { - "type": "string", - "enum": [ - "Yes", - "No" - ], - "default": "Yes" - } - } - } - }, - "forms": { - "childMetadata": { - "templateName": "", - "required": [], - "properties": [ - { - "code": "name", - "editable": true, - "displayProperty": "Editable", - "dataType": "text", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "Name", - "index": 1, - "label": "Name", - "required": true, - "name": "Name", - "inputType": "text", - "placeholder": "Name", - "validations": [ - { - "type": "maxLength", - "value": "120", - "message": "Exceeded the limit of 120 characters" - }, - { - "type": "required", - "message": "Name is required" - } - ] - }, - { - "code": "description", - "dataType": "text", - "description": "Description of the content", - "editable": true, - "inputType": "textarea", - "label": "Description", - "name": "Description", - "placeholder": "Description", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "1000", - "message": "Exceeded the limit of 1000 characters" - } - ] - }, - { - "code": "primaryCategory", - "dataType": "text", - "description": "Type", - "editable": false, - "renderingHints": {}, - "inputType": "select", - "label": "Category", - "name": "Type", - "placeholder": "", - "required": true, - "visible": true, - "validations": [] - }, - { - "code": "additionalCategories", - "visible": true, - "editable": true, - "displayProperty": "Editable", - "dataType": "list", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "Additional Categories", - "index": 7, - "label": "Additional Categories", - "required": false, - "name": "additionalCategories", - "inputType": "nestedselect", - "placeholder": "Additional Categories" - }, - { - "code": "boardIds", - "visible": true, - "depends": [], - "editable": false, - "dataType": "list", - "sourceCategory": "board", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "", - "label": "Board", - "required": true, - "name": "Board", - "inputType": "nestedselect", - "placeholder": "Select Board" - }, - { - "code": "mediumIds", - "visible": true, - "depends": [], - "editable": false, - "dataType": "list", - "sourceCategory": "medium", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "", - "label": "Medium(s)", - "required": true, - "name": "Medium", - "inputType": "nestedselect", - "placeholder": "Select Medium" - }, - { - "code": "gradeLevelIds", - "visible": true, - "depends": [], - "editable": false, - "dataType": "list", - "sourceCategory": "gradeLevel", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "", - "label": "Class(es)", - "required": true, - "name": "Grade Level", - "inputType": "nestedselect", - "placeholder": "Select Grade" - }, - { - "code": "subjectIds", - "visible": true, - "depends": [], - "editable": false, - "dataType": "list", - "sourceCategory": "subject", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "", - "label": "Subject(s)", - "required": true, - "name": "Subject", - "inputType": "nestedselect", - "placeholder": "Select Subject" - }, - { - "code": "topicsIds", - "visible": true, - "editable": true, - "dataType": "list", - "depends": [ - "boardIds", - "mediumIds", - "gradeLevelIds", - "subjectIds" - ], - "sourceCategory": "topic", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "name": "Topic", - "description": "Choose Topics", - "inputType": "topicselector", - "label": "Topic(s)", - "placeholder": "Select Topic", - "required": false, - "output": "identifier" - }, - { - "code": "copyright", - "dataType": "text", - "description": "Copyright", - "editable": true, - "index": 4, - "inputType": "text", - "label": "Copyright and Year:", - "name": "Copyright", - "placeholder": "Enter Copyright and Year", - "tooltip": "If you are an individual, creating original content, you are the copyright holder. If you are creating this content on behalf of an organisation, the organisation may be the copyright holder. ", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "validations": [ - { - "type": "required", - "message": "Copyright is required" - } - ] - }, - { - "code": "license", - "visible": true, - "editable": true, - "displayProperty": "Editable", - "dataType": "text", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "License", - "index": 6, - "label": "License", - "required": true, - "name": "license", - "inputType": "select", - "placeholder": "license", - "tooltip": "Choose the more appropriate Creative commons license for this Content. ", - "validations": [ - { - "type": "required", - "message": "License is required" - } - ] - }, - { - "code": "author", - "dataType": "text", - "description": "Author", - "editable": true, - "index": 5, - "inputType": "text", - "label": "Author", - "name": "Author", - "placeholder": "Author", - "tooltip": "Provide name of creator of this content.", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": true, - "validations": [ - { - "type": "required", - "message": "Author is required" - } - ] - }, - { - "code": "attributions", - "dataType": "list", - "description": "Attributions", - "editable": true, - "index": 3, - "inputType": "text", - "label": "Attributions", - "name": "attribution", - "placeholder": "", - "tooltip": "If you have relied on another work to create this content, provide the name of that creator and the source of that work.", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false - }, - { - "code": "contentPolicyCheck", - "visible": true, - "editable": true, - "displayProperty": "Editable", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "Content Policy check", - "index": 7, - "labelHtml": "

I agree that by submitting / publishing this Content, I confirm that this Content complies with prescribed guidelines, including the Terms of Use and Content Policy and that I consent to publish it under the Creative Commons Framework in accordance with the Content Policy. I have made sure that I do not violate others' copyright or privacy rights.

", - "required": true, - "name": "contentPolicyCheck", - "inputType": "checkbox", - "placeholder": "Content Policy Check", - "validations": [ - { - "type": "required", - "message": "Content Policy Check is required" - } - ] - } - ] - }, - "create": { - "templateName": "", - "required": [], - "properties": [ - { - "name": "First Section", - "fields": [ - { - "code": "appIcon", - "dataType": "text", - "description": "appIcon of the content", - "editable": true, - "inputType": "appIcon", - "label": "Icon", - "name": "Icon", - "placeholder": "Icon", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true - }, - { - "code": "name", - "dataType": "text", - "description": "Name of the content", - "editable": true, - "inputType": "text", - "label": "Name", - "name": "Name", - "placeholder": "Name", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "120", - "message": "Exceeded the limit of 120 characters" - }, - { - "type": "required", - "message": "Name is required" - } - ] - }, - { - "code": "description", - "dataType": "text", - "description": "Description of the content", - "editable": true, - "inputType": "textarea", - "label": "Description", - "name": "Description", - "placeholder": "Description", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "1000", - "message": "Exceeded the limit of 1000 characters" - } - ] - }, - { - "code": "keywords", - "visible": true, - "editable": true, - "dataType": "list", - "name": "Keywords", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "Keywords for the content", - "inputType": "keywords", - "label": "Keywords", - "placeholder": "Input the keyword and press enter", - "required": false, - "validations": [] - } - ] - }, - { - "name": "Second Section", - "fields": [ - { - "code": "dialcodeRequired", - "dataType": "text", - "description": "QR CODE REQUIRED", - "editable": true, - "default": "No", - "index": 5, - "inputType": "radio", - "label": "QR code required?", - "name": "dialcodeRequired", - "placeholder": "QR code required?", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "range": [ - "Yes", - "No" - ], - "required": false, - "visible": true - }, - { - "code": "dialcodes", - "depends": [ - "dialcodeRequired" - ], - "dataType": "list", - "description": "Digital Infrastructure for Augmented Learning", - "editable": true, - "inputType": "dialcode", - "label": "QR code", - "name": "dialcode", - "placeholder": "Enter code here", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "minLength", - "value": "2" - }, - { - "type": "maxLength", - "value": "20" - } - ] - } - ] - }, - { - "name": "Third Section", - "fields": [ - { - "code": "primaryCategory", - "dataType": "text", - "description": "Type", - "editable": false, - "renderingHints": {}, - "inputType": "select", - "label": "Category", - "name": "Type", - "placeholder": "", - "required": true, - "visible": true, - "validations": [] - }, - { - "code": "additionalCategories", - "dataType": "list", - "description": "Additional Category of the Content", - "editable": true, - "inputType": "nestedselect", - "label": "Additional Category", - "name": "Additional Category", - "placeholder": "Select Additional Category", - "renderingHints": {}, - "required": false, - "visible": true - } - ] - }, - { - "name": "Framework Terms", - "fields": [ - { - "code": "audience", - "dataType": "list", - "description": "Audience", - "editable": true, - "inputType": "nestedselect", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "label": "Audience Type", - "name": "Audience Type", - "placeholder": "Select Audience Type", - "required": false, - "visible": true, - "range": [ - "Student", - "Teacher", - "Parent", - "Administrator", - "Other" - ] - }, - { - "code": "boardIds", - "visible": true, - "depends": [], - "editable": true, - "dataType": "list", - "sourceCategory": "board", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "Board", - "label": "Board", - "required": true, - "name": "Board/Syllabus", - "inputType": "select", - "placeholder": "Select Board/Syllabus", - "validations": [ - { - "type": "required", - "message": "Board is required" - } - ] - }, - { - "code": "mediumIds", - "visible": true, - "depends": [ - "boardIds" - ], - "editable": true, - "dataType": "list", - "sourceCategory": "medium", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "", - "label": "Medium(s)", - "required": true, - "name": "Medium", - "inputType": "nestedselect", - "placeholder": "Select Medium", - "validations": [ - { - "type": "required", - "message": "Medium is required" - } - ] - }, - { - "code": "gradeLevelIds", - "visible": true, - "depends": [ - "boardIds", - "mediumIds" - ], - "editable": true, - "dataType": "list", - "sourceCategory": "gradeLevel", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "Class", - "label": "Class(es)", - "required": true, - "name": "Class", - "inputType": "nestedselect", - "placeholder": "Select Class", - "validations": [ - { - "type": "required", - "message": "Class is required" - } - ] - }, - { - "code": "subjectIds", - "visible": true, - "depends": [ - "boardIds", - "mediumIds", - "gradeLevelIds" - ], - "editable": true, - "dataType": "list", - "sourceCategory": "subject", - "output": "identifier", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "description": "", - "label": "Subject(s)", - "required": true, - "name": "Subject", - "inputType": "nestedselect", - "placeholder": "Select Subject", - "validations": [ - { - "type": "required", - "message": "Subject is required" - } - ] - } - ] - }, - { - "name": "Fourth Section", - "fields": [ - { - "code": "author", - "dataType": "text", - "description": "Author of the content", - "editable": true, - "inputType": "text", - "label": "Author", - "name": "Author", - "placeholder": "Author", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false, - "visible": true - }, - { - "code": "attributions", - "dataType": "list", - "description": "Attributions", - "editable": true, - "inputType": "text", - "label": "Attributions", - "name": "Attributions", - "placeholder": "Attributions", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false, - "visible": true - }, - { - "code": "copyright", - "dataType": "text", - "description": "Copyright", - "editable": true, - "inputType": "text", - "label": "Copyright", - "name": "Copyright", - "placeholder": "Copyright", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "required", - "message": "Copyright is required" - } - ] - }, - { - "code": "copyrightYear", - "dataType": "number", - "description": "Year", - "editable": true, - "inputType": "text", - "label": "Copyright Year", - "name": "Copyright Year", - "placeholder": "Copyright Year", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "required", - "message": "Copyright Year is required" - }, - { - "type": "minLength", - "message": "Year should be a 4 digit number", - "value": 4 - }, - { - "type": "maxLength", - "message": "Year should be a 4 digit number", - "value": 4 - } - ] - }, - { - "code": "license", - "dataType": "text", - "description": "license", - "editable": true, - "inputType": "select", - "label": "License", - "name": "license", - "placeholder": "Select License", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true, - "defaultValue": "CC BY 4.0", - "validations": [ - { - "type": "required", - "message": "License is required" - } - ] - } - ] - } - ] - }, - "delete": {}, - "publish": {}, - "publishchecklist": { - "templateName": "", - "required": [], - "properties": [ - { - "name": "Appropriateness", - "renderingHints": { - "class": "d-grid-inline-3 display-sectionName" - }, - "fields": [ - { - "code": "appropriatenessOne", - "name": "No Hate speech, Abuse, Violence, Profanity", - "label": "No Hate speech, Abuse, Violence, Profanity", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "appropriatenessTwo", - "name": "No Sexual content, Nudity or Vulgarity", - "label": "No Sexual content, Nudity or Vulgarity", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "appropriatenessThree", - "name": "No Discrimination or Defamation", - "label": "No Discrimination or Defamation", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "appropriatenessFour", - "name": "Is suitable for children", - "label": "Is suitable for children", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - } - ] - }, - { - "name": "Content details", - "renderingHints": { - "class": "d-grid-inline-3 display-sectionName" - }, - "fields": [ - { - "code": "contentdetailsOne", - "name": "Appropriate Title, Description", - "label": "Appropriate Title, Description", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "contentdetailsTwo", - "name": "Correct Board, Grade, Subject, Medium", - "label": "Correct Board, Grade, Subject, Medium", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "contentdetailsThree", - "name": "Appropriate tags such as Resource Type, Concepts", - "label": "Appropriate tags such as Resource Type, Concepts", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "contentdetailsFour", - "name": "Relevant Keywords", - "label": "Relevant Keywords", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - } - ] - }, - { - "name": "Usability", - "renderingHints": { - "class": "d-grid-inline-3 display-sectionName" - }, - "fields": [ - { - "code": "usabilityOne", - "name": "Content plays correctly", - "label": "Content plays correctly", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "usabilityTwo", - "name": "Can see the content clearly on Desktop and App", - "label": "Can see the content clearly on Desktop and App", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "usabilityThree", - "name": "Audio (if any) is clear and easy to understand", - "label": "Audio (if any) is clear and easy to understand", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "usabilityFour", - "name": "No Spelling mistakes in the text", - "label": "No Spelling mistakes in the text", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "usabilityFive", - "name": "Language is simple to understand", - "label": "Language is simple to understand", - "dataType": "boolean", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "validations": [ - { - "type": "required", - "message": "" - } - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - } - } - ] - } - ] - }, - "review": {}, - "search": { - "templateName": "", - "required": [], - "properties": [ - { - "code": "primaryCategory", - "dataType": "list", - "description": "Type", - "editable": true, - "default": [], - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "inputType": "nestedselect", - "label": "Content Type(s)", - "name": "Type", - "placeholder": "Select ContentType", - "required": false, - "visible": true - }, - { - "code": "board", - "visible": true, - "depends": [], - "editable": true, - "dataType": "list", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "Board", - "label": "Board", - "required": false, - "name": "Board", - "inputType": "select", - "placeholder": "Select Board", - "output": "name" - }, - { - "code": "medium", - "visible": true, - "depends": [ - "board" - ], - "editable": true, - "dataType": "list", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "", - "label": "Medium(s)", - "required": false, - "name": "Medium", - "inputType": "nestedselect", - "placeholder": "Select Medium", - "output": "name" - }, - { - "code": "gradeLevel", - "visible": true, - "depends": [ - "board", - "medium" - ], - "editable": true, - "default": "", - "dataType": "list", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "Class", - "label": "Class(es)", - "required": false, - "name": "Class", - "inputType": "nestedselect", - "placeholder": "Select Class", - "output": "name" - }, - { - "code": "subject", - "visible": true, - "depends": [ - "board", - "medium", - "gradeLevel" - ], - "editable": true, - "default": "", - "dataType": "list", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "description": "", - "label": "Subject(s)", - "required": false, - "name": "Subject", - "inputType": "nestedselect", - "placeholder": "Select Subject", - "output": "name" - }, - { - "code": "topic", - "visible": true, - "editable": true, - "dataType": "list", - "depends": [ - "board", - "medium", - "gradeLevel", - "subject" - ], - "default": "", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "name": "Topic", - "description": "Choose a Topics", - "inputType": "topicselector", - "label": "Topic(s)", - "placeholder": "Choose Topics", - "required": false - } - ] - }, - "unitMetadata": { - "templateName": "", - "required": [], - "properties": [ - { - "name": "First Section", - "fields": [ - { - "code": "name", - "dataType": "text", - "description": "Name of the content", - "editable": true, - "inputType": "text", - "label": "Name", - "name": "Title", - "placeholder": "Name", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "120", - "message": "Exceeded the limit of 120 characters" - }, - { - "type": "required", - "message": "Name is required" - } - ] - }, - { - "code": "description", - "dataType": "text", - "description": "Description of the content", - "editable": true, - "inputType": "textarea", - "label": "Description", - "name": "Description", - "placeholder": "Description", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false, - "visible": true, - "validations": [ - { - "type": "maxLength", - "value": "1000", - "message": "Exceeded the limit of 120 characters" - } - ] - }, - { - "code": "keywords", - "visible": true, - "editable": true, - "dataType": "list", - "name": "Keywords", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "index": 3, - "description": "Keywords for the content", - "inputType": "keywords", - "label": "Keywords", - "placeholder": "Input the keyword and press enter", - "required": false, - "validations": [] - }, - { - "code": "topic", - "visible": true, - "editable": true, - "dataType": "list", - "depends": [ - "board", - "medium", - "gradeLevel", - "subject" - ], - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "name": "Topic", - "description": "Choose a Topics", - "inputType": "topicselector", - "label": "Topics covered in the course", - "placeholder": "Choose Topics", - "required": false - }, - { - "code": "dialcodeRequired", - "dataType": "text", - "description": "QR CODE REQUIRED", - "editable": true, - "default": "No", - "index": 5, - "inputType": "radio", - "label": "QR code required?", - "name": "dialcodeRequired", - "placeholder": "QR code required?", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "range": [ - "Yes", - "No" - ], - "required": false, - "visible": true - }, - { - "code": "dialcodes", - "depends": [ - "dialcodeRequired" - ], - "dataType": "list", - "description": "Digital Infrastructure for Augmented Learning", - "editable": true, - "inputType": "dialcode", - "label": "QR code", - "name": "dialcode", - "placeholder": "Enter code here", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "minLength", - "value": "2" - }, - { - "type": "maxLength", - "value": "20" - } - ] - } - ] - } - ] - }, - "update": {} - } - } - } - } \ No newline at end of file diff --git a/docs/collection-editor-architecture.drawio.png b/docs/collection-editor-architecture.drawio.png deleted file mode 100644 index 662dac89ccc5291f7c06c76249e26403da8af222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55538 zcmb5V2iV)x`9Az6q!3n0D4UcKG7AJ*vLzc@h^8$|wl!?o5>W8avMpQ7wro}?D-dQ# zfl^W+1PTShrfdR~6)3cnGRi2l>{VtNWqe0T|KE@Ae|_Wnu1l}S@zK#4&$*xbxzF>S zDipKZZnfK1Q&UshvN=kcnwq|0YHC`0=H{Sev&PW~c$*eTSz>D46La34no6A*(zVcu z47;mO%}2;hpXS4m)epk?2sIyu>#n<`W!Fu=?gUGEdI*ZZ?@qsE8@ArsR0oD&cz+1q zA5NAbbUuP7Qs4!`mLOO{+f=`9>b?Iqm|6mX1{M|SO}iKN18Y7)fbVQC)Vtsv6oc22 z3|?yBF998qNFISM1|MObP+bqo8;Zmn#?e`7jASckPZ2-m-eL(~oZ< zEx+%85+;*g0xd~msq~Tr6n9^)8+G6QUNdo_9@foG<7wN;LZU-c6Q&?p^+a`mXws%} z40S)S`@K!o66g|i3Ai)9IUKwCrqY%^w430eaj6T&9c(I2#U%(0Ci%a!34XT!JAYOK zqa2}{#flx;a?9;Ty~=HBpjQX|-?$C}Xlnn&rbaNuZ8S6eBqJmf6J8Xs63$cYaki5a zCqbr{@3yrtm#l;h5+0|T<`_&YGeJ?O(YB#{pET)lui2sJ!(ifxHu&r5>1IzZr9f+p z2c;`+k#3PPHGuhqnW*KmxmKVLEDW^5k0d`|!*gAWqZwS`6oM&0gisl|Xf`0t+i*-imbYzq-)hUMHx1H6ePY(W9Tvq>DUwCG{PbF9V5M2Yg-HHntBBwb-A zbGst=i3Qs!ApYu8$?ZYNT@)Z;xA>Cr_{M_>#?tOUbK zAWKHdsu@@+SHm2ugj+5VR&@(cNJZZh$7aXq)3P|yYDR%$vOErP+`y<4c_!aT6x;0y zF@h6WLkj~GHHCgB8MkhtY!J^?YTR*Hf@C|CBveP9JHp@s&6dgxZL8gI#I}+WjLQz? zp$QXZI3$Jk9k{QyCVIOY*?6F&2e#d2l0#7-G^`et#-P!v?jTjiGQ6H8g@Pyqxq-@O zvlUm)`bj+r<|Eb2j@mt#AWLbq>tqX{jA`Q9$N=w2lt(xSG9s=-b+C5VLL`T!71S^K zqc+XyV<-pemO)LLOxq%r=yx-fm}s|-5%$g1(F z%Gd(E8Ky`NO8Jgn0K1wQvvC`GIxx2PMH0?Q$o>aPmeA z!itFO7n}~{atxavT7^`~Lu-|iM+TxxxIrd|<@<=n2VeKN(r-WY}F;NW{W&U)Z2hfMs)k8xZC->6`itY@0g1RE8T zO`SI^-+~3STo{Q7&QVLLu9NH=`5q;gX+1eMEoo5e!5W3h7+EmKkb-g$=L>o-XD|j6 z)oK9>5tz>v1C5NAhpvo@X-^Do2A4T5PxWvZ_XbhEB8$}lJ?Mchc*TNYW65MOQ7#2B zc-2ygNku7-paDO&MtUtlMasbGqgJ=pC&QAhcKnu8>I+u81dHW~=0aYt(`=;sbw4qb zp-Hze@MS2G&>ACgoFc=FU9`$M&@j;%NNG1EWn5nrk-TJU0Rm0(z?KQxX?hrI*2Nl; z&j%FA3v>+Wq$*3`Ey|jsQq!p>;0~(Dgq;~sjo4UAn#^a@ZY4$Fl2dS;a6;QSa5lui z%(CSXO_fA3-87SxeiyQHBZC?Xc}cfsGxAm4K}RXz#+eM7EH}n%r&y>OzUlQ#38yyOp-?i%^^C6)Sy+FEEkmNJbq-i~^|F9VEk1I)?>Ba{$Z{lq3Qz zTj&qEeT#9@2|@1&ppZ=T>!qRQ0!Be}3B=Bqi>l!b%R(>Evz2CX5Fu<&9OM!#sF17m zlv1tlQV^`6@n5=(w-CqkoK|(B#`CAD2o6_l#iaU}+BTC}qKZWrHKrW0B_vv5{7Aos z0Yo66B9f0iZ`RBBjcNnUAXHFOMtm=94pptEg7sx`LrRx*MlbV&jZQF8C5U_|MPo_N zyS)Zzr9>k&tY~HItRA`LQjbfHvcMsiBqJTTm3+2TnUu1?*gEHwfIwrAB08h%fi1xvx zGpLf!bOoYsnshH|47w&kfgAr9Px^l# zO~Yowov>|!&FgAAL6%Co2wV`b9O!=|O`s@dUYHWKT7Wds0+i_S0yZMBG^J+pGUK6j zZBPw6Jq)so0WM?NzRwo=jST2nUI|Dz!4*0%F>I6gn(l*Bhlt9+pyh4FD{t#h7UZ zut~y7r3%@$n*&f4!J3_ zMp&BevqI8Fz}YK%9IfGO!=BAx|3-K%MEMzdH#7`Dk{SgfXKV z3WEenvZcm2*(-GGV+KbVCYA0E=&>XfE4WRLVZ<+0z}}{Fa3M;dA%Zwrk7gPzsh=EY z*m2&Y@U%!nb=7r5Bkf1EUId<25&M#j8M)XofosriQT03)@5@Hd2QG#Q%LroovR13% z$re7u>5j|i!4HI?5>!!50#bly=qBxt9SX)(yu=RENu12(_41@vY{0Do&-c&-7r5D; zl4F>3IlwzboaK>Zu33s9g0u@&x*1PuwOJvsLRCcB7Q{GudqQR$m!Nxm#1w@n5ibA{ zA^p_T5j=9zQ3K00uxgL(A>m-+ zY4+GtWvT_7O(x)Bq@Fh55DKxJIRS7P_rdA-5o)y=Rf|$8OQk!NdZU-k)I~`PyQvK0 zv`nv~AZXi+2hXE~D0cfGc)^TfE1x7pJ&cTA4gBO#BfRX21X+~{B_;Fqcv7l*bLa&a+UF~>TWytnU5!Ya zQUa$%YNUm@EhC%iq$7zC@`#j?+PZ{w>+HBp;U%S8XBus_PdVPWm>rF^DhSB(L>900 zVKGXpkTf(I3%5g>%%ir&<;O!L$ZJp_*PwC1PZp~6Nh{HnV+Wnhkg!tb$g>Yk<@@SxuILe9ZUz#l9ERW!Kls zRkXxlrCPfY2Rm1HwA@{CAz7?CRy4H^fb)kKy(wcF3fQcaMMjilU`N_KvPSnWKT@Cab5 z#DK$?q^sAPgRzk@OgC5TCu|aJww-1Rm)jgRu5IMtovu^@)hE?nrOwbDLo>*tF{$f= z`ou|Q+XfAscN6h?ZaSC%HpZ~ACrAR=0CAr<7}N;~)}(Z@3s`&}f>bS)CR?IZr)x=A zZxx1I3K^q5+35ANeRQlvLP61donT7VJp`NbHi*a5XzQCGHIqeQeZUeyKa>n(Ga00fOk>LAdUgObOsH!0>qkz z(@|(8Wk^b8KzlVm3&(U_@0TQUTuhmIJ84H_nJ>X!m*-$f#M*g09H=2P3E^SC*z6~= zH0q}F11N=}V}uyMC8!f-GANO1V492#HNHDUYN6YMJI;jU3WG+X5%v=mwV#!ESd=YU z$w!$s-WXTwE^u{_Jo5W~CNwAA2=t`H_N(oBKPn{@n6}1HwTM-JhhmO5e|QQnFvGyKPsf zDt1ursy@|0OH{5bdMzV4Y)j*Ov#JZ4Z0MYmu^TxhNimZ#(;fA9xVkLDRaH z*Ngsu6^l)03>bDc@|r#vdqzUcAO`ndTQi4PS=K>pRO$iDCyGi&&<6cd571>Ip9C&~ z(AX5B6IO`iN=fjw(ee7CQmfluF3ZwxEu&j>m!HI@Y|1$rt_w9A6HBEb4r5kg*oyKw z)dNyb7}w}aPUH`b@u*vEVGQF$jMnOfsN9E#V*@N(70HfK#HWFDL|9~k%cY>OMoCe# zGlyM`?#ggU3nUCv^@+eG1cXsa z5RSyA10KlPYNBaPu)f!?xG7=CPe@8hQI>`3iLlHk;3hKcbc0@>9X7{9mrUqNk7+a} zK(7Qg1(-m+yh2oJS-V^9^2Hq7D2;%t%-i)?jLWt|q1b{eRiOz{aIOo99-XpO*-i^i4OmOR zlu7qVT1yY$q9Ln+oHN*gpUx)pDq89lp+dwt5=TLKT@QM-N}W#0brcN%!EKr3P@Krs zuv%)*U$6*`^|O)s`0L@ZeKhL>PQieP}cYy82=MKkbM`xAJjL%%SQbb5EgL#pStb-`^z*hdWhW6ySZ+&n$88F zUvaRJQldsP6>L;!drrp)%t9Q13Y;3z9i#w5NCgZ)uNo~!YFEdTk!o^u)5v7x0H~b> zo76k?DyA5;MUdS9OHI14O^h?OSglR>Wmh$1mTc#GBpF4?W@bcwYt3*JJ+TcsNtE z`oQ>Q&2NDM(j*gIG{Otv0PJ8U*(0L_aOg~s=@{d&=(`iA-$f;s(U^p1cAFWU?&MV? z?`3Lso`vXiSu+R$>}$Z!7|BGrZm*E5B@zx8PAQq|JFRh08rFsk8<;w$Vl}PLvf#ml z$YdRqt5wJCdflYjW+o=bJlm~mxGDi~OPC=SwA*;nX*Lbt2-7K4v?v`N0tt3fw6dmH z?6w8c$pcn_Iz2ukcTks<+c9T~3Ib}G*1#l%NlT9jpIRozktHd)VNO>4Ny*N(P&_Hx zQQE^8jvDHM`w_!6ON1kU{Yr1NiT-*#N$g;p0F_!b*{< z@FF`Lr~Oj75{F=D+W|aX@cKZn!Nb+Teqd>~or?0~xKatGt-W zKul6C+P#|Et>zQ$3GXKxT2aSLYLFtrd>gF@$;r5j*7!=n1s$oD*k}NJe#+GRY#CN# zzed(Man!EH3;}c6a*t0YCp6nkltx3$?GAfbxgfTZ=`kHP(Nv|@#Zdx)MY9maMv>1V zM2DFeg_3|))lRl*;9iQ-iCQJ%*isY9gW-uV*rCCM_Db0r?UeC>Uy}1C*a1Yh5==@E zA`U>U9<4YH+#!gdLez4#+9*CJB(x@|ZA+s}y*dONH`xGiXY>`ZDC$I*D9uC`+F$7r!8(~lJ zoo} zVjfnr%wd^L3pKx)P{MkLVErO#ws=ychIAn>b@3`U;nM+`#4~{QKxo^;6$+N3UMm-t zV+R)p`OP53OcXsa91JmxP8Q1(zY{wr!fTdDvw@cZ_r!uiCxhTp2b*+r9ka?Ru1qw5 zLX_>Bc`q*ny6&b3uji!7R<~TWsW7Umc(YD-2E~4e#i(G{#BL!-qWah

9lZqG+RL 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 diff --git a/package-lock.json b/package-lock.json index 8645b5874..0e8594890 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2976,53 +2976,34 @@ "resolved": "https://registry.npmjs.org/@project-sunbird/sb-styles/-/sb-styles-0.0.7.tgz", "integrity": "sha512-XirxDLdQnaKJC+tFh4IAD05ULHS7DE9ZkNsPRHglWzly8erTXe6M1DAL+XWKYVFLf+GK9U6HVKlvvxIUpRCiVw==" }, - "@project-sunbird/sunbird-epub-player-v9": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-epub-player-v9/-/sunbird-epub-player-v9-4.5.5.tgz", - "integrity": "sha512-nQdzxp1v0pdfk1uGDt6UODQ+TFReATPxSd4qWNpcxGCoXN66uXARmRyjTD9eRsH7TRAR+VVqxeUmdTxwV9I2hg==", - "requires": { - "@project-sunbird/sunbird-player-sdk-v9": "4.4.4" - } - }, "@project-sunbird/sunbird-pdf-player-v9": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-pdf-player-v9/-/sunbird-pdf-player-v9-4.2.0.tgz", - "integrity": "sha512-RxmXPpvGaAsMDmQJXf1tJZt3/JT5CXCOi6x4kZjmjDynMME8oVRn4HRPyxqgielbWhTop2CpOt51BC8hM3ujKQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-pdf-player-v9/-/sunbird-pdf-player-v9-4.1.1.tgz", + "integrity": "sha512-KN/bphOZePttenhQEMxqJY8u1SlX0BigtGrZu2FzXqkhEblfzwU3Gtck/vdkmFdjcx7X7sAAQLQtKIfDjzQd1g==", "requires": { - "@project-sunbird/sunbird-player-sdk-v9": "^4.2.0" + "@project-sunbird/sunbird-player-sdk-v9": "4.1.0" } }, "@project-sunbird/sunbird-player-sdk-v9": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-player-sdk-v9/-/sunbird-player-sdk-v9-4.4.4.tgz", - "integrity": "sha512-AsHyA3SUpNRcGiCTVkp4rLtuFPPIQTOHhthREHHe90g4HX+JeeaSz3FYRzZ3nLjZdNFWOJ/9Xqni00sJQcuDfQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-player-sdk-v9/-/sunbird-player-sdk-v9-4.1.0.tgz", + "integrity": "sha512-NCU0VQZab2yDicbj5Trcb85qG5aAbIyEMme96zEoqfu1SgVlvxDKPCLBbNBukXVkWs7BWNj5UBxrsKZbVdtFSA==" }, "@project-sunbird/sunbird-quml-player-v9": { - "version": "4.8.11", - "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-quml-player-v9/-/sunbird-quml-player-v9-4.8.11.tgz", - "integrity": "sha512-RktWW5ZmadduzbWcq6F50YYiSK6Ve+c6yKffzz9oByzsFoQ+XvrwejVHdUqaXa7dwArQveD/f2AbdCE0s28yOQ==", + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-quml-player-v9/-/sunbird-quml-player-v9-4.4.16.tgz", + "integrity": "sha512-jDaQLtbHo3Zz2ABiMtZfEmMOUV/0ZUpQ+MaKGKKcHyR4NduiSh2Ii17Klab1mxOyDLo73trTsOEvoJ9Infs59w==", "requires": { - "@project-sunbird/sunbird-player-sdk-v9": "4.8.0" + "@project-sunbird/sunbird-player-sdk-v9": "^4.4.4" }, "dependencies": { "@project-sunbird/sunbird-player-sdk-v9": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-player-sdk-v9/-/sunbird-player-sdk-v9-4.8.0.tgz", - "integrity": "sha512-8qj3Gg027eT6dqLw9iPGJ1GApoytvnglHSOb7p5E0lwZH+pneGh1iESP0avX98klg5CkHn0Sh+V/m4tP0/f4Gw==", - "requires": { - "ally.js": "1.4.1" - } + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-player-sdk-v9/-/sunbird-player-sdk-v9-4.4.4.tgz", + "integrity": "sha512-AsHyA3SUpNRcGiCTVkp4rLtuFPPIQTOHhthREHHe90g4HX+JeeaSz3FYRzZ3nLjZdNFWOJ/9Xqni00sJQcuDfQ==" } } }, - "@project-sunbird/sunbird-resource-library": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-resource-library/-/sunbird-resource-library-0.0.14.tgz", - "integrity": "sha512-VH6xOFENjePIPqh1LdQ2ZG/iKAPRlDIWMO2e4FA4sa72G43MMGgdPfY/BXwt6R52iLSIuEFZ8YRGjZzpwDz/4A==", - "requires": { - "tslib": "^1.10.0" - } - }, "@project-sunbird/sunbird-video-player-v9": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@project-sunbird/sunbird-video-player-v9/-/sunbird-video-player-v9-4.4.2.tgz", @@ -3247,14 +3228,6 @@ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, - "@types/localforage": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", - "integrity": "sha1-XjHDLdh5HsS5/z70fJy1Wy0NlDg=", - "requires": { - "localforage": "*" - } - }, "@types/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", @@ -3671,15 +3644,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "ally.js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", - "integrity": "sha1-n7fmuljvrE7pExyymqnuO1QLzx4=", - "requires": { - "css.escape": "^1.5.0", - "platform": "1.3.3" - } - }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -5495,9 +5459,9 @@ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" }, "common-form-elements-web-v9": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/common-form-elements-web-v9/-/common-form-elements-web-v9-4.7.2.tgz", - "integrity": "sha512-MsH0QLghlZZpN/z27iCgGQckUecSoBhGDIzIuVKqsIBPEVqVqktDtuHl2Mxiv9XWAhZa31IVM0shVoAWVX8LDg==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/common-form-elements-web-v9/-/common-form-elements-web-v9-4.4.6.tgz", + "integrity": "sha512-9uak+bkon9N4ORS+vwMnTvraSx6oFYIB5fwVG4s/i/omgCr10myWaCMpi5HaDbCIz8t2X2SR7vcvJ0zazDMH9g==", "requires": { "immutable": "^4.0.0-rc.12", "moment": "^2.29.1", @@ -6130,11 +6094,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, "cssauron": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", @@ -6931,39 +6890,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, - "epubjs": { - "version": "0.3.88", - "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.88.tgz", - "integrity": "sha512-VRumULpUELYmYwzypyfbDwoSIqDp2LXOXCtY3o55o3YDW5Zm32UjtZuX/xaWFGqyZORNNMWWQ8VlMaY1djnDYg==", - "requires": { - "@types/localforage": "0.0.34", - "core-js": "^3.6.5", - "event-emitter": "^0.3.5", - "jszip": "^3.4.0", - "localforage": "^1.7.3", - "lodash": "^4.17.15", - "marks-pane": "^1.0.9", - "path-webpack": "0.0.3", - "xmldom": "^0.3.0" - }, - "dependencies": { - "core-js": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", - "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "xmldom": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", - "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==" - } - } - }, "err-code": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", @@ -7164,15 +7090,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -7310,11 +7227,6 @@ "homedir-polyfill": "^1.0.1" } }, - "export-to-csv": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/export-to-csv/-/export-to-csv-0.2.1.tgz", - "integrity": "sha512-KTbrd3CAZ0cFceJEZr1e5uiMasabeCpXq1/5uvVxDl53o4jXJHnltasQoj2NkzrxD8hU9kdwjnMhoir/7nNx/A==" - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -8835,7 +8747,8 @@ "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true }, "immutable": { "version": "4.0.0", @@ -9968,6 +9881,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "dev": true, "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -10342,6 +10256,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, "requires": { "immediate": "~3.0.5" } @@ -10419,24 +10334,6 @@ "json5": "^2.1.2" } }, - "localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "requires": { - "lie": "3.1.1" - }, - "dependencies": { - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "~3.0.5" - } - } - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -10679,11 +10576,6 @@ "object-visit": "^1.0.0" } }, - "marks-pane": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/marks-pane/-/marks-pane-1.0.9.tgz", - "integrity": "sha512-Ahs4oeG90tbdPWwAJkAAoHg2lRR8lAs9mZXETNPO9hYg3AkjUJBKi1NQ4aaIQZVGrig7c/3NUV1jANl8rFTeMg==" - }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -12676,7 +12568,8 @@ "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, "parallel-transform": { "version": "1.2.0", @@ -12826,11 +12719,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "path-webpack": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/path-webpack/-/path-webpack-0.0.3.tgz", - "integrity": "sha1-/23sdJ7sWpRgXATV9j/FVgegOhY=" - }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -12891,11 +12779,6 @@ "find-up": "^3.0.0" } }, - "platform": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", - "integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=" - }, "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", @@ -15008,7 +14891,8 @@ "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true }, "set-value": { "version": "2.0.1", @@ -17148,30 +17032,11 @@ "videojs-vtt.js": "^0.15.2" } }, - "videojs-contrib-quality-levels": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.1.0.tgz", - "integrity": "sha512-dqGQGbL9AFhucxki7Zh0c3kIhH0PAPcHEh6jUdRyaFCVeOuqnJrOYs/3wNtsokDdBdRf2Du2annpu4Z2XaSZRg==", - "requires": { - "global": "^4.3.2", - "video.js": "^6 || ^7" - } - }, "videojs-font": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" }, - "videojs-http-source-selector": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/videojs-http-source-selector/-/videojs-http-source-selector-1.1.6.tgz", - "integrity": "sha512-6b5MmKTT2cVnrjtdNj4z1VO91udbXkZkTYA6LlD8WN2aHlG2rqFTmtMab4NK4nlkkkbRnm3c2q2IddL3jffLmg==", - "requires": { - "global": "^4.3.2", - "video.js": "^7.0.0", - "videojs-contrib-quality-levels": "^2.0.4" - } - }, "videojs-vtt.js": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.2.tgz", diff --git a/package.json b/package.json index 44dd51b77..3495c3ca6 100644 --- a/package.json +++ b/package.json @@ -25,19 +25,15 @@ "@project-sunbird/ckeditor-build-classic": "^4.1.3", "@project-sunbird/client-services": "4.2.3", "@project-sunbird/sb-styles": "0.0.7", - "@project-sunbird/sunbird-epub-player-v9": "4.5.5", - "@project-sunbird/sunbird-pdf-player-v9": "4.2.0", - "@project-sunbird/sunbird-quml-player-v9": "4.8.11", - "@project-sunbird/sunbird-resource-library": "0.0.14", + "@project-sunbird/sunbird-pdf-player-v9": "4.1.1", + "@project-sunbird/sunbird-quml-player-v9": "4.4.16", "@project-sunbird/sunbird-video-player-v9": "4.4.2", "@project-sunbird/telemetry-sdk": "0.0.26", "@types/jquery": "^3.5.5", "alphanum-sort": "^1.0.2", "angular2-uuid": "^1.1.1", - "common-form-elements-web-v9": "4.7.2", + "common-form-elements-web-v9": "4.4.6", "core-js": "^2.5.4", - "epubjs": "0.3.88", - "export-to-csv": "^0.2.1", "express": "^4.17.1", "express-http-proxy": "^1.6.2", "fine-uploader": "^5.15.7", @@ -61,8 +57,6 @@ "svg2img": "^0.6.1", "tslib": "^1.10.0", "video.js": "^7.10.2", - "videojs-contrib-quality-levels": "^2.1.0", - "videojs-http-source-selector": "^1.1.6", "zone.js": "~0.10.2" }, "devDependencies": { diff --git a/projects/collection-editor-library/package.json b/projects/collection-editor-library/package.json index 71bf14524..b0ed1f75a 100644 --- a/projects/collection-editor-library/package.json +++ b/projects/collection-editor-library/package.json @@ -1,10 +1,10 @@ { "name": "@project-sunbird/sunbird-collection-editor-v9", - "version": "4.8.23", + "version": "4.5.1", "peerDependencies": { "@angular/common": "~9.1.13", "@angular/core": "~9.1.13", - "common-form-elements-web-v9": "4.7.2", + "common-form-elements-web-v9": "4.4.6", "@project-sunbird/ckeditor-build-classic": "4.1.3", "ng2-semantic-ui-v9": "0.0.3" } diff --git a/projects/collection-editor-library/src/lib/collection-editor-library.module.ts b/projects/collection-editor-library/src/lib/collection-editor-library.module.ts index 8f31fb4e1..021fe8d7d 100644 --- a/projects/collection-editor-library/src/lib/collection-editor-library.module.ts +++ b/projects/collection-editor-library/src/lib/collection-editor-library.module.ts @@ -6,8 +6,6 @@ import { CommonFormElementsModule, DialcodeCursor } from 'common-form-elements-w import { SuiModule } from 'ng2-semantic-ui-v9'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { HttpClientModule } from '@angular/common/http'; -import { SanitizeHtmlPipe } from './pipes/sanitize-html.pipe'; -import { InterpolatePipe } from './pipes/interpolate.pipe'; import { CollectionEditorLibraryComponent } from './collection-editor-library.component'; import { ContentplayerPageComponent } from './components/contentplayer-page/contentplayer-page.component'; import { EditorComponent } from './components/editor/editor.component'; @@ -27,12 +25,10 @@ import { AnswerComponent } from './components/answer/answer.component'; import { CkeditorToolComponent } from './components/ckeditor-tool/ckeditor-tool.component'; import { QuestionComponent } from './components/question/question.component'; import {SunbirdPdfPlayerModule} from '@project-sunbird/sunbird-pdf-player-v9'; -import { SunbirdEpubPlayerModule } from '@project-sunbird/sunbird-epub-player-v9'; import { SunbirdVideoPlayerModule } from '@project-sunbird/sunbird-video-player-v9'; import { QumlLibraryModule } from '@project-sunbird/sunbird-quml-player-v9'; import {CarouselModule} from 'ngx-bootstrap/carousel'; import { TelemetryInteractDirective } from './directives/telemetry-interact/telemetry-interact.directive'; -import { DateFormatPipe } from './directives/date-format/date-format.pipe'; import { AssetBrowserComponent } from './components/asset-browser/asset-browser.component'; import { CollectionIconComponent } from './components/collection-icon/collection-icon.component'; import { CacheService } from 'ng2-cache-service'; @@ -41,28 +37,19 @@ import { CacheSessionStorage } from 'ng2-cache-service/dist/src/services/storage import { QumlPlayerComponent } from './components/quml-player/quml-player.component'; import { DialcodeComponent } from './components/dialcode/dialcode.component'; import { DialcodeService } from './services/dialcode/dialcode.service'; -import { QuestionOptionSubMenuComponent } from './components/question-option-sub-menu/question-option-sub-menu.component'; import { CsvUploadComponent } from './components/csv-upload/csv-upload.component'; import { ManageCollaboratorComponent } from './components/manage-collaborator/manage-collaborator.component'; -import { SliderComponent } from './components/slider/slider.component'; -import { TranslationsComponent } from './components/translations/translations.component'; import { PublishChecklistComponent } from './components/publish-checklist/publish-checklist.component'; -import { BulkUploadComponent } from './components/bulk-upload/bulk-upload.component'; -import { RelationalMetadataComponent } from './components/relational-metadata/relational-metadata.component'; -import { ResourceLibraryModule } from '@project-sunbird/sunbird-resource-library'; -import { AppLoaderComponent } from './components/app-loader/app-loader.component'; @NgModule({ - declarations: [CollectionEditorLibraryComponent, InterpolatePipe, SanitizeHtmlPipe, ContentplayerPageComponent, - EditorComponent, QumlplayerPageComponent, HeaderComponent, FancyTreeComponent, MetaFormComponent, LibraryComponent, - LibraryFilterComponent, LibraryListComponent, QuestionComponent, OptionsComponent, AnswerComponent, CkeditorToolComponent, - LibraryPlayerComponent, ResourceReorderComponent, SkeletonLoaderComponent, TemplateComponent, DateFormatPipe, - TelemetryInteractDirective, AssetBrowserComponent, CollectionIconComponent, - QumlPlayerComponent, DialcodeComponent, BulkUploadComponent, CsvUploadComponent, ManageCollaboratorComponent, - PublishChecklistComponent, QuestionOptionSubMenuComponent, SliderComponent, TranslationsComponent,AppLoaderComponent, - RelationalMetadataComponent], + declarations: [CollectionEditorLibraryComponent, ContentplayerPageComponent, EditorComponent, QumlplayerPageComponent, + HeaderComponent, FancyTreeComponent, MetaFormComponent, LibraryComponent, LibraryFilterComponent, LibraryListComponent, + QuestionComponent, OptionsComponent, AnswerComponent, CkeditorToolComponent, + LibraryPlayerComponent, ResourceReorderComponent, SkeletonLoaderComponent, TemplateComponent, TelemetryInteractDirective, + AssetBrowserComponent, CollectionIconComponent, + QumlPlayerComponent, DialcodeComponent, CsvUploadComponent, ManageCollaboratorComponent, PublishChecklistComponent,], imports: [CommonModule, FormsModule, ReactiveFormsModule, RouterModule.forChild([]), SuiModule, CommonFormElementsModule, InfiniteScrollModule, HttpClientModule, SunbirdPdfPlayerModule, SunbirdVideoPlayerModule, - QumlLibraryModule, CarouselModule, SunbirdEpubPlayerModule, ResourceLibraryModule], + QumlLibraryModule, CarouselModule], providers: [ CacheService, { provide: CacheStorageAbstract, useClass: CacheSessionStorage }, diff --git a/projects/collection-editor-library/src/lib/components/answer/answer.component.html b/projects/collection-editor-library/src/lib/components/answer/answer.component.html index dc764cfbf..b895aaaac 100644 --- a/projects/collection-editor-library/src/lib/components/answer/answer.component.html +++ b/projects/collection-editor-library/src/lib/components/answer/answer.component.html @@ -1,15 +1,9 @@

-
- + - - -
-

-
-
diff --git a/projects/collection-editor-library/src/lib/components/answer/answer.component.ts b/projects/collection-editor-library/src/lib/components/answer/answer.component.ts index 057d7d4c6..9ec9caef8 100644 --- a/projects/collection-editor-library/src/lib/components/answer/answer.component.ts +++ b/projects/collection-editor-library/src/lib/components/answer/answer.component.ts @@ -8,7 +8,6 @@ import { ConfigService } from '../../services/config/config.service'; export class AnswerComponent implements OnInit { @Input() editorState; @Input() showFormError; - @Input() isReadOnlyMode; @Output() editorDataOutput: EventEmitter = new EventEmitter(); constructor(public configService: ConfigService) { } diff --git a/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.html b/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.html deleted file mode 100644 index d62275bb3..000000000 --- a/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
-
- {{headerMessage}} -
-

{{loaderMessage}}

-
-
\ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.spec.ts b/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.spec.ts deleted file mode 100644 index dede2f20d..000000000 --- a/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AppLoaderComponent } from './app-loader.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { ConfigService } from '../../services/config/config.service'; - - - -describe('AppLoaderComponent', () => { - let component: AppLoaderComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - declarations: [ AppLoaderComponent ], - providers: [ConfigService] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AppLoaderComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.ts b/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.ts deleted file mode 100644 index 664092e43..000000000 --- a/projects/collection-editor-library/src/lib/components/app-loader/app-loader.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Input } from '@angular/core'; -import {ILoaderMessage} from '../../interfaces/loader'; -import { ConfigService } from '../../services/config/config.service'; -import * as _ from 'lodash-es'; - -/** - * loader component - */ -@Component({ - selector: 'app-loader', - templateUrl: './app-loader.component.html' -}) -export class AppLoaderComponent implements OnInit { - @Input() data: ILoaderMessage; - headerMessage: string; - loaderMessage: string; - - constructor(public configService: ConfigService) { - this.headerMessage = _.get(this.configService, 'labelConfig.lbl.loaderHeading'); - this.loaderMessage = _.get(this.configService, 'labelConfig.lbl.loaderMessage'); - } - - ngOnInit() { - if (this.data) { - this.headerMessage = this.data.headerMessage || this.headerMessage; - this.loaderMessage = this.data.loaderMessage || this.loaderMessage; - } - } -} diff --git a/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.html b/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.html index 3efb03200..26cc0d3e6 100644 --- a/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.html +++ b/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.html @@ -59,7 +59,7 @@
-
{{configService.labelConfig?.lbl?.uploadAndUse}}
@@ -111,11 +111,10 @@
{{configService.labelConfig?.lbl?.copyRightsAndLicense}}
-
diff --git a/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.spec.ts b/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.spec.ts index f5f0c1b97..bb7465430 100644 --- a/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.spec.ts @@ -7,7 +7,7 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { mockData } from './asset-browser.component.spec.data'; import { FormsModule } from '@angular/forms'; import { EditorService } from '../../services/editor/editor.service'; -import { of, throwError } from 'rxjs'; +import { of } from 'rxjs'; import * as _ from 'lodash-es'; const mockEditorService = { @@ -137,49 +137,21 @@ describe('AssetBrowserComponent', () => { node_id: 'do_123' } })); - spyOn(questionService, 'generatePreSignedUrl').and.returnValue(of({ - result: { - node_id: 'do_234', - pre_signed_url: '/test' - } - })); - spyOn(component, 'addImageInEditor').and.callThrough(); - spyOn(component, 'dismissPops').and.callThrough(); - component.uploadAndUseImage(modal); - expect(questionService.createMediaAsset).toHaveBeenCalled(); - expect(component.loading).toEqual(true); - expect(component.isClosable).toEqual(false); - expect(component.imageFormValid).toEqual(false); - }); - it('#uploadAndUseImage should upload image and call upload to blob', async () => { - component.showImageUploadModal = false; - let questionService: QuestionService = TestBed.inject(QuestionService); - let modal = true; - spyOn(questionService, 'createMediaAsset').and.returnValue(of({ - result: { - node_id: 'do_123' - } - })); - spyOn(questionService, 'generatePreSignedUrl').and.returnValue(of({ - result: { - node_id: 'do_234', - pre_signed_url: '/test' - } - })); - spyOn(component, 'uploadToBlob').and.returnValue(of(true)); spyOn(questionService, 'uploadMedia').and.returnValue(of({ result: { node_id: 'do_234', content_url: '/test' } })); - spyOn(component, 'addImageInEditor').and.callThrough(); - spyOn(component, 'dismissPops').and.callThrough(); + spyOn(component, 'addImageInEditor'); + spyOn(component, 'dismissPops'); component.uploadAndUseImage(modal); expect(questionService.createMediaAsset).toHaveBeenCalled(); - expect(questionService.generatePreSignedUrl).toHaveBeenCalled(); - expect(component.uploadToBlob).toHaveBeenCalled(); - }); + expect(questionService.uploadMedia).toHaveBeenCalled(); + expect(component.addImageInEditor).toHaveBeenCalledWith('/test', 'do_234'); + expect(component.showImageUploadModal).toEqual(false); + expect(component.dismissPops).toHaveBeenCalledWith(modal); + }) it('#generateAssetCreateRequest() should return asset create request', () => { let fileName = 'test'; let fileType = 'image/png'; diff --git a/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.ts b/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.ts index e974fa84c..851603cd5 100644 --- a/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.ts +++ b/projects/collection-editor-library/src/lib/components/asset-browser/asset-browser.component.ts @@ -46,7 +46,6 @@ export class AssetBrowserComponent implements OnInit, OnDestroy { public termsAndCondition: any; public assetName: any; public emptySearchMessage: any; - public imageFile: any; ngOnInit() { this.initialFormConfig = _.get(config, 'uploadIconFormConfig'); this.formConfig = _.get(config, 'uploadIconFormConfig'); @@ -154,7 +153,6 @@ export class AssetBrowserComponent implements OnInit, OnDestroy { this.getAllImages(offset, this.query, true); } uploadImage(event) { - this.imageFile = event.target.files[0]; const file = event.target.files[0]; const reader = new FileReader(); this.formData = new FormData(); @@ -201,67 +199,22 @@ export class AssetBrowserComponent implements OnInit, OnDestroy { this.formConfig = formvalue; } uploadAndUseImage(modal) { - this.isClosable = false; - this.loading = true; - this.showErrorMsg = false; - this.imageFormValid = false; - this.questionService.createMediaAsset({ asset: this.assestData }).pipe(catchError(err => { + this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => { const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') }; - this.loading = false; - this.isClosable = true; - this.imageFormValid = true; return throwError(this.editorService.apiErrorHandling(err, errInfo)); })).subscribe((res) => { const imgId = res.result.node_id; - const preSignedRequest = { - content: { - fileName: this.assetName - } + const request = { + data: this.formData }; - this.questionService.generatePreSignedUrl(preSignedRequest, imgId).pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.026') }; - this.loading = false; - this.isClosable = true; - this.imageFormValid = true; + this.questionService.uploadMedia(request, imgId).pipe(catchError(err => { + const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') }; return throwError(this.editorService.apiErrorHandling(err, errInfo)); })).subscribe((response) => { - const signedURL = response.result.pre_signed_url; - const blobConfig = { - processData: false, - contentType: 'Asset', - headers: { - 'x-ms-blob-type': 'BlockBlob' - } - }; - this.uploadToBlob(signedURL, this.imageFile, blobConfig).subscribe(() => { - const fileURL = signedURL.split('?')[0]; - const data = new FormData(); - data.append('fileUrl', fileURL); - data.append('mimeType', _.get(this.imageFile, 'type')); - const config1 = { - enctype: 'multipart/form-data', - processData: false, - contentType: false, - cache: false - }; - const uploadMediaConfig = { - data, - param: config1 - }; - this.questionService.uploadMedia(uploadMediaConfig, imgId).pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') }; - this.isClosable = true; - this.loading = false; - this.imageFormValid = true; - return throwError(this.editorService.apiErrorHandling(err, errInfo)); - })).subscribe((response1) => { - this.addImageInEditor(response1.result.content_url, response1.result.node_id); - this.showImageUploadModal = false; - this.dismissPops(modal); - }); - }); + this.addImageInEditor(response.result.content_url, response.result.node_id); + this.showImageUploadModal = false; + this.dismissPops(modal); }); - }); } generateAssetCreateRequest(fileName, fileType, mediaType) { @@ -286,10 +239,8 @@ export class AssetBrowserComponent implements OnInit, OnDestroy { dismissImageUploadModal() { - if (this.isClosable) { this.showImagePicker = true; this.showImageUploadModal = false; - } } openImageUploadModal() { this.showImageUploadModal = true; @@ -298,14 +249,10 @@ export class AssetBrowserComponent implements OnInit, OnDestroy { this.imageUploadLoader = false; this.imageFormValid = false; this.showErrorMsg = false; - this.loading = false; - this.isClosable = true; } dismissPops(modal) { this.dismissImagePicker(); - if (modal && modal.deny) { - modal.deny(); - } + modal.deny(); } dismissImagePicker() { this.showImagePicker = false; diff --git a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.html b/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.html deleted file mode 100644 index b1c36f8a9..000000000 --- a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.html +++ /dev/null @@ -1,210 +0,0 @@ -
- -
-
-
{{configService.labelConfig?.lbl?.lastUploaded}} : {{ process?.updatedon | dateFormat: 'D MMMM YYYY' }}
-
- - {{configService.labelConfig?.lbl?.bulkInProgress}} -
- {{configService.labelConfig?.lbl?.viewDetails}} -
-
- - - -
- {{configService.labelConfig?.lbl?.bulkUploadQuestion}} -
-
-
-
- -
- - -
- -
- - - - {{completionPercentage}}% - -
-
- -
-
{{configService.labelConfig?.lbl?.downloadSampleMetadataCsvFileAndCreate}}
-
{{configService.labelConfig?.lbl?.makeSureYourFile}} :
-
    -
  • {{configService.labelConfig?.lbl?.allColumnsAreAvailableShownFormat}}
  • -
  • {{configService.labelConfig?.lbl?.hasAllMandatoryColumnsFilledAsMarkedInFormat}}
  • -
  • {{configService.labelConfig?.lbl?.hasNoDuplicateUrlsFilepathColumn}}
  • -
- -
- -
-
-
-
- -
- - {{configService.labelConfig?.lbl?.processingDroppedFiles}} - - -
    -
  • -
    -
    -
    - - - - - - - -
  • -
-
-
- {{configService.labelConfig?.lbl?.dragAndDrop}}
- {{configService.labelConfig?.lbl?.or}} -
-
-
{{configService.labelConfig?.lbl?.selectFile}}
-
-

{{configService.labelConfig?.lbl?.uploadCSVXlEntries}}

-
- -
-
- - -
-
- -
- -
- - -
-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- - -
{{configService.labelConfig?.lbl?.validatingCSVFile}}
-
-
-
-
- -
-
- {{configService.labelConfig?.lbl?.metadataFileValidationFailed}} -
-
{{configService.labelConfig?.lbl?.metadataFollowingError}}
-
    -
  • {{msg}}
  • -
- -
- -
-
{{configService.labelConfig?.lbl?.uploadingYourContentFromCSV}}
-
-
-
{{configService.labelConfig?.lbl?.uploadFail}} : {{ process?.overall_stats?.upload_failed }}
-
{{configService.labelConfig?.lbl?.uploadSuccessful}} : {{ process?.overall_stats?.upload_success}}
-
{{configService.labelConfig?.lbl?.uploadRemaining}} : {{ process?.overall_stats?.upload_pending }}
-
-
-
- -
-
{{configService.labelConfig?.lbl?.bulkUploadComplete}}
-
-
-
{{configService.labelConfig?.lbl?.uploadFail}} : {{ process?.overall_stats?.upload_failed }}
-
{{configService.labelConfig?.lbl?.contentUploaded}} : {{ process?.overall_stats?.total }}
-
{{configService.labelConfig?.lbl?.uploadSuccessful}} : {{ process?.overall_stats?.upload_success }}
-
-
- -
-
-
-
- - - -
-
- {{configService.labelConfig?.lbl?.bulkUploadNoticeLine1}} - '{{configService.labelConfig?.lbl?.close}}' - {{configService.labelConfig?.lbl?.bulkUploadNoticeLine2}}
- {{configService.labelConfig?.lbl?.bulkUploadNoticeLine3}} -
-
-
-
\ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.scss b/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.scss deleted file mode 100644 index 8e10e6342..000000000 --- a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.scss +++ /dev/null @@ -1,40 +0,0 @@ -.qq-uploader.qq-uploader-selector.custom-qq-uploader { - background: inherit; - border-color: none; - max-height: inherit; - min-height: inherit; - overflow-y: inherit; - width: inherit; - height: 240px; - display: flex; - justify-content: center; - align-items: center; -} - -.sb-bk-upload h6 { - line-height: 22px; -} - -@media screen and (min-width: 768px) { - .sb-bk-upload .my--20 { - margin: -1.25rem 0 !important; - } -} - -.sb-bk-upload .sb-circle-download-icon { - background: var(--secondary-100); - display: inline-block; - width: 1.8rem; - height: 1.8rem; - line-height: 1.8rem; - color: var(--white); - border-radius: 100%; - text-align: center; - font-size: 0.8rem; -} - -.sb-loader-with-lbl{ - .sb-loader{ - position: relative !important; - } -} diff --git a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.spec.ts b/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.spec.ts deleted file mode 100644 index 2f8da62a6..000000000 --- a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BulkUploadComponent } from './bulk-upload.component'; -import { ToasterService } from '../../services/toaster/toaster.service'; -import { EditorService } from '../../services/editor/editor.service'; -import { ConfigService } from '../../services/config/config.service'; -import { BulkJobService } from '../../services/bulk-job/bulk-job.service'; -import { TreeService } from '../../services/tree/tree.service'; -import { EditorTelemetryService } from '../../services/telemetry/telemetry.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -describe('BulkUploadComponent', () => { - let component: BulkUploadComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ BulkUploadComponent ], - imports: [HttpClientTestingModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - providers: [ToasterService, EditorService, ConfigService, - BulkJobService, TreeService, EditorTelemetryService] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(BulkUploadComponent); - component = fixture.componentInstance; - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - it('should call closeBulkUploadModal', () => { - component.closeBulkUploadModal(); - expect(component.showBulkUploadModal).toBeFalsy(); - expect(component.bulkUploadState).toBe(0); - }); - it('should call downloadSampleCSVFile', () => { - spyOn(window, 'open').and.callThrough(); - component.sampleMetadataCsvUrl = 'https://dockstorage.blob.core.windows.net/content-service/bulk-question-upload-sample-format.csv'; - const downloadConfig = { - blobUrl: component.sampleMetadataCsvUrl, - successMessage: false, - fileType: 'csv', - fileName: 'do_11339645670870220811360' - }; - component.downloadSampleCSVFile(); - expect(window.open).toHaveBeenCalledWith(downloadConfig.blobUrl, '_blank'); - }); - xit('should call updateBulkUploadState for state 6', () => { - component.bulkUploadState = 6; - spyOn(component, 'closeBulkUploadModal').and.callThrough(); - component.updateBulkUploadState('increment'); - expect(component.closeBulkUploadModal).toHaveBeenCalled(); - }); - xit('should call updateBulkUploadState for state other than 4', () => { - component.bulkUploadState = 1; - spyOn(component, 'initiateDocumentUploadModal').and.callThrough(); - component.updateBulkUploadState('increment'); - expect(component.initiateDocumentUploadModal).toHaveBeenCalled(); - }); -}); diff --git a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.ts b/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.ts deleted file mode 100644 index 80dea3345..000000000 --- a/projects/collection-editor-library/src/lib/components/bulk-upload/bulk-upload.component.ts +++ /dev/null @@ -1,468 +0,0 @@ -import { Component, OnInit, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core'; -import { FineUploader } from 'fine-uploader'; -import * as _ from 'lodash-es'; -import { throwError } from 'rxjs'; -import { catchError, map, mergeMap } from 'rxjs/operators'; -import { ToasterService } from '../../services/toaster/toaster.service'; -import { EditorService } from '../../services/editor/editor.service'; -import { ConfigService } from '../../services/config/config.service'; -import { BulkJobService } from '../../services/bulk-job/bulk-job.service'; -import { TreeService } from '../../services/tree/tree.service'; -import { EditorTelemetryService } from '../../services/telemetry/telemetry.service'; - -@Component({ - selector: 'lib-bulk-upload', - templateUrl: './bulk-upload.component.html', - styleUrls: ['./bulk-upload.component.scss'] -}) -export class BulkUploadComponent implements OnInit { - public collectionId: string; - @ViewChild('fineUploaderUI') fineUploaderUI: ElementRef; - @Output() bulkUploadEmitter = new EventEmitter(); - public storedCollectionData; - public process: any = { - process_id: '', - status: '', - type: 'bulk_upload', - overall_stats: { - total: 0, - upload_failed: 0, - upload_pending: 0, - upload_success: 0 - } - }; - public oldProcessStatus = ''; - public stageStatus = ''; - public contents: Array = []; - public completionPercentage = 0; - public showBulkUploadModal = false; - public bulkUploadState = 0; - public loading = false; - public telemetryPageId: string; - public assetConfig: any = { - csv: { - accepted: 'csv', - size: 50 - } - }; - uploader; - public bulkUploadErrorMsgs = []; - public bulkUploadValidationError = ''; - public sampleMetadataCsvUrl = ''; - constructor( - private toasterService: ToasterService, private editorService: EditorService, public configService: ConfigService, - private bulkJobService: BulkJobService, private treeService: TreeService, public telemetryService: EditorTelemetryService) { } - - ngOnInit() { - this.collectionId = _.get(this.editorService.editorConfig, 'context.identifier'); - // tslint:disable-next-line:max-line-length - this.sampleMetadataCsvUrl = _.get(this.editorService, 'editorConfig.config.publicStorageAccount') + _.get(this.configService.urlConFig, 'URLS.BULKJOB.SAMPLE_QUESTION_FILE'); - this.checkBulkUploadStatus(); - this.stageStatus = this.getContentStatus(); - } - - calculateCompletionPercentage() { - this.completionPercentage = 0; - console.log('process.overall_stats', this.process.overall_stats); - const { total, upload_pending } = this.process.overall_stats; - - // tslint:disable-next-line:radix - this.completionPercentage = parseInt(_.toNumber(100 - ((upload_pending / total) * 100))); - console.log('completionPercentage', this.completionPercentage); - } - - checkBulkUploadStatus() { - const reqData = { - filters: { - program_id: _.get(this.editorService.editorConfig, 'context.programId', ''), - collection_id: this.collectionId, - type: 'bulk_upload', - createdby: _.get(this.editorService.editorConfig, 'context.user.id') - }, - limit: 1 - }; - this.bulkJobService.getBulkOperationStatus(reqData) - .subscribe((statusResponse) => { - const count = _.get(statusResponse, 'result.count', 0); - if (!count) { - return; - } - - this.process = _.first(_.get(statusResponse, 'result.process', [])); - this.oldProcessStatus = this.process.status; - this.searchContentWithProcessId(); - this.bulkUploadState = 5; - }, (error) => { - console.log(error); - }); - } - - searchContentWithProcessId() { - this.bulkJobService.searchContentWithProcessId(this.process.process_id).subscribe((searchResponse) => { - this.process.overall_stats.upload_failed = 0; - this.process.overall_stats.upload_success = 0; - this.process.overall_stats.upload_pending = 0; - - if (_.get(searchResponse, 'result.count', 0) > 0) { - this.contents = _.compact(_.get(searchResponse.result, 'Question')); - let status = this.stageStatus; - if (status === 'draft') { - status = 'Draft'; - } - _.each(this.contents, (content) => { - if (content.status === 'Retired') { - this.process.overall_stats.upload_failed++; - } else if (content.status === status) { - this.process.overall_stats.upload_success++; - } else { - this.process.overall_stats.upload_pending++; - } - }); - - this.process.overall_stats.upload_pending = this.process.overall_stats.total - - (this.process.overall_stats.upload_success + this.process.overall_stats.upload_failed); - - if (this.process.overall_stats.upload_pending === 0) { - this.process.status = 'completed'; - } - this.editorService.fetchCollectionHierarchy(this.collectionId).subscribe((response) => { - this.storedCollectionData = response.result.questionSet; - this.calculateCompletionPercentage(); - if (this.oldProcessStatus !== this.process.status) { - this.updateJob(); - } - - }); - if (this.process.status === 'completed') { - this.editorService.nextBulkUploadStatus('completed'); - } else { - this.editorService.nextBulkUploadStatus('processing'); - } - this.bulkUploadEmitter.emit({ status: true, type: 'updateHierarchy' }); - } - }, (error) => { - console.log(error); - }); - } - - downloadReport() { - const headers = ['Name of the Question', 'Level 1 Question Set Section', 'Keywords', 'Audience', - 'Author', 'Copyright', 'License', 'Attributions', 'Identifier of the question ']; - try { - headers.push('Status'); - headers.push('Reason for failure'); - - const tableData = _.map(this.contents, (content, i) => { - const result: any = {}; - result.name = _.get(content, 'name', ''); - result.level1 = ''; - result.keywords = _.join(_.get(content, 'keywords', []), ', '); - result.audience = _.join(_.get(content, 'audience', []), ', '); - result.creator = _.get(content, 'author', ''); - result.copyright = _.get(content, 'copyright', ''); - result.license = _.get(content, 'license', ''); - result.attributions = _.join(_.get(content, 'attributions', []), ', '); - result.identifier = _.get(content, 'identifier', ''); - const selctedUnitParents: any = this.getParents(this.storedCollectionData.children, content.identifier); - if (selctedUnitParents.found && !_.isEmpty(selctedUnitParents.parents)) { - result.level1 = selctedUnitParents.parents; - } - - let status = _.get(content, 'status', ''); - if ((this.stageStatus === 'draft' && status === 'Draft')) { - status = 'Success'; - } else if (status === 'Retired') { - status = 'Failure'; - } - - result.status = status; - result.failedReason = _.get(content, 'questionUploadStatus', ''); - return result; - }); - - const csvDownloadConfig = { - filename: `Bulk Upload ${this.questionSetMetadata.name.trim()}`, - tableData, - headers, - showTitle: false - }; - this.editorService.generateCSV(csvDownloadConfig); - } catch (err) { - console.log(err); - this.toasterService.error(_.get(this.configService.labelConfig, 'messages.error.001')); - } - } - - updateJob() { - const reqData = { - process_id: this.process.process_id, - overall_stats: this.process.overall_stats, - status: this.process.status, - updatedby: _.get(this.editorService.editorConfig, 'context.user.id') - }; - this.bulkJobService.updateBulkJob(reqData) - .subscribe((updateResponse) => { - if (this.process.status === 'completed') { - this.bulkUploadState = 6; - } else if (this.process.status === 'processing') { - this.bulkUploadState = 5; - } - this.oldProcessStatus = this.process.status; - }, (error) => { - console.log(error); - }); - } - - initiateDocumentUploadModal() { - this.loading = false; - this.bulkUploadValidationError = ''; - this.bulkUploadErrorMsgs = []; - return setTimeout(() => { - this.initiateUploadModal(); - }, 0); - } - - initiateUploadModal() { - this.uploader = new FineUploader({ - element: document.getElementById('upload-document-div'), - template: 'qq-template-validation', - multiple: false, - autoUpload: false, - request: { - endpoint: '/assets/uploads' - }, - validation: { - allowedExtensions: [this.assetConfig.csv.accepted], - acceptFiles: ['text/csv'], - itemLimit: 1, - sizeLimit: _.toNumber(this.assetConfig.csv.size) * 1024 * 1024 // Convert into MB - }, - messages: { - sizeError: `{file} is too large, maximum file size is ${this.assetConfig.csv.size} MB.`, - typeError: `Invalid content type (supported type: ${this.assetConfig.csv.accepted})` - }, - callbacks: { - onStatusChange: () => { }, - onSubmit: () => { - this.uploadContent(); - }, - onError: () => { - this.uploader.reset(); - } - } - }); - this.fineUploaderUI.nativeElement.remove(); - } - - uploadContent() { - const file = this.uploader.getFile(0); - const filename = this.uploader.getName(0); - if (file == null) { - this.toasterService.error('File is required to upload'); - this.uploader.reset(); - return; - } - this.bulkUploadState = 3; - this.startBulkUpload(file, filename); - } - - startBulkUpload(file, filename) { - this.generatePreSignedUrl(filename).pipe( - map(response => { - return _.get(response.result, 'pre_signed_url'); - }), mergeMap(signedURL => { - return this.uploadToBlob(signedURL, file); - }), mergeMap(signedURL => this.createImportRequest(signedURL).pipe( - map(importResponse => { - this.process.process_id = _.get(importResponse, 'result.processId'); - return _.get(importResponse, 'result.count'); - }))), mergeMap(totalQuestion => this.createJobRequest(totalQuestion) - )).subscribe((jobResponse) => { - this.process = _.get(jobResponse, 'result'); - this.oldProcessStatus = this.process.status; - this.calculateCompletionPercentage(); - this.editorService.nextBulkUploadStatus('processing'); - this.bulkUploadEmitter.emit({ status: true, type: 'updateHierarchy' }); - console.log('response ::', jobResponse); - }); - } - - generatePreSignedUrl(filename) { - const request = { - content: { - fileName: filename - } - }; - return this.editorService.generatePreSignedUrl(request, this.collectionId, 'hierarchy').pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.035') }; - this.uploader.reset(); - this.updateBulkUploadState('decrement'); - return throwError(this.editorService.apiErrorHandling(err, errInfo)); - })); - } - - uploadToBlob(signedURL, file) { - const config = { - processData: false, - contentType: 'text/csv', - headers: { - 'x-ms-blob-type': 'BlockBlob' - } - }; - return this.editorService.httpClient.put(signedURL, file, config).pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.036')}; - this.uploader.reset(); - this.updateBulkUploadState('decrement'); - return throwError(this.editorService.apiErrorHandling(err, errInfo)); - }), map(data => signedURL.split('?')[0])); - } - - createImportRequest(fileUrl) { - let reqBody = { - fileUrl, - questionType: 'MCQ', - createdBy: _.get(this.editorService.editorConfig, 'context.user.id'), - author: _.get(this.editorService.editorConfig, 'context.user.fullName', ''), - status: 'Draft', - questionSetId: this.collectionId - }; - const headers = { 'X-Channel-ID': _.get(this.editorService.editorConfig, 'context.channel') }; - const derivedProperties = ['additionalCategories', 'board', 'medium', 'gradeLevel', 'subject', 'audience', - 'license', 'framework', 'topic']; - reqBody = _.merge({}, reqBody, _.pick(this.questionSetMetadata, derivedProperties)); - return this.bulkJobService.createBulkImport(reqBody, headers).pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.001')}; - this.uploader.reset(); - if (_.get(err, 'error.result.messages')) { - this.bulkUploadState = 4; - this.bulkUploadErrorMsgs = _.get(err, 'error.result.messages'); - return throwError({}); - } else { - this.updateBulkUploadState('decrement'); - return throwError(this.editorService.apiErrorHandling(err, errInfo)); - } - })); - } - - get questionSetMetadata() { - const rootNode = this.treeService.getFirstChild(); - return _.get(rootNode, 'data.metadata'); - } - - viewDetails($event) { - $event.preventDefault(); - this.showBulkUploadModal = true; - if (this.process.status === 'processing') { - this.bulkUploadState = 5; - this.checkBulkUploadStatus(); - } else { - this.bulkUploadState = 6; - } - } - - getContentStatus() { - return 'draft'; - } - - createJobRequest(rowsCount) { - this.bulkUploadState = 5; - const orgId = _.get(this.editorService.editorConfig, 'context.contributionOrgId'); - const createdby = _.get(this.editorService.editorConfig, 'context.user.id'); - const programId = _.get(this.editorService.editorConfig, 'context.programId', ''); - const collectionId = this.collectionId; - - this.process.overall_stats = { - total: rowsCount, - upload_pending: rowsCount, - upload_failed: 0, - upload_success: 0 - }; - this.process.data = { - program_id: programId, - collection_id: collectionId - }; - this.process.createdon = new Date(); - this.process.createdby = createdby; - this.process.program_id = programId; - this.process.collection_id = collectionId; - this.process.status = 'processing'; - - if (orgId) { - this.process.data.org_id = orgId; - this.process.org_id = orgId; - } - const request = { ...this.process }; - return this.bulkJobService.createBulkJob(request); - } - - async openBulkUploadModal() { - this.bulkUploadState = 0; - this.showBulkUploadModal = true; - this.updateBulkUploadState('increment'); - } - - closeBulkUploadModal() { - this.showBulkUploadModal = false; - this.bulkUploadState = 0; - if (this.uploader) { - this.uploader.reset(); - } - } - - updateBulkUploadState(action) { - if (this.bulkUploadState === 6 && action === 'increment') { - return this.closeBulkUploadModal(); - } - if (this.bulkUploadState === 4 && action === 'decrement') { - this.bulkUploadState = 3; - } - this.bulkUploadState += (action === 'increment') ? 1 : -1; - if (this.bulkUploadState === 2) { - this.initiateDocumentUploadModal(); - } - } - - getParentsHelper(tree: any, id: string, parents: string = '') { - const self = this; - if (tree.identifier === id) { - return { - found: true, - parents - }; - } - let result = { - found: false, - }; - if (tree.children) { - _.forEach(tree.children, (subtree, key) => { - let maybeParents = parents; - if (tree.identifier !== undefined) { - maybeParents = tree.name; - } - const maybeResult: any = self.getParentsHelper(subtree, id, maybeParents); - if (maybeResult.found) { - result = maybeResult; - return false; - } - }); - } - return result; - } - - getParents(data: Array, id: string) { - const tree = { - children: data - }; - return this.getParentsHelper(tree, id); - } - - downloadSampleCSVFile() { - const downloadConfig = { - blobUrl: this.sampleMetadataCsvUrl, - successMessage: false, - fileType: 'csv', - fileName: this.collectionId - }; - window.open(downloadConfig.blobUrl, '_blank'); - } -} diff --git a/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.html b/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.html index 7e0a1f044..b68af0fbb 100644 --- a/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.html +++ b/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.html @@ -39,7 +39,7 @@
- {{data?.name}} +
@@ -64,7 +64,7 @@
- {{data?.name}} +
@@ -109,7 +109,7 @@ (click)="selectVideo(data)">
- {{data?.name}} +
@@ -137,7 +137,7 @@ (click)="selectVideo(data);">
- {{data?.name}} +
@@ -157,7 +157,7 @@ -
{{configService.labelConfig?.lbl?.uploadAndUse}}
@@ -209,11 +209,10 @@
{{configService.labelConfig?.lbl?.copyRightsAndLicense}}
-
diff --git a/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.ts b/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.ts index f473a0abf..1712a46cf 100644 --- a/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.ts +++ b/projects/collection-editor-library/src/lib/components/ckeditor-tool/ckeditor-tool.component.ts @@ -62,7 +62,6 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { public initialFormConfig: any; public imageFormValid = false; public videoFile: any; - public imageFile: any; public termsAndCondition: any; public assetName: any; public emptyImageSearchMessage: any; @@ -176,15 +175,11 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { this.videoDataOutput.emit(false); } dismissImageUploadModal() { - if (this.isClosable) { this.showImageUploadModal = false; } - } initiateImageUploadModal() { this.showImagePicker = false; this.showImageUploadModal = true; - this.loading = false; - this.isClosable = true; } dismissVideoUploadModal() { @@ -372,7 +367,7 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { }); } - addImageInEditor(imageUrl, imageId, imageName) { + addImageInEditor(imageUrl, imageId) { const src = this.getMediaOriginURL(imageUrl); const baseUrl = _.get(this.editorService.editorConfig, 'context.host') || document.location.origin; this.mediaobj = { @@ -384,7 +379,7 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { this.editorInstance.model.change(writer => { const imageElement = writer.createElement('image', { src, - alt: imageName, + alt: imageId, 'data-asset-variable': imageId }); this.editorInstance.model.insertContent(imageElement, this.editorInstance.model.document.selection); @@ -539,7 +534,6 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { * function to upload image */ uploadImage(event) { - this.imageFile = event.target.files[0]; const file = event.target.files[0]; this.assetName = file.name; const reader = new FileReader(); @@ -586,66 +580,21 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { this.formConfig = formvalue; } uploadAndUseImage(modal) { - this.isClosable = false; - this.loading = true; - this.showErrorMsg = false; - this.imageFormValid = false; - this.questionService.createMediaAsset({ asset: this.assestData }).pipe(catchError(err => { + this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => { const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') }; - this.loading = false; - this.isClosable = true; - this.imageFormValid = true; return throwError(this.editorService.apiErrorHandling(err, errInfo)); })).subscribe((res) => { const imgId = res.result.node_id; - const preSignedRequest = { - content: { - fileName: this.assetName - } + const request = { + data: this.formData }; - this.questionService.generatePreSignedUrl(preSignedRequest, imgId).pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.026') }; - this.loading = false; - this.isClosable = true; - this.imageFormValid = true; + this.questionService.uploadMedia(request, imgId).pipe(catchError(err => { + const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') }; return throwError(this.editorService.apiErrorHandling(err, errInfo)); })).subscribe((response) => { - const signedURL = response.result.pre_signed_url; - const blobConfig = { - processData: false, - contentType: 'Asset', - headers: { - 'x-ms-blob-type': 'BlockBlob' - } - }; - this.uploadToBlob(signedURL, this.imageFile, blobConfig).subscribe(() => { - const fileURL = signedURL.split('?')[0]; - const data = new FormData(); - data.append('fileUrl', fileURL); - data.append('mimeType', this.imageFile.type); - const config1 = { - enctype: 'multipart/form-data', - processData: false, - contentType: false, - cache: false - }; - const uploadMediaConfig = { - data, - param: config1 - }; - this.questionService.uploadMedia(uploadMediaConfig, imgId).pipe(catchError(err => { - const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') }; - this.isClosable = true; - this.loading = false; - this.imageFormValid = true; - return throwError(this.editorService.apiErrorHandling(err, errInfo)); - })).subscribe((response1) => { - this.addImageInEditor(response1.result.content_url, response1.result.node_id, this.assestData['name']); - this.dismissPops(modal); - }); - }); + this.addImageInEditor(response.result.content_url, response.result.node_id); + this.dismissPops(modal); }); - }); } openImageUploadModal() { @@ -690,8 +639,6 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { this.formConfig = this.initialFormConfig; this.imageUploadLoader = false; this.imageFormValid = false; - this.loading = false; - this.isClosable = true; } /** * function to upload video @@ -743,7 +690,7 @@ export class CkeditorToolComponent implements OnInit, AfterViewInit, OnChanges { this.showErrorMsg = false; this.imageFormValid = false; if (!this.showErrorMsg) { - this.questionService.createMediaAsset({ asset: this.assestData }).pipe(catchError(err => { + this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => { this.loading = false; this.isClosable = true; this.imageFormValid = true; diff --git a/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.html b/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.html index 0da8c59a8..f403b73db 100644 --- a/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.html +++ b/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.html @@ -1,13 +1,15 @@
{{appIconConfig?.label}}
-
+
{{configService.labelConfig?.lbl?.addAnImage}}
- app icon +
\ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.spec.ts b/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.spec.ts index 520c9a319..255087296 100644 --- a/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/collection-icon/collection-icon.component.spec.ts @@ -18,6 +18,7 @@ describe('CollectionIconComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(CollectionIconComponent); component = fixture.componentInstance; + fixture.detectChanges(); }); it('should create', () => { diff --git a/projects/collection-editor-library/src/lib/components/contentplayer-page/contentplayer-page.component.html b/projects/collection-editor-library/src/lib/components/contentplayer-page/contentplayer-page.component.html index d6051a510..6ae5b8588 100644 --- a/projects/collection-editor-library/src/lib/components/contentplayer-page/contentplayer-page.component.html +++ b/projects/collection-editor-library/src/lib/components/contentplayer-page/contentplayer-page.component.html @@ -1,9 +1,6 @@
- - - + diff --git a/projects/collection-editor-library/src/lib/components/csv-upload/csv-upload.component.scss b/projects/collection-editor-library/src/lib/components/csv-upload/csv-upload.component.scss index 0b722ce29..8b4756e6b 100644 --- a/projects/collection-editor-library/src/lib/components/csv-upload/csv-upload.component.scss +++ b/projects/collection-editor-library/src/lib/components/csv-upload/csv-upload.component.scss @@ -97,17 +97,4 @@ } } } - } -.upload-input-button { - input[type="file"] { - position: absolute; - right: 0px; - top: 0px; - font-size: 118px; - margin: 0px; - padding: 0px; - cursor: pointer; - opacity: 0; - height: 100%; - } -} + } \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/editor/editor.component.html b/projects/collection-editor-library/src/lib/components/editor/editor.component.html index 6cc9acd5d..1626cc86f 100755 --- a/projects/collection-editor-library/src/lib/components/editor/editor.component.html +++ b/projects/collection-editor-library/src/lib/components/editor/editor.component.html @@ -2,7 +2,7 @@
+ [labelConfigData]="toolbarConfig" [buttonLoaders]="buttonLoaders" (toolbarEmitter)="toolbarEventListener($event)">
@@ -13,7 +13,7 @@ @@ -109,7 +105,7 @@ class="font-weight-bold mb-4 d-block">"{{configService.labelConfig?.lbl?.iAgreeSubmit}}
{{configService.labelConfig?.lbl?.iconfirmContent}} {{configService.labelConfig?.lbl?.createCommonFramework}} - {{configService.labelConfig?.lbl?.accordance}} + {{configService.labelConfig?.lbl?.accordance}} {{configService.labelConfig?.lbl?.contentPolicy}} {{configService.labelConfig?.lbl?.privacyRights}}"
@@ -130,7 +126,7 @@ {{configService.labelConfig?.lbl?.questionSetPreview}}
-
+
@@ -140,15 +136,12 @@
- - - - - + + - + diff --git a/projects/collection-editor-library/src/lib/components/editor/editor.component.scss b/projects/collection-editor-library/src/lib/components/editor/editor.component.scss old mode 100644 new mode 100755 index bec7d65be..636773933 --- a/projects/collection-editor-library/src/lib/components/editor/editor.component.scss +++ b/projects/collection-editor-library/src/lib/components/editor/editor.component.scss @@ -1,599 +1,585 @@ -lib-editor { - .fancytree-helper-hidden{display:none}.fancytree-helper-indeterminate-cb{color:#777}.fancytree-helper-disabled{color:silver}.fancytree-helper-spin{-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}ul.fancytree-container{font-family:inherit;font-size:10pt;white-space:nowrap;padding:3px;margin:0;background-color:#fff;border:1px dotted gray;min-height:0;position:relative}ul.fancytree-container ul{padding:0 0 0 16px;margin:0}ul.fancytree-container ul>li:before{content:none}ul.fancytree-container li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}ul.fancytree-container li.fancytree-lastsib{background-image:none}.ui-fancytree-disabled ul.fancytree-container{opacity:.5;background-color:silver}ul.fancytree-connectors.fancytree-container li{background-image:url(../../assets/images/vline.gif);background-position:0 0}ul.fancytree-container li.fancytree-lastsib,ul.fancytree-no-connector>li{background-image:none}li.fancytree-animating{position:relative}#fancytree-drop-marker,span.fancytree-checkbox,span.fancytree-drag-helper-img,span.fancytree-empty,span.fancytree-expander,span.fancytree-icon,span.fancytree-vline{width:16px;height:16px;display:inline-block;vertical-align:top;background-repeat:no-repeat;background-image:url(../../assets/images/icons.gif);background-position:0 0}span.fancytree-checkbox,span.fancytree-custom-icon,span.fancytree-expander,span.fancytree-icon{margin-top:0}span.fancytree-custom-icon{width:16px;height:16px;display:inline-block;margin-left:3px;background-position:0 0}img.fancytree-icon{width:16px;height:16px;margin-left:3px;margin-top:0;vertical-align:top;border-style:none}span.fancytree-expander{cursor:pointer}.fancytree-exp-n span.fancytree-expander,.fancytree-exp-nl span.fancytree-expander{background-image:none;cursor:default}.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-connectors .fancytree-exp-nl span.fancytree-expander{background-image:url(../../assets/images/icons.gif);margin-top:0}.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-connectors .fancytree-exp-n span.fancytree-expander:hover{background-position:0 -64px}.fancytree-connectors .fancytree-exp-nl span.fancytree-expander,.fancytree-connectors .fancytree-exp-nl span.fancytree-expander:hover{background-position:-16px -64px}.fancytree-exp-c span.fancytree-expander{background-position:0 -80px}.fancytree-exp-c span.fancytree-expander:hover{background-position:-16px -80px}.fancytree-exp-cl span.fancytree-expander{background-position:0 -96px}.fancytree-exp-cl span.fancytree-expander:hover{background-position:-16px -96px}.fancytree-exp-cd span.fancytree-expander{background-position:-64px -80px}.fancytree-exp-cd span.fancytree-expander:hover{background-position:-80px -80px}.fancytree-exp-cdl span.fancytree-expander{background-position:-64px -96px}.fancytree-exp-cdl span.fancytree-expander:hover{background-position:-80px -96px}.fancytree-exp-e span.fancytree-expander,.fancytree-exp-ed span.fancytree-expander{background-position:-32px -80px}.fancytree-exp-e span.fancytree-expander:hover,.fancytree-exp-ed span.fancytree-expander:hover{background-position:-48px -80px}.fancytree-exp-edl span.fancytree-expander,.fancytree-exp-el span.fancytree-expander{background-position:-32px -96px}.fancytree-exp-edl span.fancytree-expander:hover,.fancytree-exp-el span.fancytree-expander:hover{background-position:-48px -96px}.fancytree-fade-expander span.fancytree-expander{transition:opacity 1.5s;opacity:0}.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander [class*=fancytree-statusnode-] span.fancytree-expander,.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander:hover span.fancytree-expander{transition:opacity .6s;opacity:1}span.fancytree-checkbox{margin-left:3px;background-position:0 -32px}span.fancytree-checkbox:hover{background-position:-16px -32px}span.fancytree-checkbox.fancytree-radio{background-position:0 -48px}span.fancytree-checkbox.fancytree-radio:hover{background-position:-16px -48px}.fancytree-partsel span.fancytree-checkbox{background-position:-64px -32px}.fancytree-partsel span.fancytree-checkbox:hover{background-position:-80px -32px}.fancytree-partsel span.fancytree-checkbox.fancytree-radio{background-position:-64px -48px}.fancytree-partsel span.fancytree-checkbox.fancytree-radio:hover{background-position:-80px -48px}.fancytree-selected span.fancytree-checkbox{background-position:-32px -32px}.fancytree-selected span.fancytree-checkbox:hover{background-position:-48px -32px}.fancytree-selected span.fancytree-checkbox.fancytree-radio{background-position:-32px -48px}.fancytree-selected span.fancytree-checkbox.fancytree-radio:hover{background-position:-48px -48px}.fancytree-unselectable span.fancytree-checkbox{opacity:.4}.fancytree-unselectable span.fancytree-checkbox:hover{background-position:0 -32px}.fancytree-unselectable span.fancytree-checkbox.fancytree-radio:hover{background-position:0 -48px}.fancytree-unselectable.fancytree-partsel span.fancytree-checkbox:hover{background-position:-64px -32px}.fancytree-unselectable.fancytree-selected span.fancytree-checkbox:hover{background-position:-32px -32px}.fancytree-unselectable.fancytree-selected span.fancytree-checkbox.fancytree-radio:hover{background-position:-32px -48px}.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox{visibility:hidden}.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox{visibility:unset}.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox{visibility:unset}span.fancytree-icon{margin-left:3px;background-position:0 0}.fancytree-ico-c span.fancytree-icon:hover{background-position:-16px 0}.fancytree-has-children.fancytree-ico-c span.fancytree-icon{background-position:-32px 0}.fancytree-has-children.fancytree-ico-c span.fancytree-icon:hover{background-position:-48px 0}.fancytree-ico-e span.fancytree-icon{background-position:-64px 0}.fancytree-ico-e span.fancytree-icon:hover{background-position:-80px 0}.fancytree-ico-cf span.fancytree-icon{background-position:0 -16px}.fancytree-ico-cf span.fancytree-icon:hover{background-position:-16px -16px}.fancytree-has-children.fancytree-ico-cf span.fancytree-icon{background-position:-32px -16px}.fancytree-has-children.fancytree-ico-cf span.fancytree-icon:hover{background-position:-48px -16px}.fancytree-ico-ef span.fancytree-icon{background-position:-64px -16px}.fancytree-ico-ef span.fancytree-icon:hover{background-position:-80px -16px}.fancytree-loading span.fancytree-expander,.fancytree-loading span.fancytree-expander:hover,.fancytree-statusnode-loading span.fancytree-icon,.fancytree-statusnode-loading span.fancytree-icon:hover,span.fancytree-icon.fancytree-icon-loading{background-image:url(../../assets/images/loading.gif);background-position:0 0}.fancytree-statusnode-error span.fancytree-icon,.fancytree-statusnode-error span.fancytree-icon:hover{background-position:0 -112px}span.fancytree-node{display:inherit;width:100%;margin-top:1px;min-height:16px}span.fancytree-title{color:#000;cursor:pointer;display:inline-block;vertical-align:top;min-height:16px;padding:0 3px 0 3px;margin:0 0 0 3px;border:1px solid transparent;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}span.fancytree-node.fancytree-error span.fancytree-title{color:red}span.fancytree-childcounter{color:#fff;background:#337ab7;border:1px solid gray;border-radius:10px;padding:2px;text-align:center}div.fancytree-drag-helper span.fancytree-childcounter,div.fancytree-drag-helper span.fancytree-dnd-modifier{display:inline-block;color:#fff;background:#337ab7;border:1px solid gray;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}div.fancytree-drag-helper span.fancytree-childcounter{position:absolute;top:-6px;right:-6px}div.fancytree-drag-helper span.fancytree-dnd-modifier{background:#5cb85c;border:none;font-weight:bolder}div.fancytree-drag-helper.fancytree-drop-accept span.fancytree-drag-helper-img{background-position:-32px -112px}div.fancytree-drag-helper.fancytree-drop-reject span.fancytree-drag-helper-img{background-position:-16px -112px}#fancytree-drop-marker{width:32px;position:absolute;background-position:0 -128px;margin:0}#fancytree-drop-marker.fancytree-drop-after,#fancytree-drop-marker.fancytree-drop-before{width:64px;background-position:0 -144px}#fancytree-drop-marker.fancytree-drop-copy{background-position:-64px -128px}#fancytree-drop-marker.fancytree-drop-move{background-position:-32px -128px}span.fancytree-drag-source.fancytree-drag-remove{opacity:.15}.fancytree-container.fancytree-rtl span.fancytree-connector,.fancytree-container.fancytree-rtl span.fancytree-drag-helper-img,.fancytree-container.fancytree-rtl span.fancytree-expander,.fancytree-container.fancytree-rtl span.fancytree-icon{background-image:url(../../assets/images/icons-rtl.gif)}.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander{background-image:none}.fancytree-container.fancytree-rtl.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-container.fancytree-rtl.fancytree-connectors .fancytree-exp-nl span.fancytree-expander{background-image:url(../../assets/images/icons-rtl.gif)}ul.fancytree-container.fancytree-rtl ul{padding:0 16px 0 0}ul.fancytree-container.fancytree-rtl.fancytree-connectors li{background-position:right 0;background-image:url(../../assets/images/vline-rtl.gif)}ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,ul.fancytree-container.fancytree-rtl.fancytree-no-connector>li{background-image:none}#fancytree-drop-marker.fancytree-rtl{background-image:url(../../assets/images/icons-rtl.gif)}table.fancytree-ext-table{font-family:inherit;font-size:10pt;border-collapse:collapse}table.fancytree-ext-table span.fancytree-node{display:inline-block;box-sizing:border-box}table.fancytree-ext-table td.fancytree-status-merged{text-align:center;font-style:italic;color:silver}table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged{color:red}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr.fancytree-active>td{background-color:#eee}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr>td.fancytree-active-cell{background-color:#cbe8f6}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode>tbody>tr>td.fancytree-active-cell{background-color:#3875d7}table.fancytree-ext-columnview tbody tr td{position:relative;border:1px solid gray;vertical-align:top;overflow:auto}table.fancytree-ext-columnview tbody tr td>ul{padding:0}table.fancytree-ext-columnview tbody tr td>ul li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}table.fancytree-ext-columnview span.fancytree-node{position:relative;display:inline-block}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#e0e0e0}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#cbe8f6}table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right{position:absolute;right:3px;background-position:0 -80px}table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right:hover{background-position:-16px -80px}.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title{color:#000;font-weight:700}.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide,.fancytree-ext-filter-hide tr.fancytree-hide{display:none}.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander{visibility:hidden}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander{visibility:visible}.fancytree-ext-childcounter span.fancytree-custom-icon,.fancytree-ext-childcounter span.fancytree-icon,.fancytree-ext-filter span.fancytree-custom-icon,.fancytree-ext-filter span.fancytree-icon{position:relative}.fancytree-ext-childcounter span.fancytree-childcounter,.fancytree-ext-filter span.fancytree-childcounter{color:#fff;background:#777;border:1px solid gray;position:absolute;top:-6px;right:-6px;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}ul.fancytree-ext-wide{position:relative;min-width:100%;z-index:2;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}ul.fancytree-ext-wide span.fancytree-node>span{position:relative;z-index:2}ul.fancytree-ext-wide span.fancytree-node span.fancytree-title{position:absolute;z-index:1;left:0;min-width:100%;margin-left:0;margin-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden{display:none}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom{border-bottom:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right{border-right:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl{position:absolute;overflow:hidden;z-index:3;top:0;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr{position:absolute;overflow:hidden;z-index:2;top:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl{position:absolute;overflow:hidden;z-index:2;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br{position:absolute;overflow:scroll;z-index:1}span.fancytree-title{border:1px solid transparent;border-radius:0}span.fancytree-focused span.fancytree-title{outline:1px dotted #000}span.fancytree-active span.fancytree-title,span.fancytree-selected span.fancytree-title{background-color:#d4d4d4}span.fancytree-selected span.fancytree-title{font-style:italic}.fancytree-treefocus span.fancytree-active span.fancytree-title,.fancytree-treefocus span.fancytree-selected span.fancytree-title{color:#fff;background-color:#3875d7}table.fancytree-ext-table{border-collapse:collapse}table.fancytree-ext-table tbody tr.fancytree-focused{background-color:#99defd}table.fancytree-ext-table tbody tr.fancytree-active{background-color:#4169e1}table.fancytree-ext-table tbody tr.fancytree-selected{background-color:#99defd}table.fancytree-ext-columnview tbody tr td{border:1px solid gray}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#ccc}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#4169e1} - .optionsArrayMap, - .optionsLast, - .optionsArray { - color: #000 !important; - } - .dynamic-form { - .required { - .sb-modal-dropdown-web { - label { - &::after { - content: ' ' !important; - } +.fancytree-helper-hidden{display:none}.fancytree-helper-indeterminate-cb{color:#777}.fancytree-helper-disabled{color:silver}.fancytree-helper-spin{-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}ul.fancytree-container{font-family:inherit;font-size:10pt;white-space:nowrap;padding:3px;margin:0;background-color:#fff;border:1px dotted gray;min-height:0;position:relative}ul.fancytree-container ul{padding:0 0 0 16px;margin:0}ul.fancytree-container ul>li:before{content:none}ul.fancytree-container li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}ul.fancytree-container li.fancytree-lastsib{background-image:none}.ui-fancytree-disabled ul.fancytree-container{opacity:.5;background-color:silver}ul.fancytree-connectors.fancytree-container li{background-image:url(../../assets/images/vline.gif);background-position:0 0}ul.fancytree-container li.fancytree-lastsib,ul.fancytree-no-connector>li{background-image:none}li.fancytree-animating{position:relative}#fancytree-drop-marker,span.fancytree-checkbox,span.fancytree-drag-helper-img,span.fancytree-empty,span.fancytree-expander,span.fancytree-icon,span.fancytree-vline{width:16px;height:16px;display:inline-block;vertical-align:top;background-repeat:no-repeat;background-image:url(../../assets/images/icons.gif);background-position:0 0}span.fancytree-checkbox,span.fancytree-custom-icon,span.fancytree-expander,span.fancytree-icon{margin-top:0}span.fancytree-custom-icon{width:16px;height:16px;display:inline-block;margin-left:3px;background-position:0 0}img.fancytree-icon{width:16px;height:16px;margin-left:3px;margin-top:0;vertical-align:top;border-style:none}span.fancytree-expander{cursor:pointer}.fancytree-exp-n span.fancytree-expander,.fancytree-exp-nl span.fancytree-expander{background-image:none;cursor:default}.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-connectors .fancytree-exp-nl span.fancytree-expander{background-image:url(../../assets/images/icons.gif);margin-top:0}.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-connectors .fancytree-exp-n span.fancytree-expander:hover{background-position:0 -64px}.fancytree-connectors .fancytree-exp-nl span.fancytree-expander,.fancytree-connectors .fancytree-exp-nl span.fancytree-expander:hover{background-position:-16px -64px}.fancytree-exp-c span.fancytree-expander{background-position:0 -80px}.fancytree-exp-c span.fancytree-expander:hover{background-position:-16px -80px}.fancytree-exp-cl span.fancytree-expander{background-position:0 -96px}.fancytree-exp-cl span.fancytree-expander:hover{background-position:-16px -96px}.fancytree-exp-cd span.fancytree-expander{background-position:-64px -80px}.fancytree-exp-cd span.fancytree-expander:hover{background-position:-80px -80px}.fancytree-exp-cdl span.fancytree-expander{background-position:-64px -96px}.fancytree-exp-cdl span.fancytree-expander:hover{background-position:-80px -96px}.fancytree-exp-e span.fancytree-expander,.fancytree-exp-ed span.fancytree-expander{background-position:-32px -80px}.fancytree-exp-e span.fancytree-expander:hover,.fancytree-exp-ed span.fancytree-expander:hover{background-position:-48px -80px}.fancytree-exp-edl span.fancytree-expander,.fancytree-exp-el span.fancytree-expander{background-position:-32px -96px}.fancytree-exp-edl span.fancytree-expander:hover,.fancytree-exp-el span.fancytree-expander:hover{background-position:-48px -96px}.fancytree-fade-expander span.fancytree-expander{transition:opacity 1.5s;opacity:0}.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander [class*=fancytree-statusnode-] span.fancytree-expander,.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander:hover span.fancytree-expander{transition:opacity .6s;opacity:1}span.fancytree-checkbox{margin-left:3px;background-position:0 -32px}span.fancytree-checkbox:hover{background-position:-16px -32px}span.fancytree-checkbox.fancytree-radio{background-position:0 -48px}span.fancytree-checkbox.fancytree-radio:hover{background-position:-16px -48px}.fancytree-partsel span.fancytree-checkbox{background-position:-64px -32px}.fancytree-partsel span.fancytree-checkbox:hover{background-position:-80px -32px}.fancytree-partsel span.fancytree-checkbox.fancytree-radio{background-position:-64px -48px}.fancytree-partsel span.fancytree-checkbox.fancytree-radio:hover{background-position:-80px -48px}.fancytree-selected span.fancytree-checkbox{background-position:-32px -32px}.fancytree-selected span.fancytree-checkbox:hover{background-position:-48px -32px}.fancytree-selected span.fancytree-checkbox.fancytree-radio{background-position:-32px -48px}.fancytree-selected span.fancytree-checkbox.fancytree-radio:hover{background-position:-48px -48px}.fancytree-unselectable span.fancytree-checkbox{opacity:.4}.fancytree-unselectable span.fancytree-checkbox:hover{background-position:0 -32px}.fancytree-unselectable span.fancytree-checkbox.fancytree-radio:hover{background-position:0 -48px}.fancytree-unselectable.fancytree-partsel span.fancytree-checkbox:hover{background-position:-64px -32px}.fancytree-unselectable.fancytree-selected span.fancytree-checkbox:hover{background-position:-32px -32px}.fancytree-unselectable.fancytree-selected span.fancytree-checkbox.fancytree-radio:hover{background-position:-32px -48px}.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox{visibility:hidden}.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox{visibility:unset}.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox{visibility:unset}span.fancytree-icon{margin-left:3px;background-position:0 0}.fancytree-ico-c span.fancytree-icon:hover{background-position:-16px 0}.fancytree-has-children.fancytree-ico-c span.fancytree-icon{background-position:-32px 0}.fancytree-has-children.fancytree-ico-c span.fancytree-icon:hover{background-position:-48px 0}.fancytree-ico-e span.fancytree-icon{background-position:-64px 0}.fancytree-ico-e span.fancytree-icon:hover{background-position:-80px 0}.fancytree-ico-cf span.fancytree-icon{background-position:0 -16px}.fancytree-ico-cf span.fancytree-icon:hover{background-position:-16px -16px}.fancytree-has-children.fancytree-ico-cf span.fancytree-icon{background-position:-32px -16px}.fancytree-has-children.fancytree-ico-cf span.fancytree-icon:hover{background-position:-48px -16px}.fancytree-ico-ef span.fancytree-icon{background-position:-64px -16px}.fancytree-ico-ef span.fancytree-icon:hover{background-position:-80px -16px}.fancytree-loading span.fancytree-expander,.fancytree-loading span.fancytree-expander:hover,.fancytree-statusnode-loading span.fancytree-icon,.fancytree-statusnode-loading span.fancytree-icon:hover,span.fancytree-icon.fancytree-icon-loading{background-image:url(../../assets/images/loading.gif);background-position:0 0}.fancytree-statusnode-error span.fancytree-icon,.fancytree-statusnode-error span.fancytree-icon:hover{background-position:0 -112px}span.fancytree-node{display:inherit;width:100%;margin-top:1px;min-height:16px}span.fancytree-title{color:#000;cursor:pointer;display:inline-block;vertical-align:top;min-height:16px;padding:0 3px 0 3px;margin:0 0 0 3px;border:1px solid transparent;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}span.fancytree-node.fancytree-error span.fancytree-title{color:red}span.fancytree-childcounter{color:#fff;background:#337ab7;border:1px solid gray;border-radius:10px;padding:2px;text-align:center}div.fancytree-drag-helper span.fancytree-childcounter,div.fancytree-drag-helper span.fancytree-dnd-modifier{display:inline-block;color:#fff;background:#337ab7;border:1px solid gray;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}div.fancytree-drag-helper span.fancytree-childcounter{position:absolute;top:-6px;right:-6px}div.fancytree-drag-helper span.fancytree-dnd-modifier{background:#5cb85c;border:none;font-weight:bolder}div.fancytree-drag-helper.fancytree-drop-accept span.fancytree-drag-helper-img{background-position:-32px -112px}div.fancytree-drag-helper.fancytree-drop-reject span.fancytree-drag-helper-img{background-position:-16px -112px}#fancytree-drop-marker{width:32px;position:absolute;background-position:0 -128px;margin:0}#fancytree-drop-marker.fancytree-drop-after,#fancytree-drop-marker.fancytree-drop-before{width:64px;background-position:0 -144px}#fancytree-drop-marker.fancytree-drop-copy{background-position:-64px -128px}#fancytree-drop-marker.fancytree-drop-move{background-position:-32px -128px}span.fancytree-drag-source.fancytree-drag-remove{opacity:.15}.fancytree-container.fancytree-rtl span.fancytree-connector,.fancytree-container.fancytree-rtl span.fancytree-drag-helper-img,.fancytree-container.fancytree-rtl span.fancytree-expander,.fancytree-container.fancytree-rtl span.fancytree-icon{background-image:url(../../assets/images/icons-rtl.gif)}.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander{background-image:none}.fancytree-container.fancytree-rtl.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-container.fancytree-rtl.fancytree-connectors .fancytree-exp-nl span.fancytree-expander{background-image:url(../../assets/images/icons-rtl.gif)}ul.fancytree-container.fancytree-rtl ul{padding:0 16px 0 0}ul.fancytree-container.fancytree-rtl.fancytree-connectors li{background-position:right 0;background-image:url(../../assets/images/vline-rtl.gif)}ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,ul.fancytree-container.fancytree-rtl.fancytree-no-connector>li{background-image:none}#fancytree-drop-marker.fancytree-rtl{background-image:url(../../assets/images/icons-rtl.gif)}table.fancytree-ext-table{font-family:inherit;font-size:10pt;border-collapse:collapse}table.fancytree-ext-table span.fancytree-node{display:inline-block;box-sizing:border-box}table.fancytree-ext-table td.fancytree-status-merged{text-align:center;font-style:italic;color:silver}table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged{color:red}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr.fancytree-active>td{background-color:#eee}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr>td.fancytree-active-cell{background-color:#cbe8f6}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode>tbody>tr>td.fancytree-active-cell{background-color:#3875d7}table.fancytree-ext-columnview tbody tr td{position:relative;border:1px solid gray;vertical-align:top;overflow:auto}table.fancytree-ext-columnview tbody tr td>ul{padding:0}table.fancytree-ext-columnview tbody tr td>ul li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}table.fancytree-ext-columnview span.fancytree-node{position:relative;display:inline-block}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#e0e0e0}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#cbe8f6}table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right{position:absolute;right:3px;background-position:0 -80px}table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right:hover{background-position:-16px -80px}.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title{color:#000;font-weight:700}.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide,.fancytree-ext-filter-hide tr.fancytree-hide{display:none}.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander{visibility:hidden}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander{visibility:visible}.fancytree-ext-childcounter span.fancytree-custom-icon,.fancytree-ext-childcounter span.fancytree-icon,.fancytree-ext-filter span.fancytree-custom-icon,.fancytree-ext-filter span.fancytree-icon{position:relative}.fancytree-ext-childcounter span.fancytree-childcounter,.fancytree-ext-filter span.fancytree-childcounter{color:#fff;background:#777;border:1px solid gray;position:absolute;top:-6px;right:-6px;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}ul.fancytree-ext-wide{position:relative;min-width:100%;z-index:2;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}ul.fancytree-ext-wide span.fancytree-node>span{position:relative;z-index:2}ul.fancytree-ext-wide span.fancytree-node span.fancytree-title{position:absolute;z-index:1;left:0;min-width:100%;margin-left:0;margin-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden{display:none}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom{border-bottom:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right{border-right:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl{position:absolute;overflow:hidden;z-index:3;top:0;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr{position:absolute;overflow:hidden;z-index:2;top:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl{position:absolute;overflow:hidden;z-index:2;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br{position:absolute;overflow:scroll;z-index:1}span.fancytree-title{border:1px solid transparent;border-radius:0}span.fancytree-focused span.fancytree-title{outline:1px dotted #000}span.fancytree-active span.fancytree-title,span.fancytree-selected span.fancytree-title{background-color:#d4d4d4}span.fancytree-selected span.fancytree-title{font-style:italic}.fancytree-treefocus span.fancytree-active span.fancytree-title,.fancytree-treefocus span.fancytree-selected span.fancytree-title{color:#fff;background-color:#3875d7}table.fancytree-ext-table{border-collapse:collapse}table.fancytree-ext-table tbody tr.fancytree-focused{background-color:#99defd}table.fancytree-ext-table tbody tr.fancytree-active{background-color:#4169e1}table.fancytree-ext-table tbody tr.fancytree-selected{background-color:#99defd}table.fancytree-ext-columnview tbody tr td{border:1px solid gray}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#ccc}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#4169e1} +.optionsArrayMap, +.optionsLast, +.optionsArray { + color: #000 !important; +} + +.dynamic-form { + .required { + .sb-modal-dropdown-web { + label { + &::after { + content: ' ' !important; } } } - sb-dynamic-checkbox { - margin-top: 3.5rem; - } - .sb-dropdown-select { - padding: 16px 8px !important; - } - .list-border { - margin-top: 2px !important; - } } - body { - background: #fff !important; + sb-dynamic-checkbox { + margin-top: 3.5rem; + } + .sb-dropdown-select { + padding: 16px 8px !important; } - .add-to-library { + .list-border { + margin-top: 2px !important; + } +} +body { + background: #fff !important; +} +.add-to-library { + position: relative; + z-index: 999 !important; + background: #e5edf5; + .sb-required { + color: #ff4558; + padding-left: 2px; position: relative; - z-index: 998 !important; - background: #e5edf5; - .sb-required { - color: #ff4558; - padding-left: 2px; - position: relative; - top: -5px; + top: -5px; + } + .back-btn { + &:hover { + background: none !important; } - .back-btn { - &:hover { - background: none !important; + } + .back-btn { + min-width: auto; + } + .dynamic-form { + .multi-select-section-app { + label { + margin-bottom: 0.3rem !important; + z-index: inherit; } } - .back-btn { - min-width: auto; + } + .dynamic-form { + label { + font-size: 12px !important; + margin-bottom: 0.5rem !important; + color: #121213e0; + font-weight: 600; } - .dynamic-form { - .multi-select-section-app { - label { - margin-bottom: 0.3rem !important; - z-index: inherit; - } - } + + .sb-textbox, + select, + .sb-textarea, + .list-border { + border: 1px solid rgba(34, 36, 38, 0.15) !important; + padding: 0.85rem 0.5rem !important; + border-radius: 0.28571429rem; + font-size: 0.785rem !important; + font-weight: 500; + // text-transform: capitalize; + } + select { + padding: 12px 8px !important; + } + .list-border { + margin-top: 14px !important; + min-height: 43px !important; + height: inherit !important; + padding: 5px 8px !important; } - .dynamic-form { - label { - font-size: 12px !important; - margin-bottom: 0.5rem !important; - color: #121213e0; - font-weight: 600; - } - .sb-textbox, - select, - .sb-textarea, - .list-border { - border: 1px solid rgba(34, 36, 38, 0.15) !important; - padding: 0.85rem 0.5rem !important; - border-radius: 0.28571429rem; - font-size: 0.785rem !important; - font-weight: 500; - // text-transform: capitalize; - } - select { - padding: 12px 8px !important; - } + .multi-select-container { .list-border { - margin-top: 2px !important; - min-height: 43px !important; - height: inherit !important; - padding: 5px 8px !important; - } - - .multi-select-container { - .list-border { - .placeholder { - font-weight: 500 !important; - color: #333 !important; - } - ul { - @extend label; - color: #333; - padding: 0; - margin: 0 !important; - opacity: 1 !important; - font-weight: 500 !important; - position: inherit !important; - } + .placeholder { + font-weight: 500 !important; + color: #333 !important; } - } - - .sb-modal-dropdown-web { ul { + @extend label; color: #333; padding: 0; margin: 0 !important; opacity: 1 !important; - font-size: 12px !important; - font-weight: 500; - border: 2px solid #eeeeef; - z-index: 99999 !important; + font-weight: 500 !important; + position: inherit !important; } } - .sb-keywordbox { - border: 1px solid rgba(34, 36, 38, 0.15) !important; - padding: 0.45rem 0.5rem !important; - border-radius: 0.28571429rem; - font-size: 0.785rem !important; + } + + .sb-modal-dropdown-web { + ul { + color: #333; + padding: 0; + margin: 0 !important; + opacity: 1 !important; + font-size: 12px !important; font-weight: 500; - padding: 0 !important; - .ng2-tag-input { - padding: 0; - tag { - margin-left: 0.5rem; - } - } - .ng2-tags-container { - margin-top: 0.2rem; - } - .tag-wrapper, - delete-icon svg { - height: 24px; - line-height: 24px; - } + border: 2px solid #eeeeef; + z-index: 99999 !important; } - .topic-picker-selector { - @extend .sb-textbox; - } - .sb-dropdown { - label { - padding: 0; - } - } - .textbox { - .sb-textarea-container { - .sb-textarea { - height: 10rem !important; - padding-top: 0.5rem !important; - } - label { - padding: 0; - } - } - } - - .sb-textarea-container { - .sb-textarea { - height: 2.9rem; - padding-top: 0.5rem !important; - } - label { - padding: 0; + } + .sb-keywordbox { + border: 1px solid rgba(34, 36, 38, 0.15) !important; + padding: 0.45rem 0.5rem !important; + border-radius: 0.28571429rem; + font-size: 0.785rem !important; + font-weight: 500; + padding: 0 !important; + .ng2-tag-input { + padding: 0; + tag { + margin-left: 0.5rem; } } - - .sb-checkbox { - padding: 0; - margin-top: 0; + .ng2-tags-container { + margin-top: 0.2rem; } - sb-icon-dropdown { - top: 10px !important; - right: 6px !important; + .tag-wrapper, + delete-icon svg { + height: 24px; + line-height: 24px; } } - .sb-textarea-container, + .topic-picker-selector { + @extend .sb-textbox; + } .sb-dropdown { - margin: 1rem 0 !important; + label { + padding: 0; + } } - .sb-container { - width: 95% !important; + .sb-textarea-container { + .sb-textarea { + height: 2.9rem; + padding-top: 0.5rem !important; + } + label { + padding: 0; + } } - } - .sb-checkbox-tnc { - .sb-required { - position: absolute; - padding-left: 0; - left: 18px; + .sb-checkbox { + padding: 0; + margin-top: 0; } - } - - .h-100vh { - height: 100vh; - } - .ui.column.grid > [class*='eight wide'].column { - width: 73% !important; - } - .footer-fix { - padding-bottom: 1rem !important; - } - .bg-white, - .ui.twelve.grid { - background: #fff !important; - } - - @keyframes spinner-border { - to { - transform: rotate(360deg); + sb-icon-dropdown { + top: 10px !important; + right: 6px !important; } } - .sb-loading-spinner { - width: 1rem; - height: 1rem; - margin-right: 8px; - border-width: 0.2em; - display: inline-block; - vertical-align: text-bottom; - border: 0.15em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border 0.75s linear infinite; - animation: spinner-border 0.75s linear infinite; + .sb-textarea-container, + .sb-dropdown { + margin: 1rem 0 !important; } - .sb-btn-loading:before { - position: absolute; - content: ''; - top: 50%; - left: 50%; - margin: -0.64285714em 0 0 -0.64285714em; - width: 1.28571429em; - height: 1.28571429em; - border-radius: 500rem; - border: 0.2em solid rgba(0, 0, 0, 0.15); + .sb-container { + width: 95% !important; } - .sb-btn-loading:after { +} +.sb-checkbox-tnc { + .sb-required { position: absolute; - content: ''; - top: 50%; - left: 50%; - margin: -0.64285714em 0 0 -0.64285714em; - width: 1.28571429em; - height: 1.28571429em; - -webkit-animation: button-spin 0.6s linear; - animation: button-spin 0.6s linear; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; - border-radius: 500rem; - border-color: #fff transparent transparent; - border-style: solid; - border-width: 0.2em; - -webkit-box-shadow: 0 0 0 1px transparent; - box-shadow: 0 0 0 1px transparent; - } - .sb-btn-outline-disabled { - background-color: #ffffff; - border: 1px solid #cccccc; - color: #999999; - cursor: default; - font-weight: 400; + padding-left: 0; + left: 18px; } +} - lib-chat-window, - .chat_bot { - display: none !important; - } - .sb-textbox::-webkit-input-placeholder { - color: var(--gray-100) !important; - font-weight: 600 !important; - } - .treepicker-parent { - margin: 0.6rem 0 !important; +.h-100vh { + height: 100vh; +} +.ui.column.grid > [class*='eight wide'].column { + width: 73% !important; +} +.footer-fix { + padding-bottom: 1rem !important; +} +.bg-white, +.ui.twelve.grid { + background: #fff !important; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); } - .ck-content ul { - list-style-type: disc !important; - li { - margin-bottom: 0px !important; - } +} +.sb-loading-spinner { + width: 1rem; + height: 1rem; + margin-right: 8px; + border-width: 0.2em; + display: inline-block; + vertical-align: text-bottom; + border: 0.15em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border 0.75s linear infinite; + animation: spinner-border 0.75s linear infinite; +} +.sb-btn-loading:before { + position: absolute; + content: ''; + top: 50%; + left: 50%; + margin: -0.64285714em 0 0 -0.64285714em; + width: 1.28571429em; + height: 1.28571429em; + border-radius: 500rem; + border: 0.2em solid rgba(0, 0, 0, 0.15); +} +.sb-btn-loading:after { + position: absolute; + content: ''; + top: 50%; + left: 50%; + margin: -0.64285714em 0 0 -0.64285714em; + width: 1.28571429em; + height: 1.28571429em; + -webkit-animation: button-spin 0.6s linear; + animation: button-spin 0.6s linear; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + border-radius: 500rem; + border-color: #fff transparent transparent; + border-style: solid; + border-width: 0.2em; + -webkit-box-shadow: 0 0 0 1px transparent; + box-shadow: 0 0 0 1px transparent; +} +.sb-btn-outline-disabled { + background-color: #ffffff; + border: 1px solid #cccccc; + color: #999999; + cursor: default; + font-weight: 400; +} + +lib-chat-window, +.chat_bot { + display: none !important; +} +.sb-textbox::-webkit-input-placeholder { + color: var(--gray-100) !important; + font-weight: 600 !important; +} +.treepicker-parent { + margin: 0.6rem 0 !important; +} +.ck-content ul { + list-style-type: disc !important; + li { + margin-bottom: 0px !important; } - sb-dynamic-richtext +} +sb-dynamic-richtext .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar { - border-left: 1px solid #c4c4c4 !important; - border-right: 1px solid #c4c4c4 !important; - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; - border-bottom: 0 !important; - } - sb-dynamic-richtext + border-left: 1px solid #c4c4c4 !important; + border-right: 1px solid #c4c4c4 !important; + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; + border-bottom: 0 !important; +} +sb-dynamic-richtext .ck-rounded-corners .ck.ck-editor__main > .ck-editor__editable, - sb-dynamic-richtext +sb-dynamic-richtext .ck.ck-editor__main > .ck-editor__editable.ck-rounded-corners { - border: 1px solid #c4c4c4 !important; - border-color: var(--ck-color-base-border) !important; - } + border: 1px solid #c4c4c4 !important; + border-color: var(--ck-color-base-border) !important; +} - sb-dynamic-richtext .ck-content .table { - margin: 0.8rem 0 !important; - } +sb-dynamic-richtext .ck-content .table { + margin: 0.8rem 0 !important; +} - .sb-textbox, - .sb-textarea { - &::placeholder { - color: #333 !important; - font-weight: 500 !important; - } +.sb-textbox, +.sb-textarea { + &::placeholder { + color: #333 !important; + font-weight: 500 !important; } +} - .multi-select-container { - .sb-modal-dropdown-web { - ul { - border: 1px solid #d6d4d4 !important; - box-shadow: 0 0 2px #cecaca !important; - } +.multi-select-container { + .sb-modal-dropdown-web { + ul { + border: 1px solid #d6d4d4 !important; + box-shadow: 0 0 2px #cecaca !important; } } +} - .sb-disabled-textarea { - background: var(--gray-0) !important; - border: 0.0625rem solid var(--gray-100) !important; - opacity: 0.45 !important; - pointer-events: none !important; - font-size: 1em !important; - } +.sb-disabled-textarea { + background: var(--gray-0) !important; + border: 0.0625rem solid var(--gray-100) !important; + opacity: 0.45 !important; + pointer-events: none !important; + font-size: 1em !important; +} - .overflow-y { - overflow-y: auto; - } +.overflow-y { + overflow-y: auto; +} +input:focus-visible { + border: none !important; +} + +.dialcodeModal { input:focus-visible { - border: none !important; + border: .0625rem solid #999999 !important; } - - .dialcodeModal { - input:focus-visible { - border: .0625rem solid #999999 !important; - } +} +// Fancy tree css +#fancytree-drop-marker.fa-long-arrow-right:before{ + content: " " !important; +} +.sb-collectionTree-fancyTreelist { + ul> li> span:first-child{ + padding: 15px 33px; } - // Fancy tree css - #fancytree-drop-marker.fa-long-arrow-right:before{ - content: " " !important; + .fancytree-exp-n span.fancytree-expander,.fancytree-exp-nl span.fancytree-expander{ + background: none !important; } - .sb-collectionTree-fancyTreelist { - ul> li> span:first-child{ - padding: 15px 33px; - } - .fancytree-exp-n span.fancytree-expander,.fancytree-exp-nl span.fancytree-expander{ - background: none !important; - } - .ui-fancytree:before, .ui-fancytree ul:before{ - content: none !important; - } - .ui-fancytree li:before, .ui-fancytree ul li:before{ - content: none !important; - } - .ui-fancytree li .fancytree-custom-icon::before { - color: var(--primary-color)!important; - margin-left: 5px; - } - .ui-fancytree .fancytree-folder .fancytree-title { - color: var(--primary-color)!important; - font-size: .9286rem!important; - font-weight: 700!important; - padding-left: 5px; - width: inherit!important; - } - .ui-fancytree .fa-caret-right, .ui-fancytree .fa-caret-down, .ui-fancytree ul .fa-caret-right, .ui-fancytree ul .fa-caret-down{ - display: block !important; - } - - ul.fancytree-container{ - font-size: inherit !important; - font-family: inherit !important; - border: none !important; - } - ul.fancytree-connectors.fancytree-container li{ - background-image: none !important; - } - span.fancytree-node{ - width: inherit !important; - } - span.fancytree-active span.fancytree-title, span.fancytree-selected span.fancytree-title{ - background: none !important; - } - .fancytree-treefocus span.fancytree-active span.fancytree-title, .fancytree-treefocus span.fancytree-selected span.fancytree-title{ - background: none !important; - } - .fancytree-exp-edl span.fancytree-expander, .fancytree-exp-el span.fancytree-expander{ - background-position: -34px -94px; - } - span.fancytree-focused span.fancytree-title{ - outline: 0 !important; - } - .ui-fancytree{ - margin:0 !important; - } - &.ui-fancytree, .ui-fancytree ul{ - margin: 0 0 0 0.625rem !important; - } - .fancytree-exp-e span.fancytree-expander, .fancytree-exp-ed span.fancytree-expander{ - background-position: -32px -68px !important; - } - .fancytree-exp-edl span.fancytree-expander, .fancytree-exp-el span.fancytree-expander{ - background-position: -34px -94px !important; - } - .fancytree-treefocus span.fancytree-active span.fancytree-title,.fancytree-treefocus span.fancytree-selected span.fancytree-title{ - color:inherit; - } + .ui-fancytree:before, .ui-fancytree ul:before{ + content: none !important; } - .sb-loader { - position: fixed; - top: 0%; - left: 23%; - transform: translate(-50%, -50%); - &:after { - content: ''; - width: 32px; - height: 32px; - border-radius: 50%; - border: 2px solid; - border-color: #ccc #ccc transparent; - animation: loader 0.5s infinite; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - &.dimmer { - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.8); - z-index: 9999; - } + .ui-fancytree li:before, .ui-fancytree ul li:before{ + content: none !important; } - @keyframes loader { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } + .ui-fancytree li .fancytree-custom-icon::before { + color: var(--primary-color)!important; + margin-left: 5px; } - .sb-success-loader { - position: absolute !important; - top: 46% !important; - left: -12% !important; - transform: translate(-46%, -50%) !important; - &:after { - width: 1.2rem !important; - height: 1.2rem !important; - } + .ui-fancytree .fancytree-folder .fancytree-title { + color: var(--primary-color)!important; + font-size: .9286rem!important; + font-weight: 700!important; + padding-left: 5px; + width: inherit!important; } - .pos-relative { - position: relative; + .ui-fancytree .fa-caret-right, .ui-fancytree .fa-caret-down, .ui-fancytree ul .fa-caret-right, .ui-fancytree ul .fa-caret-down{ + display: block !important; } - .sb-circle-ul { - list-style-type: disc; - padding: 0; - font-size: 0.785rem; - li { - margin: 0 !important; - line-height: 1.4; - } + ul.fancytree-container{ + font-size: inherit !important; + font-family: inherit !important; + border: none !important; } - .sb-bg-color-success-0 { - background: #e1ffdf; + ul.fancytree-connectors.fancytree-container li{ + background-image: none !important; } - .flex-ai-center { - align-self: center !important; + span.fancytree-node{ + width: inherit !important; } - .sb-br-primary { - border: 1px dashed #aedbfd !important; + span.fancytree-active span.fancytree-title, span.fancytree-selected span.fancytree-title{ + background: none !important; } - - .sb-min-h-250 { - min-height: 250px; + .fancytree-treefocus span.fancytree-active span.fancytree-title, .fancytree-treefocus span.fancytree-selected span.fancytree-title{ + background: none !important; } - .z-index-9 { - .menu { - z-index: 99999 !important; - } + .fancytree-exp-edl span.fancytree-expander, .fancytree-exp-el span.fancytree-expander{ + background-position: -34px -94px; } - .p-50 { - padding: 10px 0 10px 50px; + span.fancytree-focused span.fancytree-title{ + outline: 0 !important; } - .h-1 { - height: 1.1em !important; + .ui-fancytree{ + margin:0 !important; } - .mn-15 { - margin: -15px !important; + &.ui-fancytree, .ui-fancytree ul{ + margin: 0 0 0 0.625rem !important; } - .upload-input-button { - position: relative; + .fancytree-exp-e span.fancytree-expander, .fancytree-exp-ed span.fancytree-expander{ + background-position: -32px -68px !important; } - .upload-input-button input { + .fancytree-exp-edl span.fancytree-expander, .fancytree-exp-el span.fancytree-expander{ + background-position: -34px -94px !important; + } + .fancytree-treefocus span.fancytree-active span.fancytree-title,.fancytree-treefocus span.fancytree-selected span.fancytree-title{ + color:inherit; + } +} +.sb-loader { + position: fixed; + top: 0%; + left: 23%; + transform: translate(-50%, -50%); + &:after { + content: ''; + width: 32px; + height: 32px; + border-radius: 50%; + border: 2px solid; + border-color: #ccc #ccc transparent; + animation: loader 0.5s infinite; position: absolute; - opacity: 0; - left: 0; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } - .bg-none { - background: none; + &.dimmer { + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.8); + z-index: 9999; } - .label-disable { - opacity: 0.3 !important; - font-weight: 500 !important; +} +@keyframes loader { + 0% { + transform: rotate(0deg); } - .sb-folder-menu { - position: absolute; - /*top: 131px;*/ - left: 35px; - display: flex; - justify-content: space-between; - width: 24%; - margin-top: 5px; - } - .sb-disable-icon{color:#ccc !important;} - .sb-w-240px{width:240px} - .showCollaborator{ - .ui.dimmer{ - overflow-y: unset !important; - } - .ui.segment{ - max-height: calc(80vh - 8em) !important; - overflow-y: auto !important; - } - .sb-modal-content{ - .flex-align-item-center{ - border-bottom: solid 1px #ccc; - margin: 0px -16px; - padding: 0 20px; - } - } - .ui.pointing{ - margin: 0 -15px !important; - .item{ - &.active{ - font-weight: 600 !important; - } + 100% { + transform: rotate(360deg); + } +} +.sb-success-loader { + position: absolute !important; + top: 46% !important; + left: -12% !important; + transform: translate(-46%, -50%) !important; + &:after { + width: 1.2rem !important; + height: 1.2rem !important; + } +} +.pos-relative { + position: relative; +} + +.sb-circle-ul { + list-style-type: disc; + padding: 0; + font-size: 0.785rem; + li { + margin: 0 !important; + line-height: 1.4; + } +} +.sb-bg-color-success-0 { + background: #e1ffdf; +} +.flex-ai-center { + align-self: center !important; +} +.sb-br-primary { + border: 1px dashed #aedbfd !important; +} + +.sb-min-h-250 { + min-height: 250px; +} +.z-index-9 { + .menu { + z-index: 99999 !important; + } +} +.p-50 { + padding: 10px 0 10px 50px; +} +.h-1 { + height: 1.1em !important; +} +.mn-15 { + margin: -15px !important; +} +.upload-input-button { + position: relative; +} +.upload-input-button input { + position: absolute; + opacity: 0; + left: 0; +} +.bg-none { + background: none; +} +.label-disable { + opacity: 0.3 !important; + font-weight: 500 !important; +} +.sb-folder-menu { + position: absolute; + /*top: 131px;*/ + left: 35px; + display: flex; + justify-content: space-between; + width: 24%; + margin-top: 5px; +} +.sb-disable-icon{color:#ccc !important;} +.sb-w-240px{width:240px} +.showCollaborator{ + .ui.dimmer{ + overflow-y: unset !important; + } + .ui.segment{ + max-height: calc(80vh - 8em) !important; + overflow-y: auto !important; + } + .sb-modal-content{ + .flex-align-item-center{ + border-bottom: solid 1px #ccc; + margin: 0px -16px; + padding: 0 20px; + } + } + .ui.pointing{ + margin: 0 -15px !important; + .item{ + &.active{ + font-weight: 600 !important; } } } - .publish-checklist{ - label { +} +.publish-checklist{ + label { font-size: 13px !important; padding: 0 1.5rem !important; - } } - .sb-keywords{ - input{ - width: 100%; - } - input::placeholder{ - display: block !important; - width: 100%; - } - .ng2-tags-container{ - width: inherit !important; - display: block !important; - tag{ - display: inline-flex !important; - } +} +.sb-keywords{ + input{ + width: 100%; + } + input::placeholder{ + display: block !important; + width: 100%; + } + .ng2-tags-container{ + width: inherit !important; + display: block !important; + tag{ + display: inline-flex !important; } } - .sb-dialcode { - border-bottom: 0.5px solid #333333; - padding: 8px 5px !important; +} +.sb-dialcode { + border-bottom: 0.5px solid #333333; + padding: 8px 5px !important; + border-radius: 0 !important; + &:focus-visible{ + border-bottom: 0.5px solid #333333 !important; border-radius: 0 !important; + outline: 0 !important; + } +} +sb-dynamic-timer{ + .sb-timer-input{ + width: 10rem; + font-size: .785rem!important; + border: 1px solid rgba(34,36,38,.15)!important; + border-radius: .28571429rem; + padding: 12px 10px; + margin-right: 5px; + height: 44px; &:focus-visible{ - border-bottom: 0.5px solid #333333 !important; - border-radius: 0 !important; - outline: 0 !important; + border: 1px solid rgba(34,36,38,.15)!important; } } - sb-dynamic-timer{ - .sb-timer-input{ - width: 10rem; - font-size: .785rem!important; - border: 1px solid rgba(34,36,38,.15)!important; - border-radius: .28571429rem; - padding: 12px 10px; - margin-right: 5px; - height: 44px; - &:focus-visible{ - border: 1px solid rgba(34,36,38,.15)!important; - } - } - .sb-btn-normal{ - height: 42px !important; - } + .sb-btn-normal{ + height: 42px !important; } -} +} \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/editor/editor.component.spec.data.ts b/projects/collection-editor-library/src/lib/components/editor/editor.component.spec.data.ts index 8f44058fe..f77560af8 100644 --- a/projects/collection-editor-library/src/lib/components/editor/editor.component.spec.data.ts +++ b/projects/collection-editor-library/src/lib/components/editor/editor.component.spec.data.ts @@ -1,334 +1,136 @@ -import { IEditorConfig } from "collection-editor-library/lib/interfaces/editor"; +import { IEditorConfig } from 'collection-editor-library/lib/interfaces/editor'; export let editorConfig: IEditorConfig | undefined; -export let editorConfig_question: IEditorConfig | undefined; - editorConfig = { context: { - framework: "test", + framework: 'test', user: { - id: "5a587cc1-e018-4859-a0a8-e842650b9d64", - name: "Vaibhav", - orgIds: ["01309282781705830427"], + id: '5a587cc1-e018-4859-a0a8-e842650b9d64', + name: 'Vaibhav', + orgIds: [ + '01309282781705830427' + ] }, - identifier: "do_113274017771085824116", - unitIdentifier: "do_113274017771085824119", - collectionObjectType: "", - channel: "01307938306521497658", - authToken: " ", - sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", - did: "7e85b4967aebd6704ba1f604f20056b6", - uid: "bf020396-0d7b-436f-ae9f-869c6780fc45", + identifier: 'do_113274017771085824116', + channel: '01307938306521497658', + authToken: ' ', + sid: 'iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV', + did: '7e85b4967aebd6704ba1f604f20056b6', + uid: 'bf020396-0d7b-436f-ae9f-869c6780fc45', additionalCategories: [ { - value: "Textbook", - label: "Textbook", + value: 'Textbook', + label: 'Textbook' }, { - value: "Lesson Plan", - label: "Lesson Plan", - }, + value: 'Lesson Plan', + label: 'Lesson Plan' + } ], pdata: { - id: "dev.dock.portal", - ver: "2.8.0", - pid: "creation-portal", + id: 'dev.dock.portal', + ver: '2.8.0', + pid: 'creation-portal' }, contextRollup: { - l1: "01307938306521497658", + l1: '01307938306521497658' }, - tags: ["01307938306521497658"], + tags: [ + '01307938306521497658' + ], cdata: [ { - id: "01307938306521497658", - type: "sourcing_organization", + id: '01307938306521497658', + type: 'sourcing_organization' }, { - type: "project", - id: "ec5cc850-3f71-11eb-aae1-fb99d9fb6737", + type: 'project', + id: 'ec5cc850-3f71-11eb-aae1-fb99d9fb6737' }, { - type: "linked_collection", - id: "do_113140468925825024117", - }, + type: 'linked_collection', + id: 'do_113140468925825024117' + } ], timeDiff: 5, objectRollup: { - l1: "do_113140468925825024117", - l2: "do_113140468926914560125", + l1: 'do_113140468925825024117', + l2: 'do_113140468926914560125' }, - host: "", - defaultLicense: "CC BY 4.0", - endpoint: "/data/v3/telemetry", - env: "question_set", + host: '', + defaultLicense: 'CC BY 4.0', + endpoint: '/data/v3/telemetry', + env: 'question_set', cloudStorageUrls: [ - "https://s3.ap-south-1.amazonaws.com/ekstep-public-qa/", - "https://ekstep-public-qa.s3-ap-south-1.amazonaws.com/", - "https://dockstorage.blob.core.windows.net/sunbird-content-dock/", + 'https://s3.ap-south-1.amazonaws.com/ekstep-public-qa/', + 'https://ekstep-public-qa.s3-ap-south-1.amazonaws.com/', + 'https://dockstorage.blob.core.windows.net/sunbird-content-dock/' ], - mode: "edit", + mode: 'edit', }, config: { - mode: "edit", + mode: 'edit', maxDepth: 2, - objectType: "Collection", - primaryCategory: "Course", - isReadOnlyMode: false, + objectType: 'Collection', + primaryCategory: 'Course', isRoot: true, dialcodeMinLength: 2, dialcodeMaxLength: 250, - iconClass: "fa fa-book", + iconClass: 'fa fa-book', children: {}, - renderTaxonomy:false, hierarchy: { level1: { - name: "Module", - type: "Unit", - mimeType: "application/vnd.ekstep.content-collection", - contentType: "CourseUnit", - primaryCategory: "Course Unit", - iconClass: "fa fa-folder-o", - children: {}, + name: 'Module', + type: 'Unit', + mimeType: 'application/vnd.ekstep.content-collection', + contentType: 'CourseUnit', + primaryCategory: 'Course Unit', + iconClass: 'fa fa-folder-o', + children: {} }, level2: { - name: "Sub-Module", - type: "Unit", - mimeType: "application/vnd.ekstep.content-collection", - contentType: "CourseUnit", - primaryCategory: "Course Unit", - iconClass: "fa fa-folder-o", + name: 'Sub-Module', + type: 'Unit', + mimeType: 'application/vnd.ekstep.content-collection', + contentType: 'CourseUnit', + primaryCategory: 'Course Unit', + iconClass: 'fa fa-folder-o', children: { Content: [ - "Explanation Content", - "Learning Resource", - "eTextbook", - "Teacher Resource", - "Course Assessment", - ], - }, + 'Explanation Content', + 'Learning Resource', + 'eTextbook', + 'Teacher Resource', + 'Course Assessment' + ] + } }, level3: { - name: "Sub-Sub-Module", - type: "Unit", - mimeType: "application/vnd.ekstep.content-collection", - contentType: "CourseUnit", - primaryCategory: "Course Unit", - iconClass: "fa fa-folder-o", + name: 'Sub-Sub-Module', + type: 'Unit', + mimeType: 'application/vnd.ekstep.content-collection', + contentType: 'CourseUnit', + primaryCategory: 'Course Unit', + iconClass: 'fa fa-folder-o', children: { Content: [ - "Explanation Content", - "Learning Resource", - "eTextbook", - "Teacher Resource", - "Course Assessment", - ], - }, - }, + 'Explanation Content', + 'Learning Resource', + 'eTextbook', + 'Teacher Resource', + 'Course Assessment' + ] + } + } }, collection: { - maxContentsLimit: 10, - }, - questionSet: { - maxQuestionsLimit: 10, - }, - contentPolicyUrl: "/term-of-use.html", - }, -}; - -editorConfig_question = { - context: { - channel: "01309282781705830427", - authToken: "", - sid: "c4hzzUJYlbfLPoN2meEF6QfF3V_9o5Us", - did: "6539921a5736199d5e1ff5b923776c23", - uid: "ae94b68c-a535-4dce-8e7a-fb9662b0ad68", - programId: "f09a30f0-5e34-11ec-874d-3de2a8c29d94", - contributionOrgId: "e7328d77-42a7-44c8-84f4-8cfea235f07d", - pdata: { - id: "local.sunbird.portal", - ver: "2.8.0", - pid: "sunbird-portal", - }, - actor: { - id: "ae94b68c-a535-4dce-8e7a-fb9662b0ad68", - type: "User", + maxContentsLimit: 10 }, - contextRollup: { - l1: "01309282781705830427", - }, - tags: ["01309282781705830427", "01309282781705830427"], - timeDiff: -0.877, - endpoint: "/data/v3/telemetry", - env: "question_editor", - user: { - id: "ae94b68c-a535-4dce-8e7a-fb9662b0ad68", - orgIds: ["01309282781705830427"], - organisations: { - "01309282781705830427": "NIT", - }, - fullName: "N150", - firstName: "N150", - lastName: "", - isRootOrgAdmin: false, - }, - targetFWIds: ["nit_k-12"], - channelData: { - code: "01309282781705830427", - frameworks: [], - channel: "in.ekstep", - description: "Preprod Kayal Org", - createdOn: "2020-08-24T05:00:51.381+0000", - objectType: "Channel", - collectionPrimaryCategories: [ - "Content Playlist", - "Course", - "Digital Textbook", - "Question paper", - ], - appId: "@ignore@", - primaryCategories: [], - additionalCategories: [ - "DigitalCourse", - "DigitalCourse1", - "DigitalCourse2", - "Exam Question Set", - "LearningPath1", - "Observation", - "Survey", - "Text Asset", - "Video transcript", - ], - lastUpdatedOn: "2021-04-09T13:43:13.465+0000", - collectionAdditionalCategories: ["Textbook", "Lesson Plan"], - contentAdditionalCategories: [ - "Classroom Teaching Video", - "Concept Map", - "Curiosity Question Set", - "Experiential Resource", - "Explanation Video", - "Focus Spot", - "Learning Outcome Definition", - "Lesson Plan", - "Marking Scheme Rubric", - "Pedagogy Flow", - "Previous Board Exam Papers", - "TV Lesson", - "Textbook", - ], - apoc_num: 1, - identifier: "01309282781705830427", - lastStatusChangedOn: "2020-08-24T05:00:51.381+0000", - consumerId: "7411b6bd-89f3-40ec-98d1-229dc64ce77d", - assetAdditionalCategories: [], - languageCode: [], - versionKey: "1617975793465", - contentPrimaryCategories: [ - "Course Assessment", - "eTextbook", - "Explanation Content", - "Learning Resource", - "Practice Question Set", - "Teacher Resource", - "Exam Question", - ], - name: "NIT123", - defaultCourseFramework: "TPD", - assetPrimaryCategories: ["Asset", "CertAsset", "Certificate Template"], - status: "Live", - defaultFramework: "ekstep_ncert_k-12", - }, - labels: { - submit_collection_btn_label: "Submit for review", - publish_collection_btn_label: "Submit for Approval", - sourcing_approve_collection_btn_label: "Publish", - reject_collection_btn_label: "Request changes", - }, - framework: "ekstep_ncert_k-12", - correctionComments: "", - sourcingResourceStatus: "Draft", - sourcingResourceStatusClass: "sb-color-gray-300", - collectionIdentifier: "do_113431883451195392169", - unitIdentifier: "do_113431884671442944170", - collectionObjectType: "QuestionSet", - collectionPrimaryCategory: "Exam Question Set", - }, - config: { - primaryCategory: "Subjective Question", - objectType: "Question", - mode: "edit", - setDefaultCopyRight: false, - showOriginPreviewUrl: false, - showSourcingStatus: false, - showCorrectionComments: false, - enableBulkUpload: false, - publicStorageAccount: "https://dockstorage.blob.core.windows.net/", - hideSubmitForReviewBtn: false, questionSet: { - maxQuestionsLimit: 500, - }, - collection: { - maxContentsLimit: 1200, + maxQuestionsLimit: 10 }, - editableFields: { - orgreview: ["name", "learningOutcome"], - sourcingreview: ["name", "learningOutcome"], - }, - mimeType: "application/vnd.sunbird.question", - isReadOnlyMode: false, - interactionType: "default", - questionCategory: "VSA", - }, -}; - -export const toolbarConfig_question = { - preview_collection_btn_label: "Preview", - preview_collection_btn_icon: "icon eye", - save_collection_btn_label: "Save as Draft", - save_collection_btn_icon: "", - submit_collection_btn_label: "Submit for review", - submit_collection_btn_icon: "", - reject_collection_btn_label: "Request changes", - reject_collection_btn_icon: "", - publish_collection_btn_label: "Submit for Approval", - publish_collection_btn_icon: "", - edit_question_btn_label: "Edit", - edit_question_btn_icon: "icon edit", - preview_question_btn_label: "Preview", - preview_question_btn_icon: "icon eye", - cancel_question_btn_label: "Cancel", - cancel_question_btn_icon: "", - save_question_btn_label: "Save", - save_question_btn_icon: "", - send_back_for_correction_collection_btn_label: "Send Back For Corrections", - send_back_for_correction_collection_btn_icon: "", - sourcing_approve_collection_btn_label: "Publish", - sourcing_approve_collection_btn_icon: "", - sourcing_reject_collection_btn_label: "Reject", - sourcing_reject_collection_btn_icon: "", - upload_use_btn_label: "Upload and Use", - cancel_btn_label: "Cancel", - back_btn_label: "Back", - search_btn_label: "Search", - add_btn_label: "Add", - upload_from_computer_btn_label: "Upload from Computer", - request_btn_label: "Request", - no_btn_label: "No", - yes_btn_label: "Yes", - close_btn_label: "Close", - submit_btn_label: "Submit", - add_sibling_btn_label: "Add Sibling", - add_child_btn_label: "Add Child", - create_new_btn_label: "Create New", - add_from_library_btn_label: " Add from library", - submit_review_btn_label: "Submit Review", - apply_btn_label: "Apply", - reset_btn_label: "Reset", - delete_btn_label: "Delete", - next_btn_label: "Next", - remove_btn_label: "Remove", - done_btn_label: "Done", - showDialcode: "no", - showBulkUploadBtn: false, -}; + contentPolicyUrl: '/term-of-use.html' + } +} export const nativeElement = `
-
+
\ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.scss b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.scss index 30203dc0c..1acb52b92 100644 --- a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.scss +++ b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.scss @@ -7,13 +7,13 @@ &:before { background: none !important; } - + ul { &::before { background: none !important; } } - + .fancytree-folder { .fancytree-title { color: var(--primary-color) !important; @@ -22,23 +22,18 @@ padding-left: 5px; width: inherit !important; } - .fancytree-title.highlightNode { + .highlightNode { color: red !important; &::before { color: red !important; } } } - + li { padding: 0; margin: 0 0 1px 0; - - .highlightNode { - color: red !important; - } - .fancytree { &-ico-c{ padding-left: 5px !important; @@ -61,16 +56,16 @@ border-top: none; } } - + &:last-child { &:after { display: none; } } - + ul { padding-top: 1px; - + li { list-style-type: none;; .fancytree-custom-icon { @@ -82,26 +77,19 @@ margin-left: 6px; font-size: 16px; } - + &:last-child { &:after { display: none; } } } - - - .fancytree-custom-icon.highlightNode { - &::before { - color: red !important; - } - } .fancytree-node { padding: 6px 6px 8px 5px; margin-left: 45px; border: 1px solid transparent; - + &.fancytree-active, &.fancytree-focused, &:hover { @@ -109,22 +97,18 @@ background-color: var(--primary-0); border-right: 0; } - - &.dependent { - margin-left: 65px; - } } } } - + &::before { background: none !important; } - + .sb-fancyTree-icon { color: var(--gray-300) !important; } - + .fancytree-custom-icon { &::before { // content: url("/assets/images/question_collection.svg"); @@ -133,14 +117,14 @@ } } } - + .fa-caret-down { margin-top: 6px; display: block; width: 10px; padding-left: 2px; } - + .fa-caret-right { margin-top: 6px; display: block; @@ -148,7 +132,7 @@ padding-left: 6px; } } - + .ui-fancytree { padding-right: 0.785rem; // height: calc(100vh - 126px); diff --git a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.data.ts b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.data.ts index 014246910..a05619147 100644 --- a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.data.ts +++ b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.data.ts @@ -1,245 +1,234 @@ -export const mockData = { - config: { +export const mockData = { + config: { mode: 'edit', maxDepth: 2, objectType: 'Collection', primaryCategory: 'Course', isRoot: true, iconClass: 'fa fa-book', - children: [ - 'do_123' - ], - enableQuestionCreation: false, + children: {}, hierarchy: { - level1: { - name: 'Module', - type: 'Unit', - mimeType: 'application/vnd.ekstep.content-collection', - contentType: 'Course Unit', - iconClass: 'fa fa-folder-o', - children: { - Content: [ - 'Explanation Content', - 'Learning Resource', - 'eTextbook', - 'Teacher Resource', - 'Course Assessment' - ] - } - }, - level2: { - name: 'Sub-Module', - type: 'Unit', - mimeType: 'application/vnd.ekstep.content-collection', - contentType: 'Course Unit', - iconClass: 'fa fa-folder-o', - children: { - Content: [ - 'Explanation Content', - 'Learning Resource', - 'eTextbook', - 'Teacher Resource', - 'Course Assessment' - ] + level1: { + name: 'Module', + type: 'Unit', + mimeType: 'application/vnd.ekstep.content-collection', + contentType: 'Course Unit', + iconClass: 'fa fa-folder-o', + children: {} + }, + level2: { + name: 'Sub-Module', + type: 'Unit', + mimeType: 'application/vnd.ekstep.content-collection', + contentType: 'Course Unit', + iconClass: 'fa fa-folder-o', + children: { + Content: [ + 'Explanation Content', + 'Learning Resource', + 'eTextbook', + 'Teacher Resource', + 'Course Assessment' + ] + } } - } } } }; export const config = { - 'labelConfig': { - 'messages': { - 'error': { - '007': "Test" + 'labelConfig': { + 'messages': { + 'error': { + '007': "Test" + } } } } -} export const treeData = { - "ownershipType": [ - "createdBy" - ], - "parent": "do_113274019351052288119", - "code": "8e6af9b3-5d1e-af9c-8546-4fd6b4e3dcd3", - "credentials": { - "enabled": "No" - }, - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.ekstep.content-collection", - "idealScreenSize": "normal", - "createdOn": "2021-05-11T12:30:17.357+0000", - "objectType": "Content", - "primaryCategory": "Course Unit", - "children": [ - { - "ownershipType": [ - "createdBy" - ], - "parent": "do_113277071092588544112", - "unitIdentifiers": [ - "do_11328844424763801613560" - ], - "copyright": "vaidehi_Instituations", - "previewUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_113289107070615552146/artifact/do_113289107070615552146_1622205453434_do_11328844752160358413583_1622124964912_webm1-copy1.webm", - "keywords": [ - "1.2" - ], - "subject": [ - "Hindi" - ], - "channel": "01309282781705830427", - "downloadUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/ecar_files/do_113289107070615552146/1.2_1622205456360_do_113289107070615552146_1.0.ecar", - "language": [ - "English" - ], - "source": "https://dock.sunbirded.org/api/content/v1/read/do_11328844752160358413583", - "mimeType": "video/webm", - "variants": { - "spine": { - "ecarUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/ecar_files/do_113289107070615552146/1.2_1622205457383_do_113289107070615552146_1.0_spine.ecar", - "size": 7399 - } - }, - "objectType": "Content", - "se_mediums": [ - "English" - ], - "gradeLevel": [ - "Class 10" - ], - "appIcon": "https://dockstorage.blob.core.windows.net/sunbird-content-dock/content/do_11328844752160358413583/artifact/book.thumb.jpg", - "primaryCategory": "Explanation Content", - "appId": "dev.dock.portal", - "contentEncoding": "identity", - "artifactUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_113289107070615552146/artifact/do_113289107070615552146_1622205453434_do_11328844752160358413583_1622124964912_webm1-copy1.webm", - "sYS_INTERNAL_LAST_UPDATED_ON": "2021-05-28T12:40:03.827+0000", - "contentType": "ClassroomTeachingVideo", - "se_gradeLevels": [ - "Class 10" - ], - "trackable": { - "enabled": "No", - "autoBatch": "No" - }, - "identifier": "do_113289107070615552146", - "audience": [ - "Student" - ], - "visibility": "Default", - "discussionForum": { - "enabled": "Yes" - }, - "index": 26, - "mediaType": "content", - "osId": "org.ekstep.quiz.app", - "languageCode": [ - "en" - ], - "lastPublishedBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", - "version": 2, - "se_subjects": [ - "Hindi" - ], - "license": "CC BY 4.0", - "prevState": "Review", - "size": 2621252, - "lastPublishedOn": "2021-05-28T12:37:36.360+0000", - "name": "1.2", - "attributions": [ - "kayal" - ], - "status": "Live", - "code": "28f75944-ab47-2c12-e097-e44349ae50d9", - "credentials": { - "enabled": "No" - }, - "prevStatus": "Processing", - "origin": "do_11328844752160358413583", - "description": "", - "streamingUrl": "https://sunbirdspikemedia-inct.streaming.media.azure.net/92eb3b32-c03c-4a62-a97a-5c88e5ac516a/do_113289107070615552146_1622205.ism/manifest(format=m3u8-aapl-v3)", - "medium": [ - "English" - ], - "posterImage": "https://drive.google.com/uc?export=download&id=1-dFzAeSNmx1ZRn77CEntyQA-VcBE0PKg", - "idealScreenSize": "normal", - "createdOn": "2021-05-28T12:37:32.959+0000", - "se_boards": [ - "CBSE" - ], - "processId": "cb69d06d-1114-4a5c-8b44-28e106781eb8", - "contentDisposition": "inline", - "lastUpdatedOn": "2021-05-28T12:37:36.252+0000", - "originData": { - "identifier": "do_11328844752160358413583", - "repository": "https://dock.sunbirded.org/api/content/v1/read/do_11328844752160358413583" - }, - "collectionId": "do_11328844424709734413553", - "dialcodeRequired": "No", - "lastStatusChangedOn": "2021-05-28T12:37:37.734+0000", - "creator": "n123", - "os": [ - "All" - ], - "cloudStorageKey": "content/do_113289107070615552146/artifact/do_113289107070615552146_1622205453434_do_11328844752160358413583_1622124964912_webm1-copy1.webm", - "se_FWIds": [ - "ekstep_ncert_k-12" - ], - "pkgVersion": 1, - "versionKey": "1622205456252", - "idealScreenDensity": "hdpi", - "framework": "ekstep_ncert_k-12", - "depth": 3, - "s3Key": "ecar_files/do_113289107070615552146/1.2_1622205456360_do_113289107070615552146_1.0.ecar", - "lastSubmittedOn": "2021-05-28T12:37:35.110+0000", - "createdBy": "0ce5b67e-b48e-489b-a818-e938e8bfc14b", - "compatibilityLevel": 1, - "board": "CBSE", - "programId": "00b79bb0-bef5-11eb-84a1-d1e625ff89be" - } - ], - "contentDisposition": "inline", - "lastUpdatedOn": "2021-06-18T06:17:01.752+0000", - "contentEncoding": "gzip", - "contentType": "CourseUnit", - "dialcodeRequired": "No", - "trackable": { - "enabled": "No", - "autoBatch": "No" - }, - "identifier": "do_113277071092588544112", - "lastStatusChangedOn": "2021-05-11T12:30:17.357+0000", - "audience": [ - "Student" - ], - "os": [ - "All" - ], - "visibility": "Parent", - "discussionForum": { - "enabled": "Yes" - }, - "index": 1, - "mediaType": "content", - "osId": "org.ekstep.launcher", - "languageCode": [ - "en" - ], - "version": 2, - "versionKey": "1620736217357", - "license": "CC BY 4.0", - "idealScreenDensity": "hdpi", - "depth": 2, - "compatibilityLevel": 1, - "name": "Sub-Module", - "timeLimits": {}, - "status": "Draft", - "level": 3 -}; + "ownershipType": [ + "createdBy" + ], + "parent": "do_113274019351052288119", + "code": "8e6af9b3-5d1e-af9c-8546-4fd6b4e3dcd3", + "credentials": { + "enabled": "No" + }, + "channel": "01309282781705830427", + "language": [ + "English" + ], + "mimeType": "application/vnd.ekstep.content-collection", + "idealScreenSize": "normal", + "createdOn": "2021-05-11T12:30:17.357+0000", + "objectType": "Content", + "primaryCategory": "Course Unit", + "children": [ + { + "ownershipType": [ + "createdBy" + ], + "parent": "do_113277071092588544112", + "unitIdentifiers": [ + "do_11328844424763801613560" + ], + "copyright": "vaidehi_Instituations", + "previewUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_113289107070615552146/artifact/do_113289107070615552146_1622205453434_do_11328844752160358413583_1622124964912_webm1-copy1.webm", + "keywords": [ + "1.2" + ], + "subject": [ + "Hindi" + ], + "channel": "01309282781705830427", + "downloadUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/ecar_files/do_113289107070615552146/1.2_1622205456360_do_113289107070615552146_1.0.ecar", + "language": [ + "English" + ], + "source": "https://dock.sunbirded.org/api/content/v1/read/do_11328844752160358413583", + "mimeType": "video/webm", + "variants": { + "spine": { + "ecarUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/ecar_files/do_113289107070615552146/1.2_1622205457383_do_113289107070615552146_1.0_spine.ecar", + "size": 7399 + } + }, + "objectType": "Content", + "se_mediums": [ + "English" + ], + "gradeLevel": [ + "Class 10" + ], + "appIcon": "https://dockstorage.blob.core.windows.net/sunbird-content-dock/content/do_11328844752160358413583/artifact/book.thumb.jpg", + "primaryCategory": "Explanation Content", + "appId": "dev.dock.portal", + "contentEncoding": "identity", + "artifactUrl": "https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_113289107070615552146/artifact/do_113289107070615552146_1622205453434_do_11328844752160358413583_1622124964912_webm1-copy1.webm", + "sYS_INTERNAL_LAST_UPDATED_ON": "2021-05-28T12:40:03.827+0000", + "contentType": "ClassroomTeachingVideo", + "se_gradeLevels": [ + "Class 10" + ], + "trackable": { + "enabled": "No", + "autoBatch": "No" + }, + "identifier": "do_113289107070615552146", + "audience": [ + "Student" + ], + "visibility": "Default", + "discussionForum": { + "enabled": "Yes" + }, + "index": 26, + "mediaType": "content", + "osId": "org.ekstep.quiz.app", + "languageCode": [ + "en" + ], + "lastPublishedBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", + "version": 2, + "se_subjects": [ + "Hindi" + ], + "license": "CC BY 4.0", + "prevState": "Review", + "size": 2621252, + "lastPublishedOn": "2021-05-28T12:37:36.360+0000", + "name": "1.2", + "attributions": [ + "kayal" + ], + "status": "Live", + "code": "28f75944-ab47-2c12-e097-e44349ae50d9", + "credentials": { + "enabled": "No" + }, + "prevStatus": "Processing", + "origin": "do_11328844752160358413583", + "description": "", + "streamingUrl": "https://sunbirdspikemedia-inct.streaming.media.azure.net/92eb3b32-c03c-4a62-a97a-5c88e5ac516a/do_113289107070615552146_1622205.ism/manifest(format=m3u8-aapl-v3)", + "medium": [ + "English" + ], + "posterImage": "https://drive.google.com/uc?export=download&id=1-dFzAeSNmx1ZRn77CEntyQA-VcBE0PKg", + "idealScreenSize": "normal", + "createdOn": "2021-05-28T12:37:32.959+0000", + "se_boards": [ + "CBSE" + ], + "processId": "cb69d06d-1114-4a5c-8b44-28e106781eb8", + "contentDisposition": "inline", + "lastUpdatedOn": "2021-05-28T12:37:36.252+0000", + "originData": { + "identifier": "do_11328844752160358413583", + "repository": "https://dock.sunbirded.org/api/content/v1/read/do_11328844752160358413583" + }, + "collectionId": "do_11328844424709734413553", + "dialcodeRequired": "No", + "lastStatusChangedOn": "2021-05-28T12:37:37.734+0000", + "creator": "n123", + "os": [ + "All" + ], + "cloudStorageKey": "content/do_113289107070615552146/artifact/do_113289107070615552146_1622205453434_do_11328844752160358413583_1622124964912_webm1-copy1.webm", + "se_FWIds": [ + "ekstep_ncert_k-12" + ], + "pkgVersion": 1, + "versionKey": "1622205456252", + "idealScreenDensity": "hdpi", + "framework": "ekstep_ncert_k-12", + "depth": 3, + "s3Key": "ecar_files/do_113289107070615552146/1.2_1622205456360_do_113289107070615552146_1.0.ecar", + "lastSubmittedOn": "2021-05-28T12:37:35.110+0000", + "createdBy": "0ce5b67e-b48e-489b-a818-e938e8bfc14b", + "compatibilityLevel": 1, + "board": "CBSE", + "programId": "00b79bb0-bef5-11eb-84a1-d1e625ff89be" + } + ], + "contentDisposition": "inline", + "lastUpdatedOn": "2021-06-18T06:17:01.752+0000", + "contentEncoding": "gzip", + "contentType": "CourseUnit", + "dialcodeRequired": "No", + "trackable": { + "enabled": "No", + "autoBatch": "No" + }, + "identifier": "do_113277071092588544112", + "lastStatusChangedOn": "2021-05-11T12:30:17.357+0000", + "audience": [ + "Student" + ], + "os": [ + "All" + ], + "visibility": "Parent", + "discussionForum": { + "enabled": "Yes" + }, + "index": 1, + "mediaType": "content", + "osId": "org.ekstep.launcher", + "languageCode": [ + "en" + ], + "version": 2, + "versionKey": "1620736217357", + "license": "CC BY 4.0", + "idealScreenDensity": "hdpi", + "depth": 2, + "compatibilityLevel": 1, + "name": "Sub-Module", + "timeLimits": {}, + "status": "Draft", + "level": 3 + }; export const tree = [ { @@ -518,1330 +507,76 @@ export const tree = [ }] export const editorConfig = { - config: { - "rejectCommentsMaxLength": 500, - "setDefaultCopyRight": true, - "showOriginPreviewUrl": false, - "showSourcingStatus": false, - "showCorrectionComments": false, - "assetConfig": { - "image": { - "size": "1", - "accepted": "png, jpeg" - }, - "video": { - "size": "50", - "accepted": "mp4, webm" - } - }, - "mode": "edit", - "maxDepth": 2, - "objectType": "Collection", - "primaryCategory": "Course", - "isRoot": true, - "dialcodeMinLength": 2, - "dialcodeMaxLength": 250, - "iconClass": "fa fa-book", - "children": {}, - "hierarchy": { - "level1": { - "name": "Module", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": {} - }, - "level2": { - "name": "Sub-Module", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [ - "Explanation Content", - "Learning Resource", - "eTextbook", - "Teacher Resource", - "Course Assessment" - ] - } - }, - "level3": { - "name": "Sub-Sub-Module", - "type": "Unit", - "mimeType": "application/vnd.ekstep.content-collection", - "contentType": "CourseUnit", - "primaryCategory": "Course Unit", - "iconClass": "fa fa-folder-o", - "children": { - "Content": [ - "Explanation Content", - "Learning Resource", - "eTextbook", - "Teacher Resource", - "Course Assessment" - ] - } - } - }, - "contentPolicyUrl": "/term-of-use.html" - } -} - -export const TargetNodeMockData = { - data: { - id: "do_1134460323604971521236", - primaryCategory: "Date", - objectType: "Question", - metadata: { - parent: "do_1134347209749299201119", - code: "6ce6f7de-c4e6-89a1-1ddc-3889140601cd", - subject: ["Mathematics"], - channel: "01309282781705830427", - language: ["English"], - branchingLogic: { - "do_113449672558780416163": { - "target": [ - "do_113449775832088576181", - "do_113449787008081920183", - "do_113449808985628672185", - "do_11345671149997260811" - ], - "preCondition": {}, - "source": [] - }, - "do_113449775832088576181": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "eq": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 0 - ] - ] - } - ] + config: { + "rejectCommentsMaxLength": 500, + "setDefaultCopyRight": true, + "showOriginPreviewUrl": false, + "showSourcingStatus": false, + "showCorrectionComments": false, + "assetConfig": { + "image": { + "size": "1", + "accepted": "png, jpeg" + }, + "video": { + "size": "50", + "accepted": "mp4, webm" } - }, - "do_113449787008081920183": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "ne": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 1 + }, + "mode": "edit", + "maxDepth": 2, + "objectType": "Collection", + "primaryCategory": "Course", + "isRoot": true, + "dialcodeMinLength": 2, + "dialcodeMaxLength": 250, + "iconClass": "fa fa-book", + "children": {}, + "hierarchy": { + "level1": { + "name": "Module", + "type": "Unit", + "mimeType": "application/vnd.ekstep.content-collection", + "contentType": "CourseUnit", + "primaryCategory": "Course Unit", + "iconClass": "fa fa-folder-o", + "children": {} + }, + "level2": { + "name": "Sub-Module", + "type": "Unit", + "mimeType": "application/vnd.ekstep.content-collection", + "contentType": "CourseUnit", + "primaryCategory": "Course Unit", + "iconClass": "fa fa-folder-o", + "children": { + "Content": [ + "Explanation Content", + "Learning Resource", + "eTextbook", + "Teacher Resource", + "Course Assessment" ] - ] } - ] - } - }, - "do_113449808985628672185": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "eq": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 0 - ] - ] - } - ] - } - }, - "do_11345671149997260811": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "eq": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 0 + }, + "level3": { + "name": "Sub-Sub-Module", + "type": "Unit", + "mimeType": "application/vnd.ekstep.content-collection", + "contentType": "CourseUnit", + "primaryCategory": "Course Unit", + "iconClass": "fa fa-folder-o", + "children": { + "Content": [ + "Explanation Content", + "Learning Resource", + "eTextbook", + "Teacher Resource", + "Course Assessment" ] - ] } - ] } - } - }, - medium: ["English"], - mimeType: "application/vnd.sunbird.question", - createdOn: "2021-12-21T10:31:41.865+0000", - objectType: "Question", - gradeLevel: ["Class 4"], - primaryCategory: "Date", - contentDisposition: "inline", - lastUpdatedOn: "2021-12-21T10:35:09.785+0000", - contentEncoding: "gzip", - showSolutions: "No", - allowAnonymousAccess: "Yes", - identifier: "do_1134355574936780801170", - lastStatusChangedOn: "2021-12-21T10:31:41.865+0000", - visibility: "Parent", - showTimer: "No", - author: "check1@yopmail.com", - index: 4, - languageCode: ["en"], - version: 1, - versionKey: "1640082909792", - showFeedback: "No", - license: "CC BY 4.0", - interactionTypes: ["date"], - framework: "ekstep_ncert_k-12", - depth: 2, - createdBy: "5a587cc1-e018-4859-a0a8-e842650b9d64", - compatibilityLevel: 4, - name: "Dep Date 3", - topic: ["Forest"], - board: "CBSE", - status: "Draft", - }, - root: false, - }, - folder: false, - parent: { - data: { - id: "do_1134347209749299201119", - primaryCategory: "Observation", - objectType: "QuestionSet", - metadata: { - parent: "do_1133610108714352641210", - code: "2c902f1b-6338-ba1e-d64f-3117f6d88493", - allowScoring: "No", - allowSkip: "Yes", - containsUserData: "No", - channel: "01309282781705830427", - branchingLogic: { - do_1134355569264885761166: { - target: ["do_1134355571590184961168", "do_1134355574936780801170"], - preCondition: {}, - source: [], - }, - do_1134355571590184961168: { - target: [], - source: ["do_1134355569264885761166"], - preCondition: { - and: [ - { - ne: [ - { - var: "do_1134355569264885761166.response1.value", - type: "responseDeclaration", - }, - [0], - ], - }, - ], - }, - }, - do_1134355574936780801170: { - target: [], - source: ["do_1134355569264885761166"], - preCondition: { - and: [ - { - eq: [ - { - var: "do_1134355569264885761166.response1.value", - type: "responseDeclaration", - }, - [1], - ], - }, - ], - }, - }, - }, - language: ["English"], - mimeType: "application/vnd.sunbird.questionset", - showHints: "No", - createdOn: "2021-12-20T06:09:47.760+0000", - objectType: "QuestionSet", - allowMultipleInstances: "No", - primaryCategory: "Observation", - contentDisposition: "inline", - lastUpdatedOn: "2021-12-21T11:36:53.490+0000", - contentEncoding: "gzip", - showSolutions: "No", - allowAnonymousAccess: "Yes", - identifier: "do_1134347209749299201119", - lastStatusChangedOn: "2021-12-20T06:09:47.760+0000", - requiresSubmit: "No", - visibility: "Parent", - showTimer: "No", - index: 2, - setType: "materialised", - languageCode: ["en"], - version: 1, - versionKey: "1639980587760", - showFeedback: "No", - license: "CC BY 4.0", - depth: 1, - compatibilityLevel: 5, - name: "Mid-day Meals", - navigationMode: "non-linear", - allowBranching: "Yes", - shuffle: true, - attributions: [], - status: "Draft", - instances: null, - }, - }, - }, - root: false, - getLevel: () => 3, -}; - -export const CurrentNodeMockData = { - hitMode: "after", - otherNode: { - data: { - id: "do_113449672558780416163", - primaryCategory: "Multiselect Multiple Choice Question", - objectType: "Question", - metadata: { - parent: "do_1134355577791283201172", - code: "77e21fd6-9d5c-f351-d9da-7fc922bc1739", - subject: ["Mathematics"], - showRemarks: "No", - channel: "01309282781705830427", - language: ["English"], - medium: ["English"], - mimeType: "application/vnd.sunbird.question", - templateId: "mcq-vertical", - createdOn: "2021-12-20T06:14:56.100+0000", - objectType: "Question", - gradeLevel: ["Class 4"], - primaryCategory: "Multiselect Multiple Choice Question", - contentDisposition: "inline", - lastUpdatedOn: "2021-12-21T10:28:47.124+0000", - contentEncoding: "gzip", - showSolutions: "No", - allowAnonymousAccess: "Yes", - identifier: "do_1134347235008512001125", - lastStatusChangedOn: "2021-12-20T06:14:56.100+0000", - visibility: "Parent", - showTimer: "No", - author: "check1@yopmail.com", - index: 1, - qType: "MCQ", - languageCode: ["en"], - version: 1, - versionKey: "1640082527132", - showFeedback: "No", - license: "CC BY 4.0", - interactionTypes: ["choice"], - framework: "ekstep_ncert_k-12", - depth: 2, - createdBy: "5a587cc1-e018-4859-a0a8-e842650b9d64", - compatibilityLevel: 4, - name: "MCQ Question 2", - topic: ["Forest"], - board: "CBSE", - status: "Draft", - showEvidence: "No", - }, - }, - parent: { - data: { - id: "do_1134355577791283201172", - primaryCategory: "Observation", - objectType: "QuestionSet", - metadata: { - parent: "do_1133610108714352641210", - code: "4505fec1-8a2c-8e85-f340-7245734aaa35", - allowScoring: "No", - allowSkip: "Yes", - containsUserData: "No", - channel: "01309282781705830427", - branchingLogic: {}, - language: ["English"], - mimeType: "application/vnd.sunbird.questionset", - showHints: "No", - createdOn: "2021-12-21T10:32:16.710+0000", - objectType: "QuestionSet", - allowMultipleInstances: "No", - primaryCategory: "Observation", - contentDisposition: "inline", - lastUpdatedOn: "2021-12-21T10:58:24.169+0000", - contentEncoding: "gzip", - showSolutions: "No", - allowAnonymousAccess: "Yes", - identifier: "do_1134355577791283201172", - lastStatusChangedOn: "2021-12-21T10:32:16.710+0000", - requiresSubmit: "No", - visibility: "Parent", - showTimer: "No", - index: 3, - setType: "materialised", - languageCode: ["en"], - version: 1, - versionKey: "1640082736710", - showFeedback: "No", - license: "CC BY 4.0", - depth: 1, - compatibilityLevel: 5, - name: "School Transport", - navigationMode: "non-linear", - allowBranching: "Yes", - shuffle: true, - attributions: [], - status: "Draft", - instances: null, - }, - root: false, - }, - }, - }, - root: false, -}; - -export const mockTreeService = { - getChildren: () => { - return ["do_11330103476396851218", "do_233"]; - }, - getFirstChild: () => { - return { - data: { - metadata: {} - } - } - }, - getActiveNode: () => { - return { - data: { - id: "do_11330103476396851218", - }, - getParent: () => { - return { - getChildren: () => { - return [ - { - data: { - id: "do_11330103476396851218", - }, - }, - ]; - }, - }; }, - }; - }, - getNodeById: () => { - return { - moveTo: null - } - }, - clearTreeCache: () => { - }, - updateNode: () => { - - }, - updateTreeNodeMetadata: () => { - return {} - } -}; - - -export const observationWithRubricsMockData = -{ - data: { - children: - [ - { - "parent": "do_1134357224765685761203", - "code": "a51c0d9f-4696-3354-062f-b2078048656c", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.118+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "children": [ - { - "parent": "do_1134460323603906561218", - "code": "b4c3e613-5c3f-9c8b-d61f-417f4c5d8df2", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "branchingLogic": { - "do_113449775832088576181": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "eq": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 0 - ] - ] - } - ] - } - }, - "do_113449787008081920183": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "ne": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 1 - ] - ] - } - ] - } - }, - "do_11345671149997260811": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "eq": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 0 - ] - ] - } - ] - } - }, - "do_113449808985628672185": { - "target": [], - "source": [ - "do_113449672558780416163" - ], - "preCondition": { - "and": [ - { - "eq": [ - { - "var": "do_113449672558780416163.response1.value", - "type": "responseDeclaration" - }, - [ - 0 - ] - ] - } - ] - } - }, - "do_113449672558780416163": { - "target": [ - "do_113449775832088576181", - "do_113449787008081920183", - "do_113449808985628672185", - "do_11345671149997260811" - ], - "preCondition": {}, - "source": [] - } - }, - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.106+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "children": [ - { - "parent": "do_1134460323602841601200", - "code": "d0ab14ae-9f67-41cf-dcfa-80c8432bf424", - "evidence": { - "required": "No", - "mimeType": [ - "audio" - ], - "minCount": 1, - "maxCount": 1, - "sizeLimit": "20480" - }, - "subject": [ - "English" - ], - "showRemarks": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "medium": [ - "English" - ], - "mimeType": "application/vnd.sunbird.question", - "templateId": "mcq-vertical", - "createdOn": "2022-01-10T09:08:52.273+0000", - "objectType": "Question", - "gradeLevel": [ - "Grade 1" - ], - "primaryCategory": "Multiselect Multiple Choice Question", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-20T07:49:01.518+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_113449672558780416163", - "lastStatusChangedOn": "2022-01-10T09:08:52.273+0000", - "visibility": "Parent", - "showTimer": "No", - "author": "check1@yopmail.com", - "index": 1, - "qType": "MCQ", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1642664941814", - "showFeedback": "No", - "license": "CC BY 4.0", - "interactionTypes": [ - "choice" - ], - "framework": "tpd", - "depth": 3, - "createdBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", - "compatibilityLevel": 4, - "name": "Parent Question MCQ", - "topic": [ - "Forest" - ], - "board": "CBSE", - "status": "Draft", - "showEvidence": "Yes" - }, - { - "parent": "do_1134460323602841601200", - "code": "c03eddbf-8194-ce67-3f49-08c4b5b33e55", - "subject": [ - "English" - ], - "showRemarks": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "medium": [ - "English" - ], - "mimeType": "application/vnd.sunbird.question", - "createdOn": "2022-01-20T07:49:38.034+0000", - "objectType": "Question", - "gradeLevel": [ - "Grade 1" - ], - "primaryCategory": "Text", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-20T07:49:38.023+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_11345671149997260811", - "lastStatusChangedOn": "2022-01-20T07:49:38.034+0000", - "creator": "Vaibahv Bhuva", - "visibility": "Parent", - "showTimer": "No", - "author": "check1@yopmail.com", - "index": 2, - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1642664978234", - "showFeedback": "No", - "license": "CC BY 4.0", - "interactionTypes": [ - "text" - ], - "framework": "tpd", - "depth": 3, - "createdBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", - "compatibilityLevel": 4, - "name": "child Text Question", - "topic": [ - "Forest" - ], - "board": "CBSE", - "status": "Draft", - "showEvidence": "No" - }, - { - "parent": "do_1134460323602841601200", - "code": "10cf6d1b-ba3d-2925-1d13-032aa3d2d317", - "subject": [ - "English" - ], - "channel": "01309282781705830427", - "language": [ - "English" - ], - "medium": [ - "English" - ], - "mimeType": "application/vnd.sunbird.question", - "createdOn": "2022-01-10T13:46:25.941+0000", - "objectType": "Question", - "gradeLevel": [ - "Grade 1" - ], - "primaryCategory": "Date", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-10T13:46:25.941+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_113449808985628672185", - "lastStatusChangedOn": "2022-01-10T13:46:25.941+0000", - "creator": "Vaibahv Bhuva", - "visibility": "Parent", - "showTimer": "No", - "author": "check1@yopmail.com", - "index": 3, - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641822385942", - "showFeedback": "No", - "license": "CC BY 4.0", - "interactionTypes": [ - "date" - ], - "framework": "tpd", - "depth": 3, - "createdBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", - "compatibilityLevel": 4, - "name": "Child Date 1", - "topic": [ - "Forest" - ], - "board": "CBSE", - "status": "Draft" - }, - { - "parent": "do_1134460323602841601200", - "code": "5403efd9-064e-89af-8f44-a9b10c80291c", - "subject": [ - "English" - ], - "showRemarks": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "medium": [ - "English" - ], - "mimeType": "application/vnd.sunbird.question", - "createdOn": "2022-01-10T12:38:58.878+0000", - "objectType": "Question", - "gradeLevel": [ - "Grade 1" - ], - "primaryCategory": "Slider", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-10T12:38:58.878+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_113449775832088576181", - "lastStatusChangedOn": "2022-01-10T12:38:58.878+0000", - "creator": "Vaibahv Bhuva", - "visibility": "Parent", - "showTimer": "No", - "author": "check1@yopmail.com", - "index": 4, - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641818338879", - "showFeedback": "No", - "license": "CC BY 4.0", - "interactionTypes": [ - "slider" - ], - "framework": "tpd", - "depth": 3, - "createdBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", - "compatibilityLevel": 4, - "name": "test slider 2", - "topic": [ - "Forest" - ], - "board": "CBSE", - "status": "Draft", - "showEvidence": "No" - }, - { - "parent": "do_1134460323602841601200", - "code": "4395c049-8ba7-c611-6334-8bee3f02fa27", - "subject": [ - "English" - ], - "showRemarks": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "medium": [ - "English" - ], - "mimeType": "application/vnd.sunbird.question", - "createdOn": "2022-01-10T13:01:43.135+0000", - "objectType": "Question", - "gradeLevel": [ - "Grade 1" - ], - "primaryCategory": "Slider", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-10T13:01:43.135+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_113449787008081920183", - "lastStatusChangedOn": "2022-01-10T13:01:43.135+0000", - "creator": "Vaibahv Bhuva", - "visibility": "Parent", - "showTimer": "No", - "author": "check1@yopmail.com", - "index": 5, - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641819703136", - "showFeedback": "No", - "license": "CC BY 4.0", - "interactionTypes": [ - "slider" - ], - "framework": "tpd", - "depth": 3, - "createdBy": "5a587cc1-e018-4859-a0a8-e842650b9d64", - "compatibilityLevel": 4, - "name": "test slider 4", - "topic": [ - "Forest" - ], - "board": "CBSE", - "status": "Draft", - "showEvidence": "No" - } - ], - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-20T07:49:38.234+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323602841601200", - "lastStatusChangedOn": "2022-01-05T05:42:52.106+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 1, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372106", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Chemistry", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323603906561218", - "code": "bfdac63e-4cd1-c9fe-00a0-be98f73e13d8", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "branchingLogic": {}, - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.131+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-10T13:09:04.092+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323604971521236", - "lastStatusChangedOn": "2022-01-05T05:42:52.131+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 2, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372131", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Biology", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323603906561218", - "code": "9916f5fc-4f37-3f8e-5151-b32ce65217da", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.114+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-05T05:42:52.114+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323603578881212", - "lastStatusChangedOn": "2022-01-05T05:42:52.114+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 3, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372114", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "General Science", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - } - ], - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-12T08:37:51.019+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323603906561218", - "lastStatusChangedOn": "2022-01-05T05:42:52.118+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 1, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372118", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 1, - "compatibilityLevel": 5, - "name": "Science", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134357224765685761203", - "code": "36b6e0bd-ef9e-9fd1-5092-257c8e6af0a9", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.190+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "children": [ - { - "parent": "do_1134460323609804801240", - "code": "fd63a953-d9c1-cb14-df75-5918afb4b4b0", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.110+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-12T08:37:51.018+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323603251201206", - "lastStatusChangedOn": "2022-01-05T05:42:52.110+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 1, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372110", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "History", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323609804801240", - "code": "de1454cf-bfa9-faa5-8a71-cf7954e9f95b", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.100+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-05T05:42:52.100+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323602432001194", - "lastStatusChangedOn": "2022-01-05T05:42:52.100+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 2, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372100", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Political Science", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323609804801240", - "code": "916893b4-816f-9613-1456-bea7da40c4ef", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.195+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-05T05:42:52.195+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323610214401248", - "lastStatusChangedOn": "2022-01-05T05:42:52.195+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 3, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372195", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Geography", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323609804801240", - "code": "0c34d378-77e9-db88-589a-7695edcf1d70", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.094+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-05T05:42:52.094+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323601940481186", - "lastStatusChangedOn": "2022-01-05T05:42:52.094+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 4, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372094", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Sociology", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323609804801240", - "code": "cca8fe66-b7e9-c3cb-a226-b5f96e10dfe9", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.126+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-05T05:42:52.126+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323604561921228", - "lastStatusChangedOn": "2022-01-05T05:42:52.126+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 5, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372126", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Social Studies", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - }, - { - "parent": "do_1134460323609804801240", - "code": "cedcdd78-2950-e8d7-fa17-f57e67a349b9", - "allowScoring": "Yes", - "allowSkip": "Yes", - "containsUserData": "No", - "channel": "01309282781705830427", - "language": [ - "English" - ], - "mimeType": "application/vnd.sunbird.questionset", - "showHints": "No", - "createdOn": "2022-01-05T05:42:52.128+0000", - "objectType": "QuestionSet", - "primaryCategory": "Observation With Rubrics", - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-05T05:42:52.128+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323604725761232", - "lastStatusChangedOn": "2022-01-05T05:42:52.128+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 6, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372128", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 2, - "compatibilityLevel": 5, - "name": "Environmental Studies", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - } - ], - "contentDisposition": "inline", - "lastUpdatedOn": "2022-01-12T08:37:51.019+0000", - "contentEncoding": "gzip", - "showSolutions": "No", - "allowAnonymousAccess": "Yes", - "identifier": "do_1134460323609804801240", - "lastStatusChangedOn": "2022-01-05T05:42:52.190+0000", - "requiresSubmit": "No", - "visibility": "Parent", - "showTimer": "No", - "index": 2, - "setType": "materialised", - "languageCode": [ - "en" - ], - "version": 1, - "versionKey": "1641361372190", - "showFeedback": "No", - "license": "CC BY 4.0", - "depth": 1, - "compatibilityLevel": 5, - "name": "Social Science", - "navigationMode": "non-linear", - "allowBranching": "Yes", - "shuffle": true, - "attributions": [], - "status": "Draft" - } - ] + "contentPolicyUrl": "/term-of-use.html" } -}; \ No newline at end of file +} \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.ts b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.ts index 47ea119b1..e1a832905 100755 --- a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.spec.ts @@ -2,34 +2,28 @@ import { EditorService } from './../../services/editor/editor.service'; import { async, ComponentFixture, TestBed, inject } from '@angular/core/testing'; import { FancyTreeComponent } from './fancy-tree.component'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { NO_ERRORS_SCHEMA, ChangeDetectorRef } from '@angular/core'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { TelemetryInteractDirective } from '../../directives/telemetry-interact/telemetry-interact.directive'; import { EditorTelemetryService } from '../../services/telemetry/telemetry.service'; -import { config, treeData, tree, editorConfig, TargetNodeMockData, - CurrentNodeMockData, mockTreeService, mockData, observationWithRubricsMockData } from './fancy-tree.component.spec.data'; +import { config, treeData, tree, editorConfig } from './fancy-tree.component.spec.data'; import { Router } from '@angular/router'; import { TreeService } from '../../services/tree/tree.service'; import { ToasterService } from '../../services/toaster/toaster.service'; import { ConfigService } from '../../services/config/config.service'; import { SuiModule } from 'ng2-semantic-ui-v9'; -import { HelperService } from 'collection-editor-library/lib/services/helper/helper.service'; -import { BranchingLogic } from '../question/question.component.spec.data'; describe('FancyTreeComponent', () => { let component: FancyTreeComponent; let fixture: ComponentFixture; - let editorService,helperService; + class RouterStub { navigate = jasmine.createSpy('navigate'); } beforeEach(async(() => { TestBed.configureTestingModule({ - providers: [EditorTelemetryService, EditorService, + providers: [EditorTelemetryService, TreeService, EditorService, { provide: Router, useClass: RouterStub }, ToasterService, - { provide: ConfigService, useValue: config }, - { provide: TreeService, useValue: mockTreeService }, - { provide: ChangeDetectorRef, useValue: { detectChanges: () => {} } } - ], + { provide: ConfigService, useValue: config }], imports: [HttpClientTestingModule, SuiModule], declarations: [ FancyTreeComponent, TelemetryInteractDirective ], schemas: [NO_ERRORS_SCHEMA] @@ -39,7 +33,6 @@ describe('FancyTreeComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(FancyTreeComponent); - editorService = TestBed.get(EditorService); component = fixture.componentInstance; // fixture.detectChanges(); }); @@ -48,28 +41,17 @@ describe('FancyTreeComponent', () => { expect(component).toBeTruthy(); }); - it('#ngOnInit() should call #initialize()', () => { + it('#ngOnInit() should call #buildTree()', () => { const editorService = TestBed.get(EditorService); component.nodes = { data: treeData }; spyOnProperty(editorService, 'editorConfig', 'get').and.returnValue(editorConfig); - spyOn(component, 'initialize'); - component.ngOnInit(); - expect(component.initialize).toHaveBeenCalled(); - }); - - it('#initialize() should call #buildTree()', () => { - component.nodes = { - data: treeData - }; spyOn(component, 'buildTree'); - component.initialize(); + component.ngOnInit(); expect(component.buildTree).toHaveBeenCalled(); }); - - it('#addFromLibrary() should call #emitshowLibraryPageEvent()', () => { const editorService: EditorService = TestBed.get(EditorService); spyOn(editorService, 'emitshowLibraryPageEvent').and.returnValue('showLibraryPage'); @@ -85,68 +67,6 @@ describe('FancyTreeComponent', () => { expect(component.renderTree).toHaveBeenCalled(); }); - it('call #eachNodeActionButton() to verify #visibility for root node', () => { - spyOn(component,'eachNodeActionButton').and.callThrough(); - component.config = mockData.config; - const rootNode = { - getLevel: () => 1, - folder: true, - data: { root: true }, - }; - component.eachNodeActionButton(rootNode); - expect(component.visibility.addFromLibrary).toBeFalsy(); - expect(component.visibility.createNew).toBeFalsy(); - expect(component.visibility.addChild).toBeTruthy(); - expect(component.visibility.addSibling).toBeFalsy(); - expect(component.eachNodeActionButton).toHaveBeenCalled(); - }); - - it('call #eachNodeActionButton() to verify #visibility for child node', () => { - component.config = mockData.config; - const node = { - getLevel: () => 2, - folder: true, - data: { root: false }, - }; - component.eachNodeActionButton(node); - expect(component.visibility.addChild).toBeTruthy(); - expect(component.visibility.addSibling).toBeTruthy(); - expect(component.visibility.addFromLibrary).toBeFalsy(); - expect(component.visibility.createNew).toBeFalsy(); - }); - - it('call #eachNodeActionButton() to verify #visibility for leaf node', () => { - component.config = mockData.config; - const node = { - getLevel: () => 3, - folder: true, - data: { root: false }, - }; - component.eachNodeActionButton(node); - expect(component.visibility.addChild).toBeFalsy(); - expect(component.visibility.addSibling).toBeTruthy(); - expect(component.visibility.addFromLibrary).toBeFalsy(); - expect(component.visibility.createNew).toBeFalsy(); - }); - - it('call #eachNodeActionButton() to verify #visibility when #bulkUploadProcessingStatus is true', () => { - component.config = mockData.config; - component.bulkUploadProcessingStatus = true; - const node = { - getLevel: () => 2, - folder: true, - data: { root: false }, - }; - component.eachNodeActionButton(node); - expect(component.visibility).toEqual({ - addChild: false, - addSibling: false, - addFromLibrary: false, - addQuestionFromLibrary: false, - createNew: false - }); - }); - it('#addFromLibrary() should call #emitshowLibraryPageEvent()', () => { const editorService: EditorService = TestBed.get(EditorService); spyOn(editorService, 'emitshowLibraryPageEvent'); @@ -297,9 +217,6 @@ describe('FancyTreeComponent', () => { spyOn(component, 'dropNode').and.callFake(() => { return true; }); - spyOn(editorService,'getDependentNodes').and.callFake(()=>{ - return {}; - }) const node = {}; component.dragDrop(node, data); expect(component.dropNode).toHaveBeenCalled(); @@ -365,71 +282,10 @@ describe('FancyTreeComponent', () => { it ('#dropNode() should drop node', () => { component.config = editorConfig.config; - spyOn(component, 'dropNode').and.callFake(() => { - return true; - }); const targetNode = { folder: false, getLevel: () => 2 }; - const contentNode: any = { hitMode: 'after', otherNode: { data:{id:"do_11330103476396851218"},getLevel: () => 1, moveTo: () => true }, node: { data: { root: false } }}; - component.dropNode(targetNode, contentNode); - const result = component.dragDrop(targetNode, contentNode); - - spyOn(editorService, 'getDependentNodes').and.returnValue({ - "source": [], - "target": [ - "do_1134347722012835841130", - "do_1134355563320688641163" - ] - }); + const contentNode: any = { hitMode: 'before', otherNode: { getLevel: () => 1, moveTo: () => true }, node: { data: { root: false } }}; + const result = component.dropNode(targetNode, contentNode); expect(result).toBeTruthy(); }); - it("#rearrangeBranchingLogic on the node drag and drop on tree structure",()=>{ - const currentSectionId='do_1134355577791283201172'; - const nodeId ='do_1134347235008512001125'; - const targetSectionId='do_1134347209749299201119'; - const dependentNodeIDs ={ - "source": [], - "target": [ - "do_1134347722012835841130", - "do_1134355563320688641163" - ] - }; - const movingNodeIds= ['do_1134347722012835841130', 'do_1134355563320688641163', 'do_1134347235008512001125']; - spyOn(component,"rearrangeBranchingLogic").and.callThrough(); - component.rearrangeBranchingLogic(nodeId, currentSectionId, targetSectionId, dependentNodeIDs, movingNodeIds); - expect(component.rearrangeBranchingLogic).toHaveBeenCalled(); - - }) - - it("#moveDependentNodes on the node drag and drop on tree structure",()=>{ - spyOn(component,'moveDependentNodes').and.callThrough(); - component.moveDependentNodes(TargetNodeMockData,CurrentNodeMockData); - expect(component.moveDependentNodes).toHaveBeenCalled(); - }); - - it('#rearrangeBranchingLogic() should call when drag and drop with branchingLogic is there ', () => { - const nodeId = "do_113449672558780416163"; - const currentSectionId = "do_1134460323602841601200"; - const targetSectionId = "do_1134460323604971521236"; - const movingNodeIds=[ - "do_113449672558780416163", - "do_113449775832088576181", - "do_113449787008081920183", - "do_113449808985628672185", - "do_11345671149997260811" - ]; - const dependentNodeIDs = { - source: [], - target: [ - "do_113449775832088576181", - "do_113449787008081920183", - "do_113449808985628672185", - "do_11345671149997260811" - ] - } - spyOn(component,'rearrangeBranchingLogic').and.callThrough(); - component.rearrangeBranchingLogic(nodeId,currentSectionId,targetSectionId,dependentNodeIDs,movingNodeIds); - expect(component.rearrangeBranchingLogic).toHaveBeenCalled(); - }); - -}); \ No newline at end of file +}); diff --git a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.ts b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.ts index 8043495f8..ceee8f66d 100755 --- a/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.ts +++ b/projects/collection-editor-library/src/lib/components/fancy-tree/fancy-tree.component.ts @@ -36,11 +36,6 @@ export class FancyTreeComponent implements OnInit, AfterViewInit, OnDestroy { public showAddSiblingButton: boolean; public rootNode: any; public showLibraryButton = false; - public unsubscribe$ = new Subject(); - public bulkUploadProcessingStatus = false; - public nodeParentDependentMap = {}; - public treeData: any = []; - public branchingObject = {}; public rootMenuTemplate = `
@@ -187,6 +144,7 @@ +
@@ -205,6 +163,6 @@ - - + \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/header/header.component.spec.data.ts b/projects/collection-editor-library/src/lib/components/header/header.component.spec.data.ts deleted file mode 100644 index 8b1378917..000000000 --- a/projects/collection-editor-library/src/lib/components/header/header.component.spec.data.ts +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/collection-editor-library/src/lib/components/header/header.component.spec.ts b/projects/collection-editor-library/src/lib/components/header/header.component.spec.ts index aafca3d14..102543a93 100755 --- a/projects/collection-editor-library/src/lib/components/header/header.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/header/header.component.spec.ts @@ -1,6 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { HeaderComponent } from './header.component'; -import { CUSTOM_ELEMENTS_SCHEMA, EventEmitter } from '@angular/core'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TelemetryInteractDirective } from '../../directives/telemetry-interact/telemetry-interact.directive'; @@ -97,11 +97,4 @@ describe('HeaderComponent', () => { expect(component.showPublishCollectionPopup).toBeTruthy(); expect(component.actionType).toBeDefined(); }); - it('#bulkUploadListener() should call #bulkUploadEmitter.emit()', () => { - const data = { status: true, type: 'updateHierarchy' }; - component.bulkUploadEmitter = new EventEmitter(); - spyOn(component.bulkUploadEmitter, 'emit'); - component.bulkUploadListener(data); - expect(component.bulkUploadEmitter.emit).toHaveBeenCalledWith(data) - }); }); diff --git a/projects/collection-editor-library/src/lib/components/header/header.component.ts b/projects/collection-editor-library/src/lib/components/header/header.component.ts index ab56c0a55..e4528bb83 100755 --- a/projects/collection-editor-library/src/lib/components/header/header.component.ts +++ b/projects/collection-editor-library/src/lib/components/header/header.component.ts @@ -4,8 +4,6 @@ import { EditorTelemetryService } from '../../services/telemetry/telemetry.servi import { ConfigService } from '../../services/config/config.service'; import * as _ from 'lodash-es'; import { NgForm } from '@angular/forms'; -import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'lib-header', @@ -20,7 +18,6 @@ export class HeaderComponent implements OnDestroy, OnInit { @Input() showComment: any; @Input() publishchecklist: any; @Output() toolbarEmitter = new EventEmitter(); - @Output() bulkUploadEmitter = new EventEmitter(); @ViewChild('FormControl') FormControl: NgForm; @ViewChild('modal') public modal; public visibility: any; @@ -29,34 +26,22 @@ export class HeaderComponent implements OnDestroy, OnInit { public showPublishCollectionPopup: boolean; public rejectComment: string; public actionType: string; - public objectType: string; public sourcingStatusText: string; public sourcingStatusClass: string; public originPreviewUrl: string; public correctionComments: string; - public unsubscribe$ = new Subject(); - public bulkUploadStatus = false; constructor(private editorService: EditorService, public telemetryService: EditorTelemetryService, public configService: ConfigService) { } async ngOnInit() { - this.editorService.bulkUploadStatus$.pipe(takeUntil(this.unsubscribe$)).subscribe((status) => { - if (status === 'processing') { - this.bulkUploadStatus = true; - } else { - this.bulkUploadStatus = false; - } - }); - this.objectType = _.get(this.editorService, 'editorConfig.config.objectType'); - await this.handleActionButtons(); - this.getSourcingData(); + await this.handleActionButtons() + this.getSourcingData() } async handleActionButtons() { this.visibility = {}; - this.visibility.editContent = this.editorService.editorMode === 'edit'; this.visibility.saveContent = this.editorService.editorMode === 'edit'; this.visibility.submitContent = this.editorService.editorMode === 'edit'; this.visibility.rejectContent = this.editorService.editorMode === 'review' || this.editorService.editorMode === 'orgreview'; @@ -66,11 +51,9 @@ export class HeaderComponent implements OnDestroy, OnInit { this.visibility.sourcingRejectContent = this.editorService.editorMode === 'sourcingreview'; this.visibility.previewContent = _.get(this.editorService, 'editorConfig.config.objectType') === 'QuestionSet'; this.visibility.dialcode = this.editorService.editorMode === 'edit'; - // tslint:disable-next-line:max-line-length - this.visibility.bulkUpload = _.get(this.editorService, 'editorConfig.config.objectType') === 'QuestionSet' && this.editorService.editorMode === 'edit'; this.visibility.showOriginPreviewUrl = _.get(this.editorService, 'editorConfig.config.showOriginPreviewUrl'); this.visibility.showSourcingStatus = _.get(this.editorService, 'editorConfig.config.showSourcingStatus'); - this.visibility.showCorrectionComments = _.get(this.editorService, 'editorConfig.config.showCorrectionComments'); + //this.visibility.showCorrectionComments = _.get(this.editorService, 'editorConfig.config.showCorrectionComments'); this.visibility.hideSubmitForReviewBtn = _.get(this.editorService, 'editorConfig.config.hideSubmitForReviewBtn') || false; this.visibility.addCollaborator = _.get(this.editorService, 'editorConfig.config.showAddCollaborator'); } @@ -96,20 +79,13 @@ export class HeaderComponent implements OnDestroy, OnInit { } publishEmitter(event) { this.showPublishCollectionPopup = false; - if (event.button === 'publishContent' || event.button === 'publishQuestion' || event.button === 'sourcingApprove' || event.button === 'sourcingApproveQuestion') { + if (event.button === 'publishContent' || event.button === 'sourcingApprove') { this.toolbarEmitter.emit(event) } } - - bulkUploadListener(event) { - this.bulkUploadEmitter.emit(event); - } - ngOnDestroy() { if (this.modal && this.modal.deny) { this.modal.deny(); } - this.unsubscribe$.next(); - this.unsubscribe$.complete(); } } diff --git a/projects/collection-editor-library/src/lib/components/library-list/library-list.component.html b/projects/collection-editor-library/src/lib/components/library-list/library-list.component.html index b9c236327..bc814662b 100644 --- a/projects/collection-editor-library/src/lib/components/library-list/library-list.component.html +++ b/projects/collection-editor-library/src/lib/components/library-list/library-list.component.html @@ -22,7 +22,7 @@
@@ -38,7 +38,7 @@

{{contentListDetails?.name}}
-
By {{contentListDetails?.board}} +
By {{contentListDetails?.board}} {{contentListDetails?.me_averageRating}}
diff --git a/projects/collection-editor-library/src/lib/components/library-player/library-player.component.ts b/projects/collection-editor-library/src/lib/components/library-player/library-player.component.ts index 0e56f3ddb..23962a19b 100644 --- a/projects/collection-editor-library/src/lib/components/library-player/library-player.component.ts +++ b/projects/collection-editor-library/src/lib/components/library-player/library-player.component.ts @@ -16,7 +16,7 @@ export class LibraryPlayerComponent implements OnInit { ngOnInit() { } addToLibrary() { - if (this.editorService.checkIfContentsCanbeAdded('add')) { + if (this.editorService.checkIfContentsCanbeAdded()) { this.moveEvent.emit({ action: 'openHierarchyPopup' }); diff --git a/projects/collection-editor-library/src/lib/components/library/library.component.ts b/projects/collection-editor-library/src/lib/components/library/library.component.ts index e27ba3969..a5d8289cc 100644 --- a/projects/collection-editor-library/src/lib/components/library/library.component.ts +++ b/projects/collection-editor-library/src/lib/components/library/library.component.ts @@ -9,7 +9,7 @@ import { Router } from '@angular/router'; import { HelperService } from '../../services/helper/helper.service'; @Component({ - selector: 'lib-content-library', + selector: 'lib-library', templateUrl: './library.component.html', styleUrls: ['./library.component.scss'], encapsulation: ViewEncapsulation.None, @@ -128,8 +128,7 @@ export class LibraryComponent implements OnInit, AfterViewInit, OnDestroy { if (!(_.get(response, 'result.count'))) { this.contentList = []; } else { - this.contentList = _.filter(_.compact(_.concat(_.get(response.result, 'content'), _.get(response.result, 'QuestionSet'))), - (item: any) => item.identifier !== this.collectionId); + this.contentList = _.compact(_.concat(_.get(response.result, 'content'), _.get(response.result, 'QuestionSet'))); this.filterContentList(); } }); diff --git a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.scss b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.scss index c7c5a0ae4..7b70a689a 100644 --- a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.scss +++ b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.scss @@ -43,6 +43,7 @@ } } .multi-select-section-app { + margin: 0.7rem 0 !important; label { margin-bottom: 0.3rem !important; z-index: inherit; @@ -140,12 +141,10 @@ label { padding: 0 !important; } } -/* .sb-checkbox { padding: 1.5rem 0; margin-top: 2rem; } -*/ sb-icon-dropdown { top: 10px !important; right: 6px !important; @@ -168,17 +167,6 @@ sb-icon-dropdown { } } } - sb-dynamic-checkbox{ - label{ - padding-left: 1.5rem !important; - &:after - { - color:#fff !important; - width:1rem!important; - height:1rem !important; - } - } - } } .sb-textbox[disabled="true"]{ opacity: 0.3 !important; @@ -209,22 +197,3 @@ lib-meta-form{ .fs-28 { font-size: 1.75rem; } .fs-30 { font-size: 1.875rem; } .fs-36 { font-size: 2.25rem; } - -[data-title]:hover::before { - content: attr(data-title); - position: absolute; - left: 0; - top: 20px !important; - bottom: initial !important; - display: inline-block; - padding: 3px 6px; - border-radius: 2px; - background: #fff; - color: #000; - font-size: 12px; - font-family: sans-serif; - white-space: normal !important; - border: solid 1px #ccc !important; - height: auto !important; - font-weight: 600 !important; -} diff --git a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.data.ts b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.data.ts index 8b119ac93..7a03e5d76 100644 --- a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.data.ts +++ b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.data.ts @@ -16,54 +16,6 @@ export const mockData = { "required": true, "visible": true }, - { - "code": "allowMultipleInstances", - "dataType": "text", - "description": "Enable multiple instances/submissions of questions in this section?", - "editable": true, - "index": 5, - "inputType": "radio", - "label": "Enable multiple instances/submissions of questions in this section?", - "name": "allowMultipleInstances", - "placeholder": "QR code required", - "renderingHints": { - "class": "sb-g-col-lg-2" - }, - "range": [ - "Yes", - "No" - ], - "required": true, - "visible": true - }, - { - "code": "instances", - "depends": [ - "allowMultipleInstances" - ], - "dataType": "text", - "description": "This label will show up on a button to record multiple solutions of questions in this section", - "editable": true, - "inputType": "text", - "label": "Add label", - "name": "instanceName", - "placeholder": "Enter label here", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": true, - "visible": true, - "validations": [ - { - "type": "minLength", - "value": "2" - }, - { - "type": "maxLength", - "value": "20" - } - ] - }, { "code": "name", "dataType": "text", @@ -127,212 +79,6 @@ export const mockData = { "placeholder": "Enter Keywords", "required": false, "validations": [] - }, - { - "code": "audience", - "dataType": "list", - "description": "Suggested User Type", - "editable": true, - "inputType": "nestedselect", - "label": "Suggested User Type", - "name": "userTypes", - "placeholder": "Suggested User Type", - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "required": false, - "visible": true, - "range": [ - "Education Official", - "School leaders (HMs)", - "Teachers", - "Students", - "Parents", - "Parent", - "Others" - ] - }, - { - "code": "description", - "name": "Description", - "label": "Description", - "placeholder": "Enter Description", - "description": "Description of the Question Set", - "dataType": "text", - "inputType": "textarea", - "editable": true, - "required": false, - "visible": true, - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "startDate", - "name": "startDate", - "label": "Start Date", - "placeholder": "Start Date", - "description": "Choose Start Date", - "dataType": "date", - "inputType": "date", - "editable": true, - "required": false, - "visible": true, - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "validations": [ - { - "type": "dateFormat", - "value": "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]", - "message": "Date format not matched" - } - ] - }, - { - 'code': 'author', - 'dataType': 'text', - 'description': 'Author of the content', - 'editable': true, - 'inputType': 'text', - 'label': 'Author', - 'name': 'Author', - 'placeholder': 'Author', - 'renderingHints': { - 'class': 'sb-g-col-lg-1' - }, - 'required': false, - 'visible': true - }, - { - 'code': 'license', - 'dataType': 'text', - 'description': 'license', - 'editable': true, - 'inputType': 'select', - 'label': 'License', - 'name': 'license', - 'placeholder': 'Select License', - 'renderingHints': { - 'class': 'sb-g-col-lg-1 required' - }, - 'required': true, - 'visible': true, - 'defaultValue': 'CC BY 4.0', - 'validations': [ - { - 'type': 'required', - 'message': 'License is required' - } - ], - 'default': 'CC BY 4.0', - 'range': [ - '@+kp_ft_license_102876130', - '@+kp_ft_license_132244417', - '@+kp_ft_license_164164056', - ] - }, - { - "code": "setPeriod", - "name": "setPeriod", - "label": "Set Period", - "placeholder": "Set period", - "description": "Set Period", - "dataType": "text", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "endDate", - "name": "endDate", - "depends": [ - "setPeriod" - ], - "label": "End Date", - "placeholder": "End Date", - "description": "Choose End Date", - "dataType": "date", - "inputType": "date", - "editable": true, - "required": false, - "visible": true, - "renderingHints": { - "class": "sb-g-col-lg-1" - }, - "validations": [ - { - "type": "dateFormat", - "value": "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]", - "message": "Date format not matched" - } - ] - }, - { - "code": "entityType", - "dataType": "text", - "description": "Select the entity i.e. district, block, cluster, schools for which the form is designed and is to be taken up. The users will be able to conduct observations for only the selected type of entities.", - "editable": true, - "inputType": "select", - "label": "Entity Type", - "name": "entityType", - "placeholder": "Entity Type", - "renderingHints": { - "class": "sb-g-col-lg-1 required" - }, - "required": true, - "visible": true, - "range": [ - "School", - "Block", - "Cluster", - "District" - ], - "validations": [ - { - "type": "required", - "message": "Name is required" - } - ] - }, - { - "code": "allowScoring", - "name": "allowScoring", - "label": "Enable Scoring", - "placeholder": "Enable Scoring", - "description": "Select to enable the option of scoring for questions in the form. Score can be added to questions only if this is selected", - "dataType": "text", - "inputType": "checkbox", - "editable": true, - "required": false, - "visible": true, - "renderingHints": { - "class": "sb-g-col-lg-1" - } - }, - { - "code": "license", - }, - /* - { - "code": "additionalCategories", - }, - { - "code": "copyright", - }, - { - "code": "maxQuestions", - }, - */ - { - "code": "author", - }, - { - "code": "showTimer", } ] } @@ -487,4 +233,4 @@ export const mockData = { } ] } -}; \ No newline at end of file +}; diff --git a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.ts b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.ts index 0e3b311f5..f92781a30 100644 --- a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.spec.ts @@ -3,8 +3,6 @@ import { MetaFormComponent } from './meta-form.component'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { mockData } from './meta-form.component.spec.data'; -import { TreeService } from '../../services/tree/tree.service'; -import { mockTreeService } from '../question/question.component.spec.data'; describe('MetaFormComponent', () => { let component: MetaFormComponent; let fixture: ComponentFixture; @@ -13,9 +11,6 @@ describe('MetaFormComponent', () => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], declarations: [MetaFormComponent], - providers:[ - { provide: TreeService, useValue: mockTreeService } - ], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); @@ -24,31 +19,12 @@ describe('MetaFormComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(MetaFormComponent); component = fixture.componentInstance; - component.appIcon='https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png'; - component.showAppIcon=true; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); - - it('#valueChanges() should call updateNode and emit toolbarEmitter with appIcon', () => { - spyOn(component,'valueChanges').and.callThrough(); - component.appIcon='https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png'; - component.showAppIcon=true; - const event={ - instances:"Add Student", - appIcon: 'https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png', - } - spyOn(component.toolbarEmitter, 'emit'); - spyOn(component.treeService, 'updateNode'); - component.valueChanges(event); - expect(component.valueChanges).toHaveBeenCalledWith(event); - expect(component.toolbarEmitter.emit).toHaveBeenCalled(); - }); - - it('#ngOnChanges() should call setAppIconData', () => { spyOn(component, 'fetchFrameWorkDetails'); spyOn(component, 'setAppIconData'); @@ -64,41 +40,38 @@ describe('MetaFormComponent', () => { expect(component.toolbarEmitter.emit).toHaveBeenCalledWith(data); }); it('#appIconDataHandler() should call updateAppIcon method', () => { - spyOn(component,'appIconDataHandler').and.callThrough(); // tslint:disable-next-line:max-line-length - const event = { url: 'https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png' }; - component.appIcon = event.url; + const data = { url: 'https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png' }; + component.appIcon = data.url; spyOn(component.treeService, 'updateAppIcon'); - component.appIconDataHandler(event); - expect(component.treeService.updateAppIcon).toHaveBeenCalledWith(event.url); - expect(component.appIconDataHandler).toHaveBeenCalled(); + component.appIconDataHandler(data); + expect(component.treeService.updateAppIcon).toHaveBeenCalledWith(data.url); }); it('#setAppIconData() should set appIcon', () => { - spyOn(component,'setAppIconData').and.callThrough(); - const nodeMetadataMock = { + const data = { data: { // tslint:disable-next-line:max-line-length metadata: { appIcon: 'https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png' } } }; - component.nodeMetadata = nodeMetadataMock; + component.nodeMetadata = data; component.appIconConfig = { - isAppIconEditable: true + isAppIconEditable: '' }; component.setAppIconData(); expect(component.appIcon).toBeDefined(); }); - - - it('call #ifFieldIsEditable() verify returning value', () => { - spyOn(component, 'isReviewMode').and.returnValue(false); - expect(component.ifFieldIsEditable('bloomsLevel', false)).toEqual(false); - }); - it('call #isReviewMode() verify returning value', () => { - expect(component.isReviewMode()).toEqual(false); + it('#valueChanges() should call updateNode and emit toolbarEmitter', () => { + const data = { + // tslint:disable-next-line:max-line-length + appIcon: 'https://sunbirddev.blob.core.windows.net/sunbird-content-dev/content/do_11320764935163904015/artifact/2020101299.png' + }; + spyOn(component.toolbarEmitter, 'emit'); + spyOn(component.treeService, 'updateNode'); + component.valueChanges(data); + expect(component.toolbarEmitter.emit).toHaveBeenCalledWith({ button: 'onFormValueChange', event: data }); + expect(component.treeService.updateNode).toHaveBeenCalledWith(data); }); - - it('#attachDefaultValues() should set formFieldProperties', () => { component.rootFormConfig = mockData.rootFormConfig; component.nodeMetadata = mockData.nodeMetaData; @@ -124,5 +97,4 @@ describe('MetaFormComponent', () => { component.fetchFrameWorkDetails(); expect(component.frameworkDetails).toBeDefined(); }); - }); diff --git a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.ts b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.ts index 1fc60b650..c60d6e97c 100644 --- a/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.ts +++ b/projects/collection-editor-library/src/lib/components/meta-form/meta-form.component.ts @@ -17,7 +17,7 @@ let framworkServiceTemp; styleUrls: ['./meta-form.component.scss'], encapsulation: ViewEncapsulation.None, }) -export class MetaFormComponent implements OnChanges, OnDestroy { +export class MetaFormComponent implements OnInit, OnChanges, OnDestroy { @Input() rootFormConfig: any; @Input() unitFormConfig: any; @Input() nodeMetadata: any; @@ -39,6 +39,8 @@ export class MetaFormComponent implements OnChanges, OnDestroy { this.setAppIconData(); } + ngOnInit() { + } setAppIconData() { const isRootNode = _.get(this.nodeMetadata, 'data.root'); @@ -82,6 +84,11 @@ export class MetaFormComponent implements OnChanges, OnDestroy { filter(data => _.get(data, `frameworkdata.${_.first(this.frameworkService.targetFrameworkIds)}`)) ).subscribe((frameworkDetails: any) => { if (frameworkDetails && !frameworkDetails.err) { + // const frameworkData = frameworkDetails.frameworkdata[this.frameworkService.targetFrameworkIds].categories; + // this.frameworkDetails.frameworkData = frameworkData; + // this.frameworkDetails.topicList = _.get(_.find(frameworkData, { + // code: 'topic' + // }), 'terms'); this.frameworkDetails.targetFrameworks = _.filter(frameworkDetails.frameworkdata, (value, key) => { return _.includes(this.frameworkService.targetFrameworkIds, key); }); @@ -94,12 +101,13 @@ export class MetaFormComponent implements OnChanges, OnDestroy { attachDefaultValues() { const metaDataFields = _.get(this.nodeMetadata, 'data.metadata'); - const isRootNode = _.get(this.nodeMetadata, 'data.root'); + // if (_.isEmpty(metaDataFields)) { return; } + const isRoot = _.get(metaDataFields, 'data.root'); const categoryMasterList = this.frameworkDetails.frameworkData || - !isRootNode && this.frameworkService.selectedOrganisationFramework && + !isRoot && this.frameworkService.selectedOrganisationFramework && _.get(this.frameworkService.selectedOrganisationFramework, 'framework.categories'); // tslint:disable-next-line:max-line-length - let formConfig: any = (_.get(metaDataFields, 'visibility') === 'Default') || isRootNode ? _.cloneDeep(this.rootFormConfig) : _.cloneDeep(this.unitFormConfig); + let formConfig: any = (_.get(metaDataFields, 'visibility') === 'Default') ? _.cloneDeep(this.rootFormConfig) : _.cloneDeep(this.unitFormConfig); formConfig = formConfig && _.has(_.first(formConfig), 'fields') ? formConfig : [{name: '', fields: formConfig}]; if (!_.isEmpty(this.frameworkDetails.targetFrameworks)) { _.forEach(this.frameworkDetails.targetFrameworks, (framework) => { @@ -128,7 +136,14 @@ export class MetaFormComponent implements OnChanges, OnDestroy { moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format(this.helperService.getTimerFormat(field)) : ''; } } - + + // const frameworkCategory = _.find(categoryMasterList, category => { + // return (category.code === field.sourceCategory || category.code === field.code) && !_.includes(field.code, 'target'); + // // }); + // if (!_.isEmpty(frameworkCategory)) { + // field.terms = frameworkCategory.terms; + // } + if (field.code === 'framework') { field.range = this.frameworkService.frameworkValues; field.options = this.getFramework; @@ -187,13 +202,6 @@ export class MetaFormComponent implements OnChanges, OnDestroy { if (field.code === 'instructions') { field.default = _.get(metaDataFields, 'instructions.default') || '' ; } - if(field.code === 'setPeriod'){ - field.default = !_.isEmpty(metaDataFields, 'endDate') ? 'Yes' : 'No' ; - } - - if(field.code === 'instances'){ - field.default = !_.isEmpty(metaDataFields, 'instances') ? _.get(metaDataFields,'instances.label') : '' ; - } if ((_.isEmpty(field.range) || _.isEmpty(field.terms)) && !field.editable && !_.isEmpty(field.default)) { @@ -223,21 +231,21 @@ export class MetaFormComponent implements OnChanges, OnDestroy { }); } - const ifEditable = this.ifFieldIsEditable(field.code, field.editable); + const ifEditable = this.ifFieldIsEditable(field.code); _.set(field, 'editable', ifEditable); }); }); this.formFieldProperties = _.cloneDeep(formConfig); + console.log(this.formFieldProperties); } isReviewMode() { return _.includes([ 'review', 'read', 'sourcingreview', 'orgreview' ], this.editorService.editorMode); } - ifFieldIsEditable(fieldCode, primaryCategoryEditableConfig?) { + ifFieldIsEditable(fieldCode) { const ediorMode = this.editorService.editorMode; if (!this.isReviewMode()) { - if(primaryCategoryEditableConfig === false) return false; return true; } const editableFields = _.get(this.editorService.editorConfig.config, 'editableFields'); @@ -253,11 +261,7 @@ export class MetaFormComponent implements OnChanges, OnDestroy { } valueChanges(event: any) { - if (_.get(event, 'instances')) { - event.instances = { - "label": event.instances - } - } + console.log(event); if (!_.isEmpty(this.appIcon) && this.showAppIcon) { event.appIcon = this.appIcon; } diff --git a/projects/collection-editor-library/src/lib/components/options/options.component.html b/projects/collection-editor-library/src/lib/components/options/options.component.html index 0d5cef888..d792705f9 100644 --- a/projects/collection-editor-library/src/lib/components/options/options.component.html +++ b/projects/collection-editor-library/src/lib/components/options/options.component.html @@ -1,85 +1,48 @@ - -
- - - - - - - -
- -
-
-
- - - - - -
-
- - -
-
- -
- - -
-
-
-
- + + +
+ +
+
+
+ + + + +
-
- - - -
-
-
-
- -
-

-
-
- - -
-
-
-
-
+
+ +
- +
+ +
+
\ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/options/options.component.scss b/projects/collection-editor-library/src/lib/components/options/options.component.scss index e8556c9b7..ec4de88bd 100644 --- a/projects/collection-editor-library/src/lib/components/options/options.component.scss +++ b/projects/collection-editor-library/src/lib/components/options/options.component.scss @@ -127,11 +127,4 @@ .sb-field-group .sb-left-icon-btn.sb-btn-xs{ padding: 0 !important; margin-top: -10px; -} - -.optionLabel{ - font-size: 12px !important; - margin-bottom: 0.5rem !important; - color: #121213e0; - font-weight: 600; } \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/options/options.component.spec.data.ts b/projects/collection-editor-library/src/lib/components/options/options.component.spec.data.ts index 106c4a8d3..fc69eef7c 100644 --- a/projects/collection-editor-library/src/lib/components/options/options.component.spec.data.ts +++ b/projects/collection-editor-library/src/lib/components/options/options.component.spec.data.ts @@ -95,34 +95,4 @@ export const mockOptionData = { qType: 'MCQ', primaryCategory: 'Multiple Choice Question', }, - subMenus : [ - [{ - id: 'addHint', - name: 'Add Hint', - value: 'test', - enabled: false, - type: 'input', - label: 'label', - show:true - }] - ] }; - -export const sourcingSettingsMock = { - enforceCorrectAnswer: false, - showSolution: false, - showAddHints: true, - showAddScore: false, - showAddTips: true, - showAddTranslation: true, - showAddSecondaryQuestion: false, -}; - - -export const nativeElement = `
`; - - \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/options/options.component.spec.ts b/projects/collection-editor-library/src/lib/components/options/options.component.spec.ts index 436ffd339..4bb618474 100644 --- a/projects/collection-editor-library/src/lib/components/options/options.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/options/options.component.spec.ts @@ -4,44 +4,18 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { FormsModule } from '@angular/forms'; import { OptionsComponent } from './options.component'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { mockOptionData, nativeElement, sourcingSettingsMock } from './options.component.spec.data'; +import { mockOptionData } from './options.component.spec.data'; import { ConfigService } from '../../services/config/config.service'; import { SuiModule } from 'ng2-semantic-ui-v9'; -import { TreeService } from '../../services/tree/tree.service'; -import { treeData } from './../fancy-tree/fancy-tree.component.spec.data'; -import { EditorTelemetryService } from '../../services/telemetry/telemetry.service'; -import { EditorService } from "../../services/editor/editor.service"; - -const mockEditorService = { - editorConfig: { - config: { - renderTaxonomy:true, - hierarchy: { - level1: { - name: "Module", - type: "Unit", - mimeType: "application/vnd.ekstep.content-collection", - contentType: "Course Unit", - iconClass: "fa fa-folder-o", - children: {}, - }, - }, - }, - }, - parentIdentifier: "" -}; - describe('OptionsComponent', () => { let component: OptionsComponent; let fixture: ComponentFixture; - let treeService,telemetryService; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ HttpClientTestingModule, FormsModule, SuiModule ], declarations: [ OptionsComponent, TelemetryInteractDirective ], - providers: [ConfigService,TreeService,EditorTelemetryService, - { provide: EditorService, useValue: mockEditorService },], + providers: [ConfigService], schemas: [ CUSTOM_ELEMENTS_SCHEMA ] }) .compileComponents(); @@ -49,18 +23,7 @@ describe('OptionsComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(OptionsComponent); - treeService = TestBed.get(TreeService); - telemetryService=TestBed.get(EditorTelemetryService); component = fixture.componentInstance; - component.sourcingSettings=sourcingSettingsMock; - spyOn(treeService, 'setTreeElement').and.callFake((el) => { - treeService.nativeElement = nativeElement; - }); - spyOn(treeService, 'getFirstChild').and.callFake(() => { - return { data: { metadata: treeData } }; - }); - component.editorState = mockOptionData.editorOptionData; - // fixture.detectChanges(); }); @@ -94,7 +57,6 @@ describe('OptionsComponent', () => { spyOn(component.editorDataOutput, 'emit').and.callThrough(); component.editorState = mockOptionData.editorOptionData; component.editorDataHandler(); - component.questionPrimaryCategory='Multiselect Multiple Choice Question'; expect(component.prepareMcqBody).toHaveBeenCalledWith(mockOptionData.editorOptionData); expect(component.editorDataOutput.emit).toHaveBeenCalled(); }); @@ -103,23 +65,19 @@ describe('OptionsComponent', () => { spyOn(component, 'getResponseDeclaration').and.callThrough(); spyOn(component, 'getInteractions').and.callThrough(); const result = component.prepareMcqBody(mockOptionData.editorOptionData); - // expect(mockOptionData.prepareMcqBody).toEqual(result); + expect(mockOptionData.prepareMcqBody).toEqual(result); expect(component.getResponseDeclaration).toHaveBeenCalledWith(mockOptionData.editorOptionData); expect(component.getInteractions).toHaveBeenCalledWith(mockOptionData.editorOptionData.options); }); it('#getResponseDeclaration() should return expected response declaration', () => { - spyOn(component,"getResponseDeclaration").and.callThrough(); - component.getResponseDeclaration(mockOptionData.editorOptionData); - expect(component.getResponseDeclaration).toHaveBeenCalled(); - // expect(mockOptionData.prepareMcqBody.responseDeclaration).toEqual(result); + const result = component.getResponseDeclaration(mockOptionData.editorOptionData); + expect(mockOptionData.prepareMcqBody.responseDeclaration).toEqual(result); }); it('#getInteractions() should return expected response declaration', () => { - spyOn(component,"getInteractions").and.callThrough(); - component.getInteractions(mockOptionData.editorOptionData.options); - expect(component.getInteractions).toHaveBeenCalled(); - // expect(mockOptionData.prepareMcqBody.interactions).toEqual(result); + const result = component.getInteractions(mockOptionData.editorOptionData.options); + expect(mockOptionData.prepareMcqBody.interactions).toEqual(result); }); it('#setTemplete() should set #templateType to "mcq-vertical-split" ', () => { @@ -131,31 +89,4 @@ describe('OptionsComponent', () => { expect(component.editorDataHandler).toHaveBeenCalled(); }); - it('#subMenuChange() should set the sub-menu value ', () => { - component.subMenus = mockOptionData.subMenus; - spyOn(component, 'subMenuChange').and.callThrough(); - component.subMenuChange({index:1,value:'test'},1) - expect(component.subMenus[0][0].value).toBe('test'); - }) - - it('#subMenuConfig() should set on initialize', () => { - spyOn(component,'subMenuConfig').and.callThrough(); - const options = [ - { - "body": "

true

" - } - ]; - component.subMenuConfig(options); - expect(component.subMenuConfig).toHaveBeenCalledWith(options) - }) - - it('#setScore() should call if score is entered', () => { - spyOn(component,'setScore').and.callThrough(); - const value = "20"; - const scoreIndex = 1; - component.setScore(value,scoreIndex); - component.editorDataHandler(); - expect(component.setScore).toHaveBeenCalled(); - }); - }); diff --git a/projects/collection-editor-library/src/lib/components/options/options.component.ts b/projects/collection-editor-library/src/lib/components/options/options.component.ts index 9507a5cbf..4b5d889d5 100644 --- a/projects/collection-editor-library/src/lib/components/options/options.component.ts +++ b/projects/collection-editor-library/src/lib/components/options/options.component.ts @@ -2,9 +2,6 @@ import { Component, OnInit, Input, EventEmitter, Output, ViewEncapsulation } fro import * as _ from 'lodash-es'; import { EditorTelemetryService } from '../../services/telemetry/telemetry.service'; import { ConfigService } from '../../services/config/config.service'; -import { SubMenu } from '../question-option-sub-menu/question-option-sub-menu.component'; -import { TreeService } from '../../services/tree/tree.service'; -import { EditorService } from '../../services/editor/editor.service'; @Component({ selector: 'lib-options', templateUrl: './options.component.html', @@ -14,35 +11,17 @@ import { EditorService } from '../../services/editor/editor.service'; export class OptionsComponent implements OnInit { @Input() editorState: any; @Input() showFormError; - @Input() sourcingSettings; - @Input() questionPrimaryCategory; - @Input() mapping = []; - @Input() isReadOnlyMode; @Output() editorDataOutput: EventEmitter = new EventEmitter(); public setCharacterLimit = 160; public setImageLimit = 1; public templateType = 'mcq-vertical'; - subMenus: SubMenu[][]; - hints = []; - showSubMenu:boolean=false; - parentMeta: any; - constructor( - public telemetryService: EditorTelemetryService, - public configService: ConfigService, - public treeService: TreeService, - private editorService: EditorService - ) {} + constructor(public telemetryService: EditorTelemetryService, public configService: ConfigService) { } ngOnInit() { if (!_.isUndefined(this.editorState.templateId)) { this.templateType = this.editorState.templateId; } this.editorDataHandler(); - this.mapping = _.get(this.editorState, 'responseDeclaration.response1.mapping') || []; - if(!_.isUndefined(this.editorService.editorConfig.config.renderTaxonomy)){ - this.parentMeta = this.treeService.getFirstChild().data.metadata; - this.showSubMenu=true; - } } editorDataHandler(event?) { @@ -64,15 +43,15 @@ export class OptionsComponent implements OnInit { }); metadata = { templateId: this.templateType, - name: this.questionPrimaryCategory || 'Multiple Choice Question', + name: 'Multiple Choice Question', responseDeclaration: this.getResponseDeclaration(editorState), interactionTypes: ['choice'], interactions: this.getInteractions(editorState.options), editorState: { - options, + options }, qType: 'MCQ', - primaryCategory: this.questionPrimaryCategory || 'Multiple Choice Question', + primaryCategory: 'Multiple Choice Question' }; return metadata; } @@ -85,10 +64,9 @@ export class OptionsComponent implements OnInit { type: 'integer', correctResponse: { value: editorState.answer, - outcomes: { SCORE: 1 }, - }, - mapping: this.mapping, - }, + outcomes: { SCORE: 1 } + } + } }; return responseDeclaration; } @@ -97,15 +75,13 @@ export class OptionsComponent implements OnInit { let index; const interactOptions = _.map(options, (opt, key) => { index = Number(key); - const hints = _.get(this.editorState, `interactions.response1.options[${index}].hints`) - return { label: opt.body, value: index, hints }; + return { label: opt.body, value: index }; }); - this.subMenuConfig(options); const interactions = { response1: { type: 'choice', - options: interactOptions, - }, + options: interactOptions + } }; return interactions; } @@ -115,36 +91,5 @@ export class OptionsComponent implements OnInit { this.editorDataHandler(); } - subMenuChange({ index, value }, optionIndex) { - _.set(this.editorState, `interactions.response1.options[${optionIndex}].hints.en`, value) - } - - subMenuConfig(options) { - this.subMenus = [] - options.map((opt, index) => { - const value = _.get(this.editorState, `interactions.response1.options[${index}].hints.en`) - this.subMenus[index] = [ - { - id: 'addHint', - name: 'Add Hint', - value, - label: 'Hint', - enabled: value ? true : false, - type: 'input', - show: _.get(this.sourcingSettings, 'showAddHints'), - }, - ]; - }); - } - - setScore(value, scoreIndex) { - const obj = { - respone: scoreIndex, - outcomes: { - score: value, - }, - }; - this.mapping[scoreIndex] = obj; - this.editorDataHandler(); - } } + diff --git a/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.html b/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.html index 6a5746915..5e69502c5 100644 --- a/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.html +++ b/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.html @@ -1,10 +1,10 @@
- {{ configService.labelConfig?.lbl?.publishCollection | interpolate: '${objectType}': objectType }} + {{configService.labelConfig?.lbl?.publishCollection}}
- {{configService.labelConfig?.lbl?.confirmPublishCollection | interpolate: '${objectType}': objectType}} + {{configService.labelConfig?.lbl?.confirmPublishCollection}}
{{configService.labelConfig?.lbl?.publishchecklistTitle}}
@@ -23,4 +23,4 @@ {{configService.labelConfig?.button_labels?.no_btn_label}}
-
+ \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.spec.ts b/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.spec.ts index 21d5237e8..5237e565f 100644 --- a/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.spec.ts +++ b/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.spec.ts @@ -7,8 +7,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TelemetryInteractDirective } from '../../directives/telemetry-interact/telemetry-interact.directive'; import { EditorService } from '../../services/editor/editor.service'; import {mockData} from './publish-checklist.component.spec.data'; -import {InterpolatePipe} from '../../pipes/interpolate.pipe'; - describe('PublishChecklistComponent', () => { let component: PublishChecklistComponent; let fixture: ComponentFixture; @@ -17,7 +15,7 @@ describe('PublishChecklistComponent', () => { TestBed.configureTestingModule({ imports: [FormsModule, ReactiveFormsModule, HttpClientTestingModule], providers: [EditorService], - declarations: [PublishChecklistComponent, TelemetryInteractDirective, InterpolatePipe], + declarations: [PublishChecklistComponent, TelemetryInteractDirective], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) .compileComponents(); @@ -88,4 +86,4 @@ describe('PublishChecklistComponent', () => { component.valueChanges(event); expect(component.fieldsAvailable).toBeDefined(); }); -}); +}); \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.ts b/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.ts index 41c05e0d2..6f77e75c6 100644 --- a/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.ts +++ b/projects/collection-editor-library/src/lib/components/publish-checklist/publish-checklist.component.ts @@ -11,7 +11,6 @@ import * as _ from 'lodash-es'; export class PublishChecklistComponent implements OnInit { @Input() publishchecklist: any; @Input() actionType: any; - @Input() objectType: string; @Output() publishEmitter = new EventEmitter(); public isButtonEnable = false; public fieldsAvailable: any; @@ -56,4 +55,4 @@ export class PublishChecklistComponent implements OnInit { valueChanges(event: any) { this.fieldsAvailable = event; } -} +} \ No newline at end of file diff --git a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.css b/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.css deleted file mode 100644 index 1a9fcac86..000000000 --- a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.css +++ /dev/null @@ -1,6 +0,0 @@ -label { - font-size: 12px !important; - margin-bottom: 0.5rem !important; - color: #121213e0; - font-weight: 600; -} diff --git a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.html b/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.html deleted file mode 100644 index 681aadd93..000000000 --- a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
- -
-
-
-
-
- -
- - -
-
-
diff --git a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.spec.ts b/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.spec.ts deleted file mode 100644 index e246a5869..000000000 --- a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { QuestionOptionSubMenuComponent } from './question-option-sub-menu.component'; -import { mockData } from './question-option-sub-menu.spec.data'; - -describe('QuestionOptionSubMenuComponent', () => { - let component: QuestionOptionSubMenuComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [QuestionOptionSubMenuComponent], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(QuestionOptionSubMenuComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - it('#onMenuClick() should enable the submenu if type is input ', () => { - component.subMenus = mockData.subMenus; - spyOn(component, 'onMenuClick').and.callThrough(); - component.onMenuClick(1) - expect(component.subMenus[1].enabled).toBe(true); - }); - it('#onMenuClick() should push dependant question if input value is array ', () => { - component.subMenus = mockData.subMenus; - spyOn(component, 'onMenuClick').and.callThrough(); - component.onMenuClick(2) - expect(component.subMenus[2].value.length).toBe(0); - }); - it('#onValueChange() should emit the value if type is input ', () => { - component.subMenus = mockData.subMenus; - spyOn(component, 'onValueChange').and.callThrough(); - spyOn(component.onChange, 'emit') - - let ev = { - target:{value:'text'} - } - component.onValueChange(ev,1) - expect(component.onValueChange).toHaveBeenCalled(); - expect(component.onChange.emit).toHaveBeenCalled() - }); -}); diff --git a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.ts b/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.ts deleted file mode 100644 index 642867b42..000000000 --- a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -export class SubMenuEvent { - index: number; - value: any; -} -export interface SubMenu { - id: string; - name: string; - label: string; - value: string|any[]; - enabled: boolean; - type: string; - show: boolean; -} -@Component({ - selector: 'lib-question-option-sub-menu', - templateUrl: './question-option-sub-menu.component.html', - styleUrls: ['./question-option-sub-menu.component.css'], -}) -export class QuestionOptionSubMenuComponent { - @Input() subMenus: SubMenu[]; - @Output() public onChange: EventEmitter = new EventEmitter(); - - - onMenuClick(index) { - const selectedMenu = this.subMenus[index]; - selectedMenu.enabled = !selectedMenu.enabled; - if (selectedMenu.enabled && selectedMenu.type !== 'input' && Array.isArray(selectedMenu.value)) { - this.onChange.emit({index, value: undefined}); - } - } - - onValueChange(event, index) { - if (this.subMenus[index].type === 'input') { this.subMenus[index].value = event.target.value; } - this.onChange.emit({ index, value: event.target.value}); - } -} diff --git a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.spec.data.ts b/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.spec.data.ts deleted file mode 100644 index 4a8246034..000000000 --- a/projects/collection-editor-library/src/lib/components/question-option-sub-menu/question-option-sub-menu.spec.data.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const mockData = { - subMenus: [ - { - id: 'addHint', - name: 'Add Hint', - value: '', - enabled: false, - type: 'input', - label: 'label', - show: true, - }, - { - id: 'addTip', - name: 'Add Tip', - value: '', - enabled: false, - type: 'input', - label: 'label', - show: true, - }, - { - id: 'addDependantQuestion', - name: 'Add Dependant Question', - value: [], - enabled: false, - type: '', - label: 'label', - show: true, - }, - ], -}; diff --git a/projects/collection-editor-library/src/lib/components/question/question.component.html b/projects/collection-editor-library/src/lib/components/question/question.component.html index 0de1254c4..adc1dd1d7 100644 --- a/projects/collection-editor-library/src/lib/components/question/question.component.html +++ b/projects/collection-editor-library/src/lib/components/question/question.component.html @@ -1,6 +1,3 @@ -
- -
@@ -10,173 +7,105 @@
- +
-
-
- - - - - - -
-
-
+
- +
-
+
- - -
-

-
-
- + (editorDataOutput)="editorDataHandler($event)"> + (editorDataOutput)="editorDataHandler($event)"> - - - -
- -