From 63633dcd62e72a6c55533b50949630ed8d554328 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Sat, 30 Sep 2023 14:21:44 +0700 Subject: initial commit --- src/App.jsx | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Entry.jsx | 29 +++++++++++++++++++ src/SalaryInput.jsx | 23 +++++++++++++++ src/main.jsx | 13 +++++++++ 4 files changed, 147 insertions(+) create mode 100644 src/App.jsx create mode 100644 src/Entry.jsx create mode 100644 src/SalaryInput.jsx create mode 100644 src/main.jsx (limited to 'src') diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..da2bbc7 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,82 @@ +import {useEffect, useState} from "react"; +import Entry from "./Entry.jsx"; + +import {Button, Container, Typography} from "@mui/material"; +import dayjs from "dayjs"; +import SalaryInput from "./SalaryInput.jsx"; + + +function App() { + const [listEntry, setListEntry] = useState( + [ + {id: 0, date: dayjs(), start: dayjs(), finish: dayjs()}, + ] + ); + const [removeDisabled, setRemoveDisabled] = useState(false); + // const [lastId, setLastId] = useState(0); + + useEffect(() => { + setRemoveDisabled(listEntry.length === 1); + }, [listEntry]); + + const getLastId = () => { + const lastEntry = listEntry[listEntry.length - 1]; + return lastEntry.id; + } + + const addToList = () => { + const newEntry = { + id: getLastId() + 1, + date: dayjs(), + start: dayjs(), + finish: dayjs() + } + setListEntry((currentList) => [...currentList, newEntry]); + } + + const removeFromList = (id) => { + setListEntry((currentList) => { + return currentList.filter((en) => en.id !== id); + }); + } + + return ( + + Overtime Calculator + 🤑🤑 Sudahkah anda lembur hari ini? 🤑🤑 + + + ) +} + +export default App diff --git a/src/Entry.jsx b/src/Entry.jsx new file mode 100644 index 0000000..e554050 --- /dev/null +++ b/src/Entry.jsx @@ -0,0 +1,29 @@ +import {useState} from "react"; +import {DatePicker, LocalizationProvider, TimePicker} from '@mui/x-date-pickers'; +import {AdapterDayjs} from '@mui/x-date-pickers/AdapterDayjs'; +import 'dayjs/locale/id'; + + +function Entry({propDate, propStart, propFinish}) { + const [date, setDate] = useState(propDate); + const [start, setStart] = useState(propStart); + const [finish, setFinish] = useState(propFinish); + + return ( + +
+ setDate(newDate)}/> + { + setStart(newStart) + }}/> + { + setFinish(newFinish); + console.log(newFinish) + }}/> +
+
+ ) +} + +export default Entry; \ No newline at end of file diff --git a/src/SalaryInput.jsx b/src/SalaryInput.jsx new file mode 100644 index 0000000..f04c68f --- /dev/null +++ b/src/SalaryInput.jsx @@ -0,0 +1,23 @@ +import { useState } from "react"; +import TextField from "@mui/material/TextField"; +import { NumericFormat } from "react-number-format"; + +function SalaryInput() { + const [displayValue, setDisplayValue] = useState(''); + return ( + {setDisplayValue(value.value)}} + InputProps={{ + startAdornment: Rp + }} + /> + ); +} + +export default SalaryInput; diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..6552764 --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import '@fontsource/roboto/300.css'; +import '@fontsource/roboto/400.css'; +import '@fontsource/roboto/500.css'; +import '@fontsource/roboto/700.css'; + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) -- cgit v1.2.3-70-g09d2