waveterm/pkg/waveobj/wtypemeta.go
Evan Simkowitz e2bd3cd94a
Add per-block WebView homepage setting, help view is now just a skinned webview (#982)
Adds a meta field `pinnedurl` that can be set to override the
`web:defaulturl` setting for a given block. Also adds a home button to
the webview to reset the block url to the homepage

The help view is now an extension of the webview with some of the chrome
removed.

Also updates the cookie dependency to resolve a vulnerability
2024-10-07 17:20:18 -07:00

133 lines
4.7 KiB
Go

// Copyright 2024, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
package waveobj
import (
"strings"
)
const Entity_Any = "any"
// for typescript typing
type MetaTSType struct {
// shared
View string `json:"view,omitempty"`
Controller string `json:"controller,omitempty"`
File string `json:"file,omitempty"`
Url string `json:"url,omitempty"`
PinnedUrl string `json:"pinnedurl,omitempty"`
Connection string `json:"connection,omitempty"`
Edit bool `json:"edit,omitempty"`
History []string `json:"history,omitempty"`
HistoryForward []string `json:"history:forward,omitempty"`
DisplayName string `json:"display:name,omitempty"`
DisplayOrder float64 `json:"display:order,omitempty"`
Icon string `json:"icon,omitempty"`
IconColor string `json:"icon:color,omitempty"`
Frame bool `json:"frame,omitempty"`
FrameClear bool `json:"frame:*,omitempty"`
FrameBorderColor string `json:"frame:bordercolor,omitempty"`
FrameBorderColor_Focused string `json:"frame:bordercolor:focused,omitempty"`
FrameTitle string `json:"frame:title,omitempty"`
FrameIcon string `json:"frame:icon,omitempty"`
FrameText string `json:"frame:text,omitempty"`
Cmd string `json:"cmd,omitempty"`
CmdClear bool `json:"cmd:*,omitempty"`
CmdInteractive bool `json:"cmd:interactive,omitempty"`
CmdLogin bool `json:"cmd:login,omitempty"`
CmdRunOnStart bool `json:"cmd:runonstart,omitempty"`
CmdClearOnStart bool `json:"cmd:clearonstart,omitempty"`
CmdClearOnRestart bool `json:"cmd:clearonrestart,omitempty"`
CmdEnv map[string]string `json:"cmd:env,omitempty"`
CmdCwd string `json:"cmd:cwd,omitempty"`
CmdNoWsh bool `json:"cmd:nowsh,omitempty"`
GraphClear bool `json:"graph:*,omitempty"`
GraphNumPoints int `json:"graph:numpoints,omitempty"`
GraphMetrics []string `json:"graph:metrics,omitempty"`
// for tabs
Bg string `json:"bg,omitempty"`
BgClear bool `json:"bg:*,omitempty"`
BgOpacity float64 `json:"bg:opacity,omitempty"`
BgBlendMode string `json:"bg:blendmode,omitempty"`
TermClear bool `json:"term:*,omitempty"`
TermFontSize int `json:"term:fontsize,omitempty"`
TermFontFamily string `json:"term:fontfamily,omitempty"`
TermMode string `json:"term:mode,omitempty"`
TermTheme string `json:"term:theme,omitempty"`
TermLocalShellPath string `json:"term:localshellpath,omitempty"` // matches settings
TermLocalShellOpts []string `json:"term:localshellopts,omitempty"` // matches settings
TermScrollback *int `json:"term:scrollback,omitempty"`
Count int `json:"count,omitempty"` // temp for cpu plot. will remove later
}
type MetaDataDecl struct {
Key string `json:"key"`
Desc string `json:"desc,omitempty"`
Type string `json:"type"` // string, int, float, bool, array, object
Default any `json:"default,omitempty"`
StrOptions []string `json:"stroptions,omitempty"`
NumRange []*int `json:"numrange,omitempty"` // inclusive, null means no limit
Entity []string `json:"entity"` // what entities this applies to, e.g. "block", "tab", "any", etc.
Special []string `json:"special,omitempty"` // special handling. things that need to happen if this gets updated
}
type MetaPresetDecl struct {
Preset string `json:"preset"`
Desc string `json:"desc,omitempty"`
Keys []string `json:"keys"`
Entity []string `json:"entity"` // what entities this applies to, e.g. "block", "tab", etc.
}
// returns a clean copy of meta with mergeMeta merged in
// if mergeSpecial is false, then special keys will not be merged (like display:*)
func MergeMeta(meta MetaMapType, metaUpdate MetaMapType, mergeSpecial bool) MetaMapType {
rtn := make(MetaMapType)
for k, v := range meta {
rtn[k] = v
}
// deal with "section:*" keys
for k := range metaUpdate {
if !strings.HasSuffix(k, ":*") {
continue
}
if !metaUpdate.GetBool(k, false) {
continue
}
prefix := strings.TrimSuffix(k, ":*")
if prefix == "" {
continue
}
// delete "[prefix]" and all keys that start with "[prefix]:"
prefixColon := prefix + ":"
for k2 := range rtn {
if k2 == prefix || strings.HasPrefix(k2, prefixColon) {
delete(rtn, k2)
}
}
}
// now deal with regular keys
for k, v := range metaUpdate {
if !mergeSpecial && strings.HasPrefix(k, "display:") {
continue
}
if strings.HasSuffix(k, ":*") {
continue
}
if v == nil {
delete(rtn, k)
continue
}
rtn[k] = v
}
return rtn
}