@manuscripts/body-editor 1.7.28 → 1.7.29

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.
@@ -20,6 +20,7 @@ import React, { useRef, useState } from 'react';
20
20
  import { useDrag, useDrop } from 'react-dnd';
21
21
  import styled from 'styled-components';
22
22
  import { authorLabel } from '../../lib/authors';
23
+ import { getDropSide } from '../../lib/dnd';
23
24
  const AuthorContainer = styled.div `
24
25
  padding: ${(props) => props.theme.grid.unit * 2}px;
25
26
  display: flex;
@@ -78,26 +79,12 @@ const AuthorName = styled.div `
78
79
  const DragHandle = styled(VerticalEllipsis) `
79
80
  cursor: move;
80
81
  `;
81
- const BEFORE = {
82
- id: 'before',
83
- diff: -0.5,
84
- };
85
- const AFTER = {
86
- id: 'after',
87
- diff: 0.5,
88
- };
89
- const getDropPosition = (element, monitor) => {
90
- const rect = element.getBoundingClientRect();
91
- const middle = (rect.bottom - rect.top) / 2;
92
- const cursor = monitor.getClientOffset();
93
- return cursor.y > middle + rect.top ? AFTER : BEFORE;
94
- };
95
82
  export const DraggableAuthor = ({ author, isSelected, onClick, moveAuthor, }) => {
96
- const [dropPosition, setDropPosition] = useState();
83
+ const [dropSide, setDropSide] = useState();
97
84
  const ref = useRef(null);
98
85
  const [{ isDragging }, dragRef] = useDrag({
86
+ type: 'author',
99
87
  item: {
100
- type: 'author',
101
88
  author,
102
89
  },
103
90
  collect: (monitor) => ({
@@ -106,29 +93,30 @@ export const DraggableAuthor = ({ author, isSelected, onClick, moveAuthor, }) =>
106
93
  });
107
94
  const [{ isOver }, dropRef] = useDrop({
108
95
  accept: 'author',
109
- collect: (monitor) => ({
110
- isOver: monitor.isOver(),
111
- }),
112
96
  hover: (item, monitor) => {
113
97
  if (!ref.current) {
114
98
  return;
115
99
  }
116
- const position = getDropPosition(ref.current, monitor);
117
- setDropPosition(position);
100
+ const side = getDropSide(ref.current, monitor);
101
+ setDropSide(side);
118
102
  },
119
103
  drop: (item, monitor) => {
120
104
  if (!ref.current) {
121
105
  return;
122
106
  }
123
- const position = getDropPosition(ref.current, monitor);
107
+ const side = getDropSide(ref.current, monitor);
124
108
  const from = item.author.priority;
125
109
  const to = author.priority;
126
- moveAuthor(from, to + position.diff);
110
+ const diff = side === 'before' ? -0.5 : 0.5;
111
+ moveAuthor(from, to + diff);
127
112
  },
113
+ collect: (monitor) => ({
114
+ isOver: monitor.isOver(),
115
+ }),
128
116
  });
129
117
  dragRef(dropRef(ref));
130
118
  const dragClass = isDragging ? 'dragging' : '';
131
- const dropClass = isOver && dropPosition ? `drop-${dropPosition.id}` : '';
119
+ const dropClass = isOver && dropSide ? `drop-${dropSide}` : '';
132
120
  const activeClass = isSelected ? 'active' : '';
133
121
  return (React.createElement(AuthorContainer, { ref: ref, className: `${dragClass} ${dropClass} ${activeClass}`, onClick: onClick },
134
122
  React.createElement(AvatarContainer, null,
@@ -1,12 +1,12 @@
1
1
  import { isElementNodeType, nodeTitle, nodeTitlePlaceholder, schema, } from '@manuscripts/transform';
2
2
  import { Fragment } from 'prosemirror-model';
3
- import * as React from 'react';
4
- import { DragSource, DropTarget, } from 'react-dnd';
5
- import { findDOMNode } from 'react-dom';
3
+ import React, { useRef, useState } from 'react';
4
+ import { useDrag, useDrop } from 'react-dnd';
6
5
  import { ContextMenu } from '../../lib/context-menu';
6
+ import { getDropSide } from '../../lib/dnd';
7
7
  import { isDeleted, isRejectedInsert } from '../../lib/track-changes-utils';
8
8
  import { nodeTypeIcon } from '../../node-type-icons';
9
- import { Outline, OutlineDropPreview, OutlineItem, OutlineItemArrow, OutlineItemIcon, OutlineItemLink, OutlineItemLinkText, OutlineItemNoArrow, OutlineItemPlaceholder, StyledTriangleCollapsed, StyledTriangleExpanded, } from './Outline';
9
+ import { Outline, OutlineItem, OutlineItemArrow, OutlineItemIcon, OutlineItemLink, OutlineItemLinkText, OutlineItemNoArrow, OutlineItemPlaceholder, StyledTriangleCollapsed, StyledTriangleExpanded, } from './Outline';
10
10
  const excludedTypes = [
11
11
  schema.nodes.table,
12
12
  schema.nodes.figure,
@@ -30,11 +30,10 @@ const isChildrenExcluded = (nodeType) => {
30
30
  const isManuscriptNode = (node) => {
31
31
  return (node === null || node === void 0 ? void 0 : node.type) === schema.nodes.manuscript;
32
32
  };
33
- export const buildTree = ({ node, pos, index, selected, parent, }) => {
33
+ export const buildTree = ({ node, pos, index, parent, }) => {
34
34
  const items = [];
35
35
  const startPos = pos + 1;
36
36
  const endPos = pos + node.nodeSize;
37
- const isSelected = selected ? node.attrs.id === selected.node.attrs.id : false;
38
37
  if (!isChildrenExcluded(node.type)) {
39
38
  node.forEach((childNode, offset, childIndex) => {
40
39
  if (isExcluded(childNode.type)) {
@@ -47,171 +46,108 @@ export const buildTree = ({ node, pos, index, selected, parent, }) => {
47
46
  node: childNode,
48
47
  pos: startPos + offset,
49
48
  index: childIndex,
50
- selected,
51
49
  parent: node,
52
50
  }));
53
51
  }
54
52
  });
55
53
  }
56
- return { node, index, items, pos, endPos, parent, isSelected };
54
+ return { node, index, items, pos, endPos, parent };
57
55
  };
58
- class Tree extends React.Component {
59
- constructor(props) {
60
- super(props);
61
- this.outlineStyles = (isDragging) => ({
62
- opacity: isDragging ? 0.5 : 1,
63
- });
64
- this.bottomPreviewStyles = (mightDrop, dragPosition) => ({
65
- bottom: '-1px',
66
- visibility: mightDrop && dragPosition === 'after' ? 'visible' : 'hidden',
67
- });
68
- this.topPreviewStyles = (mightDrop, dragPosition) => ({
69
- top: '0px',
70
- visibility: mightDrop && dragPosition === 'before' ? 'visible' : 'hidden',
71
- });
72
- this.toggle = () => {
73
- this.setState({
74
- open: !this.state.open,
75
- });
76
- };
77
- this.itemText = (node) => {
78
- const text = nodeTitle(node);
79
- if (text) {
80
- return text.trim();
56
+ export const DraggableTree = ({ tree, view, depth, can, }) => {
57
+ const [dropSide, setDropSide] = useState();
58
+ const [isOpen, setOpen] = useState(depth === 0);
59
+ const ref = useRef(null);
60
+ const { node, items, parent } = tree;
61
+ const itemText = (node) => {
62
+ const text = nodeTitle(node);
63
+ if (text) {
64
+ return text.trim();
65
+ }
66
+ const placeholder = nodeTitlePlaceholder(node.type);
67
+ return React.createElement(OutlineItemPlaceholder, null, placeholder);
68
+ };
69
+ const toggleOpen = () => {
70
+ setOpen(!isOpen);
71
+ };
72
+ const [{ isDragging }, dragRef] = useDrag({
73
+ type: 'outline',
74
+ item: tree,
75
+ canDrag: () => {
76
+ return depth !== 0;
77
+ },
78
+ collect: (monitor) => ({
79
+ isDragging: monitor.isDragging(),
80
+ }),
81
+ });
82
+ const [{ isOver }, dropRef] = useDrop({
83
+ accept: 'outline',
84
+ canDrop(item, monitor) {
85
+ if (!ref.current) {
86
+ return false;
81
87
  }
82
- const placeholder = nodeTitlePlaceholder(node.type);
83
- return React.createElement(OutlineItemPlaceholder, null, placeholder);
84
- };
85
- this.handleContextMenu = (event) => {
86
- event.preventDefault();
87
- event.stopPropagation();
88
- if (!this.props.editArticle) {
88
+ if (!tree.parent) {
89
89
  return false;
90
90
  }
91
- const menu = this.createMenu();
92
- if (!menu) {
91
+ if (item.node.attrs.id === tree.node.attrs.id) {
93
92
  return false;
94
93
  }
95
- menu.showEditMenu(event.currentTarget);
96
- };
97
- this.createMenu = () => {
98
- const { tree, view } = this.props;
99
- if (!view) {
100
- return null;
94
+ if (item.pos <= tree.pos && item.endPos >= tree.endPos) {
95
+ return false;
101
96
  }
102
- return new ContextMenu(tree.node, view, () => tree.pos - 1);
103
- };
104
- this.state = {
105
- open: !props.depth,
106
- dragPosition: null,
107
- };
108
- }
109
- render() {
110
- const { depth = 0, tree, canDrop, connectDragSource, connectDragPreview, connectDropTarget, isDragging, isOverCurrent, item, view, } = this.props;
111
- const { open, dragPosition } = this.state;
112
- const { node, items, isSelected, parent } = tree;
113
- const isDeletedItem = isDeleted(node);
114
- const isRejectedItem = isRejectedInsert(node);
115
- const mightDrop = item && isOverCurrent && canDrop;
116
- const isTop = isManuscriptNode(parent);
117
- if (isRejectedItem) {
118
- return null;
119
- }
120
- return connectDropTarget(React.createElement("div", null,
121
- React.createElement(Outline, { style: this.outlineStyles(isDragging) },
122
- React.createElement(OutlineDropPreview, { depth: depth, style: this.topPreviewStyles(mightDrop, dragPosition) }),
123
- !isTop &&
124
- connectDragSource(React.createElement("div", null,
125
- React.createElement(OutlineItem, { isSelected: isSelected, depth: depth, onContextMenu: this.handleContextMenu },
126
- items.length ? (React.createElement(OutlineItemArrow, { onClick: this.toggle }, open ? (React.createElement(StyledTriangleExpanded, null)) : (React.createElement(StyledTriangleCollapsed, null)))) : (React.createElement(OutlineItemNoArrow, null)),
127
- React.createElement(OutlineItemLink, { to: `#${node.attrs.id || ''}` },
128
- connectDragPreview(React.createElement("span", { style: {
129
- display: 'inline-flex',
130
- alignItems: 'center',
131
- } },
132
- React.createElement(OutlineItemIcon, null, nodeTypeIcon(node.type)))),
133
- React.createElement(OutlineItemLinkText, { className: `outline-text-${node.type.name} ${isDeletedItem && 'deleted'}` }, this.itemText(node)))))),
134
- items.length ? (React.createElement("div", { style: {
135
- display: open || isTop ? '' : 'none',
136
- } }, items.map((subtree) => (React.createElement(DraggableTree, Object.assign({}, this.props, { key: subtree.node.attrs.id, tree: subtree, view: view, depth: isTop ? depth : depth + 1 })))))) : (''),
137
- React.createElement(OutlineDropPreview, { depth: depth, style: this.bottomPreviewStyles(mightDrop, dragPosition) }))));
97
+ const side = getDropSide(ref.current, monitor);
98
+ const index = side === 'before' ? tree.index : tree.index + 1;
99
+ return tree.parent.canReplace(index, index, Fragment.from(item.node));
100
+ },
101
+ hover(item, monitor) {
102
+ if (!ref.current || !monitor.canDrop()) {
103
+ return;
104
+ }
105
+ const side = getDropSide(ref.current, monitor);
106
+ setDropSide(side);
107
+ },
108
+ drop(item, monitor) {
109
+ if (!ref.current || !view) {
110
+ return;
111
+ }
112
+ const side = getDropSide(ref.current, monitor);
113
+ const pos = side === 'before' ? tree.pos - 1 : tree.endPos - 1;
114
+ let sourcePos = item.pos - 1;
115
+ const node = item.node.type.schema.nodes[item.node.type.name].create(Object.assign(Object.assign({}, item.node.attrs), { id: '' }), item.node.content);
116
+ const tr = view.state.tr.insert(pos, node);
117
+ sourcePos = tr.mapping.map(sourcePos);
118
+ tr.delete(sourcePos, sourcePos + item.node.nodeSize);
119
+ view.dispatch(tr);
120
+ },
121
+ collect: (monitor) => ({
122
+ isOver: monitor.isOver({ shallow: true }),
123
+ }),
124
+ });
125
+ const isDeletedItem = isDeleted(node);
126
+ const isRejectedItem = isRejectedInsert(node);
127
+ const isTop = isManuscriptNode(parent);
128
+ if (isRejectedItem) {
129
+ return null;
138
130
  }
139
- }
140
- const dragSource = DragSource('outline', {
141
- beginDrag(props) {
142
- return {
143
- tree: props.tree,
144
- };
145
- },
146
- canDrag(props) {
147
- return props.editArticle && !!props.tree.parent;
148
- },
149
- }, (connect, monitor) => ({
150
- connectDragSource: connect.dragSource(),
151
- connectDragPreview: connect.dragPreview(),
152
- isDragging: monitor.isDragging(),
153
- canDrag: monitor.canDrag(),
154
- item: monitor.getItem(),
155
- }));
156
- const dropTarget = DropTarget('outline', {
157
- canDrop(props, monitor) {
158
- const item = monitor.getItem();
159
- if (!props.tree.parent) {
160
- return false;
161
- }
162
- if (item.tree.node.attrs.id === props.tree.node.attrs.id) {
163
- return false;
164
- }
165
- if (item.tree.pos <= props.tree.pos &&
166
- item.tree.endPos >= props.tree.endPos) {
131
+ const handleContextMenu = (e) => {
132
+ e.preventDefault();
133
+ e.stopPropagation();
134
+ if (!(can === null || can === void 0 ? void 0 : can.editArticle)) {
167
135
  return false;
168
136
  }
169
- const index = item.position === 'before' ? props.tree.index : props.tree.index + 1;
170
- return props.tree.parent.canReplace(index, index, Fragment.from(item.tree.node));
171
- },
172
- hover(props, monitor, component) {
173
- if (monitor.isOver({ shallow: true })) {
174
- const offset = monitor.getClientOffset();
175
- if (offset) {
176
- const item = monitor.getItem();
177
- const node = findDOMNode(component);
178
- const { bottom, top } = node.getBoundingClientRect();
179
- const verticalMiddle = (bottom - top) / 2;
180
- const verticalHover = offset.y - top;
181
- item.position = verticalHover < verticalMiddle ? 'before' : 'after';
182
- component.setState({
183
- dragPosition: item.position,
184
- });
185
- }
186
- }
187
- },
188
- drop(props, monitor) {
189
- var _a;
190
- if (monitor.didDrop()) {
191
- return;
192
- }
193
- if (!props.view) {
194
- return;
137
+ if (!view) {
138
+ return null;
195
139
  }
196
- const item = monitor.getItem();
197
- const source = item.tree;
198
- const target = props.tree;
199
- const side = item.position;
200
- const insertPos = side === 'before'
201
- ? target.pos - 1
202
- : target.pos + target.node.nodeSize - 1;
203
- let sourcePos = source.pos - 1;
204
- const newNode = source.node.type.schema.nodes[source.node.type.name].create(Object.assign(Object.assign({}, source.node.attrs), { id: '' }), (_a = source.node) === null || _a === void 0 ? void 0 : _a.content);
205
- const tr = props.view.state.tr.insert(insertPos, newNode);
206
- sourcePos = tr.mapping.map(sourcePos);
207
- tr.delete(sourcePos, sourcePos + source.node.nodeSize);
208
- props.view.dispatch(tr);
209
- },
210
- }, (connect, monitor) => ({
211
- connectDropTarget: connect.dropTarget(),
212
- isOverCurrent: monitor.isOver({ shallow: true }),
213
- canDrop: monitor.canDrop(),
214
- itemType: monitor.getItemType(),
215
- }));
216
- const DraggableTree = dragSource(dropTarget(Tree));
217
- export default DraggableTree;
140
+ const menu = new ContextMenu(tree.node, view, () => tree.pos - 1);
141
+ menu.showEditMenu(e.currentTarget);
142
+ };
143
+ dragRef(dropRef(ref));
144
+ const dragClass = isDragging ? 'dragging' : '';
145
+ const dropClass = isOver && dropSide ? `drop-${dropSide}` : '';
146
+ return (React.createElement(Outline, { ref: ref, className: `${dragClass} ${dropClass}` },
147
+ !isTop && (React.createElement(OutlineItem, { depth: depth, onContextMenu: handleContextMenu },
148
+ items.length ? (React.createElement(OutlineItemArrow, { onClick: toggleOpen }, isOpen ? (React.createElement(StyledTriangleExpanded, null)) : (React.createElement(StyledTriangleCollapsed, null)))) : (React.createElement(OutlineItemNoArrow, null)),
149
+ React.createElement(OutlineItemLink, { to: `#${node.attrs.id}` },
150
+ React.createElement(OutlineItemIcon, null, nodeTypeIcon(node.type)),
151
+ React.createElement(OutlineItemLinkText, { className: `outline-text-${node.type.name} ${isDeletedItem && 'deleted'}` }, itemText(node))))),
152
+ items.length ? (React.createElement("div", { className: `subtree ${isOpen ? '' : 'collapsed'}` }, items.map((subtree) => (React.createElement(DraggableTree, { key: subtree.node.attrs.id, tree: subtree, view: view, depth: !tree.parent ? depth : depth + 1, can: can }))))) : null));
153
+ };
@@ -15,26 +15,23 @@
15
15
  */
16
16
  import React, { useEffect, useState } from 'react';
17
17
  import { useDebounce } from '../hooks/use-debounce';
18
- import DraggableTree, { buildTree } from './DraggableTree';
18
+ import { buildTree, DraggableTree } from './DraggableTree';
19
19
  export const ManuscriptOutline = (props) => {
20
- var _a;
21
20
  const [values, setValues] = useState();
22
21
  const debouncedProps = useDebounce(props, 500);
23
22
  useEffect(() => {
24
- var _a;
25
- const { doc, view, selected } = debouncedProps;
23
+ const { doc, view } = debouncedProps;
26
24
  if (doc) {
27
25
  const tree = buildTree({
28
26
  node: doc,
29
27
  pos: 0,
30
28
  index: 0,
31
- selected,
32
29
  });
33
- setValues({ tree, view, editArticle: !!((_a = props.capabilities) === null || _a === void 0 ? void 0 : _a.editArticle) });
30
+ setValues({ tree, view, can: props.can });
34
31
  }
35
32
  else {
36
33
  setValues(undefined);
37
34
  }
38
- }, [debouncedProps, (_a = props.capabilities) === null || _a === void 0 ? void 0 : _a.editArticle]);
39
- return values ? React.createElement(DraggableTree, Object.assign({}, values)) : null;
35
+ }, [debouncedProps, props.can]);
36
+ return values ? React.createElement(DraggableTree, Object.assign({}, values, { depth: 0 })) : null;
40
37
  };
@@ -28,12 +28,6 @@ export const OutlineItemIcon = styled.span `
28
28
  `;
29
29
  export const OutlineItem = styled.div `
30
30
  align-items: center;
31
- border-bottom: 1px solid transparent;
32
- border-top: 1px solid transparent;
33
- background: ${(props) => props.isSelected ? props.theme.colors.background.fifth : 'transparent'};
34
- border-color: ${(props) => props.isSelected
35
- ? props.theme.colors.border.primary
36
- : props.theme.colors.background.fifth};
37
31
  color: ${(props) => props.theme.colors.text.primary};
38
32
  box-sizing: border-box;
39
33
  cursor: pointer;
@@ -53,14 +47,6 @@ export const OutlineItem = styled.div `
53
47
  background: ${(props) => props.theme.colors.background.fifth};
54
48
  }
55
49
  `;
56
- export const Outline = styled.div `
57
- font-size: ${(props) => props.theme.font.size.medium};
58
- position: relative;
59
-
60
- & .outline-text-title {
61
- font-size: ${(props) => props.theme.font.size.large};
62
- }
63
- `;
64
50
  export const StyledTriangleCollapsed = styled(TriangleCollapsed) ``;
65
51
  export const StyledTriangleExpanded = styled(TriangleExpanded) ``;
66
52
  export const OutlineItemArrow = styled.button `
@@ -86,26 +72,6 @@ export const OutlineItemNoArrow = styled.span `
86
72
  width: ${(props) => props.theme.grid.unit * 5}px;
87
73
  flex-shrink: 0;
88
74
  `;
89
- export const OutlineDropPreview = styled.div `
90
- width: 100%;
91
- background: #65a3ff;
92
- height: 1px;
93
- position: absolute;
94
- margin-left: ${(props) => 30 + props.depth * 20}px;
95
- z-index: 2;
96
-
97
- &:before {
98
- content: '';
99
- display: inline-block;
100
- width: ${(props) => props.theme.grid.unit}px;
101
- height: ${(props) => props.theme.grid.unit}px;
102
- border: 1px solid ${(props) => props.theme.colors.brand.default}
103
- border-radius: ${(props) => props.theme.grid.radius.small};
104
- position: absolute;
105
- top: -${(props) => props.theme.grid.unit}px;
106
- left: -6px;
107
- }
108
- `;
109
75
  export const OutlineItemLink = styled(Link) `
110
76
  flex: 1;
111
77
  display: inline-flex;
@@ -114,6 +80,8 @@ export const OutlineItemLink = styled(Link) `
114
80
  color: inherit;
115
81
  text-decoration: none;
116
82
  height: 100%;
83
+ border-bottom: 1px solid transparent;
84
+ border-top: 1px solid transparent;
117
85
 
118
86
  &:focus,
119
87
  &:active {
@@ -131,4 +99,28 @@ export const OutlineItemLinkText = styled.span `
131
99
  text-decoration: line-through;
132
100
  }
133
101
  `;
102
+ export const Outline = styled.div `
103
+ font-size: ${(props) => props.theme.font.size.medium};
104
+ position: relative;
105
+
106
+ & .outline-text-title {
107
+ font-size: ${(props) => props.theme.font.size.large};
108
+ }
109
+
110
+ &.dragging {
111
+ opacity: 0.5;
112
+ }
113
+
114
+ &.drop-before > ${OutlineItem} > ${OutlineItemLink} {
115
+ border-top-color: ${(props) => props.theme.colors.brand.dark};
116
+ }
117
+
118
+ &.drop-after > ${OutlineItem} > ${OutlineItemLink} {
119
+ border-bottom-color: ${(props) => props.theme.colors.brand.dark};
120
+ }
121
+
122
+ & .subtree.collapsed {
123
+ display: none;
124
+ }
125
+ `;
134
126
  export const OutlineItemPlaceholder = styled.span ``;
package/dist/es/index.js CHANGED
@@ -17,7 +17,6 @@ export * from './citation-sources';
17
17
  export * from './commands';
18
18
  export { ManuscriptOutline } from './components/outline/ManuscriptOutline';
19
19
  export { OutlineItemIcon } from './components/outline/Outline';
20
- export { OutlineManuscript } from './components/outline/OutlineManuscript';
21
20
  export { LevelSelector } from './components/toolbar/LevelSelector';
22
21
  export * from './menus';
23
22
  export { CollabProvider } from './classes/collabProvider';
@@ -0,0 +1,6 @@
1
+ export const getDropSide = (element, monitor) => {
2
+ const rect = element.getBoundingClientRect();
3
+ const middle = (rect.bottom - rect.top) / 2;
4
+ const offset = monitor.getClientOffset();
5
+ return offset.y > middle + rect.top ? 'after' : 'before';
6
+ };
@@ -1,63 +1,27 @@
1
- import { ManuscriptEditorView, ManuscriptNode, Selected } from '@manuscripts/transform';
2
- import * as React from 'react';
3
- import { ConnectDragPreview, ConnectDragSource, ConnectDropTarget } from 'react-dnd';
4
- export type DropSide = 'before' | 'after' | null;
5
- interface DragSourceProps {
6
- tree: TreeItem;
7
- position: DropSide;
8
- }
9
- interface ConnectedDragSourceProps {
10
- connectDragSource: ConnectDragSource;
11
- connectDragPreview: ConnectDragPreview;
12
- isDragging: boolean;
13
- canDrag: boolean;
14
- item: DragSourceProps;
15
- }
16
- interface ConnectedDropTargetProps {
17
- connectDropTarget: ConnectDropTarget;
18
- isOverCurrent: boolean;
19
- canDrop: boolean;
20
- itemType: string | symbol | null;
21
- }
22
- type ConnectedProps = ConnectedDragSourceProps & ConnectedDropTargetProps;
1
+ import { Capabilities } from '@manuscripts/style-guide';
2
+ import { ManuscriptEditorView, ManuscriptNode } from '@manuscripts/transform';
3
+ import React from 'react';
23
4
  export interface TreeItem {
24
5
  index: number;
25
- isSelected: boolean;
26
6
  items: TreeItem[];
27
7
  node: ManuscriptNode;
28
8
  pos: number;
29
9
  endPos: number;
30
10
  parent?: ManuscriptNode;
31
11
  }
32
- interface Props {
33
- depth?: number;
34
- tree: TreeItem;
35
- view?: ManuscriptEditorView;
36
- editArticle: boolean;
37
- }
38
- interface State {
39
- open: boolean;
40
- dragPosition: DropSide;
41
- }
42
12
  interface TreeBuilderOptions {
43
13
  node: ManuscriptNode;
44
14
  pos: number;
45
15
  index: number;
46
- selected: Selected | null;
47
16
  parent?: ManuscriptNode;
48
17
  }
49
18
  type TreeBuilder = (options: TreeBuilderOptions) => TreeItem;
50
19
  export declare const buildTree: TreeBuilder;
51
- declare class Tree extends React.Component<Props & ConnectedProps, State> {
52
- constructor(props: Props & ConnectedProps);
53
- render(): React.ReactNode;
54
- private outlineStyles;
55
- private bottomPreviewStyles;
56
- private topPreviewStyles;
57
- private toggle;
58
- private itemText;
59
- private handleContextMenu;
60
- private createMenu;
20
+ export interface DraggableTreeProps {
21
+ depth: number;
22
+ tree: TreeItem;
23
+ view?: ManuscriptEditorView;
24
+ can?: Capabilities;
61
25
  }
62
- declare const DraggableTree: import("react-dnd").DndComponentClass<import("react-dnd").DndComponentClass<typeof Tree, import("react-dnd").Omit<Props & ConnectedDragSourceProps & ConnectedDropTargetProps, "itemType" | "connectDropTarget" | "isOverCurrent" | "canDrop">>, import("react-dnd").Omit<import("react-dnd").Omit<Props & ConnectedDragSourceProps & ConnectedDropTargetProps, "itemType" | "connectDropTarget" | "isOverCurrent" | "canDrop">, "item" | "isDragging" | "connectDragSource" | "connectDragPreview" | "canDrag">>;
63
- export default DraggableTree;
26
+ export declare const DraggableTree: React.FC<DraggableTreeProps>;
27
+ export {};
@@ -15,14 +15,12 @@
15
15
  */
16
16
  import { Manuscript } from '@manuscripts/json-schema';
17
17
  import { Capabilities } from '@manuscripts/style-guide';
18
- import { ManuscriptEditorView, ManuscriptNode, Selected } from '@manuscripts/transform';
18
+ import { ManuscriptEditorView, ManuscriptNode } from '@manuscripts/transform';
19
19
  import React from 'react';
20
- interface Props {
20
+ export interface ManuscriptOutlineProps {
21
21
  manuscript: Manuscript;
22
- selected: Selected | null;
23
22
  doc: ManuscriptNode | null;
24
- capabilities?: Capabilities;
23
+ can?: Capabilities;
25
24
  view?: ManuscriptEditorView;
26
25
  }
27
- export declare const ManuscriptOutline: React.FunctionComponent<Props>;
28
- export {};
26
+ export declare const ManuscriptOutline: React.FC<ManuscriptOutlineProps>;
@@ -17,17 +17,13 @@
17
17
  import { Link } from 'react-router-dom';
18
18
  export declare const OutlineItemIcon: import("styled-components").StyledComponent<"span", any, {}, never>;
19
19
  export declare const OutlineItem: import("styled-components").StyledComponent<"div", any, {
20
- isSelected: boolean;
21
20
  depth: number;
22
21
  }, never>;
23
- export declare const Outline: import("styled-components").StyledComponent<"div", any, {}, never>;
24
22
  export declare const StyledTriangleCollapsed: import("styled-components").StyledComponent<import("react").SFC<import("react").SVGAttributes<SVGElement>>, any, {}, never>;
25
23
  export declare const StyledTriangleExpanded: import("styled-components").StyledComponent<import("react").SFC<import("react").SVGAttributes<SVGElement>>, any, {}, never>;
26
24
  export declare const OutlineItemArrow: import("styled-components").StyledComponent<"button", any, {}, never>;
27
25
  export declare const OutlineItemNoArrow: import("styled-components").StyledComponent<"span", any, {}, never>;
28
- export declare const OutlineDropPreview: import("styled-components").StyledComponent<"div", any, {
29
- depth: number;
30
- }, never>;
31
26
  export declare const OutlineItemLink: import("styled-components").StyledComponent<typeof Link, any, {}, never>;
32
27
  export declare const OutlineItemLinkText: import("styled-components").StyledComponent<"span", any, {}, never>;
28
+ export declare const Outline: import("styled-components").StyledComponent<"div", any, {}, never>;
33
29
  export declare const OutlineItemPlaceholder: import("styled-components").StyledComponent<"span", any, {}, never>;
@@ -17,7 +17,6 @@ export * from './citation-sources';
17
17
  export * from './commands';
18
18
  export { ManuscriptOutline } from './components/outline/ManuscriptOutline';
19
19
  export { OutlineItemIcon } from './components/outline/Outline';
20
- export { OutlineManuscript } from './components/outline/OutlineManuscript';
21
20
  export { LevelSelector } from './components/toolbar/LevelSelector';
22
21
  export * from './menus';
23
22
  export { ChangeReceiver } from './types';
@@ -0,0 +1,3 @@
1
+ import { DropTargetMonitor } from 'react-dnd';
2
+ export type DropSide = 'before' | 'after';
3
+ export declare const getDropSide: (element: Element, monitor: DropTargetMonitor) => "after" | "before";