superdesk-ui-framework 3.0.35 → 3.0.38

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 (65) hide show
  1. package/app/styles/_sd-tag-input.scss +3 -5
  2. package/app/styles/_tag-labels.scss +0 -2
  3. package/app/styles/app.scss +1 -0
  4. package/app/styles/form-elements/_checkbox.scss +3 -0
  5. package/app/styles/form-elements/_input-preview.scss +70 -0
  6. package/app/styles/form-elements/_inputs.scss +10 -14
  7. package/app/styles/primereact/_pr-tag-input.scss +1 -1
  8. package/app-typescript/components/DatePicker.tsx +101 -101
  9. package/app-typescript/components/DurationInput.tsx +76 -76
  10. package/app-typescript/components/Form/InputNew.tsx +1 -1
  11. package/app-typescript/components/Form/InputWrapper.tsx +34 -18
  12. package/app-typescript/components/Input.tsx +38 -62
  13. package/app-typescript/components/MultiSelect.tsx +49 -47
  14. package/app-typescript/components/Select.tsx +13 -22
  15. package/app-typescript/components/SelectPreview.tsx +100 -0
  16. package/app-typescript/components/SelectWithTemplate.tsx +2 -12
  17. package/app-typescript/components/TagInput.tsx +25 -24
  18. package/app-typescript/components/TimePicker.tsx +13 -16
  19. package/app-typescript/components/TreeSelect.tsx +218 -158
  20. package/dist/examples.bundle.js +2400 -2258
  21. package/dist/react/Autocomplete.tsx +32 -31
  22. package/dist/react/DatePicker.tsx +56 -73
  23. package/dist/react/DurationInput.tsx +36 -47
  24. package/dist/react/Inputs.tsx +86 -248
  25. package/dist/react/MultiSelect.tsx +30 -23
  26. package/dist/react/Selects.tsx +12 -44
  27. package/dist/react/TagInputDocs.tsx +15 -21
  28. package/dist/react/TimePicker.tsx +25 -32
  29. package/dist/react/TreeSelect.tsx +97 -90
  30. package/dist/superdesk-ui.bundle.css +85 -18
  31. package/dist/superdesk-ui.bundle.js +1973 -1816
  32. package/dist/vendor.bundle.js +14 -14
  33. package/examples/pages/react/Autocomplete.tsx +32 -31
  34. package/examples/pages/react/DatePicker.tsx +56 -73
  35. package/examples/pages/react/DurationInput.tsx +36 -47
  36. package/examples/pages/react/Inputs.tsx +86 -248
  37. package/examples/pages/react/MultiSelect.tsx +30 -23
  38. package/examples/pages/react/Selects.tsx +12 -44
  39. package/examples/pages/react/TagInputDocs.tsx +15 -21
  40. package/examples/pages/react/TimePicker.tsx +25 -32
  41. package/examples/pages/react/TreeSelect.tsx +97 -90
  42. package/package.json +1 -1
  43. package/react/components/DatePicker.d.ts +2 -12
  44. package/react/components/DatePicker.js +14 -8
  45. package/react/components/DurationInput.d.ts +2 -11
  46. package/react/components/DurationInput.js +14 -4
  47. package/react/components/Form/InputNew.d.ts +1 -1
  48. package/react/components/Form/InputWrapper.d.ts +11 -5
  49. package/react/components/Form/InputWrapper.js +6 -9
  50. package/react/components/Input.d.ts +3 -19
  51. package/react/components/Input.js +8 -21
  52. package/react/components/MultiSelect.d.ts +4 -13
  53. package/react/components/MultiSelect.js +6 -2
  54. package/react/components/Select.d.ts +3 -15
  55. package/react/components/Select.js +7 -8
  56. package/react/components/SelectPreview.d.ts +17 -0
  57. package/react/components/SelectPreview.js +109 -0
  58. package/react/components/SelectWithTemplate.d.ts +2 -11
  59. package/react/components/SelectWithTemplate.js +0 -1
  60. package/react/components/TagInput.d.ts +3 -12
  61. package/react/components/TagInput.js +6 -2
  62. package/react/components/TimePicker.d.ts +2 -11
  63. package/react/components/TimePicker.js +6 -2
  64. package/react/components/TreeSelect.d.ts +5 -11
  65. package/react/components/TreeSelect.js +78 -47
