diff --git a/base/web/dream.go b/base/web/dream.go index b0e35cf9..e3d8aeb8 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -146,6 +146,7 @@ func init() { } }}, mdb.CREATE: {Name: "create name*=hi repos binary template", Hand: func(m *ice.Message, arg ...string) { + m.OptionDefault(mdb.ICON, "usr/icons/icebergs.jpeg") m.Option(nfs.REPOS, kit.Select("", kit.Slice(kit.Split(m.Option(nfs.REPOS)), -1), 0)) kit.If(!strings.Contains(m.Option(mdb.NAME), "-") || !strings.HasPrefix(m.Option(mdb.NAME), "20"), func() { m.Option(mdb.NAME, m.Time("20060102-")+m.Option(mdb.NAME)) }) if mdb.HashCreate(m); !m.IsCliUA() { diff --git a/base/web/web.shy b/base/web/web.shy deleted file mode 100644 index 8afaae74..00000000 --- a/base/web/web.shy +++ /dev/null @@ -1,2 +0,0 @@ -type Frame struct{} - diff --git a/core/chat/macos/desktop.css b/core/chat/macos/desktop.css index 590de72c..1b348f84 100644 --- a/core/chat/macos/desktop.css +++ b/core/chat/macos/desktop.css @@ -18,13 +18,13 @@ fieldset.macos.desktop>div.output>div.desktop>div.item>div.name { font-size:var( fieldset.macos.desktop>div.output>div.desktop>fieldset.select { z-index:1; } fieldset.macos.desktop>div.output>div.desktop>fieldset { border-radius:10px; position:absolute; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.item.button { border-radius:20px; height:20px; width:20px; scale:0.7; position:absolute; top:16px; right:10px; } -fieldset.macos.desktop>div.output>div.desktop>fieldset>legend { padding:0 10px; margin:10px; } +fieldset.macos.desktop>div.output>div.desktop>fieldset>legend { padding:0 10px; margin:10px; box-shadow:none; } fieldset.macos.desktop>div.output>div.desktop>fieldset>legend:not(:hover) { background-color:transparent; } fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>*:not(.textarea) { margin:10px 0px 10px 10px; } fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.icon { margin:12px 0 8px; } -fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item.button>span.icon { font-size:32px; line-height:30px; } +fieldset.macos.desktop>div.output>div.desktop>fieldset:not(:hover)>form.option>div.icon { visibility:hidden; } +fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item.button:not(.select)>span.icon { font-size:32px; line-height:30px; } fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item.button.prunes>span.icon { font-size:20px; line-height:32px; } -/* fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item.icons { margin-left:0; } */ fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item:last-child { margin-right:100px; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.action>* { margin:10px 0px 10px 10px; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.action>div.item:last-child { margin-right:100px; } diff --git a/core/chat/macos/desktop.js b/core/chat/macos/desktop.js index cf564976..f8a0ff37 100644 --- a/core/chat/macos/desktop.js +++ b/core/chat/macos/desktop.js @@ -5,15 +5,20 @@ Volcanos(chat.ONIMPORT, { 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 - sub.onexport.output = function() { can.onimport._desktop(can, can._msg) + sub.onexport.output = function() { + var cache = can.misc.sessionStorage(can, [can.ConfIndex(), "tabs"]) + can.onimport._desktop(can, can._msg) can.Conf("session") && can.runActionCommand(event, "session", [can.Conf("session")], function(msg) { var item = msg.TableDetail(); can.onimport.session(can, can.base.Obj(item.args)) - }) + }), can.onimport.session(can, cache) } 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) }); 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 default: can.onimport._window(can, value) @@ -45,9 +50,11 @@ 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) }, 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) + return target._tabs }, _item: function(can, item) { can.runAction(can.request(event, item), mdb.CREATE, [], function() { can.run(event, [], function(msg) { can.page.SelectChild(can, can.ui.desktop, html.DIV_ITEM, function(target) { can.page.Remove(can, target) }), can.onimport.__item(can, msg, can.ui.desktop) @@ -58,10 +65,10 @@ 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) { if (!item.index) { return } item._space = can.ConfSpace() - item.height = can.base.Min(can.ConfHeight()-200, 320, 800), item.width = can.base.Min(can.ConfWidth()-600, 640, 1600) - item.left = (can.ConfWidth()-item.width)/2, item.top = 50 - if (can.ConfHeight() < 800) { item.top = 25, item.height = can.ConfHeight()-125, item.width = can.ConfWidth()-110 } + _window: function(can, item, cb) { if (!item.index) { return } item._space = can.ConfSpace() + 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 } if (can.user.isMobile) { item.left = 0, item.top = 25, item.height = can.ConfHeight()-125, item.width = can.ConfWidth() } can.onappend.plugin(can, item, function(sub) { can.ondetail.select(can, sub._target) var index = 0; can.core.Item({ @@ -70,29 +77,38 @@ Volcanos(chat.ONIMPORT, { can.onmotion.toggle(can, sub._target, true), can.page.Remove(can, dock) }}])._target; sub.onmotion.hidden(sub, sub._target) }, "#32c840": function(event) { sub.onaction.full(event, sub) }, - }, 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 } + }, 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.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]}) } - sub.onappend.desktop = function(item) { can.onimport._item(can, item) } sub.onappend.dock = function(item) { can.ui.dock.runAction(can.request(event, item), mdb.CREATE, [], function() { can.ui.dock.Update() }) } + sub.onaction._close = function() { can.page.Remove(can, sub._target), can.onexport.tabs(can) } + sub.onappend.desktop = function(item) { can.onimport._item(can, item) } can.onmotion.move(can, sub._target, {top: item.top, left: item.left}) - sub.onmotion.resize(can, sub._target, function(height, width) { sub.onimport.size(sub, item.height = height, item.width = width) }, 25) - sub._target.onclick = function(event) { - can.ondetail.select(can, sub._target) - } + sub.onmotion.resize(can, sub._target, function(height, width) { + sub.onimport.size(sub, item.height = height, item.width = width) + sub._target._meta.height = height, sub._target._meta.width = width, can.onexport.tabs(can) + }, 25) + sub._target.onclick = function(event) { can.ondetail.select(can, sub._target) } + sub._target._meta = {index: sub.ConfIndex(), args: sub.Conf(ctx.ARGS)}, can.onexport.tabs(can) + cb && cb(sub) }, can.ui.desktop) }, - session: function(can, list) { can.page.Select(can, can._output, html.DIV_DESKTOP, function(target) { can.page.Remove(can, target) }) + session: function(can, list) { 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) }) - can.core.List(list, function(item) { can.onimport._desktop(can, null, item.name), can.core.List(item.list, function(item) { can.onimport._window(can, item) }) }) + 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) }) + }, function() { next() }) + }, function() { _select && _select.click() }) }, layout: function(can) { can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()) can.ui.notifications && can.page.style(can, can.ui.notifications._target, html.LEFT, can.ConfWidth()-250) @@ -103,8 +119,14 @@ 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, button) { can.onimport._desktop(can) }, + create: function(event, can) { can.onimport._desktop(can) }, full: function(event, can) { document.body.requestFullscreen() }, + 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) }) }, + ctrln: function(event, can) { can.onkeymap.selectCtrlN(event, can, can.ui.menu._output, html.DIV_TABS) }, + tabs: function(event, can) { can.onaction.create(event, can) }, + tabx: function(event, can) { can.page.Select(can, can.ui.menu._output, html.DIV_TABS_SELECT, function(target) { target._close() }) }, }) Volcanos(chat.ONDETAIL, { select: function(can, target) { can.onmotion.select(can, can.ui.desktop, html.FIELDSET, target) }, @@ -113,13 +135,14 @@ Volcanos(chat.ONEXPORT, { position: function(can, index) { var top = 25, margin = 20, height = 100, width = 80 var n = parseInt((can.ConfHeight()-top)/(height+margin)) return {top: index%n*height+top+margin/2, left: parseInt(index/n)*(width+margin)+margin/2} - } -}) -Volcanos(chat.ONKEYMAP, { - _mode: {plugin: { - " ": function(event, can) { can.onaction._search(can), can.onkeymap.prevent(event) }, - "Escape": function(event, can) { can.onmotion.hidden(can, can.ui.searchs._target) }, - }}, _engine: {}, + }, + tabs: function(can) { + var list = can.page.Select(can, can.ui.menu._output, html.DIV_TABS, function(target) { return { + select: can.page.ClassList.has(can, target, html.SELECT), + name: can.page.SelectOne(can, target, html.SPAN_NAME).innerHTML, + list: can.page.SelectChild(can, target._desktop, html.FIELDSET, function(target) { return target._meta }) + } }); can.misc.sessionStorage(can, [can.ConfIndex(), html.TABS], JSON.stringify(list)) + }, }) Volcanos(chat.ONFIGURE, { "session\t>": function(event, can, carte) { can.runActionCommand(event, "session", [], function(msg) { diff --git a/core/chat/macos/menu.js b/core/chat/macos/menu.js index c1500054..ebabee51 100644 --- a/core/chat/macos/menu.js +++ b/core/chat/macos/menu.js @@ -1,9 +1,11 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg) { 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") }}, -].concat(msg.Table(function(item) { - 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, "", "+"], onclick: function(event) { can.sup.onexport.record(can, mdb.CREATE) }}, -])) }}) +Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { + 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") }}, + ].concat(msg.Table(function(item) { + 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, "", "+"], onclick: function(event) { can.sup.onexport.record(can, mdb.CREATE) }}, + ])), cb && cb(msg), can.page.style(can, can._output, html.MAX_WIDTH, "") +}}) diff --git a/core/code/vimer.go b/core/code/vimer.go index ee2e3a5b..339b6e75 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -185,7 +185,7 @@ 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.SERVER, web.WORKER), func() { m.PushButton(kit.Dict(m.CommandKey(), "编程")) }) }}, web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { web.DreamProcess(m, []string{}, arg...) }}, }, aaa.RoleAction(ctx.COMMAND), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) { diff --git a/core/code/webpack.go b/core/code/webpack.go index 9ea7d170..d849e217 100644 --- a/core/code/webpack.go +++ b/core/code/webpack.go @@ -20,10 +20,13 @@ func _volcanos(m *ice.Message, p ...string) string { return ice.USR_VOLCANOS + p func _publish(m *ice.Message, p ...string) string { return ice.USR_PUBLISH + path.Join(p...) } func _require(m *ice.Message, p string) string { p = strings.Replace(p, ice.USR_MODULES, "/require/modules/", 1) - if kit.HasPrefix(p, "src/", "usr/") { + if kit.HasPrefix(p, nfs.SRC, nfs.USR) { return path.Join("/require/", p) + } else if strings.HasPrefix(p, "/require/") { + return path.Join(nfs.PS, strings.TrimPrefix(p, ice.USR_VOLCANOS)) + } else { + return path.Join("/volcanos/", strings.TrimPrefix(p, ice.USR_VOLCANOS)) } - return path.Join(nfs.PS, strings.TrimPrefix(p, ice.USR_VOLCANOS)) } func _webpack_css(m *ice.Message, css, js io.Writer, p string) { fmt.Fprintln(css, kit.Format("/* %s */", _require(m, p))) @@ -73,11 +76,9 @@ func _webpack_cache(m *ice.Message, dir string, write bool) { _webpack_js(m, js, k) m.Option(nfs.DIR_ROOT, "") } - _webpack_css(m, css, js, "src/template/web.chat.header/dark.css") - _webpack_css(m, css, js, "src/template/web.chat.header/light.css") - _webpack_css(m, css, js, "src/template/web.chat.header/black.css") - _webpack_css(m, css, js, "src/template/web.chat.header/white.css") - _webpack_css(m, css, js, "src/template/web.chat.header/mobile.css") + m.Cmd(nfs.DIR, "src/template/web.chat.header/theme/", func(value ice.Maps) { + _webpack_css(m, css, js, value[nfs.PATH]) + }) mdb.HashSelects(m).Sort(nfs.PATH).Table(func(value ice.Maps) { defer fmt.Fprintln(js, "") if p := value[nfs.PATH]; kit.Ext(p) == nfs.CSS { diff --git a/misc/git/search.css b/misc/git/search.css index 44119e3a..0a2add85 100644 --- a/misc/git/search.css +++ b/misc/git/search.css @@ -1,5 +1,5 @@ fieldset.web.code.git.search>div.output>div.item div.title { display:flex; } -fieldset.web.code.git.search>div.output>div.item div.title>img { height:48px; margin-right:10px; } +fieldset.web.code.git.search>div.output>div.item div.title>img { height:48px; width:48px; margin-right:10px; } fieldset.web.code.git.search>div.output>div.item div.title>div.name { height:48px; } fieldset.web.code.git.search>div.output>div.item div.title span.name { line-height:32px; } fieldset.web.code.git.search>div.output>div.item div.title div.label { font-size:12px; font-weight:normal; } diff --git a/misc/git/search.go b/misc/git/search.go index 46786dba..957ad9ff 100644 --- a/misc/git/search.go +++ b/misc/git/search.go @@ -16,7 +16,6 @@ import ( ) func init() { - const SEARCH = "search" const ( EXPLORE_REPOS = "/explore/repos" REPOS_SEARCH = "/api/v1/repos/search" @@ -28,25 +27,29 @@ func init() { HTML_URL = "html_url" WEBSITE = "website" ) + const SEARCH = "search" Index.MergeCommands(ice.Commands{ - SEARCH: {Name: "search repos keyword auto", Help: "代码源", Actions: ice.MergeActions(ice.Actions{ + SEARCH: {Name: "search repos@key keyword auto", Help: "代码源", Actions: ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { macos.AppInstall(m, "usr/icons/gitea.png", m.PrefixKey(), ctx.ARGS, kit.Format([]string{REPOS})) }}, - cli.START: {Name: "start name*", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.DREAM, cli.START) }}, - CLONE: {Name: "clone name*", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(REPOS, CLONE, m.Option(REPOS)) }}, - HTML_URL: {Help: "源码", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(m.Option(HTML_URL)) }}, - WEBSITE: {Help: "官网", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(m.Option(WEBSITE)) }}, + cli.START: {Name: "start name*", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(web.DREAM, mdb.CREATE) + m.Cmdy(web.DREAM, cli.START) + }}, + CLONE: {Name: "clone name*", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(REPOS, CLONE, m.Option(REPOS)) }}, + HTML_URL: {Help: "源码", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(m.Option(HTML_URL)) }}, + WEBSITE: {Help: "官网", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(m.Option(WEBSITE)) }}, ORIGIN: {Help: "平台", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(m.Cmdv(WEB_SPIDE, kit.Select(m.Option(REPOS), arg, 0), web.CLIENT_ORIGIN) + EXPLORE_REPOS) }}, - }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { + }, Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { m.Cmdy(WEB_SPIDE).RenameAppend(web.CLIENT_NAME, REPOS, web.CLIENT_URL, ORIGIN).Cut("time,repos,origin") return } res := kit.UnMarshal(m.Cmdx(WEB_SPIDE, arg[0], web.SPIDE_RAW, http.MethodGet, REPOS_SEARCH, - "q", kit.Select("", arg, 1), "sort", "updated", "order", "desc", "page", "1", "limit", "100", + "q", kit.Select("", arg, 1), "sort", "updated", "order", "desc", "page", "1", "limit", "30", )) kit.For(kit.Value(res, mdb.DATA), func(value ice.Map) { value[nfs.SIZE] = kit.FmtSize(kit.Int(value[nfs.SIZE]) * 1000) diff --git a/misc/git/search.js b/misc/git/search.js index f935a30a..0a702c73 100644 --- a/misc/git/search.js +++ b/misc/git/search.js @@ -1,13 +1,15 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { + if (!can.Option(nfs.REPOS)) { return can.onappend.table(can, msg) } if (can.isZoneMode()) { return can.onimport._vimer_zone(can, msg, can._output) } can.onappend.style(can, "card", can._output) can.page.Appends(can, can._output, msg.Table(function(value) { + value.language == "JavaScript" && (value.language = "JS") return {view: [[html.ITEM, value.status]], list: [ {view: [wiki.TITLE, html.DIV], list: [{img: value.avatar_url}, {view: mdb.NAME, list: [ {view: mdb.NAME, list: [{text: [value.name, "", mdb.NAME]}]}, {view: "label", list: [ - {icon: "bi bi-file-earmark-code"}, {text: value.language}, + {icon: "bi bi-file-earmark-code"}, {text: value.language||"None"}, {icon: "bi bi-share"}, {text: value.forks_count}, {icon: "bi bi-star"}, {text: value.stars_count}, {icon: "bi bi-folder2"}, {text: value.size},