diff --git a/base/web/render.go b/base/web/render.go index 2ac29c0a..1817171d 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -177,6 +177,9 @@ func RenderVersion(m *ice.Message) string { } const ( + PLAY = "play" + SHOW = "show" + CHAT = "chat" WORD = "word" VIMER = "vimer" diff --git a/core/chat/tutor.go b/core/chat/tutor.go index 6af5ae1e..a9b15cc8 100644 --- a/core/chat/tutor.go +++ b/core/chat/tutor.go @@ -2,21 +2,30 @@ package chat import ( ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/web" ) const TUTOR = "tutor" func init() { Index.MergeCommands(ice.Commands{ - TUTOR: {Name: "tutor zone id auto", Help: "向导", Actions: mdb.ZoneAction( - mdb.SHORT, "zone", mdb.FIELD, "time,zone", mdb.FIELDS, "time,id,type,name,text", - ), Hand: func(m *ice.Message, arg ...string) { + TUTOR: {Name: "tutor zone id auto", Help: "向导", Actions: ice.MergeActions(ice.Actions{ + nfs.SAVE: {Name: "save zone*", Hand: func(m *ice.Message, arg ...string) {}}, + }, mdb.ZoneAction( + mdb.SHORT, "zone", mdb.FIELD, "time,zone,count", mdb.FIELDS, "time,id,type,name,text", + )), Hand: func(m *ice.Message, arg ...string) { + m.Option("cache.limit", "-1") if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.Push(mdb.TIME, m.Time()).Push(mdb.ZONE, "_current") } else { - m.Action(cli.PLAY) + m.SortInt(mdb.ID) + if arg[0] == "_current" { + m.Action(web.PLAY, nfs.SAVE) + } else { + m.PushAction(web.SHOW, "view", "data").Action(web.PLAY) + } } m.Display("") }}, diff --git a/core/chat/tutor.js b/core/chat/tutor.js index 5575fe27..7e2e04cd 100644 --- a/core/chat/tutor.js +++ b/core/chat/tutor.js @@ -1,17 +1,41 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { - if (can.Option(mdb.ZONE) == "_current") { - can._root.Footer.db.tutor.Table(function(value) { msg.Push(value) }), msg.PushAction("show") + if (can.Option(mdb.ZONE) == "_current" && can._root.Footer.db.tutor) { + can._root.Footer.db.tutor.Table(function(value) { + msg.Push(value, [mdb.TIME, mdb.TYPE, mdb.TEXT]) + if (can.base.isIn(value.type, "storm", mdb.REMOVE)) { + msg.PushButton(web.SHOW) + } else { + msg.PushButton(web.SHOW, "view", "data") + } + }) } - msg.Dump(can) + msg.Show(can) }, }) Volcanos(chat.ONACTION, { + _trans: { + icons: { + view: "bi bi-code-slash", data: "bi bi-diagram-3", + }, + }, + save: function(event, can) { + can.user.input(event, can, ["zone"], function(data) { + can.core.Next(can._msg.Table(), function(value, next, index, list) { + can.user.toastProcess(can, `save ${data.zone} ${index}/${list.length}`) + var args = [ctx.ACTION, mdb.INSERT, mdb.ZONE, data.zone]; can.core.Item(value, function(key, value) { args.push(key, value) }) + can.run(can.request(event, {_handle: ice.TRUE}), args, function() { next() }) + }, function() { + can.user.toastSuccess(can) + }) + }) + }, play: function(can) { - can.core.Next(can._msg.Table(), function(value, next, index, list) { var delay = 3000 + can.core.Next(can._msg.Table(), function(value, next, index, list) { var delay = 30 if (list[index+1]) { delay = (Date.parse(list[index+1].time)-Date.parse(value.time)) } can.onaction.show(can, value.type, value.text, delay), can.onmotion.delay(can, next, delay) can.onmotion.select(can, can.page.SelectOne(can, can._output, "tbody"), html.TR, index) + can.user.toastProcess(can, `show ${index}/${list.length} ${value.type} ${delay}ms`) }, function() { can.user.toastSuccess(can, "play done") }) @@ -24,15 +48,30 @@ Volcanos(chat.ONACTION, { case "storm": var ls = text.split(",") can._root.River.onaction.action({}, can._root.River, ls[0], ls[1]) break + case "index": + can.page.Select(can, document.body, "fieldset.panel.Header>div.output>div.Action>div._tabs>div.tabs."+text, function(target) { + target.click() + }) + break case "click": - can.page.Select(can, document.body, text, function(target) { - can.core.Next([1, 2, 3, 4, 5], function(value, next, index) { can.page.ClassList.add(can, target, "picker") - can.onmotion.delay(can, function() { can.page.ClassList.del(can, target, "picker"), can.onmotion.delay(can, function() { next() }, delay/20) }, delay/20) + can.page.Select(can, document.body, text, function(target) { var count = 5 + can.core.Next(can.core.List(count), function(value, next, index) { can.page.ClassList.add(can, target, "picker") + can.onmotion.delay(can, function() { can.page.ClassList.del(can, target, "picker"), can.onmotion.delay(can, function() { next() }, delay/5/4) }, delay/5/4) }, function() { target.click() }) }) break + case "focus": var ls = text.split(",") + can.page.Select(can, document.body, ls[0], function(target) { + target.focus() + }) + break + case "blur": var ls = text.split(",") + can.page.Select(can, document.body, ls[0], function(target) { target.value = ls[1] + can.onmotion.delay(can, function() { target.blur() }, 300) + }) + break case "item": var ls = text.split(",") can.page.Select(can, document.body, ls[0], function(target) { can.onmotion.delay(can, function() { target._can.sub.ui[ls[1]].click() }) @@ -45,4 +84,30 @@ Volcanos(chat.ONACTION, { break } }, + view: function(can, type, text, delay) { + can.onappend._float(can, "can.view", [], function(sub) { + if (type == "click") { + can.page.Select(can, document.body, can.core.Split(text, ">,")[0], function(target) { + sub.Conf("_target", target) + }) + } else if (type == "index") { + can.page.Select(can, document.body, "fieldset.plugin."+text, function(target) { + sub.Conf("_target", target) + }) + } + }) + }, + data: function(can, type, text, delay) { + can.onappend._float(can, "can.data", [], function(sub) { + if (type == "click") { + can.page.Select(can, document.body, can.core.Split(text, ">,")[0], function(target) { + sub.Conf("_target", target._can) + }) + } else if (type == "index") { + can.page.Select(can, document.body, "fieldset.plugin."+text, function(target) { + sub.Conf("_target", target._can) + }) + } + }) + }, }) \ No newline at end of file