forked from x/icebergs
add wiki.field
This commit is contained in:
parent
33352c4fd3
commit
1e601771b5
@ -1611,7 +1611,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
|
|||||||
|
|
||||||
// 执行命令
|
// 执行命令
|
||||||
meta := kit.Value(value, kit.Format("extra.tool.%s", arg[2])).(map[string]interface{})
|
meta := kit.Value(value, kit.Format("extra.tool.%s", arg[2])).(map[string]interface{})
|
||||||
if meta["single"] == "yes" {
|
if meta["single"] == "yes" && kit.Select("", arg, 3) != "action" {
|
||||||
arg = append(arg[:3], kit.Simple(kit.UnMarshal(kit.Format(meta["args"])))...)
|
arg = append(arg[:3], kit.Simple(kit.UnMarshal(kit.Format(meta["args"])))...)
|
||||||
for i := len(arg) - 1; i >= 0; i-- {
|
for i := len(arg) - 1; i >= 0; i-- {
|
||||||
if arg[i] != "" {
|
if arg[i] != "" {
|
||||||
|
@ -14,6 +14,49 @@ data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Opti
|
|||||||
var shell = `<code class="story" data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "input"}}" data-dir="{{.Option "cmd_dir"}}">$ {{.Option "input"}} # {{.Option "name"}}
|
var shell = `<code class="story" data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "input"}}" data-dir="{{.Option "cmd_dir"}}">$ {{.Option "input"}} # {{.Option "name"}}
|
||||||
{{.Option "output"}}</code>
|
{{.Option "output"}}</code>
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var field = `<fieldset class="story {{.Option "name"}}" data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}" data-meta='{{.Optionv "meta"|Format}}'>
|
||||||
|
<legend>{{.Option "name"}}</legend>
|
||||||
|
<form class="option"></form>
|
||||||
|
<div class="action"></div>
|
||||||
|
<div class="output"></div>
|
||||||
|
<div class="status"></div>
|
||||||
|
</fieldset>
|
||||||
|
`
|
||||||
|
var field0 = `<fieldset class="story" data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">
|
||||||
|
<legend>{{.Option "name"}} </legend>{{$meta := .Optionv "meta"}}
|
||||||
|
<form class="option">
|
||||||
|
{{if $meta}}
|
||||||
|
{{range $index, $value := index $meta "inputs"}}
|
||||||
|
{{$type := index $value "_input"}}
|
||||||
|
<div class="item input">
|
||||||
|
<input
|
||||||
|
{{if eq $type "text"}}class="args"{{end}}
|
||||||
|
type="{{index $value "_input"}}"
|
||||||
|
name="{{index $value "name"|Format}}"
|
||||||
|
value="{{index $value "value"|Format}}"
|
||||||
|
data-action="{{index $value "action"|Format}}"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</form>
|
||||||
|
<div class="action">
|
||||||
|
</div>
|
||||||
|
<div class="output">
|
||||||
|
{{if .Result}}
|
||||||
|
<div class="code">{{.Result}}</div>
|
||||||
|
{{else if .Appendv "append"}}
|
||||||
|
<table>{{$msg := .}}
|
||||||
|
<tr>{{range $index, $value := .Appendv "append"}}<th>{{$value}}</th>{{end}}</tr>
|
||||||
|
{{range $index, $_ := .Appendv "_index"}}<tr>{{range $_, $key := $msg.Appendv "append"}}{{$line := $msg.Appendv $key}}
|
||||||
|
<td>{{index $line $index}}</td>
|
||||||
|
{{end}}</tr>{{end}}
|
||||||
|
</table>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
`
|
||||||
var order = `<ul class="story"
|
var order = `<ul class="story"
|
||||||
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">
|
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">
|
||||||
{{range $index, $value := .Optionv "list"}}<li>{{$value}}</li>{{end}}</ul>`
|
{{range $index, $value := .Optionv "list"}}<li>{{$value}}</li>{{end}}</ul>`
|
||||||
@ -29,14 +72,12 @@ data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Opti
|
|||||||
var stack = `<div class="story"
|
var stack = `<div class="story"
|
||||||
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">`
|
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">`
|
||||||
|
|
||||||
var prefix = `<svg class="story" vertion="1.1" xmlns="http://www.w3.org/2000/svg"
|
var prefix = `<svg class="story" vertion="1.1" xmlns="http://www.w3.org/2000/svg" dominant-baseline="middle" text-anchor="middle"
|
||||||
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}"
|
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}"
|
||||||
width="{{.Option "width"}}" height="{{.Option "height"}}"
|
width="{{.Option "width"}}" height="{{.Option "height"}}"
|
||||||
font-size="{{.Option "font-size"}}" style="{{.Option "style"}}"
|
font-size="{{.Option "font-size"}}" stroke="{{.Option "stroke"}}" fill="{{.Option "fill"}}"
|
||||||
dominant-baseline="middle" text-anchor="middle"
|
stroke-width="{{.Option "stroke-width"}}" font-family="{{.Option "font-family"}}"
|
||||||
stroke="{{.Option "stroke"}}" fill="{{.Option "fill"}}"
|
style="{{.Option "style"}}"
|
||||||
stroke-width="{{.Option "stroke-width"}}"
|
|
||||||
font-family="{{.Option "font-family"}}"
|
|
||||||
>`
|
>`
|
||||||
|
|
||||||
var premenu = `<ul class="story" data-type="premenu"></ul>`
|
var premenu = `<ul class="story" data-type="premenu"></ul>`
|
||||||
|
@ -14,6 +14,23 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func reply(m *ice.Message, cmd string, arg ...string) bool {
|
||||||
|
// 文件列表
|
||||||
|
m.Option("dir_root", m.Conf(cmd, "meta.path"))
|
||||||
|
m.Option("dir_reg", m.Conf(cmd, "meta.regs"))
|
||||||
|
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
||||||
|
m.Sort("time", "time_r")
|
||||||
|
|
||||||
|
if len(arg) == 0 || strings.HasSuffix(arg[0], "/") {
|
||||||
|
// 目录列表
|
||||||
|
m.Option("dir_reg", "")
|
||||||
|
m.Option("dir_type", "dir")
|
||||||
|
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
||||||
Caches: map[string]*ice.Cache{},
|
Caches: map[string]*ice.Cache{},
|
||||||
Configs: map[string]*ice.Config{
|
Configs: map[string]*ice.Config{
|
||||||
@ -28,6 +45,15 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
|
|
||||||
"local": {Name: "local", Help: "文件", Value: kit.Data("template", local)},
|
"local": {Name: "local", Help: "文件", Value: kit.Data("template", local)},
|
||||||
"shell": {Name: "shell", Help: "命令", Value: kit.Data("template", shell)},
|
"shell": {Name: "shell", Help: "命令", Value: kit.Data("template", shell)},
|
||||||
|
"field": {Name: "shell", Help: "命令", Value: kit.Data("template", field,
|
||||||
|
"some", kit.Dict("simple", kit.Dict(
|
||||||
|
"inputs", kit.List(
|
||||||
|
kit.MDB_INPUT, "text", "name", "name",
|
||||||
|
kit.MDB_INPUT, "button", "value", "查看",
|
||||||
|
kit.MDB_INPUT, "button", "value", "返回", "cb", "Last",
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
)},
|
||||||
"order": {Name: "order", Help: "列表", Value: kit.Data("template", order)},
|
"order": {Name: "order", Help: "列表", Value: kit.Data("template", order)},
|
||||||
"table": {Name: "table", Help: "表格", Value: kit.Data("template", table)},
|
"table": {Name: "table", Help: "表格", Value: kit.Data("template", table)},
|
||||||
"stack": {Name: "stack", Help: "结构", Value: kit.Data("template", stack)},
|
"stack": {Name: "stack", Help: "结构", Value: kit.Data("template", stack)},
|
||||||
@ -209,6 +235,35 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
m.Option("output", output)
|
m.Option("output", output)
|
||||||
m.Render(m.Conf(cmd, "meta.template"))
|
m.Render(m.Conf(cmd, "meta.template"))
|
||||||
}},
|
}},
|
||||||
|
"field": {Name: "field name text", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
m.Option(kit.MDB_TYPE, cmd)
|
||||||
|
m.Option(kit.MDB_NAME, arg[0])
|
||||||
|
m.Option(kit.MDB_TEXT, arg[1])
|
||||||
|
|
||||||
|
if len(arg) > 2 {
|
||||||
|
if meta := m.Confv("field", kit.Keys("meta.some", arg[2])); meta != nil {
|
||||||
|
arg = arg[3:]
|
||||||
|
m.Option("meta", meta)
|
||||||
|
} else {
|
||||||
|
list := []string{}
|
||||||
|
for _, line := range kit.Split(strings.Join(arg[2:], " "), "\n") {
|
||||||
|
ls := kit.Split(line)
|
||||||
|
for i := 0; i < len(ls); i++ {
|
||||||
|
if strings.HasPrefix(ls[i], "#") {
|
||||||
|
ls = ls[:i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list = append(list, ls...)
|
||||||
|
}
|
||||||
|
|
||||||
|
meta := kit.Parse(nil, "", list...)
|
||||||
|
m.Option("meta", meta)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Render(m.Conf(cmd, "meta.template"))
|
||||||
|
}},
|
||||||
"order": {Name: "order name text", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
"order": {Name: "order name text", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
m.Option(kit.MDB_TYPE, cmd)
|
m.Option(kit.MDB_TYPE, cmd)
|
||||||
m.Option(kit.MDB_NAME, arg[0])
|
m.Option(kit.MDB_NAME, arg[0])
|
||||||
@ -306,12 +361,18 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
}},
|
}},
|
||||||
|
|
||||||
"word": {Name: "word", Help: "语言文字", Meta: kit.Dict("remote", "pod", "display", "wiki/word"), List: kit.List(
|
"word": {Name: "word", Help: "语言文字", Meta: kit.Dict("remote", "pod", "display", "wiki/word"), List: kit.List(
|
||||||
kit.MDB_INPUT, "text", "name", "name", "value", "自然/编程/hi.shy",
|
kit.MDB_INPUT, "text", "name", "path", "value", "自然/编程/hi.shy",
|
||||||
kit.MDB_INPUT, "button", "name", "执行", "action", "auto",
|
kit.MDB_INPUT, "button", "name", "执行", "action", "auto",
|
||||||
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
||||||
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if len(arg) > 0 && arg[0] == "action" {
|
if len(arg) > 0 && arg[0] == "action" {
|
||||||
switch arg[1] {
|
switch arg[1] {
|
||||||
|
case "story":
|
||||||
|
cmds := kit.Split(strings.Join(arg[4:], " "))
|
||||||
|
if m.Right(cmds) {
|
||||||
|
m.Cmdy(cmds)
|
||||||
|
}
|
||||||
|
return
|
||||||
case "追加":
|
case "追加":
|
||||||
if f, e := os.OpenFile(path.Join(m.Conf(cmd, "meta.path"), arg[2]), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666); m.Assert(e) {
|
if f, e := os.OpenFile(path.Join(m.Conf(cmd, "meta.path"), arg[2]), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666); m.Assert(e) {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
@ -344,17 +405,8 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 文件列表
|
if reply(m, cmd, arg...) {
|
||||||
m.Option("dir_root", m.Conf(cmd, "meta.path"))
|
|
||||||
m.Option("dir_reg", m.Conf(cmd, "meta.regs"))
|
|
||||||
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
|
||||||
m.Sort("time", "time_r")
|
|
||||||
|
|
||||||
if len(arg) == 0 || strings.HasSuffix(arg[0], "/") {
|
|
||||||
// 目录列表
|
// 目录列表
|
||||||
m.Option("dir_reg", "")
|
|
||||||
m.Option("dir_type", "dir")
|
|
||||||
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,17 +417,12 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
m.Optionv(ice.MSG_ALIAS, m.Confv("word", "meta.alias"))
|
m.Optionv(ice.MSG_ALIAS, m.Confv("word", "meta.alias"))
|
||||||
m.Set("result").Cmdy("ssh.scan", arg[0], arg[0], path.Join(m.Conf(cmd, "meta.path"), arg[0]))
|
m.Set("result").Cmdy("ssh.scan", arg[0], arg[0], path.Join(m.Conf(cmd, "meta.path"), arg[0]))
|
||||||
}},
|
}},
|
||||||
"data": {Name: "data", Help: "数据表格", Meta: kit.Dict("display", "wiki/data"), List: kit.List(
|
// "data": {Name: "data", Help: "数据表格", Meta: kit.Dict("display", "wiki/data"), List: kit.List(
|
||||||
kit.MDB_INPUT, "text", "name", "name",
|
"data": {Name: "data", Help: "数据表格", Meta: kit.Dict("display", "story/trend"), List: kit.List(
|
||||||
kit.MDB_INPUT, "button", "name", "执行",
|
kit.MDB_INPUT, "text", "name", "path",
|
||||||
|
kit.MDB_INPUT, "button", "name", "执行", "action", "auto",
|
||||||
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
||||||
kit.MDB_INPUT, "button", "name", "上传", "figure", "upload",
|
|
||||||
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if m.Option("_action") == "上传" {
|
|
||||||
web.Upload(m, path.Join(m.Conf(cmd, "meta.path"), kit.Select("", arg, 0)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(arg) > 0 && arg[0] == "action" {
|
if len(arg) > 0 && arg[0] == "action" {
|
||||||
switch arg[1] {
|
switch arg[1] {
|
||||||
case "保存":
|
case "保存":
|
||||||
@ -384,25 +431,17 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 文件列表
|
if reply(m, cmd, arg...) {
|
||||||
m.Option("dir_root", m.Conf(cmd, "meta.path"))
|
|
||||||
m.Option("dir_reg", m.Conf(cmd, "meta.regs"))
|
|
||||||
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
|
||||||
m.Sort("time", "time_r")
|
|
||||||
if len(arg) == 0 || strings.HasSuffix(arg[0], "/") {
|
|
||||||
// 目录列表
|
// 目录列表
|
||||||
m.Option("dir_reg", "")
|
|
||||||
m.Option("dir_type", "dir")
|
|
||||||
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 解析数据
|
||||||
m.CSV(m.Result())
|
m.CSV(m.Result())
|
||||||
}},
|
}},
|
||||||
"draw": {Name: "draw", Help: "思维导图", Meta: kit.Dict("display", "wiki/draw"), List: kit.List(
|
"draw": {Name: "draw", Help: "思维导图", Meta: kit.Dict("display", "wiki/draw"), List: kit.List(
|
||||||
kit.MDB_INPUT, "text", "name", "name", "value", "what/he.svg",
|
kit.MDB_INPUT, "text", "name", "path",
|
||||||
kit.MDB_INPUT, "button", "name", "执行", "action", "auto",
|
kit.MDB_INPUT, "button", "name", "执行", "action", "auto",
|
||||||
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
||||||
kit.MDB_INPUT, "button", "name", "上传", "cb", "upload",
|
|
||||||
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if len(arg) > 0 && arg[0] == "action" {
|
if len(arg) > 0 && arg[0] == "action" {
|
||||||
switch arg[1] {
|
switch arg[1] {
|
||||||
@ -412,18 +451,7 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 文件列表
|
reply(m, cmd, arg...)
|
||||||
m.Option("dir_root", m.Conf(cmd, "meta.path"))
|
|
||||||
m.Option("dir_reg", m.Conf(cmd, "meta.regs"))
|
|
||||||
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
|
||||||
m.Sort("time", "time_r")
|
|
||||||
|
|
||||||
if len(arg) == 0 || strings.HasSuffix(arg[0], "/") {
|
|
||||||
// 目录列表
|
|
||||||
m.Option("dir_reg", "")
|
|
||||||
m.Option("dir_type", "dir")
|
|
||||||
m.Cmdy("nfs.dir", kit.Select("./", arg, 0))
|
|
||||||
}
|
|
||||||
}},
|
}},
|
||||||
"feel": {Name: "feel", Help: "影音媒体", Meta: kit.Dict("display", "wiki/feel", "detail", []string{"标签", "删除"}), List: kit.List(
|
"feel": {Name: "feel", Help: "影音媒体", Meta: kit.Dict("display", "wiki/feel", "detail", []string{"标签", "删除"}), List: kit.List(
|
||||||
kit.MDB_INPUT, "text", "name", "name",
|
kit.MDB_INPUT, "text", "name", "name",
|
||||||
|
@ -244,6 +244,20 @@ var Index = &ice.Context{Name: "git", Help: "代码库",
|
|||||||
m.Push("rest", count_add-count_del)
|
m.Push("rest", count_add-count_del)
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
|
|
||||||
|
"trend": {Name: "check name [path [repos]]", Help: "检查", Meta: kit.Dict(
|
||||||
|
"display", "/plugin/story/trend",
|
||||||
|
), List: kit.List(
|
||||||
|
kit.MDB_INPUT, "text", "name", "repos", "action", "auto",
|
||||||
|
kit.MDB_INPUT, "text", "name", "begin_time", "figure", "date",
|
||||||
|
kit.MDB_INPUT, "button", "name", "执行", "action", "auto",
|
||||||
|
kit.MDB_INPUT, "button", "name", "返回", "cb", "Last",
|
||||||
|
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Option("_display", "table")
|
||||||
|
}
|
||||||
|
m.Cmdy("total", arg)
|
||||||
|
}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
18
type.go
18
type.go
@ -714,6 +714,19 @@ func (m *Message) Append(key string, arg ...interface{}) string {
|
|||||||
return kit.Select("", m.Appendv(key, arg...), 0)
|
return kit.Select("", m.Appendv(key, arg...), 0)
|
||||||
}
|
}
|
||||||
func (m *Message) Appendv(key string, arg ...interface{}) []string {
|
func (m *Message) Appendv(key string, arg ...interface{}) []string {
|
||||||
|
if key == "_index" {
|
||||||
|
max := 0
|
||||||
|
for _, k := range m.meta[MSG_APPEND] {
|
||||||
|
if len(m.meta[k]) > max {
|
||||||
|
max = len(m.meta[k])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
index := []string{}
|
||||||
|
for i := 0; i < max; i++ {
|
||||||
|
index = append(index, kit.Format(i))
|
||||||
|
}
|
||||||
|
return index
|
||||||
|
}
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
m.meta[key] = kit.Simple(arg...)
|
m.meta[key] = kit.Simple(arg...)
|
||||||
}
|
}
|
||||||
@ -1421,7 +1434,10 @@ func (m *Message) Cmd(arg ...interface{}) *Message {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
m.Warn(m.Hand == false, "not found %v", list)
|
if m.Warn(m.Hand == false, "not found %v", list) {
|
||||||
|
m.Cmdy(CLI_SYSTEM, list)
|
||||||
|
m.Hand = true
|
||||||
|
}
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
func (m *Message) Confv(arg ...interface{}) (val interface{}) {
|
func (m *Message) Confv(arg ...interface{}) (val interface{}) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user