diff --git a/web-admin/scripts/cert-ready-default.test.ts b/web-admin/scripts/cert-ready-default.test.ts
index b7c11f666..88dfbeb83 100644
--- a/web-admin/scripts/cert-ready-default.test.ts
+++ b/web-admin/scripts/cert-ready-default.test.ts
@@ -25,6 +25,20 @@ test('incomplete certificate filter is sent as quotaCertWaivedIn=0', () => {
assert.deepEqual(params, { quotaCertWaivedIn: '0' })
})
+test('fulfill tab selection column is first among table columns', () => {
+ const web = readFileSync(new URL('../src/views/pl/cert-ready/index.vue', import.meta.url), 'utf8')
+ const selectionIdx = web.indexOf('type="selection"')
+ const columnsIdx = web.indexOf('v-for="column in columns"')
+ const actionsIdx = web.indexOf('label="操作"')
+ assert.ok(selectionIdx > 0, 'selection column missing')
+ assert.ok(columnsIdx > selectionIdx, 'selection must precede business columns')
+ assert.ok(actionsIdx > columnsIdx, 'actions must follow business columns')
+ assert.match(
+ web,
+ /v-if="listMode === 'fulfill'"[\s\S]*?type="selection"[\s\S]*?v-for="column in columns"/
+ )
+})
+
test('web funnel and miniprogram status dropdown default to incomplete', () => {
const web = readFileSync(new URL('../src/views/pl/cert-ready/index.vue', import.meta.url), 'utf8')
const mobile = readFileSync(
diff --git a/web-admin/src/views/pl/cert-ready/index.vue b/web-admin/src/views/pl/cert-ready/index.vue
index 0485cf4c5..60a875275 100644
--- a/web-admin/src/views/pl/cert-ready/index.vue
+++ b/web-admin/src/views/pl/cert-ready/index.vue
@@ -50,6 +50,14 @@
class="list-table"
@selection-change="onSelectionChange"
>
+
{{ row[column.prop] || '—' }}
-