@@ -20,53 +20,52 @@ let options = [
20
20
  {
21
21
  value: {name: 'Sub-category1'},
22
22
  children: [
23
- {value: {name: 'Item31'}},
24
- // {value: {name: 'Item32'}},
25
- // {value: {name: 'Item33'}},
26
- // {value: {name: 'Item34'}},
23
+ {value: {name: 'Item5'}},
24
+ {value: {name: 'Item6'}},
25
+ {value: {name: 'Item7'}},
26
+ {value: {name: 'Item8'}},
27
27
 
28
28
  ]
29
29
  },
30
30
  {
31
31
  value: {name: 'Sub-category2'},
32
32
  children: [
33
- {value: {name: 'Item41'}},
34
- {value: {name: 'Item42'}},
35
- {value: {name: 'Item43'}}
33
+ {value: {name: 'Item9'}},
34
+ {value: {name: 'Item10'}},
35
+ {value: {name: 'Item11'}},
36
+ {value: {name: 'Item12'}},
36
37
  ]
37
38
  },
38
39
  {
39
40
  value: {name: 'Sub-category3'},
40
41
  children: [
41
- {value: {name: 'Item50'}},
42
- {value: {name: 'Item51'}},
43
- {value: {name: 'Item53'}}
42
+ {value: {name: 'Item13'}},
43
+ {value: {name: 'Item14'}},
44
44
  ]
45
45
  },
46
46
  {
47
47
  value: {name: 'Sub-category4'},
48
48
  children: [
49
- {value: {name: 'Item23'}},
50
- {value: {name: 'Item41'}},
51
- {value: {name: 'Item42'}},
52
- {value: {name: 'Item43'}}
49
+ {value: {name: 'Item15'}},
50
+ {value: {name: 'Item16'}},
53
51
  ]
54
52
  },
55
53
  {
56
54
  value: {name: 'Sub-category5'},
57
55
  children: [
58
- {value: {name: 'Item24'}},
59
- {value: {name: 'Item41'}},
60
- {value: {name: 'Item42'}},
61
- {value: {name: 'Item43'}}
56
+ {value: {name: 'Item17'}},
57
+ {value: {name: 'Item18'}},
58
+ {value: {name: 'Item19'}},
59
+ {value: {name: 'Item20'}},
62
60
  ]
63
61
  },
64
62
  {
65
63
  value: {name: 'Sub-category6'},
66
64
  children: [
67
- {value: {name: 'Item50'}},
68
- {value: {name: 'Item51'}},
69
- {value: {name: 'Item52'}}
65
+ {value: {name: 'Item21'}},
66
+ {value: {name: 'Item22'}},
67
+ {value: {name: 'Item23'}},
68
+ {value: {name: 'Item24'}},
70
69
  ]
71
70
  }
72
71
  ]
@@ -75,21 +74,21 @@ let options = [
75
74
  value: {name: 'Category2'},
76
75
  children: [
77
76
  {
78
- value: {name: 'Item8'}
77
+ value: {name: 'Item1'}
79
78
  },
80
- // {
81
- // value: {name: 'Item9'}
82
- // }
79
+ {
80
+ value: {name: 'Item2'}
81
+ }
83
82
  ]
84
83
  },
85
84
  {
86
85
  value: {name: 'Category3', bgColor: 'red'},
87
86
  children: [
88
87
  {
89
- value: {name: 'Item10'}
88
+ value: {name: 'Item3'}
90
89
  },
91
90
  {
92
- value: {name: 'Item11'}
91
+ value: {name: 'Item4'}
93
92
  }
94
93
  ]
95
94
  },
