@manuscripts/style-guide 1.8.4 → 1.8.6
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.
|
@@ -79,8 +79,14 @@ const AddNewFootnote = (0, styled_components_1.default)(Button_1.ButtonGroup) `
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
`;
|
|
82
|
-
const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) => {
|
|
83
|
-
|
|
82
|
+
const TableFootnotesSelector = ({ notes, inlineFootnote, onAdd, onInsert, onCancel }) => {
|
|
83
|
+
let selectedNotesMap;
|
|
84
|
+
if (inlineFootnote) {
|
|
85
|
+
const rids = inlineFootnote.attrs.rids;
|
|
86
|
+
const selectedNotes = notes.filter(({ node }) => rids.includes(node.attrs.id));
|
|
87
|
+
selectedNotesMap = new Map(selectedNotes.map(({ node }) => [node.attrs.id, node]));
|
|
88
|
+
}
|
|
89
|
+
const [selections, setSelections] = (0, react_1.useState)(new Map(selectedNotesMap));
|
|
84
90
|
const toggleSelection = (item) => {
|
|
85
91
|
const id = item.attrs.id;
|
|
86
92
|
if (selections.has(id)) {
|
|
@@ -100,7 +106,7 @@ const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) => {
|
|
|
100
106
|
};
|
|
101
107
|
return (react_1.default.createElement(Container, null,
|
|
102
108
|
react_1.default.createElement(NotesContainer, null,
|
|
103
|
-
react_1.default.createElement(TableFootnotesList, { notes: notes, isSelected: isSelected, onSelect: toggleSelection })),
|
|
109
|
+
react_1.default.createElement(TableFootnotesList, { notes: notes, inlineFootnote: inlineFootnote, isSelected: isSelected, onSelect: toggleSelection })),
|
|
104
110
|
react_1.default.createElement(Actions, null,
|
|
105
111
|
react_1.default.createElement(AddNewFootnote, null,
|
|
106
112
|
react_1.default.createElement(Button_1.IconTextButton, { onClick: onAdd },
|
|
@@ -108,17 +114,38 @@ const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) => {
|
|
|
108
114
|
"Add new")),
|
|
109
115
|
react_1.default.createElement(Button_1.ButtonGroup, null,
|
|
110
116
|
react_1.default.createElement(Button_1.SecondaryButton, { onClick: onCancel }, "Cancel"),
|
|
111
|
-
react_1.default.createElement(Button_1.PrimaryButton, { onClick: handleClick, disabled: selections.size === 0 },
|
|
117
|
+
react_1.default.createElement(Button_1.PrimaryButton, { onClick: handleClick, disabled: selections.size === 0 && !inlineFootnote }, inlineFootnote ? 'Update' : 'Insert')))));
|
|
112
118
|
};
|
|
113
119
|
exports.TableFootnotesSelector = TableFootnotesSelector;
|
|
114
|
-
const TableFootnotesList = ({ notes, isSelected, onSelect }) => {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
const TableFootnotesList = ({ notes, isSelected, onSelect, inlineFootnote }) => {
|
|
121
|
+
const selectedNotes = [];
|
|
122
|
+
const remainingNotes = [];
|
|
123
|
+
notes.forEach((note) => {
|
|
124
|
+
const isNoteSelected = inlineFootnote && inlineFootnote.attrs.rids.includes(note.node.attrs.id);
|
|
125
|
+
if (isNoteSelected) {
|
|
126
|
+
selectedNotes.push(note);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
remainingNotes.push(note);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return (react_1.default.createElement(NotesListContainer, null,
|
|
133
|
+
selectedNotes.map((note) => footnoteItem(note, isSelected, onSelect)),
|
|
134
|
+
selectedNotes.length > 0 && remainingNotes.length > 0 && react_1.default.createElement(Separator, null),
|
|
135
|
+
remainingNotes.map((note) => footnoteItem(note, isSelected, onSelect))));
|
|
136
|
+
};
|
|
137
|
+
const footnoteItem = (note, isSelected, onSelect) => {
|
|
138
|
+
var _a;
|
|
139
|
+
const { node, index } = note;
|
|
140
|
+
return (react_1.default.createElement(FootnoteItem, { onClick: () => onSelect(node), key: node.attrs.id },
|
|
141
|
+
react_1.default.createElement(StatusIcon, null, isSelected(node) ? (react_1.default.createElement(AddedIcon_1.default, { "data-cy": 'plus-icon-ok', width: 24, height: 24 })) : (react_1.default.createElement(AddIcon_1.default, { "data-cy": 'plus-icon', width: 24, height: 24 }))),
|
|
142
|
+
react_1.default.createElement(NoteText, null, (index ? index + '. ' : '') + ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
|
|
121
143
|
};
|
|
144
|
+
const Separator = styled_components_1.default.div `
|
|
145
|
+
height: 0;
|
|
146
|
+
border-bottom: 1px solid #e2e2e2;
|
|
147
|
+
margin: 4px 0;
|
|
148
|
+
`;
|
|
122
149
|
const NotesListContainer = styled_components_1.default.div `
|
|
123
150
|
padding: ${(props) => props.theme.grid.unit * 6}px
|
|
124
151
|
${(props) => props.theme.grid.unit * 5}px;
|
|
@@ -36,15 +36,16 @@ const getCapabilities = (project, profile, role, actions) => {
|
|
|
36
36
|
createComment: !isViewer(),
|
|
37
37
|
viewNotes: true,
|
|
38
38
|
createNotes: !isViewer() && allowed(Actions.addNote),
|
|
39
|
-
handleNotes: isOwner() || isEditor() || isWriter(),
|
|
39
|
+
handleNotes: isOwner() || isEditor() || isWriter() || isAnnotator(),
|
|
40
40
|
viewHistory: false,
|
|
41
41
|
restoreVersion: isOwner() || isEditor() || isWriter(),
|
|
42
42
|
downloadFiles: true,
|
|
43
|
-
changeDesignation: (isOwner() || isEditor() || isWriter()) &&
|
|
43
|
+
changeDesignation: (isOwner() || isEditor() || isWriter() || isAnnotator()) &&
|
|
44
|
+
allowed(Actions.updateAttachment),
|
|
45
|
+
moveFile: isOwner() || isEditor() || isWriter() || isAnnotator(),
|
|
46
|
+
replaceFile: isOwner() || isEditor() || isWriter() || isAnnotator(),
|
|
47
|
+
uploadFile: (isOwner() || isEditor() || isWriter() || isAnnotator()) &&
|
|
44
48
|
allowed(Actions.updateAttachment),
|
|
45
|
-
moveFile: isOwner() || isEditor() || isWriter(),
|
|
46
|
-
replaceFile: isOwner() || isEditor() || isWriter(),
|
|
47
|
-
uploadFile: isOwner() || isEditor() || isWriter(),
|
|
48
49
|
handleQualityReport: isOwner() || isEditor() || isWriter(),
|
|
49
50
|
setMainManuscript: allowed(Actions.setMainManuscript),
|
|
50
51
|
rejectTask: isProdEditor(),
|
|
@@ -57,7 +58,7 @@ const getCapabilities = (project, profile, role, actions) => {
|
|
|
57
58
|
formatArticle: !isViewer(),
|
|
58
59
|
editArticle: !isViewer(),
|
|
59
60
|
editMetadata: !(isViewer() || isProofer()) || isAnnotator(),
|
|
60
|
-
editCitationsAndRefs: !(isViewer() ||
|
|
61
|
+
editCitationsAndRefs: !(isViewer() || isProofer()),
|
|
61
62
|
shareProject: isOwner(),
|
|
62
63
|
applySaveChanges: !(isAnnotator() || isProofer()),
|
|
63
64
|
};
|
|
@@ -50,8 +50,14 @@ const AddNewFootnote = styled(ButtonGroup) `
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
`;
|
|
53
|
-
export const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) => {
|
|
54
|
-
|
|
53
|
+
export const TableFootnotesSelector = ({ notes, inlineFootnote, onAdd, onInsert, onCancel }) => {
|
|
54
|
+
let selectedNotesMap;
|
|
55
|
+
if (inlineFootnote) {
|
|
56
|
+
const rids = inlineFootnote.attrs.rids;
|
|
57
|
+
const selectedNotes = notes.filter(({ node }) => rids.includes(node.attrs.id));
|
|
58
|
+
selectedNotesMap = new Map(selectedNotes.map(({ node }) => [node.attrs.id, node]));
|
|
59
|
+
}
|
|
60
|
+
const [selections, setSelections] = useState(new Map(selectedNotesMap));
|
|
55
61
|
const toggleSelection = (item) => {
|
|
56
62
|
const id = item.attrs.id;
|
|
57
63
|
if (selections.has(id)) {
|
|
@@ -71,7 +77,7 @@ export const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) =>
|
|
|
71
77
|
};
|
|
72
78
|
return (React.createElement(Container, null,
|
|
73
79
|
React.createElement(NotesContainer, null,
|
|
74
|
-
React.createElement(TableFootnotesList, { notes: notes, isSelected: isSelected, onSelect: toggleSelection })),
|
|
80
|
+
React.createElement(TableFootnotesList, { notes: notes, inlineFootnote: inlineFootnote, isSelected: isSelected, onSelect: toggleSelection })),
|
|
75
81
|
React.createElement(Actions, null,
|
|
76
82
|
React.createElement(AddNewFootnote, null,
|
|
77
83
|
React.createElement(IconTextButton, { onClick: onAdd },
|
|
@@ -79,16 +85,37 @@ export const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) =>
|
|
|
79
85
|
"Add new")),
|
|
80
86
|
React.createElement(ButtonGroup, null,
|
|
81
87
|
React.createElement(SecondaryButton, { onClick: onCancel }, "Cancel"),
|
|
82
|
-
React.createElement(PrimaryButton, { onClick: handleClick, disabled: selections.size === 0 },
|
|
88
|
+
React.createElement(PrimaryButton, { onClick: handleClick, disabled: selections.size === 0 && !inlineFootnote }, inlineFootnote ? 'Update' : 'Insert')))));
|
|
89
|
+
};
|
|
90
|
+
const TableFootnotesList = ({ notes, isSelected, onSelect, inlineFootnote }) => {
|
|
91
|
+
const selectedNotes = [];
|
|
92
|
+
const remainingNotes = [];
|
|
93
|
+
notes.forEach((note) => {
|
|
94
|
+
const isNoteSelected = inlineFootnote && inlineFootnote.attrs.rids.includes(note.node.attrs.id);
|
|
95
|
+
if (isNoteSelected) {
|
|
96
|
+
selectedNotes.push(note);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
remainingNotes.push(note);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return (React.createElement(NotesListContainer, null,
|
|
103
|
+
selectedNotes.map((note) => footnoteItem(note, isSelected, onSelect)),
|
|
104
|
+
selectedNotes.length > 0 && remainingNotes.length > 0 && React.createElement(Separator, null),
|
|
105
|
+
remainingNotes.map((note) => footnoteItem(note, isSelected, onSelect))));
|
|
83
106
|
};
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
})));
|
|
107
|
+
const footnoteItem = (note, isSelected, onSelect) => {
|
|
108
|
+
var _a;
|
|
109
|
+
const { node, index } = note;
|
|
110
|
+
return (React.createElement(FootnoteItem, { onClick: () => onSelect(node), key: node.attrs.id },
|
|
111
|
+
React.createElement(StatusIcon, null, isSelected(node) ? (React.createElement(AddedIcon, { "data-cy": 'plus-icon-ok', width: 24, height: 24 })) : (React.createElement(AddIcon, { "data-cy": 'plus-icon', width: 24, height: 24 }))),
|
|
112
|
+
React.createElement(NoteText, null, (index ? index + '. ' : '') + ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
|
|
91
113
|
};
|
|
114
|
+
const Separator = styled.div `
|
|
115
|
+
height: 0;
|
|
116
|
+
border-bottom: 1px solid #e2e2e2;
|
|
117
|
+
margin: 4px 0;
|
|
118
|
+
`;
|
|
92
119
|
const NotesListContainer = styled.div `
|
|
93
120
|
padding: ${(props) => props.theme.grid.unit * 6}px
|
|
94
121
|
${(props) => props.theme.grid.unit * 5}px;
|
|
@@ -30,15 +30,16 @@ export const getCapabilities = (project, profile, role, actions) => {
|
|
|
30
30
|
createComment: !isViewer(),
|
|
31
31
|
viewNotes: true,
|
|
32
32
|
createNotes: !isViewer() && allowed(Actions.addNote),
|
|
33
|
-
handleNotes: isOwner() || isEditor() || isWriter(),
|
|
33
|
+
handleNotes: isOwner() || isEditor() || isWriter() || isAnnotator(),
|
|
34
34
|
viewHistory: false,
|
|
35
35
|
restoreVersion: isOwner() || isEditor() || isWriter(),
|
|
36
36
|
downloadFiles: true,
|
|
37
|
-
changeDesignation: (isOwner() || isEditor() || isWriter()) &&
|
|
37
|
+
changeDesignation: (isOwner() || isEditor() || isWriter() || isAnnotator()) &&
|
|
38
|
+
allowed(Actions.updateAttachment),
|
|
39
|
+
moveFile: isOwner() || isEditor() || isWriter() || isAnnotator(),
|
|
40
|
+
replaceFile: isOwner() || isEditor() || isWriter() || isAnnotator(),
|
|
41
|
+
uploadFile: (isOwner() || isEditor() || isWriter() || isAnnotator()) &&
|
|
38
42
|
allowed(Actions.updateAttachment),
|
|
39
|
-
moveFile: isOwner() || isEditor() || isWriter(),
|
|
40
|
-
replaceFile: isOwner() || isEditor() || isWriter(),
|
|
41
|
-
uploadFile: isOwner() || isEditor() || isWriter(),
|
|
42
43
|
handleQualityReport: isOwner() || isEditor() || isWriter(),
|
|
43
44
|
setMainManuscript: allowed(Actions.setMainManuscript),
|
|
44
45
|
rejectTask: isProdEditor(),
|
|
@@ -51,7 +52,7 @@ export const getCapabilities = (project, profile, role, actions) => {
|
|
|
51
52
|
formatArticle: !isViewer(),
|
|
52
53
|
editArticle: !isViewer(),
|
|
53
54
|
editMetadata: !(isViewer() || isProofer()) || isAnnotator(),
|
|
54
|
-
editCitationsAndRefs: !(isViewer() ||
|
|
55
|
+
editCitationsAndRefs: !(isViewer() || isProofer()),
|
|
55
56
|
shareProject: isOwner(),
|
|
56
57
|
applySaveChanges: !(isAnnotator() || isProofer()),
|
|
57
58
|
};
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { FootnoteNode } from '@manuscripts/transform';
|
|
16
|
+
import { FootnoteNode, InlineFootnoteNode } from '@manuscripts/transform';
|
|
17
17
|
import React from 'react';
|
|
18
18
|
export type FootnoteWithIndex = {
|
|
19
19
|
node: FootnoteNode;
|
|
@@ -21,6 +21,7 @@ export type FootnoteWithIndex = {
|
|
|
21
21
|
};
|
|
22
22
|
export declare const TableFootnotesSelector: React.FC<{
|
|
23
23
|
notes: FootnoteWithIndex[];
|
|
24
|
+
inlineFootnote?: InlineFootnoteNode;
|
|
24
25
|
onAdd: () => void;
|
|
25
26
|
onInsert: (notes: FootnoteWithIndex[]) => void;
|
|
26
27
|
onCancel: () => void;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manuscripts/style-guide",
|
|
3
3
|
"description": "Shared components for Manuscripts applications",
|
|
4
|
-
"version": "1.8.
|
|
4
|
+
"version": "1.8.6",
|
|
5
5
|
"repository": "github:Atypon-OpenSource/manuscripts-style-guide",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"main": "dist/cjs",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@manuscripts/assets": "^0.6.4",
|
|
36
36
|
"@manuscripts/json-schema": "^2.2.7",
|
|
37
|
-
"@manuscripts/transform": "
|
|
37
|
+
"@manuscripts/transform": "2.1.13",
|
|
38
38
|
"@reach/tabs": "^0.18.0",
|
|
39
39
|
"date-fns": "^2.29.3",
|
|
40
40
|
"formik": "^2.2.9",
|
|
@@ -103,4 +103,4 @@
|
|
|
103
103
|
"@types/react": "^17.0.2",
|
|
104
104
|
"jackspeak": "2.1.1"
|
|
105
105
|
}
|
|
106
|
-
}
|
|
106
|
+
}
|