@inseefr/lunatic 0.2.2-experimental → 0.2.3-prisme

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 (219) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +25 -23
  3. package/lib/index.js +1191 -475
  4. package/lib/index.js.map +1 -1
  5. package/package.json +174 -172
  6. package/src/components/breadcrumb/breadcrumb.scss +22 -22
  7. package/src/components/checkbox/boolean.js +172 -172
  8. package/src/components/checkbox/checkbox.scss +73 -73
  9. package/src/components/checkbox/group.js +231 -231
  10. package/src/components/checkbox/one.js +11 -11
  11. package/src/components/component-wrapper/controls/component.js +70 -0
  12. package/src/components/component-wrapper/controls/controls.scss +6 -0
  13. package/src/components/component-wrapper/controls/index.js +1 -0
  14. package/src/components/component-wrapper/controls/validators/datepicker.js +44 -0
  15. package/src/components/component-wrapper/controls/validators/index.js +16 -0
  16. package/src/components/component-wrapper/controls/validators/input-number.js +23 -0
  17. package/src/components/{missing-wrapper → component-wrapper}/index.js +0 -0
  18. package/src/components/component-wrapper/missing/component.js +200 -0
  19. package/src/components/component-wrapper/missing/index.js +1 -0
  20. package/src/components/{missing-wrapper → component-wrapper/missing}/missing.scss +32 -32
  21. package/src/components/component-wrapper/wrapper.js +23 -0
  22. package/src/components/components.js +1 -0
  23. package/src/components/datepicker/component.js +26 -11
  24. package/src/components/declarations/component.js +46 -46
  25. package/src/components/declarations/declarations.scss +40 -40
  26. package/src/components/declarations/wrappers/input-declarations-wrapper.js +328 -274
  27. package/src/components/declarations/wrappers/simple-declarations-wrapper.js +54 -54
  28. package/src/components/dropdown/commons/actions.js +65 -56
  29. package/src/components/dropdown/commons/children-to-option.js +9 -9
  30. package/src/components/dropdown/commons/cleaner-callbacks.js +58 -58
  31. package/src/components/dropdown/commons/components/dropdown-container.js +29 -29
  32. package/src/components/dropdown/commons/components/dropdown.js +204 -183
  33. package/src/components/dropdown/commons/event-callbacks/on-mousedown-callback.js +15 -15
  34. package/src/components/dropdown/commons/reducer.js +3 -0
  35. package/src/components/dropdown/commons/tools/index.js +17 -17
  36. package/src/components/dropdown/component.js +135 -135
  37. package/src/components/dropdown/dropdown-edit/dropdown-edit.js +194 -185
  38. package/src/components/dropdown/dropdown-edit/index.js +11 -11
  39. package/src/components/dropdown/dropdown-simple/dropdown.js +173 -164
  40. package/src/components/dropdown/dropdown-simple/index.js +20 -20
  41. package/src/components/dropdown/dropdown.scss +178 -178
  42. package/src/components/icon/icon.scss +15 -15
  43. package/src/components/index.js +2 -0
  44. package/src/components/index.scss +177 -175
  45. package/src/components/input/input-number.js +30 -54
  46. package/src/components/input/input.js +11 -11
  47. package/src/components/input/input.scss +31 -37
  48. package/src/components/loop/component.js +170 -169
  49. package/src/components/loop/loop.scss +13 -13
  50. package/src/components/loop/wrapper.js +1 -1
  51. package/src/components/loop-constructor/block/block.scss +10 -10
  52. package/src/components/loop-constructor/block/component.js +9 -9
  53. package/src/components/loop-constructor/roster/component.js +8 -8
  54. package/src/components/loop-constructor/wrapper/body-component.js +146 -125
  55. package/src/components/modal/component.js +36 -0
  56. package/src/components/modal/index.js +1 -0
  57. package/src/components/modal/modal.scss +33 -0
  58. package/src/components/progress-bar/progress-bar.scss +54 -54
  59. package/src/components/radio/component.js +9 -9
  60. package/src/components/radio/radio.scss +59 -59
  61. package/src/components/sequence/component.js +50 -50
  62. package/src/components/sequence/sequence.scss +10 -10
  63. package/src/components/subsequence/component.js +49 -49
  64. package/src/components/suggester/check-store.js +2 -4
  65. package/src/components/suggester/components/panel/default-option-renderer.js +27 -27
  66. package/src/components/suggester/components/panel/option-container.js +61 -61
  67. package/src/components/suggester/components/panel/panel.js +47 -47
  68. package/src/components/suggester/components/selection/default-label-renderer.js +31 -31
  69. package/src/components/suggester/components/selection/label.js +35 -35
  70. package/src/components/suggester/components/selection/selection.js +50 -50
  71. package/src/components/suggester/components/suggester-content.js +2 -2
  72. package/src/components/suggester/components/suggester.js +128 -88
  73. package/src/components/suggester/components/suggester.scss +101 -101
  74. package/src/components/suggester/default-style.scss +125 -125
  75. package/src/components/suggester/find-best-label/find-best-label.js +51 -49
  76. package/src/components/suggester/find-best-label/index.js +1 -1
  77. package/src/components/suggester/idb-suggester.js +73 -67
  78. package/src/components/suggester/lunatic-suggester.js +140 -137
  79. package/src/components/suggester/searching/create-searching.js +49 -47
  80. package/src/components/suggester/searching/index.js +1 -1
  81. package/src/components/suggester/state-management/actions.js +38 -38
  82. package/src/components/suggester/state-management/reducer/reduce-on-delete-search.js +11 -11
  83. package/src/components/suggester/state-management/reducer/reduce-on-init.js +29 -29
  84. package/src/components/suggester/state-management/reducer/reducer.js +38 -38
  85. package/src/components/suggester/suggester-wrapper.js +127 -121
  86. package/src/components/suggester-loader-widget/loader.js +67 -67
  87. package/src/components/suggester-loader-widget/widget.js +123 -123
  88. package/src/components/table/table.js +173 -171
  89. package/src/components/table/table.scss +26 -26
  90. package/src/components/textarea/component.js +11 -11
  91. package/src/components/textarea/textarea.scss +8 -8
  92. package/src/components/tooltip/tooltip.scss +30 -30
  93. package/src/stories/checkbox-boolean/data.json +78 -78
  94. package/src/stories/datepicker/data.json +3 -1
  95. package/src/stories/dropdown/README.md +44 -44
  96. package/src/stories/dropdown/data.json +98 -98
  97. package/src/stories/dropdown/dropdown.stories.js +89 -89
  98. package/src/stories/progress-bar/progress-bar.stories.js +24 -24
  99. package/src/stories/questionnaire/arithmetic-management.json +47 -0
  100. package/src/stories/questionnaire/arithmetic.json +247 -247
  101. package/src/stories/questionnaire/kish.json +275 -0
  102. package/src/stories/questionnaire/logement-queen.json +23390 -0
  103. package/src/stories/questionnaire/logement-s2.json +46028 -0
  104. package/src/stories/questionnaire/logement.json +20347 -26087
  105. package/src/stories/questionnaire/loop-and-controls.json +481 -0
  106. package/src/stories/questionnaire/questionnaire.stories.js +236 -138
  107. package/src/stories/questionnaire/update-external/data.json +1 -0
  108. package/src/stories/questionnaire/update-external/questionnaire.json +75 -0
  109. package/src/stories/suggester/README.md +46 -46
  110. package/src/stories/suggester/bailleurs-sociaux/fetch-bailleurs.js +15 -15
  111. package/src/stories/suggester/bailleurs-sociaux/index.js +2 -2
  112. package/src/stories/suggester/bailleurs-sociaux/option-bailleur-renderer.js +58 -58
  113. package/src/stories/suggester/bailleurs-sociaux/preloader.svg +51 -51
  114. package/src/stories/suggester/bailleurs-sociaux/theme.scss +22 -22
  115. package/src/stories/suggester/bailleurs-sociaux-2021/fetch-bailleurs.js +12 -0
  116. package/src/stories/suggester/bailleurs-sociaux-2021/index.js +1 -0
  117. package/src/stories/suggester/cog-communes/fetch-cog.js +15 -15
  118. package/src/stories/suggester/data-auto.json +232 -231
  119. package/src/stories/suggester/data-vtl.json +82 -82
  120. package/src/stories/suggester/data.json +169 -136
  121. package/src/stories/suggester/naf-rev2/index.js +2 -2
  122. package/src/stories/suggester/naf-rev2/option-naf-renderer.js +17 -17
  123. package/src/stories/suggester/suggester-workers.stories.js +226 -179
  124. package/src/stories/suggester/suggester.stories.js +138 -133
  125. package/src/stories/utils/orchestrator-split.js +119 -0
  126. package/src/stories/utils/orchestrator.js +119 -108
  127. package/src/tests/components/input-number.spec.js +6 -12
  128. package/src/tests/components/missing-wrapper.spec.js +0 -1
  129. package/src/tests/utils/lib/table/roster.spec.js +25 -25
  130. package/src/tests/utils/to-expose/handler/results/res-input-edited.json +1 -1
  131. package/src/utils/components/dragger/dragger.scss +7 -7
  132. package/src/utils/idb-tools/create-db-opener.js +43 -43
  133. package/src/utils/idb-tools/create-open-db.js +25 -25
  134. package/src/utils/idb-tools/idb-bulk-insert.js +96 -96
  135. package/src/utils/idb-tools/index.js +10 -10
  136. package/src/utils/idb-tools/insert-entity.js +15 -15
  137. package/src/utils/idb-tools/open-db.js +13 -13
  138. package/src/utils/idb-tools/open-or-create-db.js +34 -34
  139. package/src/utils/lib/controls/index.js +1 -0
  140. package/src/utils/lib/controls/utils.js +152 -0
  141. package/src/utils/lib/decorator/title-decorator.js +16 -16
  142. package/src/utils/lib/env.js +2 -2
  143. package/src/utils/lib/index.js +2 -0
  144. package/src/utils/lib/input-number.js +1 -1
  145. package/src/utils/lib/options-positioning.js +9 -9
  146. package/src/utils/lib/pagination/navigation/shared.js +12 -9
  147. package/src/utils/lib/prop-types/lines.js +6 -6
  148. package/src/utils/lib/responses.js +11 -9
  149. package/src/utils/lib/splitting.js +142 -0
  150. package/src/utils/lib/style.js +10 -10
  151. package/src/utils/store-tools/auto-load.js +74 -73
  152. package/src/utils/suggester-workers/append-to-index/append.js +25 -25
  153. package/src/utils/suggester-workers/append-to-index/append.worker.js +16 -16
  154. package/src/utils/suggester-workers/append-to-index/create-append-task.js +45 -43
  155. package/src/utils/suggester-workers/append-to-index/index.js +2 -2
  156. package/src/utils/suggester-workers/append-to-index/prepare-entities.js +61 -61
  157. package/src/utils/suggester-workers/append-to-index/store-messages.js +21 -21
  158. package/src/utils/suggester-workers/commons-tokenizer/create-entity-tokenizer.js +56 -0
  159. package/src/utils/suggester-workers/commons-tokenizer/create-fields-tokenizer.js +56 -0
  160. package/src/utils/suggester-workers/commons-tokenizer/create-filter-stop-words.js +17 -17
  161. package/src/utils/suggester-workers/commons-tokenizer/filters/compose-filters.js +10 -0
  162. package/src/utils/suggester-workers/commons-tokenizer/filters/create-filter-stop-words.js +17 -0
  163. package/src/utils/suggester-workers/commons-tokenizer/filters/create-filter-stop-words.spec.js +14 -0
  164. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-accents.js +12 -0
  165. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-accents.spec.js +12 -0
  166. package/src/utils/suggester-workers/commons-tokenizer/{filter-double.js → filters/filter-double.js} +12 -12
  167. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-double.spec.js +20 -0
  168. package/src/utils/suggester-workers/commons-tokenizer/{filter-length.js → filters/filter-length.js} +7 -7
  169. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-length.spec.js +18 -0
  170. package/src/utils/suggester-workers/commons-tokenizer/{filter-stemmer.js → filters/filter-stemmer.js} +13 -13
  171. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-stemmer.spec.js +12 -0
  172. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-synonyms.js +36 -0
  173. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-synonyms.spec.js +12 -0
  174. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-to-lower.js +10 -0
  175. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-to-lower.spec.js +12 -0
  176. package/src/utils/suggester-workers/commons-tokenizer/filters/index.js +2 -0
  177. package/src/utils/suggester-workers/commons-tokenizer/{stop-words.js → filters/stop-words.js} +118 -118
  178. package/src/utils/suggester-workers/commons-tokenizer/get-regexp-from-pattern.js +8 -8
  179. package/src/utils/suggester-workers/commons-tokenizer/get-stemmer.js +18 -18
  180. package/src/utils/suggester-workers/commons-tokenizer/index.js +9 -8
  181. package/src/utils/suggester-workers/commons-tokenizer/prepare-string-indexation.js +13 -9
  182. package/src/utils/suggester-workers/commons-tokenizer/soft-tokenizer.js +7 -7
  183. package/src/utils/suggester-workers/create-worker.js +56 -0
  184. package/src/utils/suggester-workers/find-best-label/find-best-label.js +39 -39
  185. package/src/utils/suggester-workers/find-best-label/find-best-label.worker.js +40 -40
  186. package/src/utils/suggester-workers/find-best-label/tokenize.js +30 -33
  187. package/src/utils/suggester-workers/find-best-label/tokenize.spec.js +19 -19
  188. package/src/utils/suggester-workers/searching/compute-score.js +33 -33
  189. package/src/utils/suggester-workers/searching/get-db.js +18 -18
  190. package/src/utils/suggester-workers/searching/index.js +1 -1
  191. package/src/utils/suggester-workers/searching/order/create-alphanumeric-orderer.js +20 -20
  192. package/src/utils/suggester-workers/searching/order/index.js +19 -19
  193. package/src/utils/suggester-workers/{query-parser → searching/query-parser}/index.js +2 -2
  194. package/src/utils/suggester-workers/searching/query-parser/query-parser-soft.js +7 -0
  195. package/src/utils/suggester-workers/{query-parser → searching/query-parser}/query-parser-soft.spec.js +24 -24
  196. package/src/utils/suggester-workers/searching/query-parser/query-parser-tokenized.js +34 -0
  197. package/src/utils/suggester-workers/searching/resolve-query-parser.js +27 -27
  198. package/src/utils/suggester-workers/searching/search-in-index.js +17 -17
  199. package/src/utils/suggester-workers/searching/searching.js +70 -70
  200. package/src/utils/suggester-workers/searching/searching.worker.js +11 -11
  201. package/src/utils/to-expose/calculated-variables.js +113 -113
  202. package/src/utils/to-expose/handler.js +149 -112
  203. package/src/utils/to-expose/hooks/filter-components.js +27 -12
  204. package/src/utils/to-expose/hooks/index.js +2 -1
  205. package/src/utils/to-expose/hooks/lunatic-split.js +428 -0
  206. package/src/utils/to-expose/hooks/lunatic.js +284 -187
  207. package/src/utils/to-expose/index.js +1 -1
  208. package/src/utils/to-expose/init-questionnaire.js +164 -164
  209. package/src/utils/to-expose/interpret/vtl.js +18 -18
  210. package/src/utils/to-expose/state.js +66 -58
  211. package/src/components/missing-wrapper/component.js +0 -120
  212. package/src/components/missing-wrapper/wrapper.js +0 -10
  213. package/src/tests/utils/to-expose/hooks/use-lunatic.spec.js +0 -46
  214. package/src/utils/suggester-workers/commons-tokenizer/create-tokenizer.js +0 -103
  215. package/src/utils/suggester-workers/commons-tokenizer/filter-accents-to-lower.js +0 -9
  216. package/src/utils/suggester-workers/commons-tokenizer/filter-synonyms.js +0 -10
  217. package/src/utils/suggester-workers/query-parser/query-parser-soft.js +0 -7
  218. package/src/utils/suggester-workers/query-parser/query-parser-tokenized.js +0 -31
  219. package/src/utils/suggester-workers/query-parser/query-parser-tokenized.spec.js +0 -32
