添加合同和卷宗数据隔离

This commit is contained in:
2025-06-03 12:16:31 +08:00
parent b02978508d
commit 0397139ad8
20 changed files with 1190 additions and 437 deletions
+31 -10
View File
@@ -1,6 +1,6 @@
// app/routes/rule-groups.new.tsx
import { redirect, type ActionFunctionArgs, type LoaderFunctionArgs, type MetaFunction } from "@remix-run/node";
import { useLoaderData, useActionData, useNavigation, Form } from "@remix-run/react";
import { useLoaderData, useActionData, useNavigation, Form, useRouteLoaderData } from "@remix-run/react";
import { useEffect, useState, useRef } from "react";
import { Button } from "~/components/ui/Button";
import { Card } from "~/components/ui/Card";
@@ -232,6 +232,12 @@ export default function RuleGroupNew() {
const actionData = useActionData<typeof action>();
const navigation = useNavigation();
const isSubmitting = navigation.state === "submitting";
const rootData = useRouteLoaderData("root") as { userRole: string };
const userRole = rootData?.userRole || 'common';
// 判断表单是否为只读模式
const isReadOnly = userRole === 'common';
// 解构数据
const { group, parentGroups, isEdit, error } = data;
@@ -369,6 +375,12 @@ export default function RuleGroupNew() {
// 处理表单提交前验证
const handleBeforeSubmit = (e: React.FormEvent) => {
// 如果是只读模式,阻止提交
if (isReadOnly) {
e.preventDefault();
return;
}
// 标记所有字段为已触摸
setTouchedFields({
name: true,
@@ -409,7 +421,7 @@ export default function RuleGroupNew() {
{/* 页面头部 */}
<div className="page-header">
<div>
<h1 className="page-title">{isEdit ? "编辑评查点分组" : "新增评查点分组"}</h1>
<h1 className="page-title">{isEdit ? (isReadOnly ? "查看评查点分组" : "编辑评查点分组") : "新增评查点分组"}</h1>
<p className="page-subtitle"></p>
</div>
<div className="header-actions">
@@ -420,13 +432,15 @@ export default function RuleGroupNew() {
>
<i className="ri-arrow-left-line"></i>
</Button>
<Button
type="primary"
form="group-form"
disabled={isSubmitting}
>
<i className="ri-save-line"></i> {isSubmitting ? '保存中...' : '保存分组'}
</Button>
{!isReadOnly && (
<Button
type="primary"
form="group-form"
disabled={isSubmitting}
>
<i className="ri-save-line"></i> {isSubmitting ? '保存中...' : '保存分组'}
</Button>
)}
</div>
</div>
@@ -472,6 +486,7 @@ export default function RuleGroupNew() {
value="primary"
checked={formValues.groupType === "primary"}
onChange={handleGroupTypeChange}
disabled={isReadOnly}
/>
<span></span>
</label>
@@ -484,6 +499,7 @@ export default function RuleGroupNew() {
value="secondary"
checked={formValues.groupType === "secondary"}
onChange={handleGroupTypeChange}
disabled={isReadOnly}
/>
<span></span>
</label>
@@ -503,6 +519,7 @@ export default function RuleGroupNew() {
className={`form-select ${touchedFields.parentId && formErrors.parentId ? 'error' : ''}`}
value={formValues.parentId}
onChange={handleChange}
disabled={isReadOnly}
>
<option value=""></option>
{parentGroups
@@ -535,6 +552,7 @@ export default function RuleGroupNew() {
value={formValues.code}
onChange={handleChange}
placeholder="请输入分组编码,如contract-base"
readOnly={isReadOnly}
/>
{touchedFields.code && formErrors.code && (
<div className="form-error">{formErrors.code}</div>
@@ -555,6 +573,7 @@ export default function RuleGroupNew() {
value={formValues.name}
onChange={handleChange}
placeholder="请输入分组名称,如合同基本要素检查"
readOnly={isReadOnly}
/>
{touchedFields.name && formErrors.name && (
<div className="form-error">{formErrors.name}</div>
@@ -583,6 +602,7 @@ export default function RuleGroupNew() {
value={formValues.description}
onChange={handleChange}
placeholder="请输入分组描述,包括适用场景、分组目的等"
readOnly={isReadOnly}
></textarea>
<div className="form-tip"></div>
</div>
@@ -596,6 +616,7 @@ export default function RuleGroupNew() {
className="form-select"
value={formValues.status}
onChange={handleChange}
disabled={isReadOnly}
>
<option value="active"></option>
<option value="inactive"></option>