예제 #1
0
파일: structfragment.go 프로젝트: kego/ke
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(),
				),
			)
		},
	)
}
예제 #2
0
파일: viewmenu.go 프로젝트: kego/ke
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"),
				),
			),
		),
	)
}
예제 #3
0
파일: editor.go 프로젝트: kego/ke
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
}
예제 #4
0
파일: object.go 프로젝트: kego/ke
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,
	)

}
예제 #5
0
파일: editorlist.go 프로젝트: kego/ke
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
}