From 6b84a11c2aaa7d038ba11e3910e2b9b9c034275f Mon Sep 17 00:00:00 2001 From: Firesieht Date: Sun, 9 Oct 2022 09:03:07 +0300 Subject: [PATCH] add HR --- public/mock.png | Bin 0 -> 48835 bytes src/Transaction.tsx | 44 +++++ .../addAdminMarketCard/addAdminMarket.css | 28 +++- src/admin/addAdminMarketCard/index.tsx | 4 + src/admin/adminMarket/index.tsx | 4 + src/admin/adminMarketPopUp/index.tsx | 6 +- src/admin/adminTransactions/index.tsx | 7 + src/admin/userTable/index.tsx | 10 +- src/app/admin/adminSlice.ts | 4 +- src/app/consts.ts | 4 +- src/app/hooks.ts | 25 ++- src/app/hr/hrSlice.ts | 158 ++++++++++++++++++ src/app/hrStore.ts | 16 ++ src/app/interfaces.ts | 29 +++- src/components/Header/index.tsx | 2 - src/components/userPreview/index.tsx | 2 +- src/hr/EventCard/eventCard.css | 5 + src/hr/EventCard/index.tsx | 37 ++++ src/hr/addEvent/addEvent.css | 0 src/hr/addEvent/index.tsx | 91 ++++++++++ src/hr/index.tsx | 100 +++++++++++ src/hr/regUsers/index.tsx | 94 +++++++++++ src/hr/regUsers/regUsers.css | 0 src/hr/transactionHistory/index.tsx | 126 ++++++++++++++ src/index.tsx | 15 +- 25 files changed, 789 insertions(+), 22 deletions(-) create mode 100644 public/mock.png create mode 100644 src/Transaction.tsx create mode 100644 src/admin/adminTransactions/index.tsx create mode 100644 src/app/hr/hrSlice.ts create mode 100644 src/app/hrStore.ts create mode 100644 src/hr/EventCard/eventCard.css create mode 100644 src/hr/EventCard/index.tsx create mode 100644 src/hr/addEvent/addEvent.css create mode 100644 src/hr/addEvent/index.tsx create mode 100644 src/hr/index.tsx create mode 100644 src/hr/regUsers/index.tsx create mode 100644 src/hr/regUsers/regUsers.css create mode 100644 src/hr/transactionHistory/index.tsx diff --git a/public/mock.png b/public/mock.png new file mode 100644 index 0000000000000000000000000000000000000000..49cde8c68ec4c52e8baa3b79fc0df57508993a90 GIT binary patch literal 48835 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 b^#A_>Y|Gv9A9Pwi00000NkvXXu0mjfhgJ2O literal 0 HcmV?d00001 diff --git a/src/Transaction.tsx b/src/Transaction.tsx new file mode 100644 index 0000000..276ef2c --- /dev/null +++ b/src/Transaction.tsx @@ -0,0 +1,44 @@ +import { Button, Input } from "antd"; +import React, { useState } from "react"; +import { adminFetcher, hrFetcher } from "./app/hooks"; + +export const Transaction:React.FC = () =>{ + const [user, setUser] = useState("") + const [amount, setAmount] = useState(0) + + const reset = () =>{ + setUser("") + setAmount(0) + } + + const sendCoins = () =>{ + let formData = new FormData() + formData.append("amount", amount.toString()) + formData.append("username", user) + + hrFetcher.post("blockchain/transact/", formData).then(e=>{ + alert("Коины переведены!") + reset() + } + + ) + } + return( +
+
+
Перевод/Выдача DigitalRubles
+
+
+
Telegram username
+ setUser(e.target.value)} placeholder="firesieht"> +
+
+
Сумма в коинах
+ setAmount(Number(e.target.value))} placeholder="100"> +
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/admin/addAdminMarketCard/addAdminMarket.css b/src/admin/addAdminMarketCard/addAdminMarket.css index 7ea6872..9ef2a3a 100644 --- a/src/admin/addAdminMarketCard/addAdminMarket.css +++ b/src/admin/addAdminMarketCard/addAdminMarket.css @@ -6,6 +6,7 @@ display: flex; flex-direction: column; align-items: center; + gap:30px } .addProductCard{ @@ -109,4 +110,29 @@ align-items: center; justify-content: center; gap:25px -} \ No newline at end of file +} + +.userPreview{ + background: #262626; + border-radius: 16px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 32px 64px; + gap: 36px; + width: 75%; + font-family: 'Roboto', sans-serif; + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 22px; + /* identical to box height, or 157% */ + + text-align: right; + + /* Character/Title .85 */ + + color:#fff; +} + diff --git a/src/admin/addAdminMarketCard/index.tsx b/src/admin/addAdminMarketCard/index.tsx index 37eb928..d9a8130 100644 --- a/src/admin/addAdminMarketCard/index.tsx +++ b/src/admin/addAdminMarketCard/index.tsx @@ -47,6 +47,10 @@ export const AddAdminMarketProduct:React.FC = () =>{ link:"/admin/market/add", name:"Cоздать товар (NFT)" }, + { + link:"/admin/transaction", + name:"История транзакций" + }, ]} name={user.name}>
diff --git a/src/admin/adminMarket/index.tsx b/src/admin/adminMarket/index.tsx index c420c54..389059c 100644 --- a/src/admin/adminMarket/index.tsx +++ b/src/admin/adminMarket/index.tsx @@ -60,6 +60,10 @@ export const AdminMarket:React.FC = () =>{ link:"/admin/market/add", name:"Cоздать товар (NFT)" }, + { + link:"/admin/transaction", + name:"История транзакций" + }, ]} name={user.name}>
diff --git a/src/admin/adminMarketPopUp/index.tsx b/src/admin/adminMarketPopUp/index.tsx index bb8aaed..90b6798 100644 --- a/src/admin/adminMarketPopUp/index.tsx +++ b/src/admin/adminMarketPopUp/index.tsx @@ -43,7 +43,11 @@ export const AdminMarketPopUp:React.FC = () =>{ { link:"/admin/users", name:"Участники" - } + }, + { + link:"/admin/transaction", + name:"История транзакций" + }, ]} name={user.name}>
diff --git a/src/admin/adminTransactions/index.tsx b/src/admin/adminTransactions/index.tsx new file mode 100644 index 0000000..15ec420 --- /dev/null +++ b/src/admin/adminTransactions/index.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +export const AdminTransactions:React.FC = () =>{ + return(
+ +
); +} \ No newline at end of file diff --git a/src/admin/userTable/index.tsx b/src/admin/userTable/index.tsx index a9921d1..22e06c3 100644 --- a/src/admin/userTable/index.tsx +++ b/src/admin/userTable/index.tsx @@ -140,7 +140,7 @@ export const UserTable:React.FC = () =>{ command: user.command, role: user.type, respect: user.respect, - balance: user.salary, + balance: user.money, jobTittle: user.department, clan: user.clan_name }) as EmployerIE )))) @@ -156,7 +156,7 @@ export const UserTable:React.FC = () =>{ command: user.command, role: user.type, respect: user.respect, - balance: user.salary, + balance: user.money, jobTittle: user.department, }) )) } as ClanIE)) @@ -202,7 +202,11 @@ export const UserTable:React.FC = () =>{ link:"/admin/market/add", name:"Cоздать товар (NFT)" }, - + { + link:"/admin/transaction", + name:"История транзакций" + }, + ]} name={user.name}>
diff --git a/src/app/admin/adminSlice.ts b/src/app/admin/adminSlice.ts index fd5904d..e3bcc13 100644 --- a/src/app/admin/adminSlice.ts +++ b/src/app/admin/adminSlice.ts @@ -3,8 +3,6 @@ import { stat } from 'fs' import { Market, Roles, SortTypes, UserIE, ProductIE, EmployerIE, ClanIE} from '../interfaces' import { AppAdminDispatch, RootAdminState } from '../adminStore' import { adminFetcher, useAppDispatch } from '../hooks' -import { host, token } from '../consts' -import { triggerAsyncId } from 'async_hooks' @@ -15,7 +13,7 @@ const initState = { wallet:"123214", balance: 100, id:"1", - role:Roles.admin, + role:"ADMIN", name:"Firesieht" } as UserIE, //потом достается запросом market: { diff --git a/src/app/consts.ts b/src/app/consts.ts index 2538250..83b8b4f 100644 --- a/src/app/consts.ts +++ b/src/app/consts.ts @@ -1,2 +1,4 @@ export const host = "https://dev.akarpov.ru/api/" -export const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY1ODI0ODQxLCJpYXQiOjE2NjUyMjQ4NDEsImp0aSI6ImIyMjgzZjg0MmQ0NjQ4ZDU5MGY3N2Y1NzU2NDU3YjUyIiwidXNlcl9pZCI6NH0.-jAQjFLV9WCZEbthdpO-JDbRaL3N3eTCNr9Vo-PAUEk" \ No newline at end of file +export const adminToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY1ODcyMzQwLCJpYXQiOjE2NjUyNzIzNDAsImp0aSI6IjZkNGUxOTQ0ZTE3ZjQ4OTk4MjllYmU4Mzk2NDMwZTVlIiwidXNlcl9pZCI6Nn0.ivyEB13zMGS4liCn2N2fHUi0q9bbI8iaRWBXdiO30d4" +export const hrToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY1ODcyMzYxLCJpYXQiOjE2NjUyNzIzNjEsImp0aSI6Ijc3ZDk1ZTI2NWJkNzQ4NGRhNWY1MjYyNDE4YWQ2NzAwIiwidXNlcl9pZCI6NX0.luP2N8g_Yp3TNEwIBMYhSTSdSpUj3-QzT4PGfoYnM0k" +export const workerToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY1ODcyMzkxLCJpYXQiOjE2NjUyNzIzOTEsImp0aSI6IjBlYzQxOTUzMTA2NDRlOWFiNzE2NTgyZWJmZDY0MTBmIiwidXNlcl9pZCI6NH0.GULKUG-2iuEAVSPXdREC0wPbQbSsSaTLqQ3ZJblwtAk" \ No newline at end of file diff --git a/src/app/hooks.ts b/src/app/hooks.ts index 4ea28b1..2592a21 100644 --- a/src/app/hooks.ts +++ b/src/app/hooks.ts @@ -1,17 +1,38 @@ import axios from 'axios'; import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; import type { RootAdminState, AppAdminDispatch } from './adminStore'; -import { host, token } from './consts'; +import { host, adminToken, hrToken, workerToken } from './consts'; +import { AppHRDispatch, RootHRState } from './hrStore'; // Use throughout your app instead of plain `useDispatch` and `useSelector` export const useAppDispatch = () => useDispatch(); +export const useHRDispatch = () => useDispatch(); export const useAppSelector: TypedUseSelectorHook = useSelector; +export const useHRSelector: TypedUseSelectorHook = useSelector; export const adminFetcher = axios.create( { baseURL: host, timeout: 5000, headers: { - Authorization: 'Bearer ' + token + Authorization: 'Bearer ' + adminToken + } + } +) +export const hrFetcher = axios.create( + { + baseURL: host, + timeout: 5000, + headers: { + Authorization: 'Bearer ' + hrToken + } + } +) +export const workerFetcher = axios.create( + { + baseURL: host, + timeout: 5000, + headers: { + Authorization: 'Bearer ' + workerToken } } ) \ No newline at end of file diff --git a/src/app/hr/hrSlice.ts b/src/app/hr/hrSlice.ts new file mode 100644 index 0000000..193a678 --- /dev/null +++ b/src/app/hr/hrSlice.ts @@ -0,0 +1,158 @@ +import { createAsyncThunk, createSlice, createSelector, PayloadAction } from '@reduxjs/toolkit' +import { EventAttendence, EventIE, HRIE} from '../interfaces' +import { AppHRDispatch, RootHRState } from '../hrStore' +import { hrFetcher, useAppDispatch } from '../hooks' + + +const initState = { + me: {} as HRIE, + events: [] as EventIE[], + currentEvent: "", + attendences: [] as EventAttendence[], +} + +const hrSlice = createSlice( + { + name: "hrSlice", + initialState: initState, + reducers:{ + setMe(state, action:PayloadAction){ + state.me = action.payload + }, + setEvents(state, action:PayloadAction){ + state.events = action.payload + }, + setAttendences(state, action:PayloadAction){ + state.attendences = action.payload + }, + setCurrentEvent(state, aaction:PayloadAction){ + state.currentEvent = aaction.payload + }, + addEvent(state, action:PayloadAction){ + state.events = state.events.concat([action.payload]) + }, + delEvent(state, action:PayloadAction){ + let events = state.events + let ind = 0 + + events.forEach((event:EventIE, index:number) => { + if(event.slug == action.payload){ + ind = index + } + }); + events.splice(ind, 1) + state.events = events + }, + updateEvent(state, action:PayloadAction){ + let events = state.events + events.forEach((event:EventIE, index:number) => { + if(event.slug == action.payload.slug){ + events[index] = action.payload + } + }); + state.events = events + }, + submitAttendance(state, action:PayloadAction){ + let attendences = state.attendences + + attendences.forEach((attendance:EventAttendence, index:number) => { + if(attendance.worker_username == action.payload){ + attendences[index].attended = true + } + }); + state.attendences = attendences + } + + } + } +) + + + + +export async function fetchAddEvent(dispatch:AppHRDispatch, params:{name: string, about: string, starts:string, image:File}) { + //тут идет фетч + const formData = new FormData() + + formData.append("name",params.name) + formData.append("about",params.about) + formData.append("image", params.image) + formData.append("starts",params.starts) + + hrFetcher.post("events/", formData).then((response)=>{ + dispatch( + addEvent( + { + name: response.data.name, + about: response.data.about, + slug: response.data.slug, + creator: { + wallet: "", + role: response.data.creator.type, + telegram: response.data.creator.telegram, + command: response.data.creator.command, + respect: response.data.creator.respect, + balance: response.data.creator.money, + name: response.data.creator.name + } as HRIE, + starts: response.data.starts, + image: response.data.image, + planning: Number(response.data.planning), + attended: Number(response.data.attended) + } as EventIE + ) + ) + + }) +} + +export async function fetchDelEvent(dispatch:AppHRDispatch, params:string) { + + hrFetcher.delete("events/" + params).then(()=>{ + dispatch(delEvent(params)) + }) +} + +export async function fetchSubmitAttendance(dispatch:AppHRDispatch, user:string, currentEvent:string){ + const formData = new FormData() + formData.append("username", user) + + hrFetcher.post("events/attendance/" + currentEvent + "/submit/", formData).then(response=>{ + dispatch(submitAttendance(user)) + }) + + const salaryData = new FormData() + salaryData.append("username", user) + salaryData.append("amount", "1") + hrFetcher.post("blockchain/transact/", salaryData) +} + + +export const getCurrentEvent = createSelector( + (state:RootHRState) => state.hrSlice.events.filter(el=> el.slug == state.hrSlice.currentEvent)[0], + (field)=>field +) +export const getEvents = createSelector( + (state:RootHRState) => state.hrSlice.events, + (field)=>field +) +export const getMe = createSelector( + (state:RootHRState) => state.hrSlice.me, + (field)=>field +) + + + + +export const { + setEvents, + setAttendences, + setCurrentEvent, + addEvent, + delEvent, + updateEvent, + submitAttendance, + setMe +} = hrSlice.actions + +export default hrSlice.reducer \ No newline at end of file diff --git a/src/app/hrStore.ts b/src/app/hrStore.ts new file mode 100644 index 0000000..661541b --- /dev/null +++ b/src/app/hrStore.ts @@ -0,0 +1,16 @@ +import { configureStore, ThunkAction, Action } from '@reduxjs/toolkit'; +import hrSlice from './hr/hrSlice'; +export const hrStore = configureStore({ + reducer: { + hrSlice: hrSlice, + }, +}); + +export type AppHRDispatch = typeof hrStore.dispatch; +export type RootHRState = ReturnType; +export type AppHRThunk = ThunkAction< + ReturnType, + RootHRState, + unknown, + Action +>; diff --git a/src/app/interfaces.ts b/src/app/interfaces.ts index 3a9b021..7e71a7f 100644 --- a/src/app/interfaces.ts +++ b/src/app/interfaces.ts @@ -14,7 +14,7 @@ export enum Specialities{ export interface UserIE{ wallet:string, - role:Roles + role:string balance: number, name:string, } @@ -26,17 +26,32 @@ export interface EmployerIE extends UserIE{ respect: number, telegramID: string, command: string, - clan:string + clan:string, + money:number, } +export interface HRIE extends UserIE{ + respect:number, + command:number, + telegram: string, +} export interface EventIE{ name:string, - description: string, - date: Date, - time:Date, - org: number; - visitors: number[] + about: string, + starts: string, + slug:string, + creator:HRIE, + image:string, + planning:number, + attended:number +} + +export interface EventAttendence{ + id:number, + event_slug:string, + worker_username:string, + attended:boolean } export interface ProductIE{ diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index 601deb5..471127f 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -1,8 +1,6 @@ import "./Header.css" import React from "react" import { Link, useLocation, useParams } from "react-router-dom" -import axios, { AxiosHeaders } from 'axios'; -import { host, token } from "../../app/consts"; interface HeaderIE{ links: { diff --git a/src/components/userPreview/index.tsx b/src/components/userPreview/index.tsx index 9ce5a13..a10eb46 100644 --- a/src/components/userPreview/index.tsx +++ b/src/components/userPreview/index.tsx @@ -1,6 +1,6 @@ import { Tag } from 'antd' import react from 'react' - +import "./style.css" interface IUserPreview{ level: number; diff --git a/src/hr/EventCard/eventCard.css b/src/hr/EventCard/eventCard.css new file mode 100644 index 0000000..e83a526 --- /dev/null +++ b/src/hr/EventCard/eventCard.css @@ -0,0 +1,5 @@ +.eventImg{ + height: 50%; + max-height: 150px; + border-radius: 16px 16px 0px 0px; +} \ No newline at end of file diff --git a/src/hr/EventCard/index.tsx b/src/hr/EventCard/index.tsx new file mode 100644 index 0000000..fee8540 --- /dev/null +++ b/src/hr/EventCard/index.tsx @@ -0,0 +1,37 @@ +import { Button } from "antd" +import React from "react" +import { useNavigate } from "react-router-dom" +import { useHRDispatch } from "../../app/hooks" +import { fetchDelEvent } from "../../app/hr/hrSlice" +import "../../components/prevMarketCard/prevMarketCard.css" +import "./eventCard.css" + +interface EventCardIE{ + image:string, + cost: number, + descr: string, + name:string, + members: number + slug?:string +} + +export const EventCard:React.FC = (props) =>{ + let dispatch = useHRDispatch() + let navigator = useNavigate() + + return( +
+ +
+
+ +
{props.cost}
+
+
{props.name}
+
{props.descr.split(" ").slice(0,6).join(" ")}
+ + +
+
+ ) +} \ No newline at end of file diff --git a/src/hr/addEvent/addEvent.css b/src/hr/addEvent/addEvent.css new file mode 100644 index 0000000..e69de29 diff --git a/src/hr/addEvent/index.tsx b/src/hr/addEvent/index.tsx new file mode 100644 index 0000000..1013f41 --- /dev/null +++ b/src/hr/addEvent/index.tsx @@ -0,0 +1,91 @@ +import "./addEvent.css" +import { Button, DatePicker, Input } from "antd"; +import React, { useState } from "react" +import { useNavigate } from "react-router-dom"; +import { useHRDispatch } from "../../app/hooks"; +import { fetchAddEvent } from "../../app/hr/hrSlice"; +import { FileUploader } from "../../components/fileUploader"; +import { Header } from "../../components/Header"; +import { EventCard } from "../EventCard"; + + +export const AddEvent: React.FC = () =>{ + + const [name, setName] = useState("") + const [about, setAbout] = useState("") + const [starts, setStarts] = useState("") + const [image, setImage] = useState() + + let navigate = useNavigate() + let dispatch = useHRDispatch() + + + + const create = () =>{ + fetchAddEvent(dispatch, { + name:name, + about:about, + starts:starts, + image:image as any + }) + + alert("Ивент успешно создан!") + + navigate("/hr") + + } + + return( +
+
+
+
Cоздать новое событие
+
+ +
+
+
Название
+ setName(e.target.value)}> +
+
+
Описание
+ setAbout(e.target.value)}> +
+
+
Дата проведения
+ setStarts(datestring)} /> +
+
+
Картинка
+ setImage(file)}> +
+
+
+
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/hr/index.tsx b/src/hr/index.tsx new file mode 100644 index 0000000..2f835c9 --- /dev/null +++ b/src/hr/index.tsx @@ -0,0 +1,100 @@ +import { Tag } from "antd"; +import React from "react"; +import { hrFetcher, useAppSelector, useHRDispatch, useHRSelector } from "../app/hooks"; +import { getEvents, getMe, setEvents, setMe } from "../app/hr/hrSlice"; +import { RootHRState } from "../app/hrStore"; +import { EventIE, HRIE } from "../app/interfaces"; +import { Header } from "../components/Header"; +import { UserPreview } from "../components/userPreview"; +import { EventCard } from "./EventCard"; + + +export const HR:React.FC = () =>{ + let me = useHRSelector((state:RootHRState)=>getMe(state)) + let dispatch = useHRDispatch() + let events = useHRSelector((state:RootHRState)=>getEvents(state)) + + + if (me.telegram == undefined){ + hrFetcher.get("users/self/").then(response=>{ + dispatch(setMe({ + wallet: response.data.wallet_public_key, + role: response.data.type, + telegram: response.data.telegram, + command: response.data.command, + respect: response.data.respect, + balance: response.data.money, + name: response.data.name + } as HRIE)) + }) + hrFetcher.get("events/").then(resp=>{ + dispatch(setEvents(resp.data.map((response:any)=>({ + name: response.name, + about: response.about, + slug: response.slug, + creator: { + wallet: "", + role: response.creator.type, + telegram: response.creator.telegram, + command: response.creator.command, + respect: response.creator.respect, + balance: response.creator.money, + name: response.creator.name + } as HRIE, + starts: response.starts, + image: response.image, + planning: Number(response.planning), + attended: Number(response.attended) + } as EventIE)))) + }) + } + + return( +
+
+
+ HR]} + description={"Sample"} + score={Number(me.respect).toString()} + > +
+
+
Доступные события
+
+ { + events.map(event=>) + } +
+
+
+ ) +} \ No newline at end of file diff --git a/src/hr/regUsers/index.tsx b/src/hr/regUsers/index.tsx new file mode 100644 index 0000000..82b540e --- /dev/null +++ b/src/hr/regUsers/index.tsx @@ -0,0 +1,94 @@ +import React, { useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import "./regUsers.css" +import type { ColumnsType } from 'antd/es/table'; +import { Button, Space, Table, Tag } from 'antd'; +import { fetchSubmitAttendance, getCurrentEvent, setCurrentEvent } from "../../app/hr/hrSlice"; +import { hrFetcher, useHRDispatch, useHRSelector } from "../../app/hooks"; +import { RootHRState } from "../../app/hrStore"; + +interface DataTypeIE{ + key:string, + id:number, + telegram:string, + attended: boolean +} + + +export const RegUsers:React.FC = () =>{ + const [attendance, setAttendance] = useState([-1 as any]) + let {name} = useParams() + + let navigator = useNavigate() + const collator = new Intl.Collator('ru'); + const data:DataTypeIE[] = [] + let dispatch = useHRDispatch() + + dispatch(setCurrentEvent(name as string)) + if (attendance[0] == -1){ + hrFetcher.get("events/attendance/"+name+"/list/").then(response=>setAttendance(response.data)) + + } + + + + const columns: ColumnsType = [ + { + title: 'ID', + dataIndex: 'id', + key: 'id', + defaultSortOrder: 'descend', + sorter: (a, b) => a.id - b.id , + }, + { + title: 'Telegram', + dataIndex: 'telegram', + key: 'telegram', + sorter: (a, b) => collator.compare(a.telegram, b.telegram) , + + }, + + { + title: 'Респект', + dataIndex: 'telegram', + key: 'telegram', + render: text=>
{ "5"}
+ }, + { + title: 'Начислено', + dataIndex: 'attended', + key: 'attended', + render: text=> + {text? "Да":"Нет"} + + }, + { + title: "Награда", + dataIndex: 'speciality', + key: 'speciality', + render: (_, recorder) => + } + ] + + attendance.forEach((attend)=>{ + data.push({ + key:attend.id, + id: attend.id, + telegram: attend.worker_username, + attended: attend.attended + } as DataTypeIE) + }) + + let currentEvent = useHRSelector((state:RootHRState)=>getCurrentEvent(state)) + + + return( +
+
+
Участники мероприятия {currentEvent.name}
+ + + + + ); +} \ No newline at end of file diff --git a/src/hr/regUsers/regUsers.css b/src/hr/regUsers/regUsers.css new file mode 100644 index 0000000..e69de29 diff --git a/src/hr/transactionHistory/index.tsx b/src/hr/transactionHistory/index.tsx new file mode 100644 index 0000000..e95a9f0 --- /dev/null +++ b/src/hr/transactionHistory/index.tsx @@ -0,0 +1,126 @@ +import { Button, Table, Tag } from "antd"; +import { ColumnsType } from "antd/es/table"; +import React, { useState } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import { adminFetcher, hrFetcher, useHRDispatch } from "../../app/hooks"; +import { Header } from "../../components/Header"; + +interface DataTypeIE{ + key:string, + type:string, + user_from:string, + user_to: string, + amount: number +} + +export const TransactionHistory: React.FC = () =>{ + const [transaction, setTransaction] = useState([-1] as any) + let location = useLocation() + let hr; + if (location.pathname.split("/")[1] == "hr"){ + hr = true + } + + if (transaction[0] == -1){ + if(hr){ + console.log(1) + hrFetcher.get("blockchain/history/").then(response=>setTransaction(response.data)) + } + else{ + console.log(2) + adminFetcher.get("blockchain/history/").then(response=>setTransaction(response.data)) + + } + } + let navigator = useNavigate() + const collator = new Intl.Collator('ru'); + const data:DataTypeIE[] = [] + + const columns: ColumnsType = [ + { + title: 'Тип операции', + dataIndex: 'type', + key: 'type', + sorter: (a, b) => collator.compare(a.type, b.type), + render: text=> + {text} + + }, + { + title: 'Отправитель', + dataIndex: 'user_from', + key: 'user_from', + sorter: (a, b) => collator.compare(a.user_from, b.user_from) , + + }, + { + title: 'Получатель', + dataIndex: 'user_to', + key: 'user_to', + sorter: (a, b) => collator.compare(a.user_to, b.user_to) , + + }, + { + title: 'Сумма', + dataIndex: 'amount', + key: 'amount', + render: text=>
{ text}
+ }, + ] + transaction.forEach((el:any)=>{ + data.push({ + key: el.type, + type: el.type, + user_from: el.user_from, + user_to: el.user_to, + amount: el.amount, + } as DataTypeIE) + }) + + return( +
+ {hr?
:
+ } + + +
+
История транзакций
+ +
+ + + + ); +} \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index 2a4b55c..f7b3e7a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -23,6 +23,12 @@ import { AdminClans } from './admin/adminClans'; import { AddUser } from './admin/addUser'; import { UserLk } from './user/lk'; import { Clan } from './user/clan'; +import { HR } from './hr'; +import { hrStore } from './app/hrStore'; +import { AddEvent } from './hr/addEvent'; +import { RegUsers } from './hr/regUsers'; +import { TransactionHistory } from './hr/transactionHistory'; +import { Transaction } from './Transaction'; const container = document.getElementById('root')!; @@ -38,10 +44,17 @@ const router = createBrowserRouter( }>}>}> + }> + +
}>
+ }> + }> + }> - } /> } /> + + }> )