Skip to content

Commit

Permalink
Closes #87
Browse files Browse the repository at this point in the history
  • Loading branch information
anthonysena committed Sep 16, 2016
1 parent 7dcdd20 commit 9878df3
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 59 deletions.
47 changes: 24 additions & 23 deletions js/components/conceptset-manager.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
<button type="button" class="btn btn-sm btn-success" data-bind="click:function() { saveClick(); }, css: {disabled:model.currentConceptSet() != null && !model.currentConceptSetDirtyFlag.isDirty()}">Save</button>
<button type="button" class="btn btn-sm btn-primary" data-bind="click:function() { closeConceptSet(); }">Close</button>
<button type="button" class="btn btn-sm btn-primary" data-bind="click: copy, visible: model.currentConceptSet() && model.currentConceptSet().id > 0">Copy</button>
<div class="pull-right"><button type="button" class="btn btn-sm btn-primary" data-bind="click:function() { optimize(); }">Optimize</button></div>
<button type="button" class="btn btn-sm btn-primary" data-bind="click:function() { optimize(); }">Optimize</button>
<button type="button" class="btn btn-sm btn-danger" data-bind="click:function() { $component.delete(); }">Delete</button>
</div>
</div>

Expand Down Expand Up @@ -48,7 +49,7 @@
<faceted-datatable params="{columns: model.relatedSourcecodesColumns, options: model.relatedSourcecodesOptions, reference: model.includedSourcecodes}"></faceted-datatable>
</div>

<div data-bind="if: model.currentConceptSetMode() == 'details'">
<div data-bind="visible: model.currentConceptSetMode() == 'details'">
<div class="paddedWrapper">
<table class="conceptSetTable stripe compact hover" cellspacing="0" width="100%" data-bind="dataTable:{
data: model.selectedConcepts(),
Expand Down Expand Up @@ -134,7 +135,7 @@
<negative-controls params="{model: pageModel, negativeControls: model.currentConceptSetNegativeControls, selectedConcepts: model.selectedConcepts, conceptSet: model.currentConceptSet, dirtyFlag: model.currentConceptSetDirtyFlag, conceptIds: model.conceptSetInclusionIdentifiers, services: model.services, defaultResultsUrl: model.resultsUrl, saveConceptSet: $component.saveConceptSet}"></negative-controls>
</div>

<div id="wrapperConceptSetExport" data-bind="if: model.currentConceptSetMode() == 'export'">
<div id="wrapperConceptSetExport" data-bind="visible: model.currentConceptSetMode() == 'export'">
<div class="heading">Concept Set Expression JSON</div>
<pre data-bind="html: model.currentConceptSetExpressionJson, selectOnFocus: {events: ['click']}"></pre>
<div class="heading">Concept Identifer List</div>
Expand All @@ -155,7 +156,7 @@
<input class="form-control" type="text" disabled data-bind="value: $component.compareCS1Caption" />
<span class="input-group-btn">
<button class="btn btn-primary" data-bind="click:chooseCS1"><i class="fa fa-folder-open"></i></button>
<span data-bind="if: $component.compareCS1Id() > 0"><button class="btn btn-danger" data-bind="click:clearCS1" type="button"><i class="fa fa-times-circle" aria-hidden="true"></i></button></span>
<button class="btn btn-danger" data-bind="disable: $component.compareCS1Id() == 0, click: clearCS1" type="button"><i class="fa fa-times-circle" aria-hidden="true"></i></button>
</span>
</div>
</div>
Expand All @@ -166,13 +167,13 @@
<input class="form-control" type="text" disabled data-bind="value: $component.compareCS2Caption" />
<span class="input-group-btn">
<button class="btn btn-primary" data-bind="click:chooseCS2"><i class="fa fa-folder-open"></i></button>
<span data-bind="if: $component.compareCS2Id() > 0"><button class="btn btn-danger" data-bind="click:clearCS2" type="button"><i class="fa fa-times-circle" aria-hidden="true"></i></button></span>
<button class="btn btn-danger" data-bind="disable: $component.compareCS2Id() == 0,click:clearCS2" type="button"><i class="fa fa-times-circle" aria-hidden="true"></i></button>
</span>
</div>
</div>
<div data-bind="if: $component.compareReady() && !$component.compareResults()">
<div class="paddedWrapper" style="padding-top: 20px;">
<button type="button" class="btn btn-sm btn-primary" data-bind="click: $component.compareConceptSets;">Compare Concept Sets</button>
<button type="button" class="btn btn-sm btn-primary" data-bind="click: $component.compareConceptSets;"><i data-bind="css: $component.compareLoadingClass"></i> Compare Concept Sets</button>
</div>
</div>
<div data-bind="if: $component.compareError()">
Expand Down Expand Up @@ -207,7 +208,7 @@
</div>

