Compare commits

...

3 Commits

22 changed files with 4375 additions and 485 deletions

View File

@@ -1,5 +1,5 @@
vars {
url: https://usmcd1vms036.alpla.net
url: http://localhost:5500
session_cookie:
urlv2: http://localhost:3000
jwtV2:

View File

@@ -8,17 +8,7 @@ router.get("/:userId", async (req: Request, res: Response) => {
const cookieHeader = req.headers.cookie ?? "";
const authorization = req.headers.authorization ?? "";
const data = await auth.api.setUserPassword({
body: {
newPassword: req.body.password, // required
userId: userId, // required
},
// This endpoint requires session cookies.
headers: {
cookie: cookieHeader,
authorization,
},
});
//session stuff
return res.status(200).json({ message: "Password was just changed." });
});

View File

@@ -26,7 +26,7 @@
{
"name": "rfidReaders",
"category": "production",
"icon": "Tags",
"icon": "Tag",
"link": "/lst/app/old/rfid",
"active": false,
"roles": ["viewer", "manager", "tester", "systemAdmin", "admin"]
@@ -91,7 +91,7 @@
"name": "production",
"category": "production",
"active": false,
"icon": "",
"icon": "Tags",
"link": "",
"roles": ["admin", "systemAdmin", "manager", "viewer", "tester"]
},

View File

@@ -1,9 +1,9 @@
import { and, asc, eq } from "drizzle-orm";
import { asc } from "drizzle-orm";
import type { Request, Response } from "express";
import { Router } from "express";
import { db } from "../../../../pkg/db/db.js";
import { modules } from "../../../../pkg/db/schema/modules.js";
import { serverData } from "../../../../pkg/db/schema/servers.js";
import { tryCatch } from "../../../../pkg/utils/tryCatch.js";
const router = Router();
@@ -24,6 +24,7 @@ router.get("/", async (req: Request, res: Response) => {
.select()
.from(modules)
//.where(and(...conditions))
//.groupBy(modules.category)
.orderBy(asc(modules.name)),
);

View File

@@ -1,9 +0,0 @@
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/_old')({
component: RouteComponent,
})
function RouteComponent() {
return <div>Hello "/_old"!</div>
}

View File

