From 66c702b91b10d41619c6fc20f679ad2bc336dc8d Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 24 Jun 2019 21:56:37 +0800 Subject: [PATCH] opt some --- src/contexts/cli/cli.go | 9 + src/contexts/ctx/init.go | 2 +- src/contexts/mdb/mdb.go | 6 + src/contexts/ssh/ssh.go | 32 +- src/contexts/web/web.go | 3 + usr/librarys/chat.js | 1061 +++++++++++++++--------------- usr/librarys/example.js | 1353 +++++++++++++++++++------------------- 7 files changed, 1252 insertions(+), 1214 deletions(-) diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index 74671801..3c082c0c 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -537,6 +537,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", } return }}, + "proc": &ctx.Command{Name: "proc", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + m.Cmdy("cli.system", "ps", kit.Select("ax", arg, 0)) + return + }}, "project": &ctx.Command{Name: "project", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { switch arg[0] { @@ -663,6 +667,11 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", m.Cmd("cli.publish") return } + if len(arg) > 1 && arg[0] == "script" { + m.Cmdy("web.get", "dev", fmt.Sprintf("publish/%s", arg[1]), + "upgrade", arg[0], "save", path.Join("usr/script", arg[1])) + return + } restart := false for _, link := range kit.View([]string{arg[0]}, m.Confm("upgrade")) { diff --git a/src/contexts/ctx/init.go b/src/contexts/ctx/init.go index 57e9a9f6..af762e07 100644 --- a/src/contexts/ctx/init.go +++ b/src/contexts/ctx/init.go @@ -100,7 +100,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, "page_limit": &Config{Name: "page_limit", Value: "10", Help: "列表大小"}, "time_format": &Config{Name: "time_format", Value: "2006-01-02 15:04:05", Help: "时间格式"}, - "call_timeout": &Config{Name: "call_timeout", Value: "10s", Help: "回调超时"}, + "call_timeout": &Config{Name: "call_timeout", Value: "100s", Help: "回调超时"}, }, Commands: map[string]*Command{ "_init": &Command{Name: "_init", Help: "启动", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) { diff --git a/src/contexts/mdb/mdb.go b/src/contexts/mdb/mdb.go index 3ec24226..060e5887 100644 --- a/src/contexts/mdb/mdb.go +++ b/src/contexts/mdb/mdb.go @@ -123,6 +123,12 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心", switch val := res.(type) { case redis.Error: m.Echo("%v", val) + case []interface{}: + for i, v := range val { + m.Add("append", "index", i) + m.Add("append", "value", v) + } + m.Table() default: m.Echo("%v", kit.Format(res)) } diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index 7fc2a4b3..b24d4c27 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -49,7 +49,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", map[string]interface{}{"componet_name": "status", "componet_help": "status", "componet_tmpl": "componet", "componet_view": "Company", "componet_init": "", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", - "componet_args": []interface{}{"$$", "gg"}, "inputs": []interface{}{ + "componet_args": []interface{}{"$$", "context", "cli", "system", "gg"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "pod", "imports": "plugin_pod"}, map[string]interface{}{"type": "select", "name": "sub", "values": []interface{}{"status", ""}}, map[string]interface{}{"type": "button", "value": "执行"}, @@ -58,7 +58,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", map[string]interface{}{"componet_name": "deploy", "componet_help": "deploy", "componet_tmpl": "componet", "componet_view": "Company", "componet_init": "", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", - "componet_args": []interface{}{"$$", "gg"}, "inputs": []interface{}{ + "componet_args": []interface{}{"$$", "context", "cli", "system", "gg"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "pod", "imports": "plugin_pod"}, map[string]interface{}{"type": "select", "name": "sub", "values": []interface{}{"deploygo", "deploy"}}, map[string]interface{}{"type": "text", "name": "sub", "imports": "plugin_dir"}, @@ -66,6 +66,15 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", map[string]interface{}{"type": "button", "value": "执行"}, }, }, + map[string]interface{}{"componet_name": "proc", "componet_help": "proc", + "componet_tmpl": "componet", "componet_view": "Company", "componet_init": "", + "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", + "componet_args": []interface{}{"$$", "context", "cli", "proc"}, "inputs": []interface{}{ + map[string]interface{}{"type": "text", "name": "pod", "value": "", "imports": "plugin_pod"}, + map[string]interface{}{"type": "text", "name": "cmd", "view": "long"}, + map[string]interface{}{"type": "button", "value": "执行"}, + }, + }, map[string]interface{}{"componet_name": "test", "componet_help": "test", "componet_tmpl": "componet", "componet_view": "Compile", "componet_init": "", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", @@ -80,18 +89,27 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", map[string]interface{}{"componet_name": "php", "componet_help": "php", "componet_tmpl": "componet", "componet_view": "Company", "componet_init": "", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", - "componet_args": []interface{}{"$$", "php", "cmd_parse", "format"}, "inputs": []interface{}{ + "componet_args": []interface{}{"$$", "context", "cli", "system", "php", "cmd_parse", "format"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "pod", "imports": "plugin_pod"}, map[string]interface{}{"type": "text", "name": "cmd", "value": "usr/script/test.php", "view": "long"}, map[string]interface{}{"type": "button", "value": "执行"}, }, }, + map[string]interface{}{"componet_name": "grep", "componet_help": "grep", + "componet_tmpl": "componet", "componet_view": "Company", "componet_init": "", + "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", + "componet_args": []interface{}{"$$", "context", "nfs", "grep"}, "inputs": []interface{}{ + map[string]interface{}{"type": "text", "name": "pod", "value": "", "imports": "plugin_pod"}, + map[string]interface{}{"type": "text", "name": "cmd", "view": "long"}, + map[string]interface{}{"type": "button", "value": "执行"}, + }, + }, map[string]interface{}{"componet_name": "redis", "componet_help": "redis", "componet_tmpl": "componet", "componet_view": "Company", "componet_init": "", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", "componet_args": []interface{}{"$$", "context", "mdb", "redis"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "pod", "value": "redis"}, - map[string]interface{}{"type": "select", "name": "cmd", "values": []interface{}{"get", "del"}}, + map[string]interface{}{"type": "select", "name": "cmd", "values": []interface{}{"get", "del", "hgetall"}}, map[string]interface{}{"type": "text", "name": "cmd", "value": "test", "view": "long"}, map[string]interface{}{"type": "button", "value": "执行"}, }, @@ -201,7 +219,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", "componet_tmpl": "componet", "componet_view": "Context", "componet_init": "", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", "componet_args": []interface{}{"$$", "context", "ssh", "remote"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "pod", "imports": "plugin_pod"}, + map[string]interface{}{"type": "text", "name": "pod"}, map[string]interface{}{"type": "button", "value": "执行"}, }, "exports": []interface{}{"pod", "key", "pod"}, @@ -256,11 +274,11 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", "componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route", "componet_args": []interface{}{"$$", "git"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "pod", "imports": "plugin_pod"}, - map[string]interface{}{"type": "text", "name": "dir", "imports": "plugin_dir"}, + map[string]interface{}{"type": "text", "name": "dir", "imports": "plugin_dir", "view": "long"}, map[string]interface{}{"type": "select", "name": "cmd", "values": []interface{}{ "commit", "add", "checkout", }}, - map[string]interface{}{"type": "text", "name": "commit"}, + map[string]interface{}{"type": "text", "name": "commit", "view": "long"}, map[string]interface{}{"type": "button", "value": "执行"}, }, }, diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 941e9a0c..eaddc9e3 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -1135,6 +1135,9 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", if p == "" { p = m.Cmdx("nfs.path", m.Conf("publish", []string{"list", key})) } + if s, e:= os.Stat(p); e != nil || s.IsDir() { + return + } m.Log("info", "publish %s %s", kit.Hashs(p), p) http.ServeFile(m.Optionv("response").(http.ResponseWriter), m.Optionv("request").(*http.Request), p) diff --git a/usr/librarys/chat.js b/usr/librarys/chat.js index 9e2ea838..3fc2200b 100644 --- a/usr/librarys/chat.js +++ b/usr/librarys/chat.js @@ -1,530 +1,531 @@ -Page({ - conf: {border: 4, layout: {header:30, river:180, action:180, source:60, storm:180, footer:30}}, - onlayout: function(event, sizes) { - var page = this - kit.isWindows && (document.body.style.overflow = "hidden") - - var height = document.body.clientHeight-page.conf.border - var width = document.body.clientWidth-page.conf.border - page.conf.height = height - page.conf.width = width - - sizes = sizes || {} - sizes.header == undefined && (sizes.header = page.header.clientHeight) - sizes.footer == undefined && (sizes.footer = page.footer.clientHeight) - page.header.Pane.Size(width, sizes.header) - page.footer.Pane.Size(width, sizes.footer) - - sizes.river == undefined && (sizes.river = page.river.clientWidth) - sizes.storm == undefined && (sizes.storm = page.storm.clientWidth) - height -= page.header.offsetHeight+page.footer.offsetHeight - page.river.Pane.Size(sizes.river, height) - page.storm.Pane.Size(sizes.storm, height) - - sizes.action == undefined && (sizes.action = page.action.clientHeight) - sizes.source == undefined && (sizes.source = page.source.clientHeight); - (sizes.action == -1 || sizes.source == 0) && (sizes.action = height, sizes.source = 0) - width -= page.river.offsetWidth+page.storm.offsetWidth - page.action.Pane.Size(width, sizes.action) - page.source.Pane.Size(width, sizes.source) - - height -= page.source.offsetHeight+page.action.offsetHeight - page.target.Pane.Size(width, height) - kit.History.add("lay", sizes) - }, - oncontrol: function(event, target, action) { - switch (action) { - case "control": - if (event.ctrlKey) { - switch (event.key) { - case "0": - page.source.Pane.Select() - break - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - case "9": - page.action.Pane.Select(parseInt(event.key)) - break - case "n": - page.ocean.Pane.Show() - break - case "m": - page.steam.Pane.Show() - break - case "i": - page.storm.Next() - break - case "o": - page.storm.Prev() - break - case "b": - page.action.Action["最大"](event) - - } - break - } else { - switch (event.key) { - case "Escape": - page.dialog && page.dialog.Pane.Show() - } - } - break - } - }, - - initOcean: function(page, field, option, output) { - var table = kit.AppendChild(output, "table") - var ui = kit.AppendChild(field, [{view: ["create ocean"], list: [ - {input: ["name", function(event) { - page.oninput(event, function(event) { - switch (event.key) { - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - var tr = table.querySelectorAll("tr.normal")[parseInt(event.key)-1] - tr && tr.childNodes[0].click() - return true - case "9": - field.Pane.Action["全选"](event) - return true - case "0": - field.Pane.Action["清空"](event) - return true - case "-": - var pre = ui.list.querySelector("pre") - pre && pre.click() - return true - case "=": - var td = table.querySelector("tr.normal td") - td && td.click() - return true - } - }) - event.key == "Enter" && this.nextSibling.click() - - }]}, {button: ["create", function(event) { - if (!ui.name.value) { - ui.name.focus() - return - } - - var cmd = ["spawn", "", ui.name.value] - ui.list.querySelectorAll("pre").forEach(function(item) { - cmd.push(item.innerText) - }) - if (cmd.length == 3) { - kit.alert("请添加组员") - return - } - - field.Pane.Run(cmd, function(msg) { - page.river.Pane.Show() - field.Pane.Show() - }) - }]}, {name: "list", view: ["list"]}, - ]}]) - - return { - Show: function() { - this.ShowDialog() && (table.innerHTML = "", ui.list.innerHTML = "", ui.name.value = "good", ui.name.focus(), this.Run([], function(msg) { - kit.AppendTable(table, ctx.Table(msg), ["key", "user.route"], function(value, key, row, i, tr, event) { - tr.className = "hidden" - var uis = kit.AppendChild(ui.list, [{text: [row.key], click: function(event) { - tr.className = "normal", uis.last.parentNode.removeChild(uis.last) - }}]) - }) - })) - }, - Action: { - "取消": function(event) { - field.Pane.Show() - }, - "全选": function(event) { - table.querySelectorAll("tr.normal").forEach(function(item) { - item.firstChild.click() - }) - }, - "清空": function(event) { - ui.list.querySelectorAll("pre").forEach(function(item) { - item.click() - }) - }, - }, - Button: ["取消", "全选", "清空"], - } - }, - initRiver: function(page, field, option, output) { - return { - Show: function() { - this.Update([], "text", ["name", "count"], "key", ctx.Search("river")||true) - }, - Action: { - "创建": function(event) { - page.ocean.Pane.Show() - }, - }, - Button: ["创建"], - } - }, - initTarget: function(page, field, option, output) { - var river = "" - var which = {} - output.DisplayUser = true - return { - Listen: { - river: function(value, old) { - field.Pane.Save(river, output) - river = value, field.Pane.Show() - }, - }, - Stop: function() { - return field.style.display == "none" - }, - Show: function(i) { - field.Pane.Back(river, output) - - var pane = this, foot = page.footer.Pane - var cmds = ["brow", river, i||which[river]||0] - cmds[2] || (output.innerHTML = ""), pane.Times(1000, cmds, function(line, index, msg) { - pane.Append("", line, ["text"], "index") - foot.State("text", which[river] = cmds[2] = parseInt(line.index)+1) - }) - }, - Send: function(type, text, cb) { - var pane = this - pane.Run(["flow", river, type, text], function(msg) { - pane.Show(), typeof cb == "function" && cb(msg) - }) - }, - } - }, - initSource: function(page, field, option, output) { - var ui = kit.AppendChild(field, [{"view": ["input", "textarea"], "data": {"onkeyup": function(event){ - page.oninput(event), kit.isSpace(event.key) && field.Pane.which.set(event.target.value) - event.key == "Enter" && !event.shiftKey && page.target.Pane.Send("text", event.target.value, field.Pane.Clear) - }, "onkeydown": function(event) { - event.key == "Enter" && !event.shiftKey && event.preventDefault() - }}}]) - - return { - Size: function(width, height) { - field.style.display = (width<=0 || height<=0)? "none": "block" - field.style.width = width+"px" - field.style.height = height+"px" - ui.first.style.width = (width-7)+"px" - ui.first.style.height = (height-7)+"px" - }, - Select: function() { - ui.first.focus() - }, - Clear: function(value) { - ui.first.value = "" - }, - } - }, - initAction: function(page, field, option, output) { - var river = "", storm = 0, input = "", share = "" - var toggle = true - - output.DisplayRaw = true - return { - Listen: { - river: function(value, old) { - river = value - }, - storm: function(value, old) { - field.Pane.Save(river+storm, output) - storm = value, field.Pane.Show() - }, - source: function(value, old) { - input = value, kit.Log(value) - }, - target: function(value, old) { - share = value, kit.Log(value) - }, - }, - Show: function() { - if (field.Pane.Back(river+storm, output)) { - return - } - - this.Update([river, storm], "plugin", ["node", "name"], "index", false, function(line, index, event, args, cbs) { - event.shiftKey? page.target.Send("field", JSON.stringify({ - name: line.name, help: line.help, view: line.view, init: line.init, - node: line.node, group: line.group, index: line.index, - inputs: line.inputs, args: args, - })): field.Pane.Run([river, storm, index].concat(args), function(msg) { - event.ctrlKey && (msg.append && msg.append[0]? - page.target.Send("table", JSON.stringify(ctx.Tables(msg))): - page.target.Send("code", msg.result.join(""))) - typeof cbs == "function" && cbs(msg) - }) - }) - }, - Layout: function(name) { - var layout = field.querySelector("select.layout") - name && this.Action[layout.value = name](null, layout.value) - return layout.value - }, - Action: { - "恢复": function(event, value) { - page.onlayout(event, page.conf.layout) - }, - "缩小": function(event, value) { - page.onlayout(event, {action:60, source:60}) - }, - "放大": function(event, value) { - page.onlayout(event, {action:300, source:60}) - }, - "最高": function(event, value) { - page.onlayout(event, {action: -1}) - }, - "最宽": function(event, value) { - page.onlayout(event, {river:0, storm:0}) - }, - "最大": function(event, value) { - (toggle = !toggle)? page.onlayout(event, page.conf.layout): page.onlayout(event, {river:0, action:-1, source:60}) - }, - "全屏": function(event, value) { - page.onlayout(event, {header:0, footer:0, river:0, action: -1, storm:0}) - }, - "添加": function(event, value) { - page.plugin && page.plugin.Plugin.Clone().Select() - }, - "删除": function(event, value) { - page.plugin && page.plugin.Clear() - }, - "加参": function(event, value) { - page.plugin.Append({}) - }, - "去参": function(event, value) { - page.input && page.plugin.Remove(page.input) - }, - "位置": function(event, value) { - page.getLocation(function(res) { - alert(res.latitude) - alert(res.longitude) - }) - }, - }, - Button: [["layout", "恢复", "缩小", "放大", "最高", "最宽", "最大", "全屏"], "br", "添加", "删除", "加参", "去参", "位置"], - } - }, - initStorm: function(page, field, option, output) { - var river = "" - return { - Listen: { - river: function(value, old) { - field.Pane.which.set(""), river = value, field.Pane.Show() - }, - }, - Show: function(which) { - this.Update([river], "text", ["key", "count"], "key", which||ctx.Search("storm")||true) - }, - Next: function() { - var next = output.querySelector("div.item.select").nextSibling - next? next.click(): output.firstChild.click() - }, - Prev: function() { - var prev = output.querySelector("div.item.select").previousSibling - prev? prev.click(): output.lastChild.click() - }, - Action: { - "创建": function(event) { - page.steam.Pane.Show() - }, - }, - Button: ["创建"], - } - }, - initSteam: function(page, field, option, output) { - var river = "" - var table = kit.AppendChild(output, "table") - var device = kit.AppendChild(field, [{"view": ["device", "table"]}]).last - var ui = kit.AppendChild(field, [{view: ["create steam"], list: [ - {input: ["name", function(event) { - page.oninput(event, function(event) { - switch (event.key) { - case "i": - var prev = table.querySelector("tr.select").previousSibling - prev && prev.childNodes[0].click() - return true - case "o": - var next = table.querySelector("tr.select").nextSibling - next && next.childNodes[0].click() - return true - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - var tr = device.querySelectorAll("tr.normal")[parseInt(event.key)-1] - tr && tr.childNodes[0].click() - return true - case "9": - field.Pane.Action["全选"](event) - return true - case "0": - field.Pane.Action["清空"](event) - return true - case "-": - var tr = ui.list.querySelectorAll("tr")[1] - tr && tr.childNodes[0].click() - return true - case "=": - var td = device.querySelector("tr.normal td") - td && td.click() - return true - } - }) - event.key == "Enter" && this.nextSibling.click() - }]}, {button: ["create", function(event) { - if (!ui.name.value) { - ui.name.focus() - return - } - - var cmd = [river, "spawn", ui.name.value] - ui.list.querySelectorAll("tr").forEach(function(item) { - cmd.push(item.dataset.pod) - cmd.push(item.dataset.group) - cmd.push(item.dataset.index) - cmd.push(item.dataset.name) - }) - - if (cmd.length == 4) { - kit.alert("请添加命令") - return - } - - field.Pane.Run(cmd, function(msg) { - field.Pane.Show() - page.storm.Pane.Show(ui.name.value) - }) - }]}, {name: "list", view: ["list", "table"]}, - ]}]) - - return { - Listen: { - river: function(value, old) { - river = value - }, - }, - Show: function() { - this.ShowDialog() && (table.innerHTML = "", ui.name.value = "nice", this.Run([river], function(msg) { - kit.AppendTable(table, ctx.Table(msg), ["key", "user.route"], function(value, key, pod, i, tr, event) { - var old = table.querySelector("tr.select") - tr.className = "select", old && (old.className = "normal"), field.Pane.Run([river, pod.key], function(msg) { - device.innerHTML = "", kit.AppendTable(device, ctx.Table(msg), ["key", "index", "name", "help"], function(value, key, com, i, tr, event) { - var last = kit.AppendChild(ui.list, [{type: "tr", list: [ - {text: [com.key, "td"]}, {text: [com.index, "td"]}, {text: [com.name, "td"]}, {text: [com.help, "td"]}, - ], dataset: {pod: pod["user.route"], group: com.key, index: com.index, name: com.name}, click: function(event) { - last.parentNode.removeChild(last) - }}]).last - }) - }) - }) - table.querySelector("td").click() - ui.name.focus() - })) - }, - Action: { - "取消": function(event) { - field.Pane.Show() - }, - "全选": function(event) { - ui.list.innerHTML = "", device.querySelectorAll("tr").forEach(function(item) { - item.firstChild.click() - }) - }, - "清空": function(event) { - ui.list.innerHTML = "" - }, - }, - Button: ["取消", "全选", "清空"], - } - }, - init: function(page) { - page.onlayout(null, page.conf.layout) - page.action.Pane.Layout(ctx.Search("layout")? ctx.Search("layout"): kit.isMobile? "最宽": "最大") - page.footer.Pane.Order({"site": "", "ip": "", "text": "", ":":""}, kit.isMobile? ["site", "ip", "text"]: ["ip", "text", ":"], function(event, item, value) {}) - page.header.Pane.Order({"logout": "logout", "user": ""}, ["logout", "user"], function(event, item, value) { - switch (item) { - case "title": - ctx.Search({"river": page.river.Pane.which.get(), "storm": page.storm.Pane.which.get(), "layout": page.action.Pane.Layout()}) - break - case "user": - var name = kit.prompt("new name") - name && page.login.Pane.Run(["rename", name], function(msg) { - page.header.Pane.State("user", name) - }) - break - case "logout": - kit.confirm("logout?") && page.login.Pane.Exit() - break - default: - } - }) - kit.isWeiXin && page.login.Pane.Run(["weixin"], function(msg) { - page.Include([ - "https://res.wx.qq.com/open/js/jweixin-1.4.0.js", - "/static/librarys/weixin.js", - ], function(event) { - wx.error(function(res){}) - wx.ready(function(){ - page.getLocation = function(cb) { - wx.getLocation({success: function (res) { - cb(res) - }}) - } - page.openLocation = function(latitude, longitude, name) { - wx.openLocation({latitude: parseFloat(latitude), longitude: parseFloat(longitude), name:name||"here"}) - } - - wx.getNetworkType({success: function (res) {}}) - wx.getLocation({success: function (res) { - page.footer.Pane.State("site", parseInt(res.latitude*10000)+","+parseInt(res.longitude*10000)) - }}) - }) - wx.config({ - appId: msg.appid[0], - timestamp: msg.timestamp[0], - nonceStr: msg.nonce[0], - signature: msg.signature[0], - jsApiList: [ - "scanQRCode", - "chooseImage", - "closeWindow", - "openAddress", - "getNetworkType", - "getLocation", - "openLocation", - ] - }) - }) - }) - page.login.Pane.Run([], function(msg) { - if (msg.result && msg.result[0]) { - page.header.Pane.State("user", msg.nickname[0]) - page.footer.Pane.State("ip", msg.remote_ip[0]) - page.river.Pane.Show() - return - } - page.login.Pane.ShowDialog(1, 1) - }) - }, -}) +Page({ + conf: {border: 4, layout: {header:30, river:180, action:180, source:60, storm:180, footer:30}}, + onlayout: function(event, sizes) { + var page = this + kit.isWindows && (document.body.style.overflow = "hidden") + + var height = document.body.clientHeight-page.conf.border + var width = document.body.clientWidth-page.conf.border + page.conf.height = height + page.conf.width = width + + sizes = sizes || {} + sizes.header == undefined && (sizes.header = page.header.clientHeight) + sizes.footer == undefined && (sizes.footer = page.footer.clientHeight) + page.header.Pane.Size(width, sizes.header) + page.footer.Pane.Size(width, sizes.footer) + + sizes.river == undefined && (sizes.river = page.river.clientWidth) + sizes.storm == undefined && (sizes.storm = page.storm.clientWidth) + height -= page.header.offsetHeight+page.footer.offsetHeight + page.river.Pane.Size(sizes.river, height) + page.storm.Pane.Size(sizes.storm, height) + + sizes.action == undefined && (sizes.action = page.action.clientHeight) + sizes.source == undefined && (sizes.source = page.source.clientHeight); + (sizes.action == -1 || sizes.source == 0) && (sizes.action = height, sizes.source = 0) + width -= page.river.offsetWidth+page.storm.offsetWidth + page.action.Pane.Size(width, sizes.action) + page.source.Pane.Size(width, sizes.source) + + height -= page.source.offsetHeight+page.action.offsetHeight + page.target.Pane.Size(width, height) + kit.History.add("lay", sizes) + }, + oncontrol: function(event, target, action) { + var page = this + switch (action) { + case "control": + if (event.ctrlKey) { + switch (event.key) { + case "0": + page.source.Pane.Select() + break + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + page.action.Pane.Select(parseInt(event.key)) + break + case "n": + page.ocean.Pane.Show() + break + case "m": + page.steam.Pane.Show() + break + case "i": + page.storm.Pane.Next() + break + case "o": + page.storm.Pane.Prev() + break + case "b": + page.action.Action["最大"](event) + + } + break + } else { + switch (event.key) { + case "Escape": + page.dialog && page.dialog.Pane.Show() + } + } + break + } + }, + + initOcean: function(page, field, option, output) { + var table = kit.AppendChild(output, "table") + var ui = kit.AppendChild(field, [{view: ["create ocean"], list: [ + {input: ["name", function(event) { + page.oninput(event, function(event) { + switch (event.key) { + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + var tr = table.querySelectorAll("tr.normal")[parseInt(event.key)-1] + tr && tr.childNodes[0].click() + return true + case "9": + field.Pane.Action["全选"](event) + return true + case "0": + field.Pane.Action["清空"](event) + return true + case "-": + var pre = ui.list.querySelector("pre") + pre && pre.click() + return true + case "=": + var td = table.querySelector("tr.normal td") + td && td.click() + return true + } + }) + event.key == "Enter" && this.nextSibling.click() + + }]}, {button: ["create", function(event) { + if (!ui.name.value) { + ui.name.focus() + return + } + + var cmd = ["spawn", "", ui.name.value] + ui.list.querySelectorAll("pre").forEach(function(item) { + cmd.push(item.innerText) + }) + if (cmd.length == 3) { + kit.alert("请添加组员") + return + } + + field.Pane.Run(cmd, function(msg) { + page.river.Pane.Show() + field.Pane.Show() + }) + }]}, {name: "list", view: ["list"]}, + ]}]) + + return { + Show: function() { + this.ShowDialog() && (table.innerHTML = "", ui.list.innerHTML = "", ui.name.value = "good", ui.name.focus(), this.Run([], function(msg) { + kit.AppendTable(table, ctx.Table(msg), ["key", "user.route"], function(value, key, row, i, tr, event) { + tr.className = "hidden" + var uis = kit.AppendChild(ui.list, [{text: [row.key], click: function(event) { + tr.className = "normal", uis.last.parentNode.removeChild(uis.last) + }}]) + }) + })) + }, + Action: { + "取消": function(event) { + field.Pane.Show() + }, + "全选": function(event) { + table.querySelectorAll("tr.normal").forEach(function(item) { + item.firstChild.click() + }) + }, + "清空": function(event) { + ui.list.querySelectorAll("pre").forEach(function(item) { + item.click() + }) + }, + }, + Button: ["取消", "全选", "清空"], + } + }, + initRiver: function(page, field, option, output) { + return { + Show: function() { + this.Update([], "text", ["name", "count"], "key", ctx.Search("river")||true) + }, + Action: { + "创建": function(event) { + page.ocean.Pane.Show() + }, + }, + Button: ["创建"], + } + }, + initTarget: function(page, field, option, output) { + var river = "" + var which = {} + output.DisplayUser = true + return { + Listen: { + river: function(value, old) { + field.Pane.Save(river, output) + river = value, field.Pane.Show() + }, + }, + Stop: function() { + return field.style.display == "none" + }, + Show: function(i) { + field.Pane.Back(river, output) + + var pane = this, foot = page.footer.Pane + var cmds = ["brow", river, i||which[river]||0] + cmds[2] || (output.innerHTML = ""), pane.Times(1000, cmds, function(line, index, msg) { + pane.Append("", line, ["text"], "index") + foot.State("text", which[river] = cmds[2] = parseInt(line.index)+1) + }) + }, + Send: function(type, text, cb) { + var pane = this + pane.Run(["flow", river, type, text], function(msg) { + pane.Show(), typeof cb == "function" && cb(msg) + }) + }, + } + }, + initSource: function(page, field, option, output) { + var ui = kit.AppendChild(field, [{"view": ["input", "textarea"], "data": {"onkeyup": function(event){ + page.oninput(event), kit.isSpace(event.key) && field.Pane.which.set(event.target.value) + event.key == "Enter" && !event.shiftKey && page.target.Pane.Send("text", event.target.value, field.Pane.Clear) + }, "onkeydown": function(event) { + event.key == "Enter" && !event.shiftKey && event.preventDefault() + }}}]) + + return { + Size: function(width, height) { + field.style.display = (width<=0 || height<=0)? "none": "block" + field.style.width = width+"px" + field.style.height = height+"px" + ui.first.style.width = (width-7)+"px" + ui.first.style.height = (height-7)+"px" + }, + Select: function() { + ui.first.focus() + }, + Clear: function(value) { + ui.first.value = "" + }, + } + }, + initAction: function(page, field, option, output) { + var river = "", storm = 0, input = "", share = "" + var toggle = true + + output.DisplayRaw = true + return { + Listen: { + river: function(value, old) { + river = value + }, + storm: function(value, old) { + field.Pane.Save(river+storm, output) + storm = value, field.Pane.Show() + }, + source: function(value, old) { + input = value, kit.Log(value) + }, + target: function(value, old) { + share = value, kit.Log(value) + }, + }, + Show: function() { + if (field.Pane.Back(river+storm, output)) { + return + } + + this.Update([river, storm], "plugin", ["node", "name"], "index", false, function(line, index, event, args, cbs) { + event.shiftKey? page.target.Send("field", JSON.stringify({ + name: line.name, help: line.help, view: line.view, init: line.init, + node: line.node, group: line.group, index: line.index, + inputs: line.inputs, args: args, + })): field.Pane.Run([river, storm, index].concat(args), function(msg) { + event.ctrlKey && (msg.append && msg.append[0]? + page.target.Send("table", JSON.stringify(ctx.Tables(msg))): + page.target.Send("code", msg.result.join(""))) + typeof cbs == "function" && cbs(msg) + }) + }) + }, + Layout: function(name) { + var layout = field.querySelector("select.layout") + name && this.Action[layout.value = name](null, layout.value) + return layout.value + }, + Action: { + "恢复": function(event, value) { + page.onlayout(event, page.conf.layout) + }, + "缩小": function(event, value) { + page.onlayout(event, {action:60, source:60}) + }, + "放大": function(event, value) { + page.onlayout(event, {action:300, source:60}) + }, + "最高": function(event, value) { + page.onlayout(event, {action: -1}) + }, + "最宽": function(event, value) { + page.onlayout(event, {river:0, storm:0}) + }, + "最大": function(event, value) { + (toggle = !toggle)? page.onlayout(event, page.conf.layout): page.onlayout(event, {river:0, action:-1, source:60}) + }, + "全屏": function(event, value) { + page.onlayout(event, {header:0, footer:0, river:0, action: -1, storm:0}) + }, + "添加": function(event, value) { + page.plugin && page.plugin.Plugin.Clone().Select() + }, + "删除": function(event, value) { + page.plugin && page.plugin.Clear() + }, + "加参": function(event, value) { + page.plugin.Append({}) + }, + "去参": function(event, value) { + page.input && page.plugin.Remove(page.input) + }, + "位置": function(event, value) { + page.getLocation(function(res) { + alert(res.latitude) + alert(res.longitude) + }) + }, + }, + Button: [["layout", "恢复", "缩小", "放大", "最高", "最宽", "最大", "全屏"], "br", "添加", "删除", "加参", "去参", "位置"], + } + }, + initStorm: function(page, field, option, output) { + var river = "" + return { + Listen: { + river: function(value, old) { + field.Pane.which.set(""), river = value, field.Pane.Show() + }, + }, + Show: function(which) { + this.Update([river], "text", ["key", "count"], "key", which||ctx.Search("storm")||true) + }, + Next: function() { + var next = output.querySelector("div.item.select").nextSibling + next? next.click(): output.firstChild.click() + }, + Prev: function() { + var prev = output.querySelector("div.item.select").previousSibling + prev? prev.click(): output.lastChild.click() + }, + Action: { + "创建": function(event) { + page.steam.Pane.Show() + }, + }, + Button: ["创建"], + } + }, + initSteam: function(page, field, option, output) { + var river = "" + var table = kit.AppendChild(output, "table") + var device = kit.AppendChild(field, [{"view": ["device", "table"]}]).last + var ui = kit.AppendChild(field, [{view: ["create steam"], list: [ + {input: ["name", function(event) { + page.oninput(event, function(event) { + switch (event.key) { + case "i": + var prev = table.querySelector("tr.select").previousSibling + prev && prev.childNodes[0].click() + return true + case "o": + var next = table.querySelector("tr.select").nextSibling + next && next.childNodes[0].click() + return true + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + var tr = device.querySelectorAll("tr.normal")[parseInt(event.key)-1] + tr && tr.childNodes[0].click() + return true + case "9": + field.Pane.Action["全选"](event) + return true + case "0": + field.Pane.Action["清空"](event) + return true + case "-": + var tr = ui.list.querySelectorAll("tr")[1] + tr && tr.childNodes[0].click() + return true + case "=": + var td = device.querySelector("tr.normal td") + td && td.click() + return true + } + }) + event.key == "Enter" && this.nextSibling.click() + }]}, {button: ["create", function(event) { + if (!ui.name.value) { + ui.name.focus() + return + } + + var cmd = [river, "spawn", ui.name.value] + ui.list.querySelectorAll("tr").forEach(function(item) { + cmd.push(item.dataset.pod) + cmd.push(item.dataset.group) + cmd.push(item.dataset.index) + cmd.push(item.dataset.name) + }) + + if (cmd.length == 4) { + kit.alert("请添加命令") + return + } + + field.Pane.Run(cmd, function(msg) { + field.Pane.Show() + page.storm.Pane.Show(ui.name.value) + }) + }]}, {name: "list", view: ["list", "table"]}, + ]}]) + + return { + Listen: { + river: function(value, old) { + river = value + }, + }, + Show: function() { + this.ShowDialog() && (table.innerHTML = "", ui.name.value = "nice", this.Run([river], function(msg) { + kit.AppendTable(table, ctx.Table(msg), ["key", "user.route"], function(value, key, pod, i, tr, event) { + var old = table.querySelector("tr.select") + tr.className = "select", old && (old.className = "normal"), field.Pane.Run([river, pod.key], function(msg) { + device.innerHTML = "", kit.AppendTable(device, ctx.Table(msg), ["key", "index", "name", "help"], function(value, key, com, i, tr, event) { + var last = kit.AppendChild(ui.list, [{type: "tr", list: [ + {text: [com.key, "td"]}, {text: [com.index, "td"]}, {text: [com.name, "td"]}, {text: [com.help, "td"]}, + ], dataset: {pod: pod["user.route"], group: com.key, index: com.index, name: com.name}, click: function(event) { + last.parentNode.removeChild(last) + }}]).last + }) + }) + }) + table.querySelector("td").click() + ui.name.focus() + })) + }, + Action: { + "取消": function(event) { + field.Pane.Show() + }, + "全选": function(event) { + ui.list.innerHTML = "", device.querySelectorAll("tr").forEach(function(item) { + item.firstChild.click() + }) + }, + "清空": function(event) { + ui.list.innerHTML = "" + }, + }, + Button: ["取消", "全选", "清空"], + } + }, + init: function(page) { + page.onlayout(null, page.conf.layout) + page.action.Pane.Layout(ctx.Search("layout")? ctx.Search("layout"): kit.isMobile? "最宽": "最大") + page.footer.Pane.Order({"site": "", "ip": "", "text": "", ":":""}, kit.isMobile? ["site", "ip", "text"]: ["ip", "text", ":"], function(event, item, value) {}) + page.header.Pane.Order({"logout": "logout", "user": ""}, ["logout", "user"], function(event, item, value) { + switch (item) { + case "title": + ctx.Search({"river": page.river.Pane.which.get(), "storm": page.storm.Pane.which.get(), "layout": page.action.Pane.Layout()}) + break + case "user": + var name = kit.prompt("new name") + name && page.login.Pane.Run(["rename", name], function(msg) { + page.header.Pane.State("user", name) + }) + break + case "logout": + kit.confirm("logout?") && page.login.Pane.Exit() + break + default: + } + }) + kit.isWeiXin && page.login.Pane.Run(["weixin"], function(msg) { + page.Include([ + "https://res.wx.qq.com/open/js/jweixin-1.4.0.js", + "/static/librarys/weixin.js", + ], function(event) { + wx.error(function(res){}) + wx.ready(function(){ + page.getLocation = function(cb) { + wx.getLocation({success: function (res) { + cb(res) + }}) + } + page.openLocation = function(latitude, longitude, name) { + wx.openLocation({latitude: parseFloat(latitude), longitude: parseFloat(longitude), name:name||"here"}) + } + + wx.getNetworkType({success: function (res) {}}) + wx.getLocation({success: function (res) { + page.footer.Pane.State("site", parseInt(res.latitude*10000)+","+parseInt(res.longitude*10000)) + }}) + }) + wx.config({ + appId: msg.appid[0], + timestamp: msg.timestamp[0], + nonceStr: msg.nonce[0], + signature: msg.signature[0], + jsApiList: [ + "scanQRCode", + "chooseImage", + "closeWindow", + "openAddress", + "getNetworkType", + "getLocation", + "openLocation", + ] + }) + }) + }) + page.login.Pane.Run([], function(msg) { + if (msg.result && msg.result[0]) { + page.header.Pane.State("user", msg.nickname[0]) + page.footer.Pane.State("ip", msg.remote_ip[0]) + page.river.Pane.Show() + return + } + page.login.Pane.ShowDialog(1, 1) + }) + }, +}) diff --git a/usr/librarys/example.js b/usr/librarys/example.js index 2757ec35..3e646cd7 100644 --- a/usr/librarys/example.js +++ b/usr/librarys/example.js @@ -1,676 +1,677 @@ -function Page(page) { - var id = 1 - var conf = {}, conf_cb = {} - var sync = {} - page.__proto__ = { - __proto__: kit, - ID: function() { - return id++ - }, - Conf: function(key, value, cb) { - if (key == undefined) { - return conf - } - if (cb != undefined) { - conf_cb[key] = cb - } - if (value != undefined) { - var old = conf[key] - conf[key] = value - conf_cb[key] && conf_cb[key](value, old) - } - return conf[key] - }, - Sync: function(m) { - var meta = m, data = "", list = [] - return sync[m] || (sync[m] = { - change: function(cb) { - list.push(cb) - return list.length-1 - }, - eq: function(value) { - return data == value - }, - neq: function(value) { - return data != value - }, - get: function() { - return data - }, - set: function(value, force) { - if (value == undefined) { - return - } - if (value == data && !force) { - return value - } - old_value = data, data = value - meta && kit.Log(meta, value, old_value) - for (var i = 0; i < list.length; i++) { - list[i](value, old_value) - } - return value - }, - }) - }, - View: function(parent, type, line, key, cb) { - var text = line, list = [], ui = {} - switch (type) { - case "icon": - list.push({img: [line[key[0]], function(event) { - // event.target.scrollIntoView() - }]}) - break - - case "text": - list.push({text: [key.length>1? line[key[0]]+"("+line[key[1]]+")": - (key.length>0? line[key[0]]: "null"), "span"], click: cb}) - break - - case "code": - list.push({view: ["code", key.length>1? line[key[0]]+"("+line[key[1]]+")": - (key.length>0? line[key[0]]: "null")], click: cb}) - break - - case "table": - list.push({type: "table", list: JSON.parse(line.text || "[]").map(function(item, index) { - return {type: "tr", list: item.map(function(value) { - return {text: [value, index == 0? "th": "td"]} - })} - })}) - break - - case "field": - var text = JSON.parse(line.text) - - case "plugin": - var id = "plugin"+page.ID() - list.push({view: [text.view+" item", "fieldset", "", "field"], data: {id: id, Run: cb}, list: [ - {text: [text.name+"("+text.help+")", "legend"]}, - {view: ["option", "form", "", "option"], list: [{type: "input", style: {"display": "none"}}]}, - {view: ["output", "div", "", "output"]}, - {script: ""+id+".Script="+(text.init||"{}")}, - ]}) - break - } - - parent.DisplayUser && (list = [{view: ["user", "div", line.create_nick||line.create_user]}, {view: ["text"], list:list}]) - !parent.DisplayRaw && (list = [{view: ["item"], list:list}]) - ui = kit.AppendChild(parent, list) - ui.field && (ui.field.Meta = text) - return ui - }, - Include: function(src, cb) { - kit.AppendChild(document.body, [{include: [src[0], function(event) { - src.length == 1? cb(event): page.Include(src.slice(1), cb) - }]}]) - }, - ontoast: function(text, title, duration) { - var args = typeof text == "object"? text: {text: text, title: title, duration: duration} - var toast = kit.ModifyView("fieldset.toast", { - display: "block", dialog: [args.width||200, args.height||40], padding: 10, - }) - - var list = [{text: [args.text||""]}] - args.inputs && args.inputs.forEach(function(input) { - if (typeof input == "string") { - list.push({inner: input, type: "label", style: {"margin-right": "5px"}}) - list.push({input: [input, page.oninput]}) - } else { - list.push({inner: input[0], type: "label", style: {"margin-right": "5px"}}) - var option = [] - for (var i = 1; i < input.length; i++) { - option.push({type: "option", inner: input[i]}) - } - list.push({name: input[0], type: "select", list: option}) - } - list.push({type: "br"}) - }) - args.button && args.button.forEach(function(input) { - list.push({type: "button", inner: input, click: function(event) { - var values = {} - toast.querySelectorAll("input").forEach(function(input) { - values[input.name] = input.value - }) - toast.querySelectorAll("select").forEach(function(input) { - values[input.name] = input.value - }) - typeof args.cb == "function" && args.cb(input, values) - toast.style.display = "none" - }}) - }) - - kit.ModifyNode(toast.querySelector("legend"), args.title||"tips") - var ui = kit.AppendChild(kit.ModifyNode(toast.querySelector("div.output"), ""), list) - args.duration !=- 1 && setTimeout(function(){toast.style.display = "none"}, args.duration||3000) - page.toast = toast - }, - oninput: function(event, local) { - var target = event.target - kit.History.add("key", (event.ctrlKey? "Control+": "")+(event.shiftKey? "Shift+": "")+event.key) - - if (event.ctrlKey) { - if (typeof local == "function" && local(event)) { - event.stopPropagation() - event.preventDefault() - return true - } - switch (event.key) { - case "a": - case "e": - case "f": - case "b": - case "h": - case "d": - break - case "k": - kit.DelText(target, target.selectionStart) - break - case "u": - kit.DelText(target, 0, target.selectionEnd) - break - case "w": - var start = target.selectionStart-2 - var end = target.selectionEnd-1 - for (var i = start; i >= 0; i--) { - if (target.value[end] == " " && target.value[i] != " ") { - break - } - if (target.value[end] != " " && target.value[i] == " ") { - break - } - } - kit.DelText(target, i+1, end-i) - break - default: - return false - - } - event.stopPropagation() - return true - } - switch (event.key) { - case "Escape": - target.blur() - event.stopPropagation() - return true - default: - if (kit.HitText(target, "jk")) { - kit.DelText(target, target.selectionStart-2, 2) - target.blur() - event.stopPropagation() - return true - } - } - return false - }, - onscroll: function(event, target, action) { - switch (event.key) { - case "h": - if (event.ctrlKey) { - target.scrollBy(-conf.scroll_x*10, 0) - } else { - target.scrollBy(-conf.scroll_x, 0) - } - break - case "H": - target.scrollBy(-document.body.scrollWidth, 0) - break - case "l": - if (event.ctrlKey) { - target.scrollBy(conf.scroll_x*10, 0) - } else { - target.scrollBy(conf.scroll_x, 0) - } - break - case "L": - target.scrollBy(document.body.scrollWidth, 0) - break - case "j": - if (event.ctrlKey) { - target.scrollBy(0, conf.scroll_y*10) - } else { - target.scrollBy(0, conf.scroll_y) - } - break - case "J": - target.scrollBy(0, document.body.scrollHeight) - break - case "k": - if (event.ctrlKey) { - target.scrollBy(0, -conf.scroll_y*10) - } else { - target.scrollBy(0, -conf.scroll_y) - } - break - case "K": - target.scrollBy(0, -document.body.scrollHeight) - break - } - }, - - initHeader: function(page, field, option, output) { - var state = {}, list = [], cb = function(event, item, value) {} - field.onclick = function(event) { - page.pane && page.pane.scrollTo(0,0) - } - return { - Order: function(value, order, cbs) { - state = value, list = order, cb = cbs || cb, this.Show() - }, - Show: function() { - output.innerHTML = "", kit.AppendChild(output, [ - {"view": ["title", "div", "shycontext"], click: function(event) { - cb(event, "title", "shycontext") - }}, - {"view": ["state"], list: list.map(function(item) {return {text: [state[item], "div"], click: function(event) { - cb(event, item, state[item]) - }}})}, - ]) - }, - State: function(name, value) { - if (value != undefined) { - state[name] = value, this.Show() - } - if (name != undefined) { - return state[name] - } - return state - }, - } - }, - initFooter: function(page, field, option, output) { - var state = {}, list = [], cb = function(event, item, value) {} - field.onclick = function(event) { - page.pane.scrollTo(0,page.pane.scrollHeight) - } - return { - Order: function(value, order, cbs) { - state = value, list = order, cb = cbs || cb, this.Show() - }, - Show: function() { - output.innerHTML = "", kit.AppendChild(output, [ - {"view": ["title", "div", "shylinux@163.com"]}, - {"view": ["state"], list: list.map(function(item) {return {text: [item+":"+state[item], "div"], click: function(item) { - cb(event, item, state[item]) - }}})}, - ]) - }, - State: function(name, value) { - if (value != undefined) { - state[name] = value, this.Show() - } - if (name != undefined) { - return state[name] - } - return state - }, - } - }, - initLogin: function(page, field, option, output) { - var ui = kit.AppendChild(option, [ - {label: "username"}, {input: ["username"]}, {type: "br"}, - {label: "password"}, {password: ["password"]}, {type: "br"}, - {button: ["login", function(event) { - if (!ui.username.value) { - ui.username.focus() - return - } - if (!ui.password.value) { - ui.password.focus() - return - } - field.Pane.Run([ui.username.value, ui.password.value], function(msg) { - if (msg.result && msg.result[0]) { - field.Pane.ShowDialog(1, 1) - ctx.Cookie("sessid", msg.result[0]) - kit.reload() - return - } - kit.alert("用户或密码错误") - }) - }]}, - {button: ["scan", function(event) { - scan(event, function(text) { - kit.alert(text) - }) - }]}, - {type: "br"}, - {type: "img", data: {"src": "/chat/qrcode?text=hi"}} - ]) - return { - Exit: function() { - ctx.Cookie("sessid", "") - kit.reload() - - }, - } - }, - Pane: Pane, - } - window.onload = function() { - document.querySelectorAll("body>fieldset").forEach(function(field) { - page.Pane(page, field) - }) - page.init(page) - window.onresize = function(event) { - page.onlayout && page.onlayout(event) - } - document.body.onkeydown = function(event) { - page.onscroll && page.onscroll(event, window, "scroll") - } - document.body.onkeyup = function(event) { - page.oncontrol && page.oncontrol(event, document.body, "control") - } - } - return page -} -function Pane(page, field) { - var option = field.querySelector("form.option") - var action = field.querySelector("div.action") - var output = field.querySelector("div.output") - - var cache = [] - var timer = "" - var list = [], last = -1 - var name = option.dataset.componet_name - var pane = (page[field.dataset.init] || function() { - })(page, field, option, output) || {}; pane.__proto__ = { - __proto__: page, - ShowDialog: function(width, height) { - if (field.style.display != "block") { - page.dialog && page.dialog != field && page.dialog.style.display == "block" && page.dialog.Show() - page.dialog = field, field.style.display = "block", kit.ModifyView(field, {window: [width||80, height||200]}) - return true - } - field.style.display = "none" - delete(page.dialog) - return false - }, - Size: function(width, height) { - field.style.display = (width<=0 || height<=0)? "none": "block" - field.style.width = width+"px" - field.style.height = height+"px" - }, - View: function(parent, type, line, key, cb) { - var ui = page.View(parent, type, line, key, cb) - if (type == "plugin" || type == "field") { - pane.Plugin(page, pane, ui.field) - } - return ui - }, - Run: function(cmds, cb) { - ctx.Run(page, option.dataset, cmds, cb||this.ondaemon) - }, - Runs: function(cmds, cb) { - ctx.Run(page, option.dataset, cmds, function(msg) { - ctx.Table(msg, function(line, index) { - (cb||this.ondaemon)(line, index, msg) - }) - }) - }, - Time: function(time, cmds, cb) { - function loop() { - ctx.Run(page, option.dataset, cmds, cb) - setTimeout(loop, time) - } - setTimeout(loop, time) - }, - Times: function(time, cmds, cb) { - timer && clearTimeout(timer) - function loop() { - !pane.Stop() && ctx.Run(page, option.dataset, cmds, function(msg) { - ctx.Table(msg, function(line, index) { - cb(line, index, msg) - }) - }) - timer = setTimeout(loop, time) - } - time && (timer = setTimeout(loop, 10)) - }, - - Clear: function() { - output.innerHTML = "", list = [], last = -1 - }, - Select: function(index) { - -1 < last && last < list.length && (list[last].className = "item") - last = index, list[index] && (list[index].className = "item select") - }, - Append: function(type, line, key, which, cb) { - var index = list.length, ui = pane.View(output, line.type || type, line, key, function(event, cmds, cbs) { - pane.Select(index), pane.which.set(line[which]) - typeof cb == "function" && cb(line, index, event, cmds, cbs) - }) - list.push(ui.last), field.scrollBy(0, field.scrollHeight+100) - return ui - }, - Update: function(cmds, type, key, which, first, cb) { - pane.Clear(), pane.Runs(cmds, function(line, index, msg) { - var ui = pane.Append(type, line, key, which, cb) - if (typeof first == "string") { - (line.key == first || line.name == first || line[which] == first) && ui.first.click() - } else { - first && index == 0 && ui.first.click() - } - }) - }, - Share: function(objs) { - objs = objs || {} - objs.componet_name = option.dataset.componet_name - objs.componet_group = option.dataset.componet_group - return ctx.Share(objs) - }, - Save: function(name, output) { - var temp = document.createDocumentFragment() - while (output.childNodes.length>0) { - var item = output.childNodes[0] - item.parentNode.removeChild(item) - temp.appendChild(item) - } - cache[name] = temp - return name - }, - Back: function(name, output) { - if (!cache[name]) { - return - } - while (cache[name].childNodes.length>0) { - item = cache[name].childNodes[0] - item.parentNode.removeChild(item) - output.appendChild(item) - } - delete(cache[name]) - return name - }, - which: page.Sync(name), Listen: {}, - Action: {}, Button: [], Plugin: Plugin, - } - - for (var k in pane.Listen) { - page.Sync(k).change(pane.Listen[k]) - } - kit.InsertChild(field, output, "div", pane.Button.map(function(value) { - return typeof value == "object"? {className: value[0], select: [value.slice(1), function(event) { - value = event.target.value - typeof pane.Action == "function"? pane.Action(value, event): pane.Action[value](event, value) - }]}: value == "br"? {"type": "br"}: {"button": [value, function(event) { - typeof pane.Action == "function"? pane.Action(value, event): pane.Action[value](event, value) - }]} - })).className="action "+name - option.onsubmit = function(event) { - event.preventDefault() - }; - return page[name] = field, pane.Field = field, field.Pane = pane -} -function Plugin(page, pane, field) { - var option = field.querySelector("form.option") - var output = field.querySelector("div.output") - - var count = 0 - var wait = false - var plugin = field.Script || {}; plugin.__proto__ = { - __proto__: pane, - Append: function(item, name) { - name = name || item.name - - item.onfocus = function(event) { - page.pane = pane.Field, page.plugin = field, page.input = event.target - } - item.onkeyup = function(event) { - page.oninput(event, function(event) { - switch (event.key) { - case "p": - action.Back() - break - case "i": - var next = field.nextSibling; - next && next.Plugin.Select() - break - case "o": - var prev = field.previousSibling; - prev && prev.Plugin.Select() - break - case "c": - output.innerHTML = "" - break - case "r": - output.innerHTML = "" - case "j": - plugin.Runs(event) - break - case "l": - page.action.scrollTo(0, field.offsetTop) - break - case "b": - plugin.Append(item).focus() - break - case "m": - plugin.Clone().Plugin.Select() - break - default: - return false - } - event.stopPropagation() - return true - }) - event.key == "Enter" && plugin.Check(action) - } - - var input = {type: "input", name: name, data: item} - switch (item.type) { - case "button": - item.onclick = function(event) { - action[item.click]? action[item.click](event, item, option, field): - plugin[item.click]? plugin[item.click](event, item, option, field): plugin.Runs(event) - } - break - - case "select": - input.type = "select", input.list = item.values.map(function(value) { - return {type: "option", value: value, inner: value} - }), item.onchange = function(event) { - plugin.Check(action) - } - - default: - args && count < args.length && (item.value = args[count++]||item.value||"") - item.className = "args" - } - - var ui = kit.AppendChild(option, [{view: [item.view||""], list: [{type: "label", inner: item.label||""}, input]}]) - var action = ui[name] || {} - - action.History = [""], action.Goto = function(value) { - action.History.push(action.value = value) - plugin.Check(action) - return value - }, action.Back = function() { - action.History.pop(), action.History.length > 0 && action.Goto(action.History.pop()) - }; - - (typeof item.imports == "object"? item.imports: typeof item.imports == "string"? [item.imports]: []).forEach(function(imports) { - page.Sync(imports).change(action.Goto) - }) - return action - }, - Select: function() { - option.querySelectorAll("input")[1].focus() - }, - Format: function() { - arguments.length > 0 && (field.Meta.args = kit.List(arguments)) - return JSON.stringify(field.Meta) - }, - Remove: function() { - field.parentNode.removeChild(field) - }, - Clone: function() { - field.Meta.args = kit.Selector(option, "input.args", function(item, index) { - return item.value - }) - return pane.View(field.parentNode, "plugin", field.Meta, [], field.Run).field.Plugin - }, - Check: function(target) { - option.querySelectorAll(".args").forEach(function(item, index, list) { - item == target && (index == list.length-1? plugin.Runs(event): page.plugin == field && list[index+1].focus()) - }) - }, - Runs: function(event) { - field.Run(event, kit.Selector(option, ".args", function(item, index) { - return item.value - }), plugin.ondaemon) - }, - Location: function(event) { - output.className = "output long" - page.getLocation(function(res) { - field.Run(event, [parseInt(res.latitude*1000000+1400)/1000000.0, parseInt(res.longitude*1000000+6250)/1000000.0].concat( - kit.Selector(option, ".args", function(item) {return item.value})) - , plugin.ondaemon) - }) - }, - - Clear: function() { - output.innerHTML = "" - }, - ondaemon: function(msg) { - output.innerHTML = "" - if (display.map) { - kit.AppendChild(output, [{img: ["https://gss0.bdstatic.com/8bo_dTSlRMgBo1vgoIiO_jowehsv/tile/?qt=vtile&x=25310&y=9426&z=17&styles=pl&scaler=2&udt=20190622"]}]) - return - } - output.innerHTML = "" - !display.hide_append && msg.append && kit.OrderTable(kit.AppendTable(kit.AppendChild(output, "table"), ctx.Table(msg), msg.append), exports[1], function(event, value, name, line) { - if (line["latitude"]) { - page.openLocation(line.latitude, line.longitude, line.location) - } - page.Sync("plugin_"+exports[0]).set(plugin.onexport[exports[2]||""](value, name)) - }); - (display.show_result || !msg.append) && msg.result && kit.AppendChild(output, [{view: ["code", "div", msg.Results()]}]) - }, - onexport: { - "": function(value, name) { - return value - }, - "pod": function(value, name) { - if (option[exports[0]].value) { - return option[exports[0]].value+"."+value - } - return value - }, - "dir": function(value, name) { - if (value.endsWith("/")) { - return option[exports[0]] + value - } - }, - }, - init: function() {}, - } - - var meta = field.Meta - var args = meta.args || [] - var display = JSON.parse(meta.display||'{}') - var exports = JSON.parse(meta.exports||'["",""]') - JSON.parse(meta.inputs || "[]").map(plugin.Append) - - plugin.init(page, pane, field, option, output) - return page[field.id] = pane[field.id] = plugin.Field = field, field.Plugin = plugin -} +function Page(page) { + var id = 1 + var conf = {}, conf_cb = {} + var sync = {} + page.__proto__ = { + __proto__: kit, + ID: function() { + return id++ + }, + Conf: function(key, value, cb) { + if (key == undefined) { + return conf + } + if (cb != undefined) { + conf_cb[key] = cb + } + if (value != undefined) { + var old = conf[key] + conf[key] = value + conf_cb[key] && conf_cb[key](value, old) + } + return conf[key] + }, + Sync: function(m) { + var meta = m, data = "", list = [] + return sync[m] || (sync[m] = { + change: function(cb) { + list.push(cb) + return list.length-1 + }, + eq: function(value) { + return data == value + }, + neq: function(value) { + return data != value + }, + get: function() { + return data + }, + set: function(value, force) { + if (value == undefined) { + return + } + if (value == data && !force) { + return value + } + old_value = data, data = value + meta && kit.Log(meta, value, old_value) + for (var i = 0; i < list.length; i++) { + list[i](value, old_value) + } + return value + }, + }) + }, + View: function(parent, type, line, key, cb) { + var text = line, list = [], ui = {} + switch (type) { + case "icon": + list.push({img: [line[key[0]], function(event) { + // event.target.scrollIntoView() + }]}) + break + + case "text": + list.push({text: [key.length>1? line[key[0]]+"("+line[key[1]]+")": + (key.length>0? line[key[0]]: "null"), "span"], click: cb}) + break + + case "code": + list.push({view: ["code", key.length>1? line[key[0]]+"("+line[key[1]]+")": + (key.length>0? line[key[0]]: "null")], click: cb}) + break + + case "table": + list.push({type: "table", list: JSON.parse(line.text || "[]").map(function(item, index) { + return {type: "tr", list: item.map(function(value) { + return {text: [value, index == 0? "th": "td"]} + })} + })}) + break + + case "field": + var text = JSON.parse(line.text) + + case "plugin": + var id = "plugin"+page.ID() + list.push({view: [text.view+" item", "fieldset", "", "field"], data: {id: id, Run: cb}, list: [ + {text: [text.name+"("+text.help+")", "legend"]}, + {view: ["option", "form", "", "option"], list: [{type: "input", style: {"display": "none"}}]}, + {view: ["output", "div", "", "output"]}, + {script: ""+id+".Script="+(text.init||"{}")}, + ]}) + break + } + + parent.DisplayUser && (list = [{view: ["user", "div", line.create_nick||line.create_user]}, {view: ["text"], list:list}]) + !parent.DisplayRaw && (list = [{view: ["item"], list:list}]) + ui = kit.AppendChild(parent, list) + ui.field && (ui.field.Meta = text) + return ui + }, + Include: function(src, cb) { + kit.AppendChild(document.body, [{include: [src[0], function(event) { + src.length == 1? cb(event): page.Include(src.slice(1), cb) + }]}]) + }, + ontoast: function(text, title, duration) { + var args = typeof text == "object"? text: {text: text, title: title, duration: duration} + var toast = kit.ModifyView("fieldset.toast", { + display: "block", dialog: [args.width||200, args.height||40], padding: 10, + }) + + var list = [{text: [args.text||""]}] + args.inputs && args.inputs.forEach(function(input) { + if (typeof input == "string") { + list.push({inner: input, type: "label", style: {"margin-right": "5px"}}) + list.push({input: [input, page.oninput]}) + } else { + list.push({inner: input[0], type: "label", style: {"margin-right": "5px"}}) + var option = [] + for (var i = 1; i < input.length; i++) { + option.push({type: "option", inner: input[i]}) + } + list.push({name: input[0], type: "select", list: option}) + } + list.push({type: "br"}) + }) + args.button && args.button.forEach(function(input) { + list.push({type: "button", inner: input, click: function(event) { + var values = {} + toast.querySelectorAll("input").forEach(function(input) { + values[input.name] = input.value + }) + toast.querySelectorAll("select").forEach(function(input) { + values[input.name] = input.value + }) + typeof args.cb == "function" && args.cb(input, values) + toast.style.display = "none" + }}) + }) + + kit.ModifyNode(toast.querySelector("legend"), args.title||"tips") + var ui = kit.AppendChild(kit.ModifyNode(toast.querySelector("div.output"), ""), list) + args.duration !=- 1 && setTimeout(function(){toast.style.display = "none"}, args.duration||3000) + page.toast = toast + }, + oninput: function(event, local) { + var target = event.target + kit.History.add("key", (event.ctrlKey? "Control+": "")+(event.shiftKey? "Shift+": "")+event.key) + + if (event.ctrlKey) { + if (typeof local == "function" && local(event)) { + event.stopPropagation() + event.preventDefault() + return true + } + switch (event.key) { + case "a": + case "e": + case "f": + case "b": + case "h": + case "d": + break + case "k": + kit.DelText(target, target.selectionStart) + break + case "u": + kit.DelText(target, 0, target.selectionEnd) + break + case "w": + var start = target.selectionStart-2 + var end = target.selectionEnd-1 + for (var i = start; i >= 0; i--) { + if (target.value[end] == " " && target.value[i] != " ") { + break + } + if (target.value[end] != " " && target.value[i] == " ") { + break + } + } + kit.DelText(target, i+1, end-i) + break + default: + return false + + } + event.stopPropagation() + return true + } + switch (event.key) { + case "Escape": + target.blur() + event.stopPropagation() + return true + default: + if (kit.HitText(target, "jk")) { + kit.DelText(target, target.selectionStart-2, 2) + target.blur() + event.stopPropagation() + return true + } + } + return false + }, + onscroll: function(event, target, action) { + switch (event.key) { + case "h": + if (event.ctrlKey) { + target.scrollBy(-conf.scroll_x*10, 0) + } else { + target.scrollBy(-conf.scroll_x, 0) + } + break + case "H": + target.scrollBy(-document.body.scrollWidth, 0) + break + case "l": + if (event.ctrlKey) { + target.scrollBy(conf.scroll_x*10, 0) + } else { + target.scrollBy(conf.scroll_x, 0) + } + break + case "L": + target.scrollBy(document.body.scrollWidth, 0) + break + case "j": + if (event.ctrlKey) { + target.scrollBy(0, conf.scroll_y*10) + } else { + target.scrollBy(0, conf.scroll_y) + } + break + case "J": + target.scrollBy(0, document.body.scrollHeight) + break + case "k": + if (event.ctrlKey) { + target.scrollBy(0, -conf.scroll_y*10) + } else { + target.scrollBy(0, -conf.scroll_y) + } + break + case "K": + target.scrollBy(0, -document.body.scrollHeight) + break + } + }, + + initHeader: function(page, field, option, output) { + var state = {}, list = [], cb = function(event, item, value) {} + field.onclick = function(event) { + page.pane && page.pane.scrollTo(0,0) + } + return { + Order: function(value, order, cbs) { + state = value, list = order, cb = cbs || cb, this.Show() + }, + Show: function() { + output.innerHTML = "", kit.AppendChild(output, [ + {"view": ["title", "div", "shycontext"], click: function(event) { + cb(event, "title", "shycontext") + }}, + {"view": ["state"], list: list.map(function(item) {return {text: [state[item], "div"], click: function(event) { + cb(event, item, state[item]) + }}})}, + ]) + }, + State: function(name, value) { + if (value != undefined) { + state[name] = value, this.Show() + } + if (name != undefined) { + return state[name] + } + return state + }, + } + }, + initFooter: function(page, field, option, output) { + var state = {}, list = [], cb = function(event, item, value) {} + field.onclick = function(event) { + page.pane.scrollTo(0,page.pane.scrollHeight) + } + return { + Order: function(value, order, cbs) { + state = value, list = order, cb = cbs || cb, this.Show() + }, + Show: function() { + output.innerHTML = "", kit.AppendChild(output, [ + {"view": ["title", "div", "shylinux@163.com"]}, + {"view": ["state"], list: list.map(function(item) {return {text: [item+":"+state[item], "div"], click: function(item) { + cb(event, item, state[item]) + }}})}, + ]) + }, + State: function(name, value) { + if (value != undefined) { + state[name] = value, this.Show() + } + if (name != undefined) { + return state[name] + } + return state + }, + } + }, + initLogin: function(page, field, option, output) { + var ui = kit.AppendChild(option, [ + {label: "username"}, {input: ["username"]}, {type: "br"}, + {label: "password"}, {password: ["password"]}, {type: "br"}, + {button: ["login", function(event) { + if (!ui.username.value) { + ui.username.focus() + return + } + if (!ui.password.value) { + ui.password.focus() + return + } + field.Pane.Run([ui.username.value, ui.password.value], function(msg) { + if (msg.result && msg.result[0]) { + field.Pane.ShowDialog(1, 1) + ctx.Cookie("sessid", msg.result[0]) + kit.reload() + return + } + kit.alert("用户或密码错误") + }) + }]}, + {button: ["scan", function(event) { + scan(event, function(text) { + kit.alert(text) + }) + }]}, + {type: "br"}, + {type: "img", data: {"src": "/chat/qrcode?text=hi"}} + ]) + return { + Exit: function() { + ctx.Cookie("sessid", "") + kit.reload() + + }, + } + }, + Pane: Pane, + } + window.onload = function() { + document.querySelectorAll("body>fieldset").forEach(function(field) { + page.Pane(page, field) + }) + page.init(page) + window.onresize = function(event) { + page.onlayout && page.onlayout(event) + } + // document.body.onkeydown = function(event) { + // page.onscroll && page.onscroll(event, window, "scroll") + // } + document.body.onkeydown = function(event) { + page.oncontrol && page.oncontrol(event, document.body, "control") + } + } + return page +} +function Pane(page, field) { + var option = field.querySelector("form.option") + var action = field.querySelector("div.action") + var output = field.querySelector("div.output") + + var cache = [] + var timer = "" + var list = [], last = -1 + var name = option.dataset.componet_name + var pane = (page[field.dataset.init] || function() { + })(page, field, option, output) || {}; pane.__proto__ = { + __proto__: page, + ShowDialog: function(width, height) { + if (field.style.display != "block") { + page.dialog && page.dialog != field && page.dialog.style.display == "block" && page.dialog.Show() + page.dialog = field, field.style.display = "block", kit.ModifyView(field, {window: [width||80, height||200]}) + return true + } + field.style.display = "none" + delete(page.dialog) + return false + }, + Size: function(width, height) { + field.style.display = (width<=0 || height<=0)? "none": "block" + field.style.width = width+"px" + field.style.height = height+"px" + }, + View: function(parent, type, line, key, cb) { + var ui = page.View(parent, type, line, key, cb) + if (type == "plugin" || type == "field") { + pane.Plugin(page, pane, ui.field) + } + return ui + }, + Run: function(cmds, cb) { + ctx.Run(page, option.dataset, cmds, cb||this.ondaemon) + }, + Runs: function(cmds, cb) { + ctx.Run(page, option.dataset, cmds, function(msg) { + ctx.Table(msg, function(line, index) { + (cb||this.ondaemon)(line, index, msg) + }) + }) + }, + Time: function(time, cmds, cb) { + function loop() { + ctx.Run(page, option.dataset, cmds, cb) + setTimeout(loop, time) + } + setTimeout(loop, time) + }, + Times: function(time, cmds, cb) { + timer && clearTimeout(timer) + function loop() { + !pane.Stop() && ctx.Run(page, option.dataset, cmds, function(msg) { + ctx.Table(msg, function(line, index) { + cb(line, index, msg) + }) + }) + timer = setTimeout(loop, time) + } + time && (timer = setTimeout(loop, 10)) + }, + + Clear: function() { + output.innerHTML = "", list = [], last = -1 + }, + Select: function(index) { + -1 < last && last < list.length && (list[last].className = "item") + last = index, list[index] && (list[index].className = "item select") + }, + Append: function(type, line, key, which, cb) { + var index = list.length, ui = pane.View(output, line.type || type, line, key, function(event, cmds, cbs) { + pane.Select(index), pane.which.set(line[which]) + typeof cb == "function" && cb(line, index, event, cmds, cbs) + }) + list.push(ui.last), field.scrollBy(0, field.scrollHeight+100) + return ui + }, + Update: function(cmds, type, key, which, first, cb) { + pane.Clear(), pane.Runs(cmds, function(line, index, msg) { + var ui = pane.Append(type, line, key, which, cb) + if (typeof first == "string") { + (line.key == first || line.name == first || line[which] == first) && ui.first.click() + } else { + first && index == 0 && ui.first.click() + } + }) + }, + Share: function(objs) { + objs = objs || {} + objs.componet_name = option.dataset.componet_name + objs.componet_group = option.dataset.componet_group + return ctx.Share(objs) + }, + Save: function(name, output) { + var temp = document.createDocumentFragment() + while (output.childNodes.length>0) { + var item = output.childNodes[0] + item.parentNode.removeChild(item) + temp.appendChild(item) + } + cache[name] = temp + return name + }, + Back: function(name, output) { + if (!cache[name]) { + return + } + while (cache[name].childNodes.length>0) { + item = cache[name].childNodes[0] + item.parentNode.removeChild(item) + output.appendChild(item) + } + delete(cache[name]) + return name + }, + which: page.Sync(name), Listen: {}, + Action: {}, Button: [], Plugin: Plugin, + } + + for (var k in pane.Listen) { + page.Sync(k).change(pane.Listen[k]) + } + kit.InsertChild(field, output, "div", pane.Button.map(function(value) { + return typeof value == "object"? {className: value[0], select: [value.slice(1), function(event) { + value = event.target.value + typeof pane.Action == "function"? pane.Action(value, event): pane.Action[value](event, value) + }]}: value == "br"? {"type": "br"}: {"button": [value, function(event) { + typeof pane.Action == "function"? pane.Action(value, event): pane.Action[value](event, value) + }]} + })).className="action "+name + option.onsubmit = function(event) { + event.preventDefault() + }; + return page[name] = field, pane.Field = field, field.Pane = pane +} +function Plugin(page, pane, field) { + var option = field.querySelector("form.option") + var output = field.querySelector("div.output") + + var count = 0 + var wait = false + var plugin = field.Script || {}; plugin.__proto__ = { + __proto__: pane, + Append: function(item, name) { + name = name || item.name + + item.onfocus = function(event) { + page.pane = pane.Field, page.plugin = field, page.input = event.target + } + item.onkeydown = function(event) { + page.oninput(event, function(event) { + switch (event.key) { + case "p": + action.Back() + break + case "i": + var next = field.nextSibling; + next && next.Plugin.Select() + break + case "o": + var prev = field.previousSibling; + prev && prev.Plugin.Select() + break + case "c": + output.innerHTML = "" + break + case "r": + output.innerHTML = "" + case "j": + plugin.Runs(event) + break + case "l": + page.action.scrollTo(0, field.offsetTop) + break + case "b": + plugin.Append(item).focus() + break + case "m": + plugin.Clone().plugin.Plugin.Select() + break + default: + return false + } + event.stopPropagation() + event.preventDefault() + return true + }) + event.key == "Enter" && plugin.Check(action) + } + + var input = {type: "input", name: name, data: item} + switch (item.type) { + case "button": + item.onclick = function(event) { + action[item.click]? action[item.click](event, item, option, field): + plugin[item.click]? plugin[item.click](event, item, option, field): plugin.Runs(event) + } + break + + case "select": + input.type = "select", input.list = item.values.map(function(value) { + return {type: "option", value: value, inner: value} + }), item.onchange = function(event) { + plugin.Check(action) + } + + default: + args && count < args.length && (item.value = args[count++]||item.value||"") + item.className = "args" + } + + var ui = kit.AppendChild(option, [{view: [item.view||""], list: [{type: "label", inner: item.label||""}, input]}]) + var action = ui[name] || {} + + action.History = [""], action.Goto = function(value) { + action.History.push(action.value = value) + plugin.Check(action) + return value + }, action.Back = function() { + action.History.pop(), action.History.length > 0 && action.Goto(action.History.pop()) + }; + + (typeof item.imports == "object"? item.imports: typeof item.imports == "string"? [item.imports]: []).forEach(function(imports) { + page.Sync(imports).change(action.Goto) + }) + return action + }, + Select: function() { + option.querySelectorAll("input")[1].focus() + }, + Format: function() { + arguments.length > 0 && (field.Meta.args = kit.List(arguments)) + return JSON.stringify(field.Meta) + }, + Remove: function() { + field.parentNode.removeChild(field) + }, + Clone: function() { + field.Meta.args = kit.Selector(option, "input.args", function(item, index) { + return item.value + }) + return pane.View(field.parentNode, "plugin", field.Meta, [], field.Run).field.Plugin + }, + Check: function(target) { + option.querySelectorAll(".args").forEach(function(item, index, list) { + item == target && (index == list.length-1? plugin.Runs(event): page.plugin == field && list[index+1].focus()) + }) + }, + Runs: function(event) { + field.Run(event, kit.Selector(option, ".args", function(item, index) { + return item.value + }), plugin.ondaemon) + }, + Location: function(event) { + output.className = "output long" + page.getLocation(function(res) { + field.Run(event, [parseInt(res.latitude*1000000+1400)/1000000.0, parseInt(res.longitude*1000000+6250)/1000000.0].concat( + kit.Selector(option, ".args", function(item) {return item.value})) + , plugin.ondaemon) + }) + }, + + Clear: function() { + output.innerHTML = "" + }, + ondaemon: function(msg) { + output.innerHTML = "" + if (display.map) { + kit.AppendChild(output, [{img: ["https://gss0.bdstatic.com/8bo_dTSlRMgBo1vgoIiO_jowehsv/tile/?qt=vtile&x=25310&y=9426&z=17&styles=pl&scaler=2&udt=20190622"]}]) + return + } + output.innerHTML = "" + !display.hide_append && msg.append && kit.OrderTable(kit.AppendTable(kit.AppendChild(output, "table"), ctx.Table(msg), msg.append), exports[1], function(event, value, name, line) { + if (line["latitude"]) { + page.openLocation(line.latitude, line.longitude, line.location) + } + page.Sync("plugin_"+exports[0]).set(plugin.onexport[exports[2]||""](value, name)) + }); + (display.show_result || !msg.append) && msg.result && kit.AppendChild(output, [{view: ["code", "div", msg.Results()]}]) + }, + onexport: { + "": function(value, name) { + return value + }, + "pod": function(value, name) { + if (option[exports[0]].value) { + return option[exports[0]].value+"."+value + } + return value + }, + "dir": function(value, name) { + if (value.endsWith("/")) { + return option[exports[0]] + value + } + }, + }, + init: function() {}, + } + + var meta = field.Meta + var args = meta.args || [] + var display = JSON.parse(meta.display||'{}') + var exports = JSON.parse(meta.exports||'["",""]') + JSON.parse(meta.inputs || "[]").map(plugin.Append) + + plugin.init(page, pane, field, option, output) + return page[field.id] = pane[field.id] = plugin.Field = field, field.Plugin = plugin +}