func nullEditor(ctx context.Context, n *node.Node, app *stores.App) *EditorView { add := func(e *vecty.Event) { types := n.Rule.PermittedTypes() if len(types) == 1 { // if only one type is compatible, don't show the // popup, just add it. app.Dispatch(&actions.Add{ Undoer: &actions.Undoer{}, Parent: n.Parent, Node: n, Key: n.Key, Type: types[0], }) return } app.Dispatch(&actions.OpenAddPopup{ Parent: n.Parent, Node: n, Types: types, }) } return NewEditorView(ctx, n).Icons( func() vecty.MarkupOrComponentOrHTML { return elem.Anchor( prop.Href("#"), event.Click(add).PreventDefault(), elem.Italic( prop.Class("editor-icon editor-icon-after glyphicon glyphicon-plus-sign"), ), ) }, ).Dropdown( func() vecty.MarkupOrComponentOrHTML { return elem.ListItem( elem.Anchor( prop.Href("#"), vecty.Text("Add"), event.Click(add).PreventDefault(), ), ) }, ) }
func (v *ViewMenuView) Render() *vecty.HTML { return elem.ListItem( prop.Class("dropdown"), elem.Anchor( prop.Href("#"), prop.Class("dropdown-toggle"), vecty.Data("toggle", "dropdown"), vecty.Text("View"), elem.Span( prop.Class("caret"), ), ), elem.UnorderedList( prop.Class("dropdown-menu"), elem.ListItem( vecty.ClassMap{ "disabled": v.App.Branches.View() == models.Data, }, elem.Anchor( event.Click(func(ev *vecty.Event) { v.App.Dispatch(&actions.ChangeView{View: models.Data}) }).PreventDefault(), prop.Href("#"), vecty.Text("Data"), ), ), elem.ListItem( vecty.ClassMap{ "disabled": v.App.Branches.View() == models.Types, }, elem.Anchor( event.Click(func(ev *vecty.Event) { v.App.Dispatch(&actions.ChangeView{View: models.Types}) }).PreventDefault(), prop.Href("#"), vecty.Text("Types"), ), ), elem.ListItem( vecty.ClassMap{ "disabled": v.App.Branches.View() == models.Package, }, elem.Anchor( event.Click(func(ev *vecty.Event) { v.App.Dispatch(&actions.ChangeView{View: models.Package}) }).PreventDefault(), prop.Href("#"), vecty.Text("Package"), ), ), elem.ListItem( prop.Class("divider"), vecty.Property("role", "separator"), ), elem.ListItem( elem.Anchor( prop.Href("#"), event.Click(func(ev *vecty.Event) { v.App.Dispatch(&actions.ToggleInfoState{}) }).PreventDefault().StopPropagation(), elem.Italic( vecty.ClassMap{ "dropdown-icon": true, "glyphicon": true, "glyphicon-check": v.App.Misc.Info(), "glyphicon-unchecked": !v.App.Misc.Info(), }, ), vecty.Text("Show info"), ), ), ), ) }
func (v *EditorView) Render() *vecty.HTML { var dropdownItems []vecty.MarkupOrComponentOrHTML dropdownItems = append(dropdownItems, v.dropdown()) if !v.model.Node.Missing && !v.model.Node.Null { dropdownItems = append(dropdownItems, elem.ListItem( elem.Anchor( prop.Href("#"), vecty.Text("Delete"), event.Click(func(e *vecty.Event) { v.App.Dispatch(&actions.Delete{ Undoer: &actions.Undoer{}, Node: v.model.Node, Parent: v.model.Node.Parent, }) }).PreventDefault(), ), )) } var dropdown *vecty.HTML if dropdownItems != nil { dropdown = elem.Span( prop.Class("dropdown"), elem.Anchor( prop.Href("#"), prop.Class("dropdown-toggle"), vecty.Data("toggle", "dropdown"), vecty.Property("aria-haspopup", "true"), vecty.Property("aria-expanded", "true"), elem.Italic( prop.Class("editor-icon editor-icon-before glyphicon glyphicon-collapse-down"), ), ), elem.UnorderedList( append(dropdownItems, prop.Class("dropdown-menu"))..., ), ) } var handle vecty.List if v.model.Node.Index != -1 { handle = append(handle, elem.Italic( prop.Class("handle"), elem.Span( prop.Class("glyphicon glyphicon-option-vertical"), ), )) } label := elem.Label( prop.Class("control-label"), vecty.Text( v.model.Node.Label(v.Ctx), ), ) group := elem.Div( vecty.ClassMap{ "form-group": true, "has-error": v.node.Invalid, }, handle, dropdown, label, v.icons(), v.controls(), v.helpBlock(), v.errorBlock(), ) return group }
func (v *ObjectEditorView) Render() *vecty.HTML { sections := vecty.List{} sections = append(sections, views.NewPanelNavView(v.Ctx, v.branch).Contents( func() vecty.MarkupOrComponentOrHTML { return elem.UnorderedList( prop.Class("nav navbar-nav navbar-right"), elem.ListItem( prop.Class("dropdown"), elem.Anchor( prop.Href("#"), prop.Class("dropdown-toggle"), vecty.Data("toggle", "dropdown"), vecty.Property("role", "button"), vecty.Property("aria-haspopup", "true"), vecty.Property("aria-expanded", "false"), vecty.Text("Options"), elem.Span( prop.Class("caret"), ), ), elem.UnorderedList( prop.Class("dropdown-menu"), elem.ListItem( elem.Anchor( prop.Href("#"), event.Click(func(ev *vecty.Event) { v.App.Dispatch(&actions.ToggleSystemControls{ Node: v.model.Node, }) }).PreventDefault(), elem.Italic( vecty.ClassMap{ "dropdown-icon": true, "glyphicon": true, "glyphicon-check": v.node.ShowSystemControls, "glyphicon-unchecked": !v.node.ShowSystemControls, }, ), vecty.Text("System controls"), ), ), elem.ListItem( prop.Class("divider"), vecty.Property("role", "separator"), ), elem.ListItem( elem.Anchor( prop.Href("#"), vecty.Text("Delete"), event.Click(func(e *vecty.Event) { v.App.Dispatch(&actions.Delete{ Undoer: &actions.Undoer{}, Node: v.model.Node, Parent: v.model.Node.Parent, }) }).PreventDefault(), ), ), ), ), ) }, ), ) d := v.model.Node.Map["description"] if !d.Null && !d.Missing && d.ValueString != "" { sections = append(sections, elem.Paragraph( prop.Class("lead"), vecty.Text(d.ValueString), )) } if v.App.Misc.Info() { dt, err := v.node.Node.DisplayType(v.Ctx) if err != nil { v.App.Fail <- kerr.Wrap("KFKGCGFULR", err) return nil } sections = append(sections, elem.Paragraph( prop.Class("lead"), vecty.Text("type: "+dt), ), ) } if v.node.ShowSystemControls { sections = append(sections, elem.Div( prop.Class("well object-editor"), views.NewEditorListView(v.Ctx, v.model, system.NewReference("kego.io/system", "object"), []string{"id", "type"}), ), ) } return elem.Div( sections, ) }
func (v *EditorListView) Render() *vecty.HTML { if v.model == nil || v.model.Node.Missing || v.model.Node.Null { return elem.Div(vecty.Text("editor (nil)")) } children := vecty.List{} add := func(n *node.Node) { for _, v := range v.exclude { if n.Key == v { return } } if n.Null || n.Missing { children = append(children, nullEditor(v.Ctx, n, v.App)) return } f := editable.Branch if e := models.GetEditable(v.Ctx, n); e != nil { f = e.Format(n.Rule) if f == editable.Block || f == editable.Inline { children = append(children, NewEditorView(v.Ctx, n).Controls( func() vecty.MarkupOrComponentOrHTML { return e.EditorView(v.Ctx, n, editable.Block) }, ), ) return } } if f == editable.Branch { b := v.App.Branches.Get(n) children = append(children, NewEditorView(v.Ctx, n).Icons( func() vecty.MarkupOrComponentOrHTML { return elem.Anchor( prop.Href("#"), event.Click(func(e *vecty.Event) { v.App.Dispatch(&actions.BranchSelecting{Branch: b, Op: models.BranchOpClickEditorLink}) }).PreventDefault(), elem.Italic( prop.Class("editor-icon editor-icon-after glyphicon glyphicon-share-alt"), ), ) }, )) } } for _, n := range v.model.Node.Map { // TODO: hide optional fields //if n.Missing || n.Null { // continue //} if v.filter != nil && *n.Origin != *v.filter { continue } add(n) } for _, n := range v.model.Node.Array { add(n) } v.items = len(children) if len(children) == 0 { v.container = elem.Div() } else { v.container = elem.Form( event.Submit(func(*vecty.Event) {}).PreventDefault(), children, ) } return v.container }