goblin-desktop 4.2.0 → 4.2.2

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 (144) hide show
  1. package/.editorconfig +9 -9
  2. package/.zou-flow +2 -2
  3. package/LICENSE +21 -21
  4. package/README.md +108 -108
  5. package/builders/builders.js +3 -3
  6. package/builders/wizard.js +462 -462
  7. package/contexts.js +13 -13
  8. package/desktop-manager.js +10 -10
  9. package/desktop-window.js +13 -13
  10. package/desktop.js +13 -13
  11. package/eslint.config.js +65 -65
  12. package/lib/service.js +137 -137
  13. package/package.json +48 -48
  14. package/password-wizard.js +24 -24
  15. package/quest-run-wizard.js +24 -24
  16. package/taskbar.js +13 -13
  17. package/widgets/audio/sfx.js +177 -177
  18. package/widgets/board/view.js +37 -37
  19. package/widgets/board/widget.js +65 -65
  20. package/widgets/contexts/logic-handlers.js +36 -36
  21. package/widgets/contexts/service.js +40 -40
  22. package/widgets/contexts/view.js +21 -21
  23. package/widgets/contexts/widget.js +147 -147
  24. package/widgets/datagrid/datagrid-entity.js +82 -82
  25. package/widgets/datagrid/datagrid-headers.js +274 -274
  26. package/widgets/datagrid/styles.js +13 -13
  27. package/widgets/datagrid/widget.js +192 -192
  28. package/widgets/datagrid-cell/styles.js +52 -52
  29. package/widgets/datagrid-cell/widget.js +41 -41
  30. package/widgets/datagrid-item/styles.js +15 -15
  31. package/widgets/datagrid-item/widget.js +74 -74
  32. package/widgets/default/view.js +160 -160
  33. package/widgets/desktop/compensator.js +9 -9
  34. package/widgets/desktop/logic-handlers.js +243 -243
  35. package/widgets/desktop/reducer.js +35 -35
  36. package/widgets/desktop/service.js +858 -858
  37. package/widgets/desktop/styles.js +28 -28
  38. package/widgets/desktop/widget.js +191 -191
  39. package/widgets/desktop-clock/styles.js +69 -69
  40. package/widgets/desktop-clock/widget.js +387 -387
  41. package/widgets/desktop-clock-clock/styles.js +56 -56
  42. package/widgets/desktop-clock-clock/widget.js +96 -96
  43. package/widgets/desktop-clock-menu/styles.js +129 -129
  44. package/widgets/desktop-clock-menu/widget.js +63 -63
  45. package/widgets/desktop-connection-status/reducer.js +15 -15
  46. package/widgets/desktop-connection-status/styles.js +44 -44
  47. package/widgets/desktop-connection-status/widget.js +134 -134
  48. package/widgets/desktop-content/widget.js +68 -68
  49. package/widgets/desktop-footer/reducer.js +31 -31
  50. package/widgets/desktop-footer/styles.js +36 -36
  51. package/widgets/desktop-footer/widget.js +52 -52
  52. package/widgets/desktop-monitors/styles.js +155 -155
  53. package/widgets/desktop-monitors/widget.js +272 -272
  54. package/widgets/desktop-notebook/styles.js +155 -155
  55. package/widgets/desktop-notebook/widget.js +252 -252
  56. package/widgets/desktop-notifications/styles.js +147 -147
  57. package/widgets/desktop-notifications/widget.js +231 -231
  58. package/widgets/desktop-scale/reducer.js +15 -15
  59. package/widgets/desktop-scale/styles.js +49 -49
  60. package/widgets/desktop-scale/widget.js +173 -172
  61. package/widgets/desktop-state-monitor/styles.js +72 -72
  62. package/widgets/desktop-state-monitor/widget.js +123 -123
  63. package/widgets/desktop-taskbar/widget.js +57 -57
  64. package/widgets/desktop-themes-menu/widget.js +121 -121
  65. package/widgets/desktop-topbar/widget.js +201 -201
  66. package/widgets/desktop-window/service.js +56 -56
  67. package/widgets/desktop-window/styles.js +22 -22
  68. package/widgets/desktop-window/widget.js +70 -70
  69. package/widgets/detail/compensator.js +17 -17
  70. package/widgets/detail/view.js +40 -40
  71. package/widgets/detail/widget.js +119 -119
  72. package/widgets/editor/widget.js +82 -82
  73. package/widgets/entity-alerts/styles.js +77 -77
  74. package/widgets/entity-alerts/widget.js +328 -328
  75. package/widgets/entity-list/styles.js +66 -66
  76. package/widgets/entity-list/view.js +36 -36
  77. package/widgets/entity-list/widget.js +209 -209
  78. package/widgets/entity-list-item/widget.js +68 -68
  79. package/widgets/entity-row/styles.js +105 -105
  80. package/widgets/entity-row/widget.js +524 -524
  81. package/widgets/entity-row-button/styles.js +46 -46
  82. package/widgets/entity-row-button/widget.js +57 -57
  83. package/widgets/entity-view/reducer.js +20 -20
  84. package/widgets/entity-view/styles.js +90 -90
  85. package/widgets/entity-view/widget.js +601 -601
  86. package/widgets/facet-checkbox/styles.js +17 -17
  87. package/widgets/facet-checkbox/widget.js +43 -43
  88. package/widgets/facet-filter/widget.js +94 -94
  89. package/widgets/facet-filter-add/styles.js +30 -30
  90. package/widgets/facet-filter-add/widget.js +105 -105
  91. package/widgets/facet-filter-button/styles.js +74 -74
  92. package/widgets/facet-filter-button/widget.js +214 -214
  93. package/widgets/facet-filter-list-dialog/styles.js +59 -59
  94. package/widgets/facet-filter-list-dialog/widget.js +273 -273
  95. package/widgets/facet-filter-list-dialog-footer/styles.js +22 -22
  96. package/widgets/facet-filter-list-dialog-footer/widget.js +105 -105
  97. package/widgets/facet-filter-range-dialog/styles.js +82 -82
  98. package/widgets/facet-filter-range-dialog/widget.js +399 -399
  99. package/widgets/facet-filter-range-dialog-footer/styles.js +22 -22
  100. package/widgets/facet-filter-range-dialog-footer/widget.js +182 -182
  101. package/widgets/gamepad/widget.js +75 -75
  102. package/widgets/helpers/facet-helpers.js +105 -105
  103. package/widgets/hinter/reducer.js +35 -35
  104. package/widgets/hinter/styles.js +79 -79
  105. package/widgets/hinter/view.js +32 -32
  106. package/widgets/hinter/widget.js +289 -291
  107. package/widgets/junction/styles.js +22 -22
  108. package/widgets/junction/widget.js +50 -50
  109. package/widgets/main-tab-menu/styles.js +17 -17
  110. package/widgets/main-tab-menu/widget.js +130 -130
  111. package/widgets/map/view.js +49 -49
  112. package/widgets/map/widget.js +64 -64
  113. package/widgets/monitor/reducer.js +15 -15
  114. package/widgets/monitor/widget.js +60 -60
  115. package/widgets/navigating-layer/widget.js +25 -25
  116. package/widgets/notifications-button/widget.js +44 -44
  117. package/widgets/password-wizard/service.js +53 -53
  118. package/widgets/password-wizard/ui.js +66 -66
  119. package/widgets/plugin/reducer.js +19 -19
  120. package/widgets/plugin/styles.js +294 -294
  121. package/widgets/plugin/widget.js +622 -622
  122. package/widgets/quest-run-wizard/service.js +49 -49
  123. package/widgets/quest-run-wizard/ui.js +25 -25
  124. package/widgets/search/styles.js +80 -80
  125. package/widgets/search/widget.js +283 -285
  126. package/widgets/simple/view.js +28 -28
  127. package/widgets/status-filters/widget.js +121 -121
  128. package/widgets/tab/styles.js +16 -16
  129. package/widgets/tab/widget.js +89 -89
  130. package/widgets/tab-content/widget.js +35 -35
  131. package/widgets/tabs/widget.js +48 -48
  132. package/widgets/taskbar/service.js +99 -99
  133. package/widgets/taskbar/view.js +27 -27
  134. package/widgets/taskbar/widget.js +167 -167
  135. package/widgets/widget-doc-caller/reducer.js +15 -15
  136. package/widgets/widget-doc-caller/styles.js +20 -20
  137. package/widgets/widget-doc-caller/widget.js +55 -55
  138. package/widgets/wizard/widget.js +298 -298
  139. package/widgets/wizard-buttons/widget.js +111 -111
  140. package/widgets/workitem/styles.js +286 -286
  141. package/widgets/workitem/view.js +62 -62
  142. package/widgets/workitem/widget.js +988 -988
  143. package/widgets/workitem-dialog/widget.js +86 -86
  144. package/widgets/workitem-fields/widget.js +64 -64
