efront 3.8.7 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,3 +6,5 @@
6
6
  cluster: options ::cluster-:opt?:id
7
7
  list: options :::type
8
8
  edit: options :::type-:key?:value
9
+ params: options ::params-:key
10
+ invoke: options ::invoke-:key?:params
@@ -0,0 +1,17 @@
1
+ <div head>
2
+ <span -text="task.name"></span>
3
+ (<span -text="task.key"></span>)
4
+ <close @click="remove()"></close>
5
+ </div>
6
+ <div body>
7
+ <div class="left">
8
+ <field -repeat="f in fields" -src="[f,data]"></field>
9
+ <pre -text="task.code"></pre>
10
+ </div>
11
+ <div class="right">
12
+ <pre -text="output"></pre>
13
+ </div>
14
+ </div>
15
+ <div foot>
16
+ <btn @click="run">执行</btn>
17
+ </div>
@@ -0,0 +1,29 @@
1
+ function main(a) {
2
+ var page = view();
3
+ page.innerHTML = template;
4
+ drag.on(page.firstChild, page);
5
+ var fields = data.from("params", { key: a.key }, function (a) {
6
+ return JSON.parse(encode62.timedecode(a));
7
+ });
8
+ var taskid = 0;
9
+ renderWithDefaults(page, {
10
+ remove() {
11
+ remove(page);
12
+ },
13
+ data: {},
14
+ fields: fields,
15
+ task: a,
16
+ output: '',
17
+ async run() {
18
+ var id = ++taskid;
19
+ var params = JSON.stringify(this.data);
20
+ var res = await data.from("invoke", { key: a.key, params: encode62.timeencode(params) }, function (a) {
21
+ return encode62.timedecode(a);
22
+ });
23
+ console.log(res);
24
+ if (id !== taskid) return;
25
+ this.output = res;
26
+ }
27
+ });
28
+ return page;
29
+ }
@@ -0,0 +1,10 @@
1
+ & {
2
+ position: absolute;
3
+ width: 800px;
4
+ }
5
+
6
+ >[body]>div {
7
+ display: inline-block;
8
+ width: 50%;
9
+ vertical-align: top;
10
+ }
@@ -1,6 +1,14 @@
1
1
  plist.bind(null, '任务管理', "task", refilm`
2
2
  *任务ID/key 100
3
3
  *任务名/name 100
4
- *启用/status swap [关闭,开启]
4
+ *是否启用/status radio [不启用,启用]
5
5
  任务代码/code text
6
+ 执行/ - ${[{
7
+ when(o) {
8
+ return o.status === 1;
9
+ },
10
+ name: "执行", do(o) {
11
+ popup("/task/invoke", o);
12
+ }
13
+ }]}
6
14
  `, '/task/edit');
@@ -507,7 +507,7 @@ var createModule = function (exec, originNames, compiledNames, prebuilds = {}) {
507
507
  result = res;
508
508
  created = true;
509
509
  _ok(res);
510
- }, prebuilds);
510
+ });
511
511
  if (created) return result;
512
512
  return promise;
513
513
  });
@@ -320,7 +320,7 @@ function parse(piece) {
320
320
  name = name.slice(0, commaindex);
321
321
  }
322
322
  }
323
- [name, key] = scanSlant(name, '/');
323
+ [name, key] = scanSlant(name, '/', 0, name.length + 1);
324
324
  if (key === undefined && !/^(title|label|headline)$/i.test(type)) key = name;
325
325
  }
