Guest User

Untitled

a guest
Oct 25th, 2021
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.34 KB | None | 0 0
  1. /* eslint-disable prefer-const */
  2. /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
  3. /* eslint-disable @typescript-eslint/no-explicit-any */
  4. import { useEffect, useState } from 'react'
  5. import Link from 'next/link'
  6. import { GRAPHQL_AUTH_MODE } from '@aws-amplify/api'
  7. import { Auth, API } from 'aws-amplify'
  8. import {
  9. BarChart,
  10. Bar,
  11. XAxis,
  12. YAxis,
  13. CartesianGrid,
  14. Tooltip,
  15. Legend,
  16. ResponsiveContainer,
  17. } from 'recharts'
  18. import Moment from 'moment'
  19.  
  20. import * as customQueries from '@app/graphql/custom-queries'
  21. import React from 'react'
  22. import { ConsoleLogger } from '@aws-amplify/core'
  23. import DataValues from '@app/lib/data-values'
  24.  
  25. interface PropsButton {
  26. label: string
  27. onSelect: (value: string) => void
  28. }
  29.  
  30. interface IReportCurrentData {
  31. id: string
  32. userID: string
  33. tag: string
  34. notes: string
  35. message: string
  36. page: string
  37. manufacturer: string
  38. model: string
  39. osName: string
  40. osVersion: string
  41. platform: string
  42. uuid: string
  43. ip: string
  44. city: string
  45. region: string
  46. country: string
  47. provider: string
  48. lat: number
  49. lng: number
  50. createdAt: string
  51. updatedAt: string
  52. user: {
  53. name: string
  54. email: string
  55. phone: string
  56. active: boolean
  57. avatar: null
  58. }
  59. }
  60.  
  61. export default function Quicksight(): JSX.Element {
  62. const [reportsData, setReportsData] = useState<IReportCurrentData[]>([])
  63. const [emittersData, setEmittersData] = useState([] as any)
  64. const [searchUser, setSearchUser] = useState<string[]>([])
  65. const [dateFilter, setDateFilter] = useState({
  66. minDate: Moment().format('YYYY-MM-DD'),
  67. maxDate: Moment().format('YYYY-MM-DD'),
  68. })
  69.  
  70. function onChangeMinDate(e: any) {
  71. const value = e.nativeEvent.target.value
  72. setDateFilter((prev) => ({
  73. ...prev,
  74. minDate: Moment(value).format('YYYY-MM-DD'),
  75. }))
  76. }
  77.  
  78. function onChangeMaxDate(e: any) {
  79. const value = e.nativeEvent.target.value
  80. setDateFilter((prev) => ({
  81. ...prev,
  82. maxDate: Moment(value).format('YYYY-MM-DD'),
  83. }))
  84. }
  85.  
  86. async function listEmitters(limit: number) {
  87. let nextToken: any
  88. const apiName = 'AdminQueries'
  89. const path = '/listUsersInGroup'
  90. const myInit = {
  91. queryStringParameters: {
  92. groupname: 'Emitters',
  93. limit: limit,
  94. token: nextToken,
  95. },
  96. headers: {
  97. 'Content-Type': 'application/json',
  98. Authorization: `${(await Auth.currentSession())
  99. .getAccessToken()
  100. .getJwtToken()}`,
  101. },
  102. }
  103. const { NextToken, ...rest } = await API.get(apiName, path, myInit)
  104. nextToken = NextToken
  105. return rest
  106. }
  107.  
  108. async function listEmittersArray() {
  109. const map = await listEmitters(60)
  110. const result: any = Object.keys(map).map(
  111. (key) => newFunction(map, key) as any
  112. )
  113. setEmittersData(result[0])
  114. console.log(emittersData)
  115. }
  116.  
  117. useEffect(() => {
  118. listEmittersArray()
  119. }, [])
  120.  
  121. async function listReports() {
  122. const reports = await API.graphql({
  123. query: customQueries.listLogsByTagCreatedAtCustom,
  124. variables: { createdAt: { ge: '0' }, tag: 'REPORT_CREATE' },
  125. authMode: GRAPHQL_AUTH_MODE.API_KEY,
  126. })
  127. return reports
  128. }
  129.  
  130. const listReportsArray = async () => {
  131. const map = await listReports()
  132. const result: any = Object.keys(map).map(
  133. (key) => newFunction(map, key) as any
  134. )
  135. setReportsData(result[0].listLogsByTagCreatedAt.items)
  136. console.log(reportsData)
  137. }
  138.  
  139. useEffect(() => {
  140. listReportsArray()
  141. }, [])
  142.  
  143. console.log(dateFilter)
  144.  
  145. const EmittersComponent: React.FC<PropsButton> = ({ label, onSelect }) => {
  146. const [checked, setChecked] = useState(false)
  147.  
  148. function handleSelect() {
  149. onSelect(label)
  150. setChecked((prev) => !prev)
  151. }
  152.  
  153. return (
  154. <div className="grid grid-cols-3 gap-3 lg:grid-cols-2">
  155. <li className="mt-4 flex items-start">
  156. <div className="flex items-center h-5">
  157. <input
  158. type="checkbox"
  159. onChange={handleSelect}
  160. checked={checked}
  161. className="h-4 w-4 focus:bg-indigo border-2 border-gray-300 rounded"
  162. />
  163. </div>
  164. <div className="ml-3 text-sm">
  165. <span className="font-medium text-gray-700">
  166. {label || 'Sem nome'}
  167. </span>
  168. </div>
  169. </li>
  170. </div>
  171. )
  172. }
  173.  
  174. function handleToggle(label: string) {
  175. setSearchUser((prev) =>
  176. prev.some((item) => item === label)
  177. ? prev.filter((item) => item !== label)
  178. : [...prev, label]
  179. )
  180. }
  181.  
  182. const emittersComponent = () => (
  183. <div>
  184. {emittersData.map((value: any, index: any) => (
  185. <EmittersComponent
  186. key={index}
  187. label={value.Attributes[2]?.Value}
  188. onSelect={handleToggle}
  189. />
  190. ))}
  191. </div>
  192. )
  193.  
  194. return (
  195. <>
  196. <div className="lg:px-8 my-8">
  197. <span className="text-xl font-medium text-accent-9">
  198. Escolha o período
  199. </span>
  200. <div className="my-3 flex flex-nowrap">
  201. <input
  202. className="bg-accent-1 mx-2 rounded-full px-3 py-2 outline-none border-none appearance-none transition duration-150 ease-in-out"
  203. type="date"
  204. value={dateFilter.minDate}
  205. id="dateBegin"
  206. name="dateBegin"
  207. onChange={onChangeMinDate}
  208. />
  209. <input
  210. className="bg-accent-1 mx-2 rounded-full px-3 py-2 outline-none border-none appearance-none transition duration-150 ease-in-out"
  211. type="date"
  212. value={dateFilter.maxDate}
  213. id="dateEnd"
  214. name="dateEnd"
  215. onChange={onChangeMaxDate}
  216. />
  217. </div>
  218. <div className="my-6">
  219. <div className="grid grid-cols-1 lg:grid-cols-2 lg:gap-6">
  220. <div>
  221. <span className="text-xl font-medium text-accent-9">
  222. Escolha os emissores:
  223. </span>
  224. <ul>{emittersComponent()}</ul>
  225. </div>
  226. <div>
  227. <div className="bg-accent-1 my-8 w-96 rounded-md p-4 text-center flex justify-center items-center">
  228. <div className="grid grid-cols-1">
  229. <span className="font-bold uppercase">
  230. Laudos emitidos no período:
  231. </span>
  232. <span className="text-6xl font-bold">
  233. {
  234. reportsData
  235. .filter((value: any) =>
  236. searchUser.length > 0
  237. ? searchUser.includes(value.user.name)
  238. : true
  239. )
  240. .filter(
  241. (value) =>
  242. dateFilter.minDate &&
  243. dateFilter.maxDate &&
  244. Moment(
  245. Moment(value.createdAt).format('YYYY-MM-DD')
  246. ).valueOf() >=
  247. Moment(dateFilter.minDate).valueOf() &&
  248. Moment(
  249. Moment(value.createdAt).format('YYYY-MM-DD')
  250. ).valueOf() <= Moment(dateFilter.maxDate).valueOf()
  251. ).length
  252. }
  253. </span>
  254. </div>
  255. </div>
  256. </div>
  257. </div>
  258. </div>
  259. </div>
  260. {/* <div className="lg:px-8 my-8 w-full h-96">
  261. <ResponsiveContainer width="100%" height="100%">
  262. <BarChart
  263. width={1000}
  264. height={300}
  265. data={data}
  266. margin={{
  267. top: 5,
  268. right: 5,
  269. left: 5,
  270. bottom: 5,
  271. }}
  272. >
  273. <CartesianGrid strokeDasharray="3 3" />
  274. <XAxis dataKey="name" />
  275. <YAxis />
  276. <Tooltip />
  277. <Legend />
  278. <Bar maxBarSize={80} dataKey="Laudos" fill="#1B9CE2" />
  279. </BarChart>
  280. </ResponsiveContainer>
  281. </div> */}
  282. <div className="lg:px-8 my-8">
  283. <div className="overflow-x-auto lg:px-8">
  284. <table className="table w-full table-zebra">
  285. <thead>
  286. <tr>
  287. <th>N°</th>
  288. <th>Emissor</th>
  289. <th>ID do Laudo</th>
  290. <th>Criado Em</th>
  291. </tr>
  292. </thead>
  293. <tbody>
  294. {reportsData
  295. .filter((value: any) =>
  296. searchUser.length > 0
  297. ? searchUser.includes(value.user.name)
  298. : true
  299. )
  300. .filter(
  301. (value) =>
  302. dateFilter.minDate &&
  303. dateFilter.maxDate &&
  304. Moment(
  305. Moment(value.createdAt).format('YYYY-MM-DD')
  306. ).valueOf() >= Moment(dateFilter.minDate).valueOf() &&
  307. Moment(
  308. Moment(value.createdAt).format('YYYY-MM-DD')
  309. ).valueOf() <= Moment(dateFilter.maxDate).valueOf()
  310. )
  311. .map((report: any, index) => (
  312. <>
  313. <tr
  314. key={report.id}
  315. className="hover transition-all duration-300"
  316. >
  317. <td>{index + 1}</td>
  318. <td>{report.user.name}</td>
  319. <td>
  320. <Link href={report.page}>
  321. <a className="text-accent-9 font-medium hover:underline hover:text-blue hover:font-bold transition-all duration-300">
  322. {report.id}
  323. </a>
  324. </Link>
  325. </td>
  326. <td>
  327. {Moment(report.createdAt).format('DD/MM/YYYY')} às{' '}
  328. {Moment(report.createdAt).format('HH:mm:ss')}
  329. </td>
  330. </tr>
  331. </>
  332. ))}
  333. </tbody>
  334. </table>
  335. </div>
  336. </div>
  337. </>
  338. )
  339.  
  340. function newFunction(map: any, key: string): any {
  341. return map[key]
  342. }
  343. }
  344.  
Advertisement
Add Comment
Please, Sign In to add comment