Built files from Bizgaze WebServer
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

reactive_data.js 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /* Tabulator v4.6.3 (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 self = this,
  141. data = row.getData();
  142. this.blocked = true;
  143. for (var key in data) {
  144. this.watchKey(row, data, key);
  145. }
  146. this.blocked = false;
  147. };
  148. ReactiveData.prototype.watchKey = function (row, data, key) {
  149. var self = this,
  150. props = Object.getOwnPropertyDescriptor(data, key),
  151. value = data[key],
  152. version = this.currentVersion;
  153. Object.defineProperty(data, key, {
  154. set: function set(newValue) {
  155. value = newValue;
  156. if (!self.blocked && version === self.currentVersion) {
  157. var update = {};
  158. update[key] = newValue;
  159. row.updateData(update);
  160. }
  161. if (props.set) {
  162. props.set(newValue);
  163. }
  164. },
  165. get: function get() {
  166. if (props.get) {
  167. props.get();
  168. }
  169. return value;
  170. }
  171. });
  172. };
  173. ReactiveData.prototype.unwatchRow = function (row) {
  174. var data = row.getData();
  175. for (var key in data) {
  176. Object.defineProperty(data, key, {
  177. value: data[key]
  178. });
  179. }
  180. };
  181. ReactiveData.prototype.block = function () {
  182. this.blocked = true;
  183. };
  184. ReactiveData.prototype.unblock = function () {
  185. this.blocked = false;
  186. };
  187. Tabulator.prototype.registerModule("reactiveData", ReactiveData);