Skip to content

Commit 916af14

Browse files
authored
Merge branch 'dev' into feature/echarts
2 parents b31ed15 + b104001 commit 916af14

File tree

91 files changed

+182964
-1144
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+182964
-1144
lines changed

README.md

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,32 @@
77
<p>
88
Create software applications (internal and customer-facing!) and Meeting/Collaboration tools for your Company and your Customers with minimal coding experience.
99
</p>
10-
<h3 style="margin-top: 0">Lowcoder is the best Retool, Appsmith or Tooljet Alternative.</h3>
10+
<h3 style="margin-top: 0">We think, Lowcoder is simply better than Retool, Appsmith Tooljet, Outsystems or Mendix.</h3>
1111
</div>
12+
---
1213

13-
<img src="https://1167272343-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjNgeI0mUzgw6Re92iTOw%2Fuploads%2FnwXJC1XBqP2MvTQitPyo%2FApp%20Editor%20%7C%20Main%20Screeen%20clean.png?alt=media&token=e5fba81b-82a7-4c0e-a15d-baa781d5b13a"/>
14-
14+
## 🎥 Lowcoder Intro Video
15+
<div align="center">
16+
<a href="https://www.youtube.com/watch?v=AQo0iFWUWiU" target="_blank">
17+
<img src="https://img.youtube.com/vi/AQo0iFWUWiU/maxresdefault.jpg" alt="Lowcoder Intro Video" width="100%">
18+
</a>
19+
<p><i>Click the image above to watch the video on YouTube</i> 📺</p>
20+
</div>
1521

22+
---
1623
## 📢 Use Lowcoder in 3 steps
1724
1. Connect to any data sources or APIs.
18-
2. Build flexible and responsive UI with 100+ components and free layout / design possibilities.
25+
2. Build flexible and responsive UI with 120+ components and free layout / design possibilities.
1926
3. Share with colleagues and customers.
2027

2128
## 💡 Why Lowcoder
2229
One platform for everything instead so many different softwares. (like Website Builders, CMS, CRM, POS, ERP, Dashboards & Data Story Visualization, Collaboration Tools).
2330

2431
It's cumbersome to create a single app. You had to design user interfaces, write code in multiple languages and frameworks, and understand how all of that code works together.
2532

26-
NewGen Lowcode Platforms like Retool and others are great for their simplicity and flexibility - like Lowcoder too, but they can also be limited in different ways, especially when it comes to "external" applications for everyone.
33+
NewGen Lowcode Platforms like Retool and others are great for their simplicity and flexibility - like Lowcoder too, but they can also be limited in different ways, especially when it comes to "external" applications for everyone - because their pricing focusses to internal apps and "pay per User".
2734

