Skip to content

Commit 217566f

Browse files
committed
Allow rendering shares as web page
1 parent 97bc72c commit 217566f

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

llmstack/client/src/components/apps/renderer/AppRenderer.jsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ export const defaultChatLayout = `<pa-layout sx='{"maxWidth": "1200px", "margin"
5454
</pa-grid>
5555
</pa-layout>`;
5656

57+
export const webPageRenderLayout = `<pa-layout sx='{"maxWidth": "1200px", "margin": "10px auto"}'>
58+
<pa-grid container="true" spacing="2" style="width: 100%">
59+
<pa-grid item="true" xs="12">
60+
<pa-workflow-output></pa-workflow-output>
61+
</pa-grid>
62+
</pa-grid>
63+
</pa-layout>`;
64+
5765
export default function AppRenderer({ app, ws, onEventDone = null }) {
5866
const appSessionId = useRef(null);
5967
const location = useLocation();

llmstack/client/src/components/store/SessionRenderer.jsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { useCallback } from "react";
1616
import {
1717
defaultChatLayout,
1818
defaultWorkflowLayout,
19+
webPageRenderLayout,
1920
} from "../apps/renderer/AppRenderer";
2021

2122
const SessionRenderer = ({
@@ -24,6 +25,7 @@ const SessionRenderer = ({
2425
skipSteps = false,
2526
}) => {
2627
const storeApp = sessionData?.store_app;
28+
const renderAsWebPage = sessionData?.metadata?.render_as_web_page || false;
2729
const appTypeSlug = storeApp?.data?.type_slug || "agent";
2830
const setAppRunData = useSetRecoilState(appRunDataState);
2931
const templateEngine = useMemo(() => new Liquid(), []);
@@ -112,11 +114,13 @@ const SessionRenderer = ({
112114
const memoizedLayoutRenderer = useMemo(
113115
() => (
114116
<LayoutRenderer noInput>
115-
{storeApp?.data?.config?.layout ||
116-
(appTypeSlug === "web" ? defaultWorkflowLayout : defaultChatLayout)}
117+
{renderAsWebPage
118+
? webPageRenderLayout
119+
: storeApp?.data?.config?.layout ||
120+
(appTypeSlug === "web" ? defaultWorkflowLayout : defaultChatLayout)}
117121
</LayoutRenderer>
118122
),
119-
[storeApp, appTypeSlug],
123+
[storeApp, appTypeSlug, renderAsWebPage],
120124
);
121125

122126
if (!storeApp) {

llmstack/client/src/components/store/ShareModal.jsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ import {
1919
import {
2020
Box,
2121
Button,
22+
Checkbox,
2223
Dialog,
2324
DialogActions,
2425
DialogContent,
2526
DialogTitle,
27+
FormControlLabel,
28+
FormGroup,
2629
IconButton,
2730
Stack,
2831
TextField,
@@ -58,6 +61,7 @@ export default function ShareModal({
5861
const [pinned, setPinned] = useState(null);
5962
const [pinToProfileLoading, setPinToProfileLoading] = useState(false);
6063
const [shareUrlLoading, setShareUrlLoading] = useState(false);
64+
const [renderAsWebPage, setRenderAsWebPage] = useState(false);
6165

6266
const getShareUrl = (code) => {
6367
if (code) {
@@ -67,7 +71,7 @@ export default function ShareModal({
6771
return window.location.href;
6872
};
6973

70-
const handleShare = (event, sessionId, isLoggedIn) => {
74+
const handleShare = (event, sessionId, isLoggedIn, renderAsWebPage) => {
7175
event.stopPropagation();
7276

7377
if (!isLoggedIn || !sessionId) {
@@ -97,6 +101,7 @@ export default function ShareModal({
97101
session_id: sessionId,
98102
app_store_uuid: appStoreUuid,
99103
run_entry_request_uuids: requestIds,
104+
render_as_web_page: renderAsWebPage,
100105
};
101106

102107
axios()
@@ -258,6 +263,19 @@ export default function ShareModal({
258263
</Stack>
259264
</Box>
260265
)}
266+
{!shareCode && appRunData?.sessionId && (
267+
<Box sx={{ paddingTop: 4 }}>
268+
<FormGroup>
269+
<Tooltip title="When checked, the output will be rendered as a web page irrespective of the app's layout">
270+
<FormControlLabel
271+
control={<Checkbox checked={renderAsWebPage} size="small" />}
272+
label="Render the output as a web page"
273+
onChange={(e) => setRenderAsWebPage(e.target.checked)}
274+
/>
275+
</Tooltip>
276+
</FormGroup>
277+
</Box>
278+
)}
261279
</DialogContent>
262280
<DialogActions>
263281
<Button key="cancel" onClick={handleClose}>
@@ -271,7 +289,12 @@ export default function ShareModal({
271289
type="primary"
272290
onClick={(e) => {
273291
appRunData?.sessionId
274-
? handleShare(e, appRunData?.sessionId, isLoggedIn)
292+
? handleShare(
293+
e,
294+
appRunData?.sessionId,
295+
isLoggedIn,
296+
renderAsWebPage,
297+
)
275298
: handleClose(e);
276299
}}
277300
loading={shareUrlLoading}

0 commit comments

Comments
 (0)