import { h } from 'vue' import { ElTag } from 'element-plus' import { $t } from '@/locales' import ArtSvgIcon from '@/components/core/base/art-svg-icon/index.vue' import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue' import { getMenuDisplayIcon, getMenuDisplayTitle, getMenuStatusMeta, getMenuTypeTag, getMenuTypeText } from './menuPage.helpers' export function createMenuTableColumns({ titleFormatter, handleAddAuth, handleEditAuth, handleDeleteAuth, handleEditMenu, handleDeleteMenu, t = $t }) { return [ { prop: 'meta.title', label: t('pages.system.menu.search.name'), minWidth: 180, formatter: (row) => getMenuDisplayTitle(row, titleFormatter) }, { prop: 'meta.icon', label: t('table.iconPreview'), width: 96, align: 'center', formatter: (row) => { const icon = getMenuDisplayIcon(row) if (!icon) return h('span', { class: 'text-g-400' }, '-') return h( 'div', { class: 'mx-auto flex h-8 w-8 items-center justify-center rounded-md border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)]' }, [h(ArtSvgIcon, { icon, class: 'text-base text-g-700' })] ) } }, { prop: 'type', label: t('table.menuType'), width: 110, formatter: (row) => h(ElTag, { type: getMenuTypeTag(row), effect: 'light' }, () => getMenuTypeText(row, t)) }, { prop: 'route', label: t('pages.system.menu.search.route'), minWidth: 180, formatter: (row) => { if (row.meta?.isAuthButton) return '' return row.route || '' } }, { prop: 'component', label: t('table.componentKey'), minWidth: 160, showOverflowTooltip: true, formatter: (row) => { if (row.meta?.isAuthButton) return '' return row.component || '' } }, { prop: 'authority', label: t('table.permissionKey'), minWidth: 180, formatter: (row) => { if (row.meta?.isAuthButton) { return row.authority || row.meta?.authMark || '' } if (!row.meta?.authList?.length) return row.authority || '' return t('pages.system.menu.messages.authCount', { count: row.meta.authList.length }) } }, { prop: 'sort', label: t('table.sort'), width: 90 }, { prop: 'id', label: t('table.id'), width: 96, align: 'center' }, { prop: 'status', label: t('table.status'), width: 100, formatter: (row) => { const statusMeta = getMenuStatusMeta(row.status, t) return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text) } }, { prop: 'memo', label: t('table.remark'), minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.memo || '-' }, { prop: 'operation', label: t('table.operation'), width: 180, align: 'center', formatter: (row) => { const buttonStyle = { class: 'flex justify-center' } if (row.meta?.isAuthButton) { return h('div', buttonStyle, [ h(ArtButtonTable, { type: 'edit', onClick: () => handleEditAuth(row) }), h(ArtButtonTable, { type: 'delete', onClick: () => handleDeleteAuth(row) }) ]) } return h('div', buttonStyle, [ h(ArtButtonTable, { type: 'add', onClick: () => handleAddAuth(row), title: t('pages.system.menu.actions.addAuth') }), h(ArtButtonTable, { type: 'edit', onClick: () => handleEditMenu(row) }), h(ArtButtonTable, { type: 'delete', onClick: () => handleDeleteMenu(row) }) ]) } } ] }