PageRenderTime 24ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/qgrid/qgridjs/qgrid.widget.js

https://gitlab.com/e0/qgrid
JavaScript | 218 lines | 173 code | 23 blank | 22 comment | 27 complexity | a0898acdd19aa2431cd8e6b9ab40446a MD5 | raw file
  1. if (IPython.version[0] === '4' && parseInt(IPython.version[2]) >= 2) {
  2. var path = 'jupyter-js-widgets';
  3. } else {
  4. var path = 'widgets/js/widget';
  5. if (IPython.version[0] !== '3') {
  6. path = 'nbextensions/widgets/' + path;
  7. }
  8. }
  9. define([path], function(widget) {
  10. var grid;
  11. var QGridView = widget.DOMWidgetView.extend({
  12. render: function() {
  13. var that = this;
  14. var cdn_base_url = this.model.get('_cdn_base_url');
  15. // Load the custom css
  16. if ($("#dg-css").length == 0){
  17. $("head").append([
  18. "<link href='" + cdn_base_url + "/lib/slick.grid.css' rel='stylesheet'>",
  19. "<link href='" + cdn_base_url + "/lib/slick-default-theme.css' rel='stylesheet'>",
  20. "<link href='https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.4/css/jquery-ui.min.css' rel='stylesheet'>",
  21. "<link id='dg-css' href='" + cdn_base_url + "/qgrid.css' rel='stylesheet'>"
  22. ]);
  23. }
  24. var path_dictionary = {
  25. jquery_drag: cdn_base_url + "/lib/jquery.event.drag-2.2",
  26. slick_core: cdn_base_url + "/lib/slick.core.2.2",
  27. slick_data_view: cdn_base_url + "/lib/slick.dataview.2.2",
  28. slick_check_box_column: cdn_base_url + "/lib/slick.checkboxselectcolumn",
  29. slick_row_selection_model: cdn_base_url + "/lib/slick.rowselectionmodel",
  30. slick_grid: cdn_base_url + "/lib/slick.grid.2.2",
  31. data_grid: cdn_base_url + "/qgrid",
  32. date_filter: cdn_base_url + "/qgrid.datefilter",
  33. text_filter: cdn_base_url + "/qgrid.textfilter",
  34. slider_filter: cdn_base_url + "/qgrid.sliderfilter",
  35. filter_base: cdn_base_url + "/qgrid.filterbase",
  36. editors: cdn_base_url + "/qgrid.editors",
  37. handlebars: "https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.min"
  38. };
  39. var existing_config = require.s.contexts._.config;
  40. if (!existing_config.paths['underscore']){
  41. path_dictionary['underscore'] = "https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min";
  42. }
  43. if (!existing_config.paths['moment']){
  44. path_dictionary['moment'] = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment.min";
  45. }
  46. if (!existing_config.paths['jqueryui']){
  47. path_dictionary['jqueryui'] = "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min";
  48. }
  49. require.config({
  50. paths: path_dictionary
  51. });
  52. if (typeof jQuery === 'function') {
  53. define('jquery', function() { return jQuery; });
  54. }
  55. /**
  56. * Load the required scripts and create the grid.
  57. */
  58. require([
  59. 'jquery',
  60. 'jquery_drag',
  61. 'slick_core',
  62. 'slick_data_view',
  63. 'slick_check_box_column',
  64. 'slick_row_selection_model',
  65. ],
  66. function() {
  67. require(['slick_grid'], function() {
  68. require(["data_grid", "editors"],function(dgrid, editors) {
  69. that.setupTable(dgrid, editors);
  70. that.drawTable();
  71. }
  72. );
  73. });
  74. });
  75. },
  76. /**
  77. * Set up the table div.
  78. */
  79. setupTable: function(dgrid, editors) {
  80. this.dgrid = dgrid;
  81. this.editors = editors;
  82. // subscribe to incoming messages from the QGridWidget
  83. this.model.on('msg:custom', this.handleMsg, this);
  84. // set up the divs and styles
  85. this.$el.addClass('q-grid-container');
  86. var table = this.$el.append('div');
  87. table.addClass('q-grid');
  88. this.tableDiv = table[0];
  89. // fill the portion of the widget area not in the prompt
  90. var parent = this.el.parentElement;
  91. while (parent.className !== 'widget-area') {
  92. parent = parent.parentElement;
  93. }
  94. var width = (parent.clientWidth - parent.childNodes[0].clientWidth);
  95. this.el.setAttribute("style", "max-width:" + String(width) + "px;");
  96. },
  97. /**
  98. * Set up our QGrid and event handlers.
  99. */
  100. drawTable: function() {
  101. var that = this;
  102. var editors = this.editors;
  103. // create the table
  104. var df = JSON.parse(this.model.get('_df_json'));
  105. var column_types = JSON.parse(this.model.get('_column_types_json'));
  106. var options = this.model.get('grid_options');
  107. grid = new this.dgrid.QGrid(this.tableDiv, df, column_types);
  108. grid.initialize_slick_grid(options);
  109. // set up editing
  110. var sgrid = grid.slick_grid;
  111. var columns = sgrid.getColumns();
  112. for (var i = 1; i < columns.length; i++) {
  113. if (column_types[i].categories) {
  114. columns[i].editor = editors.SelectEditor;
  115. var options = {options: column_types[i].categories};
  116. columns[i].editorOptions = options;
  117. } else if (columns[i].type === 'date') {
  118. columns[i].editor = editors.DateEditor;
  119. } else if (column_types[i]) {
  120. columns[i].editor = editors.TextEditor;
  121. }
  122. if (columns[i].type === 'number') {
  123. columns[i].validator = editors.validateNumber;
  124. }
  125. }
  126. sgrid.setColumns(columns);
  127. // set up callbacks
  128. sgrid.onCellChange.subscribe(function(e, args) {
  129. var column = columns[args.cell].name;
  130. var id = args.grid.getDataItem(args.row).slick_grid_id;
  131. var row = Number(id.replace('row', ''));
  132. var msg = {'row': row, 'column': column,
  133. 'value': args.item[column], 'type': 'cell_change'};
  134. that.send(msg);
  135. });
  136. sgrid.onSelectedRowsChanged.subscribe(function(e, args) {
  137. var rows = [];
  138. var grid = args.grid;
  139. for (var r = 0; r < args.rows.length; r++) {
  140. var id = grid.getDataItem(args.rows[r]).slick_grid_id;
  141. rows.push(Number(id.replace('row', '')));
  142. }
  143. var msg = {'rows': rows, 'type': 'selection_change'};
  144. that.send(msg);
  145. });
  146. },
  147. /**
  148. * Handle messages from the QGridWidget.
  149. */
  150. handleMsg: function(msg) {
  151. var sgrid = grid.slick_grid;
  152. if (msg.type === 'remove_row') {
  153. var cell = sgrid.getActiveCell();
  154. if (!cell) {
  155. console.log('no cell');
  156. return;
  157. }
  158. var data = sgrid.getData().getItem(cell.row);
  159. grid.data_view.deleteItem(data.slick_grid_id);
  160. var row = Number(data.slick_grid_id.replace('row', ''));
  161. msg = {'type': 'remove_row', 'row': row, 'id': data.id};
  162. this.updateSize();
  163. this.send(msg);
  164. } else if (msg.type === 'add_row') {
  165. var dd = sgrid.getData();
  166. dd.addItem(msg);
  167. dd.refresh();
  168. this.updateSize();
  169. this.send(msg);
  170. } else if (msg.type === 'draw_table') {
  171. this.drawTable();
  172. this.updateSize();
  173. }
  174. },
  175. /**
  176. * Update the size of the dataframe.
  177. */
  178. updateSize: function() {
  179. var rowHeight = 28;
  180. var max_height = rowHeight * 15;
  181. var grid_height = max_height;
  182. var total_row_height = (grid.row_data.length + 1) * rowHeight + 1;
  183. if (total_row_height <= max_height){
  184. grid_height = total_row_height;
  185. grid.grid_elem.addClass('hide-scrollbar');
  186. } else {
  187. grid.grid_elem.removeClass('hide-scrollbar');
  188. }
  189. grid.grid_elem.height(grid_height);
  190. grid.slick_grid.render();
  191. grid.slick_grid.resizeCanvas();
  192. }
  193. });
  194. return {QGridView: QGridView}
  195. });