From 1187936c713bae2ad43063900c7bee80502e091d Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 19 十一月 2025 17:06:42 +0800
Subject: [PATCH] fix: 重构拉丝报工

---
 src/pages/production/wire/report/wire.vue |  627 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 480 insertions(+), 147 deletions(-)

diff --git a/src/pages/production/wire/report/wire.vue b/src/pages/production/wire/report/wire.vue
index da32716..e391316 100644
--- a/src/pages/production/wire/report/wire.vue
+++ b/src/pages/production/wire/report/wire.vue
@@ -1,41 +1,181 @@
 <template>
   <view class="list">
-    <z-paging ref="pagingRef" v-model="wireReportList" :fixed="false" @query="getWireReportList">
-      <template #top>
-        <CardTitle title="鎶ュ伐淇℃伅" :hideAction="true" :full="false" @action="addReport" />
+    <CardTitle title="鎶ュ伐淇℃伅" :hideAction="false" :full="false">
+      <template #action>
+        <wd-button
+          icon="file-add"
+          :round="false"
+          size="small"
+          custom-class="add_btn"
+          @click="handleAddParent"
+        >
+          鏂板鏉嗗寘
+        </wd-button>
       </template>
-      <wd-card
-        v-for="(item, index) in wireReportList"
-        :key="index"
-        type="rectangle"
-        custom-class="round"
-      >
+    </CardTitle>
+
+    <!-- 鐖剁骇鍒楄〃锛堟潌鍖咃級 -->
+    <view class="parent-list">
+      <wd-card v-for="(item, index) in parentDataList" :key="item.id || index" class="card_bg">
         <template #title>
-          <view class="flex justify-between">
-            <view>
-              <wd-icon name="user" color="#0D867F"></wd-icon>
-              <text class="text-[#0D867F] ml-2 font-medium">鐢熶骇浜�</text>
-              <text class="text-[#333333] ml-2">{{ item.productUser }}</text>
+          <view class="flex justify-between w-full">
+            <view class="flex items-center">
+              <text class="font-medium text-[#252525]">鏉嗗寘淇℃伅</text>
+              <view v-if="item.isAutoAdd == 1" class="text-xs text-blue-500 ml-2">鑷姩娣诲姞</view>
             </view>
-            <!-- <view class="text-[#A8A8A8]" @click="toEdit">缂栬緫</view> -->
+            <wd-button plain type="error" size="small" @click="handleDeleteRodBag(item)">
+              鍒犻櫎
+            </wd-button>
           </view>
         </template>
-        <ProductionCard :data="cardAttr" :value="item" />
+
+        <view>
+          <wd-row class="my-2" v-if="item.poleNumber">
+            <wd-col :span="24">
+              <view class="flex">
+                <view class="icon_box">
+                  <wd-icon name="folder" color="#0D867F"></wd-icon>
+                </view>
+                <text class="text-[#646874] mx-2">
+                  棰嗙敤鏉嗗彿:
+                  <text class="text-[#252525]">{{ item.poleNumber }}</text>
+                </text>
+              </view>
+            </wd-col>
+          </wd-row>
+          <wd-row class="my-2" v-if="item.poleModel">
+            <wd-col :span="12">
+              <view class="flex">
+                <view class="icon_box">
+                  <wd-icon name="folder" color="#0D867F"></wd-icon>
+                </view>
+                <text class="text-[#646874] mx-2">
+                  鏉嗗瀷鍙�:
+                  <text class="text-[#252525]">{{ item.poleModel }}</text>
+                </text>
+              </view>
+            </wd-col>
+            <wd-col :span="12">
+              <view class="flex">
+                <view class="icon_box">
+                  <wd-icon name="folder" color="#0D867F"></wd-icon>
+                </view>
+                <text class="text-[#646874] mx-2">
+                  鏉嗗寘鍙�:
+                  <text class="text-[#252525]">{{ item.polePackageNumber }}</text>
+                </text>
+              </view>
+            </wd-col>
+          </wd-row>
+          <wd-row class="my-2">
+            <wd-col :span="24" v-if="item.poleWeight">
+              <view class="flex">
+                <view class="icon_box">
+                  <wd-icon name="folder" color="#0D867F"></wd-icon>
+                </view>
+                <text class="text-[#646874] mx-2">
+                  鏉嗛噸(kg):
+                  <text class="text-[#252525]">{{ item.poleWeight }}</text>
+                </text>
+              </view>
+            </wd-col>
+          </wd-row>
+          <wd-row class="my-2">
+            <wd-col :span="24" v-if="item.supplier">
+              <view class="flex">
+                <view class="icon_box">
+                  <wd-icon name="folder" color="#0D867F"></wd-icon>
+                </view>
+                <text class="text-[#646874] mx-2">
+                  渚涘簲鍟�:
+                  <text class="text-[#252525]">{{ item.supplier }}</text>
+                </text>
+              </view>
+            </wd-col>
+          </wd-row>
+          <wd-row class="my-2" v-if="item.isConsumed !== undefined">
+            <wd-col :span="24">
+              <view class="flex items-center">
+                <view class="icon_box">
+                  <wd-icon name="folder" color="#0D867F"></wd-icon>
+                </view>
+                <text class="text-[#646874] mx-2">娑堣�楁儏鍐�:</text>
+                <wd-switch
+                  v-model="item.isConsumed"
+                  :disabled="false"
+                  active-text="宸茶�楀畬"
+                  inactive-text="杩樺墿浣�"
+                  :active-value="1"
+                  :inactive-value="0"
+                  size="20"
+                  @change="handleConsumedChange(item, $event)"
+                />
+              </view>
+            </wd-col>
+          </wd-row>
+        </view>
+
         <template #footer>
