diff --git a/internal/web/ui.go b/internal/web/ui.go index 759b9d8..00685dd 100644 --- a/internal/web/ui.go +++ b/internal/web/ui.go @@ -49,6 +49,12 @@ type PageData struct { ConfigStatusErr string ConfigSources service.ConfigPreviewSources ConfigPreview *service.ConfigPreviewResult + ResultTitle string + SelectedTemplate string + SelectedProfile string + SelectedOverlays []string + SelectedConfigID string + SelectedVersion string Tasks []models.Task Task *models.Task Templates []service.Template @@ -107,6 +113,14 @@ func NewUI(discovery *service.DiscoveryService, registry *service.RegistryServic b, _ := json.MarshalIndent(v, "", " ") return string(b) }, + "hasString": func(items []string, want string) bool { + for _, item := range items { + if item == want { + return true + } + } + return false + }, "ago": func(ms int64) string { if ms <= 0 { return "-" @@ -873,6 +887,11 @@ func (u *UI) actionDeviceConfigPreview(w http.ResponseWriter, r *http.Request) { preview, err := u.preview.Render(req) data := u.configPreviewPageData(dev) data.ConfigPreview = preview + data.SelectedTemplate = req.Template + data.SelectedProfile = req.Profile + data.SelectedOverlays = append([]string(nil), req.Overlays...) + data.SelectedConfigID = req.ConfigID + data.SelectedVersion = req.ConfigVersion if err != nil { data.Error = err.Error() } @@ -900,9 +919,11 @@ func (u *UI) actionDeviceConfigCandidate(w http.ResponseWriter, r *http.Request) return } data.ConfigPreview = previewResultFromJSON(raw) + populateSelectionsFromPreview(&data) body, code, err := u.agent.Do("PUT", dev.IP, dev.AgentPort, "/v1/config/candidate", []byte(raw)) data.Message = fmt.Sprintf("PUT /v1/config/candidate -> %d", code) data.RawText = prettyJSON(body) + data.ResultTitle = "候选配置结果" if err != nil { data.Error = err.Error() } @@ -920,10 +941,12 @@ func (u *UI) actionDeviceConfigCandidateApply(w http.ResponseWriter, r *http.Req raw := strings.TrimSpace(r.FormValue("json")) if raw != "" { data.ConfigPreview = previewResultFromJSON(raw) + populateSelectionsFromPreview(&data) } body, code, err := u.agent.Do("POST", dev.IP, dev.AgentPort, "/v1/config/candidate/apply", []byte(`{}`)) data.Message = fmt.Sprintf("POST /v1/config/candidate/apply -> %d", code) data.RawText = prettyJSON(body) + data.ResultTitle = "应用候选配置结果" if err != nil { data.Error = err.Error() } @@ -932,7 +955,15 @@ func (u *UI) actionDeviceConfigCandidateApply(w http.ResponseWriter, r *http.Req func (u *UI) configPreviewPageData(dev *models.Device) PageData { sources, err := u.preview.ListSources() - data := PageData{Title: "配置预览", Device: dev, ConfigSources: sources} + data := PageData{ + Title: "配置预览", + Device: dev, + ConfigSources: sources, + SelectedTemplate: "workshop_face_shoe_alarm", + SelectedProfile: "local_3588_test", + SelectedOverlays: []string{"face_debug"}, + SelectedConfigID: "preview_" + dev.DeviceID, + } if err != nil { data.Error = err.Error() } @@ -972,6 +1003,37 @@ func previewResultFromJSON(raw string) *service.ConfigPreviewResult { } } +func populateSelectionsFromPreview(data *PageData) { + if data == nil || data.ConfigPreview == nil { + return + } + if metadata := data.ConfigPreview.Metadata; metadata != nil { + if v, _ := metadata["template"].(string); strings.TrimSpace(v) != "" { + data.SelectedTemplate = v + } + if v, _ := metadata["profile"].(string); strings.TrimSpace(v) != "" { + data.SelectedProfile = v + } + if v, _ := metadata["config_id"].(string); strings.TrimSpace(v) != "" { + data.SelectedConfigID = v + } + if v, _ := metadata["config_version"].(string); strings.TrimSpace(v) != "" { + data.SelectedVersion = v + } + if items, ok := metadata["overlays"].([]any); ok { + overlays := make([]string, 0, len(items)) + for _, item := range items { + if s, ok := item.(string); ok && strings.TrimSpace(s) != "" { + overlays = append(overlays, s) + } + } + if len(overlays) > 0 { + data.SelectedOverlays = overlays + } + } + } +} + func (u *UI) actionDeviceConfigUIPlan(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") dev, ok := u.findDevice(id) diff --git a/internal/web/ui/templates/config_preview.html b/internal/web/ui/templates/config_preview.html index 97b8daf..3bba19d 100644 --- a/internal/web/ui/templates/config_preview.html +++ b/internal/web/ui/templates/config_preview.html @@ -19,7 +19,7 @@
{{.ConfigPreview.JSON}}
+ {{if .RawText}}
+ {{.ConfigPreview.JSON}}
+ {{.ConfigPreview.JSON}}
+ {{.RawText}}