datavis-glide 4.0.0-PRE.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +129 -0
  3. package/datavis.js +101 -0
  4. package/dist/wcdatavis.css +1957 -0
  5. package/dist/wcdatavis.min.js +1 -0
  6. package/global-jquery.js +4 -0
  7. package/ie-fixes.js +13 -0
  8. package/index.js +70 -0
  9. package/meteor.js +1 -0
  10. package/package.json +102 -0
  11. package/src/flags.js +6 -0
  12. package/src/graph.js +1079 -0
  13. package/src/graph_renderer.js +85 -0
  14. package/src/grid.js +2777 -0
  15. package/src/grid_control.js +1957 -0
  16. package/src/grid_filter.js +1073 -0
  17. package/src/grid_renderer.js +276 -0
  18. package/src/group_fun_win.js +121 -0
  19. package/src/lang/en-US.js +188 -0
  20. package/src/lang/es-MX.js +188 -0
  21. package/src/lang/fr-FR.js +188 -0
  22. package/src/lang/id-ID.js +188 -0
  23. package/src/lang/nl-NL.js +188 -0
  24. package/src/lang/pt-BR.js +188 -0
  25. package/src/lang/ru-RU.js +188 -0
  26. package/src/lang/th-TH.js +188 -0
  27. package/src/lang/vi-VN.js +188 -0
  28. package/src/lang/zh-Hans-CN.js +188 -0
  29. package/src/operations_palette.js +176 -0
  30. package/src/prefs_modules.js +132 -0
  31. package/src/reg/graph_renderer.js +17 -0
  32. package/src/renderers/graph/chartjs.js +457 -0
  33. package/src/renderers/graph/google.js +584 -0
  34. package/src/renderers/graph/jit.js +61 -0
  35. package/src/renderers/graph/svelte-gantt.js +168 -0
  36. package/src/renderers/grid/dummy.js +79 -0
  37. package/src/renderers/grid/handlebars.js +217 -0
  38. package/src/renderers/grid/squirrelly.js +215 -0
  39. package/src/renderers/grid/table/group_detail.js +1404 -0
  40. package/src/renderers/grid/table/group_summary.js +380 -0
  41. package/src/renderers/grid/table/pivot.js +915 -0
  42. package/src/renderers/grid/table/plain.js +1592 -0
  43. package/src/renderers/grid/table.js +2510 -0
  44. package/src/trans.js +101 -0
  45. package/src/ui/collapsible.js +234 -0
  46. package/src/ui/filters/date.js +283 -0
  47. package/src/ui/grid_filter.js +398 -0
  48. package/src/ui/popup_menu.js +224 -0
  49. package/src/ui/popup_window.js +572 -0
  50. package/src/ui/slider.js +156 -0
  51. package/src/ui/tabs.js +202 -0
  52. package/src/ui/templates.js +131 -0
  53. package/src/ui/toolbar.js +63 -0
  54. package/src/ui/toolbars/grid.js +873 -0
  55. package/src/ui/windows/col_config.js +341 -0
  56. package/src/ui/windows/debug.js +164 -0
  57. package/src/ui/windows/grid_table_opts.js +139 -0
  58. package/src/util/handlebars.js +158 -0
  59. package/src/util/jquery.js +630 -0
  60. package/src/util/misc.js +1058 -0
  61. package/src/util/squirrelly.js +155 -0
  62. package/wcdatavis.css +1601 -0