@@ -1,50 +1,50 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { SimpleDeclarationsWrapper } from '../declarations/wrappers';
4
- import * as U from '../../utils/lib';
5
- import { interpret } from '../../utils/to-expose';
6
- import './sequence.scss';
7
-
8
- const Sequence = ({
9
- id,
10
- label,
11
- declarations,
12
- features,
13
- bindings,
14
- style,
15
- logFunction,
16
- }) => (
17
- <SimpleDeclarationsWrapper
18
- id={id}
19
- declarations={declarations}
20
- features={features}
21
- bindings={bindings}
22
- >
23
- <div
24
- aria-label={`sequence-${id}`}
25
- className="sequence-lunatic"
26
- style={U.buildStyleObject(style)}
27
- id={`sequence-${id}`}
28
- >
29
- {interpret(features, logFunction)(bindings)(label)}
30
- </div>
31
- </SimpleDeclarationsWrapper>
32
- );
33
-
34
- Sequence.defaultProps = {
35
- declarations: [],
36
- features: [],
37
- bindings: {},
38
- style: {},
39
- };
40
-
41
- Sequence.propTypes = {
42
- id: PropTypes.string.isRequired,
43
- label: PropTypes.string.isRequired,
44
- declarations: U.declarationsPropTypes,
45
- features: PropTypes.arrayOf(PropTypes.string),
46
- bindings: PropTypes.object,
47
- style: PropTypes.object,
48
- };
49
-
50
- export default React.memo(Sequence, U.areEqual);
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { SimpleDeclarationsWrapper } from '../declarations/wrappers';
4
+ import * as U from '../../utils/lib';
5
+ import { interpret } from '../../utils/to-expose';
6
+ import './sequence.scss';
7
+
8
+ const Sequence = ({
9
+ id,
10
+ label,
11
+ declarations,
12
+ features,
13
+ bindings,
14
+ style,
15
+ logFunction,
16
+ }) => (
17
+ <SimpleDeclarationsWrapper
18
+ id={id}
19
+ declarations={declarations}
20
+ features={features}
21
+ bindings={bindings}
22
+ >
23
+ <div
24
+ aria-label={`sequence-${id}`}
25
+ className="sequence-lunatic"
26
+ style={U.buildStyleObject(style)}
27
+ id={`sequence-${id}`}
28
+ >
29
+ {interpret(features, logFunction)(bindings)(label)}
30
+ </div>
31
+ </SimpleDeclarationsWrapper>
32
+ );
33
+
34
+ Sequence.defaultProps = {
35
+ declarations: [],
36
+ features: [],
37
+ bindings: {},
38
+ style: {},
39
+ };
40
+
41
+ Sequence.propTypes = {
42
+ id: PropTypes.string.isRequired,
43
+ label: PropTypes.string.isRequired,
44
+ declarations: U.declarationsPropTypes,
45
+ features: PropTypes.arrayOf(PropTypes.string),
46
+ bindings: PropTypes.object,
47
+ style: PropTypes.object,
48
+ };
49
+
50
+ export default React.memo(Sequence, U.areEqual);
@@ -1,10 +1,10 @@
1
- .lunatic-component {
2
- .sequence-lunatic {
3
- padding: 0;
4
- font-size: 0.875rem;
5
- color: var(--color-primary-light);
6
- background-color: var(--color-secondary-contrast-text);
7
- border: 0;
8
- height: 1.875rem;
9
- }
10
- }
1
+ .lunatic-component {
2
+ .sequence-lunatic {
3
+ padding: 0;
4
+ font-size: 0.875rem;
5
+ color: var(--color-primary-light);
6
+ background-color: var(--color-secondary-contrast-text);
7
+ border: 0;
8
+ height: 1.875rem;
9
+ }
10
+ }
@@ -1,49 +1,49 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { SimpleDeclarationsWrapper } from '../declarations/wrappers';
4
- import * as U from '../../utils/lib';
5
- import { interpret } from '../../utils/to-expose';
6
-
7
- const Subsequence = ({
8
- id,
9
- label,
10
- declarations,
11
- features,
12
- bindings,
13
- style,
14
- logFunction,
15
- }) => (
16
- <SimpleDeclarationsWrapper
17
- id={id}
18
- declarations={declarations}
19
- features={features}
20
- bindings={bindings}
21
- >
22
- <div
23
- aria-label={`subsequence-${id}`}
24
- className="subsequence-lunatic"
25
- style={U.buildStyleObject(style)}
26
- aria-label={`subsequence-${id}`}
27
- >
28
- {interpret(features, logFunction)(bindings)(label)}
29
- </div>
30
- </SimpleDeclarationsWrapper>
31
- );
32
-
33
- Subsequence.defaultProps = {
34
- declarations: [],
35
- features: [],
36
- bindings: {},
37
- style: {},
38
- };
39
-
40
- Subsequence.propTypes = {
41
- id: PropTypes.string.isRequired,
42
- label: PropTypes.string.isRequired,
43
- declarations: U.declarationsPropTypes,
44
- features: PropTypes.arrayOf(PropTypes.string),
45
- bindings: PropTypes.object,
46
- style: PropTypes.object,
47
- };
48
-
49
- export default React.memo(Subsequence, U.areEqual);
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { SimpleDeclarationsWrapper } from '../declarations/wrappers';
4
+ import * as U from '../../utils/lib';
5
+ import { interpret } from '../../utils/to-expose';
6
+
7
+ const Subsequence = ({
8
+ id,
9
+ label,
10
+ declarations,
11
+ features,
12
+ bindings,
13
+ style,
14
+ logFunction,
15
+ }) => (
16
+ <SimpleDeclarationsWrapper
17
+ id={id}
18
+ declarations={declarations}
19
+ features={features}
20
+ bindings={bindings}
21
+ >
22
+ <div
23
+ aria-label={`subsequence-${id}`}
24
+ className="subsequence-lunatic"
25
+ style={U.buildStyleObject(style)}
26
+ aria-label={`subsequence-${id}`}
27
+ >
28
+ {interpret(features, logFunction)(bindings)(label)}
29
+ </div>
30
+ </SimpleDeclarationsWrapper>
31
+ );
32
+
33
+ Subsequence.defaultProps = {
34
+ declarations: [],
35
+ features: [],
36
+ bindings: {},
37
+ style: {},
38
+ };
39
+
40
+ Subsequence.propTypes = {
41
+ id: PropTypes.string.isRequired,
42
+ label: PropTypes.string.isRequired,
43
+ declarations: U.declarationsPropTypes,
44
+ features: PropTypes.arrayOf(PropTypes.string),
45
+ bindings: PropTypes.object,
46
+ style: PropTypes.object,
47
+ };
48
+
49
+ export default React.memo(Subsequence, U.areEqual);
@@ -59,10 +59,8 @@ function CheckStore({ storeName, version, setStore, children }) {
59
59
  }
