efront 3.9.14 → 3.9.15

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.
@@ -4,17 +4,17 @@ var fields = refilm`
4
4
  服务器地址/host* select?a ${hosts}
5
5
  密码/password* password
6
6
  `;
7
- function main() {
7
+ function main(host) {
8
8
  var page = view();
9
9
  page.innerHTML = login;
10
10
  drag.on(page);
11
+ fields[0].readonly = !!host;
11
12
  on("append")(page, function () {
12
13
  move.bindPosition(page, [.5, .5]);
13
14
  });
14
15
  renderWithDefaults(page, {
15
16
  fields, data: {
16
- host: data.getInstance("base").host || location.host,
17
-
17
+ host: host ? parseURL(host).host : data.getInstance("base").host || location.host,
18
18
  }, pending: false
19
19
  });
20
20
  on("submit")(page, async function () {
@@ -24,14 +24,21 @@ function main() {
24
24
  page.disabled = true;
25
25
  try {
26
26
  var base = location.protocol + "//" + parseURL(this.$scope.data.host).host + "/";
27
- data.setInstance("base", { base, host: parseURL(base).host });
28
- var info = await data.from("login", {
27
+ if (!host) data.setInstance("base", { base, host: parseURL(base).host });
28
+ var api = Object.assign({}, await data.getApi("login"));
29
+ api.base = base;
30
+ var info = await data.from(api, {
29
31
  a: encode62.timeencode(encode62.geta(password))
30
32
  }).loading_promise;
31
33
  info = encode62.timeupdate(info);
32
34
  data.setSource(base, info);
33
- user.login({})
34
- go('/main')
35
+ if (host) {
36
+ cast(page, 'login', info);
37
+ remove(page);
38
+ } else {
39
+ user.login({});
40
+ go('/main');
41
+ }
35
42
  } catch (e) {
36
43
  console.log(e);
37
44
  }
@@ -4,6 +4,9 @@
4
4
 
5
5
  [foot],
6
6
  [head] {
7
+ &::before{
8
+ display: none;
9
+ }
7
10
  text-align: center;
8
11
  }
9
12
  .button{
@@ -1,10 +1,26 @@
1
1
  data.loadConfig("api.yml");
2
2
  user.loginPath = '/auth/login';
3
+ cross.addReform(async function ({ status, url, headers }, reform, reject) {
4
+ if (status === 401) {
5
+ var base = data.getInstance("base").base;
6
+ var { protocol, host } = parseURL(url);
7
+ var base1 = protocol + "//" + host + "/";
8
+ if (base !== base1) {
9
+ data.setSource(base1, null);
10
+ var page = await popup("/auth/login", base1);
11
+ care(page, "login", function (info) {
12
+ data.setSource(base1, info);
13
+ headers.authorization = info;
14
+ reform();
15
+ });
16
+ on("remove")(page, reject);
17
+ return false;
18
+ }
19
+ location.reload();
20
+ }
21
+ })
3
22
  data.setReporter(function (m, t) {
4
23
  alert(m, t);
5
- var base = data.getInstance("base").base;
6
- data.setSource(base, '');
7
- if (m.status === 401) location.reload();
8
24
  });
9
25
  data.bindInstance("base", async function (base) {
10
26
  if (!base.base) return;
@@ -2,6 +2,7 @@ function main(a) {
2
2
  var page = view();
3
3
  page.innerHTML = template;
4
4
  drag.on(page.firstChild, page);
5
+ resize.on(page);
5
6
  var fields = data.from("params", { key: a.key }, function (a) {
6
7
  return a ? JSON.parse(encode62.timedecode(a)) : [];
7
8
  });
@@ -3,12 +3,21 @@ plist.bind(null, '任务管理', "task", refilm`
3
3
  *任务名/name 100
4
4
  *是否启用/status radio [不启用,启用]
5
5
  任务代码/code text
6
- 执行/ - ${[{
6
+ / - ${[
7
+ {
7
8
  when(o) {
8
9
  return o.status === 1;
9
10
  },
10
11
  name: "执行", do(o) {
11
12
  popup("/task/invoke", o);
12
13
  }
13
- }]}
14
- `, '/task/edit');
14
+ },
15
+ {
16
+ when(o) {
17
+ return o.status === 1;
18
+ },
19
+ name: "同步", do(o) {
20
+ popup("/task/rsync", o);
21
+ }
22
+ },
23
+ ]}`, '/task/edit');
@@ -0,0 +1,16 @@
1
+ <div head>
2
+ 同步任务&nbsp;-&nbsp; <span -text=task.name></span>(<span -text=task.key></span>)
3
+ <close @click="remove()"></close>
4
+ </div>
5
+ <div body>
6
+ <padding ng-repeat="h in hosts">
7
+ <a @click="checked[h.key]=!checked[h.key]" disabled:="h.key===base.host" :class="{finished:finished[h.key]}">
8
+ <checker -model="checked[h.key]"></checker>
9
+ <span -text="h.name"></span>
10
+ <span v-if="h.key===base.host">(当前)</span>
11
+ </a>
12
+ </padding>
13
+ </div>
14
+ <div foot>
15
+ <btn @click="flush()">同步</btn>
16
+ </div>
@@ -0,0 +1,39 @@
1
+ function main(task) {
2
+ var page = view();
3
+ page.innerHTML = template;
4
+ drag.on(page.firstChild, page);
5
+ resize.on(page);
6
+ renderWithDefaults(page, {
7
+ task,
8
+ checkbox(e) {
9
+ e = checkbox(e);
10
+ cast(e, { options: this.hosts })
11
+ },
12
+ base: data.getInstance("base"),
13
+ hosts: data.getInstance("hosts"),
14
+ finished: {},
15
+ checked: {},
16
+ async flush() {
17
+ var api = await data.getApi("edit");
18
+ api = Object.assign({}, api);
19
+ var finished = this.finished = {};
20
+ var checked = this.checked;
21
+ for (var h of this.hosts) {
22
+ if (!checked[h.key]) continue;
23
+ api.base = location.protocol + "//" + h.key + "/";
24
+ cross.addDirect(api.base);
25
+ await data.from(api, {
26
+ type: "task",
27
+ key: encode62.timeencode(task.key),
28
+ value: encode62.timeencode(JSON.stringify(task))
29
+ });
30
+ finished[h.key] = true;
31
+ }
32
+ alert('同步完成!');
33
+ },
34
+ remove() {
35
+ remove(page);
36
+ },
37
+ });
38
+ return page;
39
+ }
@@ -0,0 +1,10 @@
1
+ a{
2
+ cursor: pointer;
3
+ vertical-align: top;
4
+ >*{
5
+ vertical-align: middle;
6
+ }
7
+ &.finished{
8
+ color:#293;
9
+ }
10
+ }
@@ -22,6 +22,11 @@ function main(title, { submit }, { data: origin, fields, }) {
22
22
  dispatch(this, 'submited');
23
23
  remove(this);
24
24
  });
25
+ bind('keydown.ctrl.s')(page, async function (e) {
26
+ e.preventDefault();
27
+ await submit(item, fields);
28
+ dispatch(this, 'submited');
29
+ });
25
30
  on("append")(page, lazy(function () {
26
31
  page.querySelector("input").focus();
27
32
  }));
@@ -5,7 +5,6 @@ function main(title, { fields, options: options0, load, remove }, edit_ref) {
5
5
  zimoli.prepare(edit_ref, function () {
6
6
  var p = popup(edit_ref, { fields, data: o })
7
7
  on("submited")(p, function () {
8
- console.log("submited")
9
8
  page.$scope.load();
10
9
  })
11
10
  })
@@ -0,0 +1,14 @@
1
+ function bind(eventName, bindTo = window) {
2
+ return function (target, eventListener) {
3
+ var off;
4
+ var off1 = on("append")(target, function () {
5
+ if (off) off();
6
+ off = on(eventName).call(bindTo, target, eventListener);
7
+ });
8
+ var off2 = on("remove")(target, function () {
9
+ if (off) off();
10
+ off = null;
11
+ });
12
+ return function () { off1(); off2(); };
13
+ }
14
+ }
@@ -183,6 +183,7 @@ a&,
183
183
  color: @default-color;
184
184
  cursor: pointer;
185
185
  outline: none;
186
+ .clear();
186
187
 
187
188
  .clear() {
188
189
  text-shadow: none;
@@ -223,8 +223,7 @@ function cross(method, url, headers) {
223
223
  onerrors.push(oh);
224
224
  flush();
225
225
  };
226
- var sendtimer = setTimeout(function () {
227
- digest();
226
+ var fire = function () {
228
227
  var isform = /^f/i.test(method);
229
228
  if (isform) {
230
229
  if (method === 'form') method = 'post';
@@ -254,7 +253,9 @@ function cross(method, url, headers) {
254
253
  }
255
254
  Object.keys(realHeaders).forEach(key => setRequestHeader.call(xhr, key, realHeaders[key]));
256
255
  send.call(xhr, datas);
257
- }, 0);
256
+ digest();
257
+ };
258
+ var sendtimer = setTimeout(fire, 0);
258
259
  }
259
260
  var loaded, errored;
260
261
  var onload = function (xhr) {
@@ -266,12 +267,19 @@ function cross(method, url, headers) {
266
267
  flush();
267
268
  digest();
268
269
  };
269
- var onerror = function (xhr) {
270
- removeFromList(requests, xhr);
271
- errored = xhr;
270
+ var onerror1 = function (e) {
271
+ removeFromList(requests, e);
272
+ errored = e || "未知错误!";
272
273
  flush();
273
274
  digest();
274
275
  };
276
+ var onerror = async function (e) {
277
+ for (var r of reforms) {
278
+ var r = await reform(r, { method, url, status: xhr.status, headers: _headers }, fire, onerror1, e);
279
+ if (r === false) return;
280
+ }
281
+ onerror1(e);
282
+ };
275
283
  var flush = function () {
276
284
  var then = xhr.then;
277
285
  delete xhr.then;
@@ -329,6 +337,7 @@ function cross(method, url, headers) {
329
337
  return xhr;
330
338
  }
331
339
  function addDirect(a) {
340
+ if (cors_hosts.indexOf(a) >= 0) return;
332
341
  if (typeof a === 'string' || a instanceof RegExp) cors_hosts.push(a);
333
342
  }
334
343
  function notCross(domain) {
@@ -346,6 +355,22 @@ function notCross(domain) {
346
355
  }
347
356
 
348
357
  var requests = [];
358
+ var reforms = [];
359
+ function reform(r, info, fire, cancel, e) {
360
+ var fired = false;
361
+ return r(info, function () {
362
+ if (fired) return;
363
+ fired = true;
364
+ fire();
365
+ }, function () {
366
+ if (fired) return;
367
+ fired = true;
368
+ cancel(e);
369
+ })
370
+ }
371
+ function addReform(r) {
372
+ if (isFunction(r)) reforms.push(r);
373
+ }
349
374
  extend(cross, {
350
375
  requests,
351
376
  abortAll() {
@@ -353,6 +378,7 @@ extend(cross, {
353
378
  for (var r of rs) r.abort();
354
379
  },
355
380
  setHost,
381
+ addReform,
356
382
  getCookies,
357
383
  addCookie,
358
384
  addDirect,
@@ -539,9 +539,9 @@ var privates = {
539
539
  rest.forEach(k => delete params[k]);
540
540
  return { method: realmethod, coinmethod, selector: method.slice(spliterIndex + 1), search, baseuri, uri, params };
541
541
  },
542
- loadIgnoreConfig(method, url, params, api) {
542
+ loadIgnoreConfig(method, url, params1, api) {
543
543
  var headers = api && api.headers;
544
- var { method: realmethod, uri, baseuri, coinmethod, search, selector, params } = this.prepare(method, url, params);
544
+ var { method: realmethod, uri, baseuri, coinmethod, search, selector, params } = this.prepare(method, url, params1);
545
545
  var id = realmethod + " " + baseuri;
546
546
  var promise = cachedLoadingPromise[id];
547
547
  var temp = JSON.stringify(params);
@@ -556,7 +556,7 @@ var privates = {
556
556
  }).error(xhr => {
557
557
  try {
558
558
  var e = getErrorMessage(parseData(xhr.response || xhr.responseText || xhr.statusText || xhr.status));
559
- oh({ status: xhr.status, error: e, toString: getErrorMessage })
559
+ oh({ status: xhr.status, api, params: params1, error: e, toString: getErrorMessage })
560
560
  } catch (error) {
561
561
  oh(error);
562
562
  }
@@ -852,12 +852,12 @@ var data = {
852
852
  instance.loading.abort();
853
853
  }
854
854
  this.responseLoading(instance);
855
- var params = privates.pack(sid, params1);
856
- if (!privates.validApi(api, params)) throw aborted;
855
+ var params2 = privates.pack(sid, params1);
856
+ if (!privates.validApi(api, params2)) throw aborted;
857
857
  let url = api.url;
858
858
  var base = api.base;
859
859
  if (base) url = base + api.path;
860
- var { method, uri, params, selector } = privates.prepare(api.method, url, params);
860
+ var { method, uri, params, selector } = privates.prepare(api.method, url, params2);
861
861
  var promise = new Promise(function (ok, oh) {
862
862
  var headers = api.headers;
863
863
  if (headers) {
@@ -872,7 +872,7 @@ var data = {
872
872
  instance.loading = null;
873
873
  try {
874
874
  var e = getErrorMessage(parseData(xhr.response || xhr.responseText || xhr.statusText || xhr.status));
875
- oh({ status: xhr.status, error: e, toString: getErrorMessage })
875
+ oh({ status: xhr.status, error: e, api, params: params2, toString: getErrorMessage })
876
876
  } catch (error) {
877
877
  oh(error);
878
878
  }
package/coms/zimoli/on.js CHANGED
@@ -167,8 +167,13 @@ if (is_addEventListener_enabled) {
167
167
  var eventtypes = parseEventTypes(k);
168
168
  k = k.replace(eventtypereg, '');
169
169
  function addhandler(element, handler, firstmost) {
170
+ var target = this;
170
171
  handler = wrapHandler(handler);
171
172
  if (eventtypes.capture) firstmost = true;
173
+ if (target && element !== target) {
174
+ handler = handler.bind(element);
175
+ element = target;
176
+ }
172
177
  if (k === changes_key) {
173
178
  if (!element.needchanges) element.needchanges = 0;
174
179
  element.needchanges++;
@@ -207,11 +212,16 @@ if (is_addEventListener_enabled) {
207
212
 
208
213
  if (handlersMap[on_event_path]) return handlersMap[on_event_path];
209
214
  function addhandler(element, handler, firstmost = false) {
215
+ var target = this;
210
216
  handler = wrapHandler(handler);
211
217
  if (eventtypes.capture) {
212
218
  console.warn("当前运行环境不支持事件capture");
213
219
  firstmost = true;
214
220
  }
221
+ if (target && element !== target) {
222
+ handler = handler.bind(element);
223
+ element = target;
224
+ }
215
225
  if (k === changes_key) {
216
226
  if (!element.needchanges) element.needchanges = 0;
217
227
  element.needchanges++;
@@ -105,9 +105,16 @@ var popup_path = function (path = "", parameters, target) {
105
105
  element.style.opacity = 1;
106
106
  });
107
107
  }
108
+ callbacks.forEach(f => f(element));
108
109
  };
110
+ var callbacks = [];
109
111
  popup.prepare(path, fullfill);
110
- return element;
112
+ return element || {
113
+ then(ok) {
114
+ if (element) return ok(element);
115
+ else callbacks.push(ok);
116
+ }, fullfill
117
+ };
111
118
  };
112
119
 
113
120
  var popup_view = function (element, target, style) {
@@ -52,12 +52,19 @@ body>& {
52
52
  position: relative;
53
53
  position: sticky;
54
54
  line-height: 20px;
55
- white-space: nowrap;
56
55
  overflow: hidden;
57
56
  text-overflow: ellipsis;
58
57
  color: #333;
59
58
  padding: 12px 16px 10px 16px;
60
59
 
60
+ &:before {
61
+ display: block;
62
+ content: "";
63
+ width: 20px;
64
+ height: 20px;
65
+ float: right;
66
+ }
67
+
61
68
  &:not(:last-child) {
62
69
  margin: 0 0 -42px;
63
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.9.14",
3
+ "version": "3.9.15",
4
4
  "description": "一个开发工具,开放源代码,自带组件库和编译环境,可以用来开发web组件,web应用或nodejs模块,或做为已有代码的加密工具,也可以做为静态页面服务器或跨域中转服务器使用",
5
5
  "main": "public/efront.js",
6
6
  "directories": {