Skip to content

Commit 2ef974a

Browse files
Merge branch 'dev' into feature-themes-for-components
2 parents 9fa6e62 + 33cf34b commit 2ef974a

File tree

75 files changed

+1964
-490
lines changed

Some content is hidden

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

75 files changed

+1964
-490
lines changed

.gitignore

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ client/packages/lowcoder-plugin-demo/.yarn/install-state.gz
1010
client/packages/lowcoder-plugin-demo/yarn.lock
1111
client/packages/lowcoder-plugin-demo/.yarn/cache/@types-node-npm-16.18.68-56f72825c0-094ae9ed80.zip
1212
application-dev.yml
13-
server/api-service/lowcoder-server/src/main/resources/application-lowcoder.yml
14-
server/api-service/lowcoder-server/src/main/resources/application-debug.yaml
13+
application-lowcoder.yml
14+
application-debug.yaml
15+
application-dev-localhost.yaml
1516
.vscode/settings.json
16-
.vscode/launch.json
17-
server/api-service/lowcoder-server/src/main/resources/application-dev-localhost.yaml
17+
.vscode/launch.json

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": "2.4.6",
3+
"version": "2.4.7",
44
"type": "module",
55
"license": "MIT",
66
"dependencies": {

client/packages/lowcoder-sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-sdk",
3-
"version": "2.4.3",
3+
"version": "2.4.4",
44
"type": "module",
55
"files": [
66
"src",

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ const StyledDivider = styled(Divider) <IProps>`
5353
padding: ${(props) => props.$style.padding};
5454
border-radius:${props=>props.$style.radius};
5555
border-top: ${(props) => (props.$style.borderWidth && props.$style.borderWidth != "0px" ? props.$style.borderWidth : "1px")} ${(props) => props.$style.borderStyle} ${(props) => props.$style.border};
56-
""
5756
.ant-divider-inner-text::before, .ant-divider-inner-text::after {
5857
border-block-start: ${(props) => (props.$style.borderWidth && props.$style.borderWidth != "0px" ? props.$style.borderWidth : "1px")} ${(props) => (props.dashed ? "dashed" : "solid")} ${(props) => props.$style.border} !important;
5958
border-block-start-color: inherit;
@@ -65,6 +64,12 @@ const StyledDivider = styled(Divider) <IProps>`
6564
border-top-color: ${(props) => props.$style.color};
6665
color: ${(props) => props.$style.text};
6766
}
67+
&.ant-divider-horizontal.ant-divider-with-text::before,
68+
&.ant-divider-horizontal.ant-divider-with-text::after {
69+
border-top-color: ${(props) => props.$style.color};
70+
border-radius:${props=>props.$style.radius};
71+
border-top: ${(props) => (props.$style.borderWidth && props.$style.borderWidth != "0px" ? props.$style.borderWidth : "1px")} ${(props) => props.$style.borderStyle} ${(props) => props.$style.border};
72+
}
6873
`;
6974

7075
const childrenMap = {

client/packages/lowcoder/src/comps/comps/layout/navLayout.tsx

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { EditorContainer, EmptyContent } from "pages/common/styledComponent";
1717
import { useCallback, useEffect, useMemo, useState } from "react";
1818
import styled from "styled-components";
1919
import { isUserViewMode, useAppPathParam } from "util/hooks";
20-
import { StringControl, jsonControl } from "comps/controls/codeControl";
20+
import { BoolCodeControl, StringControl, jsonControl } from "comps/controls/codeControl";
2121
import { styleControl } from "comps/controls/styleControl";
2222
import {
2323
NavLayoutStyle,
@@ -41,6 +41,8 @@ import {
4141
menuItemStyleOptions
4242
} from "./navLayoutConstants";
4343

44+
const { Header } = Layout;
45+
4446
const DEFAULT_WIDTH = 240;
4547
type MenuItemStyleOptionValue = "normal" | "hover" | "active";
4648

@@ -99,10 +101,12 @@ const StyledMenu = styled(AntdMenu)<{
99101
.ant-menu-submenu {
100102
margin: ${(props) => props.$navItemStyle?.margin};
101103
width: ${(props) => props.$navItemStyle?.width};
104+
padding: 0;
102105
103106
.ant-menu-submenu-title {
104107
width: 100%;
105108
height: auto !important;
109+
max-height: 100%;
106110
background-color: ${(props) => props.$navItemStyle?.background};
107111
color: ${(props) => props.$navItemStyle?.text};
108112
border-radius: ${(props) => props.$navItemStyle?.radius} !important;
@@ -190,7 +194,8 @@ let NavTmpLayout = (function () {
190194
width: withDefault(StringControl, DEFAULT_WIDTH),
191195
backgroundImage: withDefault(StringControl, ""),
192196
mode: dropdownControl(ModeOptions, "inline"),
193-
navStyle: withDefault(styleControl(NavLayoutStyle), defaultStyle),
197+
collapse: BoolCodeControl,
198+
navStyle: withDefault(styleControl(NavLayoutStyle), {...defaultStyle, padding: '1px'}),
194199
navItemStyle: withDefault(styleControl(NavLayoutItemStyle), defaultStyle),
195200
navItemHoverStyle: withDefault(styleControl(NavLayoutItemHoverStyle), {}),
196201
navItemActiveStyle: withDefault(styleControl(NavLayoutItemActiveStyle), {}),
@@ -226,6 +231,9 @@ let NavTmpLayout = (function () {
226231
label: trans("labelProp.position"),
227232
radioButton: true
228233
})}
234+
{ children.collapse.propertyView({
235+
label: trans("labelProp.collapse"),
236+
})}
229237
{children.backgroundImage.propertyView({
230238
label: `Background Image`,
231239
placeholder: 'https://temp.im/350x400',
@@ -266,6 +274,7 @@ NavTmpLayout = withViewFn(NavTmpLayout, (comp) => {
266274
const items = comp.children.items.getView();
267275
const navWidth = comp.children.width.getView();
268276
const navMode = comp.children.mode.getView();
277+
const navCollapse = comp.children.collapse.getView();
269278
const navStyle = comp.children.navStyle.getView();
270279
const navItemStyle = comp.children.navItemStyle.getView();
271280
const navItemHoverStyle = comp.children.navItemHoverStyle.getView();
@@ -547,32 +556,45 @@ NavTmpLayout = withViewFn(NavTmpLayout, (comp) => {
547556
backgroundStyle = `center / cover url('${backgroundImage}') no-repeat, ${backgroundStyle}`;
548557
}
549558

559+
let navMenu = (
560+
<StyledMenu
561+
items={menuItems}
562+
mode={navMode}
563+
style={{
564+
height: `calc(100% - ${getVerticalMargin(navStyle.margin.split(' '))})`,
565+
width: `calc(100% - ${getHorizontalMargin(navStyle.margin.split(' '))})`,
566+
borderRight: navMode !== 'horizontal' ? `1px solid ${navStyle.border}` : 'none',
567+
borderBottom: navMode === 'horizontal' ? `1px solid ${navStyle.border}` : 'none',
568+
borderRadius: navStyle.radius,
569+
color: navStyle.text,
570+
margin: navStyle.margin,
571+
padding: navStyle.padding,
572+
background: backgroundStyle,
573+
flex: 1,
574+
minWidth: 0,
575+
}}
576+
defaultOpenKeys={defaultOpenKeys}
577+
selectedKeys={[selectedKey]}
578+
$navItemStyle={{
579+
width: navMode === 'horizontal' ? 'auto' : `calc(100% - ${getHorizontalMargin(navItemStyle.margin.split(' '))})`,
580+
...navItemStyle,
581+
}}
582+
$navItemHoverStyle={navItemHoverStyle}
583+
$navItemActiveStyle={navItemActiveStyle}
584+
/>
585+
);
586+
550587
let content = (
551588
<Layout>
552-
<StyledSide theme="light" width={navWidth}>
553-
<StyledMenu
554-
items={menuItems}
555-
mode={navMode}
556-
style={{
557-
height: `calc(100% - ${getVerticalMargin(navStyle.margin.split(' '))})`,
558-
width: `calc(100% - ${getHorizontalMargin(navStyle.margin.split(' '))})`,
559-
borderRight: `1px solid ${navStyle.border}`,
560-
borderRadius: navStyle.radius,
561-
color: navStyle.text,
562-
margin: navStyle.margin,
563-
padding: navStyle.padding,
564-
background: backgroundStyle,
565-
}}
566-
defaultOpenKeys={defaultOpenKeys}
567-
selectedKeys={[selectedKey]}
568-
$navItemStyle={{
569-
width: `calc(100% - ${getHorizontalMargin(navItemStyle.margin.split(' '))})`,
570-
...navItemStyle,
571-
}}
572-
$navItemHoverStyle={navItemHoverStyle}
573-
$navItemActiveStyle={navItemActiveStyle}
574-
/>
575-
</StyledSide>
589+
{navMode === 'horizontal' ? (
590+
<Header style={{ display: 'flex', alignItems: 'center', padding: 0 }}>
591+
{ navMenu }
592+
</Header>
593+
) : (
594+
<StyledSide theme="light" width={navWidth} collapsed={navCollapse}>
595+
{navMenu}
596+
</StyledSide>
597+
)}
576598
<MainContent>{pageView}</MainContent>
577599
</Layout>
578600
);

client/packages/lowcoder/src/comps/comps/layout/navLayoutConstants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { trans } from "i18n";
33
export const ModeOptions = [
44
{ label: trans("navLayout.modeInline"), value: "inline" },
55
{ label: trans("navLayout.modeVertical"), value: "vertical" },
6+
{ label: trans("navLayout.modeHorizontal"), value: "horizontal" },
67
] as const;
78

89
export const DataOption = {

client/packages/lowcoder/src/comps/generators/withSelectedMultiContext.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,10 @@ export function withSelectedMultiContext<TCtor extends MultiCompConstructor>(
9696
comp = comp.reduce(wrapChildAction(COMP_KEY, newAction));
9797
} else if (
9898
!action.editDSL
99-
&& isCustomAction<ModuleReadyAction>(action, "moduleReady")
100-
&& action.path[0] === MAP_KEY
99+
&& (
100+
isCustomAction<ModuleReadyAction>(action, "moduleReady")
101+
|| isCustomAction<LazyCompReadyAction>(action, "LazyCompReady")
102+
) && action.path[0] === MAP_KEY
101103
) {
102104
comp = super.reduce(action);
103105
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ export const en = {
230230
"text": "Label",
231231
"tooltip": "Tooltip",
232232
"position": "Position",
233+
"collapse": "Collapse",
233234
"left": "Left",
234235
"right": "Right",
235236
"top": "Top",
@@ -3490,6 +3491,7 @@ export const en = {
34903491
"mode": "Mode",
34913492
"modeInline": "Inline",
34923493
"modeVertical": "Vertical",
3494+
"modeHorizontal": "Horizontal",
34933495
"width": "Width",
34943496
"widthTooltip": "Pixel or Percentage, e.g. 520, 60%",
34953497
"navStyle": "Menu Style",

client/packages/lowcoder/src/layout/compSelectionWrapper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ function getLineStyle(
8989

9090
return `
9191
border: ${GRID_ITEM_BORDER_WIDTH}px ${borderStyle} ${borderColor};
92-
padding: ${isHidden && !isSelected ? 0 : padding[1] - GRID_ITEM_BORDER_WIDTH}px;
92+
padding: ${isHidden || !isSelected ? 0 : padding[1] - GRID_ITEM_BORDER_WIDTH}px;
9393
padding-left: ${padding[0] - GRID_ITEM_BORDER_WIDTH}px;
9494
padding-right: ${padding[0] - GRID_ITEM_BORDER_WIDTH}px;
9595
`;

client/packages/lowcoder/src/layout/gridItem.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ export function GridItem(props: GridItemProps) {
141141
onDrag={onDrag}
142142
onDragEnd={onDragEnd}
143143
onMouseDown={(e) => {
144-
e.stopPropagation();
144+
if (isDraggable) {
145+
e.stopPropagation();
146+
}
145147
const event = new MouseEvent("mousedown");
146148
document.dispatchEvent(event);
147149
}}
@@ -445,6 +447,7 @@ export function GridItem(props: GridItemProps) {
445447
pos,
446448
props.name,
447449
props.autoHeight,
450+
props.hidden,
448451
Boolean(draggingUtils.isDragging())
449452
),
450453
opacity: layoutHide ? 0 : undefined,

client/packages/lowcoder/src/layout/utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ export function setTransform(
204204
{top, left, width, height }: Position,
205205
name ?: string,
206206
autoHeight?: boolean,
207+
hidden?: boolean,
207208
isDragging?: boolean,
208209
): Record<string, any> {
209210
// Replace unitless items with px
@@ -212,7 +213,7 @@ export function setTransform(
212213
return /chart/i.test(str);
213214
}
214215
let updatedHeight = 'auto';
215-
if (isDragging || !autoHeight || (name && containsChart(name))) {
216+
if (isDragging || !autoHeight || hidden || (name && containsChart(name))) {
216217
updatedHeight = `${height}px`;
217218
}
218219

client/packages/lowcoder/src/pages/ApplicationV2/HomeLayout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,8 @@ export function HomeLayout(props: HomeLayoutProps) {
359359
const resList: HomeRes[] = displayElements
360360
.filter((e) =>
361361
searchValue
362-
? e.name.toLocaleLowerCase().includes(searchValue.toLocaleLowerCase()) ||
363-
e.createBy.toLocaleLowerCase().includes(searchValue.toLocaleLowerCase())
362+
? e.name?.toLocaleLowerCase().includes(searchValue?.toLocaleLowerCase()) ||
363+
e.createBy?.toLocaleLowerCase().includes(searchValue?.toLocaleLowerCase())
364364
: true
365365
)
366366
.filter((e) => {

client/packages/lowcoder/src/pages/editor/AppEditor.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,16 @@ export default function AppEditor() {
9595
dispatch(fetchQueryLibraryDropdown());
9696
}
9797
}, [dispatch, applicationId, paramViewMode]);
98-
99-
useEffect(() => {
100-
if (!currentUser?.id) return;
98+
99+
const fetchJSDataSourceByApp = () => {
101100
DatasourceApi.fetchJsDatasourceByApp(applicationId).then((res) => {
102101
res.data.data.forEach((i) => {
103102
registryDataSourcePlugin(i.type, i.id, i.pluginDefinition);
104103
});
105104
setIsDataSourcePluginRegistered(true);
106105
});
107106
dispatch(setShowAppSnapshot(false));
108-
}, [applicationId, dispatch, currentUser]);
107+
};
109108

110109
useEffect(() => {
111110
if (!fetchOrgGroupsFinished) {
@@ -129,6 +128,7 @@ export default function AppEditor() {
129128
},
130129
});
131130
setAppInfo(info);
131+
fetchJSDataSourceByApp();
132132
},
133133
})
134134
);

server/api-service/lowcoder-domain/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@
262262
<artifactId>jaxb-runtime</artifactId>
263263
</dependency>
264264
<!-- oss-->
265+
<dependency>
266+
<groupId>com.github.f4b6a3</groupId>
267+
<artifactId>uuid-creator</artifactId>
268+
<version>5.2.0</version>
269+
</dependency>
265270
</dependencies>
266271

267272
<build>

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/model/Application.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
import static org.lowcoder.domain.application.ApplicationUtil.getContainerSizeFromDSL;
77
import static org.lowcoder.domain.application.ApplicationUtil.getDependentModulesFromDsl;
88

9-
import java.util.Collections;
10-
import java.util.Map;
11-
import java.util.Optional;
12-
import java.util.Set;
9+
import java.util.*;
1310
import java.util.function.Supplier;
1411

12+
import com.github.f4b6a3.uuid.UuidCreator;
13+
import lombok.Getter;
1514
import lombok.NoArgsConstructor;
1615
import lombok.Setter;
1716
import lombok.experimental.SuperBuilder;
@@ -37,7 +36,8 @@
3736
@SuperBuilder
3837
@NoArgsConstructor
3938
public class Application extends HasIdAndAuditing {
40-
39+
@Getter
40+
private String gid;
4141
private String organizationId;
4242
private String name;
4343
private Integer applicationType;
@@ -64,6 +64,7 @@ public Application(
6464
@JsonProperty("publicToMarketplace") Boolean publicToMarketplace,
6565
@JsonProperty("agencyProfile") Boolean agencyProfile
6666
) {
67+
this.gid = UuidCreator.getTimeOrderedEpoch().toString();
6768
this.organizationId = organizationId;
6869
this.name = name;
6970
this.applicationType = applicationType;

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,37 @@ public interface ApplicationRepository extends ReactiveMongoRepository<Applicati
2525
@Query(fields = "{ publishedApplicationDSL : 0 , editingApplicationDSL : 0 }")
2626
Mono<Application> findById(@Nonnull String id);
2727

28+
@Query(fields = "{ publishedApplicationDSL : 0 , editingApplicationDSL : 0 }")
29+
Flux<Application> findByGid(@Nonnull String gid);
30+
2831
Mono<Long> countByOrganizationIdAndApplicationStatus(String organizationId, ApplicationStatus applicationStatus);
2932

3033
@Query("{$or : [{'publishedApplicationDSL.queries.datasourceId':?0},{'editingApplicationDSL.queries.datasourceId':?0}]}")
3134
Flux<Application> findByDatasourceId(String datasourceId);
3235

3336
Flux<Application> findByIdIn(Collection<String> ids);
37+
Flux<Application> findByGidIn(Collection<String> ids);
3438

3539
Flux<Application> findByCreatedByAndIdIn(String userId, Collection<String> ids);
40+
Flux<Application> findByCreatedByAndGidIn(String userId, Collection<String> gids);
3641

3742
/**
3843
* Filter public applications from list of supplied IDs
3944
*/
4045
Flux<Application> findByPublicToAllIsTrueAndIdIn(Collection<String> ids);
46+
Flux<Application> findByPublicToAllIsTrueAndGidIn(Collection<String> gids);
4147

4248
/**
4349
* Filter marketplace applications from list of supplied IDs
4450
*/
4551
Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndIdIn(Collection<String> ids);
52+
Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndGidIn(Collection<String> ids);
4653

4754
/**
4855
* Filter agency applications from list of supplied IDs
4956
*/
5057
Flux<Application> findByPublicToAllIsTrueAndAgencyProfileIsTrueAndIdIn(Collection<String> ids);
58+
Flux<Application> findByPublicToAllIsTrueAndAgencyProfileIsTrueAndGidIn(Collection<String> ids);
5159

5260
/**
5361
* Find all marketplace applications

0 commit comments

Comments
 (0)