package/src/ui/tabs.js ADDED
@@ -0,0 +1,202 @@
1
+ import jQuery from 'jquery';
2
+ import {
3
+ makeSubclass,
4
+ } from '../util/misc.js';
5
+
6
+ // Tabs {{{1
7
+
8
+ /**
9
+ * A lightweight tabbed interface widget.
10
+ *
11
+ * Pages are added via {@link Tabs#addPage} and switched via {@link Tabs#switchPage}.
12
+ * The first page added is activated automatically.
13
+ *
14
+ * @class
15
+ *
16
+ * @param {Element|jQuery} container
17
+ * The element the tabs widget will be built inside.
18
+ *
19
+ * @property {object} ui
20
+ * @property {jQuery} ui.root
21
+ * @property {jQuery} ui.nav
22
+ */
23
+
24
+ var Tabs = makeSubclass('Tabs', Object, function (container) {
25
+ var self = this;
26
+
27
+ self._container = jQuery(container);
28
+ self._pages = [];
29
+ self._activeIndex = -1;
30
+ self._idPrefix = 'wcdv-tabs-' + Math.random().toString(36).substr(2, 9);
31
+ self.ui = {};
32
+
33
+ self._build();
34
+ });
35
+
36
+ // #_build {{{2
37
+
38
+ /**
39
+ * Build the DOM skeleton for the tabs widget.
40
+ * @private
41
+ */
42
+
43
+ Tabs.prototype._build = function () {
44
+ var self = this;
45
+
46
+ self.ui.nav = jQuery('<ul>', {
47
+ 'class': 'wcdv-tabs-nav',
48
+ role: 'tablist'
49
+ });
50
+
51
+ self.ui.root = jQuery('<div>', {
52
+ 'class': 'wcdv-tabs'
53
+ }).append(self.ui.nav);
54
+
55
+ self._container.append(self.ui.root);
56
+ };
57
+
58
+ // #addPage {{{2
59
+
60
+ /**
61
+ * Add a new tab page.
62
+ *
63
+ * @param {string} label
64
+ * The text shown on the tab header.
65
+ *
66
+ * @param {Element|jQuery} contentElt
67
+ * The content element placed into the panel.
68
+ *
69
+ * @returns {number}
70
+ * The zero-based index of the new page.
71
+ */
72
+
73
+ Tabs.prototype.addPage = function (label, contentElt) {
74
+ var self = this;
75
+
76
+ var index = self._pages.length;
77
+ var tabId = self._idPrefix + '-tab-' + index;
78
+ var panelId = self._idPrefix + '-panel-' + index;
79
+
80
+ var tab = jQuery('<li>', {
81
+ 'class': 'wcdv-tabs-tab',
82
+ role: 'tab',
83
+ id: tabId,
84
+ 'aria-selected': 'false',
85
+ 'aria-controls': panelId,
86
+ tabindex: index === 0 ? '0' : '-1'
87
+ }).append(
88
+ jQuery('<a>', {
89
+ 'class': 'wcdv-tabs-tab-link'
90
+ }).text(label)
91
+ );
92
+
93
+ (function (idx) {
94
+ tab.on('click', function (e) {
95
+ e.preventDefault();
96
+ self.switchPage(idx);
97
+ });
98
+ tab.on('keydown', function (e) {
99
+ var key = e.which || e.keyCode;
100
+ // Left arrow = 37, Right arrow = 39
101
+ if (key === 37) {
102
+ e.preventDefault();
103
+ var prev = idx - 1;
104
+ if (prev < 0) {
105
+ prev = self._pages.length - 1;
106
+ }
107
+ self.switchPage(prev);
108
+ self._pages[prev].tabEl.focus();
109
+ }
110
+ else if (key === 39) {
111
+ e.preventDefault();
112
+ var next = idx + 1;
113
+ if (next >= self._pages.length) {
114
+ next = 0;
115
+ }
116
+ self.switchPage(next);
117
+ self._pages[next].tabEl.focus();
118
+ }
119
+ });
120
+ })(index);
121
+
122
+ var panel = jQuery('<div>', {
123
+ 'class': 'wcdv-tabs-panel',
124
+ role: 'tabpanel',
125
+ id: panelId,
126
+ 'aria-labelledby': tabId
127
+ }).append(jQuery(contentElt));
128
+
129
+ self.ui.nav.append(tab);
130
+ self.ui.root.append(panel);
131
+
132
+ self._pages.push({
133
+ label: label,
134
+ tabEl: tab,
135
+ panelEl: panel
136
+ });
137
+
138
+ // Auto-activate first page.
139
+ if (self._pages.length === 1) {
140
+ self.switchPage(0);
141
+ }
142
+
143
+ return index;
144
+ };
145
+
146
+ // #switchPage {{{2
147
+
148
+ /**
149
+ * Switch to the tab page at the given index.
150
+ *
151
+ * @param {number} index
152
+ * Zero-based page index.
153
+ */
154
+
155
+ Tabs.prototype.switchPage = function (index) {
156
+ var self = this;
157
+
158
+ if (index < 0 || index >= self._pages.length || index === self._activeIndex) {
159
+ return;
160
+ }
161
+
162
+ // Deactivate current tab.
163
+ if (self._activeIndex >= 0) {
164
+ var cur = self._pages[self._activeIndex];
165
+ cur.tabEl.removeClass('wcdv-tabs-tab-active')
166
+ .attr('aria-selected', 'false')
167
+ .attr('tabindex', '-1');
168
+ cur.panelEl.removeClass('wcdv-tabs-panel-active');
169
+ }
170
+
171
+ // Activate new tab.
172
+ var next = self._pages[index];
173
+ next.tabEl.addClass('wcdv-tabs-tab-active')
174
+ .attr('aria-selected', 'true')
175
+ .attr('tabindex', '0');
176
+ next.panelEl.addClass('wcdv-tabs-panel-active');
177
+
178
+ self._activeIndex = index;
179
+ };
180
+
181
+ // #destroy {{{2
182
+
183
+ /**
184
+ * Remove all DOM created by this widget and release references.
185
+ */
186
+
187
+ Tabs.prototype.destroy = function () {
188
+ var self = this;
189
+
190
+ if (self.ui.root) {
191
+ self.ui.root.remove();
192
+ self.ui.root = null;
193
+ }
194
+ self.ui.nav = null;
195
+ self._pages = [];
196
+ self._activeIndex = -1;
197
+ self._container = null;
198
+ };
199
+
200
+ export {
201
+ Tabs
202
+ };
@@ -0,0 +1,131 @@
1
+ import _ from 'underscore';
2
+ import jQuery from 'jquery';
3
+
4
+ import {
5
+ getProp,
6
+ makeSubclass,
7
+ setProp,
8
+ } from '../util/misc.js';
9
+ import { trans } from '../trans.js';
10
+ import { OrdMap } from 'datavis-ace';
11
+ import { PopupWindow } from './popup_window.js';
12
+ import { Tabs } from './tabs.js';
13
+
14
+ // TemplatesEditor {{{1
15
+
16
+ var TemplatesEditor = makeSubclass('TemplatesEditor', Object, function (grid, onSave, onCancel) {
17
+ var self = this;
18
+
19
+ self.grid = grid;
20
+ self.win = new PopupWindow({
21
+ title: trans('GRID.TEMPLATE_EDITOR.TITLE'),
22
+ width: 'auto',
23
+ buttons: [{
24
+ icon: 'check',
25
+ label: trans('DIALOG.OK'),
26
+ callback: function () {
27
+ // Update the configuration of the grid.
28
+
29
+ self.tabData.each(function (v, k) {
30
+ _.each(['empty', 'before', 'beforeGroup', 'item', 'afterGroup', 'after'], function (t) {
31
+ if (v.inputs[t] != null) {
32
+ setProp(v.inputs[t].val(), self.grid.defn, 'rendererOpts', k, t);
33
+ }
34
+ });
35
+ });
36
+
37
+ self.win.close();
38
+ if (typeof onSave === 'function') {
39
+ onSave();
40
+ }
41
+ }
42
+ }, {
43
+ icon: 'ban',
44
+ label: trans('DIALOG.CANCEL'),
45
+ callback: function () {
46
+ self.win.close();
47
+ if (typeof onCancel === 'function') {
48
+ onCancel();
49
+ }
50
+ }
51
+ }]
52
+ });
53
+
54
+ // Tabs {{{2
55
+
56
+ var makeTab = function (name, displayName) {
57
+ var inputs = {};
58
+ var labels = {};
59
+
60
+ var div = jQuery('<div>');
61
+
62
+ _.each([
63
+ {id: 'empty', label: trans('GRID.TEMPLATE_EDITOR.CONFIG.EMPTY'), rows: 2},
64
+ {id: 'before', label: trans('GRID.TEMPLATE_EDITOR.CONFIG.BEFORE'), rows: 2},
65
+ {id: 'beforeGroup', label: trans('GRID.TEMPLATE_EDITOR.CONFIG.BEFORE_GROUP'), rows: 2, modes: ['whenPivot']},
66
+ {id: 'item', label: trans('GRID.TEMPLATE_EDITOR.CONFIG.ITEM'), rows: name === 'whenPlain' ? 8 : 4 },
67
+ {id: 'afterGroup', label: trans('GRID.TEMPLATE_EDITOR.CONFIG.AFTER_GROUP'), rows: 2, modes: ['whenPivot']},
68
+ {id: 'after', label: trans('GRID.TEMPLATE_EDITOR.CONFIG.AFTER'), rows: 2},
69
+ ], function (x) {
70
+ if (x.modes != null && x.modes.indexOf(name) < 0) {
71
+ return;
72
+ }
73
+ labels[x.id] = jQuery('<label>', {
74
+ for: 'wcdv_hbe_' + name + '_' + x.id
75
+ })
76
+ .css('display', 'block')
77
+ .text(x.label + ':');
78
+ inputs[x.id] = jQuery('<textarea>', {
79
+ id: 'wcdv_hbe_' + name + '_' + x.id,
80
+ rows: x.rows,
81
+ cols: 80
82
+ })
83
+ .css('font-family', 'monospace');
84
+ div.append(labels[x.id]);
85
+ div.append(inputs[x.id]);
86
+ });
87
+
88
+ return { div: div, inputs: inputs };
89
+ };
90
+
91
+ self.tabData = new OrdMap();
92
+ self.tabData.set('whenPlain', makeTab('whenPlain', trans('GRID.TEMPLATE_EDITOR.PLAIN')));
93
+ self.tabData.set('whenGroup', makeTab('whenGroup', trans('GRID.TEMPLATE_EDITOR.GROUPED')));
94
+ self.tabData.set('whenPivot', makeTab('whenPivot', trans('GRID.TEMPLATE_EDITOR.PIVOTTED')));
95
+
96
+ var tabsContainer = jQuery('<div>');
97
+ var tabsWidget = new Tabs(tabsContainer);
98
+ self.tabData.each(function (x, k) {
99
+ var displayName = k === 'whenPlain' ? trans('GRID.TEMPLATE_EDITOR.PLAIN')
100
+ : k === 'whenGroup' ? trans('GRID.TEMPLATE_EDITOR.GROUPED')
101
+ : trans('GRID.TEMPLATE_EDITOR.PIVOTTED');
102
+ tabsWidget.addPage(displayName, x.div);
103
+ });
104
+
105
+ self.win.setContent(tabsContainer);
106
+ });
107
+
108
+ // #show {{{2
109
+
110
+ TemplatesEditor.prototype.show = function () {
111
+ var self = this;
112
+
113
+ // Setup the values of each textarea.
114
+
115
+ self.tabData.each(function (v, k) {
116
+ var config = getProp(self.grid.defn, 'rendererOpts', k);
117
+ if (config != null) {
118
+ _.each(['empty', 'before', 'beforeGroup', 'item', 'afterGroup', 'after'], function (t) {
119
+ if (v.inputs[t] && config[t]) {
120
+ v.inputs[t].val(config[t]);
121
+ }
122
+ });
123
+ }
124
+ });
125
+
126
+ self.win.open();
127
+ };
128
+
129
+ export {
130
+ TemplatesEditor
131
+ };
@@ -0,0 +1,63 @@
1
+ import jQuery from 'jquery';
2
+
3
+ import {
4
+ isVisible,
5
+ makeSubclass,
6
+ } from '../util/misc.js';
7
+
8
+ // ToolbarSection {{{1
9
+
10
+ var ToolbarSection = makeSubclass('ToolbarSection', Object, function () {
11
+ var self = this;
12
+
13
+ self.ui = {};
14
+ self.ui.root = jQuery('<div>');
15
+ });
16
+
17
+ // #attach {{{2
18
+
19
+ ToolbarSection.prototype.attach = function (parent) {
20
+ var self = this;
21
+ self.ui.root.appendTo(parent);
22
+ };
23
+
24
+ // #detach {{{2
25
+
26
+ ToolbarSection.prototype.detach = function () {
27
+ var self = this;
28
+ self.ui.root.remove();
29
+ };
30
+
31
+ // #show {{{2
32
+
33
+ ToolbarSection.prototype.show = function () {
34
+ var self = this;
35
+ self.update();
36
+ self.ui.root.show();
37
+ };
38
+
39
+ // #hide {{{2
40
+
41
+ ToolbarSection.prototype.hide = function () {
42
+ var self = this;
43
+ self.ui.root.hide();
44
+ };
45
+
46
+ // #isVisible {{{2
47
+
48
+ ToolbarSection.prototype.isVisible = function () {
49
+ var self = this;
50
+ return isVisible(self.ui.root);
51
+ };
52
+
53
+ // #update {{{2
54
+
55
+ ToolbarSection.prototype.update = function () {
56
+ // Do nothing.
57
+ };
58
+
59
+ // Exports {{{1
60
+
61
+ export {
62
+ ToolbarSection,
63
+ };