@imposium-hub/components 2.5.10-11 → 2.5.10-12

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 (120) hide show
  1. package/dist/cjs/components/assets/AssetsTableGlobalCell.js +2 -1
  2. package/dist/cjs/components/assets/AssetsTableGlobalCell.js.map +1 -1
  3. package/dist/cjs/components/card/Card.d.ts +1 -0
  4. package/dist/cjs/components/card/Card.js +17 -4
  5. package/dist/cjs/components/card/Card.js.map +1 -1
  6. package/dist/cjs/components/data-table/Paginator.js +51 -7
  7. package/dist/cjs/components/data-table/Paginator.js.map +1 -1
  8. package/dist/cjs/components/smpte-field/SMPTEField.d.ts +2 -1
  9. package/dist/cjs/components/smpte-field/SMPTEField.js +9 -3
  10. package/dist/cjs/components/smpte-field/SMPTEField.js.map +1 -1
  11. package/dist/cjs/components/tabs/Tabs.d.ts +1 -4
  12. package/dist/cjs/components/tabs/Tabs.stories.d.ts +1 -3
  13. package/dist/cjs/index.d.ts +3 -1
  14. package/dist/cjs/index.js +6 -2
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/redux/actions/asset-list.js +34 -42
  17. package/dist/cjs/redux/actions/asset-list.js.map +1 -1
  18. package/dist/cjs/services/API.d.ts +3 -0
  19. package/dist/cjs/services/API.js +9 -0
  20. package/dist/cjs/services/API.js.map +1 -1
  21. package/dist/esm/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  22. package/dist/esm/components/anchor-field/AnchorField.d.ts +1 -1
  23. package/dist/esm/components/assets/AssetsTableGlobalCell.js +2 -1
  24. package/dist/esm/components/assets/AssetsTableGlobalCell.js.map +1 -1
  25. package/dist/esm/components/assets/AssetsTablePreviewCell.d.ts +1 -1
  26. package/dist/esm/components/assets/FontAssetPreview.d.ts +1 -1
  27. package/dist/esm/components/assets/StoryTableTotalRendersCell.d.ts +1 -2
  28. package/dist/esm/components/button/Button.d.ts +1 -1
  29. package/dist/esm/components/button/Button.stories.d.ts +5 -6
  30. package/dist/esm/components/button-group-field/ButtonGroupField.stories.d.ts +1 -2
  31. package/dist/esm/components/button-menu/ButtonMenu.d.ts +2 -2
  32. package/dist/esm/components/button-menu/ButtonMenu.stories.d.ts +1 -2
  33. package/dist/esm/components/button-menu/ButtonMenuItem.d.ts +1 -1
  34. package/dist/esm/components/card/Card.d.ts +5 -4
  35. package/dist/esm/components/card/Card.js +16 -4
  36. package/dist/esm/components/card/Card.js.map +1 -1
  37. package/dist/esm/components/card/Card.stories.d.ts +1 -2
  38. package/dist/esm/components/checkbox-field/CheckboxField.d.ts +1 -1
  39. package/dist/esm/components/checkbox-field/CheckboxField.stories.d.ts +1 -2
  40. package/dist/esm/components/color-field/ColorField.d.ts +1 -1
  41. package/dist/esm/components/color-field/ColorFiled.stories.d.ts +1 -2
  42. package/dist/esm/components/compositions/TextLayer.d.ts +1 -1
  43. package/dist/esm/components/confirm-modal/ConfirmModal.d.ts +1 -2
  44. package/dist/esm/components/context-menu/AnimateComponent.d.ts +1 -2
  45. package/dist/esm/components/context-menu/ContextMenu.d.ts +1 -2
  46. package/dist/esm/components/context-menu/ContextMenuItem.d.ts +1 -2
  47. package/dist/esm/components/context-menu/ContextMenuTrigger.d.ts +1 -2
  48. package/dist/esm/components/context-menu/SubMenu.d.ts +1 -2
  49. package/dist/esm/components/controlled-list/ControlledList.d.ts +2 -2
  50. package/dist/esm/components/controlled-list/ControlledList.stories.d.ts +1 -2
  51. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
  52. package/dist/esm/components/data-table/Paginator.js +74 -44
  53. package/dist/esm/components/data-table/Paginator.js.map +1 -1
  54. package/dist/esm/components/determinate-loader/DeterminateLoader.stories.d.ts +3 -3
  55. package/dist/esm/components/dropdown/Dropdown.d.ts +1 -1
  56. package/dist/esm/components/dropdown/dropdown.stories.d.ts +1 -1
  57. package/dist/esm/components/field-wrapper/FieldWrapper.d.ts +2 -2
  58. package/dist/esm/components/field-wrapper/FieldWrapper.stories.d.ts +1 -2
  59. package/dist/esm/components/font-picker/FontPicker.d.ts +1 -1
  60. package/dist/esm/components/h-rule/HRule.d.ts +1 -2
  61. package/dist/esm/components/h-rule/HRule.stories.d.ts +2 -3
  62. package/dist/esm/components/list-field/ListField.d.ts +1 -1
  63. package/dist/esm/components/list-field/ListField.stories.d.ts +1 -2
  64. package/dist/esm/components/log-viewer/LogViewer.d.ts +1 -1
  65. package/dist/esm/components/media-variable-field/MediaVariableField.d.ts +1 -1
  66. package/dist/esm/components/modal/Modal.d.ts +1 -1
  67. package/dist/esm/components/modal/Modal.stories.d.ts +1 -2
  68. package/dist/esm/components/number-field/NumberField.d.ts +1 -1
  69. package/dist/esm/components/number-field/NumberField.stories.d.ts +1 -2
  70. package/dist/esm/components/players/AudioPlayer.d.ts +1 -1
  71. package/dist/esm/components/players/AudioPreview.d.ts +1 -1
  72. package/dist/esm/components/players/ImagePlayer.d.ts +1 -1
  73. package/dist/esm/components/players/ImagePreview.d.ts +1 -1
  74. package/dist/esm/components/players/ImageSequencePlayer.d.ts +1 -1
  75. package/dist/esm/components/players/TemplatePlayer.d.ts +1 -1
  76. package/dist/esm/components/players/VideoPlayer.d.ts +1 -1
  77. package/dist/esm/components/players/VideoPreview.d.ts +1 -1
  78. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +3 -3
  79. package/dist/esm/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
  80. package/dist/esm/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
  81. package/dist/esm/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
  82. package/dist/esm/components/section/Section.d.ts +1 -2
  83. package/dist/esm/components/section/Section.stories.d.ts +2 -3
  84. package/dist/esm/components/select-field/SelectField.d.ts +1 -1
  85. package/dist/esm/components/select-field/SelectField.stories.d.ts +1 -2
  86. package/dist/esm/components/shortcut-menu/ShortcutMenu.stories.d.ts +1 -1
  87. package/dist/esm/components/slider-field/SliderField.d.ts +1 -1
  88. package/dist/esm/components/slider-field/SliderField.stories.d.ts +1 -2
  89. package/dist/esm/components/smpte-field/SMPTEField.d.ts +3 -2
  90. package/dist/esm/components/smpte-field/SMPTEField.js +9 -3
  91. package/dist/esm/components/smpte-field/SMPTEField.js.map +1 -1
  92. package/dist/esm/components/tabs/Tabs.stories.d.ts +1 -1
  93. package/dist/esm/components/text-area-field/TextAreaField.d.ts +1 -1
  94. package/dist/esm/components/text-area-field/TextAreaField.stories.d.ts +1 -2
  95. package/dist/esm/components/text-field/TextField.d.ts +1 -1
  96. package/dist/esm/components/text-field/TextField.stories.d.ts +1 -2
  97. package/dist/esm/constants/icons.d.ts +73 -74
  98. package/dist/esm/index.d.ts +3 -1
  99. package/dist/esm/index.js +3 -1
  100. package/dist/esm/index.js.map +1 -1
  101. package/dist/esm/redux/actions/asset-list.js +34 -42
  102. package/dist/esm/redux/actions/asset-list.js.map +1 -1
  103. package/dist/esm/services/API.d.ts +3 -0
  104. package/dist/esm/services/API.js +9 -0
  105. package/dist/esm/services/API.js.map +1 -1
  106. package/dist/styles.css +13 -2
  107. package/dist/styles.less +16 -3
  108. package/less/components/data-table.less +4 -0
  109. package/less/components/form-field.less +7 -3
  110. package/less/components/tag.less +5 -0
  111. package/package.json +1 -1
  112. package/src/components/assets/AssetsTableAssetIdCell.tsx +65 -0
  113. package/src/components/assets/AssetsTableAssetIdFilter.tsx +40 -0
  114. package/src/components/assets/AssetsTableGlobalCell.tsx +11 -1
  115. package/src/components/card/Card.tsx +27 -13
  116. package/src/components/data-table/Paginator.tsx +140 -93
  117. package/src/components/smpte-field/SMPTEField.tsx +8 -3
  118. package/src/index.ts +4 -0
  119. package/src/redux/actions/asset-list.ts +37 -44
  120. package/src/services/API.ts +15 -0
