Skip to content

Commit cf3a59e

Browse files
author
Aqib Mirza
committed
Merge branch 'main' of https://github.com/aaron1604/lowcoder into feat/margin-padding
2 parents 33f2ea7 + 45d3dfb commit cf3a59e

File tree

60 files changed

+1069
-327
lines changed

Some content is hidden

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

60 files changed

+1069
-327
lines changed

.github/workflows/sonarcloud.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ jobs:
2121
- uses: actions/checkout@v3
2222
with:
2323
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
24+
ref: ${{ github.event.pull_request.head.sha }}
2425
- name: Build Java
2526
run: |
2627
mvn clean compile -DskipTests -f ./server/api-service/pom.xml

README.md

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,40 +30,50 @@ Lowcoder wants to take a step forward. More specifically, Lowcoder is
3030

3131
## 🪄 Features
3232
- **Visual UI builder** with 50+ built-in components.
33-
- **Module and Query Library** for reusable components and queries in the UI builder.
34-
- **Custom components** to share through React and Lowcoder SDK (instead of iFrame).
35-
- **Native connections** to PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, REST API, SMTP, etc.
33+
- **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)
35+
- **Query Library** for reusable data queries of your data sources.
36+
- **Custom components** to develop own components and use them in the UI builder.
37+
- **Native Data connections** to PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, REST API, SMTP, etc.
3638
- **JavaScript supported everywhere** to transform data, control components, etc.
37-
- **Embed Lowcoder pages as a React component** (instead of iFrame). [Demo](https://github.com/lowcoder-org/lowcoder-sdk-demo)
3839
- **Role-based access control (RBAC)** for granular permission management.
3940
- **Auto-saved and restorable history** for release and version control.
40-
- **DIY app themes** to precisely align with your company's content.
41-
- **Audit logs** to track activities and ensure compliance.
41+
- **App Themes and Theme Editor** to precisely align with your company's brand guidelines.
42+
43+
- **Self Hosting** to use Lowcoder in your internal company network.
44+
- **Free Community Cloud** to start within a minute and build your first Apps. [Start here](https://app.lowcoder.cloud)
4245

4346
## 🏆 Comparisons
4447
### Lowcoder vs Retool
4548
- Lowcoder is open-source. You don't need to worry about vendor lock-in or being stuck with an outdated version of the software.
4649
- In Lowcoder, developers can create and use their own components instead of depending on official updates.
47-
- Lowcoder supports left menu navigation (like most sites do). Retool has header navigation only.
50+
- Lowcoder is free and you can contribute!
51+
- The EE Version of Lowcoder comes with a much better pricing model, so you have no "per-user costs".
4852
### Lowcoder vs Appsmith, Tooljet
4953
- Lowcoder has more components and richer configuration than Appsmith and Tooljet.
5054
- In Lowcoder, you can choose auto-height or fixed-height mode for your components, while Appsmith supports fixed-height mode only.
5155
- In Lowcoder, you can reuse common structures when building apps with modules and query library features.
56+
### Lowcoder vs Mendix, Outsystems, Pega
57+
- 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.
59+
- Lowcoder Apps can get embedded natively in websites and apps, even in mobile apps.
60+
### Lowcoder vs internal Tool platforms
61+
- Lowcoder supports internal tools like admin panels perfectly, but also customer-facing apps can get developed and published.
62+
- The Lowcoder UI builder is straightforward and better to use than Bubble.
63+
- App release cycles and updates can be done nearly daily without service downtimes for customers and users.
5264

5365
## 👐 Support and Community
54-
If you have any questions, please feel free to contact us or share with our community. Our team is here ready to help.
66+
If you have any questions, please feel free to contact us or share them with our community. Our team is here ready to help.
5567

56-
📮 Chat with us on [Discord](https://discord.gg/vByQwGT2Yx)
68+
📮 Best way is to chat with us on [Discord](https://discord.gg/qMG9uTmAx2)
5769

58-
📑 Search for solutions in our [Documentation](docs)
70+
📑 Search for solutions in our [Documentation](https://docs.lowcoder.cloud/lowcoder-documentation/)
5971

6072
🔎 Submit an issue here on [GitHub](https://github.com/lowcoder-org/lowcoder/issues)
6173

6274
## 💻 Deployment Options
6375
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:
6476
- [Docker](docs/self-hosting/README.md)
65-
- [AWS AMI](docs/self-hosting/aws-ami.md) (Coming Soon)
66-
- [DigitalOcean](docs/self-hosting/digitalocean.md) (Coming Soon)
6777

6878
## 💪 Contributing
6979
- Language support: If you have experience with a language that isn't currently supported by our product, send us a pull request.

client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"eslint-plugin-only-ascii@^0.0.0": "patch:eslint-plugin-only-ascii@npm%3A0.0.0#./.yarn/patches/eslint-plugin-only-ascii-npm-0.0.0-29e3417685.patch"
7474
},
7575
"dependencies": {
76+
"@lottiefiles/react-lottie-player": "^3.5.3",
7677
"antd-mobile": "^5.28.0",
7778
"chalk": "4",
7879
"number-precision": "^1.6.0",
Lines changed: 4 additions & 0 deletions
Loading

client/packages/lowcoder-design/src/icons/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,4 +285,5 @@ export { ReactComponent as TableCheckedIcon } from "icons/icon-table-checked.svg
285285
export { ReactComponent as TableUnCheckedIcon } from "icons/icon-table-boolean-false.svg";
286286
export { ReactComponent as FileFolderIcon } from "icons/icon-editor-folder.svg";
287287
export { ReactComponent as ExpandIcon } from "icons/icon-expand.svg";
288-
export { ReactComponent as CompressIcon } from "icons/icon-compress.svg"
288+
export { ReactComponent as CompressIcon } from "icons/icon-compress.svg"
289+
export { ReactComponent as TableCellsIcon } from "icons/icon-table-cells.svg" // Added By Aqib Mirza

client/packages/lowcoder/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
"eslint-plugin-only-ascii": "^0.0.0",
121121
"http-proxy-middleware": "^2.0.6",
122122
"lowcoder-dev-utils": "workspace:^",
123-
"rollup-plugin-visualizer": "^5.8.3",
123+
"rollup-plugin-visualizer": "^5.9.2",
124124
"typescript": "^4.8.4",
125125
"vite": "^4.3.9",
126126
"vite-plugin-checker": "^0.5.1",

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export interface ThemeDetail {
4646
chart?: string;
4747
margin?: string;
4848
padding?: string;
49+
gridColumns?: string; //Added By Aqib Mirza
4950
}
5051

5152
export function getThemeDetailName(key: keyof ThemeDetail) {
@@ -66,6 +67,9 @@ export function getThemeDetailName(key: keyof ThemeDetail) {
6667
return trans("style.margin");
6768
case "padding":
6869
return trans("style.padding");
70+
//Added By Aqib Mirza
71+
case "gridColumns":
72+
return trans("themeDetail.gridColumns");
6973
}
7074
return "";
7175
}
@@ -79,6 +83,7 @@ export function isThemeColorKey(key: string) {
7983
case "primarySurface":
8084
case "margin":
8185
case "padding":
86+
case "gridColumns": //Added By Aqib Mirza
8287
return true;
8388
}
8489
return false;
Lines changed: 132 additions & 0 deletions
Loading

client/packages/lowcoder/src/assets/icons/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ export { ReactComponent as DocIcon } from "./view-doc.svg";
1010
export { ReactComponent as TutorialIcon } from "./tutorial.svg";
1111
export { ReactComponent as ShortcutIcon } from "./icon-help-shortcut.svg";
1212

13+
export { ReactComponent as LottieIcon } from "./icon-lottie.svg"; //Added By Aqib Mirza
14+
1315
export { GoogleLoginIcon, GithubLoginIcon, GeneralLoginIcon, EmailLoginIcon };

client/packages/lowcoder/src/components/ColorPicker.tsx

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import _ from "lodash";
22
import { useEffect, useState } from "react";
3-
import { ConfigItem, Radius, Margin, Padding } from "../pages/setting/theme/styledComponents";
3+
import { ConfigItem, Radius, Margin, Padding, GridColumns } from "../pages/setting/theme/styledComponents";
44
import { isValidColor, toHex } from "components/colorSelect/colorUtils";
55
import { ColorSelect } from "components/colorSelect";
66
import { TacoInput } from "components/tacoInput";
7+
import { TableCellsIcon as GridIcon } from "lowcoder-design"; //Added By Aqib Mirza
78

89
import { ExpandIcon, CompressIcon } from "lowcoder-design";
910

@@ -14,6 +15,7 @@ export type configChangeParams = {
1415
chart?: string;
1516
margin?: string;
1617
padding?: string;
18+
gridColumns?: string; //Added By Aqib Mirza
1719
};
1820

1921
type ColorConfigProps = {
@@ -27,6 +29,7 @@ type ColorConfigProps = {
2729
showVarName?: boolean;
2830
margin?: string;
2931
padding?: string;
32+
gridColumns?: string; //Added By Aqib Mirza
3033
};
3134

3235
export default function ColorPicker(props: ColorConfigProps) {
@@ -40,13 +43,15 @@ export default function ColorPicker(props: ColorConfigProps) {
4043
showVarName = true,
4144
margin: defaultMargin,
4245
padding: defaultPadding,
46+
gridColumns: defaultGridColumns, //Added By Aqib Mirza
4347
} = props;
4448
const configChangeWithDebounce = _.debounce(configChange, 0);
4549
const [color, setColor] = useState(defaultColor);
4650
const [radius, setRadius] = useState(defaultRadius);
4751

4852
const [margin, setMargin] = useState(defaultMargin);
4953
const [padding, setPadding] = useState(defaultPadding);
54+
const [gridColumns, setGridColumns] = useState(defaultGridColumns); //Added By Aqib Mirza
5055

5156
const varName = `(${colorKey})`;
5257

@@ -103,6 +108,21 @@ export default function ColorPicker(props: ColorConfigProps) {
103108
configChange({ colorKey, padding: result });
104109
};
105110

111+
//Added By Aqib Mirza
112+
113+
const gridColumnsInputBlur = (gridColumns: string) => {
114+
let result = "";
115+
if (!gridColumns) {
116+
result = "0";
117+
} else {
118+
result = gridColumns;
119+
}
120+
setGridColumns(result);
121+
configChange({ colorKey, gridColumns: result });
122+
};
123+
124+
/////////////////////
125+
106126
useEffect(() => {
107127
if (color && isValidColor(color)) {
108128
configChangeWithDebounce({ colorKey, color });
@@ -125,6 +145,11 @@ export default function ColorPicker(props: ColorConfigProps) {
125145
useEffect(() => {
126146
setPadding(defaultPadding);
127147
}, [defaultPadding]);
148+
// Added By Aqib Mirza
149+
useEffect(() => {
150+
setGridColumns(defaultGridColumns);
151+
}, [defaultGridColumns]);
152+
//////////////////////
128153

129154
return (
130155
<ConfigItem className={props.className}>
@@ -136,7 +161,8 @@ export default function ColorPicker(props: ColorConfigProps) {
136161
</div>
137162
{colorKey !== "borderRadius" &&
138163
colorKey !== "margin" &&
139-
colorKey !== "padding" && (
164+
colorKey !== "padding" &&
165+
colorKey !== "gridColumns" && (
140166
<div className="config-input">
141167
<ColorSelect
142168
changeColor={_.debounce(setColor, 500, {
@@ -153,7 +179,7 @@ export default function ColorPicker(props: ColorConfigProps) {
153179
onKeyUp={(e) => e.nativeEvent.key === "Enter" && colorInputBlur()}
154180
/>
155181
</div>
156-
)}
182+
)}
157183
{colorKey === "borderRadius" && (
158184
<div className="config-input">
159185
<Radius radius={defaultRadius || "0"}>
@@ -203,7 +229,25 @@ export default function ColorPicker(props: ColorConfigProps) {
203229
paddingInputBlur(e.currentTarget.value)
204230
}
205231
/>
206-
</div>
232+
</div>
233+
)}
234+
{colorKey === "gridColumns" && (
235+
<div className="config-input">
236+
<GridColumns gridColumns={defaultGridColumns || "24"}>
237+
<div>
238+
<GridIcon title="" />
239+
</div>
240+
</GridColumns>
241+
<TacoInput
242+
value={gridColumns}
243+
onChange={(e) => setGridColumns(e.target.value)}
244+
onBlur={(e) => gridColumnsInputBlur(e.target.value)}
245+
onKeyUp={(e) =>
246+
e.nativeEvent.key === "Enter" &&
247+
gridColumnsInputBlur(e.currentTarget.value)
248+
}
249+
/>
250+
</div>
207251
)}
208252
</ConfigItem>
209253
);

0 commit comments

Comments
 (0)