@manuscripts/style-guide 0.30.25 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/FileManager/FileManager.js +1 -1
- package/dist/cjs/components/FileManager/InlineFilesSection.js +9 -9
- package/dist/cjs/components/Resizer/Resizer.js +109 -0
- package/dist/cjs/components/Resizer/ResizerButton.js +30 -0
- package/dist/cjs/components/Resizer/ResizerButtonInner.js +169 -0
- package/dist/cjs/components/Resizer/ResizerInner.js +74 -0
- package/dist/cjs/components/Resizer/index.js +16 -0
- package/dist/cjs/components/Resizer/types.js +2 -0
- package/dist/cjs/components/icons/attach.js +24 -0
- package/dist/cjs/components/icons/index.js +7 -1
- package/dist/cjs/components/icons/missing-image.js +12 -0
- package/dist/cjs/components/icons/upload.js +11 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/lib/inlineFiles.js +23 -11
- package/dist/es/components/FileManager/FileManager.js +1 -1
- package/dist/es/components/FileManager/InlineFilesSection.js +10 -10
- package/dist/es/components/Resizer/Resizer.js +102 -0
- package/dist/es/components/Resizer/ResizerButton.js +23 -0
- package/dist/es/components/Resizer/ResizerButtonInner.js +163 -0
- package/dist/es/components/Resizer/ResizerInner.js +68 -0
- package/dist/es/components/Resizer/index.js +2 -0
- package/dist/es/components/Resizer/types.js +1 -0
- package/dist/es/components/icons/attach.js +19 -0
- package/dist/es/components/icons/index.js +3 -0
- package/dist/es/components/icons/missing-image.js +7 -0
- package/dist/es/components/icons/upload.js +6 -0
- package/dist/es/index.js +1 -0
- package/dist/es/lib/inlineFiles.js +23 -11
- package/dist/types/components/FileManager/InlineFilesSection.d.ts +4 -2
- package/dist/types/components/Resizer/Resizer.d.ts +36 -0
- package/dist/types/components/Resizer/ResizerButton.d.ts +18 -0
- package/dist/types/components/Resizer/ResizerButtonInner.d.ts +8 -0
- package/dist/types/components/Resizer/ResizerInner.d.ts +4 -0
- package/dist/types/components/Resizer/index.d.ts +2 -0
- package/dist/types/components/Resizer/types.d.ts +2 -0
- package/dist/types/components/icons/attach.d.ts +18 -0
- package/dist/types/components/icons/index.d.ts +3 -0
- package/dist/types/components/icons/missing-image.d.ts +3 -0
- package/dist/types/components/icons/upload.d.ts +3 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/inlineFiles.d.ts +3 -3
- package/package.json +1 -1
|
@@ -4,11 +4,11 @@ import { useDropdown } from '../../hooks/use-dropdown';
|
|
|
4
4
|
import getInlineFiles from '../../lib/inlineFiles';
|
|
5
5
|
import DotsIcon from '../icons/dots-icon';
|
|
6
6
|
import { FileDescription, FileInfoContainer, FileNameTitleContainer, FileTitle, } from './FileSectionItem/FileInfo';
|
|
7
|
-
import { ActionsIcon, Item } from './FileSectionItem/FileSectionItem';
|
|
7
|
+
import { ActionsIcon, Item, } from './FileSectionItem/FileSectionItem';
|
|
8
8
|
import { ItemActions } from './FileSectionItem/ItemActions';
|
|
9
9
|
import { extensionsWithFileTypesMap, fileTypesWithIconMap } from './util';
|
|
10
|
-
export const InlineFilesSection = ({ submissionId, handleReplace, handleDownload, modelMap, isEditor, dispatch, }) => {
|
|
11
|
-
const inlineFiles = useMemo(() => getInlineFiles(modelMap), [modelMap]);
|
|
10
|
+
export const InlineFilesSection = ({ submissionId, handleReplace, handleDownload, modelMap, attachments, isEditor, dispatch, }) => {
|
|
11
|
+
const inlineFiles = useMemo(() => getInlineFiles(modelMap, attachments), [modelMap, attachments]);
|
|
12
12
|
const onElementClick = useCallback((e) => {
|
|
13
13
|
if (!isEditor) {
|
|
14
14
|
return;
|
|
@@ -23,7 +23,7 @@ export const InlineFilesSection = ({ submissionId, handleReplace, handleDownload
|
|
|
23
23
|
return (React.createElement("div", null, inlineFiles.map((file, index) => {
|
|
24
24
|
var _a;
|
|
25
25
|
return (React.createElement(ElementItem, { className: 'item', key: index, id: file.id, onClick: onElementClick },
|
|
26
|
-
React.createElement(FileReferences, { className: 'refItems' }, (_a = file.
|
|
26
|
+
React.createElement(FileReferences, { className: 'refItems' }, (_a = file.attachments) === null || _a === void 0 ? void 0 : _a.map((attachment) => (React.createElement(FileReference, { key: attachment.id, attachment: attachment, submissionId: submissionId, handleReplace: handleReplace, handleDownload: handleDownload, dispatch: dispatch })))),
|
|
27
27
|
React.createElement(Element, { className: 'element' },
|
|
28
28
|
fileTypesWithIconMap.get(file.type),
|
|
29
29
|
React.createElement(FileInfoContainer, null,
|
|
@@ -32,20 +32,20 @@ export const InlineFilesSection = ({ submissionId, handleReplace, handleDownload
|
|
|
32
32
|
file.caption && (React.createElement(FileDescription, null, file.caption))))));
|
|
33
33
|
})));
|
|
34
34
|
};
|
|
35
|
-
const FileReference = ({
|
|
35
|
+
const FileReference = ({ attachment, submissionId, handleReplace, handleDownload, dispatch, }) => {
|
|
36
36
|
const { isOpen, toggleOpen, wrapperRef } = useDropdown();
|
|
37
|
-
if (!
|
|
37
|
+
if (!attachment || !attachment.name) {
|
|
38
38
|
return null;
|
|
39
39
|
}
|
|
40
|
-
const fileExtension =
|
|
41
|
-
return (React.createElement(FileReferenceItem, { key:
|
|
40
|
+
const fileExtension = attachment.name.substring(attachment.name.lastIndexOf('.') + 1);
|
|
41
|
+
return (React.createElement(FileReferenceItem, { key: attachment.id },
|
|
42
42
|
React.createElement(Container, null,
|
|
43
43
|
fileTypesWithIconMap.get(extensionsWithFileTypesMap.get(fileExtension)),
|
|
44
|
-
React.createElement(FileReferenceName, null,
|
|
44
|
+
React.createElement(FileReferenceName, null, attachment.name)),
|
|
45
45
|
handleDownload && handleReplace && submissionId && (React.createElement(DropdownContainer, { ref: wrapperRef },
|
|
46
46
|
React.createElement(ActionsIcon, { onClick: toggleOpen, type: "button", className: 'external_file_dropdown', "aria-label": "Download or Replace", "aria-pressed": isOpen },
|
|
47
47
|
React.createElement(DotsIcon, null)),
|
|
48
|
-
isOpen && (React.createElement(ItemActions, { replaceAttachmentHandler: handleReplace, downloadAttachmentHandler: handleDownload, submissionId: submissionId, attachmentId:
|
|
48
|
+
isOpen && (React.createElement(ItemActions, { replaceAttachmentHandler: handleReplace, downloadAttachmentHandler: handleDownload, submissionId: submissionId, attachmentId: attachment.id, fileName: attachment.name, designation: attachment.type.label, publicUrl: attachment.link, hideActionList: toggleOpen, dispatch: dispatch, dropDownClassName: 'ref_item_dropdown' }))))));
|
|
49
49
|
};
|
|
50
50
|
const ElementItem = styled(Item) `
|
|
51
51
|
display: flex;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ResizerButton } from './ResizerButton';
|
|
3
|
+
import { HorizontalEndResizerInner, HorizontalStartResizerInner, VerticalEndResizerInner, VerticalStartResizerInner, } from './ResizerInner';
|
|
4
|
+
const inners = {
|
|
5
|
+
column: {
|
|
6
|
+
end: VerticalEndResizerInner,
|
|
7
|
+
start: VerticalStartResizerInner,
|
|
8
|
+
},
|
|
9
|
+
row: {
|
|
10
|
+
end: HorizontalEndResizerInner,
|
|
11
|
+
start: HorizontalStartResizerInner,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
export class Resizer extends React.Component {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.resizerRef = React.createRef();
|
|
18
|
+
this.state = {
|
|
19
|
+
isHovering: false,
|
|
20
|
+
isResizing: false,
|
|
21
|
+
startPosition: 0,
|
|
22
|
+
};
|
|
23
|
+
this.scheduleResize = (delta) => {
|
|
24
|
+
if (this.state.isResizing && delta) {
|
|
25
|
+
this.props.onResize(delta);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
this.mouseDownHandler = (e) => {
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
if (!this.resizerRef.current || e.target !== this.resizerRef.current) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (this.state.isResizing) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.setState({
|
|
37
|
+
isResizing: true,
|
|
38
|
+
startPosition: this.getPosition(e),
|
|
39
|
+
});
|
|
40
|
+
window.addEventListener('mousemove', this.mouseMoveHandler);
|
|
41
|
+
window.addEventListener('mouseup', this.mouseUpHandler);
|
|
42
|
+
window.addEventListener('mouseout', this.handleOutofBounds);
|
|
43
|
+
};
|
|
44
|
+
this.mouseUpHandler = (e, outOfBounds = false) => {
|
|
45
|
+
window.removeEventListener('mousemove', this.mouseMoveHandler);
|
|
46
|
+
window.removeEventListener('mouseup', this.mouseUpHandler);
|
|
47
|
+
window.removeEventListener('mouseout', this.handleOutofBounds);
|
|
48
|
+
this.setState({
|
|
49
|
+
isResizing: false,
|
|
50
|
+
});
|
|
51
|
+
const position = this.getPosition(e);
|
|
52
|
+
const adjustedPosition = outOfBounds ? position - 32 : position;
|
|
53
|
+
const delta = this.getDelta(adjustedPosition);
|
|
54
|
+
if (delta === 0) {
|
|
55
|
+
this.props.onResizeButton();
|
|
56
|
+
}
|
|
57
|
+
this.props.onResize(delta);
|
|
58
|
+
this.props.onResizeEnd(delta);
|
|
59
|
+
};
|
|
60
|
+
this.mouseMoveHandler = (e) => {
|
|
61
|
+
const position = this.getPosition(e);
|
|
62
|
+
const delta = this.getDelta(position);
|
|
63
|
+
this.scheduleResize(delta);
|
|
64
|
+
};
|
|
65
|
+
this.mouseEnterHandler = () => {
|
|
66
|
+
this.setState({
|
|
67
|
+
isHovering: true,
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
this.mouseLeaveHandler = () => {
|
|
71
|
+
this.setState({
|
|
72
|
+
isHovering: false,
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
this.handleOutofBounds = (e) => {
|
|
76
|
+
const disableResizeNodes = [
|
|
77
|
+
'IFRAME',
|
|
78
|
+
'HTML',
|
|
79
|
+
null,
|
|
80
|
+
];
|
|
81
|
+
if (this.state.isResizing &&
|
|
82
|
+
disableResizeNodes.includes(e.relatedTarget && e.relatedTarget.nodeName)) {
|
|
83
|
+
this.mouseUpHandler(e, true);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
this.getDelta = (delta) => {
|
|
87
|
+
const { startPosition } = this.state;
|
|
88
|
+
return this.props.side === 'end'
|
|
89
|
+
? delta - startPosition
|
|
90
|
+
: startPosition - delta;
|
|
91
|
+
};
|
|
92
|
+
this.getPosition = (e) => {
|
|
93
|
+
return this.props.direction === 'row' ? e.screenX : e.screenY;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
render() {
|
|
97
|
+
const { buttonInner, direction, side } = this.props;
|
|
98
|
+
const ResizerInner = inners[direction][side];
|
|
99
|
+
return (React.createElement(ResizerInner, { ref: this.resizerRef, onMouseDown: this.mouseDownHandler, onMouseEnter: this.mouseEnterHandler, onMouseLeave: this.mouseLeaveHandler },
|
|
100
|
+
React.createElement(ResizerButton, { direction: direction, isCollapsed: this.props.collapsed, isVisible: this.state.isHovering, onClick: this.props.onResizeButton, side: side, buttonInner: buttonInner })));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { HorizontalEndResizerButtonInner, HorizontalStartResizerButtonInner, VerticalEndResizerButtonInner, VerticalStartResizerButtonInner, } from './ResizerButtonInner';
|
|
3
|
+
const inners = {
|
|
4
|
+
column: {
|
|
5
|
+
end: VerticalEndResizerButtonInner,
|
|
6
|
+
start: VerticalStartResizerButtonInner,
|
|
7
|
+
},
|
|
8
|
+
row: {
|
|
9
|
+
end: HorizontalEndResizerButtonInner,
|
|
10
|
+
start: HorizontalStartResizerButtonInner,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export class ResizerButton extends React.PureComponent {
|
|
14
|
+
render() {
|
|
15
|
+
const { buttonInner, direction, side, isCollapsed, onClick, isVisible } = this.props;
|
|
16
|
+
const ResizerButtonInner = buttonInner || inners[direction][side];
|
|
17
|
+
return (React.createElement(ResizerButtonInner, { "aria-expanded": !isCollapsed, isCollapsed: isCollapsed, isVisible: isVisible, onClick: onClick, onMouseDown: (event) => event.preventDefault() }));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
ResizerButton.defaultProps = {
|
|
21
|
+
isCollapsed: false,
|
|
22
|
+
isVisible: false,
|
|
23
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
const gridSize = 8;
|
|
3
|
+
const resizerVisibleSize = 2;
|
|
4
|
+
const toggleButtonDepth = gridSize * 4.5;
|
|
5
|
+
const toggleArrowDepth = gridSize * 2;
|
|
6
|
+
const toggleArrowSize = 2;
|
|
7
|
+
const toggleArrowStartOffset = (toggleButtonDepth - toggleArrowDepth) / 2;
|
|
8
|
+
const toggleArrowEndOffset = toggleArrowStartOffset - toggleArrowSize + toggleArrowDepth / 2;
|
|
9
|
+
const opacityTransition = `opacity 200ms ease-in-out 100ms`;
|
|
10
|
+
const transformTransition = `transform 100ms ease-in-out`;
|
|
11
|
+
const ResizerButtonInner = styled.button `
|
|
12
|
+
position: relative;
|
|
13
|
+
background: none;
|
|
14
|
+
border: none;
|
|
15
|
+
color: transparent;
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
|
|
18
|
+
&:focus {
|
|
19
|
+
outline: 1px solid blue;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&::before,
|
|
23
|
+
&::after {
|
|
24
|
+
content: '';
|
|
25
|
+
background-color: #ddd;
|
|
26
|
+
border-radius: ${toggleArrowDepth}px;
|
|
27
|
+
position: absolute;
|
|
28
|
+
opacity: ${(props) => (props.isVisible ? 1 : 0.5)};
|
|
29
|
+
transition: ${transformTransition}, ${opacityTransition};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&::before {
|
|
33
|
+
transform-origin: ${toggleArrowSize / 2}px
|
|
34
|
+
${toggleArrowDepth / 2 - toggleArrowSize / 2}px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&::after {
|
|
38
|
+
transform-origin: ${toggleArrowSize / 2}px ${toggleArrowSize / 2}px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&:hover,
|
|
42
|
+
&:focus {
|
|
43
|
+
&::before,
|
|
44
|
+
&::after {
|
|
45
|
+
background-color: #2a6f9d;
|
|
46
|
+
opacity: 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
const HorizontalResizerButtonInner = styled(ResizerButtonInner) `
|
|
51
|
+
top: calc(50% - ${toggleButtonDepth / 2}px);
|
|
52
|
+
width: ${gridSize * 3}px;
|
|
53
|
+
height: ${toggleButtonDepth}px;
|
|
54
|
+
|
|
55
|
+
&::before,
|
|
56
|
+
&::after {
|
|
57
|
+
width: ${toggleArrowSize}px;
|
|
58
|
+
height: ${toggleArrowDepth / 2}px;
|
|
59
|
+
transform: rotate(0deg);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&::before {
|
|
63
|
+
top: ${toggleArrowStartOffset}px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&::after {
|
|
67
|
+
top: ${toggleArrowEndOffset}px;
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
70
|
+
export const HorizontalEndResizerButtonInner = styled(HorizontalResizerButtonInner) `
|
|
71
|
+
left: -${resizerVisibleSize / 2}px;
|
|
72
|
+
|
|
73
|
+
&::before,
|
|
74
|
+
&::after {
|
|
75
|
+
left: 8px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
&:hover,
|
|
79
|
+
&:focus {
|
|
80
|
+
&::before {
|
|
81
|
+
transform: rotate(${(props) => (props.isCollapsed ? '-40deg' : '40deg')});
|
|
82
|
+
}
|
|
83
|
+
&::after {
|
|
84
|
+
transform: rotate(${(props) => (props.isCollapsed ? '40deg' : '-40deg')});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
export const HorizontalStartResizerButtonInner = styled(HorizontalResizerButtonInner) `
|
|
89
|
+
right: -${resizerVisibleSize / 2}px;
|
|
90
|
+
|
|
91
|
+
&::before,
|
|
92
|
+
&::after {
|
|
93
|
+
right: 16px;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
&:hover,
|
|
97
|
+
&:focus {
|
|
98
|
+
&::before {
|
|
99
|
+
transform: rotate(${(props) => (props.isCollapsed ? '40deg' : '-40deg')});
|
|
100
|
+
}
|
|
101
|
+
&::after {
|
|
102
|
+
transform: rotate(${(props) => (props.isCollapsed ? '-40deg' : '40deg')});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
const VerticalResizerButtonInner = styled(ResizerButtonInner) `
|
|
107
|
+
left: calc(50% - ${toggleButtonDepth / 2}px);
|
|
108
|
+
width: ${toggleButtonDepth}px;
|
|
109
|
+
height: ${gridSize * 3}px;
|
|
110
|
+
|
|
111
|
+
&::before,
|
|
112
|
+
&::after {
|
|
113
|
+
width: ${toggleArrowDepth / 2}px;
|
|
114
|
+
height: ${toggleArrowSize}px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
&::before {
|
|
118
|
+
left: ${toggleArrowStartOffset}px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&::after {
|
|
122
|
+
left: ${toggleArrowEndOffset}px;
|
|
123
|
+
}
|
|
124
|
+
`;
|
|
125
|
+
export const VerticalEndResizerButtonInner = styled(VerticalResizerButtonInner) `
|
|
126
|
+
bottom: -${resizerVisibleSize / 2}px;
|
|
127
|
+
|
|
128
|
+
&::before,
|
|
129
|
+
&::after {
|
|
130
|
+
bottom: 8px;
|
|
131
|
+
transform-origin: top center;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
&:hover,
|
|
135
|
+
&:focus {
|
|
136
|
+
&::before {
|
|
137
|
+
transform: rotate(${(props) => (props.isCollapsed ? '40deg' : '-40deg')});
|
|
138
|
+
}
|
|
139
|
+
&::after {
|
|
140
|
+
transform: rotate(${(props) => (props.isCollapsed ? '-40deg' : '40deg')});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
`;
|
|
144
|
+
export const VerticalStartResizerButtonInner = styled(VerticalResizerButtonInner) `
|
|
145
|
+
top: -${resizerVisibleSize / 2}px;
|
|
146
|
+
|
|
147
|
+
&::before,
|
|
148
|
+
&::after {
|
|
149
|
+
top: 8px;
|
|
150
|
+
transform: rotate(270deg);
|
|
151
|
+
transform-origin: bottom center;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
&:hover,
|
|
155
|
+
&:focus {
|
|
156
|
+
&::before {
|
|
157
|
+
transform: rotate(${(props) => (props.isCollapsed ? '-40deg' : '40deg')});
|
|
158
|
+
}
|
|
159
|
+
&::after {
|
|
160
|
+
transform: rotate(${(props) => (props.isCollapsed ? '40deg' : '-40deg')});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
`;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
const ResizerInner = styled.div `
|
|
3
|
+
display: block;
|
|
4
|
+
z-index: 2;
|
|
5
|
+
overflow: visible;
|
|
6
|
+
position: absolute;
|
|
7
|
+
|
|
8
|
+
&::before {
|
|
9
|
+
content: '';
|
|
10
|
+
position: absolute;
|
|
11
|
+
transition: background-color 200ms ease-in-out 100ms;
|
|
12
|
+
background: rgb(240, 240, 240);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&:hover::before {
|
|
16
|
+
background: #e2e2e2;
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
const HorizontalResizerInner = styled(ResizerInner) `
|
|
20
|
+
cursor: ew-resize;
|
|
21
|
+
top: 0;
|
|
22
|
+
height: 100%;
|
|
23
|
+
width: 16px;
|
|
24
|
+
|
|
25
|
+
&::before {
|
|
26
|
+
height: 100%;
|
|
27
|
+
width: 1px;
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
export const HorizontalStartResizerInner = styled(HorizontalResizerInner) `
|
|
31
|
+
left: -16px;
|
|
32
|
+
|
|
33
|
+
&::before {
|
|
34
|
+
right: -1px;
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
export const HorizontalEndResizerInner = styled(HorizontalResizerInner) `
|
|
38
|
+
right: -16px;
|
|
39
|
+
|
|
40
|
+
&::before {
|
|
41
|
+
left: -1px;
|
|
42
|
+
}
|
|
43
|
+
`;
|
|
44
|
+
const VerticalResizerInner = styled(ResizerInner) `
|
|
45
|
+
cursor: ns-resize;
|
|
46
|
+
left: 0;
|
|
47
|
+
height: 16px;
|
|
48
|
+
width: 100%;
|
|
49
|
+
|
|
50
|
+
&::before {
|
|
51
|
+
width: 100%;
|
|
52
|
+
height: 1px;
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
export const VerticalStartResizerInner = styled(VerticalResizerInner) `
|
|
56
|
+
top: -16px;
|
|
57
|
+
|
|
58
|
+
&::before {
|
|
59
|
+
bottom: -1px;
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
export const VerticalEndResizerInner = styled(VerticalResizerInner) `
|
|
63
|
+
bottom: -16px;
|
|
64
|
+
|
|
65
|
+
&::before {
|
|
66
|
+
top: -1px;
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* © 2022 Atypon Systems LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import React from 'react';
|
|
17
|
+
const AttachIcon = () => (React.createElement("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
18
|
+
React.createElement("path", { d: "M8.85683 5.35715L5.85183 8.36215C5.16883 9.04515 5.16883 10.1531 5.85183 10.8371C6.53483 11.5201 7.64283 11.5201 8.32683 10.8371L12.3928 6.77115C13.7598 5.40415 13.7598 3.18815 12.3928 1.82115C11.0258 0.454148 8.80983 0.454148 7.44283 1.82115L3.02383 6.24115C0.973828 8.29115 0.973828 11.6151 3.02383 13.6661C5.07383 15.7161 8.39783 15.7161 10.4488 13.6661L14.5138 9.60015", stroke: "#6E6E6E", strokeWidth: "1.5", strokeMiterlimit: "10", strokeLinecap: "round", strokeLinejoin: "round" })));
|
|
19
|
+
export default AttachIcon;
|
|
@@ -32,3 +32,6 @@ export { default as ZoomOutIcon } from './zoom-out';
|
|
|
32
32
|
export { default as TaskStepCurrentIcon } from './task-step-current';
|
|
33
33
|
export { default as TaskStepDoneIcon } from './task-step-done';
|
|
34
34
|
export { default as TaskStepNextIcon } from './task-step-next';
|
|
35
|
+
export { default as AttachIcon } from './attach';
|
|
36
|
+
export { default as UploadIcon } from './upload';
|
|
37
|
+
export { default as MissingImage } from './missing-image';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const MissingImage = () => (React.createElement("svg", { width: "28", height: "32", viewBox: "0 0 28 32", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
3
|
+
React.createElement("path", { d: "M2.99979 1.25C2.03237 1.25 1.25073 2.03442 1.25073 3V29C1.25073 29.9665 2.03423 30.75 3.00073 30.75H25.0007C25.9672 30.75 26.7507 29.9665 26.7507 29V11.4383C26.7507 10.9494 26.5462 10.4828 26.1868 10.1515L17.0318 1.71322C16.7092 1.41588 16.287 1.25 15.8467 1.25H15.8372H15.8275H15.8177H15.8078H15.7978H15.7877H15.7775H15.7671H15.7567H15.7462H15.7355H15.7248H15.7139H15.703H15.6919H15.6807H15.6694H15.6581H15.6466H15.635H15.6233H15.6115H15.5996H15.5876H15.5755H15.5633H15.551H15.5386H15.5261H15.5135H15.5008H15.488H15.4751H15.4621H15.449H15.4358H15.4225H15.4091H15.3956H15.382H15.3683H15.3545H15.3406H15.3266H15.3126H15.2984H15.2841H15.2697H15.2553H15.2407H15.2261H15.2113H15.1965H15.1815H15.1665H15.1514H15.1362H15.1209H15.1055H15.09H15.0744H15.0587H15.043H15.0271H15.0111H14.9951H14.979H14.9628H14.9464H14.93H14.9136H14.897H14.8803H14.8636H14.8467H14.8298H14.8128H14.7957H14.7785H14.7612H14.7438H14.7264H14.7089H14.6912H14.6735H14.6557H14.6379H14.6199H14.6019H14.5837H14.5655H14.5472H14.5289H14.5104H14.4919H14.4732H14.4545H14.4357H14.4169H14.3979H14.3789H14.3598H14.3406H14.3213H14.302H14.2825H14.263H14.2435H14.2238H14.204H14.1842H14.1643H14.1443H14.1243H14.1042H14.084H14.0637H14.0433H14.0229H14.0024H13.9818H13.9611H13.9404H13.9196H13.8987H13.8778H13.8567H13.8356H13.8144H13.7932H13.7719H13.7505H13.729H13.7075H13.6859H13.6642H13.6425H13.6206H13.5988H13.5768H13.5548H13.5327H13.5105H13.4883H13.466H13.4436H13.4212H13.3987H13.3761H13.3535H13.3308H13.308H13.2851H13.2622H13.2393H13.2162H13.1931H13.17H13.1467H13.1235H13.1001H13.0767H13.0532H13.0296H13.006H12.9824H12.9586H12.9348H12.911H12.8871H12.8631H12.839H12.8149H12.7908H12.7666H12.7423H12.7179H12.6935H12.6691H12.6446H12.62H12.5954H12.5707H12.5459H12.5211H12.4963H12.4713H12.4464H12.4213H12.3963H12.3711H12.3459H12.3207H12.2954H12.27H12.2446H12.2191H12.1936H12.168H12.1424H12.1167H12.091H12.0652H12.0394H12.0135H11.9876H11.9616H11.9355H11.9094H11.8833H11.8571H11.8309H11.8046H11.7782H11.7519H11.7254H11.6989H11.6724H11.6458H11.6192H11.5925H11.5658H11.539H11.5122H11.4854H11.4585H11.4315H11.4045H11.3775H11.3504H11.3233H11.2961H11.2689H11.2416H11.2143H11.187H11.1596H11.1322H11.1047H11.0772H11.0497H11.0221H10.9944H10.9668H10.939H10.9113H10.8835H10.8556H10.8278H10.7999H10.7719H10.7439H10.7159H10.6878H10.6597H10.6316H10.6034H10.5752H10.5469H10.5187H10.4903H10.462H10.4336H10.4052H10.3767H10.3482H10.3197H10.2911H10.2625H10.2339H10.2052H10.1765H10.1478H10.119H10.0902H10.0614H10.0326H10.0037H9.97477H9.94582H9.91684H9.88784H9.8588H9.82973H9.80064H9.77151H9.74236H9.71318H9.68397H9.65474H9.62547H9.59618H9.56687H9.53752H9.50815H9.47876H9.44934H9.41989H9.39042H9.36092H9.3314H9.30186H9.27229H9.24269H9.21308H9.18344H9.15378H9.12409H9.09438H9.06465H9.0349H9.00513H8.97534H8.94552H8.91569H8.88583H8.85596H8.82606H8.79615H8.76621H8.73626H8.70629H8.6763H8.64629H8.61627H8.58623H8.55617H8.52609H8.49599H8.46588H8.43576H8.40562H8.37546H8.34529H8.3151H8.2849H8.25468H8.22445H8.1942H8.16394H8.13367H8.10339H8.07309H8.04278H8.01246H7.98212H7.95178H7.92142H7.89105H7.86067H7.83029H7.79989H7.76948H7.73906H7.70863H7.67819H7.64775H7.61729H7.58683H7.55636H7.52588H7.49539H7.4649H7.4344H7.40389H7.37338H7.34286H7.31234H7.28181H7.25127H7.22073H7.19019H7.15964H7.12908H7.09853H7.06797H7.0374H7.00684H6.97627H6.9457H6.91512H6.88455H6.85397H6.82339H6.79282H6.76224H6.73166H6.70108H6.6705H6.63992H6.60934H6.57876H6.54819H6.51761H6.48704H6.45647H6.4259H6.39533H6.36477H6.33421H6.30366H6.27311H6.24256H6.21201H6.18148H6.15094H6.12041H6.08989H6.05937H6.02886H5.99836H5.96786H5.93737H5.90689H5.87641H5.84594H5.81548H5.78503H5.75458H5.72415H5.69372H5.66331H5.6329H5.6025H5.57212H5.54174H5.51138H5.48102H5.45068H5.42035H5.39003H5.35973H5.32943H5.29915H5.26888H5.23863H5.20839H5.17816H5.14795H5.11775H5.08757H5.0574H5.02725H4.99711H4.96699H4.93688H4.90679H4.87672H4.84667H4.81663H4.78661H4.75661H4.72662H4.69666H4.66671H4.63678H4.60687H4.57698H4.54712H4.51727H4.48744H4.45763H4.42784H4.39808H4.36833H4.33861H4.30891H4.27923H4.24958H4.21994H4.19033H4.16075H4.13119H4.10165H4.07213H4.04264H4.01318H3.98374H3.95433H3.92494H3.89558H3.86624H3.83693H3.80765H3.7784H3.74917H3.71997H3.6908H3.66165H3.63254H3.60345H3.57439H3.54537H3.51637H3.4874H3.45846H3.42955H3.40068H3.37183H3.34302H3.31423H3.28548H3.25676H3.22808H3.19942H3.1708H3.14222H3.11366H3.08514H3.05666H3.02821H2.99979Z", stroke: "#6E6E6E", strokeWidth: "1.5" }),
|
|
4
|
+
React.createElement("path", { d: "M8.00073 24C10.1219 20.9815 15.8916 16.7556 22.0007 24", stroke: "#6E6E6E", strokeWidth: "1.5", strokeLinecap: "round" }),
|
|
5
|
+
React.createElement("path", { d: "M8.00073 8C8.00073 8 8.00073 9.04738 8.00073 11", stroke: "#6E6E6E", strokeWidth: "1.5", strokeLinecap: "round" }),
|
|
6
|
+
React.createElement("path", { d: "M16.0007 2V12H26.0007", stroke: "#6E6E6E", strokeWidth: "1.5" })));
|
|
7
|
+
export default MissingImage;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const UploadIcon = () => (React.createElement("svg", { width: "17", height: "18", viewBox: "0 0 17 18", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
3
|
+
React.createElement("path", { d: "M8.5 12.5V1.5", stroke: "#6E6E6E", strokeWidth: "1.5", strokeMiterlimit: "10", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
4
|
+
React.createElement("path", { d: "M13.5 6.5L8.5 1.5L3.5 6.5", stroke: "#6E6E6E", strokeWidth: "1.5", strokeMiterlimit: "10", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
5
|
+
React.createElement("path", { d: "M15.5 16.5H1.5", stroke: "#6E6E6E", strokeWidth: "1.5", strokeMiterlimit: "10", strokeLinecap: "round", strokeLinejoin: "round" })));
|
|
6
|
+
export default UploadIcon;
|
package/dist/es/index.js
CHANGED
|
@@ -32,6 +32,7 @@ export * from './components/Form';
|
|
|
32
32
|
export * from './components/FileManager';
|
|
33
33
|
export * from './components/FileManager/util';
|
|
34
34
|
export * from './components/FileManager/FileSectionItem/FileSectionItem';
|
|
35
|
+
export * from './components/Resizer';
|
|
35
36
|
export * from './components/SaveStatus';
|
|
36
37
|
export * from './components/SimpleModal';
|
|
37
38
|
export * from './components/StyledModal';
|
|
@@ -4,33 +4,44 @@ import { FileType } from '../components/FileManager/util';
|
|
|
4
4
|
const getCaptionText = (caption) => caption &&
|
|
5
5
|
new DOMParser().parseFromString(caption, 'text/html').documentElement
|
|
6
6
|
.innerText;
|
|
7
|
-
const
|
|
8
|
-
|
|
7
|
+
const getAttachment = (externalFileRef, attachmentsMap) => {
|
|
8
|
+
if (!(externalFileRef === null || externalFileRef === void 0 ? void 0 : externalFileRef.url.includes('https://'))) {
|
|
9
|
+
const attachmentId = externalFileRef === null || externalFileRef === void 0 ? void 0 : externalFileRef.url.replace('attachment:', '');
|
|
10
|
+
return attachmentId ? attachmentsMap.get(attachmentId) : undefined;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return [...attachmentsMap.values()].find((attachment) => attachment.link === externalFileRef.url);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const getFigureData = (element, modelMap, attachmentsMap) => {
|
|
17
|
+
const attachments = [];
|
|
9
18
|
element.containedObjectIDs.map((e) => {
|
|
10
19
|
var _a;
|
|
11
20
|
const object = modelMap.get(e);
|
|
12
21
|
if (object && object.objectType === ObjectTypes.Figure) {
|
|
13
22
|
const externalFileRef = (_a = object.externalFileReferences) === null || _a === void 0 ? void 0 : _a.find((figure) => figure.kind === 'imageRepresentation');
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
const attachment = getAttachment(externalFileRef, attachmentsMap);
|
|
24
|
+
if (attachment) {
|
|
25
|
+
attachments.push(attachment);
|
|
16
26
|
}
|
|
17
27
|
}
|
|
18
28
|
});
|
|
19
29
|
return {
|
|
20
30
|
id: element._id,
|
|
21
|
-
|
|
31
|
+
attachments,
|
|
22
32
|
caption: getCaptionText(element.caption),
|
|
23
33
|
};
|
|
24
34
|
};
|
|
25
|
-
export default (modelMap) => {
|
|
35
|
+
export default (modelMap, attachments) => {
|
|
26
36
|
const files = [];
|
|
37
|
+
const attachmentsMap = new Map(attachments.map((attachment) => [attachment.id, attachment]));
|
|
27
38
|
getModelsByType(modelMap, ObjectTypes.Section).map((section) => {
|
|
28
39
|
var _a, _b;
|
|
29
40
|
if (section.category === 'MPSectionCategory:abstract-graphical') {
|
|
30
41
|
(_a = section.elementIDs) === null || _a === void 0 ? void 0 : _a.some((elementId) => {
|
|
31
42
|
const element = modelMap.get(elementId);
|
|
32
43
|
if (element && hasObjectType(ObjectTypes.FigureElement)(element)) {
|
|
33
|
-
files.unshift(Object.assign(Object.assign({}, getFigureData(element, modelMap)), { label: `Graphical Abstract`, type: FileType.GraphicalAbstract }));
|
|
44
|
+
files.unshift(Object.assign(Object.assign({}, getFigureData(element, modelMap, attachmentsMap)), { label: `Graphical Abstract`, type: FileType.GraphicalAbstract }));
|
|
34
45
|
return true;
|
|
35
46
|
}
|
|
36
47
|
});
|
|
@@ -45,19 +56,20 @@ export default (modelMap) => {
|
|
|
45
56
|
switch (element.objectType) {
|
|
46
57
|
case ObjectTypes.FigureElement:
|
|
47
58
|
case ObjectTypes.MultiGraphicFigureElement: {
|
|
48
|
-
files.push(Object.assign(Object.assign({}, getFigureData(element, modelMap)), { label: `Figure`, type: FileType.Figure }));
|
|
59
|
+
files.push(Object.assign(Object.assign({}, getFigureData(element, modelMap, attachmentsMap)), { label: `Figure`, type: FileType.Figure }));
|
|
49
60
|
break;
|
|
50
61
|
}
|
|
51
62
|
case ObjectTypes.TableElement: {
|
|
52
63
|
const tableElement = element;
|
|
53
64
|
const table = modelMap.get(tableElement.containedObjectID);
|
|
54
|
-
const
|
|
55
|
-
|
|
65
|
+
const externalFileReference = (_a = table.externalFileReferences) === null || _a === void 0 ? void 0 : _a.find((file) => file.kind === 'dataset' && file.ref);
|
|
66
|
+
const attachment = getAttachment(externalFileReference, attachmentsMap);
|
|
67
|
+
if (attachment) {
|
|
56
68
|
files.push({
|
|
57
69
|
id: element._id,
|
|
58
70
|
label: `Table`,
|
|
59
71
|
type: FileType.SheetsWorkbooks,
|
|
60
|
-
|
|
72
|
+
attachments: [attachment],
|
|
61
73
|
caption: getCaptionText(tableElement.caption),
|
|
62
74
|
});
|
|
63
75
|
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Model } from '@manuscripts/manuscripts-json-schema';
|
|
2
2
|
import React, { Dispatch } from 'react';
|
|
3
|
+
import { SubmissionAttachment } from './FileSectionItem/FileSectionItem';
|
|
3
4
|
import { Action } from './FileSectionState';
|
|
4
5
|
export interface ExternalFileRef {
|
|
5
6
|
url: string;
|
|
6
7
|
kind?: string;
|
|
7
|
-
ref?:
|
|
8
|
+
ref?: SubmissionAttachment;
|
|
8
9
|
}
|
|
9
10
|
export declare const InlineFilesSection: React.FC<{
|
|
10
11
|
submissionId: string;
|
|
12
|
+
attachments: SubmissionAttachment[];
|
|
11
13
|
modelMap: Map<string, Model>;
|
|
12
14
|
handleReplace: (submissionId: string, attachmentId: string, name: string, file: File, typeId: string) => Promise<boolean>;
|
|
13
15
|
handleDownload: (url: string) => void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ResizerButtonInnerProps } from './ResizerButtonInner';
|
|
3
|
+
import { ResizerDirection, ResizerSide } from './types';
|
|
4
|
+
interface Props {
|
|
5
|
+
collapsed: boolean;
|
|
6
|
+
direction: ResizerDirection;
|
|
7
|
+
onResize: (resizeDelta: number) => void;
|
|
8
|
+
onResizeButton: () => void;
|
|
9
|
+
onResizeEnd: (resizeDelta: number) => void;
|
|
10
|
+
side: ResizerSide;
|
|
11
|
+
buttonInner?: React.ComponentType<ResizerButtonInnerProps>;
|
|
12
|
+
}
|
|
13
|
+
interface State {
|
|
14
|
+
isHovering: boolean;
|
|
15
|
+
isResizing: boolean;
|
|
16
|
+
startPosition: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class Resizer extends React.Component<Props, State> {
|
|
19
|
+
resizerRef: React.RefObject<HTMLDivElement>;
|
|
20
|
+
state: {
|
|
21
|
+
isHovering: boolean;
|
|
22
|
+
isResizing: boolean;
|
|
23
|
+
startPosition: number;
|
|
24
|
+
};
|
|
25
|
+
render(): JSX.Element;
|
|
26
|
+
private scheduleResize;
|
|
27
|
+
private mouseDownHandler;
|
|
28
|
+
private mouseUpHandler;
|
|
29
|
+
private mouseMoveHandler;
|
|
30
|
+
private mouseEnterHandler;
|
|
31
|
+
private mouseLeaveHandler;
|
|
32
|
+
private handleOutofBounds;
|
|
33
|
+
private getDelta;
|
|
34
|
+
private getPosition;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ResizerButtonInnerProps } from './ResizerButtonInner';
|
|
3
|
+
import { ResizerDirection, ResizerSide } from './types';
|
|
4
|
+
interface Props extends React.HTMLProps<HTMLButtonElement> {
|
|
5
|
+
direction: ResizerDirection;
|
|
6
|
+
isCollapsed: boolean;
|
|
7
|
+
isVisible: boolean;
|
|
8
|
+
side: ResizerSide;
|
|
9
|
+
buttonInner?: React.ComponentType<ResizerButtonInnerProps>;
|
|
10
|
+
}
|
|
11
|
+
export declare class ResizerButton extends React.PureComponent<Props> {
|
|
12
|
+
static defaultProps: {
|
|
13
|
+
isCollapsed: boolean;
|
|
14
|
+
isVisible: boolean;
|
|
15
|
+
};
|
|
16
|
+
render(): JSX.Element;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ResizerButtonInnerProps {
|
|
2
|
+
isCollapsed: boolean;
|
|
3
|
+
isVisible: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare const HorizontalEndResizerButtonInner: import("styled-components").StyledComponent<"button", import("styled-components").DefaultTheme, ResizerButtonInnerProps, never>;
|
|
6
|
+
export declare const HorizontalStartResizerButtonInner: import("styled-components").StyledComponent<"button", import("styled-components").DefaultTheme, ResizerButtonInnerProps, never>;
|
|
7
|
+
export declare const VerticalEndResizerButtonInner: import("styled-components").StyledComponent<"button", import("styled-components").DefaultTheme, ResizerButtonInnerProps, never>;
|
|
8
|
+
export declare const VerticalStartResizerButtonInner: import("styled-components").StyledComponent<"button", import("styled-components").DefaultTheme, ResizerButtonInnerProps, never>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const HorizontalStartResizerInner: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
|
|
2
|
+
export declare const HorizontalEndResizerInner: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
|
|
3
|
+
export declare const VerticalStartResizerInner: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
|
|
4
|
+
export declare const VerticalEndResizerInner: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
|