diff --git a/src/components/ui/scroll-area.stories.tsx b/src/components/ui/scroll-area.stories.tsx index 7e0d54c..3206798 100644 --- a/src/components/ui/scroll-area.stories.tsx +++ b/src/components/ui/scroll-area.stories.tsx @@ -1,18 +1,19 @@ import type { Meta, StoryObj } from '@storybook/react' -import { ScrollArea } from '@/components/ui/scroll-area' +import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area' import { Separator } from '@/components/ui/separator' const tags = Array.from({ length: 50 }).map( - (_, i, a) => `v1.2.0-beta.${a.length - i}` + (_, i, a) => `v1.2.0-beta.${a.length - i} Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.` ) function Basic( { ...props }: React.ComponentProps< typeof ScrollArea > ) { return ( +

Tags

{tags.map((tag) => ( <> -
+
{tag}
diff --git a/src/lib/hook/.gitkeep b/src/lib/hook/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/lib/hook/useScreens.ts b/src/lib/hook/useScreens.ts new file mode 100644 index 0000000..4295c68 --- /dev/null +++ b/src/lib/hook/useScreens.ts @@ -0,0 +1,32 @@ +import { useEffect, useState } from 'react' +import { screens } from 'tailwindcss/defaultTheme' + +/* eslint-disable-next-line */ +type TScreen = 'sm' | 'md' | 'lg' + +/* eslint-disable-next-line */ +type TUseScreens = () => TScreen + +/* eslint-disable-next-line */ +export const useScreen: TUseScreens = () => { + const [theme, setTheme] = useState('sm') + useEffect(() => { + const onChange = () => { + if (window.innerWidth >= +screens.md?.replace(/px/g, '')) { + setTheme('md') + } + + if (window.innerWidth >= +screens.lg?.replace(/px/g, '')) { + setTheme('lg') + } + } + window.addEventListener('resize', onChange) + onChange() + + return () => { + window.removeEventListener('resize', onChange) + } + }, []) + + return theme +} diff --git a/src/lib/route.ts b/src/lib/route.ts index 6fdb0b8..7e9d45f 100644 --- a/src/lib/route.ts +++ b/src/lib/route.ts @@ -24,7 +24,7 @@ export const translate = () => { '/report': { name: 'Reportes', validation: true, icon: icons.BookA }, '/notification': { name: 'Notificaciones', - validation: false, + validation: true, icon: icons.Notebook, }, '/update': { name: 'Editar', validation: false, icon: icons.Upload }, diff --git a/src/main.tsx b/src/main.tsx index 4211336..a8084a0 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -9,9 +9,9 @@ import { import { routeTree } from './routeTree.gen' async function enableMocking() { - if (!+import.meta.env.VITE_MSW || !import.meta.env.DEV) { - return - } + // if (!+import.meta.env.VITE_MSW || !import.meta.env.DEV) { + // return + // } const { worker } = await import('@/mocks/config') return worker.start() } diff --git a/src/pages/-calendar.tsx b/src/pages/-calendar.tsx deleted file mode 100644 index 8c6bdd7..0000000 --- a/src/pages/-calendar.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { Badge } from "@/components/ui/badge" -import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card" -import { Separator } from "@/components/ui/separator" -import { Link } from "@tanstack/react-router" -import clsx from "clsx" -import { format } from "date-fns" - -/* eslint-disable-next-line */ -type TType = 'mora' | 'warning' - -/* eslint-disable-next-line */ -export type TData = { - type: TType - creditId: number - client: string - cuete: number -} - -/* eslint-disable-next-line */ -export type TDaysProps = { [date: string]: TData } - -/* eslint-disable-next-line */ -interface THoverDate { - date: Date - credit?: TData -} - -/* eslint-disable-next-line */ -function HoverDate({ date, credit }: THoverDate) { - if (!credit) - return {format(date, 'dd')} - return ( - - - - {' '} - {format(date, 'dd')} - - - -
- - {' '} - {text.title({ type: credit.type })} - - {credit.creditId} -
- -
    -
  • - {' '} - {text.list.client + ':'} {credit.client}{' '} -
  • -
  • - {' '} - {text.list.ammount + ':'} {credit.cuete}{' '} -
  • -
-
-
- ) -} - -export { HoverDate } - -const text = { - title: ({ type }: { type: TType }) => - 'Credito ' + (type === 'warning' ? 'Pendiente' : 'en Mora'), - list: { - client: 'Cliente', - ammount: 'Numero de cuota', - }, -} diff --git a/src/pages/-info.tsx b/src/pages/-info.tsx index 7ac2ceb..5fba0ed 100644 --- a/src/pages/-info.tsx +++ b/src/pages/-info.tsx @@ -33,6 +33,7 @@ import { Link } from '@tanstack/react-router' import { getCurrentUserOpt } from '@/pages/_layout' import { updateUserByIdOpt } from '@/pages/_layout/user/$userId/update' import { useToken } from '@/lib/context/login' +import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area' /* eslint-disable-next-line */ interface TPassowordVisibilityState { @@ -215,153 +216,161 @@ export const MyUserInfo = memo(function () { return ( - {text.title} + + {text.title} + - {text.descriiption} + + {text.descriiption} + -
*]:col-span-full [&>:is(label,div)]:space-y-2 [&_label>span]:font-bold', - { - '[&_*:disabled]:opacity-100': - !!userId && rol?.rolName !== 'Administrador', - } - )} - > - - - -
-
-
- -
+ +
+ +
+ {!isSuccess ? ( + <> + + + + ) : ( + <> + + + + )} +
+
+
+ +
+ {!isSuccess ? ( + <> + + + + ) : ( + <> + + + + )} +
-
- - + + + {!isSuccess ? ( <> @@ -375,9 +384,14 @@ export const MyUserInfo = memo(function () { to={'/user/$userId/delete'} params={{ userId }} search={{ name: userRes.nombre }} - className="me-auto" + className="xl:me-auto" > - diff --git a/src/pages/__root.tsx b/src/pages/__root.tsx index 5c4608a..42726b7 100644 --- a/src/pages/__root.tsx +++ b/src/pages/__root.tsx @@ -13,7 +13,7 @@ export const Route = createRootRoute({ }) export function Root() { - return (
diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 38686ba..fe4130f 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -19,12 +19,19 @@ import { NotepadText, Sun, X as ErrorIcon, + Search, } from 'lucide-react' import { Separator } from '@/components/ui/separator' import { Link } from '@tanstack/react-router' import { Button } from '@/components/ui/button' import { Calendar, TData, TDaysProps } from '@/components/ui/calendar' -import React, { memo, useEffect, useReducer, useState } from 'react' +import React, { + memo, + useCallback, + useEffect, + useReducer, + useState, +} from 'react' import { User } from 'lucide-react' import { Avatar, AvatarFallback } from '@/components/ui/avatar' import { Badge } from '@/components/ui/badge' @@ -100,12 +107,13 @@ import { postPaymentOpt } from '@/pages/_layout/credit_/$creditId/pay' import { postCreditOpt } from '@/pages/_layout/credit/new' import { queryClient } from '@/pages/__root' import { getReportsOpt, postReportOpt } from '@/pages/_layout/report' -import { getRolByName, TROLES } from '@/lib/type/rol' +import { getRolByName, type TROLES } from '@/lib/type/rol' import { translate } from '@/lib/route' import { Dialog, DialogTrigger } from '@/components/ui/dialog' import { MyUserInfo } from '@/pages/-info' import { format } from 'date-fns' -import { TCREDIT_GET_FILTER_ALL } from '@/api/credit' +import { type TCREDIT_GET_FILTER_ALL } from '@/api/credit' +import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area' export const getCurrentUserOpt = { queryKey: ['login-user', { userId: useToken.getState().userId }], @@ -148,7 +156,8 @@ export const Route = createFileRoute('/_layout')({ /* eslint-disable-next-line */ interface TStatus { offline?: boolean - menu?: boolean + navmenu?: boolean + usermenu?: boolean calendar?: boolean search?: boolean } @@ -160,10 +169,13 @@ const reducer: React.Reducer = (prev, state) => { /* eslint-disable-next-line */ export function Layout() { const { deleteToken, setUserId, userId, name, setRol, rol } = useToken() - const [{ offline, menu, calendar }, setStatus] = useReducer(reducer, { - offline: navigator.onLine, - menu: false, - }) + const [{ offline, navmenu, calendar, usermenu }, setStatus] = useReducer( + reducer, + { + offline: navigator.onLine, + navmenu: false, + } + ) const { open, setOpen } = useStatus() const { setValue, setSearch, search, value } = useStatus() const { @@ -278,22 +290,25 @@ export function Layout() { setStatus(props) } - const onChange: React.ChangeEventHandler> = ( - ev - ) => { - const { value } = ev.currentTarget - setValue({ value }) - - if (clientsRes) { - const query = clients?.filter((props) => - Object.values(props) - .join(' ') - .toLowerCase() - .includes(value.toLowerCase()) - ) - setClients(query) - } - } + const onChange = useCallback< + React.ChangeEventHandler> + >( + (ev) => { + const { value } = ev.currentTarget + setValue({ value }) + + if (clientsRes) { + const query = clientsRes?.filter((items) => + Object.values(items) + .join(' ') + .toLowerCase() + .includes(value.toLowerCase()) + ) + setClients(query) + } + }, + [clientsRes] + ) const onKeyDown: React.KeyboardEventHandler< React.ComponentRef @@ -309,7 +324,8 @@ export function Layout() { if ( key === 'Enter' && pathname !== ('/user' as TSearch) && - pathname !== ('/client' as TSearch) + pathname !== ('/client' as TSearch) && + pathname !== ('/credit' as TSearch) ) { setSearch({ search: !search }) } @@ -356,24 +372,27 @@ export function Layout() { return (
*]:px-2', + 'grid auto-rows-min auto-rows-min gap-2 space-y-4 md:landscape:container xl:grid-cols-2 xl:grid-rows-3', styles?.['grid-layout'] )} >
- {!menu ? ( + {!navmenu ? (
-
-
+
+
+ {({ isActive }) => (
- -
- - - + + + onclick(setStatus, { usermenu: value })() + } + > + {(name ?? 'User') .split(' ') @@ -560,7 +603,7 @@ export function Layout() { .join('')} - + {errorCurrentUser && } {pendingCurrentUser && (
@@ -578,31 +621,42 @@ export function Layout() {
)} {okCurrentUser && ( -
- - - {name?.split(' ')?.map((items) => items?.[0])} - - -
    -
  • - - - - {currentUserRes?.nombre} - - - - -
  • -
  • - {' '} - {currentUserRes?.rol} {' '} -
  • -
+
+
+ + + {name?.split(' ')?.map((items) => items?.[0])} + + +
    +
  • + + + + {currentUserRes?.nombre} + + + + +
  • +
  • + {' '} + {currentUserRes?.rol} {' '} +
  • +
+
+
+ +
)} @@ -627,8 +681,8 @@ export function Layout() {
-
-
+
+
-
+
-