@imposium-hub/components 2.5.10-9 → 2.5.10

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 (151) hide show
  1. package/dist/cjs/components/app-wrapper/AppWrapper.js +5 -2
  2. package/dist/cjs/components/app-wrapper/AppWrapper.js.map +1 -1
  3. package/dist/cjs/components/app-wrapper/AppWrapper_BACKUP_73190.d.ts +27 -0
  4. package/dist/cjs/components/app-wrapper/AppWrapper_BACKUP_73190.js +243 -0
  5. package/dist/cjs/components/app-wrapper/AppWrapper_BACKUP_73190.js.map +1 -0
  6. package/dist/cjs/components/app-wrapper/AppWrapper_BASE_73190.d.ts +28 -0
  7. package/dist/cjs/components/app-wrapper/AppWrapper_BASE_73190.js +255 -0
  8. package/dist/cjs/components/app-wrapper/AppWrapper_BASE_73190.js.map +1 -0
  9. package/dist/cjs/components/app-wrapper/AppWrapper_LOCAL_73190.d.ts +27 -0
  10. package/dist/cjs/components/app-wrapper/AppWrapper_LOCAL_73190.js +243 -0
  11. package/dist/cjs/components/app-wrapper/AppWrapper_LOCAL_73190.js.map +1 -0
  12. package/dist/cjs/components/app-wrapper/AppWrapper_REMOTE_73190.d.ts +28 -0
  13. package/dist/cjs/components/app-wrapper/AppWrapper_REMOTE_73190.js +251 -0
  14. package/dist/cjs/components/app-wrapper/AppWrapper_REMOTE_73190.js.map +1 -0
  15. package/dist/cjs/components/assets/AssetsTableNameCell.js +2 -2
  16. package/dist/cjs/components/assets/AssetsTableNameCell.js.map +1 -1
  17. package/dist/cjs/components/assets/AssetsTypeIcon.js +2 -0
  18. package/dist/cjs/components/assets/AssetsTypeIcon.js.map +1 -1
  19. package/dist/cjs/components/card/Card.d.ts +0 -1
  20. package/dist/cjs/components/card/Card.js +4 -17
  21. package/dist/cjs/components/card/Card.js.map +1 -1
  22. package/dist/cjs/components/confirm-modal/ConfirmModal.d.ts +9 -9
  23. package/dist/cjs/components/confirm-modal/ConfirmModal.js +108 -12
  24. package/dist/cjs/components/confirm-modal/ConfirmModal.js.map +1 -1
  25. package/dist/cjs/components/data-table/Paginator.js +7 -51
  26. package/dist/cjs/components/data-table/Paginator.js.map +1 -1
  27. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.d.ts +15 -0
  28. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.js +91 -0
  29. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.js.map +1 -0
  30. package/dist/cjs/components/header/Header_BACKUP_73021.d.ts +33 -0
  31. package/dist/cjs/components/header/Header_BACKUP_73021.js +393 -0
  32. package/dist/cjs/components/header/Header_BACKUP_73021.js.map +1 -0
  33. package/dist/cjs/components/header/Header_BASE_73021.d.ts +29 -0
  34. package/dist/cjs/components/header/Header_BASE_73021.js +376 -0
  35. package/dist/cjs/components/header/Header_BASE_73021.js.map +1 -0
  36. package/dist/cjs/components/header/Header_LOCAL_73021.d.ts +33 -0
  37. package/dist/cjs/components/header/Header_LOCAL_73021.js +382 -0
  38. package/dist/cjs/components/header/Header_LOCAL_73021.js.map +1 -0
  39. package/dist/cjs/components/header/Header_REMOTE_73021.d.ts +30 -0
  40. package/dist/cjs/components/header/Header_REMOTE_73021.js +386 -0
  41. package/dist/cjs/components/header/Header_REMOTE_73021.js.map +1 -0
  42. package/dist/cjs/components/smpte-field/SMPTEField.d.ts +1 -2
  43. package/dist/cjs/components/smpte-field/SMPTEField.js +3 -9
  44. package/dist/cjs/components/smpte-field/SMPTEField.js.map +1 -1
  45. package/dist/cjs/components/story-previewer/StoryPreviewer.js +11 -1
  46. package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
  47. package/dist/cjs/constants/copy.js +2 -2
  48. package/dist/cjs/constants/copy.js.map +1 -1
  49. package/dist/cjs/constants/icons.d.ts +1 -0
  50. package/dist/cjs/constants/icons.js +3 -1
  51. package/dist/cjs/constants/icons.js.map +1 -1
  52. package/dist/cjs/constants/variables.d.ts +3 -0
  53. package/dist/cjs/constants/variables.js +27 -2
  54. package/dist/cjs/constants/variables.js.map +1 -1
  55. package/dist/cjs/index.d.ts +2 -2
  56. package/dist/cjs/index.js.map +1 -1
  57. package/dist/cjs/redux/actions/asset-list.js +0 -1
  58. package/dist/cjs/redux/actions/asset-list.js.map +1 -1
  59. package/dist/cjs/redux/actions/asset-uploads.js +33 -1
  60. package/dist/cjs/redux/actions/asset-uploads.js.map +1 -1
  61. package/dist/cjs/redux/reducers/asset-uploads.js +8 -0
  62. package/dist/cjs/redux/reducers/asset-uploads.js.map +1 -1
  63. package/dist/cjs/services/API.d.ts +3 -0
  64. package/dist/cjs/services/API.js +9 -0
  65. package/dist/cjs/services/API.js.map +1 -1
  66. package/dist/esm/components/app-wrapper/AppWrapper.js +5 -2
  67. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  68. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.d.ts +27 -0
  69. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.js +194 -0
  70. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.js.map +1 -0
  71. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.d.ts +28 -0
  72. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.js +208 -0
  73. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.js.map +1 -0
  74. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.d.ts +27 -0
  75. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.js +194 -0
  76. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.js.map +1 -0
  77. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.d.ts +28 -0
  78. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.js +204 -0
  79. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.js.map +1 -0
  80. package/dist/esm/components/assets/AssetsTableNameCell.js +2 -2
  81. package/dist/esm/components/assets/AssetsTableNameCell.js.map +1 -1
  82. package/dist/esm/components/assets/AssetsTypeIcon.js +3 -1
  83. package/dist/esm/components/assets/AssetsTypeIcon.js.map +1 -1
  84. package/dist/esm/components/card/Card.d.ts +0 -1
  85. package/dist/esm/components/card/Card.js +4 -16
  86. package/dist/esm/components/card/Card.js.map +1 -1
  87. package/dist/esm/components/confirm-modal/ConfirmModal.d.ts +9 -9
  88. package/dist/esm/components/confirm-modal/ConfirmModal.js +60 -11
  89. package/dist/esm/components/confirm-modal/ConfirmModal.js.map +1 -1
  90. package/dist/esm/components/data-table/Paginator.js +44 -74
  91. package/dist/esm/components/data-table/Paginator.js.map +1 -1
  92. package/dist/esm/components/error-message-preview/ErrorMessagePreview.d.ts +15 -0
  93. package/dist/esm/components/error-message-preview/ErrorMessagePreview.js +35 -0
  94. package/dist/esm/components/error-message-preview/ErrorMessagePreview.js.map +1 -0
  95. package/dist/esm/components/header/Header_BACKUP_73021.d.ts +33 -0
  96. package/dist/esm/components/header/Header_BACKUP_73021.js +336 -0
  97. package/dist/esm/components/header/Header_BACKUP_73021.js.map +1 -0
  98. package/dist/esm/components/header/Header_BASE_73021.d.ts +29 -0
  99. package/dist/esm/components/header/Header_BASE_73021.js +322 -0
  100. package/dist/esm/components/header/Header_BASE_73021.js.map +1 -0
  101. package/dist/esm/components/header/Header_LOCAL_73021.d.ts +33 -0
  102. package/dist/esm/components/header/Header_LOCAL_73021.js +328 -0
  103. package/dist/esm/components/header/Header_LOCAL_73021.js.map +1 -0
  104. package/dist/esm/components/header/Header_REMOTE_73021.d.ts +30 -0
  105. package/dist/esm/components/header/Header_REMOTE_73021.js +329 -0
  106. package/dist/esm/components/header/Header_REMOTE_73021.js.map +1 -0
  107. package/dist/esm/components/smpte-field/SMPTEField.d.ts +1 -2
  108. package/dist/esm/components/smpte-field/SMPTEField.js +3 -9
  109. package/dist/esm/components/smpte-field/SMPTEField.js.map +1 -1
  110. package/dist/esm/components/story-previewer/StoryPreviewer.js +12 -2
  111. package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
  112. package/dist/esm/constants/copy.js +2 -2
  113. package/dist/esm/constants/copy.js.map +1 -1
  114. package/dist/esm/constants/icons.d.ts +1 -0
  115. package/dist/esm/constants/icons.js +2 -0
  116. package/dist/esm/constants/icons.js.map +1 -1
  117. package/dist/esm/constants/variables.d.ts +3 -0
  118. package/dist/esm/constants/variables.js +25 -1
  119. package/dist/esm/constants/variables.js.map +1 -1
  120. package/dist/esm/index.d.ts +2 -2
  121. package/dist/esm/index.js.map +1 -1
  122. package/dist/esm/redux/actions/asset-list.js +0 -1
  123. package/dist/esm/redux/actions/asset-list.js.map +1 -1
  124. package/dist/esm/redux/actions/asset-uploads.js +22 -1
  125. package/dist/esm/redux/actions/asset-uploads.js.map +1 -1
  126. package/dist/esm/redux/reducers/asset-uploads.js +11 -0
  127. package/dist/esm/redux/reducers/asset-uploads.js.map +1 -1
  128. package/dist/esm/services/API.d.ts +3 -0
  129. package/dist/esm/services/API.js +9 -0
  130. package/dist/esm/services/API.js.map +1 -1
  131. package/dist/styles.css +0 -6
  132. package/dist/styles.less +0 -8
  133. package/less/components/data-table.less +0 -4
  134. package/less/components/form-field.less +0 -4
  135. package/package.json +1 -1
  136. package/src/components/app-wrapper/AppWrapper.tsx +3 -4
  137. package/src/components/assets/AssetsTableNameCell.tsx +2 -2
  138. package/src/components/assets/AssetsTypeIcon.tsx +4 -1
  139. package/src/components/card/Card.tsx +13 -27
  140. package/src/components/confirm-modal/ConfirmModal.tsx +80 -19
  141. package/src/components/data-table/Paginator.tsx +93 -140
  142. package/src/components/smpte-field/SMPTEField.tsx +3 -8
  143. package/src/components/story-previewer/StoryPreviewer.tsx +28 -4
  144. package/src/constants/copy.ts +2 -2
  145. package/src/constants/icons.tsx +3 -0
  146. package/src/constants/variables.ts +27 -1
  147. package/src/index.ts +3 -2
  148. package/src/redux/actions/asset-list.ts +0 -1
  149. package/src/redux/actions/asset-uploads.ts +20 -1
  150. package/src/redux/reducers/asset-uploads.ts +11 -0
  151. package/src/services/API.ts +15 -0