<div id="modalCS" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
Expand All @@ -221,7 +222,7 @@
</div>

<div id="modalConceptSetOptimize" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
Expand Down Expand Up @@ -264,9 +265,7 @@
</div>
</div>
</div>
<div class="heading">
<h4>Optimized Concept Set</h4>
</div>
<div class="heading">Optimized Concept Set</div>
<div class="paddedWrapper">
<table class="conceptSetTable stripe compact hover" cellspacing="0" width="100%" data-bind="dataTable:{
data: $component.optimalConceptSet(),
Expand All @@ -280,7 +279,7 @@ <h4>Optimized Concept Set</h4>
restore: 'Reset Columns'
},
rowCallback: model.contextSensitiveLinkColor,
lengthMenu: [[25, 50, 100, -1], [25, 50, 100,'All']],
lengthMenu: [[10, 25, 50, 100, -1], [10, 25, 50, 100,'All']],
orderClasses: false,
deferRender: true,
autoWidth: false,
Expand All @@ -301,8 +300,8 @@ <h4>Optimized Concept Set</h4>
</table>
</div>
<div data-bind="if: $component.optimizerRemovedConceptSet() && !$component.optimizerSavingNew()">
<div class="heading" style="padding-top:10px;margin-bottom:10px;">
<h4>Concepts Removed</h4>
<div class="heading" style="padding-top:10px;margin-bottom:10px;">Concepts Removed</div>
<div style="padding-bottom: 10px;">
The following concepts were removed since the optimized version already includes them.
</div>
<div class="paddedWrapper">
Expand All @@ -318,7 +317,7 @@ <h4>Concepts Removed</h4>
restore: 'Reset Columns'
},
rowCallback: model.contextSensitiveLinkColor,
lengthMenu: [[25, 50, 100, -1], [25, 50, 100,'All']],
lengthMenu: [[10, 25, 50, 100, -1], [10, 25, 50, 100,'All']],
orderClasses: false,
deferRender: true,
autoWidth: false,
Expand All @@ -343,22 +342,24 @@ <h4>Concepts Removed</h4>
</div>
</div>
</div>
</div>
</div>

