Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #IQ-608 feat: server evaluable changes #129

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -319,11 +319,7 @@ export const toolbarConfig_question = {
done_btn_label: 'Done'
};

export const nativeElement = `<div><ul id="ft-id-1" class="ui-fancytree fancytree-container fancytree-plain fancytree-ext-glyph fancytree-ext-dnd5 fancytree-connectors" tabindex="0" role="tree" aria-multiselectable="true"><li role="treeitem" aria-expanded="false" aria-selected="false" class="fancytree-lastsib"><span class="fancytree-node fancytree-folder fancytree-has-children fancytree-lastsib fancytree-exp-cl fancytree-ico-cf" draggable="true"><span role="button" class="fancytree-expander fa fa-caret-right"></span><span role="presentation" class="fancytree-custom-icon fa fa-book"></span><span class="fancytree-title" title="SB23410q" style="width:15em;text-overflow:ellipsis;white-space:nowrap;overflow:hidden">SB23410q</span><span class="ui dropdown sb-dotted-dropdown" autoclose="itemClick" suidropdown="" tabindex="0" style="display: none;"> <span id="contextMenu" class="p-0 w-auto"><i class="icon ellipsis vertical sb-color-black"></i></span>
<span id="contextMenuDropDown" class="menu transition hidden" suidropdownmenu="" style="">
<div id="addchild" class="item">Add Child</div>
</span>
</span></span></li></ul></div>`;
export const nativeElement = `<div><ul id="ft-id-1" class="ui-fancytree fancytree-container fancytree-plain fancytree-ext-glyph fancytree-ext-dnd5 fancytree-connectors" tabindex="0" role="tree" aria-multiselectable="true"><li role="treeitem" aria-selected="false" class="fancytree-lastsib"><span class="fancytree-node fancytree-folder fancytree-lastsib fancytree-exp-nl fancytree-ico-cf" draggable="true"><span class="fancytree-expander fa "></span><span role="presentation" class="fancytree-custom-icon fa fa-book"></span><span class="fancytree-title" title="Untitled QuestionSet" style="width:15em;text-overflow:ellipsis;white-space:nowrap;overflow:hidden">Untitled QuestionSet</span><span class="ui dropdown sb-dotted-dropdown" autoclose="itemClick" suidropdown="" tabindex="0" style="display: none;"><span id="contextMenu" class="p-0 w-auto"><i class="icon ellipsis vertical sb-color-black"></i></span><span id="contextMenuDropDown" class="menu transition hidden" suidropdownmenu="" style=""><div id="addchild" class="item">Add Child</div></span></span></span></li></ul></div>`;

