@luomus/laji-form 15.1.29 → 15.1.31

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.
package/dist/styles.css CHANGED
@@ -3150,6 +3150,9 @@ body .laji-form {
3150
3150
  margin-top: 5px;
3151
3151
  }
3152
3152
 
3153
+ .laji-form .autosuggest-input-addon {
3154
+ margin-bottom: 0px;
3155
+ }
3153
3156
  .laji-form .autosuggest-input-addon.active {
3154
3157
  color: #2980b9 !important;
3155
3158
  }
@@ -3848,9 +3851,12 @@ body .laji-form {
3848
3851
  font-size: 20px;
3849
3852
  }
3850
3853
  .laji-form-dropdown-caret {
3851
- bottom: 2px;
3852
3854
  position: absolute;
3853
3855
  right: 3px;
3856
+ bottom: 0px;
3857
+ }
3858
+ .laji-form-dropdown-caret img {
3859
+ width: 20px;
3854
3860
  }
3855
3861
 
3856
3862
  .laji-form-multiselect-input-wrapper-focus {
@@ -3859,4 +3865,8 @@ body .laji-form {
3859
3865
  .laji-form-multiselect-input-wrapper-readonly {
3860
3866
  background-color: #eee;
3861
3867
  }
3868
+ .laji-form-checkbox-buttons .btn {
3869
+ height: 25px;
3870
+ }
3871
+
3862
3872
 
@@ -5,6 +5,9 @@ export const rulePropType: PropTypes.Requireable<string | PropTypes.InferProps<{
5
5
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
6
6
  valueLengthLessThan: PropTypes.Requireable<number>;
7
7
  complement: PropTypes.Requireable<boolean>;
8
+ }> | PropTypes.InferProps<{
9
+ rule: PropTypes.Requireable<string>;
10
+ complement: PropTypes.Requireable<boolean>;
8
11
  }>>;
9
12
  export const operationPropType: PropTypes.Requireable<PropTypes.InferProps<{
10
13
  type: PropTypes.Requireable<string>;
@@ -17,6 +20,9 @@ export const rulesPropType: PropTypes.Requireable<string | PropTypes.InferProps<
17
20
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
18
21
  valueLengthLessThan: PropTypes.Requireable<number>;
19
22
  complement: PropTypes.Requireable<boolean>;
23
+ }> | PropTypes.InferProps<{
24
+ rule: PropTypes.Requireable<string>;
25
+ complement: PropTypes.Requireable<boolean>;
20
26
  }> | (string | PropTypes.InferProps<{
21
27
  container: PropTypes.Requireable<string>;
22
28
  field: PropTypes.Validator<string>;
@@ -24,6 +30,9 @@ export const rulesPropType: PropTypes.Requireable<string | PropTypes.InferProps<
24
30
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
25
31
  valueLengthLessThan: PropTypes.Requireable<number>;
26
32
  complement: PropTypes.Requireable<boolean>;
33
+ }> | PropTypes.InferProps<{
34
+ rule: PropTypes.Requireable<string>;
35
+ complement: PropTypes.Requireable<boolean>;
27
36
  }> | null | undefined)[]>;
28
37
  /**
29
38
  * Transforms uiSchema according to conditional cases. Cases are not mutually exclusive.
@@ -64,6 +73,9 @@ export default class ConditionalUiSchemaField extends React.Component<any, any,
64
73
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
65
74
  valueLengthLessThan: PropTypes.Requireable<number>;
66
75
  complement: PropTypes.Requireable<boolean>;
76
+ }> | PropTypes.InferProps<{
77
+ rule: PropTypes.Requireable<string>;
78
+ complement: PropTypes.Requireable<boolean>;
67
79
  }> | (string | PropTypes.InferProps<{
68
80
  container: PropTypes.Requireable<string>;
69
81
  field: PropTypes.Validator<string>;
@@ -71,6 +83,9 @@ export default class ConditionalUiSchemaField extends React.Component<any, any,
71
83
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
72
84
  valueLengthLessThan: PropTypes.Requireable<number>;
73
85
  complement: PropTypes.Requireable<boolean>;
86
+ }> | PropTypes.InferProps<{
87
+ rule: PropTypes.Requireable<string>;
88
+ complement: PropTypes.Requireable<boolean>;
74
89
  }> | null | undefined)[]>;
75
90
  operations: PropTypes.Requireable<PropTypes.InferProps<{
76
91
  type: PropTypes.Requireable<string>;
@@ -87,6 +102,9 @@ export default class ConditionalUiSchemaField extends React.Component<any, any,
87
102
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
88
103
  valueLengthLessThan: PropTypes.Requireable<number>;
89
104
  complement: PropTypes.Requireable<boolean>;
105
+ }> | PropTypes.InferProps<{
106
+ rule: PropTypes.Requireable<string>;
107
+ complement: PropTypes.Requireable<boolean>;
90
108
  }> | (string | PropTypes.InferProps<{
91
109
  container: PropTypes.Requireable<string>;
92
110
  field: PropTypes.Validator<string>;
@@ -94,6 +112,9 @@ export default class ConditionalUiSchemaField extends React.Component<any, any,
94
112
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
95
113
  valueLengthLessThan: PropTypes.Requireable<number>;
96
114
  complement: PropTypes.Requireable<boolean>;
115
+ }> | PropTypes.InferProps<{
116
+ rule: PropTypes.Requireable<string>;
117
+ complement: PropTypes.Requireable<boolean>;
97
118
  }> | null | undefined)[]>;
98
119
  operations: PropTypes.Requireable<PropTypes.InferProps<{
99
120
  type: PropTypes.Requireable<string>;
@@ -21,6 +21,10 @@ exports.rulePropType = PropTypes.oneOfType([
21
21
  valueLengthLessThan: PropTypes.number,
22
22
  complement: PropTypes.bool
23
23
  }),
24
+ PropTypes.shape({
25
+ rule: PropTypes.oneOf(["isAdmin", "isEdit"]),
26
+ complement: PropTypes.bool
27
+ }),
24
28
  PropTypes.oneOf(["isAdmin", "isEdit"])
25
29
  ]);
26
30
  exports.operationPropType = PropTypes.shape({
@@ -5,6 +5,9 @@ export const arrayRulesPropType: PropTypes.Requireable<string | PropTypes.InferP
5
5
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
6
6
  valueLengthLessThan: PropTypes.Requireable<number>;
7
7
  complement: PropTypes.Requireable<boolean>;
8
+ }> | PropTypes.InferProps<{
9
+ rule: PropTypes.Requireable<string>;
10
+ complement: PropTypes.Requireable<boolean>;
8
11
  }> | PropTypes.InferProps<{
9
12
  idx: PropTypes.Requireable<number>;
10
13
  isLast: PropTypes.Requireable<number>;
@@ -16,6 +19,9 @@ export const arrayRulesPropType: PropTypes.Requireable<string | PropTypes.InferP
16
19
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
17
20
  valueLengthLessThan: PropTypes.Requireable<number>;
18
21
  complement: PropTypes.Requireable<boolean>;
22
+ }> | PropTypes.InferProps<{
23
+ rule: PropTypes.Requireable<string>;
24
+ complement: PropTypes.Requireable<boolean>;
19
25
  }> | PropTypes.InferProps<{
20
26
  idx: PropTypes.Requireable<number>;
21
27
  isLast: PropTypes.Requireable<number>;
@@ -32,6 +38,9 @@ export default class FilterArrayField extends React.Component<any, any, any> {
32
38
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
33
39
  valueLengthLessThan: PropTypes.Requireable<number>;
34
40
  complement: PropTypes.Requireable<boolean>;
41
+ }> | PropTypes.InferProps<{
42
+ rule: PropTypes.Requireable<string>;
43
+ complement: PropTypes.Requireable<boolean>;
35
44
  }> | PropTypes.InferProps<{
36
45
  idx: PropTypes.Requireable<number>;
37
46
  isLast: PropTypes.Requireable<number>;
@@ -43,6 +52,9 @@ export default class FilterArrayField extends React.Component<any, any, any> {
43
52
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
44
53
  valueLengthLessThan: PropTypes.Requireable<number>;
45
54
  complement: PropTypes.Requireable<boolean>;
55
+ }> | PropTypes.InferProps<{
56
+ rule: PropTypes.Requireable<string>;
57
+ complement: PropTypes.Requireable<boolean>;
46
58
  }> | PropTypes.InferProps<{
47
59
  idx: PropTypes.Requireable<number>;
48
60
  isLast: PropTypes.Requireable<number>;
@@ -9,6 +9,9 @@ export default class MultiArrayField extends React.Component<any, any, any> {
9
9
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
10
10
  valueLengthLessThan: PropTypes.Requireable<number>;
11
11
  complement: PropTypes.Requireable<boolean>;
12
+ }> | PropTypes.InferProps<{
13
+ rule: PropTypes.Requireable<string>;
14
+ complement: PropTypes.Requireable<boolean>;
12
15
  }> | PropTypes.InferProps<{
13
16
  idx: PropTypes.Requireable<number>;
14
17
  isLast: PropTypes.Requireable<number>;
@@ -20,6 +23,9 @@ export default class MultiArrayField extends React.Component<any, any, any> {
20
23
  valueIn: PropTypes.Requireable<(string | null | undefined)[]>;
21
24
  valueLengthLessThan: PropTypes.Requireable<number>;
22
25
  complement: PropTypes.Requireable<boolean>;
26
+ }> | PropTypes.InferProps<{
27
+ rule: PropTypes.Requireable<string>;
28
+ complement: PropTypes.Requireable<boolean>;
23
29
  }> | PropTypes.InferProps<{
24
30
  idx: PropTypes.Requireable<number>;
25
31
  isLast: PropTypes.Requireable<number>;
@@ -48,6 +48,8 @@ class _AutosuggestWidget extends React.Component {
48
48
  return React.createElement(OrganizationAutosuggestWidget, Object.assign({}, this.props));
49
49
  case "collection":
50
50
  return React.createElement(CollectionAutosuggestWidget, Object.assign({}, this.props));
51
+ case "dataset":
52
+ return React.createElement(DatasetAutosuggestWidget, Object.assign({}, this.props));
51
53
  default:
52
54
  return React.createElement(RangeAutosuggestWidget, Object.assign({}, this.props));
53
55
  }
@@ -74,6 +76,9 @@ class _AutosuggestWidget extends React.Component {
74
76
  case "collection":
75
77
  component = CollectionAutosuggestWidget;
76
78
  break;
79
+ case "dataset":
80
+ component = DatasetAutosuggestWidget;
81
+ break;
77
82
  default:
78
83
  component = RangeAutosuggestWidget;
79
84
  }
@@ -314,46 +319,24 @@ class FriendsAutosuggestWidget extends React.Component {
314
319
  }
315
320
  FriendsAutosuggestWidget.contextType = ReactContext_1.default;
316
321
  class OrganizationAutosuggestWidget extends React.Component {
317
- constructor(props) {
318
- super(props);
319
- this.findExactMatch = (suggestions, inputValue) => {
320
- return suggestions.find(suggestion => (suggestion && suggestion.value.toLowerCase() === inputValue.trim().toLowerCase()));
321
- };
322
- this.getSuggestionFromValue = this.getSuggestionFromValue.bind(this);
323
- this.isValueSuggested = this.isValueSuggested.bind(this);
324
- }
325
- getSuggestionFromValue(value) {
326
- if (this.isValueSuggested(value)) {
327
- return this.props.formContext.apiClient.fetchCached(`/organization/by-id/${value}`).then(({ fullName }) => {
328
- if (fullName) {
329
- return {
330
- value: fullName,
331
- key: value
332
- };
333
- }
334
- });
335
- }
336
- else {
337
- return Promise.reject();
338
- }
339
- }
340
- isValueSuggested(value) {
341
- return !utils_1.isEmptyString(value) && value.match(/MOS\.\d+/);
342
- }
343
322
  render() {
344
- const _a = this.props, { options: propsOptions } = _a, propsWithoutOptions = __rest(_a, ["options"]);
345
- const options = {
346
- query: Object.assign({ includeSelf: true }, propsOptions.queryOptions),
347
- getSuggestionFromValue: this.getSuggestionFromValue,
348
- isValueSuggested: this.isValueSuggested,
349
- Wrapper: OrganizationWrapper,
350
- findExactMatch: this.findExactMatch
351
- };
352
- return React.createElement(Autosuggest, Object.assign({}, options, propsWithoutOptions, propsOptions));
323
+ return (React.createElement(BasicAutosuggestWidget, Object.assign({}, this.props, this.props.options, { nameField: "fullName", validValueRegexp: "MOS.\\d+", Wrapper: OrganizationWrapper })));
353
324
  }
354
325
  }
355
326
  OrganizationAutosuggestWidget.contextType = ReactContext_1.default;
356
327
  class CollectionAutosuggestWidget extends React.Component {
328
+ render() {
329
+ return (React.createElement(BasicAutosuggestWidget, Object.assign({}, this.props, this.props.options, { nameField: "collectionName", validValueRegexp: "HR.\\d+", Wrapper: CollectionWrapper })));
330
+ }
331
+ }
332
+ CollectionAutosuggestWidget.contextType = ReactContext_1.default;
333
+ class DatasetAutosuggestWidget extends React.Component {
334
+ render() {
335
+ return (React.createElement(BasicAutosuggestWidget, Object.assign({}, this.props, this.props.options, { nameField: "datasetName", validValueRegexp: "GX.\\d+", Wrapper: DatasetWrapper })));
336
+ }
337
+ }
338
+ DatasetAutosuggestWidget.contextType = ReactContext_1.default;
339
+ class BasicAutosuggestWidget extends React.Component {
357
340
  constructor(props) {
358
341
  super(props);
359
342
  this.findExactMatch = (suggestions, inputValue) => {
@@ -363,11 +346,12 @@ class CollectionAutosuggestWidget extends React.Component {
363
346
  this.isValueSuggested = this.isValueSuggested.bind(this);
364
347
  }
365
348
  getSuggestionFromValue(value) {
349
+ const { autosuggestField, nameField } = this.props;
366
350
  if (this.isValueSuggested(value)) {
367
- return this.props.formContext.apiClient.fetchCached(`/collection/by-id/${value}`).then(({ collectionName }) => {
368
- if (collectionName) {
351
+ return this.props.formContext.apiClient.fetchCached(`/${autosuggestField}/by-id/${value}`).then(result => {
352
+ if (result[nameField]) {
369
353
  return {
370
- value: collectionName,
354
+ value: result[nameField],
371
355
  key: value
372
356
  };
373
357
  }
@@ -378,21 +362,36 @@ class CollectionAutosuggestWidget extends React.Component {
378
362
  }
379
363
  }
380
364
  isValueSuggested(value) {
381
- return !utils_1.isEmptyString(value) && value.match(/HR\.\d+/);
365
+ const regexp = new RegExp(this.props.validValueRegexp);
366
+ return !utils_1.isEmptyString(value) && value.match(regexp);
382
367
  }
383
368
  render() {
384
- const _a = this.props, { options: propsOptions } = _a, propsWithoutOptions = __rest(_a, ["options"]);
385
369
  const options = {
386
- query: Object.assign({ includeSelf: true }, propsOptions.queryOptions),
370
+ query: Object.assign({ includeSelf: true }, this.props.queryOptions),
387
371
  getSuggestionFromValue: this.getSuggestionFromValue,
388
372
  isValueSuggested: this.isValueSuggested,
389
- Wrapper: CollectionWrapper,
373
+ Wrapper: this.props.Wrapper,
390
374
  findExactMatch: this.findExactMatch
391
375
  };
392
- return React.createElement(Autosuggest, Object.assign({}, options, propsWithoutOptions, propsOptions));
376
+ return React.createElement(Autosuggest, Object.assign({}, options, this.props));
393
377
  }
394
378
  }
395
- CollectionAutosuggestWidget.contextType = ReactContext_1.default;
379
+ BasicAutosuggestWidget.contextType = ReactContext_1.default;
380
+ BasicAutosuggestWidget.propTypes = {
381
+ autosuggestField: PropTypes.string.isRequired,
382
+ allowNonsuggestedValue: PropTypes.bool,
383
+ onSuggestionSelected: PropTypes.func,
384
+ onUnsuggestedSelected: PropTypes.func,
385
+ onInputChange: PropTypes.func,
386
+ uiSchema: PropTypes.object,
387
+ nameField: PropTypes.string,
388
+ validValueRegexp: PropTypes.string,
389
+ Wrapper: PropTypes.object
390
+ };
391
+ BasicAutosuggestWidget.defaultProps = {
392
+ nameField: "name",
393
+ validValueRegexp: ""
394
+ };
396
395
  class RangeAutosuggestWidget extends React.Component {
397
396
  render() {
398
397
  const _a = this.props, { options: propsOptions } = _a, propsWithoutOptions = __rest(_a, ["options"]);
@@ -1165,3 +1164,4 @@ const getWrapper = (unknownValueLabel) => React.forwardRef(({ formContext, child
1165
1164
  const FriendsWrapper = getWrapper("UnknownName");
1166
1165
  const OrganizationWrapper = getWrapper("UnknownOrganization");
1167
1166
  const CollectionWrapper = getWrapper("UnknownCollection");
1167
+ const DatasetWrapper = getWrapper("UnknownTag");
@@ -112,14 +112,16 @@ class CheckboxWidget extends React.Component {
112
112
  tabIndex: (toggleMode || _disabled) ? undefined : 0
113
113
  };
114
114
  const tabTargetClass = "laji-form-checkbox-widget-tab-target";
115
- const checkbox = (React.createElement(ButtonToolbar, { className: utils_1.classNames(toggleMode && "desktop-layout") },
115
+ const checkbox = (React.createElement(ButtonToolbar, { className: utils_1.classNames("laji-form-checkbox-buttons", toggleMode && "desktop-layout") },
116
116
  React.createElement(ToggleButtonGroup, Object.assign({ ref: this.groupRef, type: "radio", value: [_value], name: this.props.id, onChange: this.onButtonGroupChange, onKeyDown: this.onGroupKeyDown, className: utils_1.classNames(toggleMode && tabTargetClass) }, commonProps, { tabIndex: (toggleMode && !_disabled) ? 0 : undefined }),
117
117
  React.createElement(ToggleButton, Object.assign({ id: `${id}-true`, ref: this.trueRef, value: true, onClick: toggleMode ? this.toggle : undefined, className: utils_1.classNames(toggleMode && _value === false && "laji-form-hide-btn-label", _value === true && tabTargetClass), onKeyDown: this.onTrueKeyDown }, commonProps), trueLabel),
118
118
  React.createElement(ToggleButton, Object.assign({ id: `${id}-false`, ref: this.falseRef, value: false, onClick: toggleMode ? this.toggle : undefined, className: utils_1.classNames(toggleMode && _value === true && "laji-form-hide-btn-label", _value === false && tabTargetClass), onKeyDown: this.onFalseKeyDown }, commonProps), falseLabel),
119
119
  (displayUndefined ?
120
120
  React.createElement(ToggleButton, Object.assign({ id: `${id}-undefined`, ref: this.undefinedRef, value: "undefined", className: utils_1.classNames(value === undefined && tabTargetClass) }, commonProps, { onKeyDown: this.onUndefinedKeyDown }), unknownLabel) : null))));
121
121
  const { Label } = this.props.formContext;
122
- return !hasLabel ? checkbox : (React.createElement(Label, { label: label, required: required, uiSchema: options, contextId: this.props.formContext.contextId }, checkbox));
122
+ return !hasLabel ? checkbox : React.createElement(React.Fragment, null,
123
+ React.createElement(Label, { label: label, required: required, uiSchema: options, contextId: this.props.formContext.contextId }),
124
+ checkbox);
123
125
  }
124
126
  formatValue(value, options, props) {
125
127
  return value === undefined
@@ -308,7 +308,8 @@ const SelectedMultiValue = ({ children: enu, onDelete, readonly }) => {
308
308
  React.createElement("span", { tabIndex: readonly ? undefined : 0, role: readonly ? undefined : "button", onClick: onDeleteClick }, "\u00D7")));
309
309
  };
310
310
  const Caret = ({ onFocus }) => React.createElement("div", { className: "laji-form-dropdown-caret-container", style: { position: "absolute", pointerEvents: "none" } },
311
- React.createElement("span", { onFocus: onFocus, className: "laji-form-dropdown-caret" }, "\u2304"));
311
+ React.createElement("span", { onFocus: onFocus, className: "laji-form-dropdown-caret" },
312
+ React.createElement("img", { src: "https://cdn.laji.fi/images/icons/caret-down.svg" })));
312
313
  function ListItem({ onSelected, active, children }) {
313
314
  const onClick = react_1.useCallback(() => {
314
315
  onSelected(children);
@@ -79,6 +79,11 @@
79
79
  "en": "Unknown collection",
80
80
  "sv": "Okänd samling"
81
81
  },
82
+ "unknownTag": {
83
+ "fi": "Tuntematon tagi",
84
+ "en": "Unknown tag",
85
+ "sv": "Okänd tagg"
86
+ },
82
87
  "fix": {
83
88
  "fi": "Korjaa",
84
89
  "en": "Fix",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luomus/laji-form",
3
- "version": "15.1.29",
3
+ "version": "15.1.31",
4
4
  "description": "React module capable of building dynamic forms from Laji form json schemas",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",