Skip to content

Commit 4cd85cc

Browse files
added dropdown type column in table
1 parent 3ef0e4f commit 4cd85cc

File tree

4 files changed

+142
-1
lines changed

4 files changed

+142
-1
lines changed

client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComp.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { SimpleTextComp } from "./columnTypeComps/simpleTextComp";
2020
import { ColumnNumberComp } from "./columnTypeComps/ColumnNumberComp";
2121

2222
import { ColumnAvatarsComp } from "./columnTypeComps/columnAvatarsComp";
23+
import { ColumnDropdownComp } from "./columnTypeComps/columnDropdownComp";
2324

2425
const actionOptions = [
2526
{
@@ -50,6 +51,10 @@ const actionOptions = [
5051
label: trans("table.select"),
5152
value: "select",
5253
},
54+
{
55+
label: trans("table.dropdown"),
56+
value: "dropdown",
57+
},
5358
{
5459
label: trans("table.badgeStatus"),
5560
value: "badgeStatus",
@@ -101,6 +106,7 @@ export const ColumnTypeCompMap = {
101106
link: LinkComp,
102107
tag: ColumnTagsComp,
103108
select: ColumnSelectComp,
109+
dropdown: ColumnDropdownComp,
104110
links: ColumnLinksComp,
105111
image: ImageComp,
106112
markdown: ColumnMarkdownComp,
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import { ReactElement } from "react";
2+
import { DropdownOptionControl } from "comps/controls/optionsControl";
3+
import { StringControl } from "comps/controls/codeControl";
4+
import { trans } from "i18n";
5+
import { ColumnTypeCompBuilder, ColumnTypeViewFn } from "../columnTypeCompBuilder";
6+
import Menu from "antd/es/menu";
7+
import Dropdown from "antd/es/dropdown";
8+
import { dropdownControl } from "comps/controls/dropdownControl";
9+
import { IconControl } from "comps/controls/iconControl";
10+
import { withDefault } from "comps/generators";
11+
import { IconWrapper } from "util/bottomResUtils";
12+
import { ButtonTypeOptions } from "../simpleColumnTypeComps";
13+
import { useStyle } from "comps/controls/styleControl";
14+
import { ButtonStyle } from "comps/controls/styleControlConstants";
15+
import { Button100 } from "comps/comps/buttonComp/buttonCompConstants";
16+
17+
const childrenMap = {
18+
buttonType: dropdownControl(ButtonTypeOptions, "primary"),
19+
label: withDefault(StringControl, 'Menu'),
20+
prefixIcon: IconControl,
21+
suffixIcon: IconControl,
22+
options: DropdownOptionControl,
23+
};
24+
25+
const getBaseValue: ColumnTypeViewFn<typeof childrenMap, string, string> = (props) => props.label;
26+
27+
export const ColumnDropdownComp = (function () {
28+
return new ColumnTypeCompBuilder(
29+
childrenMap,
30+
(props) => {
31+
const hasOptionIcon = props.options.findIndex((option) => (option.prefixIcon as ReactElement)?.props.value) > -1;
32+
const items = props.options
33+
.filter((option) => !option.hidden)
34+
.map((option, index) => ({
35+
title: option.label,
36+
label: option.label,
37+
key: option.label + " - " + index,
38+
disabled: option.disabled,
39+
icon: hasOptionIcon && <span>{option.prefixIcon}</span>,
40+
onEvent: option.onEvent,
41+
}));
42+
43+
const hasPrefixIcon = (props.prefixIcon as ReactElement)?.props.value;
44+
const hasSuffixIcon = (props.suffixIcon as ReactElement)?.props.value;
45+
const buttonStyle = useStyle(ButtonStyle);
46+
47+
const menu = (
48+
<Menu
49+
items={items}
50+
onClick={({ key }) => items.find((o) => o.key === key)?.onEvent?.("click")}
51+
/>
52+
);
53+
54+
return (
55+
56+
<Dropdown
57+
trigger={["click"]}
58+
placement="bottom"
59+
menu={{items}}
60+
dropdownRender={() => menu}
61+
>
62+
<Button100
63+
type={props.buttonType}
64+
style={{
65+
display: 'flex',
66+
alignItems: 'center',
67+
gap: '0',
68+
minWidth: '30px',
69+
width: 'auto',
70+
}}
71+
$buttonStyle={
72+
props.buttonType === "primary"
73+
? buttonStyle
74+
: undefined
75+
}
76+
>
77+
{
78+
hasPrefixIcon && (
79+
<IconWrapper style={{
80+
margin: '0px',
81+
marginRight: props.label || hasSuffixIcon ? '3px' : '0x',
82+
}}>
83+
{props.prefixIcon}
84+
</IconWrapper>
85+
)
86+
}
87+
{
88+
props.label || (hasPrefixIcon || hasSuffixIcon ? undefined : " ") // Avoid button disappearing
89+
}
90+
{
91+
hasSuffixIcon && (
92+
<IconWrapper style={{
93+
margin: '0px',
94+
marginLeft: props.label || hasPrefixIcon ? '3px' : '0x',
95+
}}>
96+
{props.suffixIcon}
97+
</IconWrapper>
98+
)
99+
}
100+
</Button100>
101+
</Dropdown>
102+
);
103+
},
104+
(nodeValue) => nodeValue.label.value,
105+
getBaseValue,
106+
)
107+
.setPropertyViewFn((children) => {
108+
return (
109+
<>
110+
{children.buttonType.propertyView({
111+
label: trans("table.type"),
112+
radioButton: true,
113+
})}
114+
{children.label.propertyView({
115+
label: trans("text"),
116+
})}
117+
{children.prefixIcon.propertyView({
118+
label: trans("button.prefixIcon"),
119+
})}
120+
{children.suffixIcon.propertyView({
121+
label: trans("button.suffixIcon"),
122+
})}
123+
{children.options.propertyView({
124+
title: trans("optionsControl.optionList"),
125+
})}
126+
</>
127+
);
128+
})
129+
.build();
130+
})();

client/packages/lowcoder/src/comps/comps/tableComp/column/simpleColumnTypeComps.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Button100 } from "comps/comps/buttonComp/buttonCompConstants";
1010

1111
export const ColumnValueTooltip = trans("table.columnValueTooltip");
1212

13-
const ButtonTypeOptions = [
13+
export const ButtonTypeOptions = [
1414
{
1515
label: trans("table.primaryButton"),
1616
value: "primary",
@@ -19,6 +19,10 @@ const ButtonTypeOptions = [
1919
label: trans("table.defaultButton"),
2020
value: "default",
2121
},
22+
{
23+
label: trans("text"),
24+
value: "text",
25+
},
2226
] as const;
2327

2428
export const ButtonComp = (function () {

client/packages/lowcoder/src/i18n/locales/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,6 +1896,7 @@ export const en = {
18961896
"links": "Links",
18971897
"tag": "Tag",
18981898
"select": "Select",
1899+
"dropdown": "Dropdown",
18991900
"date": "Date",
19001901
"dateTime": "Date Time",
19011902
"badgeStatus": "Status",

0 commit comments

Comments
 (0)