export const getCategoryDefinitionResponse = {
id: 'api.object.category.definition.read',
Expand Down Expand Up @@ -1692,6 +1688,7 @@ export const treeNodeData = {
board: 'CBSE',
status: 'Draft',
showEvidence: 'No',
serverMode: true
},
root: false,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ describe('EditorComponent', () => {
let component: EditorComponent;
let fixture: ComponentFixture<EditorComponent>;
let toasterService;
let editorService: EditorService;
let treeService: TreeService;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule, FormsModule, ReactiveFormsModule, RouterTestingModule],
declarations: [EditorComponent, TelemetryInteractDirective],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
providers: [EditorTelemetryService, EditorService, ToasterService,
providers: [EditorTelemetryService, EditorService, ToasterService, TreeService,
{ provide: ConfigService, useValue: configStub }
]
})
Expand All @@ -52,6 +54,8 @@ describe('EditorComponent', () => {
fixture = TestBed.createComponent(EditorComponent);
component = fixture.componentInstance;
toasterService = TestBed.inject(ToasterService);
editorService = TestBed.inject(EditorService);
treeService = TestBed.inject(TreeService);
// tslint:disable-next-line:no-string-literal
editorConfig.context['targetFWIds'] = ['nit_k12'];
// tslint:disable-next-line:no-string-literal
Expand Down Expand Up @@ -752,17 +756,20 @@ describe('EditorComponent', () => {

it('#showQuestionLibraryComponentPage() should set #addQuestionFromLibraryButtonLoader to false and call #saveContent()',
() => {
const editorService = TestBed.inject(EditorService);
const treeService = TestBed.inject(TreeService);
editorService.templateList = ['Subjective Question'];
component.collectionId = 'do_12345';
component.organisationFramework = 'nit_k12';
component.editorConfig = editorConfig_question;
component.questionlibraryInput.searchFormConfig = categoryDefinition.result.objectCategoryDefinition.forms.searchConfig;
component.questionComponentInput.metadataFormConfig = categoryDefinition.result.objectCategoryDefinition.forms.childMetadata;
spyOn(treeService, 'getActiveNode').and.returnValue({data: {metadata: {}}});
spyOn(editorService, 'getContentChildrens').and.returnValue([{}, {}]);
component.questionlibraryInput.metadataFormConfig = categoryDefinition.result.objectCategoryDefinition.forms.childMetadata;
treeService.treeNativeElement = nativeElement;
spyOn(treeService, 'getActiveNode').and.returnValue({data: {metadata: {}}});
editorService.contentsCount = 0;
spyOn(editorService, 'getContentChildrens').and.returnValue([]);
spyOn(editorService, 'checkIfContentsCanbeAdded').and.returnValue(true);
const serverMode = {data: {metadata: {serverMode: true}}};
spyOn(treeService, 'getFirstChild').and.callFake(()=> serverMode);
let result = treeService.getEval();
spyOn(component, 'saveContent').and.callFake(() => {
return Promise.resolve('success');
});
Expand All @@ -772,6 +779,9 @@ describe('EditorComponent', () => {
expect(treeService.getActiveNode).toHaveBeenCalled();
expect(component.buttonLoaders.addQuestionFromLibraryButtonLoader).toBeFalsy();
expect(component.questionlibraryInput).toBeDefined();
expect(editorService.getContentChildrens).toHaveBeenCalled();
expect(treeService.getFirstChild).toHaveBeenCalled();
expect(result).toBe(true)
expect(component.pageId).toEqual('question_library');
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -545,13 +545,16 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit {
},
targetPrimaryCategories: questionCategory,
collectionId: this.collectionId,
existingcontentCounts: this.editorService.getContentChildrens().length,
collection: activeNode?.data?.metadata,
framework: this.organisationFramework,
editorConfig: this.editorConfig,
searchFormConfig: this.questionlibraryInput.searchFormConfig,
metadataFormConfig: this.questionlibraryInput.metadataFormConfig
};
if(this.treeService.getEval()) {
this.questionlibraryInput.collection.evalMode = "server"
}
this.questionlibraryInput.existingcontentCounts = this.editorService.getContentChildrens().length
this.pageId = 'question_library';
console.log(this.questionlibraryInput);
}).catch(((error: string) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,9 @@ export const mockData = {
},
{
code: 'showTimer',
},
{
code: 'serverMode'
}
]
}
Expand Down Expand Up @@ -415,6 +418,7 @@ export const mockData = {
createdBy: '5a587cc1-e018-4859-a0a8-e842650b9d64',
compatibilityLevel: 5,
navigationMode: 'non-linear',
serverMode: true,
timeLimits: {
questionSet: {
min: 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,9 @@ export class MetaFormComponent implements OnChanges, OnDestroy {
if (field.code === 'allowECM') {
field.default = _.get(metaDataFields, 'recordedBy') !== 'Self' ? 'Yes' : 'No' ;
}
if (field.code === 'serverMode') {
field.default = _.get(metaDataFields, 'serverMode') === true || _.get(metaDataFields, 'evalMode') == this.configService.editorConfig.evalMode;
}

if (field.code === 'instances') {
field.default = !_.isEmpty(metaDataFields, 'instances') ? _.get(metaDataFields, 'instances.label') : '' ;
Expand Down Expand Up @@ -335,6 +338,7 @@ export class MetaFormComponent implements OnChanges, OnDestroy {
data.appIcon = this.appIcon;
}
this.toolbarEmitter.emit({ button: 'onFormValueChange', data });
delete data.selectedQuestionType;
this.treeService.updateNode(data);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2991,6 +2991,9 @@ export const mockTreeService = {
return {
data: {
id: "do_11330103476396851218",
metadata: {
evalMode: 'server'
}
},
getParent: () => {
return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,10 @@ export class QuestionComponent implements OnInit, AfterViewInit, OnDestroy {
this.editorService.data = {};
this.editorService.selectedSection = selectedUnitId;
let metaData = this.getQuestionMetadata();
const evalMode = data?.data?.evalMode || data?.data?.metadata?.evalMode || activeNode?.data.metadata?.evalMode;
if(evalMode){
metaData.evalMode = evalMode;
}
this.setQuestionTypeValues(metaData);
return {
nodesModified: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
"contentPrimaryCategories": ["Course Assessment", "eTextbook", "Explanation Content", "Learning Resource", "Practice Question Set"],
"readQuestionFields": "body,primaryCategory,mimeType,qType,answer,templateId,responseDeclaration,interactionTypes,interactions,name,solutions,editorState,media,remarks,evidence,hints,instructions,outcomeDeclaration,",
"omitFalseyProperties":["topic", "topicsIds", "targetTopicIds", "keywords"],
"evaluableQuestionSet": "PIAA Question Set",
"evalMode": "server",
"questionSet": {
"maxQuestionsLimit": 500
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DataService } from './../data/data.service';
import { editorConfig, BranchingLogicData, treeNodeData, rootNodeData, hierarchyRootNodeData } from './../../components/editor/editor.component.spec.data';
import { editorConfig, BranchingLogicData, treeNodeData, rootNodeData, hierarchyRootNodeData, nativeElement } from './../../components/editor/editor.component.spec.data';
import { TestBed } from '@angular/core/testing';
import { EditorService } from './editor.service';
import { HttpClientModule, HttpClient } from '@angular/common/http';
Expand All @@ -12,9 +12,12 @@ import { of } from 'rxjs';
import { PublicDataService } from '../public-data/public-data.service';
import { ToasterService } from '../../services/toaster/toaster.service';
import { TreeService } from '../tree/tree.service';
import * as treeData from '../../services/tree/tree.service.spec.data';
import * as mockData from './editor.service.spec.data';
import { map } from 'rxjs/operators';
import * as _ from 'lodash-es';
import 'jquery.fancytree';
declare var $: any;

describe('EditorService', () => {
let editorService: EditorService;
Expand Down Expand Up @@ -431,7 +434,10 @@ describe('EditorService', () => {
});

it('#getCollectionHierarchy should call', () => {
treeService.treeCache.nodesModified = treeData.treeNode;
treeService.treeNativeElement = nativeElement;
spyOn(editorService, 'getCollectionHierarchy').and.callThrough();
spyOn(editorService, 'getUpdatedNodeMetaData').and.callFake(() => { return treeService.treeCache.nodesModified });
spyOn(treeService, 'getFirstChild').and.callFake(() => {
return { data: { metadata: { identifier: '0123' } } };
});
Expand All @@ -443,7 +449,10 @@ describe('EditorService', () => {
});

it('#getCollectionHierarchy should call when folder false', () => {
treeService.treeCache.nodesModified = treeData.treeNode;
treeService.treeNativeElement = nativeElement;
spyOn(editorService, 'getCollectionHierarchy').and.callThrough();
spyOn(editorService, 'getUpdatedNodeMetaData').and.callFake(() => { return treeService.treeCache.nodesModified });
spyOn(treeService, 'getFirstChild').and.callFake(() => {
return { data: { metadata: { identifier: '0123' } } };
});
Expand All @@ -455,16 +464,39 @@ describe('EditorService', () => {
});

it('#getCollectionHierarchy should call when no section id and parent', () => {
treeService.treeCache.nodesModified = treeData.treeNode;
spyOn(treeService, 'setTreeElement').and.returnValue(nativeElement)
spyOn(editorService, 'getCollectionHierarchy').and.callThrough();
spyOn(treeService, 'getFirstChild').and.callFake(() => {
return { data: { metadata: { identifier: '0123' } } };
});
spyOn(editorService.treeService, 'getFirstChild').and.callFake(() => treeData.treeNode.data);
spyOn(editorService, 'getUpdatedNodeMetaData').and.callFake(() => { return treeService.treeCache.nodesModified });
hierarchyRootNodeData.folder = false;
editorService.getHierarchyObj(hierarchyRootNodeData);
editorService.getCollectionHierarchy();
expect(editorService.getCollectionHierarchy).toHaveBeenCalled();
});

it('#getUpdatedNodeMetaData should return root nodesModified data', () => {
treeService.treeCache.nodesModified = {"da0ac2f0-1ea3-464a-bc03-f62b71415837": {root: false, metadata: {}}};
treeService.treeNativeElement = nativeElement;
spyOn(treeService, 'getFirstChild').and.callFake(() => {
return { data: { metadata: { identifier: '0123', evalMode: 'server' } } };
});
spyOn(editorService, 'getUpdatedNodeMetaData').and.callThrough();
editorService.getUpdatedNodeMetaData();
expect(editorService.getUpdatedNodeMetaData).toHaveBeenCalled();
});

it('#getUpdatedNodeMetaData should delete serverMode property', () => {
treeService.treeCache.nodesModified = {"da0ac2f0-1ea3-464a-bc03-f62b71415837": {root: true, metadata: {serverMode: true}}};
treeService.treeNativeElement = nativeElement;
spyOn(treeService, 'getFirstChild').and.callFake(() => {
return { data: { metadata: { identifier: '0123', evalMode: 'server' } } };
});
spyOn(editorService, 'getUpdatedNodeMetaData').and.callThrough();
editorService.getUpdatedNodeMetaData();
expect(editorService.getUpdatedNodeMetaData).toHaveBeenCalled();
});

it('#_toFlatObjFromHierarchy should call', () => {
spyOn(editorService, '_toFlatObjFromHierarchy').and.callThrough();
spyOn(treeService, 'getFirstChild').and.callFake(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { EditorTelemetryService } from '../../services/telemetry/telemetry.servi
import { DataService } from '../data/data.service';
import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
import 'jquery.fancytree';
declare let $: any;
interface SelectedChildren {
label?: string;
primaryCategory?: string;
Expand Down Expand Up @@ -397,11 +399,29 @@ export class EditorService {
this.data = {};
const data = this.treeService.getFirstChild();
return {
nodesModified: this.treeService.treeCache.nodesModified,
nodesModified: this.getUpdatedNodeMetaData(),
hierarchy: instance.getHierarchyObj(data)
};
}

getUpdatedNodeMetaData() {
const parentNodeId = _.findKey(this.treeService.treeCache.nodesModified,(node)=>{
return node.root;
});
const parentNode = this.treeService.getFirstChild().data;

_.forEach(this.treeService.treeCache.nodesModified, (node, nodeId)=>{
if(!node.root && parentNode?.evalMode || parentNode?.metadata?.evalMode){
this.treeService.treeCache.nodesModified[nodeId].metadata.evalMode = parentNode?.evalMode || parentNode?.metadata?.evalMode;
}

})
if(this.treeService.treeCache.nodesModified[parentNodeId]?.metadata.hasOwnProperty('serverMode')) {
delete this.treeService.treeCache.nodesModified[parentNodeId]?.metadata?.serverMode
}
return this.treeService.treeCache.nodesModified;
}

getHierarchyObj(data, questionId?, selectUnitId?, parentId?) {
const instance = this;
if (data?.data) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export const treeNode = {
"keywords": [
"test"
],
"serverMode": true,
"subject": [
"History"
],
Expand Down Expand Up @@ -63,6 +64,7 @@ export const treeNode = {
"medium": [
"English"
],
"evalMode": "server",
"createdOn": "2021-04-22T14:23:40.169+0000",
"contentDisposition": "inline",
"additionalCategories": [
Expand Down Expand Up @@ -96,9 +98,74 @@ export const treeNode = {
"maxTime": "00:06:00",
"warningTime": "00:00:10",
"summaryType": null
}
},
root: true
},
getLevel: ()=> {
return 2;
}
};
};

export const treeCache = {
"nodesModified": {
"do_113263678834016256111": {
"root": true,
"objectType": "QuestionSet",
"metadata": {
"name": "Testing6",
"primaryCategory": "PIAA Question Set",
"showTimer": "No",
"requiresSubmit": "No",
"copyright": "UPHRH_TEST",
"license": "CC BY 4.0",
"attributions": [],
"timeLimits": {
"questionSet": {
"max": 0,
"min": 0
}
},
"description": "desc",
"board": "General Nursing Midwifery",
"medium": [
"Sociology"
],
"gradeLevel": [
"Describes about social groups social change control stratification and social problems"
],
"subject": [
"Sociology"
],
"difficultyLevel": [
"Interprets society"
]
},
"isNew": false
},
"da0ac2f0-1ea3-464a-bc03-f62b71415837": {
"root": false,
"objectType": "QuestionSet",
"metadata": {
"mimeType": "application/vnd.sunbird.questionset",
"code": "da0ac2f0-1ea3-464a-bc03-f62b71415837",
"name": "Section A",
"visibility": "Parent",
"primaryCategory": "Practice Question Set",
"shuffle": true,
"selectedQuestionType": "",
"attributions": [],
"timeLimits": {
"questionSet": {
"max": 0,
"min": 0
}
}
},
"isNew": true
}
},
"nodes": [
"do_113263678834016256111",
"da0ac2f0-1ea3-464a-bc03-f62b71415837"
]
}
Loading