From fbba46986e98abe68cd2460d1ed2e296cc4ad269 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 04 六月 2026 16:04:46 +0800
Subject: [PATCH] 会议的参会人员改为用户管理的数据选择及其他页面的回显
---
src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue | 632 +++++++++++++++++++++++++++++++-------------------------
1 files changed, 349 insertions(+), 283 deletions(-)
diff --git a/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue b/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
index 26e2c24..57f5eaa 100644
--- a/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
+++ b/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
@@ -1,182 +1,219 @@
<template>
<div>
-
- <el-form :model="searchForm" inline>
- <el-form-item label="浼氳涓婚">
- <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�" clearable/>
- </el-form-item>
- <el-form-item label="鐢宠浜�">
- <el-input v-model="searchForm.applicant" placeholder="璇疯緭鍏ョ敵璇蜂汉" clearable/>
- </el-form-item>
- <el-form-item label="瀹℃壒鐘舵��">
- <el-select style="width: 100px" v-model="searchForm.status" placeholder="璇烽�夋嫨瀹℃壒鐘舵��" clearable>
- <el-option label="寰呭鎵�" value="0"/>
- <el-option label="宸查�氳繃" value="1"/>
- <el-option label="鏈鎵�" value="2"/>
- <el-option label="宸插彇娑�" value="3"/>
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
+ <el-form :model="searchForm"
+ inline>
+ <el-form-item label="浼氳涓婚">
+ <el-input v-model="searchForm.title"
+ placeholder="璇疯緭鍏ヤ細璁富棰�"
+ clearable />
+ </el-form-item>
+ <el-form-item label="鐢宠浜�">
+ <el-input v-model="searchForm.applicant"
+ placeholder="璇疯緭鍏ョ敵璇蜂汉"
+ clearable />
+ </el-form-item>
+ <el-form-item label="瀹℃壒鐘舵��">
+ <el-select style="width: 100px"
+ v-model="searchForm.status"
+ placeholder="璇烽�夋嫨瀹℃壒鐘舵��"
+ clearable>
+ <el-option label="寰呭鎵�"
+ value="0" />
+ <el-option label="宸查�氳繃"
+ value="1" />
+ <el-option label="鏈鎵�"
+ value="2" />
+ <el-option label="宸插彇娑�"
+ value="3" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary"
+ @click="handleSearch">鎼滅储</el-button>
+ <el-button @click="resetSearch">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
<!-- 浼氳瀹℃壒鍒楄〃 -->
<el-card>
- <el-table v-loading="loading" :data="approvalList" border :height="tableHeight">
- <el-table-column prop="title" label="浼氳涓婚" align="center" min-width="200" show-overflow-tooltip/>
- <el-table-column prop="applicant" label="鐢宠浜�" align="center" width="120"/>
- <el-table-column prop="host" label="涓荤悊浜�" align="center" width="120"/>
- <el-table-column prop="meetingTime" label="浼氳鏃堕棿" align="center" width="180">
+ <el-table v-loading="loading"
+ :data="approvalList"
+ border
+ :height="tableHeight">
+ <el-table-column prop="title"
+ label="浼氳涓婚"
+ align="center"
+ min-width="200"
+ show-overflow-tooltip />
+ <el-table-column prop="applicant"
+ label="鐢宠浜�"
+ align="center"
+ width="120" />
+ <el-table-column prop="host"
+ label="涓荤悊浜�"
+ align="center"
+ width="120" />
+ <el-table-column prop="meetingTime"
+ label="浼氳鏃堕棿"
+ align="center"
+ width="180">
<template #default="scope">
{{ formatDateTime(scope.row.meetingTime) }}
</template>
</el-table-column>
- <el-table-column prop="location" label="浼氳鍦扮偣" align="center" width="150"/>
- <el-table-column prop="participants" label="鍙備細浜烘暟" align="center" width="100">
+ <el-table-column prop="location"
+ label="浼氳鍦扮偣"
+ align="center"
+ width="150" />
+ <el-table-column prop="participants"
+ label="鍙備細浜烘暟"
+ align="center"
+ width="100">
<template #default="scope">
{{ scope.row.participants.length }}浜�
</template>
</el-table-column>
- <el-table-column prop="status" label="瀹℃壒鐘舵��" align="center" width="120">
+ <el-table-column prop="status"
+ label="瀹℃壒鐘舵��"
+ align="center"
+ width="120">
<template #default="scope">
<el-tag :type="getStatusType(scope.row.status)">
{{ getStatusText(scope.row.status) }}
</el-tag>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="200" fixed="right">
+ <el-table-column label="鎿嶄綔"
+ align="center"
+ width="200"
+ fixed="right">
<template #default="scope">
- <el-button type="primary" link @click="viewDetail(scope.row)">鏌ョ湅</el-button>
- <el-button
- v-if="scope.row.status == '0'"
- type="primary"
- link
- @click="handleApproval(scope.row)"
- >
+ <el-button type="primary"
+ link
+ @click="viewDetail(scope.row)">鏌ョ湅</el-button>
+ <el-button v-if="scope.row.status == '0'"
+ type="primary"
+ link
+ @click="handleApproval(scope.row)">
瀹℃壒
</el-button>
</template>
</el-table-column>
</el-table>
-
<!-- 鍒嗛〉 -->
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.current"
- v-model:limit="queryParams.size"
- @pagination="getList"
- />
+ <pagination v-show="total > 0"
+ :total="total"
+ v-model:page="queryParams.current"
+ v-model:limit="queryParams.size"
+ @pagination="getList" />
</el-card>
-
<!-- 浼氳璇︽儏瀵硅瘽妗� -->
- <el-dialog
- title="浼氳璇︽儏"
- v-model="detailDialogVisible"
- width="800px"
- >
+ <el-dialog title="浼氳璇︽儏"
+ v-model="detailDialogVisible"
+ width="800px">
<div v-if="currentMeeting">
- <el-descriptions label-width="100px" class="meeting-desc" :column="2" border>
- <el-descriptions-item label="浼氳涓婚" label-class-name="nowrap-label">{{
+ <el-descriptions label-width="100px"
+ class="meeting-desc"
+ :column="2"
+ border>
+ <el-descriptions-item label="浼氳涓婚"
+ label-class-name="nowrap-label">{{
currentMeeting.title
}}</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜�" label-class-name="nowrap-label">{{
+ <el-descriptions-item label="鐢宠浜�"
+ label-class-name="nowrap-label">{{
currentMeeting.applicant
}}</el-descriptions-item>
- <el-descriptions-item label="涓荤悊浜�" label-class-name="nowrap-label">{{
+ <el-descriptions-item label="涓荤悊浜�"
+ label-class-name="nowrap-label">{{
currentMeeting.host
}}</el-descriptions-item>
- <el-descriptions-item label="浼氳鏃堕棿" :span="2" label-class-name="nowrap-label">
+ <el-descriptions-item label="浼氳鏃堕棿"
+ :span="2"
+ label-class-name="nowrap-label">
{{ formatDateTime(currentMeeting.meetingTime) }}
</el-descriptions-item>
- <el-descriptions-item label="浼氳鍦扮偣" label-class-name="nowrap-label">{{
+ <el-descriptions-item label="浼氳鍦扮偣"
+ label-class-name="nowrap-label">{{
currentMeeting.location
}}</el-descriptions-item>
- <el-descriptions-item label="鍙備細浜烘暟" label-class-name="nowrap-label">{{
+ <el-descriptions-item label="鍙備細浜烘暟"
+ label-class-name="nowrap-label">{{
currentMeeting.participants.length
}}浜�</el-descriptions-item>
- <el-descriptions-item label="瀹℃壒鐘舵��" label-class-name="nowrap-label">
+ <el-descriptions-item label="瀹℃壒鐘舵��"
+ label-class-name="nowrap-label">
<el-tag :type="getStatusType(currentMeeting.status)">
{{ getStatusText(currentMeeting.status) }}
</el-tag>
</el-descriptions-item>
- <el-descriptions-item label="鐢宠鏃堕棿" label-class-name="nowrap-label">{{
+ <el-descriptions-item label="鐢宠鏃堕棿"
+ label-class-name="nowrap-label">{{
currentMeeting.createTime
}}</el-descriptions-item>
- <el-descriptions-item style="max-height: 400px" label="浼氳璇存槑" :span="2"
+ <el-descriptions-item style="max-height: 400px"
+ label="浼氳璇存槑"
+ :span="2"
label-class-name="nowrap-label">{{ currentMeeting.description }}</el-descriptions-item>
</el-descriptions>
-
-
<div class="content-section mt-20">
<h4>鍙備細浜哄憳</h4>
<div class="participants-list">
- <el-tag
- v-for="participant in currentMeeting.participants"
- :key="participant.id"
- style="margin-right: 10px; margin-bottom: 10px;"
- >
+ <el-tag v-for="participant in currentMeeting.participants"
+ :key="participant.id"
+ style="margin-right: 10px; margin-bottom: 10px;">
{{ participant.name }}
</el-tag>
</div>
</div>
</div>
-
<template #footer>
<div class="dialog-footer">
<el-button @click="detailDialogVisible = false">鍏� 闂�</el-button>
</div>
</template>
</el-dialog>
-
<!-- 浼氳瀹℃壒瀵硅瘽妗� -->
- <el-dialog
- title="浼氳瀹℃壒"
- v-model="approvalDialogVisible"
- >
+ <el-dialog title="浼氳瀹℃壒"
+ v-model="approvalDialogVisible">
<div v-if="currentMeeting">
- <el-descriptions :column="2" border>
+ <el-descriptions :column="2"
+ border>
<el-descriptions-item label="浼氳涓婚">{{ currentMeeting.title }}</el-descriptions-item>
<el-descriptions-item label="鐢宠浜�">{{ currentMeeting.applicant }}</el-descriptions-item>
<el-descriptions-item label="涓荤悊浜�">{{ currentMeeting.host }}</el-descriptions-item>
- <el-descriptions-item label="浼氳鏃堕棿" :span="2">
+ <el-descriptions-item label="浼氳鏃堕棿"
+ :span="2">
{{ formatDateTime(currentMeeting.meetingTime) }}
</el-descriptions-item>
<el-descriptions-item label="浼氳鍦扮偣">{{ currentMeeting.location }}</el-descriptions-item>
<el-descriptions-item label="鍙備細浜烘暟">{{ currentMeeting.participants.length }}浜�</el-descriptions-item>
</el-descriptions>
-
<div class="content-section mt-20">
<h4>鍙備細浜哄憳</h4>
<div class="participants-list">
- <el-tag
- v-for="participant in currentMeeting.participants"
- :key="participant.id"
- style="margin-right: 10px; margin-bottom: 10px;"
- >
+ <el-tag v-for="participant in currentMeeting.participants"
+ :key="participant.id"
+ style="margin-right: 10px; margin-bottom: 10px;">
{{ participant.name }}
</el-tag>
</div>
</div>
-
- <div v-show="false" class="approval-opinion mt-20">
+ <div v-show="false"
+ class="approval-opinion mt-20">
<h4>瀹℃壒鎰忚</h4>
- <el-input
- v-model="approvalOpinion"
- type="textarea"
- placeholder="璇疯緭鍏ュ鎵规剰瑙�"
- :rows="4"
- />
+ <el-input v-model="approvalOpinion"
+ type="textarea"
+ placeholder="璇疯緭鍏ュ鎵规剰瑙�"
+ :rows="4" />
</div>
</div>
-
<template #footer>
<div class="dialog-footer">
<el-button @click="approvalDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="danger" @click="submitApproval('2')">涓嶉�氳繃</el-button>
- <el-button type="primary" @click="submitApproval('1')">閫� 杩�</el-button>
+ <el-button type="danger"
+ @click="submitApproval('2')">涓嶉�氳繃</el-button>
+ <el-button type="primary"
+ @click="submitApproval('1')">閫� 杩�</el-button>
</div>
</template>
</el-dialog>
@@ -184,231 +221,260 @@
</template>
<script setup>
-import {ref, reactive, onMounted} from 'vue'
-import {ElMessage, ElMessageBox} from 'element-plus'
-import Pagination from '@/components/Pagination/index.vue'
-import {getRoomEnum, getExamineList,saveMeetingApplication} from '@/api/collaborativeApproval/meeting.js'
-import dayjs from "dayjs";
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+ import { ref, reactive, onMounted } from "vue";
+ import { ElMessage, ElMessageBox } from "element-plus";
+ import Pagination from "@/components/Pagination/index.vue";
+ import {
+ getRoomEnum,
+ getExamineList,
+ saveMeetingApplication,
+ } from "@/api/collaborativeApproval/meeting.js";
+ import dayjs from "dayjs";
+ import { userListNoPageByTenantId } from "@/api/system/user.js";
-// 鏁版嵁鍒楄〃鍔犺浇鐘舵��
-const loading = ref(false)
+ // 鏁版嵁鍒楄〃鍔犺浇鐘舵��
+ const loading = ref(false);
-// 鎬绘潯鏁�
-const total = ref(0)
+ // 鎬绘潯鏁�
+ const total = ref(0);
-// 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
-const tableHeight = ref(window.innerHeight - 380)
-const roomEnum = ref([])
-const staffList = ref([])
-// 瀹℃壒鍒楄〃鏁版嵁
-const approvalList = ref([])
+ // 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
+ const tableHeight = ref(window.innerHeight - 380);
+ const roomEnum = ref([]);
+ const userList = ref([]);
+ // 瀹℃壒鍒楄〃鏁版嵁
+ const approvalList = ref([]);
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
- current: 1,
- size: 10
-})
+ // 鏌ヨ鍙傛暟
+ const queryParams = reactive({
+ current: 1,
+ size: 10,
+ });
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
- title: '',
- applicant: '',
- status: ''
-})
+ // 鎼滅储琛ㄥ崟
+ const searchForm = reactive({
+ title: "",
+ applicant: "",
+ status: "",
+ });
-// 鏄惁鏄剧ず瀵硅瘽妗�
-const detailDialogVisible = ref(false)
-const approvalDialogVisible = ref(false)
+ // 鏄惁鏄剧ず瀵硅瘽妗�
+ const detailDialogVisible = ref(false);
+ const approvalDialogVisible = ref(false);
-// 褰撳墠鏌ョ湅鐨勪細璁�
-const currentMeeting = ref(null)
+ // 褰撳墠鏌ョ湅鐨勪細璁�
+ const currentMeeting = ref(null);
-// 瀹℃壒鎰忚
-const approvalOpinion = ref('')
+ // 瀹℃壒鎰忚
+ const approvalOpinion = ref("");
-// 鏌ヨ鏁版嵁
-const getList = async () => {
- loading.value = true
- let resp = await getExamineList({...searchForm, ...queryParams})
- approvalList.value = resp.data.records.map(it => {
- let room = roomEnum.value.find(room => it.roomId === room.id)
- it.location = `${room.name}(${room.location})`
- let staffs = JSON.parse(it.participants)
- it.staffCount = staffs.size
- it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format('HH:mm:ss')} ~ ${dayjs(it.endTime).format('HH:mm:ss')}`
- it.participants = staffList.value.filter(staff => staffs.some(id=>id === staff.id)).map(staff => {
- return {
- id: staff.id,
- name: `${staff.staffName}${staff.postName ? ` (${staff.postName})` : ''}`
+ // 鏌ヨ鏁版嵁
+ const getList = async () => {
+ loading.value = true;
+ let resp = await getExamineList({ ...searchForm, ...queryParams });
+ const userMap = new Map(userList.value.map(u => [String(u.userId), u]));
+ approvalList.value = resp.data.records.map(it => {
+ let room = roomEnum.value.find(room => it.roomId === room.id);
+ it.location = `${room.name}(${room.location})`;
+ let participantIds = [];
+ try {
+ participantIds = Array.isArray(it.participants)
+ ? it.participants
+ : JSON.parse(it.participants);
+ } catch (_e) {
+ participantIds = [];
}
- })
+ if (!Array.isArray(participantIds)) participantIds = [];
+ it.staffCount = participantIds.length;
+ it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format(
+ "HH:mm:ss"
+ )} ~ ${dayjs(it.endTime).format("HH:mm:ss")}`;
+ it.participants = participantIds.map(id => {
+ const user = userMap.get(String(id));
+ const nickName = user?.nickName || user?.userName || String(id ?? "");
+ const deptNames = user?.deptNames || "";
+ return {
+ id,
+ name: deptNames ? `${nickName} (${deptNames})` : nickName,
+ };
+ });
+ return it;
+ });
+ total.value = resp.data.total;
+ loading.value = false;
+ };
- return it
- })
- total.value = resp.data.total
- loading.value = false
-}
+ // 鎼滅储鎸夐挳鎿嶄綔
+ const handleSearch = () => {
+ queryParams.pageNum = 1;
+ getList();
+ };
-// 鎼滅储鎸夐挳鎿嶄綔
-const handleSearch = () => {
- queryParams.pageNum = 1
- getList()
-}
+ // 閲嶇疆鎼滅储琛ㄥ崟
+ const resetSearch = () => {
+ Object.assign(searchForm, {
+ title: "",
+ applicant: "",
+ status: "",
+ });
+ handleSearch();
+ };
-// 閲嶇疆鎼滅储琛ㄥ崟
-const resetSearch = () => {
- Object.assign(searchForm, {
- title: '',
- applicant: '',
- status: ''
- })
- handleSearch()
-}
+ // 鏌ョ湅璇︽儏
+ const viewDetail = row => {
+ currentMeeting.value = row;
+ detailDialogVisible.value = true;
+ };
-// 鏌ョ湅璇︽儏
-const viewDetail = (row) => {
- currentMeeting.value = row
- detailDialogVisible.value = true
-}
+ // 澶勭悊瀹℃壒
+ const handleApproval = row => {
+ currentMeeting.value = row;
+ approvalOpinion.value = "";
+ approvalDialogVisible.value = true;
+ };
-// 澶勭悊瀹℃壒
-const handleApproval = (row) => {
- currentMeeting.value = row
- approvalOpinion.value = ''
- approvalDialogVisible.value = true
-}
+ // 鑾峰彇鐘舵�佺被鍨�
+ const getStatusType = status => {
+ const statusMap = {
+ 0: "info", // 寰呭鎵�
+ 1: "success", // 宸查�氳繃
+ 2: "warning", // 鏈�氳繃
+ 3: "danger", // 鍙栨秷
+ };
+ return statusMap[status] || "info";
+ };
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const statusMap = {
- '0': 'info', // 寰呭鎵�
- '1': 'success', // 宸查�氳繃
- '2': 'warning', // 鏈�氳繃
- '3': 'danger' // 鍙栨秷
- }
- return statusMap[status] || 'info'
-}
+ // 鑾峰彇鐘舵�佹枃鏈�
+ const getStatusText = status => {
+ const statusMap = {
+ 0: "寰呭鎵�",
+ 1: "宸查�氳繃",
+ 2: "鏈�氳繃",
+ 3: "宸插彇娑�",
+ };
+ return statusMap[status] || "鏈煡";
+ };
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
- const statusMap = {
- '0': '寰呭鎵�',
- '1': '宸查�氳繃',
- '2': '鏈�氳繃',
- '3': '宸插彇娑�'
- }
- return statusMap[status] || '鏈煡'
-}
+ // 鏍煎紡鍖栨棩鏈熸椂闂�
+ const formatDateTime = dateTime => {
+ if (!dateTime) return "";
+ return dateTime.replace(" ", "\n");
+ };
-// 鏍煎紡鍖栨棩鏈熸椂闂�
-const formatDateTime = (dateTime) => {
- if (!dateTime) return ''
- return dateTime.replace(' ', '\n')
-}
+ // 鎻愪氦瀹℃壒
+ const submitApproval = status => {
+ // if (status === 'approved' && !approvalOpinion.value.trim()) {
+ // ElMessage.warning('璇峰~鍐欏鎵规剰瑙�')
+ // return
+ // }
-// 鎻愪氦瀹℃壒
-const submitApproval = (status) => {
- // if (status === 'approved' && !approvalOpinion.value.trim()) {
- // ElMessage.warning('璇峰~鍐欏鎵规剰瑙�')
- // return
- // }
-
- ElMessageBox.confirm(
- `纭${status === '1' ? '閫氳繃' : '涓嶉�氳繃'}璇ヤ細璁敵璇凤紵`,
- '瀹℃壒纭',
+ ElMessageBox.confirm(
+ `纭${status === "1" ? "閫氳繃" : "涓嶉�氳繃"}璇ヤ細璁敵璇凤紵`,
+ "瀹℃壒纭",
{
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
}
- ).then(() => {
- saveMeetingApplication({
- id: currentMeeting.value.id,
- status: status
- }).then(resp=>{
- // 鏇存柊浼氳鐘舵��
- currentMeeting.value.status = status
+ )
+ .then(() => {
+ saveMeetingApplication({
+ id: currentMeeting.value.id,
+ status: status,
+ }).then(resp => {
+ // 鏇存柊浼氳鐘舵��
+ currentMeeting.value.status = status;
- ElMessage.success('瀹℃壒鎻愪氦鎴愬姛')
- approvalDialogVisible.value = false
- getList()
- })
+ ElMessage.success("瀹℃壒鎻愪氦鎴愬姛");
+ approvalDialogVisible.value = false;
+ getList();
+ });
+ })
+ .catch(() => {});
+ };
- }).catch(() => {
- })
-}
+ // 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+ onMounted(async () => {
+ const [resp1, resp2] = await Promise.all([
+ getRoomEnum(),
+ userListNoPageByTenantId(),
+ ]);
+ roomEnum.value = resp1.data;
+ const list = Array.isArray(resp2?.data) ? resp2.data : [];
+ userList.value = list
+ .map(item => ({
+ userId: item?.userId,
+ nickName: item?.nickName,
+ userName: item?.userName,
+ deptNames:
+ item?.deptNames || (item?.dept?.deptName ? item.dept.deptName : ""),
+ }))
+ .filter(item => item.userId !== null && item.userId !== undefined);
-// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
-onMounted(async () => {
- const [resp1, resp2]= await Promise.all([getRoomEnum(), staffOnJobListPage({current: -1, size: -1, staffState: 1})])
- roomEnum.value = resp1.data
- staffList.value = resp2.data.records
-
- await getList()
-})
+ await getList();
+ });
</script>
<style scoped>
-.app-container {
- padding: 20px;
-}
+ .app-container {
+ padding: 20px;
+ }
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-}
+ .page-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ }
-.page-header h2 {
- margin: 0;
- color: #303133;
-}
+ .page-header h2 {
+ margin: 0;
+ color: #303133;
+ }
-.search-card {
- margin-bottom: 20px;
-}
+ .search-card {
+ margin-bottom: 20px;
+ }
-.dialog-footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
-}
+ .dialog-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+ }
-.content-section h4 {
- margin: 0 0 15px 0;
- color: #303133;
-}
+ .content-section h4 {
+ margin: 0 0 15px 0;
+ color: #303133;
+ }
-.mt-20 {
- margin-top: 20px;
-}
+ .mt-20 {
+ margin-top: 20px;
+ }
-.participants-list {
- min-height: 40px;
- padding: 15px;
- border-radius: 4px;
- line-height: 1.6;
-}
+ .participants-list {
+ min-height: 40px;
+ padding: 15px;
+ border-radius: 4px;
+ line-height: 1.6;
+ }
-.approval-opinion h4 {
- margin: 0 0 15px 0;
- color: #303133;
-}
+ .approval-opinion h4 {
+ margin: 0 0 15px 0;
+ color: #303133;
+ }
-.nowrap-label {
- white-space: nowrap !important;
-}
+ .nowrap-label {
+ white-space: nowrap !important;
+ }
-.description-content {
- white-space: pre-wrap;
- word-wrap: break-word;
- line-height: 1.6;
- padding: 10px;
- background-color: #f5f7fa;
- border-radius: 4px;
- min-height: 60px;
-}
+ .description-content {
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ line-height: 1.6;
+ padding: 10px;
+ background-color: #f5f7fa;
+ border-radius: 4px;
+ min-height: 60px;
+ }
</style>
--
Gitblit v1.9.3