-          <wd-button size="small" plain style="margin-right: 10px" @click="toAttachment(item)">
-            闄勪欢
-          </wd-button>
-          <wd-button size="small" plain @click="toCheck(item.id)">鑷</wd-button>
+          <view class="flex justify-start">
+            <wd-button plain size="small" type="primary" @click="openChildDialog(item)">
+              鎶ュ伐绠$悊
+            </wd-button>
+          </view>
         </template>
       </wd-card>
-    </z-paging>
-    <wd-popup v-model="dialog.visible" position="bottom" custom-class="yl-popup">
-      <view class="action px-3">
-        <wd-button type="text" @click="cancel">鍙栨秷</wd-button>
-        <wd-button type="text" @click="submit">纭畾</wd-button>
+    </view>
+
+    <!-- 鏂板鏉嗗寘寮规 -->
+    <wd-popup v-model="parentDialogVisible" position="bottom" custom-class="yl-popup">
+      <view class="parent-dialog">
+        <view class="dialog-header">
+          <text class="dialog-title">鏂板鏉嗗寘</text>
+          <wd-icon name="close" class="close-icon" @click="closeParentDialog"></wd-icon>
+        </view>
+        <view class="dialog-content">
+          <wd-cell-group>
+            <wd-input
+              v-model="newParentData.poleNumber"
+              label="棰嗙敤鏉嗗彿"
+              label-width="100px"
+              placeholder="璇疯緭鍏ラ鐢ㄦ潌鍙�"
+            />
+            <wd-input
+              v-model="newParentData.poleModel"
+              label="鏉嗗瀷鍙�"
+              label-width="100px"
+              placeholder="璇疯緭鍏ユ潌鍨嬪彿"
+            />
+            <wd-input
+              v-model="newParentData.polePackageNumber"
+              label="鏉嗗寘鍙�"
+              label-width="100px"
+              placeholder="璇疯緭鍏ユ潌鍖呭彿"
+            />
+            <wd-input
+              v-model="newParentData.poleWeight"
+              label="鏉嗛噸(kg)"
+              label-width="100px"
+              type="number"
+              placeholder="璇疯緭鍏ユ潌閲�"
+            />
+            <wd-picker
+              v-model="newParentData.supplier"
+              label="渚涘簲鍟�"
+              label-width="100px"
+              :columns="supplierOptions"
+              placeholder="璇烽�夋嫨渚涘簲鍟�"
+            />
+          </wd-cell-group>
+        </view>
+        <view class="dialog-footer">
+          <wd-button plain @click="closeParentDialog">鍙栨秷</wd-button>
+          <wd-button type="primary" class="ml-2" @click="handleSaveNewParent">淇濆瓨</wd-button>
+        </view>
       </view>
-      <WireForm ref="wireFormRef" />
     </wd-popup>
+
+    <!-- Draw缁勪欢锛堥鐢ㄨ嚜妫�锛� -->
     <wd-popup v-model="drawFormRef.visible" position="bottom" custom-class="yl-popup">
       <Draw
         :wire-id="drawData.wireId"