<div id="modalSaveNew" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<div class="modal-title">Save New Concept Set</div>
</div>
<div class="modal-body">
<label>Concept Set Name:</label>
<div class="input-group">
<input class="form-control" id="txtNewConceptSetName" type="text" data-bind="textInput: $component.compareNewConceptSetName" />
<span class="input-group-btn">
<button type="button" class="btn btn-sm btn-success" data-bind="click:function() { compareCreateNewConceptSet(); }">Save</button>
</span>
<div>
<label>Concept Set Name:</label>
<div class="input-group">
<input class="form-control" id="txtNewConceptSetName" type="text" data-bind="textInput: $component.compareNewConceptSetName" />
<span class="input-group-btn">
<button type="button" class="btn btn-success" data-bind="click:function() { compareCreateNewConceptSet(); }">Save</button>
</span>
</div>
</div>
</div>
</div>
Expand Down
85 changes: 53 additions & 32 deletions js/components/conceptset-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ define(['knockout',
'ohdsi.util',
'webapi/CDMResultsAPI',
'vocabularyprovider',
'webapi/ConceptSetAPI',
'conceptsetbuilder/InputTypes/ConceptSet',
'knockout.dataTables.binding',
'bootstrap',
'faceted-datatable',
'databindings',
'negative-controls',
'circe',
], function (ko, view, config, ohdsiUtil, cdmResultsAPI, vocabularyAPI, ConceptSet) {
], function (ko, view, config, ohdsiUtil, cdmResultsAPI, vocabularyAPI, conceptSetAPI, ConceptSet) {
function conceptsetManager(params) {
var self = this;
self.model = params.model;
Expand Down Expand Up @@ -52,7 +53,7 @@ define(['knockout',
self.compareCS1Id = ko.observable(self.model.currentConceptSet().id); // Init to the currently loaded cs
self.compareCS1Caption = ko.observable(self.model.currentConceptSet().name());
self.compareCS1ConceptSet = ko.observableArray(self.currentConceptSet());
self.compareCS2Id = ko.observable();
self.compareCS2Id = ko.observable(0);
self.compareCS2Caption = ko.observable();
self.compareCS2ConceptSet = ko.observableArray(null);
self.compareError = ko.pureComputed(function() {
Expand All @@ -65,6 +66,10 @@ define(['knockout',
(self.compareCS1Id() != self.compareCS2Id())
)
});
self.compareLoading = ko.observable(false);
self.compareLoadingClass = ko.pureComputed(function() {
return self.compareLoading() ? "fa fa-circle-o-notch fa-spin fa-lg" : "fa fa-question-circle fa-lg"
})
self.compareResults = ko.observable();
self.compareNewConceptSetName = ko.observable(self.model.currentConceptSet().name() + " - From Comparison");
self.defaultResultsUrl = self.model.resultsUrl;
Expand Down Expand Up @@ -340,7 +345,9 @@ define(['knockout',
}

self.raiseConceptSetNameProblem = function (msg, elem) {
self.model.currentConceptSet().name.valueHasMutated();
if (self.model.currentConceptSet()) {
self.model.currentConceptSet().name.valueHasMutated();
}
alert(msg);
$(elem).select().focus();
}
Expand Down Expand Up @@ -484,6 +491,7 @@ define(['knockout',

self.compareConceptSets = function() {
console.log("compare");
self.compareLoading(true);
var compareTargets = [{items: self.compareCS1ConceptSet()}, {items: self.compareCS2ConceptSet()}];
vocabularyAPI.compareConceptSet(compareTargets).then(function (compareResults) {
var conceptIds = $.map(compareResults, function (o, n) {
Expand All @@ -492,6 +500,7 @@ define(['knockout',
cdmResultsAPI.getConceptRecordCount(self.currentResultSource().sourceKey, conceptIds, compareResults).then(function (rowcounts) {
self.compareResults(null);
self.compareResults(compareResults);
self.compareLoading(false);
});
});
}
Expand Down Expand Up @@ -538,12 +547,35 @@ define(['knockout',
$(selectAllElement).addClass("selected");
});
}

self.toggleOffSelectAllCheckbox = function(selector, selectAllElement) {
$(document).on('init.dt', selector, function (e, settings) {
$(document).on('init.dt', selector, function (e, settings) {
$(selectAllElement).removeClass("selected");
});
}

self.selectAllConceptSetItems = function(selector, props) {
console.log("select all: " + props)
props = props || {};
props.isExcluded = props.isExcluded || null;
props.includeDescendants = props.includeDescendants || null;
props.includeMapped = props.includeMapped || null;
var selectAllValue = !($(selector).hasClass("selected"));
$(selector).toggleClass("selected");
_.each(self.model.selectedConcepts(), (conceptSetItem) => {
if (props.isExcluded !== null) {
conceptSetItem.isExcluded(selectAllValue);
}
if (props.includeDescendants !== null) {
conceptSetItem.includeDescendants(selectAllValue);
}
if (props.includeMapped !== null) {
conceptSetItem.includeMapped(selectAllValue);
}
});
self.model.resolveConceptSetExpression();
}

self.refreshRecordCounts = function(obj, event) {
if (event.originalEvent) {
// User changed event
Expand All @@ -564,6 +596,17 @@ define(['knockout',
});
}
}

self.delete = function() {
if (!confirm("Delete concept set? Warning: deletion can not be undone!"))
return;

// reset view after save
conceptSetAPI.deleteConceptSet(self.model.currentConceptSet().id).then(function (result) {
self.model.currentConceptSet(null);
document.location = "#/conceptsets"
});
}

// Initialize the select all checkboxes
var excludeCount = 0;
Expand Down Expand Up @@ -596,34 +639,12 @@ define(['knockout',
self.toggleOffSelectAllCheckbox('.conceptSetTable', '#selectAllMapped');
}
// Create event handlers for all of the select all elements
$(document).on('click', '#selectAllExclude', function() {
var isExcluded = !($("#selectAllExclude").hasClass("selected"));
$("#selectAllExclude").toggleClass("selected");
_.each(self.model.selectedConcepts(), (conceptSetItem) => {
conceptSetItem.isExcluded(isExcluded);
});
self.model.resolveConceptSetExpression();
});
$(document).on('click', '#selectAllDescendants', function() {
var includeDescendants = !($("#selectAllDescendants").hasClass("selected"));
$("#selectAllDescendants").toggleClass("selected");
var currentConcepts = self.model.selectedConcepts();
_.each(currentConcepts, (conceptSetItem) => {
conceptSetItem.includeDescendants(includeDescendants);
});
self.model.selectedConcepts(currentConcepts);
self.model.resolveConceptSetExpression();
});
$(document).on('click', '#selectAllMapped', function() {
var includeMapped = !($("#selectAllMapped").hasClass("selected"));
$("#selectAllMapped").toggleClass("selected");
_.each(self.model.selectedConcepts(), (conceptSetItem) => {
conceptSetItem.includeMapped(includeMapped);
});
self.model.resolveConceptSetExpression();
});


$(document).off('click', '#selectAllExclude');
$(document).on('click', '#selectAllExclude', function() { self.selectAllConceptSetItems("#selectAllExclude", { isExcluded: true })});
$(document).off('click', '#selectAllDescendants');
$(document).on('click', '#selectAllDescendants', function() { self.selectAllConceptSetItems("#selectAllDescendants", { includeDescendants: true })});
$(document).off('click', '#selectAllMapped');
$(document).on('click', '#selectAllMapped', function() { self.selectAllConceptSetItems("#selectAllMapped", { includeDescendants: true })});
}

var component = {
Expand Down
4 changes: 2 additions & 2 deletions js/components/negative-controls.html
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
</div>
<div class="loading" data-bind="if:$component.loadingEvidenceSources()">loading</div>
<div id="modalNegControlsSaveNew" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
Expand All @@ -78,7 +78,7 @@
<div class="input-group">
<input class="form-control" id="txtNewConceptSetName" type="text" data-bind="textInput: $component.newConceptSetName" />
<span class="input-group-btn">
<button type="button" class="btn btn-sm btn-success" data-bind="click:function() { saveNewConceptSet(); }">Save</button>
<button type="button" class="btn btn-success" data-bind="click:function() { saveNewConceptSet(); }">Save</button>
</span>
</div>
</div>
Expand Down
17 changes: 15 additions & 2 deletions js/modules/WebAPIProvider/ConceptSetAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,22 @@ define(function (require, exports) {
});
return infoPromise;
}


function deleteConceptSet(conceptSetId) {
var promise = $.ajax({
url: config.webAPIRoot + 'conceptset/' + + (conceptSetId || '-1') + '/delete',
method: 'POST',
contentType: 'application/json',
error: function (error) {
console.log("Error: " + error);
}
});
return promise;
}

var api = {
getGenerationInfo: getGenerationInfo
getGenerationInfo: getGenerationInfo,
deleteConceptSet: deleteConceptSet,
}

return api;
Expand Down

0 comments on commit 9878df3

Please sign in to comment.