diff --git a/react/src/App.tsx b/react/src/App.tsx
index 7b445f9b43..64f4233949 100644
--- a/react/src/App.tsx
+++ b/react/src/App.tsx
@@ -28,7 +28,7 @@ const ServingPage = React.lazy(() => import('./pages/ServingPage'));
const EndpointDetailPage = React.lazy(
() => import('./pages/EndpointDetailPage'),
);
-// const SummaryPage = React.lazy(() => import('./pages/SummaryPage'));
+const StartPage = React.lazy(() => import('./pages/StartPage'));
const EnvironmentPage = React.lazy(() => import('./pages/EnvironmentPage'));
const MyEnvironmentPage = React.lazy(() => import('./pages/MyEnvironmentPage'));
const StorageHostSettingPage = React.lazy(
@@ -57,9 +57,9 @@ const InteractiveLoginPage = React.lazy(
);
const ImportAndRunPage = React.lazy(() => import('./pages/ImportAndRunPage'));
-const RedirectToSummary = () => {
+const RedirectToStart = () => {
useSuspendedBackendaiClient();
- const pathName = '/summary';
+ const pathName = '/start';
document.dispatchEvent(
new CustomEvent('move-to-from-react', {
detail: {
@@ -68,7 +68,7 @@ const RedirectToSummary = () => {
},
}),
);
- return ;
+ return ;
};
const router = createBrowserRouter([
@@ -105,17 +105,26 @@ const router = createBrowserRouter([
children: [
{
path: '/',
- element: ,
+ element: ,
},
{
//for electron dev mode
path: '/build/electron-app/app/index.html',
- element: ,
+ element: ,
},
{
//for electron prod mode
path: '/app/index.html',
- element: ,
+ element: ,
+ },
+ {
+ path: '/start',
+ element: (
+
+
+
+ ),
+ handle: { labelKey: 'webui.menu.Start' },
},
{
path: '/summary',
@@ -130,7 +139,6 @@ const router = createBrowserRouter([
style={{ marginBottom: token.paddingContentVerticalLG }}
closable
/>
- {/* */}
>
);
},
diff --git a/react/src/components/ActionItemContent.tsx b/react/src/components/ActionItemContent.tsx
new file mode 100644
index 0000000000..5b1460f50b
--- /dev/null
+++ b/react/src/components/ActionItemContent.tsx
@@ -0,0 +1,122 @@
+import Flex from './Flex';
+import { Button, Divider, Typography, theme } from 'antd';
+import { useEffect, useRef, useState } from 'react';
+
+interface StartItemContentProps {
+ title: string;
+ description?: string;
+ icon?: React.ReactNode;
+ buttonText: string;
+ onClick?: () => void;
+ themeColor?: string;
+ iconBgColor?: string;
+}
+
+const ActionItemContent: React.FC = ({
+ title,
+ description,
+ icon,
+ buttonText,
+ onClick,
+ themeColor,
+ iconBgColor,
+}) => {
+ const { token } = theme.useToken();
+ const [needScroll, setNeedScroll] = useState(false);
+ const containerRef = useRef(null);
+
+ useEffect(() => {
+ const handleResize = () => {
+ if (containerRef.current) {
+ const { clientWidth } = containerRef.current;
+ // Currently, the minimum width for non-scrollable content is 220px (Start an Interactive Session Card)
+ if (clientWidth <= 225) {
+ setNeedScroll(true);
+ } else {
+ setNeedScroll(false);
+ }
+ }
+ };
+ handleResize();
+ window.addEventListener('resize', handleResize);
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ };
+ }, []);
+
+ return (
+
+
+
+ {icon}
+
+
+
+ {title}
+
+
+
+ {!needScroll && description}
+
+
+
+ {description && (
+
+ )}
+
+
+
+
+
+ );
+};
+
+export default ActionItemContent;
diff --git a/react/src/components/BAIBoard.tsx b/react/src/components/BAIBoard.tsx
index 4f75ed034d..e0ae218e44 100644
--- a/react/src/components/BAIBoard.tsx
+++ b/react/src/components/BAIBoard.tsx
@@ -1,7 +1,6 @@
-import Flex from './Flex';
import Board, { BoardProps } from '@cloudscape-design/board-components/board';
import BoardItem from '@cloudscape-design/board-components/board-item';
-import { Skeleton, Typography } from 'antd';
+import { Skeleton } from 'antd';
import { createStyles } from 'antd-style';
import { Suspense } from 'react';
@@ -23,29 +22,31 @@ const useStyles = createStyles(({ css }) => {
board: css`
${defaultBoard}
`,
- disableCustomize: css`
- ${defaultBoard}
- .bai_board_handle {
+ disableResize: css`
+ .bai_board_resizer {
display: none !important;
}
- .bai_board_resizer {
+ `,
+ disableMove: css`
+ .bai_board_handle {
display: none !important;
}
.bai_board_header {
- height: var(--token-boardHeaderHeight, 55px) !important;
+ display: none !important;
}
`,
boardItems: css`
& > div:first-child {
- border: 1px solid var(--token-colorBorder) !important ;
+ border: none !important ;
border-radius: var(--token-borderRadius) !important ;
background-color: var(--token-colorBgContainer) !important ;
}
& > div:first-child > div:first-child > div:first-child {
- border-bottom: 1px solid var(--token-colorBorder) !important;
margin-bottom: var(--token-margin);
background-color: var(--token-colorBgContainer) !important ;
+ position: absolute;
+ z-index: 1;
}
`,
};
@@ -56,19 +57,27 @@ interface BAICustomizableGridProps {
onItemsChange: (
event: CustomEvent>,
) => void;
- customizable?: boolean;
+ resizable?: boolean;
+ movable?: boolean;
}
const BAIBoard: React.FC = ({
items: parsedItems,
- customizable = false,
+ resizable = false,
+ movable = false,
...BoardProps
}) => {
const { styles } = useStyles();
+
+ const boardStyles = [
+ styles.board,
+ !movable && styles.disableMove,
+ !resizable && styles.disableResize,
+ ].join(' ');
+
return (
{
return (
@@ -82,11 +91,6 @@ const BAIBoard: React.FC = ({
resizeHandleAriaLabel: '',
resizeHandleAriaDescription: '',
}}
- header={
-
- {item.data.title}
-
- }
>
}>
{item.data.content}
diff --git a/react/src/components/MainLayout/WebUISider.tsx b/react/src/components/MainLayout/WebUISider.tsx
index ae2351eeaf..cbcfd36876 100644
--- a/react/src/components/MainLayout/WebUISider.tsx
+++ b/react/src/components/MainLayout/WebUISider.tsx
@@ -19,6 +19,7 @@ import {
FileDoneOutlined,
HddOutlined,
InfoCircleOutlined,
+ PlayCircleOutlined,
RocketOutlined,
SolutionOutlined,
ToolOutlined,
@@ -70,6 +71,11 @@ const WebUISider: React.FC = (props) => {
const [isOpenSignoutModal, { toggle: toggleSignoutModal }] = useToggle(false);
const generalMenu = filterEmptyItem([
+ {
+ label: t('webui.menu.Start'),
+ icon: ,
+ key: 'start',
+ },
{
label: t('webui.menu.Summary'),
icon: ,
diff --git a/react/src/components/SummaryPageItems/SummaryItemDownloadApp.tsx b/react/src/components/SummaryPageItems/SummaryItemDownloadApp.tsx
deleted file mode 100644
index b2e487d2ce..0000000000
--- a/react/src/components/SummaryPageItems/SummaryItemDownloadApp.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import { useSuspendedBackendaiClient } from '../../hooks';
-import Flex from '../Flex';
-import { Button, Select, Typography, theme } from 'antd';
-import { useState } from 'react';
-
-const detectDefaultOS = () => {
- if (navigator.userAgent.indexOf('Mac') !== -1) return 'MacOS';
- if (navigator.userAgent.indexOf('Win') !== -1) return 'Windows';
- if (navigator.userAgent.indexOf('Linux') !== -1) return 'Linux';
- return 'MacOS';
-};
-
-const SummaryItemDownloadApp: React.FC = () => {
- const { token } = theme.useToken();
- const [OS, setOS] = useState(detectDefaultOS());
-
- const baiClient = useSuspendedBackendaiClient();
- const url = baiClient._config.appDownloadUrl;
- const windowOS = baiClient.supports('use-win-instead-of-win32')
- ? 'win'
- : 'win32';
-
- const appDownloadMap: Record = {
- Linux: {
- os: 'linux',
- architecture: ['arm64', 'x64'],
- extension: 'zip',
- },
- MacOS: {
- os: 'macos',
- architecture: ['arm64', 'x64'],
- extension: 'dmg',
- },
- Windows: {
- os: windowOS,
- architecture: ['arm64', 'x64'],
- extension: 'zip',
- },
- };
- const downloadApp = (architecture: string) => {
- //@ts-ignore
- const pkgVersion = globalThis.packageVersion;
- const os = appDownloadMap[OS].os;
- const extension = appDownloadMap[OS].extension;
- const downloadLink = `${url}/v${pkgVersion}/backend.ai-desktop-${pkgVersion}-${os}-${architecture}.${extension}`;
- window.open(downloadLink, '_blank');
- };
-
- return (
-
-
- );
-};
-
-export default SummaryItemDownloadApp;
diff --git a/react/src/components/SummaryPageItems/SummaryItemInvitation.tsx b/react/src/components/SummaryPageItems/SummaryItemInvitation.tsx
deleted file mode 100644
index 9edaa7007a..0000000000
--- a/react/src/components/SummaryPageItems/SummaryItemInvitation.tsx
+++ /dev/null
@@ -1,169 +0,0 @@
-import BAICard from '../../BAICard';
-import {
- baiSignedRequestWithPromise,
- useBaiSignedRequestWithPromise,
-} from '../../helper';
-import { useSuspendedBackendaiClient } from '../../hooks';
-import {
- useSuspenseTanQuery,
- useTanMutation,
-} from '../../hooks/reactQueryAlias';
-import Flex from '../Flex';
-import { App, Button, Descriptions, Empty, Tag, Typography, theme } from 'antd';
-import { useTranslation } from 'react-i18next';
-
-const SummaryItemInvitation: React.FC = () => {
- const { t } = useTranslation();
- const { token } = theme.useToken();
- const app = App.useApp();
-
- const baiClient = useSuspendedBackendaiClient();
- const baiRequestWithPromise = useBaiSignedRequestWithPromise();
- const {
- data: { invitations },
- refetch,
- } = useSuspenseTanQuery({
- queryKey: ['baiClient.invitation.list'],
- queryFn: () =>
- baiRequestWithPromise({
- method: 'GET',
- url: '/folders/invitations/list',
- }),
- });
-
- const terminateInvitationsMutation = useTanMutation({
- mutationFn: (inv_id: string) => {
- return baiSignedRequestWithPromise({
- method: 'DELETE',
- url: '/folders/invitations/delete',
- body: {
- inv_id: inv_id,
- },
- client: baiClient,
- });
- },
- });
-
- const acceptInvitationsMutation = useTanMutation({
- mutationFn: (inv_id: string) => {
- return baiSignedRequestWithPromise({
- method: 'POST',
- url: '/folders/invitations/accept',
- body: {
- inv_id: inv_id,
- },
- client: baiClient,
- });
- },
- });
-
- const permissionIndicator = (permission: any) => {
- const indicator = [...permission].map((p: any) => {
- const color = ['green', 'blue', 'red', 'orange'][
- ['r', 'w', 'd', 'o'].indexOf(p)
- ];
- const text = ['read', 'write', 'delete', 'only'][
- ['r', 'w', 'd', 'o'].indexOf(p)
- ];
-
- return (
-
- {text}
-
- );
- });
-
- return indicator;
- };
-
- return (
-
- {invitations.length > 0 ? (
- <>
- {invitations.map((invitation: any) => (
-
-
-
- {invitation.vfolder_name}
-
-
- {permissionIndicator(invitation.perm)}
-
-
-
-
-
-
-
- ))}
- >
- ) : (
-
- )}
-
- );
-};
-
-export default SummaryItemInvitation;
diff --git a/react/src/components/SummaryPageItems/SummaryItemStartMenu.tsx b/react/src/components/SummaryPageItems/SummaryItemStartMenu.tsx
deleted file mode 100644
index 856ca3c222..0000000000
--- a/react/src/components/SummaryPageItems/SummaryItemStartMenu.tsx
+++ /dev/null
@@ -1,146 +0,0 @@
-import { useWebUINavigate } from '../../hooks';
-import Flex from '../Flex';
-import { PoweroffOutlined } from '@ant-design/icons';
-import { Button, Typography, theme } from 'antd';
-import { useTranslation } from 'react-i18next';
-
-interface StartMenuProps {
- deactivate?: boolean;
- allowNeoSessionLauncher?: boolean;
-}
-
-export const SummaryItemStartMenu: React.FC = ({
- deactivate,
- allowNeoSessionLauncher,
-}) => {
- const { token } = theme.useToken();
- const webuiNavigate = useWebUINavigate();
- const { t } = useTranslation();
-
- return (
-
-
-
-
- webuiNavigate('/data')}
- >
-
-
- {t('summary.UploadFiles')}
-
-
- {
- webuiNavigate({
- pathname: '/credential',
- search: '?action=add',
- });
- }}
- >
-
-
- {t('summary.CreateANewKeypair')}
-
-
- {
- webuiNavigate({
- pathname: '/credential',
- search: '?action=manage',
- });
- }}
- >
-
-
- {t('summary.MaintainKeypairs')}
-
-
-
-
- );
-};
-
-export default SummaryItemStartMenu;
diff --git a/react/src/hooks/useBAISetting.tsx b/react/src/hooks/useBAISetting.tsx
index f0641f3d88..e21506d732 100644
--- a/react/src/hooks/useBAISetting.tsx
+++ b/react/src/hooks/useBAISetting.tsx
@@ -1,5 +1,5 @@
import { jotaiStore } from '../components/DefaultProviders';
-import { SummaryItem } from '../pages/SummaryPage';
+import { StartItem } from '../pages/StartPage';
import { atom, useAtom } from 'jotai';
import { atomFamily } from 'jotai/utils';
@@ -14,7 +14,7 @@ interface UserSettings {
last_window_close_time?: number;
endpoints?: string[];
auto_logout?: boolean;
- summary_items?: Array>;
+ summary_items?: Array>;
selected_language?: string;
classic_session_launcher?: boolean;
recentSessionHistory?: Array;
diff --git a/react/src/pages/StartPage.tsx b/react/src/pages/StartPage.tsx
new file mode 100644
index 0000000000..710f81e470
--- /dev/null
+++ b/react/src/pages/StartPage.tsx
@@ -0,0 +1,226 @@
+import ActionItemContent from '../components/ActionItemContent';
+import BAIBoard from '../components/BAIBoard';
+import { useWebUINavigate } from '../hooks';
+import { useBAISettingUserState } from '../hooks/useBAISetting';
+import {
+ AppstoreAddOutlined,
+ FolderAddOutlined,
+ LinkOutlined,
+ PlaySquareOutlined,
+} from '@ant-design/icons';
+import { BoardProps } from '@cloudscape-design/board-components/board';
+import { theme } from 'antd';
+import _ from 'lodash';
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+
+export interface StartItem
+ extends BoardProps.Item<{
+ content: JSX.Element;
+ }> {
+ id:
+ | 'createFolder'
+ | 'startSession'
+ | 'startBatchSession'
+ | 'modelService'
+ | 'startFromExample'
+ | 'startFromURL';
+}
+
+const StartPage: React.FC = () => {
+ const { t } = useTranslation();
+ const { token } = theme.useToken();
+ const webuiNavigate = useWebUINavigate();
+
+ const defaultSummaryElements: {
+ [key in StartItem['id']]: StartItem['data'];
+ } = {
+ createFolder: {
+ // content: ,
+ content: (
+
+ }
+ onClick={() => webuiNavigate('/data')}
+ />
+ ),
+ },
+ startSession: {
+ content: (
+
+ }
+ onClick={() => webuiNavigate('/session/start')}
+ />
+ ),
+ },
+ startBatchSession: {
+ content: (
+
+ }
+ onClick={() => webuiNavigate('/session/start')}
+ />
+ ),
+ },
+ modelService: {
+ content: (
+
+ }
+ onClick={() => webuiNavigate('/service/start')}
+ themeColor={token['cyan-6']}
+ iconBgColor={token['cyan-1']}
+ />
+ ),
+ },
+ startFromExample: {
+ content: (
+
+ }
+ onClick={() => webuiNavigate('/import')}
+ themeColor={token['cyan-6']}
+ iconBgColor={token['cyan-1']}
+ />
+ ),
+ },
+ startFromURL: {
+ content: (
+
+ }
+ onClick={() => webuiNavigate('/import')}
+ themeColor={token['cyan-6']}
+ iconBgColor={token['cyan-1']}
+ />
+ ),
+ },
+ };
+ const [summaryItemsSetting, setSummaryItemsSetting] =
+ useBAISettingUserState('summary_items');
+
+ const [items, setItems] = useState>(
+ !_.isEmpty(summaryItemsSetting)
+ ? _.map(summaryItemsSetting, (item) => ({
+ ...item,
+ data: {
+ ...defaultSummaryElements[item?.id],
+ },
+ }))
+ : [
+ {
+ id: 'createFolder',
+ rowSpan: 3,
+ columnSpan: 1,
+ columnOffset: { 4: 0 },
+ data: defaultSummaryElements.createFolder,
+ },
+ {
+ id: 'startSession',
+ rowSpan: 3,
+ columnSpan: 1,
+ columnOffset: { 4: 1 },
+ data: defaultSummaryElements.startSession,
+ },
+ {
+ id: 'startBatchSession',
+ rowSpan: 3,
+ columnSpan: 1,
+ columnOffset: { 4: 2 },
+ data: defaultSummaryElements.startBatchSession,
+ },
+ {
+ id: 'modelService',
+ rowSpan: 3,
+ columnSpan: 1,
+ columnOffset: { 4: 3 },
+ data: defaultSummaryElements.modelService,
+ },
+ {
+ id: 'startFromExample',
+ rowSpan: 3,
+ columnSpan: 1,
+ columnOffset: { 4: 0 },
+ data: defaultSummaryElements.startFromExample,
+ },
+ {
+ id: 'startFromURL',
+ rowSpan: 3,
+ columnSpan: 1,
+ columnOffset: { 4: 1 },
+ data: defaultSummaryElements.startFromURL,
+ },
+ ],
+ );
+
+ return (
+ {
+ const changedItems = event.detail.items as typeof items;
+ setItems(changedItems);
+ setSummaryItemsSetting(
+ _.map(changedItems, (item) => _.omit(item, 'data')),
+ );
+ }}
+ />
+ );
+};
+export default StartPage;
diff --git a/react/src/pages/SummaryPage.tsx b/react/src/pages/SummaryPage.tsx
deleted file mode 100644
index f6102531d6..0000000000
--- a/react/src/pages/SummaryPage.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import BAIBoard from '../components/BAIBoard';
-import SummaryItemDownloadApp from '../components/SummaryPageItems/SummaryItemDownloadApp';
-import SummaryItemInvitation from '../components/SummaryPageItems/SummaryItemInvitation';
-import SummaryItemStartMenu from '../components/SummaryPageItems/SummaryItemStartMenu';
-import { useBAISettingUserState } from '../hooks/useBAISetting';
-import { BoardProps } from '@cloudscape-design/board-components/board';
-import _ from 'lodash';
-import { useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-export interface SummaryItem
- extends BoardProps.Item<{
- title: string;
- content: JSX.Element;
- }> {
- id: 'startMenu' | 'invitation' | 'downloadApp';
-}
-
-const SummaryPage: React.FC = () => {
- const { t } = useTranslation();
- const defaultSummaryElements: {
- [key in SummaryItem['id']]: SummaryItem['data'];
- } = {
- startMenu: {
- title: t('summary.StartMenu'),
- content: ,
- },
-
- invitation: {
- title: t('summary.Invitation'),
- content: ,
- },
-
- downloadApp: {
- title: t('summary.DownloadWebUIApp'),
- content: ,
- },
- };
- const [summaryItemsSetting, setSummaryItemsSetting] =
- useBAISettingUserState('summary_items');
-
- const [items, setItems] = useState>(
- !_.isEmpty(summaryItemsSetting)
- ? _.map(summaryItemsSetting, (item) => ({
- ...item,
- data: {
- ...defaultSummaryElements[item?.id],
- },
- }))
- : [
- {
- id: 'startMenu',
- rowSpan: 5,
- columnSpan: 1,
- data: defaultSummaryElements.startMenu,
- },
- {
- id: 'invitation',
- rowSpan: 1,
- columnSpan: 1,
- data: defaultSummaryElements.invitation,
- },
- {
- id: 'downloadApp',
- rowSpan: 1,
- columnSpan: 1,
- data: defaultSummaryElements.downloadApp,
- },
- ],
- );
-
- return (
- {
- const changedItems = event.detail.items as typeof items;
- setItems(changedItems);
- setSummaryItemsSetting(
- _.map(changedItems, (item) => _.omit(item, 'data')),
- );
- }}
- />
- );
-};
-export default SummaryPage;
diff --git a/resources/i18n/de.json b/resources/i18n/de.json
index df10ec0bc7..096db0eec5 100644
--- a/resources/i18n/de.json
+++ b/resources/i18n/de.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Geben sie ihre E-Mail Adresse ein",
"DisMatchUserEmail": "Die E-Mail-Adresse des Benutzers stimmt nicht überein",
"MyEnvironments": "Meine Umgebungen",
- "ResourcePolicy": "Ressourcenpolitik"
+ "ResourcePolicy": "Ressourcenpolitik",
+ "Start": "Start"
},
"YouAreOffline": "Offline: Keine Verbindung zu einem Netzwerk.",
"YouAreOnline": "Sie sind jetzt online",
diff --git a/resources/i18n/el.json b/resources/i18n/el.json
index 5f976050eb..a308701505 100644
--- a/resources/i18n/el.json
+++ b/resources/i18n/el.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Συμπληρώστε το email σας",
"DisMatchUserEmail": "Το email χρήστη δεν ταιριάζει",
"MyEnvironments": "Τα περιβάλλοντα μου",
- "ResourcePolicy": "Πολιτική Πόρων"
+ "ResourcePolicy": "Πολιτική Πόρων",
+ "Start": "Αρχή"
},
"YouAreOffline": "Offline: Δεν είναι συνδεδεμένος σε κανένα δίκτυο.",
"YouAreOnline": "Είστε πλέον συνδεδεμένοι",
diff --git a/resources/i18n/en.json b/resources/i18n/en.json
index e4c4607bd9..ef271b983d 100644
--- a/resources/i18n/en.json
+++ b/resources/i18n/en.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Enter your e-mail",
"DisMatchUserEmail": "User E-mail does not match",
"MyEnvironments": "My Environments",
- "ResourcePolicy": "Resource Policy"
+ "ResourcePolicy": "Resource Policy",
+ "Start": "Start"
},
"YouAreOffline": "Offline: Not connected to any networks.",
"YouAreOnline": "You are now online",
diff --git a/resources/i18n/es.json b/resources/i18n/es.json
index a19ee59ec3..4962efad3b 100644
--- a/resources/i18n/es.json
+++ b/resources/i18n/es.json
@@ -1676,7 +1676,8 @@
"InvalidBlankEmail": "Introduce tu correo electrónico",
"DisMatchUserEmail": "El correo electrónico del usuario no coincide",
"MyEnvironments": "Mis ambientes",
- "ResourcePolicy": "Política de recursos"
+ "ResourcePolicy": "Política de recursos",
+ "Start": "Comenzar"
},
"NetworkSoftTimeout": "El servidor está tardando más en responder. Por favor, espere un momento"
},
diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json
index 50d8417bf1..f8da9c07d7 100644
--- a/resources/i18n/fi.json
+++ b/resources/i18n/fi.json
@@ -1673,7 +1673,8 @@
"InvalidBlankEmail": "Syötä sähköpostiosoitteesi",
"DisMatchUserEmail": "Käyttäjän sähköpostiosoite ei täsmää",
"MyEnvironments": "Omat ympäristöt",
- "ResourcePolicy": "Resurssipolitiikka"
+ "ResourcePolicy": "Resurssipolitiikka",
+ "Start": "Aloita"
},
"NetworkSoftTimeout": "Palvelimen vastaus kestää kauemmin. Odota hetki"
},
diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json
index 4a2798eb0a..71bc8a7f16 100644
--- a/resources/i18n/fr.json
+++ b/resources/i18n/fr.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Entrer votre Email",
"DisMatchUserEmail": "L'e-mail de l'utilisateur ne correspond pas",
"MyEnvironments": "Mes environnements",
- "ResourcePolicy": "Politique des ressources"
+ "ResourcePolicy": "Politique des ressources",
+ "Start": "Commencer"
},
"YouAreOffline": "Hors ligne : N'est connecté à aucun réseau.",
"YouAreOnline": "Vous êtes maintenant en ligne",
diff --git a/resources/i18n/id.json b/resources/i18n/id.json
index ca77b47454..86d913f116 100644
--- a/resources/i18n/id.json
+++ b/resources/i18n/id.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Masukkan email Anda",
"DisMatchUserEmail": "Email Pengguna tidak cocok",
"MyEnvironments": "Lingkungan Saya",
- "ResourcePolicy": "Kebijakan Sumber Daya"
+ "ResourcePolicy": "Kebijakan Sumber Daya",
+ "Start": "Awal"
},
"YouAreOffline": "Offline: Tidak terhubung ke jaringan apa pun.",
"YouAreOnline": "Anda sekarang online",
diff --git a/resources/i18n/it.json b/resources/i18n/it.json
index 695797233f..abac084117 100644
--- a/resources/i18n/it.json
+++ b/resources/i18n/it.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Inserisci il tuo indirizzo email",
"DisMatchUserEmail": "L'e-mail dell'utente non corrisponde",
"MyEnvironments": "I miei ambienti",
- "ResourcePolicy": "Politica delle risorse"
+ "ResourcePolicy": "Politica delle risorse",
+ "Start": "Inizio"
},
"YouAreOffline": "Non in linea: Non è collegato ad alcuna rete.",
"YouAreOnline": "Ora sei online",
diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json
index 0ef037ca0e..69e4e6a4c2 100644
--- a/resources/i18n/ja.json
+++ b/resources/i18n/ja.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "メールアドレスを入力",
"DisMatchUserEmail": "ユーザーの電子メールが一致しません",
"MyEnvironments": "私の環境",
- "ResourcePolicy": "リソースポリシー"
+ "ResourcePolicy": "リソースポリシー",
+ "Start": "始める"
},
"YouAreOffline": "オフライン:どのネットワークにも接続されていない。",
"YouAreOnline": "あなたは今オンラインです",
diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json
index 3c8c06599a..a8caea77d3 100644
--- a/resources/i18n/ko.json
+++ b/resources/i18n/ko.json
@@ -66,7 +66,8 @@
"InvalidBlankPassword": "패스워드를 입력하세요.",
"DisMatchUserEmail": "사용자 E-mail이 일치하지 않습니다.",
"MyEnvironments": "나의 실행 환경",
- "ResourcePolicy": "자원 정책"
+ "ResourcePolicy": "자원 정책",
+ "Start": "시작"
},
"YouAreOffline": "오프라인: 네트워크에 연결되어 있지 않습니다.",
"YouAreOnline": "온라인 상태가 되었습니다",
diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json
index d99ab550ba..7ef7278e12 100644
--- a/resources/i18n/mn.json
+++ b/resources/i18n/mn.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Имэйлээ оруулна уу",
"DisMatchUserEmail": "Хэрэглэгчийн имэйл таарахгүй байна",
"MyEnvironments": "Миний орчин",
- "ResourcePolicy": "Нөөцийн бодлого"
+ "ResourcePolicy": "Нөөцийн бодлого",
+ "Start": "Эхлэх"
},
"YouAreOffline": "Офлайн: Ямар ч сүлжээнд холбогдоогүй.",
"YouAreOnline": "Та одоо онлайн байна",
diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json
index 930c559db5..04ee4be592 100644
--- a/resources/i18n/ms.json
+++ b/resources/i18n/ms.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Masukkan emel anda",
"DisMatchUserEmail": "E-mel Pengguna tidak sepadan",
"MyEnvironments": "Persekitaran Saya",
- "ResourcePolicy": "Dasar Sumber"
+ "ResourcePolicy": "Dasar Sumber",
+ "Start": "Mulakan"
},
"YouAreOffline": "Luar talian: Tidak disambungkan ke mana-mana rangkaian.",
"YouAreOnline": "Anda kini dalam talian",
diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json
index 0edb7706fe..f35878f626 100644
--- a/resources/i18n/pl.json
+++ b/resources/i18n/pl.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Wprowadź swój email",
"DisMatchUserEmail": "Adres e-mail użytkownika nie jest zgodny",
"MyEnvironments": "Moje Środowiska",
- "ResourcePolicy": "Polityka zasobów"
+ "ResourcePolicy": "Polityka zasobów",
+ "Start": "Start"
},
"YouAreOffline": "Offline: Brak połączenia z siecią.",
"YouAreOnline": "Jesteś teraz online",
diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json
index 01333073fa..69396fbec3 100644
--- a/resources/i18n/pt-BR.json
+++ b/resources/i18n/pt-BR.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Digite seu e-mail",
"DisMatchUserEmail": "E-mail do usuário não corresponde",
"MyEnvironments": "Meus ambientes",
- "ResourcePolicy": "Política de Recursos"
+ "ResourcePolicy": "Política de Recursos",
+ "Start": "Começar"
},
"YouAreOffline": "Desligado: Não está ligado a nenhuma rede.",
"YouAreOnline": "Agora você está online",
diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json
index f909e7087c..8704870044 100644
--- a/resources/i18n/pt.json
+++ b/resources/i18n/pt.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Digite seu e-mail",
"DisMatchUserEmail": "E-mail do usuário não corresponde",
"MyEnvironments": "Meus ambientes",
- "ResourcePolicy": "Política de Recursos"
+ "ResourcePolicy": "Política de Recursos",
+ "Start": "Começar"
},
"YouAreOffline": "Desligado: Não está ligado a nenhuma rede.",
"YouAreOnline": "Agora você está online",
diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json
index 2c2942a7a5..22f3ca7d0a 100644
--- a/resources/i18n/ru.json
+++ b/resources/i18n/ru.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Введите адрес электронной почты",
"DisMatchUserEmail": "Электронная почта пользователя не совпадает",
"MyEnvironments": "Моя среда",
- "ResourcePolicy": "Ресурсная политика"
+ "ResourcePolicy": "Ресурсная политика",
+ "Start": "Начинать"
},
"YouAreOffline": "Не в сети: Не подключен ни к одной сети.",
"YouAreOnline": "Вы сейчас в сети",
diff --git a/resources/i18n/th.json b/resources/i18n/th.json
index e885039575..e8e795964d 100644
--- a/resources/i18n/th.json
+++ b/resources/i18n/th.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "ใส่อีเมลของคุณ",
"DisMatchUserEmail": "อีเมลผู้ใช้ไม่ตรงกัน",
"MyEnvironments": "สภาพแวดล้อมของฉัน",
- "ResourcePolicy": "นโยบายทรัพยากร"
+ "ResourcePolicy": "นโยบายทรัพยากร",
+ "Start": "เริ่ม"
},
"YouAreOffline": "ออฟไลน์: ไม่ได้เชื่อมต่อกับเครือข่ายใดๆ",
"YouAreOnline": "คุณออนไลน์แล้ว",
diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json
index 4907a407c9..686547f5b0 100644
--- a/resources/i18n/tr.json
+++ b/resources/i18n/tr.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "E-postanızı giriniz",
"DisMatchUserEmail": "Kullanıcı E-postası eşleşmiyor",
"MyEnvironments": "Ortamlarım",
- "ResourcePolicy": "Kaynak Politikası"
+ "ResourcePolicy": "Kaynak Politikası",
+ "Start": "Başlangıç"
},
"YouAreOffline": "Çevrimdışı: Herhangi bir ağa bağlı değil.",
"YouAreOnline": "artık çevrimiçisin",
diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json
index 305eccfe07..9b85175bab 100644
--- a/resources/i18n/vi.json
+++ b/resources/i18n/vi.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "Nhập email của bạn",
"DisMatchUserEmail": "E-mail của người dùng không khớp",
"MyEnvironments": "Môi trường của tôi",
- "ResourcePolicy": "Chính sách tài nguyên"
+ "ResourcePolicy": "Chính sách tài nguyên",
+ "Start": "Bắt đầu"
},
"YouAreOffline": "Ngoại tuyến: Không kết nối với bất kỳ mạng nào.",
"YouAreOnline": "Bạn hiện đang trực tuyến",
diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json
index f92f9b0f1c..d3acc11a1b 100644
--- a/resources/i18n/zh-CN.json
+++ b/resources/i18n/zh-CN.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "输入你的电子邮箱",
"DisMatchUserEmail": "用户电子邮件不匹配",
"MyEnvironments": "我的环境",
- "ResourcePolicy": "资源政策"
+ "ResourcePolicy": "资源政策",
+ "Start": "开始"
},
"YouAreOffline": "脱机:未连接任何网络。",
"YouAreOnline": "您现在在线",
diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json
index f363f03059..ba51deda52 100644
--- a/resources/i18n/zh-TW.json
+++ b/resources/i18n/zh-TW.json
@@ -66,7 +66,8 @@
"InvalidBlankEmail": "輸入你的電子郵件信箱",
"DisMatchUserEmail": "使用者電子郵件不符",
"MyEnvironments": "我的環境",
- "ResourcePolicy": "資源政策"
+ "ResourcePolicy": "資源政策",
+ "Start": "開始"
},
"YouAreOffline": "脱机:未连接任何网络。",
"YouAreOnline": "您現在在線",
diff --git a/src/backend-ai-app.ts b/src/backend-ai-app.ts
index 61152b6346..c014baea45 100644
--- a/src/backend-ai-app.ts
+++ b/src/backend-ai-app.ts
@@ -12,6 +12,7 @@ export const navigate =
// Extract the page name from path.
if (
[
+ '/start',
'/summary',
'/job',
'/session',
diff --git a/src/components/backend-ai-error-view.ts b/src/components/backend-ai-error-view.ts
index 447b03acb9..e00f981eef 100644
--- a/src/components/backend-ai-error-view.ts
+++ b/src/components/backend-ai-error-view.ts
@@ -70,8 +70,8 @@ export default class BackendAIErrorView extends BackendAIPage {
* @param {string} url - page to redirect from the current page.
*/
_moveTo(url = '') {
- const page = url !== '' ? url : 'summary';
- globalThis.history.pushState({}, '', '/summary');
+ const page = url !== '' ? url : 'start';
+ globalThis.history.pushState({}, '', '/start');
store.dispatch(navigate(decodeURIComponent('/' + page), {}));
document.dispatchEvent(
new CustomEvent('react-navigate', {
@@ -98,7 +98,7 @@ export default class BackendAIErrorView extends BackendAIPage {
fullwidth
id="go-to-summary"
label="${_t('button.GoBackToSummaryPage')}"
- @click="${() => this._moveTo('summary')}"
+ @click="${() => this._moveTo('start')}"
>
diff --git a/src/components/backend-ai-permission-denied-view.ts b/src/components/backend-ai-permission-denied-view.ts
index 503a11adba..21b5e1e580 100644
--- a/src/components/backend-ai-permission-denied-view.ts
+++ b/src/components/backend-ai-permission-denied-view.ts
@@ -113,8 +113,8 @@ export default class BackendAIPermissionDeniedView extends BackendAIPage {
* @param {string} url - page to redirect from the current page.
*/
_moveTo(url = '') {
- const page = url !== '' ? url : 'summary';
- globalThis.history.pushState({}, '', '/summary');
+ const page = url !== '' ? url : 'start';
+ globalThis.history.pushState({}, '', '/start');
store.dispatch(navigate(decodeURIComponent('/' + page), {}));
}
@@ -135,7 +135,7 @@ export default class BackendAIPermissionDeniedView extends BackendAIPage {
fullwidth
id="go-to-summary"
label="${_t('button.GoBackToSummaryPage')}"
- @click="${() => this._moveTo('summary')}"
+ @click="${() => this._moveTo('start')}"
>
diff --git a/src/components/backend-ai-storage-list.ts b/src/components/backend-ai-storage-list.ts
index 5bd2b27369..328de6ad14 100644
--- a/src/components/backend-ai-storage-list.ts
+++ b/src/components/backend-ai-storage-list.ts
@@ -1080,7 +1080,7 @@ export default class BackendAiStorageList extends BackendAIPage {
* @param {string} url - page to redirect from the current page.
*/
_moveTo(url = '') {
- const page = url !== '' ? url : 'summary';
+ const page = url !== '' ? url : 'start';
// globalThis.history.pushState({}, '', page);
store.dispatch(navigate(decodeURIComponent(page), {}));
diff --git a/src/components/backend-ai-storage-proxy-list.ts b/src/components/backend-ai-storage-proxy-list.ts
index 6b1c808a21..e37bd812ed 100644
--- a/src/components/backend-ai-storage-proxy-list.ts
+++ b/src/components/backend-ai-storage-proxy-list.ts
@@ -249,7 +249,7 @@ export default class BackendAIStorageProxyList extends BackendAIPage {
* @param {string} url - page to redirect from the current page.
*/
_moveTo(url = '') {
- const page = url !== '' ? url : 'summary';
+ const page = url !== '' ? url : 'start';
// globalThis.history.pushState({}, '', page);
store.dispatch(navigate(decodeURIComponent(page), {}));
diff --git a/src/components/backend-ai-summary-view.ts b/src/components/backend-ai-summary-view.ts
index fd78b7d3c9..653e39734d 100644
--- a/src/components/backend-ai-summary-view.ts
+++ b/src/components/backend-ai-summary-view.ts
@@ -469,7 +469,7 @@ export default class BackendAISummary extends BackendAIPage {
* @param {string} search
*/
_moveTo(url = '', search: string | undefined = undefined) {
- const page = url !== '' ? url : 'summary';
+ const page = url !== '' ? url : 'start';
// globalThis.history.pushState({}, '', page);
store.dispatch(navigate(decodeURIComponent(page), {}));
diff --git a/src/components/backend-ai-webui.ts b/src/components/backend-ai-webui.ts
index c0c69ba109..a0cf6a5cea 100644
--- a/src/components/backend-ai-webui.ts
+++ b/src/components/backend-ai-webui.ts
@@ -145,6 +145,7 @@ export default class BackendAIWebUI extends connect(store)(LitElement) {
@property({ type: Number }) sidepanelWidth = 250;
@property({ type: Object }) supports = Object();
@property({ type: Array }) availablePages = [
+ 'start',
'summary',
'verify-email',
'change-password',
@@ -719,7 +720,7 @@ export default class BackendAIWebUI extends connect(store)(LitElement) {
*/
_loadPageElement() {
if (this._page === 'index.html' || this._page === '') {
- this._page = 'summary';
+ this._page = 'start';
navigate(decodeURIComponent('/'));
}
}