From 68432d4d68341c070ad559937205286f128db5e4 Mon Sep 17 00:00:00 2001 From: z9130 <984661593@qq.com> Date: Sat, 28 Sep 2024 19:47:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=90=8C=E7=9B=B8=E5=85=B3=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-contract/src/app.vue | 50 ++- .../temporary-form-modal.vue | 55 +++ apps/web-contract/src/layouts/basic.vue | 2 - .../src/router/routes/modules/contract.ts | 1 + apps/web-contract/src/store/dict.ts | 3 + apps/web-contract/src/utils/dict/index.ts | 48 ++- .../src/views/contract/approval/edit/curd.tsx | 171 +------- .../views/contract/approval/edit/index.vue | 153 ++++++- .../src/views/contract/approval/list/crud.tsx | 30 +- .../business/edit/basic-info-curd.tsx | 20 +- .../views/contract/business/list/index.vue | 2 +- .../company/list/choose-company-modal.vue | 20 +- .../components/todo-page/todo-page.vue | 7 +- .../views/contract/declaration/edit/curd.tsx | 151 ++++--- .../views/contract/declaration/edit/index.vue | 240 +++++------ .../views/contract/declaration/list/index.vue | 65 ++- .../contract/declaration/print/index.vue | 71 +--- .../src/views/contract/perform/list/index.vue | 117 +---- .../web-contract/src/views/contract/schema.ts | 2 +- .../contract/sign-authorization/edit/curd.tsx | 16 +- .../src/views/contract/sign/edit/curd.tsx | 401 +++++------------- .../src/views/contract/sign/edit/index.vue | 11 +- .../src/views/contract/sign/list/crud.tsx | 5 +- .../src/views/contract/sign/list/index.vue | 2 +- .../src/views/contract/sign/todo/index.vue | 185 +------- apps/web-contract/src/views/contract/utils.ts | 84 +++- .../src/views/user-center/todo/index.vue | 17 +- apps/web-office/src/app.vue | 31 +- apps/web-office/src/layouts/basic.vue | 59 ++- apps/web-office/src/store/index.ts | 2 +- apps/web-office/src/utils/dict/index.ts | 49 ++- .../src/views/duty/list/duty-edit-modal.vue | 182 ++++---- 32 files changed, 1015 insertions(+), 1237 deletions(-) create mode 100644 apps/web-contract/src/components/temporary-form-modal/temporary-form-modal.vue diff --git a/apps/web-contract/src/app.vue b/apps/web-contract/src/app.vue index f8ca521a..06f7d675 100644 --- a/apps/web-contract/src/app.vue +++ b/apps/web-contract/src/app.vue @@ -33,7 +33,7 @@ const tokenTheme = computed(() => { const dictStore = useDictStore(); if (dictStore.initDict) { - // dictStore.setDictMap(); + dictStore.setDictMap(); } @@ -64,4 +64,52 @@ if (dictStore.initDict) { .ant-btn__warning { @apply bg-warning text-warning-foreground hover:bg-warning/90 shadow; } + +.ant-checkbox-disabled .ant-checkbox-inner { + background: #fafafa; + color: #333; +} + +.ant-input-number-disabled { + background: #fafafa; + color: #333; +} + +.ant-input-affix-wrapper-disabled, +.ant-input-affix-wrapper[disabled] { + background: #fafafa; + color: #333; +} + +.ant-radio-wrapper-disabled { + background: #fafafa; + color: #333; +} +.ant-radio-wrapper .ant-radio-disabled .ant-radio-inner { + background-color: rgba(50, 54, 57, 0.04); + border-color: hsl(240 5.9% 90%); +} + +.ant-picker.ant-picker-disabled { + background: #fafafa; + color: #333; +} + +.ant-select-disabled.ant-select:not(.ant-select-customize-input) + .ant-select-selector { + background: #fafafa; + color: #333; +} + +.ant-picker .ant-picker-input > input-disabled, +.ant-picker .ant-picker-input > input[disabled] { + background: #fafafa; + color: #333 !important; +} + +.ant-input-disabled, +.ant-input[disabled] { + background: #fafafa; + color: #333; +} diff --git a/apps/web-contract/src/components/temporary-form-modal/temporary-form-modal.vue b/apps/web-contract/src/components/temporary-form-modal/temporary-form-modal.vue new file mode 100644 index 00000000..bbf22fbc --- /dev/null +++ b/apps/web-contract/src/components/temporary-form-modal/temporary-form-modal.vue @@ -0,0 +1,55 @@ + + diff --git a/apps/web-contract/src/layouts/basic.vue b/apps/web-contract/src/layouts/basic.vue index 69455d94..1ae91be4 100644 --- a/apps/web-contract/src/layouts/basic.vue +++ b/apps/web-contract/src/layouts/basic.vue @@ -106,14 +106,12 @@ function handleMakeAll() { } function handleViewAll() { - console.log('viewAll'); router.push('/user/todo'); } const isDev = import.meta.env.MODE === 'development'; const value = ref(localStorage.getItem('@@@proxy_type') || ''); // /zp function handleMenuClick(e) { - console.log(e); if (e.key === 'pro') { localStorage.setItem('@@@proxy_type', ''); } else { diff --git a/apps/web-contract/src/router/routes/modules/contract.ts b/apps/web-contract/src/router/routes/modules/contract.ts index 1026af72..681464bf 100644 --- a/apps/web-contract/src/router/routes/modules/contract.ts +++ b/apps/web-contract/src/router/routes/modules/contract.ts @@ -37,6 +37,7 @@ const routes: RouteRecordRaw[] = [ name: 'ContractApprovalEdit', path: '/contract/approval/edit/:id?', beforeEnter: (e) => { + console.log('e', e); if (e.params.id && e.params.id === ':id') { e.params.id = ''; e.fullPath = '/contract/approval/edit'; diff --git a/apps/web-contract/src/store/dict.ts b/apps/web-contract/src/store/dict.ts index 674fcb79..a83f8ae9 100644 --- a/apps/web-contract/src/store/dict.ts +++ b/apps/web-contract/src/store/dict.ts @@ -38,6 +38,9 @@ export const useDictStore = defineStore('app-dict', () => { */ const setDictMap = async (): Promise => { try { + // 模拟网络请求 + // await new Promise((resolve) => setTimeout(resolve, 2000)); + const data = await Apis.dictData.get_page({ params: { pageNum: 1, pageSize: 10_000 }, }); diff --git a/apps/web-contract/src/utils/dict/index.ts b/apps/web-contract/src/utils/dict/index.ts index 05a1f496..695e98a2 100644 --- a/apps/web-contract/src/utils/dict/index.ts +++ b/apps/web-contract/src/utils/dict/index.ts @@ -1,4 +1,6 @@ /** 数据字典工具类 */ +import { computed } from 'vue'; + import Apis from '#/api'; import { useDictStore } from '#/store/dict'; import dataModule from '#/utils/dict/static.data'; @@ -7,6 +9,10 @@ export * from './shared'; const dictStore = useDictStore(); +const dictData = computed(() => { + return dictStore.dictMap; +}); + /** * 获取 dictType 对应的数据字典数组 * @@ -29,7 +35,7 @@ export interface DictDataOptions { } export function getDictDatas(dictType: string) { - return dictStore.getDictMap[dictType] || []; + return dictData.value[dictType] || []; } export function getDictOpts(dictType: string) { @@ -58,7 +64,7 @@ export async function getDictDatasAsync(dictTypes: string[]) { dictDataMap[dictType].push({ ...dictData, value: dictData.value, - label: dictData.name, + label: dictData.label, colorType: dictData.colorType, cssClass: dictData.cssClass, } as DictDataType); @@ -100,7 +106,7 @@ export function getDictOptions( const dictOption: DictDataType[] = []; valueType ||= 'string'; - const dictOptions: DictDataType[] = getDictDatas(dictType); + const dictOptions: DictDataType[] = dictData.value[dictType] || []; if (dictOptions && dictOptions.length > 0) { dictOptions.forEach((dict: DictDataType) => { dictOption.push({ @@ -166,6 +172,42 @@ export function getDictObj(dictType: string, value: any): DictDataType | null { } } +/** 获取指定 value 的字典数据 */ +export function getDictObjByOptions( + options: DictDataType[], + value: any, +): DictDataType | null { + if (options) { + if (value) { + const result = options.find((dict: DictDataType) => dict.value === value); + return result || null; + } + return null; + } else { + return null; + } +} + +/** 获取指定 value 的字典数据 */ +export async function getDictObjAsync( + dictType: string, + value: any, +): Promise { + const dictOptions = await getDictOptionsAsync(dictType); + if (dictOptions) { + if (value) { + return ( + dictOptions.find( + (dict: DictDataType) => dict.value === value.toString(), + ) || null + ); + } + return null; + } else { + return null; + } +} + /** 获取字典默认数据 */ export function getDictDefaultObj(dictType: string): DictDataType | null { const dictOptions: DictDataType[] = getDictDatas(dictType); diff --git a/apps/web-contract/src/views/contract/approval/edit/curd.tsx b/apps/web-contract/src/views/contract/approval/edit/curd.tsx index 8cf7e248..5666433d 100644 --- a/apps/web-contract/src/views/contract/approval/edit/curd.tsx +++ b/apps/web-contract/src/views/contract/approval/edit/curd.tsx @@ -1,20 +1,7 @@ import { dict } from '@fast-crud/fast-crud'; import { DICT_TYPE, getDictObj, getDictOptions } from '#/utils/dict'; - -/** - * 筛选合同列表数据 - * - */ -function filterContractTypes(contractTypeData: any = [], parentId: string) { - return contractTypeData - .map((item) => { - item.label = item.contrLevelName; - item.value = item.contrLevelId; - return item; - }) - .filter((item) => item.parentId === parentId); -} +import { filterContractTypes } from '#/views/contract/utils'; export function getFormSchema(params: any = {}) { const { contractTypeData, readOnly = false } = params; @@ -28,16 +15,9 @@ export function getFormSchema(params: any = {}) { name: 'a-input', vModel: 'value', allowClear: false, + disabled: readOnly, }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return {form.contractName}; - }, - }, - rules: [{ required: true }], + rules: [{ required: true, message: '请输入合同名称' }], }, ctrType: { title: '合同类别', @@ -53,6 +33,7 @@ export function getFormSchema(params: any = {}) { return filterContractTypes(contractTypeData, '-1'); }, }), + disabled: readOnly, }, valueChange: { immediate: true, // 是否立即执行一次 @@ -62,21 +43,7 @@ export function getFormSchema(params: any = {}) { getComponentRef('ctrTwoType').reloadDict(); // 执行city的select组件的reloadDict()方法,触发“city”重新加载字典 }, }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - const data = filterContractTypes(contractTypeData, '-1'); - for (const item of data) { - if (item.value === form.ctrType) { - return {item.label}; - } - } - return ; - }, - }, - rules: [{ required: true }], + rules: [{ required: true, message: '请选择合同类别' }], }, ctrTwoType: { title: '二级类别', @@ -89,25 +56,13 @@ export function getFormSchema(params: any = {}) { prototype: true, dict: dict({ async getData({ form = {} }) { + console.log(form); return filterContractTypes(contractTypeData, form.ctrType); }, }), + disabled: readOnly, }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - const data = filterContractTypes(contractTypeData, form.ctrType); - for (const item of data) { - if (item.value === form.ctrTwoType) { - return {item.label}; - } - } - return ; - }, - }, - rules: [{ required: true }], + rules: [{ required: true, message: '请选择二级类别' }], }, frameProtocol: { title: '框架协议', @@ -119,19 +74,9 @@ export function getFormSchema(params: any = {}) { dict: dict({ data: getDictOptions(DICT_TYPE.common_whether), }), + disabled: readOnly, }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return ( - - {getDictObj(DICT_TYPE.common_whether, form.frameProtocol)?.label} - - ); - }, - }, + rules: [{ required: true, message: '请选择框架协议' }], }, frameProtocolCtr: { title: '框架协议下的合同', @@ -144,22 +89,9 @@ export function getFormSchema(params: any = {}) { dict: dict({ data: getDictOptions(DICT_TYPE.common_whether), }), + disabled: readOnly, }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return ( - - { - getDictObj(DICT_TYPE.common_whether, form.frameProtocolCtr) - ?.label - } - - ); - }, - }, + rules: [{ required: true, message: '请选择框架协议下的合同' }], }, fundAllocation: { title: '资金流向', @@ -173,6 +105,7 @@ export function getFormSchema(params: any = {}) { dict: dict({ data: getDictOptions(DICT_TYPE.contract_fund_flow), }), + disabled: readOnly, }, valueChange: { immediate: true, // 是否立即执行一次 @@ -183,21 +116,6 @@ export function getFormSchema(params: any = {}) { )?.label; }, }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return ( - - { - getDictObj(DICT_TYPE.contract_fund_flow, form.fundAllocation) - ?.label - } - - ); - }, - }, rules: [{ required: true, message: '请选择资金流向' }], }, fundDitch: { @@ -212,21 +130,7 @@ export function getFormSchema(params: any = {}) { dict: dict({ data: getDictOptions(DICT_TYPE.contract_funding_source), }), - }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return ( - - { - getDictObj(DICT_TYPE.contract_funding_source, form.fundDitch) - ?.label - } - - ); - }, + disabled: readOnly, }, rules: [{ required: true, message: '请选择资金渠道' }], }, @@ -241,14 +145,7 @@ export function getFormSchema(params: any = {}) { class: 'w-full', min: 0, max: 9999, - }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return {form.budgetSum}; - }, + disabled: readOnly, }, }, priceType: { @@ -263,23 +160,7 @@ export function getFormSchema(params: any = {}) { dict: dict({ data: getDictOptions(DICT_TYPE.contract_currency_unit), }), - }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return ( - - { - getDictObj( - DICT_TYPE.contract_currency_unit, - form.priceType || '', - )?.label - } - - ); - }, + disabled: readOnly, }, }, organiza: { @@ -290,25 +171,11 @@ export function getFormSchema(params: any = {}) { name: 'fs-dict-radio', vModel: 'value', allowClear: false, - class: 'min-w-[200px]', + class: 'min-w-[180px]', dict: dict({ - data: getDictOptions(DICT_TYPE.contract_organization_form), + data: getDictOptions(DICT_TYPE.contract_organization_form, 'number'), }), - }, - conditionalRender: { - match({ form }) { - return readOnly; - }, - render({ form }) { - return ( - - { - getDictObj(DICT_TYPE.contract_organization_form, form.organiza) - ?.label - } - - ); - }, + disabled: readOnly, }, rules: [{ required: true, message: '请选择组织形式' }], }, diff --git a/apps/web-contract/src/views/contract/approval/edit/index.vue b/apps/web-contract/src/views/contract/approval/edit/index.vue index 7c8ee90c..0591684d 100644 --- a/apps/web-contract/src/views/contract/approval/edit/index.vue +++ b/apps/web-contract/src/views/contract/approval/edit/index.vue @@ -10,6 +10,7 @@ import { message, Modal, type UploadChangeParam } from 'ant-design-vue'; import { logger } from 'common-utils'; import Apis from '#/api'; +import temporaryFormModal from '#/components/temporary-form-modal/temporary-form-modal.vue'; import { useVxeTable } from '#/hooks/vxeTable'; import { DICT_TYPE, getDictObj } from '#/utils/dict'; import { FileUploader } from '#/utils/file'; @@ -29,6 +30,10 @@ const [ChooseSigningBasisModal, chooseSigningBasisModalApi] = useVbenModal({ connectedComponent: chooseSigningBasisModal, }); +const [TemporaryFormModal, temporaryFormModalApi] = useVbenModal({ + connectedComponent: temporaryFormModal, +}); + const userStore = useUserStore(); const userInfo = computed(() => userStore.userInfo); @@ -38,9 +43,10 @@ const fileUploader = new FileUploader({}); const router = useRouter(); const route = useRoute(); const id = ref(route.params.id); +const auditId = ref(); const pageRef = ref(); -const currData = ref(null); +const currData = ref({}); const formRef = ref(); @@ -211,9 +217,23 @@ async function handleSave() { try { await formRef.value.submit(); + } catch { + message.error('请完成必填项的填写'); + return; + } + try { let newForm: any = {}; + // 判断有没有签约依据 + const tableFullData = xGridRef.value?.getTableData().fullData; + if (tableFullData && tableFullData.length > 0) { + newForm.basisId = tableFullData[0].basisId; + } else { + message.error('请选择签约依据'); + return; + } + // 会议附件 const fileList = formRef.value.form.fileList; let files: any = []; @@ -257,18 +277,10 @@ async function handleSave() { let result: any = {}; - // 判断有没有签约依据 - const tableFullData = xGridRef.value?.getTableData().fullData; - if (tableFullData && tableFullData.length > 0) { - newForm.basisId = tableFullData[0].basisId; - } else { - message.error('请选择签约依据'); - return; - } - result = await Apis.contractBaseInfo.post_apply({ data: newForm }); id.value = result.value; + auditId.value = result.value; message.success('保存成功'); Modal.confirm({ @@ -297,6 +309,93 @@ async function handleSubmit() { chooseUserModalApi.open(); } +async function handleAudit( + type: 'accessConfirm' | 'reject' | 'rejectConfirm', + data: any, +) { + console.log(type); + + if (type === 'accessConfirm') { + Modal.confirm({ + title: '提示', + content: '是否确认审核通过?', + onOk: async () => { + try { + await Apis.contractBaseInfo.post_submit({ + params: { + guid: id.value, + }, + data: { + appId: id.value, + taskId: currData.value.taskId, + nodeId: '', + comment: '通过', + }, + }); + message.success('审核通过'); + back(); + } catch (error) { + logger.error('审核通过失败', error); + message.error('审核通过失败,请稍候再试'); + } + }, + }); + } + + if (type === 'reject') { + Modal.confirm({ + title: '提示', + content: '是否确认退回?', + onOk: () => { + temporaryFormModalApi.setData({ + title: '退回原因', + schema: { + columns: { + comment: { + title: '', + key: 'comment', + col: { span: 24 }, + colon: false, + component: { + name: 'a-textarea', + vModel: 'value', + autoSize: { minRows: 4, maxRows: 6 }, + placeholder: '请输入', + }, + rules: [{ required: true, message: '请输入退回原因' }], + }, + }, + }, + }); + temporaryFormModalApi.open(); + }, + }); + } + + if (type === 'rejectConfirm') { + const comment = data.comment; + try { + await Apis.contractBaseInfo.post_rollback({ + params: { + guid: id.value, + }, + data: { + appId: id.value, + taskId: currData.value.taskId, + nodeId: '', + comment, + }, + }); + temporaryFormModalApi.close(); + message.success('退回成功'); + back(); + } catch (error) { + logger.error('合同立项退回失败', error); + message.error('退回失败,请稍候再试'); + } + } +} + onMounted(async () => { isLoading.value = true; @@ -311,7 +410,8 @@ onMounted(async () => { params: { guid: id.value }, }); - currData.value = data; + auditId.value = id.value; + currData.value = data || {}; formBinding.value.columns = getFormSchema({ contractTypeData: contractTypeData.value, @@ -325,6 +425,7 @@ onMounted(async () => { ); nextTick(() => { + console.log(formRef.value); formRef.value.setFormData(data); }); @@ -380,6 +481,11 @@ onMounted(async () => { + + { 保存 提交 + + 通过 + + + 退回 + { - item.label = item.contrLevelName; - item.value = item.contrLevelId; - return item; - }) - .filter((item) => item.parentId === parentId); - } catch (error) { - console.log(error); - return []; - } -} - -export function getColumns(params: any = {}): VxeGridPropTypes.Columns { +export function getColumns(_params: any = {}): VxeGridPropTypes.Columns { return [ { type: 'radio', @@ -216,8 +194,8 @@ export function getFormSchema(_params: any = {}) { vModel: 'value', class: 'min-w-[200px]', dict: dict({ - async getData({ form = {} }) { - return await filterContractTypes('-1'); + async getData(_context) { + return await getContractTypes('-1'); }, }), }, diff --git a/apps/web-contract/src/views/contract/business/edit/basic-info-curd.tsx b/apps/web-contract/src/views/contract/business/edit/basic-info-curd.tsx index bd47160c..dfd38092 100644 --- a/apps/web-contract/src/views/contract/business/edit/basic-info-curd.tsx +++ b/apps/web-contract/src/views/contract/business/edit/basic-info-curd.tsx @@ -1,20 +1,7 @@ import { dict } from '@fast-crud/fast-crud'; import { DICT_TYPE, getDictOptions } from '#/utils/dict'; - -/** - * 筛选合同列表数据 - * - */ -function filterContractTypes(contractTypeData: any = [], parentId: string) { - return contractTypeData - .map((item) => { - item.label = item.contrLevelName; - item.value = item.contrLevelId; - return item; - }) - .filter((item) => item.parentId === parentId); -} +import { filterContractTypes } from '#/views/contract/utils'; export function getFormSchema(params: any = {}) { const { contractTypeData } = params; @@ -81,10 +68,7 @@ export function getFormSchema(params: any = {}) { class: 'min-w-[200px]', dict: dict({ async getData({ form = {} }) { - if (form.ctrType) { - return filterContractTypes(contractTypeData, form.ctrType); - } - return contractTypeData; + return filterContractTypes(contractTypeData, form.ctrType); }, }), }, diff --git a/apps/web-contract/src/views/contract/business/list/index.vue b/apps/web-contract/src/views/contract/business/list/index.vue index 2badbb08..1f80e758 100644 --- a/apps/web-contract/src/views/contract/business/list/index.vue +++ b/apps/web-contract/src/views/contract/business/list/index.vue @@ -32,7 +32,7 @@ const gridOptions = reactive( autoLoad: false, ajax: { query: async ({ page }) => { - const data = await Apis.contractBaseInfo.get_page({ + const data = await Apis.selectMerchantsBasicInfo.get_page({ params: { pageNum: page.currentPage, pageSize: page.pageSize, diff --git a/apps/web-contract/src/views/contract/company/list/choose-company-modal.vue b/apps/web-contract/src/views/contract/company/list/choose-company-modal.vue index 2f10853d..c9f5d4f9 100644 --- a/apps/web-contract/src/views/contract/company/list/choose-company-modal.vue +++ b/apps/web-contract/src/views/contract/company/list/choose-company-modal.vue @@ -37,6 +37,7 @@ const data = ref({ }); const checkRecords = ref([]); +const limitMultipleNum = ref(1); const searchBinding = ref({ ...getFormSchema(), @@ -70,7 +71,7 @@ const gridOptions = reactive( }, }, rowConfig: { - keyField: 'providerId', + keyField: 'guid', }, checkboxConfig: { labelField: 'providerId', @@ -84,7 +85,7 @@ const gridOptions = reactive( const checkRecordIds = checkRecords.value.map((item) => item.guid) || []; if ( - checkRecords.value.length === 0 || + checkRecords.value.length < limitMultipleNum.value || checkRecordIds.includes(row.guid) ) { return true; @@ -123,8 +124,8 @@ function handleCheckboxChange(e) { } console.log('[ checkRecords.value ] >', checkRecords.value); - if (allRows.length > 0) { - messageApi.warning('最多只能选择1条数据'); + if (allRows.length >= limitMultipleNum.value) { + messageApi.warning(`最多只能选择${limitMultipleNum.value}条数据`); } } @@ -145,7 +146,10 @@ const [BaseModal, baseModalApi] = useVbenModal({ if (data.value.title) { title.value = data.value.title; } - console.log(data.value.userIds); + if (data.value.limitMultipleNum) { + limitMultipleNum.value = data.value.limitMultipleNum; + } + console.log(data.value.guids); const rows: any = []; for (const element of checkRecords.value) { if (data.value.guids.includes(element.guid)) { @@ -195,7 +199,11 @@ const [BaseModal, baseModalApi] = useVbenModal({ v-bind="gridOptions" @cell-click="handleCellClick" @checkbox-change="handleCheckboxChange" - /> + > + + diff --git a/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue b/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue index 1c973804..6b231d46 100644 --- a/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue +++ b/apps/web-contract/src/views/contract/components/todo-page/todo-page.vue @@ -1,12 +1,13 @@