diff --git a/static/js/proxyMapper.js b/static/js/proxyMapper.js index 57ddc3e..e070f6e 100644 --- a/static/js/proxyMapper.js +++ b/static/js/proxyMapper.js @@ -12,8 +12,14 @@ var ProxyMapper = function(mapping, data, options) { this.mapping = mapping; this.data = data; + console.log(options); this._default_options = { - fillValue: 0 + fillValue: 0, + functions: { + dates: function (value) {return value;}, + labels: function (value) {return value;}, + values: function (value) {return value;} + } }; this.options = $.extend({}, this._default_options, options); this.result = {}; @@ -50,7 +56,8 @@ let val = intermediate[index]; if (that.mappingI2[val] === undefined) { that.mappingI2[val] = that.result['dates'].length; - that.result['dates'].push(val); + let nval = that.options.functions.dates(val); + that.result['dates'].push(nval); } }; this.iter(intermediate, instructions, matchingFun, {}); @@ -68,7 +75,8 @@ val.push(that.options.fillValue); } } - that.result[label] = val; + let nval = that.options.functions.dates(val); + that.result[label] = nval; } } else { let label = intermediate[index]; @@ -78,7 +86,8 @@ val.push(that.options.fillValue); } } - that.result[label] = val; + let nlabel = that.options.functions.labels(label); + that.result[nlabel] = val; } }; this.iter(intermediate, instructions, matchingFun, {valueLength: this.result.dates.length}); @@ -92,7 +101,9 @@ let i1 = additionalData.i1; let i2 = additionalData.i2; let i2_adjusted = that.mappingI2[i2]; - that.result[i1][i2_adjusted] = val; + let ni1 = that.options.functions.labels(i1); + let nval = that.options.functions.values(val); + that.result[ni1][i2_adjusted] = nval; }; this.iter(intermediate, instructions, matchingFun, {mapping: this.mapping}); }, diff --git a/static/js/treeFromJson.js b/static/js/treeFromJson.js index 218e70e..15f11df 100644 --- a/static/js/treeFromJson.js +++ b/static/js/treeFromJson.js @@ -20,9 +20,10 @@ depth: 5 }, maxCharDisplay: 20, - itemColors: ['#fc440f', '#a5e12e', '#5d2e8c', '#2ec4b6', '#65524d', '#adcad6', '#99c24d'], + itemColors: ['#337ab7', '#5cb85c', '#d9534f', '#f0ad4e', '#d9edf7', '#dff0d8', '#f2dede', '#fcf8e3'], duration: 500, interaction: true, + default_function: ' return value;', toBeMapped: [] }; this.options = $.extend({}, this._default_options, options); @@ -364,7 +365,7 @@ }); res.style('fill', itemColor) - .style('fill-opacity', 0.85); + .style('fill-opacity', 1.0); // find all paths var paths = []; @@ -492,22 +493,37 @@ var that = this; this.mappingDomTable = $('
'); var thead = $('') - var tbody = $('') + var tbody = $('') var row1 = $(''); var row2 = $(''); + var row3 = $(''); this.options.toBeMapped.forEach(function(item, index) { var itemColor = that.options.itemColors[index]; - var cellH = $(''+item+''); - var cellB = $(''); + var cellH = $(''+item+''); + var cellB = $(''); + var cellB2 = $(''); + var fun_head = $('function (value, datum) {'); + var fun_foot = $('}'); + var fun_foot_res = $('> function (x, d) = x'); + var fun_input = $(''); + fun_input.val(that.options.default_function); + cellB2.append(fun_head); + cellB2.append(fun_input); + cellB2.append(fun_foot); + cellB2.append(fun_foot_res); cellH.click(function() { that.set_current_mapping_item(item); }); cellB.click(function() { that.set_current_mapping_item(item); }); + cellB2.click(function() { that.set_current_mapping_item(item); }); that.set_color(cellH, itemColor); that.set_color(cellB, itemColor); + that.set_color(cellB2, itemColor); row1.append(cellH); row2.append(cellB); + row3.append(cellB2); }); thead.append(row1); tbody.append(row2); + tbody.append(row3); this.mappingDomTable.append(thead); this.mappingDomTable.append(tbody); this.fillValueDomInput = $(''); @@ -522,6 +538,9 @@ this.fillValueDomInput.on('input', function() { that.update_result_tree(); }); + $('.mappingTable textarea').on('input', function() { + that.update_result_tree(); + }); }, set_color: function(item, color) { @@ -560,11 +579,14 @@ } } this.mappingDomTable.find('td').addClass('grey'); + this.mappingDomTable.find('th').addClass('grey'); this.mappingDomTable.find('td').removeClass('picking'); - var cell = this.mappingDomTable.find('#'+name+'Cell'); + this.mappingDomTable.find('th').removeClass('picking'); + //var cell = this.mappingDomTable.find('#'+name+'Cell'); + var cells = this.mappingDomTable.find('[data-map="'+name+'"]'); var itemColor = this.itemColors.get(name); - cell.removeClass('grey'); - this.currentPickingCell = cell; + cells.removeClass('grey'); + this.currentPickingCell = this.mappingDomTable.find('#'+name+'Cell'); this.currentPicking = name; }, @@ -581,12 +603,28 @@ interaction: false }; - //var result = new $.proxyMapper(this.instructions, this.data, {}); + var continue_update = this.render_functions_output(); + if (!continue_update) { + return + } + + // collect functions + var functions = {}; + $('.mappingTable textarea').each(function() { + var dom = $(this); + var f_body = dom.val(); + functions[dom[0].id] = new Function('value', 'd', f_body); + }); + + // perform mapping var pm_options = { - fillValue: this.fillValueDomInput.val() + fillValue: this.fillValueDomInput.val(), + functions: functions }; var adjustedInstructions = this.adjust_instruction(); var result = new $.proxyMapper(adjustedInstructions, this.data, pm_options); + + // destroy and redraw this.treeDivResult[0].innerHTML = ''; new TreeFromJson(this.treeDivResult, result, options); }, @@ -628,6 +666,40 @@ return adjustedInstructions; }, + render_functions_output: function() { + var that = this; + var flag_continue = true; + $('.mappingTable textarea').each(function() { + var c_id = $(this).attr('id'); + var f_body = $(this).val(); + var funXInput = $('#funXInput-'+c_id); + var funXOuput = $('#funXOuput-'+c_id); + // check if valid function + try { + var f = new Function('value', 'd', f_body); + var nodes = that.svg.selectAll(".node circle").filter( + function(d) { return d.picked === c_id;} + ); + var x = nodes.data()[0].name; + funXInput.text('"'+that.adjust_text_length(x)+'"'); + funXOuput[0].innerHTML = that.adjust_text_length('"'+f(x)+'"'); + } catch(err) { // Error + if (err.name == 'SyntaxError') { + flag_continue = false; + funXOuput[0].innerHTML = $(''+err.name+'')[0].outerHTML; + } else if (err.name == 'TypeError') { + var html = $(''); + html.append($(''+'Not picked yet'+'')); + html.append($(''+err.name+'')); + funXOuput[0].innerHTML = html[0].outerHTML; + } else { + funXOuput[0].innerHTML = $(''+err.name+'')[0].outerHTML; + } + } + }); + return flag_continue; + }, + isObject: function(v) { return v !== null && typeof v === 'object'; }, @@ -636,11 +708,12 @@ if (text === undefined || text === '') { return ''; } - text = text.slice(0, this.options.maxCharDisplay); + text = new String(text); + var textSliced = text.slice(0, this.options.maxCharDisplay); if (text.length > this.options.maxCharDisplay) { - text += '...'; + textSliced += '...'; } - return text; + return textSliced; }, create_tree: function(root, linkname, depth, maxDepth, maxWidth) { diff --git a/templates/test.html b/templates/test.html index e984461..25f4597 100644 --- a/templates/test.html +++ b/templates/test.html @@ -40,7 +40,12 @@ } .node circle { fill: #fff; - stroke: steelblue; + stroke: lightgrey; + stroke-width: 3px; + } + .node rect { + fill: #fff; + stroke: lightgrey; stroke-width: 3px; } .node text { @@ -55,7 +60,8 @@ .mappingTable { display: inline-table !important; cursor: pointer; - width: 50%; + min-width: 50%; + max-width: 75%; } .mappingTableDivConfig { @@ -73,7 +79,36 @@ } td.grey { - background-color: grey !important; + filter: opacity(60%) grayscale(30%); + } + th.grey { + filter: opacity(60%) grayscale(30%); + } + + .mappingTable td.cellFunInput { + padding: 0px; + font-family: Consolas,"courier new"; + } + + .cellFunInput textarea { + color: black; + width: 100%; + } + + .cellFunInput > span { + display: block; + } + + .funOutputError { + color: red; + background: white; + padding: 3px; + border-radius: 4px; + margin-right: 5px; + } + + .funResText { + font-size: 12px; } .linkText { @@ -85,6 +120,9 @@ stroke: #ddd; stroke-width: 2; } + .linkLabel { + cursor: pointer; + } .json_key { color: #690; @@ -131,6 +169,8 @@ var endpoint = []; var tfj; $.getJSON('{{ url_for("testData") }}', function(data) { + //$.getJSON('{{ url_for("getTrendingSightings") }}', function(data) { + //$.getJSON('{{ url_for("getUserLoginsAndContribOvertime") }}', function(data) { var depth = 5; var width = 3;