|
|
@@ -115,6 +115,28 @@
|
|
|
<span v-else>-</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+ <el-table-column prop="status" :label="t('document.document.documentList.status')" width="120"
|
|
|
+ align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-tag v-if="scope.row.status === 0" size="small" type="info">{{
|
|
|
+ t('document.document.documentList.statusOptions.unUpload') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 1" size="small" type="warning">{{
|
|
|
+ t('document.document.documentList.statusOptions.unAudit') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 2" size="small" type="danger">{{
|
|
|
+ t('document.document.documentList.statusOptions.auditReject') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 3" size="small" type="warning">{{
|
|
|
+ t('document.document.documentList.statusOptions.unFiling') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 4" size="small" type="success">{{
|
|
|
+ t('document.document.documentList.statusOptions.filing') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 5" size="small" type="warning">{{
|
|
|
+ t('document.document.documentList.statusOptions.unQualityControl') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 6" size="small" type="success">{{
|
|
|
+ t('document.document.documentList.statusOptions.qualityControlPass') }}</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 7" size="small" type="danger">{{
|
|
|
+ t('document.document.documentList.statusOptions.qualityControlReject') }}</el-tag>
|
|
|
+ <el-tag v-else size="small" type="default">-</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
<el-table-column prop="submitter" :label="t('document.document.documentList.submitter')" width="120"
|
|
|
align="center" />
|
|
|
<el-table-column prop="submitDeadline" :label="t('document.document.documentList.submitDeadline')"
|
|
|
@@ -134,18 +156,8 @@
|
|
|
<el-table-column prop="url" :label="t('document.document.documentList.url')" min-width="200">
|
|
|
<template #default="scope">
|
|
|
<div v-if="scope.row.fileName" class="file-name-cell">
|
|
|
- <el-icon :size="18" class="file-icon">
|
|
|
- <Document v-if="isWordFile(scope.row.fileName)" style="color: #2b579a;" />
|
|
|
- <Grid v-else-if="isExcelFile(scope.row.fileName)" style="color: #217346;" />
|
|
|
- <Monitor v-else-if="isPPTFile(scope.row.fileName)" style="color: #d24726;" />
|
|
|
- <Reading v-else-if="isPDFFile(scope.row.fileName)" style="color: #e74c3c;" />
|
|
|
- <Document v-else style="color: #606266;" />
|
|
|
- </el-icon>
|
|
|
- <span class="file-name-text">{{ scope.row.fileName }}</span>
|
|
|
- <!-- 下载按钮已注释 -->
|
|
|
- <!-- <el-link v-if="scope.row.url" type="primary" :href="scope.row.url" :download="scope.row.fileName" target="_blank" :underline="false" class="download-btn">
|
|
|
- <el-icon><Download /></el-icon>
|
|
|
- </el-link> -->
|
|
|
+ <svg-icon :icon-class="getFileIconClass(scope.row.fileName)" class="file-icon" :size="18" />
|
|
|
+ <span class="file-name-text show-overflow-tooltip">{{ scope.row.fileName }}</span>
|
|
|
</div>
|
|
|
<span v-else>-</span>
|
|
|
</template>
|
|
|
@@ -166,15 +178,36 @@
|
|
|
<span v-else>-</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column :label="t('document.document.documentList.action')" width="150" align="center"
|
|
|
+ <!-- 操作列 -->
|
|
|
+ <el-table-column :label="t('document.document.documentList.action')" width="200" align="center"
|
|
|
fixed="right">
|
|
|
<template #default="scope">
|
|
|
- <el-button v-hasPermi="['document:document:audit']" type="primary" link :icon="Select"
|
|
|
- @click="handleAudit(scope.row)" :title="t('document.document.button.audit')" />
|
|
|
+ <!-- 审核按钮 -->
|
|
|
+ <el-button v-if="scope.row.url && scope.row.status === 1" v-hasPermi="['document:document:audit']"
|
|
|
+ type="primary" link :icon="Select" @click="handleAudit(scope.row)"
|
|
|
+ :title="t('document.document.button.audit')" />
|
|
|
+
|
|
|
+ <!-- 递交按钮 -->
|
|
|
+ <el-button
|
|
|
+ v-if="(scope.row.status === 0 || scope.row.status === 2) && scope.row.submitterId === userStore.userId"
|
|
|
+ v-hasPermi="['document:document:submit']" type="primary" link :icon="Upload"
|
|
|
+ @click="handleSubmit(scope.row)" :title="t('document.document.button.submit')" />
|
|
|
+
|
|
|
+ <!-- 确认递交按钮 -->
|
|
|
+ <el-button
|
|
|
+ v-if="(scope.row.status === 0 || scope.row.status === 2) && scope.row.submitterId === userStore.userId"
|
|
|
+ v-hasPermi="['document:document:confirmSubmit']" type="primary" link icon="Delete"
|
|
|
+ @click="handleConfirmSubmit(scope.row)" :title="t('document.document.button.confirmSubmit')" />
|
|
|
+
|
|
|
+ <!-- 原有按钮 -->
|
|
|
<el-button v-hasPermi="['document:document:mark']" type="primary" link icon="Flag"
|
|
|
@click="handleMark(scope.row)" :title="t('document.document.button.mark')" />
|
|
|
- <el-button type="primary" link icon="Download" @click="handleDownload(scope.row)"
|
|
|
- :title="t('document.document.button.download')" :disabled="!scope.row.url" />
|
|
|
+ <el-button v-if="scope.row.url" type="primary" link icon="Download" @click="handleDownload(scope.row)"
|
|
|
+ :title="t('document.document.button.download')" />
|
|
|
+
|
|
|
+ <!-- 查看审核记录按钮 -->
|
|
|
+ <el-button v-hasPermi="['document:document:logAudit']" type="primary" link icon="DocumentCopy"
|
|
|
+ @click="handleViewAuditLog(scope.row)" :title="t('document.document.button.viewAuditLog')" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
@@ -213,7 +246,8 @@
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button :loading="buttonLoading" type="primary" @click="submitForm">{{ t('document.document.button.submit')
|
|
|
+ <el-button :loading="buttonLoading" type="primary" @click="submitFolderForm">{{
|
|
|
+ t('document.document.button.submit')
|
|
|
}}</el-button>
|
|
|
<el-button @click="cancel">{{ t('document.document.button.cancel') }}</el-button>
|
|
|
</div>
|
|
|
@@ -311,11 +345,11 @@
|
|
|
<el-form ref="auditFormRef" :model="auditForm" :rules="auditRules" label-width="120px">
|
|
|
<el-form-item :label="t('document.document.auditForm.result')" prop="result">
|
|
|
<el-radio-group v-model="auditForm.result">
|
|
|
- <el-radio label="0">{{ t('document.document.auditForm.pass') }}</el-radio>
|
|
|
- <el-radio label="1">{{ t('document.document.auditForm.reject') }}</el-radio>
|
|
|
+ <el-radio label="3">{{ t('document.document.auditForm.pass') }}</el-radio>
|
|
|
+ <el-radio label="2">{{ t('document.document.auditForm.reject') }}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="auditForm.result === '1'" :label="t('document.document.auditForm.reason')" prop="reason">
|
|
|
+ <el-form-item v-if="auditForm.result === '2'" :label="t('document.document.auditForm.reason')" prop="reason">
|
|
|
<el-input v-model="auditForm.reason" type="textarea" :rows="4"
|
|
|
placeholder="{{ t('document.document.auditForm.reasonPlaceholder') }}" />
|
|
|
</el-form-item>
|
|
|
@@ -328,6 +362,25 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <!-- 递交文档对话框 -->
|
|
|
+ <el-dialog v-model="submitDialog.visible" :title="submitDialog.title" width="500px" append-to-body>
|
|
|
+ <el-form ref="submitFormRef" :model="submitForm" :rules="submitRules" label-width="120px">
|
|
|
+ <el-form-item :label="t('document.document.submitForm.file')" prop="ossId">
|
|
|
+ <fileUpload v-model="submitForm.ossId" :limit="1" :action="'/common/resource/oss/upload'" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button :loading="submitButtonLoading" type="primary" @click="submitSubmitForm">{{
|
|
|
+ t('document.document.button.submit') }}</el-button>
|
|
|
+ <el-button @click="cancelSubmit">{{ t('document.document.button.cancel') }}</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 文档审核记录对话框 -->
|
|
|
+ <DocumentAuditLog v-model:visible="auditLogDialog.visible" :document-id="auditLogDialog.documentId" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -336,17 +389,17 @@ import { ref, reactive, onMounted, onUnmounted, nextTick, getCurrentInstance, wa
|
|
|
import { useI18n } from 'vue-i18n';
|
|
|
import { listFolder, addFolder, delFolder, getFolder, updateFolder } from '@/api/document/folder';
|
|
|
import { FolderListVO, FolderForm } from '@/api/document/folder/types';
|
|
|
-import { addDocument, listDocument, markDocument } from '@/api/document/document';
|
|
|
-import { DocumentForm, DocumentQuery, DocumentVO, DocumentMarkForm } from '@/api/document/document/types';
|
|
|
-import { queryMemberNotInCenter } from '@/api/project/management';
|
|
|
+import { addDocument, listDocument, markDocument, auditDocument, submitDocument, confirmSubmit, listDocumentAuditLog } from '@/api/document/document';
|
|
|
+import { DocumentForm, DocumentQuery, DocumentVO, DocumentMarkForm, DocumentAuditForm, DocumentSubmitForm, DocumentAuditLogVO, DocumentAuditLogQuery } from '@/api/document/document/types'; import { queryMemberNotInCenter } from '@/api/project/management';
|
|
|
import { MemberNotInCenterVO, MemberNotInCenterQuery } from '@/api/project/management/types';
|
|
|
-import { Folder, Document, Edit, Delete, Plus, MoreFilled, Location, OfficeBuilding, ArrowRight, Download, Select, Grid, Monitor, Reading, Flag } from '@element-plus/icons-vue';
|
|
|
+import { Folder, Document, Edit, Delete, Plus, MoreFilled, Location, OfficeBuilding, ArrowRight, Download, Select, Grid, Monitor, Reading, Flag, Upload } from '@element-plus/icons-vue';
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
|
|
import type { FormInstance } from 'element-plus';
|
|
|
import type { ComponentInternalInstance } from 'vue';
|
|
|
import { useUserStore } from '@/store/modules/user';
|
|
|
import { checkPermi } from '@/utils/permission';
|
|
|
import fileUpload from '@/components/FileUpload/index.vue';
|
|
|
+import DocumentAuditLog from './components/documentAuditLog.vue';
|
|
|
|
|
|
interface Props {
|
|
|
projectId?: number | string;
|
|
|
@@ -377,6 +430,12 @@ const hasAddPlanPermission = computed(() => checkPermi(['document:document:addPl
|
|
|
// 当前用户信息
|
|
|
const currentUserName = ref(userStore.nickname || '');
|
|
|
|
|
|
+// 审核记录对话框
|
|
|
+const auditLogDialog = reactive({
|
|
|
+ visible: false,
|
|
|
+ documentId: ''
|
|
|
+});
|
|
|
+
|
|
|
// 对话框
|
|
|
const dialog = reactive({
|
|
|
visible: false,
|
|
|
@@ -461,13 +520,13 @@ const markForm = ref<DocumentMarkForm>({
|
|
|
// 审核表单数据
|
|
|
interface AuditForm {
|
|
|
id: number;
|
|
|
- result: string; // 0: 通过, 1: 驳回
|
|
|
- reason: string; // 驳回理由
|
|
|
+ result: string; // 3: 通过, 2: reject
|
|
|
+ reason: string; // reject reason
|
|
|
}
|
|
|
|
|
|
const auditForm = ref<AuditForm>({
|
|
|
id: 0,
|
|
|
- result: '0', // 默认通过
|
|
|
+ result: '3', // 默认通过
|
|
|
reason: ''
|
|
|
});
|
|
|
|
|
|
@@ -489,6 +548,36 @@ const auditRules = reactive({
|
|
|
]
|
|
|
});
|
|
|
|
|
|
+// 递交文档对话框
|
|
|
+const submitDialog = reactive({
|
|
|
+ visible: false,
|
|
|
+ title: ''
|
|
|
+});
|
|
|
+
|
|
|
+// 递交表单ref
|
|
|
+const submitFormRef = ref<FormInstance>();
|
|
|
+const submitButtonLoading = ref(false);
|
|
|
+
|
|
|
+// 递交表单数据
|
|
|
+interface SubmitForm {
|
|
|
+ ossId: string; // 文件OSS ID
|
|
|
+}
|
|
|
+
|
|
|
+const submitForm = ref<SubmitForm>({
|
|
|
+ ossId: ''
|
|
|
+});
|
|
|
+
|
|
|
+// 递交表单验证规则
|
|
|
+const submitRules = reactive({
|
|
|
+ ossId: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: t('document.document.submitRule.fileRequired'),
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+});
|
|
|
+
|
|
|
// 当前选中的文档
|
|
|
const currentDocument = ref<DocumentVO | null>(null);
|
|
|
|
|
|
@@ -735,7 +824,7 @@ const handleAddChildWithType = (data: FolderListVO, type: number) => {
|
|
|
};
|
|
|
|
|
|
// 提交表单
|
|
|
-const submitForm = () => {
|
|
|
+const submitFolderForm = () => {
|
|
|
folderFormRef.value?.validate(async (valid: boolean) => {
|
|
|
if (valid) {
|
|
|
// 如果是编辑,显示确认对话框
|
|
|
@@ -996,10 +1085,13 @@ watch(uploadedFileId, (newVal) => {
|
|
|
// 自动设置递交时间为当前时间
|
|
|
const now = new Date();
|
|
|
documentForm.value.submitTime = proxy?.parseTime(now, '{y}-{m}-{d} {h}:{i}:{s}');
|
|
|
+ // 自动设置递交人为当前用户
|
|
|
+ documentForm.value.submitterId = userStore.userId;
|
|
|
}
|
|
|
} else {
|
|
|
documentForm.value.ossId = undefined;
|
|
|
documentForm.value.submitTime = undefined;
|
|
|
+ documentForm.value.submitterId = undefined;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -1015,6 +1107,9 @@ const submitDocumentForm = () => {
|
|
|
if (valid) {
|
|
|
documentButtonLoading.value = true;
|
|
|
try {
|
|
|
+ // 根据是否上传了文件设置status字段:上传了文件status为1,否则为0
|
|
|
+ const hasUploadedFile = !!uploadedFileId.value;
|
|
|
+
|
|
|
// 构建完整的请求数据,确保所有字段都存在(参考文件夹的实现)
|
|
|
const submitData: DocumentForm = {
|
|
|
id: documentForm.value.id || 0,
|
|
|
@@ -1024,15 +1119,15 @@ const submitDocumentForm = () => {
|
|
|
folderId: documentForm.value.folderId || 0,
|
|
|
submitDeadline: documentForm.value.submitDeadline || '',
|
|
|
planType: documentForm.value.planType || '',
|
|
|
- ossId: documentForm.value.ossId || null,
|
|
|
- submitTime: documentForm.value.submitTime || '',
|
|
|
+ ossId: hasUploadedFile ? uploadedFileId.value : null,
|
|
|
+ submitTime: hasUploadedFile ? new Date().toISOString() : '',
|
|
|
+ status: hasUploadedFile ? 1 : 0,
|
|
|
note: documentForm.value.note || ''
|
|
|
};
|
|
|
|
|
|
await addDocument(submitData);
|
|
|
proxy?.$modal.msgSuccess(t('document.document.message.addDocumentSuccess'));
|
|
|
documentDialog.visible = false;
|
|
|
- await getList();
|
|
|
// 刷新文档列表
|
|
|
await getDocumentList();
|
|
|
} catch (error) {
|
|
|
@@ -1094,12 +1189,19 @@ const handleDocumentReset = () => {
|
|
|
getDocumentList();
|
|
|
};
|
|
|
|
|
|
+// 查看审核记录
|
|
|
+const handleViewAuditLog = (row: DocumentVO) => {
|
|
|
+ console.log('handleViewAuditLog called with row:', row);
|
|
|
+ auditLogDialog.documentId = row.id;
|
|
|
+ auditLogDialog.visible = true;
|
|
|
+};
|
|
|
+
|
|
|
// 审核文档
|
|
|
const handleAudit = (row: DocumentVO) => {
|
|
|
currentDocument.value = row;
|
|
|
auditForm.value = {
|
|
|
id: row.id,
|
|
|
- result: '0', // 默认通过
|
|
|
+ result: '3', // 默认通过
|
|
|
reason: ''
|
|
|
};
|
|
|
auditDialog.visible = true;
|
|
|
@@ -1115,7 +1217,7 @@ const cancelAudit = () => {
|
|
|
auditDialog.visible = false;
|
|
|
auditForm.value = {
|
|
|
id: 0,
|
|
|
- result: '0',
|
|
|
+ result: '3',
|
|
|
reason: ''
|
|
|
};
|
|
|
currentDocument.value = null;
|
|
|
@@ -1127,7 +1229,12 @@ const submitAuditForm = () => {
|
|
|
if (valid) {
|
|
|
auditButtonLoading.value = true;
|
|
|
try {
|
|
|
- // 暂时不与后端进行交互,仅关闭弹窗
|
|
|
+ const auditData: DocumentAuditForm = {
|
|
|
+ documentId: auditForm.value.id,
|
|
|
+ result: parseInt(auditForm.value.result),
|
|
|
+ rejectReason: auditForm.value.reason
|
|
|
+ };
|
|
|
+ await auditDocument(auditData);
|
|
|
proxy?.$modal.msgSuccess(t('document.document.message.auditSuccess'));
|
|
|
auditDialog.visible = false;
|
|
|
// 刷新文档列表
|
|
|
@@ -1157,6 +1264,78 @@ const handleDownload = (row: DocumentVO) => {
|
|
|
document.body.removeChild(a);
|
|
|
};
|
|
|
|
|
|
+// 递交文档
|
|
|
+const handleSubmit = (row: DocumentVO) => {
|
|
|
+ currentDocument.value = row;
|
|
|
+ submitForm.value = {
|
|
|
+ ossId: ''
|
|
|
+ };
|
|
|
+ submitDialog.visible = true;
|
|
|
+ submitDialog.title = t('document.document.dialog.submitDocument');
|
|
|
+ // 重置表单验证
|
|
|
+ nextTick(() => {
|
|
|
+ submitFormRef.value?.clearValidate();
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 取消递交
|
|
|
+const cancelSubmit = () => {
|
|
|
+ submitDialog.visible = false;
|
|
|
+ submitForm.value = {
|
|
|
+ ossId: ''
|
|
|
+ };
|
|
|
+ currentDocument.value = null;
|
|
|
+};
|
|
|
+
|
|
|
+// 提交递交表单
|
|
|
+const submitSubmitForm = () => {
|
|
|
+ submitFormRef.value?.validate(async (valid: boolean) => {
|
|
|
+ if (valid && currentDocument.value) {
|
|
|
+ submitButtonLoading.value = true;
|
|
|
+ try {
|
|
|
+ const submitData: DocumentSubmitForm = {
|
|
|
+ documentId: currentDocument.value.id,
|
|
|
+ ossId: submitForm.value.ossId
|
|
|
+ };
|
|
|
+ await submitDocument(submitData);
|
|
|
+ proxy?.$modal.msgSuccess(t('document.document.message.submitSuccess'));
|
|
|
+ submitDialog.visible = false;
|
|
|
+ // 刷新文档列表
|
|
|
+ await getDocumentList();
|
|
|
+ } catch (error) {
|
|
|
+ console.error(t('document.document.message.submitFailed'), error);
|
|
|
+ } finally {
|
|
|
+ submitButtonLoading.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 确认递交文档
|
|
|
+const handleConfirmSubmit = async (row: DocumentVO) => {
|
|
|
+ try {
|
|
|
+ await ElMessageBox.confirm(
|
|
|
+ '确认该文件已成功递交?',
|
|
|
+ '操作确认',
|
|
|
+ {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ await confirmSubmit(row.id);
|
|
|
+ ElMessage.success('确认递交成功');
|
|
|
+ // 刷新文档列表
|
|
|
+ await getDocumentList();
|
|
|
+ } catch (error) {
|
|
|
+ if (error !== 'cancel') {
|
|
|
+ console.error('确认递交失败:', error);
|
|
|
+ ElMessage.error('确认递交失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
// 标识文档
|
|
|
const handleMark = (row: DocumentVO) => {
|
|
|
currentDocument.value = row;
|
|
|
@@ -1233,6 +1412,21 @@ const isPDFFile = (fileName: string): boolean => {
|
|
|
return fileName.toLowerCase().endsWith('.pdf');
|
|
|
};
|
|
|
|
|
|
+// 获取文件类型对应的图标类名
|
|
|
+const getFileIconClass = (fileName: string): string => {
|
|
|
+ if (isWordFile(fileName)) {
|
|
|
+ return 'document-word';
|
|
|
+ } else if (isExcelFile(fileName)) {
|
|
|
+ return 'document-excel';
|
|
|
+ } else if (isPPTFile(fileName)) {
|
|
|
+ return 'document-ppt';
|
|
|
+ } else if (isPDFFile(fileName)) {
|
|
|
+ return 'document-pdf';
|
|
|
+ } else {
|
|
|
+ return 'document-document';
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
// 关闭所有菜单
|
|
|
const closeAllMenus = () => {
|
|
|
showSecondaryMenu.value = false;
|
|
|
@@ -1413,6 +1607,9 @@ onUnmounted(() => {
|
|
|
|
|
|
.file-icon {
|
|
|
flex-shrink: 0;
|
|
|
+ width: 18px;
|
|
|
+ height: 18px;
|
|
|
+ vertical-align: middle;
|
|
|
}
|
|
|
|
|
|
.file-name-text {
|
|
|
@@ -1502,4 +1699,27 @@ onUnmounted(() => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-</style>
|
|
|
+
|
|
|
+.show-overflow-tooltip {
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ max-width: 100%;
|
|
|
+ cursor: help;
|
|
|
+}
|
|
|
+
|
|
|
+.show-overflow-tooltip:hover {
|
|
|
+ overflow: visible;
|
|
|
+ white-space: normal;
|
|
|
+ word-break: break-all;
|
|
|
+ position: absolute;
|
|
|
+ background-color: rgba(0, 0, 0, 0.8);
|
|
|
+ color: white;
|
|
|
+ padding: 4px 8px;
|
|
|
+ border-radius: 4px;
|
|
|
+ z-index: 1000;
|
|
|
+ max-width: 300px;
|
|
|
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
|
|
|
+}
|
|
|
+</style>
|