superdesk-ui-framework 3.0.36 → 3.0.39

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 (80) hide show
  1. package/.eslintignore +1 -0
  2. package/app/styles/_drag-handle.scss +24 -0
  3. package/app/styles/_sd-tag-input.scss +3 -5
  4. package/app/styles/_tag-labels.scss +0 -2
  5. package/app/styles/app.scss +1 -0
  6. package/app/styles/form-elements/_checkbox.scss +3 -0
  7. package/app/styles/form-elements/_input-preview.scss +70 -0
  8. package/app/styles/form-elements/_inputs.scss +10 -14
  9. package/app/styles/primereact/_pr-tag-input.scss +1 -1
  10. package/app-typescript/components/DatePicker.tsx +101 -101
  11. package/app-typescript/components/DragHandle.tsx +13 -0
  12. package/app-typescript/components/DurationInput.tsx +76 -76
  13. package/app-typescript/components/Form/InputNew.tsx +1 -1
  14. package/app-typescript/components/Form/InputWrapper.tsx +34 -18
  15. package/app-typescript/components/Input.tsx +38 -62
  16. package/app-typescript/components/MultiSelect.tsx +49 -47
  17. package/app-typescript/components/Select.tsx +13 -22
  18. package/app-typescript/components/SelectPreview.tsx +100 -0
  19. package/app-typescript/components/SelectWithTemplate.tsx +2 -12
  20. package/app-typescript/components/TagInput.tsx +25 -24
  21. package/app-typescript/components/TimePicker.tsx +13 -16
  22. package/app-typescript/components/TreeSelect.tsx +180 -131
  23. package/app-typescript/index.ts +1 -0
  24. package/dist/examples.bundle.css +20 -0
  25. package/dist/examples.bundle.js +2485 -2198
  26. package/dist/react/Autocomplete.tsx +32 -31
  27. package/dist/react/DatePicker.tsx +56 -73
  28. package/dist/react/DragHandleDocs.tsx +26 -0
  29. package/dist/react/DurationInput.tsx +36 -47
  30. package/dist/react/Index.tsx +6 -1
  31. package/dist/react/Inputs.tsx +86 -248
  32. package/dist/react/MultiSelect.tsx +30 -23
  33. package/dist/react/Selects.tsx +12 -44
  34. package/dist/react/TagInputDocs.tsx +15 -21
  35. package/dist/react/TimePicker.tsx +25 -32
  36. package/dist/react/TreeSelect.tsx +97 -90
  37. package/dist/superdesk-ui.bundle.css +105 -18
  38. package/dist/superdesk-ui.bundle.js +2118 -1888
  39. package/dist/vendor.bundle.js +14 -14
  40. package/examples/pages/react/Autocomplete.tsx +32 -31
  41. package/examples/pages/react/DatePicker.tsx +56 -73
  42. package/examples/pages/react/DragHandleDocs.tsx +26 -0
  43. package/examples/pages/react/DurationInput.tsx +36 -47
  44. package/examples/pages/react/Index.tsx +6 -1
  45. package/examples/pages/react/Inputs.tsx +86 -248
  46. package/examples/pages/react/MultiSelect.tsx +30 -23
  47. package/examples/pages/react/Selects.tsx +12 -44
  48. package/examples/pages/react/TagInputDocs.tsx +15 -21
  49. package/examples/pages/react/TimePicker.tsx +25 -32
  50. package/examples/pages/react/TreeSelect.tsx +97 -90
  51. package/globals.d.ts +4 -0
  52. package/package.json +1 -1
  53. package/react/components/DatePicker.d.ts +2 -12
  54. package/react/components/DatePicker.js +14 -8
  55. package/react/components/DragHandle.d.ts +5 -0
  56. package/react/components/DragHandle.js +59 -0
  57. package/react/components/DurationInput.d.ts +2 -11
  58. package/react/components/DurationInput.js +14 -4
  59. package/react/components/Form/InputNew.d.ts +1 -1
  60. package/react/components/Form/InputWrapper.d.ts +11 -5
  61. package/react/components/Form/InputWrapper.js +6 -9
  62. package/react/components/Input.d.ts +3 -19
  63. package/react/components/Input.js +8 -21
  64. package/react/components/MultiSelect.d.ts +4 -13
  65. package/react/components/MultiSelect.js +6 -2
  66. package/react/components/Select.d.ts +3 -15
  67. package/react/components/Select.js +7 -8
  68. package/react/components/SelectPreview.d.ts +17 -0
  69. package/react/components/SelectPreview.js +109 -0
  70. package/react/components/SelectWithTemplate.d.ts +2 -11
  71. package/react/components/SelectWithTemplate.js +0 -1
  72. package/react/components/TagInput.d.ts +3 -12
  73. package/react/components/TagInput.js +6 -2
  74. package/react/components/TimePicker.d.ts +2 -11
  75. package/react/components/TimePicker.js +6 -2
  76. package/react/components/TreeSelect.d.ts +2 -11
  77. package/react/components/TreeSelect.js +49 -26
  78. package/react/index.d.ts +1 -0
  79. package/react/index.js +3 -1
  80. package/tsconfig.json +1 -1
