Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
616d61e
[Feat]: #2124 add customization for the progress circle
iamfaran Apr 20, 2026
4164f33
[Feat]: #2145 add theme settings for the Navigation App
iamfaran Apr 21, 2026
29abe90
[Fix]: #2145 fix layout, padding, background issues for nav theming
iamfaran Apr 21, 2026
61ef19b
fix: Mobile Nav color background theme
iamfaran Apr 21, 2026
c46726d
fix: copy components global canvas issue
iamfaran Apr 22, 2026
5feabcc
fix: datePicker moves back to the current month glitch
iamfaran Apr 23, 2026
9abacbd
test bottom chat panel
iamfaran Apr 27, 2026
699d6b4
Merge pull request #2150 from iamfaran/fix/datepicker
raheeliftikhar5 Apr 28, 2026
a70859b
Merge pull request #2148 from iamfaran/fix/copy-components
raheeliftikhar5 Apr 28, 2026
2bd102e
Merge pull request #2146 from iamfaran/feat/2124-progress
raheeliftikhar5 Apr 28, 2026
ecf25de
Merge pull request #2147 from iamfaran/feat/2145-theme-nav
raheeliftikhar5 Apr 28, 2026
35f277b
Merge branch 'feat/ai' of github.com:lowcoder-org/lowcoder into feat/ai
iamfaran Apr 28, 2026
25c02b1
addd github action to deploy lowcoder-sdk-webpack-bundle on netlify
raheeliftikhar5 Apr 28, 2026
d2815f8
fix github action
raheeliftikhar5 Apr 28, 2026
bef2185
update public url for testing
raheeliftikhar5 Apr 29, 2026
f155804
updated github action trigger branch and sdk public url
raheeliftikhar5 Apr 29, 2026
102f869
Merge pull request #2152 from lowcoder-org/feat/deploy-sdk-bundle
FalkWolsky Apr 29, 2026
ac1b500
Merge branch 'dev' of github.com:lowcoder-org/lowcoder into feat/ai
iamfaran Apr 29, 2026
e8843e5
Merge branch 'feat/ai' of github.com:lowcoder-org/lowcoder into feat/ai
iamfaran Apr 29, 2026
58d2a7e
add new query handler for ai assistant
iamfaran Apr 29, 2026
b4d28ad
fix automator flow + add delete component action
iamfaran May 5, 2026
9a5d631
add tools callings
iamfaran May 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/deploy-lowcoder-sdk-webpack-netlify.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Builds client/packages/lowcoder-sdk-webpack-bundle and deploys its dist/ folder to Netlify.
#
# Deploy uses --no-build so Netlify CLI does not run the site UI "build command" (e.g. expo).
# The webpack bundle is built in the prior CI step.
#
# Repository secrets (Netlify: Site settings → General → Site details → Site ID;
# User settings → Applications → Personal access tokens):
# NETLIFY_AUTH_TOKEN — Netlify personal access token
# NETLIFY_SITE_ID — Site API ID for the Netlify site

name: Deploy SDK Webpack Bundle to Netlify

on:
push:
branches:
- main

permissions:
contents: read

concurrency:
group: deploy-sdk-webpack-netlify-${{ github.ref }}
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 20.x
cache: yarn
cache-dependency-path: client/yarn.lock

- name: Install dependencies
uses: borales/actions-yarn@v4.2.0
with:
cmd: install
dir: client

- name: Build lowcoder-sdk-webpack-bundle
uses: borales/actions-yarn@v4.2.0
with:
cmd: workspace lowcoder-sdk-webpack-bundle build
dir: client

- name: Deploy dist to Netlify
working-directory: client/packages/lowcoder-sdk-webpack-bundle
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SDK_SITE_ID }}
run: npx --yes netlify-cli deploy --prod --dir=dist --no-build
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ export default function ThemeSettingsSelector(props: ColorConfigProps) {
};

