efront 3.5.13 → 3.6.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.
@@ -1,6 +1,6 @@
1
- ./aapi/ authorization:
2
- login: options /::login-:a
3
- run: options /:::run
4
- share: options /::share-:opt?:path
5
- folder: options /::file-:opt:::path?:to
6
- cluster: options /::cluster-:opt?:id
1
+ / authorization:
2
+ login: options ::login-:a
3
+ run: options :::run
4
+ share: options ::share-:opt?:path
5
+ folder: options ::file-:opt:::path?:to
6
+ cluster: options ::cluster-:opt?:id
@@ -1,7 +1,10 @@
1
+ var hosts = data.getItem("hosts");
2
+ if (!hosts.length) hosts.push({ key: location.host, name: location.host });
1
3
  var fields = refilm`
4
+ 服务器地址/host* select?a ${hosts}
2
5
  密码/password* password
3
6
  `;
4
-
7
+ console.log(fields)
5
8
  function main() {
6
9
  var page = view();
7
10
  page.innerHTML = login;
@@ -9,20 +12,33 @@ function main() {
9
12
  on("append")(page, function () {
10
13
  move.bindPosition(page, [.5, .5]);
11
14
  });
12
- renderWithDefaults(page, { fields, data: {}, pending: false });
15
+ renderWithDefaults(page, {
16
+ fields, data: {
17
+ host: location.host,
18
+ }, pending: false
19
+ });
13
20
  on("submit")(page, async function () {
21
+ data.setInstance("hosts", hosts, true);
14
22
  var { password } = submit(fields, this.$scope.data);
15
23
  this.$scope.pending = true;
16
24
  page.disabled = true;
17
25
  try {
18
- var info = await data.from("login", {
26
+ var login = await data.getApi("login");
27
+ login.base = location.protocol + "//" + parseURL(this.$scope.data.host).host + "/";
28
+ cross.addDirect(login.base);
29
+ var info = await data.from(login, {
19
30
  a: encode62.timeencode(encode62.geta(password))
20
31
  }).loading_promise;
32
+ var apimap = await data.getConfig();
33
+ for (var k in apimap) {
34
+ apimap[k].base = login.base;
35
+ }
21
36
  info = encode62.timeupdate(info);
22
37
  data.setSource({ authorization: info });
23
38
  user.login({})
24
39
  go('/main')
25
- } catch {
40
+ } catch (e) {
41
+ console.log(e);
26
42
  }
27
43
  this.$scope.pending = false;
28
44
  })
@@ -809,7 +809,7 @@ modules.modules = modules;
809
809
  var requires_count = 3;
810
810
  var hook = function (requires_count) {
811
811
  if (requires_count !== 0) return;
812
- "alert confirm innerWidth innerHeight close".split(/\s+/).map(removeGlobalProperty);
812
+ "alert confirm innerWidth innerHeight close prompt".split(/\s+/).map(removeGlobalProperty);
813
813
  initPixelDecoder();
814
814
  modules.Promise = Promise;
815
815
  modules.hook_time = +new Date;
@@ -268,7 +268,7 @@ function parse(piece) {
268
268
  delete_onempty, delete_onsubmit,
269
269
  } = name;
270
270
  } else {
271
- var test = (reg,a) => {
271
+ var test = (reg, a) => {
272
272
  if (reg.test(a)) {
273
273
  return true;
274
274
  }
@@ -388,7 +388,7 @@ function parse(piece) {
388
388
  options = is(options);
389
389
  var needUnfold = /^\[|\]$/.test(options);
390
390
  options = options.replace(/^\[|\]$/g, '');
391
- if (/,/.test(options)) options = scanSlant(options, ',');
391
+ if (needUnfold || /,/.test(options)) options = scanSlant(options, ',');
392
392
  else options = scanSlant(options, "");
393
393
  if (needUnfold) unfoldOptions(size, options);
394
394
  }
@@ -333,25 +333,23 @@ function fixApi(api, href) {
333
333
  }
334
334
  api.base = href;
335
335
  api.path = api.url;
336
- if (/^\.([\?\#][\s\S]*)?$/.test(api.url)) {
337
- api.url = href + api.url.replace(/^\./, "");
338
- } else {
339
- api.url = href + api.url;
336
+ if (/^\.([\?\#][\s\S]*)?$/.test(api.path)) {
337
+ api.path = api.path.replace(/^\./, "");
340
338
  }
341
339
  if (extraSearch || extraHash) {
342
340
  if (/[\?#]/.test(api.url)) {
343
341
  var [, search, hash] = paramReg.exec(api.url);
344
342
  }
345
- var url = api.url.replace(paramReg, '');
343
+ var path = api.path.replace(paramReg, '');
346
344
  if (extraSearch) {
347
345
  search = search ? extraSearch + '&' + search : extraSearch;
348
346
  }
349
347
  if (extraHash) {
350
348
  hash = hash ? extraHash + '&' + hash : extraHash;
351
349
  }
352
- if (search) url += '?' + search;
353
- if (hash) url += "#" + hash;
354
- api.url = url;
350
+ if (search) path += '?' + search;
351
+ if (hash) path += "#" + hash;
352
+ api.path = path;
355
353
  }
356
354
  }
357
355
  }
@@ -434,6 +432,9 @@ var privates = {
434
432
  },
435
433
  fromApi(api, params) {
436
434
  let url = api.url;
435
+ var base = api.base;
436
+ if (base) url = base + api.path;
437
+ console.log(url, base);
437
438
 
438
439
  if (this.validApi(api, params)) {
439
440
  params = this.repare(api, params);
@@ -657,6 +658,9 @@ var data = {
657
658
  data = this.parseConfig(data);
658
659
  configPormise = Promise.resolve(data);
659
660
  },
661
+ getConfig() {
662
+ return privates.getConfigPromise();
663
+ },
660
664
  parseConfig(o) {
661
665
  if (o instanceof Promise) {
662
666
  return o.then(createApiMap);
@@ -9,15 +9,22 @@ var dispatch = "dispatchEvent" in document ? function dispatchEvent(target, even
9
9
  }
10
10
  };
11
11
  function main() {
12
- var target, event;
12
+ var target, event, value;
13
13
  for (var cx = 0, dx = arguments.length; cx < dx; cx++) {
14
14
  var arg = arguments[cx];
15
- if (isString(arg)) {
16
- event = createEvent(arg);
17
- } else if (isNode(arg) || arg === window || arg === document) {
15
+ if (isNode(arg) || arg === window || arg === document) {
18
16
  target = arg;
19
- } else {
20
- event = arg;
17
+ }
18
+ else if (!event) {
19
+ if (isString(arg)) {
20
+ event = createEvent(arg);
21
+ }
22
+ else {
23
+ event = arg;
24
+ }
25
+ }
26
+ else {
27
+ event.value = arg;
21
28
  }
22
29
  }
23
30
  if (dispatch(target || window, event)) {
@@ -66,12 +66,6 @@ function input(element) {
66
66
  on("keydown")(element, number);
67
67
  break;
68
68
  }
69
- if (format) {
70
- var picker = selectDate(format, input.value);
71
- on("change")(element, picker.update);
72
- select(element, picker);
73
- element.readonly = "readonly";
74
- }
75
69
  }
76
70
  return element;
77
71
  }
@@ -30,13 +30,13 @@
30
30
  display: none;
31
31
  }
32
32
 
33
- &::-webkit-calendar-picker-indicator {
34
- display: none;
35
- }
33
+ // &::-webkit-calendar-picker-indicator {
34
+ // display: none;
35
+ // }
36
36
 
37
- &::-webkit-calendar-picker-indicator:hover {
38
- display: none;
39
- }
37
+ // &::-webkit-calendar-picker-indicator:hover {
38
+ // display: none;
39
+ // }
40
40
 
41
41
  &::-webkit-clear-button {
42
42
  display: none;
@@ -72,9 +72,26 @@ var constructors = {
72
72
  cast(elem, field);
73
73
  return elem;
74
74
  },
75
- select() {
76
- var elem = select();
77
- elem.innerHTML = `<option ng-repeat="(o,i) in field.options" ng-bind="o.name||o" _value="o.key!==undefined?o.key:o"></option>`;
75
+ select(_, t) {
76
+ if (!t) {
77
+ var elem = select();
78
+ elem.innerHTML = `<option ng-repeat="(o,i) in field.options" ng-bind="o.name||o" _value="o.key!==undefined?o.key:o"></option>`;
79
+ }
80
+ else if (t === 'a') {
81
+ var { field, data } = _;
82
+ var pad = selectList(field.options, field.multi, true);
83
+ var e = document.createElement('select');
84
+ var opt = null;
85
+ for (var o of field.options) {
86
+ if (o.key === data[field.key]) {
87
+ opt = o;
88
+ break;
89
+ }
90
+ }
91
+ e.innerHTML = `<option selected value="${opt ? opt.key : ''}">${opt ? opt.name : '请选择'}</option>`;
92
+ e.value = opt ? opt.key : '';
93
+ elem = select(e, pad);
94
+ }
78
95
  return elem;
79
96
  },
80
97
  "repeat"(_, field_type) {
@@ -4,8 +4,10 @@
4
4
  onkeydown(document, function (e) {
5
5
  if (e.which === 27 && rootElements.length) {
6
6
  var r = rootElements.pop();
7
- r.blur();
8
- remove(r);
7
+ if (r) {
8
+ r.blur();
9
+ remove(r);
10
+ }
9
11
  }
10
12
  });
11
13
  var animationStyle = "opacity:0;transform:scale(1.2);transition:.1s opacity ease-out,.2s transform ease-out;";
@@ -162,24 +164,27 @@ var popup_with_mask = function (element, mask = createMask(element)) {
162
164
  return element;
163
165
  };
164
166
  var isypop = function (target) {
167
+ if (!target) return false;
165
168
  var { offsetParent, nextSibling, previousSibling } = target;
166
169
  if (
167
- nextSibling
170
+ nextSibling && nextSibling.tagName === target.tagName
168
171
  && (
169
172
  nextSibling.offsetLeft - target.offsetLeft >= target.offsetWidth / 2
170
173
  || target.offsetLeft - nextSibling.offsetLeft >= nextSibling.offsetWidth / 2
171
174
  )
172
- || previousSibling
175
+ || previousSibling && previousSibling.tagName === target.tagName
173
176
  && (
174
177
  previousSibling.offsetLeft - target.offsetLeft >= target.offsetWidth / 2
175
178
  || target.offsetLeft - previousSibling.offsetLeft >= previousSibling.offsetWidth / 2
176
179
  )
177
180
  ) return true;
178
- if (offsetParent && target.offsetTop / target.offsetHeight < .2 && offsetParent.offsetWidth / target.offsetWidth > 1.5) return true;
181
+ var padding = parseFloat(getComputedStyle(offsetParent).paddingTop) + parseFloat(getComputedStyle(offsetParent).paddingBottom);
182
+ if (offsetParent && target.offsetTop / target.offsetHeight < .2 && (offsetParent.clientWidth - padding) / target.offsetWidth > 1.5) return true;
179
183
 
180
184
  };
181
185
  var isxpop = arriswise(isypop, arguments);
182
186
  var popup_as_extra = function (element, target, style) {
187
+ element.target = target;
183
188
  if (style) {
184
189
  if (/^[vy]/i.test(style)) {
185
190
  popup_as_yextra(element, target, style);
@@ -195,9 +200,9 @@ var popup_as_extra = function (element, target, style) {
195
200
  popup_as_yextra(element, target, style);
196
201
  } else if (isxpop(target)) {
197
202
  popup_as_xextra(element, target, style);
198
- } else if (isypop(target.parentNode)) {
203
+ } else if (isypop(target.offsetParent)) {
199
204
  popup_as_yextra(element, target, style);
200
- } else if (isxpop(target.parentNode)) {
205
+ } else if (isxpop(target.offsetParent)) {
201
206
  popup_as_xextra(element, target, style);
202
207
  } else {
203
208
  if (/inline|cell/i.test(getComputedStyle(target).display)) {
@@ -266,10 +271,10 @@ var _as_yextra = function (global, innerWidth, innerHeight, element, target, poi
266
271
  }
267
272
 
268
273
  css(element, `min-width:auto;`);
269
- var aimedWidth = element.offsetWidth;
274
+ var aimedWidth = getScreenPosition(element).width;
270
275
  //如果宽度不足其附着元素的宽度
271
- if (aimedWidth < target.offsetWidth) {
272
- aimedWidth = target.offsetWidth;
276
+ if (aimedWidth < position.width) {
277
+ aimedWidth = position.width;
273
278
  }
274
279
 
275
280
  //如果宽度超出可视区,调整宽度
@@ -0,0 +1,40 @@
1
+ function prompt(msg = "请输入", check) {
2
+ var ipt = input();
3
+ var oked, ohed;
4
+ var oks = [], ohs = [];
5
+ var fire = function () {
6
+ if (!oked && !ohed) return;
7
+ if (oked) oks.forEach(o => o(ipt.value));
8
+ if (ohed) ohs.forEach(o => o(ipt.value));
9
+ oks.splice(0, oks.length);
10
+ ohs.splice(0, ohs.length);
11
+ };
12
+ var c = confirm(msg, ipt, ["确认", "取消"], function (_) {
13
+ if (oked || ohed) return;
14
+ if (_ === "确认") {
15
+ if (check && check(ipt.value) === false) return false;
16
+ oked = true;
17
+ } else {
18
+ ohed = true;
19
+ }
20
+ fire();
21
+ });
22
+ on('append')(ipt, function () {
23
+ setTimeout(function () {
24
+ ipt.focus();
25
+ });
26
+ })
27
+ on("mousedown")(c, e => e.target !== ipt && e.preventDefault() | ipt.focus());
28
+ on("keydown.enter")(c, function () {
29
+ if (check && check(ipt.value) === false) return;
30
+ oked = true;
31
+ remove(c);
32
+ fire();
33
+ });
34
+ c.then = function (ok, oh) {
35
+ oks.push(ok);
36
+ ohs.push(oh);
37
+ fire();
38
+ };
39
+ return c;
40
+ }
@@ -25,6 +25,7 @@ rootElements.pop = function (elem) {
25
25
  if (cx < 0) {
26
26
  cx = rootElements.length - 1;
27
27
  }
28
+ if (isFunction(rootElements[cx].onback) && rootElements[cx].onback() === false) return;
28
29
  return rootElements.splice(cx, 1)[0];
29
30
  };
30
31
  rootElements.mount = function (elem) {
@@ -0,0 +1,15 @@
1
+ function search(seartext, options) {
2
+ if (options instanceof Array) {
3
+ var hasFullmatch = false;
4
+ var a = options.map(o => {
5
+ if (o.name === seartext) hasFullmatch = true;
6
+ var [power, m] = mark.power(o.name, seartext);
7
+ return { power, name: m, value: o.value };
8
+ }).filter(a => a.power > 0);
9
+ a.sort(function (a, b) {
10
+ return b.power - a.power;
11
+ });
12
+ a.hasFullmatch = hasFullmatch;
13
+ return a;
14
+ }
15
+ }
@@ -2,21 +2,22 @@ var saved_list;
2
2
  var _remove = function () {
3
3
  var removing_list = saved_list;
4
4
  if (removing_list) {
5
- var target = this;
6
- setTimeout(function () {
5
+ setTimeout(function run() {
7
6
  if (removing_list !== saved_list) return remove(removing_list);
8
7
  var { activeElement } = document;
9
- if (!getTargetIn(removing_list, activeElement)) {
8
+ a: if (!getTargetIn(removing_list, activeElement)) {
9
+ var extras = [].concat(removing_list.with);
10
+ for (var e of extras) {
11
+ if (getTargetIn(e, activeElement)) break a;
12
+ }
10
13
  remove(removing_list);
11
14
  if (removing_list === saved_list) saved_list = null;
12
- } else {
13
- once('blur')(activeElement, function () {
14
- setTimeout(function () {
15
- if (document.activeElement === target) return;
16
- _remove();
17
- });
18
- });
15
+ return;
19
16
  }
17
+ once('blur')(activeElement, function () {
18
+ if (!isMounted(this)) return removing_list.target.focus();
19
+ run();
20
+ });
20
21
  });
21
22
  }
22
23
  };
@@ -48,10 +49,23 @@ function select(target, list, removeOnSelect, direction) {
48
49
  onblur(target, removeByBlur);
49
50
  if (/select/i.test(target.tagName)) {
50
51
  onmousedown(target, preventDefault);
52
+ care(target, 'add-option', function (a) {
53
+ var o = document.createElement('option');
54
+ o.value = a.value || a;
55
+ o.innerHTML = a.name || a;
56
+ this.appendChild(o);
57
+ });
58
+ care(target, 'set-options', function (options) {
59
+ this.innerHTML = options.map(o => `<option value="${o.value}">${o.name}</option>`).join("");
60
+ });
61
+ on('focus')(target, preventDefault);
51
62
  }
52
63
  var onlistchange = function () {
53
64
  if (target.multiple) {
54
65
  } else {
66
+ if (!savedOptions) {
67
+ target.innerHTML = `<option selected value="${this.value}">${this.name || this.value}</option>`
68
+ }
55
69
  target.value = this.value;
56
70
  dispatch(target, "change");
57
71
  }
@@ -114,9 +128,9 @@ function select(target, list, removeOnSelect, direction) {
114
128
  var allOptions = [].concat.apply([], target.querySelectorAll("option"));
115
129
  if (deepEqual.shallow(allOptions, savedOptions)) return;
116
130
  savedOptions = allOptions;
117
- list = selectList(allOptions, target.multiple);
131
+ list = selectList(allOptions, target.multiple, target.editable);
118
132
  if (!target.multiple) {
119
- onclick(list, _remove);
133
+ onclick(list, onlistclick);
120
134
  }
121
135
  bindEvent();
122
136
  };
@@ -0,0 +1,21 @@
1
+ & {
2
+ position: absolute;
3
+ user-select: none;
4
+ }
5
+
6
+ [body]>div {
7
+ padding: 6px 10px;
8
+ background: #fff;
9
+
10
+ >* {
11
+ line-height: 28px;
12
+ vertical-align: top;
13
+ margin-right: 20px;
14
+ }
15
+
16
+ &.item {
17
+ &:nth-of-type(n+2) {
18
+ border-top: 1px solid #0003;
19
+ }
20
+ }
21
+ }
@@ -6,6 +6,7 @@ var singleClick = function () {
6
6
  node.activeNode = this;
7
7
  if (node.value === this.value) return;
8
8
  node.value = this.value;
9
+ node.name = this.name;
9
10
  dispatch(node, "change");
10
11
  };
11
12
  var multipleClick = function () {
@@ -21,21 +22,27 @@ var multipleClick = function () {
21
22
  }
22
23
  dispatch(node, "change");
23
24
  };
24
- function main(children, multiple) {
25
+
26
+ function main(children, multiple, addable) {
25
27
  var list = div();
26
28
  list.value = multiple ? [] : "";
27
29
  var firstValue = false;
28
30
  var clicker = multiple ? multipleClick : singleClick;
29
- var hasIcon = false, iconed = '';
30
- appendChild(list, [].map.call(children, function (option) {
31
- var item = div();
32
- item.innerHTML = option.innerHTML;
33
- var icon = option.getAttribute("icon");
31
+ var itemMap = Object.create(null);
32
+ function createItem(option) {
33
+ var key = option.key || option.value;
34
+ if (key in itemMap) return itemMap[key];
35
+ var item = itemMap[option.value] = document.createElement('div');
36
+
37
+ item.setAttribute("item", '');
38
+ item.innerHTML = option.innerHTML || option.name;
39
+ item.name = option.name || option.innerHTML;
40
+ var icon = option.getAttribute ? option.getAttribute("icon") : option.icon;
34
41
  if (icon) {
35
42
  hasIcon = true;
36
43
  css(item, { backgroundImage: `url('${icon}')` });
37
44
  }
38
- item.value = option.value;
45
+ item.value = key;
39
46
  if (option.selected) {
40
47
  iconed = icon;
41
48
  if (multiple) {
@@ -54,10 +61,63 @@ function main(children, multiple) {
54
61
  onclick(item, clicker);
55
62
  }
56
63
  return item;
57
- }));
64
+
65
+ }
66
+ var hasIcon = false, iconed = '';
67
+ appendChild(list, [].map.call(children, createItem));
68
+ if (addable) {
69
+ var adder = document.createElement("div");;
70
+ adder.innerHTML = "<a>添加</a><a>管理</a>";
71
+ button(adder.firstChild);
72
+ button(adder.children[1]);
73
+ on("click")(adder, async function (event) {
74
+ event.preventDefault();
75
+ var target = getTargetIn(this, event.target, false);
76
+ switch (target) {
77
+ case this.children[0]:
78
+ var a = prompt("请输入", a => {
79
+ if (a in itemMap) {
80
+ alert(`选项 ${a} 已存在!`);
81
+ return false;
82
+ }
83
+ });
84
+ list.with = a;
85
+ on('remove')(a, function () {
86
+ list.with = null;
87
+ });
88
+ a = await a;
89
+ if (a in itemMap) return false;
90
+ cast(list.target, "add-option", a);
91
+ children.push({ name: a, key: a });
92
+ list.insertBefore(createItem({
93
+ name: a,
94
+ value: a,
95
+ }), adder);
96
+ break;
97
+ case this.children[1]:
98
+ var options = [].slice.call(list.children, 0, list.children.length - 1);
99
+ var edit = selectListEdit(options.slice(0));
100
+
101
+ list.with = edit;
102
+ on("remove")(edit, function () {
103
+ list.with = null;
104
+ remove([].slice.call(list.children, 0, list.children.length - 1));
105
+ children.splice(0, children.length);
106
+ children.push.apply(children, edit.$scope.options.map(o => ({ key: o.key || o.value, name: o.name || o.innerHTML })))
107
+ appendChild.before(adder, edit.$scope.options.map(createItem));
108
+ cast(list.target, 'set-options', edit.$scope.options);
109
+ });
110
+ popup(edit, [.5, .5]);
111
+ break;
112
+ }
113
+ })
114
+ adder.setAttribute("adder", '');
115
+ list.appendChild(adder)
116
+ }
58
117
  if (hasIcon) {
59
118
  list.setAttribute('iconed', '');
60
119
  }
61
120
  list.icon = iconed;
121
+ on('mousedown')(list, e => e.preventDefault());
62
122
  return list;
63
123
  }
@@ -2,9 +2,11 @@
2
2
  max-width: 100%;
3
3
  background-color: #fff;
4
4
  line-height: 30px;
5
- box-shadow: 0 0 20px -6px rgba(0, 0, 0, .3);
5
+ box-shadow: 0 0 20px -6px rgba(0, 0, 0, .1);
6
+ box-sizing: border-box;
7
+ border: 1px solid #0003;
6
8
 
7
- >div {
9
+ >[item] {
8
10
  cursor: default;
9
11
  padding: 0 16px;
10
12
 
@@ -49,4 +51,15 @@
49
51
  background-position-y: 50%;
50
52
  background-position-x: 8px;
51
53
  }
54
+ }
55
+
56
+ >[adder] {
57
+ padding: 0 16px;
58
+ text-align: right;
59
+
60
+ a {
61
+ cursor: pointer;
62
+ vertical-align: top;
63
+ margin-left: 10px;
64
+ }
52
65
  }
@@ -0,0 +1,15 @@
1
+ <div head>管理选项</div>
2
+ <div body>
3
+ <div>
4
+ <input placeholder="搜索或添加" v-model="search" @keydown.enter="add()" /><a @click="add()"
5
+ -if="search&&!filtered.hasFullmatch">添加</a>
6
+ </div>
7
+ <div class="item" -repeat="o in (search?filtered:options)">
8
+ <span -html=o.name></span>
9
+ <a type="danger" @click="del(o)">删除</a>
10
+ </div>
11
+ </div>
12
+ <div foot>
13
+ <btn @click="save()">确定</btn>
14
+ <btn type="white" @click="remove()">取消</btn>
15
+ </div>