@@ -102,41 +101,47 @@ let options2 = [
102
101
  {
103
102
  value: {name: 'Sub-category1'},
104
103
  children: [
105
- {value: {name: 'Item20'}}
104
+ {value: {name: 'Item5'}},
105
+ {value: {name: 'Item6'}},
106
106
  ]
107
107
  },
108
108
  {
109
109
  value: {name: 'Sub-category2'},
110
110
  children: [
111
- {value: {name: 'Item21'}}
111
+ {value: {name: 'Item7'}},
112
+ {value: {name: 'Item8'}},
112
113
  ]
113
114
  }
114
115
  ,
115
116
  {
116
117
  value: {name: 'Sub-category3'},
117
118
  children: [
118
- {value: {name: 'Item22'}}
119
+ {value: {name: 'Item9'}},
120
+ {value: {name: 'Item10'}},
119
121
  ]
120
122
  }
121
123
  ,
122
124
  {
123
125
  value: {name: 'Sub-category4'},
124
126
  children: [
125
- {value: {name: 'Item23'}}
127
+ {value: {name: 'Item11'}},
128
+ {value: {name: 'Item12'}},
126
129
  ]
127
130
  }
128
131
  ,
129
132
  {
130
133
  value: {name: 'Sub-category5'},
131
134
  children: [
132
- {value: {name: 'Item24'}}
135
+ {value: {name: 'Item13'}},
136
+ {value: {name: 'Item14'}},
133
137
  ]
134
138
  }
135
139
  ,
136
140
  {
137
141
  value: {name: 'Sub-category6'},
138
142
  children: [
139
- {value: {name: 'Item25'}}
143
+ {value: {name: 'Item15'}},
144
+ {value: {name: 'Item16'}},
140
145
  ]
141
146
  }
142
147
  ]
@@ -145,10 +150,10 @@ let options2 = [
145
150
  value: {name: 'Category2', border: 'green'},
146
151
  children: [
147
152
  {
148
- value: {name: 'Item8'}
153
+ value: {name: 'Item1'}
149
154
  },
150
155
  {
151
- value: {name: 'Item9'}
156
+ value: {name: 'Item2'}
152
157
  }
153
158
  ]
154
159
  },
@@ -156,10 +161,10 @@ let options2 = [
156
161
  value: {name: 'Category3', border: 'yellow'},
157
162
  children: [
158
163
  {
159
- value: {name: 'Item10'}
164
+ value: {name: 'Item3'}
160
165
  },
161
166
  {
162
- value: {name: 'Item11'}
167
+ value: {name: 'Item4'}
163
168
  }
164
169
  ]
165
170
  },
@@ -223,10 +228,13 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
223
228
 
224
229
  <Markup.ReactMarkupCodePreview>{`
225
230
  <TreeSelect
226
- options={this.state.options2}
227
- getLabel={'label'}
228
- getMultilevelArray={'items'}
229
- selectBranchWithChildren={true}
231
+ kind={'synchronous' | 'asynchronous'}
232
+ value={this.state.value}
233
+ getOptions={() => this.state.options}
234
+ getLabel={(item) => item.label}
235
+ getId={(item) => item.id}
236
+ allowMultiple
237
+ selectBranchWithChildren
230
238
  onChange={() => false}
231
239
  />
232
240
  `}
@@ -237,22 +245,18 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
237
245
  <div className='docs-page__content-row docs-page__content-row--no-margin'>
238
246
  <div className='form__row'>
239
247
  <TreeSelect
240
- value={[{name: 'Item1'}, {name: 'Item2'}]}
248
+ kind='synchronous'
249
+ value={[{name: 'Category1'}]}
241
250
  getOptions={() => options}
242
- kind={'synchronous'}
243
251
  getId={(item) => item.name}
244
252
  getLabel={(item) => item.name}
245
- getBackgroundColor={(item: any) => item.bgColor}
246
- selectBranchWithChildren={true}
253
+ selectBranchWithChildren
247
254
  allowMultiple
248
- fullWidth
249
- //singleLevelSearch
250
- required
251
- info={'Info Message'}
252
- error={'Error Message'}
253
- label={'TreeSelect Label'}
254
255
  searchPlaceholder='Search...'
255
- onChange={(e) => false}
256
+ info='Info Message'
257
+ error='Error Message'
258
+ label='TreeSelect Label'
259
+ getBackgroundColor={(item: any) => item.bgColor}
256
260
  valueTemplate={(item, Wrapper) => {
257
261
  return (
258
262
  <Wrapper backgroundColor={item.bgColor}>
@@ -260,6 +264,7 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
260
264
  </Wrapper>
261
265
  );
262
266
  }}
267
+ onChange={(e) => false}
263
268
  />
264
269
  </div>
265
270
  </div>
@@ -267,22 +272,18 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
267
272
 
