1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 08:48:06 +08:00
This commit is contained in:
shaoying 2020-02-15 20:47:57 +08:00
parent 9f9da31b4f
commit 95dce31deb
22 changed files with 364 additions and 182 deletions

View File

@ -5,7 +5,7 @@ App({
conf: {serve: "https://shylinux.com/chat"},
request: function(cmd, data, cb) {var app = this; data.sessid = app.conf.sessid
wx.request({method: "POST", url: app.conf.serve+"/"+cmd, data: data, success(res) {var msg = res.data
console.log(msg)
console.log("POST", cmd, msg)
if (res.statusCode == 401) {
app.usercode(function() {app.request(cmd, data, cb)})
return
@ -26,6 +26,17 @@ App({
}
},
}
var row = 0
var index = []
if (msg.append) {
for (var i = 0; i < msg.append.length; i++) {
row = msg[msg.append[i]].length > row? msg[msg.append[i]].length: row
}
for (var i = 0; i < row; i++) {
index.push(i)
}
}
msg._index = index
typeof cb == "function" && cb(msg)
}})
},
@ -54,5 +65,6 @@ App({
toast: function(title) {wx.showToast({title: title})},
onLaunch: function() {
this.conf.sessid = wx.getStorageSync("sessid")
console.log("load", "sessid", this.conf.sessid)
},
})

View File

@ -1,5 +1,5 @@
<template name="list-name">
<table wx:if="{{msg.append && msg.append[0]}}">
<tr wx:for="{{msg[msg.append[0]]}}" bindtap="onClick" data-index="{{index}}"><td class="item">{{msg.name[index]}}</td></tr>
<tr wx:for="{{msg[msg.append[0]]}}" wx:key="name" bindtap="onClick" data-index="{{index}}"><td class="item">{{msg.name[index]}}</td></tr>
</table>
</template>

View File

@ -11,33 +11,34 @@ Page({
{name: "共享", bind: "refresh"},
{name: "扫码", bind: "action"},
],
msg: {append: ["hi", "he"], hi: [1, 2], he: [3, 4]},
res: [],
his: {},
inputs: {},
},
run: function(order, cb) {var page = this, field = page.data.res[order]
var his = page.data.his[order] || []
run: function(order, cmd, cb) {var page = this, field = page.data.res[order]
// var his = page.data.his[order] || []
var arg = []
field.inputs.forEach(function(input) {
if (input._input == "text") {
arg.push(input.value||"")
}
})
his.push(arg)
page.data.his[order] = his
var cmds = [page.data.river, page.data.storm, order]
field.inputs.forEach(function(input) {
if (input._input == "text") {
cmds.push(input.value||"")
if (input._input == "textarea") {
arg.push(input.value||"")
}
})
// his.push(arg)
// page.data.his[order] = his
var cmds = [page.data.river, page.data.storm, order]
cmds = cmds.concat(cmd||arg||[])
for (var i = cmds.length-1; i > 0; i--) {
if (cmds[i] === "") {cmds.pop()} else {break}
}
app.request("action", {cmds: cmds}, function(msg) {
page.data.res[order].msg = msg
page.setData({res: page.data.res})
console.log("update-----", page.data.res[order])
typeof cb == "function" && cb(msg)
})
},
@ -48,7 +49,7 @@ Page({
break
case "串行":
function cb(i) {
page.run(i, function() {i < page.data.res.length && cb(i+1)})
page.run(i, null, function() {i < page.data.res.length && cb(i+1)})
}
cb(0)
break
@ -82,10 +83,34 @@ Page({
onEnter: function(event) {var page = this, data = event.target.dataset
page.data.res[data.order].inputs[data.index].value = event.detail.value
},
onfigure: {
key: {
click: function(event, page, data, cmd, field) {
page.run(data.order, ["action", "input", data.item.name, data.item.value], function(msg) {
console.log("onkey-----", page.data.res[data.order])
})
},
},
location: {
click: function(event, page, data, cmd, field) {
wx.chooseLocation({success: function(res) {
field.inputs[data.index].value = res.name
page.setData({res: page.data.res})
page.run(data.order, ["action", "location", res.name, res.address, res.latitude*100000, res.longitude*100000])
}})
},
}
},
onClick: function(event) {var page = this, data = event.target.dataset
var field = page.data.res[data.order]
if (data && data.item && data.item._input == "text") {
var figure = page.onfigure[data.item.cb||data.item.figure||data.item.name]
figure && figure.click(event, page, data, "what", field)
return
}
switch (data.input.cb) {
case "Last":
break
var his = page.data.his[data.order] || []
his.pop()
var arg = his.pop()
@ -105,15 +130,21 @@ Page({
page.data.res[data.order].inputs.forEach(function(input) {
if (input.name == data.field) {
input.value = data.value
if (input.action == "auto") {
page.run(data.order)
}
page.setData({res: page.data.res})
page.data.inputs[data.order] = page.data.res[data.order].inputs
if (input.action == "auto") {
page.run(data.order, null, function(msg) {
console.log("onwhich-----", page.data.res[data.order])
})
}
}
})
},
onLoad: function (options) {var page = this
console.log("page", "action", options)
app.conf.sessid = app.conf.sessid || options.sessid
page.data.river = options.river
page.data.storm = options.storm

View File

@ -1,15 +1,21 @@
<view class="display">
<view class="action">
<view wx:for="{{button}}">
<view wx:for="{{button}}" wx:key="name">
<button size="mini" bindtap="{{item.bind}}" data-name="{{item.name}}">{{item.name}}</button>
</view>
</view>
<view class="field" wx:for="{{res}}" wx:for-index="order" wx:for-item="field">
<view class="field" wx:for="{{res}}" wx:key="name" wx:for-index="order" wx:for-item="field">
<view class="detail">
<view><text class="title">{{field.name}}({{field.help}})</text></view>
<view wx:for="{{field.inputs}}" class="inputs">
<view wx:for="{{field.inputs}}" wx:key="name" class="inputs">
<view wx:if="{{item._input == 'text'}}">
<input type="text" value="{{item.value}}" placeholder="{{item.name}}" bindblur="onBlur" bindconfirm="onEnter" data-order="{{order}}" data-index="{{index}}" data-item="{{item}}"/>
<input type="text" value="{{item.value}}" placeholder="{{item.name}}"
bindtap="onClick" bindblur="onBlur" bindconfirm="onEnter" data-order="{{order}}" data-index="{{index}}" data-item="{{item}}"/>
</view>
<view wx:elif="{{item._input == 'textarea'}}" class="textarea">
<textarea value="{{item.value||item.name}}" placeholder="{{item.name}}"
bindtap="onClick" bindblur="onBlur" data-order="{{order}}" data-field="{{field}}" data-index="{{index}}" data-input="{{item}}"></textarea>
</view>
<view wx:elif="{{item._input == 'button'}}" class="button">
<button size="mini" bindtap="onClick" data-order="{{order}}" data-field="{{field}}" data-index="{{index}}" data-input="{{item}}">{{item.value||item.name}}</button>
@ -18,10 +24,10 @@
</view>
<table wx:if="{{field.msg}}">
<tr><th wx:for="{{field.msg.append}}">{{item}}</th></tr>
<tr wx:for="{{field.msg[field.msg.append[0]]}}" wx:for-index="line"><td wx:for="{{field.msg.append}}" bindtap="onWhich" data-value="{{field.msg[item][line]}}" data-index="{{line}}" data-field="{{item}}" data-order="{{order}}">{{field.msg[item][line]}}</td></tr>
<tr><th wx:for="{{field.msg.append}}" wx:key="name">{{item}}</th></tr>
<tr wx:for="{{field.msg._index}}" wx:key="name" wx:for-index="line"><td wx:for="{{field.msg.append}}" bindtap="onWhich" data-value="{{field.msg[item][line]}}" data-index="{{line}}" data-field="{{item}}" data-order="{{order}}">{{field.msg[item][line]}}</td></tr>
</table>
<view class="output" wx:if="{{field.msg.result && field.feature && field.feature.display == 'inner'}}"><rich-text wx:for="{{field.msg.result}}" nodes="{{item}}"></rich-text></view>
<view class="output" wx:elif="{{field.msg.result}}"><text wx:for="{{field.msg.result}}">{{item}}</text></view>
<view class="output" wx:if="{{field.msg.result && field.feature && field.feature.display == 'inner'}}"><rich-text wx:for="{{field.msg.result}}" wx:key="name" nodes="{{item}}"></rich-text></view>
<view class="output" wx:elif="{{field.msg.result}}"><text wx:for="{{field.msg.result}}" wx:key="name">{{item}}</text></view>
</view>
</view>

View File

@ -5,19 +5,25 @@ view.detail {
margin-top:10px;
clear:both;
}
input {
width:80px;
}
text.title {
view.detail text.title {
font-weight:bold;
font-size:18px;
}
view.detail>view.inputs>view {
view.detail view.inputs>view {
float:left;
}
.input {
view.detail input {
width:80px;
margin:2px;
padding:2px;
border:solid 1px green;
}
.output {
view.detail view.textarea {
clear:both;
width:calc(100% - 2px);
border:solid 1px green;
}
view.output {
background-color:#272822;
}

View File

@ -19,6 +19,7 @@ Page({
onClick: function(event) {this.toStorm(event.currentTarget.dataset.index)},
onLoad: function (options) {
console.log("page", "river", options)
app.conf.sessid = app.conf.sessid || options.sessid
this.refresh()
},

View File

@ -18,6 +18,7 @@ Page({
onClick: function(event) {this.toAction(event.currentTarget.dataset.index)},
onLoad: function (options) {
console.log("page", "storm", options)
app.conf.sessid = app.conf.sessid || options.sessid
this.data.river = options.river, this.refresh()
},

View File

@ -1,6 +1,6 @@
var can = Volcanos("chat", {
Page: shy("构造网页", function(can, name, conf, cb, body) {
var page = Volcanos(name, {_type: "local", _panes: {}, target: body,
var page = Volcanos(name, {_type: "local", _panes: {}, _views: {}, target: body,
Plugin: can.Plugin, Inputs: can.Inputs, Output: can.Output,
Import: function(event, value, key) {var cb = page.onimport[key];
@ -18,7 +18,7 @@ var can = Volcanos("chat", {
page.onimport._init && page.onimport._init(page, page.Conf(conf), body)
can.core.Next(conf.pane, function(item, cb) {
page._panes[item.name] = page[item.pos] = page[item.name] = can.Pane(page, item.name, item, cb,
page._panes[item.name] = page[item.name] = page._views[item.pos] = page[item.pos] = can.Pane(page, item.name, item, cb,
can.page.Select(can, body, "fieldset."+item.name)[0] ||
can.page.AppendField(can, body, item.name+" "+(item.pos||""), item))
}, function() {typeof cb == "function" && cb(page)})
@ -28,7 +28,7 @@ var can = Volcanos("chat", {
Pane: shy("构造面板", function(can, name, meta, cb, field) {
var river = "", storm = "";
var pane = Volcanos(name, {_type: "local", _plugins: [], target: field,
var pane = Volcanos(name, {_type: "local", _plugins: [], _local: {}, target: field,
option: field.querySelector("form.option"),
action: field.querySelector("div.action"),
output: field.querySelector("div.output"),
@ -115,7 +115,7 @@ var can = Volcanos("chat", {
var args = meta.args || [];
var feature = JSON.parse(meta.feature||'{}');
var exports = JSON.parse(meta.exports||'""')||feature.exports||[];
var plugin = Volcanos(name, {_type: "local", target: field,
var plugin = Volcanos(name, {_type: "local", _local: {}, target: field,
option: option, action: action, output: output,
Inputs: can.Inputs, Output: can.Output,
@ -131,7 +131,7 @@ var can = Volcanos("chat", {
var name = item.name || item.value || "args"+plugin.page.Select(can, option, "input.args.temp").length;
var count = plugin.page.Select(can, option, ".args").length, value = "";
args && count < args.length && (value = args[count] || item.value || "");
plugin[name] = can.Inputs(plugin, item, item.display||"input", name, value, cb, option);
plugin._local[name] = plugin[name] = can.Inputs(plugin, item, item.display||"input", name, value, cb, option);
},
Select: function(event, target, focus) {
can.page.Select(can, field.parentNode, "fieldset.item.select", function(item) {
@ -169,7 +169,9 @@ var can = Volcanos("chat", {
return item.target.value = item.value
}).length > 0 && plugin.Runs(event)
},
Runs: function(event, cb) {plugin.Run(event, plugin.Option(), cb)},
Runs: function(event, cb) {
plugin.Run(event, plugin.Option(), cb)
},
Run: function(event, args, cb, silent) {var show = !silent;
history.push(plugin.page.Select(can, option, ".args", function(item, index, list) {
return {target: item, value: item.value}
@ -185,7 +187,7 @@ var can = Volcanos("chat", {
})
},
Show: function(type, msg, cb) {plugin.msg = msg, msg._plugin_name = name;
return plugin._output = 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()
meta.args = can.page.Select(can, plugin.option, ".args", function(item) {return item.value})
@ -194,31 +196,6 @@ var can = Volcanos("chat", {
},
Delete: function(event) {field.parentNode.removeChild(field)},
}, Config.libs.concat(["plugin/"+(meta.type||feature.active||"state")]), function(plugin) {plugin.Conf(meta);
var resize = false, last, size, change;
can.page.Select(can, field, "div.border-bottom", function(item) {
item.onmousedown = function(event) {resize = !resize;
can.escape = function(event) {resize = false
plugin._output.onaction && plugin._output.onaction.resize && plugin._output.onaction.resize(event, plugin._output, change, "y")
}
can.resize = plugin.resize = function(event) {change = event.clientY - last;
if (resize) {field.style.height = size + change + "px"}
}
size = field.offsetHeight;
last = event.clientY;
}
item.onmousemove = function(event) {plugin.resize && plugin.resize(event)}
})
can.page.Select(can, field, "div.border-right", function(item) {
item.onmousedown = function(event) {resize = !resize;
can.escape = function(event) {resize = false}
can.resize = plugin.resize = function(event) {
if (resize) {field.style.width = size + event.clientX - last + "px"}
}
size = field.offsetWidth;
last = event.clientX;
}
item.onmousemove = function(event) {plugin.resize && plugin.resize(event)}
})
var list = JSON.parse(meta.inputs||"[]");
plugin.onimport._init? plugin.onimport._init(plugin, feature, plugin.output, plugin.action, plugin.option):
can.core.Next(list.length>0? list: [{type: "text"}, {type: "button", value: "执行"}], plugin.Append, function() {
@ -229,7 +206,9 @@ var can = Volcanos("chat", {
return plugin
}),
Inputs: shy("构造控件", function(can, item, type, name, value, cb, option) {
var input = Volcanos(name, {_type: "local", item: item, _plugin: can,
var input = Volcanos(name, {_type: "input", _plugin: can, item: item, target: "",
Run: can.Run, Runs: can.Runs,
Select: function(event) {can.Select(event, input.target, true)},
Import: function(event, value, key, index) {var cb = input.onimport[item.imports];
value = typeof cb == "function" && cb(event, input, value, key, input.target) || value
@ -245,22 +224,25 @@ var can = Volcanos("chat", {
}, Config.libs.concat(["plugin/"+type]), function(input) {
var target = input.onimport.init(input, item, name, value, option);
input.target = target, target.Input = input;
typeof cb == "function" && cb(input);
input.target = target, typeof cb == "function" && cb(input);
})
return input
}),
Output: shy("构造组件", function(can, feature, type, msg, cb, target, action, option, status) {
if (type == "inner" && (!msg.result || msg.result.length == 0)) {type = "table"}
var output = Volcanos(type, {_type: "local", action: action, msg: msg, feature: feature,
var output = Volcanos(type, {_type: "output", feature: feature, msg: msg,
target: target, action: action,
Run: can.Run, Runs: can.Runs,
Import: function(event, value, key) {var cb = output.onimport[key];
typeof cb == "function" && cb(event, output, value, key, target);
},
Option: function(key, value) {
return can.page.Select(can, can.option, "input[name="+key+"],select[name="+key+"]", function(item) {
return key == undefined? can.page.Select(can, can.option, ".args", function(item) {return item.value}):
(can.page.Select(can, can.option, "input[name="+key+"],select[name="+key+"]", function(item) {
value != undefined && (item.value = value), value = item.value
}), value
}), value)
},
Action: function(key, value) {
return can.page.Select(can, can.action, "input[name="+key+"],select."+key+",select[name="+key+"]", function(item) {
@ -277,7 +259,7 @@ var can = Volcanos("chat", {
},
run: function(event, cmd, cb, silent) {var msg = can.Event(event);
can.page.Select(can, option, "input,select", function(item) {
cmd = cmd || can.Option(), can.page.Select(can, option, "input,select", function(item) {
item.name && item.value && msg.Option(item.name, item.value)
});
(output[cmd[1]] || can[cmd[1]] || can.Run)(event, cmd, cb, silent);
@ -286,7 +268,7 @@ var can = Volcanos("chat", {
status.innerHTML = "", output.onstatus && can.page.AppendStatus(output, status, output.onstatus.list)
output.onimport.init(output, msg, cb, target, action, option);
}, msg)
return output.target = target, target.Output = output
return output
}),
}, Config.libs.concat(Config.list), function(can) {
can[Config.main] = can.Page(can, Config.main, Config, function(chat) {
@ -297,4 +279,6 @@ var can = Volcanos("chat", {
chat.Header.Import(event||{}, user.name, "username")
})
}, document.body)
can.require(["page/"+(can.user.Search(can, "topic")||Config.topic)+".css"], function() {})
})

View File

@ -42,6 +42,7 @@ Volcanos("page", {help: "网页模块",
// 基本结构: type name data list
var type = item.type || "div", data = item.data || {};
var name = item.name || data.name;
name && (data.name = data.name || item.name);
// 数据调整
can.core.Item(item, function(key, value) {
@ -93,6 +94,7 @@ Volcanos("page", {help: "网页模块",
})
data.className = list[0][0] || "";
data.title = data.title || name;
data.name = name;
} else if (item.input) {var list = can.core.List(item.input);
type = "input", name = name || list[0] || "";
@ -100,6 +102,7 @@ Volcanos("page", {help: "网页模块",
data.className = data.className || data.name;
data.placeholder = data.placeholder || data.name;
data.title = data.title || data.placeholder;
data.autocomplete = "none"
data.onkeydown = function(event) {
typeof list[1] == "function" && list[1](event);
@ -140,7 +143,7 @@ Volcanos("page", {help: "网页模块",
// 创建节点
name = name || data.className || type;
var node = can.page.Create(can, type, data);
value.last = node, value.first || (value.first = node), name && (value[name] = node);
value.last = node, value.first || (value.first = node), name && (value[name] = value[data.className||""] = value[type] = node);
item.list && can.page.Append(can, node, item.list, value);
target && target.append && target.append(node);
})
@ -189,14 +192,11 @@ Volcanos("page", {help: "网页模块",
AppendField: shy("添加插件", function(can, target, type, item) {
var dataset = {}; item && item.name && (dataset.names = item.name);
var field = can.page.Append(can, target, [{view: [type, "fieldset"], list: [
// {view: ["border-left"]}, {view: ["border-right"]},
item.pos? undefined: {text: [(item.nick||item.name||"")+"("+(item.help||"")+")", "legend"]},
{view: ["option", "form"], dataset: dataset, list: [{type: "input", style: {display: "none"}}]},
{view: ["action"]}, {view: ["output"]}, {view: ["status"]},
// {view: ["border-bottom"]},
]}]).first;
field.Meta = item
return field;
return field.Meta = item, field;
}),
AppendTable: shy("添加表格", function(can, target, msg, list, cb, cbs) {
var table = can.page.Append(can, target, "table");

View File

@ -5,6 +5,34 @@ Volcanos("user", {help: "用户模块",
reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()},
title: function(text) {document.title = text},
input: function(event, can, form, cb) {
var view = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: event.clientX+"px", top: event.clientY+"px"}, list: [
{view: ["option", "table"], list: can.core.List(form, function(item) {
return {type: ["tr"], list: [
{type: "td", list: [{text: typeof item == "string"?
item: item.length > 0? item[0]: item.name || "",
}]},
{type: "td", list: [typeof item == "string"? {input: item, data: {autofocus: true}}:
item.length > 0? {select: [item]}: item]
},
]}
})},
{view: "action", list: [{button: ["提交", function(event, value) {
var data = {}
var list = can.page.Select(can, view.table, "select,input,textarea", function(item) {
return data[item.name] = item.value
})
if (typeof cb == "function" && cb(event, value, data, list)) {
can.page.Remove(can, view.first)
}
}]}, {button: ["关闭", function(event, value) {
if (typeof cb == "function" && cb(event, value)) {
can.page.Remove(can, view.first)
}
}]}]},
]}])
return view
},
toast: function(text) {},
carte: function(event, cb) {},
login: function(cb) {},

View File

@ -29,7 +29,7 @@ var Config = {iceberg: "/chat/", volcano: "/static/volcanos/",
{group: "index", name: "Action", pos: "bottom"},
{group: "index", name: "Footer", pos: "foot", state: ["ntxt", "ncmd"], title: '<a href="mailto:shylinux@163.com">shylinux@163.com</a>'},
], title: "volcanos", layout: {def: "办公", list: ["工作", "办公", "聊天"], size: {
], title: "volcanos", topic: "black", layout: {def: "工作", list: ["工作", "办公", "聊天"], size: {
"最大": {head: 0, foot: 0, left: 0, right: 0, 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},

56
page/black.css Normal file
View File

@ -0,0 +1,56 @@
body, fieldset {
color: white;
background-color:black;
}
fieldset.item:hover {
/* background-color:gold; */
border:ridge 2px red;
}
fieldset.item.select {
/* background-color:gold; */
border:ridge 2px red;
}
fieldset.dialog {
}
fieldset input {
font-size:12px;
}
fieldset input.args {
background-color:cyan;
font-weight:600;
width:80px;
}
fieldset input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
color:green;
}
fieldset table tr:hover {
background-color:#0fbd45;
}
fieldset table tr.select {
background-color:#0fbd45;
}
fieldset table th {
font-family:monospace;
background-color:#0fbd45;
cursor:pointer;
padding: 0 6px;
}
fieldset table td {
max-width:1200px;
font-family:monospace;
padding: 0 6px;
/* white-space: pre; */
}
fieldset table td.over {
border:solid 2px red;
}
fieldset table td:hover {
background-color:red;
}
fieldset table td.select {
background-color:red;
}

View File

@ -10,6 +10,12 @@ Volcanos("onimport", {help: "导入数据", list: [],
})
Volcanos("onaction", {help: "组件交互", list: [],
onkeydown: function(event, can) {
if (event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") {
return
}
if (event.target.getAttribute("contenteditable")) {
return
}
switch (event.key) {
case "k":
can.Report(event, {x: 0, y: -30}, "scroll")
@ -21,12 +27,6 @@ Volcanos("onaction", {help: "组件交互", list: [],
can.Action.escape && can.Action.escape(event)
break
case " ":
if (event.target.getAttribute("contenteditable")) {
break
}
if (event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") {
break
}
can.Favor && can.page.Select(can, can.Favor.Show(), "input.cmd", function(item) {
item.focus()
})

40
page/gray.css Normal file
View File

@ -0,0 +1,40 @@
body, fieldset {
background-color:#d8d8d8;
}
fieldset.item:hover {
background-color:gold;
border:ridge 2px red;
}
fieldset.item.select {
background-color:gold;
border:ridge 2px red;
}
fieldset.dialog {
}
fieldset table tr:hover {
background-color:lightgreen;
}
fieldset table tr.select {
background-color:lightgreen;
}
fieldset table th {
font-family:monospace;
background-color:lightgreen;
cursor:pointer;
padding: 0 6px;
}
fieldset table td {
max-width:1200px;
font-family:monospace;
padding: 0 6px;
/* white-space: pre; */
}
fieldset table td:hover {
background-color:red;
}
fieldset table td.select {
background-color:red;
}

View File

@ -5,10 +5,12 @@ Volcanos("onimport", {help: "导入数据", list: [],
})
},
init: function(event, can, msg, cmd, target) {can.output.innerHTML = "";
msg.Table(function(item, index) {if (!item.name) {return}
can._plugins.push(can[item.name] = can.Plugin(can, item.name, item, function(event, cmds, cbs) {
can._local[msg.cmds[0]] = can._local[msg.cmds[0]] || {}
can._local[msg.cmds[0]][msg.cmds[1]] = msg.Table(function(item, index) {if (!item.name) {return}
var plugin = can[item.name] = can.Plugin(can, item.name, item, function(event, cmds, cbs) {
can.run(event, [item.river, item.storm, item.action].concat(cmds), cbs)
}, can.page.AppendField(can, can.output, "item "+item.group+" "+item.name, item)))
}, can.page.AppendField(can, can.output, "item "+item.name, item))
return can._plugins.push(plugin), plugin
})
},
layout: function(event, can, value, cmd, target) {can.layout = value;
@ -47,7 +49,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
can._plugin && can._plugin.Import(event, msg, cmd)
},
})
Volcanos("onaction", {help: "组件交互", list: [["layout", "最大", "工作", "办公", "聊天"], "刷新", "清屏", "并行","串行",
Volcanos("onaction", {help: "组件交互", list: [["layout", "工作", "办公", "聊天"], "刷新", "清屏", "并行","串行",
["action", "正常", "编辑", "编排", "定位"],
{input: "pod"}, {input: "you"}, {input: "hot"}, {input: "top"},
],

View File

@ -1,7 +1,7 @@
fieldset.dialog.Carte {
padding:0;
border:solid 2px red;
background-color:greenyellow;
/* background-color:greenyellow; */
position:absolute;
display:none;
z-index:200;

View File

@ -1,6 +1,6 @@
fieldset.Toast {
border:solid 2px red;
background-color:rgba(100,100,100,0.8);
/* background-color:rgba(100,100,100,0.8); */
position:absolute;
display:none;
z-index:200;
@ -15,7 +15,7 @@ fieldset.Toast>div.output {
fieldset.Toast>div.output>div.title {
font-size:12px;
text-align:center;
color:gray;
/* color:gray; */
}
fieldset.Toast>div.output>div.content {
word-break:break-word;
@ -26,16 +26,16 @@ fieldset.Toast>div.output>div.content {
font-size:16px;
}
fieldset.Toast>div.output table {
color:yellow
/* color:yellow */
}
fieldset.Toast>div.output table th {
background:red;
/* background:red; */
}
fieldset.Toast>div.output table td {
white-space:pre;
}
fieldset.Toast>div.output>div.tick {
font-size:12px;
color:gray;
/* color:gray; */
}

View File

@ -37,6 +37,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
// (item.type == "text" || item.type == "textarea") && !target.placeholder && (target.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 == "textarea" && can.page.Append(can, option, [{type: "br"}])
return target;
}),
path: function(event, can, value, cmd, target) {
@ -44,6 +45,25 @@ Volcanos("onimport", {help: "导入数据", list: [],
},
})
Volcanos("onfigure", {help: "控件详情", list: [],
key: {click: function(event, can, value, cmd, target) {
function add(msg, list, update) {
can.page.Append(can, can.figure.output, [{view: "list", list: can.core.List(list, function(item) {
return {text: [item, "div", "label"], onclick: function(event) {
target.value = item;
update && can.history.unshift(item);
msg.Option("_refresh") && run()
}}
})}])
}
function run() {can.figure.output.innerHTML = ""
can.Run(event, ["action", "input", can.item.name, target.value], function(msg) {
add(msg, can.history), can.core.List(msg.append, function(key) {add(msg, msg[key], true)})
}, true)
}
can.history = can.history || [];
can.onfigure._prepare(event, can, value, cmd ,target) && run()
}},
date: {click: function(event, can, value, cmd, target) {if (can.date) {return}
target.style.width = "120px"
function set(now) {
@ -162,7 +182,7 @@ Volcanos("onfigure", {help: "控件详情", list: [],
_prepare: function(event, can, value, cmd, target) {if (can.figure) {return}
can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: {
position: "absolute", left: "20px", top: event.clientY+10+"px",
}, list: [{view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) {
}, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) {
!can.figure.stick && can.onfigure._release(event, can, value, cmd, target)
}}])
return can.figure
@ -176,6 +196,9 @@ Volcanos("onaction", {help: "控件交互", list: [],
var figure = can.onfigure[can.item.cb] || can.onfigure[can.item.figure]
figure? figure.click(event, can, can.item, can.item.name, event.target): can.item.type == "button" && can.run(event)
},
onchange: function(event, can) {
can.item.type == "select" && can.item.action == "auto" && can.Runs(event)
},
onkeydown: function(event, can) {
can.page.oninput(event, can, function(event) {
switch (event.key) {

View File

@ -8,9 +8,19 @@ Volcanos("onimport", {help: "导入数据", list: [],
var table = can.page.AppendTable(can, output, msg, msg.append);
table.onclick = function(event) {switch (event.target.tagName) {
case "TD":
can.onimport.which(event, table, msg.append, function(index, key) {
can.ondetail["复制"](event, can, msg, event.target.innerHTML, index, key, event.target);
can.Export(event, event.target.innerHTML.trim(), key, index)
var input = can.user.input(event, can, ["group", "type", "name", "text"], function(event, value, data) {
switch (value) {
case "提交":
can.run(event, ["action", "insert", data.group, data.type, data.name, data.text, "begin_time", can.base.Time()], function(msg) {
can.page.Remove(can, input.first)
can.user.toast("添加成功")
can.Runs(event)
return true
}, true)
console.log(data)
break
case "取消": return true;
}
})
break
case "TH":
@ -20,6 +30,8 @@ Volcanos("onimport", {help: "导入数据", list: [],
}}
table.oncontextmenu = function(event) {var target = event.target;
switch (event.target.tagName) {
case "DIV":
break
case "TD":
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];
@ -42,7 +54,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
}
}
can.page.Select(can, table, "div.miss", function(item) {
can.page.Select(can, table, "div.task", function(item) {
item.setAttribute("draggable", true)
item.ondragstart = function(event) {can.drag = event.target}
item.ondragover = function(event) {event.preventDefault()}

View File

@ -28,7 +28,8 @@ Volcanos("onimport", {help: "导入数据", list: [],
item.onclick = function(event) {can.node = item}
item.oncontextmenu = function(event) {var target = event.target; can.user.carte(event, shy("", can.ondetail, figure.menu||can.ondetail.list, function(event, key, meta) {var cb = meta[key];
typeof cb == "function" && cb(event, can, msg, 0, key, key, target);
cb? typeof cb == "function" && cb(event, can, msg, 0, key, key, target):
(cb = can.onchoice[key] || can.onaction[key], typeof cb == "function" && cb(event, can, key, key, target))
}), can), event.stopPropagation(), event.preventDefault()}
figure && figure.init && figure.init({}, can, item.localName, "init", item)
@ -105,7 +106,7 @@ Volcanos("onfigure", {help: "图形绘制", list: [],
return [{view: ["story", "p", "p"], dataset: {type: "spark", name: "", text: ""}, inner: "spark...."}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'spark "'+data.name+'" `' + value + '`': ""
return value? 'spark "'+data.name+'" `' + value + '`': "spark"
},
},
@ -235,13 +236,26 @@ Volcanos("onfigure", {help: "图形绘制", list: [],
},
},
})
Volcanos("onaction", {help: "组件菜单", list: ["保存", ["操作", "只读", "排序", "编辑"],
Volcanos("onaction", {help: "组件菜单", list: ["刷新", "保存", ["操作", "只读", "排序", "编辑"],
"插入", ["元素", "h1", "h2", "h3", "brief", "refer", "spark", "shell", "order", "table", "stack"]],
"刷新": function(event, can, value, cmd, target) {
can.run(event)
},
"追加": function(event, can, value, cmd, target) {
can.user.input(event, can, [["type", "spark", "label", "section", "chapter", "title"], "name", {name: "text", type: "textarea"}], function(event, value, form, list) {
value == "提交" && can.run(event, ["action", cmd, can.Option("name")].concat(list), function(msg) {
can.user.confirm("是否刷新") && can.run({})
}, true)
return true
})
},
"保存": function(event, can, value, cmd, target) {
var save = can.page.Select(can, target, ".story", function(story) {
var figure = can.onfigure[story.dataset.type] || can.onfigure[story.localName];
return figure && figure.save && figure.save(event, can, story.innerHTML, cmd, story) || story.innerHTML
var text = figure && figure.save && figure.save(event, can, story.innerText||story.innerHTML, cmd, story) || story.innerText||story.innerHTML
console.log(story.dataset.type, text)
return text
}).join("\n\n")
can.run(event, ["action", cmd, can.Option("name"), save], function(msg) {
@ -273,27 +287,12 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", ["操作", "只读"
can.page.Append(can, can.preview, figure.push(event, can, value, cmd, target)).first.setAttribute("contenteditable", true)
},
})
Volcanos("onchoice", {help: "组件交互", list: ["保存", "清空", ["rect", "rect", "line", "circle"]],
Volcanos("onchoice", {help: "组件交互", list: ["刷新", "保存", "追加", "清空", ["rect", "rect", "line", "circle"]],
"清空": function(event, can, msg, cmd, target) {
console.log("choice", cmd)
},
})
Volcanos("ondetail", {help: "组件详情", list: ["编辑", "删除"],
"编辑": function(event, can, msg, index, key, cmd, target) {
can.user.prompt("文字", function(text) {
if (target.tagName == "text") {return target.innerHTML = text}
var data = {"text-anchor": "middle", "dominant-baseline": "middle"}
var figure = can.onfigure[target.tagName]
figure.text(event, can, data, target)
var p = can.onaction.push(event, can, data, "text", can.svg)
p.innerHTML = text;
target.Text && can.page.Remove(can, target.Text) && delete(target.Text)
target.Text = p
}, target.Text && target.Text.innerText || "")
},
Volcanos("ondetail", {help: "组件详情", list: ["刷新", "追加", "编辑", "删除", "插入"],
"删除": function(event, can, msg, index, key, cmd, target) {
can.page.Remove(can, target)
},

View File

@ -31,7 +31,7 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块
meta.cache[name] = []
for (var i = meta.index; i < list.length; i++) {var item = list[i];
if (item._name == can._name || item._type == "local") {continue}
if (item._name == can._name || item._type == "local"|| item._type == "input" || item._type == "output") {continue}
can[item._name] = item;
meta.cache[name].push(item);
}

101
style.css
View File

@ -1,5 +1,4 @@
html, body {
background-color:#d8d8d8;
padding:0px;
height:100%;
width:100%;
@ -7,7 +6,6 @@ html, body {
}
fieldset {
position:relative;
background-color:#d8d8d8;
padding:0px;
min-width:10px;
overflow:auto;
@ -67,6 +65,16 @@ fieldset>div.action div.space {
display:inline-block;
width:10px;
}
fieldset>div.action input {
width:60px;
margin-left:5px;
}
fieldset>div.action input:focus {
width:120px;
}
fieldset>div.action input:hover {
width:120px;
}
fieldset>div.output {
clear:both;
/* max-height:800px; */
@ -105,7 +113,6 @@ fieldset>div.output table.edit {
}
fieldset.dialog {
background-color:lightgray;
padding:10px;
display:none;
position:absolute;
@ -134,14 +141,6 @@ fieldset.dialog>div.create table {
fieldset.item {
float:left;
}
fieldset.item:hover {
background-color:gold;
border:ridge 2px red;
}
fieldset.item.select {
background-color:gold;
border:ridge 2px red;
}
fieldset.item>form.option>div.item {
padding:0;
border:0;
@ -178,11 +177,9 @@ fieldset.item>div.output>div.status>input.cmd {
font-size:16px;
width:250px;
}
fieldset.item>div.output>div.code svg {
border: solid 2px red;
}
fieldset.item div.border-left {
position:absolute;
width:2px;
@ -209,6 +206,32 @@ fieldset.item div.border-bottom {
cursor:ns-resize;
}
fieldset.input {
z-index: 10000;
border:solid 2px yellow;
position:absolute;
}
fieldset.input.date table tr:hover {
background-color:yellow;
}
fieldset.input.date table td:hover {
background-color:red;
cursor:pointer;
}
fieldset.input.date table td.now {
background-color:red;
}
fieldset.input div.output div.list {
clear:both;
}
fieldset.input div.output div.label {
padding: 10px;
float:left;
}
fieldset.input div.output div.label:hover {
background-color:red;
}
fieldset table {
font-size:14px;
overflow: auto;
@ -222,36 +245,15 @@ fieldset table caption {
fieldset table tbody {
overflow:auto;
}
fieldset table tr:hover {
background-color:lightgreen;
}
fieldset table tr.select {
background-color:lightgreen;
}
fieldset table th {
font-family:monospace;
background-color:lightgreen;
cursor:pointer;
padding: 0 6px;
}
fieldset table th.order {
background-color:red;
cursor:pointer;
}
fieldset table td {
max-width:1200px;
font-family:monospace;
padding: 0 6px;
/* white-space: pre; */
}
fieldset table td.clip {
background-color:red;
}
fieldset table td:hover {
background-color:red;
}
fieldset table td.select {
background-color:red;
fieldset table td sup.more {
color:red;
}
fieldset div.code {
@ -278,12 +280,13 @@ fieldset .story {
fieldset .story:hover {
border:solid 2px red;
}
fieldset p.story {
white-space:pre;
}
fieldset ul.story li:hover {
border:solid 2px red;
cursor:pointer;
}
fieldset code.story {
display:block;
color:white;
@ -315,25 +318,3 @@ fieldset ul.stack:hover {
border:solid 2px red;
}
fieldset td.over {
border:solid 2px red;
}
sup.more {
color:red;
}
fieldset.input {
z-index: 10000;
border:solid 2px yellow;
}
fieldset.input.date table tr:hover {
background-color:yellow;
}
fieldset.input.date table td:hover {
background-color:red;
cursor:pointer;
}
fieldset.input.date table td.now {
background-color:red;
}