package/dist/styles.less CHANGED
@@ -1246,10 +1246,6 @@ 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
-
1253
1249
  .paginator-input {
1254
1250
  .inputMixin;
1255
1251
  width: 60px;
@@ -1379,10 +1375,6 @@ body{
1379
1375
  padding:4px;
1380
1376
  }
1381
1377
 
1382
- input[type=number] {
1383
- -moz-appearance: textfield;
1384
- }
1385
-
1386
1378
  textarea{
1387
1379
  height:@inputHeight * 3;
1388
1380
  resize:none;
@@ -207,10 +207,6 @@
207
207
  border-top: 0;
208
208
  background-color: darken(@background, 1%);
209
209
 
210
- input[type=number] {
211
- -moz-appearance: textfield;
212
- }
213
-
214
210
  .paginator-input {
215
211
  .inputMixin;
216
212
  width: 60px;
@@ -55,10 +55,6 @@
55
55
  padding:4px;
56
56
  }
57
57
 
58
- input[type=number] {
59
- -moz-appearance: textfield;
60
- }
61
-
62
58
  textarea{
63
59
  height:@inputHeight * 3;
64
60
  resize:none;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "2.5.10-9",
3
+ "version": "2.5.10",
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",
@@ -8,6 +8,7 @@ import { bindActionCreators } from 'redux';
8
8
  import { login, clearCachedAuth } from '../../redux/actions/auth';
9
9
  import { validateAccessLevel } from '../../Util';
10
10
  import { setAccessData } from '../../redux/actions/access';
11
+ import { ConfirmModal } from '../confirm-modal/ConfirmModal';
11
12
 
12
13
  export interface IAppWrapperProps {
13
14
  children: React.ReactChildren;
@@ -84,10 +85,7 @@ class AppWrapper extends React.Component<IAppWrapperProps, IAppWrapperState> {
84
85
  /*
85
86
  Check the auth0 session expiry
86
87
  */
87
- public componentDidUpdate = (
88
- prevProps: Readonly<IAppWrapperProps>,
89
- prevState: Readonly<IAppWrapperState>
90
- ): void => {
88
+ public componentDidUpdate = (prevProps): void => {
91
89
  const { auth } = this.props;
92
90
  let validAccessLevel: boolean;
93
91
 
@@ -286,6 +284,7 @@ class AppWrapper extends React.Component<IAppWrapperProps, IAppWrapperState> {
286
284
  id='app'
287
285
  className='app'>
288
286
  {innerContent}
287
+ <ConfirmModal />
289
288
  </div>
290
289
  );
291
290
  };
@@ -20,7 +20,7 @@ const AssetsTableNameCell: React.FC<IAssetsTableNameCell> = (props: IAssetsTable
20
20
  const {
21
21
  cell: {
22
22
  row: {
23
- original: { name, id, percent: uploadProgress }
23
+ original: { name, id, percent: uploadProgress, error }
24
24
  }
25
25
  },
26
26
  disabled
@@ -53,7 +53,7 @@ const AssetsTableNameCell: React.FC<IAssetsTableNameCell> = (props: IAssetsTable
53
53
  text={name}
54
54
  />
55
55
  ) : (
56
- <span>{copy.uploads.preparePhase}</span>
56
+ <span>{error ? error : copy.uploads.preparePhase}</span>
57
57
  );
58
58
  return loader;
59
59
  } else {
@@ -15,7 +15,8 @@ import {
15
15
  ICON_FILE_CODE,
16
16
  ICON_CLAPPERBOARD_PLAY,
17
17
  ICON_FILTERS,
18
- ICON_FILE_UPLOAD
18
+ ICON_FILE_UPLOAD,
19
+ ICON_FILE_ERROR
19
20
  } from '../../constants/icons';
20
21
 
21
22
  interface IAssetsTypeIconProps {
@@ -112,6 +113,8 @@ const AssetsTypeIcon: React.FC<IAssetsTypeIconProps> = (p: IAssetsTypeIconProps)
112
113
  );
113
114
  case 'upload':
114
115
  return <span>{ICON_FILE_UPLOAD}</span>;
116
+ case 'error':
117
+ return <span>{ICON_FILE_ERROR}</span>;
115
118
  default:
116
119
  if (filter === 'multi') {
117
120
  return <span>{ICON_FILTERS}</span>;
@@ -11,7 +11,6 @@ interface ICardProps {
11
11
  onOpen?: (e: any) => any;
12
12
  onClose?: (e: any) => any;
13
13
  onToggle?: (toggle: boolean) => any;
14
- buttons?: any[];
15
14
  }
16
15
 
17
16
  interface ICardState {
@@ -98,7 +97,9 @@ class Card extends React.PureComponent<ICardProps, ICardState> {
98
97
 
99
98
  return (
100
99
  <div className={`card ${openClass} ${collapsableClass} ${styleClass}`}>
101
- <div className='card-header'>
100
+ <div
101
+ className='card-header'
102
+ onClick={this.evtHandlers.toggleOpen}>
102
103
  {this.renderTitle(styleClass)}
103
104
  {this.renderButtons()}
104
105
  </div>
@@ -108,36 +109,21 @@ class Card extends React.PureComponent<ICardProps, ICardState> {
108
109
  }
109
110
 
110
111
  public renderButtons() {
111
- const { collapsable, buttons } = this.props;
112
+ const { collapsable } = this.props;
112
113
  const { open } = this.state;
113
114
  const buttonIcon = open ? ICON_CARET_UP : ICON_CARET_DOWN;
114
115
 
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
-
132
116
  if (collapsable) {
133
- if (buttonArray && buttonArray.length > 0) {
134
- buttonArray.push(toggleBtn);
135
- } else {
136
- buttonArray = [toggleBtn];
137
- }
117
+ return (
118
+ <div className='header-buttons'>
119
+ <Button
120
+ style='subtle'
121
+ onClick={this.evtHandlers.toggleOpen}>
122
+ {buttonIcon}
123
+ </Button>
124
+ </div>
125
+ );
138
126
  }
139
-
140
- return <div className='header-buttons'>{buttonArray}</div>;
141
127
  }
142
128
  }
143
129
 
@@ -1,24 +1,85 @@
1
- import React from 'react';
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
2
  import ReactDOM from 'react-dom';
3
- import { useHotkeys } from 'react-hotkeys-hook';
4
3
  import Modal from '../modal/Modal';
5
4
  import Button from '../button/Button';
6
5
  import { confirm as copy } from '../../constants/copy';
7
6
  import Section from '../section/Section';
8
7
 
9
- export const ConfirmModal = ({
10
- onClose,
11
- onYes,
12
- onNo,
13
- title,
14
- onYesLabel,
15
- onNoLabel,
16
- showCancel
17
- }) => {
18
- useHotkeys('enter', onYes, { enableOnFormTags: true });
19
- const { cancel } = copy;
8
+ export interface IConfirmModalProps {
9
+ onYes: () => void;
10
+ onNo?: () => void;
11
+ title: string;
12
+ yesLabel?: string;
13
+ noLabel?: string;
14
+ showCancel?: boolean;
15
+ }
20
16
 
21
- const modal = (
17
+ export const ConfirmModal = () => {
18
+ const [props, setProps] = useState<IConfirmModalProps>(null);
19
+ const [isOpen, setIsOpen] = useState<boolean>(false);
20
+
21
+ const onOpen = (event) => {
22
+ setProps({
23
+ ...event.detail
24
+ });
25
+ setIsOpen(true);
26
+ };
27
+
28
+ const onClose = () => setIsOpen(false);
29
+
30
+ const onYesHandler = () => {
31
+ props.onYes();
32
+ setIsOpen(false);
33
+ };
34
+
35
+ const onNoHandler = () => {
36
+ props.onNo();
37
+ setIsOpen(false);
38
+ };
39
+
40
+ const onYes = useCallback(() => onYesHandler(), [isOpen]);
41
+
42
+ const onNo = useCallback(() => {
43
+ if (props.onNo) {
44
+ onNoHandler();
45
+ } else {
46
+ onClose();
47
+ }
48
+ }, [isOpen]);
49
+
50
+ const onKeyDown = useCallback(
51
+ (e) => {
52
+ if (e.key === 'Enter') {
53
+ e.preventDefault();
54
+ onYesHandler();
55
+ }
56
+ },
57
+ [isOpen]
58
+ );
59
+
60
+ useEffect(() => {
61
+ window.addEventListener('openconfirmmodal', onOpen);
62
+ return () => {
63
+ window.removeEventListener('openconfirmmodal', onOpen);
64
+ };
65
+ }, []);
66
+
67
+ useEffect(() => {
68
+ if (isOpen) {
69
+ document.addEventListener('keypress', onKeyDown);
70
+ } else {
71
+ document.removeEventListener('keypress', onKeyDown);
72
+ }
73
+ return () => {
74
+ document.removeEventListener('keypress', onKeyDown);
75
+ };
76
+ }, [isOpen, onKeyDown]);
77
+
78
+ const { cancel, yes, no } = copy;
79
+ const noLabel = props?.noLabel ? props.noLabel : no;
80
+ const yesLabel = props?.yesLabel ? props.yesLabel : yes;
81
+
82
+ const modal = isOpen && (
22
83
  <Modal
23
84
  onRequestClose={onClose}
24
85
  wrapperStyle={{
@@ -27,16 +88,16 @@ export const ConfirmModal = ({
27
88
  }}
28
89
  style={{
29
90
  width: '400px',
30
- height: '12%',
91
+ height: '14%',
31
92
  top: 'calc(50% - 150px)',
32
93
  left: 'calc((100% - 400px) / 2)'
33
94
  }}
34
95
  isOpen={true}>
35
96
  <Section>
36
97
  <div className='confirm-modal'>
37
- <p>{title}</p>
98
+ <p>{props.title}</p>
38
99
  <div className='confirm-buttons'>
39
- {showCancel ? (
100
+ {props.showCancel ? (
40
101
  <Button
41
102
  onClick={onClose}
42
103
  size='large'
@@ -48,14 +109,14 @@ export const ConfirmModal = ({
48
109
  onClick={onNo}
49
110
  size='large'
50
111
  color='default'>
51
- {onNoLabel}
112
+ {noLabel}
52
113
  </Button>
53
114
  <Button
54
115
  onClick={onYes}
55
116
  size='large'
56
117
  style='bold'
57
118
  color='primary'>
58
- {onYesLabel}
119
+ {yesLabel}
59
120
  </Button>
60
121
  </div>
61
122
  </div>
@@ -26,149 +26,102 @@ const Paginator: React.FC<any> = ({
26
26
  setPageSize,
27
27
  itemsPerPage,
28
28
  onItemsPerPage
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'>
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;
65
65
  <span>
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>
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>
66
+ {copy.table.page}&nbsp;&nbsp;
67
+ <strong>
68
+ {pageIndex} of {pageCount}
69
+ </strong>
136
70
  &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>
165
71
  </span>
166
-
167
- <span className='total-assets'>
168
- {copy.table.total}&nbsp;&nbsp;<strong>{totalItems || 0}</strong>
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
+ />
169
96
  </span>
170
- </section>
171
- );
172
- };
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
+
121
+ <span className='total-assets'>
122
+ {copy.table.total}&nbsp;&nbsp;<strong>{totalItems || 0}</strong>
123
+ </span>
124
+ </section>
125
+ );
173
126
 
174
127
  export default Paginator;
@@ -12,7 +12,6 @@ interface ISMPTEFieldProps {
12
12
  width?: string | number;
13
13
  onChange?(e): void;
14
14
  onBlur?(e): void;
15
- onError?(e): void;
16
15
  info?: string;
17
16
  labelPosition?: string;
18
17
  labelWidth?: string | number;
@@ -76,7 +75,7 @@ class SMPTEField extends React.PureComponent<ISMPTEFieldProps, ISMPTEFieldState>
76
75
 
77
76
  private onBlur(e?) {
78
77
  const val = e ? e.target.value : this.inputRef.current.value;
79
- const isValid = this.SMTPEValidator(val);
78
+ const isValid = this.smptValidator(val);
80
79
 
81
80
  if (e && e.key === 'Enter') {
82
81
  this.setDuration(isValid, val);
@@ -89,12 +88,10 @@ class SMPTEField extends React.PureComponent<ISMPTEFieldProps, ISMPTEFieldState>
89
88
 
90
89
  private onChange() {
91
90
  const val = this.inputRef.current.value;
92
- const isValid = this.SMTPEValidator(val);
91
+ const isValid = this.smptValidator(val);
93
92
 
94
93
  if (isValid) {
95
94
  this.props.onChange(val);
96
- } else {
97
- this.props.onError(isValid);
98
95
  }
99
96
  }
100
97
 
@@ -104,13 +101,11 @@ class SMPTEField extends React.PureComponent<ISMPTEFieldProps, ISMPTEFieldState>
104
101
  const smpte = getSMPTE(frameRate, val);
105
102
  if (smpte && this.props.onBlur) {
106
103
  this.props.onBlur(smpte);
107
- } else {
108
- this.props.onError(isValid);
109
104
  }
110
105
  }
111
106
  }
112
107
 
113
- private SMTPEValidator(val) {
108
+ private smptValidator(val) {
114
109
  const isValidSMPTETimeCode = new RegExp(this.regex);
115
110
  const isValid = isValidSMPTETimeCode.test(val);
116
111
  const errorMsg = isValid ? null : TIMECODE.ERROR;
@@ -1,6 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import { IImposiumAPI } from '../../services/API';
3
- import { VARIABLE_TYPES, BOOLEAN_DEFAULT_OPTIONS } from '../../constants/variables';
3
+ import {
4
+ VARIABLE_TYPES,
5
+ BOOLEAN_DEFAULT_OPTIONS,
6
+ colorPresets,
7
+ formatColor
8
+ } from '../../constants/variables';
4
9
  import { OUTPUT_TYPES } from '../../constants/previewer';
5
10
  import TextField from '../text-field/TextField';
6
11
  import Button from '../button/Button';
@@ -23,6 +28,7 @@ import LogViewer from '../log-viewer/LogViewer';
23
28
  import { connect } from 'react-redux';
24
29
  import { ICON_DOWNLOAD, ICON_CLIPBOARD } from '../../constants/icons';
25
30
  import AudioPlayer from '../players/AudioPlayer';
31
+ import ColorField from '../color-field/ColorField';
26
32
 
27
33
  interface IStoryPreviewerProps {
28
34
  api: IImposiumAPI;
@@ -137,15 +143,14 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
137
143
  const { variables } = this.props;
138
144
  const inventoryOverrides = this.props.editor?.inventoryOverrides;
139
145
  const newInv = {};
140
-
141
146
  for (const i in variables) {
142
147
  if (variables.hasOwnProperty(i)) {
143
148
  const override = inventoryOverrides ? inventoryOverrides[i] : null;
144
149
  const inv = variables[i];
145
- newInv[inv.id] = override ? override : this.getVariableValue(inv.previewItem);
150
+ newInv[inv.id] =
151
+ override !== null ? override : this.getVariableValue(inv.previewItem);
146
152
  }
147
153
  }
148
-
149
154
  return newInv;
150
155
  }
151
156
 
@@ -230,6 +235,11 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
230
235
  }
231
236
  }
232
237
 
238
+ private colorInputChanged(key, value) {
239
+ const color = formatColor(value);
240
+ this.variableInputChanged(key, color);
241
+ }
242
+
233
243
  private variableInputChanged(key, value) {
234
244
  const inventory = { ...this.state.inventory };
235
245
  inventory[key] = value;
@@ -397,6 +407,20 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
397
407
  </FieldWrapper>
398
408
  );
399
409
  break;
410
+ case VARIABLE_TYPES.COLOR:
411
+ const value = inventory[inv.id] ? inventory[inv.id] : 'rgba(0,0,0,1)';
412
+ fields.push(
413
+ <ColorField
414
+ label={inv.name}
415
+ labelPosition='top'
416
+ enableAlpha={true}
417
+ presetColors={colorPresets}
418
+ value={value}
419
+ pickerPosition='bottom'
420
+ onChange={(v) => this.colorInputChanged(inv.id, v)}
421
+ />
422
+ );
423
+ break;
400
424
  }
401
425
  }
402
426
  }