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.
- package/apps/pivot/auth/login.js +14 -7
- package/apps/pivot/auth/login.less +3 -0
- package/apps/pivot/main.js +19 -3
- package/apps/pivot/task/invoke.js +1 -0
- package/apps/pivot/task/list.js +12 -3
- package/apps/pivot/task/rsync.html +16 -0
- package/apps/pivot/task/rsync.js +39 -0
- package/apps/pivot/task/rsync.less +10 -0
- package/coms/frame/edit.js +5 -0
- package/coms/frame/list.js +0 -1
- package/coms/zimoli/bind.js +14 -0
- package/coms/zimoli/button.less +1 -0
- package/coms/zimoli/cross.js +32 -6
- package/coms/zimoli/data.js +7 -7
- package/coms/zimoli/on.js +10 -0
- package/coms/zimoli/popup.js +8 -1
- package/coms/zimoli/view.less +8 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/apps/pivot/auth/login.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
34
|
-
|
|
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
|
}
|
package/apps/pivot/main.js
CHANGED
|
@@ -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;
|
package/apps/pivot/task/list.js
CHANGED
|
@@ -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
|
-
|
|
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
|
+
同步任务 - <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
|
+
}
|
package/coms/frame/edit.js
CHANGED
|
@@ -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
|
}));
|
package/coms/frame/list.js
CHANGED
|
@@ -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
|
+
}
|
package/coms/zimoli/button.less
CHANGED
package/coms/zimoli/cross.js
CHANGED
|
@@ -223,8 +223,7 @@ function cross(method, url, headers) {
|
|
|
223
223
|
onerrors.push(oh);
|
|
224
224
|
flush();
|
|
225
225
|
};
|
|
226
|
-
var
|
|
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
|
-
|
|
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
|
|
270
|
-
removeFromList(requests,
|
|
271
|
-
errored =
|
|
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,
|
package/coms/zimoli/data.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
|
856
|
-
if (!privates.validApi(api,
|
|
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,
|
|
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++;
|
package/coms/zimoli/popup.js
CHANGED
|
@@ -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) {
|
package/coms/zimoli/view.less
CHANGED
|
@@ -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
|
}
|