@manuscripts/style-guide 1.3.2-LEAN-2859-1 → 1.3.2-LEAN-2880-1

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 (100) hide show
  1. package/dist/cjs/components/FileManager/ConfirmationPopUp.js +90 -0
  2. package/dist/cjs/components/FileManager/DragItemArea.js +28 -0
  3. package/dist/cjs/components/FileManager/FileManager.js +125 -14
  4. package/dist/cjs/components/FileManager/FileManagerProvider.js +7 -2
  5. package/dist/cjs/components/FileManager/{DragLayer.js → FileSectionItem/DragLayer.js} +10 -12
  6. package/dist/cjs/components/FileManager/FileSectionItem/DraggableFileSectionItem.js +76 -0
  7. package/dist/cjs/components/FileManager/FileSectionItem/FileInfo.js +115 -0
  8. package/dist/cjs/components/FileManager/FileSectionItem/FileSectionItem.js +95 -0
  9. package/dist/cjs/components/FileManager/FileSectionItem/FileSectionUploadItem.js +37 -0
  10. package/dist/cjs/components/FileManager/FileSectionItem/FileTypeIcon.js +53 -0
  11. package/dist/cjs/components/FileManager/FileSectionItem/ItemActions.js +92 -0
  12. package/dist/cjs/components/FileManager/FileSectionItem/ProgressBarUploadItem.js +120 -0
  13. package/dist/cjs/components/FileManager/FileSectionState.js +83 -0
  14. package/dist/cjs/components/FileManager/FilesSection.js +61 -0
  15. package/dist/cjs/components/FileManager/InlineFilesSection.js +123 -64
  16. package/dist/cjs/components/FileManager/ItemsAction.js +48 -0
  17. package/dist/cjs/components/FileManager/{Tooltip.js → TooltipDiv.js} +3 -8
  18. package/dist/cjs/components/FileManager/{FileUploader.js → UploadFileArea.js} +12 -19
  19. package/dist/cjs/components/FileManager/util.js +66 -29
  20. package/dist/cjs/components/icons/document-icon-with-dot.js +1 -1
  21. package/dist/cjs/hooks/use-files.js +43 -14
  22. package/dist/cjs/index.js +4 -3
  23. package/dist/cjs/lib/inlineFiles.js +92 -0
  24. package/dist/es/components/FileManager/ConfirmationPopUp.js +62 -0
  25. package/dist/es/components/FileManager/DragItemArea.js +21 -0
  26. package/dist/es/components/FileManager/FileManager.js +124 -16
  27. package/dist/es/components/FileManager/FileManagerProvider.js +8 -3
  28. package/dist/es/components/FileManager/{DragLayer.js → FileSectionItem/DragLayer.js} +10 -12
  29. package/dist/es/components/FileManager/FileSectionItem/DraggableFileSectionItem.js +46 -0
  30. package/dist/es/components/FileManager/FileSectionItem/FileInfo.js +85 -0
  31. package/dist/es/components/FileManager/FileSectionItem/FileSectionItem.js +88 -0
  32. package/dist/es/components/FileManager/FileSectionItem/FileSectionUploadItem.js +30 -0
  33. package/dist/es/components/FileManager/FileSectionItem/FileTypeIcon.js +46 -0
  34. package/dist/es/components/FileManager/FileSectionItem/ItemActions.js +65 -0
  35. package/dist/es/components/FileManager/FileSectionItem/ProgressBarUploadItem.js +113 -0
  36. package/dist/es/components/FileManager/FileSectionState.js +78 -0
  37. package/dist/es/components/FileManager/FilesSection.js +34 -0
  38. package/dist/es/components/FileManager/InlineFilesSection.js +124 -65
  39. package/dist/es/components/FileManager/ItemsAction.js +42 -0
  40. package/dist/es/components/FileManager/{Tooltip.js → TooltipDiv.js} +2 -7
  41. package/dist/es/components/FileManager/{FileUploader.js → UploadFileArea.js} +10 -17
  42. package/dist/es/components/FileManager/util.js +64 -28
  43. package/dist/es/components/icons/document-icon-with-dot.js +1 -1
  44. package/dist/es/hooks/use-files.js +40 -14
  45. package/dist/es/index.js +2 -2
  46. package/dist/es/lib/inlineFiles.js +90 -0
  47. package/dist/types/components/FileManager/ConfirmationPopUp.d.ts +12 -0
  48. package/dist/types/components/FileManager/DragItemArea.d.ts +4 -0
  49. package/dist/types/components/FileManager/FileManager.d.ts +8 -17
  50. package/dist/types/components/FileManager/FileManagerProvider.d.ts +18 -8
  51. package/dist/types/components/FileManager/FileSectionItem/DraggableFileSectionItem.d.ts +3 -0
  52. package/dist/types/components/FileManager/FileSectionItem/FileInfo.d.ts +19 -0
  53. package/dist/types/components/FileManager/FileSectionItem/FileSectionItem.d.ts +38 -0
  54. package/dist/types/components/FileManager/FileSectionItem/FileSectionUploadItem.d.ts +12 -0
  55. package/dist/types/components/FileManager/{FileTypeIcon.d.ts → FileSectionItem/FileTypeIcon.d.ts} +3 -2
  56. package/dist/types/components/FileManager/FileSectionItem/ItemActions.d.ts +21 -0
  57. package/dist/types/components/FileManager/FileSectionItem/ProgressBarUploadItem.d.ts +4 -0
  58. package/dist/types/components/FileManager/FileSectionState.d.ts +38 -0
  59. package/dist/types/components/FileManager/FilesSection.d.ts +12 -0
  60. package/dist/types/components/FileManager/InlineFilesSection.d.ts +19 -3
  61. package/dist/types/components/FileManager/ItemsAction.d.ts +4 -0
  62. package/dist/types/components/FileManager/TooltipDiv.d.ts +1 -0
  63. package/dist/types/components/FileManager/UploadFileArea.d.ts +9 -0
  64. package/dist/types/components/FileManager/util.d.ts +10 -3
  65. package/dist/types/hooks/use-files.d.ts +6 -5
  66. package/dist/types/index.d.ts +2 -2
  67. package/dist/types/lib/inlineFiles.d.ts +11 -0
  68. package/package.json +2 -2
  69. package/dist/cjs/components/FileManager/FileActions.js +0 -135
  70. package/dist/cjs/components/FileManager/FileContainer.js +0 -38
  71. package/dist/cjs/components/FileManager/FileCreatedDate.js +0 -25
  72. package/dist/cjs/components/FileManager/FileName.js +0 -27
  73. package/dist/cjs/components/FileManager/FileSectionAlert.js +0 -170
  74. package/dist/cjs/components/FileManager/FileTypeIcon.js +0 -31
  75. package/dist/cjs/components/FileManager/OtherFilesSection.js +0 -101
  76. package/dist/cjs/components/FileManager/SupplementsSection.js +0 -118
  77. package/dist/cjs/components/icons/corrupted-file-icon.js +0 -27
  78. package/dist/cjs/lib/files.js +0 -85
  79. package/dist/es/components/FileManager/FileActions.js +0 -105
  80. package/dist/es/components/FileManager/FileContainer.js +0 -32
  81. package/dist/es/components/FileManager/FileCreatedDate.js +0 -18
  82. package/dist/es/components/FileManager/FileName.js +0 -20
  83. package/dist/es/components/FileManager/FileSectionAlert.js +0 -163
  84. package/dist/es/components/FileManager/FileTypeIcon.js +0 -24
  85. package/dist/es/components/FileManager/OtherFilesSection.js +0 -74
  86. package/dist/es/components/FileManager/SupplementsSection.js +0 -91
  87. package/dist/es/components/icons/corrupted-file-icon.js +0 -22
  88. package/dist/es/lib/files.js +0 -79
  89. package/dist/types/components/FileManager/FileActions.d.ts +0 -19
  90. package/dist/types/components/FileManager/FileContainer.d.ts +0 -1
  91. package/dist/types/components/FileManager/FileCreatedDate.d.ts +0 -8
  92. package/dist/types/components/FileManager/FileName.d.ts +0 -6
  93. package/dist/types/components/FileManager/FileSectionAlert.d.ts +0 -13
  94. package/dist/types/components/FileManager/FileUploader.d.ts +0 -4
  95. package/dist/types/components/FileManager/OtherFilesSection.d.ts +0 -5
  96. package/dist/types/components/FileManager/SupplementsSection.d.ts +0 -5
  97. package/dist/types/components/FileManager/Tooltip.d.ts +0 -2
  98. package/dist/types/components/icons/corrupted-file-icon.d.ts +0 -19
  99. package/dist/types/lib/files.d.ts +0 -24
  100. /package/dist/types/components/FileManager/{DragLayer.d.ts → FileSectionItem/DragLayer.d.ts} +0 -0
