diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx
index ac09bae..854b562 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.scheduled/route.tsx
@@ -22,7 +22,7 @@ export async function loader({ context, request, params }: Route.LoaderArgs) {
}
}
-export default function Route({ loaderData: { data } }) {
+export default function Route({ loaderData: { data } }: Route.ComponentProps) {
return (
<>
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx
index abe70db..2e07402 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id._index/route.tsx
@@ -27,7 +27,7 @@ import { useForm } from 'react-hook-form'
import type { User } from '../_.$orgid.users.$id/route'
import { formSchema, type Schema } from '../_.$orgid.users.add/route'
-export default function Route() {
+export default function Route({}: Route.ComponentProps) {
const { user } = useOutletContext() as { user: User }
const form = useForm({
defaultValues: user,
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx
index 28ad39f..ab7886e 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.emails/route.tsx
@@ -32,7 +32,7 @@ export async function loader({ params, request, context }: Route.LoaderArgs) {
return { data }
}
-export default function Route({ loaderData: { data } }) {
+export default function Route({ loaderData: { data } }: Route.ComponentProps) {
const { user } = useOutletContext() as { user: User }
return (
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.logs/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.logs/route.tsx
index f821929..098c070 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.logs/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id.logs/route.tsx
@@ -1,3 +1,5 @@
-export default function Route() {
- return <>user logs>
+import type { Route } from './+types/route'
+
+export default function Route({}: Route.ComponentProps) {
+ return <>user logs>
}
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx
index 7927c40..1e264a5 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx
@@ -62,11 +62,7 @@ const links = [
{ to: 'emails', title: 'Emails' }
]
-export default function Route({
- loaderData: { user }
-}: {
- loaderData: Awaited
>
-}) {
+export default function Route({ loaderData: { user } }: Route.ComponentProps) {
return (
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx
index a758815..0888185 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/columns.tsx
@@ -34,7 +34,6 @@ import {
DropdownMenuTrigger
} from '@repo/ui/components/ui/dropdown-menu'
import { Spinner } from '@repo/ui/components/ui/spinner'
-import { initials } from '@repo/ui/lib/utils'
import { type User, columns as columns_ } from '@repo/ui/routes/users/columns'
export type { User }
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/route.tsx
index 01caaaa..6514387 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users._index/route.tsx
@@ -49,7 +49,7 @@ export async function loader({ params, context, request }: Route.LoaderArgs) {
return { data: users }
}
-export default function Route({ loaderData: { data } }) {
+export default function Route({ loaderData: { data } }: Route.ComponentProps) {
const { orgid } = useParams()
const [searchParams, setSearchParams] = useSearchParams()
const [selectedRows, setSelectedRows] = useState([])
diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.webhooks._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.webhooks._index/route.tsx
index 8a30c1d..9298bc7 100644
--- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.webhooks._index/route.tsx
+++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.webhooks._index/route.tsx
@@ -10,7 +10,7 @@ export async function loader(): Promise {
return []
}
-export default function Route() {
+export default function Route({}: Route.ComponentProps) {
return (
<>
diff --git a/apps/insights.saladeaula.digital/app/routes/_app._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app._index/route.tsx
index dbad45c..f240d1b 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app._index/route.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app._index/route.tsx
@@ -1,4 +1,4 @@
-import type { Route } from './+types/home'
+import type { Route } from './+types/route'
export function meta({}: Route.MetaArgs) {
return [{ title: 'Visão geral' }]
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx
index 98b2d61..f09606f 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.enrollments._index/columns.tsx
@@ -19,6 +19,8 @@ import {
type Enrollment
} from '@repo/ui/routes/enrollments/columns'
+import { CopyToClipboardItem } from '../_app.users._index/columns'
+
export type { Enrollment }
export const columns: ColumnDef
[] = [
@@ -58,6 +60,7 @@ function ActionMenu({ row }: { row: any }) {
+
([])
const status = searchParams.get('status')
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/columns.tsx b/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/columns.tsx
index 31f9de7..262559b 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/columns.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/columns.tsx
@@ -2,6 +2,14 @@
import { type ColumnDef } from '@tanstack/react-table'
+import { EllipsisVerticalIcon } from 'lucide-react'
+
+import { Button } from '@repo/ui/components/ui/button'
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuTrigger
+} from '@repo/ui/components/ui/dropdown-menu'
import { Abbr } from '@repo/ui/components/abbr'
import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar'
import { initials } from '@repo/ui/lib/utils'
@@ -13,6 +21,8 @@ import {
} from '@repo/ui/components/data-table'
import type { Org } from '@repo/ui/routes/orgs/data'
+import { CopyToClipboardItem } from '../_app.users._index/columns'
+
export type { Org }
export const columns: ColumnDef[] = [
@@ -53,5 +63,31 @@ export const columns: ColumnDef[] = [
accessorKey: 'createDate',
header: 'Cadastrado em',
cell: DataTableColumnDatetime
+ },
+ {
+ id: 'actions',
+ cell: ActionMenu
}
]
+
+function ActionMenu({ row }: { row: any }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/route.tsx
index 0b7b8f7..059772a 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/route.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.orgs._index/route.tsx
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/route'
import { Suspense } from 'react'
import { Await, useSearchParams } from 'react-router'
@@ -34,7 +34,7 @@ export async function loader({ context, request }: Route.LoaderArgs) {
return { data: users }
}
-export default function Route({ loaderData: { data } }) {
+export default function Route({ loaderData: { data } }: Route.ComponentProps) {
const [searchParams, setSearchParams] = useSearchParams()
return (
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx
index c20aca5..e5d1b70 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/columns.tsx
@@ -12,6 +12,8 @@ import {
} from '@repo/ui/components/data-table'
import { columns as columns_, type Order } from '@repo/ui/routes/orders/columns'
+export type { Order }
+
export const columns: ColumnDef[] = [
{
id: 'select',
@@ -42,8 +44,8 @@ export const columns: ColumnDef[] = [
}
},
{
- accessorKey: 'cnpj_cpf',
- header: 'CNPJ/CPF',
+ accessorKey: 'cpf_cnpj',
+ header: 'CPF/CNPJ',
// @ts-ignore
accessorFn: ({ cpf, cnpj }) => cpf ?? cnpj,
cell: DataTableColumnCpfCnpj
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx
index 86516c5..a53cc4d 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.payments._index/route.tsx
@@ -30,7 +30,7 @@ export async function loader({ context, request }: Route.LoaderArgs) {
}
}
-export default function Route({ loaderData: { data } }) {
+export default function Route({ loaderData: { data } }: Route.ComponentProps) {
return (
}>
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.users._index/columns.tsx b/apps/insights.saladeaula.digital/app/routes/_app.users._index/columns.tsx
index cfa06e1..b9fd5a2 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.users._index/columns.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.users._index/columns.tsx
@@ -1,25 +1,25 @@
'use client'
+import { useBoolean } from 'ahooks'
import { type ColumnDef } from '@tanstack/react-table'
+import { CheckIcon, CopyIcon, EllipsisVerticalIcon } from 'lucide-react'
-import { Abbr } from '@repo/ui/components/abbr'
import {
- DataTableColumnDatetime,
DataTableColumnSelect,
- DataTableColumnCpfCnpj,
DataTableColumnHeaderSelect
} from '@repo/ui/components/data-table'
-import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar'
-import { initials } from '@repo/ui/lib/utils'
+import { Button } from '@repo/ui/components/ui/button'
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger
+} from '@repo/ui/components/ui/dropdown-menu'
+import { type User, columns as columns_ } from '@repo/ui/routes/users/columns'
+import { cn } from '@repo/ui/lib/utils'
+import { useRef } from 'react'
-// This type is used to define the shape of our data.
-// You can use a Zod schema here if you want.
-export type User = {
- id: string
- name: string
- email: string
- cpf?: string
-}
+export type { User }
export const columns: ColumnDef
[] = [
{
@@ -27,42 +27,66 @@ export const columns: ColumnDef[] = [
header: DataTableColumnHeaderSelect,
cell: DataTableColumnSelect
},
+ ...columns_,
{
- header: 'Usuário',
- cell: ({ row }) => {
- const { name, email } = row.original
-
- return (
-
-
- {initials(name)}
-
-
-
- -
- {name}
-
- -
- {email}
-
-
-
- )
- }
- },
- {
- accessorKey: 'cpf',
- header: 'CPF',
- cell: DataTableColumnCpfCnpj
- },
- {
- accessorKey: 'lastLogin',
- header: 'Último accesso',
- cell: DataTableColumnDatetime
- },
- {
- accessorKey: 'createDate',
- header: 'Cadastrado em',
- cell: DataTableColumnDatetime
+ id: 'actions',
+ cell: ActionMenu
}
]
+
+function ActionMenu({ row }: { row: any }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export function CopyToClipboardItem({ text }: { text: string }) {
+ const [isCopied, { setTrue, setFalse }] = useBoolean()
+ const timeoutRef = useRef | null>(null)
+
+ return (
+ e.preventDefault()}
+ className={cn({ 'pointer-events-none': isCopied })}
+ onClick={async () => {
+ await navigator.clipboard.writeText(text)
+ setTrue()
+
+ if (timeoutRef.current) {
+ clearTimeout(timeoutRef.current)
+ }
+
+ timeoutRef.current = setTimeout(() => {
+ setFalse()
+ timeoutRef.current = null
+ }, 3000)
+ }}
+ >
+ {isCopied ? (
+ <>
+ Copiado!
+ >
+ ) : (
+ <>
+ Copiar ID
+ >
+ )}
+
+ )
+}
diff --git a/apps/insights.saladeaula.digital/app/routes/_app.users._index/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app.users._index/route.tsx
index c3004b6..2193795 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app.users._index/route.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app.users._index/route.tsx
@@ -1,7 +1,8 @@
-import type { Route } from './+types'
+import type { Route } from './+types/route'
import { Suspense } from 'react'
import { Await, useSearchParams } from 'react-router'
+import { MeiliSearchFilterBuilder } from 'meilisearch-helper'
import { DataTable } from '@repo/ui/components/data-table'
import { SearchForm } from '@repo/ui/components/search-form'
@@ -18,13 +19,16 @@ export function meta({}: Route.MetaArgs) {
export async function loader({ context, request }: Route.LoaderArgs) {
const { searchParams } = new URL(request.url)
const query = searchParams.get('q') || ''
+ const sort = searchParams.get('sort') || 'createDate:desc'
const page = Number(searchParams.get('p')) + 1
const hitsPerPage = Number(searchParams.get('perPage')) || 25
+ let builder = new MeiliSearchFilterBuilder().where('cnpj', 'exists', false)
+
const users = createSearch({
index: 'betaeducacao-prod-users_d2o3r5gmm4it7j',
- sort: ['createDate:desc', 'create_date:desc'],
- filter: 'cnpj NOT EXISTS',
+ filter: builder.build(),
+ sort: [sort],
query,
page,
hitsPerPage,
diff --git a/apps/insights.saladeaula.digital/app/routes/_app/route.tsx b/apps/insights.saladeaula.digital/app/routes/_app/route.tsx
index ecadd71..80e81ae 100644
--- a/apps/insights.saladeaula.digital/app/routes/_app/route.tsx
+++ b/apps/insights.saladeaula.digital/app/routes/_app/route.tsx
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/route'
import * as cookie from 'cookie'
import { Outlet } from 'react-router'
diff --git a/apps/insights.saladeaula.digital/app/routes/login._index/route.ts b/apps/insights.saladeaula.digital/app/routes/login._index/route.ts
index 9724d00..b34e98f 100644
--- a/apps/insights.saladeaula.digital/app/routes/login._index/route.ts
+++ b/apps/insights.saladeaula.digital/app/routes/login._index/route.ts
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/route'
import { redirect } from 'react-router'
diff --git a/apps/insights.saladeaula.digital/app/routes/logout._index/route.ts b/apps/insights.saladeaula.digital/app/routes/logout._index/route.ts
index 201a130..53f0f92 100644
--- a/apps/insights.saladeaula.digital/app/routes/logout._index/route.ts
+++ b/apps/insights.saladeaula.digital/app/routes/logout._index/route.ts
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/route'
import { redirect } from 'react-router'
import type { OAuth2Strategy } from 'remix-auth-oauth2'
diff --git a/apps/insights.saladeaula.digital/app/routes/~.api.$/route.ts b/apps/insights.saladeaula.digital/app/routes/~.api.$/route.ts
index 02aa633..af722e6 100644
--- a/apps/insights.saladeaula.digital/app/routes/~.api.$/route.ts
+++ b/apps/insights.saladeaula.digital/app/routes/~.api.$/route.ts
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/route'
import type { User } from '@repo/auth/auth'
import { userContext } from '@repo/auth/context'