@seeqdev/qomponents 0.0.108 → 0.0.109
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/Accordion/Accordion.js +8 -8
- package/dist/Accordion/Accordion.stories.js +114 -114
- package/dist/Accordion/Accordion.test.js +54 -54
- package/dist/Accordion/Accordion.types.js +1 -1
- package/dist/Accordion/index.js +1 -1
- package/dist/Alert/Alert.js +31 -31
- package/dist/Alert/Alert.stories.js +44 -44
- package/dist/Alert/Alert.test.js +50 -50
- package/dist/Alert/Alert.types.js +1 -1
- package/dist/Alert/index.js +1 -1
- package/dist/Button/Button.js +91 -91
- package/dist/Button/Button.stories.js +97 -97
- package/dist/Button/Button.test.js +48 -48
- package/dist/Button/Button.types.js +4 -4
- package/dist/Button/index.js +1 -1
- package/dist/ButtonWithDropdown/ButtonWithDropdown.js +66 -66
- package/dist/ButtonWithDropdown/ButtonWithDropdown.stories.js +97 -97
- package/dist/ButtonWithDropdown/ButtonWithDropdown.test.js +84 -84
- package/dist/ButtonWithDropdown/ButtonWithDropdown.types.js +1 -1
- package/dist/ButtonWithDropdown/index.js +1 -1
- package/dist/ButtonWithPopover/ButtonWithPopover.js +50 -50
- package/dist/ButtonWithPopover/ButtonWithPopover.stories.js +74 -74
- package/dist/ButtonWithPopover/ButtonWithPopover.test.js +81 -81
- package/dist/ButtonWithPopover/ButtonWithPopover.types.js +1 -1
- package/dist/ButtonWithPopover/index.js +1 -1
- package/dist/Checkbox/Checkbox.js +25 -25
- package/dist/Checkbox/Checkbox.stories.js +33 -33
- package/dist/Checkbox/Checkbox.test.js +93 -93
- package/dist/Checkbox/Checkbox.types.js +1 -1
- package/dist/Checkbox/index.js +1 -1
- package/dist/Icon/Icon.js +53 -53
- package/dist/Icon/Icon.stories.js +44 -44
- package/dist/Icon/Icon.test.js +54 -54
- package/dist/Icon/Icon.types.js +15 -15
- package/dist/Icon/index.js +1 -1
- package/dist/InputGroup/InputGroup.js +25 -25
- package/dist/InputGroup/InputGroup.stories.js +141 -141
- package/dist/InputGroup/InputGroup.test.js +42 -42
- package/dist/InputGroup/InputGroup.types.js +1 -1
- package/dist/InputGroup/index.js +1 -1
- package/dist/Modal/Modal.js +97 -97
- package/dist/Modal/Modal.stories.js +126 -126
- package/dist/Modal/Modal.test.js +107 -107
- package/dist/Modal/Modal.types.js +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/SeeqActionDropdown/SeeqActionDropdown.js +47 -47
- package/dist/SeeqActionDropdown/SeeqActionDropdown.stories.js +79 -79
- package/dist/SeeqActionDropdown/SeeqActionDropdown.test.js +72 -72
- package/dist/SeeqActionDropdown/SeeqActionDropdown.types.js +1 -1
- package/dist/SeeqActionDropdown/index.js +1 -1
- package/dist/SeeqActionDropdown/variants.js +22 -22
- package/dist/Select/Select.js +173 -173
- package/dist/Select/Select.stories.js +79 -79
- package/dist/Select/Select.test.js +181 -181
- package/dist/Select/Select.types.js +1 -1
- package/dist/Select/index.js +2 -2
- package/dist/Tabs/Tabs.js +21 -21
- package/dist/Tabs/Tabs.stories.js +90 -90
- package/dist/Tabs/Tabs.test.js +90 -90
- package/dist/Tabs/Tabs.types.js +1 -1
- package/dist/Tabs/index.js +1 -1
- package/dist/TextArea/TextArea.js +24 -24
- package/dist/TextArea/TextArea.stories.js +45 -45
- package/dist/TextArea/TextArea.test.js +67 -67
- package/dist/TextArea/TextArea.types.js +1 -1
- package/dist/TextArea/index.js +1 -1
- package/dist/TextField/TextField.js +78 -78
- package/dist/TextField/TextField.stories.js +69 -69
- package/dist/TextField/TextField.test.js +38 -38
- package/dist/TextField/TextField.types.js +1 -1
- package/dist/TextField/index.js +1 -1
- package/dist/ToolbarButton/ToolbarButton.js +74 -74
- package/dist/ToolbarButton/ToolbarButton.stories.js +93 -93
- package/dist/ToolbarButton/ToolbarButton.test.js +92 -92
- package/dist/ToolbarButton/ToolbarButton.types.js +1 -1
- package/dist/ToolbarButton/index.js +1 -1
- package/dist/Tooltip/QTip.stories.js +44 -44
- package/dist/Tooltip/QTip.types.js +1 -1
- package/dist/Tooltip/QTipPerformance.stories.js +29 -29
- package/dist/Tooltip/Qtip.js +154 -154
- package/dist/Tooltip/Tooltip.js +30 -30
- package/dist/Tooltip/Tooltip.stories.js +31 -31
- package/dist/Tooltip/Tooltip.types.js +2 -2
- package/dist/Tooltip/TooltipPerformance.stories.js +29 -29
- package/dist/Tooltip/index.js +2 -2
- package/dist/Tooltip/qTip.utilities.js +10 -10
- package/dist/index.esm.js +30 -17
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +30 -17
- package/dist/index.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/utils/browserId.js +28 -28
- package/dist/utils/svg.js +19 -19
- package/dist/utils/validateStyleDimension.js +13 -13
- package/dist/utils/validateStyleDimension.test.js +19 -19
- package/package.json +1 -1
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
3
|
-
import Icon from '../Icon';
|
|
4
|
-
import { getQTipData } from '../Tooltip/qTip.utilities';
|
|
5
|
-
const borderStyles = [
|
|
6
|
-
'tw-border-solid',
|
|
7
|
-
'tw-border',
|
|
8
|
-
'tw-rounded-sm',
|
|
9
|
-
'tw-border-sq-disabled-gray',
|
|
10
|
-
'dark:tw-border-gray-500',
|
|
11
|
-
].join(' ');
|
|
12
|
-
const bgStyles = ['tw-bg-sq-white', 'dark:tw-bg-sq-dark-background'].join(' ');
|
|
13
|
-
const disabledClasses = ['tw-opacity-50', 'tw-cursor-not-allowed'].join(' ');
|
|
14
|
-
const ButtonWithDropdown = ({ dropdownItems, triggerIcon, id, extraClassNames, containerTestId, disabled = false, align = 'end', placement = 'bottom', placementOffset = 5, alignOffset = -35, hasArrow = false, onOpenChange, isOpen, setFocusOnTriggerOnClose = true, keepFocusInsideDropdown = true, onContainerClick, ...tooltipProps }) => {
|
|
15
|
-
const tooltipData = getQTipData(tooltipProps);
|
|
16
|
-
return (React.createElement(DropdownMenu.Root, { defaultOpen: false, open: isOpen, onOpenChange: onOpenChange, modal: keepFocusInsideDropdown },
|
|
17
|
-
React.createElement(DropdownMenu.Trigger, { id: id, className: `tw-border-none focus-visible:tw-outline-none focus:tw-outline-none focus-within:tw-outline-none`, disabled: disabled },
|
|
18
|
-
React.createElement("div", { ...tooltipData, className: `tw-bg-transparent tw-flex tw-flex-col tw-items-center focus-visible:tw-outline-none focus:tw-outline-none focus-within:tw-outline-none ${disabled ? disabledClasses : ''} ${extraClassNames || ''}` }, triggerIcon)),
|
|
19
|
-
React.createElement(DropdownMenu.Portal, null,
|
|
20
|
-
React.createElement(DropdownMenu.Content, { onClick: onContainerClick, sideOffset: placementOffset, side: placement, align: align, alignOffset: alignOffset, asChild: true, onCloseAutoFocus: (e) => !setFocusOnTriggerOnClose && e.preventDefault(), className: "focus-visible:tw-outline-none tw-outline-none" },
|
|
21
|
-
React.createElement("div", { "data-testid": containerTestId, className: bgStyles +
|
|
22
|
-
' tw-relative tw-z-[1200] tw-min-w-6 tw-py-2 focus-visible:tw-outline-none tw-outline-none' +
|
|
23
|
-
' data-[state=open]:tw-animate-in data-[state=closed]:tw-animate-out' +
|
|
24
|
-
' forceFont data-[side=top]:tw-animate-slideDownAndFade data-[side=right]:tw-animate-slideLeftAndFade data-[side=bottom]:tw-animate-slideUpAndFade data-[side=left]:tw-animate-slideRightAndFade ' +
|
|
25
|
-
borderStyles },
|
|
26
|
-
hasArrow && (React.createElement(DropdownMenu.Arrow, { asChild: true },
|
|
27
|
-
React.createElement("div", { className: " tw-fill-transparent tw-bg-white tw-w-[15px] tw-h-[15px] tw-rotate-45 dark:tw-bg-sq-dark-background tw-border-b tw-border-r tw-border-sq-disabled-gray dark:tw-border-gray-500 tw-mt-[-7px]" }))),
|
|
28
|
-
dropdownItems.map((item, index) => {
|
|
29
|
-
const tooltipData = getQTipData(item);
|
|
30
|
-
if (item.isLabel) {
|
|
31
|
-
return (React.createElement(DropdownMenu.Label, { key: (item.label || '') + index, className: item.containerExtraClassNames, ...tooltipData },
|
|
32
|
-
item.icon && (React.createElement(Icon, { icon: item.icon, testId: item.iconTestId, type: "text", color: item.iconColor, extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" })),
|
|
33
|
-
React.createElement("div", { "data-testid": item.labelTestId, className: `tw-text-[13px] tw-ml-1 ${item.disabled ? 'tw-text-sq-disabled-gray' : 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-not-italic tw-font-normal ${item.labelClasses}` }, item.label)));
|
|
34
|
-
}
|
|
35
|
-
if (Array.isArray(item.subMenuItems) && item.subMenuItems.length > 0) {
|
|
36
|
-
return (React.createElement(DropdownMenu.Sub, { key: item.label + index },
|
|
37
|
-
React.createElement(DropdownMenu.SubTrigger, { id: id, className: `tw-cursor-pointer tw-flex tw-justify-between dark:tw-text-sq-white hover:tw-bg-sq-gray-highlight dark:hover:tw-bg-sq-gray-highlight-dark tw-leading-none tw-items-center tw-h-[27px] tw-pl-[19px] tw-relative tw-select-none tw-outline-none data-[disabled]:tw-pointer-events-none ${item.containerExtraClassNames || ''}`, "data-testid": item.testId, disabled: item.disabled, ...tooltipData },
|
|
38
|
-
React.createElement("div", { className: "tw-flex" },
|
|
39
|
-
item.icon && (React.createElement(Icon, { icon: item.icon, extraClassNames: `tw-w-[18px] ${item.disabled
|
|
40
|
-
? '!tw-text-sq-disabled-gray'
|
|
41
|
-
: 'tw-text-sq-text-color dark:tw-text-sq-white'} ${item.iconExtraClassNames || ''}` })),
|
|
42
|
-
React.createElement("div", { "data-testid": item.labelTestId, "data-customid": item.labelCustomId, className: `tw-text-[13px] tw-ml-1 ${item.disabled && '!tw-opacity-30'} tw-not-italic tw-font-semibold ${item.labelClasses}` }, item.label)),
|
|
43
|
-
React.createElement(Icon, { small: true, icon: "fc-arrow-dropdown -tw-rotate-90", extraClassNames: `${item.disabled ? 'tw-text-sq-disabled-gray' : 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-w-[18px] tw-ml-4 tw-text-[8px] tw-justify-center tw-flex` })),
|
|
44
|
-
React.createElement(DropdownMenu.Portal, null,
|
|
45
|
-
React.createElement(DropdownMenu.SubContent, { className: "focus-visible:tw-outline-none tw-outline-none" },
|
|
46
|
-
React.createElement("div", { "data-testid": containerTestId, className: bgStyles +
|
|
47
|
-
' tw-relative tw-z-[1000] tw-min-w-6 tw-py-2 focus-visible:tw-outline-none tw-outline-none data-[state=open]:tw-animate-in data-[state=closed]:tw-animate-out' +
|
|
48
|
-
' forceFont data-[side=top]:tw-animate-slideDownAndFade data-[side=right]:tw-animate-slideLeftAndFade data-[side=bottom]:tw-animate-slideUpAndFade data-[side=left]:tw-animate-slideRightAndFade ' +
|
|
49
|
-
borderStyles }, item.subMenuItems.map((subItem, subIndex) => {
|
|
50
|
-
return (React.createElement(DropdownMenu.Item, { key: subItem.label + subIndex, onSelect: subItem.onClick, "data-qtip-text": subItem.tooltip, className: "tw-cursor-pointer tw-flex dark:tw-text-sq-white hover:tw-bg-sq-gray-highlight dark:hover:tw-bg-sq-gray-highlight-dark tw-leading-none tw-items-center tw-h-[27px] tw-px-[19px] tw-relative tw-select-none tw-outline-none data-[disabled]:tw-pointer-events-none", disabled: subItem.disabled },
|
|
51
|
-
subItem.iconClass && (React.createElement(Icon, { icon: subItem.iconClass, extraClassNames: `tw-w-[18px] ${item.disabled && '!tw-opacity-30'}` })),
|
|
52
|
-
React.createElement("div", { className: `tw-text-[13px] tw-ml-1 ${subItem.disabled
|
|
53
|
-
? 'tw-text-sq-disabled-gray'
|
|
54
|
-
: 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-not-italic tw-font-normal ${item.labelClasses}` }, subItem.label)));
|
|
55
|
-
}))))));
|
|
56
|
-
}
|
|
57
|
-
return (React.createElement("div", { key: item.label + index, ...tooltipData },
|
|
58
|
-
React.createElement(DropdownMenu.Item, { key: item.label + index, "data-customid": item.itemCustomId, onSelect: (e) => {
|
|
59
|
-
item.onClick(e);
|
|
60
|
-
}, className: `tw-cursor-pointer tw-flex dark:tw-text-sq-white hover:tw-bg-sq-gray-highlight dark:hover:tw-bg-sq-gray-highlight-dark tw-leading-none tw-items-center tw-h-[27px] tw-px-[19px] tw-relative tw-select-none tw-outline-none data-[disabled]:tw-pointer-events-none ${item.containerExtraClassNames || ''}`, "data-testid": item.testId, disabled: item.disabled },
|
|
61
|
-
item.icon && (React.createElement(Icon, { icon: item.icon, testId: item.iconTestId, type: (item.iconType || 'text'), color: item.iconColor, customId: item.iconCustomId, extraClassNames: `tw-w-[18px] ${item.disabled && '!tw-opacity-30'} ${item.iconExtraClassNames || ''}` })),
|
|
62
|
-
React.createElement("div", { "data-testid": item.labelTestId, "data-customid": item.labelCustomId, className: `tw-text-[13px] tw-ml-1 ${item.disabled ? 'tw-text-sq-disabled-gray' : 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-not-italic tw-font-normal ${item.labelClasses || ''}` }, item.label)),
|
|
63
|
-
item.hasDivider && (React.createElement(DropdownMenu.Separator, { "data-testid": `dropdown-divider-${index}`, className: "tw-h-[1px] tw-bg-sq-disabled-gray dark:tw-bg-gray-500 tw-my-[8px]" }))));
|
|
64
|
-
}))))));
|
|
65
|
-
};
|
|
66
|
-
export default ButtonWithDropdown;
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
3
|
+
import Icon from '../Icon';
|
|
4
|
+
import { getQTipData } from '../Tooltip/qTip.utilities';
|
|
5
|
+
const borderStyles = [
|
|
6
|
+
'tw-border-solid',
|
|
7
|
+
'tw-border',
|
|
8
|
+
'tw-rounded-sm',
|
|
9
|
+
'tw-border-sq-disabled-gray',
|
|
10
|
+
'dark:tw-border-gray-500',
|
|
11
|
+
].join(' ');
|
|
12
|
+
const bgStyles = ['tw-bg-sq-white', 'dark:tw-bg-sq-dark-background'].join(' ');
|
|
13
|
+
const disabledClasses = ['tw-opacity-50', 'tw-cursor-not-allowed'].join(' ');
|
|
14
|
+
const ButtonWithDropdown = ({ dropdownItems, triggerIcon, id, extraClassNames, containerTestId, disabled = false, align = 'end', placement = 'bottom', placementOffset = 5, alignOffset = -35, hasArrow = false, onOpenChange, isOpen, setFocusOnTriggerOnClose = true, keepFocusInsideDropdown = true, onContainerClick, ...tooltipProps }) => {
|
|
15
|
+
const tooltipData = getQTipData(tooltipProps);
|
|
16
|
+
return (React.createElement(DropdownMenu.Root, { defaultOpen: false, open: isOpen, onOpenChange: onOpenChange, modal: keepFocusInsideDropdown },
|
|
17
|
+
React.createElement(DropdownMenu.Trigger, { id: id, className: `tw-border-none focus-visible:tw-outline-none focus:tw-outline-none focus-within:tw-outline-none`, disabled: disabled },
|
|
18
|
+
React.createElement("div", { ...tooltipData, className: `tw-bg-transparent tw-flex tw-flex-col tw-items-center focus-visible:tw-outline-none focus:tw-outline-none focus-within:tw-outline-none ${disabled ? disabledClasses : ''} ${extraClassNames || ''}` }, triggerIcon)),
|
|
19
|
+
React.createElement(DropdownMenu.Portal, null,
|
|
20
|
+
React.createElement(DropdownMenu.Content, { onClick: onContainerClick, sideOffset: placementOffset, side: placement, align: align, alignOffset: alignOffset, asChild: true, onCloseAutoFocus: (e) => !setFocusOnTriggerOnClose && e.preventDefault(), className: "focus-visible:tw-outline-none tw-outline-none" },
|
|
21
|
+
React.createElement("div", { "data-testid": containerTestId, className: bgStyles +
|
|
22
|
+
' tw-relative tw-z-[1200] tw-min-w-6 tw-py-2 focus-visible:tw-outline-none tw-outline-none' +
|
|
23
|
+
' data-[state=open]:tw-animate-in data-[state=closed]:tw-animate-out' +
|
|
24
|
+
' forceFont data-[side=top]:tw-animate-slideDownAndFade data-[side=right]:tw-animate-slideLeftAndFade data-[side=bottom]:tw-animate-slideUpAndFade data-[side=left]:tw-animate-slideRightAndFade ' +
|
|
25
|
+
borderStyles },
|
|
26
|
+
hasArrow && (React.createElement(DropdownMenu.Arrow, { asChild: true },
|
|
27
|
+
React.createElement("div", { className: " tw-fill-transparent tw-bg-white tw-w-[15px] tw-h-[15px] tw-rotate-45 dark:tw-bg-sq-dark-background tw-border-b tw-border-r tw-border-sq-disabled-gray dark:tw-border-gray-500 tw-mt-[-7px]" }))),
|
|
28
|
+
dropdownItems.map((item, index) => {
|
|
29
|
+
const tooltipData = getQTipData(item);
|
|
30
|
+
if (item.isLabel) {
|
|
31
|
+
return (React.createElement(DropdownMenu.Label, { key: (item.label || '') + index, className: item.containerExtraClassNames, ...tooltipData },
|
|
32
|
+
item.icon && (React.createElement(Icon, { icon: item.icon, testId: item.iconTestId, type: "text", color: item.iconColor, extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" })),
|
|
33
|
+
React.createElement("div", { "data-testid": item.labelTestId, className: `tw-text-[13px] tw-ml-1 ${item.disabled ? 'tw-text-sq-disabled-gray' : 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-not-italic tw-font-normal ${item.labelClasses}` }, item.label)));
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(item.subMenuItems) && item.subMenuItems.length > 0) {
|
|
36
|
+
return (React.createElement(DropdownMenu.Sub, { key: item.label + index },
|
|
37
|
+
React.createElement(DropdownMenu.SubTrigger, { id: id, className: `tw-cursor-pointer tw-flex tw-justify-between dark:tw-text-sq-white hover:tw-bg-sq-gray-highlight dark:hover:tw-bg-sq-gray-highlight-dark tw-leading-none tw-items-center tw-h-[27px] tw-pl-[19px] tw-relative tw-select-none tw-outline-none data-[disabled]:tw-pointer-events-none ${item.containerExtraClassNames || ''}`, "data-testid": item.testId, disabled: item.disabled, ...tooltipData },
|
|
38
|
+
React.createElement("div", { className: "tw-flex" },
|
|
39
|
+
item.icon && (React.createElement(Icon, { icon: item.icon, extraClassNames: `tw-w-[18px] ${item.disabled
|
|
40
|
+
? '!tw-text-sq-disabled-gray'
|
|
41
|
+
: 'tw-text-sq-text-color dark:tw-text-sq-white'} ${item.iconExtraClassNames || ''}` })),
|
|
42
|
+
React.createElement("div", { "data-testid": item.labelTestId, "data-customid": item.labelCustomId, className: `tw-text-[13px] tw-ml-1 ${item.disabled && '!tw-opacity-30'} tw-not-italic tw-font-semibold ${item.labelClasses}` }, item.label)),
|
|
43
|
+
React.createElement(Icon, { small: true, icon: "fc-arrow-dropdown -tw-rotate-90", extraClassNames: `${item.disabled ? 'tw-text-sq-disabled-gray' : 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-w-[18px] tw-ml-4 tw-text-[8px] tw-justify-center tw-flex` })),
|
|
44
|
+
React.createElement(DropdownMenu.Portal, null,
|
|
45
|
+
React.createElement(DropdownMenu.SubContent, { className: "focus-visible:tw-outline-none tw-outline-none" },
|
|
46
|
+
React.createElement("div", { "data-testid": containerTestId, className: bgStyles +
|
|
47
|
+
' tw-relative tw-z-[1000] tw-min-w-6 tw-py-2 focus-visible:tw-outline-none tw-outline-none data-[state=open]:tw-animate-in data-[state=closed]:tw-animate-out' +
|
|
48
|
+
' forceFont data-[side=top]:tw-animate-slideDownAndFade data-[side=right]:tw-animate-slideLeftAndFade data-[side=bottom]:tw-animate-slideUpAndFade data-[side=left]:tw-animate-slideRightAndFade ' +
|
|
49
|
+
borderStyles }, item.subMenuItems.map((subItem, subIndex) => {
|
|
50
|
+
return (React.createElement(DropdownMenu.Item, { key: subItem.label + subIndex, onSelect: subItem.onClick, "data-qtip-text": subItem.tooltip, className: "tw-cursor-pointer tw-flex dark:tw-text-sq-white hover:tw-bg-sq-gray-highlight dark:hover:tw-bg-sq-gray-highlight-dark tw-leading-none tw-items-center tw-h-[27px] tw-px-[19px] tw-relative tw-select-none tw-outline-none data-[disabled]:tw-pointer-events-none", disabled: subItem.disabled },
|
|
51
|
+
subItem.iconClass && (React.createElement(Icon, { icon: subItem.iconClass, extraClassNames: `tw-w-[18px] ${item.disabled && '!tw-opacity-30'}` })),
|
|
52
|
+
React.createElement("div", { className: `tw-text-[13px] tw-ml-1 ${subItem.disabled
|
|
53
|
+
? 'tw-text-sq-disabled-gray'
|
|
54
|
+
: 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-not-italic tw-font-normal ${item.labelClasses}` }, subItem.label)));
|
|
55
|
+
}))))));
|
|
56
|
+
}
|
|
57
|
+
return (React.createElement("div", { key: item.label + index, ...tooltipData },
|
|
58
|
+
React.createElement(DropdownMenu.Item, { key: item.label + index, "data-customid": item.itemCustomId, onSelect: (e) => {
|
|
59
|
+
item.onClick(e);
|
|
60
|
+
}, className: `tw-cursor-pointer tw-flex dark:tw-text-sq-white hover:tw-bg-sq-gray-highlight dark:hover:tw-bg-sq-gray-highlight-dark tw-leading-none tw-items-center tw-h-[27px] tw-px-[19px] tw-relative tw-select-none tw-outline-none data-[disabled]:tw-pointer-events-none ${item.containerExtraClassNames || ''}`, "data-testid": item.testId, disabled: item.disabled },
|
|
61
|
+
item.icon && (React.createElement(Icon, { icon: item.icon, testId: item.iconTestId, type: (item.iconType || 'text'), color: item.iconColor, customId: item.iconCustomId, extraClassNames: `tw-w-[18px] ${item.disabled && '!tw-opacity-30'} ${item.iconExtraClassNames || ''}` })),
|
|
62
|
+
React.createElement("div", { "data-testid": item.labelTestId, "data-customid": item.labelCustomId, className: `tw-text-[13px] tw-ml-1 ${item.disabled ? 'tw-text-sq-disabled-gray' : 'tw-text-sq-text-color dark:tw-text-sq-white'} tw-not-italic tw-font-normal ${item.labelClasses || ''}` }, item.label)),
|
|
63
|
+
item.hasDivider && (React.createElement(DropdownMenu.Separator, { "data-testid": `dropdown-divider-${index}`, className: "tw-h-[1px] tw-bg-sq-disabled-gray dark:tw-bg-gray-500 tw-my-[8px]" }))));
|
|
64
|
+
}))))));
|
|
65
|
+
};
|
|
66
|
+
export default ButtonWithDropdown;
|
|
67
67
|
//# sourceMappingURL=ButtonWithDropdown.js.map
|
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import ButtonWithDropdown from './ButtonWithDropdown';
|
|
3
|
-
import Icon from '../Icon';
|
|
4
|
-
import { QTip } from '../Tooltip/Qtip';
|
|
5
|
-
export default {
|
|
6
|
-
title: 'Button with Dropdown',
|
|
7
|
-
};
|
|
8
|
-
export const AllButtonWithDropdownVariants = () => {
|
|
9
|
-
const [openDropdown, setOpenDropdown] = React.useState('');
|
|
10
|
-
const allButtonWithDropdowns = (color, isDark) => (React.createElement("div", { className: isDark ? 'tw-dark tw-bg-sq-dark-background' : '' },
|
|
11
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
12
|
-
React.createElement(ButtonWithDropdown, { onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-1-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-1-${color}-${isDark ? 'dark' : 'light'}`, triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), containerTestId: "basic-dropdown1", tooltip: "This is a small dropdown.", tooltipDelay: 0, tooltipPlacement: "top", dropdownItems: [
|
|
13
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
14
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
15
|
-
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
16
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), tooltipDelay: 0, tooltip: 'This is a banana' },
|
|
17
|
-
] })),
|
|
18
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
19
|
-
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-2-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-2-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
20
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
21
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
22
|
-
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
23
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
24
|
-
], containerTestId: "basic-dropdown1", tooltip: "This is a normal dropdown.", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
25
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
26
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Dropdown with arrow"),
|
|
27
|
-
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-3-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-3-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
28
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
29
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
30
|
-
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
31
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
32
|
-
], containerTestId: "basic-dropdown1", hasArrow: true, tooltip: "This is a normal dropdown aligned to the end", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
33
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
34
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Dropdown aligned at center"),
|
|
35
|
-
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-4-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-4-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
36
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
37
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
38
|
-
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
39
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
40
|
-
], containerTestId: "basic-dropdown1", hasArrow: true, tooltip: "This is a normal dropdown aligned to the center", align: "center", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
41
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
42
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Dropdown aligned at start"),
|
|
43
|
-
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-5-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-5-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
44
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
45
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
46
|
-
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
47
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
48
|
-
], containerTestId: "basic-dropdown1", hasArrow: true, tooltip: "This is a normal dropdown aligned to the center", align: "start", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
49
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
50
|
-
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-gears-2", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), dropdownItems: [], onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-6-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-6-${color}-${isDark ? 'dark' : 'light'}`, containerTestId: "basic-dropdown2", tooltip: "This is a disabled dropdown.", tooltipDelay: 0, tooltipPlacement: "top", disabled: true })),
|
|
51
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
52
|
-
React.createElement(ButtonWithDropdown, { onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-7-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-7-${color}-${isDark ? 'dark' : 'light'}`, triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), containerTestId: "basic-dropdown7", tooltip: "This is a dropdown with submenu", tooltipDelay: 0, tooltipPlacement: "top", dropdownItems: [
|
|
53
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
54
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
55
|
-
{
|
|
56
|
-
label: 'Guava',
|
|
57
|
-
icon: 'fc-user-community',
|
|
58
|
-
onClick: () => setOpenDropdown(''),
|
|
59
|
-
tooltipDelay: 0,
|
|
60
|
-
tooltip: 'This is a guava',
|
|
61
|
-
subMenuItems: [
|
|
62
|
-
{ label: 'Orange', iconClass: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
63
|
-
{ label: 'Mango', iconClass: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
64
|
-
{ label: 'Apple', iconClass: 'fc-user-community', onClick: () => setOpenDropdown(''), disabled: true },
|
|
65
|
-
],
|
|
66
|
-
},
|
|
67
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), disabled: true },
|
|
68
|
-
{
|
|
69
|
-
label: 'Cashew',
|
|
70
|
-
icon: 'fc-user-community',
|
|
71
|
-
disabled: true,
|
|
72
|
-
onClick: () => setOpenDropdown(''),
|
|
73
|
-
subMenuItems: [
|
|
74
|
-
{ label: 'Orange', iconClass: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
75
|
-
{ label: 'Mango', iconClass: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
76
|
-
{ label: 'Apple', iconClass: 'fc-user-community', onClick: () => setOpenDropdown(''), disabled: true },
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
] }))));
|
|
80
|
-
const renderAllVariations = (color) => (React.createElement("div", { className: "tw-grid tw-grid-cols-2 tw-gap-4 tw-p-4" },
|
|
81
|
-
allButtonWithDropdowns(color),
|
|
82
|
-
allButtonWithDropdowns(color, true)));
|
|
83
|
-
return (React.createElement("div", { className: "tw-grid tw-grid-cols-4 tw-gap-4" },
|
|
84
|
-
React.createElement(QTip, null),
|
|
85
|
-
React.createElement("div", { className: "color_topic" },
|
|
86
|
-
React.createElement("b", null, "Topic Colors"),
|
|
87
|
-
renderAllVariations('topic')),
|
|
88
|
-
React.createElement("div", { className: "color_analysis" },
|
|
89
|
-
React.createElement("b", null, "Analysis Colors"),
|
|
90
|
-
renderAllVariations('analysis')),
|
|
91
|
-
React.createElement("div", { className: "color_datalab" },
|
|
92
|
-
React.createElement("b", null, "Datalab Colors"),
|
|
93
|
-
renderAllVariations('datalab')),
|
|
94
|
-
React.createElement("div", { className: "color_vantage" },
|
|
95
|
-
React.createElement("b", null, "Vantage Colors"),
|
|
96
|
-
renderAllVariations('vantage'))));
|
|
97
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import ButtonWithDropdown from './ButtonWithDropdown';
|
|
3
|
+
import Icon from '../Icon';
|
|
4
|
+
import { QTip } from '../Tooltip/Qtip';
|
|
5
|
+
export default {
|
|
6
|
+
title: 'Button with Dropdown',
|
|
7
|
+
};
|
|
8
|
+
export const AllButtonWithDropdownVariants = () => {
|
|
9
|
+
const [openDropdown, setOpenDropdown] = React.useState('');
|
|
10
|
+
const allButtonWithDropdowns = (color, isDark) => (React.createElement("div", { className: isDark ? 'tw-dark tw-bg-sq-dark-background' : '' },
|
|
11
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
12
|
+
React.createElement(ButtonWithDropdown, { onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-1-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-1-${color}-${isDark ? 'dark' : 'light'}`, triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), containerTestId: "basic-dropdown1", tooltip: "This is a small dropdown.", tooltipDelay: 0, tooltipPlacement: "top", dropdownItems: [
|
|
13
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
14
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
15
|
+
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
16
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), tooltipDelay: 0, tooltip: 'This is a banana' },
|
|
17
|
+
] })),
|
|
18
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
19
|
+
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-2-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-2-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
20
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
21
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
22
|
+
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
23
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
24
|
+
], containerTestId: "basic-dropdown1", tooltip: "This is a normal dropdown.", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
25
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
26
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Dropdown with arrow"),
|
|
27
|
+
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-3-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-3-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
28
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
29
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
30
|
+
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
31
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
32
|
+
], containerTestId: "basic-dropdown1", hasArrow: true, tooltip: "This is a normal dropdown aligned to the end", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
33
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
34
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Dropdown aligned at center"),
|
|
35
|
+
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-4-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-4-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
36
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
37
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
38
|
+
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
39
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
40
|
+
], containerTestId: "basic-dropdown1", hasArrow: true, tooltip: "This is a normal dropdown aligned to the center", align: "center", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
41
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
42
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Dropdown aligned at start"),
|
|
43
|
+
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-5-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-5-${color}-${isDark ? 'dark' : 'light'}`, dropdownItems: [
|
|
44
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
45
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
46
|
+
{ label: 'Guava', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), hasDivider: true },
|
|
47
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
48
|
+
], containerTestId: "basic-dropdown1", hasArrow: true, tooltip: "This is a normal dropdown aligned to the center", align: "start", tooltipDelay: 0, tooltipPlacement: "top" })),
|
|
49
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
50
|
+
React.createElement(ButtonWithDropdown, { triggerIcon: React.createElement(Icon, { icon: "fc-gears-2", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), dropdownItems: [], onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-6-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-6-${color}-${isDark ? 'dark' : 'light'}`, containerTestId: "basic-dropdown2", tooltip: "This is a disabled dropdown.", tooltipDelay: 0, tooltipPlacement: "top", disabled: true })),
|
|
51
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
52
|
+
React.createElement(ButtonWithDropdown, { onOpenChange: (isOpen) => setOpenDropdown(isOpen ? `dropdown-7-${color}-${isDark ? 'dark' : 'light'}` : ''), isOpen: openDropdown === `dropdown-7-${color}-${isDark ? 'dark' : 'light'}`, triggerIcon: React.createElement(Icon, { icon: "fc-more", type: "text", extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" }), containerTestId: "basic-dropdown7", tooltip: "This is a dropdown with submenu", tooltipDelay: 0, tooltipPlacement: "top", dropdownItems: [
|
|
53
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
54
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
55
|
+
{
|
|
56
|
+
label: 'Guava',
|
|
57
|
+
icon: 'fc-user-community',
|
|
58
|
+
onClick: () => setOpenDropdown(''),
|
|
59
|
+
tooltipDelay: 0,
|
|
60
|
+
tooltip: 'This is a guava',
|
|
61
|
+
subMenuItems: [
|
|
62
|
+
{ label: 'Orange', iconClass: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
63
|
+
{ label: 'Mango', iconClass: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
64
|
+
{ label: 'Apple', iconClass: 'fc-user-community', onClick: () => setOpenDropdown(''), disabled: true },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: () => setOpenDropdown(''), disabled: true },
|
|
68
|
+
{
|
|
69
|
+
label: 'Cashew',
|
|
70
|
+
icon: 'fc-user-community',
|
|
71
|
+
disabled: true,
|
|
72
|
+
onClick: () => setOpenDropdown(''),
|
|
73
|
+
subMenuItems: [
|
|
74
|
+
{ label: 'Orange', iconClass: 'fc-data-file', onClick: () => setOpenDropdown('') },
|
|
75
|
+
{ label: 'Mango', iconClass: 'fc-user-community', onClick: () => setOpenDropdown('') },
|
|
76
|
+
{ label: 'Apple', iconClass: 'fc-user-community', onClick: () => setOpenDropdown(''), disabled: true },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
] }))));
|
|
80
|
+
const renderAllVariations = (color) => (React.createElement("div", { className: "tw-grid tw-grid-cols-2 tw-gap-4 tw-p-4" },
|
|
81
|
+
allButtonWithDropdowns(color),
|
|
82
|
+
allButtonWithDropdowns(color, true)));
|
|
83
|
+
return (React.createElement("div", { className: "tw-grid tw-grid-cols-4 tw-gap-4" },
|
|
84
|
+
React.createElement(QTip, null),
|
|
85
|
+
React.createElement("div", { className: "color_topic" },
|
|
86
|
+
React.createElement("b", null, "Topic Colors"),
|
|
87
|
+
renderAllVariations('topic')),
|
|
88
|
+
React.createElement("div", { className: "color_analysis" },
|
|
89
|
+
React.createElement("b", null, "Analysis Colors"),
|
|
90
|
+
renderAllVariations('analysis')),
|
|
91
|
+
React.createElement("div", { className: "color_datalab" },
|
|
92
|
+
React.createElement("b", null, "Datalab Colors"),
|
|
93
|
+
renderAllVariations('datalab')),
|
|
94
|
+
React.createElement("div", { className: "color_vantage" },
|
|
95
|
+
React.createElement("b", null, "Vantage Colors"),
|
|
96
|
+
renderAllVariations('vantage'))));
|
|
97
|
+
};
|
|
98
98
|
//# sourceMappingURL=ButtonWithDropdown.stories.js.map
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { render, screen } from '@testing-library/react';
|
|
4
|
-
import userEvent from '@testing-library/user-event';
|
|
5
|
-
import ButtonWithDropdown from './ButtonWithDropdown';
|
|
6
|
-
import Icon from '../Icon';
|
|
7
|
-
describe('ButtonWithDropdown', () => {
|
|
8
|
-
const mockOnClick = jest.fn();
|
|
9
|
-
const testId = 'trigger-icon';
|
|
10
|
-
const tooltip = 'This is a small dropdown.';
|
|
11
|
-
const itemTooltip = 'This is an item from the dropdown.';
|
|
12
|
-
class Context {
|
|
13
|
-
props = {
|
|
14
|
-
triggerIcon: (React.createElement(Icon, { icon: "fc-more", type: "text", testId: testId, extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" })),
|
|
15
|
-
containerTestId: 'basic-dropdown1',
|
|
16
|
-
tooltip,
|
|
17
|
-
tooltipDelay: 0,
|
|
18
|
-
tooltipPlacement: 'top',
|
|
19
|
-
isHtmlTooltip: false,
|
|
20
|
-
dropdownItems: [
|
|
21
|
-
{ label: 'Orange', icon: 'fc-data-file', onClick: mockOnClick },
|
|
22
|
-
{ label: 'Mango', icon: 'fc-user-community', onClick: mockOnClick },
|
|
23
|
-
{ label: 'Guava', icon: 'fc-user-community', onClick: mockOnClick },
|
|
24
|
-
{ label: 'Banana', icon: 'fc-user-community', onClick: mockOnClick, tooltip: itemTooltip, tooltipPlacement: 'top', tooltipDelay: 0, isHtmlTooltip: false },
|
|
25
|
-
],
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
let tc;
|
|
29
|
-
beforeEach(() => {
|
|
30
|
-
tc = new Context();
|
|
31
|
-
jest.clearAllMocks();
|
|
32
|
-
});
|
|
33
|
-
const renderButtonWithDropdown = (props) => render(React.createElement(ButtonWithDropdown, { ...props }));
|
|
34
|
-
const openDropdown = async () => {
|
|
35
|
-
const popover = screen.getByTestId(testId);
|
|
36
|
-
await userEvent.click(popover);
|
|
37
|
-
};
|
|
38
|
-
test('renders trigger and opens dropdown content on trigger click', async () => {
|
|
39
|
-
renderButtonWithDropdown(tc.props);
|
|
40
|
-
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
41
|
-
await openDropdown();
|
|
42
|
-
expect(screen.getByText('Orange')).toBeInTheDocument();
|
|
43
|
-
});
|
|
44
|
-
test('renders dividers correctly', async () => {
|
|
45
|
-
tc.props.dropdownItems[1].hasDivider = true;
|
|
46
|
-
renderButtonWithDropdown(tc.props);
|
|
47
|
-
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
48
|
-
await openDropdown();
|
|
49
|
-
expect(screen.getByText('Orange')).toBeInTheDocument();
|
|
50
|
-
expect(screen.getByTestId('dropdown-divider-1')).toBeInTheDocument();
|
|
51
|
-
});
|
|
52
|
-
test('calls onClick handler when dropdown item is selected', async () => {
|
|
53
|
-
renderButtonWithDropdown(tc.props);
|
|
54
|
-
await openDropdown();
|
|
55
|
-
const item1 = screen.getByText('Orange');
|
|
56
|
-
await userEvent.click(item1);
|
|
57
|
-
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
58
|
-
});
|
|
59
|
-
test('closes dropdown when item is clicked', async () => {
|
|
60
|
-
renderButtonWithDropdown(tc.props);
|
|
61
|
-
await openDropdown();
|
|
62
|
-
const item1 = screen.getByText('Orange');
|
|
63
|
-
await userEvent.click(item1);
|
|
64
|
-
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
65
|
-
expect(screen.queryByText('Orange')).not.toBeInTheDocument();
|
|
66
|
-
});
|
|
67
|
-
test('does not open when disabled', async () => {
|
|
68
|
-
tc.props.disabled = true;
|
|
69
|
-
renderButtonWithDropdown(tc.props);
|
|
70
|
-
await openDropdown();
|
|
71
|
-
expect(screen.queryByText('Orange')).not.toBeInTheDocument();
|
|
72
|
-
});
|
|
73
|
-
test('renders button tooltip correctly', async () => {
|
|
74
|
-
renderButtonWithDropdown(tc.props);
|
|
75
|
-
const tooltipText = document.querySelector(`[data-qtip-text="${tooltip}"]`);
|
|
76
|
-
expect(tooltipText).toBeInTheDocument();
|
|
77
|
-
});
|
|
78
|
-
test('renders dropdown item tooltip correctly', async () => {
|
|
79
|
-
renderButtonWithDropdown(tc.props);
|
|
80
|
-
await openDropdown();
|
|
81
|
-
const tooltipText = document.querySelector(`[data-qtip-text="${itemTooltip}"]`);
|
|
82
|
-
expect(tooltipText).toBeInTheDocument();
|
|
83
|
-
});
|
|
84
|
-
});
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import '@testing-library/jest-dom';
|
|
3
|
+
import { render, screen } from '@testing-library/react';
|
|
4
|
+
import userEvent from '@testing-library/user-event';
|
|
5
|
+
import ButtonWithDropdown from './ButtonWithDropdown';
|
|
6
|
+
import Icon from '../Icon';
|
|
7
|
+
describe('ButtonWithDropdown', () => {
|
|
8
|
+
const mockOnClick = jest.fn();
|
|
9
|
+
const testId = 'trigger-icon';
|
|
10
|
+
const tooltip = 'This is a small dropdown.';
|
|
11
|
+
const itemTooltip = 'This is an item from the dropdown.';
|
|
12
|
+
class Context {
|
|
13
|
+
props = {
|
|
14
|
+
triggerIcon: (React.createElement(Icon, { icon: "fc-more", type: "text", testId: testId, extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" })),
|
|
15
|
+
containerTestId: 'basic-dropdown1',
|
|
16
|
+
tooltip,
|
|
17
|
+
tooltipDelay: 0,
|
|
18
|
+
tooltipPlacement: 'top',
|
|
19
|
+
isHtmlTooltip: false,
|
|
20
|
+
dropdownItems: [
|
|
21
|
+
{ label: 'Orange', icon: 'fc-data-file', onClick: mockOnClick },
|
|
22
|
+
{ label: 'Mango', icon: 'fc-user-community', onClick: mockOnClick },
|
|
23
|
+
{ label: 'Guava', icon: 'fc-user-community', onClick: mockOnClick },
|
|
24
|
+
{ label: 'Banana', icon: 'fc-user-community', onClick: mockOnClick, tooltip: itemTooltip, tooltipPlacement: 'top', tooltipDelay: 0, isHtmlTooltip: false },
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
let tc;
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
tc = new Context();
|
|
31
|
+
jest.clearAllMocks();
|
|
32
|
+
});
|
|
33
|
+
const renderButtonWithDropdown = (props) => render(React.createElement(ButtonWithDropdown, { ...props }));
|
|
34
|
+
const openDropdown = async () => {
|
|
35
|
+
const popover = screen.getByTestId(testId);
|
|
36
|
+
await userEvent.click(popover);
|
|
37
|
+
};
|
|
38
|
+
test('renders trigger and opens dropdown content on trigger click', async () => {
|
|
39
|
+
renderButtonWithDropdown(tc.props);
|
|
40
|
+
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
41
|
+
await openDropdown();
|
|
42
|
+
expect(screen.getByText('Orange')).toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
test('renders dividers correctly', async () => {
|
|
45
|
+
tc.props.dropdownItems[1].hasDivider = true;
|
|
46
|
+
renderButtonWithDropdown(tc.props);
|
|
47
|
+
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
48
|
+
await openDropdown();
|
|
49
|
+
expect(screen.getByText('Orange')).toBeInTheDocument();
|
|
50
|
+
expect(screen.getByTestId('dropdown-divider-1')).toBeInTheDocument();
|
|
51
|
+
});
|
|
52
|
+
test('calls onClick handler when dropdown item is selected', async () => {
|
|
53
|
+
renderButtonWithDropdown(tc.props);
|
|
54
|
+
await openDropdown();
|
|
55
|
+
const item1 = screen.getByText('Orange');
|
|
56
|
+
await userEvent.click(item1);
|
|
57
|
+
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
58
|
+
});
|
|
59
|
+
test('closes dropdown when item is clicked', async () => {
|
|
60
|
+
renderButtonWithDropdown(tc.props);
|
|
61
|
+
await openDropdown();
|
|
62
|
+
const item1 = screen.getByText('Orange');
|
|
63
|
+
await userEvent.click(item1);
|
|
64
|
+
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
65
|
+
expect(screen.queryByText('Orange')).not.toBeInTheDocument();
|
|
66
|
+
});
|
|
67
|
+
test('does not open when disabled', async () => {
|
|
68
|
+
tc.props.disabled = true;
|
|
69
|
+
renderButtonWithDropdown(tc.props);
|
|
70
|
+
await openDropdown();
|
|
71
|
+
expect(screen.queryByText('Orange')).not.toBeInTheDocument();
|
|
72
|
+
});
|
|
73
|
+
test('renders button tooltip correctly', async () => {
|
|
74
|
+
renderButtonWithDropdown(tc.props);
|
|
75
|
+
const tooltipText = document.querySelector(`[data-qtip-text="${tooltip}"]`);
|
|
76
|
+
expect(tooltipText).toBeInTheDocument();
|
|
77
|
+
});
|
|
78
|
+
test('renders dropdown item tooltip correctly', async () => {
|
|
79
|
+
renderButtonWithDropdown(tc.props);
|
|
80
|
+
await openDropdown();
|
|
81
|
+
const tooltipText = document.querySelector(`[data-qtip-text="${itemTooltip}"]`);
|
|
82
|
+
expect(tooltipText).toBeInTheDocument();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
85
|
//# sourceMappingURL=ButtonWithDropdown.test.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=ButtonWithDropdown.types.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default } from './ButtonWithDropdown';
|
|
1
|
+
export { default } from './ButtonWithDropdown';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|