28-
Lowcoder wants to take a step forward. More specifically, Lowcoder is:
35+
With Lowcoder we did a step forward. More specifically, Lowcoder is:
2936
- An all-in-one IDE to create internal or customer-facing (external) apps.
3037
- A place to create, build and share building blocks of web applications and whole websites.
3138
- The tool and community to support your business, and lower the cost and time to develop interactive applications.
@@ -34,9 +41,9 @@ Lowcoder wants to take a step forward. More specifically, Lowcoder is:
3441
- The only platform which has extensibility plugin architecture [Check Community Contributions](https://www.npmjs.com/search?q=lowcoder-comp)
3542

3643
## 🪄 Features
37-
- **Visual UI builder** with 100+ built-in components. Save 90% of time to build apps.
44+
- **Visual UI builder** with 120+ built-in components. Save 90% of time to build apps.
3845
- **Modules** for reusable (!) embedable component sets in the UI builder.
39-
- **Embed Lowcoder Apps as native parts of any Website** instead of iFrame (!). [Demo](https://lowcoder.cloud/about), [Docu](https://docs.lowcoder.cloud/lowcoder-documentation/lowcoder-extension/native-embed-sdk)
46+
- **Embed Lowcoder Apps as native parts of any Website** instead of iFrame (!). [Demo](http://demo-lowcoder.42web.io/ecommerce/), [Docu](https://docs.lowcoder.cloud/lowcoder-documentation/lowcoder-extension/native-embed-sdk)
4047
- **Video Meeting Components** to create your own individual Web-Meeting tool.
4148
- **Query Library** for reusable data queries of your data sources.
4249
- **Custom components** to develop own components and use them in the UI builder.
@@ -107,7 +114,3 @@ Accelerate the growth of Lowcoder and unleash its potential with your Sponsorshi
107114
[Be a Sponsor](https://github.com/sponsors/lowcoder-org)
108115

109116
Like ... [@Darkjamin](https://github.com/Darkjamin), [@spacegoats-io](https://github.com/spacegoats-io), [@Jomedya](https://github.com/Jomedya), [@CHSchuepfer](https://github.com/CHSchuepfer), Thank you very much!!
110-
111-
## Intro Video
112-
113-
[![Watch the video](https://i.ytimg.com/vi/s4ltAqS0hzM/maxresdefault.jpg?sqp=-oaymwEmCIAKENAF8quKqQMa8AEB-AH-CYAC0AWKAgwIABABGD0gSShyMA8=&rs=AOn4CLAlPOIFdtauythoBKNPXhi6XGwlDQ)](https://youtu.be/s4ltAqS0hzM?feature=shared)

client/packages/lowcoder-design/src/components/Loading.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ type LoadingProps = {
7474
size?: number; // circle's size
7575
className?: string;
7676
style?: CSSProperties;
77+
compHeight?: number;
7778
};
7879

7980
export const Loading = (props: LoadingProps) => {
@@ -92,7 +93,11 @@ export const Loading = (props: LoadingProps) => {
9293
<Load2 {...loadingProps} />
9394
</Container>
9495
</ContainerX> */}
95-
<StyledSkeleton active style={{height: '100%', animationDuration: '2s'}} />
96+
<StyledSkeleton
97+
active
98+
paragraph={{rows: props.compHeight ? Math.floor((props.compHeight * 8) / 35) : 4}}
99+
style={{height: '100%', animationDuration: '2s'}}
100+
/>
96101
</LoadingWrapper>
97102
);
98103
};

client/packages/lowcoder-design/src/components/control.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,9 @@ export const ControlPropertyViewWrapper = (
159159
<ToolTipLabel
160160
title={tooltip}
161161
label={label}
162-
overlayInnerStyle={labelTooltipOverlayInnerStyle}
162+
styles={{
163+
body: labelTooltipOverlayInnerStyle,
164+
}}
163165
/>
164166
</LabelWrapper>
165167
)}

client/packages/lowcoder-design/src/components/iconSelect/index.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,12 @@ export const IconSelectBase = (props: {
363363
onOpenChange={setVisible}
364364
getPopupContainer={parent ? () => parent : undefined}
365365
// hide the original background when dragging the popover is allowed
366-
overlayInnerStyle={{
367-
border: "none",
368-
boxShadow: "none",
369-
background: "transparent",
366+
styles={{
367+
body: {
368+
border: "none",
369+
boxShadow: "none",
370+
background: "transparent",
371+
}
370372
}}
371373
// when dragging is allowed, always re-location to avoid the popover exceeds the screen
372374
destroyTooltipOnHide

client/packages/lowcoder-design/src/components/popover.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ const SimplePopover = (props: {
6464
);
6565
return (
6666
<Popover
67-
overlayInnerStyle={{padding: 0}}
6867
align={{
6968
offset: [-12, 0, 0, 0],
7069
}}
@@ -74,7 +73,10 @@ const SimplePopover = (props: {
7473
open={visible}
7574
onOpenChange={setVisible}
7675
placement="left"
77-
overlayStyle={{ width: "310px" }}
76+
styles={{
77+
root: { width: "310px" },
78+
body: { padding: 0 }
79+
}}
7880
>
7981
{props.children}
8082
</Popover>
@@ -101,16 +103,18 @@ const CustomPopover = (props: {
101103
);
102104
return (
103105
<Popover
104-
overlayInnerStyle={{padding: 0}}
105106
content={contentWithBox}
106107
trigger="click"
107108
open={visible}
108109
onOpenChange={setVisible}
109110
placement={props.type === "query" ? "top" : "left"}
110-
overlayStyle={{ width: "310px" }}
111111
align={{
112112
offset: [-12, 0, 0, 0],
113113
}}
114+
styles={{
115+
root: { width: "310px" },
116+
body: { padding: 0 }
117+
}}
114118
>
115119
{props.children}
116120
</Popover>
@@ -167,8 +171,10 @@ const EditPopover = (props: EditPopoverProps) => {
167171
return (
168172
<Popover
169173
arrow={false}
170-
overlayStyle={{paddingTop: '15px'}}
171-
overlayInnerStyle={{padding: 0}}
174+
styles={{
175+
root: { paddingTop: '15px' },
176+
body: { padding: 0 }
177+
}}
172178
content={() => (
173179
<>
174180
<Wedge />

client/packages/lowcoder-design/src/components/shapeSelect/index.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -444,10 +444,12 @@ export const ShapeSelectBase = (props: {
444444
onOpenChange={setVisible}
445445
getPopupContainer={parent ? () => parent : undefined}
446446
// hide the original background when dragging the popover is allowed
447-
overlayInnerStyle={{
448-
border: "none",
449-
boxShadow: "none",
450-
background: "transparent",
447+
styles={{
448+
body: {
449+
border: "none",
450+
boxShadow: "none",
451+
background: "transparent",
452+
}
451453
}}
452454
// when dragging is allowed, always re-location to avoid the popover exceeds the screen
453455
destroyTooltipOnHide

client/packages/lowcoder-design/src/components/toolTip.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export const UnderlineCss = css`
155155
`;
156156

157157
function Tooltip(props: TooltipProps) {
158-
return <AntdTooltip color="#2c2c2c2" overlayInnerStyle={overlayInnerCss} {...props} />;
158+
return <AntdTooltip color="#2c2c2c2" styles={{ body: overlayInnerCss }} {...props} />;
159159
}
160160

161161
const Label = styled.div<{ $border?: boolean }>`
@@ -181,7 +181,9 @@ function ToolTipLabel(
181181
<AntdTooltip
182182
color="#2c2c2c"
183183
title={title && <TooltipTitleWrapper><>{title}</></TooltipTitleWrapper>}
184-
overlayInnerStyle={{ maxWidth: "232px", whiteSpace: "break-spaces" }}
184+
styles={{
185+
body: { maxWidth: "232px", whiteSpace: "break-spaces" }
186+
}}
185187
arrow={{
186188
pointAtCenter: true
187189
}}

client/packages/lowcoder-sdk/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-sdk",
3-
"version": "2.6.3",
3+
"version": "2.6.4",
44
"type": "module",
55
"files": [
66
"src",
@@ -25,6 +25,9 @@
2525
},
2626
"./dist/style.css": {
2727
"import": "./dist/style.css"
28+
},
29+
"./dist/chunks/": {
30+
"import": "./dist/chunks/"
2831
}
2932
},
3033
"scripts": {

client/packages/lowcoder-sdk/vite.config.mts

Lines changed: 25 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,7 @@ export const viteConfig: UserConfig = {
3636
},
3737
base: ensureLastSlash(process.env.PUBLIC_URL),
3838
build: {
39-
minify: "terser",
40-
terserOptions: {
41-
compress: {
42-
drop_console: true,
43-
drop_debugger: true,
44-
pure_funcs: ["console.info", "console.debug", "console.log"],
45-
},
46-
format: {
47-
comments: false,
48-
},
49-
},
39+
minify: "terser",
5040
chunkSizeWarningLimit: 500,
5141
lib: {
5242
formats: ["es"],
@@ -56,46 +46,31 @@ export const viteConfig: UserConfig = {
5646
},
5747
rollupOptions: {
5848
treeshake: {
59-
moduleSideEffects: false,
49+
moduleSideEffects: true,
6050
propertyReadSideEffects: false,
6151
tryCatchDeoptimization: false,
6252
unknownGlobalSideEffects: false,
6353
},
6454
external: ["react", "react-dom"],
6555
output: {
6656
chunkFileNames: "chunks/[name]-[hash].js",
67-
entryFileNames: "entry/[name]-[hash].js",
68-
assetFileNames: "assets/[name]-[hash].[ext]",
57+
entryFileNames: "lowcoder-sdk.js",
58+
assetFileNames: "style.css",
6959
manualChunks: (id) => {
7060
if (id.includes("node_modules")) {
71-
// CORE FRAMEWORK CHUNKS
72-
if (id.includes("react")) return "react";
73-
if (id.includes("react-dom")) return "react-dom";
74-
if (id.includes("react-router")) return "react-router";
75-
if (id.includes("react-redux")) return "react-redux";
76-
if (id.includes("redux")) return "redux";
77-
if (id.includes("redux-saga")) return "redux-saga";
78-
7961
// UI LIBRARIES
8062
if (id.includes("@ant-design/icons")) return "ant-design-icons";
81-
if (id.includes("antd")) return "antd";
63+
if (id.includes("node_modules/antd")) return "antd";
8264
if (id.includes("styled-components")) return "styled-components";
8365

8466
// 🔹 BARCODE & QR CODE PROCESSING
85-
if (id.includes("zxing") || id.includes("Barcode") || id.includes("QRCode") || id.includes("PDF417")) return "barcode";
86-
87-
// CHARTING & DATA VISUALIZATION
88-
if (id.includes("echarts")) return "echarts";
89-
if (id.includes("echarts-wordcloud")) return "echarts-wordcloud";
90-
if (id.includes("d3")) return "d3";
67+
if (id.includes("react-qr-barcode-scanner")) return "barcode";
9168

9269
// TEXT EDITORS & PARSERS
9370
if (id.includes("codemirror")) return "codemirror";
9471
if (id.includes("quill")) return "quill";
9572
if (id.includes("react-json-view")) return "react-json-view";
96-
if (id.includes("react-markdown")) return "react-markdown";
9773
if (id.includes("react-quill")) return "react-quill";
98-
if (id.includes("remark") || id.includes("rehype") || id.includes("markdown")) return "markdown-parsers";
9974
if (id.includes("remark-gfm")) return "remark-gfm";
10075
if (id.includes("rehype-raw")) return "rehype-raw";
10176
if (id.includes("rehype-sanitize")) return "rehype-sanitize";
@@ -133,7 +108,6 @@ export const viteConfig: UserConfig = {
133108
if (id.includes("xlsx")) return "xlsx";
134109
if (id.includes("alasql")) return "alasql";
135110
if (id.includes("sql-formatter")) return "sql-formatter";
136-
if (id.includes("tern")) return "tern";
137111

138112
// NETWORK & HTTP
139113
if (id.includes("axios")) return "axios";
@@ -158,41 +132,38 @@ export const viteConfig: UserConfig = {
158132
if (id.includes("cnchar")) return "cnchar";
159133
if (id.includes("hotkeys-js")) return "hotkeys-js";
160134
if (id.includes("loglevel")) return "loglevel";
161-
if (id.includes("qrcode-react")) return "qrcode-react";
135+
if (id.includes("qrcode.react")) return "qrcode-react";
162136
if (id.includes("react-joyride")) return "react-joyride";
163137
if (id.includes("rc-trigger")) return "rc-trigger";
164138
if (id.includes("really-relaxed-json")) return "really-relaxed-json";
165139
if (id.includes("simplebar-react")) return "simplebar-react";
166-
return "vendor";
140+
if (id.includes("react-documents")) return "react-documents";
141+
if (id.includes("react-colorful")) return "react-colorful";
142+
if (id.includes("react-best-gradient-color-picker")) return "react-best-gradient-color-picker";
143+
if (id.includes("@supabase/supabase-js")) return "supabase";
144+
return null;
167145
}
168-
if (id.includes("src/api")) return "api";
169-
if (id.includes("src/appView")) return "appView";
170-
if (id.includes("src/base")) return "base";
171-
if (id.includes("src/constants")) return "constants";
172-
if (id.includes("src/i18n")) return "i18n";
173-
if (id.includes("src/ide")) return "ide";
174-
if (id.includes("src/layout")) return "layout";
175-
if (id.includes("src/pages")) return "pages";
176-
if (id.includes("src/redux")) return "app_redux";
177-
if (id.includes("src/comps")) return "comps";
178-
if (id.includes("comps/comps")) return "comps2";
179-
if (id.includes("comps/controls")) return "controls";
180-
if (id.includes("comps/queries")) return "queries";
181-
if (id.includes("comps/utils")) return "utils";
182-
if (id.includes("src/hooks")) return "hooks";
183-
if (id.includes("src/util")) return "util";
184-
return "common"; // 📦 Internal app shared code
185-
},
146+
return null;
147+
}
186148
},
187149
experimental: {
188150
minChunkSize: 300000, // 📏 Force smaller chunks (~300KB)
189151
},
190152
plugins: [
191-
terser(),
153+
terser({
154+
compress: {
155+
drop_console: true,
156+
drop_debugger: true,
157+
pure_funcs: ["console.info", "console.debug", "console.log"],
158+
},
159+
format: {
160+
comments: /(@vite-ignore|webpackIgnore)/
161+
},
162+
}) as PluginOption,
192163
strip({
193164
functions: ["console.log", "debugger"], // ✅ Remove logs
194165
sourceMap: true,
195-
}),
166+
}) as PluginOption,
196167
],
197168
onwarn: (warning, warn) => {
198169
if (warning.code === 'MODULE_LEVEL_DIRECTIVE') {

client/packages/lowcoder/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
flex-direction: column;
3131
top: 0;
3232
z-index: 10000;
33+
transition: opacity 0.25s linear;
3334
}
3435
#loading svg {
3536
animation: breath 1s linear infinite;

client/packages/lowcoder/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
"eslint-config-react-app": "^7.0.1",
128128
"eslint-plugin-only-ascii": "^0.0.0",
129129
"http-proxy-middleware": "^2.0.6",
130+
"rollup-plugin-terser": "^7.0.2",
130131
"rollup-plugin-visualizer": "^5.9.2",
131132
"typescript": "^4.8.4",
132133
"vite": "^4.5.5",

client/packages/lowcoder/src/api/subscriptionApi.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,22 @@ export const createCustomer = async (subscriptionCustomer: LowcoderNewCustomer)
182182
}
183183
};
184184

185+
export const cleanupCustomer = async (subscriptionCustomer: LowcoderSearchCustomer) => {
186+
const apiBody = {
187+
path: "webhook/secure/cleanup-customer",
188+
data: subscriptionCustomer,
189+
method: "post",
190+
headers: lcHeaders
191+
};
192+
try {
193+
const result = await SubscriptionApi.secureRequest(apiBody, 15000);
194+
return result?.data as any;
195+
} catch (error) {
196+
console.error("Error creating customer:", error);
197+
throw error;
198+
}
199+
};
200+
185201
export const getProduct = async (productId : string) => {
186202
const apiBody = {
187203
path: "webhook/secure/get-product",

0 commit comments

Comments
 (0)