react-graph-grid 0.1.9 → 0.1.11

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.
@@ -0,0 +1,339 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { BaseComponent } from './Base';
3
+ import { Images } from './Themes/Images';
4
+ import { ModalClass } from './Modal';
5
+ // ==================================================================================================================================================================
6
+ export function Dropdown(props) {
7
+ let dd = null;
8
+
9
+ const [ddState, setState] = useState({ dd: dd, ind: 0 });
10
+
11
+ if (ddState.dd) {
12
+ dd = ddState.dd;
13
+ }
14
+ else {
15
+ dd = new DropdownClass(props);
16
+ }
17
+
18
+ if (props.init && !ModalClass._isFake) {
19
+ props.init(dd);
20
+ }
21
+
22
+ dd.refreshState = function () {
23
+ setState({ dd: dd, ind: dd.stateind++ });
24
+ }
25
+
26
+ useEffect(() => {
27
+ dd.setupEvents();
28
+
29
+ return () => {
30
+ dd.clearEvents();
31
+ }
32
+ }, [dd])
33
+
34
+ return (dd.render());
35
+ }
36
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
37
+ export class DropdownClass extends ModalClass {
38
+ constructor(props) {
39
+ super(props);
40
+
41
+ const dd = this;
42
+
43
+ dd.getItems = props.getItems || function () { return new Promise(function (resolve) { resolve([]) }); };
44
+
45
+ window._dropdownSeq = window._dropdownSeq || 0;
46
+
47
+ dd.id = window._dropdownSeq++;
48
+
49
+ dd.pageNumber = 1;
50
+ dd.pageSize = props.pageSize || 20;
51
+ dd.items = props.items || [];
52
+
53
+ dd.menuItemClass = props.menuItemClass || BaseComponent.theme.menuItemClass;
54
+ dd.menuClass = props.menuClass || BaseComponent.theme.menuClass;
55
+
56
+ dd.stateind = 0;
57
+
58
+ dd.opt.onItemClick = props.onItemClick;
59
+ dd.opt.onClose = props.onClose;
60
+
61
+ dd.opt.parentRect = props.parentRect;
62
+
63
+ dd.maxW = props.maxW;
64
+
65
+ dd.opt.closeWhenEscape = true;
66
+ dd.opt.noHeader = true;
67
+ dd.opt.noFooter = true;
68
+ dd.opt.resizable = false;
69
+ dd.opt.noPadding = true;
70
+ dd.opt.hiddenOverlay = true;
71
+
72
+ dd.opt.onItemMouseEnter = props.onItemMouseEnter;
73
+ dd.opt.onItemMouseLeave = props.onItemMouseLeave;
74
+
75
+ dd.renderContent = dd.renderDropdownContent;
76
+
77
+ dd.visible = dd.items.length > 0;
78
+ }
79
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
80
+ appendItems() {
81
+ const dd = this;
82
+
83
+ dd.pageNumber++;
84
+
85
+ dd.getItems({ filter: dd.filter }).then(
86
+ items => {
87
+ dd.items = items;
88
+
89
+ dd.refreshState();
90
+ }
91
+ );
92
+ }
93
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
94
+ render() {
95
+ return super.render();
96
+ }
97
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
98
+ renderDropdownContent() {
99
+ const dd = this;
100
+
101
+ if (!dd.items || dd.waitingItems) {
102
+ return dd.Spinner(dd.id);
103
+ }
104
+
105
+ return (
106
+ <>
107
+ {
108
+ dd.allowUserFilter ? <></> : <></>
109
+ }
110
+ <ul
111
+ key={`dropdown_${dd.id}_`}
112
+ className={`dropdown-ul ${dd.menuClass || ''}`}
113
+ style={{ overflowX: 'hidden', padding: '0', margin: '0' }}
114
+ >
115
+ {
116
+ dd.items.map((item, ind) => {
117
+ return (
118
+ <li
119
+ dropdown-item={`${dd.id}_${item.id}_`}
120
+ key={`dropdownitem_${dd.id}_${item.id}_${ind}_`}
121
+ title={dd.translate(item.title || item.text)}
122
+ className={dd.menuItemClass + (dd.activeItem === item ? ' active' : '')}
123
+ style={{
124
+ listStyleType: 'none',
125
+ display: 'flex',
126
+ justifyContent: 'start',
127
+ flexWrap: 'nowrap',
128
+ alignItems: 'center',
129
+ paddingRight: item.items && item.items.length > 0 ? '' : '1em',
130
+ height: '1.5em',
131
+ }}
132
+ onClick={(e) => dd.onItemClick(e, item.id)}
133
+ onMouseEnter={(e) => {
134
+ if (!dd.opt.onItemMouseEnter) return;
135
+ dd.opt.onItemMouseEnter(e, item);
136
+ }}
137
+ onMouseLeave={(e) => {
138
+ if (!dd.opt.onItemMouseLeave) return;
139
+ dd.opt.onItemMouseLeave(e, item);
140
+ }}
141
+ >
142
+ <div style={{ width: '2em' }}>
143
+ {item.img ? item.img() : ''}
144
+ </div>
145
+ <div
146
+ style={{
147
+ display: 'flex',
148
+ justifyContent: 'space-between',
149
+ flexWrap: 'nowrap',
150
+ alignItems: 'center',
151
+ width: '100%',
152
+ }}
153
+ >
154
+ <span>{dd.translate(item.text)}</span>
155
+ {item.items && item.items.length > 0 ? Images.images.submenu(20, 10) : ''}
156
+ </div>
157
+ </li>
158
+ );
159
+ })
160
+ }
161
+ {
162
+ dd.allowUpload && dd.pageSize > 0 && dd.items.length === dd.pageSize * dd.pageNumber ?
163
+ <ul className={`dropdown-ul ${dd.menuClass || ''}`}
164
+ key={`dropdownadd_${dd.id}_`}
165
+ >
166
+ <li dropdown-item={`${dd.id}_append_`}
167
+ key={`dropdownitem_$${dd.id}_append_`}
168
+ title={dd.translate('load more records')}
169
+ className={dd.menuItemClass}
170
+ style={{ listStyleType: 'none', display: 'flex', flexWrap: 'nowrap' }}
171
+ onClick={(e) => dd.onItemClick(e, 'append')}
172
+ >
173
+ ${dd.translate('more') + '...'}
174
+ </li>
175
+ </ul>
176
+ : <></>
177
+ }
178
+ </ul>
179
+ </>
180
+ );
181
+ }
182
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
183
+ calcPos(e) {
184
+ const dd = this;
185
+
186
+ const rect = dd.getDimensionsByContent();
187
+ const parentRect = dd.opt.parentRect ? dd.opt.parentRect : { x: e.clientX, y: e.clientY, width: e.width || 0, height: e.height || 0 };
188
+
189
+ dd.opt.pos = {
190
+ x: parentRect.x,
191
+ y: parentRect.y + parseInt(parentRect.height),
192
+ w: Math.max(rect.w, parentRect.width),
193
+ h: rect.h
194
+ };
195
+
196
+ if (dd.maxW != null) {
197
+ dd.opt.pos.w = Math.min(dd.opt.pos.w, dd.maxW);
198
+ }
199
+ }
200
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
201
+ popup(e) {
202
+ const dd = this;
203
+
204
+ function afterGetItems(newItems) {
205
+ dd.waitingItems = false;
206
+
207
+ if (newItems && newItems.length > 0) {
208
+ dd.items.push(...newItems);
209
+ }
210
+
211
+ dd.lastPageNumber = dd.pageNumber;
212
+
213
+ dd.visible = dd.items.length > 0;
214
+
215
+ if (dd.items.length <= 0 && !dd.opt.allowUserFilter) return;
216
+
217
+ dd.calcPos(e);
218
+ //log(' DropdownPos w = ' + dd.pos.w + ', h = ' + dd.pos.h);
219
+
220
+ dd.refreshState();
221
+ }
222
+
223
+ if (!dd.lastPageNumber || dd.lastPageNumber !== dd.pageNumber || dd.items.length <= 0) {
224
+ dd.waitingItems = true;
225
+ dd.visible = true;
226
+ dd.calcPos(e);
227
+
228
+ dd.refreshState();
229
+
230
+ dd.getItems({ self: dd, filter: dd.filter, pageSize: dd.pageSize, pageNumber: dd.pageNumber }).then(
231
+ items => {
232
+ afterGetItems(items);
233
+ }
234
+ ).finally(() => {
235
+ dd.waitingItems = false;
236
+ dd.refreshState();
237
+ });
238
+ }
239
+ else {
240
+ afterGetItems();
241
+ }
242
+ }
243
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
244
+ close() {
245
+ const dd = this;
246
+
247
+ dd.items = [];
248
+ delete dd.activeItem;
249
+ delete dd.lastPageNumber;
250
+
251
+ super.close();
252
+ }
253
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
254
+ onItemClick(e, itemId) {
255
+ const dd = this;
256
+
257
+ if (itemId === 'append') {
258
+ dd.appendItems();
259
+ }
260
+ else {
261
+ if (dd.opt.onItemClick) {
262
+ dd.opt.onItemClick({ owner: dd.opt.owner, itemId: itemId, self: dd, clientX: e.clientX, clientY: e.clientY, target: e.target });
263
+ }
264
+
265
+ const clickedItem = dd.items.find(function (item) {
266
+ return item.id === itemId;
267
+ });
268
+
269
+ if (!clickedItem || !clickedItem.noClose) {
270
+ dd.close();
271
+ }
272
+ }
273
+ }
274
+ // -------------------------------------------------------------------------------------------------------------------------------------------------------------
275
+ setupEvents() {
276
+ const dd = this;
277
+
278
+ super.setupEvents();
279
+
280
+ function onKeyDown(e) {
281
+ const key = e && e.key ? e.key.toLowerCase() : '';
282
+
283
+ let ind;
284
+
285
+ switch (key) {
286
+ case 'enter':
287
+ if (!dd.activeItem) return;
288
+
289
+ dd.opt.onItemClick({ owner: dd.opt.owner, itemId: dd.activeItem.id, self: dd });
290
+ dd.close();
291
+ break;
292
+ case 'down':
293
+ case 'arrowdown':
294
+ if (dd.activeItem) {
295
+ ind = dd.items.indexOf(dd.activeItem);
296
+
297
+ if (ind < 0 || ind === dd.items.length - 1) return;
298
+
299
+ dd.activeItem = dd.items[ind + 1];
300
+ }
301
+ else if (dd.items.length > 0) {
302
+ dd.activeItem = dd.items[0];
303
+ }
304
+
305
+ dd.refreshState();
306
+ break;
307
+ case 'up':
308
+ case 'arrowup':
309
+ if (dd.activeItem) {
310
+ ind = dd.items.indexOf(dd.activeItem);
311
+
312
+ if (ind <= 0) return;
313
+
314
+ dd.activeItem = dd.items[ind - 1];
315
+ }
316
+ else if (dd.items.length > 0) {
317
+ dd.activeItem = dd.items[0];
318
+ }
319
+
320
+ dd.refreshState();
321
+ break;
322
+ case 'tab':
323
+ dd.close();
324
+ break;
325
+ default:
326
+ break;
327
+ }
328
+ }
329
+
330
+ document.addEventListener('keydown', onKeyDown);
331
+
332
+ const remClearEvents = dd.clearEvents;
333
+ dd.clearEvents = function () {
334
+ remClearEvents();
335
+ document.removeEventListener('keydown', onKeyDown);
336
+ }
337
+ }
338
+ }
339
+ // ==================================================================================================================================================================