@@ -1,5 +1,6 @@
import { Server, Settings, User, type LucideIcon } from "lucide-react";
import { userAccess, type UserRoles } from "../../lib/authClient";
import { Link } from "@tanstack/react-router";
import { type LucideIcon, Server, Settings, User } from "lucide-react";
import { type UserRoles, userAccess } from "../../lib/authClient";
import {
SidebarGroup,
SidebarGroupContent,
@@ -8,7 +9,6 @@ import {
SidebarMenuButton,
SidebarMenuItem,
} from "../ui/sidebar";
import { Link } from "@tanstack/react-router";
type Items = {
title: string;
@@ -29,13 +29,21 @@ export default function Admin() {
active: true,
},
{
title: "Settings",
title: "System",
url: "/lst/app/admin/settings",
icon: Settings,
role: ["systemAdmin", "admin"],
module: "admin",
active: true,
},
{
title: "Modules",
url: "/lst/app/admin/modules",
icon: Settings,
role: ["systemAdmin", "admin"],
module: "admin",
active: true,
},
{
title: "Servers",
url: "/lst/app/admin/servers",
@@ -53,8 +61,7 @@ export default function Admin() {
{items.map((item) => (
<SidebarMenuItem key={item.title}>
<>
{userAccess(item.module, item.role) &&
item.active && (
{userAccess(item.module, item.role) && item.active && (
<SidebarMenuButton asChild>
<Link to={item.url}>
<item.icon />

View File

@@ -0,0 +1,17 @@
import { queryOptions } from "@tanstack/react-query";
import axios from "axios";
export function getModules() {
return queryOptions({
queryKey: ["getModules"],
queryFn: () => fetchSession(),
staleTime: 5000,
refetchOnWindowFocus: true,
});
}
const fetchSession = async () => {
const { data } = await axios.get("/lst/api/system/modules");
return data.data;
};

View File

@@ -26,13 +26,13 @@ import { Route as AppauthUserIndexRouteImport } from './routes/_app/(auth)/user/
import { Route as MobileMobileLayoutMRelocateRouteImport } from './routes/_mobile/_mobileLayout/m/relocate'
import { Route as MobileMobileLayoutMDeliveryRouteImport } from './routes/_mobile/_mobileLayout/m/delivery'
import { Route as MobileMobileLayoutMCyclecountsRouteImport } from './routes/_mobile/_mobileLayout/m/cyclecounts'
import { Route as AppAdminLayoutAdminSettingsRouteImport } from './routes/_app/_adminLayout/admin/settings'
import { Route as AppAdminLayoutAdminServersRouteImport } from './routes/_app/_adminLayout/admin/servers'
import { Route as ApplogisticsLogisticsDeliveryScheduleRouteImport } from './routes/_app/(logistics)/logistics/deliverySchedule'
import { Route as AppauthUserSignupRouteImport } from './routes/_app/(auth)/user/signup'
import { Route as AppauthUserResetpasswordRouteImport } from './routes/_app/(auth)/user/resetpassword'
import { Route as AppauthUserProfileRouteImport } from './routes/_app/(auth)/user/profile'
import { Route as AppAdminLayoutAdminUsersRouteRouteImport } from './routes/_app/_adminLayout/admin/_users/route'
import { Route as AppAdminLayoutAdminSystemRouteRouteImport } from './routes/_app/_adminLayout/admin/_system/route'
import { Route as OldOldocmeCyclecountIndexRouteImport } from './routes/_old/old/(ocme)/cyclecount/index'
import { Route as OldOldlogisticsSiloAdjustmentsIndexRouteImport } from './routes/_old/old/(logistics)/siloAdjustments/index'
import { Route as OldOldlogisticsMaterialHelperIndexRouteImport } from './routes/_old/old/(logistics)/materialHelper/index'
@@ -42,6 +42,8 @@ import { Route as OldOldlogisticsBarcodegenIndexRouteImport } from './routes/_ol
import { Route as OldOldlogisticsSiloAdjustmentsHistRouteImport } from './routes/_old/old/(logistics)/siloAdjustments/$hist'
import { Route as AppAdminLayoutAdminUsersUsersRouteImport } from './routes/_app/_adminLayout/admin/_users/users'
import { Route as AppAdminLayoutAdminUsersProdUsersRouteImport } from './routes/_app/_adminLayout/admin/_users/prodUsers'
import { Route as AppAdminLayoutAdminSystemSettingsRouteImport } from './routes/_app/_adminLayout/admin/_system/settings'
import { Route as AppAdminLayoutAdminSystemModulesRouteImport } from './routes/_app/_adminLayout/admin/_system/modules'
import { Route as OldOldlogisticsMaterialHelperConsumptionIndexRouteImport } from './routes/_old/old/(logistics)/materialHelper/consumption/index'
import { Route as OldOldlogisticsSiloAdjustmentsCommentCommentRouteImport } from './routes/_old/old/(logistics)/siloAdjustments/comment/$comment'
@@ -130,12 +132,6 @@ const MobileMobileLayoutMCyclecountsRoute =
path: '/m/cyclecounts',
getParentRoute: () => MobileMobileLayoutRouteRoute,
} as any)
const AppAdminLayoutAdminSettingsRoute =
AppAdminLayoutAdminSettingsRouteImport.update({
id: '/settings',
path: '/settings',
getParentRoute: () => AppAdminLayoutAdminRoute,
} as any)
const AppAdminLayoutAdminServersRoute =
AppAdminLayoutAdminServersRouteImport.update({
id: '/servers',
@@ -169,6 +165,11 @@ const AppAdminLayoutAdminUsersRouteRoute =
id: '/_users',
getParentRoute: () => AppAdminLayoutAdminRoute,
} as any)
const AppAdminLayoutAdminSystemRouteRoute =
AppAdminLayoutAdminSystemRouteRouteImport.update({
id: '/_system',
getParentRoute: () => AppAdminLayoutAdminRoute,
} as any)
const OldOldocmeCyclecountIndexRoute =
OldOldocmeCyclecountIndexRouteImport.update({
id: '/(ocme)/cyclecount/',
@@ -222,6 +223,18 @@ const AppAdminLayoutAdminUsersProdUsersRoute =
path: '/prodUsers',
getParentRoute: () => AppAdminLayoutAdminUsersRouteRoute,
} as any)
const AppAdminLayoutAdminSystemSettingsRoute =
AppAdminLayoutAdminSystemSettingsRouteImport.update({
id: '/settings',
path: '/settings',
getParentRoute: () => AppAdminLayoutAdminSystemRouteRoute,
} as any)
const AppAdminLayoutAdminSystemModulesRoute =
AppAdminLayoutAdminSystemModulesRouteImport.update({
id: '/modules',
path: '/modules',
getParentRoute: () => AppAdminLayoutAdminSystemRouteRoute,
} as any)
const OldOldlogisticsMaterialHelperConsumptionIndexRoute =
OldOldlogisticsMaterialHelperConsumptionIndexRouteImport.update({
id: '/(logistics)/materialHelper/consumption/',
@@ -247,7 +260,6 @@ export interface FileRoutesByFullPath {
'/user/signup': typeof AppauthUserSignupRoute
'/logistics/deliverySchedule': typeof ApplogisticsLogisticsDeliveryScheduleRoute
'/admin/servers': typeof AppAdminLayoutAdminServersRoute
'/admin/settings': typeof AppAdminLayoutAdminSettingsRoute
'/m/cyclecounts': typeof MobileMobileLayoutMCyclecountsRoute
'/m/delivery': typeof MobileMobileLayoutMDeliveryRoute
'/m/relocate': typeof MobileMobileLayoutMRelocateRoute
@@ -255,6 +267,8 @@ export interface FileRoutesByFullPath {
'/m': typeof MobileMobileLayoutMIndexRoute
'/old/ocp': typeof OldOldOcpIndexRoute
'/old/rfid': typeof OldOldRfidIndexRoute
'/admin/modules': typeof AppAdminLayoutAdminSystemModulesRoute
'/admin/settings': typeof AppAdminLayoutAdminSystemSettingsRoute
'/admin/prodUsers': typeof AppAdminLayoutAdminUsersProdUsersRoute
'/admin/users': typeof AppAdminLayoutAdminUsersUsersRoute
'/old/siloAdjustments/$hist': typeof OldOldlogisticsSiloAdjustmentsHistRoute
@@ -278,7 +292,6 @@ export interface FileRoutesByTo {
'/user/signup': typeof AppauthUserSignupRoute
'/logistics/deliverySchedule': typeof ApplogisticsLogisticsDeliveryScheduleRoute
'/admin/servers': typeof AppAdminLayoutAdminServersRoute
'/admin/settings': typeof AppAdminLayoutAdminSettingsRoute
'/m/cyclecounts': typeof MobileMobileLayoutMCyclecountsRoute
'/m/delivery': typeof MobileMobileLayoutMDeliveryRoute
'/m/relocate': typeof MobileMobileLayoutMRelocateRoute
@@ -286,6 +299,8 @@ export interface FileRoutesByTo {
'/m': typeof MobileMobileLayoutMIndexRoute
'/old/ocp': typeof OldOldOcpIndexRoute
'/old/rfid': typeof OldOldRfidIndexRoute
'/admin/modules': typeof AppAdminLayoutAdminSystemModulesRoute
'/admin/settings': typeof AppAdminLayoutAdminSystemSettingsRoute
'/admin/prodUsers': typeof AppAdminLayoutAdminUsersProdUsersRoute
'/admin/users': typeof AppAdminLayoutAdminUsersUsersRoute
'/old/siloAdjustments/$hist': typeof OldOldlogisticsSiloAdjustmentsHistRoute
@@ -309,13 +324,13 @@ export interface FileRoutesById {
'/_app/(auth)/login': typeof AppauthLoginRoute
'/_old/old/': typeof OldOldIndexRoute
'/_app/_adminLayout/admin': typeof AppAdminLayoutAdminRouteWithChildren
'/_app/_adminLayout/admin/_system': typeof AppAdminLayoutAdminSystemRouteRouteWithChildren
'/_app/_adminLayout/admin/_users': typeof AppAdminLayoutAdminUsersRouteRouteWithChildren
'/_app/(auth)/user/profile': typeof AppauthUserProfileRoute
'/_app/(auth)/user/resetpassword': typeof AppauthUserResetpasswordRoute
'/_app/(auth)/user/signup': typeof AppauthUserSignupRoute
'/_app/(logistics)/logistics/deliverySchedule': typeof ApplogisticsLogisticsDeliveryScheduleRoute
'/_app/_adminLayout/admin/servers': typeof AppAdminLayoutAdminServersRoute
'/_app/_adminLayout/admin/settings': typeof AppAdminLayoutAdminSettingsRoute
'/_mobile/_mobileLayout/m/cyclecounts': typeof MobileMobileLayoutMCyclecountsRoute
'/_mobile/_mobileLayout/m/delivery': typeof MobileMobileLayoutMDeliveryRoute
'/_mobile/_mobileLayout/m/relocate': typeof MobileMobileLayoutMRelocateRoute
@@ -323,6 +338,8 @@ export interface FileRoutesById {
'/_mobile/_mobileLayout/m/': typeof MobileMobileLayoutMIndexRoute
'/_old/old/ocp/': typeof OldOldOcpIndexRoute
'/_old/old/rfid/': typeof OldOldRfidIndexRoute
'/_app/_adminLayout/admin/_system/modules': typeof AppAdminLayoutAdminSystemModulesRoute
'/_app/_adminLayout/admin/_system/settings': typeof AppAdminLayoutAdminSystemSettingsRoute
'/_app/_adminLayout/admin/_users/prodUsers': typeof AppAdminLayoutAdminUsersProdUsersRoute
'/_app/_adminLayout/admin/_users/users': typeof AppAdminLayoutAdminUsersUsersRoute
'/_old/old/(logistics)/siloAdjustments/$hist': typeof OldOldlogisticsSiloAdjustmentsHistRoute
@@ -349,7 +366,6 @@ export interface FileRouteTypes {
| '/user/signup'
| '/logistics/deliverySchedule'
| '/admin/servers'
| '/admin/settings'
| '/m/cyclecounts'
| '/m/delivery'
| '/m/relocate'
@@ -357,6 +373,8 @@ export interface FileRouteTypes {
| '/m'
| '/old/ocp'
| '/old/rfid'
| '/admin/modules'
| '/admin/settings'
| '/admin/prodUsers'
| '/admin/users'
| '/old/siloAdjustments/$hist'
@@ -380,7 +398,6 @@ export interface FileRouteTypes {
| '/user/signup'
| '/logistics/deliverySchedule'
| '/admin/servers'
| '/admin/settings'
| '/m/cyclecounts'
| '/m/delivery'
| '/m/relocate'
@@ -388,6 +405,8 @@ export interface FileRouteTypes {
| '/m'
| '/old/ocp'
| '/old/rfid'
| '/admin/modules'
| '/admin/settings'
| '/admin/prodUsers'
| '/admin/users'
| '/old/siloAdjustments/$hist'
@@ -410,13 +429,13 @@ export interface FileRouteTypes {
| '/_app/(auth)/login'
| '/_old/old/'
| '/_app/_adminLayout/admin'
| '/_app/_adminLayout/admin/_system'
| '/_app/_adminLayout/admin/_users'
| '/_app/(auth)/user/profile'
| '/_app/(auth)/user/resetpassword'
| '/_app/(auth)/user/signup'
| '/_app/(logistics)/logistics/deliverySchedule'
| '/_app/_adminLayout/admin/servers'
| '/_app/_adminLayout/admin/settings'
| '/_mobile/_mobileLayout/m/cyclecounts'
| '/_mobile/_mobileLayout/m/delivery'
| '/_mobile/_mobileLayout/m/relocate'
@@ -424,6 +443,8 @@ export interface FileRouteTypes {
| '/_mobile/_mobileLayout/m/'
| '/_old/old/ocp/'
| '/_old/old/rfid/'
| '/_app/_adminLayout/admin/_system/modules'
| '/_app/_adminLayout/admin/_system/settings'
| '/_app/_adminLayout/admin/_users/prodUsers'
| '/_app/_adminLayout/admin/_users/users'
| '/_old/old/(logistics)/siloAdjustments/$hist'
@@ -557,13 +578,6 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof MobileMobileLayoutMCyclecountsRouteImport
parentRoute: typeof MobileMobileLayoutRouteRoute
}
'/_app/_adminLayout/admin/settings': {
id: '/_app/_adminLayout/admin/settings'
path: '/settings'
fullPath: '/admin/settings'
preLoaderRoute: typeof AppAdminLayoutAdminSettingsRouteImport
parentRoute: typeof AppAdminLayoutAdminRoute
}
'/_app/_adminLayout/admin/servers': {
id: '/_app/_adminLayout/admin/servers'
path: '/servers'
@@ -601,11 +615,18 @@ declare module '@tanstack/react-router' {
}
'/_app/_adminLayout/admin/_users': {
id: '/_app/_adminLayout/admin/_users'
path: '/admin'
path: ''
fullPath: '/admin'
preLoaderRoute: typeof AppAdminLayoutAdminUsersRouteRouteImport
parentRoute: typeof AppAdminLayoutAdminRoute
}
'/_app/_adminLayout/admin/_system': {
id: '/_app/_adminLayout/admin/_system'
path: '/admin'
fullPath: '/admin'
preLoaderRoute: typeof AppAdminLayoutAdminSystemRouteRouteImport
parentRoute: typeof AppAdminLayoutAdminRoute
}
'/_old/old/(ocme)/cyclecount/': {
id: '/_old/old/(ocme)/cyclecount/'
path: '/cyclecount'
@@ -669,6 +690,20 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AppAdminLayoutAdminUsersProdUsersRouteImport
parentRoute: typeof AppAdminLayoutAdminUsersRouteRoute
}
'/_app/_adminLayout/admin/_system/settings': {
id: '/_app/_adminLayout/admin/_system/settings'
path: '/settings'
fullPath: '/admin/settings'
preLoaderRoute: typeof AppAdminLayoutAdminSystemSettingsRouteImport
parentRoute: typeof AppAdminLayoutAdminSystemRouteRoute
}
'/_app/_adminLayout/admin/_system/modules': {
id: '/_app/_adminLayout/admin/_system/modules'
path: '/modules'
fullPath: '/admin/modules'
preLoaderRoute: typeof AppAdminLayoutAdminSystemModulesRouteImport
parentRoute: typeof AppAdminLayoutAdminSystemRouteRoute
}
'/_old/old/(logistics)/materialHelper/consumption/': {
id: '/_old/old/(logistics)/materialHelper/consumption/'
path: '/materialHelper/consumption'
@@ -686,6 +721,24 @@ declare module '@tanstack/react-router' {
}
}
interface AppAdminLayoutAdminSystemRouteRouteChildren {
AppAdminLayoutAdminSystemModulesRoute: typeof AppAdminLayoutAdminSystemModulesRoute
AppAdminLayoutAdminSystemSettingsRoute: typeof AppAdminLayoutAdminSystemSettingsRoute
}
const AppAdminLayoutAdminSystemRouteRouteChildren: AppAdminLayoutAdminSystemRouteRouteChildren =
{
AppAdminLayoutAdminSystemModulesRoute:
AppAdminLayoutAdminSystemModulesRoute,
AppAdminLayoutAdminSystemSettingsRoute:
AppAdminLayoutAdminSystemSettingsRoute,
}
const AppAdminLayoutAdminSystemRouteRouteWithChildren =
AppAdminLayoutAdminSystemRouteRoute._addFileChildren(
AppAdminLayoutAdminSystemRouteRouteChildren,
)
interface AppAdminLayoutAdminUsersRouteRouteChildren {
AppAdminLayoutAdminUsersProdUsersRoute: typeof AppAdminLayoutAdminUsersProdUsersRoute
AppAdminLayoutAdminUsersUsersRoute: typeof AppAdminLayoutAdminUsersUsersRoute
@@ -704,16 +757,17 @@ const AppAdminLayoutAdminUsersRouteRouteWithChildren =
)
interface AppAdminLayoutAdminRouteChildren {
AppAdminLayoutAdminSystemRouteRoute: typeof AppAdminLayoutAdminSystemRouteRouteWithChildren
AppAdminLayoutAdminUsersRouteRoute: typeof AppAdminLayoutAdminUsersRouteRouteWithChildren
AppAdminLayoutAdminServersRoute: typeof AppAdminLayoutAdminServersRoute
AppAdminLayoutAdminSettingsRoute: typeof AppAdminLayoutAdminSettingsRoute
}
const AppAdminLayoutAdminRouteChildren: AppAdminLayoutAdminRouteChildren = {
AppAdminLayoutAdminSystemRouteRoute:
AppAdminLayoutAdminSystemRouteRouteWithChildren,
AppAdminLayoutAdminUsersRouteRoute:
AppAdminLayoutAdminUsersRouteRouteWithChildren,
AppAdminLayoutAdminServersRoute: AppAdminLayoutAdminServersRoute,
AppAdminLayoutAdminSettingsRoute: AppAdminLayoutAdminSettingsRoute,
}
const AppAdminLayoutAdminRouteWithChildren =

View File

@@ -1,14 +1,14 @@
import { useState } from "react";
import { toast } from "sonner";
import { Button } from "../../../../components/ui/button";
import { Button } from "../../../../../components/ui/button";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "../../../../components/ui/select";
import { api } from "../../../../lib/axiosAPI";
} from "../../../../../components/ui/select";
import { api } from "../../../../../lib/axiosAPI";
const modules: string[] = [
"users",

View File

@@ -0,0 +1,297 @@
import { useMutation, useQuery } from "@tanstack/react-query";
import { createFileRoute } from "@tanstack/react-router";
import {
createColumnHelper,
flexRender,
getCoreRowModel,
getPaginationRowModel,
getSortedRowModel,
//type Row,
type SortingState,
useReactTable,
} from "@tanstack/react-table";
import axios from "axios";
import {
Activity,
ArrowDown,
ArrowUp,
BookOpenCheck,
FolderPen,
} from "lucide-react";
import React, { useState } from "react";
import { Button } from "@/components/ui/button";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import { getModules } from "@/lib/querys/admin/getModules";
import { cn } from "@/lib/utils";
import { useModuleStore } from "@/routes/_old/old/-lib/store/useModuleStore";
type Modules = {
category: string;
name: string;
active: boolean;
link: string;
roles: string[];
};
const updateModuleActive = async (module: string, active: boolean) => {
return axios.patch(
`/lst/api/system/modules/update/${module}`,
{ active },
{ withCredentials: true },
);
};
export const Route = createFileRoute(
"/_app/_adminLayout/admin/_system/modules",
)({
component: RouteComponent,
});
function RouteComponent() {
const { data, isLoading, refetch } = useQuery(getModules());
const [sorting, setSorting] = useState<SortingState>([]);
const columnHelper = createColumnHelper<Modules>();
const { fetchModules } = useModuleStore();
const updateActive = useMutation({
mutationFn: ({ module, active }: { module: string; active: boolean }) =>
updateModuleActive(module, active),
onSuccess: () => {
// refetch or update cache
fetchModules();
refetch();
},
});
const columns = [
columnHelper.accessor("category", {
cell: (i) => i.getValue(),
header: ({ column }) => {
return (
<Button
variant="ghost"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
<span className="flex flex-row gap-2">
<BookOpenCheck />
Category
</span>
{column.getIsSorted() === "asc" ? (
<ArrowUp className="ml-2 h-4 w-4" />
) : (
<ArrowDown className="ml-2 h-4 w-4" />
)}
</Button>
);
},
}),
columnHelper.accessor("name", {
cell: (i) => i.getValue(),
header: ({ column }) => {
return (
<Button
variant="ghost"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
<span className="flex flex-row gap-2">
<FolderPen />
Name
</span>
{column.getIsSorted() === "asc" ? (
<ArrowUp className="ml-2 h-4 w-4" />
) : (
<ArrowDown className="ml-2 h-4 w-4" />
)}
</Button>
);
},
}),
columnHelper.accessor("active", {
header: ({ column }) => {
return (
<Button
variant="ghost"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
<span className="flex flex-row gap-2">
<Activity />
Active
</span>
{column.getIsSorted() === "asc" ? (
<ArrowUp className="ml-2 h-4 w-4" />
) : (
<ArrowDown className="ml-2 h-4 w-4" />
)}
</Button>
);
},
cell: ({ row, getValue }) => {
const active = getValue<boolean>();
const module = row.original.name;
const ignoreModules = ["admin", "system", "users"];
return (
<>
{ignoreModules.includes(module) ? (
<></>
) : (
<Select
value={active ? "true" : "false"}
onValueChange={(value) => {
const newValue = value === "true";
updateActive.mutate({ module, active: newValue });
}}
>
<SelectTrigger
className={cn(
"w-[100px]",
active
? "border-green-500 text-green-600"
: "border-gray-400 text-gray-500",
)}
>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="true">True</SelectItem>
<SelectItem value="false">False</SelectItem>
</SelectContent>
</Select>
)}
</>
);
},
}),
columnHelper.accessor("link", {
cell: (i) => i.getValue(),
header: ({ column }) => {
return (
<Button
variant="ghost"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
<span className="flex flex-row gap-2">
<FolderPen />
Name
</span>
{column.getIsSorted() === "asc" ? (
<ArrowUp className="ml-2 h-4 w-4" />
) : (
<ArrowDown className="ml-2 h-4 w-4" />
)}
</Button>
);
},
}),
];
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
onSortingChange: setSorting,
getSortedRowModel: getSortedRowModel(),
//renderSubComponent: ({ row }: { row: any }) => <ExpandedRow row={row} />,
//getRowCanExpand: () => true,
state: {
sorting,
},
});
if (isLoading) {
return <div className="m-auto">Loading user data</div>;
}
// function renderSubComponent( { row: Row<Modules> }): React.ReactNode {
// throw new Error("Function not implemented.");
// }
//console.log(data);
return (
<div className="p-4">
<div className="w-fit">
<Table>
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
return (
<TableHead key={header.id}>
{header.isPlaceholder
? null
: flexRender(
header.column.columnDef.header,
header.getContext(),
)}
</TableHead>
);
})}
</TableRow>
))}
</TableHeader>
<TableBody>
{table.getRowModel().rows.map((row) => (
<React.Fragment key={row.id}>
<TableRow
key={row.id}
data-state={row.getIsSelected() && "selected"}
>
{row.getVisibleCells().map((cell) => (
<TableCell key={cell.id}>
{flexRender(
cell.column.columnDef.cell,
cell.getContext(),
)}
</TableCell>
))}
</TableRow>
{/* {row.getIsExpanded() && (
<TableRow>
<TableCell colSpan={row.getVisibleCells().length}>
{renderSubComponent({ row })}
</TableCell>
</TableRow>
)} */}
</React.Fragment>
))}
</TableBody>
</Table>
<div className="flex items-center justify-end space-x-2 py-4">
<Button
variant="outline"
size="sm"
onClick={() => table.previousPage()}
disabled={!table.getCanPreviousPage()}
>
Previous
</Button>
<Button
variant="outline"
size="sm"
onClick={() => table.nextPage()}
disabled={!table.getCanNextPage()}
>
Next
</Button>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,33 @@
import { createFileRoute, Link, Outlet } from "@tanstack/react-router";
export const Route = createFileRoute("/_app/_adminLayout/admin/_system")({
component: RouteComponent,
});
function RouteComponent() {
return (
<div>
<nav className="flex justify-center gap-3">
<Link
to="/admin/settings"
className="[&.active]:font-bold [&.active]:underline"
activeOptions={{
exact: true,
}}
>
Settings
</Link>
<Link
to="/admin/modules"
className="[&.active]:font-bold [&.active]:underline"
activeOptions={{
exact: true,
}}
>
Modules
</Link>
</nav>
<Outlet />
</div>
);
}

View File

@@ -0,0 +1,11 @@
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute(
'/_app/_adminLayout/admin/_system/settings',
)({
component: RouteComponent,
})
function RouteComponent() {
return <div>Hello "/_app/_adminLayout/admin/_system/settings"!</div>
}

View File

@@ -30,7 +30,7 @@ import {
TableRow,
} from "../../../../../components/ui/table";
import { getUsers } from "../../../../../lib/querys/admin/getUsers";
import ExpandedRow from "../../-components/ExpandedRow";
import ExpandedRow from "../../-components/users/ExpandedRow";
type User = {
username: string;

View File

@@ -1,9 +0,0 @@
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/_app/_adminLayout/admin/settings')({
component: RouteComponent,
})
function RouteComponent() {
return <div>Hello "/_adminLayout/admin/settings"!</div>
}

View File

@@ -15,7 +15,6 @@ import { hasPageAccess } from "../../../-utils/userAccess";
const iconMap: any = {
Printer: Printer,
Tag: Tag,
Cat: Cat,
};
@@ -29,9 +28,8 @@ export function ProductionSideBar({
//const url: string = window.location.host.split(":")[0];
const { modules } = useModuleStore();
const items = modules?.filter((m) => m.category === "production");
const items = modules?.filter((m) => m.category === "production" && m.active);
const userUpdate = { ...user, roles: userRoles };
return (
<SidebarGroup>
<SidebarGroupLabel>Production</SidebarGroupLabel>

View File

@@ -1,14 +1,14 @@
import { format, formatDuration, intervalToDuration } from "date-fns";
import { eq } from "drizzle-orm";
import { success } from "zod/v4";
import { db } from "../../../../../database/dbclient.js";
import { printerData } from "../../../../../database/schema/printers.js";
import { runProdApi } from "../../../../globalUtils/runProdApi.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
import { createLog } from "../../../logger/logger.js";
import { query } from "../../../sqlServer/prodSqlServer.js";
import { labelInfo } from "../../../sqlServer/querys/warehouse/labelInfo.js";
import { format, formatDuration, intervalToDuration } from "date-fns";
import { shiftChange } from "../../../sqlServer/querys/misc/shiftChange.js";
import { success } from "zod/v4";
import { labelInfo } from "../../../sqlServer/querys/warehouse/labelInfo.js";
type NewLotData = {
runningNumber: number;
@@ -58,8 +58,8 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
data.runningNumber
} is pending to be transfered already, remaining time ${formatDuration(
duration,
{ format: ["hours", "minutes", "seconds"] }
)}`
{ format: ["hours", "minutes", "seconds"] },
)}`,
);
return {
success: false,
@@ -67,14 +67,14 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
data.runningNumber
} is pending to be transfered already, remaining time ${formatDuration(
duration,
{ format: ["hours", "minutes", "seconds"] }
{ format: ["hours", "minutes", "seconds"] },
)}`,
data: [],
};
}
// get the shift time
const { data: shift, error: shiftError } = (await tryCatch(
query(shiftChange, "shift change from material.")
query(shiftChange, "shift change from material."),
)) as any;
if (shiftError) {
@@ -82,7 +82,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
"There was an error getting the shift times will use fallback times"
"There was an error getting the shift times will use fallback times",
);
}
@@ -100,7 +100,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) : 5, // this will parse the hour to remove teh zero
shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 3,
0,
0
0,
);
console.log("target", target.toLocaleString(), "Now", now.toLocaleString());
@@ -113,7 +113,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) - 1 : 5, // this will parse the hour to remove teh zero
shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 0,
0,
0
0,
);
console.log("early", early.toLocaleString(), "Now", now.toLocaleString());
@@ -126,14 +126,14 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) - 1 : 5, // this will parse the hour to remove teh zero
shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 0,
0,
0
0,
);
console.log(
"nextMonth",
nextMonth.toLocaleString(),
"Now",
now.toLocaleString()
now.toLocaleString(),
);
// console.log(early, target);
@@ -145,14 +145,14 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"ocp",
`Eom transfers is not allowed right now please try again at ${format(
nextMonth,
"M/d/yyyy hh:mm"
)} `
"M/d/yyyy hh:mm",
)} `,
);
return {
success: false,
message: `Eom transfers is not allowed right now please try again at ${format(
nextMonth,
"M/d/yyyy hh:mm"
"M/d/yyyy hh:mm",
)} `,
data: [],
};
@@ -163,8 +163,8 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
const { data: label, error: labelError } = (await tryCatch(
query(
labelInfo.replace("[runningNr]", `${data.runningNumber}`),
"Get label info"
)
"Get label info",
),
)) as any;
if (labelError) {
@@ -172,7 +172,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
"There was an error getting the label info"
"There was an error getting the label info",
);
return {
success: false,
@@ -186,7 +186,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
`${data.runningNumber}: dose not exist or no longer in stock.`
`${data.runningNumber}: dose not exist or no longer in stock.`,
);
return {
success: false,
@@ -202,7 +202,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
`${data.runningNumber}: currently in stock and not consumed to a lot.`
`${data.runningNumber}: currently in stock and not consumed to a lot.`,
);
return {
success: false,
@@ -213,7 +213,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
// get the pdf24 printer id
const { data: printer, error: printerError } = (await tryCatch(
db.select().from(printerData).where(eq(printerData.name, "PDF24"))
db.select().from(printerData).where(eq(printerData.name, "PDF24")),
)) as any;
if (printerError) {
@@ -221,7 +221,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
"There was an error the printer info"
"There was an error the printer info",
);
return {
success: false,
@@ -254,7 +254,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
runProdApi({
endpoint: "/public/v1.0/ProductionLabelling/ReprintLabel",
data: [reprintData],
})
}),
)) as any;
if (!reprint.success) {
@@ -262,7 +262,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
`RN:${data.runningNumber}, Reprinting Error: ${reprint.data.data.message}`
`RN:${data.runningNumber}, Reprinting Error: ${reprint.data.data.message}`,
);
return {
success: false,
@@ -283,7 +283,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
endpoint:
"/public/v1.0/IssueMaterial/ReturnPartiallyConsumedManualMaterial",
data: [matReturnData],
})
}),
)) as any;
if (!matReturn.success) {
@@ -291,7 +291,7 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error",
"materials",
"ocp",
`RN:${data.runningNumber}, Return Error ${matReturn.data.data.errors[0].message}`
`RN:${data.runningNumber}, Return Error ${matReturn.data.data.errors[0].message}`,
);
return {
success: false,
@@ -344,7 +344,7 @@ const transferMaterial = async (
delay: number,
data: any,
consumeLot: any,
newQty: any
newQty: any,
) => {
//console.log(data);
if (pendingJobs.has(data.runningNumber)) {
@@ -352,7 +352,7 @@ const transferMaterial = async (
"error",
"materials",
"ocp",
`${data.runningNumber} is pending to be transfered already`
`${data.runningNumber} is pending to be transfered already`,
);
return {
success: false,
@@ -365,13 +365,12 @@ const transferMaterial = async (
// sets the time out based on the type of transfer sent over.
const timeoutId = setTimeout(async () => {
try {
const { data: matConsume, error: matConsumeError } =
(await tryCatch(
const { data: matConsume, error: matConsumeError } = (await tryCatch(
runProdApi({
endpoint:
"/public/v1.0/IssueMaterial/ConsumeNonPreparedManualMaterial",
data: [consumeLot],
})
}),
)) as any;
if (!matConsume?.success) {
@@ -380,9 +379,8 @@ const transferMaterial = async (
"materials",
"ocp",
`RN:${data.runningNumber}, Consume Error ${
matConsume?.data?.data?.errors?.[0]?.message ??
"Unknown"
}`
matConsume?.data?.data?.errors?.[0]?.message ?? "Unknown"
}`,
);
return; // still hits finally
}
@@ -391,14 +389,14 @@ const transferMaterial = async (
"info",
"materials",
"ocp",
`RN:${data.runningNumber}: qty: ${newQty}, was transferred to lot:${data.lotNumber}`
`RN:${data.runningNumber}: qty: ${newQty}, was transferred to lot:${data.lotNumber}`,
);
} catch (err) {
createLog(
"error",
"materials",
"ocp",
`RN:${data.runningNumber}, ${err}`
`RN:${data.runningNumber}, ${err}`,
);
} finally {
// Always clear the pending entry, even if error

View File

@@ -20,6 +20,8 @@ dbo.V_LadePlanungenLadeAuftragAbruf.AdressBez AS CustName,
dbo.T_EAIJournal.IdJournalStatus as bolStatus,
V_TrackerAuftragsAbrufe.IdAuftragsAbruf as releaseNum,
V_LadePlanungenLadeAuftragAbruf.IdLadeAuftrag as truckPostion
,dbo.V_TrackerAuftragsAbrufe.IdArtikelvarianten as av
,dbo.V_TrackerAuftragsAbrufe.ArtikelVariantenAlias as alias
,'Base Plant' as plantType
from dbo.V_TrackerAuftragsAbrufe (nolock)
@@ -59,6 +61,8 @@ select top (50) (select wert from dbo.T_SystemParameter where Bezeichnung = 'Wer
,null as bolStatus
,null as releaseNum
,null as truckPostion
,i.IdArtikelVariante as av
,null as alias
,'In-House' as plantType
--,*

View File

@@ -0,0 +1,3 @@
ALTER TABLE "modules" RENAME COLUMN "name" TO "module_name";--> statement-breakpoint
DROP INDEX "module_name";--> statement-breakpoint
CREATE UNIQUE INDEX "module_name" ON "modules" USING btree ("module_name");

View File

@@ -0,0 +1,3 @@
ALTER TABLE "modules" RENAME COLUMN "module_name" TO "name";--> statement-breakpoint
DROP INDEX "module_name";--> statement-breakpoint
CREATE UNIQUE INDEX "module_name" ON "modules" USING btree ("name");

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -169,6 +169,20 @@
"when": 1761781568161,
"tag": "0023_minor_marvel_zombies",
"breakpoints": true
},
{
"idx": 24,
"version": "7",
"when": 1761829793348,
"tag": "0024_uneven_the_fury",
"breakpoints": true
},
{
"idx": 25,
"version": "7",
"when": 1761830426770,
"tag": "0025_foamy_mattie_franklin",
"breakpoints": true
}
]
}