@@ -0,0 +1,100 @@
1
+ import classNames from 'classnames';
2
+ import * as React from 'react';
3
+ import {getTextColor} from './Label';
4
+
5
+ interface IProps<T> {
6
+ items: Array<T>;
7
+ kind: {
8
+ mode: 'single-select'; getBorderColor?(item: T): string;
9
+ } | {
10
+ mode: 'multi-select'; getBackgroundColor?(item: T): string;
11
+ };
12
+ getLabel(item: T): string;
13
+ valueTemplate?(item: T, Wrapper?: React.ElementType): React.ComponentType<T> | JSX.Element | undefined;
14
+ }
15
+
16
+ export class SelectPreview<T> extends React.Component<IProps<T>> {
17
+ render() {
18
+ return (
19
+ <div className="tags-preview">
20
+ <ul className="tags-preview__tag-list">
21
+ {this.props.items.map((item, i: number) => {
22
+ const Wrapper: React.ComponentType<{backgroundColor?: string, borderColor?: string}>
23
+ = ({backgroundColor, borderColor, children}) => {
24
+ let classes = classNames('tags-preview__tag-item', {
25
+ 'tags-preview__tag-item--single-select': this.props.kind.mode === 'single-select',
26
+ 'tags-preview__tag-item--border': (
27
+ this.props.kind.mode === 'single-select' && this.props.kind.getBorderColor
28
+ )
29
+ || borderColor,
30
+ });
31
+
32
+ return (
33
+ <li
34
+ className={classes}
35
+ style={(() => {
36
+ if (this.props.valueTemplate != null) {
37
+ return {backgroundColor, borderColor};
38
+ } else {
39
+ if (
40
+ this.props.kind.mode === 'multi-select'
41
+ && this.props.kind.getBackgroundColor != null
42
+ ) {
43
+ return {
44
+ backgroundColor: this.props.kind.getBackgroundColor(item),
45
+ };
46
+ } else if (
47
+ this.props.kind.mode === 'single-select'
48
+ && this.props.kind.getBorderColor != null
49
+ ) {
50
+ return {
51
+ borderLeftColor: this.props.kind.getBorderColor(item),
52
+ };
53
+ } else {
54
+ return undefined;
55
+ }
56
+ }
57
+ })()}
58
+ >
59
+ <span
60
+ className="tags-input__helper-box"
61
+ style={(() => {
62
+ if (backgroundColor != null) {
63
+ return {color: getTextColor(backgroundColor)};
64
+ } else {
65
+ if (
66
+ this.props.kind.mode === 'multi-select'
67
+ && this.props.kind.getBackgroundColor != null
68
+ ) {
69
+ return {color: getTextColor(
70
+ this.props.kind.getBackgroundColor(item),
71
+ )};
72
+ } else {
73
+ return undefined;
74
+ }
75
+ }
76
+ })()}
77
+ >
78
+ {children}
79
+ </span>
80
+ </li>
81
+ );
82
+ };
83
+
84
+ return (
85
+ <React.Fragment key={i}>
86
+ {this.props.valueTemplate
87
+ ? this.props.valueTemplate(item, Wrapper)
88
+ : <Wrapper>
89
+ <span>{this.props.getLabel(item)}</span>
90
+ </Wrapper>
91
+ }
92
+ </React.Fragment>
93
+ );
94
+
95
+ })}
96
+ </ul>
97
+ </div>
98
+ );
99
+ }
100
+ }
@@ -1,10 +1,10 @@
1
1
  import * as React from 'react';
2
2
  import {Dropdown} from '@superdesk/primereact/dropdown';
3
- // import classNames from 'classnames';
4
3
  import nextId from "react-id-generator";
5
4
  import { InputWrapper } from './Form';
5
+ import {IInputWrapper} from './Form/InputWrapper';
6
6
 
