@manuscripts/style-guide 1.3.2-LEAN-2859-0 → 1.3.2-LEAN-2859-2

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.
@@ -9,9 +9,9 @@ const react_1 = __importDefault(require("react"));
9
9
  const styled_components_1 = __importDefault(require("styled-components"));
10
10
  const Tooltip_1 = require("./Tooltip");
11
11
  const FileCreatedDate = ({ file, className }) => {
12
- return file.createdDate ? (react_1.default.createElement(exports.FileDateContainer, { "data-tip": "tooltip-content", className: className },
12
+ return file.createdDate ? (react_1.default.createElement(exports.FileDateContainer, { "data-tip": "File Uploaded", "data-for": `${file.id}-created-date`, className: className },
13
13
  react_1.default.createElement(exports.FileDate, null, (0, date_fns_1.format)(new Date(file.createdDate), 'M/d/yy, HH:mm')),
14
- react_1.default.createElement(Tooltip_1.Tooltip, { place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, "File Uploaded"))) : (react_1.default.createElement(react_1.default.Fragment, null));
14
+ react_1.default.createElement(Tooltip_1.Tooltip, { id: `${file.id}-created-date`, place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, "File Uploaded"))) : (react_1.default.createElement(react_1.default.Fragment, null));
15
15
  };
16
16
  exports.FileCreatedDate = FileCreatedDate;
17
17
  exports.FileDateContainer = styled_components_1.default.div `
@@ -7,12 +7,10 @@ exports.FileNameText = exports.FileName = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const styled_components_1 = __importDefault(require("styled-components"));
9
9
  const FileTypeIcon_1 = require("./FileTypeIcon");
10
- const Tooltip_1 = require("./Tooltip");
11
10
  const FileName = ({ file }) => {
12
11
  return (react_1.default.createElement(react_1.default.Fragment, null,
13
12
  react_1.default.createElement(FileTypeIcon_1.FileTypeIcon, { file: file }),
14
- react_1.default.createElement(exports.FileNameText, null, file.name),
15
- react_1.default.createElement(Tooltip_1.Tooltip, { place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, file.name)));
13
+ react_1.default.createElement(exports.FileNameText, null, file.name)));
16
14
  };
17
15
  exports.FileName = FileName;
18
16
  exports.FileNameText = styled_components_1.default.div `
@@ -16,16 +16,7 @@ const FileTypeIcon = ({ file }) => {
16
16
  if (file.type.id === 'main-manuscript') {
17
17
  return react_1.default.createElement(document_icon_with_dot_1.default, { className: "file-icon" });
18
18
  }
19
- const name = file.name;
20
- const index = name.indexOf('.');
21
- const extension = index ? name.substring(index + 1) : '';
22
- if (extension) {
23
- const type = util_1.extensionsWithFileTypesMap.get(extension.toLowerCase());
24
- const icon = util_1.fileTypesWithIconMap.get(type);
25
- if (icon) {
26
- return icon;
27
- }
28
- }
29
- return react_1.default.createElement(unknown_format_file_icon_1.default, { className: "file-icon" });
19
+ const icon = (0, util_1.getFileIcon)(file);
20
+ return icon || react_1.default.createElement(unknown_format_file_icon_1.default, { className: "file-icon" });
30
21
  };
31
22
  exports.FileTypeIcon = FileTypeIcon;
@@ -73,7 +73,7 @@ const InlineFilesSection = ({ elements, isEditor }) => {
73
73
  var _a;
74
74
  return (react_1.default.createElement(Element, { key: index, id: element.modelId, onClick: onElementClick },
75
75
  react_1.default.createElement(ElementLabelContainer, null,
76
- util_1.fileTypesWithIconMap.get(element.type),
76
+ (0, util_1.getFileTypeIcon)(element.type),
77
77
  react_1.default.createElement(ElementLabel, null, element.label)),
78
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) }))))));
79
79
  })));
@@ -103,6 +103,7 @@ const Element = styled_components_1.default.div `
103
103
  const ElementLabelContainer = styled_components_1.default.div `
104
104
  display: flex;
105
105
  padding: 20px 16px;
106
+ cursor: pointer;
106
107
  `;
107
108
  const ElementLabel = styled_components_1.default.div `
108
109
  color: ${(props) => props.theme.colors.text.primary};
@@ -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.isImageFile = exports.getFileTypeIcon = exports.getFileIcon = exports.getFileType = 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"));
@@ -38,7 +38,7 @@ var FileType;
38
38
  FileType[FileType["Figure"] = 10] = "Figure";
