Skip to content

Commit af394ac

Browse files
fixed datasrouces, npm plugings, js plugins for public app editor
1 parent 96b90e8 commit af394ac

23 files changed

+275
-204
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export interface CommonSettingResponseData {
2424

2525
export type SetCommonSettingPayload<T = any> = {
2626
orgId: string;
27+
isPublicApp?: boolean;
2728
data: {
2829
key: string;
2930
value: T;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { RecommendedJSLibraryMeta } from "api/jsLibraryApi";
2323
import log from "loglevel";
2424
import { TacoMarkDown } from "components/markdown";
2525
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
26+
import { isPublicApplication } from "@lowcoder-ee/redux/selectors/applicationSelector";
2627

2728
const ModalLabel = styled.div`
2829
display: flex;
@@ -232,12 +233,15 @@ export function JSLibraryModal(props: JSLibraryModalProps) {
232233
const [url, setURL] = useState("");
233234
const [urlError, setURLError] = useState<string | undefined>(undefined);
234235
const [installError, setInstallError] = useState<URLErrorType>(undefined);
236+
const isPublicApp = useSelector(isPublicApplication);
235237

236238
const dispatch = useDispatch();
237239

238240
const recommends = useSelector(recommendJSLibrarySelector);
239241

240242
useEffect(() => {
243+
if (isPublicApp) return;
244+
241245
dispatch(fetchJSLibraryRecommendsAction());
242246
}, [dispatch]);
243247

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { useSelector } from "react-redux";
2626
import { getUser } from "../redux/selectors/usersSelectors";
2727
import DataSourceIcon from "./DataSourceIcon";
2828
import { genRandomKey } from "comps/utils/idGenerator";
29+
import { isPublicApplication } from "@lowcoder-ee/redux/selectors/applicationSelector";
2930

3031
const Wrapper = styled.div<{ $placement: PageType }>`
3132
width: 100%;
@@ -232,6 +233,7 @@ export function ResCreatePanel(props: ResCreateModalProps) {
232233
const [isScrolling, setScrolling] = useState(false);
233234
const [visible, setVisible] = useState(false);
234235

236+
const isPublicApp = useSelector(isPublicApplication);
235237
const user = useSelector(getUser);
236238

237239
const { width, ref } = useResizeDetector({ handleHeight: false });
@@ -289,7 +291,7 @@ export function ResCreatePanel(props: ResCreateModalProps) {
289291
onSelect={onSelect}
290292
/>
291293
<ResButton size={buttonSize} identifier={"js"} onSelect={onSelect} />
292-
<ResButton size={buttonSize} identifier={"libraryQuery"} onSelect={onSelect} />
294+
{!isPublicApp && <ResButton size={buttonSize} identifier={"libraryQuery"} onSelect={onSelect} /> }
293295
<ResButton
294296
size={buttonSize}
295297
identifier={BottomResTypeEnum.Folder}
@@ -337,7 +339,7 @@ export function ResCreatePanel(props: ResCreateModalProps) {
337339
<ResButton size={buttonSize} key={i.id} identifier={i} onSelect={onSelect} />
338340
))}
339341

340-
{user.orgDev && (
342+
{(user.orgDev || isPublicApp) && (
341343
<DataSourceButton size={buttonSize} onClick={() => setVisible(true)}>
342344
<LargeBottomResIconWrapper>
343345
<AddIcon />
@@ -351,7 +353,7 @@ export function ResCreatePanel(props: ResCreateModalProps) {
351353
</ScrollBar>
352354
</Content>
353355
<CreateDataSourceModal
354-
open={visible}
356+
open={visible}
355357
onCancel={() => setVisible(false)}
356358
onCreated={() => setVisible(false)}
357359
/>

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import type { AppState } from "@lowcoder-ee/redux/reducers";
2525
import { ColorControl } from "../controls/colorControl";
2626
import { DEFAULT_ROW_COUNT } from "@lowcoder-ee/layout/calculateUtils";
2727
import { AppSettingContext } from "../utils/appSettingContext";
28+
import { isPublicApplication } from "@lowcoder-ee/redux/selectors/applicationSelector";
2829

2930
const TITLE = trans("appSetting.title");
3031
const USER_DEFINE = "__USER_DEFINE";
@@ -337,6 +338,7 @@ function AppGeneralSettingsModal(props: ChildrenInstance) {
337338
}
338339

339340
function AppCanvasSettingsModal(props: ChildrenInstance) {
341+
const isPublicApp = useSelector(isPublicApplication);
340342
const {
341343
themeList,
342344
defaultTheme,
@@ -415,13 +417,15 @@ function AppCanvasSettingsModal(props: ChildrenInstance) {
415417
placement="bottom"
416418
itemNode={(value) => <DropdownItem value={value} />}
417419
preNode={() => (
418-
<>
419-
<CreateDiv onClick={() => window.open(THEME_SETTING)}>
420-
<StyledAddIcon />
421-
{trans("appSetting.themeCreate")}
422-
</CreateDiv>
423-
<DividerStyled />
424-
</>
420+
isPublicApp ? <></> : (
421+
<>
422+
<CreateDiv onClick={() => window.open(THEME_SETTING)}>
423+
<StyledAddIcon />
424+
{trans("appSetting.themeCreate")}
425+
</CreateDiv>
426+
<DividerStyled />
427+
</>
428+
)
425429
)}
426430
allowClear
427431
onChange={(value) => {

client/packages/lowcoder/src/comps/comps/remoteComp/loaders.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { PUBLIC_APP_ID } from "@lowcoder-ee/constants/publicApp";
12
import { sdkConfig } from "@lowcoder-ee/constants/sdkConfig";
23
import { ASSETS_BASE_URL, NPM_PLUGIN_ASSETS_BASE_URL } from "constants/npmPlugins";
34
import { trans } from "i18n";
@@ -23,8 +24,9 @@ async function npmLoader(
2324
? `${sdkConfig.baseURL}/${ASSETS_BASE_URL}`
2425
: NPM_PLUGIN_ASSETS_BASE_URL;
2526

26-
const entry = `${pluginBaseUrl}/${appId || 'none'}/${packageName}@${localPackageVersion}/index.js`;
27-
// const entry = `../../../../../public/package/index.js`;
27+
const applicationId = (!appId || appId && appId === PUBLIC_APP_ID) ? 'none' : appId;
28+
29+
const entry = `${pluginBaseUrl}/${applicationId}/${packageName}@${localPackageVersion}/index.js`;
2830

2931
try {
3032
const module = await import(
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
export const PUBLIC_APP_ID = "public_app";
2+
export const PUBLIC_APP_ORG_ID = "645b53eb86b4c862d8ae0fb9";
3+
4+
export const publicAppResponse = {
5+
status: 200,
6+
statusText: 'OK',
7+
headers: {},
8+
config: {
9+
headers: {} as any,
10+
},
11+
data: {
12+
code: 1,
13+
success: true,
14+
message: "",
15+
data: {
16+
orgCommonSettings: undefined,
17+
applicationDSL: {
18+
"ui": {
19+
"compType": "normal",
20+
"comp": {}
21+
},
22+
"refTree": {
23+
"value": ""
24+
},
25+
"hooks": [
26+
{
27+
"compType": "urlParams",
28+
"comp": {},
29+
"name": "url"
30+
},
31+
{
32+
"compType": "dayJsLib",
33+
"comp": {},
34+
"name": "dayjs"
35+
},
36+
{
37+
"compType": "lodashJsLib",
38+
"comp": {},
39+
"name": "_"
40+
},
41+
{
42+
"compType": "utils",
43+
"comp": {},
44+
"name": "utils"
45+
},
46+
{
47+
"compType": "message",
48+
"comp": {},
49+
"name": "message"
50+
},
51+
{
52+
"compType": "toast",
53+
"comp": {},
54+
"name": "toast"
55+
},
56+
{
57+
"compType": "localStorage",
58+
"comp": {},
59+
"name": "localStorage"
60+
},
61+
{
62+
"compType": "currentUser",
63+
"comp": {},
64+
"name": "currentUser"
65+
},
66+
{
67+
"compType": "screenInfo",
68+
"comp": {},
69+
"name": "screenInfo"
70+
},
71+
{
72+
"compType": "theme",
73+
"comp": {},
74+
"name": "theme"
75+
}
76+
],
77+
"settings": {
78+
"title": "",
79+
"description": "",
80+
"category": "Business",
81+
"showHeaderInPublic": true,
82+
"themeId": "default",
83+
"preventAppStylesOverwriting": true,
84+
"disableCollision": false,
85+
"lowcoderCompVersion": "latest",
86+
"maxWidth": {
87+
"dropdown": "1920",
88+
"input": 0
89+
},
90+
"gridRowCount": "Infinity",
91+
"gridPaddingX": "20",
92+
"gridPaddingY": "20"
93+
},
94+
"preload": {
95+
"script": "",
96+
"css": "",
97+
"globalCSS": ""
98+
}
99+
},
100+
moduleDSL: {},
101+
applicationInfoView: {
102+
"orgId": "",
103+
"applicationId": PUBLIC_APP_ID,
104+
"name": "Public App",
105+
"createAt": 1735651262539,
106+
"createBy": "",
107+
"role": "owner",
108+
"applicationType": 1,
109+
"applicationStatus": "NORMAL",
110+
"folderId": '',
111+
"lastViewTime": 0,
112+
"lastModifyTime": 1735747724691,
113+
"lastEditedAt": 1735737886323,
114+
"folder": false,
115+
"extra": {},
116+
"editingUserId": "",
117+
},
118+
}
119+
}
120+
};
121+
122+
export const publicAppJSDatasourceResponse = {
123+
status: 200,
124+
statusText: 'OK',
125+
headers: {},
126+
config: {
127+
headers: {} as any,
128+
},
129+
data: {
130+
code: 1,
131+
data: [],
132+
message: "",
133+
success: true,
134+
total: 0,
135+
}
136+
};

client/packages/lowcoder/src/constants/routesURL.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const FOLDERS_URL = `/folders`;
4949
export const TRASH_URL = `/trash`;
5050
export const IMPORT_APP_FROM_TEMPLATE_URL = `${ALL_APPLICATIONS_URL}/template-import/:templateId`;
5151
export const APP_EDITOR_URL = `${ALL_APPLICATIONS_URL}/:applicationId/:viewMode/:appPageId?`;
52-
export const PUBLIC_APP_EDITOR_URL = `${ALL_APPLICATIONS_URL}/public/edit`;
52+
export const PUBLIC_APP_EDITOR_URL = `/editor/public`;
5353

5454
export const AUTH_BIND_URL = `${USER_AUTH_URL}/bind`;
5555
export const AUTH_LOGIN_URL = `${USER_AUTH_URL}/login`;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export const en = {
139139
"pluginListTitle": "Plugins",
140140
"emptyModules": "Modules are reusable Mikro-Apps. You can embed them in your App.",
141141
"searchNotFound": "Can't find the right component?",
142-
"emptyPlugins": "No Plugins Added",
142+
"emptyPlugins": "No plugins added yet. Add npm plugins to enhance your project.",
143143
"contactUs": "Contact Us",
144144
"issueHere": "here.",
145145
"folderListTitle": "Folders"

client/packages/lowcoder/src/pages/common/header.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
recoverSnapshotAction,
4141
setShowAppSnapshot,
4242
} from "redux/reduxActions/appSnapshotActions";
43-
import { currentApplication } from "redux/selectors/applicationSelector";
43+
import { currentApplication, isPublicApplication } from "redux/selectors/applicationSelector";
4444
import {
4545
getSelectedAppSnapshot,
4646
showAppSnapshotSelector,
@@ -369,6 +369,7 @@ export default function Header(props: HeaderProps) {
369369
const { left, bottom, right } = props.panelStatus;
370370
const user = useSelector(getUser);
371371
const application = useSelector(currentApplication);
372+
const isPublicApp = useSelector(isPublicApplication);
372373
const applicationId = useApplicationId();
373374
const dispatch = useDispatch();
374375
const showAppSnapshot = useSelector(showAppSnapshotSelector);
@@ -383,8 +384,6 @@ export default function Header(props: HeaderProps) {
383384

384385
const isModule = appType === AppTypeEnum.Module;
385386

386-
console.log('header', applicationId);
387-
388387
useEffect(() => {
389388
if(blockEditing && application && Boolean(application?.editingUserId)) {
390389
UserApi.getUserDetail(application.editingUserId!)
@@ -589,7 +588,7 @@ export default function Header(props: HeaderProps) {
589588
</>
590589
)}
591590

592-
{Boolean(applicationId) && applicationId !== 'public' && (
591+
{Boolean(applicationId) && !isPublicApp && (
593592
<AppPermissionDialog
594593
applicationId={applicationId}
595594
visible={permissionDialogVisible}

client/packages/lowcoder/src/pages/common/help.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { ShortcutListPopup } from "./shortcutListPopup";
2727
import { QuestionIcon, UpgradeIcon } from "lowcoder-design";
2828
import { trans } from "i18n";
2929
import { localEnv } from "util/envUtils";
30+
import { isPublicApplication } from "@lowcoder-ee/redux/selectors/applicationSelector";
3031

3132
const StyledMenu = styled(DropdownMenu)<{ $edit: boolean | string }>`
3233
${(props) =>
@@ -189,6 +190,8 @@ function HelpDropdownComp(props: HelpDropdownProps) {
189190
const [videoVisible, setVideoVisible] = useState(false);
190191
const [toolTipContent, setToolTipContent] = useState<React.ReactNode>(null);
191192
const [showDropdown, setShowDropdown] = useState(false);
193+
const isPublicApp = useSelector(isPublicApplication);
194+
192195
const closeTooltip = () => {
193196
// turn of tooltip
194197
setToolTipContent(null);
@@ -238,6 +241,7 @@ function HelpDropdownComp(props: HelpDropdownProps) {
238241
!props.isEdit && setShowHelp(false);
239242
return;
240243
case "editorTutorial":
244+
if (isPublicApp) return;
241245
dispatch(
242246
createApplication({
243247
applicationName: trans("help.appName"),

client/packages/lowcoder/src/pages/common/previewHeader.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ALL_APPLICATIONS_URL, APPLICATION_VIEW_URL, AUTH_LOGIN_URL } from "cons
55
import { User } from "constants/userConstants";
66
import { EllipsisTextCss, isDarkColor, TacoButton, TextEditIcon } from "lowcoder-design";
77
import { useSelector } from "react-redux";
8-
import { currentApplication, getTemplateId } from "redux/selectors/applicationSelector";
8+
import { currentApplication, getTemplateId, isPublicApplication } from "redux/selectors/applicationSelector";
99
import { getUser, isFetchingUser } from "redux/selectors/usersSelectors";
1010
import styled from "styled-components";
1111
import history from "util/history";
@@ -15,7 +15,7 @@ import ProfileDropdown from "./profileDropdown";
1515
import { trans } from "i18n";
1616
import { Logo } from "@lowcoder-ee/assets/images";
1717
import { AppPermissionDialog } from "../../components/PermissionDialog/AppPermissionDialog";
18-
import { useState } from "react";
18+
import { useMemo, useState } from "react";
1919
import { getBrandingConfig } from "../../redux/selectors/configSelectors";
2020
import { HeaderStartDropdown } from "./headerStartDropdown";
2121
import { useParams } from "react-router";
@@ -132,11 +132,12 @@ const PreviewHeaderComp = () => {
132132
const params = useParams<AppPathParams>();
133133
const user = useSelector(getUser);
134134
const application = useSelector(currentApplication);
135+
const isPublicApp = useSelector(isPublicApplication);
135136
const applicationId = useApplicationId();
136137
const templateId = useSelector(getTemplateId);
137138
const brandingConfig = useSelector(getBrandingConfig);
138139
const [permissionDialogVisible, setPermissionDialogVisible] = useState(false);
139-
const isViewMarketplaceMode = params.viewMode === 'view_marketplace';
140+
const isViewMarketplaceMode = params.viewMode === 'view_marketplace' || isPublicApp;
140141

141142
const headerStart = (
142143
<>
@@ -159,17 +160,17 @@ const PreviewHeaderComp = () => {
159160

160161
const headerEnd = (
161162
<Wrapper>
162-
{canManageApp(user, application) && (
163+
{canManageApp(user, application) && !isPublicApp && (
163164
<AppPermissionDialog
164165
applicationId={applicationId}
165166
visible={permissionDialogVisible}
166167
onVisibleChange={(visible) => !visible && setPermissionDialogVisible(false)}
167168
/>
168169
)}
169-
{canManageApp(user, application) && (
170+
{canManageApp(user, application) && !isPublicApp && (
170171
<PreviewBtn onClick={() => setPermissionDialogVisible(true)}>{SHARE_TITLE}</PreviewBtn>
171172
)}
172-
{canEditApp(user, application) && (
173+
{canEditApp(user, application) && !isPublicApp && (
173174
<EditBtn
174175
buttonType={"primary"}
175176
onClick={() =>

0 commit comments

Comments
 (0)