268
273
  <Markup.ReactMarkupCode>{`
269
274
  <TreeSelect
270
- value={[{name: 'Item1'}, {name: 'Item2'}]}
275
+ kind='synchronous'
276
+ value={[{name: 'Item 1'}, {name: 'Item 2'}]}
271
277
  getOptions={() => options}
272
- kind={'synchronous'}
273
278
  getId={(item) => item.name}
274
279
  getLabel={(item) => item.name}
275
- getBackgroundColor={(item: any) => item.bgColor}
276
- selectBranchWithChildren={true}
280
+ selectBranchWithChildren
277
281
  allowMultiple
278
- fullWidth
279
- singleLevelSearch
280
- required
282
+ searchPlaceholder='Search...'
281
283
  info={'Info Message'}
282
284
  error={'Error Message'}
283
285
  label={'TreeSelect Label'}
284
- searchPlaceholder='Search...'
285
- onChange={(e) => false}
286
+ getBackgroundColor={(item: any) => item.bgColor}
286
287
  valueTemplate={(item, Wrapper) => {
287
288
  return (
288
289
  <Wrapper backgroundColor={item.bgColor}>
@@ -290,6 +291,7 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
290
291
  </Wrapper>
291
292
  );
292
293
  }}
294
+ onChange={(e) => false}
293
295
  />
294
296
  `}</Markup.ReactMarkupCode>
295
297
 
@@ -302,16 +304,18 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
302
304
  <div className='form__row'>
303
305
  <TreeSelect
304
306
  kind="asynchronous"
305
- searchOptions={searchOptions}
306
307
  value={this.state.value}
308
+ getLabel={({display_name}) => display_name}
309
+ getId={({display_name}) => display_name}
310
+ selectBranchWithChildren
311
+ allowMultiple
312
+ searchOptions={searchOptions}
313
+ info='Info Message'
314
+ error='Error Message'
315
+ label='TreeSelect Label'
307
316
  onChange={(val) => {
308
317
  this.setState({value: val});
309
318
  }}
310
- getLabel={({display_name}) => display_name
311
- }
312
- getId={({qcode}) => qcode.display_name}
313
- selectBranchWithChildren={false}
314
- allowMultiple={true}
315
319
  />
316
320
  </div>
317
321
  </div>
@@ -320,36 +324,37 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
320
324
  <Markup.ReactMarkupCode>{`
321
325
  <TreeSelect
322
326
  kind="asynchronous"
323
- searchOptions={searchOptions}
324
327
  value={this.state.value}
328
+ getLabel={({display_name}) => display_name}
329
+ getId={({qcode}) => qcode.display_name}
330
+ selectBranchWithChildren
331
+ allowMultiple
332
+ searchOptions={searchOptions}
325
333
  onChange={(val) => {
326
334
  this.setState({value: val});
327
335
  }}
328
- getLabel={({name}) => name}
329
- getId={({qcode}) => qcode}
330
- selectBranchWithChildren={false}
331
- optionTemplate={(item) => <span style={{color: 'blue'}}>{item.name}</span>}
332
- allowMultiple={true}
333
336
  />
334
337
  `}</Markup.ReactMarkupCode>
335
338
 
336
339
  </Markup.ReactMarkup>
337
340
 
338
- <p className='docs-page__paragraph'>TreeSelect with custom template.</p>
341
+ <p className='docs-page__paragraph'>SingleSelect mode with custom template.</p>
339
342
  <Markup.ReactMarkup>
340
343
  <Markup.ReactMarkupPreview>
341
344
  <div className='docs-page__content-row docs-page__content-row--no-margin'>
342
345
  <div className='form__row'>
343
346
  <TreeSelect
347
+ kind='synchronous'
348
+ value={[]}
344
349
  getOptions={() => options2}
345
- kind={'synchronous'}
346
- getId={(item) => item.name}
347
350
  getLabel={(item) => item.name}
348
- getBackgroundColor={(item) => item.bgColor}
351
+ getId={(item) => item.name}
349
352
  getBorderColor={(item) => item.border}
353
+ selectBranchWithChildren
350
354
  placeholder='Select one'