326
326
  if (/^[a-z\d]+\/?\d+$/i.test(type)) {
@@ -0,0 +1,101 @@
1
+ function createSeek(express) {
2
+ var dist;
3
+ express.forEach(function (search) {
4
+ if (dist) {
5
+ if (/[\=]/.test(dist)) dist = `(${dist})`;
6
+ dist = `${dist}!==void 0&&${dist}!==null?${dist}${search}:''`
7
+ } else {
8
+ dist = search;
9
+ }
10
+ });
11
+ return dist;
12
+ }
13
+ function main(express) {
14
+ if (!/\?\s*\.(?=[^\d])/.test(express)) return express;
15
+ var reg = /\\[\s\S]|\?\s*(\.(?!\d))|[\:\,\+\=\-\!%\^\|\/\&\*\!\;\?\>\<~\{\}\[\]\(\)'"`\s]/g;
16
+ var cache = [], queue = [];
17
+ var exp = [];
18
+ var instr = false;
19
+ var lastIndex = 0;
20
+ var add_exp = function (s) {
21
+ if (!exp.length) exp.push(s);
22
+ else {
23
+ var e = exp[exp.length - 1];
24
+ if (!/[\.]\s*$/.test(e) && !/^\s*[\.'"`\[\(]/.test(s)) {
25
+ queue.push(createSeek(exp));
26
+ exp.splice(0, exp.length, '');
27
+ e = '';
28
+ }
29
+ if (/\.$/.test(e) && /^[\[\("'`]/.test(s)) {
30
+ e = e.replace(/\.$/, '');
31
+ }
32
+ e += s;
33
+ exp[exp.length - 1] = e;
34
+ }
35
+ };
36
+ var push_quote = function (m) {
37
+ add_exp(m);
38
+ cache.push(queue, exp);
39
+ queue = [];
40
+ exp = [];
41
+ };
42
+ var pop_quote = function (m) {
43
+ add_punc('');
44
+ exp = cache.pop();
45
+ var e = queue.join("") + m;
46
+ exp[exp.length - 1] += e;
47
+ queue = cache.pop();
48
+ };
49
+ var add_punc = function (m) {
50
+ if (exp.length) {
51
+ var temp = createSeek(exp);
52
+ queue.push(exp.length > 1 ? `(${temp})` : temp, m);
53
+ exp = [];
54
+ } else if (queue.length) {
55
+ queue[queue.length - 1] += m;
56
+ } else {
57
+ queue.push(m);
58
+ }
59
+ };
60
+
61
+ do {
62
+ var match = reg.exec(express);
63
+ if (!match) break;
64
+ var index = match.index;
65
+ var m = match[0];
66
+ var isstr = false;
67
+ if (/['"`\/]/.test(m)) {
68
+ if (instr === m) instr = false;
69
+ else if (!instr) instr = m;
70
+ }
71
+ if (instr) {
72
+ continue;
73
+ }
74
+ if (/['"`\/\s]/.test(m)) {
75
+ isstr = true;
76
+ index++;
77
+ }
78
+
79
+ var str = express.slice(lastIndex, index);
80
+ if (str) {
81
+ add_exp(str);
82
+ }
83
+ lastIndex = match.index + m.length;
84
+ if (match[1]) {
85
+ exp.push(match[1]);
86
+ }
87
+ else if (/[\[\{\(]/.test(m)) {
88
+ push_quote(m);
89
+ }
90
+ else if (/[\]\}\)]/.test(m)) {
91
+ pop_quote(m);
92
+ }
93
+ else if (!isstr) {
94
+ add_punc(m);
95
+ }
96
+ } while (true);
97
+ var s = express.slice(lastIndex);
98
+ if (s) add_exp(s);
99
+ add_punc('');
100
+ return queue.join("");
101
+ }
@@ -2,7 +2,7 @@
2
2
  <span v-text="origin?'修改':'添加'"></span><span -text="title"></span>
3
3
  </div>
4
4
  <div body>
5
- <field v-if="!f.readonly||!!data[f.key]" -repeat="f in fields" ng-src="[f,data]"></field>
5
+ <field v-if="!f.hidden" -repeat="f in fields" ng-src="[f,data]"></field>
6
6
  </div>
7
7
  <div foot>
8
8
  <btn @click="remove()" class="white">取消</btn>
@@ -1,5 +1,5 @@
1
1
  & {
2
- width: 180px;
2
+ width: 160px;
3
3
  height: 20px;
4
4
  display: inline-block;
5
5
  text-align: center;
@@ -2,7 +2,8 @@ function main(element = document.createElement("div")) {
2
2
  element.innerHTML = colorpicker;
3
3
  var saved_value;
4
4
  var selector = element.firstChild;
5
- select(selector, colorpad(), false, 'y');
5
+ var pad = colorpad();
6
+ select(selector, pad, false, 'y');
6
7
  render(element, {
7
8
  a: button,
8
9
  colorlabel,
@@ -25,6 +26,7 @@ function main(element = document.createElement("div")) {
25
26
  element.setValue = function (value) {
26
27
  element.value = value;
27
28
  cast(selector, value);
29
+ pad.setValue(value);
28
30
  };
29
31
  return element;
30
32
  }
@@ -0,0 +1,9 @@
1
+ var hasOwnProperty = {}.hasOwnProperty;
2
+ function getName(o) {
3
+ if (hasOwnProperty.call(o, 'toString')) return o.toString();
4
+ if ("name" in o) return o.name;
5
+ if ("label" in o) return o.label;
6
+ if ("value" in o) return o.value;
7
+ if (hasOwnProperty.call(o, 'valueOf')) return o.valueOf();
8
+ return o;
9
+ }
@@ -1,4 +1,11 @@
1
- function getValue() {
2
- if (isFunction(this.getValue)) return this.getValue();
3
- return this.value;
1
+ var hasOwnProperty = {}.hasOwnProperty;
2
+ function getValue(o = this) {
3
+ if (!o) return o;
4
+ if (isFunction(o.getValue)) return o.getValue();
5
+ if (hasOwnProperty.call(o, 'valueOf')) return o.valueOf();
6
+ if ("key" in o) return o.key;
7
+ if ("value" in o) return o.value;
8
+ if (hasOwnProperty.call(o, 'toString')) return o.toString();
9
+ if (!isEmpty(o.id)) return o.id;
10
+ return o;
4
11
  }
@@ -12,6 +12,7 @@ var rebuildOptions = function () {
12
12
  var new_options = seek(data, options_from);
13
13
  if (new_options !== options) {
14
14
  field.options = new_options;
15
+ delete field.optionsMap;
15
16
  render.refresh();
16
17
  }
17
18
  };
@@ -198,7 +199,22 @@ function main(elem) {
198
199
  elem.innerHTML = '<span ng-bind=get()></span>';
199
200
  render(elem, {
200
201
  get() {
201
- return seek(data, field.key);
202
+ var value = seek(data, field.key);
203
+ if (field.options) {
204
+ if (!field.optionsMap) {
205
+ var map = Object.create(null);
206
+ for (var o of field.options) {
207
+ var v = getValue(o);
208
+ map[v] = o;
209
+ }
210
+ field.optionsMap = map;
211
+ }
212
+ var map = field.optionsMap;
213
+ if (value in map) {
214
+ value = getName(map[value]);
215
+ }
216
+ }
217
+ return value;
202
218
  }
203
219
  });
204
220
  }
@@ -0,0 +1 @@
1
+ zimoli.prepare;
@@ -18,18 +18,18 @@ function main(elem = document.createElement("radio-group")) {
18
18
  options,
19
19
  select(a) {
20
20
  this.options.active = a;
21
- elem.value = a.key;
21
+ elem.value = getValue(a);
22
22
  dispatch(elem, 'change');
23
23
  }
24
24
  });
25
- if (elem.value) {
25
+ if (!isEmpty(elem.value)) {
26
26
  elem.setValue(elem.value);
27
27
  }
28
28
  });
29
29
  elem.setValue = function (key) {
30
30
  var { options } = this.$scope;
31
31
  if (!(options instanceof Array)) return;
32
- var index = options.map(a => a.key).indexOf(key);
32
+ var index = options.map(a => getValue(a)).indexOf(key);
33
33
  options.active = options[index];
34
34
  };
35
35
  return elem;
@@ -56,20 +56,7 @@ var createGetter = function (search, isprop = true) {
56
56
  var [withContext, searchContext] = search;
57
57
  if (!searchContext) return function () { };
58
58
  var ret = /\;/.test(searchContext) ? "" : "return ";
59
- if (/\?\s*\.(?=[^\d])/.test(searchContext)) {
60
- searchContext = searchContext.replace(variableReg, function (context) {
61
- var dist;
62
- context.split(/\?\s*\.(?=[^\d])/).forEach(function (search) {
63
- if (dist) {
64
- if (/[\=]/.test(dist)) dist = `(${dist})`;
65
- dist = `${dist}!==void 0&&${dist}!==null?${dist}.${search}:''`
66
- } else {
67
- dist = search;
68
- }
69
- });
70
- return dist.length > 1 ? `(${dist})` : context;
71
- });
72
- }
59
+ searchContext = renderExpress(searchContext);
73
60
  if (isprop) {
74
61
  return new Function('event', `${withContext}with(this.$scope){${ret}${searchContext}}`);
75
62
  }
@@ -94,7 +81,7 @@ var parseRepeat = function (expression) {
94
81
  var res = reg.exec(expression);
95
82
  if (!res) return res;
96
83
  var [_, i, k, r, s, t] = res;
97
- var keyName, itemName, indexName, trackBy = t, srcName = s;
84
+ var keyName, itemName, indexName, trackBy = t, srcName = renderExpress(s);
98
85
  switch (r) {
99
86
  case "in":
100
87
  if (i) itemName = i;
@@ -289,6 +276,7 @@ var parseIfWithRepeat = function (ifExpression, repeatExpression) {
289
276
  if (reg.lastIndex < savedIndex) break;
290
277
  run();
291
278
  }
279
+ if (savedIndex < ifExpression.length) rest.push(ifExpression.slice(savedIndex))
292
280
  var beforeRepeat = [], afterRepeat = [];
293
281
  rest.forEach(function (result) {
294
282
  var match = false;
@@ -9,7 +9,7 @@
9
9
  <tr>
10
10
  <td -repeat="f in fields">
11
11
  <model -if="f.key" :field=f :data=d readonly ></model>
12
- <a on-click="o.do(d)" -if="!f.key&&f.options" _type="o.type instanceof Function?o.type(d):o.type"
12
+ <a on-click="o.do(d)" -if="!f.key&&f.options&&(!o.when||o.when(d))" _type="o.type instanceof Function?o.type(d):o.type"
13
13
  -repeat="o in f.options">
14
14
  <span -text="o.name instanceof Function?o.name(d):o.name"></span>
15
15
  </a>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.8.7",
3
+ "version": "3.9.0",
4
4
  "description": "一个开发工具,开放源代码,自带组件库和编译环境,可以用来开发web组件,web应用或nodejs模块,或做为已有代码的加密工具,也可以做为静态页面服务器或跨域中转服务器使用",
5
5
  "main": "public/efront.js",
6
6
  "directories": {