7
- interface IProps<T> {
7
+ interface IProps<T> extends IInputWrapper {
8
8
  // Don't forget to cancel unfinished requests every the prop is called.
9
9
  getItems(searchString: string | null): Promise<Array<T>>;
10
10
  value: T;
@@ -14,21 +14,11 @@ interface IProps<T> {
14
14
  itemTemplate: React.ComponentType<{option: T | null}>;
15
15
  noResultsFoundMessage: string;
16
16
  filterPlaceholder?: string;
17
- disabled?: boolean;
18
17
  autoFocus?: boolean;
19
18
  autoOpen?: boolean; // Avoid using this - the dropdown may cover important elements.
20
19
  width?: 'min' | '100%'; // defaults to min
21
20
  zIndex?: number;
22
21
  'data-test-id'?: string;
23
- inlineLabel?: boolean;
24
- required?: boolean;
25
- fullWidth?: boolean;
26
- invalid?: boolean;
27
- labelHidden?: boolean;
28
- tabindex?: number;
29
- label?: string;
30
- info?: string;
31
- error?: string;
32
22
  }
33
23
 
34
24
  interface IState<T> {
@@ -2,21 +2,13 @@ import * as React from 'react';
2
2
  import { Chips } from '@superdesk/primereact/chips';
3
3
  import {InputWrapper} from './Form';
4
4
  import nextId from "react-id-generator";
5
+ import {IInputWrapper} from './Form/InputWrapper';
6
+ import {SelectPreview} from './SelectPreview';
5
7
 
6
- interface IProps {
8
+ interface IProps extends IInputWrapper {
7
9
  value: Array<string>;
8
10
  onChange(value: Array<string>): void;
9
- placeholder: string;
10
- invalid?: boolean;
11
- inlineLabel?: boolean;
12
- labelHidden?: boolean;
13
- tabindex?: number;
14
- fullWidth?: boolean;
15
- info?: string;
16
- error?: string;
17
- required?: boolean;
18
- label?: string;
19
- disabled?: boolean;
11
+ placeholder?: string;
20
12
  }
21
13
 
22
14
  export class TagInput extends React.Component<IProps> {
@@ -25,26 +17,35 @@ export class TagInput extends React.Component<IProps> {
25
17
  render() {
26
18
  const {onChange, value, placeholder} = this.props;
27
19
 
20
+ if (this.props.preview) {
21
+ return (
22
+ <SelectPreview
23
+ kind={{mode: 'multi-select'}}
24
+ items={this.props.value}
25
+ getLabel={(item) => item}
26
+ />
27
+ );
28
+ }
29
+
28
30
  return (
29
31
  <InputWrapper
30
- label={this.props.label}
31
- error={this.props.error}
32
- required={this.props.required}
33
- disabled={this.props.disabled}
34
- invalid={this.props.invalid}
35
- info={this.props.info}
36
- inlineLabel={this.props.inlineLabel}
37
- labelHidden={this.props.labelHidden}
38
- fullWidth={this.props.fullWidth}
39
- htmlId={this.htmlId}
40
- tabindex={this.props.tabindex}>
32
+ label={this.props.label}
33
+ error={this.props.error}
34
+ required={this.props.required}
35
+ disabled={this.props.disabled}
36
+ info={this.props.info}
37
+ inlineLabel={this.props.inlineLabel}
38
+ labelHidden={this.props.labelHidden}
39
+ htmlId={this.htmlId}
40
+ tabindex={this.props.tabindex}
41
+ >
41
42
  <Chips
42
43
  className={`tags-input--multi-select sd-input__input ${this.props.disabled ? ' tags-input__padding-disabled' : ''}`}
43
44
  allowDuplicate={false}
44
45
  separator=","
45
46
  onChange={(event) => onChange(event.value)}
46
47
  value={value}
47
- placeholder={placeholder}
48
+ placeholder={this.props.disabled ? undefined : placeholder}
48
49
  disabled={this.props.disabled}
49
50
  />
50
51
  </InputWrapper>
@@ -1,48 +1,45 @@
1
1
  import * as React from 'react';
2
2
  import nextId from "react-id-generator";
3
3
  import { InputWrapper } from './Form';
4
+ import {IInputWrapper} from './Form/InputWrapper';
4
5
 
5
- interface IProps {
6
+ interface IProps extends IInputWrapper {
6
7
  value: string; // will output time as ISO8601 time string(e.g. 16:55) or an empty string if there's no value
7
8
  onChange(valueNext: string): void;
8
9
  allowSeconds?: boolean;
9
- disabled?: boolean;
10
- inlineLabel?: boolean;
11
- required?: boolean;
12
- fullWidth?: boolean;
13
- invalid?: boolean;
14
- labelHidden?: boolean;
15
- tabindex?: number;
16
- label?: string;
17
- info?: string;
18
- error?: string;
19
10
  }
20
11
 
21
12
  export class TimePicker extends React.PureComponent<IProps> {
22
13
  private htmlId = nextId();
23
14
 
24
15
  render() {
16
+ if (this.props.preview) {
17
+ return (
18
+ <div>
19
+ <span>{this.props.value}</span>
20
+ </div>
21
+ );
22
+ }
23
+
25
24
  return (
26
25
  <InputWrapper
27
26
  label={this.props.label}
28
27
  error={this.props.error}
29
28
  required={this.props.required}
30
29
  disabled={this.props.disabled}
31
- invalid={this.props.invalid}
32
30
  info={this.props.info}
33
31
  inlineLabel={this.props.inlineLabel}
34
32
  labelHidden={this.props.labelHidden}
35
- fullWidth={this.props.fullWidth}
36
33
  htmlId={this.htmlId}
37
34
  tabindex={this.props.tabindex}
38
35
  >
39
36
  <input
37
+ value={this.props.value}
38
+ type="time"
39
+ className="sd-input__input"
40
40
  id={this.htmlId}
41
41
  aria-labelledby={this.htmlId + 'label'}
42
- type="time"
43
42
  step={this.props.allowSeconds ? 1 : undefined}
44
- className="sd-input__input"
45
- value={this.props.value}
46
43
  required={this.props.required}
47
44
  disabled={this.props.disabled}
48
45
  onChange={(event) => {