351
- selectBranchWithChildren={true}
352
- onChange={(e) => false}
355
+ info='Info Message'
356
+ error='Error Message'
357
+ label='TreeSelect Label'
353
358
  optionTemplate={(item: any) => {
354
359
  return <div>Label: {item.name}</div>
355
360
  }}
@@ -358,6 +363,7 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
358
363
  <span>{item.name}</span>
359
364
  </Wrapper>
360
365
  }}
366
+ onChange={(e) => false}
361
367
  />
362
368
  </div>
363
369
  </div>
@@ -365,15 +371,15 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
365
371
 
366
372
  <Markup.ReactMarkupCode>{`
367
373
  <TreeSelect
374
+ kind='synchronous'
375
+ value={[{name: 'Item 1'}]}
368
376
  getOptions={() => options2}
369
- kind={'synchronous'}
370
- getId={(item) => item.name}
371
377
  getLabel={(item) => item.name}
378
+ getId={(item) => item.name}
372
379
  getBackgroundColor={(item) => item.bgColor}
373
380
  getBorderColor={(item) => item.border}
381
+ selectBranchWithChildren
374
382
  placeholder='Select one'
375
- selectBranchWithChildren={true}
376
- onChange={(e) => false}
377
383
  optionTemplate={(item: any) => {
378
384
  return <div>Label: {item.name}</div>
379
385
  }}
@@ -382,6 +388,7 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
382
388
  <span>{item.name}</span>
383
389
  </Wrapper>
384
390
  }}
391
+ onChange={(e) => false}
385
392
  />
386
393
  `}</Markup.ReactMarkupCode>
387
394
 
