Skip to content

Commit 10d27dc

Browse files
initial shape component
1 parent ccfa3eb commit 10d27dc

File tree

4 files changed

+154
-71
lines changed

4 files changed

+154
-71
lines changed

client/packages/lowcoder/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"buffer": "^6.0.3",
4242
"clsx": "^2.0.0",
4343
"cnchar": "^3.2.4",
44+
"coolshapes-react": "^0.1.1-beta.0",
4445
"copy-to-clipboard": "^3.3.3",
4546
"core-js": "^3.25.2",
4647
"echarts": "^5.4.3",
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
import { useEffect, useRef, useState } from "react";
2+
import styled, { css } from "styled-components";
3+
import { RecordConstructorToView } from "lowcoder-core";
4+
import { styleControl } from "comps/controls/styleControl";
5+
import _ from "lodash";
6+
import {
7+
IconStyle,
8+
IconStyleType,
9+
heightCalculator,
10+
widthCalculator,
11+
} from "comps/controls/styleControlConstants";
12+
import { UICompBuilder } from "comps/generators/uiCompBuilder";
13+
import { withDefault } from "../../generators";
14+
import {
15+
NameConfigHidden,
16+
withExposingConfigs,
17+
} from "comps/generators/withExposing";
18+
import { Section, sectionNames } from "lowcoder-design";
19+
import { hiddenPropertyView } from "comps/utils/propertyUtils";
20+
import { trans } from "i18n";
21+
import { NumberControl } from "comps/controls/codeControl";
22+
import { IconControl } from "comps/controls/iconControl";
23+
import ReactResizeDetector from "react-resize-detector";
24+
import { AutoHeightControl } from "../../controls/autoHeightControl";
25+
import {
26+
clickEvent,
27+
eventHandlerControl,
28+
} from "../../controls/eventHandlerControl";
29+
import { useContext } from "react";
30+
import { EditorContext } from "comps/editorState";
31+
32+
const Container = styled.div<{ $style: IconStyleType | undefined }>`
33+
display: flex;
34+
align-items: center;
35+
justify-content: center;
36+
37+
${(props) =>
38+
props.$style &&
39+
css`
40+
height: calc(100% - ${props.$style.margin});
41+
width: calc(100% - ${props.$style.margin});
42+
padding: ${props.$style.padding};
43+
margin: ${props.$style.margin};
44+
border: ${props.$style.borderWidth} solid ${props.$style.border};
45+
border-radius: ${props.$style.radius};
46+
background: ${props.$style.background};
47+
svg {
48+
max-width: ${widthCalculator(props.$style.margin)};
49+
max-height: ${heightCalculator(props.$style.margin)};
50+
color: ${props.$style.fill};
51+
object-fit: contain;
52+
pointer-events: auto;
53+
}
54+
`}
55+
`;
56+
57+
const EventOptions = [clickEvent] as const;
58+
59+
const childrenMap = {
60+
style: styleControl(IconStyle),
61+
icon: withDefault(IconControl, "/icon:antd/homefilled"),
62+
autoHeight: withDefault(AutoHeightControl, "auto"),
63+
iconSize: withDefault(NumberControl, 20),
64+
onEvent: eventHandlerControl(EventOptions),
65+
};
66+
67+
const IconView = (props: RecordConstructorToView<typeof childrenMap>) => {
68+
const conRef = useRef<HTMLDivElement>(null);
69+
const [width, setWidth] = useState(0);
70+
const [height, setHeight] = useState(0);
71+
72+
useEffect(() => {
73+
if (height && width) {
74+
onResize();
75+
}
76+
}, [height, width]);
77+
78+
const onResize = () => {
79+
const container = conRef.current;
80+
setWidth(container?.clientWidth ?? 0);
81+
setHeight(container?.clientHeight ?? 0);
82+
};
83+
84+
return (
85+
<ReactResizeDetector onResize={onResize}>
86+
<Container
87+
ref={conRef}
88+
$style={props.style}
89+
style={{
90+
fontSize: props.autoHeight
91+
? `${height < width ? height : width}px`
92+
: props.iconSize,
93+
background: props.style.background,
94+
}}
95+
onClick={() => props.onEvent("click")}
96+
>
97+
{props.icon}
98+
</Container>
99+
</ReactResizeDetector>
100+
);
101+
};
102+
103+
let ShapeBasicComp = (function () {
104+
return new UICompBuilder(childrenMap, (props) => <IconView {...props} />)
105+
.setPropertyViewFn((children) => (
106+
<>
107+
<Section name={sectionNames.basic}>
108+
{children.icon.propertyView({
109+
label: trans("iconComp.icon"),
110+
IconType: "All",
111+
})}
112+
</Section>
113+
114+
{["logic", "both"].includes(
115+
useContext(EditorContext).editorModeStatus
116+
) && (
117+
<Section name={sectionNames.interaction}>
118+
{children.onEvent.getPropertyView()}
119+
{hiddenPropertyView(children)}
120+
</Section>
121+
)}
122+
123+
{["layout", "both"].includes(
124+
useContext(EditorContext).editorModeStatus
125+
) && (
126+
<>
127+
<Section name={sectionNames.layout}>
128+
{children.autoHeight.propertyView({
129+
label: trans("iconComp.autoSize"),
130+
})}
131+
{!children.autoHeight.getView() &&
132+
children.iconSize.propertyView({
133+
label: trans("iconComp.iconSize"),
134+
})}
135+
</Section>
136+
<Section name={sectionNames.style}>
137+
{children.style.getPropertyView()}
138+
</Section>
139+
</>
140+
)}
141+
</>
142+
))
143+
.build();
144+
})();
145+
146+
ShapeBasicComp = class extends ShapeBasicComp {
147+
override autoHeight(): boolean {
148+
return false;
149+
}
150+
};
151+
152+
export const ShapeComp = withExposingConfigs(ShapeBasicComp, [NameConfigHidden]);

