forked from admin/hair-keeper
fix: 删除部分会引发类型错误的无用代码
This commit is contained in:
@@ -108,7 +108,7 @@ RUN mkdir -p /var/run/sshd && \
|
||||
RUN code-server --install-extension ms-ceintl.vscode-language-pack-zh-hans \
|
||||
&& code-server --install-extension bierner.markdown-mermaid \
|
||||
&& code-server --install-extension ms-python.python \
|
||||
&& code-server --install-extension rooveterinaryinc.roo-cline \
|
||||
&& code-server --install-extension saoudrizwan.claude-dev \
|
||||
&& code-server --install-extension dbaeumer.vscode-eslint \
|
||||
&& code-server --install-extension prisma.prisma \
|
||||
&& code-server --install-extension ecmel.vscode-html-css \
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "hair-keeper",
|
||||
"version": "0.1.0",
|
||||
"version": "1.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev -p 3000 --turbo",
|
||||
"dev:attach": "DEV_TERMINAL=nextdev;tmux new-session -A -s $DEV_TERMINAL\\; send-keys \"pnpm run dev\" ^M",
|
||||
"build": "next build",
|
||||
"start": "next start -p 3000",
|
||||
"lint": "eslint",
|
||||
"lint": "next lint && tsc --noEmit",
|
||||
"db:seed": "tsx prisma/seed.ts",
|
||||
"build:analyze": "ANALYZE=true next build"
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
# 此脚本用来一键部署到生产服务器
|
||||
# 需事先配置好ssh免密登录,目标服务器需要安装好node、pnpm和pm2来运行容器
|
||||
# 需事先配置好ssh免密登录,目标服务器需要安装好node、pnpm、tsx、pm2来运行容器
|
||||
set -e
|
||||
|
||||
# 配置
|
||||
@@ -46,10 +46,6 @@ cd ${REMOTE_DIR}
|
||||
echo "📥 安装依赖..."
|
||||
pnpm install --prod
|
||||
|
||||
# 等待数据库启动
|
||||
echo "⏳ 等待数据库启动..."
|
||||
sleep 5
|
||||
|
||||
# 运行数据库迁移
|
||||
echo "🗄️ 运行数据库迁移..."
|
||||
npx prisma migrate deploy
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
"use client";
|
||||
|
||||
import type { Column } from "@tanstack/react-table";
|
||||
import * as React from "react";
|
||||
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { cn } from "@/lib/utils";
|
||||
import type { ExtendedColumnFilter } from "@/types/data-table";
|
||||
|
||||
interface DataTableRangeFilterProps<TData> extends React.ComponentProps<"div"> {
|
||||
filter: ExtendedColumnFilter<TData>;
|
||||
column: Column<TData>;
|
||||
inputId: string;
|
||||
onFilterUpdate: (
|
||||
filterId: string,
|
||||
updates: Partial<Omit<ExtendedColumnFilter<TData>, "filterId">>,
|
||||
) => void;
|
||||
}
|
||||
|
||||
export function DataTableRangeFilter<TData>({
|
||||
filter,
|
||||
column,
|
||||
inputId,
|
||||
onFilterUpdate,
|
||||
className,
|
||||
...props
|
||||
}: DataTableRangeFilterProps<TData>) {
|
||||
const meta = column.columnDef.meta;
|
||||
|
||||
const [min, max] = React.useMemo(() => {
|
||||
const range = column.columnDef.meta?.filter?.range;
|
||||
if (range) return range;
|
||||
|
||||
const values = column.getFacetedMinMaxValues();
|
||||
if (!values) return [0, 100];
|
||||
|
||||
return [values[0], values[1]];
|
||||
}, [column]);
|
||||
|
||||
const formatValue = React.useCallback(
|
||||
(value: string | number | undefined) => {
|
||||
if (value === undefined || value === "") return "";
|
||||
const numValue = Number(value);
|
||||
return Number.isNaN(numValue)
|
||||
? ""
|
||||
: numValue.toLocaleString(undefined, {
|
||||
maximumFractionDigits: 0,
|
||||
});
|
||||
},
|
||||
[],
|
||||
);
|
||||
|
||||
const value = React.useMemo(() => {
|
||||
if (Array.isArray(filter.value)) return filter.value.map(formatValue);
|
||||
return [formatValue(filter.value), ""];
|
||||
}, [filter.value, formatValue]);
|
||||
|
||||
const onRangeValueChange = React.useCallback(
|
||||
(value: string, isMin?: boolean) => {
|
||||
const numValue = Number(value);
|
||||
const currentValues = Array.isArray(filter.value)
|
||||
? filter.value
|
||||
: ["", ""];
|
||||
const otherValue = isMin
|
||||
? (currentValues[1] ?? "")
|
||||
: (currentValues[0] ?? "");
|
||||
|
||||
if (
|
||||
value === "" ||
|
||||
(!Number.isNaN(numValue) &&
|
||||
(isMin
|
||||
? numValue >= min && numValue <= (Number(otherValue) || max)
|
||||
: numValue <= max && numValue >= (Number(otherValue) || min)))
|
||||
) {
|
||||
onFilterUpdate(filter.filterId, {
|
||||
value: isMin ? [value, otherValue] : [otherValue, value],
|
||||
});
|
||||
}
|
||||
},
|
||||
[filter.filterId, filter.value, min, max, onFilterUpdate],
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
data-slot="range"
|
||||
className={cn("flex w-full items-center gap-2", className)}
|
||||
{...props}
|
||||
>
|
||||
<Input
|
||||
id={`${inputId}-min`}
|
||||
type="number"
|
||||
aria-label={`${meta?.label} minimum value`}
|
||||
aria-valuemin={min}
|
||||
aria-valuemax={max}
|
||||
data-slot="range-min"
|
||||
inputMode="numeric"
|
||||
placeholder={min.toString()}
|
||||
min={min}
|
||||
max={max}
|
||||
className="h-8 w-full rounded"
|
||||
defaultValue={value[0]}
|
||||
onChange={(event) => onRangeValueChange(event.target.value, true)}
|
||||
/>
|
||||
<span className="sr-only shrink-0 text-muted-foreground">to</span>
|
||||
<Input
|
||||
id={`${inputId}-max`}
|
||||
type="number"
|
||||
aria-label={`${meta?.label} maximum value`}
|
||||
aria-valuemin={min}
|
||||
aria-valuemax={max}
|
||||
data-slot="range-max"
|
||||
inputMode="numeric"
|
||||
placeholder={max.toString()}
|
||||
min={min}
|
||||
max={max}
|
||||
className="h-8 w-full rounded"
|
||||
defaultValue={value[1]}
|
||||
onChange={(event) => onRangeValueChange(event.target.value)}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -225,26 +225,7 @@ export function createDownloadProcedure(config: DownloadConfig) {
|
||||
* 提供文件上传相关的接口,使用工厂函数创建特定业务的上传接口
|
||||
*/
|
||||
export const uploadRouter = createTRPCRouter({
|
||||
// 供给照片批量上传接口
|
||||
supplyPhotos: createBatchUploadProcedure({
|
||||
category: 'transfer/supply',
|
||||
maxSize: 1 * 1024 * 1024, // 1MB
|
||||
allowedContentType: 'image/*',
|
||||
expirySeconds: 3600,
|
||||
permission: Permissions.TRANSFER_SUPPLY_CREATE,
|
||||
}),
|
||||
supplyPdfs: createBatchUploadProcedure({
|
||||
category: 'transfer/supply',
|
||||
maxSize: 1 * 1024 * 1024, // 1MB
|
||||
allowedContentType: 'application/pdf',
|
||||
expirySeconds: 3600,
|
||||
permission: Permissions.TRANSFER_SUPPLY_CREATE,
|
||||
}),
|
||||
// 已上传的供给照片下载
|
||||
downloadSupplyPhotos: createDownloadProcedure({
|
||||
expirySeconds: 3600,
|
||||
permission: Permissions.TRANSFER_SUPPLY_CREATE,
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
export type SingleUploadProcedureInput = inferProcedureInput<ReturnType<typeof createSingleUploadProcedure>>; // createSingleUploadProcedure 创建的接口调用参数
|
||||
|
||||
Reference in New Issue
Block a user