mirror of
https://github.com/snowball-tools/snowballtools-base.git
synced 2024-12-23 00:57:44 +00:00
Implement layout for Deploy section of creating new project (#7)
* Implement layout for deploy page * Add time functionality in deploy page --------- Co-authored-by: neeraj <neeraj.rtly@gmail.com>
This commit is contained in:
parent
cc071dddcf
commit
3e00ef555c
@ -18,6 +18,7 @@
|
|||||||
"react-router-dom": "^6.20.1",
|
"react-router-dom": "^6.20.1",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
"react-tabs": "^6.0.2",
|
"react-tabs": "^6.0.2",
|
||||||
|
"react-timer-hook": "^3.0.7",
|
||||||
"typescript": "^4.9.5",
|
"typescript": "^4.9.5",
|
||||||
"web-vitals": "^2.1.4"
|
"web-vitals": "^2.1.4"
|
||||||
},
|
},
|
||||||
|
67
packages/frontend/src/components/DeployStep.tsx
Normal file
67
packages/frontend/src/components/DeployStep.tsx
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
|
||||||
|
import { Stopwatch, setStopWatchOffset } from './StopWatch';
|
||||||
|
import FormatMillisecond from './FormatMilliSecond';
|
||||||
|
|
||||||
|
const PROCESS_LOG =
|
||||||
|
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.";
|
||||||
|
|
||||||
|
enum DeployStatus {
|
||||||
|
PROCESSING = 'progress',
|
||||||
|
COMPLETE = 'complete',
|
||||||
|
NOT_STARTED = 'notStarted',
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DeployStepsProps {
|
||||||
|
status: DeployStatus;
|
||||||
|
title: string;
|
||||||
|
step?: string;
|
||||||
|
startTime?: string;
|
||||||
|
processTime?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DeployStep = ({
|
||||||
|
step,
|
||||||
|
status,
|
||||||
|
title,
|
||||||
|
startTime,
|
||||||
|
processTime,
|
||||||
|
}: DeployStepsProps) => {
|
||||||
|
const [collapse, setCollapse] = useState(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="border-b-2 border-slate-200 flex justify-between p-2 gap-2">
|
||||||
|
{status === DeployStatus.NOT_STARTED && <div>{step}</div>}
|
||||||
|
{status === DeployStatus.PROCESSING && <div>O</div>}
|
||||||
|
{status === DeployStatus.COMPLETE && (
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
setCollapse(!collapse);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{collapse ? '-' : '+'}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="grow">{title}</div>
|
||||||
|
{status === DeployStatus.PROCESSING && (
|
||||||
|
<>
|
||||||
|
^<Stopwatch offsetTimestamp={setStopWatchOffset(startTime!)} />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{status === DeployStatus.COMPLETE && (
|
||||||
|
<>
|
||||||
|
^<FormatMillisecond time={Number(processTime)} />{' '}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={`text-sm ${!collapse ? 'hidden' : ''}`}>
|
||||||
|
{PROCESS_LOG}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export { DeployStep, DeployStatus };
|
18
packages/frontend/src/components/FormatMilliSecond.tsx
Normal file
18
packages/frontend/src/components/FormatMilliSecond.tsx
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { Duration } from 'luxon';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
const FormatMillisecond = ({ time }: { time: number }) => {
|
||||||
|
const formatTime = Duration.fromMillis(time)
|
||||||
|
.shiftTo('days', 'hours', 'minutes', 'seconds')
|
||||||
|
.toObject();
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{formatTime.days !== 0 && <span>{formatTime.days}d </span>}
|
||||||
|
{formatTime.hours !== 0 && <span>{formatTime.hours}h </span>}
|
||||||
|
{formatTime.minutes !== 0 && <span>{formatTime.minutes}m </span>}
|
||||||
|
<span>{formatTime.seconds}s</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FormatMillisecond;
|
23
packages/frontend/src/components/StopWatch.tsx
Normal file
23
packages/frontend/src/components/StopWatch.tsx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useStopwatch } from 'react-timer-hook';
|
||||||
|
|
||||||
|
import FormatMillisecond from './FormatMilliSecond';
|
||||||
|
|
||||||
|
const setStopWatchOffset = (time: string) => {
|
||||||
|
const providedTime = new Date(time);
|
||||||
|
const currentTime = new Date();
|
||||||
|
const timeDifference = currentTime.getTime() - providedTime.getTime();
|
||||||
|
currentTime.setMilliseconds(currentTime.getMilliseconds() + timeDifference);
|
||||||
|
return currentTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Stopwatch = ({ offsetTimestamp }: { offsetTimestamp: Date }) => {
|
||||||
|
const { totalSeconds } = useStopwatch({
|
||||||
|
autoStart: true,
|
||||||
|
offsetTimestamp: offsetTimestamp,
|
||||||
|
});
|
||||||
|
|
||||||
|
return <FormatMillisecond time={totalSeconds * 1000} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export { Stopwatch, setStopWatchOffset };
|
@ -3,6 +3,7 @@ import { Outlet, useNavigate } from 'react-router-dom';
|
|||||||
|
|
||||||
const CreateProject = () => {
|
const CreateProject = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-white rounded-3xl h-full p-4">
|
<div className="bg-white rounded-3xl h-full p-4">
|
||||||
<div className="flex p-2">
|
<div className="flex p-2">
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { Outlet } from 'react-router-dom';
|
||||||
import CreateRepo from '../../../components/CreateRepo';
|
|
||||||
|
|
||||||
const CreateWithTemplate = () => {
|
const CreateWithTemplate = () => {
|
||||||
return (
|
return (
|
||||||
@ -16,7 +15,7 @@ const CreateWithTemplate = () => {
|
|||||||
<div>2 Deploy</div>
|
<div>2 Deploy</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-2">
|
<div className="col-span-2">
|
||||||
<CreateRepo />
|
<Outlet />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,6 +2,7 @@ import React from 'react';
|
|||||||
|
|
||||||
import NewProject from './index';
|
import NewProject from './index';
|
||||||
import CreateWithTemplate from './Template';
|
import CreateWithTemplate from './Template';
|
||||||
|
import { templateRoutes } from './template/routes';
|
||||||
|
|
||||||
export const createProjectRoutes = [
|
export const createProjectRoutes = [
|
||||||
{
|
{
|
||||||
@ -11,5 +12,6 @@ export const createProjectRoutes = [
|
|||||||
{
|
{
|
||||||
path: 'template',
|
path: 'template',
|
||||||
element: <CreateWithTemplate />,
|
element: <CreateWithTemplate />,
|
||||||
|
children: templateRoutes,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import { DeployStep, DeployStatus } from '../../../../components/DeployStep';
|
||||||
|
import {
|
||||||
|
Stopwatch,
|
||||||
|
setStopWatchOffset,
|
||||||
|
} from '../../../../components/StopWatch';
|
||||||
|
|
||||||
|
const Deploy = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div className="flex justify-between mb-6">
|
||||||
|
<div>
|
||||||
|
<h4>Deployment started ...</h4>
|
||||||
|
<div className="flex">
|
||||||
|
^
|
||||||
|
<Stopwatch
|
||||||
|
offsetTimestamp={setStopWatchOffset(Date.now().toString())}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button className="border rounded-xl p-1 text-sm">^Cancel</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<DeployStep
|
||||||
|
title="Building"
|
||||||
|
status={DeployStatus.COMPLETE}
|
||||||
|
step="1"
|
||||||
|
processTime="72000"
|
||||||
|
/>
|
||||||
|
<DeployStep
|
||||||
|
title="Deployment summary"
|
||||||
|
status={DeployStatus.PROCESSING}
|
||||||
|
step="2"
|
||||||
|
startTime={Date.now().toString()}
|
||||||
|
/>
|
||||||
|
<DeployStep
|
||||||
|
title="Running checks"
|
||||||
|
status={DeployStatus.NOT_STARTED}
|
||||||
|
step="3"
|
||||||
|
/>
|
||||||
|
<DeployStep
|
||||||
|
title="Assigning domains"
|
||||||
|
status={DeployStatus.NOT_STARTED}
|
||||||
|
step="4"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Deploy;
|
@ -1,7 +1,8 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useForm, Controller } from 'react-hook-form';
|
import { useForm, Controller } from 'react-hook-form';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
import Dropdown from './Dropdown';
|
import Dropdown from '../../../../components/Dropdown';
|
||||||
|
|
||||||
const USER_OPTIONS = [
|
const USER_OPTIONS = [
|
||||||
{ value: 'saugatyadav1', label: 'saugatyadav1' },
|
{ value: 'saugatyadav1', label: 'saugatyadav1' },
|
||||||
@ -88,9 +89,11 @@ const CreateRepo = () => {
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-2">
|
<div className="mb-2">
|
||||||
<button className="bg-blue-500 rounded-xl p-2" type="submit">
|
<Link to={'/projects/create/template/deploy'}>
|
||||||
Deploy ^
|
<button className="bg-blue-500 rounded-xl p-2" type="submit">
|
||||||
</button>
|
Deploy ^
|
||||||
|
</button>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
@ -0,0 +1,15 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import CreateRepo from './index';
|
||||||
|
import Deploy from './Deploy';
|
||||||
|
|
||||||
|
export const templateRoutes = [
|
||||||
|
{
|
||||||
|
index: true,
|
||||||
|
element: <CreateRepo />,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'deploy',
|
||||||
|
element: <Deploy />,
|
||||||
|
},
|
||||||
|
];
|
@ -10280,6 +10280,11 @@ react-tabs@^6.0.2:
|
|||||||
clsx "^2.0.0"
|
clsx "^2.0.0"
|
||||||
prop-types "^15.5.0"
|
prop-types "^15.5.0"
|
||||||
|
|
||||||
|
react-timer-hook@^3.0.7:
|
||||||
|
version "3.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-timer-hook/-/react-timer-hook-3.0.7.tgz#ac42c43d0034b873cbf97b44eb34ccb2b11fe5e0"
|
||||||
|
integrity sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==
|
||||||
|
|
||||||
react@^18.2.0:
|
react@^18.2.0:
|
||||||
version "18.2.0"
|
version "18.2.0"
|
||||||
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
|
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
|
||||||
|
Loading…
Reference in New Issue
Block a user