fix(pl): 默认激活统计包装面板以加载全局合同与证件列表。
This commit is contained in:
1 parent
f9c489531d
commit
b1a50b58e3
3 files changed
+103
-2
No files matched your search
@@ -571,3 +571,101 @@ test('refresh and search while permission request is pending do not cancel initi
|
||||
assert.equal(s.rows.value[0].id, 'loaded')
|
||||
h.stop()
|
||||
})
|
||||
|
||||
import { compileScript } from '@vue/compiler-sfc'
|
||||
function compiledSfc(path: string, dependencies: Record<string, any>, inlineTemplate = true) {
|
||||
const descriptor = parse(readFileSync(new URL(path, import.meta.url), 'utf8')).descriptor
|
||||
const compiled = compileScript(descriptor, { id: path, inlineTemplate })
|
||||
const source = ts.createSourceFile('compiled.ts', compiled.content, ts.ScriptTarget.Latest, true)
|
||||
const env: Record<string, any> = Object.fromEntries(
|
||||
Object.entries(vue).filter(([key]) => /^[a-zA-Z_$][\w$]*$/.test(key) && key !== 'default')
|
||||
)
|
||||
for (const statement of source.statements) {
|
||||
if (!ts.isImportDeclaration(statement) || statement.importClause?.isTypeOnly) continue
|
||||
const clause = statement.importClause
|
||||
if (clause?.name) env[clause.name.text] = dependencies[clause.name.text] || {}
|
||||
if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {
|
||||
for (const item of clause.namedBindings.elements) {
|
||||
if (item.isTypeOnly) continue
|
||||
const name = (item.propertyName || item.name).text
|
||||
env[item.name.text] =
|
||||
statement.moduleSpecifier.getText(source) === '"vue"' ||
|
||||
statement.moduleSpecifier.getText(source) === "'vue'"
|
||||
? (vue as any)[name]
|
||||
: dependencies[name]
|
||||
}
|
||||
}
|
||||
}
|
||||
const code = ts.transpile(
|
||||
source.statements
|
||||
.filter((s) => !ts.isImportDeclaration(s))
|
||||
.map((s) => s.getText(source))
|
||||
.join('\n')
|
||||
.replace('export default', 'const component ='),
|
||||
{ target: ts.ScriptTarget.ESNext }
|
||||
)
|
||||
return new Function(...Object.keys(env), `${code}; return component`)(...Object.values(env))
|
||||
}
|
||||
for (const wrapper of [
|
||||
'contract-quota/ContractQuotaPanel.vue',
|
||||
'certificate-usage/CertificateUsagePanel.vue'
|
||||
]) {
|
||||
for (const active of [undefined, false])
|
||||
test(`compiled ${wrapper} ${active === false ? 'inactive skips requests' : 'defaults to active and loads'}`, async () => {
|
||||
const calls: string[] = []
|
||||
const dependencies = {
|
||||
useUserStore: () => vue.reactive({ accessToken: 'token', getUserInfo: { tenantNo: 'a' } }),
|
||||
fetchGetMenuCodes: async () => {
|
||||
calls.push('permissions')
|
||||
return { all: true }
|
||||
},
|
||||
quotaStatisticsApi: {
|
||||
contracts: async () => {
|
||||
calls.push('contracts')
|
||||
return { list: [], total: 0 }
|
||||
},
|
||||
certificates: async () => {
|
||||
calls.push('certificates')
|
||||
return { list: [], total: 0 }
|
||||
}
|
||||
},
|
||||
usePersistedListColumns,
|
||||
useServerColumnFilters,
|
||||
createStatisticsLoader,
|
||||
useListTableViewportHeight: () => ({ tableHeight: vue.ref(400) }),
|
||||
statusLabel: statisticsLabels.statusLabel,
|
||||
contractTypeLabel: statisticsLabels.contractTypeLabel
|
||||
}
|
||||
// Compile the real inner setup too; only its visual child tree is omitted here.
|
||||
const StatisticsPanel = compiledSfc(
|
||||
'../src/views/pl/quota-statistics/StatisticsPanel.vue',
|
||||
dependencies,
|
||||
false
|
||||
)
|
||||
StatisticsPanel.render = () => null
|
||||
const Wrapper = compiledSfc(`../src/views/pl/${wrapper}`, { StatisticsPanel })
|
||||
const renderer = vue.createRenderer<any, any>({
|
||||
createElement: () => ({}),
|
||||
createText: () => ({}),
|
||||
createComment: () => ({}),
|
||||
setText: () => {},
|
||||
setElementText: () => {},
|
||||
parentNode: () => null,
|
||||
nextSibling: () => null,
|
||||
insert: () => {},
|
||||
remove: () => {},
|
||||
patchProp: () => {}
|
||||
})
|
||||
const app = renderer.createApp(Wrapper, active === undefined ? {} : { active })
|
||||
app.mount({})
|
||||
await flush()
|
||||
await vue.nextTick()
|
||||
assert.deepEqual(
|
||||
calls,
|
||||
active === false
|
||||
? []
|
||||
: ['permissions', wrapper.startsWith('contract') ? 'contracts' : 'certificates']
|
||||
)
|
||||
app.unmount()
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user