diff --git a/base/aaa/role.go b/base/aaa/role.go
index 88b37b34..43710934 100644
--- a/base/aaa/role.go
+++ b/base/aaa/role.go
@@ -111,9 +111,9 @@ func WhiteAction(key ...string) ice.Actions {
}}}
}
func Right(m *ice.Message, key ...ice.Any) bool {
- if key := kit.Simple(key); len(key) > 2 && key[1] == "action" && kit.IsIn(kit.Format(key[2]), "run", "command") {
+ if key := kit.Simple(key); len(key) > 2 && key[1] == ice.ACTION && kit.IsIn(kit.Format(key[2]), ice.RUN, ice.COMMAND) {
return true
- } else if len(key) > 0 && key[0] == "etc/path" {
+ } else if len(key) > 0 && key[0] == ice.ETC_PATH {
return true
}
return m.Option(ice.MSG_USERROLE) == ROOT || !m.Warn(m.Cmdx(ROLE, RIGHT, m.Option(ice.MSG_USERROLE), key, logs.FileLineMeta(-1)) != ice.OK,
diff --git a/base/ctx/config.go b/base/ctx/config.go
index f14dd5ee..9efefa47 100644
--- a/base/ctx/config.go
+++ b/base/ctx/config.go
@@ -103,6 +103,7 @@ func _config_make(m *ice.Message, key string, arg ...string) {
m.Echo(FormatPretty(mdb.Confv(msg, key, arg[0]), 0, 1))
} else {
m.Echo(FormatPretty(mdb.Confv(msg, key), 0, 1))
+ m.StatusTime(mdb.COUNT, kit.Length(mdb.Confv(msg, key, mdb.HASH)))
}
}
func _config_list(m *ice.Message) {
diff --git a/base/ctx/process.go b/base/ctx/process.go
index 8a86c698..5de5187f 100644
--- a/base/ctx/process.go
+++ b/base/ctx/process.go
@@ -53,7 +53,8 @@ func ProcessField(m *ice.Message, cmd string, args ice.Any, arg ...string) *ice.
} else {
m.Cmdy(COMMAND, cmd)
}
- m.Push(ARGS, kit.Format(_process_args(m, args))).Options(ice.MSG_INDEX, m.PrefixKey()).ProcessField(ACTION, m.ActionKey(), RUN)
+ m.Push(ARGS, kit.Format(_process_args(m, args))).Options(ice.MSG_INDEX, m.PrefixKey())
+ m.ProcessField(ACTION, m.ActionKey(), RUN)
} else {
if !PodCmd(m, cmd, arg[1:]) {
kit.If(aaa.Right(m, cmd, arg[1:]), func() { m.Cmdy(cmd, arg[1:]) })
diff --git a/base/gdb/event.go b/base/gdb/event.go
index 8690468c..db521885 100644
--- a/base/gdb/event.go
+++ b/base/gdb/event.go
@@ -32,9 +32,6 @@ func init() {
}, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELD, "time,id,cmd"), mdb.ClearOnExitHashAction())},
})
}
-func EventAction(arg ...string) ice.Actions {
- return ice.Actions{ice.CTX_INIT: {Hand: func(m *ice.Message, _ ...string) { kit.For(arg, func(k string) { Watch(m, k) }) }}}
-}
func EventsAction(arg ...string) ice.Actions {
list := kit.DictList(arg...)
return ice.Actions{ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
@@ -48,10 +45,10 @@ func Watch(m *ice.Message, key string, arg ...string) *ice.Message {
return m.Cmd(EVENT, LISTEN, EVENT, key, ice.CMD, kit.Join(arg, ice.SP))
}
func Event(m *ice.Message, key string, arg ...ice.Any) *ice.Message {
- if list[key] == 0 {
+ if key = kit.Select(kit.Keys(m.CommandKey(), m.ActionKey()), key); list[key] == 0 {
return m
}
- return m.Cmdy(EVENT, HAPPEN, EVENT, kit.Select(kit.Keys(m.CommandKey(), m.ActionKey()), key), arg, logs.FileLineMeta(-1))
+ return m.Cmdy(EVENT, HAPPEN, EVENT, key, arg, logs.FileLineMeta(-1))
}
func EventDeferEvent(m *ice.Message, key string, arg ...ice.Any) func(string, ...ice.Any) {
Event(m, key, arg...)
diff --git a/base/mdb/hash.go b/base/mdb/hash.go
index c479e865..67dce3ca 100644
--- a/base/mdb/hash.go
+++ b/base/mdb/hash.go
@@ -164,11 +164,14 @@ func StatusHashAction(arg ...Any) ice.Actions {
func ClearOnExitHashAction() ice.Actions {
return ice.MergeActions(ice.Actions{ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { Conf(m, m.PrefixKey(), HASH, "") }}})
}
-func ExportHashAction() ice.Actions {
- return ice.Actions{
- ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashExport(m, arg) }},
+func ExportHashAction(arg ...Any) ice.Actions {
+ return ice.MergeActions(ice.Actions{
+ ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
+ Config(m, IMPORTANT, ice.TRUE)
+ HashExport(m, arg)
+ }},
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { HashImport(m, arg) }},
- }
+ }, HashAction(arg...))
}
func HashKey(m *ice.Message) string {
diff --git a/base/nfs/cat.go b/base/nfs/cat.go
index 9e88c285..38678ba8 100644
--- a/base/nfs/cat.go
+++ b/base/nfs/cat.go
@@ -123,7 +123,6 @@ func init() {
if arg[0] == ice.ACTION {
m.Cmdy(DIR, arg)
} else {
- // } else if !Show(m, arg[0]) {
_cat_list(m.Logs(FIND, m.OptionSimple(DIR_ROOT), FILE, arg[0]), arg[0])
}
}
diff --git a/base/nfs/dir.go b/base/nfs/dir.go
index 08b298c3..4deb354c 100644
--- a/base/nfs/dir.go
+++ b/base/nfs/dir.go
@@ -212,7 +212,9 @@ var bind = []string{
func Relative(m *ice.Message, p string) string {
for i := 0; i < len(bind); i += 2 {
if strings.HasPrefix(p, bind[i]) {
- return strings.Replace(p, bind[i], bind[i+1], 1)
+ if _p := strings.Replace(p, bind[i], bind[i+1], 1); Exists(m, kit.ExtChange(_p, JS)) {
+ return _p
+ }
}
}
return p
diff --git a/base/ssh/script.go b/base/ssh/script.go
index 43a26c76..6f831382 100644
--- a/base/ssh/script.go
+++ b/base/ssh/script.go
@@ -158,6 +158,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) {
if msg := m.Cmd(nfs.CAT, m.Option(ice.MSG_SCRIPT, f.source)); msg.IsErr() {
return
} else {
+ kit.If(m.Option(nfs.CAT_CONTENT), func() { m.Option(nfs.CAT_CONTENT, "") })
buf := bytes.NewBuffer(make([]byte, 0, ice.MOD_BUFS))
f.stdin, f.stdout = bytes.NewBufferString(msg.Result()), buf
defer func() { m.Echo(buf.String()) }()
diff --git a/base/web/html/html.go b/base/web/html/html.go
index b304c112..3640ef5f 100644
--- a/base/web/html/html.go
+++ b/base/web/html/html.go
@@ -1,5 +1,11 @@
package html
+import (
+ "strings"
+
+ kit "shylinux.com/x/toolkits"
+)
+
const (
DARK = "dark"
LIGHT = "light"
@@ -25,3 +31,13 @@ const (
TEXT_PLAIN = "text/plain"
)
+
+func IsImage(name, mime string) bool {
+ return strings.HasPrefix(mime, "image/") || kit.ExtIsImage(name)
+}
+func IsVideo(name, mime string) bool {
+ return strings.HasPrefix(mime, "video/") || kit.ExtIsVideo(name)
+}
+func IsAudio(name, mime string) bool {
+ return strings.HasPrefix(mime, "audio/")
+}
diff --git a/base/web/route.go b/base/web/route.go
index ff35db77..159902c4 100644
--- a/base/web/route.go
+++ b/base/web/route.go
@@ -55,6 +55,10 @@ func _route_toast(m *ice.Message, space string, args ...string) {
})
}
+const (
+ ONLINE = "online"
+ OFFLINE = "offline"
+)
const ROUTE = "route"
func init() {
@@ -125,6 +129,19 @@ func init() {
})
} else if mdb.HashSelect(m, arg...); len(arg) > 0 {
m.EchoIFrame(m.MergePod(arg[0]))
+ } else {
+ stat := map[string]int{}
+ list := m.CmdMap(SPACE, mdb.NAME)
+ m.Table(func(value ice.Maps) {
+ if _, ok := list[value[SPACE]]; ok {
+ m.Push(mdb.STATUS, ONLINE)
+ stat[ONLINE]++
+ } else {
+ m.Push(mdb.STATUS, OFFLINE)
+ stat[OFFLINE]++
+ }
+ })
+ m.StatusTimeCount(stat)
}
}},
})
diff --git a/base/web/space.go b/base/web/space.go
index 0740ac05..4db34afa 100644
--- a/base/web/space.go
+++ b/base/web/space.go
@@ -180,7 +180,7 @@ func init() {
kit.If(kit.IsIn(value[mdb.TYPE], WORKER, SERVER), func() { m.Push(arg[0], value[mdb.NAME]) })
})
case mdb.ICON:
- m.Cmdy(nfs.DIR, ice.USR_ICONS, nfs.PATH)
+ m.Cmdy(nfs.DIR, ice.USR_ICONS, nfs.PATH).CutTo(nfs.PATH, arg[0])
case ctx.INDEX:
if space := m.Option(SPACE); space != "" {
m.Options(SPACE, []string{}).Cmdy(SPACE, space, mdb.INPUTS, arg)
diff --git a/core/chat/chat.shy b/core/chat/chat.shy
index eb02bf4b..a276cc67 100644
--- a/core/chat/chat.shy
+++ b/core/chat/chat.shy
@@ -1,27 +1,27 @@
chat.go
chat.shy
+portal.go
header.go
footer.go
+search.go
+action.go
river.go
storm.go
-action.go
-search.go
-portal.go
-iframe.go
-trans.go
icons.go
pod.go
cmd.go
sso.go
grant.go
-oauth
+trans.go
+iframe.go
+keyboard.go
+oauth
macos
favor.go
flows.go
flows.js
flows.css
-keyboard.go
location.go
location.shy
diff --git a/core/chat/cmd.go b/core/chat/cmd.go
index 2623582a..45471b4d 100644
--- a/core/chat/cmd.go
+++ b/core/chat/cmd.go
@@ -3,9 +3,7 @@ package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
- "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/web"
- kit "shylinux.com/x/toolkits"
)
const CMD = "cmd"
@@ -15,12 +13,12 @@ func init() {
CMD: {Actions: web.ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) {
if len(arg[0]) == 0 || arg[0] == "" {
web.RenderMain(m)
- } else if m.IsCliUA() {
- kit.If(aaa.Right(m, arg), func() { m.Cmdy(arg, m.Optionv(ice.ARG)).RenderResult() })
- } else if arg[0] == web.CHAT_PORTAL {
- web.RenderMain(m)
- } else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
- web.RenderCmd(m, m.Append(ctx.INDEX), arg[1:])
+ } else if aaa.Right(m, arg) {
+ if m.IsCliUA() {
+ m.Cmdy(arg, m.Optionv(ice.ARG)).RenderResult()
+ } else {
+ web.RenderCmd(m, arg[0], arg[1:])
+ }
}
}},
})
diff --git a/core/chat/favor.go b/core/chat/favor.go
index 894c47a6..3da8a798 100644
--- a/core/chat/favor.go
+++ b/core/chat/favor.go
@@ -4,27 +4,16 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
- "shylinux.com/x/icebergs/base/ssh"
- "shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
-func _favor_is_image(m *ice.Message, name, mime string) bool {
- return strings.HasPrefix(mime, "image/") || kit.ExtIsImage(name)
-}
-func _favor_is_video(m *ice.Message, name, mime string) bool {
- return strings.HasPrefix(mime, "video/") || kit.ExtIsVideo(name)
-}
-func _favor_is_audio(m *ice.Message, name, mime string) bool {
- return strings.HasPrefix(mime, "audio/")
-}
-
const (
FAVOR_INPUTS = "favor.inputs"
FAVOR_TABLES = "favor.tables"
@@ -34,7 +23,7 @@ const FAVOR = "favor"
func init() {
Index.MergeCommands(ice.Commands{
- FAVOR: {Name: "favor hash auto create upload getClipboardData", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
+ FAVOR: {Name: "favor hash auto create upload getClipboardData", Help: "收藏夹", Icon: "favor.png", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if mdb.IsSearchPreview(m, arg) {
m.Cmds("", func(value ice.Maps) {
@@ -47,11 +36,18 @@ func init() {
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE:
- m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL, cli.OPENS)
+ m.Push(arg[0], mdb.TEXT, ctx.INDEX, cli.OPENS)
case mdb.NAME:
switch m.Option(mdb.TYPE) {
case ctx.INDEX:
- ctx.CmdInputs(m, m.Option(mdb.TYPE)).RenameAppend(ctx.INDEX, arg[0])
+ m.Copy(mdb.HashInputs(m.Spawn(), ctx.INDEX).CutTo(ctx.INDEX, arg[0]))
+ return
+ }
+ case mdb.TEXT:
+ switch m.Option(mdb.TYPE) {
+ case ctx.INDEX:
+ m.Option(ctx.INDEX, m.Option(mdb.NAME))
+ m.Copy(mdb.HashInputs(m.Spawn(), ctx.ARGS).CutTo(ctx.ARGS, arg[0]))
return
}
}
@@ -62,7 +58,7 @@ func init() {
"scanQRCode": {Name: "favor create", Help: "扫码"},
"record1": {Name: "favor upload", Help: "截图"},
"record2": {Name: "favor upload", Help: "录屏"},
- mdb.CREATE: {Name: "create type name text*", Hand: func(m *ice.Message, arg ...string) {
+ mdb.CREATE: {Name: "create type name text", Hand: func(m *ice.Message, arg ...string) {
if strings.HasPrefix(m.Option(mdb.TEXT), ice.HTTP) {
m.OptionDefault(mdb.TYPE, mdb.LINK, mdb.NAME, kit.ParseURL(m.Option(mdb.TEXT)).Host)
}
@@ -74,36 +70,25 @@ func init() {
web.DOWNLOAD: {Hand: func(m *ice.Message, arg ...string) {
m.ProcessOpen(web.MergeURL2(m, web.SHARE_LOCAL+m.Option(mdb.TEXT), nfs.FILENAME, m.Option(mdb.NAME)))
}},
- ctx.DISPLAY: {Help: "预览", Hand: func(m *ice.Message, arg ...string) {
- if link := web.SHARE_LOCAL + m.Option(mdb.TEXT); _favor_is_image(m, m.Option(mdb.NAME), m.Option(mdb.TYPE)) {
- m.EchoImages(link)
- } else if _favor_is_video(m, m.Option(mdb.NAME), m.Option(mdb.TYPE)) {
- m.EchoVideos(link)
- } else {
- m.Echo("", link)
- }
- m.ProcessInner()
- }},
- "vimer": {Help: "源码", Hand: func(m *ice.Message, arg ...string) {
- ctx.Process(m, "", nfs.SplitPath(m, m.Option(mdb.TEXT)), arg...)
- }},
- "xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
- ctx.Process(m, "", []string{mdb.TYPE, m.Option(mdb.TEXT), mdb.NAME, m.Option(mdb.NAME), mdb.TEXT, ""}, arg...)
- }},
ctx.INDEX: {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
- msg := mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH))
- ls := kit.Split(msg.Option(mdb.TEXT))
- ctx.ProcessField(m, ls[0], ls[1:], arg...)
- }},
- ctx.RUN: {Hand: func(m *ice.Message, arg ...string) {
- m.Option(mdb.TYPE, mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)).Append(mdb.TYPE))
- ctx.Run(m, arg...)
+ if kit.HasPrefixList(arg, ctx.RUN) {
+ msg := mdb.HashSelects(m.Spawn(), arg[1])
+ ctx.ProcessField(m, msg.Append(mdb.NAME), kit.Split(msg.Append(mdb.TEXT)), kit.Simple(ctx.RUN, arg[2:])...)
+ } else {
+ msg := mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH))
+ ctx.ProcessField(m, msg.Append(mdb.NAME), kit.Split(msg.Append(mdb.TEXT)), arg...)
+ m.Option(ice.FIELD_PREFIX, ctx.ACTION, m.ActionKey(), ctx.RUN, m.Option(mdb.HASH))
+ }
}},
cli.OPENS: {Hand: func(m *ice.Message, arg ...string) { cli.Opens(m, m.Option(mdb.TEXT)) }},
- }, mdb.ImportantHashAction(), mdb.ExportHashAction()), Hand: func(m *ice.Message, arg ...string) {
+ }, FavorAction(), mdb.ExportHashAction()), Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 && arg[0] == ctx.ACTION {
- m.Option(mdb.TYPE, mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)).Append(mdb.TYPE))
- gdb.Event(m, FAVOR_ACTION, arg)
+ if m.Option(ice.MSG_INDEX) == m.PrefixKey() {
+ m.Option(mdb.TYPE, mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)).Append(mdb.TYPE))
+ gdb.Event(m, FAVOR_ACTION, arg)
+ } else if aaa.Right(m, m.Option(ice.MSG_INDEX), arg[3:]) {
+ m.Cmdy(m.Option(ice.MSG_INDEX), arg[3:])
+ }
return
}
if len(arg) == 0 {
@@ -115,46 +100,26 @@ func init() {
}
if mdb.HashSelect(m, arg...); len(arg) > 0 {
text := m.Append(mdb.TEXT)
- if strings.HasPrefix(m.Append(mdb.TEXT), ice.VAR_FILE) {
- text = web.SHARE_LOCAL + m.Append(mdb.TEXT)
- if m.PushDownload(mdb.LINK, m.Append(mdb.NAME), text); len(arg) > 0 && _favor_is_image(m, m.Append(mdb.NAME), m.Append(mdb.TYPE)) {
- m.PushImages(ctx.DISPLAY, text)
- } else if _favor_is_video(m, m.Append(mdb.NAME), m.Append(mdb.TYPE)) {
- m.PushVideos(ctx.DISPLAY, text)
- }
- text = tcp.PublishLocalhost(m, web.MergeLink(m, text))
- }
- m.PushScript(nfs.SCRIPT, text)
m.PushQRCode(cli.QRCODE, text)
+ m.PushScript(text)
}
m.Table(func(value ice.Maps) {
- if msg := gdb.Event(m.Spawn(), FAVOR_TABLES, mdb.TYPE, value[mdb.TYPE]); msg.Append(ctx.ACTION) != "" {
- m.PushButton(msg.Append(ctx.ACTION))
+ delete(value, ctx.ACTION)
+ if msg := gdb.Event(m.Spawn(value), FAVOR_TABLES, mdb.TYPE, value[mdb.TYPE]); msg.Append(ctx.ACTION) != "" {
+ m.PushButton(msg.Append(ctx.ACTION), mdb.REMOVE)
return
}
switch value[mdb.TYPE] {
- case cli.OPENS:
- m.PushButton(cli.OPENS, mdb.REMOVE)
- case ssh.SHELL:
- m.PushButton("xterm", mdb.REMOVE)
case ctx.INDEX:
m.PushButton(ctx.INDEX, mdb.REMOVE)
- case nfs.FILE:
- m.PushButton("vimer", mdb.REMOVE)
+ case cli.OPENS:
+ m.PushButton(cli.OPENS, mdb.REMOVE)
default:
- if strings.HasPrefix(value[mdb.TEXT], ice.VAR_FILE) {
- if _favor_is_image(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_video(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_audio(m, value[mdb.NAME], value[mdb.TYPE]) {
- m.PushButton(ctx.DISPLAY, web.DOWNLOAD, mdb.REMOVE)
- } else {
- m.PushButton(web.DOWNLOAD, mdb.REMOVE)
- }
- } else {
- m.PushButton(mdb.REMOVE)
- }
+ m.PushButton(mdb.REMOVE)
}
})
}},
})
}
-func FavorAction() ice.Actions { return gdb.EventAction(FAVOR_INPUTS, FAVOR_TABLES, FAVOR_ACTION) }
+func FavorAction() ice.Actions { return gdb.EventsAction(FAVOR_INPUTS, FAVOR_TABLES, FAVOR_ACTION) }
diff --git a/core/chat/flows.go b/core/chat/flows.go
index 43695e97..24f392a0 100644
--- a/core/chat/flows.go
+++ b/core/chat/flows.go
@@ -27,7 +27,7 @@ func init() {
mdb.MODIFY: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, m.PrefixKey(), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, m.OptionSimple(mdb.HASH), arg)
}},
- }, mdb.HashAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,zone", mdb.FIELDS, "time,hash,name,space,index,args,prev,from,status"), mdb.ExportHashAction()), Hand: func(m *ice.Message, arg ...string) {
+ }, mdb.ExportHashAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,zone", mdb.FIELDS, "time,hash,name,space,index,args,prev,from,status")), Hand: func(m *ice.Message, arg ...string) {
if arg = kit.Slice(arg, 0, 2); len(arg) == 0 || arg[0] == "" {
mdb.HashSelect(m)
} else {
diff --git a/core/chat/flows.js b/core/chat/flows.js
index e58825dc..4de803ae 100644
--- a/core/chat/flows.js
+++ b/core/chat/flows.js
@@ -1,29 +1,25 @@
-(function() {
-const ACTION_STORE = "web.flows:action:"
+(function() { const ACTION_STORE = "web.flows:action:"
Volcanos(chat.ONIMPORT, {
- _init: function(can, msg, cb) { can.onmotion.clear(can), can.ui = can.onappend.layout(can), can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
- cb && cb(msg), can.core.Item(can.Action(), function(key) { can.onaction[key] = can.onaction[key]||can.onaction.refresh, can.Action(key, can.misc.localStorage(can, ACTION_STORE+key)) }), can.onkeymap._build(can)
+ _init: function(can, msg, cb) { can.ui = can.onappend.layout(can), cb && cb(msg)
+ can.core.Item(can.Action(), function(key) { can.onaction[key] = can.onaction[key]||can.onaction.refresh, can.Action(key, can.misc.localStorage(can, ACTION_STORE+key)) })
if (can.Option(mdb.ZONE)) { return can.onmotion.hidden(can, can.ui.project), can.onimport._content(can, msg, can.Option(mdb.ZONE)) } can.onimport._project(can, msg)
},
_project: function(can, msg) { var target; msg.Table(function(value) {
var item = can.onimport.item(can, value, function(event) { can.Option(mdb.ZONE, value.zone)
if (can.onmotion.cache(can, function(save, load) {
save({db: can.db, toggle: can.ui.toggle, _display_class: can.ui.display.className, _profile_class: can.ui.profile.className})
- return load(value.zone, function(bak) {
- can.db = bak.db, can.ui.toggle = bak.toggle
+ return load(value.zone, function(bak) { can.db = bak.db, can.ui.toggle = bak.toggle
can.ui.display.className = bak._display_class||can.ui.display.className
can.ui.profile.className = bak._profile_class||can.ui.profile.className
})
}, can.ui.content, can.ui.display, can._status)) { return can.page.isDisplay(can.ui.profile) && can.onimport._profile(can, can.db.current), can.onimport.layout(can) }
can.run(event, [value.zone], function(msg) { can.onimport._content(can, msg, can.Option(mdb.ZONE)) })
- }, null, can.ui.project); target = can.Option(mdb.ZONE) == value.zone? item: target||item
+ }, null, can.ui.project); target = value.zone == can.Option(mdb.ZONE)? item: target||item
}), target && target.click() },
_content: function(can, msg, zone) { if (msg.Length() == 0) { return can.Update(can.request({target: can._legend}, {title: mdb.INSERT, zone: zone}), [ctx.ACTION, mdb.INSERT]) }
can.db.list = {}; msg.Table(function(value) { can.db.list[value.hash] = value })
var root; can.core.Item(can.db.list, function(key, item) { if (!item.prev && !item.from) { return root = item }
- try {
- if (item.prev) { can.db.list[item.prev].next = item } if (item.from) { can.db.list[item.from].to = item }
- } catch(e) { console.log(e) }
+ try { if (item.prev) { can.db.list[item.prev].next = item } if (item.from) { can.db.list[item.from].to = item } } catch(e) { console.log(e) }
}), can.db.root = root, can.db.current = root
var _list = can.onexport.travel(can, can.db.root, true), _msg = can.request(); can.core.List(_list, function(item) { _msg.Push(item, msg.append) })
var table = can.onappend.table(can, _msg, null, can.ui.display); can.page.Select(can, table, "tbody>tr", function(target, index) { _list[index]._tr = target })
@@ -97,27 +93,8 @@ Volcanos(chat.ONIMPORT, {
})
},
}, [""])
-Volcanos(chat.ONDETAIL, {
- _select: function(event, can, item) { if (!item) { return can.onmotion.hidden(can, can.ui.profile) }
- can.isCmdMode() && item._rect.scrollIntoView(), can.db.current = item, can.onimport._profile(can, item)
- can.page.Select(can, item._rect.parentNode, "", function(target) { var _class = (target.Value(html.CLASS)||"").split(lex.SP)
- if (can.base.isIn(target, item._line, item._rect, item._text)) {
- if (_class.indexOf(html.SELECT) == -1) { target.Value(html.CLASS, _class.concat([html.SELECT]).join(lex.SP).trim()) }
- } else {
- if (_class.indexOf(html.SELECT) > -1) { target.Value(html.CLASS, _class.filter(function(c) { return c != html.SELECT }).join(lex.SP).trim()) }
- }
- }), can.page.Select(can, item._tr.parentNode, "", function(target) { can.page.ClassList.set(can, target, html.SELECT, target == item._tr) })
- },
- onclick: function(event, can, _sub, item) { switch (_sub.svg.style.cursor) {
- case "e-resize": can.Update(can.request(event, can.Action("direct") == "horizon"? {prev: item.hash}: {from: item.hash}), [ctx.ACTION, mdb.INSERT]); break
- case "s-resize": can.Update(can.request(event, can.Action("direct") == "horizon"? {from: item.hash}: {prev: item.hash}), [ctx.ACTION, mdb.INSERT]); break
- default: can.ondetail._select(event, can, item)
- } can.onkeymap.prevent(event) },
- oncontextmenu: function(event, can, _sub, item) { can.user.carteItem(event, can, item) },
-})
Volcanos(chat.ONACTION, {
- list: [
- "create", "play", "prev", "next",
+ list: ["create", "play", "prev", "next",
["travel", "deep", "wide"],
["direct", "vertical", "horizon"],
[html.HEIGHT, 80, 100, 120, 140, 200],
@@ -151,8 +128,28 @@ Volcanos(chat.ONACTION, {
if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) }
can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can)
},
- onkeydown: function(event, can) { can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) },
plugin: function(event, can, msg) { can.ondetail._select(event, can, can.db.list[msg.Option(mdb.HASH)]) },
+ onkeydown: function(event, can) { can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) },
+})
+Volcanos(chat.ONDETAIL, {
+ _select: function(event, can, item) { if (!item) { return can.onmotion.hidden(can, can.ui.profile) }
+ can.isCmdMode() && item._rect.scrollIntoView(), can.db.current = item, can.onimport._profile(can, item)
+ can.page.Select(can, item._rect.parentNode, "", function(target) { var _class = (target.Value(html.CLASS)||"").split(lex.SP)
+ if (can.base.isIn(target, item._line, item._rect, item._text)) {
+ if (_class.indexOf(html.SELECT) == -1) { target.Value(html.CLASS, _class.concat([html.SELECT]).join(lex.SP).trim()) }
+ } else {
+ if (_class.indexOf(html.SELECT) > -1) { target.Value(html.CLASS, _class.filter(function(c) { return c != html.SELECT }).join(lex.SP).trim()) }
+ }
+ }), can.page.Select(can, item._tr.parentNode, "", function(target) { can.page.ClassList.set(can, target, html.SELECT, target == item._tr) })
+ },
+ onclick: function(event, can, _sub, item) { switch (_sub.svg.style.cursor) {
+ case "e-resize":
+ can.Update(can.request(event, can.Action("direct") == "horizon"? {prev: item.hash}: {from: item.hash}), [ctx.ACTION, mdb.INSERT]); break
+ case "s-resize":
+ can.Update(can.request(event, can.Action("direct") == "horizon"? {from: item.hash}: {prev: item.hash}), [ctx.ACTION, mdb.INSERT]); break
+ default: can.ondetail._select(event, can, item)
+ } can.onkeymap.prevent(event) },
+ oncontextmenu: function(event, can, _sub, item) { can.user.carteItem(event, can, item) },
})
Volcanos(chat.ONEXPORT, {
margin: function(can) { var margin = can.Action(html.MARGIN); return parseFloat(margin) },
diff --git a/core/chat/footer.go b/core/chat/footer.go
index 5ac945cb..6f18772d 100644
--- a/core/chat/footer.go
+++ b/core/chat/footer.go
@@ -2,8 +2,6 @@ package chat
import (
ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/aaa"
- "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
@@ -17,7 +15,7 @@ func init() {
Index.MergeCommands(ice.Commands{
FOOTER: {Actions: ice.MergeActions(ice.Actions{
ice.HELP: {Hand: func(m *ice.Message, arg ...string) {
- ctx.ProcessField(m, web.WIKI_WORD, []string{ice.SRC_DOCUMENT + arg[0] + "/list.shy"}, arg...)
+ ctx.ProcessField(m, web.WIKI_WORD, []string{ctx.FileURI(kit.ExtChange(ctx.GetCmdFile(m, arg[0]), nfs.SHY))}, arg...)
}},
nfs.SCRIPT: {Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessField(m, web.CODE_VIMER, func() []string {
@@ -27,16 +25,7 @@ func init() {
nfs.SOURCE: {Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessField(m, web.CODE_VIMER, func() []string { return nfs.SplitPath(m, ctx.GetCmdFile(m, arg[0])) }, arg...)
}},
- ctx.CONFIG: {Hand: func(m *ice.Message, arg ...string) {
- ctx.ProcessField(m, ctx.CONFIG, arg, arg...)
- }},
- ctx.RUN: {Hand: func(m *ice.Message, arg ...string) {
- if aaa.Right(m, arg) {
- if m.Cmdy(arg); m.IsErrNotFound() {
- m.RenderResult(m.Cmdx(cli.SYSTEM, arg))
- }
- }
- }},
+ ctx.CONFIG: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessField(m, ctx.CONFIG, arg, arg...) }},
}, web.ApiWhiteAction()), Hand: func(m *ice.Message, arg ...string) {
m.Result(kit.Select(ice.Info.Make.Email, mdb.Config(m, TITLE)))
}},
diff --git a/core/chat/grant.go b/core/chat/grant.go
index 6b0ac2ab..3703d6e9 100644
--- a/core/chat/grant.go
+++ b/core/chat/grant.go
@@ -37,7 +37,7 @@ func init() {
m.ProcessLocation(web.MergeURL2(m, msg.Append(mdb.TEXT)))
}
}},
- }, aaa.RoleAction(aaa.CONFIRM), gdb.EventAction(web.SPACE_LOGIN)), Hand: func(m *ice.Message, arg ...string) {
+ }, aaa.RoleAction(aaa.CONFIRM), gdb.EventsAction(web.SPACE_LOGIN)), Hand: func(m *ice.Message, arg ...string) {
m.Echo("请授权: %s 访问设备: %s", arg[0], ice.Info.Hostname).Echo(lex.NL).EchoButton(aaa.CONFIRM)
}},
})
diff --git a/core/chat/iframe.go b/core/chat/iframe.go
index 2585adac..68a105b0 100644
--- a/core/chat/iframe.go
+++ b/core/chat/iframe.go
@@ -47,31 +47,22 @@ func init() {
case mdb.TYPE:
m.Push(arg[0], web.LINK)
default:
- if m.Option(mdb.TYPE) != "" && m.Option(mdb.TYPE) != web.LINK {
- return
- }
- switch arg[0] {
- case mdb.NAME:
- m.Push(arg[0], web.UserWeb(m).Host)
- case mdb.LINK, ctx.ARGS:
- m.Push(arg[0], m.Option(ice.MSG_USERWEB))
- m.Copy(m.Cmd(web.SPIDE).CutTo(web.CLIENT_URL, arg[0]))
+ if m.Option(mdb.TYPE) == web.LINK {
+ switch arg[0] {
+ case mdb.NAME:
+ m.Push(arg[0], web.UserWeb(m).Host)
+ case mdb.TEXT:
+ m.Push(arg[0], m.Option(ice.MSG_USERWEB))
+ m.Copy(m.Cmd(web.SPIDE).CutTo(web.CLIENT_URL, arg[0]))
+ }
}
}
}},
FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) {
- kit.If(arg[1] == web.LINK, func() { m.PushButton(IFRAME, mdb.REMOVE) })
+ kit.If(m.Option(mdb.TYPE) == web.LINK, func() { m.PushButton(kit.Dict(m.CommandKey(), "网页")) })
}},
FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) {
- if m.Option(mdb.TYPE) != web.LINK {
- return
- }
- switch kit.Select("", arg, 1) {
- case web.OPEN:
- m.ProcessOpen(m.Option(mdb.TEXT))
- default:
- ctx.ProcessField(m, m.PrefixKey(), []string{m.Option(mdb.TEXT)}, arg...)
- }
+ kit.If(m.Option(mdb.TYPE) == web.LINK, func() { ctx.ProcessField(m, m.PrefixKey(), m.Option(mdb.TEXT)) })
}},
}, FavorAction(), mdb.HashAction(mdb.SHORT, web.LINK, mdb.FIELD, "time,hash,type,name,link")), Hand: func(m *ice.Message, arg ...string) {
list := []string{m.MergePodCmd("", web.WIKI_PORTAL, log.DEBUG, m.Option(log.DEBUG))}
diff --git a/core/chat/location.go b/core/chat/location.go
index 1b490a60..f9b2bee2 100644
--- a/core/chat/location.go
+++ b/core/chat/location.go
@@ -45,7 +45,7 @@ func init() {
kit.If(arg[0] == mdb.TYPE, func() { m.Push(arg[0], LOCATION) })
}},
FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) {
- kit.If(arg[1] == LOCATION, func() { m.PushButton(LOCATION, mdb.REMOVE) })
+ kit.If(m.Option(mdb.TYPE) == LOCATION, func() { m.PushButton(LOCATION) })
}},
FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) {
kit.If(m.Option(mdb.TYPE) == LOCATION, func() { ctx.ProcessField(m, m.PrefixKey(), []string{m.Option(mdb.TEXT)}, arg...) })
diff --git a/core/chat/macos/applications.go b/core/chat/macos/applications.go
index d02f54f0..6e60b1a0 100644
--- a/core/chat/macos/applications.go
+++ b/core/chat/macos/applications.go
@@ -19,46 +19,28 @@ func init() {
Index.MergeCommands(ice.Commands{
APPLICATIONS: {Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- FinderAppend(m, "Applications", m.PrefixKey())
+ FinderAppend(m, APPLICATIONS, m.PrefixKey())
+ defer Notify(m, "Infomation.png", cli.RUNTIME, "系统启动成功", ctx.INDEX, cli.RUNTIME)
m.Travel(func(p *ice.Context, c *ice.Context, key string, cmd *ice.Command) {
kit.If(cmd.Icon, func() {
if !kit.HasPrefix(cmd.Icon, nfs.PS, web.HTTP) {
- if !nfs.Exists(m, cmd.Icon) {
- nfs.Exists(m, ice.USR_ICONS+cmd.Icon, func(p string) { cmd.Icon = p })
- }
- if !nfs.Exists(m, cmd.Icon) {
+ kit.If(!nfs.Exists(m, cmd.Icon), func() { nfs.Exists(m, ice.USR_ICONS+cmd.Icon, func(p string) { cmd.Icon = p }) })
+ kit.If(!nfs.Exists(m, cmd.Icon), func() {
nfs.Exists(m, ctx.GetCmdFile(m, m.PrefixKey()), func(p string) { cmd.Icon = path.Join(path.Dir(p), cmd.Icon) })
- }
+ })
}
AppInstall(m, cmd.Icon, m.PrefixKey())
})
})
- Notify(m, "usr/icons/Infomation.png", cli.RUNTIME, "系统启动成功", ctx.INDEX, cli.RUNTIME)
}},
- ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { mdb.Conf(m, m.PrefixKey(), mdb.HASH, "") }},
code.INSTALL: {Hand: func(m *ice.Message, arg ...string) { AppInstall(m, arg[0], arg[1]) }},
- mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
- switch arg[0] {
- case web.SPACE:
- m.Cmdy(web.SPACE).CutTo(mdb.NAME, arg[0])
- case ctx.INDEX:
- m.Cmdy(web.Space(m, m.Option(web.SPACE)), ctx.COMMAND)
- case ctx.ARGS:
- m.Cmdy(web.Space(m, m.Option(web.SPACE)), ctx.COMMAND, mdb.INPUTS, m.Option(ctx.INDEX))
- case mdb.ICON:
- if m.Option(ctx.INDEX) != "" {
- m.Cmd(web.Space(m, m.Option(web.SPACE)), m.Option(ctx.INDEX), mdb.INPUTS, arg[0]).Table(func(value ice.Maps) {
- m.Push(arg[0], value[arg[0]]+"?pod="+kit.Keys(m.Option(ice.MSG_USERPOD), m.Option(web.SPACE)))
- })
- }
- m.Cmd(nfs.DIR, USR_ICONS, func(value ice.Maps) { m.Push(arg[0], value[nfs.PATH]) })
- }
- }}, mdb.CREATE: {Name: "create space index args name icon"},
- }, PodCmdAction(), CmdHashAction("space,index,args"))},
+ mdb.CREATE: {Name: "create space index args name icon"},
+ }, PodCmdAction(), CmdHashAction("space,index,args"), mdb.ClearOnExitHashAction())},
})
}
func install(m *ice.Message, cmd, icon, index string, arg ...string) {
- name := kit.TrimExt(path.Base(icon), "png")
+ name := kit.TrimExt(path.Base(icon), nfs.PNG, nfs.JPG)
+ nfs.Exists(m, ice.USR_ICONS+icon, func(p string) { icon = p })
m.Cmd(Prefix(cmd), mdb.CREATE, mdb.NAME, name, mdb.ICON, icon, ctx.INDEX, index, arg)
}
func AppInstall(m *ice.Message, icon, index string, arg ...string) {
diff --git a/core/chat/macos/caculator.css b/core/chat/macos/caculator.css
index 6dc20ce0..33723250 100644
--- a/core/chat/macos/caculator.css
+++ b/core/chat/macos/caculator.css
@@ -1,24 +1,6 @@
-fieldset.web.chat.caculator>div.output>div.display {
- text-align:right;
- height:80px;
- width:100%;
- font-size:50px;
-}
-fieldset.web.chat.caculator>div.output>table {
- width:100%;
-}
-fieldset.web.chat.caculator>div.output>table td {
- text-align:center;
- height:80px;
- width:80px;
-}
-fieldset.web.chat.caculator>div.output>table tr:first-child td {
- background-color:#46504d; color:white;
-}
-fieldset.web.chat.caculator>div.output>table td:last-child {
- background-color:#fb9f0d !important; color:white;
-}
-fieldset.web.chat.caculator>div.output>table td:hover {
- background-color:var(--hover-bg-color) !important;
- cursor:pointer;
-}
+fieldset.web.chat.caculator>div.output>div.display { text-align:right; font-size:50px; height:80px; width:100%; }
+fieldset.web.chat.caculator>div.output>table { width:100%; }
+fieldset.web.chat.caculator>div.output>table td { text-align:center; height:80px; width:80px; }
+fieldset.web.chat.caculator>div.output>table tr:first-child td { background-color:#46504d; color:white; }
+fieldset.web.chat.caculator>div.output>table td:last-child { background-color:#fb9f0d !important; color:white; }
+fieldset.web.chat.caculator>div.output>table td:hover { background-color:var(--hover-bg-color) !important; cursor:pointer; }
diff --git a/core/chat/macos/caculator.go b/core/chat/macos/caculator.go
index 1409a238..e8ab5ba9 100644
--- a/core/chat/macos/caculator.go
+++ b/core/chat/macos/caculator.go
@@ -4,9 +4,10 @@ import (
ice "shylinux.com/x/icebergs"
)
+const CACULATOR = "caculator"
+
func init() {
- const CACULATOR = "caculator"
Index.MergeCommands(ice.Commands{
- CACULATOR: {Name: "caculator refresh", Icon: "Caculator.png", Hand: func(m *ice.Message, arg ...string) { m.Display("") }},
+ CACULATOR: {Icon: "Caculator.png", Hand: func(m *ice.Message, arg ...string) { m.Display("") }},
})
}
diff --git a/core/chat/macos/caculator.js b/core/chat/macos/caculator.js
index f47d01df..f42d1e73 100644
--- a/core/chat/macos/caculator.js
+++ b/core/chat/macos/caculator.js
@@ -7,40 +7,30 @@ Volcanos(chat.ONIMPORT, {
["1", "2", "3", "+"],
["0", "00", ".", "="],
]
- can.ui.display = can.page.Append(can, can._output, [{view: "display", inner: "0"}])._target
+ can.ui.display = can.page.Append(can, can._output, [{view: html.DISPLAY, inner: "0"}])._target
var table = can.page.Append(can, can._output, [{type: html.TABLE}])._target
can.page.Append(can, table, can.core.List(list, function(list) {
return {type: html.TR, list: can.core.List(list, function(item) {
- return {type: html.TD, inner: item, onclick: function(event) {
- var cb = can.ondetail[item]; cb? cb(event, can, item): (
- can.ui.display.innerHTML = can.base.trimPrefix(can.ui.display.innerHTML + item, "0")
- )
+ return {type: html.TD, inner: item, onclick: function(event) { var cb = can.ondetail[item]
+ cb? cb(event, can, item): (can.ui.display.innerHTML = can.base.trimPrefix(can.ui.display.innerHTML + item, "0"))
}}
}) }
}))
},
- _show: function(can) {
- },
}, [""])
Volcanos(chat.ONACTION, {
onkeydown: function(event, can) {
switch (event.key) {
- case "=":
- can.ondetail[event.key](evnt, can, event.key)
- case "Shift":
+ case "=": can.ondetail[event.key](evnt, can, event.key); break
case "Backspace":
- break
- default:
- can.ui.display.innerHTML += event.key
+ case "Shift": break
+ default: can.ui.display.innerHTML += event.key
}
},
})
Volcanos(chat.ONDETAIL, {
- "AC": function(event, can, button) {
- can.ui.display.innerHTML = "0"
- },
- "=": function(event, can, button) {
- var list = []
+ "AC": function(event, can, button) { can.ui.display.innerHTML = "0" },
+ "=": function(event, can, button) { var list = []
can.core.List(can.core.Split(can.ui.display.innerHTML, "", "+-*/%"), function(item) {
switch (item) {
case "+":
@@ -52,6 +42,5 @@ Volcanos(chat.ONDETAIL, {
}
})
},
- "+/-": function(event, can, button) {
- },
+ "+/-": function(event, can, button) {},
})
diff --git a/core/chat/macos/clock.go b/core/chat/macos/clock.go
index 9da0b1b0..cd288e66 100644
--- a/core/chat/macos/clock.go
+++ b/core/chat/macos/clock.go
@@ -4,9 +4,10 @@ import (
ice "shylinux.com/x/icebergs"
)
+const CLOCK = "clock"
+
func init() {
- const CLOCK = "clock"
Index.MergeCommands(ice.Commands{
- CLOCK: {Name: "clock refresh", Icon: "Clock.png", Hand: func(m *ice.Message, arg ...string) { m.Display("") }},
+ CLOCK: {Icon: "Clock.png", Hand: func(m *ice.Message, arg ...string) { m.Display("") }},
})
}
diff --git a/core/chat/macos/desktop.go b/core/chat/macos/desktop.go
index c843f3e1..a36ddfb8 100644
--- a/core/chat/macos/desktop.go
+++ b/core/chat/macos/desktop.go
@@ -14,22 +14,19 @@ func init() {
Index.MergeCommands(ice.Commands{
DESKTOP: {Help: "应用桌面", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- if mdb.HashImport(m); m.Cmd(DESKTOP).Length() == 0 {
- DeskAppend(m, "usr/icons/Books.png", web.WIKI_WORD)
- DeskAppend(m, "usr/icons/Photos.png", web.WIKI_FEEL)
- DeskAppend(m, "usr/icons/Grapher.png", web.WIKI_DRAW)
- DeskAppend(m, "usr/icons/Calendar.png", web.TEAM_PLAN)
+ if m.Cmd(DESKTOP).Length() == 0 {
+ DeskAppend(m, "Books.png", web.WIKI_WORD)
+ DeskAppend(m, "Photos.png", web.WIKI_FEEL)
+ DeskAppend(m, "Grapher.png", web.WIKI_DRAW)
+ DeskAppend(m, "Calendar.png", web.TEAM_PLAN)
}
}},
- ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { mdb.HashExport(m) }},
web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
- kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() { m.PushButton(kit.Dict(m.CommandKey(), "桌面")) })
+ kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.WORKER, web.SERVER), func() { m.PushButton(kit.Dict(m.CommandKey(), "桌面")) })
}},
web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { web.DreamProcess(m, []string{}, arg...) }},
- }, aaa.RoleAction(), PodCmdAction(), CmdHashAction(), mdb.ImportantHashAction())},
+ }, aaa.RoleAction(), PodCmdAction(), CmdHashAction(), mdb.ExportHashAction())},
})
}
-func DeskAppend(m *ice.Message, icon, index string) {
- install(m, DESKTOP, icon, index)
-}
+func DeskAppend(m *ice.Message, icon, index string) { install(m, DESKTOP, icon, index) }
diff --git a/core/chat/macos/desktop.js b/core/chat/macos/desktop.js
index 07b3b48f..ca91df69 100644
--- a/core/chat/macos/desktop.js
+++ b/core/chat/macos/desktop.js
@@ -1,25 +1,26 @@
(function() {
Volcanos(chat.ONIMPORT, {
- _init: function(can, msg) { can.onmotion.clear(can), can.isCmdMode() && can.onappend.style(can, html.OUTPUT)
+ _init: function(can, msg) { can.isCmdMode() && can.onappend.style(can, html.OUTPUT)
can.onlayout.background(can, can.user.info.background||"/require/usr/icons/background.jpg", can._fields)
can.onimport._menu(can), can.onimport._notifications(can), can.onimport._searchs(can), can.onimport._dock(can)
},
- _menu: function(can) { can.onappend.plugin(can, {_space: can.ConfSpace(), index: "web.chat.macos.menu", style: html.OUTPUT}, function(sub) { can.ui.menu = sub
- var cache = can.misc.sessionStorage(can, [can.ConfIndex(), "tabs"])
+ _menu: function(can) { can.onappend.plugin(can, {index: "web.chat.macos.menu", style: html.OUTPUT}, function(sub) { can.ui.menu = sub
+ var tabs = can.misc.sessionStorage(can, [can.ConfIndex(), html.TABS])
sub.onexport.output = function() { can.onimport._desktop(can, can._msg)
- can.Conf("session") && can.runActionCommand(event, "session", [can.Conf("session")], function(msg) {
+ var sess = can.misc.SearchHash(can)[0]||can.Conf("session")
+ sess? can.runActionCommand(event, "session", [sess], function(msg) {
var item = msg.TableDetail(); can.onimport.session(can, can.base.Obj(item.args))
- }), can.onimport.session(can, cache)
+ }): can.isCmdMode() && can.onimport.session(can, tabs)
}
sub.onexport.record = function(sub, value, key, item) { delete(can.onfigure._path)
switch (value) {
- case "create": can.onaction.create(event, can); break
- case "desktop": var carte = can.user.carte(event, can, {}, can.core.Item(can.onfigure), function(event, button, meta, carte) {
- can.onfigure[button](event, can, carte)
- return true
- }); break
case "notifications": can.ui.notifications._output.innerHTML && can.onmotion.toggle(can, can.ui.notifications._target); break
case "searchs": can.onaction._search(can); break
+ case mdb.CREATE: can.onaction.create(event, can); break
+ case html.DESKTOP:
+ var carte = can.user.carte(event, can, {}, can.core.Item(can.onfigure), function(event, button, meta, carte) {
+ can.onfigure[button](event, can, carte); return true
+ }); break
default: can.onimport._window(can, value)
}
}
@@ -48,8 +49,7 @@ Volcanos(chat.ONIMPORT, {
}) },
_desktop: function(can, msg, name) { var target = can.page.Append(can, can._output, [html.DESKTOP])._target; can.ui.desktop = target
target._tabs = can.onimport.tabs(can, [{name: name||"Desktop"+(can.page.Select(can, can._output, html.DIV_DESKTOP).length-1)}], function() {
- can.onmotion.select(can, can._output, "div.desktop", target), can.ui.desktop = target
- can.onexport.tabs(can)
+ can.onmotion.select(can, can._output, "div.desktop", target), can.ui.desktop = target, can.onexport.tabs(can)
}, function() { can.page.Remove(can, target) }, can.ui.menu._output), target._tabs._desktop = target
target.ondragend = function() { can.onimport._item(can, window._drag_item) }
can.onimport.__item(can, msg, target)
@@ -64,7 +64,7 @@ Volcanos(chat.ONIMPORT, {
remove: function() { can.runAction(event, mdb.REMOVE, [item.hash]) },
}); can.page.style(can, carte._target, html.TOP, event.y) },
}) }) },
- _window: function(can, item, cb) { if (!item.index) { return } item._space = can.ConfSpace()
+ _window: function(can, item, cb) { if (!item.index) { return }
item.height = can.ConfHeight()-125, item.width = can.ConfWidth()-200, item.left = (can.ConfWidth()-item.width)/2, item.top = 25
if (can.ConfWidth() > 1400) { item.width = can.base.Min(can.ConfWidth()-600, 640, 1400), item.left = (can.ConfWidth()-item.width)/2 }
if (can.ConfHeight() > 800) { item.height = can.base.Min(can.ConfHeight()-200, 320, 800), item.top = 50 }
@@ -79,10 +79,8 @@ Volcanos(chat.ONIMPORT, {
}, function(color, cb) { can.page.insertBefore(can, [{view: [[html.ITEM, html.BUTTON]], style: {"background-color": color, right: 10+20*index++}, onclick: cb}], sub._output) })
sub.onexport.marginTop = function() { return 25 }, sub.onexport.marginBottom = function() { return 100 }
sub.onexport.actionHeight = function(sub) { return can.page.ClassList.has(can, sub._target, html.OUTPUT)? 0: html.ACTION_HEIGHT+20 }
- sub.onexport.output = function() { item.index == "web.chat.macos.opens" && can.page.Remove(can, sub._target)
- sub.onimport.size(sub, item.height, can.base.Min(sub._target.offsetWidth, item.width), true)
- sub._target._meta.args = can.base.trim(can.page.SelectArgs(can, sub._option, "", function(target) { return target.value }))
- can.onexport.tabs(can)
+ sub.onexport.output = function() { sub.onimport.size(sub, item.height, can.base.Min(sub._target.offsetWidth, item.width), true)
+ sub._target._meta.args = can.base.trim(can.page.SelectArgs(can, sub._option, "", function(target) { return target.value })), can.onexport.tabs(can)
}, sub.onimport.size(sub, item.height, can.base.Min(sub._target.offsetWidth, item.width), true)
sub.onexport.record = function(sub, value, key, item) { can.onimport._window(can, item) }
sub.onimport._open = function(sub, msg, arg) { can.onimport._window(can, {index: web.CHAT_IFRAME, args: [arg]}) }
@@ -99,13 +97,14 @@ Volcanos(chat.ONIMPORT, {
cb && cb(sub)
}, can.ui.desktop)
},
- session: function(can, list) { if (!list || list.length == 0 || !can.isCmdMode() || window != window.parent) { return }
+ session: function(can, list) { if (!list || list.length == 0) { return }
+ // if (!list || list.length == 0 || !can.isCmdMode() || window != window.parent) { return }
can.page.Select(can, can._output, html.DIV_DESKTOP, function(target) { can.page.Remove(can, target) })
can.page.Select(can, can.ui.menu._output, html.DIV_TABS, function(target) { can.page.Remove(can, target) })
var _select; can.core.Next(list, function(item, next) {
var _tabs = can.onimport._desktop(can, null, item.name); _select = (!_select || item.select)? _tabs: _select
can.core.Next(item.list, function(item, next) {
- can.onimport._window(can, item, function(sub) { can.onmotion.delay(can, function() { next() }, 500) })
+ can.onimport._window(can, item, function(sub) { can.onmotion.delay(can, function() { next() }, 300) })
}, function() { next() })
}, function() { _select && _select.click() })
},
@@ -118,10 +117,10 @@ Volcanos(chat.ONACTION, {list: ["full"],
_search: function(can) { if (can.onmotion.toggle(can, can.ui.searchs._target)) {
can.page.Select(can, can.ui.searchs._option, "input[name=keyword]", function(target) { can.onmotion.focus(can, target) })
} },
- create: function(event, can) { can.onimport._desktop(can) },
full: function(event, can) { document.body.requestFullscreen() },
+ create: function(event, can) { can.onimport._desktop(can) },
})
-Volcanos(chat.ONKEYMAP, {
+Volcanos(chat.ONKEYMAP, {
escape: function(event, can) { can.onmotion.hidden(can, can.ui.searchs._target) },
space: function(event, can) { can.onaction._search(can), can.onkeymap.prevent(event) },
enter: function(event, can) { can.page.Select(can, can.ui.desktop, "fieldset.select", function(target) { target._can.Update(event) }) },
@@ -147,6 +146,7 @@ Volcanos(chat.ONEXPORT, {
})
Volcanos(chat.ONFIGURE, {
"session\t>": function(event, can, carte) { can.runActionCommand(event, "session", [], function(msg) {
+ var hash = can.misc.SearchHash(can)
var _carte = can.user.carteRight(event, can, {}, [{view: [html.ITEM, "", mdb.CREATE], onclick: function(event) {
can.user.input(event, can, [mdb.NAME], function(list) {
var args = can.page.SelectChild(can, can._output, html.DIV_DESKTOP, function(target) {
@@ -156,11 +156,15 @@ Volcanos(chat.ONFIGURE, {
})
can.runActionCommand(event, "session", [ctx.ACTION, mdb.CREATE, mdb.NAME, list[0], ctx.ARGS, JSON.stringify(args)], function(msg) {
can.user.toastSuccess(can, "session created")
+ can.misc.SearchHash(can, list[0])
})
})
}}].concat("", msg.Table(function(value) {
- return {view: [html.ITEM, "", value.name],
- onclick: function() { can.onimport.session(can, can.base.Obj(value.args, [])) },
+ return {view: [html.ITEM, "", value.name+(value.name == hash[0]? " *": "")],
+ onclick: function() {
+ can.onimport.session(can, can.base.Obj(value.args, []))
+ can.misc.SearchHash(can, value.name)
+ },
oncontextmenu: function(event) { can.user.carteRight(event, can, {
open: function() { can.user.open(can.misc.MergePodCmd(can, {cmd: "desktop", session: value.name})) },
remove: function() { can.runActionCommand(event, "session", [mdb.REMOVE, value.name], function() { can.user.toastSuccess(can, "session removed") }) },
@@ -184,7 +188,7 @@ Volcanos(chat.ONFIGURE, {
can.user.carteRight(event, can, {}, [{view: [html.ITEM, "", mdb.CREATE], onclick: function(event) {
can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(data) { can.onimport._window(can, data) })
}}, ""].concat(can.page.Select(can, can.ui.desktop, "fieldset>legend", function(legend) {
- return {view: [html.ITEM, "", legend.innerText+(legend.parentNode.style["z-index"] == "10"? " *": "")], onclick: function(event) {
+ return {view: [html.ITEM, "", legend.innerText+(can.page.ClassList.has(can, legend.parentNode, html.SELECT)? " *": "")], onclick: function(event) {
can.ondetail.select(can, legend.parentNode)
}}
})), function(event) {}, carte)
diff --git a/core/chat/macos/dock.go b/core/chat/macos/dock.go
index b4fed46d..62e31831 100644
--- a/core/chat/macos/dock.go
+++ b/core/chat/macos/dock.go
@@ -12,19 +12,16 @@ const DOCK = "dock"
func init() {
Index.MergeCommands(ice.Commands{DOCK: {Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- if mdb.HashImport(m); m.Cmd(DOCK).Length() == 0 {
- DockAppend(m, "usr/icons/Finder.png", Prefix(FINDER))
- DockAppend(m, "usr/icons/Safari.png", web.CHAT_IFRAME)
- DockAppend(m, "usr/icons/Terminal.png", web.CODE_XTERM)
- DockAppend(m, "usr/icons/vimer.png", web.CODE_VIMER)
- DockAppend(m, "usr/icons/go.png", web.CODE_COMPILE)
- DockAppend(m, "usr/icons/git.png", web.CODE_GIT_STATUS)
+ if m.Cmd(DOCK).Length() == 0 {
+ DockAppend(m, "Finder.png", Prefix(FINDER))
+ DockAppend(m, "Safari.png", web.CHAT_IFRAME)
+ DockAppend(m, "Terminal.png", web.CODE_XTERM)
+ DockAppend(m, "go.png", web.CODE_COMPILE)
+ DockAppend(m, "git.png", web.CODE_GIT_STATUS)
+ DockAppend(m, "vimer.png", web.CODE_VIMER)
}
}},
- ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { mdb.HashExport(m) }},
- }, aaa.RoleAction(), CmdHashAction(), mdb.ImportantHashAction())}})
+ }, aaa.RoleAction(), CmdHashAction(), mdb.ExportHashAction())}})
}
-func DockAppend(m *ice.Message, icon, index string) {
- install(m, DOCK, icon, index)
-}
+func DockAppend(m *ice.Message, icon, index string) { install(m, DOCK, icon, index) }
diff --git a/core/chat/macos/dock.js b/core/chat/macos/dock.js
index 1d8e7296..aae40e3f 100644
--- a/core/chat/macos/dock.js
+++ b/core/chat/macos/dock.js
@@ -1,4 +1,4 @@
-Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can), can.page.style(can, can._output, html.MAX_WIDTH, can.page.width())
+Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.page.style(can, can._output, html.MAX_WIDTH, can.page.width())
can.onimport.icon(can, msg = msg||can._msg, can._output, function(target, item) { can.page.Modify(can, target, {
onclick: function(event) { can.sup.onexport.record(can, item.name, mdb.NAME, item) },
oncontextmenu: function(event) { var carte = can.user.carte(event, can, {
diff --git a/core/chat/macos/finder.go b/core/chat/macos/finder.go
index 954b633e..22eb9541 100644
--- a/core/chat/macos/finder.go
+++ b/core/chat/macos/finder.go
@@ -14,6 +14,4 @@ func init() {
}, CmdHashAction(mdb.NAME))}})
}
-func FinderAppend(m *ice.Message, icon, index string) {
- install(m, FINDER, icon, index)
-}
+func FinderAppend(m *ice.Message, icon, index string) { install(m, FINDER, icon, index) }
diff --git a/core/chat/macos/finder.js b/core/chat/macos/finder.js
index 92a8adb0..70fa1568 100644
--- a/core/chat/macos/finder.js
+++ b/core/chat/macos/finder.js
@@ -1,8 +1,9 @@
-Volcanos(chat.ONIMPORT, { _init: function(can, msg) { can.onmotion.clear(can), can.ui = can.onappend.layout(can), msg.Table(function(value, index) {
+Volcanos(chat.ONIMPORT, {
+ _init: function(can, msg) { can.ui = can.onappend.layout(can), msg.Table(function(value, index) {
var item = can.onimport.item(can, value, function(event) { if (can.onmotion.cache(can, function() { return value.name }, can.ui.content)) { return }
can.runActionCommand(event, value.index, [], function(msg) {
switch (value.name) {
- case "Applications": can.onimport.icons(can, msg, can.ui.content); break
+ case "applications": can.onimport.icons(can, msg, can.ui.content); break
default: can.onappend.table(can, msg, null, can.ui.content)
} can.onimport.layout(can)
})
diff --git a/core/chat/macos/macos.go b/core/chat/macos/macos.go
index e4b23dda..8ef8ac79 100644
--- a/core/chat/macos/macos.go
+++ b/core/chat/macos/macos.go
@@ -10,14 +10,11 @@ import (
kit "shylinux.com/x/toolkits"
)
-const (
- USR_ICONS = "usr/icons/"
-)
const MACOS = "macos"
-var Index = &ice.Context{Name: MACOS, Commands: ice.Commands{ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- ice.Info.Load(m).Cmd(FINDER, ice.CTX_INIT)
-}}}}
+var Index = &ice.Context{Name: MACOS, Commands: ice.Commands{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.Info.Load(m).Cmd(FINDER, ice.CTX_INIT) }},
+}}
func init() { chat.Index.Register(Index, nil, DESKTOP, APPLICATIONS) }
@@ -27,17 +24,13 @@ func PodCmdAction(arg ...string) ice.Actions {
file := kit.FileLine(2, 100)
return ice.Actions{
mdb.SELECT: {Name: "list hash auto create", Hand: func(m *ice.Message, arg ...string) {
- msg := m.Spawn()
- mdb.HashSelect(msg, arg...).Sort(mdb.NAME)
+ defer m.Display(ctx.FileURI(file))
+ msg := mdb.HashSelect(m.Spawn(), arg...).Sort(mdb.NAME)
web.PushPodCmd(msg, m.PrefixKey(), arg...)
has := map[string]bool{}
msg.Table(func(index int, value ice.Maps, head []string) {
- if !has[value[ctx.INDEX]] {
- has[value[ctx.INDEX]] = true
- m.Push("", value, head)
- }
+ kit.If(!has[value[ctx.INDEX]], func() { has[value[ctx.INDEX]] = true; m.Push("", value, head) })
})
- m.Display(ctx.FileURI(file))
}},
}
}
@@ -46,10 +39,10 @@ func CmdHashAction(arg ...string) ice.Actions {
return ice.MergeActions(ice.Actions{
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] {
- case mdb.NAME:
- m.Cmd(nfs.DIR, USR_ICONS, func(value ice.Maps) { m.Push(arg[0], kit.TrimExt(value[nfs.PATH], nfs.PNG)) })
case mdb.ICON:
- m.Cmd(nfs.DIR, USR_ICONS, func(value ice.Maps) { m.Push(arg[0], value[nfs.PATH]) })
+ m.Cmd(nfs.DIR, ice.USR_ICONS, func(value ice.Maps) { m.Push(arg[0], value[nfs.PATH]) })
+ case mdb.NAME:
+ m.Cmd(nfs.DIR, ice.USR_ICONS, func(value ice.Maps) { m.Push(arg[0], kit.TrimExt(value[nfs.PATH], nfs.PNG)) })
}
}},
mdb.SELECT: {Name: "list hash auto create", Hand: func(m *ice.Message, arg ...string) {
diff --git a/core/chat/macos/macos.shy b/core/chat/macos/macos.shy
index 52ae4615..3abdec72 100644
--- a/core/chat/macos/macos.shy
+++ b/core/chat/macos/macos.shy
@@ -1,17 +1,23 @@
title "MacOS"
chain `
-desktop
- menu
- notifications
- searchs
- session
- desktop
- window
- layout
- dock
- Finder
- Applications
- Pictures
- Safari
- Terminal
-`
\ No newline at end of file
+desktop.go
+ menu.go
+ notifications.go
+ searchs.go
+ session.go
+ dock.go
+ finder.go
+ applications.go
+ caculator.go
+ clock.go
+`
+chain `
+desktop.js
+ menu.js
+ notifications.js
+ dock.js
+ finder.js
+ caculator.js
+ clock.js
+`
+
diff --git a/core/chat/macos/menu.go b/core/chat/macos/menu.go
index 2a0c4395..f5f081bd 100644
--- a/core/chat/macos/menu.go
+++ b/core/chat/macos/menu.go
@@ -10,9 +10,8 @@ const MENU = "menu"
func init() {
Index.MergeCommands(ice.Commands{
- MENU: {Actions: ice.MergeActions(aaa.RoleAction(), CmdHashAction(), mdb.ImportantHashAction())},
+ MENU: {Actions: ice.MergeActions(aaa.RoleAction(), CmdHashAction(), mdb.ClearOnExitHashAction())},
})
}
-func MenuAppend(m *ice.Message, icon, index string) {
- install(m, MENU, icon, index)
-}
+
+func MenuAppend(m *ice.Message, icon, index string) { install(m, MENU, icon, index) }
diff --git a/core/chat/macos/menu.js b/core/chat/macos/menu.js
index bba31a91..1f49509d 100644
--- a/core/chat/macos/menu.js
+++ b/core/chat/macos/menu.js
@@ -1,4 +1,4 @@
-Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) {
+Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.page.style(can, can._output, html.MAX_WIDTH, "")
can.page.Append(can, can._output, can.user.header(can)), can.page.Append(can, can._output, [
{view: [html.ITEM], list: [{img: can.page.drawText(can, "n", 25, 0, 20)}], onclick: function(event) { can.sup.onexport.record(can, "notifications") }},
{view: [html.ITEM], list: [{img: can.page.drawText(can, "s", 25, 0, 20)}], onclick: function(event) { can.sup.onexport.record(can, "searchs") }},
@@ -6,6 +6,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) {
return {view: [html.ITEM], list: [{img: can.page.drawText(can, item.name||item.index, 25, 0, 20)}], onclick: function(event) { can.sup.onexport.record(can, item) }}
}), [
{view: [html.MENU, "", can.ConfSpace()||can.misc.Search(can, ice.POD)||location.host], onclick: function(event) { can.sup.onexport.record(can, html.DESKTOP) }},
- {view: [[html.MENU, mdb.CREATE], "", "+"], onclick: function(event) { can.sup.onexport.record(can, mdb.CREATE) }},
- ])), cb && cb(msg), can.page.style(can, can._output, html.MAX_WIDTH, "")
+ {view: [[html.MENU, mdb.CREATE], "", can.page.unicode.create], onclick: function(event) { can.sup.onexport.record(can, mdb.CREATE) }},
+ ]))
}})
diff --git a/core/chat/macos/notifications.go b/core/chat/macos/notifications.go
index 5afd3f0a..dca09fc2 100644
--- a/core/chat/macos/notifications.go
+++ b/core/chat/macos/notifications.go
@@ -5,6 +5,7 @@ import (
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
+ "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
)
@@ -12,18 +13,19 @@ const NOTIFICATIONS = "notifications"
func init() {
Index.MergeCommands(ice.Commands{
- NOTIFICATIONS: {Name: "notifications list", Actions: ice.MergeActions(ice.Actions{
+ NOTIFICATIONS: {Actions: ice.MergeActions(ice.Actions{
web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) {
- Notify(m, "usr/icons/Launchpad.png", m.Option(mdb.NAME), "空间创建成功", ctx.INDEX, web.CHAT_IFRAME, ctx.ARGS, m.MergePod(m.Option(mdb.NAME)))
+ Notify(m, "Launchpad.png", m.Option(mdb.NAME), "空间创建成功", ctx.INDEX, web.CHAT_IFRAME, ctx.ARGS, m.MergePod(m.Option(mdb.NAME)))
}},
"read": {Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(mdb.MODIFY, m.PrefixKey(), "", mdb.LIST, mdb.ID, m.Option(mdb.ID), mdb.STATUS, "read")
+ m.Cmd(mdb.MODIFY, m.PrefixKey(), "", mdb.LIST, m.OptionSimple(mdb.ID), mdb.STATUS, m.ActionKey())
}},
- }, gdb.EventAction(web.DREAM_CREATE), mdb.ListAction(mdb.FIELD, "time,id,status,icon,name,text,space,index,args")), Hand: func(m *ice.Message, arg ...string) {
+ }, gdb.EventsAction(web.DREAM_CREATE), mdb.ListAction(mdb.FIELD, "time,id,status,icon,name,text,space,index,args")), Hand: func(m *ice.Message, arg ...string) {
mdb.ListSelect(m, arg...).Display("")
}},
})
}
func Notify(m *ice.Message, icon, name, text string, arg ...string) {
+ nfs.Exists(m, ice.USR_ICONS+icon, func(p string) { icon = p })
m.Cmd(NOTIFICATIONS, mdb.INSERT, mdb.ICON, icon, mdb.NAME, name, mdb.TEXT, text, arg)
}
diff --git a/core/chat/macos/notifications.js b/core/chat/macos/notifications.js
index 26de1c86..2df50f59 100644
--- a/core/chat/macos/notifications.js
+++ b/core/chat/macos/notifications.js
@@ -3,16 +3,13 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
var ui = can.onappend.layout(can, [html.ICON, [[wiki.TITLE, mdb.TIME], wiki.CONTENT]], "", target)
can.page.Append(can, ui.icon, [{img: can.misc.PathJoin(item.icon||can.page.drawText(can, item.name||item.index, 60))}])
ui.title.innerHTML = item.name||"", ui.content.innerHTML = item.text||"", ui.time.innerHTML = item.time.split(lex.SP).pop().split(nfs.DF).slice(0, 2).join(nfs.DF)
- target.onclick = function(event) { can.sup.onexport.record(can.sup, item.index, ctx.INDEX, item),
- can.runAction(can.request(event, item), "read", [], function() {
- can.onappend.style(can, "read", target)
- return
- can.page.Remove(can, target) }) }
+ target.onclick = function(event) { can.sup.onexport.record(can.sup, item.index, ctx.INDEX, item)
+ can.runAction(can.request(event, item), "read", [], function() { can.onappend.style(can, "read", target) })
+ }
}} })), msg.Length() == 0 && can.onmotion.hidden(can, can._fields), can.onappend._action(can), can.page.style(can, can._action, html.DISPLAY, html.BLOCK)
}})
Volcanos(chat.ONACTION, {
- list: [web.REFRESH, mdb.PRUNES, html.TOGGLE],
- _trans: {refresh: "刷新", toggle: "隐藏"},
- refresh: function(event, can, button) { can.Update(event) },
+ list: [web.REFRESH, mdb.PRUNES, html.TOGGLE], _trans: {refresh: "刷新", toggle: "隐藏"},
toggle: function(event, can, button) { can.onmotion.hidden(can, can._fields) },
+ refresh: function(event, can, button) { can.Update(event) },
})
diff --git a/core/chat/macos/opens.go b/core/chat/macos/opens.go
deleted file mode 100644
index 33f2f28d..00000000
--- a/core/chat/macos/opens.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package macos
-
-import (
- ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/cli"
- "shylinux.com/x/icebergs/base/tcp"
- kit "shylinux.com/x/toolkits"
-)
-
-const OPENS = "opens"
-
-func init() {
- Index.MergeCommands(ice.Commands{
- OPENS: {Name: "opens app auto", Hand: func(m *ice.Message, arg ...string) {
- if tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) {
- arg[0] = kit.ExtChange(arg[0], "app")
- cli.Opens(m, arg...)
- }
- }},
- })
-}
diff --git a/core/chat/macos/searchs.go b/core/chat/macos/searchs.go
index dbf76a7c..8e4dc9d2 100644
--- a/core/chat/macos/searchs.go
+++ b/core/chat/macos/searchs.go
@@ -10,7 +10,7 @@ const SEARCHS = "searchs"
func init() {
Index.MergeCommands(ice.Commands{
- SEARCHS: {Name: "searchs keyword list", Hand: func(m *ice.Message, arg ...string) {
+ SEARCHS: {Name: "searchs keyword list", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.SEARCH, mdb.FOREACH, kit.Select("", arg, 0), "ctx,cmd,type,name,text")
}},
})
diff --git a/core/chat/macos/session.go b/core/chat/macos/session.go
index 168d2ebf..d8dc5a45 100644
--- a/core/chat/macos/session.go
+++ b/core/chat/macos/session.go
@@ -9,9 +9,9 @@ const SESSION = "session"
func init() {
Index.MergeCommands(ice.Commands{
- SESSION: {Actions: ice.MergeActions(CmdHashAction(mdb.NAME), mdb.ImportantHashAction()), Hand: func(m *ice.Message, arg ...string) {
+ SESSION: {Actions: ice.MergeActions(CmdHashAction(mdb.NAME), mdb.ExportHashAction()), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) > 0 {
- m.EchoIFrame(m.MergePodCmd("", DESKTOP, SESSION, arg[0]))
+ m.EchoIFrame(m.MergePodCmd("", DESKTOP) + "#" + m.Append(mdb.NAME))
}
}},
})
diff --git a/core/chat/oauth/client.go b/core/chat/oauth/client.go
index 9ae27527..ec38d012 100644
--- a/core/chat/oauth/client.go
+++ b/core/chat/oauth/client.go
@@ -44,7 +44,7 @@ type Client struct {
user string `name:"user" help:"用户"`
orgs string `name:"orgs" help:"组织"`
repo string `name:"repo" help:"资源"`
- list string `name:"list hash auto" help:"授权"`
+ list string `name:"list hash auto" help:"授权" icon:"oauth.png"`
login string `name:"login" role:"void"`
}
diff --git a/core/chat/trans.go b/core/chat/trans.go
index 53cac39f..4fd5f0b5 100644
--- a/core/chat/trans.go
+++ b/core/chat/trans.go
@@ -21,7 +21,7 @@ func init() {
TO = "to"
)
Index.MergeCommands(ice.Commands{
- TRANS: {Name: "trans from@key to@key auto", Help: "传输", Icon: "Migration.png", Actions: ice.Actions{
+ TRANS: {Name: "trans from@key to@key auto", Help: "文件传输", Icon: "Migration.png", Actions: ice.Actions{
SEND: {Hand: func(m *ice.Message, arg ...string) {
defer web.ToastProcess(m)()
p := web.ProxyUpload(m, m.Option(FROM), m.Option(nfs.PATH))
diff --git a/core/code/vimer.go b/core/code/vimer.go
index 897e3263..192900b3 100644
--- a/core/code/vimer.go
+++ b/core/code/vimer.go
@@ -15,6 +15,7 @@ import (
"shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@@ -189,10 +190,32 @@ func init() {
}
}},
web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
- kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() { m.PushButton(kit.Dict(m.CommandKey(), "编程")) })
+ kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.WORKER, web.SERVER), func() {
+ m.PushButton(kit.Dict(m.CommandKey(), "编程"))
+ })
}},
web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { web.DreamProcess(m, []string{}, arg...) }},
- }, aaa.RoleAction(), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path", ctx.TOOLS, "xterm,compile,runtime")), Hand: func(m *ice.Message, arg ...string) {
+ chat.FAVOR_INPUTS: {Hand: func(m *ice.Message, arg ...string) {
+ switch arg[0] {
+ case mdb.TYPE:
+ m.Push(arg[0], nfs.FILE)
+ case mdb.TEXT:
+ if m.Option(mdb.TYPE) == nfs.FILE {
+ m.Push(arg[0], "src/main.go", "src/main.shy")
+ }
+ }
+ }},
+ chat.FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) {
+ kit.If(m.Option(mdb.TYPE) == nfs.FILE, func() {
+ m.PushButton(kit.Dict(m.CommandKey(), "源码"))
+ })
+ }},
+ chat.FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) {
+ if m.Option(mdb.TYPE) == nfs.FILE {
+ ctx.ProcessField(m, m.PrefixKey(), nfs.SplitPath(m, m.Option(mdb.TEXT)))
+ }
+ }},
+ }, chat.FavorAction(), aaa.RoleAction(), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path", ctx.TOOLS, "xterm,compile,runtime")), Hand: func(m *ice.Message, arg ...string) {
if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION {
kit.If(len(arg) > 1, func() { mdb.HashCreate(m.Spawn(), nfs.PATH, path.Join(kit.Slice(arg, 0, 2)...)) })
m.Action(nfs.SAVE, COMPILE, "show", "exec")
diff --git a/core/code/xterm.go b/core/code/xterm.go
index 8038691a..2b635506 100644
--- a/core/code/xterm.go
+++ b/core/code/xterm.go
@@ -15,6 +15,7 @@ import (
"shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/base/web/html"
+ "shylinux.com/x/icebergs/core/chat"
"shylinux.com/x/icebergs/misc/xterm"
kit "shylinux.com/x/toolkits"
)
@@ -71,6 +72,9 @@ func _xterm_cmds(m *ice.Message, h string, cmd string, arg ...ice.Any) {
m.ProcessHold()
}
+const (
+ SHELL = "shell"
+)
const XTERM = "xterm"
func init() {
@@ -80,7 +84,7 @@ func init() {
kit.If(m.Cmd("").Length() == 0, func() { m.Cmd("", mdb.CREATE, mdb.TYPE, ISH) })
}},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
- if arg[1] == "shell" {
+ if arg[0] == SHELL {
m.PushSearch(mdb.TYPE, ssh.SHELL, mdb.NAME, SH, mdb.TEXT, "/bin/sh")
}
mdb.IsSearchPreview(m, arg, func() []string { return []string{ssh.SHELL, SH, kit.Select("/bin/sh", os.Getenv("SHELL"))} })
@@ -150,7 +154,27 @@ func init() {
}
m.ProcessHold()
}},
- }, ctx.ProcessAction(), mdb.ImportantHashAction(mdb.FIELD, "time,hash,type,name,text,path,theme,daemon")), Hand: func(m *ice.Message, arg ...string) {
+ chat.FAVOR_INPUTS: {Hand: func(m *ice.Message, arg ...string) {
+ switch arg[0] {
+ case mdb.TYPE:
+ m.Push(arg[0], SHELL)
+ case mdb.TEXT:
+ if m.Option(mdb.TYPE) == SHELL {
+ m.Push(arg[0], "/bin/ish", kit.Select("/bin/sh", os.Getenv("SHELL")))
+ }
+ }
+ }},
+ chat.FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) {
+ kit.If(m.Option(mdb.TYPE) == SHELL, func() {
+ m.PushButton(kit.Dict(m.CommandKey(), "终端"))
+ })
+ }},
+ chat.FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) {
+ if m.Option(mdb.TYPE) == SHELL {
+ ctx.ProcessField(m, m.PrefixKey(), m.Cmdx("", mdb.CREATE, mdb.TYPE, m.Option(mdb.TEXT), mdb.NAME, m.Option(mdb.NAME), mdb.TEXT, ""))
+ }
+ }},
+ }, chat.FavorAction(), ctx.ProcessAction(), mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,path,theme,daemon")), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) == 0 {
if m.Length() == 0 {
m.Action(mdb.CREATE)
diff --git a/core/wiki/feel.go b/core/wiki/feel.go
index 6e37bf34..0e98d300 100644
--- a/core/wiki/feel.go
+++ b/core/wiki/feel.go
@@ -8,6 +8,8 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/base/web/html"
+ "shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@@ -32,7 +34,34 @@ func init() {
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) {
nfs.Trash(m, _feel_path(m, m.Option(nfs.PATH)))
}},
- }, WikiAction("", "png|PNG|jpg|JPG|jpeg|mp4|m4v|mov|MOV|webm")), Hand: func(m *ice.Message, arg ...string) {
+ chat.FAVOR_INPUTS: {Hand: func(m *ice.Message, arg ...string) {
+ switch arg[0] {
+ case mdb.TYPE:
+ m.Push(arg[0], "image/png")
+ case mdb.TEXT:
+ if m.Option(mdb.TYPE) == "image/png" {
+ m.Cmdy(nfs.DIR, ice.USR_ICONS).CutTo(nfs.PATH, arg[0])
+ }
+ }
+ }},
+ chat.FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) {
+ if html.IsImage(m.Option(mdb.NAME), m.Option(mdb.TYPE)) || html.IsVideo(m.Option(mdb.NAME), m.Option(mdb.TYPE)) || html.IsAudio(m.Option(mdb.NAME), m.Option(mdb.TYPE)) {
+ m.PushButton(kit.Dict(m.CommandKey(), "预览"))
+ }
+ }},
+ chat.FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) {
+ if m.Option(ctx.ACTION) == m.CommandKey() {
+ if link := web.SHARE_LOCAL + m.Option(mdb.TEXT); html.IsImage(m.Option(mdb.NAME), m.Option(mdb.TYPE)) {
+ m.EchoImages(link)
+ } else if html.IsVideo(m.Option(mdb.NAME), m.Option(mdb.TYPE)) {
+ m.EchoVideos(link)
+ } else if html.IsAudio(m.Option(mdb.NAME), m.Option(mdb.TYPE)) {
+ m.EchoAudios(link)
+ }
+ m.ProcessInner()
+ }
+ }},
+ }, chat.FavorAction(), WikiAction("", "png|PNG|jpg|JPG|jpeg|mp4|m4v|mov|MOV|webm")), Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_ROOT, _feel_path(m, ""))
_wiki_list(m, kit.Slice(arg, 0, 1)...)
ctx.DisplayLocal(m, "")
diff --git a/core/wiki/word.go b/core/wiki/word.go
index c7a6a5bd..e0bb48ae 100644
--- a/core/wiki/word.go
+++ b/core/wiki/word.go
@@ -1,17 +1,24 @@
package wiki
import (
+ "net/http"
+ "strings"
+
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/ssh"
+ "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
"shylinux.com/x/icebergs/misc/git"
kit "shylinux.com/x/toolkits"
)
func _word_show(m *ice.Message, name string, arg ...string) {
+ if strings.HasPrefix(name, "/require/") {
+ m.Option(nfs.CAT_CONTENT, m.Cmdx(web.SPIDE, ice.OPS, web.SPIDE_RAW, http.MethodGet, name))
+ }
m.Options(ice.MSG_ALIAS, mdb.Configv(m, mdb.ALIAS), TITLE, map[string]int{})
m.Cmdy(ssh.SOURCE, name, kit.Dict(nfs.DIR_ROOT, _wiki_path(m)))
}
diff --git a/render.go b/render.go
index 965a4759..cf34c874 100644
--- a/render.go
+++ b/render.go
@@ -49,6 +49,8 @@ func Render(m *Message, cmd string, args ...Any) string {
return kit.Format(`
`, arg[0])
case RENDER_VIDEOS:
return kit.Format(`