@@ -1,59 +1,59 @@
1
- /******************************************************************************/
2
-
3
- export default function styles(theme) {
4
- const facetFilterDialog = {
5
- position: 'absolute',
6
- top: '0px',
7
- bottom: '0px',
8
- left: '0px',
9
- right: '0px',
10
- display: 'flex',
11
- flexDirection: 'column',
12
- };
13
-
14
- const header = {
15
- height: '50px',
16
- minHeight: '50px',
17
- padding: '0px 10px 0px 30px',
18
- display: 'flex',
19
- flexDirection: 'row',
20
- alignItems: 'center',
21
- borderRadius: '0px 0px 3px 3px',
22
- backgroundColor: theme.palette.paneNavigatorBackground,
23
- };
24
-
25
- const buttons = {
26
- padding: '20px 30px 0px 30px',
27
- flexGrow: 1,
28
- display: 'flex',
29
- flexDirection: 'column',
30
- overflow: 'hidden',
31
- };
32
-
33
- const scrollable = {
34
- flexGrow: 1,
35
- overflowY: 'auto',
36
- };
37
-
38
- const letter = {
39
- margin: '20px 0px 5px 0px',
40
- borderBottom: `1px solid ${theme.palette.textColor}`,
41
- };
42
-
43
- const closeButton = {
44
- position: 'absolute',
45
- top: '10px',
46
- right: '10px',
47
- };
48
-
49
- return {
50
- facetFilterDialog,
51
- header,
52
- buttons,
53
- scrollable,
54
- letter,
55
- closeButton,
56
- };
57
- }
58
-
59
- /******************************************************************************/
1
+ /******************************************************************************/
2
+
3
+ export default function styles(theme) {
4
+ const facetFilterDialog = {
5
+ position: 'absolute',
6
+ top: '0px',
7
+ bottom: '0px',
8
+ left: '0px',
9
+ right: '0px',
10
+ display: 'flex',
11
+ flexDirection: 'column',
12
+ };
13
+
14
+ const header = {
15
+ height: '50px',
16
+ minHeight: '50px',
17
+ padding: '0px 10px 0px 30px',
18
+ display: 'flex',
19
+ flexDirection: 'row',
20
+ alignItems: 'center',
21
+ borderRadius: '0px 0px 3px 3px',
22
+ backgroundColor: theme.palette.paneNavigatorBackground,
23
+ };
24
+
25
+ const buttons = {
26
+ padding: '20px 30px 0px 30px',
27
+ flexGrow: 1,
28
+ display: 'flex',
29
+ flexDirection: 'column',
30
+ overflow: 'hidden',
31
+ };
32
+
33
+ const scrollable = {
34
+ flexGrow: 1,
35
+ overflowY: 'auto',
36
+ };
37
+
38
+ const letter = {
39
+ margin: '20px 0px 5px 0px',
40
+ borderBottom: `1px solid ${theme.palette.textColor}`,
41
+ };
42
+
43
+ const closeButton = {
44
+ position: 'absolute',
45
+ top: '10px',
46
+ right: '10px',
47
+ };
48
+
49
+ return {
50
+ facetFilterDialog,
51
+ header,
52
+ buttons,
53
+ scrollable,
54
+ letter,
55
+ closeButton,
56
+ };
57
+ }
58
+
59
+ /******************************************************************************/
@@ -1,273 +1,273 @@
1
- import React from 'react';
2
- import Shredder from 'xcraft-core-shredder';
3
- import Widget from 'goblin-laboratory/widgets/widget';
4
- import DialogModal from 'goblin-gadgets/widgets/dialog-modal/widget';
5
- import Label from 'goblin-gadgets/widgets/label/widget';
6
- import Button from 'goblin-gadgets/widgets/button/widget';
7
- import TextFieldNC from 'goblin-gadgets/widgets/text-field-nc/widget';
8
- import FacetCheckbox from '../facet-checkbox/widget.js';
9
- import FacetFilterListDialogFooter from '../facet-filter-list-dialog-footer/widget.js';
10
- import FacetHelpers from '../helpers/facet-helpers';
11
- import {Unit} from 'goblin-theme';
12
- import T from 't';
13
- const px = Unit.toPx;
14
-
15
- function getTextOrNabuId(text) {
16
- if (Shredder.isImmutable(text)) {
17
- const nabuId = text.get('nabuId');
18
- if (nabuId) {
19
- return nabuId;
20
- }
21
- } else if (typeof text === 'object') {
22
- const nabuId = text.nabuId;
23
- if (nabuId) {
24
- return nabuId;
25
- }
26
- }
27
- return text;
28
- }
29
-
30
- class FacetFilterListDialog extends Widget {
31
- constructor() {
32
- super(...arguments);
33
-
34
- this.state = {
35
- filter: null,
36
- };
37
-
38
- this.changeFacet = this.changeFacet.bind(this);
39
- this.filterChange = this.filterChange.bind(this);
40
- this.onClose = this.onClose.bind(this);
41
- }
42
-
43
- //#region get/set
44
- get filter() {
45
- return this.state.filter;
46
- }
47
- set filter(value) {
48
- this.setState({
49
- filter: value,
50
- });
51
- }
52
- //#endregion
53
-
54
- getFilteredKeys(filter) {
55
- const keys = this.getState()
56
- .backend.get(this.props.id)
57
- .get('checkboxes')
58
- .get(this.props.name)
59
- .keySeq();
60
- const type = FacetHelpers.getType(keys);
61
- filter = FacetHelpers.preprocessFilter(filter);
62
-
63
- return keys.reduce((acc, key) => {
64
- let text = FacetHelpers.format(key, type, this.props.propInfos);
65
- //TODO: search should be done on translation of status, not nabuId
66
- text = getTextOrNabuId(text);
67
- if (FacetHelpers.match(text, filter)) {
68
- acc = acc.push(key);
69
- }
70
- return acc;
71
- }, Shredder.fromJS([]));
72
- }
73
-
74
- onClose() {
75
- this.props.onClose();
76
- }
77
-
78
- changeFacet(facet) {
79
- return () => {
80
- this.doAs('list', 'toggle-facet-filter', {
81
- filterName: this.props.name,
82
- facet: facet,
83
- });
84
- };
85
- }
86
-
87
- initAllFacets(keys) {
88
- this.doAs('list', 'init-all-facets', {
89
- filterName: this.props.name,
90
- keys,
91
- });
92
- }
93
-
94
- filterChange(text) {
95
- this.filter = text;
96
-
97
- const keys = this.getFilteredKeys(text);
98
- this.initAllFacets(keys);
99
- }
100
-
101
- /******************************************************************************/
102
-
103
- renderClose() {
104
- return (
105
- <div className={this.styles.classNames.closeButton}>
106
- <Button
107
- border="none"
108
- glyph="solid/times"
109
- glyphSize="120%"
110
- tooltip={T('Fermer')}
111
- height="32px"
112
- width="32px"
113
- onClick={this.onClose}
114
- />
115
- </div>
116
- );
117
- }
118
-
119
- renderHeader(keys) {
120
- if (this.props.numberOfCheckboxes <= 5) {
121
- return <div className={this.styles.classNames.header}></div>;
122
- } else {
123
- return (
124
- <div className={this.styles.classNames.header}>
125
- <Label text={T('Filtre')} />
126
- <TextFieldNC
127
- width="300px"
128
- shape={this.filter ? 'left-rounded' : 'rounded'}
129
- value={this.filter}
130
- changeMode="throttled"
131
- throttleDelay={200}
132
- onChange={this.filterChange}
133
- />
134
- <Button
135
- kind="combo"
136
- shape="right-rounded"
137
- leftSpacing="overlap"
138
- glyph="solid/eraser"
139
- tooltip={T('Tout montrer')}
140
- show={!!this.filter}
141
- onClick={() => this.filterChange(null)}
142
- />
143
- </div>
144
- );
145
- }
146
- }
147
-
148
- renderFooter(keys) {
149
- return (
150
- <FacetFilterListDialogFooter
151
- id={this.props.id}
152
- name={this.props.name}
153
- keys={keys}
154
- />
155
- );
156
- }
157
-
158
- renderButtons(keys) {
159
- const result = [];
160
- const type = FacetHelpers.getType(keys);
161
-
162
- if (this.props.numberOfCheckboxes < 20) {
163
- for (const key of keys) {
164
- result.push(
165
- <FacetCheckbox
166
- id={this.props.id}
167
- key={`${key}-val`}
168
- name={this.props.name}
169
- text={FacetHelpers.format(key, type, this.props.propInfos)}
170
- value={key}
171
- onChange={this.changeFacet(key)}
172
- />
173
- );
174
- }
175
- } else {
176
- let lastTab = null;
177
- for (const key of keys) {
178
- const tab = FacetHelpers.extractTab(key, type);
179
- if (lastTab !== tab.internal) {
180
- lastTab = tab.internal;
181
- result.push(
182
- <div
183
- key={`${key}-${tab.internal}`}
184
- className={this.styles.classNames.letter}
185
- >
186
- <Label
187
- fontSize="300%"
188
- textColor={this.context.theme.palette.mainTabBackground}
189
- text={tab.displayed}
190
- />
191
- </div>
192
- );
193
- }
194
- result.push(
195
- <FacetCheckbox
196
- id={this.props.id}
197
- key={`${key}-val`}
198
- name={this.props.name}
199
- text={FacetHelpers.format(key, type, this.props.propInfos)}
200
- value={key}
201
- onChange={this.changeFacet(key)}
202
- />
203
- );
204
- }
205
- }
206
- return result;
207
- }
208
-
209
- renderList() {
210
- const keys = this.getFilteredKeys(this.filter);
211
- return (
212
- <div className={this.styles.classNames.facetFilterDialog}>
213
- {this.renderHeader(keys)}
214
- <div className={this.styles.classNames.buttons}>
215
- <div className={this.styles.classNames.scrollable}>
216
- {this.renderButtons(keys)}
217
- </div>
218
- </div>
219
- {this.renderFooter(keys)}
220
- {this.renderClose()}
221
- </div>
222
- );
223
- }
224
-
225
- render() {
226
- if (this.props.loading) {
227
- return null;
228
- }
229
- const windowHeight = window.innerHeight;
230
- const r = this.props.parentButtonRect;
231
- let centerY = r.top + r.height / 2;
232
- let shiftY = 0;
233
- const width = 520;
234
- const count = this.props.numberOfCheckboxes;
235
- const height = Math.min(Math.max(count * 20 + 100, 200), windowHeight - 20);
236
-
237
- if (centerY - height / 2 < 10) {
238
- const offset = height / 2 - centerY + 10;
239
- centerY += offset;
240
- shiftY = -offset;
241
- }
242
- if (centerY + height / 2 > windowHeight - 10) {
243
- const offset = centerY + height / 2 - (windowHeight - 10);
244
- centerY -= offset;
245
- shiftY = offset;
246
- }
247
-
248
- return (
249
- <DialogModal
250
- width={px(width)}
251
- height={px(height)}
252
- left={px(r.right + 40)}
253
- center={px(centerY)}
254
- triangleShift={px(shiftY)}
255
- backgroundClose={true}
256
- close={this.onClose}
257
- >
258
- {this.renderList()}
259
- </DialogModal>
260
- );
261
- }
262
- }
263
-
264
- /******************************************************************************/
265
-
266
- export default Widget.connect((state, props) => {
267
- const flags = state.get(`backend.${props.id}.checkboxes.${props.name}`);
268
- if (flags) {
269
- return {numberOfCheckboxes: flags.size};
270
- } else {
271
- return {loading: true};
272
- }
273
- })(FacetFilterListDialog);
1
+ import React from 'react';
2
+ import Shredder from 'xcraft-core-shredder';
3
+ import Widget from 'goblin-laboratory/widgets/widget';
4
+ import DialogModal from 'goblin-gadgets/widgets/dialog-modal/widget';
5
+ import Label from 'goblin-gadgets/widgets/label/widget';
6
+ import Button from 'goblin-gadgets/widgets/button/widget';
7
+ import TextFieldNC from 'goblin-gadgets/widgets/text-field-nc/widget';
8
+ import FacetCheckbox from '../facet-checkbox/widget.js';
9
+ import FacetFilterListDialogFooter from '../facet-filter-list-dialog-footer/widget.js';
10
+ import FacetHelpers from '../helpers/facet-helpers';
11
+ import {Unit} from 'goblin-theme';
12
+ import T from 't';
13
+ const px = Unit.toPx;
14
+
15
+ function getTextOrNabuId(text) {
16
+ if (Shredder.isImmutable(text)) {
17
+ const nabuId = text.get('nabuId');
18
+ if (nabuId) {
19
+ return nabuId;
20
+ }
21
+ } else if (typeof text === 'object') {
22
+ const nabuId = text.nabuId;
23
+ if (nabuId) {
24
+ return nabuId;
25
+ }
26
+ }
27
+ return text;
28
+ }
29
+
30
+ class FacetFilterListDialog extends Widget {
31
+ constructor() {
32
+ super(...arguments);
33
+
34
+ this.state = {
35
+ filter: null,
36
+ };
37
+
38
+ this.changeFacet = this.changeFacet.bind(this);
39
+ this.filterChange = this.filterChange.bind(this);
40
+ this.onClose = this.onClose.bind(this);
41
+ }
42
+
43
+ //#region get/set
44
+ get filter() {
45
+ return this.state.filter;
46
+ }
47
+ set filter(value) {
48
+ this.setState({
49
+ filter: value,
50
+ });
51
+ }
52
+ //#endregion
53
+
54
+ getFilteredKeys(filter) {
55
+ const keys = this.getState()
56
+ .backend.get(this.props.id)
57
+ .get('checkboxes')
58
+ .get(this.props.name)
59
+ .keySeq();
60
+ const type = FacetHelpers.getType(keys);
61
+ filter = FacetHelpers.preprocessFilter(filter);
62
+
63
+ return keys.reduce((acc, key) => {
64
+ let text = FacetHelpers.format(key, type, this.props.propInfos);
65
+ //TODO: search should be done on translation of status, not nabuId
66
+ text = getTextOrNabuId(text);
67
+ if (FacetHelpers.match(text, filter)) {
68
+ acc = acc.push(key);
69
+ }
70
+ return acc;
71
+ }, Shredder.fromJS([]));
72
+ }
73
+
74
+ onClose() {
75
+ this.props.onClose();
76
+ }
77
+
78
+ changeFacet(facet) {
79
+ return () => {
80
+ this.doAs('list', 'toggle-facet-filter', {
81
+ filterName: this.props.name,
82
+ facet: facet,
83
+ });
84
+ };
85
+ }
86
+
87
+ initAllFacets(keys) {
88
+ this.doAs('list', 'init-all-facets', {
89
+ filterName: this.props.name,
90
+ keys,
91
+ });
92
+ }
93
+
94
+ filterChange(text) {
95
+ this.filter = text;
96
+
97
+ const keys = this.getFilteredKeys(text);
98
+ this.initAllFacets(keys);
99
+ }
100
+
101
+ /******************************************************************************/
102
+
103
+ renderClose() {
104
+ return (
105
+ <div className={this.styles.classNames.closeButton}>
106
+ <Button
107
+ border="none"
108
+ glyph="solid/times"
109
+ glyphSize="120%"
110
+ tooltip={T('Fermer')}
111
+ height="32px"
112
+ width="32px"
113
+ onClick={this.onClose}
114
+ />
115
+ </div>
116
+ );
117
+ }
118
+
119
+ renderHeader(keys) {
120
+ if (this.props.numberOfCheckboxes <= 5) {
121
+ return <div className={this.styles.classNames.header}></div>;
122
+ } else {
123
+ return (
124
+ <div className={this.styles.classNames.header}>
125
+ <Label text={T('Filtre')} />
126
+ <TextFieldNC
127
+ width="300px"
128
+ shape={this.filter ? 'left-rounded' : 'rounded'}
129
+ value={this.filter}
130
+ changeMode="throttled"
131
+ throttleDelay={200}
132
+ onChange={this.filterChange}
133
+ />
134
+ <Button
135
+ kind="combo"
136
+ shape="right-rounded"
137
+ leftSpacing="overlap"
138
+ glyph="solid/eraser"
139
+ tooltip={T('Tout montrer')}
140
+ show={!!this.filter}
141
+ onClick={() => this.filterChange(null)}
142
+ />
143
+ </div>
144
+ );
145
+ }
146
+ }
147
+
148
+ renderFooter(keys) {
149
+ return (
150
+ <FacetFilterListDialogFooter
151
+ id={this.props.id}
152
+ name={this.props.name}
153
+ keys={keys}
154
+ />
155
+ );
156
+ }
157
+
158
+ renderButtons(keys) {
159
+ const result = [];
160
+ const type = FacetHelpers.getType(keys);
161
+
162
+ if (this.props.numberOfCheckboxes < 20) {
163
+ for (const key of keys) {
164
+ result.push(
165
+ <FacetCheckbox
166
+ id={this.props.id}
167
+ key={`${key}-val`}
168
+ name={this.props.name}
169
+ text={FacetHelpers.format(key, type, this.props.propInfos)}
170
+ value={key}
171
+ onChange={this.changeFacet(key)}
172
+ />
173
+ );
174
+ }
175
+ } else {
176
+ let lastTab = null;
177
+ for (const key of keys) {
178
+ const tab = FacetHelpers.extractTab(key, type);
179
+ if (lastTab !== tab.internal) {
180
+ lastTab = tab.internal;
181
+ result.push(
182
+ <div
183
+ key={`${key}-${tab.internal}`}
184
+ className={this.styles.classNames.letter}
185
+ >
186
+ <Label
187
+ fontSize="300%"
188
+ textColor={this.context.theme.palette.mainTabBackground}
189
+ text={tab.displayed}
190
+ />
191
+ </div>
192
+ );
193
+ }
194
+ result.push(
195
+ <FacetCheckbox
196
+ id={this.props.id}
197
+ key={`${key}-val`}
198
+ name={this.props.name}
199
+ text={FacetHelpers.format(key, type, this.props.propInfos)}
200
+ value={key}
201
+ onChange={this.changeFacet(key)}
202
+ />
203
+ );
204
+ }
205
+ }
206
+ return result;
207
+ }
208
+
209
+ renderList() {
210
+ const keys = this.getFilteredKeys(this.filter);
211
+ return (
212
+ <div className={this.styles.classNames.facetFilterDialog}>
213
+ {this.renderHeader(keys)}
214
+ <div className={this.styles.classNames.buttons}>
215
+ <div className={this.styles.classNames.scrollable}>
216
+ {this.renderButtons(keys)}
217
+ </div>
218
+ </div>
219
+ {this.renderFooter(keys)}
220
+ {this.renderClose()}
221
+ </div>
222
+ );
223
+ }
224
+
225
+ render() {
226
+ if (this.props.loading) {
227
+ return null;
228
+ }
229
+ const windowHeight = window.innerHeight;
230
+ const r = this.props.parentButtonRect;
231
+ let centerY = r.top + r.height / 2;
232
+ let shiftY = 0;
233
+ const width = 520;
234
+ const count = this.props.numberOfCheckboxes;
235
+ const height = Math.min(Math.max(count * 20 + 100, 200), windowHeight - 20);
236
+
237
+ if (centerY - height / 2 < 10) {
238
+ const offset = height / 2 - centerY + 10;
239
+ centerY += offset;
240
+ shiftY = -offset;
241
+ }
242
+ if (centerY + height / 2 > windowHeight - 10) {
243
+ const offset = centerY + height / 2 - (windowHeight - 10);
244
+ centerY -= offset;
245
+ shiftY = offset;
246
+ }
247
+
248
+ return (
249
+ <DialogModal
250
+ width={px(width)}
251
+ height={px(height)}
252
+ left={px(r.right + 40)}
253
+ center={px(centerY)}
254
+ triangleShift={px(shiftY)}
255
+ backgroundClose={true}
256
+ close={this.onClose}
257
+ >
258
+ {this.renderList()}
259
+ </DialogModal>
260
+ );
261
+ }
262
+ }
263
+
264
+ /******************************************************************************/
265
+
266
+ export default Widget.connect((state, props) => {
267
+ const flags = state.get(`backend.${props.id}.checkboxes.${props.name}`);
268
+ if (flags) {
269
+ return {numberOfCheckboxes: flags.size};
270
+ } else {
271
+ return {loading: true};
272
+ }
273
+ })(FacetFilterListDialog);