39
39
  FileType[FileType["GraphicalAbstract"] = 11] = "GraphicalAbstract";
40
40
  })(FileType = exports.FileType || (exports.FileType = {}));
41
- exports.extensionsWithFileTypesMap = new Map([
41
+ const extension2type = new Map([
42
42
  ['png', FileType.Image],
43
43
  ['jpg', FileType.Image],
44
44
  ['jpeg', FileType.Image],
@@ -74,7 +74,7 @@ exports.extensionsWithFileTypesMap = new Map([
74
74
  ['tgz', FileType.CompressedFile],
75
75
  ['txt', FileType.PlainText],
76
76
  ]);
77
- exports.fileTypesWithIconMap = new Map([
77
+ const type2icon = new Map([
78
78
  [FileType.Audio, react_1.default.createElement(audio_icon_1.default, { key: FileType.Audio, className: "file-icon" })],
79
79
  [FileType.Video, react_1.default.createElement(video_icon_1.default, { key: FileType.Video, className: "file-icon" })],
80
80
  [
@@ -113,3 +113,25 @@ exports.fileTypesWithIconMap = new Map([
113
113
  ],
114
114
  [undefined, react_1.default.createElement(unknown_format_file_icon_1.default, { key: undefined, className: "file-icon" })],
115
115
  ]);
116
+ const getFileType = (file) => {
117
+ const extension = getExtension(file.name);
118
+ return extension2type.get(extension.toLowerCase());
119
+ };
120
+ exports.getFileType = getFileType;
121
+ const getFileIcon = (file) => {
122
+ const type = (0, exports.getFileType)(file);
123
+ return type2icon.get(type);
124
+ };
125
+ exports.getFileIcon = getFileIcon;
126
+ const getFileTypeIcon = (type) => {
127
+ return type2icon.get(type);
128
+ };
129
+ exports.getFileTypeIcon = getFileTypeIcon;
130
+ const isImageFile = (file) => {
131
+ return (0, exports.getFileType)(file) === FileType.Image;
132
+ };
133
+ exports.isImageFile = isImageFile;
134
+ const getExtension = (name) => {
135
+ const index = name.indexOf('.');
136
+ return index ? name.substring(index + 1) : '';
137
+ };
@@ -25,7 +25,7 @@ const useDeepCompare = (deps) => {
25
25
  }
26
26
  return ref.current;
27
27
  };
28
- const useDeepCompareMemo = (callback, deps) => (0, react_1.useMemo)(callback, [useDeepCompare(deps), callback]);
28
+ const useDeepCompareMemo = (callback, deps) => (0, react_1.useMemo)(callback, [useDeepCompare(deps)]);
29
29
  exports.useDeepCompareMemo = useDeepCompareMemo;
30
- const useDeepCompareCallback = (callback, deps) => (0, react_1.useCallback)(callback, [useDeepCompare(deps), callback]);
30
+ const useDeepCompareCallback = (callback, deps) => (0, react_1.useCallback)(callback, [useDeepCompare(deps)]);
31
31
  exports.useDeepCompareCallback = useDeepCompareCallback;
@@ -1,23 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useFiles = void 0;
4
+ const json_schema_1 = require("@manuscripts/json-schema");
4
5
  const files_1 = require("../lib/files");
5
6
  const use_deep_compare_1 = require("./use-deep-compare");
6
- const getOtherFiles = (inlineFiles, supplements, files, filter) => {
7
+ const types = [
8
+ json_schema_1.ObjectTypes.Section,
9
+ json_schema_1.ObjectTypes.FigureElement,
10
+ json_schema_1.ObjectTypes.Figure,
11
+ json_schema_1.ObjectTypes.Supplement,
12
+ json_schema_1.ObjectTypes.ElementsOrder,
13
+ ];
14
+ const getOtherFiles = (inlineFiles, supplements, files) => {
7
15
  const excluded = new Set();
8
16
  inlineFiles.flatMap((f) => f.files).forEach((f) => excluded.add(f.id));
9
17
  supplements.forEach((s) => excluded.add(s.id));
10
- return files.filter((f) => !excluded.has(f.id) && (!filter || filter(f)));
18
+ return files.filter((f) => !excluded.has(f.id));
19
+ };
20
+ const useFiles = (modelMap, files) => {
21
+ const models = [];
22
+ for (const [_, model] of modelMap.entries()) {
23
+ if (types.includes(model.objectType)) {
24
+ models.push(model);
25
+ }
26
+ }
27
+ return (0, use_deep_compare_1.useDeepCompareMemo)(() => {
28
+ const inlineFiles = (0, files_1.getInlineFiles)(modelMap, files);
29
+ const supplements = (0, files_1.getSupplements)(modelMap, files);
30
+ const otherFiles = getOtherFiles(inlineFiles, supplements, files);
31
+ return {
32
+ inlineFiles,
33
+ supplements,
34
+ otherFiles,
35
+ };
36
+ }, [models, files]);
11
37
  };
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
- return {
17
- inlineFiles,
18
- supplements,
19
- otherFiles,
20
- };
21
- }, [...Array.from(modelMap.values()), ...files]);
22
38
  exports.useFiles = useFiles;
23
39
  exports.default = exports.useFiles;
@@ -3,9 +3,9 @@ import React from 'react';
3
3
  import styled from 'styled-components';
4
4
  import { Tooltip } from './Tooltip';
5
5
  export const FileCreatedDate = ({ file, className }) => {
6
- return file.createdDate ? (React.createElement(FileDateContainer, { "data-tip": "tooltip-content", className: className },
6
+ return file.createdDate ? (React.createElement(FileDateContainer, { "data-tip": "File Uploaded", "data-for": `${file.id}-created-date`, className: className },
7
7
  React.createElement(FileDate, null, format(new Date(file.createdDate), 'M/d/yy, HH:mm')),
8
- React.createElement(Tooltip, { place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, "File Uploaded"))) : (React.createElement(React.Fragment, null));
8
+ React.createElement(Tooltip, { id: `${file.id}-created-date`, place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, "File Uploaded"))) : (React.createElement(React.Fragment, null));
9
9
  };
10
10
  export const FileDateContainer = styled.div `
11
11
  overflow: hidden;
@@ -1,12 +1,10 @@
1
1
  import React from 'react';
2
2
  import styled from 'styled-components';
3
3
  import { FileTypeIcon } from './FileTypeIcon';
4
- import { Tooltip } from './Tooltip';
5
4
  export const FileName = ({ file }) => {
6
5
  return (React.createElement(React.Fragment, null,
7
6
  React.createElement(FileTypeIcon, { file: file }),
8
- React.createElement(FileNameText, null, file.name),
9
- React.createElement(Tooltip, { place: "bottom", offset: { top: 0 }, effect: "solid", className: "tooltip" }, file.name)));
7
+ React.createElement(FileNameText, null, file.name)));
10
8
  };
11
9
  export const FileNameText = styled.div `
12
10
  font-family: ${(props) => props.theme.font.family.Lato};
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import CorruptedFileIcon from '../icons/corrupted-file-icon';
3
3
  import DocumentIconWithDot from '../icons/document-icon-with-dot';
4
4
  import UnknownFormatFileIcon from '../icons/unknown-format-file-icon';
5
- import { extensionsWithFileTypesMap, fileTypesWithIconMap } from './util';
5
+ import { getFileIcon } from './util';
6
6
  export const FileTypeIcon = ({ file }) => {
7
7
  if (file.type.id === 'missing') {
8
8
  return React.createElement(CorruptedFileIcon, { className: "file-icon" });
@@ -10,15 +10,6 @@ export const FileTypeIcon = ({ file }) => {
10
10
  if (file.type.id === 'main-manuscript') {
11
11
  return React.createElement(DocumentIconWithDot, { className: "file-icon" });
12
12
  }
13
- const name = file.name;
14
- const index = name.indexOf('.');
15
- const extension = index ? name.substring(index + 1) : '';
16
- if (extension) {
17
- const type = extensionsWithFileTypesMap.get(extension.toLowerCase());
18
- const icon = fileTypesWithIconMap.get(type);
19
- if (icon) {
20
- return icon;
21
- }
22
- }
23
- return React.createElement(UnknownFormatFileIcon, { className: "file-icon" });
13
+ const icon = getFileIcon(file);
14
+ return icon || React.createElement(UnknownFormatFileIcon, { className: "file-icon" });
24
15
  };
@@ -14,7 +14,7 @@ import { FileContainer } from './FileContainer';
14
14
  import { FileCreatedDate } from './FileCreatedDate';
15
15
  import { FileManagerContext } from './FileManagerProvider';
16
16
  import { FileName } from './FileName';
17
- import { FileSectionType, fileTypesWithIconMap } from './util';
17
+ import { FileSectionType, getFileTypeIcon } from './util';
18
18
  const trackedJoint = ':dataTracked:';
19
19
  export const InlineFilesSection = ({ elements, isEditor }) => {
20
20
  const { modelMap, fileManagement, saveModel } = useContext(FileManagerContext);
@@ -44,7 +44,7 @@ export const InlineFilesSection = ({ elements, isEditor }) => {
44
44
  var _a;
45
45
  return (React.createElement(Element, { key: index, id: element.modelId, onClick: onElementClick },
46
46
  React.createElement(ElementLabelContainer, null,
47
- fileTypesWithIconMap.get(element.type),
47
+ getFileTypeIcon(element.type),
48
48
  React.createElement(ElementLabel, null, element.label)),
49
49
  React.createElement(ElementFilesContainer, null, (_a = element.files) === null || _a === void 0 ? void 0 : _a.map((file) => (React.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) }))))));
50
50
  })));
@@ -73,6 +73,7 @@ const Element = styled.div `
73
73
  const ElementLabelContainer = styled.div `
74
74
  display: flex;
75
75
  padding: 20px 16px;
76
+ cursor: pointer;
76
77
  `;
77
78
  const ElementLabel = styled.div `
78
79
  color: ${(props) => props.theme.colors.text.primary};
@@ -32,7 +32,7 @@ export var FileType;
32
32
  FileType[FileType["Figure"] = 10] = "Figure";
33
33
  FileType[FileType["GraphicalAbstract"] = 11] = "GraphicalAbstract";
34
34
  })(FileType || (FileType = {}));
35
- export const extensionsWithFileTypesMap = new Map([
35
+ const extension2type = new Map([
36
36
  ['png', FileType.Image],
37
37
  ['jpg', FileType.Image],
38
38
  ['jpeg', FileType.Image],
@@ -68,7 +68,7 @@ export const extensionsWithFileTypesMap = new Map([
68
68
  ['tgz', FileType.CompressedFile],
69
69
  ['txt', FileType.PlainText],
70
70
  ]);
71
- export const fileTypesWithIconMap = new Map([
71
+ const type2icon = new Map([
72
72
  [FileType.Audio, React.createElement(AudioIcon, { key: FileType.Audio, className: "file-icon" })],
73
73
  [FileType.Video, React.createElement(VideoIcon, { key: FileType.Video, className: "file-icon" })],
74
74
  [
@@ -107,3 +107,21 @@ export const fileTypesWithIconMap = new Map([
107
107
  ],
108
108
  [undefined, React.createElement(UnknownFormatFileIcon, { key: undefined, className: "file-icon" })],
109
109
  ]);
110
+ export const getFileType = (file) => {
111
+ const extension = getExtension(file.name);
112
+ return extension2type.get(extension.toLowerCase());
113
+ };
114
+ export const getFileIcon = (file) => {
115
+ const type = getFileType(file);
116
+ return type2icon.get(type);
117
+ };
118
+ export const getFileTypeIcon = (type) => {
119
+ return type2icon.get(type);
120
+ };
121
+ export const isImageFile = (file) => {
122
+ return getFileType(file) === FileType.Image;
123
+ };
124
+ const getExtension = (name) => {
125
+ const index = name.indexOf('.');
126
+ return index ? name.substring(index + 1) : '';
127
+ };
@@ -22,5 +22,5 @@ const useDeepCompare = (deps) => {
22
22
  }
23
23
  return ref.current;
24
24
  };
25
- export const useDeepCompareMemo = (callback, deps) => useMemo(callback, [useDeepCompare(deps), callback]);
26
- export const useDeepCompareCallback = (callback, deps) => useCallback(callback, [useDeepCompare(deps), callback]);
25
+ export const useDeepCompareMemo = (callback, deps) => useMemo(callback, [useDeepCompare(deps)]);
26
+ export const useDeepCompareCallback = (callback, deps) => useCallback(callback, [useDeepCompare(deps)]);
@@ -1,19 +1,35 @@
1
+ import { ObjectTypes } from '@manuscripts/json-schema';
1
2
  import { getInlineFiles, getSupplements, } from '../lib/files';
2
3
  import { useDeepCompareMemo } from './use-deep-compare';
3
- const getOtherFiles = (inlineFiles, supplements, files, filter) => {
4
+ const types = [
5
+ ObjectTypes.Section,
6
+ ObjectTypes.FigureElement,
7
+ ObjectTypes.Figure,
8
+ ObjectTypes.Supplement,
9
+ ObjectTypes.ElementsOrder,
10
+ ];
11
+ const getOtherFiles = (inlineFiles, supplements, files) => {
4
12
  const excluded = new Set();
5
13
  inlineFiles.flatMap((f) => f.files).forEach((f) => excluded.add(f.id));
6
14
  supplements.forEach((s) => excluded.add(s.id));
7
- return files.filter((f) => !excluded.has(f.id) && (!filter || filter(f)));
15
+ return files.filter((f) => !excluded.has(f.id));
16
+ };
17
+ export const useFiles = (modelMap, files) => {
18
+ const models = [];
19
+ for (const [_, model] of modelMap.entries()) {
20
+ if (types.includes(model.objectType)) {
21
+ models.push(model);
22
+ }
23
+ }
24
+ return useDeepCompareMemo(() => {
25
+ const inlineFiles = getInlineFiles(modelMap, files);
26
+ const supplements = getSupplements(modelMap, files);
27
+ const otherFiles = getOtherFiles(inlineFiles, supplements, files);
28
+ return {
29
+ inlineFiles,
30
+ supplements,
31
+ otherFiles,
32
+ };
33
+ }, [models, files]);
8
34
  };
9
- export const useFiles = (modelMap, files, filter) => useDeepCompareMemo(() => {
10
- const inlineFiles = getInlineFiles(modelMap, files);
11
- const supplements = getSupplements(modelMap, files);
12
- const otherFiles = getOtherFiles(inlineFiles, supplements, files, filter);
13
- return {
14
- inlineFiles,
15
- supplements,
16
- otherFiles,
17
- };
18
- }, [...Array.from(modelMap.values()), ...files]);
19
35
  export default useFiles;
@@ -6,6 +6,7 @@ import { Capabilities } from '../../lib/capabilities';
6
6
  import { FileAttachment } from '../../lib/files';
7
7
  export type Upload = (file: File) => Promise<FileAttachment>;
8
8
  export type Download = (file: FileAttachment) => void;
9
+ export type PreviewLink = (file: FileAttachment) => string | undefined;
9
10
  export type Replace = (file: File) => Promise<void>;
10
11
  export type Move = {
11
12
  sectionType: FileSectionType;
@@ -14,6 +15,7 @@ export type Move = {
14
15
  export interface FileManagement {
15
16
  upload: Upload;
16
17
  download: Download;
18
+ previewLink: PreviewLink;
17
19
  }
18
20
  export type SaveModel = <T extends Model>(model: T | Build<T> | Partial<T>) => Promise<T>;
19
21
  export type DeleteModel = (id: string) => Promise<string>;
@@ -1,3 +1,4 @@
1
+ import { FileAttachment } from '../../lib/files';
1
2
  export declare enum FileSectionType {
2
3
  Inline = "Inline files",
3
4
  Supplements = "Supplements",
@@ -17,5 +18,7 @@ export declare enum FileType {
17
18
  Figure = 10,
18
19
  GraphicalAbstract = 11
19
20
  }
20
- export declare const extensionsWithFileTypesMap: Map<string, FileType>;
21
- export declare const fileTypesWithIconMap: Map<FileType | undefined, JSX.Element>;
21
+ export declare const getFileType: (file: FileAttachment) => FileType | undefined;
22
+ export declare const getFileIcon: (file: FileAttachment) => JSX.Element | undefined;
23
+ export declare const getFileTypeIcon: (type: FileType) => JSX.Element | undefined;
24
+ export declare const isImageFile: (file: FileAttachment) => boolean;
@@ -1,7 +1,6 @@
1
1
  import { Model } from '@manuscripts/json-schema';
2
2
  import { ElementFiles, FileAttachment, ModelFile } from '../lib/files';
3
- type FileFilter = (file: FileAttachment) => boolean;
4
- export declare const useFiles: (modelMap: Map<string, Model>, files: FileAttachment[], filter?: FileFilter) => {
3
+ export declare const useFiles: (modelMap: Map<string, Model>, files: FileAttachment[]) => {
5
4
  inlineFiles: ElementFiles[];
6
5
  supplements: ModelFile[];
7
6
  otherFiles: FileAttachment[];
@@ -8,7 +8,6 @@ export type FileAttachment = {
8
8
  id: string;
9
9
  name: string;
10
10
  type: FileDesignation;
11
- link?: string;
12
11
  createdDate?: Date;
13
12
  };
14
13
  export type ModelFile = FileAttachment & {
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.3.2-LEAN-2859-0",
4
+ "version": "1.3.2-LEAN-2859-2",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-style-guide",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",