package/dist/styles.less CHANGED
@@ -1246,6 +1246,10 @@ body{
1246
1246
  border-top: 0;
1247
1247
  background-color: darken(@background, 1%);
1248
1248
 
1249
+ input[type=number] {
1250
+ -moz-appearance: textfield;
1251
+ }
1252
+
1249
1253
  .paginator-input {
1250
1254
  .inputMixin;
1251
1255
  width: 60px;
@@ -1375,6 +1379,10 @@ body{
1375
1379
  padding:4px;
1376
1380
  }
1377
1381
 
1382
+ input[type=number] {
1383
+ -moz-appearance: textfield;
1384
+ }
1385
+
1378
1386
  textarea{
1379
1387
  height:@inputHeight * 3;
1380
1388
  resize:none;
@@ -1476,15 +1484,15 @@ body{
1476
1484
  padding-top: 1px;
1477
1485
  box-sizing: border-box;
1478
1486
  color:darken(@textDefault, 30%);
1479
-
1487
+ background: #373737;
1480
1488
  &:hover{
1481
1489
  background:darken(@inputBackground, 5%);
1482
1490
  }
1483
1491
 
1484
1492
  &.active{
1485
1493
  cursor:auto;
1486
- background:lighten(@inputBackground, 10%);
1487
- color:@textDefault;
1494
+ background:unset;
1495
+ color:unset;
1488
1496
  }
1489
1497
 
1490
1498
  &.disabled svg {
@@ -2936,6 +2944,11 @@ body{
2936
2944
  }
2937
2945
  }
2938
2946
  }
2947
+
2948
+ .imposium-asset-id {
2949
+ cursor: pointer;
2950
+ user-select: none;
2951
+ }
2939
2952
  h1, h2, h3, h4, h5 {
2940
2953
  font-family: 'Oswald', sans-serif;
2941
2954
  color:@headerTextDefault;
@@ -207,6 +207,10 @@
207
207
  border-top: 0;
208
208
  background-color: darken(@background, 1%);
209
209
 
210
+ input[type=number] {
211
+ -moz-appearance: textfield;
212
+ }
213
+
210
214
  .paginator-input {
211
215
  .inputMixin;
212
216
  width: 60px;
@@ -55,6 +55,10 @@
55
55
  padding:4px;
56
56
  }
57
57
 
58
+ input[type=number] {
59
+ -moz-appearance: textfield;
60
+ }
61
+
58
62
  textarea{
59
63
  height:@inputHeight * 3;
60
64
  resize:none;
@@ -156,15 +160,15 @@
156
160
  padding-top: 1px;
157
161
  box-sizing: border-box;
158
162
  color:darken(@textDefault, 30%);
159
-
163
+ background: #373737;
160
164
  &:hover{
161
165
  background:darken(@inputBackground, 5%);
162
166
  }
163
167
 
164
168
  &.active{
165
169
  cursor:auto;
166
- background:lighten(@inputBackground, 10%);
167
- color:@textDefault;
170
+ background:unset;
171
+ color:unset;
168
172
  }
169
173
 
170
174
  &.disabled svg {
@@ -40,4 +40,9 @@
40
40
  cursor: pointer;
41
41
  }
42
42
  }
43
+ }
44
+
45
+ .imposium-asset-id {
46
+ cursor: pointer;
47
+ user-select: none;
43
48
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "2.5.10-11",
3
+ "version": "2.5.10-12",
4
4
  "description": "React & Typescript component / asset library for Imposium front-ends",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -0,0 +1,65 @@
1
+ import * as React from 'react';
2
+ import { copying } from '../../constants/copy';
3
+ import { updateFilters } from '../../redux/actions/asset-filters';
4
+ import { connect } from 'react-redux';
5
+ import { bindActionCreators } from 'redux';
6
+
7
+ interface IAssetsTableAssetIdCellProps {
8
+ cell: any;
9
+ onNotification?: (e) => void;
10
+ onError?: (e) => void;
11
+ }
12
+
13
+ const AssetsTableAssetIdCell: React.FC<IAssetsTableAssetIdCellProps> = (
14
+ props: IAssetsTableAssetIdCellProps
15
+ ) => {
16
+ const {
17
+ onNotification,
18
+ onError,
19
+ cell: {
20
+ row: {
21
+ original: { id }
22
+ }
23
+ }
24
+ } = props;
25
+ console.log('AssetsTableAssetIdCell');
26
+ console.log(id);
27
+
28
+ const copyToClipboard = (e) => {
29
+ navigator.clipboard.writeText(e.target.textContent).then(
30
+ () => {
31
+ if (onNotification) {
32
+ onNotification(`${copying.copied}`);
33
+ }
34
+ },
35
+ () => {
36
+ if (onError) {
37
+ onError(`${copying.error}`);
38
+ }
39
+ }
40
+ );
41
+ };
42
+
43
+ return (
44
+ <div
45
+ key={id}
46
+ className='imposium-asset-id'
47
+ onClick={(e) => copyToClipboard(e)}>
48
+ {id}
49
+ </div>
50
+ );
51
+ };
52
+
53
+ const mapDispatchToProps = (dispatch): any => {
54
+ return bindActionCreators({ updateFilters }, dispatch);
55
+ };
56
+
57
+ const mapStateToProps = (state): any => {
58
+ return { assetFilters: state.assetFilters };
59
+ };
60
+
61
+ const AssetsTableAssetIdCellMemoized = connect(
62
+ mapStateToProps,
63
+ mapDispatchToProps
64
+ )(React.memo(AssetsTableAssetIdCell));
65
+ export default AssetsTableAssetIdCellMemoized;
@@ -0,0 +1,40 @@
1
+ import * as React from 'react';
2
+ import TextField from '../text-field/TextField';
3
+ import { updateFilters } from '../../redux/actions/asset-filters';
4
+ import { connect } from 'react-redux';
5
+ import { bindActionCreators } from 'redux';
6
+
7
+ interface IAssetsTableAssetIdFilterProps {
8
+ assetFilters: any;
9
+ updateFilters: (filters: any) => any;
10
+ }
11
+
12
+ class AssetsTableAssetIdFilter extends React.PureComponent<IAssetsTableAssetIdFilterProps> {
13
+ public render = (): JSX.Element => {
14
+ const { assetFilters } = this.props;
15
+
16
+ return (
17
+ <TextField
18
+ className='asset-id'
19
+ submittable
20
+ submittableType='search'
21
+ value={assetFilters.id}
22
+ doSubmit={(n) => this.props.updateFilters({ id: n })}
23
+ />
24
+ );
25
+ };
26
+ }
27
+
28
+ const mapDispatchToProps = (dispatch): any => {
29
+ return bindActionCreators({ updateFilters }, dispatch);
30
+ };
31
+
32
+ const mapStateToProps = (state): any => {
33
+ return { assetFilters: state.assetFilters };
34
+ };
35
+
36
+ const AssetsTableAssetIdFilterMemoized = connect(
37
+ mapStateToProps,
38
+ mapDispatchToProps
39
+ )(React.memo(AssetsTableAssetIdFilter));
40
+ export default AssetsTableAssetIdFilterMemoized;
@@ -6,8 +6,18 @@ interface IAssetsTableGlobalCell {
6
6
  }
7
7
 
8
8
  const AssetsTableGlobalCell: React.FC<IAssetsTableGlobalCell> = (p: IAssetsTableGlobalCell) => {
9
+ const {
10
+ cell: {
11
+ row: {
12
+ original: { story_id }
13
+ }
14
+ }
15
+ } = p;
16
+
9
17
  return (
10
- <div className='asset-global-cell'>{p.cell.row.original.story_id ? null : ICON_GLOBE}</div>
18
+ <div className='asset-global-cell'>
19
+ {story_id || story_id === undefined ? null : ICON_GLOBE}
20
+ </div>
11
21
  );
12
22
  };
13
23
 
@@ -11,6 +11,7 @@ interface ICardProps {
11
11
  onOpen?: (e: any) => any;
12
12
  onClose?: (e: any) => any;
13
13
  onToggle?: (toggle: boolean) => any;
14
+ buttons?: any[];
14
15
  }
15
16
 
16
17
  interface ICardState {
@@ -97,9 +98,7 @@ class Card extends React.PureComponent<ICardProps, ICardState> {
97
98
 
98
99
  return (
99
100
  <div className={`card ${openClass} ${collapsableClass} ${styleClass}`}>
100
- <div
101
- className='card-header'
102
- onClick={this.evtHandlers.toggleOpen}>
101
+ <div className='card-header'>
103
102
  {this.renderTitle(styleClass)}
104
103
  {this.renderButtons()}
105
104
  </div>
@@ -109,21 +108,36 @@ class Card extends React.PureComponent<ICardProps, ICardState> {
109
108
  }
110
109
 
111
110
  public renderButtons() {
112
- const { collapsable } = this.props;
111
+ const { collapsable, buttons } = this.props;
113
112
  const { open } = this.state;
114
113
  const buttonIcon = open ? ICON_CARET_UP : ICON_CARET_DOWN;
115
114
 
115
+ let buttonArray: JSX.Element[];
116
+
117
+ const toggleBtn = (
118
+ <Button
119
+ key='toggleOpen'
120
+ style='subtle'
121
+ onClick={(e) => this.toggleOpen(e)}>
122
+ {buttonIcon}
123
+ </Button>
124
+ );
125
+
126
+ if (buttons && buttons.length > 0) {
127
+ buttonArray = buttons.map((button) => {
128
+ return button;
129
+ });
130
+ }
131
+
116
132
  if (collapsable) {
117
- return (
118
- <div className='header-buttons'>
119
- <Button
120
- style='subtle'
121
- onClick={this.evtHandlers.toggleOpen}>
122
- {buttonIcon}
123
- </Button>
124
- </div>
125
- );
133
+ if (buttonArray && buttonArray.length > 0) {
134
+ buttonArray.push(toggleBtn);
135
+ } else {
136
+ buttonArray = [toggleBtn];
137
+ }
126
138
  }
139
+
140
+ return <div className='header-buttons'>{buttonArray}</div>;
127
141
  }
128
142
  }
129
143
 
@@ -26,102 +26,149 @@ const Paginator: React.FC<any> = ({
26
26
  setPageSize,
27
27
  itemsPerPage,
28
28
  onItemsPerPage
29
- }) => (
30
- <section className='ip-table-pagination'>
31
- <span>
32
- <Button
33
- style='subtle'
34
- size='small'
35
- tooltip='Go to first page'
36
- disabled={!canPreviousPage}
37
- onClick={() => gotoPage(1, pageSize)}>
38
- {ICON_ANGLE_DOUBLE_LEFT}
39
- </Button>
40
- <Button
41
- style='subtle'
42
- size='small'
43
- tooltip='Go to previous page'
44
- disabled={!canPreviousPage}
45
- onClick={() => previousPage()}>
46
- {ICON_ANGLE_LEFT}
47
- </Button>
48
- <Button
49
- style='subtle'
50
- size='small'
51
- tooltip='Go to next page'
52
- disabled={!canNextPage}
53
- onClick={() => nextPage()}>
54
- {ICON_ANGLE_RIGHT}
55
- </Button>
56
- <Button
57
- style='subtle'
58
- size='small'
59
- tooltip='Go to last page'
60
- disabled={!canNextPage}
61
- onClick={() => gotoPage(pageCount, pageSize)}>
62
- {ICON_ANGLE_DOUBLE_RIGHT}
63
- </Button>
64
- &nbsp;&nbsp;
29
+ }) => {
30
+ const [getPageIndex, setPageIndex] = React.useState<number>(pageIndex);
31
+ const [getItemsPerPage, setItemsPerPage] = React.useState<number>(itemsPerPage);
32
+
33
+ React.useEffect(() => {
34
+ if (pageIndex !== getPageIndex) {
35
+ setPageIndex(pageIndex);
36
+ }
37
+ }, [pageIndex]);
38
+
39
+ const onItemsPerPageBlur = () => {
40
+ clearTimeout(textInputTimeout);
41
+ onItemsPerPage(getItemsPerPage);
42
+ };
43
+
44
+ const onGoToPageBlur = () => {
45
+ clearTimeout(textInputTimeout);
46
+ gotoPage(getPageIndex, pageSize);
47
+ };
48
+
49
+ const onItemsPerPageKeyDown = (e) => {
50
+ if (e.key === 'Enter') {
51
+ clearTimeout(textInputTimeout);
52
+ onItemsPerPage(getItemsPerPage);
53
+ }
54
+ };
55
+
56
+ const onGoToPageKeyDown = (e) => {
57
+ if (e.key === 'Enter') {
58
+ clearTimeout(textInputTimeout);
59
+ gotoPage(getPageIndex, pageSize);
60
+ }
61
+ };
62
+
63
+ return (
64
+ <section className='ip-table-pagination'>
65
65
  <span>
66
- {copy.table.page}&nbsp;&nbsp;
67
- <strong>
68
- {pageIndex} of {pageCount}
69
- </strong>
66
+ <Button
67
+ style='subtle'
68
+ size='small'
69
+ tooltip='Go to first page'
70
+ disabled={!canPreviousPage}
71
+ onClick={() => gotoPage(1, pageSize)}>
72
+ {ICON_ANGLE_DOUBLE_LEFT}
73
+ </Button>
74
+ <Button
75
+ style='subtle'
76
+ size='small'
77
+ tooltip='Go to previous page'
78
+ disabled={!canPreviousPage}
79
+ onClick={() => previousPage()}>
80
+ {ICON_ANGLE_LEFT}
81
+ </Button>
82
+ <Button
83
+ style='subtle'
84
+ size='small'
85
+ tooltip='Go to next page'
86
+ disabled={!canNextPage}
87
+ onClick={() => nextPage()}>
88
+ {ICON_ANGLE_RIGHT}
89
+ </Button>
90
+ <Button
91
+ style='subtle'
92
+ size='small'
93
+ tooltip='Go to last page'
94
+ disabled={!canNextPage}
95
+ onClick={() => gotoPage(pageCount, pageSize)}>
96
+ {ICON_ANGLE_DOUBLE_RIGHT}
97
+ </Button>
70
98
  &nbsp;&nbsp;
99
+ <span>
100
+ {copy.table.page}&nbsp;&nbsp;
101
+ <strong>
102
+ {getPageIndex} of {pageCount}
103
+ </strong>
104
+ &nbsp;&nbsp;
105
+ </span>
106
+ <span>
107
+ {copy.table.goToPage}&nbsp;&nbsp;
108
+ <input
109
+ className='paginator-input'
110
+ type='number'
111
+ placeholder={getPageIndex.toString()}
112
+ onChange={(e) => {
113
+ const input = e.target.value;
114
+ const inputNum = Number(input);
115
+ let next: number;
116
+
117
+ clearTimeout(textInputTimeout);
118
+
119
+ if (!input || inputNum < 1 || inputNum > pageCount) {
120
+ return;
121
+ }
122
+
123
+ if (inputNum >= 1 && inputNum <= pageCount) {
124
+ next = inputNum;
125
+ }
126
+
127
+ textInputTimeout = window.setTimeout(
128
+ () => gotoPage(next, pageSize),
129
+ 1000
130
+ );
131
+ }}
132
+ onBlur={() => onGoToPageBlur()}
133
+ onKeyDown={(e) => onGoToPageKeyDown(e)}
134
+ />
135
+ </span>
136
+ &nbsp;&nbsp;
137
+ <span>
138
+ {copy.table.itemsPerPage}&nbsp;&nbsp;
139
+ <input
140
+ className='paginator-input'
141
+ type='number'
142
+ placeholder={getItemsPerPage.toString()}
143
+ min={1}
144
+ onChange={(e) => {
145
+ const input = e.target.value;
146
+ const inputNum = Number(input);
147
+
148
+ clearTimeout(textInputTimeout);
149
+
150
+ if (!input || inputNum < 1) {
151
+ return;
152
+ }
153
+
154
+ setItemsPerPage(inputNum);
155
+
156
+ textInputTimeout = window.setTimeout(
157
+ () => onItemsPerPage(inputNum),
158
+ 1000
159
+ );
160
+ }}
161
+ onBlur={() => onItemsPerPageBlur()}
162
+ onKeyDown={(e) => onItemsPerPageKeyDown(e)}
163
+ />
164
+ </span>
71
165
  </span>
72
- <span>
73
- {copy.table.goToPage}&nbsp;&nbsp;
74
- <input
75
- className='paginator-input'
76
- type='number'
77
- placeholder={pageIndex}
78
- onChange={(e) => {
79
- const input = e.target.value;
80
- const inputNum = Number(input);
81
- let next: number;
82
-
83
- clearTimeout(textInputTimeout);
84
-
85
- if (!input || inputNum < 1 || inputNum > pageCount) {
86
- return;
87
- }
88
-
89
- if (inputNum >= 1 && inputNum <= pageCount) {
90
- next = inputNum;
91
- }
92
-
93
- textInputTimeout = window.setTimeout(() => gotoPage(next, pageSize), 300);
94
- }}
95
- />
96
- </span>
97
- &nbsp;&nbsp;
98
- <span>
99
- {copy.table.itemsPerPage}&nbsp;&nbsp;
100
- <input
101
- className='paginator-input'
102
- type='number'
103
- placeholder={itemsPerPage}
104
- min={1}
105
- onChange={(e) => {
106
- const input = e.target.value;
107
- const inputNum = Number(input);
108
-
109
- clearTimeout(textInputTimeout);
110
-
111
- if (!input || inputNum < 1) {
112
- return;
113
- }
114
-
115
- textInputTimeout = window.setTimeout(() => onItemsPerPage(inputNum), 300);
116
- }}
117
- />
118
- </span>
119
- </span>
120
166
 
121
- <span className='total-assets'>
122
- {copy.table.total}&nbsp;&nbsp;<strong>{totalItems || 0}</strong>
123
- </span>
124
- </section>
125
- );
167
+ <span className='total-assets'>
168
+ {copy.table.total}&nbsp;&nbsp;<strong>{totalItems || 0}</strong>
169
+ </span>
170
+ </section>
171
+ );
172
+ };
126
173
 
127
174
  export default Paginator;
@@ -12,6 +12,7 @@ interface ISMPTEFieldProps {
12
12
  width?: string | number;
13
13
  onChange?(e): void;
14
14
  onBlur?(e): void;
15
+ onError?(e): void;
15
16
  info?: string;
16
17
  labelPosition?: string;
17
18
  labelWidth?: string | number;
@@ -75,7 +76,7 @@ class SMPTEField extends React.PureComponent<ISMPTEFieldProps, ISMPTEFieldState>
75
76
 
76
77
  private onBlur(e?) {
77
78
  const val = e ? e.target.value : this.inputRef.current.value;
78
- const isValid = this.smptValidator(val);
79
+ const isValid = this.SMTPEValidator(val);
79
80
 
80
81
  if (e && e.key === 'Enter') {
81
82
  this.setDuration(isValid, val);
@@ -88,10 +89,12 @@ class SMPTEField extends React.PureComponent<ISMPTEFieldProps, ISMPTEFieldState>
88
89
 
89
90
  private onChange() {
90
91
  const val = this.inputRef.current.value;
91
- const isValid = this.smptValidator(val);
92
+ const isValid = this.SMTPEValidator(val);
92
93
 
93
94
  if (isValid) {
94
95
  this.props.onChange(val);
96
+ } else {
97
+ this.props.onError(isValid);
95
98
  }
96
99
  }
97
100
 
@@ -101,11 +104,13 @@ class SMPTEField extends React.PureComponent<ISMPTEFieldProps, ISMPTEFieldState>
101
104
  const smpte = getSMPTE(frameRate, val);
102
105
  if (smpte && this.props.onBlur) {
103
106
  this.props.onBlur(smpte);
107
+ } else {
108
+ this.props.onError(isValid);
104
109
  }
105
110
  }
106
111
  }
107
112
 
108
- private smptValidator(val) {
113
+ private SMTPEValidator(val) {
109
114
  const isValidSMPTETimeCode = new RegExp(this.regex);
110
115
  const isValid = isValidSMPTETimeCode.test(val);
111
116
  const errorMsg = isValid ? null : TIMECODE.ERROR;
package/src/index.ts CHANGED
@@ -40,6 +40,7 @@ import AssetField from './components/assets/AssetField';
40
40
  import AssetsTableDropzone from './components/assets/AssetsTableDropzone';
41
41
  import AssetsTableNameCell from './components/assets/AssetsTableNameCell';
42
42
  import AssetsTableNameFilter from './components/assets/AssetsTableNameFilter';
43
+ import AssetsTableAssetIdFilter from './components/assets/AssetsTableAssetIdFilter';
43
44
  import AssetsTableSelectCell from './components/assets/AssetsTableSelectCell';
44
45
  import AssetsTableSelectFilter from './components/assets/AssetsTableSelectFilter';
45
46
  import AssetsTableTagsCell from './components/assets/AssetsTableTagsCell';
@@ -159,6 +160,7 @@ import ContextMenuTrigger from './components/context-menu/ContextMenuTrigger';
159
160
  import CopyPropIdButton from './components/copy-prop-id-button/CopyPropIdButton';
160
161
  import Submenu from './components/context-menu/SubMenu';
161
162
  import { ConfirmModal } from './components/confirm-modal/ConfirmModal';
163
+ import AssetsTableAssetIdCell from './components/assets/AssetsTableAssetIdCell';
162
164
 
163
165
  export {
164
166
  AppWrapper,
@@ -217,6 +219,8 @@ export {
217
219
  AssetsTableGlobalCell,
218
220
  AssetsTableStatusCell,
219
221
  AssetsTableNameFilter,
222
+ AssetsTableAssetIdFilter,
223
+ AssetsTableAssetIdCell,
220
224
  AssetsTableNameCell,
221
225
  AssetsTableDurationCell,
222
226
  AssetsTableRateCell,