client/packages/lowcoder/src/comps/index.tsx

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,21 @@
1-
// import "comps/comps/layout/navLayout";
2-
// import "comps/comps/layout/mobileTabLayout";
31
import cnchar from "cnchar";
4-
5-
import { ModalComp } from "comps/hooks/modalComp";
6-
import { ButtonComp } from "./comps/buttonComp/buttonComp";
7-
import { DropdownComp } from "./comps/buttonComp/dropdownComp";
8-
import { LinkComp } from "./comps/buttonComp/linkComp";
92
import {
10-
ContainerComp,
113
defaultContainerData,
124
} from "./comps/containerComp/containerComp";
13-
import { defaultCollapsibleContainerData } from "./comps/containerComp/collapsibleContainerComp";
145
import { ContainerComp as FloatTextContainerComp } from "./comps/containerComp/textContainerComp";
156
import {
167
PageLayoutComp,
178
defaultPageLayoutData,
189
} from "./comps/containerComp/pageLayoutComp";
19-
import { CustomComp } from "./comps/customComp/customComp";
20-
import { DatePickerComp, DateRangeComp } from "./comps/dateComp/dateComp";
21-
import { DividerComp } from "./comps/dividerComp";
22-
import { FileComp } from "./comps/fileComp/fileComp";
23-
import { FileViewerComp } from "./comps/fileViewerComp";
24-
import { ImageComp } from "./comps/imageComp";
25-
import { JsonSchemaFormComp } from "./comps/jsonSchemaFormComp/jsonSchemaFormComp";
26-
import { NumberInputComp } from "./comps/numberInputComp/numberInputComp";
27-
import { RangeSliderComp } from "./comps/numberInputComp/rangeSliderComp";
28-
import { SliderComp } from "./comps/numberInputComp/sliderComp";
29-
import { ProgressCircleComp } from "./comps/progressCircleComp";
30-
import { ProgressComp } from "./comps/progressComp";
31-
import { RatingComp } from "./comps/ratingComp";
32-
import { RichTextEditorComp } from "./comps/richTextEditorComp";
33-
import { CascaderWithDefault } from "./comps/selectInputComp/cascaderComp";
34-
import { CheckboxComp } from "./comps/selectInputComp/checkboxComp";
35-
import { MultiSelectComp } from "./comps/selectInputComp/multiSelectComp";
36-
import { RadioComp } from "./comps/selectInputComp/radioComp";
37-
import { SegmentedControlComp } from "./comps/selectInputComp/segmentedControl";
38-
import { StepComp } from "./comps/selectInputComp/stepControl";
39-
import { SelectComp } from "./comps/selectInputComp/selectComp";
40-
import { SwitchComp } from "./comps/switchComp";
41-
import { defaultTableData } from "./comps/tableComp/mockTableComp";
42-
import { TabbedContainerComp } from "./comps/tabs";
43-
import { TextComp } from "./comps/textComp";
44-
import { InputComp } from "./comps/textInputComp/inputComp";
45-
import { PasswordComp } from "./comps/textInputComp/passwordComp";
46-
import { TextAreaComp } from "./comps/textInputComp/textAreaComp";
47-
import { TimePickerComp, TimeRangeComp } from "./comps/dateComp/timeComp";
48-
import { defaultFormData, FormComp } from "./comps/formComp/formComp";
49-
import { IFrameComp } from "./comps/iframeComp";
50-
import {
51-
defaultGridData,
52-
defaultListViewData,
53-
GridComp,
54-
ListViewComp,
55-
} from "./comps/listViewComp";
56-
import { ModuleComp } from "./comps/moduleComp/moduleComp";
57-
import { NavComp } from "./comps/navComp/navComp";
58-
import { TableComp } from "./comps/tableComp";
59-
import { QRCodeComp } from "./comps/qrCodeComp";
60-
import { JsonExplorerComp } from "./comps/jsonComp/jsonExplorerComp";
61-
import { JsonEditorComp } from "./comps/jsonComp/jsonEditorComp";
62-
import { TreeComp } from "./comps/treeComp/treeComp";
63-
import { TreeSelectComp } from "./comps/treeComp/treeSelectComp";
6410
import { trans } from "i18n";
6511
import { remoteComp } from "./comps/remoteComp/remoteComp";
6612
import {
6713
registerComp,
6814
type UICompManifest,
6915
type UICompType,
7016
} from "./uiCompRegistry";
71-
import { AudioComp } from "./comps/mediaComp/audioComp";
72-
import { VideoComp } from "./comps/mediaComp/videoComp";
73-
import { DrawerComp } from "./hooks/drawerComp";
74-
import { CarouselComp } from "./comps/carouselComp";
75-
import { ToggleButtonComp } from "./comps/buttonComp/toggleButtonComp";
7617

