@agilant/toga-blox 1.0.32 → 1.0.34
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/components/Dropdown/Dropdown.d.ts +4 -0
- package/dist/components/Dropdown/Dropdown.js +20 -0
- package/dist/components/Dropdown/Dropdown.stories.d.ts +8 -0
- package/dist/components/Dropdown/Dropdown.stories.js +110 -0
- package/dist/components/Dropdown/Dropdown.test.d.ts +1 -0
- package/dist/components/Dropdown/Dropdown.test.js +43 -0
- package/dist/components/Dropdown/Dropdown.types.d.ts +15 -0
- package/dist/components/Dropdown/Dropdown.types.js +1 -0
- package/dist/components/GenericList/GenericList.d.ts +2 -15
- package/dist/components/GenericList/GenericList.js +64 -51
- package/dist/components/GenericList/GenericList.stories.d.ts +8 -35
- package/dist/components/GenericList/GenericList.stories.js +46 -78
- package/dist/components/GenericList/GenericList.test.d.ts +1 -1
- package/dist/components/GenericList/GenericList.test.js +112 -22
- package/dist/components/GenericList/index.d.ts +2 -0
- package/dist/components/GenericList/index.js +2 -0
- package/dist/components/GenericList/types.d.ts +16 -0
- package/dist/components/GenericList/types.js +1 -0
- package/dist/components/Header/Header.stories.js +2 -4
- package/dist/components/Input/Input.d.ts +30 -3
- package/dist/components/Input/Input.js +70 -48
- package/dist/components/Input/Input.stories.js +3 -4
- package/dist/components/Input/Input.test.js +74 -42
- package/dist/components/InputAndCheck/InputAndCheck.d.ts +47 -0
- package/dist/components/InputAndCheck/InputAndCheck.js +74 -0
- package/dist/components/InputAndCheck/InputAndCheck.stories.d.ts +9 -0
- package/dist/components/InputAndCheck/InputAndCheck.stories.js +201 -0
- package/dist/components/InputAndCheck/InputAndCheck.test.d.ts +1 -0
- package/dist/components/InputAndCheck/InputAndCheck.test.js +307 -0
- package/dist/components/InputAndCheck/index.d.ts +0 -0
- package/dist/components/InputAndCheck/index.js +0 -0
- package/dist/components/InputAndCheck/types.d.ts +35 -0
- package/dist/components/InputAndCheck/types.js +1 -0
- package/dist/components/MagnifyingIcon/MagnifyingIcon.d.ts +4 -0
- package/dist/components/MagnifyingIcon/MagnifyingIcon.js +60 -0
- package/dist/components/MagnifyingIcon/MagnifyingIcon.stories.d.ts +9 -0
- package/dist/components/MagnifyingIcon/MagnifyingIcon.stories.js +72 -0
- package/dist/components/MagnifyingIcon/MagnifyingIcon.test.d.ts +1 -0
- package/dist/components/MagnifyingIcon/MagnifyingIcon.test.js +101 -0
- package/dist/components/MagnifyingIcon/index.d.ts +2 -0
- package/dist/components/MagnifyingIcon/index.js +2 -0
- package/dist/components/MagnifyingIcon/types.d.ts +20 -0
- package/dist/components/MagnifyingIcon/types.js +2 -0
- package/dist/components/MultiSelect/MultiSelect.d.ts +4 -0
- package/dist/components/MultiSelect/MultiSelect.js +30 -0
- package/dist/components/MultiSelect/MultiSelect.stories.d.ts +10 -0
- package/dist/components/MultiSelect/MultiSelect.stories.js +162 -0
- package/dist/components/MultiSelect/MultiSelect.test.d.ts +1 -0
- package/dist/components/MultiSelect/MultiSelect.test.js +107 -0
- package/dist/components/MultiSelect/MultiSelect.types.d.ts +28 -0
- package/dist/components/MultiSelect/MultiSelect.types.js +1 -0
- package/dist/components/Page/ViewPageTemplate.stories.js +2 -3
- package/dist/components/PrimaryTableHeader/PrimaryTableHeader.d.ts +3 -0
- package/dist/components/PrimaryTableHeader/PrimaryTableHeader.js +72 -0
- package/dist/components/PrimaryTableHeader/PrimaryTableHeader.stories.d.ts +4 -0
- package/dist/components/PrimaryTableHeader/PrimaryTableHeader.stories.js +99 -0
- package/dist/components/PrimaryTableHeader/PrimaryTableHeader.test.d.ts +1 -0
- package/dist/components/PrimaryTableHeader/PrimaryTableHeader.test.js +124 -0
- package/dist/components/PrimaryTableHeader/index.d.ts +0 -0
- package/dist/components/PrimaryTableHeader/index.js +0 -0
- package/dist/components/PrimaryTableHeader/types.d.ts +35 -0
- package/dist/components/PrimaryTableHeader/types.js +2 -0
- package/dist/components/SearchInput/SearchInput.d.ts +1 -2
- package/dist/components/SearchInput/SearchInput.js +61 -11
- package/dist/components/SearchInput/SearchInput.stories.d.ts +2 -4
- package/dist/components/SearchInput/SearchInput.stories.js +80 -93
- package/dist/components/SearchInput/SearchInput.types.d.ts +37 -24
- package/dist/components/SearchInput/SearchNumberInput.d.ts +31 -0
- package/dist/components/SearchInput/SearchNumberInput.js +60 -0
- package/dist/components/SearchInput/SearchTextInput.d.ts +24 -0
- package/dist/components/SearchInput/SearchTextInput.js +65 -0
- package/dist/components/SortArrowIcon/SortArrowIcon.d.ts +4 -0
- package/dist/components/SortArrowIcon/SortArrowIcon.js +12 -0
- package/dist/components/SortArrowIcon/SortArrowIcon.stories.d.ts +17 -0
- package/dist/components/SortArrowIcon/SortArrowIcon.stories.js +77 -0
- package/dist/components/SortArrowIcon/SortArrowIcon.test.d.ts +1 -0
- package/dist/components/SortArrowIcon/SortArrowIcon.test.js +44 -0
- package/dist/components/SortArrowIcon/index.d.ts +2 -0
- package/dist/components/SortArrowIcon/index.js +2 -0
- package/dist/components/SortArrowIcon/types.d.ts +15 -0
- package/dist/components/SortArrowIcon/types.js +1 -0
- package/dist/components/SortArrows/SortArrows.d.ts +3 -0
- package/dist/components/SortArrows/SortArrows.js +33 -0
- package/dist/components/SortArrows/SortArrows.stories.d.ts +7 -0
- package/dist/components/SortArrows/SortArrows.stories.js +41 -0
- package/dist/components/SortArrows/SortArrows.test.d.ts +1 -0
- package/dist/components/SortArrows/SortArrows.test.js +150 -0
- package/dist/components/SortArrows/index.d.ts +2 -0
- package/dist/components/SortArrows/index.js +2 -0
- package/dist/components/SortArrows/types.d.ts +21 -0
- package/dist/components/SortArrows/types.js +1 -0
- package/dist/components/SortArrows/useSortArrowsViewModel.d.ts +30 -0
- package/dist/components/SortArrows/useSortArrowsViewModel.js +114 -0
- package/dist/components/SortArrows/useSortArrowsViewModel.test.d.ts +1 -0
- package/dist/components/SortArrows/useSortArrowsViewModel.test.js +100 -0
- package/dist/components/TableCell/TableCell.d.ts +3 -0
- package/dist/components/TableCell/TableCell.js +13 -0
- package/dist/components/TableCell/TableCell.stories.d.ts +16 -0
- package/dist/components/TableCell/TableCell.stories.js +99 -0
- package/dist/components/TableCell/TableCell.test.d.ts +1 -0
- package/dist/components/TableCell/TableCell.test.js +84 -0
- package/dist/components/TableCell/index.d.ts +2 -0
- package/dist/components/TableCell/index.js +2 -0
- package/dist/components/TableCell/types.d.ts +12 -0
- package/dist/components/TableCell/types.js +1 -0
- package/dist/components/TableHeaderContent/TableHeaderContent.d.ts +3 -0
- package/dist/components/TableHeaderContent/TableHeaderContent.js +5 -0
- package/dist/components/TableHeaderContent/TableHeaderContent.stories.d.ts +6 -0
- package/dist/components/TableHeaderContent/TableHeaderContent.stories.js +62 -0
- package/dist/components/TableHeaderContent/TableHeaderContent.test.d.ts +1 -0
- package/dist/components/TableHeaderContent/TableHeaderContent.test.js +41 -0
- package/dist/components/TableHeaderContent/index.d.ts +0 -0
- package/dist/components/TableHeaderContent/index.js +0 -0
- package/dist/components/TableHeaderContent/types.d.ts +5 -0
- package/dist/components/TableHeaderContent/types.js +1 -0
- package/dist/components/TableHeaderInput/TableHeaderInput.d.ts +3 -0
- package/dist/components/TableHeaderInput/TableHeaderInput.js +80 -0
- package/dist/components/TableHeaderInput/TableHeaderInput.stories.d.ts +10 -0
- package/dist/components/TableHeaderInput/TableHeaderInput.stories.js +82 -0
- package/dist/components/TableHeaderInput/TableHeaderInput.test.d.ts +1 -0
- package/dist/components/TableHeaderInput/TableHeaderInput.test.js +84 -0
- package/dist/components/TableHeaderInput/index.d.ts +1 -0
- package/dist/components/TableHeaderInput/index.js +1 -0
- package/dist/components/TableHeaderInput/types.d.ts +30 -0
- package/dist/components/TableHeaderInput/types.js +1 -0
- package/dist/components/TableRow/TableRow.d.ts +15 -0
- package/dist/components/TableRow/TableRow.js +21 -0
- package/dist/components/TableRow/TableRow.stories.d.ts +9 -0
- package/dist/components/TableRow/TableRow.stories.js +195 -0
- package/dist/components/TableRow/TableRow.test.d.ts +1 -0
- package/dist/components/TableRow/TableRow.test.js +44 -0
- package/dist/components/TableRow/index.d.ts +2 -0
- package/dist/components/TableRow/index.js +2 -0
- package/dist/components/TableRow/types.d.ts +11 -0
- package/dist/components/TableRow/types.js +1 -0
- package/dist/components/ToggleButton/ToggleButton.d.ts +4 -0
- package/dist/components/ToggleButton/ToggleButton.js +41 -0
- package/dist/components/ToggleButton/ToggleButton.stories.d.ts +11 -0
- package/dist/components/ToggleButton/ToggleButton.stories.js +111 -0
- package/dist/components/ToggleButton/ToggleButton.test.d.ts +1 -0
- package/dist/components/ToggleButton/ToggleButton.test.js +106 -0
- package/dist/components/ToggleButton/ToggleButton.types.d.ts +22 -0
- package/dist/components/ToggleButton/ToggleButton.types.js +1 -0
- package/package.json +11 -4
|
@@ -5,7 +5,6 @@ import PageSection from "../PageSection/PageSection";
|
|
|
5
5
|
import Badge from "../Badge/Badge";
|
|
6
6
|
import Text from "../Text/Text";
|
|
7
7
|
import Image from "../Image/Image";
|
|
8
|
-
import Input from "../Input/Input";
|
|
9
8
|
import Nav from "../Nav/Nav";
|
|
10
9
|
import Card from "../Card/Card";
|
|
11
10
|
import BaseButton from "../BaseButton";
|
|
@@ -45,7 +44,7 @@ ViewWithHeroAndCardsWithGlassHeader.args = {
|
|
|
45
44
|
children: [
|
|
46
45
|
//the div acts as a spacer for the header because the header is fixed
|
|
47
46
|
_jsx("div", { className: "h-16" }, "spacer"),
|
|
48
|
-
_jsx("div", { className: "fixed top-0 w-full z-[1000]", children: _jsx(Header, { mobileLeft: true, hasIcons: true, hasSearchBar: true, hasBadge: true, hasNavItems: true, hasMobileMenu: true, logoBorderRadius: true, logoHoverColor: "hover:bg-blue-500", backgroundColor: "bg-gray-500", bottomBorderColor: "border-black", mobileOpenIcon: getFontAwesomeIcon("hamburger"), mobileCloseIcon: getFontAwesomeIcon("x"), mobileMenuBackground: "bg-blue-500", hasMobileIcons: true, hasMobileNavItems: true, hasMobileBadge: false, hasMobileSearchBar: true, hasAnimatedHamburgerButton: true, icons: _jsx(_Fragment, {}), badge: _jsx(Badge, { type: "href", to: "#", hoverColor: "hover:text-blue-500", borderColor: "border-none", mobileIcon: getFontAwesomeIcon("phone"), mobileIconLabel: "Contact Us", onClick: () => alert("Redirect to Contact Us page"), image: _jsx(Image, { src: "../../../assets/contact-image.png", alt: "", background: false, additionalClasses: "flex justify-center w-8 h-8 max-md:hidden" }), text: _jsxs(_Fragment, { children: [_jsx(Text, { size: "text-sm", color: "text-black", fontFamily: "font-serif", text: "Contact Us", tag: "h2", additionalClasses: "pl-2 pb-0 font-bold" }), _jsx(Text, { size: "text-xs", color: "text-black", fontFamily: "font-serif", text: "1-800-800-8000", tag: "p", additionalClasses: "pl-2 pt-0" })] }) }), logo: _jsx(Image, { src: "../../../assets/Logo.png", alt: "Generic Company Logo.", background: false, additionalClasses: " w-40 p-2" }), nav: _jsx(Nav, { navData: DUMMYCOMPASSNAVDATA, navBackgroundColor: "#FFFFF", parentHoverBackground: "none", parentHoverFontColor: "text-black", parentHoverUnderline: true, parentHoverBorderColor: "none", parentShape: "rounded", parentBackground: "none", parentBorderColor: "none", submenuBackgroundColor: "bg-white", submenuHoverBackground: "hover:bg-blue-500", submenuHoverBorderStyle: "top-bottom", submenuHoverBorderColor: "border-blue-500", includeSubmenuImages: true, mobileBreakpoint: "extraLarge", accordionParentStyle: "rounded p-2 w-full border-b-2 border-b-blue-700 text-black", accordionExpandedStyle: "pl-2 py-3" }), input: _jsx(
|
|
47
|
+
_jsx("div", { className: "fixed top-0 w-full z-[1000]", children: _jsx(Header, { mobileLeft: true, hasIcons: true, hasSearchBar: true, hasBadge: true, hasNavItems: true, hasMobileMenu: true, logoBorderRadius: true, logoHoverColor: "hover:bg-blue-500", backgroundColor: "bg-gray-500", bottomBorderColor: "border-black", mobileOpenIcon: getFontAwesomeIcon("hamburger"), mobileCloseIcon: getFontAwesomeIcon("x"), mobileMenuBackground: "bg-blue-500", hasMobileIcons: true, hasMobileNavItems: true, hasMobileBadge: false, hasMobileSearchBar: true, hasAnimatedHamburgerButton: true, icons: _jsx(_Fragment, {}), badge: _jsx(Badge, { type: "href", to: "#", hoverColor: "hover:text-blue-500", borderColor: "border-none", mobileIcon: getFontAwesomeIcon("phone"), mobileIconLabel: "Contact Us", onClick: () => alert("Redirect to Contact Us page"), image: _jsx(Image, { src: "../../../assets/contact-image.png", alt: "", background: false, additionalClasses: "flex justify-center w-8 h-8 max-md:hidden" }), text: _jsxs(_Fragment, { children: [_jsx(Text, { size: "text-sm", color: "text-black", fontFamily: "font-serif", text: "Contact Us", tag: "h2", additionalClasses: "pl-2 pb-0 font-bold" }), _jsx(Text, { size: "text-xs", color: "text-black", fontFamily: "font-serif", text: "1-800-800-8000", tag: "p", additionalClasses: "pl-2 pt-0" })] }) }), logo: _jsx(Image, { src: "../../../assets/Logo.png", alt: "Generic Company Logo.", background: false, additionalClasses: " w-40 p-2" }), nav: _jsx(Nav, { navData: DUMMYCOMPASSNAVDATA, navBackgroundColor: "#FFFFF", parentHoverBackground: "none", parentHoverFontColor: "text-black", parentHoverUnderline: true, parentHoverBorderColor: "none", parentShape: "rounded", parentBackground: "none", parentBorderColor: "none", submenuBackgroundColor: "bg-white", submenuHoverBackground: "hover:bg-blue-500", submenuHoverBorderStyle: "top-bottom", submenuHoverBorderColor: "border-blue-500", includeSubmenuImages: true, mobileBreakpoint: "extraLarge", accordionParentStyle: "rounded p-2 w-full border-b-2 border-b-blue-700 text-black", accordionExpandedStyle: "pl-2 py-3" }), input: _jsx(_Fragment, {}) }) }, "header"),
|
|
49
48
|
_jsx(Hero, { textAlignment: "center", background: "image" }, "hero"),
|
|
50
49
|
_jsx(PageSection, { sectionContainerClasses: "flex flex-col w-full h-full bg-slate-100 p-6\n justify-center items-center max-sm:p-2 max-w-pageSectionMaxWidth mx-auto", children: _jsx(GenericList, { data: DUMMYCOMPASSPRODUCTDATA, listType: "unordered", hasVirtualization: false, containerClasses: "w-full h-[100%] grid grid-cols-4 gap-y-12 gap-x-8 max-lg:grid-cols-2 max-lg:gap-y-12 max-lg:gap-x-2 max-md:gap-12 max-sm:w-[90%] max-sm:gap-8 justify-items-center", renderItem: (item) => (_jsx(Card, { containerClasses: "w-full h-full shadow-md overflow-hidden rounded-md transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300 max-lg:transition-none max-lg:hover:transform-none max-w-72", cardBackgroundColor: item.cardBackgroundColor, cardBorderRadius: item.cardBorderRadius, cardBorderColor: item.cardBorderColor, cardBoxShadow: item.cardBoxShadow, children: _jsx(CompassCardTemplate, { data: { ...item, title: "" } }) }, item.id)) }) }, "pageSectionOne"),
|
|
51
50
|
],
|
|
@@ -68,6 +67,6 @@ ViewWithTableAndTitle.args = {
|
|
|
68
67
|
export const CompassPageView = Template.bind({});
|
|
69
68
|
CompassPageView.args = {
|
|
70
69
|
children: [
|
|
71
|
-
_jsxs("div", { children: [_jsx("div", { className: "h-16" }), _jsx("div", { className: "fixed top-0 w-full z-[1000]", children: _jsx(Header, { mobileLeft: true, icons: _jsx(_Fragment, {}), hasIcons: true, hasSearchBar: true, hasBadge: true, hasNavItems: true, hasMobileMenu: true, hasAnimatedHamburgerButton: true, logoBorderRadius: true, logoHoverColor: "hover:bg-green-500", backgroundColor: "bg-gray-500", bottomBorderColor: "border-green-500", mobileOpenIcon: getFontAwesomeIcon("hamburger"), mobileCloseIcon: getFontAwesomeIcon("x"), mobileMenuBackground: "bg-green-500", hasMobileIcons: true, hasMobileNavItems: true, hasMobileBadge: false, hasMobileSearchBar: true, badge: _jsx(Badge, { type: "href", to: "#", hoverColor: "hover:text-green-500", borderColor: "border-none", mobileIcon: getFontAwesomeIcon("phone"), mobileIconLabel: "Contact Us", onClick: () => alert("Redirect to Contact Us page"), image: _jsx(Image, { src: "../../../assets/contact-image.png", alt: "", background: false, additionalClasses: "flex justify-center w-8 h-8 max-md:hidden" }), text: _jsxs(_Fragment, { children: [_jsx(Text, { size: "text-sm", color: "text-black", fontFamily: "font-serif", text: "Contact Us", tag: "h2", additionalClasses: "pl-2 pb-0 font-bold" }), _jsx(Text, { size: "text-xs", color: "text-black", fontFamily: "font-serif", text: "1-800-800-8000", tag: "p", additionalClasses: "pl-2 pt-0" })] }) }), logo: _jsx(Image, { src: "../../../assets/compass-logo.png", alt: "Generic Company Logo.", background: false, additionalClasses: " w-40 p-2" }), nav: _jsx(Nav, { navData: DUMMYCOMPASSNAVDATA, navBackgroundColor: "#FFFFF", parentHoverBackground: "none", parentHoverFontColor: "text-black", parentHoverUnderline: true, parentHoverBorderColor: "none", parentShape: "rounded", parentBackground: "none", parentBorderColor: "none", submenuBackgroundColor: "bg-white", submenuHoverBackground: "hover:bg-green-500", submenuHoverBorderStyle: "top-bottom", submenuHoverBorderColor: "border-green-500", includeSubmenuImages: true, mobileBreakpoint: "extraLarge", accordionParentStyle: "rounded p-2 w-full border-b-2 border-b-teal-700 text-black", accordionExpandedStyle: "pl-2 py-3" }), input: _jsx(
|
|
70
|
+
_jsxs("div", { children: [_jsx("div", { className: "h-16" }), _jsx("div", { className: "fixed top-0 w-full z-[1000]", children: _jsx(Header, { mobileLeft: true, icons: _jsx(_Fragment, {}), hasIcons: true, hasSearchBar: true, hasBadge: true, hasNavItems: true, hasMobileMenu: true, hasAnimatedHamburgerButton: true, logoBorderRadius: true, logoHoverColor: "hover:bg-green-500", backgroundColor: "bg-gray-500", bottomBorderColor: "border-green-500", mobileOpenIcon: getFontAwesomeIcon("hamburger"), mobileCloseIcon: getFontAwesomeIcon("x"), mobileMenuBackground: "bg-green-500", hasMobileIcons: true, hasMobileNavItems: true, hasMobileBadge: false, hasMobileSearchBar: true, badge: _jsx(Badge, { type: "href", to: "#", hoverColor: "hover:text-green-500", borderColor: "border-none", mobileIcon: getFontAwesomeIcon("phone"), mobileIconLabel: "Contact Us", onClick: () => alert("Redirect to Contact Us page"), image: _jsx(Image, { src: "../../../assets/contact-image.png", alt: "", background: false, additionalClasses: "flex justify-center w-8 h-8 max-md:hidden" }), text: _jsxs(_Fragment, { children: [_jsx(Text, { size: "text-sm", color: "text-black", fontFamily: "font-serif", text: "Contact Us", tag: "h2", additionalClasses: "pl-2 pb-0 font-bold" }), _jsx(Text, { size: "text-xs", color: "text-black", fontFamily: "font-serif", text: "1-800-800-8000", tag: "p", additionalClasses: "pl-2 pt-0" })] }) }), logo: _jsx(Image, { src: "../../../assets/compass-logo.png", alt: "Generic Company Logo.", background: false, additionalClasses: " w-40 p-2" }), nav: _jsx(Nav, { navData: DUMMYCOMPASSNAVDATA, navBackgroundColor: "#FFFFF", parentHoverBackground: "none", parentHoverFontColor: "text-black", parentHoverUnderline: true, parentHoverBorderColor: "none", parentShape: "rounded", parentBackground: "none", parentBorderColor: "none", submenuBackgroundColor: "bg-white", submenuHoverBackground: "hover:bg-green-500", submenuHoverBorderStyle: "top-bottom", submenuHoverBorderColor: "border-green-500", includeSubmenuImages: true, mobileBreakpoint: "extraLarge", accordionParentStyle: "rounded p-2 w-full border-b-2 border-b-teal-700 text-black", accordionExpandedStyle: "pl-2 py-3" }), input: _jsx(_Fragment, {}) }) }), _jsx(Hero, { textAlignment: "left", background: "image", src: "../../../assets/compass-tech-hero-bg.png", text: _jsx(Text, { size: "text-2xl", color: "text-white", fontFamily: "font-serif", text: "Equip your team with exactly what they need", tag: "h1", additionalClasses: "w-3/4 max-sm:text-xl max-sm:w-3/4" }) }, "hero"), _jsx(PageSection, { sectionContainerClasses: "w-full bg-slate-100 flex flex-col p-6\n justify-center items-center h-[100%]", children: _jsx(Text, { size: "text-2xl", color: "text-black", fontFamily: "font-serif", text: "Kits", tag: "h2", additionalClasses: "my-4 max-sm:text-xl" }) }, "pageSection"), _jsx(PageSection, { sectionContainerClasses: "flex flex-col w-full h-full bg-slate-100 p-6\n justify-center items-center max-sm:p-2 max-w-pageSectionMaxWidth mx-auto", children: _jsx(GenericList, { data: DUMMYCOMPASSPRODUCTDATA, hasVirtualization: false, listType: "unordered", containerClasses: "w-full grid grid-cols-4 gap-y-12 gap-x-8 max-lg:grid-cols-2 max-lg:gap-y-12 max-lg:gap-x-2 max-md:gap-12 max-sm:w-[90%] max-sm:gap-8 justify-items-center", renderItem: (item) => (_jsx(Card, { containerClasses: "w-full h-full shadow-md overflow-hidden rounded-md transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300 max-lg:transition-none max-lg:hover:transform-none max-w-72", cardBackgroundColor: item.cardBackgroundColor, cardBorderRadius: item.cardBorderRadius, cardBorderColor: item.cardBorderColor, cardBoxShadow: item.cardBoxShadow, children: _jsx(CompassCardTemplate, { data: { ...item, title: "" } }) }, item.id)) }) }, "pageSectionOne"), _jsxs(PageSection, { sectionContainerClasses: "flex w-full bg-yellow-400 flex p-6 justify-center items-center h-[100%] mt-6 max-sm:flex-col", children: [_jsx(Text, { size: "text-xl", color: "text-black", fontFamily: "font-serif", text: "Help us improve your experience:", tag: "h2", additionalClasses: "p-6 max-sm:p-2 max-sm:text-lg" }), _jsx(BaseButton, { text: _jsx(Text, { size: "", color: "", text: "Take the Survey!", fontFamily: "" }), backgroundColor: "bg-green-500", shape: "rounded", borderColor: "border-none", hoverBackground: "hover:bg-green-500", hoverFontColor: "hover:text-green-500", hoverBorderColor: "hover:border-green-500", hoverUnderline: true, onClick: () => alert("Button clicked!"), as: "a" })] }), _jsx(Footer, { logo: _jsx(Image, { src: "../../../assets/compass-logo.png", alt: "Generic Compass Logo.", background: false, additionalClasses: " w-40 p-2" }), title: _jsx(Text, { size: "text-xl", color: "", text: "Compass Website", fontFamily: "", tag: "h2", additionalClasses: "font-bold uppercase pl-2 mt-2" }), slogan: _jsx(Text, { size: "text-md", color: "", text: "Great slogan goes here.", fontFamily: "", tag: "p", additionalClasses: "pl-2" }), copyRightText: _jsx(Text, { size: "md", color: "text-black", text: "Copyright \u00A9 2024 - All right reserved by Generic Company", fontFamily: "", additionalClasses: "text-center" }), socialTitle: _jsx(Text, { size: "md", color: "text-black", text: "Connect", fontFamily: "", additionalClasses: "font-bold uppercase w-full" }), contactTitle: _jsx(Text, { size: "md", color: "text-black", text: "Contact Us:", fontFamily: "", additionalClasses: "font-bold uppercase" }), logoBorderRadius: true, hasNavItems: true, hasSocial: true, logoHoverColor: "hover:bg-green-500", backgroundColor: "bg-green-500", accordionGap: "gap-1", copyRightTextPlacement: "center", socialPlacement: "center", accordionParentStyle: "border-b border-black p-2 w-full", accordionExpandedStyle: "pl-3 py-3" })] }, "randomNumberOne"),
|
|
72
71
|
],
|
|
73
72
|
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { PrimaryTableHeaderProps } from "./types";
|
|
2
|
+
declare const PrimaryTableHeader: <T extends object>({ headerGroups, editingHeader, searchText, setSearchText, setSortColumn, setEditingHeader, setHeaderValue, setResetSearch, columnMappings, setSearchColumn, isNested, parentIndex, onHeaderSortClick, PortalComponent, containerRef, magnifyingIconRef, }: PrimaryTableHeaderProps<T>) => JSX.Element;
|
|
3
|
+
export default PrimaryTableHeader;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { createElement as _createElement } from "react";
|
|
3
|
+
import { useRef, useState, useMemo } from "react";
|
|
4
|
+
import MagnifyingIcon from "../MagnifyingIcon";
|
|
5
|
+
import TableHeaderContent from "../TableHeaderContent/TableHeaderContent";
|
|
6
|
+
import InputAndCheck from "../InputAndCheck/InputAndCheck";
|
|
7
|
+
import SortArrows from "../SortArrows";
|
|
8
|
+
const PrimaryTableHeader = ({ headerGroups, editingHeader, searchText, setSearchText, setSortColumn, setEditingHeader, setHeaderValue, setResetSearch, columnMappings, setSearchColumn, isNested, parentIndex, onHeaderSortClick, PortalComponent, containerRef, magnifyingIconRef, }) => {
|
|
9
|
+
const [searchCriteria, setSearchCriteria] = useState([]);
|
|
10
|
+
const [_, setActiveColumnFromSearch] = useState("");
|
|
11
|
+
const [activeColumn, setActiveColumn] = useState(null);
|
|
12
|
+
const [__, setActiveSortColumn] = useState(null);
|
|
13
|
+
const [___, setSortDirection] = useState(null);
|
|
14
|
+
const { headerNames, mappingFields } = useMemo(() => {
|
|
15
|
+
const headerNames = [];
|
|
16
|
+
headerGroups.forEach((headerGroup) => {
|
|
17
|
+
headerGroup.headers.forEach((col) => {
|
|
18
|
+
let headerName = "";
|
|
19
|
+
if (typeof col.Header === "string") {
|
|
20
|
+
headerName = col.Header;
|
|
21
|
+
}
|
|
22
|
+
else if (typeof col.Header === "function" &&
|
|
23
|
+
col.Header.displayName) {
|
|
24
|
+
headerName = col.Header.displayName;
|
|
25
|
+
}
|
|
26
|
+
headerNames.push(headerName);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
let mappingFields = [];
|
|
30
|
+
if (columnMappings && Array.isArray(columnMappings)) {
|
|
31
|
+
const sortedColumnMapping = [...columnMappings].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
|
32
|
+
mappingFields = sortedColumnMapping.map((cm) => cm.slug);
|
|
33
|
+
}
|
|
34
|
+
return { headerNames, mappingFields };
|
|
35
|
+
}, [headerGroups, columnMappings]);
|
|
36
|
+
const handleSortChange = (columnId, direction) => {
|
|
37
|
+
onHeaderSortClick(columnId, direction);
|
|
38
|
+
};
|
|
39
|
+
function handleMagnifyingSetSearchColumn(col) {
|
|
40
|
+
setSearchColumn(String(col.id));
|
|
41
|
+
}
|
|
42
|
+
const inputRef = useRef(null);
|
|
43
|
+
const divClassNames = "items-center text-sm px-1 min-h-8 flex break-words whitespace-normal px-5 overflow- rounded-lg";
|
|
44
|
+
const theadStyles = "bg-supply-blue-50 w-full sticky top-0 z-10";
|
|
45
|
+
const textStyles = "text-navy-500 font-light text-sm text-nowrap";
|
|
46
|
+
return (_jsx("thead", { className: theadStyles, children: headerGroups.map((headerGroup, headerGroupIndex) => (_createElement("tr", { className: "", ...headerGroup.getHeaderGroupProps(), key: `header-group-${headerGroupIndex}` }, headerGroup.headers.map((column, columnIndex) => {
|
|
47
|
+
const isFirstColumn = columnIndex === 0;
|
|
48
|
+
const isLastColumn = columnIndex === headerGroup.headers.length - 1;
|
|
49
|
+
const roundedClasses = isFirstColumn
|
|
50
|
+
? "rounded-tl-lg "
|
|
51
|
+
: isLastColumn
|
|
52
|
+
? "rounded-tr-lg "
|
|
53
|
+
: "";
|
|
54
|
+
const headerName = headerNames[columnIndex];
|
|
55
|
+
const mappingField = mappingFields[columnIndex];
|
|
56
|
+
const updatedColumn = {
|
|
57
|
+
...column,
|
|
58
|
+
id: column.id,
|
|
59
|
+
accessor: mappingField,
|
|
60
|
+
};
|
|
61
|
+
const shouldRenderMagnifyingIcon = !isLastColumn;
|
|
62
|
+
return (_createElement("th", { className: `${textStyles} ${roundedClasses}`, ...column.getHeaderProps(), key: `header-${headerGroupIndex}-column-${columnIndex}` },
|
|
63
|
+
_jsxs("div", { className: `${divClassNames} relative`, children: [editingHeader === columnIndex ? (_jsxs(_Fragment, { children: [_jsx(TableHeaderContent, { column: updatedColumn }), _jsx("div", { className: "absolute w-full top-[-5px] bottom-4", ref: containerRef, children: _jsxs("div", { className: "absolute top-10 z-20", children: [_jsx(InputAndCheck, { column: updatedColumn, setEditingHeader: setEditingHeader, closeOutSearch: () => setEditingHeader(null), setResetSearch: setResetSearch, searchCriteria: searchCriteria, setSearchCriteria: setSearchCriteria }), (() => {
|
|
64
|
+
inputRef.current?.focus();
|
|
65
|
+
return null;
|
|
66
|
+
})()] }) }), PortalComponent] })) : (_jsx(TableHeaderContent, { column: updatedColumn })), _jsx("div", { className: "ml-1", children: _jsx(SortArrows, { slug: mappingField || "", parentIndex: parentIndex, isNested: isNested, column: {
|
|
67
|
+
...updatedColumn,
|
|
68
|
+
accessor: updatedColumn.id,
|
|
69
|
+
}, setSortColumn: setSortColumn, onSortChange: handleSortChange }) }), shouldRenderMagnifyingIcon && (_jsx(MagnifyingIcon, { ref: magnifyingIconRef, column: updatedColumn, setSearchColumn: handleMagnifyingSetSearchColumn, editingHeader: editingHeader, columnIndex: columnIndex, setEditingHeader: setEditingHeader, setHeaderValue: setHeaderValue, isActive: activeColumn === columnIndex, setActiveColumn: setActiveColumn, setActiveColumnFromSearch: setActiveColumnFromSearch, setSearchText: setSearchText, searchText: searchText, isSearchOpen: editingHeader !== null }))] })));
|
|
70
|
+
})))) }));
|
|
71
|
+
};
|
|
72
|
+
export default PrimaryTableHeader;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// src/components/PrimaryTableHeader.stories.tsx
|
|
3
|
+
import React, { useRef, useState } from "react";
|
|
4
|
+
import { useTable } from "react-table";
|
|
5
|
+
import PrimaryTableHeader from "./PrimaryTableHeader";
|
|
6
|
+
const MockPortal = ({ children, onClose }) => {
|
|
7
|
+
return (_jsx("div", { onClick: () => {
|
|
8
|
+
onClose?.();
|
|
9
|
+
}, className: "z-10", style: {
|
|
10
|
+
position: "fixed",
|
|
11
|
+
top: 0,
|
|
12
|
+
left: 0,
|
|
13
|
+
width: "100%",
|
|
14
|
+
height: "100%",
|
|
15
|
+
background: "rgba(0,0,0,0.5)",
|
|
16
|
+
}, children: children }));
|
|
17
|
+
};
|
|
18
|
+
export default {
|
|
19
|
+
title: "Table/PrimaryTableHeader",
|
|
20
|
+
component: PrimaryTableHeader,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Template for PrimaryTableHeader component.
|
|
24
|
+
*/
|
|
25
|
+
const Template = (args) => {
|
|
26
|
+
const containerRef = useRef(null);
|
|
27
|
+
const magnifyingIconRef = useRef(null);
|
|
28
|
+
const [editingHeader, setEditingHeader] = useState(null);
|
|
29
|
+
const [searchText, setSearchText] = useState("");
|
|
30
|
+
/** 1) Three columns now: "Name", "Age", "City" */
|
|
31
|
+
const columns = React.useMemo(() => [
|
|
32
|
+
{
|
|
33
|
+
Header: "Name",
|
|
34
|
+
accessor: "name",
|
|
35
|
+
id: "name",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
Header: "Age",
|
|
39
|
+
accessor: "age",
|
|
40
|
+
id: "age",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
Header: "City",
|
|
44
|
+
accessor: "city",
|
|
45
|
+
id: "city",
|
|
46
|
+
},
|
|
47
|
+
], []);
|
|
48
|
+
/** 2) Sample data with 3 properties */
|
|
49
|
+
const data = React.useMemo(() => [
|
|
50
|
+
{ name: "John Doe", age: 30, city: "New York" },
|
|
51
|
+
{ name: "Jane Smith", age: 25, city: "Los Angeles" },
|
|
52
|
+
], []);
|
|
53
|
+
/** 3) Generate headerGroups via react-table */
|
|
54
|
+
const { headerGroups: tableHeaderGroups } = useTable({
|
|
55
|
+
columns,
|
|
56
|
+
data,
|
|
57
|
+
});
|
|
58
|
+
/** 4) ColumnMappings for each: name, age, city */
|
|
59
|
+
const columnMappings = React.useMemo(() => [
|
|
60
|
+
{ slug: "name", index: 0, name: "Name" },
|
|
61
|
+
{ slug: "age", index: 1, name: "Age" },
|
|
62
|
+
{ slug: "city", index: 2, name: "City" },
|
|
63
|
+
], []);
|
|
64
|
+
/** Sort with direction (two-arg) */
|
|
65
|
+
const handleSortColumnWithDirection = (columnId, direction) => {
|
|
66
|
+
console.log(`Sort column: ${columnId}, direction: ${direction}`);
|
|
67
|
+
};
|
|
68
|
+
/** Single-arg function for setSortColumn */
|
|
69
|
+
const handleSortColumnSingleArg = (col) => {
|
|
70
|
+
handleSortColumnWithDirection(col, "asc");
|
|
71
|
+
};
|
|
72
|
+
const handleSearchColumn = (columnSlug) => {
|
|
73
|
+
console.log("Search column:", columnSlug);
|
|
74
|
+
};
|
|
75
|
+
/** Other event handlers */
|
|
76
|
+
const handleHeaderValue = (value) => {
|
|
77
|
+
console.log("Set header value:", value);
|
|
78
|
+
};
|
|
79
|
+
const handleResetSearch = (reset) => {
|
|
80
|
+
console.log("Reset search:", reset);
|
|
81
|
+
};
|
|
82
|
+
const handleSubmittedSearchText = (text) => {
|
|
83
|
+
console.log("Submitted Search Text:", text);
|
|
84
|
+
};
|
|
85
|
+
const handleClearSearch = (clear) => {
|
|
86
|
+
console.log("Clear Search:", clear);
|
|
87
|
+
};
|
|
88
|
+
return (_jsxs("table", { children: [_jsx(PrimaryTableHeader, { ...args, headerGroups: tableHeaderGroups, editingHeader: editingHeader, setEditingHeader: setEditingHeader, searchText: searchText, setSearchText: setSearchText, setSubmittedSearchText: handleSubmittedSearchText, setSortColumn: handleSortColumnSingleArg, setHeaderValue: handleHeaderValue, setResetSearch: handleResetSearch, columnMappings: columnMappings, setSearchColumn: handleSearchColumn, isNested: false, parentIndex: 0, onHeaderSortClick: handleSortColumnWithDirection, containerRef: containerRef, magnifyingIconRef: magnifyingIconRef, PortalComponent: _jsx(MockPortal, { onClose: () => {
|
|
89
|
+
console.log("Overlay clicked -> closing");
|
|
90
|
+
setEditingHeader(null);
|
|
91
|
+
} }), setClearSearch: handleClearSearch, slug: "primary-table-header" }), _jsxs("tbody", { children: [_jsxs("tr", { children: [_jsx("td", { children: "John Doe" }), _jsx("td", { children: "30" }), _jsx("td", { children: "New York" })] }), _jsxs("tr", { children: [_jsx("td", { children: "Jane Smith" }), _jsx("td", { children: "25" }), _jsx("td", { children: "Los Angeles" })] })] })] }));
|
|
92
|
+
};
|
|
93
|
+
export const Default = Template.bind({});
|
|
94
|
+
Default.args = {
|
|
95
|
+
searchText: "",
|
|
96
|
+
isNested: false,
|
|
97
|
+
parentIndex: 0,
|
|
98
|
+
slug: "primary-table-header",
|
|
99
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
3
|
+
import { render, screen, fireEvent } from "@testing-library/react";
|
|
4
|
+
import PrimaryTableHeader from "./PrimaryTableHeader";
|
|
5
|
+
describe("PrimaryTableHeader", () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
vi.clearAllMocks();
|
|
8
|
+
});
|
|
9
|
+
const nameColumn = {
|
|
10
|
+
Header: "Name",
|
|
11
|
+
accessor: "name",
|
|
12
|
+
id: "name",
|
|
13
|
+
getHeaderProps: () => ({ className: "header-props-name" }),
|
|
14
|
+
render: (type) => type === "Header" ? _jsx(_Fragment, { children: "Name" }) : _jsx(_Fragment, { children: "Unknown" }),
|
|
15
|
+
};
|
|
16
|
+
const ageColumn = {
|
|
17
|
+
Header: "Age",
|
|
18
|
+
accessor: "age",
|
|
19
|
+
id: "age",
|
|
20
|
+
getHeaderProps: () => ({ className: "header-props-age" }),
|
|
21
|
+
render: (type) => (type === "Header" ? _jsx(_Fragment, { children: "Age" }) : _jsx(_Fragment, { children: "Unknown" })),
|
|
22
|
+
};
|
|
23
|
+
const mockHeaderGroups = [
|
|
24
|
+
{
|
|
25
|
+
headers: [nameColumn, ageColumn],
|
|
26
|
+
getHeaderGroupProps: () => ({ className: "header-group-props" }),
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
function renderComponent(overrideProps = {}) {
|
|
30
|
+
const defaultProps = {
|
|
31
|
+
headerGroups: mockHeaderGroups,
|
|
32
|
+
editingHeader: null,
|
|
33
|
+
searchText: "",
|
|
34
|
+
setSearchText: vi.fn(),
|
|
35
|
+
setSubmittedSearchText: vi.fn(),
|
|
36
|
+
setSortColumn: vi.fn(),
|
|
37
|
+
setEditingHeader: vi.fn(),
|
|
38
|
+
setHeaderValue: vi.fn(),
|
|
39
|
+
setResetSearch: vi.fn(),
|
|
40
|
+
setClearSearch: vi.fn(),
|
|
41
|
+
columnMappings: [
|
|
42
|
+
{ slug: "name", index: 0, name: "Name" },
|
|
43
|
+
{ slug: "age", index: 1, name: "Age" },
|
|
44
|
+
],
|
|
45
|
+
setSearchColumn: vi.fn(),
|
|
46
|
+
isNested: false,
|
|
47
|
+
parentIndex: 0,
|
|
48
|
+
onHeaderSortClick: vi.fn(),
|
|
49
|
+
PortalComponent: null,
|
|
50
|
+
containerRef: null,
|
|
51
|
+
magnifyingIconRef: null,
|
|
52
|
+
slug: "test-header",
|
|
53
|
+
...overrideProps,
|
|
54
|
+
};
|
|
55
|
+
return render(_jsx("table", { children: _jsx(PrimaryTableHeader, { ...defaultProps }) }));
|
|
56
|
+
}
|
|
57
|
+
it("1) Renders the header text", () => {
|
|
58
|
+
renderComponent();
|
|
59
|
+
expect(screen.getByText("Name")).toBeInTheDocument();
|
|
60
|
+
expect(screen.getByText("Age")).toBeInTheDocument();
|
|
61
|
+
});
|
|
62
|
+
it("2) Renders a search input when editingHeader is set", () => {
|
|
63
|
+
renderComponent({ editingHeader: 0 });
|
|
64
|
+
const textboxes = screen.getAllByRole("textbox");
|
|
65
|
+
expect(textboxes.length).toBeGreaterThan(0);
|
|
66
|
+
});
|
|
67
|
+
it("3) Does not render a search input when editingHeader is null", () => {
|
|
68
|
+
renderComponent({ editingHeader: null });
|
|
69
|
+
expect(screen.queryAllByRole("textbox")).toHaveLength(0);
|
|
70
|
+
});
|
|
71
|
+
it("4) Shows only 1 magnifying icon if code excludes the last column", () => {
|
|
72
|
+
renderComponent();
|
|
73
|
+
const icons = screen.queryAllByTestId("magnifying-icon-test-id");
|
|
74
|
+
expect(icons.length).toBe(1);
|
|
75
|
+
});
|
|
76
|
+
it("5) Sort ascending: opens SortArrows -> click Ascending -> calls setSortColumn function + onHeaderSortClick", () => {
|
|
77
|
+
const mockSetSortColumn = vi.fn();
|
|
78
|
+
const mockOnHeaderSortClick = vi.fn();
|
|
79
|
+
renderComponent({
|
|
80
|
+
setSortColumn: mockSetSortColumn,
|
|
81
|
+
onHeaderSortClick: mockOnHeaderSortClick,
|
|
82
|
+
columnMappings: [
|
|
83
|
+
{ slug: "name", index: 0, name: "Name" },
|
|
84
|
+
{ slug: "age", index: 1, name: "Age" },
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
fireEvent.click(screen.getByTestId("sort-arrows-name"));
|
|
88
|
+
fireEvent.click(screen.getByText("Ascending"));
|
|
89
|
+
expect(mockSetSortColumn).toHaveBeenCalledTimes(1);
|
|
90
|
+
const updateFn = mockSetSortColumn.mock.calls[0][0];
|
|
91
|
+
expect(typeof updateFn).toBe("function");
|
|
92
|
+
const prevState = {};
|
|
93
|
+
const newState = updateFn(prevState);
|
|
94
|
+
expect(newState).toEqual({
|
|
95
|
+
...prevState,
|
|
96
|
+
name: ["name"],
|
|
97
|
+
});
|
|
98
|
+
expect(mockOnHeaderSortClick).toHaveBeenCalledWith("name", "asc");
|
|
99
|
+
});
|
|
100
|
+
it("Sort descending: opens SortArrows -> click Descending -> calls setSortColumn + onHeaderSortClick", () => {
|
|
101
|
+
const mockSetSortColumn = vi.fn();
|
|
102
|
+
const mockOnHeaderSortClick = vi.fn();
|
|
103
|
+
renderComponent({
|
|
104
|
+
setSortColumn: mockSetSortColumn,
|
|
105
|
+
onHeaderSortClick: mockOnHeaderSortClick,
|
|
106
|
+
columnMappings: [
|
|
107
|
+
{ slug: "name", index: 0, name: "Name" },
|
|
108
|
+
{ slug: "age", index: 1, name: "Age" },
|
|
109
|
+
],
|
|
110
|
+
});
|
|
111
|
+
fireEvent.click(screen.getByTestId("sort-arrows-name"));
|
|
112
|
+
fireEvent.click(screen.getByText("Descending"));
|
|
113
|
+
expect(mockSetSortColumn).toHaveBeenCalledTimes(1);
|
|
114
|
+
const updateFn = mockSetSortColumn.mock.calls[0][0];
|
|
115
|
+
expect(typeof updateFn).toBe("function");
|
|
116
|
+
const prevState = {};
|
|
117
|
+
const newState = updateFn(prevState);
|
|
118
|
+
expect(newState).toEqual({
|
|
119
|
+
...prevState,
|
|
120
|
+
name: ["-name"],
|
|
121
|
+
});
|
|
122
|
+
expect(mockOnHeaderSortClick).toHaveBeenCalledWith("name", "desc");
|
|
123
|
+
});
|
|
124
|
+
});
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Dispatch, SetStateAction } from "react";
|
|
2
|
+
import { HeaderGroup } from "react-table";
|
|
3
|
+
export interface ColumnMapping<T extends object> {
|
|
4
|
+
name: string;
|
|
5
|
+
slug: keyof T;
|
|
6
|
+
index?: number;
|
|
7
|
+
settings?: {
|
|
8
|
+
field: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface PrimaryTableHeaderProps<T extends object> {
|
|
12
|
+
headerGroups: HeaderGroup<T>[];
|
|
13
|
+
editingHeader: number | null;
|
|
14
|
+
searchText: string;
|
|
15
|
+
setSearchText: (text: string) => void;
|
|
16
|
+
setSubmittedSearchText: Dispatch<SetStateAction<string>>;
|
|
17
|
+
setSortColumn: (column: string) => void;
|
|
18
|
+
setSearchColumn: (column: string) => void;
|
|
19
|
+
setEditingHeader: (headerIndex: number | null) => void;
|
|
20
|
+
setHeaderValue: (headerValue: string) => void;
|
|
21
|
+
setResetSearch: Dispatch<SetStateAction<boolean>>;
|
|
22
|
+
showSlideMenu?: boolean;
|
|
23
|
+
columnMappings: ColumnMapping<T>[];
|
|
24
|
+
setClearSearch: Dispatch<SetStateAction<boolean>>;
|
|
25
|
+
hasBorder?: boolean;
|
|
26
|
+
showHeaderOptions?: boolean;
|
|
27
|
+
slug: string;
|
|
28
|
+
isNested?: boolean;
|
|
29
|
+
parentIndex?: number;
|
|
30
|
+
searchResultsPillColor?: string;
|
|
31
|
+
onHeaderSortClick: (columnId: keyof T, direction: string) => void;
|
|
32
|
+
PortalComponent?: React.ReactNode;
|
|
33
|
+
containerRef?: React.RefObject<HTMLDivElement>;
|
|
34
|
+
magnifyingIconRef?: React.RefObject<HTMLDivElement>;
|
|
35
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import React from "react";
|
|
2
1
|
import { SearchInputProps } from "./SearchInput.types";
|
|
3
|
-
declare const SearchInput:
|
|
2
|
+
declare const SearchInput: <T extends object>({ closeOutSearch, setResetSearch, setEditingHeader, pillColor, textHighlight, column, inputType, dropdownIconProp, dropdownOptions, selectedDropdownOption, onDropdownOptionSelect, searchItems, setSearchItems, toggleStatus, setToggleStatus, minValue, setMinValue, maxValue, setMaxValue, control, valueKey, dynamicDefaultValue, }: SearchInputProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
4
3
|
export default SearchInput;
|
|
@@ -1,17 +1,67 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import SearchTextInput from "./SearchTextInput";
|
|
4
|
+
import SearchNumberInput from "./SearchNumberInput";
|
|
5
|
+
import { Controller } from "react-hook-form";
|
|
6
|
+
// A simple helper function for default values
|
|
7
|
+
function getDefaultValue(dynamicDefaultValue, valueKey) {
|
|
8
|
+
if (typeof dynamicDefaultValue !== "undefined") {
|
|
9
|
+
return dynamicDefaultValue;
|
|
10
|
+
}
|
|
11
|
+
return "";
|
|
12
|
+
}
|
|
13
|
+
const SearchInput = ({ closeOutSearch, setResetSearch, setEditingHeader, pillColor = "bg-sky-500", textHighlight = "text-sky-500", column, inputType = "text", dropdownIconProp = {
|
|
14
|
+
name: "chevronDown",
|
|
15
|
+
weight: "bold",
|
|
16
|
+
iconClasses: "text-black",
|
|
17
|
+
}, dropdownOptions = [], selectedDropdownOption = "", onDropdownOptionSelect, searchItems = [], setSearchItems, toggleStatus = false, setToggleStatus, minValue, setMinValue, maxValue, setMaxValue, control, valueKey, dynamicDefaultValue, }) => {
|
|
18
|
+
const containerRef = useRef(null);
|
|
19
|
+
const [localSearchText, setLocalSearchText] = useState("");
|
|
20
|
+
const inputRef = useRef(null);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
inputRef.current?.focus();
|
|
23
|
+
}, []);
|
|
24
|
+
const handleInputChange = (event) => {
|
|
25
|
+
setLocalSearchText(event.target.value);
|
|
8
26
|
};
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
27
|
+
const handleSubmitClick = () => {
|
|
28
|
+
const trimmedSearchText = localSearchText.trim();
|
|
29
|
+
let safeHeader;
|
|
30
|
+
if (typeof column.Header === "string") {
|
|
31
|
+
safeHeader = column.Header;
|
|
13
32
|
}
|
|
33
|
+
else {
|
|
34
|
+
safeHeader = column.accessor || "Unnamed Column";
|
|
35
|
+
}
|
|
36
|
+
if (trimmedSearchText === "") {
|
|
37
|
+
// Remove criterion if text is empty
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Update or add criterion
|
|
41
|
+
}
|
|
42
|
+
setEditingHeader(null);
|
|
14
43
|
};
|
|
15
|
-
return (_jsx("div", {
|
|
44
|
+
return (_jsx("div", { ref: containerRef, className: "", children: (() => {
|
|
45
|
+
switch (inputType) {
|
|
46
|
+
case "text":
|
|
47
|
+
return (_jsx(SearchTextInput, { closeOutSearch: () => { }, setResetSearch: () => { }, setEditingHeader: () => { }, column: undefined, dropdownIconProp: dropdownIconProp, dropdownOptions: dropdownOptions, selectedDropdownOption: selectedDropdownOption, onDropdownOptionSelect: onDropdownOptionSelect, searchItems: searchItems, setSearchItems: setSearchItems }));
|
|
48
|
+
case "number":
|
|
49
|
+
return (_jsx(SearchNumberInput, { closeOutSearch: () => { }, setResetSearch: () => { }, setEditingHeader: () => { }, column: undefined, dropdownIconProp: dropdownIconProp, dropdownOptions: dropdownOptions, selectedDropdownOption: selectedDropdownOption, onDropdownOptionSelect: onDropdownOptionSelect, toggleStatus: toggleStatus, setToggleStatus: setToggleStatus, minValue: minValue, maxValue: maxValue, setMinValue: setMinValue, setMaxValue: setMaxValue }));
|
|
50
|
+
case "multiSelect":
|
|
51
|
+
case "boolean":
|
|
52
|
+
case "date":
|
|
53
|
+
// Make sure control & valueKey exist before using them
|
|
54
|
+
if (!control || !valueKey) {
|
|
55
|
+
return (_jsxs("div", { className: "text-red-500", children: ["Missing ", _jsx("code", { children: "control" }), " or", " ", _jsx("code", { children: "valueKey" }), " prop for React Hook Form"] }));
|
|
56
|
+
}
|
|
57
|
+
return (_jsx(Controller, { name: valueKey, control: control, defaultValue: getDefaultValue(dynamicDefaultValue, valueKey), render: ({ field }) => (_jsx("div", { className: "inline-flex items-center", children: _jsxs("label", { className: "flex items-center cursor-pointer relative", children: [_jsx("input", { type: "checkbox", className: "peer h-5 w-5 cursor-pointer transition-all appearance-none rounded border border-stroke", id: valueKey, checked: !!field.value, onChange: (e) => {
|
|
58
|
+
// You can log the value here:
|
|
59
|
+
console.log("Checkbox changed to:", e.target.checked);
|
|
60
|
+
field.onChange(e.target.checked);
|
|
61
|
+
} }), _jsx("span", { className: "absolute text-white opacity-0 peer-checked:opacity-100 top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-3.5 w-3.5", viewBox: "0 0 20 20", fill: "currentColor", stroke: "currentColor", strokeWidth: "1", children: _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) })] }) })) }));
|
|
62
|
+
default:
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
})() }));
|
|
16
66
|
};
|
|
17
67
|
export default SearchInput;
|
|
@@ -2,8 +2,6 @@ import { Meta } from "@storybook/react";
|
|
|
2
2
|
declare const _default: Meta;
|
|
3
3
|
export default _default;
|
|
4
4
|
export declare const Default: any;
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const WithoutButton: any;
|
|
8
|
-
export declare const CustomizedButton: any;
|
|
5
|
+
export declare const TextInput: any;
|
|
6
|
+
export declare const NumberInput: any;
|
|
9
7
|
export declare const DisabledInput: any;
|