From 5666ec8f1f470af51197605a2aa7ff26014b79a8 Mon Sep 17 00:00:00 2001 From: shy Date: Thu, 25 Jan 2024 13:03:15 +0800 Subject: [PATCH] add chat.message --- base/web/space.go | 2 ++ core/chat/header.go | 8 ++++++-- core/chat/message.css | 8 +++++--- core/chat/message.go | 15 ++++++--------- core/chat/message.js | 39 +++++++++++++++++++++++++++++++-------- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/base/web/space.go b/base/web/space.go index e5ba5768..aaeee165 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -272,6 +272,8 @@ func init() { switch kit.TrimPrefix(arg[0], "extra.") { case DREAM: m.SplitIndex(m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, C(DREAM))).CutTo(mdb.NAME, DREAM) + case "message": + m.Cmdy("web.chat.message").Cut(mdb.HASH, mdb.NAME, mdb.ICONS) case SPACE: m.Cmd(SPACE, func(value ice.Maps) { kit.If(kit.IsIn(value[mdb.TYPE], WORKER, SERVER), func() { m.Push(arg[0], value[mdb.NAME]) }) diff --git a/core/chat/header.go b/core/chat/header.go index 9c70c097..70baea37 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -92,8 +92,12 @@ func init() { aaa.SendEmail(m, aaa.ADMIN, m.Option(aaa.TO), "") }}, MESSAGE: {Hand: func(m *ice.Message, arg ...string) { - m.Cmd(MESSAGE, mdb.INSERT, arg) - web.ToastSuccess(m) + if arg[0] == mdb.INPUTS || arg[0] == mdb.ACTION && arg[1] == mdb.INPUTS { + m.Cmdy(MESSAGE, arg) + } else { + m.Cmdy(MESSAGE, mdb.INSERT, arg) + web.ToastSuccess(m) + } }}, aaa.LOGOUT: {Hand: aaa.SessLogout}, cli.QRCODE: {Hand: func(m *ice.Message, arg ...string) { diff --git a/core/chat/message.css b/core/chat/message.css index 2eed3f32..38dbd686 100644 --- a/core/chat/message.css +++ b/core/chat/message.css @@ -1,17 +1,19 @@ body.light fieldset.web.chat.message>div.output { background-color:white; } body.light fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list { background-color:#e3e3e2; } body.light fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item:not(.plug).myself div.content { background-color:#94ec69; } +fieldset.web.chat.message>div.output>div.project>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:10; } +fieldset.web.chat.message>div.output>div.project>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; } +fieldset.web.chat.message>div.output>div.project>div.title span:hover { background-color:var(--hover-bg-color); cursor:pointer; } fieldset.web.chat.message>div.output>div.project>div.item { height:58px; padding:var(--input-padding); } fieldset.web.chat.message>div.output>div.project>div.item img { height:var(--header-height); width:var(--header-height); display:block; float:left; } fieldset.web.chat.message>div.output>div.project>div.item span.time { color:var(--disable-fg-color); font-size:var(--status-font-size); } -fieldset.web.chat.message>div.output>div.project>div.item div.container { width:calc(100% - var(--header-height)); float:left; } +fieldset.web.chat.message>div.output>div.project>div.item div.container { padding:0 var(--input-padding); width:calc(100% - var(--header-height)); float:left; } fieldset.web.chat.message>div.output>div.project>div.item div.title { display:flex; justify-content:space-between; } fieldset.web.chat.message>div.output>div.project>div.item div.content { color:var(--disable-fg-color); font-size:var(--status-font-size); } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content { overflow:hidden; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:10; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; } -fieldset.web.chat.message>div.output>div.project>div.title { padding:var(--button-padding); display:flex; justify-content:space-between; position:sticky; top:0; z-index:10; } -fieldset.web.chat.message>div.output>div.project>div.title i:hover { background-color:var(--hover-bg-color); cursor:pointer; } +fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.title span:hover { background-color:var(--hover-bg-color); cursor:pointer; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item { padding:var(--input-padding); min-height:fit-content; display:flex; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item:hover { background-color:unset; } fieldset.web.chat.message>div.output>div.layout>div.layout>div.content>div.list>div.item.time { color:var(--disable-fg-color); font-size:var(--status-font-size); padding:0; height:fit-content; justify-content:center; } diff --git a/core/chat/message.go b/core/chat/message.go index 7de17299..e4b2c776 100644 --- a/core/chat/message.go +++ b/core/chat/message.go @@ -33,25 +33,22 @@ func init() { mdb.SHORT, mdb.UNIQ, mdb.FIELD, "time,hash,type,name,icons", mdb.FIELDS, "time,id,avatar,usernick,username,type,name,text,space,index,args", )), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { - mdb.ZoneSelect(m.Spawn(), arg...).Table(func(value ice.Maps) { + mdb.ZoneSelect(m.Display("").Spawn(), arg...).Table(func(value ice.Maps) { if kit.IsIn(m.Option(ice.MSG_USERROLE), value[mdb.TYPE], aaa.TECH, aaa.ROOT) { m.PushRecord(value, mdb.Config(m, mdb.FIELD)) } }) } else { - mdb.ZoneSelect(m, arg...) - m.Sort(mdb.ID, ice.INT) + mdb.ZoneSelect(m, arg...).Sort(mdb.ID, ice.INT) } - m.Display("") }}, }) } func messageCreate(m *ice.Message, name, icon string) { - kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, name, "meta.time"), m.Time()) - kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, name, "meta.type"), aaa.TECH) - kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, name, "meta.name"), name) - kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, name, "meta.icons"), icon) + kit.Value(m.Target().Configs[m.CommandKey()].Value, kit.Keys(mdb.HASH, name, mdb.META), kit.Dict( + mdb.TIME, m.Time(), mdb.TYPE, aaa.TECH, mdb.NAME, name, mdb.ICONS, icon, + )) } func messageInsert(m *ice.Message, zone string, arg ...string) { - m.Cmd("", mdb.INSERT, zone, arg, ice.Maps{ice.MSG_USERNAME: zone}) + m.Cmd("", mdb.INSERT, zone, arg, ice.Maps{ice.MSG_USERNICK: zone, ice.MSG_USERNAME: zone}) } diff --git a/core/chat/message.js b/core/chat/message.js index 470ff102..51c50d0a 100644 --- a/core/chat/message.js +++ b/core/chat/message.js @@ -1,6 +1,5 @@ Volcanos(chat.ONIMPORT, { - _init: function(can, msg) { - delete(can._status._cache), delete(can._status._cache_key) + _init: function(can, msg) { delete(can._status._cache), delete(can._status._cache_key) if (can.isCmdMode()) { can.onappend.style(can, html.OUTPUT) } can.ui = can.onappend.layout(can), can.onimport._project(can, msg) }, @@ -18,8 +17,11 @@ Volcanos(chat.ONIMPORT, { ]}, ], onclick: function(event) { can.isCmdMode() && can.misc.SearchHash(can, value.name), can.onimport._switch(can, false) can.db.zone = value, can.db.hash = value.hash, can.onmotion.select(can, can.ui.project, html.DIV_ITEM, _target) - if (can.onmotion.cache(can, function() { - return value.name + if (can.onmotion.cache(can, function(save, load) { + can.ui.message && save({title: can.ui.title, message: can.ui.message, scroll: can.ui.message.scrollTop}) + return load(value.name, function(bak) { can.ui.title = bak.title, can.ui.message = bak.message + can.onmotion.delay(can, function() { can.ui.message.scrollTop = bak.scroll }) + }) }, can.ui.content, can.ui.profile, can.ui.display, can._status)) { return can.onimport.layout(can) } can.run(can.request(event, {"cache.limit": 10}), [value.hash], function(msg) { can.onimport._display(can), can.onimport._content(can, msg) @@ -43,10 +45,12 @@ Volcanos(chat.ONIMPORT, { } }}, ]), can.onmotion.toggle(can, can.ui.display, true) }, - _message: function(can, msg) { - var last = ""; msg.Table(function(value) { can.db.zone.id = value.id + _message: function(can, msg) { var now = new Date(), last = "" + msg.Table(function(value) { can.db.zone.id = value.id var myself = value.username == can.user.info.username, time = can.base.TimeTrim(value.time) - if (time != last) { can.page.Append(can, can.ui.message, [{view: [[html.ITEM, mdb.TIME], "", time]}]) } last = time + var t = new Date(value.time); if (!last || (t - last > 3*60*1000)) { last = t + can.page.Append(can, can.ui.message, [{view: [[html.ITEM, mdb.TIME], "", time]}]) + } can.page.Append(can, can.ui.message, [{view: [[html.ITEM, value.type, myself? "myself": ""]], list: [ {img: can.misc.Resource(can, (value.avatar == can.db.zone.name? "": value.avatar)||can.db.zone.icons||"usr/icons/Messages.png")}, {view: html.CONTAINER, list: [{text: [value.usernick, "", nfs.FROM]}, can.onfigure[value.type](can, value)]}, @@ -100,7 +104,7 @@ Volcanos(chat.ONFIGURE, { plug: function(can, value) { var height = can.base.Min(can.ui.content.offsetHeight-210, 240) var height = can.base.Max(320, height, height/(can.base.isIn(value.index, html.IFRAME)? 1: 2)), width = can.ui.content.offsetWidth-(can.user.isMobile? 60: 180) return {view: wiki.CONTENT, style: {height: height, width: width}, _init: function(target) { value.type = chat.STORY - can.onappend._plugin(can, value, {height: height, width: width}, function(sub) { + can.onappend.plugin(can, value, function(sub) { sub.onexport.output = function() { sub.onimport.size(sub, height, width) can.page.style(can, target, html.HEIGHT, sub._target.offsetHeight, html.WIDTH, sub._target.offsetWidth) } @@ -108,3 +112,22 @@ Volcanos(chat.ONFIGURE, { }} }, }) +Volcanos(chat.ONINPUTS, { + _show: function(event, can, msg, target, name) { + function show(value) { + if (target == target.parentNode.firstChild) { can.ui = can.ui||{} + can.ui.img = can.page.insertBefore(can, [{type: html.IMG}], target) + can.ui.span = can.page.insertBefore(can, [{type: html.SPAN}], target) + can.onappend.style(can, mdb.ICONS, can.page.parentNode(can, target, html.TR)) + can.page.style(can, target, html.COLOR, html.TRANSPARENT) + } + can.ui.img.src = can.misc.Resource(can, value.icons), can.ui.span.innerText = value.name + target.value = value.hash, can.onmotion.hidden(can, can._target) + } + can.page.Appends(can, can._output, msg.Table(function(value) { + return value.name && {view: html.ITEM, list: [ + {img: can.misc.Resource(can, value.icons)}, {text: value.name}, + ], onclick: function(event) { show(value) }} + })) + }, +})