7718
import { RemoteCompInfo } from "types/remoteComp";
78-
import { ScannerComp } from "./comps/buttonComp/scannerComp";
79-
import { SignatureComp } from "./comps/signatureComp";
80-
import { TimeLineComp } from "./comps/timelineComp/timelineComp";
81-
import { CommentComp } from "./comps/commentComp/commentComp";
82-
import { MentionComp } from "./comps/textInputComp/mentionComp";
83-
import { AutoCompleteComp } from "./comps/autoCompleteComp/autoCompleteComp";
84-
import { JsonLottieComp } from "./comps/jsonComp/jsonLottieComp";
85-
import { ResponsiveLayoutComp } from "./comps/responsiveLayout";
86-
import { VideoMeetingStreamComp } from "./comps/meetingComp/videoMeetingStreamComp";
87-
import { ControlButton } from "./comps/meetingComp/controlButton";
88-
import { VideoMeetingControllerComp } from "./comps/meetingComp/videoMeetingControllerComp";
89-
// import { VideoSharingStreamComp } from "./comps/meetingComp/videoSharingStreamComp";
9019
import { IconComp } from "./comps/iconComp";
9120

9221
import {

client/packages/lowcoder/src/comps/uiCompRegistry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export type UICompType =
114114
| "custom"
115115
| "jsonExplorer"
116116
| "jsonEditor"
117+
| "shapeComp"
117118
| "tree"
118119
| "treeSelect"
119120
| "audio"

0 commit comments

Comments
 (0)