@@ -408,13 +415,13 @@ export class TreeSelectDocs extends React.Component<{}, IState> {
408
415
  <Prop name='optionTemplate' isRequired={false} type='Function(item)' default='/' description='Function that gets the option and returns the content for it.'/>
409
416
  <Prop name='searchOptions' isRequired={false} type='Function' default='/' description='The function will be called when a search is initiated from UI in asynchronous mode.'/>
410
417
  <Prop name='onChange' isRequired={true} type='Function' default='/' description='Callback to invoke when value changes.'/>
411
- <Prop name='label' isRequired={false} type='string' default='/' description='Input label'/>
412
- <Prop name='info' isRequired={false} type='string' default='/' description='Hint text'/>
413
- <Prop name='error' isRequired={false} type='string' default='/' description='Error text'/>
414
- <Prop name='inlineLabel' isRequired={false} type='boolean' default='false' description='Position labels as inline'/>
415
- <Prop name='required' isRequired={false} type='boolean' default='false' description='Mark field as required'/>
416
- <Prop name='disabled' isRequired={false} type='boolean' default='false' description='Mark field as disabled'/>
417
- <Prop name='invalid' isRequired={false} type='boolean' default='false' description='Mark field as invalid'/>
418
+ <Prop name='label' isRequired={false} type='string' default='/' description='Label of component.' />
419
+ <Prop name='inlineLabel' isRequired={false} type='boolean' default='false' description='Position labels as inline.' />
420
+ <Prop name='tabindex' isRequired={false} type='number' default='/' description='Indicates an element can be focused on, and determines how that focus is handled.'/>
421
+ <Prop name='info' isRequired={false} type='string' default='/' description='Info message of component.' />
422
+ <Prop name='error' isRequired={false} type='string' default='/' description='Error message of component.' />
423
+ <Prop name='required' isRequired={false} type='boolean' default='false' description='Mark field as required.' />
424
+ <Prop name='disabled' isRequired={false} type='boolean' default='false' description='Mark field as disabled.' />
418
425
  </PropsList>
419
426
 
420
427
  <p className='docs-page__paragraph'>synchronous:</p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superdesk-ui-framework",
3
- "version": "3.0.35",
3
+ "version": "3.0.38",
4
4
  "license": "AGPL-3.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,23 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { LocaleSettings, CalendarProps } from '@superdesk/primereact/calendar';
3
+ import { IInputWrapper } from './Form/InputWrapper';
3
4
  export type DatePickerLocaleSettings = Omit<LocaleSettings, 'today' | 'clear'>;
4
- interface IDatePickerBase {
5
+ interface IDatePickerBase extends IInputWrapper {
5
6
  dateFormat: string;
6
7
  headerButtonBar?: Array<{
7
8
  days: number;
8
9
  label: string;
9
10
  }>;
10
11
  locale?: DatePickerLocaleSettings;
11
- disabled?: boolean;
12
- inlineLabel?: boolean;
13
- required?: boolean;
14
- fullWidth?: boolean;
15
- invalid?: boolean;
16
- labelHidden?: boolean;
17
- tabindex?: number;
18
- label?: string;
19
- info?: string;
20
- error?: string;
21
12
  }
22
13
  interface IDatePicker extends IDatePickerBase {
23
14
  value: Date | null;
@@ -26,7 +17,6 @@ interface IDatePicker extends IDatePickerBase {
26
17
  interface IState {
27
18
  value: CalendarProps['value'];
28
19
  valid: boolean;
29
- invalid: boolean;
30
20
  }
31
21
  export declare class DatePicker extends React.PureComponent<IDatePicker, IState> {
32
22
  private instance;
@@ -56,9 +56,9 @@ exports.DatePickerISO = exports.DatePicker = void 0;
56
56
  var React = __importStar(require("react"));
57
57
  var addDays_1 = __importDefault(require("date-fns/addDays"));
58
58
  var format_1 = __importDefault(require("date-fns/format"));
59
+ var moment_1 = __importDefault(require("moment"));
59
60
  var calendar_1 = require("@superdesk/primereact/calendar");
60
61
  var lodash_1 = require("lodash");
61
- // import classNames from 'classnames';
62
62
  var react_id_generator_1 = __importDefault(require("react-id-generator"));
63
63
  var Form_1 = require("./Form");
64
64
  var internalPrimereactClassnames = {
@@ -86,14 +86,11 @@ function parseToPrimeReactCalendarFormat(value) {
86
86
  var DatePicker = /** @class */ (function (_super) {
87
87
  __extends(DatePicker, _super);
88
88
  function DatePicker(props) {
89
- var _this = this;
90
- var _a;
91
- _this = _super.call(this, props) || this;
89
+ var _this = _super.call(this, props) || this;
92
90
  _this.htmlId = (0, react_id_generator_1.default)();
93
91
  _this.state = {
94
92
  value: parseToPrimeReactCalendarFormat(_this.props.value),
95
93
  valid: true,
96
- invalid: (_a = _this.props.invalid) !== null && _a !== void 0 ? _a : false,
97
94
  };
98
95
  _this.hidePopupOnScroll = (0, lodash_1.throttle)(function () {
99
96
  if (_this.instance != null
@@ -131,7 +128,15 @@ var DatePicker = /** @class */ (function (_super) {
131
128
  if (this.props.locale != null) {
132
129
  locale = __assign(__assign({}, this.props.locale), { today: 'today', clear: 'clear' });
133
130
  }
134
- return (React.createElement(Form_1.InputWrapper, { label: this.props.label, error: this.props.error, required: this.props.required, disabled: this.props.disabled, invalid: this.state.invalid, info: this.props.info, inlineLabel: this.props.inlineLabel, labelHidden: this.props.labelHidden, fullWidth: this.props.fullWidth, htmlId: this.htmlId, tabindex: this.props.tabindex },
131
+ if (this.props.preview) {
132
+ return (
133
+ // We have to do type assertion here because we wrap primereact's component using
134
+ // a narrower interface i.e. primereact supports an array of dates or a single date,
135
+ // and our wrapped component will only ever use a single date.
136
+ React.createElement("div", null,
137
+ React.createElement("span", null, (0, moment_1.default)(this.state.value).format(this.props.dateFormat))));
138
+ }
139
+ return (React.createElement(Form_1.InputWrapper, { label: this.props.label, error: this.props.error, required: this.props.required, disabled: this.props.disabled, info: this.props.info, inlineLabel: this.props.inlineLabel, labelHidden: this.props.labelHidden, htmlId: this.htmlId, tabindex: this.props.tabindex },
135
140
  React.createElement(calendar_1.Calendar, { inputId: this.htmlId, ariaLabelledBy: this.htmlId + 'label', ref: function (ref) {
136
141
  _this.instance = ref;
137
142
  }, value: this.state.value === null ? undefined : this.state.value, onChange: function (event) {
@@ -148,7 +153,8 @@ var DatePicker = /** @class */ (function (_super) {
148
153
  var label = _a.label, days = _a.days;
149
154
  return (React.createElement("button", { key: i, className: "btn btn--small", onClick: function () {
150
155
  _this.props.onChange((0, addDays_1.default)(new Date(), days));
151
- if (_this.instance != null && typeof _this.instance.hideOverlay === 'function') {
156
+ if (_this.instance != null
157
+ && typeof _this.instance.hideOverlay === 'function') {
152
158
  _this.instance.hideOverlay();
153
159
  }
154
160
  } }, label));
@@ -181,7 +187,7 @@ var DatePickerISO = /** @class */ (function (_super) {
181
187
  else {
182
188
  _this.props.onChange((0, format_1.default)(value, 'yyyy-MM-dd'));
183
189
  }
184
- }, disabled: this.props.disabled, headerButtonBar: this.props.headerButtonBar, dateFormat: this.props.dateFormat, locale: this.props.locale, inlineLabel: this.props.inlineLabel, required: this.props.required, fullWidth: this.props.fullWidth, invalid: this.props.invalid, labelHidden: this.props.labelHidden, tabindex: this.props.tabindex, label: this.props.label, info: this.props.info, error: this.props.error }));
190
+ }, disabled: this.props.disabled, preview: this.props.preview, headerButtonBar: this.props.headerButtonBar, dateFormat: this.props.dateFormat, locale: this.props.locale, inlineLabel: this.props.inlineLabel, required: this.props.required, fullWidth: this.props.fullWidth, labelHidden: this.props.labelHidden, tabindex: this.props.tabindex, label: this.props.label, info: this.props.info, error: this.props.error }));
185
191
  };
186
192
  return DatePickerISO;
187
193
  }(React.PureComponent));
@@ -1,18 +1,9 @@
1
1
  import * as React from 'react';
2
- interface IProps {
2
+ import { IInputWrapper } from './Form/InputWrapper';
3
+ interface IProps extends IInputWrapper {
3
4
  hours?: number;
4
5
  minutes?: number;
5
6
  seconds?: number;
6
- disabled?: boolean;
7
- inlineLabel?: boolean;
8
- required?: boolean;
9
- fullWidth?: boolean;
10
- invalid?: boolean;
11
- labelHidden?: boolean;
12
- tabindex?: number;
13
- label?: string;
14
- info?: string;
15
- error?: string;
16
7
  onChange(e: number): void;
17
8
  }
18
9
  interface IState {
@@ -43,7 +43,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
44
  exports.getDurationString = exports.DurationInput = void 0;
45
45
  var React = __importStar(require("react"));
46
- var classnames_1 = __importDefault(require("classnames"));
47
46
  var moment_1 = __importDefault(require("moment"));
48
47
  var react_id_generator_1 = __importDefault(require("react-id-generator"));
49
48
  var Form_1 = require("./Form");
@@ -301,9 +300,20 @@ var DurationInput = /** @class */ (function (_super) {
301
300
  };
302
301
  DurationInput.prototype.render = function () {
303
302
  var _this = this;
304
- var InputClasses = (0, classnames_1.default)('sd-input__duration-input');
305
- return (React.createElement(Form_1.InputWrapper, { label: this.props.label, error: this.props.error, required: this.props.required, disabled: this.props.disabled, invalid: this.props.invalid, info: this.props.info, inlineLabel: this.props.inlineLabel, labelHidden: this.props.labelHidden, fullWidth: this.props.fullWidth, htmlId: this.htmlId, tabindex: this.props.tabindex },
306
- React.createElement("div", { className: InputClasses },
303
+ if (this.props.preview) {
304
+ return (React.createElement("div", { className: 'sd-input__duration-input-preview' },
305
+ React.createElement("div", null,
306
+ React.createElement("span", { className: 'duration-input-preview' }, this.state.hours),
307
+ React.createElement("span", { className: 'sd-input__suffix' }, "h")),
308
+ React.createElement("div", null,
309
+ React.createElement("span", { className: 'duration-input-preview' }, this.state.minutes),
310
+ React.createElement("span", { className: 'sd-input__suffix' }, "m")),
311
+ React.createElement("div", null,
312
+ React.createElement("span", { className: 'duration-input-preview' }, this.state.seconds),
313
+ React.createElement("span", { className: 'sd-input__suffix' }, "s"))));
314
+ }
315
+ return (React.createElement(Form_1.InputWrapper, { label: this.props.label, error: this.props.error, required: this.props.required, disabled: this.props.disabled, info: this.props.info, inlineLabel: this.props.inlineLabel, labelHidden: this.props.labelHidden, htmlId: this.htmlId, tabindex: this.props.tabindex },
316
+ React.createElement("div", { className: 'sd-input__duration-input' },
307
317
  React.createElement("input", { className: "duration-input ".concat(this.state.blink === 'hour' ? 'blink_me' : ''), type: 'text', id: 'hours', autoComplete: "off", max: 99, min: 0, ref: this.hourRef, value: this.state.hours, disabled: this.props.disabled, onKeyDown: function (event) { return _this.handleKeyDown(event); }, onKeyUp: function (event) { return _this.handleFocusOnKeyUp(event, _this.minuteRef.current); }, onChange: function (event) { _this.handleChange(event, 'hours'); }, onBlur: function (event) { return _this.setState({ hours: _this.zeroPad(event.target.value) }); }, onKeyPress: function (event) {
308
318
  if (!/[0-9]/.test(event.key)) {
309
319
  event.preventDefault();
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  interface IPropsBase {
3
- label?: string;
3
+ label: string;
4
4
  maxLength?: number;
5
5
  info?: string;
6
6
  inlineLabel?: boolean;
@@ -1,19 +1,25 @@
1
1
  import * as React from 'react';
2
- interface IPropsBase {
3
- label?: string;
4
- children: React.ReactNode;
5
- maxLength?: number;
2
+ export interface IInputCommon {
3
+ label: string;
6
4
  info?: string;
7
5
  error?: string;
8
6
  required?: boolean;
9
7
  disabled?: boolean;
10
- invalid?: boolean;
8
+ readonly?: boolean;
9
+ preview?: boolean;
11
10
  inlineLabel?: boolean;
12
11
  labelHidden?: boolean;
13
12
  tabindex?: number;
14
13
  fullWidth?: boolean;
15
14
  boxedStyle?: boolean;
16
15
  boxedLable?: boolean;
16
+ }
17
+ export interface IInputWrapper extends IInputCommon {
18
+ invalid?: boolean;
19
+ }
20
+ interface IPropsBase extends IInputWrapper {
21
+ children: React.ReactNode;
22
+ maxLength?: number;
17
23
  value?: string | number;
18
24
  htmlId?: string;
19
25
  size?: 'medium' | 'large' | 'x-large';
@@ -78,18 +78,15 @@ var InputWrapper = /** @class */ (function (_super) {
78
78
  React.createElement("label", { className: labelClasses, htmlFor: this.props.htmlId, id: this.props.htmlId + 'label', tabIndex: this.props.tabindex === undefined ? undefined : -1 }, this.props.label),
79
79
  React.createElement("div", { className: "sd-input__input-container" }, this.props.children),
80
80
  this.props.maxLength
81
- ? React.createElement("div", { className: 'sd-input__char-count' }, (_b = this.props.value) === null || _b === void 0 ? void 0 :
81
+ && React.createElement("div", { className: 'sd-input__char-count' }, (_b = this.props.value) === null || _b === void 0 ? void 0 :
82
82
  _b.toString().length,
83
83
  " / ",
84
- this.props.maxLength)
85
- : null,
84
+ this.props.maxLength),
86
85
  React.createElement("div", { className: 'sd-input__message-box' },
87
- this.props.info && !this.props.invalid && !this.props.invalid
88
- ? React.createElement("div", { className: 'sd-input__hint' }, this.props.info)
89
- : null,
90
- this.props.invalid || this.props.invalid
91
- ? React.createElement("div", { className: 'sd-input__message' }, this.props.error)
92
- : null)));
86
+ this.props.info && !this.props.invalid
87
+ && React.createElement("div", { className: 'sd-input__hint' }, this.props.info),
88
+ this.props.invalid
89
+ && React.createElement("div", { className: 'sd-input__message' }, this.props.error))));
93
90
  };
94
91
  return InputWrapper;
95
92
  }(React.Component));