@@ -22,108 +22,167 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
35
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
36
27
  };
37
28
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.InlineFilesSection = void 0;
29
+ exports.FileDate = exports.FileDateContainer = exports.InlineFilesSection = void 0;
30
+ const date_fns_1 = require("date-fns");
39
31
  const react_1 = __importStar(require("react"));
32
+ const react_tooltip_1 = __importDefault(require("react-tooltip"));
40
33
  const styled_components_1 = __importDefault(require("styled-components"));
41
- const FileActions_1 = require("./FileActions");
42
- const FileContainer_1 = require("./FileContainer");
43
- const FileCreatedDate_1 = require("./FileCreatedDate");
44
- const FileManagerProvider_1 = require("./FileManagerProvider");
45
- const FileName_1 = require("./FileName");
34
+ const use_dropdown_1 = require("../../hooks/use-dropdown");
35
+ const dots_icon_1 = __importDefault(require("../icons/dots-icon"));
36
+ const FileInfo_1 = require("./FileSectionItem/FileInfo");
37
+ const FileSectionItem_1 = require("./FileSectionItem/FileSectionItem");
38
+ const ItemActions_1 = require("./FileSectionItem/ItemActions");
46
39
  const util_1 = require("./util");
47
40
  const trackedJoint = ':dataTracked:';
