Built files from Bizgaze WebServer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

reactive_data.js 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. /* Tabulator v4.8.2 (c) Oliver Folkerd */
  2. var ReactiveData = function ReactiveData(table) {
  3. this.table = table; //hold Tabulator object
  4. this.data = false;
  5. this.blocked = false; //block reactivity while performing update
  6. this.origFuncs = {}; // hold original data array functions to allow replacement after data is done with
  7. this.currentVersion = 0;
  8. };
  9. ReactiveData.prototype.watchData = function (data) {
  10. var self = this,
  11. pushFunc,
  12. version;
  13. this.currentVersion++;
  14. version = this.currentVersion;
  15. self.unwatchData();
  16. self.data = data;
  17. //override array push function
  18. self.origFuncs.push = data.push;
  19. Object.defineProperty(self.data, "push", {
  20. enumerable: false,
  21. configurable: true,
  22. value: function value() {
  23. var args = Array.from(arguments);
  24. if (!self.blocked && version === self.currentVersion) {
  25. args.forEach(function (arg) {
  26. self.table.rowManager.addRowActual(arg, false);
  27. });
  28. }
  29. return self.origFuncs.push.apply(data, arguments);
  30. }
  31. });
  32. //override array unshift function
  33. self.origFuncs.unshift = data.unshift;
  34. Object.defineProperty(self.data, "unshift", {
  35. enumerable: false,
  36. configurable: true,
  37. value: function value() {
  38. var args = Array.from(arguments);
  39. if (!self.blocked && version === self.currentVersion) {
  40. args.forEach(function (arg) {
  41. self.table.rowManager.addRowActual(arg, true);
  42. });
  43. }
  44. return self.origFuncs.unshift.apply(data, arguments);
  45. }
  46. });
  47. //override array shift function
  48. self.origFuncs.shift = data.shift;
  49. Object.defineProperty(self.data, "shift", {
  50. enumerable: false,
  51. configurable: true,
  52. value: function value() {
  53. var row;
  54. if (!self.blocked && version === self.currentVersion) {
  55. if (self.data.length) {
  56. row = self.table.rowManager.getRowFromDataObject(self.data[0]);
  57. if (row) {
  58. row.deleteActual();
  59. }
  60. }
  61. }
  62. return self.origFuncs.shift.call(data);
  63. }
  64. });
  65. //override array pop function
  66. self.origFuncs.pop = data.pop;
  67. Object.defineProperty(self.data, "pop", {
  68. enumerable: false,
  69. configurable: true,
  70. value: function value() {
  71. var row;
  72. if (!self.blocked && version === self.currentVersion) {
  73. if (self.data.length) {
  74. row = self.table.rowManager.getRowFromDataObject(self.data[self.data.length - 1]);
  75. if (row) {
  76. row.deleteActual();
  77. }
  78. }
  79. }
  80. return self.origFuncs.pop.call(data);
  81. }
  82. });
  83. //override array splice function
  84. self.origFuncs.splice = data.splice;
  85. Object.defineProperty(self.data, "splice", {
  86. enumerable: false,
  87. configurable: true,
  88. value: function value() {
  89. var args = Array.from(arguments),
  90. start = args[0] < 0 ? data.length + args[0] : args[0],
  91. end = args[1],
  92. newRows = args[2] ? args.slice(2) : false,
  93. startRow;
  94. if (!self.blocked && version === self.currentVersion) {
  95. //add new rows
  96. if (newRows) {
  97. startRow = data[start] ? self.table.rowManager.getRowFromDataObject(data[start]) : false;
  98. if (startRow) {
  99. newRows.forEach(function (rowData) {
  100. self.table.rowManager.addRowActual(rowData, true, startRow, true);
  101. });
  102. } else {
  103. newRows = newRows.slice().reverse();
  104. newRows.forEach(function (rowData) {
  105. self.table.rowManager.addRowActual(rowData, true, false, true);
  106. });
  107. }
  108. }
  109. //delete removed rows
  110. if (end !== 0) {
  111. var oldRows = data.slice(start, typeof args[1] === "undefined" ? args[1] : start + end);
  112. oldRows.forEach(function (rowData, i) {
  113. var row = self.table.rowManager.getRowFromDataObject(rowData);
  114. if (row) {
  115. row.deleteActual(i !== oldRows.length - 1);
  116. }
  117. });
  118. }
  119. if (newRows || end !== 0) {
  120. self.table.rowManager.reRenderInPosition();
  121. }
  122. }
  123. return self.origFuncs.splice.apply(data, arguments);
  124. }
  125. });
  126. };
  127. ReactiveData.prototype.unwatchData = function () {
  128. if (this.data !== false) {
  129. for (var key in this.origFuncs) {
  130. Object.defineProperty(this.data, key, {
  131. enumerable: true,
  132. configurable: true,
  133. writable: true,
  134. value: this.origFuncs.key
  135. });
  136. }
  137. }
  138. };
  139. ReactiveData.prototype.watchRow = function (row) {
  140. var data = row.getData();
  141. this.blocked = true;
  142. for (var key in data) {
  143. this.watchKey(row, data, key);
  144. }
  145. if (this.table.options.dataTree) {
  146. this.watchTreeChildren(row);
  147. }
  148. this.blocked = false;
  149. };
  150. ReactiveData.prototype.watchTreeChildren = function (row) {
  151. var self = this,
  152. childField = row.getData()[this.table.options.dataTreeChildField],
  153. origFuncs = {};
  154. function rebuildTree() {
  155. self.table.modules.dataTree.initializeRow(row);
  156. self.table.modules.dataTree.layoutRow(row);
  157. self.table.rowManager.refreshActiveData("tree", false, true);
  158. }
  159. if (childField) {
  160. origFuncs.push = childField.push;
  161. Object.defineProperty(childField, "push", {
  162. enumerable: false,
  163. configurable: true,
  164. value: function value() {
  165. var result = origFuncs.push.apply(childField, arguments);
  166. rebuildTree();
  167. return result;
  168. }
  169. });
  170. origFuncs.unshift = childField.unshift;
  171. Object.defineProperty(childField, "unshift", {
  172. enumerable: false,
  173. configurable: true,
  174. value: function value() {
  175. var result = origFuncs.unshift.apply(childField, arguments);
  176. rebuildTree();
  177. return result;
  178. }
  179. });
  180. origFuncs.shift = childField.shift;
  181. Object.defineProperty(childField, "shift", {
  182. enumerable: false,
  183. configurable: true,
  184. value: function value() {
  185. var result = origFuncs.shift.call(childField);
  186. rebuildTree();
  187. return result;
  188. }
  189. });
  190. origFuncs.pop = childField.pop;
  191. Object.defineProperty(childField, "pop", {
  192. enumerable: false,
  193. configurable: true,
  194. value: function value() {
  195. var result = origFuncs.pop.call(childField);
  196. rebuildTree();
  197. return result;
  198. }
  199. });
  200. origFuncs.splice = childField.splice;
  201. Object.defineProperty(childField, "splice", {
  202. enumerable: false,
  203. configurable: true,
  204. value: function value() {
  205. var result = origFuncs.splice.apply(childField, arguments);
  206. rebuildTree();
  207. return result;
  208. }
  209. });
  210. }
  211. };
  212. ReactiveData.prototype.watchKey = function (row, data, key) {
  213. var self = this,
  214. props = Object.getOwnPropertyDescriptor(data, key),
  215. value = data[key],
  216. version = this.currentVersion;
  217. Object.defineProperty(data, key, {
  218. set: function set(newValue) {
  219. value = newValue;
  220. if (!self.blocked && version === self.currentVersion) {
  221. var update = {};
  222. update[key] = newValue;
  223. row.updateData(update);
  224. }
  225. if (props.set) {
  226. props.set(newValue);
  227. }
  228. },
  229. get: function get() {
  230. if (props.get) {
  231. props.get();
  232. }
  233. return value;
  234. }
  235. });
  236. };
  237. ReactiveData.prototype.unwatchRow = function (row) {
  238. var data = row.getData();
  239. for (var key in data) {
  240. Object.defineProperty(data, key, {
  241. value: data[key]
  242. });
  243. }
  244. };
  245. ReactiveData.prototype.block = function () {
  246. this.blocked = true;
  247. };
  248. ReactiveData.prototype.unblock = function () {
  249. this.blocked = false;
  250. };
  251. Tabulator.prototype.registerModule("reactiveData", ReactiveData);