Skip to content

Commit e2bc358

Browse files
committed
Merge branch 'dev' into fix-oauth-issues
2 parents 70a2284 + cb8fee7 commit e2bc358

File tree

187 files changed

+15554
-5327
lines changed

Some content is hidden

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

187 files changed

+15554
-5327
lines changed

README.md

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
44
<div align="center">
55
<h1 style="border-bottom: none; margin-bottom: 0">Lowcoder</h1>
6-
<h3 style="margin-top: 0">The Open Source Retool, Tooljet and Appsmith Alternative</h3>
6+
<h3 style="margin-top: 0">Lowcoder is the best Retool, Appsmith or Tooljet Alternative.</h3>
77
<p>
8-
Build internal and customer facing Apps fast, with no limitations
8+
Create internal and external software applications for your Company and your Customers with minimal coding experience.
99
</p>
1010
</div>
1111

12-
<img src="/docs/.gitbook/assets/Bu2fpz1h01.gif"/>
12+
<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"/>
1313

1414
## 📢 Use Lowcoder in 3 steps
1515
1. Connect to any data sources or APIs.
@@ -21,32 +21,42 @@ It's cumbersome to create a single app. You had to design user interfaces, write
2121

2222
Low-code/No-code platforms are fast to get started with but quickly become unmaintainable and inflexible. This creates more problems than it solves.
2323

24-
Retool-like solutions are great for their simplicity and flexibility, but they can also be limited in different ways compared to frameworks like React/Vue.
24+
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.
2525

26-
Lowcoder wants to take a step forward. More specifically, Lowcoder is
27-
- An all-in-one IDE to create internal or customer-facing apps.
26+
Lowcoder wants to take a step forward. More specifically, Lowcoder is:
27+
- An all-in-one IDE to create internal or customer-facing (external) apps.
2828
- A place to create, build and share building blocks of web applications.
29-
- A domain-specific language that UI-configurable block is the first-class citizen.
29+
- The tool and community to support your business, and lower the cost and time to develop interactive applications.
30+
- The only platform to embed Lowcode Apps natively in Websites (no iFrame!)
31+
- The only platform where you can build your own Meeting Tool - like Teams, Zoom or Google Meets, - just in the Lowcode way.
3032