48
- const InlineFilesSection = ({ elements, isEditor }) => {
49
- const { modelMap, fileManagement, saveModel } = (0, react_1.useContext)(FileManagerProvider_1.FileManagerContext);
41
+ const InlineFilesSection = ({ handleReplace, handleDownload, handleUpdateInline, handleDetachFile, inlineFiles, isEditor, dispatch, }) => {
50
42
  const onElementClick = (0, react_1.useCallback)((e) => {
51
43
  if (!isEditor) {
52
44
  return;
53
45
  }
54
46
  const { id } = e.currentTarget;
55
47
  const clearedId = id.split(trackedJoint)[0];
56
- const isSelected = clearedId == window.location.hash.substring(1);
48
+ const isSelected = clearedId == window.location.hash.substr(1);
57
49
  window.location.hash = !isSelected ? `#${clearedId}` : '#';
58
- }, [isEditor]);
59
- const updateFigureSrc = (modelId, src) => __awaiter(void 0, void 0, void 0, function* () {
60
- const figure = modelMap.get(modelId);
61
- if (figure) {
62
- yield saveModel(Object.assign(Object.assign({}, figure), { src: src }));
50
+ if (isSelected) {
51
+ window.location.hash = `#${clearedId}`;
63
52
  }
64
- });
65
- const detach = (modelId) => __awaiter(void 0, void 0, void 0, function* () {
66
- yield updateFigureSrc(modelId, '');
67
- });
68
- const replace = (modelId, file) => __awaiter(void 0, void 0, void 0, function* () {
69
- const uploaded = yield fileManagement.upload(file);
70
- yield updateFigureSrc(modelId, uploaded.id);
71
- });
72
- return (react_1.default.createElement(react_1.default.Fragment, null, elements.map((element, index) => {
53
+ }, [isEditor]);
54
+ return (react_1.default.createElement("div", null, inlineFiles.map((file, index) => {
73
55
  var _a;
74
- return (react_1.default.createElement(Element, { key: index, id: element.modelId, onClick: onElementClick },
75
- react_1.default.createElement(ElementLabelContainer, null,
76
- util_1.fileTypesWithIconMap.get(element.type),
77
- react_1.default.createElement(ElementLabel, null, element.label)),
78
- react_1.default.createElement(ElementFilesContainer, null, (_a = element.files) === null || _a === void 0 ? void 0 : _a.map((file) => (react_1.default.createElement(ElementFile, { key: file.modelId, file: file, handleReplace: (f) => __awaiter(void 0, void 0, void 0, function* () { return yield replace(file.modelId, f); }), handleDetach: () => __awaiter(void 0, void 0, void 0, function* () { return yield detach(file.modelId); }), handleDownload: () => fileManagement.download(file) }))))));
56
+ return (react_1.default.createElement(ElementItem, { className: 'item', key: index, id: file.id, onClick: onElementClick },
57
+ react_1.default.createElement(FileReferences, { className: 'refItems' }, (_a = file.attachments) === null || _a === void 0 ? void 0 : _a.map((attachment) => (react_1.default.createElement(react_1.default.Fragment, null,
58
+ react_1.default.createElement(FileReference, { key: attachment.id, attachment: attachment, handleReplace: handleReplace, handleUpdateInline: handleUpdateInline, handleDetachFile: handleDetachFile, handleDownload: handleDownload, dispatch: dispatch }))))),
59
+ react_1.default.createElement(Element, { className: 'element' },
60
+ util_1.fileTypesWithIconMap.get(file.type),
61
+ react_1.default.createElement(FileInfo_1.FileInfoContainer, null,
62
+ react_1.default.createElement(FileInfo_1.FileNameTitleContainer, null,
63
+ react_1.default.createElement(FileInfo_1.FileTitle, null, file.label))))));
79
64
  })));
80
65
  };
81
66
  exports.InlineFilesSection = InlineFilesSection;
82
- const ElementFile = ({ file, handleReplace, handleDownload, handleDetach }) => {
83
- return (react_1.default.createElement(ModelFileContainer, null,
84
- react_1.default.createElement(FileName_1.FileName, { file: file }),
85
- react_1.default.createElement(FileCreatedDate_1.FileCreatedDate, { file: file, className: "show-on-hover" }),
86
- react_1.default.createElement(FileActions_1.FileActions, { sectionType: util_1.FileSectionType.Inline, handleDownload: file.id ? handleDownload : undefined, handleDetach: file.id ? handleDetach : undefined, handleReplace: handleReplace })));
67
+ const FileReference = ({ attachment, handleReplace, handleDownload, handleUpdateInline, handleDetachFile, dispatch, }) => {
68
+ const { isOpen, toggleOpen, wrapperRef } = (0, use_dropdown_1.useDropdown)();
69
+ if (!attachment || !attachment.name) {
70
+ return null;
71
+ }
72
+ const fileExtension = attachment.name.substring(attachment.name.lastIndexOf('.') + 1);
73
+ return (react_1.default.createElement(FileReferenceItem, { key: attachment.id },
74
+ react_1.default.createElement(Container, null,
75
+ util_1.fileTypesWithIconMap.get(util_1.extensionsWithFileTypesMap.get(fileExtension)),
76
+ react_1.default.createElement(FileReferenceName, null, attachment.name)),
77
+ attachment.createdDate && (react_1.default.createElement(exports.FileDateContainer, { "data-tip": "tooltip-content" },
78
+ react_1.default.createElement(exports.FileDate, null, (0, date_fns_1.format)(new Date(attachment.createdDate), 'M/d/yy, HH:mm')),
79
+ react_1.default.createElement(react_tooltip_1.default, { place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, "File Uploaded"))),
80
+ handleDownload && handleReplace && (react_1.default.createElement(DropdownContainer, { ref: wrapperRef },
81
+ react_1.default.createElement(FileSectionItem_1.ActionsIcon, { onClick: toggleOpen, type: "button", className: 'external_file_dropdown', "aria-label": "Download or Replace or Detach", "aria-pressed": isOpen },
82
+ react_1.default.createElement(dots_icon_1.default, null)),
83
+ isOpen && (react_1.default.createElement(ItemActions_1.ItemActions, { fileSection: util_1.FileSectionType.Inline, replaceAttachmentHandler: handleReplace, showReplaceAction: true, handleUpdateInline: (uploadAttachment) => handleUpdateInline &&
84
+ (attachment === null || attachment === void 0 ? void 0 : attachment.modelId) &&
85
+ handleUpdateInline(attachment.modelId, uploadAttachment), detachAttachmnetHandler: () => handleDetachFile &&
86
+ attachment.modelId &&
87
+ handleDetachFile(attachment.id, attachment.modelId), downloadAttachmentHandler: handleDownload, attachmentId: attachment.id, fileName: attachment.name, publicUrl: attachment.link, hideActionList: toggleOpen, dispatch: dispatch, dropDownClassName: 'ref_item_dropdown' }))))));
87
88
  };
88
- const Element = styled_components_1.default.div `
89
+ exports.FileDateContainer = styled_components_1.default.div `
90
+ overflow: hidden;
91
+ display: none;
92
+ width: 100%;
93
+ justify-content: flex-end;
94
+ `;
95
+ const ElementItem = (0, styled_components_1.default)(FileSectionItem_1.Item) `
89
96
  display: flex;
90
- flex-direction: column;
97
+ // this will allow us to select the previous sibling node,
98
+ // to change the background on the hover for adjacent node
99
+ flex-direction: column-reverse;
91
100
  padding: 0;
92
101
 
93
- border-bottom: 1px dashed #f0f0f0;
102
+ :hover {
103
+ background: #f2fbfc;
104
+ }
94
105
 
95
- svg {
96
- width: 24px;
106
+ .refItems:hover ~ .element {
107
+ background: white !important;
108
+ }
109
+ &:hover ${exports.FileDateContainer} {
110
+ display: flex;
97
111
  }
98
112
 
113
+ .refItems:hover {
114
+ background: white !important;
115
+ }
116
+
117
+ border-bottom: 1px dashed #f0f0f0;
118
+
99
119
  :last-child {
100
120
  border-bottom: 0;
101
121
  }
102
122
  `;
103
- const ElementLabelContainer = styled_components_1.default.div `
123
+ const Container = styled_components_1.default.div `
104
124
  display: flex;
105
- padding: 20px 16px;
106
- cursor: pointer;
125
+ width: 100%;
107
126
  `;
108
- const ElementLabel = styled_components_1.default.div `
109
- color: ${(props) => props.theme.colors.text.primary};
110
- font-weight: bold;
111
- font-size: 16px;
112
- line-height: 20px;
113
- white-space: nowrap;
114
- margin-left: ${(props) => props.theme.grid.unit * 2}px;
127
+ const Element = styled_components_1.default.div `
128
+ display: flex;
129
+ padding: 20px 15px;
115
130
  `;
116
- const ElementFilesContainer = styled_components_1.default.div `
131
+ const FileReferences = styled_components_1.default.div `
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: space-between;
117
135
  width: 100%;
118
- > :last-child {
119
- margin-bottom: 25px;
120
- }
121
136
  `;
122
- const ModelFileContainer = (0, styled_components_1.default)(FileContainer_1.FileContainer) `
123
- padding: 8px 16px;
124
- height: 40px;
137
+ const FileReferenceItem = styled_components_1.default.div `
138
+ display: flex;
139
+ width: 100%;
140
+ align-items: space;
141
+ justify-content: space-between;
142
+ width: 100% svg {
143
+ width: 14px;
144
+ height: 17px;
145
+ }
125
146
 
126
147
  path {
127
148
  fill: #6e6e6e;
128
149
  }
150
+
151
+ padding: ${(props) => props.theme.grid.unit * 2}px
152
+ ${(props) => props.theme.grid.unit * 4}px;
153
+
154
+ :hover {
155
+ background: #f2fbfc;
156
+ }
157
+
158
+ .external_file_dropdown {
159
+ opacity: 0;
160
+ }
161
+ :hover .external_file_dropdown {
162
+ opacity: 1;
163
+ }
164
+
165
+ .ref_item_dropdown {
166
+ top: 65%;
167
+ right: 10px;
168
+ width: 180px;
169
+ }
170
+ :last-child {
171
+ margin-bottom: 25px;
172
+ }
173
+ `;
174
+ const FileReferenceName = styled_components_1.default.div `
175
+ font-family: ${(props) => props.theme.font.family.Lato};
176
+ font-size: ${(props) => props.theme.font.size.medium};
177
+ line-height: ${(props) => props.theme.font.lineHeight.large};
178
+ font-weight: ${(props) => props.theme.font.weight.normal};
179
+ color: ${(props) => props.theme.colors.text.primary};
180
+ margin-left: ${(props) => props.theme.grid.unit * 2}px;
181
+ `;
182
+ const DropdownContainer = styled_components_1.default.div `
183
+ position: relative;
184
+ `;
185
+ exports.FileDate = styled_components_1.default.div `
186
+ font-size: ${(props) => props.theme.font.size.small};
187
+ line-height: 27px;
129
188
  `;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ActionsSeparator = exports.ActionsLabel = exports.ActionsItem = exports.ActionsBox = void 0;
7
+ const styled_components_1 = __importDefault(require("styled-components"));
8
+ exports.ActionsBox = styled_components_1.default.ul `
9
+ border: 1px solid #e2e2e2;
10
+ box-sizing: border-box;
11
+ box-shadow: 0px 4px 9px rgba(0, 0, 0, 0.3);
12
+ border-radius: 4px;
13
+ min-width: 180px;
14
+ background: ${(props) => props.theme.colors.background.primary};
15
+ margin: 0;
16
+ padding: 8px 0;
17
+ z-index: 999;
18
+ text-align: left;
19
+ list-style-type: none;
20
+ `;
21
+ exports.ActionsItem = styled_components_1.default.li `
22
+ font-family: ${(props) => props.theme.font.family.Lato};
23
+ cursor: pointer;
24
+ font-size: 16px;
25
+ line-height: 24px;
26
+ color: ${(props) => props.theme.colors.text.primary};
27
+ list-style: none;
28
+ padding: 8px 16px;
29
+ &:hover,
30
+ &:focus {
31
+ background: #f2fbfc;
32
+ }
33
+ `;
34
+ exports.ActionsLabel = styled_components_1.default.li `
35
+ font-family: ${(props) => props.theme.font.family.Lato};
36
+ font-size: 12px;
37
+ line-height: 16px;
38
+ color: ${(props) => props.theme.colors.text.onLight};
39
+ list-style: none;
40
+ padding: 8px 16px;
41
+ cursor: default;
42
+ `;
43
+ exports.ActionsSeparator = styled_components_1.default.li `
44
+ height: 1px;
45
+ background: ${(props) => props.theme.colors.background.tertiary};
46
+ margin: 8px 0;
47
+ cursor: default;
48
+ `;
@@ -3,11 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Tooltip = void 0;
7
- const react_tooltip_1 = __importDefault(require("react-tooltip"));
6
+ exports.TooltipDiv = void 0;
8
7
  const styled_components_1 = __importDefault(require("styled-components"));
9
- exports.Tooltip = (0, styled_components_1.default)(react_tooltip_1.default) `
10
- &.tooltip {
8
+ exports.TooltipDiv = styled_components_1.default.div `
9
+ .tooltip {
11
10
  font-size: 12px;
12
11
  line-height: 16px;
13
12
  font-family: ${(props) => props.theme.font.family.Lato};
@@ -18,9 +17,5 @@ exports.Tooltip = (0, styled_components_1.default)(react_tooltip_1.default) `
18
17
  text-align: center;
19
18
  white-space: nowrap;
20
19
  pointer-events: none;
21
-
22
- &.place-bottom::after {
23
- background: #353535;
24
- }
25
20
  }
26
21
  `;
@@ -22,40 +22,32 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
25
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.FileUploader = void 0;
26
+ exports.UploadFileArea = void 0;
36
27
  const react_1 = __importStar(require("react"));
37
28
  const react_dnd_1 = require("react-dnd");
38
29
  const react_dnd_html5_backend_1 = require("react-dnd-html5-backend");
39
30
  const styled_components_1 = __importStar(require("styled-components"));
40
- const FileUploader = ({ handler }) => {
31
+ const FileSectionState_1 = require("./FileSectionState");
32
+ const UploadFileArea = ({ fileSection, dispatch }) => {
41
33
  const fileInputRef = (0, react_1.useRef)(null);
42
34
  const openFileDialog = () => {
43
35
  if (fileInputRef && fileInputRef.current) {
44
36
  fileInputRef.current.click();
45
37
  }
46
38
  };
47
- const handleChange = (event) => __awaiter(void 0, void 0, void 0, function* () {
39
+ const handleChange = (event) => {
48
40
  if (event && event.target && event.target.files) {
49
41
  const file = event.target.files[0];
50
- yield handler(file);
42
+ dispatch(FileSectionState_1.actions.UPLOAD_FILE(file, fileSection));
51
43
  }
52
- });
53
- const handleFileDrop = (0, react_1.useCallback)((monitor) => __awaiter(void 0, void 0, void 0, function* () {
44
+ };
45
+ const handleFileDrop = (0, react_1.useCallback)((monitor) => {
54
46
  if (monitor) {
55
47
  const file = monitor.getItem().files[0];
56
- yield handler(file);
48
+ dispatch(FileSectionState_1.actions.UPLOAD_FILE(file, fileSection));
57
49
  }
58
- }), [handler]);
50
+ }, [dispatch, fileSection]);
59
51
  const [{ canDrop, isOver }, dropRef] = (0, react_dnd_1.useDrop)({
60
52
  accept: [react_dnd_html5_backend_1.NativeTypes.FILE],
61
53
  drop(item, monitor) {
@@ -71,7 +63,7 @@ const FileUploader = ({ handler }) => {
71
63
  react_1.default.createElement("input", { ref: fileInputRef, type: "file", style: { display: 'none' }, onChange: (e) => handleChange(e), value: '' }),
72
64
  "Drag or click to upload a new file"));
73
65
  };
74
- exports.FileUploader = FileUploader;
66
+ exports.UploadFileArea = UploadFileArea;
75
67
  const activeBoxStyle = (0, styled_components_1.css) `
76
68
  background: #f2fbfc;
77
69
  border: 1px dashed #bce7f6;
@@ -90,7 +82,8 @@ const Container = styled_components_1.default.div `
90
82
  font-family: ${(props) => props.theme.font.family.Lato};
91
83
  color: ${(props) => props.theme.colors.text.onLight};
92
84
  cursor: pointer;
93
- margin: 16px 16px 8px;
85
+ margin-bottom: 7px;
86
+ margin-top: 16px;
94
87
  ${(props) => props.active
95
88
  ? (0, styled_components_1.css) `
96
89
  ${activeBoxStyle}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.fileTypesWithIconMap = exports.extensionsWithFileTypesMap = exports.FileType = exports.FileSectionType = void 0;
6
+ exports.droppableSections = exports.generateAttachmentsTitles = exports.fileTypesWithIconMap = exports.fileTypesWithTitlesMap = exports.extensionsWithFileTypesMap = exports.FileType = exports.FileSectionType = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const audio_icon_1 = __importDefault(require("../icons/audio-icon"));
9
9
  const code_file_icon_1 = __importDefault(require("../icons/code-file-icon"));
@@ -19,9 +19,9 @@ const unknown_format_file_icon_1 = __importDefault(require("../icons/unknown-for
19
19
  const video_icon_1 = __importDefault(require("../icons/video-icon"));
20
20
  var FileSectionType;
21
21
  (function (FileSectionType) {
22
- FileSectionType["Inline"] = "Inline files";
23
- FileSectionType["Supplements"] = "Supplements";
24
- FileSectionType["OtherFile"] = "Other files";
22
+ FileSectionType[FileSectionType["Inline"] = 0] = "Inline";
23
+ FileSectionType[FileSectionType["Supplements"] = 1] = "Supplements";
24
+ FileSectionType[FileSectionType["OtherFile"] = 2] = "OtherFile";
25
25
  })(FileSectionType = exports.FileSectionType || (exports.FileSectionType = {}));
26
26
  var FileType;
27
27
  (function (FileType) {
@@ -74,42 +74,79 @@ exports.extensionsWithFileTypesMap = new Map([
74
74
  ['tgz', FileType.CompressedFile],
75
75
  ['txt', FileType.PlainText],
76
76
  ]);
77
+ exports.fileTypesWithTitlesMap = new Map([
78
+ [FileType.Image, 'Image'],
79
+ [FileType.Audio, 'Audio'],
80
+ [FileType.Video, 'Video'],
81
+ [FileType.PlainDocument, 'Doc'],
82
+ [FileType.SheetsWorkbooks, 'Table'],
83
+ [FileType.Latex, 'Doc'],
84
+ [FileType.CodeFile, 'Code File'],
85
+ [FileType.PdfFile, 'Doc'],
86
+ [FileType.CompressedFile, 'Compressed File'],
87
+ [FileType.PlainText, 'Plain Text'],
88
+ [undefined, 'Unknown'],
89
+ ]);
77
90
  exports.fileTypesWithIconMap = new Map([
78
- [FileType.Audio, react_1.default.createElement(audio_icon_1.default, { key: FileType.Audio, className: "file-icon" })],
79
- [FileType.Video, react_1.default.createElement(video_icon_1.default, { key: FileType.Video, className: "file-icon" })],
91
+ [FileType.Audio, react_1.default.createElement(audio_icon_1.default, { key: FileType.Audio })],
92
+ [FileType.Video, react_1.default.createElement(video_icon_1.default, { key: FileType.Video })],
80
93
  [
81
94
  FileType.PlainDocument,
82
- react_1.default.createElement(document_icon_1.default, { key: FileType.PlainDocument, color: "#1A9BC7", className: "file-icon" }),
83
- ],
84
- [
85
- FileType.SheetsWorkbooks,
86
- react_1.default.createElement(table_icon_1.default, { key: FileType.SheetsWorkbooks, className: "file-icon" }),
87
- ],
88
- [
89
- FileType.Latex,
90
- react_1.default.createElement(latex_icon_1.default, { key: FileType.Latex, color: "#1A9BC7", className: "file-icon" }),
91
- ],
92
- [
93
- FileType.CodeFile,
94
- react_1.default.createElement(code_file_icon_1.default, { key: FileType.CodeFile, className: "file-icon" }),
95
- ],
96
- [
97
- FileType.PdfFile,
98
- react_1.default.createElement(pdf_file_icon_1.default, { key: FileType.PdfFile, className: "file-icon" }),
95
+ react_1.default.createElement(document_icon_1.default, { key: FileType.PlainDocument, color: "#1A9BC7" }),
99
96
  ],
97
+ [FileType.SheetsWorkbooks, react_1.default.createElement(table_icon_1.default, { key: FileType.SheetsWorkbooks })],
98
+ [FileType.Latex, react_1.default.createElement(latex_icon_1.default, { key: FileType.Latex, color: "#1A9BC7" })],
99
+ [FileType.CodeFile, react_1.default.createElement(code_file_icon_1.default, { key: FileType.CodeFile })],
100
+ [FileType.PdfFile, react_1.default.createElement(pdf_file_icon_1.default, { key: FileType.PdfFile })],
100
101
  [
101
102
  FileType.CompressedFile,
102
- react_1.default.createElement(compressed_file_icon_1.default, { key: FileType.CompressedFile, className: "file-icon" }),
103
+ react_1.default.createElement(compressed_file_icon_1.default, { key: FileType.CompressedFile }),
103
104
  ],
104
105
  [
105
106
  FileType.PlainText,
106
- react_1.default.createElement(document_icon_1.default, { key: FileType.PlainText, color: "#FFBD26", className: "file-icon" }),
107
+ react_1.default.createElement(document_icon_1.default, { key: FileType.PlainText, color: "#FFBD26" }),
107
108
  ],
108
- [FileType.Image, react_1.default.createElement(image_icon_1.default, { key: FileType.Image, className: "file-icon" })],
109
- [FileType.Figure, react_1.default.createElement(figure_icon_1.default, { key: FileType.Figure, className: "file-icon" })],
109
+ [FileType.Image, react_1.default.createElement(image_icon_1.default, { key: FileType.Image })],
110
+ [FileType.Figure, react_1.default.createElement(figure_icon_1.default, { key: FileType.Figure })],
110
111
  [
111
112
  FileType.GraphicalAbstract,
112
- react_1.default.createElement(graphical_abstract_icon_1.default, { key: FileType.GraphicalAbstract, className: "file-icon" }),
113
+ react_1.default.createElement(graphical_abstract_icon_1.default, { key: FileType.GraphicalAbstract }),
113
114
  ],
114
- [undefined, react_1.default.createElement(unknown_format_file_icon_1.default, { key: undefined, className: "file-icon" })],
115
+ [undefined, react_1.default.createElement(unknown_format_file_icon_1.default, { key: undefined })],
115
116
  ]);
117
+ const generateAttachmentsTitles = (externalFiles, fileSectionType) => {
118
+ const titleCountersMap = new Map();
119
+ const externalFilesWithTitlesMap = new Map();
120
+ externalFiles.forEach((element) => {
121
+ const fileExtension = element.name.substring(element.name.lastIndexOf('.') + 1);
122
+ const fileType = exports.extensionsWithFileTypesMap.get(fileExtension.toLowerCase());
123
+ const fileTitle = exports.fileTypesWithTitlesMap.get(fileType);
124
+ if (fileSectionType === FileSectionType.Inline) {
125
+ externalFilesWithTitlesMap.set(element.name, element);
126
+ }
127
+ else {
128
+ if (fileTitle !== undefined) {
129
+ const oldCount = titleCountersMap.get(fileTitle);
130
+ if (oldCount) {
131
+ const newCount = oldCount + 1;
132
+ titleCountersMap.set(fileTitle, newCount);
133
+ externalFilesWithTitlesMap.set(`${fileTitle} ${newCount}`, element);
134
+ }
135
+ else {
136
+ titleCountersMap.set(fileTitle, 1);
137
+ externalFilesWithTitlesMap.set(`${fileTitle} 1`, element);
138
+ }
139
+ }
140
+ }
141
+ });
142
+ const result = Array.from(externalFilesWithTitlesMap, ([key, value]) => ({
143
+ title: key,
144
+ externalFile: value,
145
+ }));
146
+ return result;
147
+ };
148
+ exports.generateAttachmentsTitles = generateAttachmentsTitles;
149
+ exports.droppableSections = [
150
+ FileSectionType.Supplements,
151
+ FileSectionType.OtherFile,
152
+ ];
@@ -19,7 +19,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  const react_1 = __importDefault(require("react"));
22
- const DocumentIconWithDot = (props) => (react_1.default.createElement("svg", { className: props.className, width: "28", height: "33", style: { marginLeft: -7, marginTop: -4 }, viewBox: "0 0 28 33", fill: "none", xmlns: "http://www.w3.org/2000/svg", "data-for": "dot", "data-tip": true },
22
+ const DocumentIconWithDot = (props) => (react_1.default.createElement("svg", { width: "28", height: "33", viewBox: "0 0 28 33", fill: "none", xmlns: "http://www.w3.org/2000/svg", "data-for": "dot", "data-tip": true },
23
23
  react_1.default.createElement("rect", { x: "9", y: "9.71973", width: "18", height: "22", rx: "2", stroke: "#1A9BC7", strokeWidth: "2" }),
24
24
  react_1.default.createElement("rect", { x: "13.167", y: "14.0771", width: "5.66667", height: "1.14286", rx: "0.5", fill: "#1A9BC7", stroke: "#1A9BC7" }),
25
25
  react_1.default.createElement("rect", { x: "13.167", y: "19.791", width: "9.66667", height: "1.14286", rx: "0.5", fill: "#1A9BC7", stroke: "#1A9BC7" }),
@@ -1,24 +1,53 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.useFiles = void 0;
4
- const files_1 = require("../lib/files");
7
+ const json_schema_1 = require("@manuscripts/json-schema");
8
+ const transform_1 = require("@manuscripts/transform");
9
+ const inlineFiles_1 = __importDefault(require("../lib/inlineFiles"));
5
10
  const use_deep_compare_1 = require("./use-deep-compare");
6
- const getOtherFiles = (inlineFiles, supplements, files, filter) => {
7
- const excluded = new Set();
8
- inlineFiles.flatMap((f) => f.files).forEach((f) => excluded.add(f.id));
9
- supplements.forEach((s) => excluded.add(s.id));
10
- return files.filter((f) => !excluded.has(f.id) && (!filter || filter(f)));
11
+ const getInlineFilesIds = (inlineFiles) => {
12
+ return inlineFiles
13
+ .map(({ attachments }) => (attachments === null || attachments === void 0 ? void 0 : attachments.map(({ id }) => ({ id }))) || [])
14
+ .flat();
15
+ };
16
+ const getSupplementFiles = (modelMap, inlineFiles, attachments, filePredicate) => {
17
+ const supplements = new Map((0, transform_1.getModelsByType)(modelMap, json_schema_1.ObjectTypes.Supplement).map((supplement) => { var _a; return [(_a = supplement.href) === null || _a === void 0 ? void 0 : _a.replace('attachment:', ''), supplement]; }));
18
+ const excludedAttachmentsIds = new Set(getInlineFilesIds(inlineFiles).map(({ id }) => id));
19
+ return attachments.filter((attachment) => {
20
+ if (supplements.has(attachment.id) && filePredicate) {
21
+ return (!excludedAttachmentsIds.has(attachment.id) &&
22
+ filePredicate(attachment.name));
23
+ }
24
+ else {
25
+ return (!excludedAttachmentsIds.has(attachment.id) &&
26
+ supplements.has(attachment.id));
27
+ }
28
+ });
29
+ };
30
+ const getOtherFiles = (inlineFiles, supplementFiles, attachments, filePredicate) => {
31
+ const inlineFilesAttachmentIds = getInlineFilesIds(inlineFiles);
32
+ const excludedAttachmentsIds = new Set([...inlineFilesAttachmentIds, ...supplementFiles].map(({ id }) => id));
33
+ return attachments.filter(({ id, name }) => {
34
+ if (!excludedAttachmentsIds.has(id) && filePredicate) {
35
+ return filePredicate(name);
36
+ }
37
+ else {
38
+ return !excludedAttachmentsIds.has(id);
39
+ }
40
+ });
11
41
  };
12
- const useFiles = (modelMap, files, filter) => (0, use_deep_compare_1.useDeepCompareMemo)(() => {
13
- const inlineFiles = (0, files_1.getInlineFiles)(modelMap, files);
14
- const supplements = (0, files_1.getSupplements)(modelMap, files);
15
- const otherFiles = getOtherFiles(inlineFiles, supplements, files, filter);
16
- console.log('useFiles called');
42
+ const useFiles = (modelMap, attachments, filePredicate) => (0, use_deep_compare_1.useDeepCompareMemo)(() => {
43
+ const inlineFiles = (0, inlineFiles_1.default)(modelMap, attachments);
44
+ const supplementFiles = getSupplementFiles(modelMap, inlineFiles, attachments, filePredicate);
45
+ const otherFiles = getOtherFiles(inlineFiles, supplementFiles, attachments, filePredicate);
17
46
  return {
18
- inlineFiles,
19
- supplements,
20
47
  otherFiles,
48
+ supplementFiles,
49
+ inlineFiles,
21
50
  };
22
- }, [...Array.from(modelMap.values()), ...files]);
51
+ }, [...Array.from(modelMap.values()), ...attachments]);
23
52
  exports.useFiles = useFiles;
24
53
  exports.default = exports.useFiles;
package/dist/cjs/index.js CHANGED
@@ -32,7 +32,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
32
32
  return (mod && mod.__esModule) ? mod : { "default": mod };
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.errorsDecoder = exports.useDeepCompareCallback = exports.useDeepCompareMemo = void 0;
35
+ exports.errorsDecoder = exports.useDeepCompareCallback = exports.useDeepCompareMemo = exports.useFiles = void 0;
36
36
  __exportStar(require("./components/AffiliationsEditor"), exports);
37
37
  __exportStar(require("./components/AffiliationsList"), exports);
38
38
  __exportStar(require("./components/AuthorForm"), exports);
@@ -51,6 +51,7 @@ __exportStar(require("./components/Checkbox"), exports);
51
51
  __exportStar(require("./components/Form"), exports);
52
52
  __exportStar(require("./components/FileManager"), exports);
53
53
  __exportStar(require("./components/FileManager/util"), exports);
54
+ __exportStar(require("./components/FileManager/FileSectionItem/FileSectionItem"), exports);
54
55
  __exportStar(require("./components/Resizer"), exports);
55
56
  __exportStar(require("./components/SaveStatus"), exports);
56
57
  __exportStar(require("./components/SimpleModal"), exports);
@@ -68,13 +69,13 @@ __exportStar(require("./components/NavDropdown"), exports);
68
69
  __exportStar(require("./components/SubmissionInspector"), exports);
69
70
  __exportStar(require("./components/Dropdown"), exports);
70
71
  __exportStar(require("./hooks/use-dropdown"), exports);
71
- __exportStar(require("./hooks/use-files"), exports);
72
+ var use_files_1 = require("./hooks/use-files");
73
+ Object.defineProperty(exports, "useFiles", { enumerable: true, get: function () { return use_files_1.useFiles; } });
72
74
  var use_deep_compare_1 = require("./hooks/use-deep-compare");
73
75
  Object.defineProperty(exports, "useDeepCompareMemo", { enumerable: true, get: function () { return use_deep_compare_1.useDeepCompareMemo; } });
74
76
  Object.defineProperty(exports, "useDeepCompareCallback", { enumerable: true, get: function () { return use_deep_compare_1.useDeepCompareCallback; } });
75
77
  __exportStar(require("./lib/authors"), exports);
76
78
  __exportStar(require("./lib/capabilities"), exports);
77
- __exportStar(require("./lib/files"), exports);
78
79
  var errors_decoder_1 = require("./lib/errors-decoder");
79
80
  Object.defineProperty(exports, "errorsDecoder", { enumerable: true, get: function () { return __importDefault(errors_decoder_1).default; } });
80
81
  __exportStar(require("./types"), exports);