mirror of https://github.com/MISP/misp-dashboard
Added way more modularity at the cost of non-negligible code complexity (still need a big clean up)
parent
f5263e33df
commit
edb1bee303
|
@ -9,28 +9,81 @@
|
||||||
(function($) {
|
(function($) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ProxyMapper = function(mapping, data, options) {
|
var ProxyMapper = function(mapping, constructionInstruction, data, options) {
|
||||||
|
var that = this;
|
||||||
|
this.itemsToBeMapped = Object.keys(constructionInstruction);
|
||||||
|
this.constructionInstruction = constructionInstruction;
|
||||||
this.mapping = mapping;
|
this.mapping = mapping;
|
||||||
|
|
||||||
|
//this.mapping = {
|
||||||
|
// dates: ["l", 0],
|
||||||
|
// index: {
|
||||||
|
// '@labels': [0],
|
||||||
|
// '@dates': [0]
|
||||||
|
// },
|
||||||
|
// //labels: ["l", 1, "l", 0],
|
||||||
|
// labels: [],
|
||||||
|
// //values: ["@dates,l", "{1}", "@labels,l", "{1}"]
|
||||||
|
// values: ["@dates,l", "{1}", "@labels"]
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.data = data;
|
this.data = data;
|
||||||
|
|
||||||
|
this.result = {};
|
||||||
|
|
||||||
|
var funcs = {};
|
||||||
|
this.fillKey;
|
||||||
|
this.labelKey = [];
|
||||||
|
this.valueKey;
|
||||||
|
this.itemsToBeMapped.forEach(function(item) {
|
||||||
|
funcs[item] = new Function('value', 'datum', 'return value');
|
||||||
|
let ci = constructionInstruction[item];
|
||||||
|
|
||||||
|
if (ci.strategy !== undefined && ci.strategy == 'date') { // only 1 key can be a fill key
|
||||||
|
that.fillKey = item;
|
||||||
|
}
|
||||||
|
else if (ci.strategy !== undefined && ci.strategy == 'label') { // multiple keys can be label key
|
||||||
|
that.labelKey.push(item);
|
||||||
|
}
|
||||||
|
else if (ci.strategy !== undefined && ci.strategy == 'value') { // only 1 key can be value key
|
||||||
|
that.valueKey = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
// init default type for wanted key
|
||||||
|
let s = ci.instructions.split('.');
|
||||||
|
if (s.length >= 2 && s[0] === '' && s[1] !== '') {
|
||||||
|
let p_res, p_key;
|
||||||
|
let c_res = that.result;
|
||||||
|
s.slice(1).forEach(function(k) {
|
||||||
|
if (k[0] === '@') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
c_res[k] = {};
|
||||||
|
p_res = c_res;
|
||||||
|
p_key = k;
|
||||||
|
c_res = c_res[k];
|
||||||
|
});
|
||||||
|
if (p_key !== undefined) {
|
||||||
|
p_res[p_key] = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this._default_options = {
|
this._default_options = {
|
||||||
fillValue: 0,
|
fillValue: 0,
|
||||||
functions: {
|
functions: funcs,
|
||||||
dates: function (value, datum) {return value;},
|
|
||||||
labels: function (value, datum) {return value;},
|
|
||||||
values: function (value, datum) {return value;}
|
|
||||||
},
|
|
||||||
prefillData: {
|
|
||||||
dates: [],
|
|
||||||
labels: []
|
|
||||||
},
|
|
||||||
datum: false // the tree data to walk in parallel
|
datum: false // the tree data to walk in parallel
|
||||||
};
|
};
|
||||||
this.options = $.extend({}, this._default_options, options);
|
this.options = $.extend({}, this._default_options, options);
|
||||||
this.result = {};
|
|
||||||
|
|
||||||
this.result.dates = [];
|
|
||||||
|
|
||||||
this.mappingI2 = {};
|
this.mappingI2 = {};
|
||||||
|
this.mappingToIndexes = {};
|
||||||
|
this.itemsToBeMapped.forEach(function(item) {
|
||||||
|
that.mappingToIndexes[item] = {};
|
||||||
|
});
|
||||||
|
|
||||||
this.perform_mapping();
|
this.perform_mapping();
|
||||||
return this.result;
|
return this.result;
|
||||||
};
|
};
|
||||||
|
@ -39,49 +92,95 @@
|
||||||
constructor: ProxyMapper,
|
constructor: ProxyMapper,
|
||||||
|
|
||||||
perform_mapping: function(data) {
|
perform_mapping: function(data) {
|
||||||
if (this.mapping.dates.length > 0) {
|
var that = this;
|
||||||
for (var x of this.options.prefillData.dates) { this.result['dates'].push(x); }
|
var fk = this.fillKey;
|
||||||
this.c_dates(this.data, this.mapping.dates); // probe and fetch all dates
|
var lk = this.labelKey;
|
||||||
|
var vk = this.valueKey;
|
||||||
|
|
||||||
|
/* fill key is processed first */
|
||||||
|
if (fk !== undefined && this.mapping[fk].length > 0) {
|
||||||
|
this.apply_strategy(fk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// prepare fill array
|
||||||
let fillArray = [];
|
let fillArray = [];
|
||||||
for (var i=0; i<this.result.dates.length; i++) {
|
if (fk !== undefined) {
|
||||||
if ((this.options.fillValue !== undefined && this.options.fillValue !== '')) {
|
for (var i=0; i<this.result[fk].length; i++) {
|
||||||
fillArray.push(this.options.fillValue);
|
if ((this.options.fillValue !== undefined && this.options.fillValue !== '')) {
|
||||||
|
fillArray.push(this.options.fillValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var x of this.options.prefillData.labels) {
|
|
||||||
this.result[x] = fillArray.slice(0);
|
// inject prefill data
|
||||||
this.i1_prefill = x;
|
for (let keyname in this.options.prefillData) {
|
||||||
}
|
let p_data = this.options.prefillData[keyname];
|
||||||
if (this.mapping.labels.length > 0) {
|
let subkeys = {};
|
||||||
this.c_labels(this.data, this.mapping.labels); // probe and fetch all labels
|
subkeys[keyname] = p_data;
|
||||||
|
this.addFromInstruction(keyname, fillArray.slice(0), subkeys, true);
|
||||||
|
//this.i1_prefill = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (this.mapping.labels.length > 0 && this.mapping.values.length > 0) {
|
// inject prefill data
|
||||||
if (Object.keys(this.result).length > 1 && this.mapping.values.length > 0) {
|
//for (var x of this.options.prefillData.labels) {
|
||||||
this.c_values(this.data, this.mapping.values); // fetch values and overwrite default values
|
// this.result[x] = fillArray.slice(0);
|
||||||
for (var k in this.result) {
|
// this.i1_prefill = x;
|
||||||
this.result[k] = this.result[k].filter(function(n){ return n != undefined });
|
//}
|
||||||
|
|
||||||
|
//if (this.mapping.labels.length > 0) {
|
||||||
|
// this.c_labels(this.data, this.mapping.labels); // probe and fetch all labels
|
||||||
|
//}
|
||||||
|
lk.forEach(function(labelK) {
|
||||||
|
if (that.mapping[labelK].length > 0) {
|
||||||
|
that.apply_strategy(labelK);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//if (Object.keys(this.result).length > 1 && this.mapping.values.length > 0) {
|
||||||
|
//if (Object.keys(that.result).length > 0 && that.mapping[vk].length > 0) {
|
||||||
|
if (Object.keys(that.result).length > 1 && that.mapping[vk].length > 0) {
|
||||||
|
that.apply_strategy(vk);
|
||||||
|
for (var k in that.result) { // filter out undefined value
|
||||||
|
let res = that.result[k];
|
||||||
|
if (res !== undefined && !that.isObject(res)) { // if object, picking is likely to be incoherent
|
||||||
|
let filtered = res.filter(function(n){ return n != undefined });
|
||||||
|
that.result[k] = filtered;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
c_dates: function(intermediate, instructions) {
|
|
||||||
|
apply_strategy: function(keyname) {
|
||||||
|
let strategy = this.constructionInstruction[keyname].strategy;
|
||||||
|
if (strategy == 'date') {
|
||||||
|
this.c_dates(this.data, this.mapping[keyname], keyname); // probe and fetch all dates
|
||||||
|
} else if (strategy == 'label') {
|
||||||
|
this.c_labels(this.data, this.mapping[keyname], keyname); // probe and fetch all labels
|
||||||
|
} else if (strategy == 'value') {
|
||||||
|
this.c_values(this.data, this.mapping[keyname], keyname); // fetch values and overwrite default values
|
||||||
|
} else {
|
||||||
|
console.log('Invalid mapping strategy');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
c_dates: function(intermediate, instructions, keyname) {
|
||||||
var that = this;
|
var that = this;
|
||||||
var matchingFun = function (intermediate, instructions, additionalData) {
|
var matchingFun = function (intermediate, instructions, additionalData) {
|
||||||
let index = instructions;
|
let index = instructions;
|
||||||
let val = intermediate[index];
|
let val = intermediate[index];
|
||||||
if (that.mappingI2[val] === undefined) {
|
if (that.mappingToIndexes[keyname][val] === undefined) {
|
||||||
that.mappingI2[val] = that.result['dates'].length;
|
//that.mappingToIndexes[keyname][val] = that.result['dates'].length;
|
||||||
let nval = that.options.functions.dates(val, additionalData.datum);
|
that.mappingToIndexes[keyname][val] = that.result[keyname].length;
|
||||||
that.result['dates'].push(nval);
|
//let nval = that.options.functions.dates(val, additionalData.datum);
|
||||||
|
let nval = that.options.functions[keyname](val, additionalData.datum);
|
||||||
|
that.addFromInstruction(keyname, nval, {}, false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.iter(intermediate, instructions, matchingFun, { datum: this.options.datum });
|
this.iter(intermediate, instructions, matchingFun, { datum: this.options.datum });
|
||||||
},
|
},
|
||||||
|
|
||||||
c_labels: function(intermediate, instructions, valuesLength) {
|
c_labels: function(intermediate, instructions, keyname) {
|
||||||
var that = this;
|
var that = this;
|
||||||
var matchingFun = function (intermediate, instructions, additionalData) {
|
var matchingFun = function (intermediate, instructions, additionalData) {
|
||||||
let reg = /\{(\w+)\}/;
|
let reg = /\{(\w+)\}/;
|
||||||
|
@ -90,7 +189,7 @@
|
||||||
instructions = res[1];
|
instructions = res[1];
|
||||||
}
|
}
|
||||||
let index = instructions;
|
let index = instructions;
|
||||||
if (index == 'l') { // labels are the keys themself
|
if (index == 'l') { // labels are the keys themselves
|
||||||
for (let label in intermediate) {
|
for (let label in intermediate) {
|
||||||
let val = [];
|
let val = [];
|
||||||
for (var i=0; i<additionalData.valueLength; i++) {
|
for (var i=0; i<additionalData.valueLength; i++) {
|
||||||
|
@ -98,8 +197,11 @@
|
||||||
val.push(that.options.fillValue);
|
val.push(that.options.fillValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let nlabel = that.options.functions.labels(label, additionalData.datum);
|
let nlabel = that.options.functions[keyname](label, additionalData.datum);
|
||||||
that.result[nlabel] = val;
|
//that.result[nlabel] = val;
|
||||||
|
var subkeys = {};
|
||||||
|
subkeys[keyname] = nlabel;
|
||||||
|
that.addFromInstruction(keyname, val, subkeys, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let label = intermediate[index];
|
let label = intermediate[index];
|
||||||
|
@ -109,14 +211,18 @@
|
||||||
val.push(that.options.fillValue);
|
val.push(that.options.fillValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let nlabel = that.options.functions.labels(label, additionalData.datum);
|
let nlabel = that.options.functions[keyname](label, additionalData.datum);
|
||||||
that.result[nlabel] = val;
|
var subkeys = {};
|
||||||
|
subkeys[keyname] = nlabel;
|
||||||
|
//that.result[nlabel] = val;
|
||||||
|
that.addFromInstruction(keyname, val, subkeys, true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.iter(intermediate, instructions, matchingFun, {valueLength: this.result.dates.length, datum: this.options.datum});
|
let valueLength = this.result[this.fillKey] !== undefined ? this.result[this.fillKey].length : 0;
|
||||||
|
this.iter(intermediate, instructions, matchingFun, {valueLength: valueLength, datum: this.options.datum});
|
||||||
},
|
},
|
||||||
|
|
||||||
c_values: function(intermediate, instructions) {
|
c_values: function(intermediate, instructions, keyname) {
|
||||||
var that = this;
|
var that = this;
|
||||||
var matchingFun = function (intermediate, instructions, additionalData) {
|
var matchingFun = function (intermediate, instructions, additionalData) {
|
||||||
let val;
|
let val;
|
||||||
|
@ -131,13 +237,51 @@
|
||||||
let index = instructions;
|
let index = instructions;
|
||||||
val = intermediate[index];
|
val = intermediate[index];
|
||||||
}
|
}
|
||||||
let i1 = additionalData.i1;
|
|
||||||
i1 = i1 !== undefined ? i1 : that.i1_prefill;
|
let subkeyNames = that.get_subkeys_basename(keyname);
|
||||||
let i2 = additionalData.i2;
|
let subkeys = {};
|
||||||
let i2_adjusted = that.mappingI2[i2];
|
let directValue = false;
|
||||||
let ni1 = that.options.functions.labels(i1, additionalData.datum);
|
subkeyNames.forEach(function(kn) {
|
||||||
let nval = that.options.functions.values(val, additionalData.datum);
|
// fetch index in array from the key
|
||||||
that.result[ni1][i2_adjusted] = nval;
|
let v;
|
||||||
|
let kn_strip;
|
||||||
|
if (kn.substring(0, 2) === '@@') {
|
||||||
|
kn = kn.slice(1);
|
||||||
|
kn_strip = kn.slice(1);
|
||||||
|
v = additionalData[kn];
|
||||||
|
v = that.mappingToIndexes[kn_strip][v];
|
||||||
|
directValue = true;
|
||||||
|
} else {
|
||||||
|
kn_strip = kn.slice(1);
|
||||||
|
v = additionalData[kn];
|
||||||
|
v = v !== undefined ? v : instructions;
|
||||||
|
// apply transformation function, only for non-index
|
||||||
|
v = that.options.functions[kn_strip](v, additionalData.datum);
|
||||||
|
}
|
||||||
|
|
||||||
|
subkeys[kn_strip] = v;
|
||||||
|
});
|
||||||
|
|
||||||
|
//that.options.functions.labels(i1, additionalData.datum);
|
||||||
|
//that.options.functions.values(val, additionalData.datum);
|
||||||
|
|
||||||
|
//let i1 = additionalData.i1;
|
||||||
|
////i1 = i1 !== undefined ? i1 : that.i1_prefill;
|
||||||
|
//let i2 = additionalData.i2;
|
||||||
|
//// fetch index in array from the key
|
||||||
|
//let i2_adjusted = that.mappingI2[i2];
|
||||||
|
|
||||||
|
// fetch index in array from the key
|
||||||
|
|
||||||
|
// apply transformation function
|
||||||
|
//let ni1 = that.options.functions.labels(i1, additionalData.datum);
|
||||||
|
//let nval = that.options.functions.values(val, additionalData.datum);
|
||||||
|
|
||||||
|
//that.result[ni1][i2_adjusted] = nval;
|
||||||
|
//var subkeys = { labels: ni1, dates: i2_adjusted};
|
||||||
|
|
||||||
|
let nval = that.options.functions[keyname](val, additionalData.datum);
|
||||||
|
that.addFromInstruction(keyname, nval, subkeys, directValue);
|
||||||
};
|
};
|
||||||
this.iter(intermediate, instructions, matchingFun, {mapping: this.mapping, datum: this.options.datum});
|
this.iter(intermediate, instructions, matchingFun, {mapping: this.mapping, datum: this.options.datum});
|
||||||
},
|
},
|
||||||
|
@ -168,24 +312,30 @@
|
||||||
let tmp = new String(instructions[0]).split(',');
|
let tmp = new String(instructions[0]).split(',');
|
||||||
let record_inst = tmp[0]
|
let record_inst = tmp[0]
|
||||||
let ind_inst = tmp.length == 2 ? tmp[1] : tmp[0];
|
let ind_inst = tmp.length == 2 ? tmp[1] : tmp[0];
|
||||||
switch (record_inst) {
|
if (record_inst[0] == '@') {
|
||||||
case 'i1':
|
if (additionalData.mapping) {
|
||||||
if (additionalData.mapping) {
|
flag_register_i = true;
|
||||||
flag_register_i = true;
|
i_type = record_inst;
|
||||||
i_type = 'i1';
|
}
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'i2':
|
|
||||||
if (additionalData.mapping) {
|
|
||||||
flag_register_i = true;
|
|
||||||
i_type = 'i2';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '':
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
//switch (record_inst) {
|
||||||
|
// case 'i1':
|
||||||
|
// if (additionalData.mapping) {
|
||||||
|
// flag_register_i = true;
|
||||||
|
// i_type = 'i1';
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// case 'i2':
|
||||||
|
// if (additionalData.mapping) {
|
||||||
|
// flag_register_i = true;
|
||||||
|
// i_type = 'i2';
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// case '':
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// break;
|
||||||
|
//}
|
||||||
|
|
||||||
let inst = ind_inst;
|
let inst = ind_inst;
|
||||||
let reg = /\{(\w+)\}/;
|
let reg = /\{(\w+)\}/;
|
||||||
|
@ -248,9 +398,62 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addFromInstruction: function(constructionKey, value, subkeys, trueValue) {
|
||||||
|
let inst = this.constructionInstruction[constructionKey].instructions;
|
||||||
|
let split = inst.split('.').slice(1); // split and remove the first entry
|
||||||
|
let cres = this.result;
|
||||||
|
let p_res, p_key;
|
||||||
|
split.forEach(function(inst) {
|
||||||
|
if (inst == '') {
|
||||||
|
return false;
|
||||||
|
} else if (inst[0] === '@') {
|
||||||
|
let subkeyName;
|
||||||
|
if (inst.substring(0, 2) === '@@') {
|
||||||
|
subkeyName = inst.slice(2);
|
||||||
|
} else {
|
||||||
|
subkeyName = inst.slice(1);
|
||||||
|
}
|
||||||
|
let subkey = subkeys[subkeyName];
|
||||||
|
if (!cres.hasOwnProperty(subkey)) {
|
||||||
|
cres[subkey] = {};
|
||||||
|
}
|
||||||
|
p_res = cres;
|
||||||
|
p_key = subkey;
|
||||||
|
cres = cres[subkey];
|
||||||
|
} else {
|
||||||
|
p_res = cres;
|
||||||
|
p_key = inst;
|
||||||
|
cres = cres[inst];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//cres.push(value);
|
||||||
|
//p_res[p_key].push(value);
|
||||||
|
if (trueValue) {
|
||||||
|
p_res[p_key] = value;
|
||||||
|
} else {
|
||||||
|
if (this.isObject(cres) && p_key !== undefined) {
|
||||||
|
p_res[p_key] = [];
|
||||||
|
}
|
||||||
|
p_res[p_key].push(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
get_subkeys_basename: function(keyname) {
|
||||||
|
var list = [];
|
||||||
|
let instructions = this.constructionInstruction[keyname].instructions.split('.');
|
||||||
|
instructions = instructions.slice(1);
|
||||||
|
instructions.forEach(function(inst) {
|
||||||
|
if (inst[0] === '@') {
|
||||||
|
list.push(inst);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
},
|
||||||
|
|
||||||
isObject: function(v) {
|
isObject: function(v) {
|
||||||
return v !== null && typeof v === 'object';
|
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
||||||
},
|
},
|
||||||
|
|
||||||
update_datum: function(d, k, should_look_into_linkname) {
|
update_datum: function(d, k, should_look_into_linkname) {
|
||||||
|
|
|
@ -24,7 +24,8 @@
|
||||||
duration: 500,
|
duration: 500,
|
||||||
interaction: true,
|
interaction: true,
|
||||||
default_function: ' return value;',
|
default_function: ' return value;',
|
||||||
toBeMapped: []
|
toBeMapped: {},
|
||||||
|
toBeMappedList: []
|
||||||
};
|
};
|
||||||
this.options = $.extend({}, this._default_options, options);
|
this.options = $.extend({}, this._default_options, options);
|
||||||
|
|
||||||
|
@ -66,13 +67,14 @@
|
||||||
this.root.y0 = 0;
|
this.root.y0 = 0;
|
||||||
|
|
||||||
// mapping table related
|
// mapping table related
|
||||||
if (this.options.toBeMapped.length > 0 ) {
|
this.options.toBeMappedList = Object.keys(this.options.toBeMapped);
|
||||||
|
if (this.options.toBeMappedList.length > 0 ) {
|
||||||
this.instructions = {};
|
this.instructions = {};
|
||||||
this.prefillData = {};
|
this.prefillData = {};
|
||||||
var that = this;
|
var that = this;
|
||||||
this.options.toBeMapped.forEach(function(item, index) {
|
this.options.toBeMappedList.forEach(function(item, index) {
|
||||||
that.instructions[item] = [];
|
that.instructions[item] = [];
|
||||||
that.prefillData[item] = [];
|
//that.prefillData[item] = [];
|
||||||
that.itemColors.set(item, that.options.itemColors[index]);
|
that.itemColors.set(item, that.options.itemColors[index]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -612,10 +614,29 @@
|
||||||
|
|
||||||
//var instructions = this.compute_mapping_instructions(paths);
|
//var instructions = this.compute_mapping_instructions(paths);
|
||||||
//this.add_instruction(instructions);
|
//this.add_instruction(instructions);
|
||||||
|
this.unset_related();
|
||||||
this.add_prefill_data([c_label]);
|
this.add_prefill_data([c_label]);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
unset_related: function() {
|
||||||
|
var that = this;
|
||||||
|
let curPickingBackup = this.currentPicking;
|
||||||
|
let refKey = '@'+this.currentPicking;
|
||||||
|
this.options.toBeMappedList.forEach(function(itemName) {
|
||||||
|
if (itemName == curPickingBackup) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
let inst = that.options.toBeMapped[itemName].instructions;
|
||||||
|
let instS = inst.split('.');
|
||||||
|
if (instS.indexOf(refKey) > -1) {
|
||||||
|
that.set_current_mapping_item(itemName);
|
||||||
|
that.reset_selected();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.set_current_mapping_item(curPickingBackup);
|
||||||
|
},
|
||||||
|
|
||||||
reset_selected: function() {
|
reset_selected: function() {
|
||||||
var that = this;
|
var that = this;
|
||||||
var resNode = that.svg.selectAll(".node circle, .node rect, .node polygon")
|
var resNode = that.svg.selectAll(".node circle, .node rect, .node polygon")
|
||||||
|
@ -682,7 +703,7 @@
|
||||||
var row1 = $('<tr></tr>');
|
var row1 = $('<tr></tr>');
|
||||||
var row2 = $('<tr style="height: 20px;"></tr>');
|
var row2 = $('<tr style="height: 20px;"></tr>');
|
||||||
var valueHeader;
|
var valueHeader;
|
||||||
this.options.toBeMapped.forEach(function(item, index) {
|
this.options.toBeMappedList.forEach(function(item, index) {
|
||||||
var itemColor = that.options.itemColors[index];
|
var itemColor = that.options.itemColors[index];
|
||||||
var cellH = $('<th data-map="'+item+'">'+item+': <span id="'+item+'Cell" data-map="'+item+'" style="font-weight: normal; font-style: italic;"></span> </th>');
|
var cellH = $('<th data-map="'+item+'">'+item+': <span id="'+item+'Cell" data-map="'+item+'" style="font-weight: normal; font-style: italic;"></span> </th>');
|
||||||
var cellB2 = $('<td id="'+item+'CellFun" class="cellFunInput" data-map="'+item+'"></td>');
|
var cellB2 = $('<td id="'+item+'CellFun" class="cellFunInput" data-map="'+item+'"></td>');
|
||||||
|
@ -753,8 +774,9 @@
|
||||||
// if name is empty, select first item not having instructions
|
// if name is empty, select first item not having instructions
|
||||||
set_current_mapping_item: function(name) {
|
set_current_mapping_item: function(name) {
|
||||||
if (name === undefined) {
|
if (name === undefined) {
|
||||||
for (var entry of this.options.toBeMapped) {
|
for (var entry of this.options.toBeMappedList) {
|
||||||
if (this.instructions[entry].length == 0 && this.prefillData[entry].length == 0) {
|
let prefillLength = this.prefillData[entry] !== undefined ? this.prefillData[entry].length : 0;
|
||||||
|
if (this.instructions[entry].length == 0 && prefillLength == 0) {
|
||||||
name = entry;
|
name = entry;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -780,8 +802,10 @@
|
||||||
add_instruction: function(instructions) {
|
add_instruction: function(instructions) {
|
||||||
this.instructions[this.currentPicking] = instructions;
|
this.instructions[this.currentPicking] = instructions;
|
||||||
this.currentPickingCell.text(instructions.toString());
|
this.currentPickingCell.text(instructions.toString());
|
||||||
this.set_current_mapping_item();
|
if (instructions.length != 0) {
|
||||||
this.update_result_tree();
|
this.set_current_mapping_item();
|
||||||
|
this.update_result_tree();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
add_prefill_data: function(data) {
|
add_prefill_data: function(data) {
|
||||||
|
@ -819,10 +843,11 @@
|
||||||
fillValue: this.fillValueDomInput.val(),
|
fillValue: this.fillValueDomInput.val(),
|
||||||
functions: functions,
|
functions: functions,
|
||||||
datum: this.root,
|
datum: this.root,
|
||||||
prefillData: this.prefillData
|
prefillData: this.prefillData,
|
||||||
};
|
};
|
||||||
var adjustedInstructions = this.adjust_instruction();
|
var adjustedInstructions = this.adjust_instruction();
|
||||||
var result = new $.proxyMapper(adjustedInstructions, this.data, pm_options);
|
var constructionInstruction = this.options.toBeMapped;
|
||||||
|
var result = new $.proxyMapper(adjustedInstructions, constructionInstruction, this.data, pm_options);
|
||||||
|
|
||||||
// destroy and redraw
|
// destroy and redraw
|
||||||
this.treeDivResult[0].innerHTML = '';
|
this.treeDivResult[0].innerHTML = '';
|
||||||
|
@ -830,22 +855,69 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
adjust_instruction: function() {
|
adjust_instruction: function() {
|
||||||
|
var that = this;
|
||||||
var adjustedInstructions = $.extend(true, {}, this.instructions);
|
var adjustedInstructions = $.extend(true, {}, this.instructions);
|
||||||
adjustedInstructions.index = {};
|
adjustedInstructions.index = {};
|
||||||
var matchingIndex = 0;
|
var matchingIndex = 0;
|
||||||
var l = this.instructions.labels;
|
|
||||||
var v = this.instructions.values;
|
|
||||||
var d = this.instructions.dates;
|
|
||||||
|
|
||||||
// convert integer index into {index}
|
// convert integer index into {index}
|
||||||
for (var i=0; i<v.length; i++) {
|
this.options.toBeMappedList.forEach(function(item) {
|
||||||
if (Number.isInteger(v[i])) {
|
if (that.options.toBeMapped[item].strategy === 'value') {
|
||||||
adjustedInstructions.values[i] = '{'+v[i]+'}';
|
let arr = adjustedInstructions[item];
|
||||||
|
for (let i=0; i<arr.length; i++) {
|
||||||
|
if (Number.isInteger(arr[i])) {
|
||||||
|
arr[i] = '{'+arr[i]+'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// add labels and values tracking for value strategy only
|
||||||
|
var subkeys = {}
|
||||||
|
var v, l, d;
|
||||||
|
var v_keyname, l_keyname, d_keyname;
|
||||||
|
this.options.toBeMappedList.forEach(function(keyname) {
|
||||||
|
var item = that.options.toBeMapped[keyname];
|
||||||
|
if (item.strategy === 'value') {
|
||||||
|
v = that.instructions[keyname];
|
||||||
|
v_keyname = keyname;
|
||||||
|
let s = item.instructions.split('.');
|
||||||
|
if (s.length >= 2 && s[0] === '' && s[1] !== '') {
|
||||||
|
s.slice(1).forEach(function(k) {
|
||||||
|
if (k.substring(0, 2) === '@@') {
|
||||||
|
let k_sliced = k.slice(2);
|
||||||
|
subkeys[k_sliced] = that.instructions[k_sliced];
|
||||||
|
} else if (k[0] === '@') {
|
||||||
|
let k_sliced = k.slice(1);
|
||||||
|
subkeys[k_sliced] = that.instructions[k_sliced];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (let keyname in subkeys) {
|
||||||
|
if (this.options.toBeMapped[keyname].strategy === 'date') {
|
||||||
|
var d = this.instructions[keyname];
|
||||||
|
var d_keyname = keyname;
|
||||||
|
} else if (this.options.toBeMapped[keyname].strategy === 'label') {
|
||||||
|
var l = this.instructions[keyname];
|
||||||
|
var l_keyname = keyname;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//var l = this.instructions.labels;
|
||||||
|
//var v = this.instructions.values;
|
||||||
|
//var d = this.instructions.dates;
|
||||||
|
|
||||||
// label & value
|
// label & value
|
||||||
if (l.length != 0 && v.length != 0) {
|
if (l !== undefined && l.length != 0 && v.length != 0) {
|
||||||
var smaller_array = v.length < l.length ? v : l;
|
var smaller_array = v.length < l.length ? v : l;
|
||||||
var has_matched = false;
|
var has_matched = false;
|
||||||
for (var i=0; i<smaller_array.length; i++) {
|
for (var i=0; i<smaller_array.length; i++) {
|
||||||
|
@ -858,15 +930,19 @@
|
||||||
|
|
||||||
// in case no match, last one should be registered
|
// in case no match, last one should be registered
|
||||||
matchingIndex = has_matched ? matchingIndex : smaller_array.length-1;
|
matchingIndex = has_matched ? matchingIndex : smaller_array.length-1;
|
||||||
let inst = adjustedInstructions.values[matchingIndex];
|
//let inst = adjustedInstructions.values[matchingIndex];
|
||||||
|
let inst = adjustedInstructions[v_keyname][matchingIndex];
|
||||||
inst = inst == 'l' ? 'l' : '{'+inst+'}';
|
inst = inst == 'l' ? 'l' : '{'+inst+'}';
|
||||||
adjustedInstructions.values[matchingIndex] = 'i1,'+inst;
|
//adjustedInstructions.values[matchingIndex] = 'i1,'+inst;
|
||||||
adjustedInstructions.index['i1'] = adjustedInstructions.labels.slice(matchingIndex+1);
|
let kref = '@'+l_keyname;
|
||||||
|
adjustedInstructions[v_keyname][matchingIndex] = kref + ',' + inst;
|
||||||
|
//adjustedInstructions.index['i1'] = adjustedInstructions.labels.slice(matchingIndex+1);
|
||||||
|
adjustedInstructions.index[kref] = adjustedInstructions[l_keyname].slice(matchingIndex+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var matchingIndex = 0;
|
var matchingIndex = 0;
|
||||||
// date & value
|
// date & value
|
||||||
if (d.length != 0 && v.length != 0) {
|
if (d !== undefined && d.length != 0 && v.length != 0) {
|
||||||
smaller_array = v.length < d.length ? v : d;
|
smaller_array = v.length < d.length ? v : d;
|
||||||
for (var i=0; i<smaller_array.length; i++) {
|
for (var i=0; i<smaller_array.length; i++) {
|
||||||
if (v[i] != d[i]) {
|
if (v[i] != d[i]) {
|
||||||
|
@ -874,16 +950,22 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
adjustedInstructions.values[matchingIndex] = 'i2,'+adjustedInstructions.values[matchingIndex];
|
//adjustedInstructions.values[matchingIndex] = 'i2,'+adjustedInstructions.values[matchingIndex];
|
||||||
adjustedInstructions.index['i2'] = adjustedInstructions.dates.slice(matchingIndex+1);
|
let kref = '@'+d_keyname;
|
||||||
|
adjustedInstructions[v_keyname][matchingIndex] = kref + ',' + adjustedInstructions[v_keyname][matchingIndex];
|
||||||
|
//adjustedInstructions.index['i2'] = adjustedInstructions.dates.slice(matchingIndex+1);
|
||||||
|
adjustedInstructions.index[kref] = adjustedInstructions[d_keyname].slice(matchingIndex+1);
|
||||||
|
|
||||||
// add '' at the end for value only
|
// add '' at the end for value only
|
||||||
var end_i = adjustedInstructions.values.length-1;
|
//var end_i = adjustedInstructions.values.length-1;
|
||||||
var last_i = adjustedInstructions.values[end_i];
|
//var last_i = adjustedInstructions.values[end_i];
|
||||||
|
var end_i = adjustedInstructions[v_keyname].length-1;
|
||||||
|
var last_i = adjustedInstructions[v_keyname][end_i];
|
||||||
last_i = last_i.split(',');
|
last_i = last_i.split(',');
|
||||||
last_i = last_i.length == 2 ? last_i[1] : last_i[0];
|
last_i = last_i.length == 2 ? last_i[1] : last_i[0];
|
||||||
if (last_i == 'l') {
|
if (last_i == 'l') {
|
||||||
adjustedInstructions.values[end_i+1] = '';
|
//adjustedInstructions.values[end_i+1] = '';
|
||||||
|
adjustedInstructions[v_keyname][end_i+1] = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1035,6 +1117,10 @@
|
||||||
return pts.join(', ');
|
return pts.join(', ');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
objkeyToList: function(obj) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue