@tecsinapse/cortex-react 1.12.3 → 1.13.0-beta.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.
- package/dist/cjs/components/Menubar/Categories.js +2 -1
- package/dist/cjs/components/Menubar/DropdownRoot.js +2 -0
- package/dist/cjs/components/Menubar/Item.js +15 -5
- package/dist/cjs/hooks/useFileUpload.js +20 -2
- package/dist/cjs/provider/CategoriesContext.js +27 -0
- package/dist/esm/components/Menubar/Categories.js +2 -1
- package/dist/esm/components/Menubar/DropdownRoot.js +2 -0
- package/dist/esm/components/Menubar/Item.js +16 -6
- package/dist/esm/hooks/useFileUpload.js +20 -2
- package/dist/esm/provider/CategoriesContext.js +24 -0
- package/dist/types/components/Menubar/Item.d.ts +1 -1
- package/dist/types/components/Menubar/index.d.ts +1 -1
- package/dist/types/components/Menubar/types.d.ts +2 -0
- package/dist/types/hooks/useFileUpload.d.ts +5 -3
- package/dist/types/provider/CategoriesContext.d.ts +13 -0
- package/package.json +2 -2
|
@@ -11,10 +11,11 @@ require('react-dropzone');
|
|
|
11
11
|
require('uuid');
|
|
12
12
|
require('@floating-ui/react');
|
|
13
13
|
require('currency.js');
|
|
14
|
+
var CategoriesContext = require('../../provider/CategoriesContext.js');
|
|
14
15
|
|
|
15
16
|
const Categories = ({ children }) => {
|
|
16
17
|
const { width } = useDimensions.useDimensions();
|
|
17
|
-
return /* @__PURE__ */ React.createElement(Masonry, { columns: width <= 640 ? 2 : 4 }, children);
|
|
18
|
+
return /* @__PURE__ */ React.createElement(CategoriesContext.CategoriesProvider, null, /* @__PURE__ */ React.createElement(Masonry, { columns: width <= 640 ? 2 : 4 }, children));
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
module.exports = Categories;
|
|
@@ -28,6 +28,8 @@ const DropdownRoot = ({
|
|
|
28
28
|
{
|
|
29
29
|
key: prop.title,
|
|
30
30
|
...rest,
|
|
31
|
+
parentCategoryTitle: item.title,
|
|
32
|
+
title,
|
|
31
33
|
subItems: items ?? [],
|
|
32
34
|
renderSubItems: ({ title: title2, ...rest2 }) => {
|
|
33
35
|
return /* @__PURE__ */ React.createElement(SubItem, { key: title2, ...rest2 }, title2);
|
|
@@ -16,6 +16,7 @@ var useMenubar = require('../../provider/useMenubar.js');
|
|
|
16
16
|
var menubar = require('../../styles/menubar.js');
|
|
17
17
|
var IconControlSubItem = require('./IconControlSubItem.js');
|
|
18
18
|
var ItemLink = require('./ItemLink.js');
|
|
19
|
+
var CategoriesContext = require('../../provider/CategoriesContext.js');
|
|
19
20
|
|
|
20
21
|
const { container, textBehavior } = menubar.item();
|
|
21
22
|
const Item = ({
|
|
@@ -24,21 +25,24 @@ const Item = ({
|
|
|
24
25
|
renderSubItems,
|
|
25
26
|
className,
|
|
26
27
|
anchorProps,
|
|
28
|
+
title,
|
|
29
|
+
parentCategoryTitle,
|
|
27
30
|
...rest
|
|
28
31
|
}) => {
|
|
29
|
-
const [showSubItem, setShowSubItem] = React.useState(false);
|
|
30
32
|
const hasSubItems = (subItems ?? []).length > 0;
|
|
31
33
|
const [, setShow] = useMenubar.useMenubar();
|
|
34
|
+
const { expandedMenus, toggleSubmenu } = CategoriesContext.useCategories();
|
|
35
|
+
const isExpanded = expandedMenus[parentCategoryTitle] === title;
|
|
32
36
|
const handleClickItemMenubar = React.useCallback(
|
|
33
37
|
(e) => {
|
|
34
38
|
if (hasSubItems) {
|
|
35
39
|
e.stopPropagation();
|
|
36
|
-
|
|
40
|
+
toggleSubmenu(parentCategoryTitle, title);
|
|
37
41
|
} else {
|
|
38
42
|
setShow(false);
|
|
39
43
|
}
|
|
40
44
|
},
|
|
41
|
-
[]
|
|
45
|
+
[hasSubItems, parentCategoryTitle, title, toggleSubmenu, setShow]
|
|
42
46
|
);
|
|
43
47
|
return /* @__PURE__ */ React.createElement(ItemLink, { anchorProps }, /* @__PURE__ */ React.createElement(
|
|
44
48
|
"div",
|
|
@@ -52,8 +56,14 @@ const Item = ({
|
|
|
52
56
|
)
|
|
53
57
|
},
|
|
54
58
|
children,
|
|
55
|
-
hasSubItems ? /* @__PURE__ */ React.createElement(
|
|
56
|
-
|
|
59
|
+
hasSubItems ? /* @__PURE__ */ React.createElement(
|
|
60
|
+
IconControlSubItem,
|
|
61
|
+
{
|
|
62
|
+
show: isExpanded,
|
|
63
|
+
setShow: () => toggleSubmenu(parentCategoryTitle, title)
|
|
64
|
+
}
|
|
65
|
+
) : null
|
|
66
|
+
), isExpanded ? /* @__PURE__ */ React.createElement(React.Fragment, null, subItems?.map((subItem) => renderSubItems?.(subItem))) : null);
|
|
57
67
|
};
|
|
58
68
|
|
|
59
69
|
module.exports = Item;
|
|
@@ -8,11 +8,14 @@ var types = require('../components/Uploader/types.js');
|
|
|
8
8
|
const useFileUpload = ({
|
|
9
9
|
accept = {},
|
|
10
10
|
onAccept,
|
|
11
|
+
onFileRejected,
|
|
11
12
|
maxSize,
|
|
12
13
|
allowMultiple = true,
|
|
13
|
-
|
|
14
|
+
preventDuplicates = false,
|
|
15
|
+
onDuplicate
|
|
14
16
|
}) => {
|
|
15
17
|
const [files, setFiles] = React.useState([]);
|
|
18
|
+
const [duplicates, setDuplicates] = React.useState([]);
|
|
16
19
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
17
20
|
const onOpen = React.useCallback(() => setIsOpen(true), []);
|
|
18
21
|
const onClose = React.useCallback(() => setIsOpen(false), []);
|
|
@@ -25,7 +28,21 @@ const useFileUpload = ({
|
|
|
25
28
|
[]
|
|
26
29
|
);
|
|
27
30
|
const onDrop = async (acceptedFiles) => {
|
|
28
|
-
|
|
31
|
+
let toProcess = acceptedFiles;
|
|
32
|
+
if (preventDuplicates) {
|
|
33
|
+
const found = (acceptedFiles ?? []).filter(
|
|
34
|
+
(file) => files.some((existing) => existing.file.name === file.name)
|
|
35
|
+
);
|
|
36
|
+
if (found.length > 0) {
|
|
37
|
+
setDuplicates(found);
|
|
38
|
+
onDuplicate?.(found);
|
|
39
|
+
}
|
|
40
|
+
toProcess = acceptedFiles.filter(
|
|
41
|
+
(file) => !found.some((dup) => dup.name === file.name)
|
|
42
|
+
);
|
|
43
|
+
if (toProcess.length === 0) return;
|
|
44
|
+
}
|
|
45
|
+
const newFiles = toProcess.map((file) => ({
|
|
29
46
|
file,
|
|
30
47
|
status: onAccept ? types.FileStatus.UPLOADING : types.FileStatus.SUCCESS,
|
|
31
48
|
uid: uuid.v4()
|
|
@@ -86,6 +103,7 @@ const useFileUpload = ({
|
|
|
86
103
|
},
|
|
87
104
|
open: isOpen,
|
|
88
105
|
files,
|
|
106
|
+
duplicates,
|
|
89
107
|
onClearFiles: handleClearFiles
|
|
90
108
|
};
|
|
91
109
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const CategoriesContext = React.createContext(null);
|
|
6
|
+
const CategoriesProvider = ({ children }) => {
|
|
7
|
+
const [expandedMenus, setExpandedMenus] = React.useState({});
|
|
8
|
+
const toggleSubmenu = (categoryId, submenuId) => {
|
|
9
|
+
setExpandedMenus((prev) => {
|
|
10
|
+
return {
|
|
11
|
+
...prev,
|
|
12
|
+
[categoryId]: prev[categoryId] === submenuId ? null : submenuId
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
return /* @__PURE__ */ React.createElement(CategoriesContext.Provider, { value: { expandedMenus, toggleSubmenu } }, children);
|
|
17
|
+
};
|
|
18
|
+
const useCategories = () => {
|
|
19
|
+
const context = React.useContext(CategoriesContext);
|
|
20
|
+
if (!context) {
|
|
21
|
+
throw new Error("useCategories must be used within CategoriesProvider");
|
|
22
|
+
}
|
|
23
|
+
return context;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
exports.CategoriesProvider = CategoriesProvider;
|
|
27
|
+
exports.useCategories = useCategories;
|
|
@@ -9,10 +9,11 @@ import 'react-dropzone';
|
|
|
9
9
|
import 'uuid';
|
|
10
10
|
import '@floating-ui/react';
|
|
11
11
|
import 'currency.js';
|
|
12
|
+
import { CategoriesProvider } from '../../provider/CategoriesContext.js';
|
|
12
13
|
|
|
13
14
|
const Categories = ({ children }) => {
|
|
14
15
|
const { width } = useDimensions();
|
|
15
|
-
return /* @__PURE__ */ React__default.createElement(Masonry, { columns: width <= 640 ? 2 : 4 }, children);
|
|
16
|
+
return /* @__PURE__ */ React__default.createElement(CategoriesProvider, null, /* @__PURE__ */ React__default.createElement(Masonry, { columns: width <= 640 ? 2 : 4 }, children));
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
export { Categories as default };
|
|
@@ -26,6 +26,8 @@ const DropdownRoot = ({
|
|
|
26
26
|
{
|
|
27
27
|
key: prop.title,
|
|
28
28
|
...rest,
|
|
29
|
+
parentCategoryTitle: item.title,
|
|
30
|
+
title,
|
|
29
31
|
subItems: items ?? [],
|
|
30
32
|
renderSubItems: ({ title: title2, ...rest2 }) => {
|
|
31
33
|
return /* @__PURE__ */ React__default.createElement(SubItem, { key: title2, ...rest2 }, title2);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
|
-
import React__default, {
|
|
2
|
+
import React__default, { useCallback } from 'react';
|
|
3
3
|
import '@internationalized/date';
|
|
4
4
|
import 'react-aria';
|
|
5
5
|
import 'react-stately';
|
|
@@ -14,6 +14,7 @@ import { useMenubar } from '../../provider/useMenubar.js';
|
|
|
14
14
|
import { item } from '../../styles/menubar.js';
|
|
15
15
|
import IconControlSubItem from './IconControlSubItem.js';
|
|
16
16
|
import ItemLink from './ItemLink.js';
|
|
17
|
+
import { useCategories } from '../../provider/CategoriesContext.js';
|
|
17
18
|
|
|
18
19
|
const { container, textBehavior } = item();
|
|
19
20
|
const Item = ({
|
|
@@ -22,21 +23,24 @@ const Item = ({
|
|
|
22
23
|
renderSubItems,
|
|
23
24
|
className,
|
|
24
25
|
anchorProps,
|
|
26
|
+
title,
|
|
27
|
+
parentCategoryTitle,
|
|
25
28
|
...rest
|
|
26
29
|
}) => {
|
|
27
|
-
const [showSubItem, setShowSubItem] = useState(false);
|
|
28
30
|
const hasSubItems = (subItems ?? []).length > 0;
|
|
29
31
|
const [, setShow] = useMenubar();
|
|
32
|
+
const { expandedMenus, toggleSubmenu } = useCategories();
|
|
33
|
+
const isExpanded = expandedMenus[parentCategoryTitle] === title;
|
|
30
34
|
const handleClickItemMenubar = useCallback(
|
|
31
35
|
(e) => {
|
|
32
36
|
if (hasSubItems) {
|
|
33
37
|
e.stopPropagation();
|
|
34
|
-
|
|
38
|
+
toggleSubmenu(parentCategoryTitle, title);
|
|
35
39
|
} else {
|
|
36
40
|
setShow(false);
|
|
37
41
|
}
|
|
38
42
|
},
|
|
39
|
-
[]
|
|
43
|
+
[hasSubItems, parentCategoryTitle, title, toggleSubmenu, setShow]
|
|
40
44
|
);
|
|
41
45
|
return /* @__PURE__ */ React__default.createElement(ItemLink, { anchorProps }, /* @__PURE__ */ React__default.createElement(
|
|
42
46
|
"div",
|
|
@@ -50,8 +54,14 @@ const Item = ({
|
|
|
50
54
|
)
|
|
51
55
|
},
|
|
52
56
|
children,
|
|
53
|
-
hasSubItems ? /* @__PURE__ */ React__default.createElement(
|
|
54
|
-
|
|
57
|
+
hasSubItems ? /* @__PURE__ */ React__default.createElement(
|
|
58
|
+
IconControlSubItem,
|
|
59
|
+
{
|
|
60
|
+
show: isExpanded,
|
|
61
|
+
setShow: () => toggleSubmenu(parentCategoryTitle, title)
|
|
62
|
+
}
|
|
63
|
+
) : null
|
|
64
|
+
), isExpanded ? /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, subItems?.map((subItem) => renderSubItems?.(subItem))) : null);
|
|
55
65
|
};
|
|
56
66
|
|
|
57
67
|
export { Item as default };
|
|
@@ -6,11 +6,14 @@ import { FileStatus, AcceptSpecificMap } from '../components/Uploader/types.js';
|
|
|
6
6
|
const useFileUpload = ({
|
|
7
7
|
accept = {},
|
|
8
8
|
onAccept,
|
|
9
|
+
onFileRejected,
|
|
9
10
|
maxSize,
|
|
10
11
|
allowMultiple = true,
|
|
11
|
-
|
|
12
|
+
preventDuplicates = false,
|
|
13
|
+
onDuplicate
|
|
12
14
|
}) => {
|
|
13
15
|
const [files, setFiles] = useState([]);
|
|
16
|
+
const [duplicates, setDuplicates] = useState([]);
|
|
14
17
|
const [isOpen, setIsOpen] = useState(false);
|
|
15
18
|
const onOpen = useCallback(() => setIsOpen(true), []);
|
|
16
19
|
const onClose = useCallback(() => setIsOpen(false), []);
|
|
@@ -23,7 +26,21 @@ const useFileUpload = ({
|
|
|
23
26
|
[]
|
|
24
27
|
);
|
|
25
28
|
const onDrop = async (acceptedFiles) => {
|
|
26
|
-
|
|
29
|
+
let toProcess = acceptedFiles;
|
|
30
|
+
if (preventDuplicates) {
|
|
31
|
+
const found = (acceptedFiles ?? []).filter(
|
|
32
|
+
(file) => files.some((existing) => existing.file.name === file.name)
|
|
33
|
+
);
|
|
34
|
+
if (found.length > 0) {
|
|
35
|
+
setDuplicates(found);
|
|
36
|
+
onDuplicate?.(found);
|
|
37
|
+
}
|
|
38
|
+
toProcess = acceptedFiles.filter(
|
|
39
|
+
(file) => !found.some((dup) => dup.name === file.name)
|
|
40
|
+
);
|
|
41
|
+
if (toProcess.length === 0) return;
|
|
42
|
+
}
|
|
43
|
+
const newFiles = toProcess.map((file) => ({
|
|
27
44
|
file,
|
|
28
45
|
status: onAccept ? FileStatus.UPLOADING : FileStatus.SUCCESS,
|
|
29
46
|
uid: v4()
|
|
@@ -84,6 +101,7 @@ const useFileUpload = ({
|
|
|
84
101
|
},
|
|
85
102
|
open: isOpen,
|
|
86
103
|
files,
|
|
104
|
+
duplicates,
|
|
87
105
|
onClearFiles: handleClearFiles
|
|
88
106
|
};
|
|
89
107
|
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React__default, { createContext, useState, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
const CategoriesContext = createContext(null);
|
|
4
|
+
const CategoriesProvider = ({ children }) => {
|
|
5
|
+
const [expandedMenus, setExpandedMenus] = useState({});
|
|
6
|
+
const toggleSubmenu = (categoryId, submenuId) => {
|
|
7
|
+
setExpandedMenus((prev) => {
|
|
8
|
+
return {
|
|
9
|
+
...prev,
|
|
10
|
+
[categoryId]: prev[categoryId] === submenuId ? null : submenuId
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
return /* @__PURE__ */ React__default.createElement(CategoriesContext.Provider, { value: { expandedMenus, toggleSubmenu } }, children);
|
|
15
|
+
};
|
|
16
|
+
const useCategories = () => {
|
|
17
|
+
const context = useContext(CategoriesContext);
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error("useCategories must be used within CategoriesProvider");
|
|
20
|
+
}
|
|
21
|
+
return context;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { CategoriesProvider, useCategories };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ItemProps } from './types';
|
|
3
|
-
declare const Item: <T>({ children, subItems, renderSubItems, className, anchorProps, ...rest }: ItemProps<T>) => React.JSX.Element;
|
|
3
|
+
declare const Item: <T>({ children, subItems, renderSubItems, className, anchorProps, title, parentCategoryTitle, ...rest }: ItemProps<T>) => React.JSX.Element;
|
|
4
4
|
export default Item;
|
|
@@ -9,7 +9,7 @@ export declare const Menubar: {
|
|
|
9
9
|
MostUsedItem: ({ title, category, anchorProps, ...rest }: import("./types").MostUsedItemProps) => import("react").JSX.Element;
|
|
10
10
|
Category: <T>({ title, options, render }: import("./types").CategoryType<T>) => import("react").JSX.Element;
|
|
11
11
|
Categories: ({ children }: import("./types").DefaultProps) => import("react").JSX.Element;
|
|
12
|
-
Item: <T>({ children, subItems, renderSubItems, className, anchorProps, ...rest }: import("./types").ItemProps<T>) => import("react").JSX.Element;
|
|
12
|
+
Item: <T>({ children, subItems, renderSubItems, className, anchorProps, title, parentCategoryTitle, ...rest }: import("./types").ItemProps<T>) => import("react").JSX.Element;
|
|
13
13
|
SubItem: ({ children, anchorProps, className, ...rest }: import("./types").SubItemProps) => import("react").JSX.Element;
|
|
14
14
|
DropdownRoot: ({ mostUsed, options, labelMostUsed, }: import("./types").DropdownRootProps) => import("react").JSX.Element;
|
|
15
15
|
};
|
|
@@ -9,18 +9,20 @@ interface UseFileUploadOptions<T> {
|
|
|
9
9
|
TEXT?: (typeof AcceptSpecificMap.TEXT)[number][];
|
|
10
10
|
};
|
|
11
11
|
onAccept?: (files: FileUpload<T>[]) => Promise<FileUpload<T>[]>;
|
|
12
|
+
onFileRejected?: (fileRejections: FileRejection[], event: DropEvent) => void;
|
|
12
13
|
maxSize?: number;
|
|
13
14
|
allowMultiple?: boolean;
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
preventDuplicates?: boolean;
|
|
16
|
+
onDuplicate?: (duplicates: File[]) => void;
|
|
16
17
|
}
|
|
17
|
-
export declare const useFileUpload: <T>({ accept, onAccept, maxSize, allowMultiple,
|
|
18
|
+
export declare const useFileUpload: <T>({ accept, onAccept, onFileRejected, maxSize, allowMultiple, preventDuplicates, onDuplicate, }: UseFileUploadOptions<T>) => {
|
|
18
19
|
onOpen: () => void;
|
|
19
20
|
onClose: () => void;
|
|
20
21
|
onDelete: (index: number) => void;
|
|
21
22
|
dropzoneProps: UseDropzoneProps;
|
|
22
23
|
open: boolean;
|
|
23
24
|
files: FileUpload<T>[];
|
|
25
|
+
duplicates: File[];
|
|
24
26
|
onClearFiles: () => void;
|
|
25
27
|
};
|
|
26
28
|
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
interface ExpandedMenusState {
|
|
3
|
+
[categoryId: string]: string | null;
|
|
4
|
+
}
|
|
5
|
+
interface CategoriesContextProps {
|
|
6
|
+
expandedMenus: ExpandedMenusState;
|
|
7
|
+
toggleSubmenu: (categoryId: string, submenuId: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const CategoriesProvider: ({ children }: {
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}) => React.JSX.Element;
|
|
12
|
+
export declare const useCategories: () => CategoriesContextProps;
|
|
13
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tecsinapse/cortex-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0-beta.1",
|
|
4
4
|
"description": "React components based in @tecsinapse/cortex-core",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"react-icons": ">=5.2.0",
|
|
48
48
|
"tailwind": ">=3.3.0"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "63a5eb0b70ad18f30ecd015e420aa8b4f4fdc2bd"
|
|
51
51
|
}
|