Handsontable example
HTML
<h2>Bugs in handsontable-ruleJS (Patched)</h2>
<p><a href="http://jsfiddle.net/71o23gp0/4/" target="_blank">This is the patched version of http://jsfiddle.net/71o23gp0/4/.</a></p>
<p>Both cases seem to come from the same problem, but they both worth seeing.</p>
<p>Here B1 displays the value of B2 <b>before</b> its interpretation where it should display "<b>10</b>". Just like it misses some recursive processing. Focusing the cell will show its real value "<b>=A2</b>" which will next be interpreted correctly.</p>
<div id="example1" class="handsontable"></div>
<p>This one is interesting, because when the cell "<b>A2</b>" tries to calculate "<b>C1 * B2</b>" it does "<b>3 * =5 + 1"</b> instead of "<b>3 * 6</b>", which obviously fails.</p>
<div id="example2" class="handsontable"></div>
<p>The only way to correct it is to edit "<b>C1</b>" (even without changing its value).</p>
CSS
</style><!-- Ugly Hack due to jsFiddle issue: http://goo.gl/BUfGZ -->
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/jquery/jquery-1.10.2.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/handsontable/handsontable.full.js"></script>
<link rel="stylesheet" media="screen" href="http://handsontable.github.io/handsontable-ruleJS/lib/handsontable/handsontable.full.css">
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/lodash/lodash.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/underscore.string/underscore.string.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/moment/moment.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/numeral/numeral.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/numericjs/numeric.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/js-md5/md5.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/jstat/jstat.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/formulajs/formula.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/js/parser.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/js/ruleJS.js"></script>
<link rel="stylesheet" media="screen" href="http://handsontable.github.io/handsontable-ruleJS/css/samples.css">
<style type="text/css">
body {background: white; margin: 20px;}
h2 {margin: 20px 0;}
JavaScript
//
// Here starts the new handsontable.formula.js
//
(function(Handsontable) {
'use strict';
// [MODIFICATION]
var formulasResults = {};
// _!_MODIFICATION
function HandsontableFormula() {
var isFormula = function(value) {
if (value) {
if (value[0] === '=') {
return true;
}
}
return false;
};
// [MODIFICATION]
var beforeRender = function(isForced) {
formulasResults = {};
var data = this.getData();
for (var i = 0; i < data.length; ++i) {
for (var j = 0; j < data[i].length; ++j) {
var value = data[i][j];
if (value && value[0] === '=') {
var cellId = this.plugin.utils.translateCellCoords({
row: i,
col: j
});
this.plugin.matrix.removeItem(cellId);
}
}
}
};
// _!_MODIFICATION
var formulaRenderer = function(instance, TD, row, col, prop, value, cellProperties) {
if (instance.formulasEnabled && isFormula(value)) {
// translate coordinates into cellId
var cellId = instance.plugin.utils.translateCellCoords({
row: row,
col: col
}),
prevFormula = null,
formula = null,
needUpdate = false,
error, result;
if (!cellId) {
return;
}
// get cell data
var item = instance.plugin.matrix.getItem(cellId);
if (item) {
needUpdate = !! item.needUpdate;
if (item.error) {
prevFormula = item.formula;
error = item.error;
if (needUpdate) {
error = null;
}
}
}
// check if typed formula or cell value should be recalculated
if ((value && value[0] === '=') || needUpdate) {
//...