mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-23 10:51:09 +00:00
fix🐛: gate optional imports on where they're actually used, not on raw metadata
Every $hasX flag controlling an optional import matched "this column carries the metadata" rather than "some rendered branch actually reads it" -- necessary but not sufficient, since FkTableName/DictType lose to each other by priority (FK wins search, list and the form's select branch; the form's radio branch never checks FK at all) and a column can carry either while being neither queryable, listed, nor an insertable select/radio. $hasDatetime was the reachable case integration testing found: sys_tables.go assigns HtmlType "datetime" to any timestamp/datetime column on import regardless of IsList, because GetList's audit-column exclusion is a separate, later step editTable.vue never surfaces created_at/updated_at through anyway. Nearly every real table has both, so nearly every table imported DateCell without using it. $hasFk and $hasDict had the identical shape one level down: the per-column ref/onMounted/useDict declarations were gated on "this column has FkTableName/DictType", not on whether the column reaches a branch that reads the resulting Options ref -- an FK column used only via search (no IsList, no insert-select) still declared a Label function nothing calls, and a dict column used only in an insert radio (no IsQuery, no IsList) still would have, had the two flags controlling its import stayed as wide as the per-column check they were meant to gate. Rewrote both to a shared $dictUsed/$fkUsed condition, matching each consuming branch's own guard term for term, and split the FK block's Label function under its own IsList check -- Options can be needed for search or the form's select without List ever being true. $hasDictList already had this shape from the previous fix and needed no change. Verified with two new fixtures, rendered through the real template.Execute and checked against a throwaway go-admin-ui worktree (deleted afterwards) with hand-written API-module stubs: a bare table carrying only the standard created_at/updated_at pair -- confirmed red on DateCell before this change, green after -- and a table exercising every optional import through a path distinct from the ones the two earlier verification rounds covered (a dict column read only from an insert radio, an FK column read only from search, and a business datetime column that IS listed, so DateCell still has to import when the real thing needs it). Re-ran the three fixtures from the previous two rounds alongside these two; all five stayed green. pnpm type-check and pnpm lint both zero error, on Node 24.11.0.
This commit is contained in:
@@ -34,6 +34,21 @@
|
||||
outer-scope variable from inside a range -- a text/template feature since
|
||||
Go 1.11, needed here because a range body cannot otherwise leave a mark on
|
||||
anything outside itself.
|
||||
|
||||
Each condition below must match, term for term, the condition guarding the
|
||||
markup or script that actually consumes the import -- not just "this column
|
||||
has a DictType/FkTableName", which is necessary but not sufficient. A column
|
||||
can carry dictionary or foreign-key metadata that no rendered branch reads:
|
||||
FkTableName/DictType lose to each other by priority (FK wins search, list
|
||||
and the form's select branch; the form's radio branch never looks at FK at
|
||||
all), and a column can carry either one while being neither queryable nor
|
||||
listed nor an insertable select/radio -- created_at/updated_at are exactly
|
||||
this: sys_tables.go assigns HtmlType "datetime" to any timestamp/datetime
|
||||
column on import whether or not it ever reaches IsList, because GetList's
|
||||
audit-column exclusion is a separate, later step. Get a term here wrong in
|
||||
either direction and either an import goes unused (no-unused-vars) or a real
|
||||
usage silently loses its import (a ReferenceError this template cannot see
|
||||
coming, since Vue components are the last stage that runs).
|
||||
*/ -}}
|
||||
{{- $hasDict := false -}}
|
||||
{{- $hasDictList := false -}}
|
||||
@@ -43,10 +58,12 @@
|
||||
{{- $hasQuery := false -}}
|
||||
{{- $pkType := "number" -}}
|
||||
{{- range .Columns -}}
|
||||
{{- if ne .DictType "" }}{{$hasDict = true}}{{end -}}
|
||||
{{- $dictUsed := and (ne .DictType "") (or (and (eq .IsQuery "1") (eq .FkTableName "")) (and (eq .IsList "1") (eq .FkTableName "")) (and (eq .IsInsert "1") (eq .HtmlType "select") (eq .FkTableName "")) (and (eq .IsInsert "1") (eq .HtmlType "radio"))) -}}
|
||||
{{- $fkUsed := and (ne .FkTableName "") (or (eq .IsQuery "1") (eq .IsList "1") (and (eq .IsInsert "1") (eq .HtmlType "select"))) -}}
|
||||
{{- if $dictUsed }}{{$hasDict = true}}{{end -}}
|
||||
{{- if and (eq .IsList "1") (eq .FkTableName "") (ne .DictType "") }}{{$hasDictList = true}}{{end -}}
|
||||
{{- if ne .FkTableName "" }}{{$hasFk = true}}{{end -}}
|
||||
{{- if eq .HtmlType "datetime" }}{{$hasDatetime = true}}{{end -}}
|
||||
{{- if $fkUsed }}{{$hasFk = true}}{{end -}}
|
||||
{{- if and (eq .IsList "1") (eq .FkTableName "") (eq .DictType "") (eq .HtmlType "datetime") }}{{$hasDatetime = true}}{{end -}}
|
||||
{{- if eq .IsQuery "1" }}{{$hasQuery = true}}{{end -}}
|
||||
{{- if and (eq .IsInsert "1") (eq .IsRequired "1") (not .Pk) (ne .GoField "CreatedAt") (ne .GoField "UpdatedAt") (ne .GoField "DeletedAt") (ne .GoField "UpdateBy") (ne .GoField "CreateBy") }}{{$hasRules = true}}{{end -}}
|
||||
{{- if and .Pk (eq .GoType "string") }}{{$pkType = "string"}}{{end -}}
|
||||
@@ -276,21 +293,25 @@ import type { {{.FkTableNameClass}} } from '@/api/{{$package}}/{{.FkTableNamePac
|
||||
|
||||
defineOptions({ name: '{{.ClassName}}Manage' })
|
||||
{{- range .Columns}}
|
||||
{{- if ne .DictType ""}}
|
||||
{{- $dictUsed := and (ne .DictType "") (or (and (eq .IsQuery "1") (eq .FkTableName "")) (and (eq .IsList "1") (eq .FkTableName "")) (and (eq .IsInsert "1") (eq .HtmlType "select") (eq .FkTableName "")) (and (eq .IsInsert "1") (eq .HtmlType "radio"))) -}}
|
||||
{{- $fkUsed := and (ne .FkTableName "") (or (eq .IsQuery "1") (eq .IsList "1") (and (eq .IsInsert "1") (eq .HtmlType "select"))) -}}
|
||||
{{- if $dictUsed}}
|
||||
|
||||
const { {{.DictType}}: {{.JsonField}}Options } = useDict('{{.DictType}}')
|
||||
{{- end}}
|
||||
{{- if ne .FkTableName ""}}
|
||||
{{- if $fkUsed}}
|
||||
|
||||
const {{.JsonField}}Options = ref<{{.FkTableNameClass}}[]>([])
|
||||
onMounted(async() => {
|
||||
const res = await list{{.FkTableNameClass}}({ pageIndex: 1, pageSize: 100 })
|
||||
{{.JsonField}}Options.value = res.data?.list ?? []
|
||||
})
|
||||
{{- if eq .IsList "1"}}
|
||||
const {{.JsonField}}Label = (value: unknown) =>
|
||||
{{.JsonField}}Options.value.find(item => item.{{.FkLabelId}} === value)?.{{.FkLabelName}} ?? value
|
||||
{{- end}}
|
||||
{{- end}}
|
||||
{{- end}}
|
||||
{{- /*
|
||||
Every object literal below is built on one line, joined with ", " through a
|
||||
$first flag rather than one field per line with a trailing comma after each:
|
||||
|
||||
Reference in New Issue
Block a user