const gridPaddingInputBlur = (padding: string) => {
let result = 20;
let result = 0;
if (padding !== '') {
result = Number(padding);
}
Expand Down
22 changes: 13 additions & 9 deletions client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,8 @@ const childrenMap = {
gridColumns: RangeControl.closed(1, 48, 24),
gridRowHeight: RangeControl.closed(4, 100, 8),
gridRowCount: withDefault(NumberControl, DEFAULT_ROW_COUNT),
gridPaddingX: withDefault(NumberControl, 20),
gridPaddingY: withDefault(NumberControl, 20),
gridPaddingX: withDefault(NumberControl, 0),
gridPaddingY: withDefault(NumberControl, 0),
gridBg: ColorControl,
gridBgImage: StringControl,
gridBgImageRepeat: StringControl,
Expand Down Expand Up @@ -342,6 +342,10 @@ function AppGeneralSettingsModal(props: ChildrenInstance) {

function AppCanvasSettingsModal(props: ChildrenInstance) {
const isPublicApp = useSelector(isPublicApplication);
const application = useSelector(currentApplication);
const isAggregation = !!application && isAggregationApp(
AppUILayoutType[application.applicationType]
);
const {
themeList,
defaultTheme,
Expand Down Expand Up @@ -397,7 +401,7 @@ function AppCanvasSettingsModal(props: ChildrenInstance) {
return (
<>
<BaseSection
name={"Theme Settings"}
name={trans("appSetting.themeSettings")}
width={288}
noMargin
style={{
Expand Down Expand Up @@ -454,33 +458,33 @@ function AppCanvasSettingsModal(props: ChildrenInstance) {
}}
>
<DivStyled>
{maxWidth.propertyView({
{!isAggregation && maxWidth.propertyView({
dropdownLabel: trans("appSetting.canvasMaxWidth"),
inputLabel: trans("appSetting.userDefinedMaxWidth"),
inputPlaceholder: trans("appSetting.inputUserDefinedPxValue"),
placement: "bottom",
min: 350,
lastNode: <span>{trans("appSetting.maxWidthTip")}</span>,
})}
{gridColumns.propertyView({
{!isAggregation && gridColumns.propertyView({
label: trans("appSetting.gridColumns"),
placeholder: '24',
})}
{gridRowHeight.propertyView({
{!isAggregation && gridRowHeight.propertyView({
label: trans("appSetting.gridRowHeight"),
placeholder: '8',
})}
{gridRowCount.propertyView({
{!isAggregation && gridRowCount.propertyView({
label: trans("appSetting.gridRowCount"),
placeholder: 'Infinity',
})}
{gridPaddingX.propertyView({
label: trans("appSetting.gridPaddingX"),
placeholder: '20',
placeholder: '0',
})}
{gridPaddingY.propertyView({
label: trans("appSetting.gridPaddingY"),
placeholder: '20',
placeholder: '0',
})}
{gridBg.propertyView({
label: trans("style.background"),
Expand Down
12 changes: 1 addition & 11 deletions client/packages/lowcoder/src/comps/comps/chatComp/chatComp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { ChatProvider } from "./components/context/ChatContext";
import { ChatPropertyView } from "./chatPropertyView";
import { createChatStorage } from "./utils/storageFactory";
import { QueryHandler } from "./handlers/messageHandlers";
import { useMemo, useRef, useEffect } from "react";
import { useMemo, useRef } from "react";
import { changeChildAction } from "lowcoder-core";
import { ChatMessage } from "./types/chatTypes";
import { trans } from "i18n";
Expand Down Expand Up @@ -249,16 +249,6 @@ const ChatTmpComp = new UICompBuilder(
}
};

// Cleanup on unmount
useEffect(() => {
return () => {
const tableName = uniqueTableName.current;
if (tableName) {
storage.cleanup();
}
};
}, []);

// custom styles
const styles = {
style: props.style,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,52 +1,62 @@
// client/packages/lowcoder/src/comps/comps/chatComp/components/ChatPanel.tsx

import { useMemo, useEffect } from "react";
import { useMemo, useContext, useRef, useEffect } from "react";
import { ChatPanelContainer } from "./ChatPanelContainer";
import { createChatStorage } from "../utils/storageFactory";
import { N8NHandler } from "../handlers/messageHandlers";
import { AIAssistantQueryHandler } from "../handlers/messageHandlers";
import { ChatPanelProps } from "../types/chatTypes";
import { trans } from "i18n";
import { EditorContext } from "@lowcoder-ee/comps/editorState";

import "@assistant-ui/styles/index.css";
import "@assistant-ui/styles/markdown.css";

// ============================================================================
// CHAT PANEL - SIMPLIFIED BOTTOM PANEL (NO STYLING CONTROLS)
// CHAT PANEL - SIMPLIFIED BOTTOM PANEL (QUERY-BASED + AUTOMATOR)
// ----------------------------------------------------------------------------
// We capture the EditorState in a ref so the message handler always reads
// the *latest* canvas snapshot at send-time (instead of being frozen at
// mount time, which would defeat the whole point of context awareness).
// ============================================================================

interface ExtendedChatPanelProps extends ChatPanelProps {
/** When false, send conversation history without the Automator system prompt. */
enableAutomator?: boolean;
}

export function ChatPanel({
tableName,
modelHost,
systemPrompt = trans("chat.defaultSystemPrompt"),
streaming = true,
onMessageUpdate
}: ChatPanelProps) {
chatQuery,
onMessageUpdate,
enableAutomator = true,
}: ExtendedChatPanelProps) {
const editorState = useContext(EditorContext);
const editorStateRef = useRef(editorState);

useEffect(() => {
editorStateRef.current = editorState;
}, [editorState]);

const storage = useMemo(() =>
createChatStorage(tableName),
[tableName]
);

const messageHandler = useMemo(() =>
new N8NHandler({
modelHost,
systemPrompt,
streaming
}),
[modelHost, systemPrompt, streaming]
const messageHandler = useMemo(
() =>
new AIAssistantQueryHandler({
chatQuery,
dispatch: editorState?.rootComp?.dispatch,
getEditorState: () => editorStateRef.current,
enableAutomator,
}),
[chatQuery, editorState?.rootComp?.dispatch, enableAutomator]
);

// Cleanup on unmount - delete chat data from storage
useEffect(() => {
return () => {
storage.cleanup();
};
}, [storage]);

return (
<ChatPanelContainer
storage={storage}
messageHandler={messageHandler}
onMessageUpdate={onMessageUpdate}
/>
);
}
}
Loading
Loading