forked from x/volcanos
opt some
This commit is contained in:
parent
95dce31deb
commit
fdeae81193
22
frame.js
22
frame.js
@ -60,8 +60,8 @@ var can = Volcanos("chat", {
|
|||||||
field.style.height = height + "px"
|
field.style.height = height + "px"
|
||||||
} else if (height == -1) {
|
} else if (height == -1) {
|
||||||
field.style.height = document.body.offsetHeight + "px"
|
field.style.height = document.body.offsetHeight + "px"
|
||||||
} else if (width == -2) {
|
} else if (height == -2) {
|
||||||
field.style.width = ""
|
field.style.height = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
typeof cb == "function" && cb(event, pane, {width: width, height: height}, "size", pane.output)
|
typeof cb == "function" && cb(event, pane, {width: width, height: height}, "size", pane.output)
|
||||||
@ -112,7 +112,7 @@ var can = Volcanos("chat", {
|
|||||||
|
|
||||||
var history = []
|
var history = []
|
||||||
|
|
||||||
var args = meta.args || [];
|
var args = typeof meta.args == "string"? JSON.parse(meta.args): meta.args || [];
|
||||||
var feature = JSON.parse(meta.feature||'{}');
|
var feature = JSON.parse(meta.feature||'{}');
|
||||||
var exports = JSON.parse(meta.exports||'""')||feature.exports||[];
|
var exports = JSON.parse(meta.exports||'""')||feature.exports||[];
|
||||||
var plugin = Volcanos(name, {_type: "local", _local: {}, target: field,
|
var plugin = Volcanos(name, {_type: "local", _local: {}, target: field,
|
||||||
@ -124,6 +124,11 @@ var can = Volcanos("chat", {
|
|||||||
key && plugin[key] && plugin[key].target && plugin[key].Import(event, value, key)
|
key && plugin[key] && plugin[key].target && plugin[key].Import(event, value, key)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Rename: function(event) {var meta = field.Meta;
|
||||||
|
meta.help = can.user.prompt("", function(help) {
|
||||||
|
meta.help = help
|
||||||
|
}, meta.help)
|
||||||
|
},
|
||||||
Remove: function(event) {var list = can.page.Select(can, option, "input.temp")
|
Remove: function(event) {var list = can.page.Select(can, option, "input.temp")
|
||||||
list.length > 0 && list[list.length-1].parentNode.removeChild(list[list.length-1])
|
list.length > 0 && list[list.length-1].parentNode.removeChild(list[list.length-1])
|
||||||
},
|
},
|
||||||
@ -178,6 +183,11 @@ var can = Volcanos("chat", {
|
|||||||
}))
|
}))
|
||||||
can.Export(event, 1, "ncmd")
|
can.Export(event, 1, "ncmd")
|
||||||
|
|
||||||
|
var msg = can.Event(event);
|
||||||
|
can.page.Select(can, option, ".opts", function(item) {
|
||||||
|
item.name && item.value && msg.Option(item.name, item.value)
|
||||||
|
})
|
||||||
|
|
||||||
for (var i = args.length-1; i >= 0; i--) {if (args[i] == "") {args = args.slice(0, i)} else {break}}
|
for (var i = args.length-1; i >= 0; i--) {if (args[i] == "") {args = args.slice(0, i)} else {break}}
|
||||||
show && plugin.Timer(1000, function() {show && plugin.user.toast(can.base.Format(args||["running..."]), meta.name, -1)});
|
show && plugin.Timer(1000, function() {show && plugin.user.toast(can.base.Format(args||["running..."]), meta.name, -1)});
|
||||||
run(event, args, function(msg) {if (silent) {return typeof cb == "function" && cb(msg)}
|
run(event, args, function(msg) {if (silent) {return typeof cb == "function" && cb(msg)}
|
||||||
@ -190,9 +200,10 @@ var can = Volcanos("chat", {
|
|||||||
return plugin._output = plugin._local[type] = plugin[type] = can.Output(plugin, feature, type, msg, cb, output, action, option, status)
|
return plugin._output = plugin._local[type] = plugin[type] = can.Output(plugin, feature, type, msg, cb, output, action, option, status)
|
||||||
},
|
},
|
||||||
Clone: function(event, cb) {meta.nick = meta.name + can.ID()
|
Clone: function(event, cb) {meta.nick = meta.name + can.ID()
|
||||||
|
meta.msg = plugin.msg
|
||||||
meta.args = can.page.Select(can, plugin.option, ".args", function(item) {return item.value})
|
meta.args = can.page.Select(can, plugin.option, ".args", function(item) {return item.value})
|
||||||
can._plugins.push(can.Plugin(can, meta.nick, meta, run,
|
can._plugins.push(can.Plugin(can, meta.nick, meta, run,
|
||||||
can.page.AppendField(can, field.parentNode, "item "+meta.group+" "+meta.nick, meta), cb))
|
can.page.AppendField(can, field.parentNode, "item "+meta.name+" "+meta.nick, meta), cb))
|
||||||
},
|
},
|
||||||
Delete: function(event) {field.parentNode.removeChild(field)},
|
Delete: function(event) {field.parentNode.removeChild(field)},
|
||||||
}, Config.libs.concat(["plugin/"+(meta.type||feature.active||"state")]), function(plugin) {plugin.Conf(meta);
|
}, Config.libs.concat(["plugin/"+(meta.type||feature.active||"state")]), function(plugin) {plugin.Conf(meta);
|
||||||
@ -201,6 +212,7 @@ var can = Volcanos("chat", {
|
|||||||
can.core.Next(list.length>0? list: [{type: "text"}, {type: "button", value: "执行"}], plugin.Append, function() {
|
can.core.Next(list.length>0? list: [{type: "text"}, {type: "button", value: "执行"}], plugin.Append, function() {
|
||||||
typeof cb == "function" && cb(plugin)
|
typeof cb == "function" && cb(plugin)
|
||||||
})
|
})
|
||||||
|
meta.msg && plugin.Show(feature.display || "table", meta.msg)
|
||||||
}, meta)
|
}, meta)
|
||||||
field.Check = plugin.Check
|
field.Check = plugin.Check
|
||||||
return plugin
|
return plugin
|
||||||
@ -259,7 +271,7 @@ var can = Volcanos("chat", {
|
|||||||
},
|
},
|
||||||
|
|
||||||
run: function(event, cmd, cb, silent) {var msg = can.Event(event);
|
run: function(event, cmd, cb, silent) {var msg = can.Event(event);
|
||||||
cmd = cmd || can.Option(), can.page.Select(can, option, "input,select", function(item) {
|
cmd = cmd || can.Option(), can.page.Select(can, option, ".args", function(item) {
|
||||||
item.name && item.value && msg.Option(item.name, item.value)
|
item.name && item.value && msg.Option(item.name, item.value)
|
||||||
});
|
});
|
||||||
(output[cmd[1]] || can[cmd[1]] || can.Run)(event, cmd, cb, silent);
|
(output[cmd[1]] || can[cmd[1]] || can.Run)(event, cmd, cb, silent);
|
||||||
|
@ -26,7 +26,7 @@ Volcanos("user", {help: "用户模块",
|
|||||||
can.page.Remove(can, view.first)
|
can.page.Remove(can, view.first)
|
||||||
}
|
}
|
||||||
}]}, {button: ["关闭", function(event, value) {
|
}]}, {button: ["关闭", function(event, value) {
|
||||||
if (typeof cb == "function" && cb(event, value)) {
|
if (typeof cb == "function" && cb(event, value, {}, [])) {
|
||||||
can.page.Remove(can, view.first)
|
can.page.Remove(can, view.first)
|
||||||
}
|
}
|
||||||
}]}]},
|
}]}]},
|
||||||
|
1
order.js
1
order.js
@ -34,6 +34,7 @@ var Config = {iceberg: "/chat/", volcano: "/static/volcanos/",
|
|||||||
"工作": {head: 30, foot: 30, left: 0, right: 100, bottom: -1, center: 0, top: 0},
|
"工作": {head: 30, foot: 30, left: 0, right: 100, bottom: -1, center: 0, top: 0},
|
||||||
"办公": {head: 30, foot: 30, left: 100, right: 100, bottom: -1, center: 0, top: 0},
|
"办公": {head: 30, foot: 30, left: 100, right: 100, bottom: -1, center: 0, top: 0},
|
||||||
"聊天": {head: 30, foot: 30, left: 100, right: 100, bottom: 300, center: 40, top: -2},
|
"聊天": {head: 30, foot: 30, left: 100, right: 100, bottom: 300, center: 40, top: -2},
|
||||||
|
"最长": {head: 30, foot: 30, left: 0, right: 0, bottom: -2, center: 0, top: 0},
|
||||||
"全屏": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0},
|
"全屏": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0},
|
||||||
}, border: 4,
|
}, border: 4,
|
||||||
},
|
},
|
||||||
|
@ -2,6 +2,10 @@ body, fieldset {
|
|||||||
color: white;
|
color: white;
|
||||||
background-color:black;
|
background-color:black;
|
||||||
}
|
}
|
||||||
|
fieldset.item {
|
||||||
|
border:ridge 1px cyan;
|
||||||
|
margin:2px;
|
||||||
|
}
|
||||||
|
|
||||||
fieldset.item:hover {
|
fieldset.item:hover {
|
||||||
/* background-color:gold; */
|
/* background-color:gold; */
|
||||||
|
@ -58,7 +58,7 @@ Volcanos("onlayout", {help: "组件布局", list: ["刷新"],
|
|||||||
layout.bottom == undefined && (layout.bottom = can.bottom.target.offsetHeight-conf.layout.border)
|
layout.bottom == undefined && (layout.bottom = can.bottom.target.offsetHeight-conf.layout.border)
|
||||||
layout.center == undefined && (layout.center = can.center.target.clientHeight)
|
layout.center == undefined && (layout.center = can.center.target.clientHeight)
|
||||||
layout.top == undefined && (layout.top = can.top.target.clientHeight)
|
layout.top == undefined && (layout.top = can.top.target.clientHeight)
|
||||||
layout.center == 0 && layout.top == 0 && !can.user.isMobile && (layout.bottom = height)
|
layout.center == 0 && layout.top == 0 && !can.user.isMobile && layout.bottom != -2 && (layout.bottom = height)
|
||||||
can.bottom.Size(event, width, layout.bottom)
|
can.bottom.Size(event, width, layout.bottom)
|
||||||
can.center.Size(event, width, layout.center)
|
can.center.Size(event, width, layout.center)
|
||||||
|
|
||||||
|
126
pane/Action.js
126
pane/Action.js
@ -13,21 +13,10 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
return can._plugins.push(plugin), plugin
|
return can._plugins.push(plugin), plugin
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
layout: function(event, can, value, cmd, target) {can.layout = value;
|
|
||||||
can.page.Select(can, can.action, "select.layout", function(item) {
|
|
||||||
item.value = value
|
|
||||||
})
|
|
||||||
},
|
|
||||||
scroll: function(event, can, value, cmd, target) {can.layout = value;
|
|
||||||
can.output.parentElement.scrollBy(value.x, value.y)
|
|
||||||
},
|
|
||||||
river: function(event, can, value, cmd, target) {
|
river: function(event, can, value, cmd, target) {
|
||||||
if (value == "update") {return}
|
if (value == "update") {return}
|
||||||
can.Conf("temp_river", value)
|
can.Conf("temp_river", value)
|
||||||
},
|
},
|
||||||
you: function(event, can, value, cmd, target) {
|
|
||||||
can.user.title(value)
|
|
||||||
},
|
|
||||||
storm: function(event, can, value, cmd, target) {
|
storm: function(event, can, value, cmd, target) {
|
||||||
can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some");
|
can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some");
|
||||||
|
|
||||||
@ -39,6 +28,19 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
layout: function(event, can, value, cmd, target) {can.layout = value;
|
||||||
|
can.page.Select(can, can.action, "select.layout", function(item) {
|
||||||
|
item.value = value
|
||||||
|
})
|
||||||
|
},
|
||||||
|
scroll: function(event, can, value, cmd, target) {can.layout = value;
|
||||||
|
can.output.parentElement.scrollBy(value.x, value.y)
|
||||||
|
},
|
||||||
|
|
||||||
|
you: function(event, can, value, cmd, target) {
|
||||||
|
can.user.title(value)
|
||||||
|
},
|
||||||
favor: function(event, can, msg, cmd, target) {var key = msg.detail[0];
|
favor: function(event, can, msg, cmd, target) {var key = msg.detail[0];
|
||||||
if (msg._hand) {return}
|
if (msg._hand) {return}
|
||||||
var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, can.output); return msg.Echo(can._name, " onaction ", key), msg._hand = true}
|
var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, can.output); return msg.Echo(can._name, " onaction ", key), msg._hand = true}
|
||||||
@ -49,18 +51,65 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
can._plugin && can._plugin.Import(event, msg, cmd)
|
can._plugin && can._plugin.Import(event, msg, cmd)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "组件交互", list: [["layout", "工作", "办公", "聊天"], "刷新", "清屏", "并行","串行",
|
Volcanos("onaction", {help: "组件交互", list: [["layout", "工作", "办公", "聊天", "最长"], "刷新", "清屏", "并行","串行",
|
||||||
["action", "正常", "编辑", "编排", "定位"],
|
["action", "正常", "编辑", "编排", "定位"],
|
||||||
{input: "pod"}, {input: "you"}, {input: "hot"}, {input: "top"},
|
{input: "pod"}, {input: "you"}, {input: "hot"}, {input: "top"},
|
||||||
],
|
],
|
||||||
onmousemove: function(event, can, msg, cmd, target) {
|
onmousemove: function(event, can, msg, cmd, target) {
|
||||||
can.resize && can.resize(event)
|
can.resize && can.resize(event)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
layout: function(event, can, value, cmd, target) {can.Export(event, value, cmd)},
|
||||||
|
|
||||||
|
"保存": function(event, can, msg, cmd, target) {
|
||||||
|
var list = []
|
||||||
|
can.page.Select(can, target, "fieldset", function(item) {var meta = item.Meta
|
||||||
|
can.page.Select(can, item, "form.option", function(option) {
|
||||||
|
meta.args = can.page.Select(can, option, ".args", function(item) {return item.value})
|
||||||
|
})
|
||||||
|
list.push(meta.node||"", meta.group, meta.index, meta.help, JSON.stringify(meta.args||[]))
|
||||||
|
})
|
||||||
|
can.run(event, [can.Conf("river"), can.Conf("storm"), "save"].concat(list), function(msg) {
|
||||||
|
can.user.toast("保存成功")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"刷新": function(event, can, msg, cmd, target) {
|
||||||
|
can.page.Select(can, can.output, "fieldset.item>div.output", function(item) {
|
||||||
|
item.innerHTML = "";
|
||||||
|
})
|
||||||
|
can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) {
|
||||||
|
can.onimport.init(event, can, msg, cmd, can.output)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"清屏": function(event, can, msg, cmd, target) {
|
||||||
|
can.page.Select(can, can.output, "fieldset.item>div.output", function(item) {
|
||||||
|
item.innerHTML = "";
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"并行": function(event, can, msg, cmd, target) {
|
||||||
|
can.page.Select(can, target, "fieldset.item", function(field) {
|
||||||
|
can.page.Select(can, field, "input[type=button]", function(input, index) {
|
||||||
|
index == 0 && field.Check(event, input, function() {})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"串行": function(event, can, msg, cmd, target) {
|
||||||
|
can.core.Next(can.page.Select(can, target, "fieldset.item", function(field) {
|
||||||
|
return field
|
||||||
|
}), function(field, cb) {
|
||||||
|
can.page.Select(can, field, "input[type=button]", function(input, index) {
|
||||||
|
index == 0 && field.Check(event, input, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
action: function(event, can, value, cmd, target) {
|
action: function(event, can, value, cmd, target) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case "正常":
|
case "正常":
|
||||||
can.page.Select(can, target, "fieldset.item", function(item) {
|
can.page.Select(can, target, "fieldset.item", function(item) {
|
||||||
item.setAttribute("draggable", false)
|
item.setAttribute("draggable", false)
|
||||||
|
item.style.position = ""
|
||||||
|
item.style.left = ""
|
||||||
|
item.style.top = ""
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
case "编排":
|
case "编排":
|
||||||
@ -103,59 +152,8 @@ Volcanos("onaction", {help: "组件交互", list: [["layout", "工作", "办公"
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
layout: function(event, can, value, cmd, target) {
|
|
||||||
can.Export(event, value, cmd)
|
|
||||||
},
|
|
||||||
"刷新": function(event, can, msg, cmd, target) {
|
|
||||||
can.page.Select(can, can.output, "fieldset.item>div.output", function(item) {
|
|
||||||
item.innerHTML = "";
|
|
||||||
})
|
|
||||||
can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) {
|
|
||||||
can.onimport.init(event, can, msg, cmd, can.output)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
"清屏": function(event, can, msg, cmd, target) {
|
|
||||||
can.page.Select(can, can.output, "fieldset.item>div.output", function(item) {
|
|
||||||
item.innerHTML = "";
|
|
||||||
})
|
|
||||||
},
|
|
||||||
"并行": function(event, can, msg, cmd, target) {
|
|
||||||
can.page.Select(can, target, "fieldset.item", function(field) {
|
|
||||||
can.page.Select(can, field, "input[type=button]", function(input, index) {
|
|
||||||
index == 0 && field.Check(event, input, function() {})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
"串行": function(event, can, msg, cmd, target) {
|
|
||||||
can.core.Next(can.page.Select(can, target, "fieldset.item", function(field) {
|
|
||||||
return field
|
|
||||||
}), function(field, cb) {
|
|
||||||
can.page.Select(can, field, "input[type=button]", function(input, index) {
|
|
||||||
index == 0 && field.Check(event, input, cb)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
})
|
|
||||||
Volcanos("onchoice", {help: "组件菜单", list: [["layout", "工作", "办公", "聊天"], "保存"],
|
|
||||||
"工作": function(event, can, msg, cmd, target) {
|
|
||||||
can.Export(event, cmd, "layout")
|
|
||||||
},
|
|
||||||
"办公": function(event, can, msg, cmd, target) {
|
|
||||||
can.Export(event, cmd, "layout")
|
|
||||||
},
|
|
||||||
"聊天": function(event, can, msg, cmd, target) {
|
|
||||||
can.Export(event, cmd, "layout")
|
|
||||||
},
|
|
||||||
"保存": function(event, can, msg, cmd, target) {
|
|
||||||
var list = []
|
|
||||||
can.page.Select(can, target, "fieldset", function(item) {var meta = item.Meta
|
|
||||||
list.push(meta.node||"", meta.group, meta.index, meta.index)
|
|
||||||
})
|
|
||||||
can.run(event, [can.Conf("river"), can.Conf("storm"), "save"].concat(list), function(msg) {
|
|
||||||
can.user.toast("保存成功")
|
|
||||||
})
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
Volcanos("onchoice", {help: "组件菜单", list: ["保存", "刷新"]})
|
||||||
Volcanos("ondetail", {help: "组件详情", list: []})
|
Volcanos("ondetail", {help: "组件详情", list: []})
|
||||||
Volcanos("onexport", {help: "导出数据", list: []})
|
Volcanos("onexport", {help: "导出数据", list: []})
|
||||||
|
|
||||||
|
@ -7,4 +7,7 @@ fieldset.River>div.output {
|
|||||||
fieldset.River>div.output>div.item {
|
fieldset.River>div.output>div.item {
|
||||||
padding-left:6px;
|
padding-left:6px;
|
||||||
}
|
}
|
||||||
|
fieldset.River>div.output>div.item.select {
|
||||||
|
background-color:red;
|
||||||
|
border:ridge 2px yellow;
|
||||||
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
Volcanos("onimport", {help: "导入数据", list: [],
|
Volcanos("onimport", {help: "导入数据", list: [],
|
||||||
_init: function(can, conf, output, action, option, field) {output.innerHTML = "";
|
_init: function(can, conf, output, action, option, field) {output.innerHTML = "";
|
||||||
var device = can.page.Append(can, field, [{"view": ["device", "table"]}]).last
|
function create(event, cmd) {
|
||||||
var ui = can.page.Append(can, field, [{view: ["create"], list: [
|
|
||||||
{input: "name", value: can.Conf("def_name"), title: "应用名称"}, {button: ["创建应用", function(event) {
|
|
||||||
if (!ui.name.value) {ui.name.focus(); can.user.toast("请输入群名"); return}
|
if (!ui.name.value) {ui.name.focus(); can.user.toast("请输入群名"); return}
|
||||||
|
|
||||||
var list = []
|
var list = []
|
||||||
@ -10,13 +8,26 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
list.push(item.dataset.pod)
|
list.push(item.dataset.pod)
|
||||||
list.push(item.dataset.key)
|
list.push(item.dataset.key)
|
||||||
list.push(item.dataset.index)
|
list.push(item.dataset.index)
|
||||||
list.push(item.dataset.name)
|
list.push(item.dataset.help)
|
||||||
}})
|
}})
|
||||||
|
|
||||||
can.run(event, [can.Conf("river"), "spawn", ui.name.value].concat(list), function(msg) {
|
var name = ui.name.value;
|
||||||
|
switch (event.target.value) {
|
||||||
|
case "创建应用": cmd = "spawn"; break
|
||||||
|
case "追加应用": cmd = "append", name = can.Conf("storm"); break
|
||||||
|
}
|
||||||
|
|
||||||
|
can.run(event, [can.Conf("river"), cmd, name].concat(list), function(msg) {
|
||||||
can.Hide(), can.Export(event, "update", "storm");
|
can.Hide(), can.Export(event, "update", "storm");
|
||||||
})
|
})
|
||||||
}]}, {name: "list", view: ["list", "table"], list: [
|
}
|
||||||
|
|
||||||
|
var device = can.page.Append(can, field, [{"view": ["device", "table"]}]).last
|
||||||
|
var ui = can.page.Append(can, field, [{view: ["create"], list: [
|
||||||
|
{input: "name", value: can.Conf("def_name"), title: "应用名称"},
|
||||||
|
{button: ["创建应用", create]},
|
||||||
|
{button: ["追加应用", create]},
|
||||||
|
{name: "list", view: ["list", "table"], list: [
|
||||||
{text: ["3. 已选命令列表", "caption"]},
|
{text: ["3. 已选命令列表", "caption"]},
|
||||||
{row: ["ctx", "cmd", "name", "help"], sub: "th"},
|
{row: ["ctx", "cmd", "name", "help"], sub: "th"},
|
||||||
]},
|
]},
|
||||||
@ -63,6 +74,10 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
if (value == "update") {return}
|
if (value == "update") {return}
|
||||||
can.Conf("river", value)
|
can.Conf("river", value)
|
||||||
},
|
},
|
||||||
|
storm: function(event, can, value, key, output) {
|
||||||
|
if (value == "update") {return}
|
||||||
|
can.Conf("storm", value)
|
||||||
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新"],
|
Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新"],
|
||||||
"关闭": function(event, can, meta, key, output) {
|
"关闭": function(event, can, meta, key, output) {
|
||||||
@ -74,14 +89,7 @@ Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新"],
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onchoice", {help: "组件菜单", list: ["关闭", "刷新"],
|
Volcanos("onchoice", {help: "组件菜单", list: ["关闭", "刷新"]})
|
||||||
"关闭": function(event, can, msg, key, target) {
|
|
||||||
can.onaction[key](event, can, key, can.output)
|
|
||||||
},
|
|
||||||
"刷新": function(event, can, msg, key, target) {
|
|
||||||
can.onaction[key](event, can, key, can.output)
|
|
||||||
},
|
|
||||||
})
|
|
||||||
Volcanos("ondetail", {help: "组件详情", list: ["创建", "删除", "共享"],
|
Volcanos("ondetail", {help: "组件详情", list: ["创建", "删除", "共享"],
|
||||||
"创建": function(event, can, msg, value, key, index, td) {
|
"创建": function(event, can, msg, value, key, index, td) {
|
||||||
can.run(event, [can.Conf("river"), "spawn", msg.key[index]], function(msg) {
|
can.run(event, [can.Conf("river"), "spawn", msg.key[index]], function(msg) {
|
||||||
|
@ -7,5 +7,8 @@ fieldset.Storm>div.output {
|
|||||||
fieldset.Storm>div.output>div.item {
|
fieldset.Storm>div.output>div.item {
|
||||||
padding-left:6px;
|
padding-left:6px;
|
||||||
}
|
}
|
||||||
|
fieldset.Storm>div.output>div.item.select {
|
||||||
|
background-color:red;
|
||||||
|
border:ridge 2px yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
item.type == "text" && !target.title && (target.title = item.placeholder || item.name || "");
|
item.type == "text" && !target.title && (target.title = item.placeholder || item.name || "");
|
||||||
item.type == "button" && item.action == "auto" && can.run && can.run({});
|
item.type == "button" && item.action == "auto" && can.run && can.run({});
|
||||||
item.type == "textarea" && can.page.Append(can, option, [{type: "br"}])
|
item.type == "textarea" && can.page.Append(can, option, [{type: "br"}])
|
||||||
|
item.type == "select" && (target.value = item.value)
|
||||||
return target;
|
return target;
|
||||||
}),
|
}),
|
||||||
path: function(event, can, value, cmd, target) {
|
path: function(event, can, value, cmd, target) {
|
||||||
|
@ -8,15 +8,20 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "组件交互", list: []})
|
Volcanos("onaction", {help: "组件交互", list: []})
|
||||||
Volcanos("onchoice", {help: "组件菜单", list: [["display", "表格", "文档", "相册"],
|
Volcanos("onchoice", {help: "组件菜单", list: ["执行", "返回", "重命名", "选项", "加参", "减参", "克隆", "删除"],
|
||||||
"执行", "返回", "加参", "减参", "克隆", "删除"],
|
|
||||||
|
|
||||||
"表格": function(event, can, msg, cmd, field) {can.Show("table", can.msg)},
|
|
||||||
"文档": function(event, can, msg, cmd, field) {can.Show("inner", can.msg)},
|
|
||||||
"相册": function(event, can, msg, cmd, field) {can.Show("media", can.msg)},
|
|
||||||
|
|
||||||
"返回": function(event, can, msg, cmd, field) {can.Last(event)},
|
|
||||||
"执行": function(event, can, msg, cmd, field) {can.Runs(event)},
|
"执行": function(event, can, msg, cmd, field) {can.Runs(event)},
|
||||||
|
"返回": function(event, can, msg, cmd, field) {can.Last(event)},
|
||||||
|
"重命名": function(event, can, msg, cmd, field) {can.Rename(event)},
|
||||||
|
"选项": function(event, can, msg, cmd, field) {
|
||||||
|
can.user.input(event, can, ["name", "value"], function(event, cmd, meta, list) {
|
||||||
|
var data = {type: "text", value: meta.value||""}
|
||||||
|
can.page.ClassList.add(can, data, "opts");
|
||||||
|
|
||||||
|
var input = {type: "input", name: meta.name, data: data};
|
||||||
|
var target = can.Dream(can.option, "option", input)[input.name];
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
},
|
||||||
"加参": function(event, can, msg, cmd, field) {can.Append()},
|
"加参": function(event, can, msg, cmd, field) {can.Append()},
|
||||||
"减参": function(event, can, msg, cmd, field) {can.Remove(event)},
|
"减参": function(event, can, msg, cmd, field) {can.Remove(event)},
|
||||||
"克隆": function(event, can, msg, cmd, field) {can.Clone(event)},
|
"克隆": function(event, can, msg, cmd, field) {can.Clone(event)},
|
||||||
|
@ -27,8 +27,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
var sub = can.Event(event);
|
var sub = can.Event(event);
|
||||||
msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())})
|
msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())})
|
||||||
typeof cb == "function"? cb(event, can, msg, index, key, cmd, target):
|
typeof cb == "function"? cb(event, can, msg, index, key, cmd, target):
|
||||||
// can.run(event, [id, typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) {
|
can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML, id], function(msg) {
|
||||||
can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) {
|
|
||||||
can.onimport.init(can, msg, cb, output, option)
|
can.onimport.init(can, msg, cb, output, option)
|
||||||
}, true)
|
}, true)
|
||||||
}))
|
}))
|
||||||
@ -44,9 +43,9 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
return typeof cb == "function" && cb(msg), table;
|
return typeof cb == "function" && cb(msg), table;
|
||||||
},
|
},
|
||||||
which: function(event, table, list, cb) {if (event.target == table) {return cb(-1, "")}
|
which: function(event, table, list, cb) {if (event.target == table) {return cb(-1, "")}
|
||||||
can.page.Select(can, table, "tr", function(tr, index) {if (event.target == tr) {return cb(index-1, "")}
|
can.page.Select(can, table, "tr", function(tr, index) {if (event.target == tr) {return cb(tr.dataset.index, "")}
|
||||||
can.page.Select(can, tr, "th,td", function(td, order) {
|
can.page.Select(can, tr, "th,td", function(td, order) {
|
||||||
if (event.target == td) {return cb(index-1, list[order])}
|
if (event.target == td) {return cb(tr.dataset.index, list[order])}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -80,10 +79,8 @@ Volcanos("ondetail", {help: "组件详情", list: ["选择", "编辑", "删除",
|
|||||||
"编辑": function(event, can, msg, index, key, cmd, td) {
|
"编辑": function(event, can, msg, index, key, cmd, td) {
|
||||||
var text = td.innerHTML;
|
var text = td.innerHTML;
|
||||||
var input = can.page.Appends(can, td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) {
|
var input = can.page.Appends(can, td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) {
|
||||||
if (event.key == " ") {return event.stopPropagation()}
|
|
||||||
if (event.key != "Enter") {return}
|
if (event.key != "Enter") {return}
|
||||||
if (key == "value" && msg.key) {key = msg.key[index]}
|
if (key == "value" && msg.key) {key = msg.key[index]}
|
||||||
// can.run(event, [msg.Ids(index), "modify", key, event.target.value, text], function(msg) {
|
|
||||||
can.run(event, ["action", "modify", key, event.target.value, text, msg.Ids(index)], function(msg) {
|
can.run(event, ["action", "modify", key, event.target.value, text, msg.Ids(index)], function(msg) {
|
||||||
td.innerHTML = event.target.value;
|
td.innerHTML = event.target.value;
|
||||||
can.user.toast("修改成功")
|
can.user.toast("修改成功")
|
||||||
|
15
plugin/team/plan.css
Normal file
15
plugin/team/plan.css
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
fieldset.item.plan div.output div.task.finish {
|
||||||
|
color:red;
|
||||||
|
}
|
||||||
|
fieldset.item.plan div.output div.task.finish:hover {
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
fieldset.item.plan div.output div.task.process {
|
||||||
|
color:green;
|
||||||
|
}
|
||||||
|
fieldset.item.plan div.output div.task.process:hover {
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
fieldset.item.plan div.output div.task.cancel {
|
||||||
|
color:yellow;
|
||||||
|
}
|
@ -1,25 +1,20 @@
|
|||||||
Volcanos("onimport", {help: "导入数据", list: [],
|
Volcanos("onimport", {help: "导入数据", list: [],
|
||||||
init: function(can, msg, cb, output, action, option) {output.innerHTML = "";
|
init: function(can, msg, cb, output, action, option) {output.innerHTML = "";
|
||||||
if (!msg.append || msg.append.length == 0) {
|
|
||||||
var code = can.page.Append(can, output, [{view: ["code", "div", msg.Result()]}]).code;
|
|
||||||
return typeof cb == "function" && cb(msg), code;
|
|
||||||
}
|
|
||||||
|
|
||||||
var table = can.page.AppendTable(can, output, msg, msg.append);
|
var table = can.page.AppendTable(can, output, msg, msg.append);
|
||||||
table.onclick = function(event) {switch (event.target.tagName) {
|
table.onclick = function(event) {switch (event.target.tagName) {
|
||||||
case "TD":
|
case "TD":
|
||||||
var input = can.user.input(event, can, ["group", "type", "name", "text"], function(event, value, data) {
|
var input = can.user.input(event, can, ["zone", "type", "name", "text"], function(event, value, data) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case "提交":
|
case "提交":
|
||||||
can.run(event, ["action", "insert", data.group, data.type, data.name, data.text, "begin_time", can.base.Time()], function(msg) {
|
// 创建任务
|
||||||
|
can.run(event, ["action", "insert", data.zone, data.type, data.name, data.text, "begin_time", can.base.Time()], function(msg) {
|
||||||
can.page.Remove(can, input.first)
|
can.page.Remove(can, input.first)
|
||||||
can.user.toast("添加成功")
|
can.user.toast("添加成功")
|
||||||
can.Runs(event)
|
can.Runs(event)
|
||||||
return true
|
return true
|
||||||
}, true)
|
}, true)
|
||||||
console.log(data)
|
|
||||||
break
|
break
|
||||||
case "取消": return true;
|
case "关闭": return true;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
@ -28,26 +23,22 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
case "TR":
|
case "TR":
|
||||||
case "TABLE":
|
case "TABLE":
|
||||||
}}
|
}}
|
||||||
|
|
||||||
table.oncontextmenu = function(event) {var target = event.target;
|
table.oncontextmenu = function(event) {var target = event.target;
|
||||||
switch (event.target.tagName) {
|
switch (event.target.tagName) {
|
||||||
case "DIV":
|
case "DIV":
|
||||||
break
|
// 任务操作
|
||||||
case "TD":
|
var data = target.dataset;
|
||||||
can.onimport.which(event, table, msg.append, function(index, key) {
|
|
||||||
can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd];
|
can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd];
|
||||||
var id = msg.Ids(index);
|
typeof cb == "function"? cb(event, can, msg, data.id, data.zone, cmd, target):
|
||||||
var sub = can.Event(event);
|
can.run(event, ["action", typeof cb == "string"? cb: cmd, data.id, data.zone], function(msg) {
|
||||||
msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())})
|
|
||||||
typeof cb == "function"? cb(event, can, msg, index, key, cmd, target):
|
|
||||||
// can.run(event, [id, typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) {
|
|
||||||
can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) {
|
|
||||||
can.onimport.init(can, msg, cb, output, option)
|
|
||||||
}, true)
|
}, true)
|
||||||
}))
|
}))
|
||||||
})
|
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
break
|
break
|
||||||
|
case "TD":
|
||||||
|
break
|
||||||
case "TH":
|
case "TH":
|
||||||
case "TR":
|
case "TR":
|
||||||
case "TABLE":
|
case "TABLE":
|
||||||
@ -65,23 +56,35 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
|
|
||||||
can.page.Select(can, table, "tr", function(tr) {tr.list = [];
|
can.page.Select(can, table, "tr", function(tr) {tr.list = [];
|
||||||
can.page.Select(can, tr, "td", function(item, index) {tr.list.push(item);
|
can.page.Select(can, tr, "td", function(item, index) {tr.list.push(item);
|
||||||
// item.setAttribute("draggable", true)
|
|
||||||
// item.ondragstart = function(event) {can.drag = event.target}
|
|
||||||
item.ondragover = function(event) {event.preventDefault(), can.page.Select(can, table, "td.over", function(item) {
|
item.ondragover = function(event) {event.preventDefault(), can.page.Select(can, table, "td.over", function(item) {
|
||||||
can.page.ClassList.del(can, item, "over")
|
can.page.ClassList.del(can, item, "over")
|
||||||
}), can.page.ClassList.add(can, item, "over")}
|
}), can.page.ClassList.add(can, item, "over")}
|
||||||
|
|
||||||
item.ondrop = function(event) {event.preventDefault()
|
item.ondrop = function(event) {event.preventDefault()
|
||||||
item.append(can.drag)
|
item.append(can.drag)
|
||||||
|
|
||||||
|
// 任务排期
|
||||||
var data = can.drag.dataset;
|
var data = can.drag.dataset;
|
||||||
var begin_time = new Date(data.begin_time);
|
var begin_time = new Date(data.begin_time);
|
||||||
|
|
||||||
|
switch (can.Option("scale")) {
|
||||||
|
case "long":
|
||||||
|
begin_time.setYear(parseInt(tr.list[0].innerText));
|
||||||
|
break
|
||||||
|
case "year":
|
||||||
|
begin_time.setMonth(parseInt(tr.list[0].innerText)-1);
|
||||||
|
break
|
||||||
|
case "month":
|
||||||
|
break
|
||||||
|
case "week":
|
||||||
|
begin_time.setDate(begin_time.getDate() - (begin_time.getDay() - index + 1))
|
||||||
|
case "day":
|
||||||
begin_time.setHours(parseInt(tr.list[0].innerText));
|
begin_time.setHours(parseInt(tr.list[0].innerText));
|
||||||
begin_time.setMinutes(0);
|
begin_time.setMinutes(0);
|
||||||
begin_time.setSeconds(0);
|
begin_time.setSeconds(0);
|
||||||
if (can.Option("scale") == "week") {
|
|
||||||
begin_time.setDate(begin_time.getDate() - (begin_time.getDay() - index + 1))
|
|
||||||
}
|
}
|
||||||
can.run(event, ["action", "modify", "begin_time", can.base.Time(begin_time), data.begin_time, data.id, data.name], function(msg) {
|
|
||||||
|
can.run(event, ["action", "modify", "begin_time", can.base.Time(begin_time), data.begin_time, data.id, data.zone], function(msg) {
|
||||||
can.user.toast("修改成功")
|
can.user.toast("修改成功")
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
@ -97,65 +100,22 @@ Volcanos("onimport", {help: "导入数据", list: [],
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
}, ["plugin/team/plan.css"])
|
||||||
favor: function(event, can, msg, cmd, output) {var key = msg.detail[0];
|
Volcanos("onaction", {help: "组件交互", list: []})
|
||||||
var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onaction ", key), msg._hand = true}
|
Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空"],
|
||||||
var cb = can.onchoice[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onchoice ", key), msg._hand = true}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
Volcanos("onaction", {help: "组件交互", list: [],
|
|
||||||
})
|
|
||||||
Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载"],
|
|
||||||
"返回": function(event, can, msg, cmd, target) {
|
"返回": function(event, can, msg, cmd, target) {
|
||||||
can.run(event, ["", "Last"])
|
can.run(event, ["", "Last"])
|
||||||
},
|
},
|
||||||
"清空": function(event, can, msg, cmd, target) {
|
"清空": function(event, can, msg, cmd, target) {
|
||||||
can.target.innerHTML = "";
|
can.target.innerHTML = "";
|
||||||
},
|
},
|
||||||
"复制": function(event, can, msg, cmd, target) {
|
|
||||||
var list = can.onexport.Format(can, msg, "data");
|
|
||||||
can.user.toast(can.page.CopyText(can, list[2]), "复制成功")
|
|
||||||
},
|
|
||||||
"下载": function(event, can, msg, cmd, target) {msg = msg || can.msg;
|
|
||||||
var list = can.onexport.Format(can, msg, msg._plugin_name||"data");
|
|
||||||
can.page.Download(can, list[0]+list[1], list[2]);
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
Volcanos("ondetail", {help: "组件详情", list: ["选择", "编辑", "删除", "复制", "下载"],
|
Volcanos("ondetail", {help: "组件详情", list: ["开始", "完成", "取消"],
|
||||||
"选择": "select",
|
"开始": "process",
|
||||||
"删除": "delete",
|
"完成": "finish",
|
||||||
"编辑": function(event, can, msg, index, key, cmd, td) {
|
"取消": "cancel",
|
||||||
var text = td.innerHTML;
|
|
||||||
var input = can.page.Appends(can, td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) {
|
|
||||||
if (event.key == " ") {return event.stopPropagation()}
|
|
||||||
if (event.key != "Enter") {return}
|
|
||||||
if (key == "value" && msg.key) {key = msg.key[index]}
|
|
||||||
// can.run(event, [msg.Ids(index), "modify", key, event.target.value, text], function(msg) {
|
|
||||||
can.run(event, ["action", "modify", key, event.target.value, text, msg.Ids(index)], function(msg) {
|
|
||||||
td.innerHTML = event.target.value;
|
|
||||||
can.user.toast("修改成功")
|
|
||||||
}, true)
|
|
||||||
}}}]).first;
|
|
||||||
input.focus();
|
|
||||||
input.setSelectionRange(0, input.value.length);
|
|
||||||
},
|
|
||||||
"复制": function(event, can, msg, index, key, cmd, target) {
|
|
||||||
can.user.toast(can.page.CopyText(can, target.innerHTML), "复制成功")
|
|
||||||
},
|
|
||||||
"下载": function(event, can, msg, index, key, cmd, target) {
|
|
||||||
can.page.Download(can, key, target.innerHTML);
|
|
||||||
},
|
|
||||||
})
|
|
||||||
Volcanos("onexport", {help: "导出数据", list: [],
|
|
||||||
Format: function(can, msg, name) {
|
|
||||||
var ext = ".csv", txt = can.page.Select(can, can.target, "tr", function(tr) {
|
|
||||||
return can.page.Select(can, tr, "td,th", function(td) {return td.innerText}).join(",")
|
|
||||||
}).join("\n");
|
|
||||||
|
|
||||||
!txt && (ext = ".txt", txt = msg.result && msg.result.join("") || "");
|
|
||||||
return [name, ext, txt]
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
Volcanos("onexport", {help: "导出数据", list: []})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5
proto.js
5
proto.js
@ -97,6 +97,9 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块
|
|||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
Timer: shy("定时器", function(interval, cb, cbs) {interval = typeof interval == "object"? interval || []: [interval];
|
Timer: shy("定时器", function(interval, cb, cbs) {interval = typeof interval == "object"? interval || []: [interval];
|
||||||
|
// value
|
||||||
|
// [1,2,3,4]
|
||||||
|
// {value, length}
|
||||||
var timer = {stop: false};
|
var timer = {stop: false};
|
||||||
function loop(i) {if (timer.stop || i >= interval.length && interval.length >= 0) {return typeof cbs == "function" && cbs(interval)}
|
function loop(i) {if (timer.stop || i >= interval.length && interval.length >= 0) {return typeof cbs == "function" && cbs(interval)}
|
||||||
return typeof cb == "function" && cb(interval.value||interval[i], i, interval)?
|
return typeof cb == "function" && cb(interval.value||interval[i], i, interval)?
|
||||||
@ -197,6 +200,8 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块
|
|||||||
}
|
}
|
||||||
var text = line, list = [], item = false, style = ""
|
var text = line, list = [], item = false, style = ""
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case "option":
|
||||||
|
list.push({text: line.name+": "})
|
||||||
case "input":
|
case "input":
|
||||||
style = " "+line.type
|
style = " "+line.type
|
||||||
list.push(line)
|
list.push(line)
|
||||||
|
@ -88,10 +88,6 @@ fieldset>div.output div.item:hover {
|
|||||||
background-color:red;
|
background-color:red;
|
||||||
border:ridge 2px yellow;
|
border:ridge 2px yellow;
|
||||||
}
|
}
|
||||||
fieldset>div.output div.item.select {
|
|
||||||
background-color:red;
|
|
||||||
border:ridge 2px yellow;
|
|
||||||
}
|
|
||||||
fieldset>div.output table td {
|
fieldset>div.output table td {
|
||||||
/* word-break:break-word; */
|
/* word-break:break-word; */
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user