3133
## 🪄 Features
32-
- **Visual UI builder** with 50+ built-in components.
34+
- **Visual UI builder** with 50+ built-in components. Save 90% of time to build apps.
3335
- **Modules** for reusable (!) component sets in the UI builder.
34-
- **Embed Lowcoder Apps as native React component** instead of iFrame (!). [Demo](https://github.com/lowcoder-org/lowcoder-sdk-demo)
36+
- **Embed Lowcoder Apps as native parts of any Website** instead of iFrame (!). [Demo](https://github.com/lowcoder-org/lowcoder-sdk-demo)
37+
- **Video Meeting Components** to create your own individual Web-Meeting tool.
3538
- **Query Library** for reusable data queries of your data sources.
3639
- **Custom components** to develop own components and use them in the UI builder.
3740
- **Native Data connections** to PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, REST API, SMTP, etc.
41+
- **Stream Data connections** to Websockets for realtime data updates & collaboration
3842
- **JavaScript supported everywhere** to transform data, control components, etc.
3943
- **Role-based access control (RBAC)** for granular permission management.
4044
- **Auto-saved and restorable history** for release and version control.
4145
- **App Themes and Theme Editor** to precisely align with your company's brand guidelines.
4246

43-
- **Self Hosting** to use Lowcoder in your internal company network.
47+
- **Self Hosting** to use Lowcoder in your internal company network, even behind the firewall.
4448
- **Free Community Cloud** to start within a minute and build your first Apps. [Start here](https://app.lowcoder.cloud)
4549

4650
## 🏆 Comparisons
51+
### Lowcoder vs Teams, Google Meets, Zoom
52+
- build a Meeting tool with peace in mind. Blue buttons - ok. Red corners or circle Videostream - ok too.
53+
- embedd applications in your Video-Meetings, so attendees can enjoy collaborative "anything". From shopping to working and gaming...
54+
### Lowcoder vs Powerapps
55+
- build a apps way faster than in Power Apps. Save up to 50& of the time at least.
56+
- Use self-hosting to keep all apps and data under your control for example at the own baremetals.
4757
### Lowcoder vs Retool
4858
- Lowcoder is open-source. You don't need to worry about vendor lock-in or being stuck with an outdated version of the software.
49-
- In Lowcoder, developers can create and use their own components instead of depending on official updates.
59+
- In Lowcoder, developers can build truly responsive apps - not as cumbersome as the "Desktop / Mobile switch" in Retool
5060
- Lowcoder is free and you can contribute!
5161
- The EE Version of Lowcoder comes with a much better pricing model, so you have no "per-user costs".
5262
### Lowcoder vs Appsmith, Tooljet
@@ -55,15 +65,17 @@ Lowcoder wants to take a step forward. More specifically, Lowcoder is
5565
- In Lowcoder, you can reuse common structures when building apps with modules and query library features.
5666
### Lowcoder vs Mendix, Outsystems, Pega
5767
- Lowcoder is modern. The codebase is fresh and uses modern standards.
58-
- Lowcoder Apps do not need a compile and deployment. Just publish and use.
68+
- Lowcoder Apps do not need a compile and deployment. Just publish and use. Within seconds!
5969
- Lowcoder Apps can get embedded natively in websites and apps, even in mobile apps.
6070
### Lowcoder vs internal Tool platforms
6171
- Lowcoder supports internal tools like admin panels perfectly, but also customer-facing apps can get developed and published.
6272
- The Lowcoder UI builder is straightforward and better to use than Bubble.
6373
- App release cycles and updates can be done nearly daily without service downtimes for customers and users.
6474

75+
6576
## 👐 Support and Community
6677
If you have any questions, please feel free to contact us or share them with our community. Our team is here ready to help.
78+
And we mean it... Day by day!
6779

6880
📮 Best way is to chat with us on [Discord](https://discord.gg/qMG9uTmAx2)
6981

@@ -72,10 +84,16 @@ If you have any questions, please feel free to contact us or share them with our
7284
🔎 Submit an issue here on [GitHub](https://github.com/lowcoder-org/lowcoder/issues)
7385

7486
## 💻 Deployment Options
75-
You can access Lowcoder from [cloud-hosted version](https://www.lowcoder.cloud/) at any time, or use the following resources for deploying Lowcoder on different platforms:
76-
- [Docker](docs/self-hosting/README.md)
87+
You can access Lowcoder from [cloud-hosted version](https://app.lowcoder.cloud/) at any time, or use the following resources for deploying Lowcoder on different platforms:
88+
- [Docker](https://docs.lowcoder.cloud/lowcoder-documentation/setup-and-run/self-hosting)
7789

7890
## 💪 Contributing
7991
- Language support: If you have experience with a language that isn't currently supported by our product, send us a pull request.
8092
- Create and share components or demos: If you've created something that might be useful to others, add the link here.
81-
- [Frontend contributing guide](https://github.com/lowcoder-org/lowcoder/tree/develop/client)
93+
- [Frontend contributing guide](https://github.com/lowcoder-org/lowcoder/tree/main/client)
94+
95+
## 🥇 Sponsors
96+
Accelerate the growth of Lowcoder and unleash its potential with your Sponsorship – together, we're shaping the future of Lowcode for everyone!
97+
[Be a Sponsor](https://github.com/sponsors/lowcoder-org)
98+
99+
Like ... @CHSchuepfer. Thank you very much!

app.json

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
{
22
"name": "lowcoder",
3-
"description": "Lowcoder is a developer-friendly open-source low code platform to build internal apps within minutes.",
3+
"description": "An all-in-one IDE to create internal or customer-facing apps. · Visual UI builder with 50+ built-in components",
44
"repository": "https://github.com/lowcoder-org/lowcoder",
5-
"logo": "https://cdn-files.openblocks.dev/logo.png",
5+
"logo": "https://lowcoder.cloud/images/webclip.png",
66
"keywords": [
7-
"low code",
8-
"develop tool"
7+
"LowCode",
8+
"Low code",
9+
"develop tool",
10+
"Fast Application Development",
11+
"Rapid development",
12+
"Collaboration tool",
13+
"Video conferencing"
914
],
1015
"stack": "container",
1116
"formation": {

client/.yarnrc.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
nodeLinker: node-modules
22

3-
npmRegistryServer: "https://registry.npmmirror.com"
3+
npmRegistryServer: "https://registry.npmjs.org"
44

55
plugins:
66
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs

client/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.1.5
1+
2.2.0

client/config/test/jest.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from "node:path";
2-
import { buildVars } from "lowcoder-dev-utils/buildVars.js";
3-
import { currentDirName } from "lowcoder-dev-utils/util.js";
2+
import { buildVars } from "../../packages/lowcoder-dev-utils/buildVars.js";
3+
import { currentDirName } from "../../packages/lowcoder-dev-utils/util.js";
44

55
const globals = {};
66
buildVars.forEach(({ name, defaultValue }) => {

client/package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
{
2-
"name": "taco-fe",
3-
"version": "0.1.0",
2+
"name": "lowcoder-root",
3+
"version": "2.2.0",
44
"type": "module",
55
"private": true,
66
"workspaces": [
7-
"packages/*"
7+
"packages/*",
8+
"packages/lowcoder-dev-utils"
89
],
910
"engines": {
1011
"node": "^14.18.0 || >=16.0.0"
@@ -17,7 +18,8 @@
1718
"test": "jest && yarn workspace lowcoder-comps test",
1819
"prepare": "yarn workspace lowcoder prepare",
1920
"build:core": "yarn workspace lowcoder-core build",
20-
"test:core": "yarn workspace lowcoder-core test"
21+
"test:core": "yarn workspace lowcoder-core test",
22+
"lint": "eslint . --fix"
2123
},
2224
"devDependencies": {
2325
"@babel/preset-env": "^7.20.2",

client/packages/create-lowcoder-plugin/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { spawn } from "cross-spawn";
55
import { writeFileSync, existsSync } from "node:fs";
66
import chalk from "chalk";
77
import { createCommand } from "commander";
8-
import { readJson, currentDirName } from "lowcoder-dev-utils/util.js";
8+
import { readJson, currentDirName } from "../lowcoder-dev-utils/util.js";
99

1010
const currentDir = currentDirName(import.meta.url);
1111
const pkg = readJson(path.resolve(currentDir, "./package.json"));

client/packages/lowcoder-cli/config/paths.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from "node:path";
22
import fs from "node:fs";
3-
import { currentDirName } from "lowcoder-dev-utils/util.js";
3+
import { currentDirName } from "../../lowcoder-dev-utils/util.js";
44

55
const currentDir = currentDirName(import.meta.url);
66
const appDirectory = fs.realpathSync(process.cwd());

client/packages/lowcoder-cli/config/vite.config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import react from "@vitejs/plugin-react";
22
import svgrPlugin from "vite-plugin-svgr";
33
import global from "rollup-plugin-external-globals";
4-
import { buildVars } from "lowcoder-dev-utils/buildVars.js";
4+
import { buildVars } from "../../lowcoder-dev-utils/buildVars.js";
55
import injectCss from "vite-plugin-css-injected-by-js";
6-
import { getLibNames, getAllLibGlobalVarNames } from "lowcoder-dev-utils/external.js";
6+
import { getLibNames, getAllLibGlobalVarNames } from "../../lowcoder-dev-utils/external.js";
77
import paths from "./paths.js";
88
import { defineConfig } from "vite";
9-
import { readJson } from "lowcoder-dev-utils/util.js";
9+
import { readJson } from "../../lowcoder-dev-utils/util.js";
1010

1111
const isProduction = process.env.NODE_ENV === "production";
1212
const packageJson = readJson(paths.appPackageJson);

client/packages/lowcoder-comps/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-comps",
3-
"version": "0.0.17",
3+
"version": "0.0.21",
44
"type": "module",
55
"license": "MIT",
66
"dependencies": {

client/packages/lowcoder-comps/src/comps/chartComp/chartComp.tsx

Lines changed: 69 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
withViewFn,
2828
ThemeContext,
2929
chartColorPalette,
30-
loadScript,
3130
} from "lowcoder-sdk";
3231
import { getEchartsLocale, trans } from "i18n/comps";
3332
import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig";
@@ -49,7 +48,13 @@ let ChartTmpComp = (function () {
4948
ChartTmpComp = withViewFn(ChartTmpComp, (comp) => {
5049
const apiKey = comp.children.mapApiKey.getView();
5150
const mode = comp.children.mode.getView();
52-
const onEvent = comp.children.onEvent.getView();
51+
const mapCenterPosition = {
52+
lng: comp.children.mapCenterLng.getView(),
53+
lat: comp.children.mapCenterLat.getView(),
54+
}
55+
const mapZoomlevel = comp.children.mapZoomLevel.getView();
56+
const onUIEvent = comp.children.onUIEvent.getView();
57+
const onMapEvent = comp.children.onMapEvent.getView();
5358

5459
const echartsCompRef = useRef<ReactECharts | null>();
5560
const [chartSize, setChartSize] = useState<ChartSize>();
@@ -81,15 +86,15 @@ ChartTmpComp = withViewFn(ChartTmpComp, (comp) => {
8186
//log.log("chart select change", param);
8287
if (param.fromAction === "select") {
8388
comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option)));
84-
onEvent("select");
89+
onUIEvent("select");
8590
} else if (param.fromAction === "unselect") {
8691
comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option)));
87-
onEvent("unselect");
92+
onUIEvent("unselect");
8893
}
8994
});
9095
// unbind
9196
return () => echartsCompInstance?.off("selectchanged");
92-
}, [mode, onEvent]);
97+
}, [mode, onUIEvent]);
9398

9499
const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren);
95100
const option = useMemo(() => {
@@ -103,36 +108,48 @@ ChartTmpComp = withViewFn(ChartTmpComp, (comp) => {
103108
return mapScriptLoaded || window?.google;
104109
}, [mapScriptLoaded])
105110

106-
const loadGoogleMapsData = () => {
107-
setTimeout(() => {
108-
const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance();
109-
if (!echartsCompInstance) {
110-
return _.noop;
111-
}
111+
const loadGoogleMapData = () => {
112+
const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance();
113+
if (!echartsCompInstance) {
114+
return _.noop;
115+
}
112116

113-
let mapInstance = undefined;
114-
mapInstance = echartsCompInstance?.getModel()?.getComponent("gmap")?.getGoogleMap();
115-
comp.dispatch(changeChildAction("mapInstance", mapInstance));
116-
}, 500)
117+
comp.children.mapInstance.dispatch(changeValueAction(echartsCompInstance))
118+
onMapEvent('mapReady')
117119
}
118120

121+
const handleOnMapScriptLoad = () => {
122+
setMapScriptLoaded(true);
123+
loadGoogleMapData();
124+
}
125+
119126
useEffect(() => {
120127
if( mode !== 'map') {
121-
comp.dispatch(changeChildAction("mapInstance", undefined));
128+
comp.children.mapInstance.dispatch(changeValueAction(undefined))
122129
return;
123130
}
124131

125132
const gMapScript = loadGoogleMapsScript(apiKey);
126133
if(isMapScriptLoaded) {
127-
loadGoogleMapsData();
134+
handleOnMapScriptLoad();
128135
return;
129136
}
130-
gMapScript.addEventListener('load', function () {
131-
setMapScriptLoaded(true);
132-
loadGoogleMapsData();
133-
});
137+
gMapScript.addEventListener('load', handleOnMapScriptLoad);
138+
return () => {
139+
gMapScript.removeEventListener('load', handleOnMapScriptLoad);
140+
}
134141
}, [mode, apiKey, option])
135142

143+
useEffect(() => {
144+
if(mode !== 'map') return;
145+
onMapEvent('centerPositionChange');
146+
}, [mode, mapCenterPosition.lat, mapCenterPosition.lng])
147+
148+
useEffect(() => {
149+
if(mode !== 'map') return;
150+
onMapEvent('zoomLevelChange');
151+
}, [mode, mapZoomlevel])
152+
136153
return (
137154
<ReactResizeDetector
138155
onResize={(w, h) => {
@@ -287,8 +304,38 @@ ChartComp = withMethodExposing(ChartComp, [
287304
name: "getMapInstance",
288305
},
289306
execute: (comp) => {
290-
return comp.children.mapInstance.getView()
307+
return new Promise(resolve => {
308+
let intervalCount = 0;
309+
const mapInstanceInterval = setInterval(() => {
310+
const instance = comp.children.mapInstance.getView();
311+
const mapInstance = instance?.getModel()?.getComponent("gmap")?.getGoogleMap()
312+
if(mapInstance || intervalCount === 10) {
313+
clearInterval(mapInstanceInterval)
314+
resolve(mapInstance)
315+
}
316+
intervalCount++;
317+
}, 1000);
318+
})
319+
}
320+
},
321+
{
322+
method: {
323+
name: "getMapZoomLevel",
291324
},
325+
execute: (comp) => {
326+
return comp.children.mapZoomLevel.getView();
327+
}
328+
},
329+
{
330+
method: {
331+
name: "getMapCenterPosition",
332+
},
333+
execute: (comp) => {
334+
return Promise.resolve({
335+
lng: comp.children.mapCenterLng.getView(),
336+
lat: comp.children.mapCenterLat.getView(),
337+
});
338+
}
292339
},
293340
])
294341

0 commit comments

Comments
 (0)