@@ -43,172 +183,324 @@
         @close="handleDrawClose"
       />
     </wd-popup>
+
     <wd-toast />
   </view>
 </template>
+
 <script setup lang="ts">
 import CardTitle from "@/components/card-title/index.vue";
-import WireForm from "./wireForm.vue";
-import { useToast } from "wot-design-uni";
-import ProductionCard from "../../components/ProductionCard.vue";
-import zPaging from "@/components/z-paging/z-paging.vue";
+import { useToast, dayjs } from "wot-design-uni";
 import { onLoad } from "@dcloudio/uni-app";
+import { onMounted, nextTick } from "vue";
+import WireApi from "@/api/product/wire";
 import ManageApi from "@/api/product/manage";
 import Draw from "./rawMaterial.vue";
+import { getTeamId } from "@/utils/cache";
+import { useUserStore } from "@/store/modules/user";
+import WireDetailApi from "@/api/product/wire";
 
-const pagingRef = ref();
-const wireFormRef = ref();
-const paramsId = ref();
 const toast = useToast();
-const dialog = reactive({
-  visible: false,
+const userStore = useUserStore();
+const paramsId = ref();
+const model = ref();
+const oneLength = ref();
+
+// 鐖剁骇鏁版嵁鍒楄〃
+const parentDataList = ref<any[]>([]);
+// 瀛愮骇鏁版嵁鍒楄〃锛堟墍鏈夊瓙绾ф暟鎹殑鎵佸钩鍖栧垪琛級
+const childDataList = ref<any[]>([]);
+
+// 渚涘簲鍟嗛�夐」
+const supplierOptions = ref<any[]>([]);
+
+// 鐖剁骇寮规鐩稿叧
+const parentDialogVisible = ref(false);
+const newParentData = ref({
+  poleNumber: "",
+  poleModel: "",
+  polePackageNumber: "",
+  poleWeight: undefined as number | undefined,
+  supplier: "",
+  isConsumed: 1,
 });
 
+// Draw缁勪欢鐩稿叧
 const drawFormRef = reactive({
   visible: false,
 });
-// 澶勭悊draw缁勪欢鍏抽棴浜嬩欢
-const handleDrawClose = () => {
-  // 纭繚寮圭獥琚纭叧闂�
-  drawFormRef.visible = false;
-};
 const drawData = ref({
   wireId: "",
   poleNumber: "",
 });
 
-const showDrawPopup = async () => {
-  console.log("杩涘叆璇ユ柟娉曪紒");
+// 鑾峰彇璇︽儏鏁版嵁
+const getDetailData = async (id: string) => {
   try {
-    const { data } = await ManageApi.queryWireRawMaterialInspect({
-      wireId: paramsId.value,
-      poleNumber: drawData.value.poleNumber,
-    });
-    console.log("data", data);
-    // 閫傞厤涓嶅悓鐨勬暟鎹粨鏋勮繑鍥炴牸寮�
-    if (data == null) {
-      drawData.value = {
-        wireId: paramsId.value,
-        poleNumber: drawData.value.poleNumber,
-      };
-      // 鏄剧ずDraw寮圭獥
-      drawFormRef.visible = true;
-      toast.success("璇峰~鍐欓鐢ㄤ俊鎭�!");
-    } else {
-      // toast.error("宸插瓨鍦ㄩ鐢ㄤ俊鎭�,鏃犻渶濉姤!");
+    const { data } = await WireDetailApi.getWireDetailById({ id });
+    model.value = data.model;
+    oneLength.value = data.oneLength;
+  } catch (error) {
+    console.error("鑾峰彇璇︽儏澶辫触:", error);
+  }
+};
+
+// 鍔犺浇渚涘簲鍟嗗瓧鍏�
+const loadSupplierDict = async () => {
+  try {
+    const res = await ManageApi.dictAPI("al_supplier");
+    if (res.data && Array.isArray(res.data)) {
+      supplierOptions.value = res.data.map((item: any) => ({
+        label: item.dictLabel || "",
+        value: item.dictValue || item.value || "",
+      }));
     }
   } catch (error) {
-    console.error("鑾峰彇棰嗙敤淇℃伅澶辫触:", error);
-    toast.error("鑾峰彇淇℃伅澶辫触锛岃閲嶈瘯");
+    console.error("鍔犺浇渚涘簲鍟嗗瓧鍏稿け璐�:", error);
   }
 };
 
-const cardAttr = ref<any[]>([
-  {
-    label: "棰嗙敤鏉嗗彿",
-    prop: "poleNumber",
-    span: 24,
-  },
-  {
-    label: "鍗曚笣鐩樺彿",
-    prop: "monofilamentNumber",
-    span: 24,
-  },
-  {
-    label: "鏉嗗瀷鍙�",
-    prop: "poleModel",
-  },
-  {
-    label: "鏉嗗寘鍙�",
-    prop: "polePackageNumber",
-  },
-  {
-    label: "鏉嗛噸(kg)",
-    prop: "poleWeight",
-  },
-  {
-    label: "瑙勬牸鍨嬪彿",
-    prop: "model",
-  },
-  {
-    label: "鐩樺瀷鍙�",
-    prop: "dishModel",
-  },
-  {
-    label: "鐩橀暱(m)",
-    prop: "oneLength",
-  },
-  {
-    label: "瀹為檯闀垮害",
-    prop: "actuallyLength",
-  },
-  {
-    label: "瀹為檯閲嶉噺(kg)",
-    prop: "actuallyWeight",
-  },
-]);
+// 鍒濆鍖栨暟鎹�
+const getData = async () => {
+  try {
+    const { code, data } = await WireApi.getWireOutputTree({
+      wireId: paramsId.value,
+    });
 
-const wireReportList = ref<any[]>([]);
+    if (code == 200) {
+      parentDataList.value = [];
+      childDataList.value = [];
 
-// const toEdit = () => {
-//   uni.navigateTo({
-//     url: "/pages/production/wire/report/wireEdit",
-//   });
-// };
+      const parentMap = new Map();
 
-const addReport = () => {
-  dialog.visible = true;
-};
+      data.forEach((item: any) => {
+        const parentKey = `${item.poleNumber}-${item.poleModel}-${item.polePackageNumber}`;
 
-const submit = async () => {
-  const result = await wireFormRef.value.submit();
-  dialog.visible = !result.success;
-  // 璁剧疆poleNumber鍒癲rawData涓�
-  if (result.success) {
-    drawData.value.poleNumber = result.poleNumber;
-    showDrawPopup();
+        if (!parentMap.has(parentKey)) {
+          const parentData = {
+            id: parentKey,
+            poleNumber: item.poleNumber,
+            poleModel: item.poleModel,
+            polePackageNumber: item.polePackageNumber,
+            dishModel: item.dishModel,
+            poleWeight: item.poleWeight,
+            supplier: item.supplier,
+            isConsumed: item.isConsumed === true || item.isConsumed === 1 ? 1 : 0,
+            treeId: item.id,
+            isAutoAdd: item.isAutoAdd,
+          };
+          parentMap.set(parentKey, parentData);
+          parentDataList.value.push(parentData);
+        }
+
+        if (item.node && Array.isArray(item.node)) {
+          item.node.forEach((child: any) => {
+            const childData = {
+              ...child,
+              parentKey: parentKey,
+              poleNumber: item.poleNumber,
+              poleModel: item.poleModel,
+              polePackageNumber: item.polePackageNumber,
+              supplier: item.supplier,
+              selected: false,
+            };
+            childDataList.value.push(childData);
+          });
+        }
+      });
+    }
+  } catch (error) {
+    console.error("鑾峰彇鏁版嵁澶辫触:", error);
+    toast.error("鑾峰彇鏁版嵁澶辫触");
   }
-  pagingRef.value.reload();
 };
 
-const cancel = () => {
-  toast.show("鍙栨秷");
-  dialog.visible = false;
+// 鏂板鐖剁骇鏁版嵁 - 鎵撳紑寮规
+const handleAddParent = () => {
+  const lastParent = parentDataList.value[0];
+
+  // 鍒濆鍖栨柊鏁版嵁锛屽鏋滄湁鏈�鍚庝竴鏉℃暟鎹紝浣跨敤鍏跺�间綔涓洪粯璁ゅ��
+  newParentData.value = {
+    poleNumber: lastParent?.poleNumber || "",
+    poleModel: lastParent?.poleModel || "",
+    polePackageNumber: lastParent?.polePackageNumber || "",
+    poleWeight: lastParent?.poleWeight || null,
+    supplier: lastParent?.supplier || "",
+    isConsumed: 1,
+  };
+
+  parentDialogVisible.value = true;
 };
 
-const toAttachment = (item: any) => {
+// 淇濆瓨鏂扮埗绾ф暟鎹�
+const handleSaveNewParent = async () => {
+  if (
+    !newParentData.value.poleNumber ||
+    !newParentData.value.poleModel ||
+    !newParentData.value.polePackageNumber ||
+    !newParentData.value.poleWeight
+  ) {
+    toast.error("璇峰~鍐欏畬鏁寸殑鐖剁骇淇℃伅锛堥鐢ㄦ潌鍙枫�佹潌鍨嬪彿銆佹潌鍖呭彿銆佹潌閲嶄负蹇呭~椤癸級");
+    return;
+  }
+
+  try {
+    const { code } = await WireApi.addRodBagTree({
+      wireId: paramsId.value,
+      poleNumber: newParentData.value.poleNumber,
+      poleModel: newParentData.value.poleModel,
+      polePackageNumber: newParentData.value.polePackageNumber,
+      supplier: newParentData.value.supplier,
+      poleWeight: newParentData.value.poleWeight,
+      isConsumed: newParentData.value.isConsumed,
+    });
+
+    if (code == 200) {
+      toast.success("淇濆瓨鎴愬姛");
+      closeParentDialog();
+      await getData();
+    }
+  } catch (error) {
+    console.error("淇濆瓨澶辫触:", error);
+    toast.error("淇濆瓨澶辫触");
+  }
+};
+
+// 鍏抽棴鐖剁骇寮规
+const closeParentDialog = () => {
+  parentDialogVisible.value = false;
+  // 閲嶇疆琛ㄥ崟鏁版嵁
+  newParentData.value = {
+    poleNumber: "",
+    poleModel: "",
+    polePackageNumber: "",
+    poleWeight: undefined,
+    supplier: "",
+    isConsumed: 1,
+  };
+};
+
+// 鍒犻櫎鏉嗗寘
+const handleDeleteRodBag = async (row: any) => {
+  try {
+    const res = await uni.showModal({
+      title: "鎻愮ず",
+      content: `纭畾鍒犻櫎鏉嗗寘锛�${row.poleNumber} - ${row.poleModel} - ${row.polePackageNumber} 鍚楋紵`,
+    });
+
+    if (res.confirm) {
+      const { code } = await WireApi.deleteRodBagTree({
+        wireId: paramsId.value,
+        poleModel: row.poleModel,
+        poleNumber: row.poleNumber,
+        polePackageNumber: row.polePackageNumber,
+      });
+
+      if (code === 200) {
+        toast.success("鍒犻櫎鎴愬姛");
+        await getData();
+      } else {
+        toast.error("鍒犻櫎澶辫触");
+      }
+    }
+  } catch (error) {
+    console.error("鍒犻櫎鏉嗗寘澶辫触:", error);
+    toast.error("鍒犻櫎澶辫触");
+  }
+};
+
+// 娑堣�楁儏鍐靛彉鍖�
+const handleConsumedChange = async (row: any, value: any) => {
+  if (row.treeId) {
+    // 淇濆瓨鏃у�硷紝鐢ㄤ簬澶辫触鏃舵仮澶�
+    const oldValue = row.isConsumed;
+
+    // 澶勭悊 value锛屽彲鑳芥槸鏁板瓧銆佸璞℃垨鍏朵粬鏍煎紡
+    let isConsumedValue: number;
+    if (typeof value === "object" && value !== null && "value" in value) {
+      // 濡傛灉鏄璞℃牸寮� {value: 1}
+      isConsumedValue = value.value;
+    } else if (typeof value === "number") {
+      // 濡傛灉鏄暟瀛�
+      isConsumedValue = value;
+    } else if (typeof value === "boolean") {
+      // 濡傛灉鏄竷灏斿��
+      isConsumedValue = value ? 1 : 0;
+    } else {
+      // 鍏朵粬鎯呭喌锛屽皾璇曡浆鎹�
+      isConsumedValue = value === 1 || value === "1" || value === true ? 1 : 0;
+    }
+
+    // 鍏堟洿鏂� UI
+    row.isConsumed = isConsumedValue;
+
+    try {
+      const { code } = await WireApi.updateRodBagTree({
+        treeId: row.treeId,
+        isConsumed: isConsumedValue,
+      });
+
+      if (code != 200) {
+        toast.error("鏇存柊澶辫触");
+        // 鏇存柊澶辫触鏃舵仮澶嶅師鍊�
+        row.isConsumed = oldValue;
+      }
+    } catch (error) {
+      console.error("鏇存柊娑堣�楁儏鍐靛け璐�:", error);
+      toast.error("鏇存柊澶辫触");
+      // 鏇存柊澶辫触鏃舵仮澶嶅師鍊�
+      row.isConsumed = oldValue;
+    }
+  }
+};
+
+// 鎵撳紑瀛愮骇椤甸潰
+const openChildDialog = async (parentRow: any) => {
+  // 妫�鏌ユ槸鍚︽湁棰嗙敤淇℃伅
+  try {
+    const { code, data } = await ManageApi.queryWireRawMaterialInspect({
+      wireId: paramsId.value,
+      poleNumber: parentRow.poleNumber,
+    });
+
+    if (code == 200) {
+      if (data == null) {
+        // 鏄剧ずDraw缁勪欢
+        drawData.value = {
+          wireId: paramsId.value,
+          poleNumber: parentRow.poleNumber,
+        };
+        drawFormRef.visible = true;
+        toast.warning("璇峰厛濉啓棰嗙敤淇℃伅");
+        return;
+      }
+    }
+  } catch (error) {
+    console.error("妫�鏌ラ鐢ㄤ俊鎭け璐�:", error);
+  }
+
+  // 璺宠浆鍒版姤宸ョ鐞嗛〉闈�
   uni.navigateTo({
-    url: "/pages/production/wire/attachment/index",
-    success: () => {
-      // 椤甸潰璺宠浆鎴愬姛鍚庡彂閫佷簨浠朵紶閫掓暟鎹�
-      uni.$emit("detailData", item);
-    },
+    url: `/pages/production/wire/report/reportManage?wireId=${paramsId.value}&parentId=${parentRow.id}&poleNumber=${parentRow.poleNumber}&poleModel=${parentRow.poleModel}&polePackageNumber=${parentRow.polePackageNumber}&poleWeight=${parentRow.poleWeight}&supplier=${parentRow.supplier || ""}`,
   });
 };
 
-const toCheck = (id: number) => {
-  uni.navigateTo({
-    url: `/pages/production/wire/selfInspect/index?id=${id}`,
-  });
+// 澶勭悊draw缁勪欢鍏抽棴浜嬩欢
+const handleDrawClose = () => {
+  drawFormRef.visible = false;
 };
 
-// 鑾峰彇鎷変笣鎶ュ伐鍒楄〃
-const getWireReportList = async () => {
-  const { data } = await ManageApi.getReportList({
-    wireId: paramsId.value,
-    type: "鎷変笣",
-  });
-  pagingRef.value.complete(data);
-};
-
-onLoad((options: any) => {
+onLoad(async (options: any) => {
   paramsId.value = options.id;
+  await getDetailData(options.id);
+  await loadSupplierDict();
+  await getData();
 });
 </script>
 
 <style lang="scss" scoped>
 .list {
-  height: calc(100vh - 30px);
+  min-height: calc(100vh - 30px);
   padding: 12px;
   background: #f3f9f8;
 
@@ -219,8 +511,49 @@
   }
 }
 
-.action {
+.parent-list {
+  margin-top: 12px;
+}
+
+.card_bg {
+  box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.05);
+  padding-bottom: 10px;
+  margin-bottom: 12px;
+}
+
+.icon_box {
   display: flex;
-  justify-content: space-between;
+  align-items: center;
+  justify-content: center;
+  width: 20px;
+  height: 20px;
+  background: #e7f4ec99;
+  border-radius: 50%;
+}
+
+.edit-form {
+  padding: 12px 0;
+}
+
+.parent-dialog {
+  max-height: 80vh;
+  display: flex;
+  flex-direction: column;
+  background: #fff;
+  border-radius: 12px 12px 0 0;
+}
+
+.dialog-content {
+  flex: 1;
+  overflow-y: auto;
+  padding: 16px;
+}
+
+.dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+  padding: 16px;
+  border-top: 1px solid #e6e6e6;
+  gap: 8px;
 }
 </style>

--
Gitblit v1.9.3