60
60
  return (
61
61
  <div className="lunatic-suggester-unvailable">
62
- Le store {storeName} n'est pas disponible.
63
- <button disabled={disabled} onClick={() => setRefresh(true)}>
64
- Refresh
65
- </button>
62
+ La suggestion sur liste n'est pas possible sur votre navigateur, vous
63
+ pouvez passer la question en appuyant sur Enregistrer et Continuer
66
64
  </div>
67
65
  );
68
66
  }
@@ -1,27 +1,27 @@
1
- import React from 'react';
2
- import classnames from 'classnames';
3
-
4
- function DefaultOptionRenderer({ option, selected }) {
5
- const { id, label } = option;
6
-
7
- if (label && label.length) {
8
- return (
9
- <div className={classnames('lunatic-suggester-option', { selected })}>
10
- <span className="id">{id}</span>
11
- {label && (
12
- <>
13
- <span> - </span>
14
- <span className="label">{label}</span>
15
- </>
16
- )}
17
- </div>
18
- );
19
- }
20
- return (
21
- <div className={classnames('lunatic-suggester-option', { selected })}>
22
- <span className="id">{id}</span>
23
- </div>
24
- );
25
- }
26
-
27
- export default DefaultOptionRenderer;
1
+ import React from 'react';
2
+ import classnames from 'classnames';
3
+
4
+ function DefaultOptionRenderer({ option, selected }) {
5
+ const { id, label } = option;
6
+
7
+ if (label && label.length) {
8
+ return (
9
+ <div className={classnames('lunatic-suggester-option', { selected })}>
10
+ <span className="id">{id}</span>
11
+ {label && (
12
+ <>
13
+ <span> - </span>
14
+ <span className="label">{label}</span>
15
+ </>
16
+ )}
17
+ </div>
18
+ );
19
+ }
20
+ return (
21
+ <div className={classnames('lunatic-suggester-option', { selected })}>
22
+ <span className="id">{id}</span>
23
+ </div>
24
+ );
25
+ }
26
+
27
+ export default DefaultOptionRenderer;
@@ -1,61 +1,61 @@
1
- import React, { useRef, useEffect } from 'react';
2
- import classnames from 'classnames';
3
- import { actions, SuggesterContext, useDispatch } from '../../state-management';
4
-
5
- function getMin(rect) {
6
- const { top } = rect;
7
- return top;
8
- }
9
-
10
- function getMax(rect) {
11
- const { top, height } = rect;
12
- return top + height;
13
- }
14
-
15
- function isVisible(optionRect, parentRect) {
16
- const min = Math.min(getMin(optionRect), getMin(parentRect));
17
- const max = Math.max(getMax(optionRect), getMax(parentRect));
18
- if (max - min < optionRect.height + parentRect.height) {
19
- return true;
20
- }
21
- return false;
22
- }
23
-
24
- function OptionContainer({ children, index, selected }) {
25
- const ref = useRef();
26
- const dispatch = useDispatch(SuggesterContext);
27
-
28
- function onClick(e) {
29
- e.stopPropagation();
30
- e.preventDefault();
31
- dispatch(actions.onClickOption(index));
32
- }
33
-
34
- useEffect(
35
- function () {
36
- const { current } = ref;
37
- if (current && selected) {
38
- const oRect = current.getBoundingClientRect();
39
- const pRect = current.parentNode.getBoundingClientRect();
40
- if (!isVisible(oRect, pRect)) {
41
- current.scrollIntoView();
42
- }
43
- }
44
- },
45
- [ref, selected]
46
- );
47
-
48
- return (
49
- <li
50
- className={classnames('lunatic-suggester-option', { selected })}
51
- role="option"
52
- aria-selected={selected}
53
- onClick={onClick}
54
- ref={ref}
55
- >
56
- {children}
57
- </li>
58
- );
59
- }
60
-
61
- export default OptionContainer;
1
+ import React, { useRef, useEffect } from 'react';
2
+ import classnames from 'classnames';
3
+ import { actions, SuggesterContext, useDispatch } from '../../state-management';
4
+
5
+ function getMin(rect) {
6
+ const { top } = rect;
7
+ return top;
8
+ }
9
+
10
+ function getMax(rect) {
11
+ const { top, height } = rect;
12
+ return top + height;
13
+ }
14
+
15
+ function isVisible(optionRect, parentRect) {
16
+ const min = Math.min(getMin(optionRect), getMin(parentRect));
17
+ const max = Math.max(getMax(optionRect), getMax(parentRect));
18
+ if (max - min < optionRect.height + parentRect.height) {
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+
24
+ function OptionContainer({ children, index, selected }) {
25
+ const ref = useRef();
26
+ const dispatch = useDispatch(SuggesterContext);
27
+
28
+ function onClick(e) {
29
+ e.stopPropagation();
30
+ e.preventDefault();
31
+ dispatch(actions.onClickOption(index));
32
+ }
33
+
34
+ useEffect(
35
+ function () {
36
+ const { current } = ref;
37
+ if (current && selected) {
38
+ const oRect = current.getBoundingClientRect();
39
+ const pRect = current.parentNode.getBoundingClientRect();
40
+ if (!isVisible(oRect, pRect)) {
41
+ current.scrollIntoView();
42
+ }
43
+ }
44
+ },
45
+ [ref, selected]
46
+ );
47
+
48
+ return (
49
+ <li
50
+ className={classnames('lunatic-suggester-option', { selected })}
51
+ role="option"
52
+ aria-selected={selected}
53
+ onMouseDown={onClick}
54
+ ref={ref}
55
+ >
56
+ {children}
57
+ </li>
58
+ );
59
+ }
60
+
61
+ export default OptionContainer;
@@ -1,47 +1,47 @@
1
- import React, { useContext } from 'react';
2
- import { SuggesterContext } from '../../state-management';
3
- import PanelContainer from './panel-container';
4
- import OptionContainer from './option-container';
5
-
6
- function getContent({
7
- options,
8
- OptionRender,
9
- selectedIndex,
10
- expended,
11
- value,
12
- search,
13
- }) {
14
- if (expended) {
15
- return options.map(function (option, index) {
16
- const { id } = option;
17
- const selected = selectedIndex === index;
18
- return (
19
- <OptionContainer key={id} index={index} selected={id === value}>
20
- <OptionRender option={option} selected={selected} search={search} />
21
- </OptionContainer>
22
- );
23
- });
24
- }
25
- return undefined;
26
- }
27
-
28
- function Panel({ optionRenderer: OptionRender, value }) {
29
- const [state] = useContext(SuggesterContext);
30
- const { options, focused, selectedIndex, expended, id, search } = state;
31
- const content = getContent({
32
- options,
33
- OptionRender,
34
- selectedIndex,
35
- expended,
36
- value,
37
- search,
38
- });
39
-
40
- return (
41
- <PanelContainer expended={expended} focused={focused} id={`${id}-list`}>
42
- {content}
43
- </PanelContainer>
44
- );
45
- }
46
-
47
- export default Panel;
1
+ import React, { useContext } from 'react';
2
+ import { SuggesterContext } from '../../state-management';
3
+ import PanelContainer from './panel-container';
4
+ import OptionContainer from './option-container';
5
+
6
+ function getContent({
7
+ options,
8
+ OptionRender,
9
+ selectedIndex,
10
+ expended,
11
+ value,
12
+ search,
13
+ }) {
14
+ if (expended) {
15
+ return options.map(function (option, index) {
16
+ const { id } = option;
17
+ const selected = selectedIndex === index;
18
+ return (
19
+ <OptionContainer key={id} index={index} selected={id === value}>
20
+ <OptionRender option={option} selected={selected} search={search} />
21
+ </OptionContainer>
22
+ );
23
+ });
24
+ }
25
+ return undefined;
26
+ }
27
+
28
+ function Panel({ optionRenderer: OptionRender, value }) {
29
+ const [state] = useContext(SuggesterContext);
30
+ const { options, focused, selectedIndex, expended, id, search } = state;
31
+ const content = getContent({
32
+ options,
33
+ OptionRender,
34
+ selectedIndex,
35
+ expended,
36
+ value,
37
+ search,
38
+ });
39
+
40
+ return (
41
+ <PanelContainer expended={expended} focused={focused} id={`${id}-list`}>
42
+ {content}
43
+ </PanelContainer>
44
+ );
45
+ }
46
+
47
+ export default Panel;
@@ -1,31 +1,31 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
-
4
- function getContent(option, search) {
5
- if (option) {
6
- const { id, label } = option;
7
- return label ? `${id} - ${label}` : id;
8
- }
9
- if (search && search.trim().length) {
10
- return search;
11
- }
12
- return undefined;
13
- }
14
-
15
- function DefaultLabelRenderer({ option, placeholderList, search }) {
16
- const content = getContent(option, search);
17
- if (content) {
18
- return <span className="selection">{content}</span>;
19
- }
20
- return <span className="placeholderList">{placeholderList}</span>;
21
- }
22
-
23
- DefaultLabelRenderer.propTypes = {
24
- option: PropTypes.shape({
25
- id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
26
- }),
27
- placeholderList: PropTypes.string,
28
- search: PropTypes.string,
29
- };
30
-
31
- export default DefaultLabelRenderer;
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ function getContent(option, search) {
5
+ if (option) {
6
+ const { id, label } = option;
7
+ return label ? `${id} - ${label}` : id;
8
+ }
9
+ if (search && search.trim().length) {
10
+ return search;
11
+ }
12
+ return undefined;
13
+ }
14
+
15
+ function DefaultLabelRenderer({ option, placeholderList, search }) {
16
+ const content = getContent(option, search);
17
+ if (content) {
18
+ return <span className="selection">{content}</span>;
19
+ }
20
+ return <span className="placeholderList">{placeholderList}</span>;
21
+ }
22
+
23
+ DefaultLabelRenderer.propTypes = {
24
+ option: PropTypes.shape({
25
+ id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
26
+ }),
27
+ placeholderList: PropTypes.string,
28
+ search: PropTypes.string,
29
+ };
30
+
31
+ export default DefaultLabelRenderer;
@@ -1,35 +1,35 @@
1
- import React, { useContext } from 'react';
2
- import classnames from 'classnames';
3
- import { SuggesterContext } from '../../state-management';
4
- import DefaultLabelRenderer from './default-label-renderer';
5
-
6
- function Label({
7
- labelRenderer: Renderer = DefaultLabelRenderer,
8
- placeholderList,
9
- }) {
10
- const [state] = useContext(SuggesterContext);
11
- const { displayLabel, expended, selectedIndex, options, search, disabled } =
12
- state;
13
- const displayed = displayLabel || !expended;
14
-
15
- const option =
16
- selectedIndex !== undefined ? options[selectedIndex] : undefined;
17
-
18
- return (
19
- <div
20
- className={classnames('lunatic-suggester-selected', {
21
- displayed,
22
- disabled,
23
- })}
24
- tabIndex="-1"
25
- >
26
- <Renderer
27
- option={option}
28
- placeholderList={placeholderList}
29
- search={search}
30
- />
31
- </div>
32
- );
33
- }
34
-
35
- export default Label;
1
+ import React, { useContext } from 'react';
2
+ import classnames from 'classnames';
3
+ import { SuggesterContext } from '../../state-management';
4
+ import DefaultLabelRenderer from './default-label-renderer';
5
+
6
+ function Label({
7
+ labelRenderer: Renderer = DefaultLabelRenderer,
8
+ placeholderList,
9
+ }) {
10
+ const [state] = useContext(SuggesterContext);
11
+ const { displayLabel, expended, selectedIndex, options, search, disabled } =
12
+ state;
13
+ const displayed = displayLabel || !expended;
14
+
15
+ const option =
16
+ selectedIndex !== undefined ? options[selectedIndex] : undefined;
17
+
18
+ return (
19
+ <div
20
+ className={classnames('lunatic-suggester-selected', {
21
+ displayed,
22
+ disabled,
23
+ })}
24
+ tabIndex="-1"
25
+ >
26
+ <Renderer
27
+ option={option}
28
+ placeholderList={placeholderList}
29
+ search={search}
30
+ />
31
+ </div>
32
+ );
33
+ }
34
+
35
+ export default Label;