mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt action.js
This commit is contained in:
parent
2dd2a70384
commit
9c8bb45958
6
frame.js
6
frame.js
@ -871,6 +871,12 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", _focus: [], _init: function(can,
|
||||
can.onengine.signal(can, chat.ONKEYDOWN, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
|
||||
can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist, can._output)
|
||||
}
|
||||
can.onkeymap._build(can), document.body.onkeyup = function(event) {
|
||||
if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return }
|
||||
var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
|
||||
can.onengine.signal(can, chat.ONKEYUP, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
|
||||
can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist, can._output)
|
||||
}
|
||||
},
|
||||
_build: function(can) {
|
||||
can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}}
|
||||
|
@ -1,8 +1,8 @@
|
||||
fieldset.Action { background-color:rgba(114, 153, 162, 0.54); min-width:160px; }
|
||||
fieldset.Action>div.action { background-color:#4682b46b; width:inherit; display:none; }
|
||||
fieldset.Action>div.action div.tabs { font-size:1.1rem; padding:5px; height:21px; }
|
||||
fieldset.Action>div.action div.tabs.select { background:#6495ed63; }
|
||||
fieldset.Action>div.action div.tabs:hover { background:#6495ed63; }
|
||||
fieldset.Action>div.action div { font-size:1.1rem; padding:5px; height:21px; float:left; cursor:pointer; }
|
||||
fieldset.Action>div.action div.select { background:#6495ed63; }
|
||||
fieldset.Action>div.action div:hover { background:#6495ed63; }
|
||||
fieldset.Action.tabs>div.action { display:block; }
|
||||
fieldset.Action.tabs>div.output>fieldset>legend { display:none; }
|
||||
fieldset.Action.tabs>div.output fieldset.plugin { display:none; }
|
||||
@ -11,6 +11,32 @@ fieldset.Action.tabs>div.output fieldset.plugin.select { display:block; }
|
||||
fieldset.Action.grid>div.output fieldset.plugin { overflow:auto; float:left; }
|
||||
fieldset.Action.grid>div.output fieldset.plugin>div.output { overflow:auto; }
|
||||
|
||||
fieldset.Action>div.action div.tabview { font-size:1.1rem; padding:5px; height:21px; }
|
||||
fieldset.Action>div.action div.tabview.select { background:#6495ed63; }
|
||||
fieldset.Action>div.action div.tabview:hover { background:#6495ed63; }
|
||||
fieldset.Action.tabview>div.action { display:block; }
|
||||
fieldset.Action.tabview>div.output>fieldset>legend { display:none; }
|
||||
fieldset.Action.tabview>div.output fieldset.plugin { display:none; overflow:auto; padding:0; }
|
||||
fieldset.Action.tabview>div.output fieldset.plugin.select { display:block; }
|
||||
fieldset.Action.tabview>div.output fieldset.plugin>form.option { display:none; }
|
||||
fieldset.Action.tabview>div.output fieldset.plugin>div.action { display:none; }
|
||||
fieldset.Action.tabview>div.output fieldset.plugin>div.status { display:none; }
|
||||
|
||||
fieldset.Action.horizon>div.output fieldset.plugin { overflow:auto; float:left; padding:0; margin:0; }
|
||||
fieldset.Action.horizon>div.output fieldset.plugin>legend { display:none; }
|
||||
fieldset.Action.horizon>div.output fieldset.plugin>form.option { display:none; }
|
||||
fieldset.Action.horizon>div.output fieldset.plugin>div.action { display:none; }
|
||||
fieldset.Action.horizon>div.output fieldset.plugin>div.output { overflow:auto; }
|
||||
fieldset.Action.horizon>div.output fieldset.plugin>div.status { display:none; }
|
||||
|
||||
fieldset.Action.vertical>div.output fieldset.plugin { overflow:auto; float:left; padding:0; margin:0; }
|
||||
fieldset.Action.vertical>div.output fieldset.plugin>legend { display:none; }
|
||||
fieldset.Action.vertical>div.output fieldset.plugin>form.option { display:none; }
|
||||
fieldset.Action.vertical>div.output fieldset.plugin>div.action { display:none; }
|
||||
fieldset.Action.vertical>div.output fieldset.plugin>div.output { overflow:auto; }
|
||||
fieldset.Action.vertical>div.output fieldset.plugin>div.status { display:none; }
|
||||
|
||||
|
||||
fieldset.Action.free>div.output fieldset.plugin { position:absolute; }
|
||||
fieldset.Action.free>div.output fieldset.plugin.select { display:block; }
|
||||
fieldset.Action.flow>div.output fieldset.plugin { float:left; }
|
||||
|
@ -1,8 +1,7 @@
|
||||
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
|
||||
can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout, true)
|
||||
var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM)
|
||||
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) {
|
||||
item.height = can.ConfHeight()-can.Conf(html.MARGIN_Y)
|
||||
item.width = can.ConfWidth()-can.Conf(html.MARGIN_X)
|
||||
item.feature = can.base.Obj(item.feature||item.meta)
|
||||
item.inputs = can.base.Obj(item.inputs||item.list)
|
||||
|
||||
@ -11,7 +10,6 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
|
||||
can.onimport._plugin(can, river, storm, sub, meta), skip || next()
|
||||
})
|
||||
}, function() {
|
||||
can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout, true)
|
||||
can.onimport._menu(can, msg), can.onkeymap._init(can)
|
||||
})
|
||||
},
|
||||
@ -22,10 +20,10 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
|
||||
return can.run(sub.request(event), can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), cb)
|
||||
}, can._plugins = can.misc.concat(can, can._plugins, [sub])
|
||||
|
||||
can.page.Append(can, can._action, [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) {
|
||||
sub._tabs = can.page.Append(can, can._action, [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) {
|
||||
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
|
||||
can.onmotion.select(can, can._action, html.DIV_TABS, event.target)
|
||||
}, onmouseenter: sub._legend.onmouseenter, ondblclick: sub._legend.onclick}])
|
||||
}, onmouseenter: sub._legend.onmouseenter, ondblclick: sub._legend.onclick}]).first
|
||||
},
|
||||
_menu: function(can, msg) { if (can.user.mod.isPod || can.user.isMobile) { return }
|
||||
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.onaction._menus), function(event, button, list) {
|
||||
@ -160,13 +158,16 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target)
|
||||
can.base.isFunc(cb) && cb()
|
||||
},
|
||||
_menus: [
|
||||
[chat.LAYOUT, "auto", "tabs", "grid", "free", "flow", "page", "toimage"],
|
||||
[chat.LAYOUT, "auto", "tabs", "tabview", "vertical", "horizon", "grid", "free", "flow", "page", "toimage"],
|
||||
[ice.HELP, "tutor", "manual", "service", "devops", "refer"],
|
||||
],
|
||||
_trans: {
|
||||
"layout": "布局",
|
||||
"auto": "默认布局",
|
||||
"flow": "流动布局",
|
||||
"vertical": "上下分屏",
|
||||
"horizon": "左右分屏",
|
||||
"tabview": "标签分屏",
|
||||
"grid": "网格布局",
|
||||
"tabs": "标签布局",
|
||||
"free": "自由布局",
|
||||
@ -189,6 +190,11 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target)
|
||||
can.onimport._cmd(can, item, next)
|
||||
}) })
|
||||
},
|
||||
onkeydown: function(can, msg) { var event = msg._event
|
||||
if (event.ctrlKey && event.key >= "1" && event.key <= "9") {
|
||||
can.onmotion.select(can, can._action, html.DIV_TABS, parseInt(event.key)-1), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, parseInt(event.key)-1)
|
||||
}
|
||||
},
|
||||
onsearch: function(can, msg, word) {
|
||||
if (word[0] == mdb.PLUGIN || word[0] == mdb.FOREACH) { can.onexport.plugin(can, msg, word) }
|
||||
},
|
||||
@ -201,6 +207,10 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target)
|
||||
return can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout||conf.layout, true)
|
||||
}
|
||||
|
||||
can.page.Append(can, can._action, [
|
||||
{text: [msg.Option("river_name")||river, html.DIV]},
|
||||
{text: [msg.Option("storm_name")||storm, html.DIV]}
|
||||
])
|
||||
can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) }
|
||||
can.onengine.signal(can, chat.ONACTION_NOTOOL, can.request({}, {river: river, storm: storm}))
|
||||
})
|
||||
@ -214,14 +224,6 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target)
|
||||
can.isCmdMode()
|
||||
},
|
||||
|
||||
layout: function(can, button, silent) { button = button||ice.AUTO
|
||||
var cb = can.onlayout[button]; if (can.base.isFunc(cb) && cb(can, silent)) { return }
|
||||
can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT))
|
||||
if (button == ice.AUTO) { button = "" }
|
||||
can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button))
|
||||
can.onlayout._init(can)
|
||||
},
|
||||
help: function(can, button) { can.user.open("/help/"+button+".shy") },
|
||||
refresh: function(can) {
|
||||
can._root._height = window.innerHeight, can._root._width = window.innerWidth
|
||||
can.onlayout._init(can)
|
||||
@ -233,30 +235,65 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target)
|
||||
table.onimport.layout? table.onimport.layout(table): can.onappend._output(sub, table._msg, sub._display)
|
||||
})
|
||||
},
|
||||
layout: function(can, button, silent) { button = button||ice.AUTO
|
||||
can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT)); if (button == ice.AUTO) { button = "" }
|
||||
can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button)), can.onlayout._init(can)
|
||||
can.onmotion.toggle(can, can._root.River._target, true), can.onmotion.toggle(can, can._root.Footer._target, true), can.onlayout._init(can)
|
||||
|
||||
var cb = can.onlayout[button]; if (can.base.isFunc(cb)? cb(can, silent): (can.getActionSize(function(height, width) {
|
||||
can.ConfHeight(can.base.Min(200, height-3*html.ACTION_HEIGHT-4*html.PLUGIN_MARGIN-200)), can.ConfWidth(width-4*html.PLUGIN_MARGIN)
|
||||
}), false)) { return }
|
||||
|
||||
can.core.Next(can._plugins, function(sub, next) {
|
||||
sub.onaction._resize(sub, button != ice.AUTO, can.ConfHeight(), can.ConfWidth())
|
||||
can.onmotion.delay(can, next)
|
||||
})
|
||||
},
|
||||
help: function(can, button) { can.user.open("/help/"+button+".shy") },
|
||||
})
|
||||
Volcanos(chat.ONLAYOUT, {help: "导出数据",
|
||||
_grid: function(can, m, n) {
|
||||
can.getActionSize(function(height, width) {
|
||||
var h = (height-(4*n+1)*html.PLUGIN_MARGIN)/n, w = (width-(4*m+1)*html.PLUGIN_MARGIN)/m
|
||||
can.ConfHeight(h-2*html.ACTION_HEIGHT-3*html.PLUGIN_MARGIN), can.ConfWidth(w)
|
||||
can.core.List(can._plugins, function(sub) { sub.onaction._resize(sub, true, can.ConfHeight(), can.ConfWidth()) })
|
||||
})
|
||||
},
|
||||
grid: function(can, silent) {
|
||||
var ACTION_LAYOUT_FMT = " fieldset.Action.grid>div.output fieldset.plugin { width:_width; height:_height; } "
|
||||
can.user.input(event, can, [{name: "m", value: 2}, {name: "n", value: 2}], function(data) {
|
||||
can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2
|
||||
var h = (height-(4*n+1)*html.PLUGIN_MARGIN)/n, w = (width-(4*m+1)*html.PLUGIN_MARGIN)/m
|
||||
can.page.css(can.base.replaceAll(ACTION_LAYOUT_FMT, "_height", h+"px", "_width", w+"px"))
|
||||
can.core.List(can._plugins, function(sub) {
|
||||
can.page.style(can, sub._output, html.HEIGHT, sub.ConfHeight(h-2*html.ACTION_HEIGHT-3*html.PLUGIN_MARGIN), html.WIDTH, sub.ConfWidth(w))
|
||||
sub.onaction["刷新数据"]({}, sub)
|
||||
can.ConfHeight(sub.ConfHeight())
|
||||
can.ConfWidth(sub.ConfWidth())
|
||||
})
|
||||
})
|
||||
can.onlayout._grid(can, parseInt(data.m), parseInt(data.n))
|
||||
}, silent)
|
||||
return true
|
||||
},
|
||||
vertical: function(can) {
|
||||
can.onmotion.hidden(can, can._root.River._target), can.onmotion.hidden(can, can._root.Footer._target), can.onlayout._init(can)
|
||||
can.getActionSize(function(height, width) { can.ConfHeight(height/2), can.ConfWidth(width)
|
||||
can.core.List(can._plugins, function(sub) { sub.onaction._resize(sub, true, can.ConfHeight(), can.ConfWidth()) })
|
||||
})
|
||||
},
|
||||
horizon: function(can) {
|
||||
can.onmotion.hidden(can, can._root.River._target), can.onmotion.hidden(can, can._root.Footer._target), can.onlayout._init(can)
|
||||
can.getActionSize(function(height, width) { can.ConfHeight(height), can.ConfWidth(width/2)
|
||||
can.core.List(can._plugins, function(sub) { sub.onaction._resize(sub, true, can.ConfHeight(), can.ConfWidth()) })
|
||||
})
|
||||
},
|
||||
tabview: function(can) {
|
||||
can.onmotion.hidden(can, can._root.River._target), can.onmotion.hidden(can, can._root.Footer._target), can.onlayout._init(can)
|
||||
can.onmotion.delay(can, function() {
|
||||
can.onmotion.select(can, can._action, html.DIV_TABS, 0), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0)
|
||||
})
|
||||
can.getActionSize(function(height, width) {
|
||||
can.ConfHeight(height-1*html.ACTION_HEIGHT-2*html.PLUGIN_MARGIN), can.ConfWidth(width-2*html.PLUGIN_MARGIN)
|
||||
})
|
||||
},
|
||||
tabs: function(can) {
|
||||
can.onmotion.select(can, can._action, html.DIV_TABS, 0)
|
||||
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0)
|
||||
can.onmotion.select(can, can._action, html.DIV_TABS, 0), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0)
|
||||
can.getActionSize(function(height, width) {
|
||||
can.ConfHeight(height-3*html.ACTION_HEIGHT-4*html.PLUGIN_MARGIN), can.ConfWidth(width-4*html.PLUGIN_MARGIN)
|
||||
})
|
||||
},
|
||||
free: function(can) {
|
||||
can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) {
|
||||
can.page.style(can, item, {left: 40*index, top: 40*index})
|
||||
can.onmotion.move(can, item, {left: 40*index, top: 40*index})
|
||||
})
|
||||
},
|
||||
|
@ -1,6 +1,7 @@
|
||||
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
|
||||
can.onmotion.clear(can), can.river_list = {}, can.storm_list = {}
|
||||
can.onimport._main(can, msg), can.onimport._menu(can, msg)
|
||||
can._name_list = {}
|
||||
|
||||
var select; can.page.Append(can, can._output, msg.Table(function(item, index) {
|
||||
return can.onimport._river(can, item, function(target) {
|
||||
@ -27,6 +28,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
})
|
||||
},
|
||||
_river: function(can, meta, cb) {
|
||||
can._name_list[meta.hash] = meta.name
|
||||
return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) {
|
||||
can.onaction.storm(event, can, meta.hash)
|
||||
|
||||
@ -38,6 +40,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
}}
|
||||
},
|
||||
_storm: function(can, meta, river) {
|
||||
can._name_list[can.core.Keys(river, meta.hash)] = meta.name
|
||||
return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) {
|
||||
can.onaction.action(event, can, river, meta.hash)
|
||||
|
||||
@ -113,6 +116,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["create", "share", "refres
|
||||
can.onlayout._init(can)
|
||||
can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, {
|
||||
river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm),
|
||||
river_name: can._name_list[river], storm_name: can._name_list[can.core.Keys(river, storm)],
|
||||
}))
|
||||
})
|
||||
},
|
||||
|
@ -3,6 +3,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb) {
|
||||
},
|
||||
layout: function(can) { var item = can.current; can.onmotion.clear(can)
|
||||
can.page.Append(can, can._output, [{type: html.IFRAME, src: item.link, height: can.ConfHeight(), width: can.ConfWidth(), style: {border: 0}}])
|
||||
can.onimport.title(can, item.name||item.link)
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {help: "操作数据",
|
||||
|
@ -1,4 +1,5 @@
|
||||
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb) { can.onmotion.clear(can)
|
||||
can.onlayout._init(can)
|
||||
can.requireModules(["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() {
|
||||
var item = {hash: can.Option(mdb.HASH)}; msg.Table(function(value) { can.core.Value(item, value.key, value.value) })
|
||||
item.text && can.onmotion.delay(can, function() { can.onimport._input(can, item.text+ice.NL) })
|
||||
@ -44,7 +45,7 @@ Volcanos(chat.ONACTION, {help: "操作数据",
|
||||
"反引号": function(event, can, button) { can.onimport._input(can, "`"), can._current.focus() },
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {help: "导出数据", list: [mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"],
|
||||
term: function(can) { var term = can._current, item = term._item
|
||||
term: function(can) { var term = can._current||{}, item = term._item; if (!item) { return }
|
||||
can.core.List(can.onexport.list, function(key) {
|
||||
can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], ""))
|
||||
}), can.Status(mdb.TYPE, item[mdb.TYPE]||""), can.Status(mdb.NAME, item[mdb.NAME]||"")
|
||||
|
@ -118,6 +118,12 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [
|
||||
sub.Mode(can.Mode()), sub.onlayout._init(sub)
|
||||
}
|
||||
},
|
||||
_resize: function(can, auto, height, width) { can.ConfHeight(height), can.ConfWidth(width)
|
||||
auto? can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, can.ConfWidth()):
|
||||
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_WIDTH, can.ConfWidth())
|
||||
// can.onaction["刷新页面"]({}, can, "刷新页面", can.core.Value(can, chat._OUTPUTS_CURRENT))
|
||||
can.onaction["刷新数据"]({}, can, "刷新数据", can.core.Value(can, chat._OUTPUTS_CURRENT))
|
||||
},
|
||||
|
||||
"刷新页面": function(event, can, button, sub) {
|
||||
can.core.CallFunc([sub.onimport, "_init"], {can: sub, msg: sub._msg, cb: function(msg) { can.user.toastSuccess(can) }, target: can._output})
|
||||
|
@ -27,6 +27,9 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
)); target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) }
|
||||
return ui
|
||||
},
|
||||
title: function(can, title) {
|
||||
can._legend.innerHTML = title, can.sup && can.sup._tabs && (can.sup._tabs.innerHTML = title)
|
||||
},
|
||||
zone: function(can, list, target) { var color = [""]
|
||||
return can.page.Append(can, target, can.core.List(list, function(zone, index) { can.base.isString(zone) && (zone = {name: zone}); return zone && {view: html.ZONE+" "+zone.name, list: [
|
||||
{view: html.NAME, inner: can.user.trans(can, zone.name), style: {background: color[index%color.length]}, onclick: function() {
|
||||
|
1
proto.js
1
proto.js
@ -208,6 +208,7 @@ var chat = {
|
||||
|
||||
ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch",
|
||||
ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote",
|
||||
ONKEYUP: "onkeyup",
|
||||
ONKEYDOWN: "onkeydown", ONMOUSEENTER: "onmouseenter", ORIENTATIONCHANGE: "orientationchange",
|
||||
ONSTORM_SELECT: "onstorm_select", ONACTION_TOUCH: "onaction_touch", ONACTION_NOTOOL: "onaction_notool", ONACTION_CMD: "onaction_cmd",
|
||||
ONOPENSEARCH: "onopensearch", ONSEARCHFOCUS: "onsearchfocus", ONCOMMANDFOCUS: "oncommandfocus",
|
||||
|
Loading…
x
Reference in New Issue
Block a user