1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

Compare commits

...

413 Commits

Author SHA1 Message Date
shy
b24bdc33f2 add some 2025-03-22 12:54:03 +08:00
shy
4fba3f0a65 opt some 2025-03-15 10:32:07 +08:00
shy
58c1f57814 add some 2025-03-10 18:38:42 +08:00
shy
fb526f0c8e add some 2025-03-08 08:38:23 +08:00
shy
7426ac64cb add some 2025-03-05 23:33:52 +08:00
shy
27b6505a44 add some 2025-03-04 09:58:28 +08:00
shy
2da6711ce3 add some 2025-03-03 18:39:54 +08:00
shy
d95a8e99b4 add some 2025-03-02 22:08:23 +08:00
shy
6ce0e580de add some 2025-03-01 11:36:52 +08:00
shy
87841a9e2f add some 2025-02-28 14:17:32 +08:00
shy
82b234b002 add some 2025-02-27 16:27:44 +08:00
shy
4a81d5e87b add some 2025-02-25 21:54:45 +08:00
shy
68f8c3b873 add some 2025-02-25 12:14:46 +08:00
root
71fd4be1c9 add some 2025-02-25 07:32:52 +08:00
root
ebeecd3423 add some 2025-02-19 21:00:52 +08:00
root
a34814261a add some 2025-02-18 11:18:25 +08:00
root
647dbf6d91 add some 2025-02-17 19:54:58 +08:00
shy
6b0fc20430 add some 2025-02-16 08:27:28 +08:00
shy
c76ef839aa add some 2025-02-15 18:35:03 +08:00
shy
ee60a8b9bc add some 2025-02-15 12:32:12 +08:00
shy
39fcf84f40 add some 2025-02-13 22:35:39 +08:00
shy
7a44753dca opt some 2025-02-13 11:27:55 +08:00
shy
31f888755f opt some 2025-02-10 23:27:08 +08:00
shy
a63f1d4dab opt some 2025-02-10 23:04:58 +08:00
shy
b70e92c19d opt some 2025-02-10 10:11:57 +08:00
root
d442e0c168 add some 2025-02-10 08:30:07 +08:00
root
044d57c509 add some 2025-02-08 18:16:55 +08:00
root
7aaf056db8 add some 2025-02-08 15:00:11 +08:00
root
37b896bed1 add some 2025-02-08 12:02:53 +08:00
root
34686ad781 add some 2025-02-05 09:44:32 +08:00
root
808124b782 add some 2025-02-04 11:59:32 +08:00
shy
1aa5603a82 add some 2025-02-03 20:42:06 +08:00
shy
39499d7f4b add some 2025-02-02 23:54:47 +08:00
root
0fb76d1569 add some 2025-01-29 12:00:57 +08:00
shy
4d59ba0b77 add some 2025-01-25 15:15:52 +08:00
shy
d409358c30 add some 2025-01-23 21:36:49 +08:00
shy
47d96e5e0a add some 2025-01-23 19:44:14 +08:00
shy
9fa440245a add some 2025-01-23 18:59:35 +08:00
shy
98916131e3 add some 2025-01-22 16:36:36 +08:00
shy
9f6650df0d add some 2025-01-22 16:12:27 +08:00
root
943c1ec129 add some 2025-01-22 15:32:34 +08:00
root
33bb1ef07b add some 2025-01-14 08:42:17 +08:00
shy
81f8598691 add some 2025-01-10 15:04:49 +08:00
shy
a6a2b12072 add some 2025-01-06 21:38:50 +08:00
shy
af2222ca55 add some 2025-01-05 12:01:35 +08:00
shy
32abbf3a70 add some 2025-01-02 20:48:31 +08:00
shy
6263444d07 add some 2025-01-01 09:23:40 +08:00
shy
4d9d3a6bda add some 2024-12-31 15:46:04 +08:00
shy
6313d57ff6 opt some 2024-12-31 12:10:20 +08:00
shy
e354cf4d2f add some 2024-12-23 10:48:33 +08:00
shy
69c73c5593 add some 2024-12-08 22:27:34 +08:00
shy
3a3def6e96 add some 2024-12-06 18:14:04 +08:00
shy
e70b727c94 add some 2024-12-06 09:00:28 +08:00
shy
cb5d5d992e add some 2024-12-03 22:45:10 +08:00
shy
b06d344082 add some 2024-11-26 23:12:56 +08:00
shy
f893b961a6 add some 2024-11-25 19:39:32 +08:00
root
29d9275a65 add some 2024-11-25 10:42:18 +08:00
shy
1020f41d5d add some 2024-11-21 23:12:38 +08:00
shy
33a7151166 add some 2024-11-20 22:50:00 +08:00
root
0f61c3acbd add some 2024-11-18 09:11:40 +08:00
shy
9d89082b3e add some 2024-11-15 20:09:13 +08:00
root
d87ec7d9c4 add some 2024-11-15 10:09:07 +08:00
root
d5e5e2747f add some 2024-11-12 13:11:48 +08:00
root
1ca51e3895 add some 2024-11-10 09:06:48 +08:00
root
ec5d230bd9 add some 2024-11-09 11:35:37 +08:00
root
e7c8114430 add some 2024-11-04 10:27:16 +08:00
shy
46d4aaf0f4 add some 2024-11-01 11:41:37 +08:00
root
c9d4795809 add some 2024-10-25 17:49:41 +08:00
root
8577dd764d add some 2024-10-22 07:35:53 +08:00
root
1ead9f4b25 add some 2024-10-20 22:55:25 +08:00
root
b4dbf11528 add some 2024-10-20 08:16:16 +08:00
root
fb9687dd55 add some 2024-10-18 14:45:27 +08:00
root
daba956955 add some 2024-10-18 14:09:07 +08:00
root
78af0b3d1c add some 2024-10-17 23:45:30 +08:00
root
d7c0a536ea add some 2024-10-17 12:13:45 +08:00
root
b11fba0426 add some 2024-10-16 10:30:52 +08:00
b8eefca8f5 opt some 2024-10-15 18:52:11 +08:00
root
284c73cff2 add some 2024-10-15 18:25:32 +08:00
root
a158908876 add some 2024-10-13 18:25:41 +08:00
root
4f80806c45 add some 2024-10-13 08:24:22 +08:00
root
76a97837f3 add some 2024-10-12 11:06:24 +08:00
shy
0e28e0c39b add some 2024-10-10 22:23:48 +08:00
shy
912f0133f3 add some 2024-10-09 14:41:22 +08:00
shy
97e784c584 add some 2024-10-06 22:19:11 +08:00
shy
f34d04c775 add some 2024-10-04 18:43:16 +08:00
shy
20f812aff3 add some 2024-10-04 12:23:37 +08:00
shy
3bfb3f7af3 add some 2024-10-03 19:08:42 +08:00
shy
4b4acce081 add some 2024-10-03 07:42:03 +08:00
shy
e31dcbad3d add some 2024-10-02 22:24:12 +08:00
shy
02e368768b add some 2024-10-01 00:12:48 +08:00
shy
df5510d467 add some 2024-09-29 22:21:06 +08:00
shy
0cdd17355f add some 2024-09-27 23:58:16 +08:00
shy
d377063c0f add some 2024-09-26 13:00:40 +08:00
shy
eeea6f5a77 add some 2024-09-25 22:38:24 +08:00
shy
134235b106 add some 2024-09-25 17:16:25 +08:00
shy
ff1a17fcdf add some 2024-09-24 13:10:58 +08:00
shy
15e9e790be add some 2024-09-20 20:53:44 +08:00
shy
8ba9cefd0f add some 2024-09-19 20:58:58 +08:00
shy
5f3ccc5c65 add some 2024-09-18 20:40:50 +08:00
shy
aec86f5d34 add some 2024-09-18 13:32:47 +08:00
shy
7ca69339be add some 2024-09-15 20:00:24 +08:00
shy
833b44685e add some 2024-09-14 00:36:46 +08:00
shy
e30eb0bfd5 add some 2024-09-12 00:38:24 +08:00
shy
d6d648ff90 add some 2024-09-12 00:13:02 +08:00
shy
a4437facdb add some 2024-09-10 08:06:56 +08:00
shy
f15c99f3bd add some 2024-09-08 11:01:38 +08:00
shy
aca43dd83b add some 2024-09-07 17:11:55 +08:00
shy
d27c8223b2 add some 2024-09-05 20:03:01 +08:00
shy
e44c12376c add some 2024-09-03 22:42:28 +08:00
shy
cafaf8a308 add some 2024-09-03 18:29:21 +08:00
shy
7f93fb9f88 add some 2024-09-02 17:34:11 +08:00
shy
4bd2db3315 add some 2024-09-01 23:45:05 +08:00
shy
e695611fd7 add some 2024-08-30 21:56:35 +08:00
shy
7430e2b312 add some 2024-08-29 11:09:30 +08:00
shy
d8d9ba3b24 add some 2024-08-26 22:15:12 +08:00
shy
459cb45bf4 add some 2024-08-24 20:22:48 +08:00
shy
2e63b0259f add some 2024-08-20 19:54:15 +08:00
shy
904bb34a06 add some 2024-08-18 23:10:19 +08:00
jingganjiaoyu
f394b6f97c opt some 2024-08-18 02:27:32 +08:00
root
134e960e64 add some 2024-08-16 09:19:26 +08:00
shy
5f202a293e add some 2024-08-16 07:53:31 +08:00
shy
6032d02915 add some 2024-08-11 02:04:26 +08:00
shy
75245d87cb add some 2024-08-09 00:04:18 +08:00
shy
8671f50f74 add some 2024-08-06 19:10:26 +08:00
shy
4ef7126abc add some 2024-08-06 01:35:26 +08:00
shy
f392e90f37 add some 2024-08-05 23:20:56 +08:00
shy
29415a6eb2 add some 2024-08-05 02:10:14 +08:00
shy
5f2e629b12 add some 2024-08-04 14:55:12 +08:00
shy
b601a77be5 add some 2024-08-04 01:49:35 +08:00
shy
e035f043ee add some 2024-08-03 09:20:45 +08:00
shy
a23ab72753 add some 2024-08-02 18:41:48 +08:00
shy
118dbaa70c add some 2024-07-31 22:20:32 +08:00
shy
58182dc2a2 add some 2024-07-29 22:49:51 +08:00
shy
68edc8fa54 opt portal 2024-07-28 23:22:04 +08:00
jingganjiaoyu
c9c365e8b0 opt some 2024-07-26 21:40:07 +08:00
shy
f87f4686c9 opt some 2024-07-24 21:54:32 +08:00
shy
fe3eb04c7b add some 2024-07-23 16:04:37 +08:00
shy
c6a90754c3 add some 2024-07-21 14:50:48 +08:00
shy
968f15104c add some 2024-07-20 20:50:29 +08:00
shy
50cfffbf2a add some 2024-07-20 11:05:19 +08:00
shy
d6987088c3 add some 2024-07-19 18:11:07 +08:00
shy
d5f0783828 add some 2024-07-19 00:08:26 +08:00
shy
a5c441a574 add some 2024-07-16 22:24:44 +08:00
shy
ebab2d09ac add some 2024-07-15 17:55:59 +08:00
shy
ff0189dcf4 add some 2024-07-15 09:36:51 +08:00
shy
c2111a2f51 add some 2024-07-12 16:30:12 +08:00
shy
2261a365a7 add some 2024-07-11 01:54:23 +08:00
shy
ad98d694d2 add some 2024-07-09 10:10:19 +08:00
shy
4ef839d9b3 add some 2024-07-08 19:46:47 +08:00
shy
a3469971d1 add some 2024-07-07 18:24:17 +08:00
shy
0bf940b4df add some 2024-07-04 19:34:55 +08:00
shy
2d79b9871b add some 2024-07-04 03:02:10 +08:00
shy
a52eecd1c3 add some 2024-07-03 19:24:26 +08:00
shy
91c12528f2 opt some 2024-07-03 14:32:10 +08:00
shy
a843684da8 opt some 2024-07-01 20:44:40 +08:00
shy
bf970aa2a7 add some 2024-07-01 20:42:23 +08:00
shy
5b9f0bdb66 add some 2024-06-30 19:52:29 +08:00
shy
1e2dce32ad add some 2024-06-29 23:57:08 +08:00
shy
533d4cbf5f add some 2024-06-28 18:39:24 +08:00
shy
78e18b47b3 add some 2024-06-20 10:50:27 +08:00
shy
ad17b22061 add some 2024-06-19 09:11:33 +08:00
shy
20950d875f add some 2024-06-18 10:11:51 +08:00
shy
c67fc1a905 opt some 2024-06-17 21:37:11 +08:00
shy
23f1142ae7 add some 2024-06-17 18:27:19 +08:00
shy
d9e09c0dc3 add some 2024-06-15 23:41:29 +08:00
shy
a0032c60ba add some 2024-06-15 23:40:56 +08:00
shy
9cec65ee5f add some 2024-06-15 18:47:54 +08:00
shy
a8d158616b add some 2024-06-13 07:33:30 +08:00
shy
f2475b7ecc opt some 2024-06-11 20:49:36 +08:00
shy
923ba3ff64 add some 2024-06-11 11:04:20 +08:00
shy
e99a96006f add some 2024-06-10 09:31:57 +08:00
shy
42b2905107 add some 2024-06-09 23:32:15 +08:00
shy
fe30334244 opt some 2024-06-09 22:57:41 +08:00
shy
3774877186 add some 2024-06-08 23:06:28 +08:00
shy
119465db1d add some 2024-06-08 08:01:46 +08:00
shy
8d5f3edf7a add some 2024-06-08 07:56:21 +08:00
shy
68eedc76f1 opt some 2024-06-06 00:03:58 +08:00
shy
8fcb2dfdfa add some 2024-06-06 00:02:04 +08:00
shy
7622ca567f add some 2024-06-05 15:32:43 +08:00
shy
c2b6b3825e add some 2024-06-04 19:58:28 +08:00
shy
b72eabf2fb add some 2024-06-03 18:36:22 +08:00
shy
0dc8cec0d7 add some 2024-06-03 12:43:28 +08:00
shy
6ae43d0f06 add some 2024-06-03 07:53:55 +08:00
shy
f8635d242a add some 2024-06-01 23:04:33 +08:00
shy
50302be95a add some 2024-05-31 19:57:50 +08:00
shy
8f3c12ee99 add some 2024-05-31 02:34:52 +08:00
shy
bbd9ed606b add some 2024-05-30 19:57:12 +08:00
shy
2f2a17e776 add some 2024-05-28 22:42:47 +08:00
shy
3069641bf3 add some 2024-05-28 18:48:40 +08:00
shy
97fcd91e6a add some 2024-05-27 19:32:09 +08:00
shy
8f249670a6 add some 2024-05-27 07:29:27 +08:00
shy
c172f673aa add some 2024-05-26 11:27:53 +08:00
shy
b16bc2632d add some 2024-05-26 08:28:08 +08:00
shy
9e256717c2 add some 2024-05-26 08:07:19 +08:00
shy
2d34d204d8 add some 2024-05-25 20:56:52 +08:00
shy
3282bcede9 add some 2024-05-25 19:56:56 +08:00
shy
8865d923da add some 2024-05-24 19:27:23 +08:00
shy
b21017d1e6 add some 2024-05-23 23:41:29 +08:00
shy
be157798aa add some 2024-05-23 19:16:31 +08:00
shy
8542f11991 add some 2024-05-22 23:07:10 +08:00
shy
78b615141c add some 2024-05-22 18:44:28 +08:00
shy
72a558797e add some 2024-05-21 23:46:00 +08:00
shy
11c15b0aa7 add some 2024-05-21 19:22:48 +08:00
shy
0fd53c1e23 add some 2024-05-21 07:39:21 +08:00
shy
fa4e9d6178 add some 2024-05-20 20:52:36 +08:00
shy
7510c10f2f add some 2024-05-20 07:27:26 +08:00
shy
769f1293ba add some 2024-05-20 01:32:02 +08:00
shy
d80ac7b091 add some 2024-05-19 23:49:40 +08:00
shy
c76de6fef0 add some 2024-05-19 17:14:31 +08:00
shy
94b4faee59 add some 2024-05-19 17:02:46 +08:00
shy
1dd54cbd5d add some 2024-05-18 23:13:52 +08:00
shy
a953d011b4 add some 2024-05-18 22:20:18 +08:00
shy
78ae374e42 add some 2024-05-18 21:02:24 +08:00
shy
a8c2a9ea3b add some 2024-05-17 23:57:57 +08:00
shy
c0bba74b3b add some 2024-05-17 23:42:59 +08:00
shy
0701ed916c add some 2024-05-17 19:39:41 +08:00
shy
bfb6e331a9 add some 2024-05-17 00:24:05 +08:00
shy
c161b906f6 add some 2024-05-16 19:31:53 +08:00
shy
92751f7de6 add some 2024-05-16 08:19:29 +08:00
shy
1dbbba48d9 add some 2024-05-15 18:40:23 +08:00
shy
68f3c17005 add some 2024-05-15 15:58:54 +08:00
shy
f1961220c0 add some 2024-05-14 23:27:35 +08:00
shy
0f1566a0a8 add some 2024-05-14 19:13:28 +08:00
shy
ac01242ec1 add some 2024-05-14 00:02:26 +08:00
shy
54a7872244 add tutor 2024-05-13 20:33:29 +08:00
root
12de0b692a add some 2024-05-13 14:25:44 +08:00
shy
288ad7d59b add some 2024-05-12 15:03:51 +08:00
shy
09a7e4e48f add some 2024-05-11 22:20:22 +08:00
shy
347e43f2b4 add some 2024-05-11 18:21:02 +08:00
root
81935e42a5 add some 2024-05-10 22:16:04 +08:00
shy
e601da8c29 add some 2024-05-10 22:05:23 +08:00
shy
24b4085cc0 add some 2024-05-10 21:54:07 +08:00
shy
7914b395f3 add some 2024-05-10 10:29:19 +08:00
shy
6411732f6a add some 2024-05-09 23:14:38 +08:00
shy
c6c5ec00f1 add some 2024-05-09 22:24:35 +08:00
shy
efda5a480e add some 2024-05-09 15:59:23 +08:00
shy
3d45725678 add some 2024-05-09 11:33:20 +08:00
shy
0b3ee1d4fa add some 2024-05-09 07:25:31 +08:00
shy
b808b4a9ce add some 2024-05-08 00:14:21 +08:00
shy
ffac2c4016 opt table.js 2024-05-07 15:21:18 +08:00
shy
6d3f37c7bc add studio 2024-05-06 23:06:04 +08:00
shy
3587d7ab28 add some 2024-05-06 08:12:16 +08:00
shy
1e774bde03 add some 2024-05-05 23:24:53 +08:00
shy
c515c8229f add some 2024-05-05 17:32:29 +08:00
shy
05049d36a8 add some 2024-05-04 19:20:40 +08:00
shy
994afcf03b add some 2024-05-04 00:31:39 +08:00
shy
59c850714c add some 2024-05-02 07:13:44 +08:00
shy
6042b1a00a add some 2024-05-01 18:43:11 +08:00
shy
c66b9ab28b add some 2024-05-01 18:25:52 +08:00
shy
13260d13c8 add some 2024-04-30 22:11:54 +08:00
shy
1710964e37 add some 2024-04-30 02:34:58 +08:00
shy
517c285808 add some 2024-04-29 14:49:04 +08:00
shy
df13edfa46 add some 2024-04-28 23:26:42 +08:00
shy
8a85e91e35 add some 2024-04-27 20:43:35 +08:00
shy
0ded98804e add some 2024-04-27 18:35:09 +08:00
shy
fda39d8e6d add some 2024-04-27 09:20:46 +08:00
shy
9fb348c414 add some 2024-04-25 21:11:24 +08:00
shy
fa52a9cbb8 add some 2024-04-25 12:38:12 +08:00
shy
430777ed94 add some 2024-04-24 18:10:17 +08:00
shy
0d52e524c2 add some 2024-04-24 16:26:39 +08:00
shy
0ba1d4dbe5 add some 2024-04-24 10:23:08 +08:00
shy
c233f75a13 add some 2024-04-22 15:47:53 +08:00
shy
607f070a7b add some 2024-04-22 15:27:45 +08:00
shy
2e712bdaf7 add some 2024-04-22 11:54:35 +08:00
shy
88f12f173f add some 2024-04-22 10:34:18 +08:00
3054e59506 opt some 2024-04-22 00:38:59 +08:00
da9675602d opt some 2024-04-21 16:01:47 +08:00
shy
4086075a75 add some 2024-04-20 19:26:22 +08:00
shy
2bc798aceb add some 2024-04-20 15:56:20 +08:00
shy
80ff408dc0 add some 2024-04-20 07:25:54 +08:00
shy
6a46ee4983 add some 2024-04-19 21:45:11 +08:00
shy
d9b8c2e788 add some 2024-04-19 19:35:41 +08:00
shy
d221885a7d add some 2024-04-19 17:58:07 +08:00
shy
30c19f8e33 add some 2024-04-19 12:34:06 +08:00
shy
e28c879a36 add some 2024-04-19 02:42:48 +08:00
shy
0b34393e62 add some 2024-04-18 23:35:49 +08:00
shy
8cb7df23d5 add some 2024-04-18 22:47:36 +08:00
shy
739b1aa70c add some 2024-04-18 22:17:54 +08:00
shy
ef6b2ce54e opt border 2024-04-18 22:15:15 +08:00
shy
8064c877aa add some 2024-04-18 13:40:50 +08:00
shy
05964c5450 add some 2024-04-18 10:48:33 +08:00
shy
57fbc4d2dd add some 2024-04-18 00:11:04 +08:00
shy
2a0b5dcc29 add studiolayout 2024-04-17 04:15:08 +08:00
shy
d3e9a345ef add some 2024-04-15 12:25:10 +08:00
shy
42f98ddae1 add some 2024-04-14 23:26:10 +08:00
shy
9efab283d5 add some 2024-04-14 19:26:30 +08:00
root
229b889ce9 add some 2024-04-13 23:18:19 +08:00
shy
eb94b02785 add some 2024-04-12 22:21:31 +08:00
shy
020df619b1 add some 2024-04-11 23:59:49 +08:00
root
6d34e48d2c add some 2024-04-11 21:58:15 +08:00
shy
40ba82b5b2 add some 2024-04-10 13:33:18 +08:00
shy
09810f9d1b add some 2024-04-10 00:32:53 +08:00
shy
9cb7b31bba add some 2024-04-09 18:25:40 +08:00
shy
01b614e608 add some 2024-04-09 13:19:04 +08:00
shy
7514b2004e add some 2024-04-08 21:05:40 +08:00
shy
a62e460dd2 add some 2024-04-08 17:13:59 +08:00
shy
21da385bc1 add some 2024-04-08 13:31:08 +08:00
shy
8ec4c8a04c add some 2024-04-08 12:59:34 +08:00
shy
b296e255e1 add some 2024-04-08 11:20:12 +08:00
shy
b0d687654e add some 2024-04-07 23:14:14 +08:00
shy
9d635cb45e add some 2024-04-07 15:33:17 +08:00
shy
f8d3357648 add some 2024-04-07 13:31:24 +08:00
shy
dea931acee add some 2024-04-07 13:28:43 +08:00
shy
264f0b1afa add some 2024-04-07 12:16:43 +08:00
shy
cc87ddf937 add some 2024-04-07 00:02:24 +08:00
shy
840a166ad1 add some 2024-04-06 23:08:30 +08:00
shy
25424870c6 add some 2024-04-06 22:32:19 +08:00
shy
6276ab803a add some 2024-04-06 15:05:24 +08:00
shy
6ee21fc9ca add some 2024-04-06 00:23:45 +08:00
shy
d083550bb1 add some 2024-04-05 21:15:41 +08:00
shy
eae861fe3a add some 2024-04-04 23:11:36 +08:00
shy
51d98031c1 add some 2024-04-04 13:49:10 +08:00
shy
1ed6f504e4 add some 2024-04-03 02:55:46 +08:00
shy
7dbb612bbe add some 2024-04-02 20:14:53 +08:00
shy
ff697bd057 add some 2024-04-01 20:08:45 +08:00
shy
7e4557cd58 add some 2024-03-30 18:08:55 +08:00
shy
1a00d31ec5 add some 2024-03-29 22:32:10 +08:00
shy
1452695a3b add package 2024-03-28 23:45:07 +08:00
shy
35c87a4d6b add some 2024-03-27 22:17:33 +08:00
shy
d11bd2085d add some 2024-03-27 20:16:47 +08:00
shy
434af52bef add some 2024-03-27 13:25:47 +08:00
shy
741bf23c81 add some 2024-03-27 08:46:12 +08:00
shy
3de5506baf add some 2024-03-27 00:03:34 +08:00
shy
c549f04c3b add some 2024-03-26 15:32:45 +08:00
shy
ff08155c03 add some 2024-03-25 16:47:02 +08:00
shy
f692558ac0 add some 2024-03-23 21:15:21 +08:00
shy
91627380b1 add some 2024-03-21 14:44:21 +08:00
shy
d1612da0e9 add some 2024-03-20 13:18:58 +08:00
shy
e7c34be246 add some 2024-03-17 23:19:48 +08:00
shy
a3f41ef85b add some 2024-03-17 22:13:16 +08:00
shy
68372c797f add some 2024-03-17 15:40:21 +08:00
shy
0fb30b2266 add some 2024-03-17 14:27:44 +08:00
shy
7c21cbaf63 add some 2024-03-17 11:54:37 +08:00
shy
2e1f36d3fd add some 2024-03-16 14:26:31 +08:00
shy
b7cfd28753 add some 2024-03-16 12:38:45 +08:00
shy
3491a13916 add some 2024-03-15 14:41:13 +08:00
shy
1ebf4a5a29 add some 2024-03-15 09:54:33 +08:00
shy
ab89d47fd7 add some 2024-03-15 00:32:43 +08:00
shy
b0f1c06420 add some 2024-03-14 21:13:53 +08:00
shy
3e64f738f0 add some 2024-03-14 20:48:24 +08:00
shy
b9043ce03c add some 2024-03-14 00:51:12 +08:00
shy
f345c7e825 add some 2024-03-13 21:41:53 +08:00
shy
6fe918550a add some 2024-03-13 20:35:35 +08:00
shy
7577841e7b add some 2024-03-13 19:40:34 +08:00
shy
78000870a4 add some 2024-03-13 16:16:00 +08:00
shy
f9e10441d7 add some 2024-03-13 11:56:15 +08:00
shy
24398da793 add some 2024-03-12 18:16:01 +08:00
shy
509d07d1d0 add some 2024-03-12 16:28:01 +08:00
shy
0652d3ae6f add some 2024-03-12 10:20:31 +08:00
shy
d042b34f12 add some 2024-03-12 09:52:07 +08:00
shy
06132ef554 add some 2024-03-11 23:30:19 +08:00
shy
d6ae056435 add some 2024-03-11 17:34:49 +08:00
shy
a9d5334dd6 opt some 2024-03-11 13:10:19 +08:00
shy
f33fa5b9fe add some 2024-03-10 19:48:53 +08:00
shy
b8ad3a3719 add some 2024-03-10 10:52:26 +08:00
shy
79a67bbf44 add some 2024-03-09 15:07:52 +08:00
shy
04c7a8e0d2 add some 2024-03-08 23:52:37 +08:00
shy
bd1096e2fa add some 2024-03-08 21:39:51 +08:00
shy
d7cabef5d0 add some 2024-03-08 20:37:29 +08:00
shy
8fd1bfd572 add some 2024-03-08 19:10:09 +08:00
shy
1c3f272dd6 add some 2024-03-08 19:04:10 +08:00
shy
2b93afe8a7 add some 2024-03-08 11:37:47 +08:00
shy
c4120fb091 add some 2024-03-08 02:17:00 +08:00
shy
16026eefde add ssh.cloud.tencent 2024-03-07 20:32:32 +08:00
shy
2c9d61a11a add some 2024-03-07 10:39:39 +08:00
shy
cdf51bb165 add some 2024-03-07 08:19:38 +08:00
shy
19ca1d8487 add some 2024-03-07 00:03:51 +08:00
shy
74bbce10ea add some 2024-03-06 22:30:55 +08:00
shy
c7f5311300 add some 2024-03-06 19:46:47 +08:00
shy
78581cb912 add some 2024-03-06 14:45:16 +08:00
shy
b92fb496fe add some 2024-03-06 12:43:27 +08:00
shy
6211076e0e add some 2024-03-06 01:46:20 +08:00
shy
263d9a4145 add some 2024-03-06 01:36:42 +08:00
shy
2eb2940fad add some 2024-03-05 22:57:58 +08:00
shy
28603fedec add some 2024-03-05 19:13:54 +08:00
shy
be00b86826 add some 2024-03-05 16:49:52 +08:00
shy
3aae308a3b opt portal 2024-03-05 13:55:38 +08:00
shy
48b32e8324 add some 2024-03-04 23:27:54 +08:00
shy
d27e6eddb2 add some 2024-03-04 19:16:42 +08:00
shy
8f248dc3b0 add some 2024-03-04 16:51:44 +08:00
shy
ea16fd5313 add some 2024-03-04 12:45:42 +08:00
shy
524de99f34 add some 2024-03-04 10:48:27 +08:00
shy
acca353827 add some 2024-03-04 02:36:21 +08:00
shy
0850d12bec add some 2024-03-03 21:14:35 +08:00
shy
d7011fdaa2 add some 2024-03-03 20:15:34 +08:00
shy
b9d09d67c3 add some 2024-03-03 20:15:32 +08:00
shy
1f02e3cf18 add some 2024-03-03 19:32:48 +08:00
shy
0a487409dc add some 2024-03-03 17:17:36 +08:00
shy
7e4aaa6ffe add some 2024-03-03 14:26:46 +08:00
shy
0d198bcec6 add some 2024-03-02 17:26:13 +08:00
shy
f76bb5ec41 add some 2024-03-02 14:56:59 +08:00
shy
2defb8e708 add some 2024-03-01 21:22:02 +08:00
shy
e430ac98d7 add some 2024-03-01 20:35:46 +08:00
shy
b513ad8678 add some 2024-03-01 17:28:27 +08:00
shy
b372a51fc4 add some 2024-03-01 15:58:06 +08:00
shy
d0c96d0a31 add some 2024-03-01 15:18:36 +08:00
shy
b0a2f00577 add some 2024-03-01 13:36:00 +08:00
shy
a7b1c95407 add some 2024-03-01 12:01:47 +08:00
shy
c69eeac9f7 add some 2024-02-29 20:14:34 +08:00
shy
78db3a2b2f add web.stream 2024-02-29 14:04:18 +08:00
shy
e0d7ac0d51 add some 2024-02-29 02:36:47 +08:00
shy
dc07cb9703 add some 2024-02-29 00:29:13 +08:00
shy
1fc2989b36 add some 2024-02-28 23:29:56 +08:00
shy
0e52de58dc add some 2024-02-28 15:18:30 +08:00
shy
668e6faf22 add some 2024-02-28 02:15:00 +08:00
shy
800cdb86fc add some 2024-02-27 22:02:24 +08:00
shy
3bfba9c573 add some 2024-02-27 13:43:59 +08:00
shy
d03091a3c6 add some 2024-02-27 11:37:13 +08:00
shy
3989ec58b9 add web.group 2024-02-27 00:59:05 +08:00
shy
a7cbb6a36a add some 2024-02-25 22:45:59 +08:00
shy
5632a7816f add some 2024-02-25 20:35:07 +08:00
shy
6b7d66c572 add some 2024-02-24 23:27:58 +08:00
shy
71a1172e7d add some 2024-02-24 18:18:53 +08:00
102 changed files with 5051 additions and 2998 deletions

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 shylinux
Copyright (c) 2017-2025 shylinux
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

364
const.js
View File

@ -12,40 +12,46 @@ var kit = {proto: function(sub, sup) { return sub.__proto__ = sup, sub },
var ice = {
TB: "\t", SP: " ", DF: ":", EQ: "=", AT: "@", QS: "?", PS: "/", PT: ".", FS: ",", NL: "\n", LT: "<", GT: ">",
OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", PROCESS: "process", FAILURE: "failure",
CONTEXTS: "contexts",
HTTP: "http", HOME: "home",
HELP: "help", COPY: "copy",
MAIN: "main", AUTO: "auto",
LIST: "list", BACK: "back",
MODE: "mode", EXEC: "exec",
INFO: "info",
APP: "app", CAN: "can", CAN_PLUGIN: "can._plugin",
OPS: "ops", DEV: "dev", POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg",
NFS: "nfs", USR: "usr",
MSG_FIELDS: "fields", MSG_SESSID: "sessid", MSG_METHOD: "method", MSG_DEBUG: "debug",
MSG_DETAIL: "detail", MSG_OPTION: "option", MSG_APPEND: "append", MSG_RESULT: "result",
MSG_HANDLE: "_handle", MSG_UPLOAD: "_upload",
MSG_SOURCE: "_source", MSG_TARGET: "_target",
MSG_ACTION: "_action", MSG_STATUS: "_status",
MSG_PROCESS: "_process", MSG_DISPLAY: "_display", MSG_TOOLKIT: "_toolkit",
MSG_USERNICK: "user.nick", MSG_USERNAME: "user.name", MSG_USERROLE: "user.role", MSG_LANGUAGE: "user.lang",
MSG_BG: "sess.bg", MSG_FG: "sess.fg",
MSG_COST: "sess.cost", MSG_MODE: "sess.mode", MSG_THEME: "sess.theme", MSG_TITLE: "sess.title", MSG_RIVER: "sess.river", MSG_STORM: "sess.storm",
MSG_DAEMON: "sess.daemon", LOG_DISABLE: "log.disable", LOG_TRACEID: "log.id",
MSG_NODETYPE: "node.type", TABLE_CHECKBOX: "table.checkbox",
FROM_DAEMON: "from.daemon",
MSG_DISPLAY_CSS: "_display_css",
MSG_USERWEB: "user.web", MSG_USERPOD: "user.pod",
MSG_USERROLE: "user.role", MSG_USERNAME: "user.name", MSG_USERNICK: "user.nick", MSG_LANGUAGE: "user.lang",
MSG_TITLE: "sess.title", MSG_THEME: "sess.theme", MSG_BG: "sess.bg", MSG_FG: "sess.fg", MSG_DAEMON: "sess.daemon",
LOG_DISABLE: "log.disable", LOG_TRACEID: "log.id",
MSG_RIVER: "sess.river", MSG_STORM: "sess.storm",
MSG_COST: "sess.cost", MSG_MODE: "sess.mode",
MSG_NODETYPE: "node.type", MSG_NODENAME: "node.name",
TABLE_CHECKBOX: "table.checkbox", FROM_DAEMON: "from.daemon",
PROCESS_REWRITE: "_rewrite",
PROCESS_FIELD: "_field",
PROCESS_AGAIN: "_again",
PROCESS_HOLD: "_hold",
FIELD_PREFIX: "_prefix",
MSG_PREFIX: "_prefix",
MSG_INDEX: "_index",
ErrWarn: "warn: ",
ErrNotLogin: "not login: ",
ErrNotRight: "not right: ",
@ -62,22 +68,25 @@ var ctx = {
var mdb = {FOREACH: "*", RANDOMS: "%",
DICT: "dict", META: "meta", HASH: "hash", LIST: "list",
SHORT: "short", FIELD: "field", COUNT: "count", TOTAL: "total", LIMIT: "limit",
TIME: "time", ZONE: "zone", ID: "id",
TYPE: "type", NAME: "name", TEXT: "text",
ICON: "icon", ICONS: "icons",
DATA: "data", VIEW: "view",
KEY: "key", VALUE: "value",
INDEX: "index", EXTRA: "extra",
ORDER: "order",
STATUS: "status", EXPIRE: "expire",
TYPE: "type", NAME: "name", TEXT: "text", ICON: "icon", ICONS: "icons",
KEY: "key", VALUE: "value", STATUS: "status", EXTRA: "extra",
KEYWORD: "keyword",
CURRENT: "current",
SWITCH: "switch",
NOTFOUND: "notfound",
NICK: "nick",
ENABLE: "enable", DISABLE: "disable",
INDEX: "index", ORDER: "order", WEIGHT: "weight",
DATA: "data", VIEW: "view", INFO: "info", HELP: "help",
INPUTS: "inputs", CREATE: "create", REMOVE: "remove", UPDATE: "update",
INSERT: "insert", DELETE: "delete", MODIFY: "modify", SELECT: "select",
PRUNES: "prunes", EXPORT: "export", IMPORT: "import",
SEARCH: "search", ENGINE: "engine", RENDER: "render", PLUGIN: "plugin",
DETAIL: "detail", NORMAL: "normal", PRUNE: "prune",
RENAME: "rename", CANCEL: "cancel", EXPIRE: "expire", FINISH: "finish",
BEGIN_TIME: "begin_time", END_TIME: "end_time",
CANCEL_TIME: "cancel_time", EXPIRE_TIME: "expire_time", FINISH_TIME: "finish_time",
MAIN: "main", PAGE: "page", NEXT: "next", PREV: "prev", LIMIT: "limit", OFFEND: "offend",
QS: ice.QS, AT: ice.AT,
EQ: ice.EQ, FS: ice.FS,
@ -86,22 +95,30 @@ var web = {
SERVE: "serve", SPACE: "space", DREAM: "dream", ROUTE: "route",
SHARE: "share", TOKEN: "token", STATS: "stats", COUNT: "count",
SPIDE: "spide", STORE: "store", ADMIN: "admin", MATRIX: "matrix",
WORKER: "worker", SERVER: "server", MASTER: "master", GATEWAY: "gateway",
ORIGIN: "origin", VENDOR: "vendor", ONLINE: "online", OFFLINE: "offline",
GRANT: "grant", CHAT_GRANT: "web.chat.grant",
WORKER: "worker", SERVER: "server", ORIGIN: "origin", VENDOR: "vendor",
GATEWAY: "gateway", ONLINE: "online", OFFLINE: "offline",
SHOW: "show",
FULL: "full", OPEN: "open", LINK: "link", HTTP: "http", DOMAIN: "domain", URL: "url",
DRAW: "draw", PLAY: "play", CLEAR: "clear", RESIZE: "resize", FILTER: "filter",
CANCEL: "cancel", SUBMIT: "submit", CONFIRM: "confirm", REFRESH: "refresh",
UPLOAD: "upload", DOWNLOAD: "download", PREVIEW: "preview", TOIMAGE: "toimage",
CLIENT_NAME: "client.name",
SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", BASIC_LOGIN: "/basic/login",
CHAT_SSO: "/chat/sso/", CHAT_POD: "/chat/pod/", CHAT_CMD: "/chat/cmd/",
CHAT: "chat",
PORTAL: "portal", DESKTOP: "desktop",
STUDIO: "studio", SERVICE: "service",
MESSAGE: "message",
STATUS: "status",
VIMER: "vimer",
WORD: "word",
PLAN: "plan",
CODE_GIT_SEARCH: "web.code.git.search",
CODE_GIT_STATUS: "web.code.git.status",
CODE_GIT_REPOS: "web.code.git.repos",
@ -122,22 +139,24 @@ var web = {
CHAT_FLOWS: "web.chat.flows",
TEAM_PLAN: "web.team.plan",
MALL_GOODS: "web.mall.goods",
AT: ice.AT, QS: ice.QS,
}
var aaa = {
USER: "user", AUTH: "auth", SESS: "sess", ROLE: "role",
EMAIL: "email", OFFER: "offer", APPLY: "apply",
LOGIN: "login", LOGOUT: "logout",
BACKGROUND: "background", AVATAR: "avatar", MOBILE: "mobile", SECRET: "secret",
LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese",
PROVINCE: "province", COUNTRY: "country", CITY: "city",
LONGITUDE: "longitude", LATITUDE: "latitude",
IP: "ip", UA: "ua",
LOCATION: "location",
USERNICK: "usernick", USERNAME: "username", PASSWORD: "password", USERROLE: "userrole", USERZONE: "userzone",
VOID: "void", TECH: "tech", ROOT: "root",
PUBLIC: "public", PRIVATE: "private",
}
var lex = {
SPLIT: "split", PARSE: "parse",
@ -149,6 +168,7 @@ var yac = {
}
var ssh = {
SHELL: "shell",
CLOUD_PROFILE: "ssh.cloud.profile",
}
var gdb = {
SIGNAL: "signal",
@ -159,35 +179,39 @@ var tcp = {
SERVICE: "service", HOSTNAME: "hostname",
WIFI: "wifi", SSID: "ssid",
LOCALHOST: "localhost",
DIAL: "dial",
DIRECT: "direct", SEND: "send", RECV: "recv",
}
var nfs = {
DIR: "dir", CAT: "cat", DEFS: "defs", PACK: "pack", TRASH: "trash", DIR_ROOT: "dir_root",
COPY: "copy", EDIT: "edit", SAVE: "save", LOAD: "load", FIND: "find", GREP: "grep", TAGS: "tags",
PATH: "path", FILE: "file", LINE: "line", SIZE: "size",
MODULE: "module",
SOURCE: "source",
TARGET: "target",
BINARY: "binary",
SCRIPT: "script",
CLONE: "clone",
REPOS: "repos",
BRANCH: "branch",
VERSION: "version",
TEMPLATE: "template", SUBJECT: "subject", CONTENT: "content",
REPLACE: "replace", FROM: "from", TO: "to",
RECENT: "recent", PUSH: "push", PULL: "pull",
IMAGE: "image",
_JS: ".js", _CSS: ".css",
JS: "js", SVG: "svg", CSS: "css", HTML: "html",
GO: "go", SH: "sh", SHY: "shy", CSV: "csv", JSON: "json",
TXT: "txt", PNG: "png", WEBM: "webm",
PWD: "./", SRC: "src/", SRC_MAIN_ICO: "src/main.ico",
SRC_TEMPLATE: "src/template/", USR_LEARNING_PORTAL: "usr/learning/portal/",
SRC_TEMPLATE: "src/template/",
SRC_DOCUMENT: "src/document/",
USR_LEARNING_PORTAL: "usr/learning/portal/",
USR: "usr/", USR_LOCAL_WORK: "usr/local/work/",
USR_WEBSOCKET: "usr/websocket/", USR_GO_QRCODE: "usr/go-qrcode/", USR_GO_GIT: "usr/go-git/",
USR_ICONS: "usr/icons/", USR_GEOAREA: "usr/geoarea/", USR_PROGRAM: "usr/program/",
@ -195,24 +219,35 @@ var nfs = {
USR_NODE_MODULES: "usr/node_modules/",
USR_ICONS_ICEBERGS: "usr/icons/icebergs.jpg",
USR_ICONS_VOLCANOS: "usr/icons/volcanos.jpg",
V: "/v/",
M: "/m/",
P: "/p/",
X: "/x/",
S: "/s/",
C: "/c/",
REQUIRE: "/require/", REQUIRE_MODULES: "/require/modules/",
SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/",
WIKI_PORTAL: "/wiki/portal/",
CHAT_RIVER: "/chat/river/", CHAT_ACTION: "/chat/action/",
DF: ice.DF, PS: ice.PS, PT: ice.PT,
BACKGROUND_JPG: "usr/icons/background.jpg",
AVATAR_JPG: "usr/icons/avatar.jpg",
}
var cli = {
RUNTIME: "runtime", SYSTEM: "system", DAEMON: "daemon",
BEGIN: "begin", END: "end", START: "start", RESTART: "restart", STOP: "stop", OPEN: "open", CLOSE: "close",
PID: "pid",
OPENS: "opens", BUILD: "build", ORDER: "order", DELAY: "delay", REBOOT: "reboot",
PLAY: "play", STEP: "step", DONE: "done", COST: "cost", FROM: "from", PWD: "pwd",
QRCODE: "qrcode", COLOR: "color", BLACK: "black", WHITE: "white", BLUE: "blue", RED: "red", GRAY: "gray", CYAN: "cyan", GREEN: "green", PURPLE: "purple", YELLOW: "yellow",
MAGENTA: "magenta", SILVER: "silver", ALICEBLUE: "aliceblue", TRANSPARENT: "transparent",
LINUX: "linux", DARWIN: "darwin", WINDOWS: "windows",
XTERM: "xterm",
SH: "sh",
}
var log = {
INFO: "info", WARN: "warn", ERROR: "error", DEBUG: "debug", TRACE: "trace",
@ -222,7 +257,7 @@ var code = {
FAVOR: "favor", XTERM: "xterm", INNER: "inner", VIMER: "vimer",
WEBPACK: "webpack", BINPACK: "binpack", AUTOGEN: "autogen", COMPILE: "compile", PUBLISH: "publish", UPGRADE: "upgrade",
TEMPLATE: "template", COMPLETE: "complete", NAVIGATE: "navigate", CURRENT: "current",
PULL: "pull", PUSH: "push",
STATUS: "status", PULL: "pull", PUSH: "push",
INSTALL: "install",
COMMENT: "comment", KEYWORD: "keyword", DATATYPE: "datatype", PACKAGE: "package",
FUNCTION: "function", CONSTANT: "constant", STRING: "string", NUMBER: "number", BOOLEAN: "boolean",
@ -232,6 +267,7 @@ var code = {
}
var wiki = {
DRAW: "draw", WORD: "word", PORTAL: "portal",
FEEL: "feel",
TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark", SHELL: "shell",
ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video",
FIELD: "field", LOCAL: "local", PARSE: "parse",
@ -246,16 +282,19 @@ var chat = {
SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOOL: "tool",
STATE: "state", MENUS: "menus", SSO: "sso", LOCATION: "location", IFRAME: "iframe", DESKTOP: "desktop",
OUTPUT: "output", SIMPLE: "simple", FLOAT: "float", FULL: "full", CMD: "cmd",
MESSAGE: "message", REQUEST: "request", RESPONSE: "response",
MATRIX: "matrix",
TUTOR: "tutor",
FLOWS: "flows",
ADMIN: "admin",
HEADER: "Header", ACTION: "Action", FOOTER: "Footer",
libs: ["base.js", "core.js", "date.js", "misc.js", "page.js", "user.js"].map(function(p) { return "/lib/"+p }),
panel_list: [{name: "Header", style: "head"}, {name: "River", style: "left"}, {name: "Action", style: "main"}, {name: "Search", style: "auto"}, {name: "Footer", style: "foot"}],
plugin_list: [
"state.js",
"input.js",
"table.js",
plugin_list: ["state.js", "input.js", "table.js",
"input/key.js",
"input/date.js",
].concat(navigator.userAgent.indexOf("Mobile") > -1? []: [
"story/json.js",
"story/stats.js",
"story/spides.js",
@ -269,31 +308,41 @@ var chat = {
"local/wiki/feel.js",
"local/wiki/word.js",
"local/team/plan.js",
].map(function(p) { return "/plugin/"+p }),
]).map(function(p) { return "/v/plugin/"+p }),
PLUGIN_LOCAL: "/plugin/local/", PLUGIN_STORY: "/plugin/story/", PLUGIN_INPUT: "/plugin/input/",
PLUGIN_INPUT_JS: "/plugin/input.js", PLUGIN_TABLE_JS: "/plugin/table.js", PLUGIN_STATE_JS: "/plugin/state.js",
FRAME_JS: "/volcanos/frame.js",
FRAME_JS: "/v/frame.js",
ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap",
ONIMPORT: "onimport", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport",
ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONPLUGIN: "onplugin", ONINPUTS: "oninputs",
ONSIZE: "onsize", ONMAIN: "onmain", ONLOGIN: "onlogin", ONREMOTE: "onremote", ONSEARCH: "onsearch",
ONRESIZE: "onresize", ONKEYUP: "onkeyup", ONKEYDOWN: "onkeydown", ONMOUSEENTER: "onmouseenter", ORIENTATIONCHANGE: "orientationchange",
ONSTORM_SELECT: "onstorm_select", ONACTION_NOSTORM: "onaction_nostorm", ONACTION_NOTOOL: "onaction_notool", ONACTION_TOUCH: "onaction_touch", ONACTION_CMD: "onaction_cmd", ONACTION_REMOVE: "onaction_remove",
ONOPENSEARCH: "onopensearch", ONSEARCH_FOCUS: "onsearch_focus", ONCOMMAND_FOCUS: "oncommand_focus",
ONTHEMECHANGE: "onthemechange", ONLAYOUT: "onlayout", ONUNLOAD: "onunload", ONWEBPACK: "onwebpack",
ONTOAST: "ontoast", ONSHARE: "onshare", ONPRINT: "onprint", ONDEBUGS: "ondebugs",
_INIT: "_init", _DELAY_INIT: "_delay_init",
_TRANS: "_trans", _STYLE: "_style", _ENGINE: "_engine", _SEARCH: "_search", _NAMES: "_names", _TOAST: "_toast",
PAGES_RIVER: "/pages/river/river",
PAGES_HOME: "/pages/action/home",
PAGES_DREAM: "/pages/action/dream",
PAGES_DESKTOP: "/pages/action/desktop",
PAGES_MY: "/pages/action/my",
PAGES_SEARCH: "/pages/action/search",
PAGES_ACTION: "/pages/action/action",
PAGES_INSERT: "/pages/insert/insert",
PAGES_RIVER: "/pages/river/river",
PAGES_GRANT: "/pages/web-chat/grant",
WX_LOGIN_SESS: "/chat/wx/login/action/sess",
WX_LOGIN_USER: "/chat/wx/login/action/user",
WX_LOGIN_SCAN: "/chat/wx/login/action/scan",
API_HEADER: "/chat/header/",
API_SEARCH: "/chat/search/",
API_ACTION: "/chat/action/",
}
var team = {
TASK: "task", PLAN: "plan", ASSET: "asset",
@ -310,36 +359,49 @@ var http = {
GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE",
Accept: "Accept", ContentType: "Content-Type", ApplicationJSON: "application/json", ApplicationFORM: "application/x-www-form-urlencoded",
}
var html = {value: {
HEADER_HEIGHT: 48, ACTION_HEIGHT: 32, STATUS_HEIGHT: 32,
RIVER_WIDTH: 230, PROJECT_WIDTH: 230,
RIVER_MARGIN: 80, ACTION_MARGIN: 200,
PLUGIN_PADDING: 0, PLUGIN_MARGIN: 0,
ACTION_BUTTON: 3, TABLE_BUTTON: 5,
CODE_FONT_SIZE: 14,
QRCODE_WIDTH: 360,
CARD_BUTTON: 5,
CARD_WIDTH: 320, CARD_HEIGHT: 160,
PLUG_WIDTH: 800, PLUG_HEIGHT: 480, STORY_HEIGHT: 480, FLOAT_HEIGHT: 480, FLOAT_WIDTH: 1200, DESKTOP_WIDTH: 1200, DESKTOP_HEIGHT: 684,
},
var html = {
value: {
PROJECT_WIDTH: 230, RIVER_WIDTH: 230,
FLOAT_HEIGHT: 480, FLOAT_WIDTH: 1200,
PLUGIN_PADDING: 0, PLUGIN_MARGIN: 0,
IFRAME_HEIGHT: 420,
HEADER_HEIGHT: 48, ACTION_HEIGHT: 32, STATUS_HEIGHT: 32,
QRCODE_HEIGHT: 363, QRCODE_WIDTH: 360,
CARD_HEIGHT: 160, CARD_WIDTH: 280,
STORY_HEIGHT: 480,
PLUG_HEIGHT: 480, PLUG_WIDTH: 800,
DESKTOP_HEIGHT: 684, DESKTOP_WIDTH: 1200,
DESKTOP_MENU_HEIGHT: 25,
ACTION_BUTTON: 3, TABLE_BUTTON: 5, CARD_BUTTON: 5,
RIVER_MARGIN: 80, ACTION_MARGIN: 200,
ORDER_SHOW_LIMIT: 30, ORDER_SHOW_DELAY: 150,
CODE_FONT_SIZE: 14, CODE_LINE_HEIGHT: 20,
},
STORY: "story",
FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
OPTION_ARGS: "select.args,input.args,textarea.args", INPUT_ARGS: "input.args,textarea.args", INPUT_BUTTON: "input[type=button]", INPUT_FILE: "input[type=file]",
FORM_OPTION: "form.option", DIV_ACTION: "div.action", DIV_OUTPUT: "div.output", DIV_STATUS: "div.status",
FIELDSET_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot", FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main",
FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story", FIELDSET_PLUG: "fieldset.plug",
FIELDSET_FLOAT: "fieldset.float", FIELDSET_INPUT: "fieldset.input",
FIELDSET_OUTPUT: "fieldset.output",
H1: "h1", H2: "h2", H3: "h3", UL: "ul", OL: "ol", LI: "li", BR: "br", HR: "hr",
A: "a", SPAN: "span", CODE: "code", DIV: "div",
SVG: "svg", IMG: "img", IMAGE: "image", VIDEO: "video", AUDIO: "audio", CANVAS: "canvas", IFRAME: "iframe",
WSS: "wss", WEBVIEW: "webview", CHROME: "chrome", MOBILE: "mobile", LANDSCAPE: "landscape",
WSS: "wss", WEBVIEW: "webview", CHROME: "chrome", WINDOWS: "windows", MOBILE: "mobile", LANDSCAPE: "landscape",
BODY: "body", FORM: "form", LABEL: "label", TITLE: "title", INNER: "inner", SPACE: "space", CLICK: "click",
SELECT: "select", INPUT: "input", TEXT: "text", FILE: "file", TEXTAREA: "textarea", BUTTON: "button", CHECKBOX: "checkbox",
SELECT: "select", INPUT: "input", TEXT: "text", FILE: "file", TEXTAREA: "textarea", BUTTON: "button", CHECKBOX: "checkbox", MULTIPLE: "multiple",
CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", USERNAME: "username", PASSWORD: "password",
CONFIRM: "confirm",
CONFIRM: "confirm", CLOSE: "close", CLICK: "click", FOCUS: "focus", BLUR: "blur",
TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td",
HEADER: "header", NAV: "nav", MAIN: "main", ASIDE: "aside", FOOTER: "footer",
NEED: "need", MUST: "must",
TAIL: "tail",
FAVICON: "favicon",
BACKGROUND_COLOR: "background-color", COLOR: "color",
PADDING: "padding", BORDER: "border", MARGIN: "margin", MARGIN_TOP: "margin-top", MARGIN_X: "margin-x", MARGIN_Y: "margin-y",
HEIGHT: "height", WIDTH: "width", MIN_HEIGHT: "min-height", MAX_HEIGHT: "max-height", MIN_WIDTH: "min-width", MAX_WIDTH: "max-width",
@ -349,89 +411,141 @@ var html = {value: {
VISIBILITY: "visibility", TRANSPARENT: "transparent",
NOTICE: "notice", DANGER: "danger", PICKER: "picker",
CURSOR: "cursor", POINTER: "pointer", CROSSHAIR: "crosshair", MOVE: "move", RESIZE: "resize",
SIZE: "size", OPACITY: "opacity", VISIBLE: "visible",
CLASS: "class", DARK: "dark", LIGHT: "light", WHITE: "white", BLACK: "black",
FILTER: "filter", TOGGLE: "toggle", EXPAND: "expand", SPEED: "speed", HOVER: "hover", HOVER_SELECT: "hover,select",
ICONS: "icons",
FULL: "full",
ICON: "icon",
VALUE: "value",
PROCESS: "process",
TOIMAGE: "toimage", NOT_HIDE: ":not(.hide)",
CONTAINER: "container", FLEX: "flex", FLOW: "flow",
MORE: "more",
PAGE: "page", TABS: "tabs", MENU: "menu", NODE: "node", PLUG: "plug",
ZONE: "zone", LIST: "list", ITEM: "item", NAME: "name", ICON: "icon", VIEW: "view",
HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot", AUTO: "auto", SHOW: "show", HIDE: "hide",
PLUGIN: "plugin", LAYOUT: "layout", PROJECT: "project", DISPLAY: "display", PROFILE: "profile", CONTENT: "content",
PLUGIN: "plugin", LAYOUT: "layout", PROJECT: "project", DISPLAY: "display", PROFILE: "profile", CONTENT: "content", TABVIEW: "tabview",
DIV_PAGE: "div.page", DIV_TABS: "div.tabs", DIV_PATH: "div.path", DIV_CODE: "div.code", DIV_PLUG: "div.plug",
DIV_ZONE: "div.zone", DIV_LIST: "div.list", DIV_ITEM: "div.item", DIV_NAME: "div.name", SPAN_ITEM: "span.item", SPAN_ICON: "span.icon", SPAN_NAME: "span.name",
DIV_CONTENT: "div.content", TABLE_CONTENT: "table.content", TABLE_LAYOUT: "table.layout", DIV_TOGGLE: "div.toggle",
DIV_LAYOUT: "div.layout", DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left",
DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte",
DESKTOP: "desktop", DIV_DESKTOP: "div.desktop", DIV_EXPAND: "div.expand",
ITEM_CARD: "item.card",
DIV_ITEM_TEXT: "div.item.text",
DIV_ITEM_SELECT: "div.item.select",
DIV_TABS_SELECT: "div.tabs.select",
DIV_PROFILE: "div.profile", DIV_DISPLAY: "div.display",
IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm",
BACKGROUND_JPG: "usr/icons/background.jpg",
BACKGROUND_PNG: "usr/icons/background.png",
AVATAR_JPG: "usr/icons/avatar.jpg",
}
var icon = {
CHEVRON_DOWN: "bi bi-chevron-down", SEARCH: "bi bi-search", TERMINAL: "bi bi-terminal",
SUN: "bi bi-sun", MOON: "bi bi-moon-stars",
search: "bi bi-search", favor: "bi bi-star",
CHEVRON_DOWN: "bi bi-chevron-down", SEARCH: "bi bi-search", TERMINAL: "bi bi-terminal", SUN: "bi bi-sun", MOON: "bi bi-moon-stars",
portal: "bi bi-globe", desktop: "bi bi-window-desktop", admin: "bi bi-window-sidebar",
dream: "bi bi-box", space: "bi bi-box", store: "bi bi-shop",
word: "bi bi-book", repos: "bi bi-git", vimer: "bi bi-bug", build: "bi bi-tools", xterm: "bi bi-terminal", shell: "bi bi-terminal",
stats: "bi bi-card-list",
matrix: "bi bi-grid-3x3-gap",
feel: "bi bi-images",
plan: "bi bi-calendar4-week",
status: "bi bi-git",
access: "bi bi-file-earmark-lock",
sso: "bi bi-shield-check", login: "bi bi-person-check", token: "bi bi-key",
username: "bi bi-person-gear", nodename: "bi bi-globe",
password: "bi bi-shield-lock",
database: "bi bi-database",
table: "bi bi-table",
domain: "bi bi-globe",
origin: "bi bi-globe",
server: "bi bi-globe",
vendor: "bi bi-shop",
full: "bi bi-arrows-fullscreen", open: "bi bi-box-arrow-up-right",
more: "bi bi-three-dots-vertical", actions: "bi bi-three-dots",
preview: "bi bi-window-stack", show: "bi bi-window-stack",
display: "bi bi-window-desktop", exec: "bi bi-window-desktop",
full: "bi bi-arrows-fullscreen", open: "bi bi-box-arrow-up-right", qrcode: "bi bi-qr-code",
chat: "bi bi-chat-dots", help: "bi bi-question-square", doc: "bi bi-question-square",
modify: "bi bi-pencil-square", remove: "bi bi-trash",
search: "bi bi-search", favor: "bi bi-star",
plugs: "bi bi-tools",
tools: "bi bi-grid",
key: "bi bi-hash", hash: "bi bi-hash", zone: "bi bi-diagram-3", id: "bi bi-sort-numeric-down",
modify: "bi bi-pencil-square",
rename: "bi bi-pencil-square",
remove: "bi bi-trash",
detail: "bi bi-file-earmark-text",
enable: "bi bi-toggle-off", disable: "bi bi-toggle-on",
expire: "bi bi-clock-history",
name: "bi bi-sort-alpha-down",
time: "bi bi-clock-history",
size: "bi bi-calculator",
sess: "bi bi-telephone-forward",
path: "bi bi-folder2", file: "bi bi-file-earmark-text", line: "bi bi-sort-numeric-down",
start: "bi bi-play-circle", stop: "bi bi-stop-circle",
sso: "bi bi-shield-check", login: "bi bi-person-check",
load: "bi bi-folder-plus", save: "bi bi-floppy",
trash: "bi bi-trash",
copy: "bi bi-copy",
pull: "bi bi-cloud-download", push: "bi bi-cloud-upload",
upload: "bi bi-box-arrow-in-up", download: "bi bi-box-arrow-down",
record1: "bi bi-images", record2: "bi bi-record-circle", record: "bi bi-record-circle",
"export": "bi bi-box-arrow-up", "import": "bi bi-box-arrow-in-down",
"begin_time": "bi bi-clock-history",
"end_time": "bi bi-clock-history",
"import": "bi bi-folder-plus", "export": "bi bi-floppy",
"begin_time": "bi bi-clock-history", "end_time": "bi bi-clock-history",
// scale: "bi bi-arrows-fullscreen",
pie: "bi bi-pie-chart",
tags: "bi bi-tags",
version: "bi bi-tags",
compile: "bi bi-tools",
publish: "bi bi-send-check",
upgrade: "bi bi-rocket-takeoff",
install: "bi bi-box-arrow-in-down",
install: "bi bi-cloud-download",
runtime: "bi bi-info-square",
inspect: "bi bi-info-square",
info: "bi bi-info-square",
template: "bi bi-file-earmark-medical",
reboot: "bi bi-bootstrap-reboot",
restart: "bi bi-bootstrap-reboot",
binary: "bi bi-disc",
name: "bi bi-textarea-t",
word: "bi bi-book",
repos: "bi bi-git",
vimer: "bi bi-file-earmark-code",
build: "bi bi-tools",
xterm: "bi bi-terminal",
cmds: "bi bi-terminal",
tag: "bi bi-tags",
path: "bi bi-folder2", file: "bi bi-file-earmark-text", line: "bi bi-sort-numeric-down",
key: "bi bi-hash", hash: "bi bi-hash", zone: "bi bi-diagram-3", id: "bi bi-sort-numeric-down",
branch: "bi bi-diagram-3", commit: "bi bi-hash", message: "bi bi-info-square",
domain: "bi bi-globe", "client.name": "bi bi-globe",
machine: "bi bi-pc-display", port: "bi bi-hash",
images: "bi bi-disc",
qrcode: "bi bi-qr-code",
main: "bi bi-house-door", top: "bi bi-globe",
configs: "bi bi-gear", config: "bi bi-gear", conf: "bi bi-gear", logs: "bi bi-calendar4-week", tag: "bi bi-tags",
data: "bi bi-database",
branch: "bi bi-diagram-3", commit: "bi bi-hash",
message: "bi bi-wechat",
address: "bi bi-pin-map",
plugin: "bi bi-window-stack",
preview: "bi bi-window-stack", show: "bi bi-window-stack",
display: "bi bi-window-desktop", exec: "bi bi-window-desktop",
chat: "bi bi-chat-dots", help: "bi bi-question-square", doc: "bi bi-question-square",
record: "bi bi-record-circle", record1: "bi bi-images", record2: "bi bi-record-circle",
"client.name": "bi bi-globe",
machine: "bi bi-pc-display",
host: "bi bi-pc-display",
port: "bi bi-hash",
arch: "bi bi-cpu", os: "bi bi-ubuntu",
cpu: "bi bi-cpu",
role: "bi bi-person-square",
username: "bi bi-person-gear",
portal: "bi bi-globe",
desktop: "bi bi-window-desktop", admin: "bi bi-window-sidebar", dream: "bi bi-grid-3x3-gap", space: "bi bi-grid-3x3-gap",
configs: "bi bi-gear", config: "bi bi-gear", conf: "bi bi-gear", logs: "bi bi-calendar4-week",
save: "bi bi-floppy", trash: "bi bi-trash",
title: "bi bi-textarea-t",
type: "bi bi-card-list",
scan: "bi bi-card-list",
send: "bi bi-send-check",
cmds: "bi bi-terminal",
localCreate: "bi bi-cloud-download",
notifications: "bi bi-chat-right-text",
play: "bi bi-play-circle", app: "bi bi-box-arrow-down-left",
main: "bi bi-box-arrow-up-right",
play: "bi bi-play-circle",
app: "bi bi-box-arrow-down-left",
dev: "bi bi-git",
"Close": "bi bi-x-lg",
"Close Other": "bi bi-x-lg",
"Rename Tabs": "bi bi-pencil-square",
}
var svg = {
GROUP: "group", PID: "pid", GRID: "grid",
@ -445,10 +559,12 @@ var svg = {
TEXT_LENGTH: "textLength",
}
try { module.exports = {
kit, ice,
ctx, mdb, web, aaa,
lex, yac, ssh, gdb,
tcp, nfs, cli, log,
code, wiki, chat, team, mall,
http, html, icon, svg
} } catch {}
kit: kit, ice: ice,
ctx: ctx, mdb: mdb, web: web, aaa: aaa,
lex: lex, yac: lex, ssh: ssh, gdb: gdb,
tcp: tcp, nfs: nfs, cli: cli, log: log,
code: code, wiki: wiki, chat: chat, team: team, mall: mall,
http: http, html: html, icon: icon, svg: svg
} } catch (e) {}
var UID = "uid"

958
frame.js

File diff suppressed because it is too large Load Diff

1003
index.css

File diff suppressed because it is too large Load Diff

View File

@ -34,10 +34,12 @@ Volcanos("base", {
} return true
} return to === from
},
Ext: function(path) { return path.split(nfs.PS).pop().split(nfs.PT).pop().toLowerCase() },
Ext: function(path) {
return (path||"").split("?")[0].split("#")[0].split("/").pop().split(".").pop().toLowerCase()
},
Dir: function(path) { return path.endsWith(nfs.PS)? path: path.slice(0, path.lastIndexOf(nfs.PS)+1) },
Path: function(path) { var res = "", arg = arguments; for (var i = 0; i < arg.length; i++) { if (!arg[i]) { continue }
res += (arg[i][0]==nfs.PS || res=="" || res[res.length-1]==nfs.PS? "": nfs.PS) + arg[i].trim()
} return res },
@ -58,19 +60,19 @@ Volcanos("base", {
if (str.indexOf(ice.HTTP) == 0) { var res = this._parse(str, {type: web.LINK, name: "", text: str}); return res.name = res._origin.split("://").pop().split(nfs.PS)[0], res }
try { res = JSON.parse(str), res.text = res.text||str, res.type = res.type||nfs.JSON } catch (e) { res = {type: mdb.TEXT, text: str} } return res
},
ParseSize: function(size) { size = size.toLowerCase().split(" ")[0]
ParseSize: function(size) { size = (size||"").toLowerCase().split(" ")[0]
if (size.endsWith("tb") || size.endsWith("t")) { return parseFloat(size) * this._unit.t }
if (size.endsWith("gb") || size.endsWith("g") || size.endsWith("gib")) { return parseFloat(size) * this._unit.g }
if (size.endsWith("mb") || size.endsWith("m") || size.endsWith("mib")) { return parseFloat(size) * this._unit.m }
if (size.endsWith("kb") || size.endsWith("k")) { return parseFloat(size) * this._unit.k }
return parseFloat(size)
}, _unit: {k: 1024, m: 1024*1024, g: 1024*1024*1024, t: 1024*1024*1024*1024},
Size: function(size) { size = parseInt(size); var n = 100, k = this._unit.k, m = this._unit.m, g = this._unit.g, t = this._unit.t
if (size > t) { return parseInt(size/t) + nfs.PT + parseInt(size/g%k*n/k) + "T" }
if (size > g) { return parseInt(size/g) + nfs.PT + parseInt(size/m%k*n/k) + "G" }
if (size > m) { return parseInt(size/m) + nfs.PT + parseInt(size/k%k*n/k) + "M" }
if (size > k) { return parseInt(size/k) + nfs.PT + parseInt(size%k*n/k) + "K" }
return size + "B"
Size: function(size) { var n = 100, k = this._unit.k, m = this._unit.m, g = this._unit.g, t = this._unit.t
if (size > t) { return parseFloat(size/t).toFixed(2)+"T" }
if (size > g) { return parseFloat(size/g).toFixed(2)+"G" }
if (size > m) { return parseFloat(size/m).toFixed(2)+"M" }
if (size > k) { return parseFloat(size/k).toFixed(2)+"K" }
return size
},
Number: function(d, n) { var res = []
while (d > 0) { res.push(d%10); d = parseInt(d/10); n-- } while (n > 0) { res.push("0"); n-- }
@ -79,7 +81,7 @@ Volcanos("base", {
Format: function(obj) { return JSON.stringify(obj) },
Simple: function() { var res = []; for (var i = 0; i < arguments.length; i++) { var val = arguments[i]; switch (typeof val) {
case code.OBJECT: if (val.length > 0) { res = res.concat(val); break }
for (var k in val) { k && val[k] && res.push(k, val[k]) } break
for (var k in val) { k && val[k] && res.push(k, val[k]) } break
default: res.push(val)
} } return res },
AddUniq: function(list, value) { list = list||[], list.indexOf(value) == -1 && list.push(value); return list },
@ -88,15 +90,19 @@ Volcanos("base", {
if (item == arg[i]) { return true }
} },
TimeTrim: function(value) { var prefix = ""
if (!value) { return }
var now = new Date(), year = now.getFullYear()+"-", pre = this.Time(now, "%y-%m-%d ")
if (value.indexOf(pre) == -1) { var list = ["昨天", "前天", "", "", "", "", ""]
for (var i = 0; i < list.length; i++) {
var yestoday = this.Time(new Date(now - (i+1)*24*60*60*1000), "%y-%m-%d ")
if (value.indexOf(yestoday) == 0) {
prefix = (list[i] || ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"][new Date(value).getDay()])+" ", pre = yestoday; break
prefix = (list[i] || ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"][new Date(value.replaceAll("-", "/").split(".")[0]).getDay()])+" ", pre = yestoday; break
}
}
}
if (value.indexOf(year) == -1) {
return value.split(" ")[0]
}
return prefix+this.trimPrefix(value.split(":").slice(0, 2).join(":"), pre, year)
},
Time: function(time, fmt) { var now = this.Date(time)
@ -164,8 +170,9 @@ Volcanos("base", {
if (arg.length > 2) { for (var i = 1; i < arg.length; i++) { str = callee(str, arg[i]) } return str }
if (str.indexOf(pre) == -1) { return str } return str.slice(pre.length)
},
trimSuffix: function(str, end) { while (str) { var index = str.lastIndexOf(end)
trimSuffix: function(str, end, once) { while (str) { var index = str.lastIndexOf(end)
if (index == -1 || index+end.length != str.length) { break } str = str.slice(0, index)
if (once) { break }
} return str },
trim: function(arg) { if (this.isString(arg)) { return arg.trim() }
if (this.isArray(arg)) { for (var i = arg.length-1; i >= 0; i--) { if (!arg[i]) { arg.pop() } else { break } } } return arg

View File

@ -4,7 +4,7 @@ Volcanos("core", {
},
Keys: function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; switch (typeof v) {
case code.OBJECT: for (var j = 0; j < v.length; j++) { list.push(v[j]) } break
case code.OBJECT: for (var j = 0; j < v.length; j++) { v[j] && list.push(v[j]) } break
case code.NUMBER: list.push(v+""); break
case code.FUNCTION: v = v()
default: v && list.push(v+"")
@ -23,7 +23,7 @@ Volcanos("core", {
}
}
}
var node = data, keys = key.split(nfs.PT); while (node && keys.length > 0) {
var node = data, keys = key.split(nfs.PT); while (node && keys.length > 0) { if (typeof node == "string") { return }
if (keys[0] == "-1") { keys[0] = node.length-1 } node = node[keys[0]], keys = keys.slice(1)
} return node == undefined? data[key]: node
},
@ -61,9 +61,9 @@ Volcanos("core", {
case "*": res["need"] = "must", i--; break
case nfs.DF: res[mdb.TYPE] = ls[i+1]; break
case mdb.EQ:
if (res[mdb.TYPE] == html.SELECT) { res.values = this.Split(ls[i+1]); for (var j = 1; j < res.values.length; j++) {
if (res.values[0] == "" || res.values[0] == res.values[j]) { res.value = res.values[0], res.values = res.values.slice(1); break }
} } else { res.value = ls[i+1] } break
if (res[mdb.TYPE] == html.SELECT) { res.values = this.Split(ls[i+1]); for (var j = 1; j < res.values.length; j++) {
if (res.values[0] == "" || res.values[0] == res.values[j]) { res.value = res.values[0], res.values = res.values.slice(1); break }
} } else { res.value = ls[i+1] } break
case ice.AT: res[ctx.ACTION] = ls[i+1]; break
} } return res
} },
@ -92,13 +92,13 @@ Volcanos("core", {
Next: function(list, cb, cbs, data) {
switch (typeof list) {
case code.OBJECT:
if (list == null) { list = []; break } if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break
if (list == null) { list = []; break } if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break
default: if (list == undefined) { list = []; break } list = [list]
}
function next(i) {
data = (i < list.length?
typeof cb == code.FUNCTION && cb(list[i], function(_data) { data = _data||data, next(i+1) }, i, list, data):
typeof cbs == code.FUNCTION && cbs(list))||data
typeof cbs == code.FUNCTION && cbs(list))||data
}
return next(0), list
},
@ -140,7 +140,7 @@ Volcanos("core", {
Timer: shy("定时器, value, [1,2,3,4], {delay, interval, length}", function(interval, cb, cbs) { var timer = {stop: false}
if (interval == "0") { return cb && cb(), cbs && cbs() }
function loop(i) { timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)?
typeof cbs == code.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
typeof cbs == code.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
} interval = typeof interval == code.OBJECT? interval: [interval]; if (interval.interval == 0) { return cb(), timer }
var delay = interval.delay||interval.interval/2||interval[0]
return typeof cb == code.FUNCTION && (timer._timer = setTimeout(function() { loop(0) }, delay)), timer

View File

@ -37,7 +37,7 @@ Volcanos("date", {
lunarFestival: getFestival(this.lfestival, month, day), Festival: getFestival(this.festival, m, d),
}
res.autoDay = res.lunarFestival||res.Festival||term||(day==1? this.toChinaMonth(month): this.toChinaDay(day))
res.autoClass = "lunar"+(res.lunarFestival||res.Festival? " fest":"")+(term? " term": "")
res.autoClass = "lunar"+(res.lunarFestival||res.Festival? " fest":"")+(term? " term": "")
return res
},
// 天干表 ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
@ -80,7 +80,7 @@ Volcanos("date", {
'1-1': {title: '元旦节'},
'12-24': {title: '平安夜'},
'12-25': {title: '圣诞节'},
'2-14': {title: '情人节'},
'3-8': {title: '妇女节'},
'4-1': {title: '愚人节'},
@ -88,7 +88,7 @@ Volcanos("date", {
'5-4': {title: '青年节'},
'6-1': {title: '儿童节'},
'9-10': {title: '教师节'},
'7-1': {title: '建党节'},
'8-1': {title: '建军节'},
'10-1': {title: '国庆节'},
@ -151,27 +151,27 @@ Volcanos("date", {
_info[0].substr(1,2),
_info[0].substr(3,1),
_info[0].substr(4,2),
_info[1].substr(0,1),
_info[1].substr(1,2),
_info[1].substr(3,1),
_info[1].substr(4,2),
_info[2].substr(0,1),
_info[2].substr(1,2),
_info[2].substr(3,1),
_info[2].substr(4,2),
_info[3].substr(0,1),
_info[3].substr(1,2),
_info[3].substr(3,1),
_info[3].substr(4,2),
_info[4].substr(0,1),
_info[4].substr(1,2),
_info[4].substr(3,1),
_info[4].substr(4,2),
_info[5].substr(0,1),
_info[5].substr(1,2),
_info[5].substr(3,1),
@ -247,7 +247,7 @@ Volcanos("date", {
'665f67f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721',
'7f0e36665b66a449801e9808297c35','665f67f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721','7f0e26665b66a449801e9808297c35','665f67f0e37f1489801eb072297c35',
'7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'],
'7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'],
})
Volcanos("page", {trans: function(can, text) {
return can.base.replaceAll(text, "&", "&amp;", "<", "&lt;", ">", "&gt;")

View File

@ -24,14 +24,27 @@ Volcanos("misc", {
OptionStatus: function() { return msg.Option(ice.MSG_STATUS) },
StatusTimeCount: function(obj) { msg.append && msg.Status(can.base.Copy(kit.Dict(mdb.TIME, can.base.Time(), mdb.COUNT, msg.Length()+"x"+msg.append.length), obj)) },
Status: function(obj) { return msg.Option(ice.MSG_STATUS, JSON.stringify(can.core.Item(obj, function(key, value) { return {name: key, value: value} }))) },
OptionDefault(key, val) { var arg = arguments; for (var i = 0; i < arg.length; i += 2) { msg.Option(arg[i]) || msg.Option(arg[i], arg[i+1]) } return msg.Option(key) },
OptionDefault: function(key, val) { var arg = arguments; for (var i = 0; i < arg.length; i += 2) { msg.Option(arg[i]) || msg.Option(arg[i], arg[i+1]) } return msg.Option(key) },
OptionSimple: function(key) { var arg = arguments, res = []
for (var i = 0; i < arg.length; i++) { res.push(arg[i], msg.Option(arg[i])) }
return res
},
Option: function(key, val) { if (key == undefined) { return msg.option || [] }
if (can.base.isObject(key)) { return can.core.Item(key, msg.Option) }
if (can.base.isObject(key)) { return can.core.Item(key, function(key, value) { msg.Option(key, value) }) }
if (val == undefined) { return can.base.isIn(key, msg.option) && msg[key] && msg[key][0] || "" }
return msg.option = can.base.AddUniq(msg.option, key), msg[key] = can.core.List(arguments).slice(1), val
},
Append: function(key, val) { if (key == undefined) { return msg.append || [] }
if (can.base.isObject(key)) { return can.core.Item(key, msg.Append) }
if (msg.IsDetail()) {
for (var i = 0; i < msg.key.length; i++) {
if (msg.key[i] == key) {
if (val != undefined) { msg.value[i] = val }
return msg.value[i]
}
}
return
}
if (val == undefined) { return can.base.isIn(key, msg.append) && msg[key] && msg[key][0] || "" }
return msg.append = can.base.AddUniq(msg.append, key), msg[key] = can.core.List(arguments).slice(1), val
},
@ -60,6 +73,28 @@ Volcanos("misc", {
res._option && (msg._option = res._option) && res._option.forEach(function(key) { res[key] && (msg[key] = res[key]) })
return msg
},
Sort: function(key, swap) { var n = msg.Length()
key = key||msg.append[0], swap = swap||function(i, j) { return msg[key][i] > msg[key][j] }
switch (swap) {
case "str": swap = function(i, j) { return msg[key][i] > msg[key][j] }; break
case "str_r": swap = function(i, j) { return msg[key][i] < msg[key][j] }; break
case "int": swap = function(i, j) { return can.base.ParseSize(msg[key][i]) > can.base.ParseSize(msg[key][j]) }; break
case "int_r": swap = function(i, j) { return can.base.ParseSize(msg[key][i]) < can.base.ParseSize(msg[key][j]) }; break
}
for (var i = 0; i < n-1; i++) {
for (var j = i+1; j < n; j++) { var _swap = swap(i, j)
if (_swap === true) {
can.core.List(msg.append, function(k) {
var temp = msg[k][i]; msg[k][i] = msg[k][j], msg[k][j] = temp
})
} else if (_swap === false) {
continue
} else {
}
}
}
},
Push: function(key, value, detail) {
if (can.base.isObject(key)) { can.core.List(value||msg.append||can.base.Obj(msg.Option(ice.MSG_FIELDS))||can.core.Item(key), function(item) {
detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""): msg.Push(item, key[item]||"")
@ -68,11 +103,24 @@ Volcanos("misc", {
msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key]||[]
msg[key].push(can.base.isString(value)||can.base.isFunc(value)? value: JSON.stringify(value)); return msg
},
PushAction: function(button) { can.core.List(msg.Length(), function() {
msg.Push(ctx.ACTION, can.page.Format(html.INPUT, "", mdb.TYPE, html.BUTTON, mdb.NAME, button, mdb.VALUE, can.user.trans(can, button)))
}); return msg },
PushButton: function(button) { var args = can.core.List(arguments)
msg.Push(ctx.ACTION, can.core.List(args, function(button) {
return can.page.Format(html.INPUT, "", mdb.TYPE, html.BUTTON, mdb.NAME, button, mdb.VALUE, can.user.trans(can, button))
}).join("")); return msg
},
PushAction: function(button) { var args = can.core.List(arguments)
can.core.List(msg.Length(), function() {
msg.Push(ctx.ACTION, can.core.List(args, function(button) {
return can.page.Format(html.INPUT, "", mdb.TYPE, html.BUTTON, mdb.NAME, button, mdb.VALUE, can.user.trans(can, button))
}).join(""))
}); return msg
},
Echo: function(res) { msg.result = (msg.result||[]).concat(can.core.List(arguments)); return msg._hand = true, msg },
Dump: function(can) { can = can||msg._can; if (can.user.isNodejs) { return }
Dump: function(can, target) { can = can||msg._can; if (can.user.isNodejs) { return }
target = target||can._output
can.onmotion.clear(can, target), can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can)
},
Show: function(can) { can = can||msg._can; if (can.user.isNodejs) { return }
can.onmotion.clear(can), can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can)
},
Defer: function(cb) { msg._defer = msg._defer||[]
@ -82,18 +130,28 @@ Volcanos("misc", {
_caller: function(skip) { msg.Option("log.caller") || msg.Option("log.caller", can.misc.fileLine((skip||2)+3).link); return msg },
isDebug: function() { return msg.Option(log.DEBUG) == ice.TRUE },
}); return msg },
Inputs: function(can, msg, cmds, cb, meta) {
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) {
var msg = can.request(event, {action: cmds[1]})
Inputs: function(can, msg, cmds, cb, meta) { var event = msg._event
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { msg.Option(ctx.ACTION, cmds[1])
var action = meta.feature[cmds[1]]; if (can.base.isFunc(action)) { cb = cb||function() { can.Update() }
return action.list && action.list.length > 0? can.user.input(event, can, action.list, function(data) {
can.core.CallFunc(action, {can: can, msg: can.request(event, data), arg: cmds.slice(2), cb: cb})
}): can.core.CallFunc(action, {sup: meta.can, can: can, msg: can.request(event), arg: cmds.slice(2), cb: cb})
}
can.user.input(event, can, meta.feature[cmds[1]], function(args) { can.Update(can.request(event, {_handle: ice.TRUE}, msg, can.Option()), cmds.slice(0, 2).concat(args), cb) })
return true
}
return false
var input = can.user.input(event, can, meta.feature[cmds[1]], function(args) { msg.result = []
can.onmotion.delay(can, function() { can.page.ClassList.add(can, input._target, html.PROCESS) })
can.Update(can.request(event, can.Option(), {_handle: ice.TRUE, _cancel: function(event) {
can.page.ClassList.del(can, input._target, html.PROCESS)
}}, msg), cmds.slice(0, 2).concat(args), function(msg) { can.page.ClassList.del(can, input._target, html.PROCESS)
if (msg.IsErr()) { input.focus()
can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target)
} else {
if (cb && cb(msg)) { return }
input.cancel({}, can)
return true
}
}); return true
}); return true
} return false
},
ParseCmd: function(can, msg, cb, cbs) { var list = []
return msg.Table(function(field, order) {
@ -113,12 +171,12 @@ Volcanos("misc", {
input.values = input.values || can.core.Split(input.value)
}
if (can.base.isIn(input.type, html.TEXT, html.TEXTAREA)) {
input.placeholder = can.user.trans(can, input.placeholder||input.name, field, html.INPUT)
// input.placeholder = can.user.trans(can, input.placeholder||input.name, field, html.INPUT)
}
if (input.type == html.BUTTON) {
input.value = can.user.trans(can, input.value||input.name, field)
} else {
cbs(input, index, field, order)
cbs && cbs(input, index, field, order)
}
input.type == html.BUTTON && input.action == ice.AUTO && can.onmotion.delay(can, function() { cb(field, order) })
})
@ -139,10 +197,9 @@ Volcanos("misc", {
xhr.open(msg._method||http.POST, url), xhr.onreadystatechange = function() { if (xhr.readyState != 4) { return }
try { var res = JSON.parse(xhr.responseText) } catch (e) {
if (xhr.responseText.indexOf("warn: ")) { var res = {result: [xhr.responseText]} } else { var res = {result: [xhr.responseText]} }
} msg.Option("_cost", new Date() - begin)
if (xhr.status == 200) { return msg.detail || (msg.detail = res.detail), can.base.isFunc(cb) && cb(msg.Copy(res)) }
typeof msg._failure == code.FUNCTION && msg._failure()
can.user.toastFailure(msg._can||can, xhr.response), can.misc.Warn(xhr.status, res, url, form), cbs && cbs(xhr)
} msg.Option("_cost", new Date() - begin), msg.detail || (msg.detail = res.detail), msg.Copy(res)
if (xhr.status == 200) { return can.base.isFunc(cb) && cb(msg) } typeof msg._failure == code.FUNCTION && msg._failure()
can.user.toastFailure(msg._can||can, msg.Result(), msg.Option(ice.MSG_TITLE)), can.misc.Warn(xhr.status, res, url, form), cbs && cbs(xhr)
}, xhr.setRequestHeader(http.Accept, msg._accept||http.ApplicationJSON)
if (msg._upload) { var data = new FormData(); can.core.ItemForm(form, function(v, i, k) { data.append(k, v) })
data.append(ice.MSG_UPLOAD, web.UPLOAD), data.append(web.UPLOAD, msg._upload)
@ -157,7 +214,7 @@ Volcanos("misc", {
args.text = location.pathname+location.search, args.module = "shylinux.com/x/volcanos", args.version = can.base.trimPrefix(window._version, "?_v=")
var msg = can.request(); can.page.exportValue(can, msg), can.core.List(msg.Option(), function(value) { args[value] = msg.Option(value) })
var url = location.protocol.replace(ice.HTTP, "ws")+"//"+location.host+"/space/"; if (url.indexOf(html.CHROME) == 0) { url = "ws://localhost:9020/space/" }
try { var socket = new WebSocket(can.base.MergeURL(url, args)); _msg = _msg || can.request()._caller() } catch {}
try { var socket = new WebSocket(can.base.MergeURL(url, args)); _msg = _msg || can.request()._caller() } catch (e) {}
can._socket = socket, socket.onclose = function() { can.misc.Log(html.WSS, cli.CLOSE, args); if (socket._close) { return }
can.base.isFunc(onclose)? onclose(socket): can.core.Timer(can.base.random(3000, 300), function() {
args.name = args.name||can._wss_name, can.misc.WSS(can, args, cb, onopen, onerror, onclose, _msg)
@ -168,41 +225,55 @@ Volcanos("misc", {
can.base.isFunc(onopen) && onopen(socket)
}, socket.onmessage = function(event) { can.misc.Event(event, can, function(msg) {
try { var data = JSON.parse(event.data) } catch (e) { var data = {detail: [event.data]} }
msg.Reply = function() { var res = can.request({}, {_handle: ice.TRUE})
msg.Reply = function() { if (msg.Option("space.noecho") == ice.TRUE) { return }
var res = can.request({}, {_handle: ice.TRUE})
res._target = (msg[ice.MSG_SOURCE]||[]).reverse(), res._source = (msg[ice.MSG_TARGET]||[]).reverse().slice(1)||[]
res.append = msg.append, can.core.List(msg.append, function(key) { res[key] = msg[key] }), res.result = (msg.result||[]).concat(can.core.List(arguments))
res.Option(ice.LOG_DISABLE, msg.Option(ice.LOG_DISABLE)) != ice.TRUE && can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result&&msg.result.length>0? msg.result: undefined, msg, _msg)
res.Option(ice.LOG_TRACEID, msg.Option(ice.LOG_TRACEID))
res.Option(ice.MSG_DEBUG, msg.Option(ice.MSG_DEBUG))
socket.send(JSON.stringify(res))
}, msg.detail = data.detail||[], msg.Copy(data)
msg.Option("space.noecho", ice.TRUE)
}, msg.detail = data.detail||[], msg.Copy(data), msg[ice.MSG_TARGET] = data[ice.MSG_TARGET]||[]
try { msg.Option(ice.LOG_DISABLE) != ice.TRUE && can.misc.Log(html.WSS, ice.MSG_DETAIL, msg.detail, msg, _msg)
can.core.CallFunc(cb, {event: event, msg: msg, cmd: msg.detail[0], arg: msg.detail.slice(1), cb: function() { msg.Reply() }})
} catch (e) { can.misc.Warn(e), msg.Reply() }
}) }
return socket
},
ResourceFavicon(can) { return can.misc.Resource(can, nfs.SRC_MAIN_ICO) },
Resource(can, path, space) {
if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path }
return can.base.MergeURL(nfs.REQUIRE+path+_version, ice.POD, space||can.ConfSpace()||can.misc.Search(can, ice.POD))
ResourceFavicon: function(can, path, space) { return can.misc.Resource(can, path||can.user.info.favicon||nfs.SRC_MAIN_ICO, space) },
ResourceIcons: function(can, path, space, serve) {
if (!path) {
if (can.user.info.nodetype == web.WORKER) {
return can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename)
}
}
return can.misc.Resource(can, path||(can.page.isDark(can)? "usr/icons/volcanos.png": "usr/icons/icebergs.png"), space, serve)
},
ShareLocal(can, path, space) { if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path }
Resource: function(can, path, space, serve) { if (!path) { return "" }
if (!can.base.beginWith(path, web.HTTP, nfs.PS)) { path = nfs.P+path+(path.indexOf("usr/icons/") == -1? (space? can.core.Split(_version, "&")[0]: _version): "") }
if (!can.base.beginWith(path, web.HTTP)) { if (serve && serve.indexOf(location.origin) == -1) { var u = can.base.ParseURL(serve); path = u.origin + path } }
if (!space && !can.base.beginWith(path, web.HTTP)) { return location.origin+path }
if (!space && path.indexOf("pod=") > 0) { return path }
if (can.base.beginWith(path, "/") && path.indexOf("pod=") > 0) { return path }
return can.base.MergeURL(path, ice.POD, space||can.ConfSpace()||can.misc.Search(can, ice.POD))
},
ShareLocal: function(can, path, space) { if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path }
return can.base.MergeURL(nfs.SHARE_LOCAL+path+_version, ice.POD, space||can.ConfSpace())
},
ShareCache(can, path, space) { if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path }
return can.base.MergeURL(nfs.SHARE_CACHE+path+_version, ice.POD, space||can.ConfSpace())
ShareCache: function(can, path, space) { if (can.base.beginWith(path, web.HTTP, nfs.PS)) { return path }
return can.base.MergeURL(nfs.SHARE_CACHE+path+_version, ice.POD, space||can.ConfSpace()||can.misc.Search(can, ice.POD))
},
Template(can, path, file) { return can.base.Path(nfs.SRC_TEMPLATE, can.ConfIndex(), path, file) },
Template: function(can, path, file) { return can.base.Path(nfs.SRC_TEMPLATE, can.ConfIndex(), path, file) },
MergePath: function(can, file, path) { return file.indexOf(nfs.PS) == 0 || file.indexOf(ice.HTTP) == 0? file: can.base.Path(path, file) },
MergeCache: function(can, hash, pod) { return can.base.MergeURL(can.misc.MergeURL(can, {_path: can.base.Path(web.SHARE_CACHE, hash)}, true), ice.POD, pod) },
MergeCache: function(can, hash, pod) { return can.base.MergeURL(can.misc.MergeURL(can, {_path: can.base.Path(web.SHARE_CACHE, hash)}, true), ice.POD, pod||can.ConfSpace()||can.misc.Search(can, ice.POD)) },
MergePodCmd: function(can, obj) {
if (can.base.beginWith(obj.pod, nfs.PS, web.HTTP)) {
if (location.search.indexOf("debug=true") > 0 && obj.pod.indexOf("debug=true") == -1) {
var ls = obj.pod.split("#"); ls[0] += (ls[0].indexOf("?") > 0? "&": "?") + "debug=true", obj.pod = ls.join("#")
} return obj.pod
}
obj.pod = obj.pod||can.misc.Search(can, ice.POD); return can.misc.MergeURL(can, obj, true)
obj.pod = obj.pod == undefined? can.misc.Search(can, ice.POD): obj.pod; return can.misc.MergeURL(can, obj, true)
},
MergeURL: function(can, obj, clear) { var path = location.pathname; obj._path && (path = obj._path), delete(obj._path)
can.misc.Search(can, log.DEBUG) && (obj.debug = ice.TRUE); var hash = obj._hash||""; delete(obj._hash)
@ -221,7 +292,9 @@ Volcanos("misc", {
return args
},
SplitPath: function(can, path) {
if (path.indexOf("http") == 0) { return [path] }
if (path.indexOf("/require/") == 0) { return [path] }
if (path.indexOf("/p/") == 0) { return [path] }
if (path.indexOf("/plugin/") == 0) { return ["usr/volcanos/", path.split("?")[0]] }
var ls = path.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] }
if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] }
@ -229,10 +302,13 @@ Volcanos("misc", {
},
PathJoin: function(dir, file, ext) { file = file||""
if (file.indexOf(nfs.PS) == 0 || file.indexOf(web.HTTP) == 0) { return file }
if (dir.indexOf(nfs.SRC) == 0 || dir.indexOf(nfs.USR) == 0) { dir = "/require/"+dir }
if (dir.indexOf(nfs.SRC) == 0 || dir.indexOf(nfs.USR) == 0) { dir = nfs.P+dir }
return dir+file+(ext? nfs.PT+ext: "")
},
isDebug: function(can) { return can.misc.Search(can, log.DEBUG) == ice.TRUE },
isImage: function(can, path) { return can.base.isIn(can.base.Ext(path), "png", "jpg", "jpeg") },
isVideo: function(can, path) { return can.base.isIn(can.base.Ext(path), "mp4", "m4v", "mov", "webm") },
isAudio: function(can, path) { return can.base.isIn(can.base.Ext(path), "mp3") },
Search: function(can, key, value) { var args = this.ParseURL(can, location.href)
if (can.base.isUndefined(key)) { return args } else if (can.base.isObject(key)) {
can.core.Item(key, function(k, v) { v === ""? delete(args[k]): (args[k] = v) })
@ -246,13 +322,18 @@ Volcanos("misc", {
},
SearchHash: function(can) { var hash = location.hash
if (arguments.length > 1) {
hash = can.core.List(arguments, function(item) { return can.base.replaceAll(item, ":", "%3A") }).slice(1).join(nfs.DF)
hash = can.core.List(arguments, function(item) {
if (can.base.isArray(item)) { return item.join(nfs.DF) }
return can.base.replaceAll(item, ":", "%3A")
}).slice(1).join(nfs.DF)
if (can.isCmdMode() || can._name == "River" || can._name == "Action") { location.hash = hash }
}
return can.core.List(can.core.Split(can.base.trimPrefix(location.hash, "#"), nfs.DF)||[], function(item) { return decodeURIComponent(item) })
},
SearchOrConf: function(can, key, def) { return can.misc.Search(can, key)||Volcanos.meta.args[key]||can.misc.sessionStorage(can, "can."+key)||can.misc.localStorage(can, "can."+key)||can.Conf(key)||def },
CookieSessid: function(can, value, path) { return can.misc.Cookie(can, ice.MSG_SESSID+"_"+(location.port||(location.protocol == "https:"? "443": "80")), value, path) },
CookieSessid: function(can, value, path) {
return can.misc.Cookie(can, ice.MSG_SESSID+"_"+(location.port||(location.protocol == "https:"? "443": "80")), value, path)||can.misc.Cookie(can, ice.MSG_SESSID, value, path)
},
Cookie: function(can, key, value, path) {
function set(k, v) { var expires = new Date(); expires.setTime(expires.getTime() + 30*24*3600000)
document.cookie = k+mdb.EQ+v+";path="+(path||nfs.PS)+";expires="+expires.toGMTString()
@ -264,28 +345,24 @@ Volcanos("misc", {
} can.base.isUndefined(value) || set(key, value)
var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie); return val && val.length > 1? val[1]: ""
},
localStorage: function(can, key, value) {
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(localStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
if (!can.base.isUndefined(value)) { if (value === "") { return localStorage.removeItem(key) } localStorage.setItem(key, value) } return can.base.Obj(localStorage.getItem(key))
},
sessionStorage: function(can, key, value) {
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(sessionStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
if (can.base.isArray(key)) { key = key.join(":") }
if (!can.base.isUndefined(value)) {
if (value === "") { return sessionStorage.removeItem(key) } sessionStorage.setItem(key, value)
} return can.base.Obj(sessionStorage.getItem(key))
} return can.base.Obj(sessionStorage.getItem(key))||sessionStorage.getItem(key)
},
Log: function() {
var args = this._args("", arguments)
localStorage: function(can, key, value) {
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(localStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
if (!can.base.isUndefined(value)) { if (value === "") { return localStorage.removeItem(key) } localStorage.setItem(key, value) } return can.base.Obj(localStorage.getItem(key))
},
Log: function() { var args = this._args("", arguments)
if (arguments[0].indexOf && arguments[0].indexOf("on") == 0) { args[1] = this.FileLine((arguments[0] == "onremote"? 1: 1)+this._skip) }
for (var i in arguments) { var arg = arguments[i]; if (arg && arg.Option && arg.Option("log.caller")) { args[1] = arg.Option("log.caller") } }
console.log.apply(console, args), this._signal(args)
},
Info: function() { var args = this._args(log.INFO, arguments); console.info.apply(console, args), this._signal(args) },
Warn: function() {
var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args);
// debugger
},
Warn: function() { var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args); },
Error: function() { var args = this._args(log.ERROR, arguments); args.push(lex.NL, this._stacks().slice(1).join(lex.NL)), console.error.apply(console, args), this._signal(args); debugger },
Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(lex.NL, this._stacks().slice(1, 4).join(lex.NL)), console.debug.apply(console, args), this._signal(args) },
Trace: function() { var output = false
@ -306,7 +383,8 @@ Volcanos("misc", {
},
_stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(lex.NL).slice(typeof n == "undefined"? 2: n)
for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(lex.SP)
list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) }
list[i] = ls.pop().trim()
if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) } // ")"
list[i] = " "+list[i]; if (ls.length > 1) { list[i] += " "+ls.pop() }
list[i] = list[i].replace(/\?[^:]+/, "").replace(location.origin, "")
} return list

View File

@ -9,7 +9,7 @@ Volcanos("page", {
return target.className = can.core.List(list, function(value) { return value == key? undefined: value }).join(lex.SP).trim()
},
set: function(can, target, key, condition) {
return (condition? this.add(can, target, key): this.del(can, target, key)).indexOf(key) > -1 },
return (condition? this.add(can, target, key): this.del(can, target, key)).indexOf(key) > -1 },
neg: function(can, target, key) { return (this.has(can, target, key)? this.del(can, target, key): this.add(can, target, key)).indexOf(key) > -1 },
tag: function(can, target) { return [document.body.tagName.toLowerCase()].concat(document.body.classList).join(lex.PT) }
},
@ -55,67 +55,81 @@ Volcanos("page", {
case html.INNER: data.innerHTML = item.inner; break
default: can.base.isUndefined(item[key]) || (data[key] = item[key])
} })
if (item.view) { var list = can.core.List(item.view); if (can.base.isArray(list[0])) { list[0] = list[0].join(lex.SP) }
list[0] && can.page.ClassList.add(can, data, list[0]), type = list[1]||type, data.innerHTML = list[2]||data.innerHTML||"", name = list[3]||name
} else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) }
data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2])
} else if (item.icon) { var list = can.core.List(item.icon)
if (icon[item.icon]) {
type = "i", data.className = icon[item.icon]
} else if (can.page.unicode[list[0]]) {
type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]]
} else {
type = "i", data.className = list[0]
}
} else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name)
data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) }
} else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0]
data.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, event.target.value, name) }) }
item.list = list[0].slice(1).map(function(value) { return {type: html.OPTION, value: value, inner: can.user.trans(can, value)} })
} else if (item.input) { var list = can.core.List(item.input); type = html.INPUT, name = list[0], data.className = data.className||list[0], data.type = data.type||html.TEXT
data.onkeydown = function(event) { can.base.isFunc(list[1]) && list[1](event) }
data.onkeyup = function(event) { can.base.isFunc(list[2]) && list[2](event) }
} else if (item.username) { var list = can.core.List(item.username); type = html.INPUT, name = list[0]||name||html.USERNAME
// data.className = list[1]||data.className||name, data.autocomplete = data.autocomplete||html.USERNAME
data.className = list[1]||data.className||name
} else if (item.password) { var list = can.core.List(item.password); type = html.INPUT, name = list[0]||name||html.PASSWORD
// data.className = list[1]||data.className||name, data.type = html.PASSWORD, data.autocomplete = data.autocomplete||"current-password"
data.className = list[1]||data.className||name, data.type = html.PASSWORD
} else if (item.img) { var list = can.core.List(item.img); type = html.IMG, data.src = list[0]
} else if (item.row) { type = html.TR, item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
} else if (item.th) { type = html.TR, item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
} else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) }
// if (type == html.SELECT) { data.title = can.user.trans(can, data.title||name) }
if (type == html.INPUT) {
if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) { data.autocomplete = data.autocomplete||"off"
if (item.view) { var list = can.core.List(item.view); if (can.base.isArray(list[0])) {
list[0] = can.base.replaceAll(can.core.List(list[0], function(v) { return v }).join(lex.SP), ".", " ")
}
list[0] && can.page.ClassList.add(can, data, list[0]), type = list[1]||type, data.innerHTML = list[2]||data.innerHTML||"", name = list[3]||name
} else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) }
data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2])
} else if (item.icon) { var list = can.core.List(item.icon)
if (icon[item.icon]) {
type = "i", data.className = icon[item.icon]
} else if (can.page.unicode[list[0]]) {
type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]]
} else {
type = "i", data.className = list[0]
}
} else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name)
data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) }
} else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0]
data.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, event.target.value, name) }) }
item.list = list[0].slice(1).map(function(value) { return {type: html.OPTION, value: value, inner: can.user.trans(can, value)} })
} else if (item.input) { var list = can.core.List(item.input); type = html.INPUT, name = list[0], data.className = data.className||list[0], data.type = data.type||html.TEXT
data.onkeydown = function(event) { can.base.isFunc(list[1]) && list[1](event) }
data.onkeyup = function(event) { can.base.isFunc(list[2]) && list[2](event) }
} else if (item.username) { var list = can.core.List(item.username); type = html.INPUT, name = list[0]||name||html.USERNAME
// data.className = list[1]||data.className||name, data.autocomplete = data.autocomplete||html.USERNAME
data.className = list[1]||data.className||name
} else if (item.password) { var list = can.core.List(item.password); type = html.INPUT, name = list[0]||name||html.PASSWORD
// data.className = list[1]||data.className||name, data.type = html.PASSWORD, data.autocomplete = data.autocomplete||"current-password"
data.className = list[1]||data.className||name, data.type = html.PASSWORD
} else if (item.img) {
var list = can.core.List(item.img); type = html.IMG, data.src = list[0]
if (can.base.contains(data.src, ".jpg")) { data.className = data.className||"jpg" }
} else if (item.row) { type = html.TR, item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
} else if (item.th) { type = html.TR, item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
} else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) }
// if (type == html.SELECT) { data.title = can.user.trans(can, data.title||name) }
if (type == html.INPUT) {
if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) {
// data.autocomplete = data.autocomplete||"new-password"
if (!can.user.isMobile) {
data.placeholder = (data.placeholder||name||"").split(nfs.PT).pop(), data.title = can.user.trans(can, data.title||data.placeholder, null, html.INPUT)
} else if (data.type == html.BUTTON) {
// data.value = can.user.trans(can, data.value)
}
} if (type == html.TEXTAREA) { data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT) }
can.core.List(["className", "placeholder", "title"], function(key) { data[key] || delete(data[key]) })
name && (data.name = name); var node = can.page.Create(can, type, data)
value[type] = value[name] = value[can.core.Split(data.className)[0]] = node, value._target = value._target||node, value.first = value.first||node, value.last = node
item.list && can.page.Append(can, node, item.list, value), target && target.appendChild && target.appendChild(node), can.base.isFunc(item._init) && item._init(node, value)
}); return value
},
} else if (data.type == html.BUTTON) {
// data.value = can.user.trans(can, data.value)
}
}
if (type == html.TEXTAREA) {
if (!can.user.isMobile) {
data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT)
}
}
can.core.List(["className", "placeholder", "title"], function(key) { data[key] || delete(data[key]) })
name && (data.name = name); var node = can.page.Create(can, type, data)
value[data.type] = node
value[type] = value[name] = value[can.core.Split(data.className)[0]] = node, value._target = value._target||node, value.first = value.first||node, value.last = node
item.list && can.page.Append(can, node, item.list, value), target && target.appendChild && target.appendChild(node), can.base.isFunc(item._init) && item._init(node, value)
}); return value },
Appends: function(can, target, key, value) { return target.innerHTML = "", can.page.Append(can, target, key, value) },
AppendData: function(can, target, prefix, key, value, cb) { var open = can.page.unicode.opens, close = can.page.unicode.closes
function short(value, length) {
if (length == undefined) {
value.indexOf(lex.NL) > -1 && (value = value.trim().split(lex.NL)[0]+can.page.unicode.inner)
return can.page.trans(can, value)
} else { if (length > 5) {
return can.page.unicode.inner }
} else {
if (length > 5) {
return can.page.unicode.inner
}
} return value
}
function show(value, deep) { deep = deep == undefined? 2: 0; switch (typeof value) {
case code.OBJECT: if (!value) { return {} }
if (value._path) { return {value: "@\""+value._path+"\""} }
if (value.tagName) { return {type: nfs.TARGET, value: "$"+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} }
if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} }
if (value.length != undefined) { return {value: (value.length > 3? value.length+lex.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(mdb.FS)+"]"} }
return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && val && list.length < 7) { return short(key+nfs.DF+show(val, deep-1).value, list.length) } }).join(mdb.FS)+"}"}
if (value._path) { return {value: "@\""+value._path+"\""} }
if (value.tagName) { return {type: nfs.TARGET, value: "$"+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} }
if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} }
if (value.length != undefined) { return {value: (value.length > 3? value.length+lex.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(mdb.FS)+"]"} }
return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && val && list.length < 7) { return short(key+nfs.DF+show(val, deep-1).value, list.length) } }).join(mdb.FS)+"}"}
case code.STRING: return {open: "s", close: "s", value: "\""+(deep == 2? value.replaceAll("\n", "\\n"): short(value))+"\""}
case code.NUMBER: return {open: "n", close: "n", value: value}
case code.BOOLEAN: return {open: "b", close: "b", value: value}
@ -128,7 +142,7 @@ Volcanos("page", {
cb && cb(prefix, value); if (!can.base.isIn(typeof value, code.OBJECT, code.FUNCTION)) { return }
ui.icon.innerText = (can.onmotion.toggle(can, ui.list)? _show.open: _show.close)+lex.SP
if (typeof value == code.FUNCTION) { return ui.list.innerText = value.toString() }
if (loaded) { return } loaded = true, ui.icon.innerText = _show.open+lex.SP
if (value.tagName) { can.page.Append(can, ui.list, [can.page.AppendView(can, value)]), can.onappend.style(can, mdb.VIEW, ui.list)
can.core.List(can.core.Item(target, function(key, value) { if (["textContent", "innerHTML", "outerHTML"].indexOf(key) > -1 || typeof value == code.FUNCTION || key.toUpperCase() == key) { return } return key }).sort(), function(key) {
@ -139,7 +153,7 @@ Volcanos("page", {
} else {
can.core.List(can.core.Item(value, function(key, val) { if (
(value["preventDefault"] && val && typeof val != code.FUNCTION) || (value["responseText"] && val && typeof val != code.FUNCTION) ||
value.hasOwnProperty(key) && val) { return key } }).sort(), function(key) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb) })
value.hasOwnProperty(key) && val) { return key } }).sort(), function(key) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb) })
var key = "__proto__"; value[key] && can.core.Item(value[key]).length > 0 && can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb)
}
}}, {view: [[html.LIST, _show.type||typeof(value), html.HIDE]]}]); return ui
@ -180,17 +194,19 @@ Volcanos("page", {
AppendTable: function(can, msg, target, list, cb) { if (!msg.append||msg.append.length == 0) { return }
var ui = can.page.Append(can, target, [{type: html.TABLE, list: [
{type: "colgroup", list: can.core.List(list, function(key) { if (key[0] != "_") {
try { var value = can.Option(key) } catch {}
try { var value = can.Option(key) } catch (e) {}
if (value == undefined) { return {view: [key, "col"]} } return {view: [[key, "option"], "col"]}
} }) }, {type: html.THEAD}, {type: html.TBODY}]}])
} }) }, {type: html.THEAD}, {type: html.TBODY},
]}])
var option = can.core.Item(can.Option())
can.page.Append(can, ui.thead, [{type: html.TR, data: {dataset: {index: -1}}, list: can.core.List(list, function(key) {
if (key[0] != "_") {
return {type: html.TH, list: [{text: can.user.trans(can, key, null, html.INPUT)}, {icon: "bi bi-sort-down-alt"}, {icon: "bi bi-sort-up"}]}
}
if (key[0] != "_") { return {className: option.indexOf(key) > -1? ice.MSG_OPTION: key == ctx.ACTION? ctx.ACTION: "", type: html.TH, list: [{text: can.user.trans(can, key, null, html.INPUT)}, {icon: "bi bi-sort-down-alt"}, {icon: "bi bi-sort-up"}]} }
}) }])
can.page.Append(can, ui.tbody, can.core.List(msg.Table(), function(item, index, array) {
return {dataset: {index: index}, className: item[mdb.STATUS], td: can.core.List(list, function(key) { if (key[0] != "_") { return cb(can.page.Color(item[key]).trim(), key, index, item, array) } }) }
})); return can.page.OrderTable(can, ui._target)
}))
if (msg.Option(ice.TABLE_CHECKBOX) == ice.TRUE && !msg.IsDetail()) { can.onappend.checkbox(can, ui._target, msg), can.onappend.style(can, html.CHECKBOX, ui._target) }
return can.page.OrderTable(can, ui._target)
},
OrderTable: function(can, table) { can.page.Select(can, table, html.TH, function(th, index) { th.onclick = function(event) {
var dataset = event.currentTarget.dataset
@ -228,15 +244,46 @@ Volcanos("page", {
case html.A: return `<a href="${arg[1]}" target="_blank">${arg[2]||arg[1]}</a>`
case html.IMG: return arg[3]? `<img src="${arg[1]}" height="${arg[2]}" width=${arg[3]}>`: arg[2]? `<img src="${arg[1]}" height="${arg[2]}">`: `<img src="${arg[1]}">`
case html.SPAN: arg[2] && typeof arg[2] == code.OBJECT && arg[2].join && (arg[2] = arg[2].join(lex.SP))
return arg[2]? `<span class="${arg[2]}">${arg[1]}</span>`: arg[1]
return arg[2]? `<span class="${arg[2]}">${arg[1]}</span>`: arg[1]
default: /* type inner arg... */
var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) }
return list.concat(">", arg[1], "</", type, ">").join("")
var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) }
return list.concat(">", arg[1], "</", type, ">").join("")
} },
ColorList: [
"#8085e9",
"#95a2ff",
"#73abf5",
"#3cb9fc",
"#0082fc",
"#87e885",
"#90ed7d",
"#22ed7c",
"#05f8d6",
"#cb9bff",
"#bf19ff",
"#f47a75",
"#fa8080",
"#f7a35c",
"#ffc076",
"#f9e264",
"#fae768",
"#5f45ff",
"#02cdff",
"#0090ff",
"#854cff",
"#09b0d3",
"#1d27c9",
"#765005",
"#314976",
"#009db2",
"#024b51",
"#0780cf",
],
Color: function(text) { if (typeof text != code.STRING) { return "" } text = text.replace(/\\n/g, "<br>")
if (text.indexOf(ice.HTTP) == 0 && text.length > 10) { var ls = text.split(lex.SP); text = "<a href='"+ls[0]+"' target='_blank'>"+decodeURI(ls[0])+"</a>"+ls.slice(1).join(lex.SP) }
if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) { return "<div class='story' data-type='spark' data-name='shell'><div>"+"<span>"+text+"</span>"+"</div></div>" }
if (text.indexOf("\033\[") == -1) { return text }
if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) {
return "<div class='story' data-type='spark' data-name='shell'><div>"+"<span>"+text+"</span>"+"</div></div>"
} if (text.indexOf("\033\[") == -1) { return text }
text = text.replace(/\033\[41m/g, "<span style='background-color:#f00'>")
text = text.replace(/\033\[31m/g, "<span style='color:#f00'>")
text = text.replace(/\033\[32m/g, "<span style='color:#0f0'>")
@ -249,7 +296,7 @@ Volcanos("page", {
text = text.replace(/\033\[1m/g, "<span style='font-weight:bold'>")
text = text.replace(/\033\[0m/g, "</span>")
text = text.replace(/\033\[m/g, "</span>")
return text
return text // }
},
Keys: function() { var list = []; /* FS SP GT PT */ for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; if (typeof v == code.OBJECT) {
for (var j = 0; j < v.length; j++) { if (typeof v[j] == code.OBJECT) {
@ -270,7 +317,9 @@ Volcanos("page", {
if (can.page.tagis(target, tag)) { return target }
}
},
insertBefore: function(can, target, before, parent) { parent = parent||before.parentNode
insertBefore: function(can, target, before, parent) {
if (typeof before == code.STRING) { before = can.page.SelectOne(can, parent, before) }
parent = parent||before.parentNode
if (can.base.isArray(target)) {
return can.core.List(target, function(item) { if (!item) { return }
var target = can.page.Append(can, parent, [item])._target
@ -297,9 +346,13 @@ Volcanos("page", {
}
},
tagClass: function(target) { return target.tagName.toLowerCase()+(target.className? nfs.PT+target.className.replaceAll(lex.SP, nfs.PT): "") },
isDark: function(can) {
return can.page.tagis(document.body, "body.dark")
},
isDisplay: function(target) { return target && target.style.display != html.NONE && target.className.indexOf(html.HIDE) == -1 },
isSelect: function(target) { return target && target.className.indexOf(html.SELECT) > -1 },
isIconInput: function(can, name) {
return can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.PRUNE, ice.HELP, cli.START, cli.CLOSE, web.REFRESH) || icon[name] || can.Conf("feature._icons."+name)
return can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.PRUNE, ice.HELP, cli.START, cli.CLOSE, web.REFRESH) || icon[name] || can.Conf("feature._icons."+name) || can.core.Value(can.onaction, ["_trans.icons", name])
},
editable: function(can, item, ok) { item.setAttribute("contenteditable", ok) },
draggable: function(can, item, ok) { item.setAttribute("draggable", ok) },
@ -313,7 +366,7 @@ Volcanos("page", {
menu: "☰",
opens: "▾", closes: "▸",
prev: "", next: "",
start: "+", // play: "▸",
back: "◀", reback: "▶",
push: "⇈", pull: "⇊",
@ -322,60 +375,84 @@ Volcanos("page", {
favor: "\u2606",
help: "\u2753",
},
inputs: function(can, list, type) { var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) {
case "": _list.push(""); break
case ice.AUTO:
_list.push({type: html.BUTTON, name: ice.LIST})
_list.push({type: html.BUTTON, name: ice.BACK})
break
case web.FILTER:
_list.push({type: html.TEXT, name: web.FILTER, icon: icon.search})
break
case mdb.PAGE:
_list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)})
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT), _init: function(target) {
can.onappend.figure(can, {action: "key", run: function(event, cmds, cb) {
var msg = can.request(event)
msg.Push(cmds[1], "10")
msg.Push(cmds[1], "30")
msg.Push(cmds[1], "50")
msg.Push(cmds[1], "100")
cb(msg)
}}, target, function() { can.Update() })
}})
_list.push(mdb.NEXT, mdb.PREV)
break
default:
(function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
if (item.type == html.SELECT) { item._init = function(target) { target.value = item.value||item.values[0], target.onchange = function(event) { can.misc.Event(event, can, function(msg) {
can.run(event)
}) } } } item.action && (function() { item._init = function(target) {
can.onappend.figure(can, item, target, function() { can.Update({}, ) })
} })()
_list.push(item), type = item.type
})()
} } return _list },
inputs: function(can, list, type) {
var _list = []; for (var i = 0; i < list.length; i++) {
switch (list[i]) {
case "": _list.push(""); break
case ice.AUTO:
_list.push({type: html.BUTTON, name: ice.LIST})
_list.push({type: html.BUTTON, name: ice.BACK})
break
case web.FILTER:
_list.push({type: html.TEXT, name: web.FILTER, icon: icon.search})
break
case mdb.PAGE:
_list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)})
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT), _init: function(target) {
can.onappend.figure(can, {action: "key", run: function(event, cmds, cb) {
var msg = can.request(event)
msg.Push(cmds[1], "10")
msg.Push(cmds[1], "30")
msg.Push(cmds[1], "50")
msg.Push(cmds[1], "100")
cb(msg)
}}, target, function() { can.Update() })
}})
_list.push(mdb.NEXT, mdb.PREV)
break
default: (function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
if (item.type == html.SELECT) {
item._init = function(target) { target.value = item.value||item.values[0]
target.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.run(event) }) }
}
}
item.action && (function() { item._init = function(target) {
can.onappend.figure(can, item, target, function() { can.Update({}, ) })
} })()
_list.push(item), type = item.type
})()
}
}
return _list
},
button: function(can, name, cb) {
var icon = can.Conf("_icons."+name)
if (icon) { return {icon: icon, onclick: cb||function(event) { can.Update(event, [ctx.ACTION, name]) }} }
return {view: [["item.button"]], list: [
{type: html.INPUT, data: {type: html.BUTTON, name: name, value: can.user.trans(can, name)}, onclick: cb||function(event) { can.Update(event, [ctx.ACTION, name]) }},
{text: name},
]}
},
input: function(can, item, value) { var input = {type: html.INPUT, name: item.name, data: item, style: item.style||{}, dataset: {}, _init: item._init}
item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO)
switch (item.type = item.type||html.TEXT) {
case html.SELECT: input.type = html.SELECT, item.className||can.page.ClassList.add(can, item, ctx.ARGS)
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
if (!item.values && item.value) { item.values = can.core.Split(item.value), item.value = item.values[0] }
if (item.values.slice(1).indexOf(item.values[0]) > -1) { item.value = item.value||item.values[0], item.values = item.values.slice(1) }
item.value = value||item.value, input.list = item.values.map(function(value) {
return {type: html.OPTION, value: value, inner: can.user.trans(can, value, null, html.VALUE)}
}); break
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
if (!item.values && item.value) { item.values = can.core.Split(item.value), item.value = item.values[0] }
if (item.values.slice(1).indexOf(item.values[0]) > -1) { item.value = item.value||item.values[0], item.values = item.values.slice(1) }
item.value = value||item.value, input.list = item.values.map(function(value) {
return {type: html.OPTION, value: value, inner: can.user.trans(can, value, null, html.VALUE)}
}); break
case html.TEXTAREA: input.type = html.TEXTAREA // no break
case html.USERNAME: // no break
case html.PASSWORD: // no break
case html.TEXT:
item.className||can.page.ClassList.add(can, item, ctx.ARGS), item.name = item.name||item.type, item.value = value||item.value||"";
item.placeholder = item.placeholder||item.name
break
case html.FILTER:
item.className||can.page.ClassList.add(can, item, ctx.ARGS), item.name = item.name||item.type, item.value = value||item.value||"";
//item.placeholder = item.placeholder||item.name
break
case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break
case html.BUTTON: item.value = item.value||item.name||mdb.LIST; break
} return input
},
icons: function(can, name, space) { if (!name) { return }
if (can.base.contains(name, "/") && can.misc.isImage(can, name)) { return {img: can.misc.Resource(can, name, space)} }
// if (can.page.unicode[name]) { return {text: [can.page.unicode[name], "", "icon"]} }
if (can.base.beginWith(name, "bi ")) { return {icon: name} }
if (name == mdb.DELETE) { return {icon: "bi bi-trash"} }
var _icon = can.base.getValid(can.Conf("_icons."+name), can.Conf("_trans.icons."+name), can.core.Value(can.onaction, ["_trans.icons."+name]), icon[name])
if (_icon) { return {icon: _icon} }
},
requireChina: function(can, title, list, name, path) {
can.onappend.plugin(can, {title: title, display: "/plugin/story/china.js", style: html.FLOAT, height: can.ConfHeight(), width: can.ConfHeight()}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event, {title: title, name: name, path: path})
@ -387,7 +464,7 @@ Volcanos("page", {
requireModules: function(can, libs, cb, cbs) { if (!libs || libs.length == 0) { return cb && cb() }
for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(nfs.PS) == 0 || libs[i].indexOf(ice.HTTP) == 0) { continue }
if (libs[i].indexOf(nfs._CSS) == -1 && libs[i].indexOf(nfs._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+nfs._JS }
libs[i] = nfs.REQUIRE_MODULES+libs[i]
libs[i] = nfs.M+libs[i]
} can.require(libs, cb, cbs)
},
requireDraw: function(can, cb) { can.require([chat.PLUGIN_LOCAL+"wiki/draw.js", chat.PLUGIN_LOCAL+"wiki/draw/path.js"], function() {
@ -401,11 +478,31 @@ Volcanos("page", {
return canvas.toDataURL(html.IMAGE_PNG, 1)
},
position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} },
getquery: function(can, target) {
var list = []; for (var p = target; p; p = p.parentNode) {
if (can.page.tagis(p, "body")) { list.pop(); break }
list.push(can.core.Keys(p.tagName.toLowerCase(), can.core.List(p.classList).join(".")), ">")
if (can.page.tagis(p, html.FIELDSET)) {
if (can.page.tagis(p, "fieldset.web.chat.tutor")) { return "" }
list.pop(); break
}
}
return list.reverse().join("")
},
theme: function(cb) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
cb && themeMedia.addListener(function(event) { cb(event.matches? html.DARK: html.LIGHT) })
cb && cb(themeMedia.matches? html.DARK: html.LIGHT)
return themeMedia.matches? html.DARK: html.LIGHT
},
appendAction: function(can, value, target) { if (!value.action) { return } target.innerHTML = value.action
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
var style = can.Conf(["_trans.input",can.ConfIndex().split(".").pop(), "style", target.name])||can.Conf("_style."+target.name)||can.page.buttonStyle(can, target.name); style && can.onappend.style(can, style, target)
target.onclick = function(event) {
if (can.page.ClassList.has(can, can._fields, "_process")) { return } can.onappend.style(can, "_process")
can.onkeymap.prevent(event), can.Update(can.request(event, value, {_toast: can.user.trans(can, target.name)}), [ctx.ACTION, target.name])
}
})
},
parseAction: function(can, value) { var action = []
can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) {
action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value))
@ -413,8 +510,9 @@ Volcanos("page", {
return action
},
buttonStyle: function(can, name) {
return can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE:
can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "drop", "prockill")? html.DANGER: ""
return can.Conf(["_trans.input", can.ConfIndex().split(".").pop(), "style", name])||can.Conf("_style."+name)||
can.core.Value(can.onaction, ["_trans", "style", name])||(can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "submit", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE:
can.base.isIn(name, mdb.REMOVE, "rename", mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "reject", "del", "drop", "access", "kill", "prockill")? html.DANGER: "")
},
exportValue: function(can, msg, target) { target = target||can._output
msg.OptionDefault(ice.MSG_THEME, can.getHeaderTheme())

View File

@ -1,6 +1,5 @@
Volcanos("user", {
agent: {
enableDebug: function(can) {},
getLocation: function(can, cb) { var call = arguments.callee; if (call._res) { return cb(call._res) }
navigator.geolocation.getCurrentPosition(function(res) {
cb(call._res = {type: "ip", name: "当前位置", text: "某某大街", latitude: res.coords.latitude.toFixed(6), longitude: res.coords.longitude.toFixed(6)})
@ -10,13 +9,19 @@ Volcanos("user", {
window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option(mdb.TEXT))
+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option(mdb.TEXT)))
},
chooseImage: function(can, cb, count) { can.base.isFunc(cb) && cb([]) },
uploadImage: function(can, id, cb) {},
previewImage: function(can, url, list) {},
scanQRCode: function(can, cb) { can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT, text: ""}], function(list) { cb(can.base.ParseJSON(list[0])) }) },
connectWifi: function(can, ssid, password, cb, cbs) {},
getClipboard: function(can, cb) {},
scanQRCode: function(can, cb) { can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT, text: ""}], function(list) { cb(can.base.ParseJSON(list[0])) }) },
chooseImage: function(can, cb) { can.base.isFunc(cb) && cb([]) },
enableDebug: function(can) {},
init: function(can, content, icons) { can.user.agent.cmd = can, can.user.agent._init_content = content, can.user.agent._init_icons = icons }, _init_content: [],
}, info: {},
isIPad: false,
isTesla: navigator.userAgent.indexOf("Tesla") > -1,
isChrome: navigator.userAgent.indexOf("Chrome") > -1,
isSafari: navigator.userAgent.indexOf("Safari") > -1,
isMailMaster: navigator.userAgent.indexOf("MailMaster") > -1,
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
@ -29,6 +34,7 @@ Volcanos("user", {
isExtension: location && location.protocol && location.protocol == "chrome-extension:",
isLocalFile: location && location.protocol && location.protocol == "file:",
isLandscape: function() { return window.innerWidth > window.innerHeight },
isTechOrRoot: function(can) { return can.base.isIn(can.user.info.userrole, aaa.TECH, aaa.ROOT) },
mod: {
isPod: location && location.pathname && (location.pathname.indexOf(web.CHAT_POD) == 0 || location.pathname.indexOf("/x/") == 0 || location.pathname.indexOf("/s/") == 0),
isCmd: location && location.pathname && (location.pathname.indexOf(web.CHAT_POD) == 0 && location.pathname.indexOf("/cmd/") > 0
@ -39,7 +45,9 @@ Volcanos("user", {
confirm: function(text) { return confirm(JSON.stringify(text)) },
prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == code.FUNCTION && cb(text); return text },
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
jumps: function(url) { location.href = url },
jumps: function(url) {
location.href = url
},
opens: function(url) {
if (window.parent && window.parent.openurl) { return window.parent.openurl(url) }
window.openurl? window.openurl(url): this.open(url)
@ -53,75 +61,116 @@ Volcanos("user", {
close: function(url) { return window.close() },
theme: function(can, name) { can.base.isString(name) && (name = [name]) || name || []
name.push(html.WIDTH+parseInt((can.page.width()+32)/320))
can.misc.isDebug(can) && name.push(log.DEBUG)
can.user.info.userrole && name.push(can.user.info.userrole)
can.user.language(can) && name.push(can.core.Split(can.user.language(can), "-")[0])
can.user.mod.isCmd && name.push(chat.CMD), can.user.mod.cmd && name.push(can.user.mod.cmd.replaceAll(".", " "))
can.user.mod.isCmd && name.push(chat.CMD), can.user.mod.cmd && name.push(can.base.replaceAll(can.user.mod.cmd, ".", " "))
// if (window.innerWidth <= 1080) { can.user.isIPad = true }
can.user.isIPad && name.push("pad") && can.user.isLandscape() && name.push(html.LANDSCAPE)
can.user.isWindows && name.push(html.WINDOWS), can.user.isWebview && name.push(html.WEBVIEW)
can.user.isMobile && name.push(html.MOBILE) && can.user.isLandscape() && name.push(html.LANDSCAPE)
can.user.isWebview && name.push(html.WEBVIEW), can.user.isWindows && name.push("windows")
can.user.isWeiXin && name.push("weixin")
can.user.language(can) && name.push(can.core.Split(can.user.language(can), "-_.")[0])
can.user.info.userrole && name.push(can.user.info.userrole)
can.misc.isDebug(can) && name.push(log.DEBUG)
can.page.styleClass(can, document.body, name.join(lex.SP))
},
title: function(text) { if (window.webview) { return title(text) } return text && (document.title = text), document.title },
title: function(text) {
if (window.webview) { return title(text) }
return text && (document.title = text), document.title
},
language: function(can) { return (can.misc.SearchOrConf(can, aaa.LANGUAGE)||can.user.info.language||"") },
isEnglish: function(can) { return can.base.isIn(can.core.Split(can.user.language(can).toLowerCase()||"en", "_-.")[0], "en", "en-us") },
transValue: function(can, value, key) {
if (value.Append) { return can.user.trans(can, value.Append(key), null, "value."+key) }
if (value.Option) { return can.user.trans(can, value.Option(key), null, "value."+key) }
return can.user.trans(can, value[key], null, "value."+key)
},
trans: function(can, text, list, zone) { if (can.base.isNumber(text)) { return text+"" } if (can.user.isEnglish(can)) { return text }
if (can.base.isObject(text)) { return can.core.Item(text, function(k, v) { can.core.Value(can._trans, can.core.Keys(zone, k), v) }) }
if (can.base.isFunc(text)) { text = text.name||"" } if (can.base.isString(list)) { return list }
if (can.base.isFunc(text)) { text = text.name||"" } if (list && can.base.isString(list)) { return list }
var key = can.core.Keys(zone, text)
return can.core.Value(list, key) || can.core.Value(can._trans, key) ||
can.Conf(["trans", key]) || can.Conf(["feature._trans", key]) ||
can.core.Value(can.user._trans, key) || text
if (text == can.Conf("index") && can.Conf("help")) { return can.Conf("help") }
return can.core.Value(list, key) ||
can.Conf(["feature._trans", zone||"input", (can.ConfIndex()||"").split(".").pop(), text]) ||
can.Conf(["feature._trans", zone, (can.ConfIndex()||"").split(".").pop(), text]) ||
can.Conf(["feature._trans", key]) || can.Conf(["trans", key]) ||
can.core.Value(can._trans, key) ||
can.core.Value(can.user._trans, key) || text
}, _trans: {"_week_header": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]},
time: function(can, time, fmt) { var now = can.base.Date(time), list = can.user._trans["_week_header"]
time: function(can, time, fmt) {
var now = can.base.Date(time), list = can.user._trans["_week_header"]
return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
},
toastConfirm: function(can, content, title, action) {
if (!action.list || action.list.length == 0) { action = shy({confirm: action}, [html.CANCEL, html.CONFIRM], function() {}) }
if (!action.list || action.list.length == 0) { action = shy({confirm: action}, [html.CANCEL, html.CONFIRM]) }
var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1})
can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte
},
toastProcess: function(can, content, title, progress) { return can.user.toast(can, {content: "🕑 "+(content||ice.PROCESS), title: title, duration: -1, progress: progress}) },
toastFailure: function(can, content, title) { return can.user.toast(can, {content: "❌ "+(content||ice.FAILURE), title: title, duration: -1}) },
toastSuccess: function(can, content, title) { return can.user.toast(can, {content: "✅ "+(content||ice.SUCCESS), title: title, duration: 3000}) },
toastProcess: function(can, content, title, progress) {
content = can.user.trans(can, content||""), content += can.user.trans(can, " process", "中...")
return can.user.toast(can, {content: "🕑 "+content, title: title, duration: -1, progress: progress})
},
toastFailure: function(can, content, title) {
content = can.user.trans(can, content||"")
if (content.length < 8) { content += can.user.trans(can, " failure", "失败") }
return can.user.toast(can, {content: "❌ "+content, title: title, duration: -1})
},
toastSuccess: function(can, content, title, duration) {
content = can.user.trans(can, content||""), content += can.user.trans(can, " success", "成功")
return can.user.toast(can, {content: "✅ "+content, title: title, duration: duration||1000})
},
toast: function(can, content, title, duration, progress, hash) { can = can._fields? can.sup: can
var meta = can.base.isObject(content)? content: {content: content, title: title, duration: duration, progress: progress, hash: hash}
meta.title = meta.title||can.core.Keys(can.ConfSpace(), can.ConfIndex())||can._name.split(nfs.PS).slice(-2).join(nfs.PS)
// var list = can.core.Split(content, " ", " ")
// content = can.core.List(list, function(text) { return can.user.trans(can, text) }).join("")
if (meta.title == can.ConfIndex()) { meta.title = can.user.trans(can, meta.title, can.ConfHelp()) }
meta.title = meta.title||can.user.trans(can, can.core.Keys(can.ConfSpace(), can.ConfIndex()), can.ConfHelp())||can._name.split(nfs.PS).slice(-2).join(nfs.PS)
meta.title = can.base.replaceAll(can.user.trans(can, meta.title||""), "%2F", "/")
meta.hash && can.misc.isDebug(can) && (meta.title += " "+meta.hash.slice(0, 6)), meta.action = meta.action||[""]
var width = meta.width||(html.QRCODE_WIDTH+2*html.PLUGIN_PADDING+10); if (width < 0) { width = can.page.width() + width }
var ui = can.page.Append(can, meta.action.list || meta.action.length > 1? document.body: can._root.Action._toast, [{view: [[chat.TOAST, meta.style, chat.FLOAT]], style: {width: width}, list: [
{view: [wiki.TITLE, "", meta.title||""], title: "点击复制", onclick: function(event) { can.user.copy(event, can, meta.title) }},
{view: [cli.CLOSE, "", can.page.unicode.close], title: "点击关闭", onclick: function() { action.close() }},
{view: "duration", title: "点击关闭", onclick: function() { action.close() }},
can.base.isObject(meta.content)? meta.content: {view: [[nfs.CONTENT, html.FLEX], "", meta.content||""]},
html.ACTION, !can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width-2*html.PLUGIN_PADDING}, list: [
{view: "current", style: {width: (meta.progress||0)*(width-2*html.PLUGIN_PADDING-2)/100}},
]},
] }]); can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content}))
meta.action.meta && can.core.Item(meta.action.meta, function(key, cb) { cb.help && can.core.Value(meta.action.meta, ["_trans", key], cb.help) })
if (can.user.isMobile && !can.user.isLandscape()) { width = window.innerWidth }
var ui = can.page.Append(can, meta.action.list||meta.action.length > 1 || !can._root||!can._root.Action||!can._root.Action._toast? document.body: can._root.Action._toast,
[{view: [[chat.TOAST, can.ConfIndex(), meta.style, html.FLOAT]], style: {width: width}, list: [
{view: [html.TITLE, "", meta.title], title: "点击复制", onclick: function(event) { can.user.copy(event, can, meta.title) }},
{view: [cli.CLOSE, "", can.page.unicode.close], title: "点击关闭", onclick: function() { action.close() }},
{view: "duration", title: "点击关闭", onclick: function() { action.close() }},
can.base.isObject(meta.content)? meta.content: {view: [[nfs.CONTENT, html.FLEX], "", meta.content||""]},
html.ACTION, !can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width-2*html.PLUGIN_PADDING}, list: [
{view: "current", style: {width: (meta.progress||0)*(width-2*html.PLUGIN_PADDING-2)/100}},
]},
]}]
);
can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content}))
// meta.action.meta && can.core.Item(meta.action.meta, function(key, cb) { cb.help && can.core.Value(meta.action.meta, ["_trans", key], cb.help) })
var action = can.onappend._action(can, meta.action.list? meta.action.list.reverse(): meta.action, ui.action, {_trans: meta.action.meta? meta.action.meta._trans: {},
_engine: function(event, button) { can.core.CallFunc(meta.action.meta? meta.action.meta[button]: meta.action, [event, button]) },
_engine: function(event, button) { can.core.CallFunc(meta.action.meta? meta.action.meta[button]: meta.action, [event, button]), action.close(event) },
open: function(event) { meta.content.indexOf(ice.HTTP) == 0 && can.user.open(meta.content), meta.title.indexOf(ice.HTTP) == 0 && can.user.open(meta.title) },
close: function(event) { action.timer.stop = true, can.page.Remove(can, ui._target) },
cancel: function(event) { action.timer.stop = true, can.page.Remove(can, ui._target) },
close: function() {
// event && event.isTrusted && can.onengine.signal(can, "onevent", can.request(event, {_type: "close"}))
action.timer.stop = true, can.page.Remove(can, ui._target), delete(can.__toast)
can._toast && (typeof can._toast.close == code.FUNCTION) && delete(can._toast)
},
cancel: function() { action.close() },
timer: can.core.Timer({interval: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
if (index > 30) { ui.duration.innerHTML = index/10+(index%10==0?".0":"")+"s..." }
}, function() { can.page.style(can, ui._target, "margin-right", "-400px"), delete(can.__toast)
can.onmotion.delay(can, function() { can.page.Remove(can, ui._target) }, 1000)
}, function() {
can.page.style(can, ui._target, "margin-right", "-400px")
can.onmotion.delay(can, function() { action.close() }, 1000)
}), _target: ui._target,
}); can.onmotion.story.auto(can, ui._target)
if (action._target.parentNode == document.body) {
can.onmotion.delay(can, function() {
can.page.style(can, action._target, html.TOP, (can.page.height() - action._target.offsetHeight)/4, html.LEFT, (can.page.width()-action._target.offsetWidth)/2)
})
}
if (meta.action && meta.action.length == 1 && meta.action[0] === "") {
can.page.Select(can, action._target, html.DIV_ACTION, function(target) { can.onmotion.hidden(can, target) })
} can._toast && (typeof can._toast.close == code.FUNCTION && can._toast.close(), delete(can._toast))
can._root.Action._toast && (can._root.Action._toast.scrollTop += 10000)
}
if (action._target.parentNode == document.body) { can.onmotion.delay(can, function() {
can.page.style(can, action._target, html.TOP, (can.page.height() - action._target.offsetHeight)/2, html.LEFT, (can.page.width()-action._target.offsetWidth)/2)
}) }
can._toast && (typeof can._toast.close == code.FUNCTION && can._toast.close(), delete(can._toast))
can._root && can._root.Action && can._root.Action._toast && (can._root.Action._toast.scrollTop += 10000)
if (meta.hash) { var list = can._root.Action._toastList = can._root.Action._toastList||{}
list[meta.hash] && can.page.insertBefore(can, action._target, list[meta.hash]._target), can.__toast = action
list[meta.hash] && (can.page.Remove(can, list[meta.hash]._target), list[meta.hash].close(), delete(list[meta.hash])), list[meta.hash] = action
} else { can._toast = action } return action
} else {
can._toast = action
}
return action
},
space: function(can) { return can.Conf(web.SPACE)||can.Conf(ice.POD)||can.misc.Search(can, ice.POD) },
template: function(can, file) { return can.base.MergeURL(can.base.Path(nfs.SRC_TEMPLATE, can.Conf(ctx.INDEX), file), ice.POD, can.user.space(can)) },
@ -136,44 +185,55 @@ Volcanos("user", {
}
var input = can.page.Append(can, document.body, [{type: html.TEXTAREA, value: text}])._target
can.onmotion.focus(can, input), document.execCommand("Copy"), can.page.Remove(can, input)
return can.user.toastSuccess(can, text, "copy success"), can.misc.Log(nfs.COPY, text), text
return can.user.toastSuccess(can, text, can.user.trans(can, "copy success", "复制成功")), can.misc.Log(nfs.COPY, text), text
},
carte: function(event, can, meta, list, cb, parent, trans) { var msg = can.request(event); event = msg._event
function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } parent? remove_sub(parent): can.onmotion.clearCarte(can)
meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)), trans = trans||meta._trans; if (!list || list.length == 0) { return }
meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta, function(key) {
if (can.base.beginWith(key, "_")) { return }
return key
})), trans = trans||meta._trans; if (!list || list.length == 0) { return }
var _events = event._events||event
function click(event, button, index) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events;
(can.base.isFunc(cb)? cb(event, button, meta, carte, index):
meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}):
can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can)
can.onengine.signal(can, "onevent", can.request(event, {_type: html.ACTION}));
(can.base.isFunc(cb)? cb(event, button, meta, carte, index): meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can)
}) }
var isinput = can.page.tagis(event.target, html.INPUT)
var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||msg.Option("_style")||can.base.replaceAll(can.ConfIndex()||"", nfs.PT, lex.SP)||"", chat.FLOAT]], list: can.core.List(list, function(item, index) {
var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE,
can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), meta._style||msg.Option("_style"), chat.FLOAT,
]], list: can.core.List(list, function(item, index) {
if (typeof item == code.FUNCTION) { item = item(can); if (!item) { return } }
if (item === "") { return {type: html.HR} }
if (item == web.FILTER) { return {
input: [html.FILTER, function(event) { if (event.key == code.ESCAPE) { return carte.close() } can.onkeymap.selectItems(event, can, carte._target) } ],
_init: function(target) { can.onmotion.delay(can, function() { target.placeholder = "search in "+(can.core.List(list, function(item) { if (item) { return item } }).length-1)+" items", target.focus() }) }
} }
if (can.base.isString(item)||can.base.isNumber(item)) { var _style = can.page.buttonStyle(can, item)
if (can.base.isString(item)||can.base.isNumber(item)) {
if (can.base.beginWith(item, "<")) {
return {view: [html.ITEM, html.DIV, item]}
}
var _style = can.page.buttonStyle(can, item)
return {
view: [[html.ITEM, item, _style], html.DIV, (isinput || meta._style == ice.CMD) && !trans? item: can.user.trans(can, item, trans)],
onmouseenter: function(event) { remove_sub(carte) },
view: [[html.ITEM, item, _style]],
// list: [can.page.icons(can, item), {text: [can.user.trans(can, item, trans), "", "name"]}],
list: [{text: [can.user.trans(can, item, trans), "", "name"]}],
onclick: function(event) { click(event, item, index) },
onmouseenter: function(event) { remove_sub(carte) },
}
}
if (can.base.isArray(item)) {
function subs(event) { var sub = can.user.carte(event, can, meta, item.slice(1), cb||function(event, button) {
can.onimport && can.onimport[item[0]]? can.onimport[item[0]](can, button): click(event, button, index)
can.onimport && can.onimport[item[0]]? can.onimport[item[0]](can, button, event): click(event, button, index)
}, carte, trans); carte._sub = sub }
return {view: html.ITEM, list: [
{text: can.user.trans(can, item[0], trans)},
// can.page.icons(can, item[0]),
{text: [can.user.trans(can, item[0], trans), "", "name"]},
{text: [lex.SP+can.page.unicode.next, "", [html.ICON, "next"]]}
], onmouseenter: subs, onclick: subs}
}
return item
})}]); can.onkeymap.prevent(event), can.page.Select(can, ui._target, html.IMG, function(target) { target.onload = function() { can.onlayout.figure(event, can, ui._target) } })
var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target, parent, 200), close: function() { can.page.Remove(can, ui._target) }}
var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target, parent), close: function() { can.page.Remove(can, ui._target) }}
return parent && (parent._sub = carte), carte
},
carteRight: function(event, can, meta, list, cb, parent) { var carte = can.user.carte(event, can, meta, list, cb, parent)
@ -181,51 +241,85 @@ Volcanos("user", {
},
carteItem: function(event, can, item) { if (!item.action) { return }
var trans = {}, list = can.page.Select(can, can.page.Create(can, html.DIV, item.action), "", function(target) { trans[target.name] = can.user.trans(can, target.value); return target.name })
can.user.carteRight(event, can, {_trans: trans}, list, function(event, button) { can.Update(can.request(event, item), [ctx.ACTION, button]) })
can.user.carteRight(event, can, {_trans: trans}, list, function(_event, button) {
can.Update(can.request(_event, event._msg, item), [ctx.ACTION, button]) })
},
input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() }
event = event||{}; var msg = can.request(event); event = event._event||event; var need = {}
var title = msg.Option(wiki.TITLE)
var ui = can.page.Append(can, document.body, [{view: [[html.INPUT].concat((can.ConfIndex()||"").split("."), msg.Option(mdb.TYPE), [chat.FLOAT])], list: [
title && {view: [wiki.TITLE, html.LEGEND, title]},
var title = can.user.trans(can, msg.Option(ctx.ACTION))
var ui = can.page.Append(can, document.body, [{view: [[html.INPUT, can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), msg.Option(mdb.TYPE), chat.FLOAT]], list: [
{view: html.OPTION, list: [{type: html.TABLE, list: can.core.List(form, function(item) {
item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item
item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT), need[item.name] = item.need
item._init = function(target) {
if (item.name && item.name != ctx.ACTION) { target.value = item.value||msg.Option(item.name)||can.Option(item.name)||can.Status(item.name)||target.value||"" }
item.mode = chat.SIMPLE, can.onappend.figure(can, can.base.Copy({space: msg.Option(web.SPACE), run: function(event, cmds, cb) { var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option())
can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) })
;(item.run||can.run)(event, cmds, cb, true)
if (item.name && item.name != ctx.ACTION) { target.value = item.value||msg.Option(item.name)||can.Option(item.name)||target.value||"" }
// item.mode = chat.SIMPLE,
can.onappend.figure(can, can.base.Copy({space: msg.Option(web.SPACE), run: function(event, cmds, cb) { var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option())
can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) }); (item.run||can.run)(event, cmds, cb, true)
}, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target)
}, item.onkeydown = function(event) { if (event.key == code.ESCAPE) { event.target.blur() } }
item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT)
item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT)
// item.placeholder = can.user.trans(can, item.placeholder||item.name, null, html.INPUT)
// item.title = can.user.trans(can, item.title||item.placeholder||item.name, null, html.INPUT)
return {view: [[item.name, item.type, item.action], html.TR], list: [
{type: html.TD, list: [{text: [can.user.trans(can, item.name||"", item._trans, html.INPUT), html.LABEL]}]}, {type: html.TD, list: [{text: item.need == "must"? "*": "", style: {color: cli.RED}}]},
{type: html.TD, _init: function(target) { can.onappend.input(can, item, "", target) }},
]}
{type: html.TD, list: [
{text: [can.user.trans(can, item.name||"", item._trans, html.INPUT), html.LABEL]},
item.need == "must" && {text: ["*", "", "must"]},
]}, {type: html.TD, list: []},
{type: html.TD, _init: function(target) { can.onappend.input(can, item, msg.Option(item.name)||(can._msg? can._msg.Option(item.name): ""), target) }},
], onclick: function(event) {
can.page.Select(can, event.currentTarget, "input", function(target) { target.focus() })
}}
})}]}, html.ACTION,
], onclick: function(event) { if (!can.page.tagis(event.target, html.INPUT, html.TEXTAREA)) { can.onmotion.clearCarte(can) } }}])
var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, {
_trans: {submit: msg.Option(web.SUBMIT)},
focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) },
cancel: function() { can.page.Remove(can, ui._target) },
focus: function(key) { can.onmotion.focus(can, can.page.Select(can, ui._target, key? "input.args[name="+key+"]": html.INPUT_ARGS)[0]) },
Option: function(key, value, hidden) {
if (!key) { var data = kit.Dict(msg.OptionSimple())
can.page.Select(can, ui._target, "input.args", function(target) { data[target.name] = target.value })
return data
}
var target = can.page.Select(can, ui._target, "input.args[name="+key+"]")[0]
if (!target) { return }
if (value != undefined) { target.value = target.value||value }
if (target.value && hidden) { can.onmotion.hidden(can, can.page.parentNode(can, target, html.TR)) }
return target.value
},
layout: function(event) {
if (event && event.target) { can.onlayout.figure(event, can, ui._target)
can.user.isMobile && can.page.style(can, ui._target, html.LEFT, (can.page.width()-ui._target.offsetWidth)/2, html.TOP, 40)
} else {
can.getActionSize(function(left, top, height) { can.page.style(can, ui._target, html.LEFT, left||0, html.TOP, (height/4||0)) })
} can.onmotion.resize(can, ui._target)
},
cancel: function(event, can, button) {
can.page.ClassList.del(can, can._fields||can._target, "_process")
button == "cancel" && msg._cancel && msg._cancel(event), callback("afterInputs", button)
can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, ui._target)})), can.page.Remove(can, ui._target)
},
submit: function(event, can, button) { var args = [], data = {}, err = false
var list = can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) {
var list = can.page.Select(can, ui._target, html.OPTION_ARGS, function(item) {
if (item.value == "" && need[item.name] == "must") { err = true, item.focus(), can.user.toast(can, item.name+" 是必选字段, 请重新输入") }
return item.name && args.push(item.name, item.value||""), data[item.name] = item.value||""
}); if (err) { return } can.onkeymap.prevent(event)
var _msg = can.request(event); _msg.Option(ctx.ACTION, msg.Option(ctx.ACTION))
_msg.Option("_toast", msg.Option("_toast"))
can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action}) || action.cancel()
var _msg = can.request(event); _msg.Option(ctx.ACTION, msg.Option(ctx.ACTION)), _msg.Option("_toast", msg.Option("_toast"))
if (can.core.CallFunc(cb, {event: can.request(event, {_handle: ice.TRUE})._event, button: button, data: data, list: list, args: args, input: action})) {
callback("afterInputs", button)
} else {
action.cancel(event, can, button)
}
}, _target: ui._target, _engine: function(event, can, button) { action.submit(event, can, button) },
});
if (event && event.target) {
can.onlayout.figure(event, can, ui._target)
can.user.isMobile && can.page.style(can, ui._target, html.LEFT, (can.page.width()-ui._target.offsetWidth)/2, html.TOP, can.getHeaderHeight(can))
} else {
can.getActionSize(function(left, top, height) { can.page.style(can, ui._target, html.LEFT, left||0, html.TOP, (height/4||0)) })
} can.onmotion.resize(can, ui._target), can.onmotion.delay(can, function() { action.focus() }, 300)
can.page.Select(can, action._target, "input", function(target) {
target.onfocus = target.onfocus||function(event) { can.onengine.signal(can, "onevent", can.request(event)) }
var onclick = target.onclick; target.onclick = function(event) { can.onengine.signal(can, "onevent", can.request(event, {_type: target.name})), onclick && onclick(event) }
})
title && can.page.Select(can, action._target, "input[name=submit]", function(target) { target.value = can.user.trans(can, title) })
action.layout(event), can.onmotion.delay(can, function() { action.focus() }, 300)
function callback(key, button) { var sub = can._fields? can: can.sub; sub && sub.onaction && sub.onaction[key] && sub.onaction[key](event, sub, button, action) }
callback("beforeInputs")
// ui._target._layout = action.layout
return button === true && action.submit(event, can, html.SUBMIT), action
},
select: function(event, can, type, fields, cb, cbs) {
@ -234,14 +328,22 @@ Volcanos("user", {
})
},
upload: function(event, can, cb, silent) { var begin = new Date()
var ui = can.page.Append(can, document.body, [{view: [[html.UPLOAD, chat.FLOAT]], list: [
var ui = can.page.Append(can, document.body, [{view: [[html.UPLOAD, can.Conf(ctx.INDEX)||can.ConfIndex(), chat.FLOAT]], list: [
html.ACTION, {view: html.OUTPUT, list: ["progress"]}, {view: html.STATUS, list: [html.SHOW, cli.COST, nfs.SIZE]},
]}]); can.onlayout.figure(event, can, ui._target)
]}])
can.user.isMobile && can.page.style(can, ui._target, html.LEFT, 0, html.WIDTH, window.innerWidth)
can.onlayout.figure(event, can, ui._target)
var action = can.onappend._action(can, [{type: html.UPLOAD, onchange: function(event) { action.show(event, 0, event.target.files[0].size, 0) }}, {type: html.BUTTON, name: cli.CLOSE}], ui.action, {
begin: function(event) { begin = new Date()
begin: function() { begin = new Date(), can.user.toastProcess(can, "upload")
var upload = can.page.Select(can, ui.action, html.INPUT_FILE)[0]; if (upload.files.length == 0) { return upload.focus() }
var msg = can.request(event, can.Option(), {_handle: ice.TRUE}); msg._upload = upload.files[0], msg._progress = action.show
can.runAction(event, html.UPLOAD, [], function(msg) { can.base.isFunc(cb)? cb(msg): can.Update(), action.close(), can.user.toastSuccess(can) })
can.runAction(event, html.UPLOAD, [], function(msg) {
if (msg.IsErr()) {
action.close(), can.user.toastFailure(can, msg.Result())
return
}
can.base.isFunc(cb)? cb(msg): can.Update(), action.close(), can.user.toastSuccess(can, "upload")
})
}, close: function(event) { can.page.Remove(can, ui._target) },
show: function (event, value, total, loaded) {
ui.cost.innerHTML = can.base.Duration(new Date() - begin)
@ -270,53 +372,76 @@ Volcanos("user", {
}), resize: html.IMG,
}) },
login: function(can, _cb, _msg) {
can.page.ClassList.add(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can), can.misc.CookieSessid(can, "")
var ui
var socket = can.ondaemon._init(can, "", aaa.LOGIN, function(event, msg, cmd, arg, cb) {
function check() {
if (can.misc.CookieSessid(can)) { can.page.ClassList.del(can, document.body.parentNode, aaa.LOGIN)
can.onmotion.clearFloat(can), can.onmotion.delay(can, function() { socket._close = true, socket.close() })
return can.base.isFunc(_cb) && _cb(), _cb = null, true
} can.core.Timer(1000, function() { check() }), can.onimport.theme(can)
}
if (cmd == cli.PWD) { if (check() || ui) { return } can.page.ClassList.add(can, document.body, aaa.LOGIN), can._wss_name = can.ondaemon._list[0] = arg[0]
var _list = [], list = {}; _msg.Table(function(value) { if (value.order == "") {} else if (value.type == mdb.PLUGIN) {
can.misc.CookieSessid(can, ""), can.misc.Cookie(can, "sessid", "")
can.page.ClassList.add(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can)
function check() {
if (can.misc.CookieSessid(can) || can.user.info.sessid) { can.page.ClassList.del(can, document.body.parentNode, aaa.LOGIN), can.onimport.theme(can)
can.onmotion.clearFloat(can), can.onmotion.delay(can, function() { socket._close = true, socket.close() })
return can.base.isFunc(_cb) && _cb(), _cb = null, true
} can.core.Timer(1000, function() { check() })
}
var ui, socket = can.ondaemon._init(can, "", aaa.LOGIN, function(event, msg, cmd, arg) {
if (cmd == ice.MSG_SESSID) {
if (!can.misc.CookieSessid(can, arg[0])) { can.user.info.sessid = arg[0] } check()
} else if (cmd == cli.PWD) { if (check() || ui) { return } can._wss_name = can.ondaemon._list[0] = arg[0]
var hassso = false
var _list = [], list = {}; _msg.Table(function(value) { if (!value.order) { return }
can.user.trans(can, kit.Dict(value.name, value.help))
_list.push(value.name), list[value.name] = function(target) {
can.onappend.plugin(can, {space: value.space, index: value.index, args: can.core.Split(value.args), style: html.OUTPUT}, function(sub) {
var run = sub.run; sub.run = function(event, cmds, cb) { var msg = can.request(event, {space: arg[0]}); can.page.exportValue(can, msg), run(event, cmds, cb) }
sub.onexport.output = function() { can.page.style(can, sub._output, html.MAX_HEIGHT, ""), can.page.style(can, sub._output, html.MAX_WIDTH, "") }
}, ui.output)
} } else if (value.type == cli.QRCODE) {
can.user.trans(can, kit.Dict(value.name, value.help))
_list.push(value.name), list[value.name] = function(target) { can.page.Modify(can, target, arg[2]) } } })
if (value.type == "oauth") { hassso = true }
if (value.type == cli.QRCODE) {
_list.push(value.name), list[value.name] = function(target) {
can.user.isWeiXin || can.page.Modify(can, target, arg[2])
}
} else if (value.type == mdb.PLUGIN) {
_list.push(value.name), list[value.name] = function(target) {
can.onappend.plugin(can, {space: value.space, index: value.index, args: can.core.Split(value.args), height: html.IFRAME_HEIGHT, width: html.IFRAME_HEIGHT, style: html.OUTPUT}, function(sub) {
var run = sub.run; sub.run = function(event, cmds, cb) { var msg = can.request(event, {space: arg[0]}); can.page.exportValue(can, msg), run(event, cmds, cb) }
}, ui.output)
}
}
})
var _cmd = "space login "+arg[0]
ui = can.onappend.tabview(can, list, _list, can.page.Append(can, document.body, [{view: "input login float flex"}])._target)
if (window.parent != window && window.innerHeight < 480) { can.onmotion.hidden(can, ui.output) }
var _cmd = "space login "+arg[0]; ui.display = can.page.Append(can, ui._target, [html.DISPLAY])._target, can.onappend.style(can, html.FLEX, ui.display)
can.page.Appends(can, ui.display, [{text: [
can.user.trans(can, "or command login", "或命令行授权: "), html.LABEL]}, {text: ["$ "+_cmd, "", html.ITEM], title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }}])
can.page.Append(can, ui.display, [{text: [
can.user.trans(can, "or oauth login", "或第三方授权: "), html.LABEL]}, {view: [["sso", html.FLEX]], list: _msg.Table(function(value) {
return value.type == "oauth" && {view: [[html.ITEM, html.FLEX]], title: "点击跳转,授权登录", list: [{img: can.misc.Resource(can, value.icons)}, {text: value.name}], onclick: function() {
can.user.jumps(can.base.MergeURL(value.link, ice.BACK, location.href))
}}
}) }])
can.page.style(can, ui._target, {left: (can.page.width()-ui._target.offsetWidth)/2, top: can.page.height() < 640? (can.page.height()-ui._target.offsetHeight)/2: (can.page.height()-ui._target.offsetHeight-html.HEADER_HEIGHT-html.ACTION_HEIGHT)/4+html.HEADER_HEIGHT})
cb && cb(); return true
} else if (cmd == ice.MSG_SESSID) { if (!can.misc.CookieSessid(can, arg[0])) { can.user.info.sessid = arg[0] } check(), cb && cb(); return true }
can.user.title(can.user.info.titles)
can.page.Append(can, ui._target, [{view: [[html.DISPLAY, html.FLEX]], list: [
{text: [can.user.trans(can, "or command login", "或命令行授权: "), html.LABEL]},
{text: ["$ "+_cmd, "", html.ITEM], title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }},
hassso && {text: [can.user.trans(can, "or oauth login", "或第三方授权: "), html.LABEL]},
hassso && {view: [["sso", html.FLEX]], list: _msg.Table(function(value) {
return value.type == "oauth" && {view: [[html.ITEM, value.name, html.FLEX]], title: value.link, list: [
{img: can.misc.Resource(can, value.icons)}, {text: can.user.trans(can, value.name, value.help)},
], onclick: function() {
can.user.jumps(can.base.MergeURL(value.link, ice.BACK, location.href))
}, _init: function(target) {
if (document.referrer) { var u = new URL(document.referrer)
value.link.indexOf(u.origin) == 0 && can.onmotion.delay(can, function() { target.click() }, 300)
}
}}
}) },
// {text: [can.user.info.titles]},
]}]), window.parent != window && window.innerHeight < 480 && can.onmotion.hidden(can, ui.output)
can.page.style(can, ui._target, {
left: (can.page.width()-ui._target.offsetWidth)/2,
top: can.user.isMobile? 20: can.page.height() < 480? (can.page.height()-ui._target.offsetHeight)/2: (can.page.height()-can.base.Min(ui._target.offsetHeight, html.IFRAME_HEIGHT)-html.HEADER_HEIGHT-html.ACTION_HEIGHT)/4+html.HEADER_HEIGHT,
})
}
})
},
logout: function(can) { can.user.toastConfirm(can, aaa.LOGOUT, "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) {
can.misc.Cookie(can, "user_uid", "")
can.misc.CookieSessid(can, ""), can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
}) }) },
header: function(can) { if (!can._root) { return } var header = can._root.Header
var meta = {
time: !can.user.isMobile && {view: [[html.ITEM, "state", mdb.TIME, html.FLEX]], _init: function(target) {
can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {})
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) })
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%w %H:%M:%S")) })
}},
avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.misc.Resource(can, can.user.info.avatar)}], onclick: function(event) { header && header.onaction.avatar(event, header) }},
usernick: {view: [[html.ITEM, "state", aaa.USERNICK, html.FLEX], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }, _init: function(target) {
can = can._fields? can.sup: can
can.ui.head = target.parentNode
}},
avatar: {view: [[html.ITEM, "state", aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { header && header.onaction.avatar(event, header) }},
usernick: {view: [[html.ITEM, "state", aaa.USERNICK, html.FLEX], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }},
qrcode: {view: [[html.ITEM, "state", cli.QRCODE]], list: [{icon: icon.qrcode}], onclick: function(event) { var _can = can._fields? can.sup: can; _can.onaction["生成链接"](event, _can) }},
}; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [html.SPACE, mdb.TIME, aaa.AVATAR, aaa.USERNICK, cli.QRCODE]), function(item) { return meta[item] })
},

View File

@ -2,18 +2,17 @@ fieldset.Action { min-width:var(--project-width); }
fieldset.Action>div.output { overflow-x:hidden; }
fieldset.Action>div.action:not(.flex) { width:100%; display:none; background-color:var(--plugin-bg-color); }
fieldset.Action>div.action div.item { font-style:italic; font-size:1.1rem; padding:10px 20px; }
fieldset.Action.tabs>div.action { display:flex; justify-content:center; }
fieldset.Action.tabs>div.action { display:flex; justify-content:center; display:none; }
fieldset.Action.tabs>div.output>fieldset>legend { display:none; }
fieldset.Action.tabs>div.output>fieldset.plugin:not(.select) { display:none; }
fieldset.Header div.Action { display:contents; }
/* fieldset.Action.tabview:not(.cmd)>div.output>fieldset.plugin>legend { float:left !important; background-color:transparent; } */
fieldset.Action.tabview:not(.cmd)>div.output>fieldset.plugin>legend { float:left !important; }
fieldset.Action.tabview>div.output>fieldset.plugin:not(.select) { display:none; }
fieldset.Action.vertical>div.output>fieldset.plugin { float:left; }
fieldset.Action.horizon>div.output>fieldset.plugin { float:left; }
fieldset.Action.horizon>div.output>fieldset.plugin>div.status { display:none; }
fieldset.Action.flow>div.output>fieldset.plugin { float:left; }
fieldset.Action.free>div.output>fieldset.plugin { position:absolute; }
fieldset.Action.free>div.output>fieldset.plugin { position:absolute; z-index:5; }
fieldset.Action.free>div.output>fieldset.plugin.select { z-index:9; }
fieldset.Action.free>div.output { overflow:hidden; }
fieldset.Action.grid>div.output>fieldset.plugin { float:left; }
@ -26,4 +25,4 @@ fieldset.Action.grid>div.project.toggle { display:none; }
fieldset.Action>div.toggle.project { padding-top:50px; height:150px; top:30%; }
body:not(.mobile) fieldset.Action>div.project.toggle { display:none; }
body.mobile fieldset.Action>div.project.toggle { top:60%; }
body.mobile fieldset.Action>div.action div.item { display:none; }
// body.mobile fieldset.Action>div.action div.item { display:none; }

View File

@ -1,38 +1,46 @@
(function() { const ALL = "all", TABS = "tabs", TABVIEW = "tabview", VERTICAL = "vertical", HORIZON = "horizon", GRID = "grid", FREE = "free", FLOW = "flow", PAGE = "page", CAN_LAYOUT = "can.layout"
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM), list = can.db.list
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next, index) { item.type = chat.PLUGIN, item.mode = can.Mode(); if (item.deleted == ice.TRUE) { return next() }
item.width = can.ConfWidth()-can.Conf(html.MARGIN_X); if (item.style == html.OUTPUT) { item.width = can.ConfWidth()-2*html.PLUGIN_MARGIN-2*html.PLUGIN_PADDING }
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM), list = can.db.list
var _select; can.onmotion.clear(can), can.onaction.layout(can, list[3])
can.core.Next(msg.Table(), function(item, next, index) { item.type = chat.PLUGIN, item.mode = can.Mode(); if (item.deleted == ice.TRUE) { return next() }
if (msg.Length() == 1) { item.height = can.ConfHeight()-can.Conf(html.MARGIN_Y), can.base.isIn(item.index, web.CHAT_MACOS_DESKTOP, web.CHAT_MESSAGE, web.WIKI_PORTAL) && (item.style = html.OUTPUT) }
list.length == 0 && can.user.info.nodetype != web.WORKER && item.index == "web.dream" && (list = [river, storm, item.index])
can.onappend.plugin(can, item, function(sub, meta, skip) { if (meta.index == "can._notfound" && !can.misc.isDebug(can)) { return skip || next() }
sub.onexport.output = function() { msg.Length() > 1 && can.onexport.isauto(can) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "") }
sub.onaction._close = function() { can.onengine.signal(can, chat.ONACTION_REMOVE, can.request({river: river, storm: storm}, item)), can.page.Remove(can, sub._target) }
sub.run = function(event, cmds, cb) { return can.run(can.request(event, {pod: meta.space||meta.pod}), (can.base.beginWith(meta.index, "can.")? [meta.index]: [river, storm, meta.id||meta.index]).concat(cmds), cb) }
can.user.isChrome && (can.ondaemon._list[sub._daemon = can.core.Keys(river, storm, index)] = sub)
can._plugins = (can._plugins||[]).concat([sub]), can.onimport._tabs(can, sub, meta), skip || next()
can.base.isIn(item.index, ssh.CLOUD_PROFILE) && (item.style = html.OUTPUT)
if (list.length == 0) {
can.user.info.nodetype == web.SERVER && item._command == web.DREAM && (list = [river, storm, item._command])
can.user.info.nodetype == web.WORKER && item._command == web.VIMER && (list = [river, storm, item._command])
}
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.user.isMobile || sub.Conf(ice.AUTO, cli.DELAY)
if (msg.detail && can.base.isIn(meta.index, "can._notfound")) { sub.Conf(ctx.INDEX, msg.detail[index+3]) }
sub.run = function(event, cmds, cb) { return can.run(can.request(event, {pod: meta.pod||meta.space}), (can.base.beginWith(meta.index, "can.")? [meta.index]: [river, storm, meta.id||meta.index]).concat(cmds), cb) }
sub.onexport.output = function() { msg.Length() > 1 && can.onexport.isauto(can) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, ""), can.onaction.layout(can, list[3]) }
can.onaction.layout(can, list[3]), can.onimport._tabs(can, sub, meta), can._plugins = (can._plugins||[]).concat([sub])
can.onexport.layout(can) && list[0] == river && list[1] == storm? (can.base.isIn(list[2], sub.ConfIndex()) && (_select = sub)): (index == 0 && (_select = sub)), _select = _select||sub, skip || next()
})
}, function() { if (can.isCmdMode()) { return } can.user.mod.isCmd = false, can.page.ClassList.del(can, document.body, ice.CMD)
can.onaction.layout(can, list[3]); if (can.user.isMobile) { return }
can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) {
can.base.isIn(list[2], sub.Conf(ctx.INDEX), sub.Conf("_command")||sub.Conf(ctx.INDEX)) && sub._tabs.click()
})
})
}, function() { can.onaction.layout(can, list[3]), _select._tabs.click() })
},
_tabs: function(can, sub, meta) {
var tabs = [{view: [html.ITEM, "", can.user.trans(can, meta.name, meta.help)], title: meta.help, onclick: function(event) { can._current = sub
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target), can.onmotion.select(can, can._action, html.DIV_ITEM, sub._tabs), can.onmotion.select(can, can._header_tabs, html.DIV_ITEM, sub._header_tabs)
can.onmotion.delay(can, function() { sub._header_tabs.scrollIntoViewIfNeeded() })
_tabs: function(can, sub, meta) { var _init = true
var tabs = [{view: [[html.TABS, meta.name], "", can.user.trans(can, meta.name, meta.help)], title: meta.help, onclick: function(event) { can._current = sub
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
can.onmotion.select(can, can._action, html.DIV_ITEM, sub._tabs)
can.onmotion.select(can, can._header_tabs, html.DIV_TABS, sub._header_tabs)
can.user.mod.isPod && can.user.title(["后台", sub.ConfHelp(), can.user.info.titles].join(" "))
// can.onmotion.delay(can, function() { sub._header_tabs.scrollIntoViewIfNeeded() })
var layout = can.onexport.layout(can); layout == FREE || (can._output.scrollTop = sub._target.offsetTop-10)
can.isCmdMode() || can.misc.SearchHash(can, can.Conf(chat.RIVER), can.Conf(chat.STORM), sub.Conf("_command")||meta.index, layout)
can.isCmdMode() || can.misc.SearchHash(can, can.Conf(chat.RIVER), can.Conf(chat.STORM), sub.ConfIndex(), layout)
sub.Conf(ice.AUTO) == cli.DELAY && sub._output.innerHTML == "" && sub.Update(event)
sub.onimport.size(sub, can.ConfHeight()-can.Conf(html.MARGIN_Y), can.ConfWidth()-can.Conf(html.MARGIN_X), can.onexport.isauto(can))
can.onengine.signal(can, "onindex", can.request(_init? {target: event.target, type: "click", isTrusted: true}: event, {index: sub.ConfIndex()})), _init = false
// can.onengine.signal(can, "onevent", can.request(_init? {target: event.target, type: "click", isTrusted: true}: event)), _init = false
}, oncontextmenu: sub._legend.onclick}]; sub._header_tabs = can.page.Append(can, can._header_tabs, tabs)._target, sub._tabs = can.page.Append(can, can._action, tabs)._target
},
_menu: function(can, msg) { if (can.user.isMobile) { return }
_menu: function(can, msg) { if (can.user.isMobile) { return } if (!can.user.isTechOrRoot(can)) { return }
var target = can.setHeaderMenu(can.base.Obj(can.Conf(chat.MENUS)||msg.Option(chat.MENUS), can.onaction._menus), function(event, button, list) { list && can.core.CallFunc([can.onaction, list[0]], [can, button]) })
can.onmotion.hidden(can, can._header_tabs = can.page.Append(can, target, [html.TABS])._target)
can.onmotion.hidden(can, can._header_tabs = can.page.Append(can, target, ["_tabs"])._target)
},
})
Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.SearchHash(can)
Volcanos(chat.ONACTION, {
_init: function(can, target) { can.db.list = can.misc.SearchHash(can)
can.db.list.length == 0 && can.misc.Search(can, chat.RIVER) && can.misc.Search(can, chat.STORM) && (can.db.list = [can.misc.Search(can, chat.RIVER), can.misc.Search(can, chat.STORM)])
can.Conf(html.MARGIN_X, 2*html.PLUGIN_PADDING+2*html.PLUGIN_MARGIN), can.Conf(html.MARGIN_Y, 2*html.PLUGIN_PADDING+2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT)
can.core.List(["ontouchstart", "ontouchmove", "ontouchend"], function(item) {
@ -40,8 +48,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
})
can._toast = can.page.Append(can, can._target, ["toast"])._target
},
onsize: function(can, msg, height, width) {
can.Conf({height: can.base.Min(height, 240), width: width})
onsize: function(can, msg, height, width) { can.Conf({height: can.base.Min(height, 240), width: width})
can.page.style(can, can._toast, html.MAX_HEIGHT, can.page.height()-can.getHeaderHeight()-can.getFooterHeight()-(html.PLUGIN_MARGIN+html.PLUGIN_PADDING+html.ACTION_HEIGHT))
},
onlogin: function(can, msg) {
@ -59,7 +66,6 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
if (can.base.beginWith(location.pathname, "/share/")) { can._names = location.pathname }
can.Conf(chat.TOOL)? can.onappend.layout(can, can.core.List(can.Conf(chat.TOOL), function(item, index, list) { item.type = chat.PLUGIN
if (list.length == 1) { can.user.mod.cmd = item.index
can.base.isIn(item.index, web.CHAT_MACOS_DESKTOP) || can.user.title(item.index)
can.onaction._onaction_cmd(can), item.mode = chat.CMD, item.opts = can.misc.Search(can)
can.onappend.style(can, ice.CMD, document.body), can.onappend.style(can, item.index, document.body)
} return item
@ -81,14 +87,13 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
_onaction_cmd: function(can) { can.onengine.signal(can, chat.ONACTION_CMD), can.onlayout._init(can) },
onaction_cmd: function(can, msg) { can.user.mod.isCmd = true, can.page.ClassList.add(can, can._target, can.Mode(chat.CMD)), can.Conf(html.MARGIN_Y, 128), can.Conf(html.MARGIN_X, 0) },
onsearch: function(can, msg, arg) { var fields = msg.Option(ice.MSG_FIELDS).split(mdb.FS); if (arg[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, arg, fields) } if (arg[0] == ctx.COMMAND) { can.onexport.command(can, msg, arg, fields) } },
onkeydown: function(can, msg, model) {
if (can.isCmdMode() && !msg._event.metaKey) { var sub = can._plugins[0].sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: msg._event, can: sub}); return }
if (can._current && !msg._event.metaKey) { var sub = can._current.sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: msg._event, can: sub}); return }
if (can.onkeymap.selectCtrlN(msg._event, can, can._action, html.DIV_ITEM)) { return }
can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
},
onresize: function(can) { can.onaction.layout(can) },
onkeydown: function(event, can, mode) {
if (can.isCmdMode() && !event.metaKey) { var sub = can._plugins[0].sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: event, can: sub}); return }
// if (can._current && !event.metaKey) { var sub = can._current.sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: event, can: sub}); return }
can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS) || can.onkeymap._parse(event, can, mode)
},
ontouchstart: function(event, can) { can.touch = can.touch || {}, can.touch.isStart = true, can.touch.startX = event.touches[0].clientX },
ontouchmove: function(event, can) { can.touch.isMove = true, can.touch.distanceX = event.touches[0].clientX - can.touch.startX },
ontouchend: function(event, can) {
@ -96,7 +101,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
if (can.touch.distanceX > 0) { can.onengine.signal(can, "onslideright") } else { can.onengine.signal(can, "onslideleft") }
} can.touch.isMove = false, can.touch.distanceX = 0, can.touch.isStart = false, can.touch.startX = 0
},
store: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.STORE})) },
dream: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.DREAM})) },
portal: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.PORTAL})) },
@ -109,14 +114,14 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
can._root.River && can._river_show === false && can.onmotion.hidden(can, can._root.River._target), skip || can.onlayout._init(can)
can.getActionSize(function(height, width) { var cb = can.onlayout[button]; can.base.isFunc(cb) && cb(can, height, width) || can.onlayout._plugin(can, button) })
},
// _menus: [[html.LAYOUT, ALL, TABS, TABVIEW, VERTICAL, HORIZON, GRID, FREE, FLOW, PAGE], web.STORE, web.DREAM, web.DESKTOP, web.PORTAL],
_menus: [[html.LAYOUT, ALL, TABS, TABVIEW, VERTICAL, HORIZON, GRID, FREE, FLOW, PAGE]],
// _menus: [[html.LAYOUT, ALL, TABS, TABVIEW, VERTICAL, HORIZON, GRID, FREE, FLOW, PAGE]],
_trans: kit.Dict(html.LAYOUT, "布局", ALL, "详情布局", TABS, "标签布局", TABVIEW, "标签分屏", VERTICAL, "上下分屏", HORIZON, "左右分屏", GRID, "网格布局", FREE, "自由布局", FLOW, "流动布局", PAGE, "网页布局"),
})
Volcanos(chat.ONLAYOUT, {
tabs: function(can, height, width) { can.ConfHeight(height+html.ACTION_HEIGHT), can.ConfWidth(width) },
tabview: function(can, height, width) { can.ConfHeight(height+html.ACTION_HEIGHT), can.ConfWidth(width), can.onmotion.toggle(can, can._header_tabs, true)
can.page.SelectOne(can, can._header_tabs, html.DIV_ITEM_SELECT) || can.page.Select(can, can._header_tabs, html.DIV_ITEM, function(target, index) { index == 0 && target.click() })
can.page.SelectOne(can, can._header_tabs, html.DIV_ITEM_SELECT)
// || can.page.Select(can, can._header_tabs, html.DIV_ITEM, function(target, index) { index == 0 && target.click() })
},
horizon: function(can, height, width) { can.ConfHeight(height), can.ConfWidth(width/2) },
vertical: function(can, height, width) { can.ConfHeight(height/2), can.ConfWidth(width) },
@ -127,18 +132,19 @@ Volcanos(chat.ONLAYOUT, {
flow: function(can, height, width) { can.ConfHeight(height-html.ACTION_MARGIN), can.ConfWidth(width) },
page: function(can) { can.page.styleHeight(can, can._output, ""), can.page.style(can, document.body, kit.Dict(html.OVERFLOW, "")) },
_plugin: function(can, button) { can.core.List(can._plugins, function(sub) {
if (can.isCmdMode()) { return sub.onimport.size(sub, can.page.height(), can.page.width(), false) }
if (can.page.ClassList.has(can, sub._target, html.OUTPUT)) {
return sub.onimport.size(sub, can.ConfHeight()-(can.user.isMobile? 2*html.PLUGIN_PADDING: can.Conf(html.MARGIN_Y)-([ALL, TABS].indexOf(can.onexport.layout(can)) > -1? html.ACTION_HEIGHT: 0)), can.ConfWidth()-can.Conf(html.MARGIN_X), can.onexport.isauto(can))
}
sub.onimport.size(sub, can.ConfHeight()-can.Conf(html.MARGIN_Y)-(can._plugins.length == 1 || button && button != ALL || sub.isCmdMode()? 0: html.ACTION_MARGIN),
can.ConfWidth()-can.Conf(html.MARGIN_X), can._plugins.length > 1 && can.onexport.isauto(can)) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "")
can.ConfWidth()-can.Conf(html.MARGIN_X), can._plugins.length > 1 && can.onexport.isauto(can)) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "")
}) },
_storage: function(can, value) { return can.user.isMobile? "all": (can.misc.sessionStorage(can, can.core.Keys(CAN_LAYOUT, location.pathname), value)||[])[0] },
})
Volcanos(chat.ONEXPORT, {
size: function(can, msg) {
msg.Option(html.LEFT, can._output.offsetLeft), msg.Option(html.TOP, can._output.offsetTop)
msg.Option(html.HEIGHT, can._output.offsetHeight), msg.Option(html.WIDTH, can._output.offsetWidth)
msg.Option(html.HEIGHT, can._output.offsetHeight||window.innerHeight), msg.Option(html.WIDTH, can._output.offsetWidth||window.innerWidth)
msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y)), msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X))
},
layout: function(can) { return can._layout||can.onlayout._storage(can)||can.misc.SearchOrConf(can, html.LAYOUT)||"" },
@ -154,43 +160,32 @@ Volcanos(chat.ONEXPORT, {
msg.Push(kit.Dict(ice.CTX, ice.CAN, ice.CMD, ctx.COMMAND, mdb.TYPE, ice.CAN, mdb.NAME, name||command.name, mdb.TEXT, command.help, ctx.CONTEXT, ice.CAN, ctx.COMMAND, name, ctx.INDEX, can.core.Keys(ice.CAN, name)), fields)
}) }
})
Volcanos(chat.ONENGINE, {_engine: function(event, sup, msg, can, cmds, cb) {
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1])); if (!storm || cmds.length != 2) { return false }
if (storm.index) {
can.runAction(event, ctx.COMMAND, [].concat(can.core.List(storm.index, function(item) {
if (typeof item == code.FUNCTION) { item = item(can) } if (item) { return item.index||item }
})), function(msg) {
can.core.List(storm.index, function(item) { if (!item || typeof item == code.FUNCTION) { return }
msg.Push(ctx.ARGS, JSON.stringify(item.args||[]))
msg.Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
}), cb(msg)
})
} else { can.core.List(storm.list, function(item) { can.base.isString(item) && (item = {index: item})
msg.Push(ctx.INDEX, item.index||"")
msg.Push(mdb.NAME, item.name||"").Push(mdb.HELP, item.help||"")
msg.Push(ctx.INPUTS, JSON.stringify(item.inputs)).Push(ctx.FEATURE, JSON.stringify(item.feature))
msg.Push(ctx.ARGS, item.args||"[]").Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
}), can.base.isFunc(cb) && cb(msg) } return true
}})
Volcanos(chat.ONENGINE, {
_engine: function(event, sup, msg, can, cmds, cb) {
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1])); if (!storm || cmds.length != 2) { return false }
if (storm.index) {
can.runAction(event, ctx.COMMAND, [].concat(can.core.List(storm.index, function(item) {
if (typeof item == code.FUNCTION) { item = item(can) } if (item) { return item.index||item }
})), function(msg) {
can.core.List(storm.index, function(item) { if (!item || typeof item == code.FUNCTION) { return }
msg.Push(ctx.ARGS, JSON.stringify(item.args||[]))
msg.Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
}), cb(msg)
})
} else { can.core.List(storm.list, function(item) { can.base.isString(item) && (item = {index: item})
msg.Push(ctx.INDEX, item.index||"").Push(mdb.ICONS, item.icons||"")
msg.Push(mdb.NAME, item.name||"").Push(mdb.HELP, item.help||"")
msg.Push(ctx.INPUTS, JSON.stringify(item.inputs)).Push(ctx.FEATURE, JSON.stringify(item.feature))
msg.Push(ctx.ARGS, item.args||"[]").Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
}), can.base.isFunc(cb) && cb(msg) } return true
},
})
Volcanos(chat.ONKEYMAP, {
_mode: {
webview: {
"[": function(event, can, target) { history.back() },
"]": function(event, can, target) { history.forward() },
r: function(event, can, target) { can.user.reload(true) },
w: function(event, can, target) { can.user.close() },
q: function(event, can, target) { window.terminate() },
o: function(event, can, target) { window.openurl(location.href) },
p: function(event, can, target) { window.openapp("QuickTime Player") },
t: function(event, can, target) { window.opencmd("cd contexts; pwd") },
f: function(event, can, target) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request({}, {type: mdb.FOREACH})) },
},
normal: {
":": function(event, can) { can.onengine.signal(can, chat.ONCOMMAND_FOCUS), can.onkeymap.prevent(event) },
" ": function(event, can) { can.onengine.signal(can, chat.ONSEARCH_FOCUS), can.onkeymap.prevent(event) },
Enter: function(event, can) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event)) },
plugin: {
Enter: function(event, can) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: "*"})) },
Escape: function(event, can) { can.onmotion.clearFloat(can) || can._root.Search && can.onmotion.hidden(can, can._root.Search._target) },
},
}, _engine: {},
@ -198,9 +193,12 @@ Volcanos(chat.ONKEYMAP, {
toggleLayout: function(can, layout) { can.onaction.layout(can, can.onexport.layout(can) == layout? ice.AUTO: layout) },
})
Volcanos(chat.ONPLUGIN, {
_filter: shy("表格", [ice.LIST, html.FILTER]),
_plugin: shy("插件", [mdb.NAME, ice.LIST, ice.BACK]),
_filter: shy("表格", [web.FILTER, ice.LIST, ice.BACK]),
_notfound: shy("缺失", [ctx.INDEX, web.SPACE, ice.LIST], function(can, msg, arg) { msg.Echo("not found "+arg[0]+" "+arg[1]) }),
_action: shy("操作", [ice.LIST]),
_display: shy("操作", [ice.LIST]),
_output: shy("操作", [ice.LIST], function(can, sub) { can.onappend.style(sub, html.OUTPUT) }),
_notfound: shy("缺失", [ctx.INDEX, web.SPACE, ice.LIST], function(can, msg, arg, sub) { msg.Echo("not found "+(arg[0]||sub.ConfIndex())+" "+(arg[1]||can.ConfSpace())) }),
layout: shy("界面布局", {_init: function(can) { can.Option(chat.LAYOUT, can.getAction(chat.LAYOUT)) }}, ["layout:select=auto,tabs,tabview,horizon,vertical,grid,free,flow,page", ctx.RUN], function(can, msg, arg) { can.onaction.layout(can, arg[0]) }),
})
})()

View File

@ -1,27 +1,39 @@
fieldset.Footer { width:100%; }
fieldset.Footer>div.output { font-style:italic; height:var(--footer-height); overflow:hidden; }
fieldset.Footer>div.output div.item { padding:7px; height:var(--footer-height); float:left; }
fieldset.Footer>div.output { font-style:italic; height:var(--footer-height); display:flex; }
fieldset.Footer>div.output div.item { padding:7px; height:var(--footer-height); display:flex; align-items:center; }
fieldset.Footer>div.output div.item.button { padding:7px 0; }
fieldset.Footer>div.output div.title:first-child { margin-left:var(--header-height); white-space:pre; }
fieldset.Footer:not(.tabview)>div.output div.title:first-child { font-weight:bold; text-align:center; width:var(--river-width); }
fieldset.Footer>div.output div.state { font-family:var(--status-font-family); float:right; line-height:18px; }
fieldset.Footer>div.output input[type=button] { background-color:transparent; color:var(--panel-fg-color); font-style:italic; border:0; }
fieldset.Footer>div.output div.toast { font-family:var(--status-font-family); line-height:18px; text-align:right; overflow:auto; flex-grow:1; justify-content:flex-end; }
fieldset.Footer>div.output div.state { font-family:var(--status-font-family); line-height:18px; white-space:pre; }
fieldset.Footer>div.output div.state label { font-size:var(--status-font-size); }
fieldset.Footer>div.output div.toast { font-family:var(--status-font-family); float:right; line-height:18px; }
fieldset.Footer>div.output div.cmd { padding:0; margin-left:20px; }
fieldset.Footer>div.output div.cmd>input[name=cmd] { padding-left:30px; }
fieldset.Footer>div.output div.menu>div.River { display:flex; justify-content:space-around; }
fieldset.Footer>div.output div.menu>div.River>div.item { height:var(--footer-height); display:flex; flex-direction:column; text-align:center; flex-grow:1; }
fieldset.Footer>div.output div.menu>div.River>div.item>i { font-size:24px; margin-right:0; }
fieldset.Footer>div.output div.menu>div.River>div.item>span { font-size:var(--status-font-size); }
body.mobile fieldset.Footer>div.output { font-style:italic; height:var(--footer-height); overflow:hidden; }
body.mobile fieldset.Footer>div.output div.toast { display:none; }
body.mobile fieldset.Footer>div.output div.cmd { display:none; }
.picker { box-shadow:0px 2px 10px 5px #626bd0 !important; }
body.mobile fieldset.Footer>div.output>div.menu { width:100%; }
body.mobile fieldset.Footer>div.output>div:not(.menu) { display:none; }
.picker {
box-shadow:var(--notice-bg-color) 0px 0px 20px 5px !important;
background-color:var(--notice-bg-color) !important; color:white !important;
position:relative; left:-5px; top: -5px; transition:all 0.5s;
}
.picker.danger {
box-shadow:var(--danger-bg-color) 0px 0px 20px 5px !important;
background-color:var(--danger-bg-color) !important; color:white !important;
}
div.view span.string { color:#f29766; }
div.view span.keyword { color:#5cadd4; }
div.item:not(.string):not(.number):not(.boolean)>span.value { color:var(--disable-fg-color); font-style:italic; }
span.item:not(.string):not(.number):not(.boolean)>span.value { color:var(--disable-fg-color); font-style:italic; }
fieldset.debug div.output table.content * { font-size:14px; }
fieldset.debug span.path { color:silver; font-style:italic; }
html.login body.width1 fieldset.Footer { display:none; }
html.login body.width1 fieldset.Header { display:none; }
body.dark fieldset.debug span.path { color:gray; }
body.dark fieldset.debug span.target { color:gray; }
body.dark div.item:not(.string):not(.number):not(.boolean)>span.value { color:gray; }

View File

@ -1,12 +1,29 @@
(function() { var NTIP = "ntip", NLOG = "nlog", NCMD = "ncmd", NKEY = "nkey"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can._wss = can.ondaemon._init(can)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, target) { can._wss = can.ondaemon._init(can)
can.Conf(cli.BEGIN, can.base.Time(null, "%H:%M:%S"))
if (!can.user.isMobile && !can.misc.isDebug(can)) { can.onmotion.hidden(can); return }
can.Conf(nfs.VERSION, can.base.trimPrefix(window._version, "?_v=").split("&")[0])
can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width())
can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length)
can.onimport._title(can, msg, target), can.onimport._command(can, msg, target), can.onimport._storm(can, msg, target)
can.misc.isDebug(can) && can.onimport._state(can, msg, target), can.onimport._toast(can, msg, target)
can.onimport._title(can, msg, target)
can.onimport._storm(can, msg, target)
can.core.List([
// {index: chat.TUTOR},
// {index: chat.FLOWS, value: "流程"},
// {index: chat.MESSAGE},
{index: web.SPIDE, value: can.user.trans(can, "spide", "服务")},
{index: web.SPACE, value: can.user.trans(can, "space", "空间")},
{index: cli.RUNTIME},
{index: code.XTERM, args: [cli.SH]},
], function(value) { value.type = html.BUTTON, value.name = value.index
value.onclick = function() { can.onappend._float(can, value.index, value.args) }
can.onappend.input(can, value, "", can._output)
})
// can.onimport._command(can, msg, target)
can.onimport._toast(can, msg, target)
can.misc.isDebug(can) && can.onimport._state(can, msg, target)
},
_title: function(can, msg, target) { can.user.isMobile || can.core.List(can.Conf(chat.TITLE)||msg.result, function(item) {
if (can.base.contains(item, ice.AT)) { item = '<a href="mailto:'+item+'">'+item+'</a>' }
@ -15,26 +32,27 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can._wss = can.onda
_command: function(can, msg, target) { can.onappend.input(can, {type: html.TEXT, _className: "args trans", icon: icon.TERMINAL, name: ice.CMD, onkeydown: function(event) { can.onkeymap.input(event, can)
function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == code.ESCAPE) { return close() } if (event.key != code.ENTER) { return } close()
switch (event.target.value) {
case web.CLEAR:
case cli.CLOSE: break
default: var list = can.core.Split(event.target.value, lex.SP)
// can.onexport._float(can, "cli", list[0], list.slice(1), function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+html.PLUGIN_MARGIN, html.RIGHT, "") }) })
case web.CLEAR:
case cli.CLOSE: break
default:
var list = can.core.Split(event.target.value, lex.SP)
can.onexport._float(can, "cli", {index: "can.console", display: "/plugin/local/code/xterm.js"}, list, function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+html.PLUGIN_MARGIN, html.RIGHT, "") }) })
}
}}, "", target, [chat.TITLE]) },
_storm: function(can, msg, target) { can.ui.storm = can.page.Append(can, can._output, [html.MENU])._target },
_state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), can.onexport.list).reverse(), function(item) {
_state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), can.onexport.list), function(item) {
can.page.Append(can, target, [{view: [[html.ITEM, chat.STATE]], list: [
{text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", "", item]},
], onclick: function(event) { can.core.CallFunc(can.onexport[item], [can]) }}]) })
},
_toast: function(can, msg, target) { can.ui.toast = can.page.Append(can, target, [{view: [[html.ITEM, chat.TOAST]], onclick: function(event) { can.onexport[NTIP](can) }}])._target },
_data: function(can, name, item) { can.db[name] = can.db[name]||can.request(), can.db[name].Push(item), can.onimport.count(can, name) },
tutor: function(event, can, type, text) { if (can.base.isIn(type, "keyup", "keydown")) { return }
!event._tutor && event.isTrusted && text && can.onimport._data(can, chat.TUTOR, {time: can.base.Time(), type: type, text: text}), event._tutor = true
},
value: function(can, name, value) { can.page.Select(can, can._output, "div.item>span."+name, function(target) { target.innerHTML = value }) },
count: function(can, name) { can.page.Select(can, can._output, can.core.Keys(html.SPAN, name), function(item) { item.innerHTML = can.Conf(name, parseInt(can.Conf(name)||"0")+1+"")+"" }) },
ntip: function(can, msg, time, title, content) { can.onimport._data(can, NTIP, {time: time,
// fileline: can.base.trimPrefix(msg.Option("log.caller"), location.origin+nfs.PS),
title: title, content: content}), can.page.Modify(can, can.ui.toast, [time, title, content].join(lex.SP)) },
ntip: function(can, msg, time, title, content) { can.onimport._data(can, NTIP, {time: time, title: title, content: content}), can.page.Modify(can, can.ui.toast, [time, title, content].join(lex.SP)) },
ncmd: function(can, msg, _follow, _cmds) { can.onimport._data(can, NCMD, {time: can.base.Time(), follow: _follow, cmds: _cmds}), can.onimport.nlog(can, NLOG) },
nlog: function(can, name) { can.onimport.count(can, name) },
menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds])
@ -46,20 +64,32 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can._wss = can.onda
},
})
Volcanos(chat.ONACTION, {_init: function(can) {},
onsize: function(can) {
can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth)
can.onimport.value(can, html.HEIGHT, can.page.height())
can.onimport.value(can, html.WIDTH, can.page.width())
onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth)
can.onimport.value(can, html.HEIGHT, can.page.height()), can.onimport.value(can, html.WIDTH, can.page.width())
},
onmain: function(can) {
can.run(can.request({}, {_method: http.GET}), [], function(msg) {
can.page.Appends(can, can._output, [{view: "item title", list: [{text: msg.Result()}]}])
})
},
onlogin: function(can, msg) {
can.run(can.request({}, {_method: http.GET}), [], function(msg) { can.onmotion.clear(can), can.onimport._init(can, msg, can._output) })
},
onlogin: function(can, msg) { can.run(can.request({}, {_method: http.GET}), [], function(msg) { can.onmotion.clear(can), can.onimport._init(can, msg, can._output) }) },
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.ntip, {can: can, msg: msg}) },
onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) },
onunload: function(can) { can._wss && can._wss.close() },
onrecord: function(can, msg) {
var zone = can.misc.sessionStorage(can, "web.chat.script:zone")
zone && can.runAction(can.request(), nfs.SCRIPT, [zone].concat(msg.cmds[0]))
},
onrecord: function(can, msg) { var zone = can.misc.sessionStorage(can, "web.chat.script:zone"); zone && can.runAction(can.request(), nfs.SCRIPT, [zone].concat(msg.cmds[0])) },
onaction_cmd: function(can) { can.onappend.style(can, html.HIDE) },
onstorm_select: function(event, can, river, storm) { event.isTrusted != undefined && can.onimport._data(can, chat.TUTOR, {time: can.base.Time(), type: chat.STORM, text: [river, storm].join(",")}) },
ontheme: function(event, can, theme) { can.onimport.tutor(event, can, chat.THEME, theme) },
onevent: function(event, can, query) { var msg = can.request(event)
can.onimport.tutor(event, can, msg.Option("_type")||event.type, query||can.page.getquery(can, event.currentTarget||event.target))
},
onindex: function(event, can, index) { can.onimport.tutor(event, can, ctx.INDEX, index) },
onproject: function(event, can, query) { can.onimport.tutor(event, can, html.ITEM, query) },
onremove: function(event, can, query) { can.onimport.tutor(event, can, mdb.REMOVE, query) },
oncommand_focus: function(can) { can.page.Select(can, can._output, ["div.cmd", html.INPUT], function(target) { can.onmotion.focus(can, target) }) },
onlayout: function(can, layout, before) { if (can.user.isMobile) { return }
can.page.ClassList.del(can, can._target, before), can.page.ClassList.add(can, can._target, layout)
@ -70,7 +100,6 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
})
}) }) },
})
// Volcanos(chat.ONEXPORT, {list: [NTIP, NLOG, NCMD, NKEY, html.WIDTH, html.HEIGHT, nfs.VERSION],
Volcanos(chat.ONEXPORT, {list: [cli.BEGIN, nfs.VERSION],
height: function(can) { can.onexport._float(can, html.HEIGHT, "can.view") },
width: function(can) { can.onexport._float(can, html.WIDTH, "can.data") },
@ -78,6 +107,7 @@ Volcanos(chat.ONEXPORT, {list: [cli.BEGIN, nfs.VERSION],
nlog: function(can) { can.onexport._float(can, NLOG, "can.debug") },
ncmd: function(can) { can.onexport._float(can, NCMD, "can.debug", [chat.ONREMOTE]) },
nkey: function(can) { can.onexport._float(can, NKEY, "can.localStorage") },
begin: function(can) { can.onexport._float(can, NKEY, "can.data") },
version: function(can) { can.onexport._float(can, NKEY, "can.runtime") },
_float: function(can, name, index, args, cb) { can.ui[name]? can.ui[name].onaction.close(): can.onappend._float(can, index, args||[], function(sub) { can.ui[name] = sub
can.base.isFunc(cb) && cb(sub), can.onmotion.delay(can, function() { sub.onaction.close = function() { can.page.Remove(can, sub._target), delete(can.ui[name]) } })
@ -139,7 +169,7 @@ Volcanos(chat.ONPLUGIN, {
}),
data: shy("网页数据", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can, root = can.Conf("_target")||can._root
arg[0]? can.page.AppendData(can, can._output, arg[0], arg[0].split(nfs.PT).pop(), can.core.Value(root, arg[0]), function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click():
can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click()
can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click()
can.onappend.style(can, "view")
}),
console: shy("网页终端", {
@ -174,34 +204,5 @@ Volcanos(chat.ONPLUGIN, {
daemon: can.misc.sessionStorage(can, "can.daemon"),
})).Display("/plugin/story/json.js")
}),
dir: shy("网页目录", [nfs.PATH, ice.LIST, ice.BACK], async function(can, msg, arg, cb) { var can = msg._can._fields? msg._can.sup: msg._can
async function list(key, root) { can._handle[key] = root
for await (const [name, handle] of root) { if (can.base.beginWith(name, nfs.PT)) { continue }
if (handle.kind == nfs.FILE) { var _file = await handle.getFile()
msg.Push(mdb.TIME, can.base.Time(new Date(_file.lastModified))), msg.Push(nfs.PATH, key+name), msg.Push(nfs.SIZE, can.base.Size(_file.size))
} else {
msg.Push(mdb.TIME, can.base.Time()), msg.Push(nfs.PATH, key+name+nfs.PS), msg.Push(nfs.SIZE, 0)
}
} can.onmotion.delay(can, function() { can.page.Select(can, can._output, "tr>th")[1].click(), can.page.Select(can, msg._can._output, "tr>th")[1].click() }, 50)
} can._handle = can._handle||{}; if (arg[0] == ctx.ACTION && arg[1] == ice.LIST) { arg = [] }
if (arg.length == 0) { if (!msg._event.isTrusted) { return msg.Echo(can.page.Format(html.INPUT, "", mdb.TYPE, html.BUTTON, mdb.NAME, ice.LIST, mdb.VALUE, "list")), cb(msg) }
await list("", can._handle[""] || await window.showDirectoryPicker()), cb(msg)
} else {
if (can.base.endWith(arg[0], nfs.PS)) { var path = can.base.trimSuffix(arg[0], nfs.PS)
if (path.indexOf(nfs.PS) == -1) {
var file = path, path = ""
} else {
var file = path.slice(path.lastIndexOf(nfs.PS)+1), path = path.slice(0, path.lastIndexOf(nfs.PS)+1)
} var handle = can._handle[path]
await list(arg[0], await handle.getDirectoryHandle(file)), cb(msg)
} else {
if (arg[0].indexOf(nfs.PS) == -1) {
var file = arg[0], path = ""
} else { var path = can.base.trimSuffix(arg[0], nfs.PS)
var file = path.slice(path.lastIndexOf(nfs.PS)+1), path = path.slice(0, path.lastIndexOf(nfs.PS)+1)
} var handle = can._handle[path], _file = await handle.getFileHandle(file)
var reader = new FileReader(); reader.onload = () => { msg.Echo(reader.result), cb(msg) }, reader.readAsText(await _file.getFile())
}
}
}),
}) })()
})
})()

View File

@ -1,30 +1,34 @@
fieldset.Header>div.output { line-height:21px; height:var(--header-height); overflow:hidden; }
fieldset.Header>div.output div.item { background-color:var(--panel-output-bg-color); padding:13.5px; height:var(--header-height); float:left; }
fieldset.Header>div.output div.item { background-color:var(--panel-output-bg-color); padding:13.5px; height:var(--header-height); float:left; display:flex; align-items:center; }
fieldset.Header>div.output div.item.title:first-child { font-size:var(--legend-font-size); font-style:italic; font-weight:bold; white-space:pre; overflow:hidden; }
fieldset.Header>div.output div.item.title img { height:var(--action-height); width:var(--action-height); }
fieldset.Header>div.output div.item.title img { padding:0; height:var(--action-height); width:var(--action-height); margin-right:var(--input-margin); }
fieldset.Header>div.output div.item.state { padding:13.5px 10px; float:right; }
fieldset.Header>div.output div.item.layout>i { margin-left:var(--input-padding); }
fieldset.Header>div.output div.item.layout:not(:hover)>i { visibility:hidden; }
fieldset.Header>div.output div.item.layout { padding-right:0; }
fieldset.Header>div.output div.item.theme { user-select:none; }
fieldset.Header>div.output div.item.theme { white-space:pre; user-select:none; }
fieldset.Header>div.output div.item.theme>i { margin-right:0; }
fieldset.Header>div.output div.item.theme>i:last-child { color:var(--disable-fg-color); }
fieldset.Header>div.output div.item.theme>i.bi-moon-stars:last-child { font-size:12px; }
fieldset.Header>div.output div.item.language { user-select:none; }
fieldset.Header>div.output div.item.language { white-space:pre; user-select:none; }
fieldset.Header>div.output div.item.language>span:last-child { color:var(--disable-fg-color); }
fieldset.Header>div.output div.item.usernick>i { margin-left:var(--input-padding); }
fieldset.Header>div.output div.item.usernick:not(:hover)>i { visibility:hidden; }
fieldset.Header>div.output div.item.usernick { padding-right:0; }
fieldset.Header>div.output div.item.avatar { padding:0; }
fieldset.Header>div.output div.item.avatar>img { height:var(--header-height); clip-path:circle(40%); }
fieldset.Header>div.output div.state { float:right; }
fieldset.Header>div.output div.search.title { padding:7px 5px; margin-left:15px; }
fieldset.Header>div.output div.search>i { color:unset; padding:7px; left:3px; }
fieldset.Header>div.output div.search>input { padding-left:25px; }
fieldset.Header>div.output div.search>span.icon { padding:var(--input-padding) var(--button-padding); }
fieldset.Header>div.output div.Action>div.tabs { height:100%; display:flex; justify-content:center; flex-wrap:wrap; overflow:auto; white-space:pre; }
fieldset.Header>div.output div.Action>div.tabs div.item { font-style:italic; }
fieldset.Header>div.output div.Action>div.tabs div.item.select { border-bottom:var(--notice-bg-color) solid 5px; }
fieldset.Header>div.output div.Action>div.tabs div.item:only-child { display:none; }
fieldset.Header>div.output div.item.search { padding:13.5px 5px; }
fieldset.Header>div.output div.item.search { padding:7px 5px; }
fieldset.Header>div.output div.item.search>i { color:unset; padding:7px; left:3px; }
fieldset.Header>div.output div.item.search>input { padding-left:25px; }
fieldset.Header>div.output div.item.search>span.icon { padding:var(--input-padding) var(--button-padding); }
fieldset.Header>div.output div.Action>div._tabs { white-space:pre; padding-left:100px; height:100%; overflow:auto; display:flex; flex-wrap:wrap; }
fieldset.Header>div.output div.Action>div._tabs div.tabs { font-style:italic; padding:13.5px 20px; display:flex; align-items:center; }
fieldset.Header>div.output div.Action>div._tabs div.tabs:only-child { display:none; }
body.mobile fieldset.Header>div.output div.item.usernick { display:none; }
body.mobile fieldset.Header>div.output div.item.search>i { padding:0 10px; }
body.mobile fieldset.Header>div.output div.item.search>input { width:256px; }
body.mobile fieldset.Header>div.output div.item.search>input:not(:focus) { border-color:var(--disable-fg-color); }
body:not(.mobile) fieldset.Header>div.output div.title:first-child { width:var(--river-width); }
body:not(.mobile) fieldset.Header>div.output div.title img { margin-right:var(--button-margin); }
body:not(.mobile) fieldset.Header:not(.all):not(.tabs)>div.output div.title:first-child { padding-left:var(--button-padding); width:unset; }
@ -34,17 +38,13 @@ body:not(.width6) fieldset.Header.tabview>div.output>div.Action>div.item.dream {
body:not(.width6) fieldset.Header.tabview>div.output>div.Action>div.item.desktop { display:none; }
body:not(.width6) fieldset.Header>div.output>div.Action>div.item.portal { display:none; }
body:not(.width6) fieldset.Header>div.output>div.item.language { display:none; }
/* body.width2>fieldset.Header>div.output div.item:not(.usernick):not(.avatar) { padding:13.5px 5px; } */
/* body.width3>fieldset.Header>div.output div.item:not(.usernick):not(.avatar) { padding:13.5px 5px; } */
body.width3>fieldset.Header>div.output>div.item.time { display:none; }
body.width3>fieldset.Header>div.output>div.item.avatar { margin-right:var(--plugin-margin); }
body.width3>fieldset.Header>div.output div.Action>div.tabs { padding-left:0; }
body.width4>fieldset.Header>div.output div.Action>div.tabs { padding-left:0; }
body.width2>fieldset.Header>div.output div.Action>div.tabs { padding-left:0; }
body.width2>fieldset.Header>div.output div.Action>div.tabs { padding-left:50px; }
body.width2>fieldset.Header>div.output>div.item.avatar { margin-right:var(--plugin-margin); }
body.width2>fieldset.Header>div.output>div.item.theme { display:none; }
body.width2>fieldset.Header>div.output>div.item.time { display:none; }
body.width2>fieldset.Header:not(.all):not(.tabs)>div.output div.item.title:first-child img { margin-right:0; }
body.width2>fieldset.Header:not(.all):not(.tabs)>div.output div.item.title:first-child span { display:none; }
// body.width2>fieldset.Header:not(.all):not(.tabs)>div.output div.item.title:first-child span { display:none; }
body.width2>fieldset.Footer:not(.all):not(.tabs)>div.output div.item.cmd { display:none; }
body.width2>fieldset.Footer:not(.all):not(.tabs)>div.output div.item.title { display:none; }

View File

@ -1,10 +1,16 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target), can.onimport._search(can, msg, target)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, target) {
can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._search(can, msg, target)
can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target)
},
_title: function(can, msg, target) {
can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, [
// can.user.title()||
decodeURIComponent((window == top? can.user.info.titles: "")||can.misc.Search(can, ice.POD)||location.host)
]), function(item) {
can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE, html.FLEX]], list: [{img: can.misc.ResourceFavicon(can)}, {text: item}], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
})
},
_title: function(can, msg, target) { can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, [
decodeURIComponent(can.misc.Search(can, ice.POD)||location.host)]), function(item) {
can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE, html.FLEX]], list: [{img: can.misc.ResourceFavicon(can)}, {text: item}], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
}) },
_state: function(can, msg, target) { can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [cli.QRCODE, chat.THEME, aaa.LANGUAGE, aaa.USERNICK, aaa.AVATAR, mdb.TIME]).reverse(), function(item) {
if (can.user.isMobile && can.base.isIn(item, cli.QRCODE, chat.THEME, aaa.LANGUAGE, mdb.TIME)) { return }
can.page.Append(can, target, [{view: [[html.ITEM, chat.STATE, item], "", can.Conf(item)||msg.Option(item)||""], onclick: function(event) {
@ -17,35 +23,37 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
item == cli.QRCODE && can.page.Appends(can, target, [{icon: icon.qrcode, title: can.user.trans(can, cli.QRCODE)}])
}}])
}) },
_search: function(can, msg, target) { if (!can.user.isTechOrRoot(can)) { return }
can.page.Append(can, target, [{view: [[html.ITEM, chat.STATE]], list: [{icon: mdb.SEARCH}], onclick: function(event) {
can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH}))
}}])
return
can._search = can.onappend.input(can, {type: html.TEXT, _className: "args trans", icon: icon.SEARCH, name: mdb.SEARCH, value: can.misc.Search(can, "_search"), onkeydown: function(event) { can.onkeymap.input(event, can)
event.key == code.ENTER && can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: event.target.value||""}))
}}, "", target, [chat.STATE])
can.onimport.menu(can, mdb.SEARCH, function() { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: can._search.value||""})) })
},
_avatar: function(can, msg) { can.user.isExtension || can.user.isLocalFile || can.page.Modify(can, "div.state.avatar>img", {src: can.onexport.avatar(can)}) },
_background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } can.onlayout.background(can, can.onexport.background(can)) },
_language: function(can) { can.page.Select(can, can._output, "div.item.language", function(target) {
can.page.Appends(can, target, can.user.info.language.indexOf("zh") == 0? [{text: "中"}, {text: " / "}, {text: "EN"}]: [{text: "EN"}, {text: " / "}, {text: "中"}])
}) },
_theme: function(can, theme) { return can.ui.diy&&can.ui.diy[theme]||theme },
_avatar: function(can, msg) { can.user.isExtension || can.user.isLocalFile || can.page.Modify(can, "div.state.avatar>img", {src: can.onexport.avatar(can)}) },
_background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } can.onlayout.background(can, can.onexport.background(can)) },
_search: function(can, msg, target) {
can._search = can.onappend.input(can, {type: html.TEXT, _className: "args trans", icon: icon.SEARCH, name: mdb.SEARCH, value: can.misc.Search(can, "_search"), onkeydown: function(event) { can.onkeymap.input(event, can)
event.key == code.ENTER && can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: event.target.value||""}))
}}, "", target, [chat.TITLE])
can.onimport.menu(can, mdb.SEARCH, function() { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: can._search.value||""})) })
},
_const: function(can) {
can.core.Item(html.value, function(key, value) {
html[key] = can.page.styleValueInt(can, "--"+can.base.replaceAll(key.toLowerCase(), "_", "-"))||value
})
},
_const: function(can) { can.core.Item(html.value, function(key, value) { html[key] = can.page.styleValueInt(can, "--"+can.base.replaceAll(key.toLowerCase(), "_", "-"))||value }) },
_time: function(can, target) { can.core.Timer({interval: 100}, function() { can.onimport.time(can, target) }), can.onappend.figure(can, {action: "date"}, target) },
time: function(can, target) { can.onimport.theme(can), target.innerHTML = can.user.time(can, null, can.Conf(mdb.TIME)||"%H:%M:%S %w") },
language: function(can, language) { can.user.toastConfirm(can, can.user.trans(can, "change language to "+language), aaa.LANGUAGE, function() {
can.runAction(event, aaa.LANGUAGE, [language == ice.AUTO? "": language], function(msg) { can.user.reload(true) })
}) },
avatar: function(event, can, avatar) { can.user.isExtension || can.user.isLocalFile || can.runAction(event, aaa.AVATAR, [avatar], function(msg) {
can.user.info.avatar = avatar, can.onimport._avatar(can, msg), can.user.toastSuccess(can)
}) },
background: function(event, can, background) { can.user.isExtension || can.user.isLocalFile || can.runAction(event, aaa.BACKGROUND, [background], function(msg) {
can.user.info.background = background, can.onimport._background(can, msg), can.user.toastSuccess(can)
}) },
theme: function(can, theme) { theme && theme != ice.AUTO && can.runAction({}, chat.THEME, [theme])
language: function(can, language) { can.user.toastConfirm(can, can.user.trans(can, "change language to "+language), aaa.LANGUAGE, function() {
can.runAction(event, aaa.LANGUAGE, [language == ice.AUTO? "": language], function(msg) { can.user.reload(true) })
}) },
theme: function(can, theme, event) { theme && theme != ice.AUTO && can.runAction({}, chat.THEME, [theme])
if (theme) { can.onengine.signal(can, "ontheme", can.request(event, {theme: theme})) }
theme && can.require(["/chat/theme/"+theme+".css"])
theme && can.misc.localStorage(can, "can.theme", can._theme = theme == ice.AUTO? "": theme) && can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: theme}))
theme = can.onexport.theme(can); var list = [html.LIGHT, html.WHITE]
var change = can.page.ClassList.has(can, document.body, theme); can.user.theme(can, theme), change || can.onimport._const(can)
@ -59,14 +67,16 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds])
return can.page.Append(can, can._output, [{view: cmds[0], list: can.core.List(can.base.getValid(cmds.slice(1), [cmds[0]]), function(item) {
return can.base.isString(item)? /* 1.string */ {view: [[html.ITEM, html.MENU, item], "", can.user.trans(can, item, trans)], onclick: function(event) { can.base.isFunc(cb) && cb(event, item, [item]) }}:
can.base.isArray(item)? /* 2.array */ {view: [[html.ITEM, html.MENU, item[0]]], list: [{text: can.user.trans(can, item[0], trans)}, {icon: icon.CHEVRON_DOWN}], onclick: function(event) { can.onkeymap.prevent(event)
can.onaction.carte(can.request(event, {_style: "header "+item[0]}), can, item.slice(1), function(event, button, meta) { can.base.isFunc(cb) && cb(event, button, item) }, trans)
}}: /* 3.others */ item
can.base.isArray(item)? /* 2.array */ {view: [[html.ITEM, html.MENU, item[0]]], list: [{text: can.user.trans(can, item[0], trans)}, {icon: icon.CHEVRON_DOWN}], onclick: function(event) { can.onkeymap.prevent(event)
can.onaction.carte(can.request(event, {_style: "header "+item[0]}), can, item.slice(1), function(event, button, meta) { can.base.isFunc(cb) && cb(event, button, item) }, trans)
}}: /* 3.others */ item
}) }])._target
},
})
Volcanos(chat.ONACTION, {_init: function(can) {},
onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth) },
onsize: function(can) {
can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth), can.onimport.theme(can)
},
onmain: function(can) {
if (window.parent == window && can.misc.Search(can, ice.MSG_SESSID) && can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)) && !can.user.isMailMaster) {
return can.misc.Search(can, ice.MSG_SESSID, "")
@ -78,31 +88,39 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
function show(msg) { var p = can.misc.Search(can, "redirect_uri")
if (p && location.pathname == web.BASIC_LOGIN) { return location.replace(can.base.MergeURL(p, ice.MSG_SESSID, can.misc.CookieSessid(can))) }
var p = can.misc.Search(can, ice.BACK); if (p && location.pathname == web.CHAT_SSO) { return location.reload() }
can.user.info.usernick = can.Conf(aaa.USERNICK)
can.user.info.username = msg.Option(ice.MSG_USERNAME)
can.user.info.userrole = msg.Option(ice.MSG_USERROLE)
can.user.info.nodetype = msg.Option(ice.MSG_NODETYPE)
can.user.info.nodename = msg.Option(ice.MSG_NODENAME)
can.user.info.userrole = msg.Option(ice.MSG_USERROLE)
can.user.info.username = msg.Option(ice.MSG_USERNAME)
can.user.info.usernick = can.Conf(aaa.USERNICK)
can.user.info.repos = msg.Option(nfs.REPOS)
can.user.info.email = msg.Option(aaa.EMAIL)
can.user.info.avatar = msg.Option(aaa.AVATAR)
can.user.info.background = msg.Option(aaa.BACKGROUND)
can.user.info.favicon = msg.Option("favicon")
can.user.info.titles = msg.Option("titles")||document.title
lang(msg, function() { can.onmotion.clear(can), can.onimport._init(can, can.request(), can._output), can.onengine.signal(can, chat.ONLOGIN) })
}
can.run(can.request({}, {_method: http.GET}), [], function(msg) { lang(msg), can.page.requireModules(can, [msg.Option("icon.lib")])
can.run(can.request({}, {_method: http.GET}), [], function(msg) { lang(msg)
if (msg.Option(ice.MSG_PROCESS) == "_open") {
// return can.user.jumps(msg.Option("_arg"))
}
can.ui.diy = can.base.Obj(msg.Option("diy"))||{}, can.__theme = can.onimport._theme(can, can.page.theme(function(theme) {
can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme = can.onimport._theme(can, theme)}))
})), can.onimport.theme(can)
can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme = can.onimport._theme(can, theme)})), can.onimport.theme(can)
})), can.onimport.theme(can, can.misc.Search(can, "theme")||"")
can.onaction._menus[3] = [aaa.LANGUAGE, ice.AUTO].concat(can.core.List(msg["language.list"], function(item) { return can.base.trimSuffix(item, nfs._JS) }))
can.user.isMobile && (msg["theme.list"] = ["dark.css", "light.css"])
can.onaction._menus[2] = [chat.THEME, ice.AUTO].concat(can.core.List(msg["theme.list"], function(item) { return can.base.trimSuffix(item, nfs._CSS) }))
can.require(can.core.List(msg["theme.list"], function(item) { return nfs.SRC_TEMPLATE+web.CHAT_HEADER+"/theme/"+item }), function() {
can.user.info.titles = msg.Option("titles")||document.title
if (can.base.beginWith(location.pathname, nfs.WIKI_PORTAL, web.CHAT_CMD+web.WIKI_PORTAL, web.CHAT_CMD+web.CHAT_OAUTH_CLIENT)) { return show(msg) }
if (location.pathname == nfs.PS && can.base.beginWith(msg.Option(ice.MAIN)||"", nfs.WIKI_PORTAL, web.CHAT_CMD+web.WIKI_PORTAL)) { return show(msg) }
msg.Option(mdb.PLUGIN) && can.onappend.plugin(can, {index: msg.Option(mdb.PLUGIN)}, function(sub) { can.onmotion.hidden(can, sub._target) }, document.body)
msg.Option(mdb.PLUGIN) && can.onappend.plugin(can, {space: msg.plugin[1], index: msg.Option(mdb.PLUGIN)}, function(sub) { can.onmotion.hidden(can, sub._target) }, document.body)
msg.Option(nfs.SCRIPT) && can.require(can.base.Obj(msg.Option(nfs.SCRIPT)), function(can) { can.onaction.source(can, msg) })
var tool = can._root.Action._conf.tool
if (can.Conf(aaa.USERNICK, (msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)).slice(0, 8)) || can.misc.Search(can, web.SHARE)
|| tool && can.base.isIn(tool[0]._command, web.PORTAL, aaa.OFFER)) { return show(msg) }
can.user.login(can, function() { can.onengine.signal(can, chat.ONMAIN, msg) }, msg)
if (can.Conf(aaa.USERNICK, (msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)).slice(0, 8))
|| can.misc.Search(can, web.SHARE) || tool && can.base.isIn(can.user.info._cmd = tool[0]._command, "web.chat.oauth.client", web.PORTAL, aaa.OFFER, aaa.APPLY)) { return show(msg) }
can.onlayout._init(can), can.user.login(can, function() { can.onengine.signal(can, chat.ONMAIN, msg) }, msg)
})
})
},
@ -117,18 +135,20 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
name: data.name, river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), theme: can._theme, title: can.user.title(), layout: can.getAction(html.LAYOUT),
}), code.WEBPACK, [], function(msg) { can.user.download(can, web.SHARE_LOCAL+msg.Result(), name, nfs.HTML), can.user.toastSuccess(can, "打包成功", code.WEBPACK) })
}) },
title: function(event, can) { var args = {}; can.core.List(can.onaction._params, function(key) { var value = can.misc.Search(can, key); value && (args[key] = value) })
var msg = can.request(event); can.onengine.signal(can, "ontitle", msg), can.core.List(msg.Append(), function(key) { args[key] = msg.Append(key) })
can.user.jumps(can.misc.MergeURL(can, args, true))
},
avatar: function(event, can) { var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, [`<img src="${src}">`]) },
avatar: function(event, can) { if (can.user.isMobile) { return can.onaction.usernick(event, can) }
var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, ["<img src='"+src+"'>"])
},
usernick: function(event, can) { can.onaction.carte(can.request(event, {_style: "header usernick"}), can, can.onaction._menus) },
shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN, mdb.NAME, can.user.title()]) },
theme: function(event, can) { can.page.Select(can, can._output, "div.item.theme>i:first-child", function(target) {
can.onimport.theme(can, can.onimport._theme(can, target.className == icon.SUN? html.DARK: html.LIGHT))
can.onimport.theme(can, can.onimport._theme(can, target.className == icon.SUN? html.DARK: html.LIGHT), event)
}) },
qrcode: function(event, can) { can.user.share(can, can.request(event, {_handle: ice.TRUE}), [ctx.ACTION, cli.QRCODE]) },
qrcode: function(event, can) { can.user.share(can, can.request(event, {link: location.href, _handle: ice.TRUE}), [ctx.ACTION, cli.QRCODE]) },
language: function(event, can) { can.onimport.language(can, can.user.info.language.indexOf("zh") == 0? "en-us": "zh-cn") },
email: function(event, can) { can.user.input(can.request(event, {to: can.user.info.email, subject: can.user.title()}), can, [{name: "to", _trans: "收件人", need: "must"}, "subject","content"], function(args) {
can.runAction(event, aaa.EMAIL, args, function() { can.user.toastSuccess(can) })
@ -138,33 +158,44 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
setnick: function(event, can) { can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(list) { can.runAction(event, aaa.USERNICK, [list[0]], function(msg) {
can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) { can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0])) }), can.user.toastSuccess(can)
}) }) },
setavatar: function(event, can) { can.user.input(event, can, [{name: aaa.AVATAR, value: can.Conf(aaa.AVATAR), action: mdb.ICONS}], function(list) { can.runAction(event, aaa.AVATAR, [list[0]], function(msg) {
can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.AVATAR)+" "+html.IMG, function(item) { item.src = can.misc.Resource(can, list[0]) }), can.user.toastSuccess(can)
}) }) },
setbackground: function(event, can) { can.user.input(event, can, [{name: aaa.BACKGROUND, value: can.Conf(aaa.BACKGROUND), action: mdb.ICONS}], function(list) { can.runAction(event, aaa.BACKGROUND, [list[0]], function(msg) {
}) }) },
clear: function(event, can) { can.onimport.background(event, can, "") },
logout: function(event, can) { can.user.logout(can) },
share: function(event, can, args) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[])) },
carte: function(event, can, list, cb, trans) { return can.user.carte(event, can, can.onaction, list, cb, null, trans) },
_params: [log.DEBUG, chat.TITLE],
_menus: [
cli.QRCODE, "shareuser",
[chat.THEME], [aaa.LANGUAGE],
// [nfs.SAVE, aaa.EMAIL, web.TOIMAGE, code.WEBPACK],
[aaa.USER, "setnick", web.CLEAR, aaa.LOGOUT],
[aaa.USER, "setnick", "setavatar", "setbackground", web.CLEAR, aaa.LOGOUT],
],
_trans: kit.Dict("shareuser", "共享用户", cli.QRCODE, "生成链接",
chat.THEME, "界面主题", aaa.LANGUAGE, "语言地区",
nfs.SAVE, "保存网页", aaa.EMAIL, "发送邮件", web.TOIMAGE, "生成图片", code.WEBPACK, "打包页面",
aaa.USER, "用户信息", "setnick", "设置昵称", aaa.PASSWORD, "修改密码", web.CLEAR, "清除背景", aaa.LOGOUT, "退出登录",
aaa.USER, "用户信息", "setnick", "设置昵称", "setavatar", "设置头像", "setbackground", "设置背景", aaa.PASSWORD, "修改密码", web.CLEAR, "清除背景", aaa.LOGOUT, "退出登录",
"change language to zh-cn", "切换语言为中文",
"change language to en-us", "切换语言为英文",
"en-us", "英文", "zh-cn", "中文", "auto", "默认",
"icons", {
shareuser: "bi bi-link-45deg",
theme: "bi bi-columns-gap",
language: "bi bi-spellcheck",
user: "bi bi-person-square",
},
),
})
Volcanos(chat.ONEXPORT, {
language: function(can) { return can.user.info.language },
avatar: function(can) { return can.user.info.avatar == "void"? "": can.user.info.avatar },
avatar: function(can) { return can.misc.Resource(can, can.user.info.avatar == "void"? "": can.user.info.avatar) },
background: function(can) { return can.user.info.background == "void"? "": can.user.info.background },
theme: function(can) { return can._theme || can.misc.SearchOrConf(can, chat.THEME) || can.__theme || (can.base.isNight()? html.DARK: html.LIGHT) },
theme: function(can) { return can._theme || can.misc.SearchOrConf(can, chat.THEME) || can.__theme || "" },
height: function(can) { return can._target.offsetHeight },
})
Volcanos(chat.ONPLUGIN, {

View File

@ -1,22 +1,19 @@
fieldset.River { width:var(--river-width); float:left; position:relative; }
fieldset.River>div.action:not(.hide) { margin-top:var(--plugin-margin); width:100%; position:absolute; }
fieldset.River>div.action div.item.notice input { border:none; }
fieldset.River>div.action div.item.notice input { border:0; }
fieldset.River>div.action div.item:hover input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
fieldset.River>div.output { transition:all .3s; }
/* fieldset.River>div.output { display:flex; flex-direction:column; align-items:center; } */
fieldset.River>div.output div.item { font-family:var(--legend-font-family); padding:var(--legend-padding); border-left:#00ffae solid 3px; }
fieldset.River>div.output div.item.select { color:var(--panel-hover-fg-color); }
fieldset.River>div.output div.item:hover { color:var(--panel-hover-fg-color); }
fieldset.River>div.output div.item.select { color:var(--panel-hover-fg-color); border-right:var(--notice-bg-color) solid 5px; }
fieldset.River>div.output div.item>i:first-child { margin-right:var(--button-margin); }
fieldset.River>div.output div.list div.item { border-left:#ccdc4c solid 3px; }
fieldset.River>div.output div.list { margin-left:var(--legend-padding); }
fieldset.River>div.output { margin:var(--river-margin) 0; margin-bottom:20px; }
fieldset.River>div.toggle { rotate:90deg; right:calc(50% - 5px); }
/* fieldset.River>div.toggle.prev { top:-10px; } */
fieldset.River>div.toggle.prev { top:0; }
fieldset.River>div.toggle.next { bottom:-52px; }
fieldset.River:not(:hover)>div.toggle { visibility:hidden; }
fieldset.River.page { display:none; }
fieldset.River:not(.all):not(.tabs):not(.page) { width:var(--header-height); }
fieldset.River:not(.all):not(.tabs):not(.page)>div.action { flex-direction:column; overflow:hidden; }
fieldset.River:not(.all):not(.tabs):not(.page)>div.action div.item { margin-right:0; }
@ -30,6 +27,10 @@ fieldset.River:not(.all):not(.tabs):not(.page)>div.output>div.item>i:last-child
fieldset.River:not(.all):not(.tabs):not(.page)>div.output>div.item>i:first-child { font-size:24px; }
fieldset.River:not(.all):not(.tabs):not(.page)>div.output div.item>i:first-child { margin-right:0; }
fieldset.River:not(.all):not(.tabs):not(.page)>div.output>div.list { margin-left:var(--input-margin); }
fieldset.River.tabview>div.action:not(.hide) { margin-top:calc(var(--plugin-margin) + var(--plugin-padding)); }
fieldset.River.page { display:none; }
fieldset.River.tabs>div.action:not(.hide) { margin-top:0; }
fieldset.River.tabview>div.action:not(.hide) { margin-top:calc(var(--plugin-margin) + var(--plugin-padding)); }
fieldset.River.tabview>div.output div.item { display:flex; align-items:center; justify-content:center; }
body.void fieldset.River>div.action { display:none; }
body.mobile fieldset.River>div.output { margin-top:16px; }
body.mobile fieldset.River>div.toggle.prev { top:-52px; }

View File

@ -1,12 +1,13 @@
(function() { const CAN_RIVER = "can.river", CAN_STORM = "can.storm"
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg), can.onappend.style(can, html.FLEX, can._action)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.onimport._main(can, msg), can.onappend.style(can, html.FLEX, can._action)
var select; can.page.Appends(can, can._output, msg.Table(function(item, index) {
return can.onimport._river(can, item, function(target) { (index == 0 || item.hash == can._main_river) && (select = target) })
})), select && select.click(), can.onimport._menu(can, msg)
},
_main: function(can, msg) { can.ui = {river_list: {}, storm_list: {}, sublist: {}}
var ls = can.misc.SearchHash(can); msg.Table(function(item) { item.main && (can._main_river = item.hash) })
can._main_river = ls[0]||can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||can._main_river||(can.user.info.nodetype == web.WORKER || can.misc.Search(can, ice.MSG_DEBUG) != ice.TRUE? "product": "project")
can._main_river = ls[0]||can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||can._main_river||(can.misc.Search(can, ice.MSG_DEBUG) == ice.TRUE? "project": "profile")
can._main_storm = ls[1]||can.misc.SearchOrConf(can, chat.STORM)||msg.Option(ice.MSG_STORM)
},
_river: function(can, meta, cb) { return {view: html.ITEM, title: meta.name, list: [{icon: meta.icon}, {text: meta.name}, {icon: icon.CHEVRON_DOWN}], _init: function(target) { can.ui.river_list[meta.hash] = target, cb(target) },
@ -17,7 +18,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg
} },
_menu: function(can, msg) { can.user.isMobile || can.user.mod.isPod? can.onmotion.hidden(can, can._action): can.onappend._action(can, can.onaction.list, can._action) },
})
Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: function(can) {
Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH],
_init: function(can) {
can.db.storm_list = {}, can.onmotion.hidden(can)
var next = can.page.unicode.next, prev = can.page.unicode.prev
can._prev = can.page.Append(can, can._target, [{view: [[html.TOGGLE, mdb.PREV], "", prev], onclick: function(event) {
@ -45,8 +47,9 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func
share: function(event, can) { can.core.CallFunc(can.ondetail.share, {event: event, can: can}) },
onsize: function(can, height) { var margin = 68, _margin = margin
can.page.style(can, can._output, html.MARGIN, "0px", html.HEIGHT, "", html.MAX_HEIGHT, "")
if (can.user.isMobile || !can.user.isTechOrRoot(can)) { margin = 16 }
if (can._output.offsetHeight < height-margin) {
margin += (height-margin-can._output.offsetHeight)/2
margin += (height-margin-can._output.offsetHeight)/4
} else {
can.page.style(can, can._output, html.MAX_HEIGHT, height-margin-16)
}
@ -62,7 +65,7 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func
if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOSTORM, can.request({}, {river: river})) }
can.db.storm_list[river] = msg.Table()
var _main_storm; msg.Table(function(item) { item.main && (_main_storm = item.hash) }), _main_storm = can._main_storm || _main_storm || (
can.user.info.nodetype == web.WORKER? web.DESKTOP: can.misc.Search(can, ice.MSG_DEBUG) != ice.TRUE? web.DREAM: "studio"
can.user.info.nodetype == web.WORKER? web.DESKTOP: can.misc.Search(can, ice.MSG_DEBUG) == ice.TRUE? "studio": (can.user.info.nodetype == web.SERVER? web.DREAM: "desktop")
)
var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) {
river == can._main_river && (item.hash == _main_storm) && (select = index)
@ -73,6 +76,7 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func
action: function(event, can, river, storm) {
can._scrollTop = can._output.scrollTop
can.page.Select(can, can._output, [html.DIV_LIST, html.DIV_ITEM], function(target) { can.page.ClassList.del(can, target, html.SELECT) })
can.onmotion.toggle(can, can.ui.sublist[river], true)
can.onmotion.select(can, can.ui.sublist[river], html.DIV_ITEM, can.ui.storm_list[can.core.Keys(river, storm)])
can.onmotion.select(can, can._output, html.DIV_ITEM, can.ui.river_list[river])
var list = can.db.storm_list[river];
@ -121,7 +125,8 @@ Volcanos(chat.ONDETAIL, {
{name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(args) { can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.misc.Search(can, {river: river, storm: msg.Result()}) }) }) },
})
Volcanos(chat.ONEXPORT, {width: function(can) { return can._target.offsetWidth },
Volcanos(chat.ONEXPORT, {
width: function(can) { return can._target.offsetWidth },
storm: function(can, msg, arg) { can.core.Item(can._root.river, function(river, value) { can.core.Item(value.storm, function(storm, item) { if (arg[1] != "" && storm.indexOf(arg[1]) == -1 && item.name.indexOf(arg[1]) == -1) { return }
msg.Push({ctx: ice.CAN, cmd: can._name, type: river, name: storm, text: shy("跳转", function(event) { can.onaction.action(event, can, river, storm) })})
}) }) },
@ -136,19 +141,24 @@ Volcanos(chat.ONEXPORT, {width: function(can) { return can._target.offsetWidth }
})
Volcanos(chat.ONENGINE, {
_engine: function(event, can, msg, panel, cmds, cb) {
function right(role) { if (!role || role == aaa.VOID) { return true }
return can.core.List(can.core.Split(can.user.info.userrole||aaa.VOID), function(userrole) {
if (can.base.isIn(userrole, role, aaa.TECH, aaa.ROOT)) { return true }
}).length > 0
}
if (typeof can.river == code.FUNCTION) { can.river = can.river(can) } var list = can.river
cmds.length == 0 && can.core.ItemOrder(list, mdb.ORDER, function(key, value) { if (!value) { return }
if (value.debug && can.misc.Search(can, ice.MSG_DEBUG) != ice.TRUE) { return }
if (value.nodetype && value.nodetype != can.user.info.nodetype) { return }
if (can.base.isIn(can.user.info.userrole, value.type||aaa.VOID, aaa.TECH, aaa.ROOT)) {
if (right(value.type)) {
can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||"", main: value.main||false})
}
})
if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false }
can.core.ItemOrder(river.storm, mdb.ORDER, function(key, value) { if (!value) { return }
if (value.nodetype && value.nodetype != can.user.info.nodetype) { return }
if (can.user.info.userrole == aaa.ROOT || can.base.isIn(value.type||"", "", aaa.VOID, can.user.info.userrole)) {
msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name, icon: value.icon||"", main: value.main||false})
if (right(value.type)) {
msg.Push({hash: key, name: can.user.isEnglish(can)? key: value.name||(can.user.trans(can, key)+" "+key), icon: value.icon||icon[key]||"", main: value.main||false})
}
}), can.base.isFunc(cb) && cb(msg); return true
},

View File

@ -1,3 +1,3 @@
fieldset.Search { padding:var(--plugin-padding); box-shadow:unset; position:fixed; left:var(--project-width); top:var(--header-height); }
fieldset.Search { padding:var(--plugin-padding); position:fixed; left:var(--project-width); top:var(--header-height); }
fieldset.Search>div.output>div.profile { max-width:unset; }
fieldset.Search>div.output table.content { width:100%; }

View File

@ -1,4 +1,5 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can.ui.content)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.onmotion.clear(can, can.ui.content)
var table = can.onappend.table(can, msg, function(value, key, index, data) { return {text: [can.base.isFunc(value) && value.help || value, html.TD], onclick: function(event) {
can.page.tagis(event.target, html.A) || can.onaction[can.db.type == mdb.FOREACH || event.ctrlKey? mdb.PLUGIN: mdb.SELECT](event, can, data)
}} }, can.ui.content, msg.append); can.onmotion.story.auto(can), can.onimport._size(can)
@ -6,8 +7,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can
can.onmotion.focus(can, can.ui.filter), msg.Length() == 1 && can.ui.profile.innerHTML == "" && can.page.Select(can, table, html.TD)[0].click()
},
_size: function(can) { can.ui && can.ui.content && can.getActionSize(function(left, top, width, height) {
can.page.style(can, can._target, {left: left||0, top: top||0, width: width}),
can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*10+(can.user.isMobile? 2: 1)*html.ACTION_HEIGHT+can.onexport.statusHeight(can))
can.page.style(can, can._target, {left: left||0, top: top||0, width: width})
can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*10+(can.user.isMobile? 2: 1)*html.ACTION_HEIGHT+can.onexport.statusHeight(can))
can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*10)) })
can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight, height/2))
}) },
@ -29,7 +30,9 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list
if (event.key == code.ENTER) { can.onkeymap.prevent(event); if (event.shiftKey) { return can.page.SelectOne(can, can.ui.content, [html.TBODY, html.TR, html.TD], function(target) { target.click() }) }
return event.ctrlKey? can.onaction.done(event, can): can.ui.input(event, event.target.value)
} if (event.ctrlKey) { return event.key == "0"? can.onaction.clear(event, can): can.onkeymap.selectCtrlN(event, can, can.ui.content, [html.TBODY, html.TR], function(target) { target.firstChild.click() }) }
event.key.length == 1 && can.onmotion.delayOnce(can, function() { can.onmotion.tableFilter(can, can.ui.content, event.target.value) }, 100, can._delay_filter = can._delay_filter||[])
event.key.length == 1 && can.onmotion.delayOnce(can, function() {
can.onmotion.tableFilter(can, can.ui.content, event.target.value)
}, 100, can._delay_filter = can._delay_filter||[])
}}), null, null, null, 10)
var key = can.misc.Search(can, "_search"); key && can.onmotion.delay(can, function() { can.onaction.onopensearch(can, can.request({}), "*", key) }, 1000)
},
@ -61,9 +64,8 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list
sub.onimport.size(sub, can.ConfHeight(), can.ConfWidth()-1, true)
}, can.ui.profile) }
if (data.ctx == ice.NFS && data.cmd == nfs.PACK) { var ls = can.misc.SplitPath(can, data.text)
can.runAction(event, ctx.RUN, [web.CODE_VIMER, ctx.ACTION, mdb.RENDER, data.type, ls[1], ls[0]], function(msg) { msg.Table(function(meta) {
plugin(meta)
}), can.onappend.board(can, msg.Result(), can.ui.profile) })
can.runAction(event, ctx.RUN, [web.CODE_VIMER, ctx.ACTION, mdb.RENDER, data.type, ls[1], ls[0]], function(msg) {
msg.Table(function(meta) { plugin(meta) }), can.onappend.board(can, msg.Result(), can.ui.profile) })
} else {
plugin(meta)
}

View File

@ -2,7 +2,10 @@ Volcanos(chat.ONACTION, {
run: function(event, can) { can.run(can.request(event, {_method: http.POST})) }, refresh: function(event, can) { can.run(can.request(event, {_method: http.GET})) },
list: function(event, can) { can.sup.isSimpleMode() || can.run(can.request(event, {_toast: event.isTrusted? ice.PROCESS: "" , _method: http.GET})) }, back: function(event, can) { can.sup.onimport.back(event, can.sup) },
onclick: function(event, can) { can.Conf(mdb.TYPE) == html.BUTTON && can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())), can.onkeymap.prevent(event) },
onchange: function(event, can) { can.Conf(mdb.TYPE) == html.SELECT && can.run(event) },
onchange: function(event, can) { if (can.Conf(mdb.TYPE) != html.SELECT) { return }
can.sup.onexport.session && can.sup.onexport.session(can.sup, "action:"+can.Conf(mdb.NAME), event.target.value)
can.run(can.request(event, {_toast: event.isTrusted? can.user.trans(can, ice.PROCESS, "处理"): "" , _method: http.GET}))
},
onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target); if (can.Conf(mdb.TYPE) == html.TEXTAREA && !event.ctrlKey) { return }
if (event.key == code.ENTER) { return can.onkeymap.prevent(event), can.run(event), can.onmotion.focus(can, event.target) }
if (!event.ctrlKey) { return } switch (event.key) {

54
plugin/input/color.js Normal file
View File

@ -0,0 +1,54 @@
Volcanos(chat.ONFIGURE, {color: {
_load: function(event, can, cb, target, name, value) {
if (target._done && target.value) { return can.onmotion.hidden(can, can._target, can.Status("total") > 0)} target._done = true
can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target)
can.runAction(event, mdb.INPUTS, [name, value||""], function(msg) {
name == ctx.INDEX && can.core.Item(can.onengine.plugin.meta, function(key) { msg.Push(ctx.INDEX, can.core.Keys(ice.CAN, key)) })
can._show(can, msg, cb, target, name)
})
},
_show: function(can, msg, cb, target, name) {
if (msg.Length() == 0 || msg.Length() == 1 && msg.Append(name) == target.value && target.value != "") { return can.onmotion.hidden(can) }
if (can.base.isIn(msg.append[msg.append.length-1], ctx.ACTION, "cb")) { msg.append = msg.append.slice(0, -1) } var list = {}
msg.Option(ice.TABLE_CHECKBOX, "")
can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, item) { value = item[key]
if (msg.append.length == 1 && index < 100 && list[value]) { return } list[value] = true
return {text: [value, html.TD, value == ""? html.HR: ""], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) {
can.page.style(can, target, html.BACKGROUND_COLOR, value)
can.close(); if (msg.cb && msg.cb[index]) { return msg.cb[index](value) }
var _cb = can.Conf("select"); if (_cb) { return _cb(target.value = value) } can.base.isFunc(cb) && cb(can, value, target.value)
}, _init: function(target) {
if (key == mdb.NAME) {
can.page.style(can, target.parentNode, html.BACKGROUND_COLOR, value)
}
}}
})
can.showIcons = function(value, icons, title) { can.ui = can.ui||{}
if (!can.ui.img) {
can.ui.img = can.page.insertBefore(can, [{type: html.IMG}], target)
can.ui.span = can.page.insertBefore(can, [{type: html.SPAN}], target)
can.onappend.style(can, mdb.ICONS, can.page.parentNode(can, target, html.TR))
can.page.style(can, target, html.COLOR, html.TRANSPARENT)
target._clear = function() { can.ui.img.src = can.misc.Resource(can, "usr/icons/icebergs.png"), can.ui.span.innerHTML = "" }
}
can.ui.img.src = can.misc.Resource(can, icons), can.ui.span.innerText = title||value
target.value = value, can.onmotion.hidden(can, can._target)
}
can.core.CallFunc([can.oninputs, "_show"], {event: event, can: can, msg: msg, target: target, name: name})
var style = msg.Option(ice.MSG_DISPLAY)? can.base.ParseURL(msg.Option(ice.MSG_DISPLAY)).style||name: name
can.core.CallFunc([can.sup.sub, "oninputs", style], {event: event, can: can, msg: msg, target: target, name: name})
can.layout(msg)
},
onfocus: function(event, can, meta, target, cbs, mod) { meta._force && mod.onclick(event, can, meta, target, cbs) },
onclick: function(event, can, meta, target, cbs) { (target.value == "" || meta._force) && cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
sub.sup = can._fields? can.sup: can
meta.msg && meta.msg.Length() > 0? sub._show(sub, meta.msg, cb, target, meta.name): sub._load(event, sub, cb, target, meta.name, target.value)
}) },
onblur: function(event, can, sub, cb) { sub && can.onmotion.delay(can, sub.close, 300) },
onkeyup: function(event, can, meta, cb, target, sub, last) { if (event.key == code.TAB) { return }
if (event.key == code.ENTER) { return meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event, target.value)? sub && sub.close(): last(event) }
if (!sub) { return } can.onmotion.toggle(can, sub._target, true)
sub.hidden() || can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden)>td:first-child", function(td) { return meta.select && (sub.close(), meta.select(target.value = td.innerText)), cb(sub, td.innerText, target.value), td })
|| can.onmotion.delayOnce(can, function() { can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target) }, target.value.length < 3? 500: 150)
},
}})

View File

@ -11,21 +11,29 @@ Volcanos(chat.ONFIGURE, {date: {
mdb.PREV, function() { now.setMonth(now.getMonth()-1), show(now) },
YEAR, function(event, can, button, value) { now.setFullYear(parseInt(value)), show(now) },
MONTH, function(event, can, button, value) { now.setMonth(parseInt(value)-1), show(now) },
mdb.NEXT, function() { now.setMonth(now.getMonth()+1), show(now) },
mdb.NEXT, function() { now.setMonth(now.getMonth()+1), show(now) }
)
var ui = can.page.Append(can, can._action, ["time", "date"])
can.onappend._action(can, [cli.CLOSE, [HOUR].concat(can.core.List(24)), [MINUTE].concat(can.core.List(0, 60, 5)), [SECOND].concat(can.core.List(0, 60, 5)), TODAY], ui.time, meta)
can.onappend._action(can, [mdb.PREV, [YEAR].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), [MONTH].concat(can.core.List(1, 13)), mdb.NEXT], ui.date, meta)
can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE], list: [{type: html.TBODY}]}]).tbody
can.page.Append(can, can._output, [{text: "请先选择时间,再选择日期"}])
target.value == "" && (now.setMinutes(now.getMinutes()>30? 30: 0), now.setSeconds(0))
function show(now) { can.Action(YEAR, now.getFullYear()), can.Action(MONTH, now.getMonth()+1)
can.Action(HOUR, now.getHours()), can.Action(MINUTE, parseInt(now.getMinutes()/5)*5), can.Action(SECOND, parseInt(now.getSeconds()/5)*5)
can.page.Appends(can, can._table, can.date.List(can, function(event, day) { day.setHours(now.getHours()), day.setMinutes(now.getMinutes()), day.getSeconds(now.getSeconds()), _cb(day), can.close() }, now))
can.Action(HOUR, now.getHours()), can.Action(MINUTE, parseInt(now.getMinutes()/30)*30), can.Action(SECOND, 0)
can.page.Appends(can, can._table, can.date.List(can, function(event, day) {
day.setHours(can.Action(HOUR)), day.setMinutes(can.Action(MINUTE)), day.getSeconds(can.Action(SECOND)), _cb(day), can.close()
}, now))
var l = can.date.solar2lunar(now); can.page.Appends(can, can._status, [{view: "today", inner: [l.gzYear, l.Animal+"年", l.cnMonth, l.cnDay, l.lunarFestival||l.festival||l.Term, l.Astro].join(lex.SP)}])
return now
} show(now), can._show = function(d) { d? _cb(show(now = new Date(now.getTime()+d*24*3600*1000))): _cb(show(now)) }
})},
onfocus: function(event, can, meta, target, cbs, mod) {
if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) }
},
onblur: function(event, can, sub, cb, target) {
if (target._selectonly) { return }
},
onkeydown: function(event, can, meta, cb, target, sub, last) { if (sub && sub.hidden()) { return last(event) } switch (event.key) {
case "n": can.page.SelectInput(can, sub._action, mdb.NEXT, function(target) { target.click(), sub._show() }); break
case "p": can.page.SelectInput(can, sub._action, mdb.PREV, function(target) { target.click(), sub._show() }); break

View File

@ -9,11 +9,10 @@ Volcanos(chat.ONFIGURE, {icon: {
can.close(), can.base.isFunc(cb) && cb(can, value.name, target.value)
target._icon.className = value.name
}}])
}), can.onappend._status(can, [mdb.TOTAL]), can.Status(mdb.TOTAL, msg.Length())
can.onlayout.figure({target: target}, can, can._target, false, 200)
}), can.layout(msg)
},
onclick: function(event, can, meta, target, cbs) { can.onmotion.focus(can, target) },
onfocus: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
onfocus: function(event, can, meta, target, cbs, mod) { meta._force && mod.onclick(event, can, meta, target, cbs) },
onclick: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
target._icon = target._icon || can.page.insertBefore(can, [{type: "i"}], target)
meta.msg && meta.msg.Length() > 0? sub._show(sub, meta.msg, cb, target, meta.name): sub._load(event, sub, cb, target, meta.name, target.value)
}) },
@ -23,11 +22,9 @@ Volcanos(chat.ONFIGURE, {icon: {
can.onmotion.hidden(can, target, target.title.indexOf(event.target.value) > -1)
})
can.page.Select(can, sub._output, html.TR, function(target) {
can.onmotion.hidden(can, target,
can.page.Select(can, target, html.TD, function(target) {
if (!can.page.ClassList.has(can, target, html.HIDE)) { return target }
}).length > 0
)
can.onmotion.hidden(can, target, can.page.Select(can, target, html.TD, function(target) {
if (!can.page.ClassList.has(can, target, html.HIDE)) { return target }
}).length > 0)
})
},
}})

View File

@ -2,19 +2,16 @@ Volcanos(chat.ONFIGURE, {icons: {
_load: function(event, can, cb, target, name, value) {
can.runAction(event, mdb.INPUTS, [mdb.ICONS], function(msg) { can._show(can, msg, cb, target, name) })
},
_show: function(can, msg, cb, target, name) { can.onmotion.clear(can)
var table = can.page.Append(can, can._output, [{type: html.TABLE}])._target, tr
_show: function(can, msg, cb, target, name) { var table = can.page.Appends(can, can._output, [{type: html.TABLE}])._target, tr
msg.Table(function(value, index) { if (index%5 == 0) { tr = can.page.Append(can, table, [{type: html.TR}])._target }
can.page.Append(can, tr, [{type: html.TD, title: value.icons, list: [{img: can.misc.Resource(can, value.icons), style: {width: 60, height: 60}}], onclick: function() {
can.close(), can.base.isFunc(cb) && cb(can, value.icons, target.value)
target._icon.src = can.misc.Resource(can, value.icons)
can.close(), can.base.isFunc(cb) && cb(can, value.icons, target.value), target._icon.src = can.misc.Resource(can, value.icons)
}}])
}), can.onappend._status(can, [mdb.TOTAL]), can.Status(mdb.TOTAL, msg.Length())
can.onlayout.figure({target: target}, can, can._target, false, 200)
}), can.layout(msg)
},
onclick: function(event, can, meta, target, cbs) { can.onmotion.focus(can, target) },
onfocus: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
target._icon = target._icon || can.page.insertBefore(can, [{type: "img"}], target)
onfocus: function(event, can, meta, target, cbs, mod) { meta._force && mod.onclick(event, can, meta, target, cbs) },
onclick: function(event, can, meta, target, cbs) { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
target._icon = target._icon || can.page.insertBefore(can, [{img: can.misc.Resource(can, "usr/icons/icebergs.png") }], target)
meta.msg && meta.msg.Length() > 0? sub._show(sub, meta.msg, cb, target, meta.name): sub._load(event, sub, cb, target, meta.name, target.value)
}) },
onblur: function(event, can, sub, cb) { sub && can.onmotion.delay(can, sub.close, 300) },

View File

@ -1,10 +1,10 @@
Volcanos(chat.ONFIGURE, {img: {
_init: function(can, meta, target) { target.value == meta.value && (target.value = ""); var images = can.core.Split(target.value)
var count = parseInt(meta.value||"1"), width = target.parentNode.offsetWidth; for (var n = 1; n < 10; n++) { if (n*n >= count) { width = (width/n-10); break } }
function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: can.base.MergeURL(can.misc.MergeURL(can, {_path: web.SHARE_CACHE+hash}, true), {pod: meta.space||undefined}), height: width, width: width}]) }
// function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: can.base.MergeURL(can.misc.MergeURL(can, {_path: web.SHARE_CACHE+hash}, true), {pod: meta.space||undefined}), height: width, width: width}]) }
function add(target, hash) { target._hash = hash, can.page.Appends(can, target, [{img: hash, height: width, width: width}]) }
function set() { target.value = can.page.SelectChild(can, target.parentNode, html.DIV, function(target) { return target._hash }).join(mdb.FS) }
can.onmotion.hidden(can, target)
can.onappend.style(can, html.FLEX, target.parentNode)
can.onmotion.hidden(can, target), can.onappend.style(can, html.FLEX, target.parentNode)
for (var i = 0; i < count; i++) {
can.page.Append(can, target.parentNode, [{view: html.FLEX, style: {
"clear": i%n == 0? "both": "none", height: width, width: width,

View File

@ -8,29 +8,72 @@ Volcanos(chat.ONFIGURE, {key: {
})
},
_show: function(can, msg, cb, target, name) {
if (msg.Length() == 0 || msg.Length() == 1 && msg.Append(name) == target.value && target.value != "" || msg.Length() == 1 && msg.Append(name) == "") { return can.onmotion.hidden(can) }
// msg.Option(ice.TABLE_CHECKBOX, "")
if (msg.Option(ice.TABLE_CHECKBOX) == ice.TRUE) { target._hold = true
can.onappend._action(can, [html.CANCEL, html.CONFIRM, msg.Length() > 5? html.FILTER: ""], can._action, {
cancel: function() { can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target) },
confirm: function() { var list = msg.Table()
can.base.isFunc(cb) && cb(can, can.page.Select(can, can._output, html.TR, function(target) {
if (can.page.ClassList.has(can, target, html.SELECT)) {
return list[target.dataset.index][msg.append[0]]
}
}).join(","), target.value)
can.onmotion.focus(can, target), can.onmotion.hidden(can, can._target)
},
})
}
if (msg.Length() == 0 || msg.Length() == 1 && msg.Append(name) == target.value && target.value != "") { return can.onmotion.hidden(can) }
if (can.base.isIn(msg.append[msg.append.length-1], ctx.ACTION, "cb")) { msg.append = msg.append.slice(0, -1) } var list = {}
can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, item) { value = item[key]
can.onmotion.clear(can), can.onappend.table(can.sup, msg, function(value, key, index, item) { value = item[key]
if (msg.append.length == 1 && index < 100 && list[value]) { return } list[value] = true
return {text: [value, html.TD, value == ""? html.HR: ""], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) {
return {text: [value, html.TD, [value == ""? html.HR: "", key]], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) {
can.onengine.signal(can, "onevent", can.request(event))
can.close(); if (msg.cb && msg.cb[index]) { return msg.cb[index](value) }
var _cb = can.Conf("select"); if (_cb) { return _cb(target.value = value) } can.base.isFunc(cb) && cb(can, value, target.value)
}, _init: function(target) {
can.onappend.style(can, "i-"+index, target.parentNode)
// can.onappend.style(can, "s-"+can.base.replaceAll(item[name], "/", "_"), target.parentNode)
}}
}), can.onappend._status(can, [mdb.TOTAL, mdb.INDEX]), can.Status(mdb.TOTAL, msg.Length()), can.Status("index", "-1")
can.onmotion.toggle(can, can._status, msg.Length() > 5), can.onmotion.toggle(can, can._target, can.Status("total") > 0)
}, can._output)
can.showIcons = function(value, icons, title) { can.ui = can.ui||{}
if (!can.ui.img) {
can.ui.img = can.page.insertBefore(can, [{type: html.IMG}], target)
can.ui.span = can.page.insertBefore(can, [{type: html.SPAN}], target)
can.onappend.style(can, mdb.ICONS, can.page.parentNode(can, target, html.TR))
can.page.style(can, target, html.COLOR, html.TRANSPARENT)
target._clear = function() { can.ui.img.src = can.misc.Resource(can, "usr/icons/icebergs.png"), can.ui.span.innerHTML = "" }
}
can.ui.img.src = can.misc.Resource(can, icons), can.ui.span.innerText = title||value
target.value = value, can.onmotion.hidden(can, can._target)
}
can.core.CallFunc([can.oninputs, "_show"], {event: event, can: can, msg: msg, target: target, name: name})
can.page.style(can, can._output, html.MAX_HEIGHT, can.page.height()/2, html.MIN_WIDTH, target.offsetWidth, html.MAX_WIDTH, can.Conf("style.width")||can.page.width()/2)
msg.append.length == 1 && can.page.ClassList.add(can, can._target, chat.SIMPLE)
can.onlayout.figure({target: target}, can, can._target, false, 200)
var display = msg.Option(ice.MSG_DISPLAY)? can.base.ParseURL(msg.Option(ice.MSG_DISPLAY)): {name: name}
if (display.title && !msg[display.title]) { display.title = msg.append[1] }
display.style && can.core.CallFunc([can.sup.sub, "oninputs", display.style], {event: event, can: can, msg: msg, target: target, name: display.name||name, title: display.title})
can.layout(msg)
},
onclick: function(event, can, meta, target, cbs) { target.value == "" && cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
onfocus: function(event, can, meta, target, cbs, mod) {
// can.onengine.signal(can, "onevent", can.request(event));
if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) }
meta._force && mod.onclick(event, can, meta, target, cbs)
},
onclick: function(event, can, meta, target, cbs) {
// can.onengine.signal(can, "onevent", can.request(event));
if (target._selectonly) { can.onmotion.delay(can, function() { target.blur() }) }
(target.value == "" || meta._force || target._selectonly) && cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return }
sub.sup = can._fields? can.sup: can
meta.msg && meta.msg.Length() > 0? sub._show(sub, meta.msg, cb, target, meta.name): sub._load(event, sub, cb, target, meta.name, target.value)
}) },
onblur: function(event, can, sub, cb) { sub && can.onmotion.delay(can, sub.close, 300) },
onkeydown: function(event, can, meta, cb, target, sub, last) { if (event.key == code.TAB) { return }
onblur: function(event, can, sub, cb, target) {
if (target._hold) { return }
if (target._selectonly) { return }
// can.onengine.signal(can, "onevent", can.request(event, {query: can.page.getquery(can, target)+","+target.value}))
sub && can.onmotion.delay(can, sub.close, 300)
},
onkeyup: function(event, can, meta, cb, target, sub, last) { if (event.key == code.TAB) { return }
if (event.key == code.ENTER) { return meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event, target.value)? sub && sub.close(): last(event) }
if (!sub) { return } can.onmotion.toggle(can, sub._target, true)
sub.hidden() || can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden)>td:first-child", function(td) { return meta.select && (sub.close(), meta.select(target.value = td.innerText)), cb(sub, td.innerText, target.value), td })
|| can.onmotion.delayOnce(can, function() { can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target) }, target.value.length < 3? 500: 150)
|| can.onmotion.delayOnce(can, function() { can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target) }, target.value.length < 3? 500: 150)
},
}})

View File

@ -1,7 +1,9 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.db.current = msg.TableDetail()
can.ui.target = can.page.Appends(can, can._output, [{type: html.IFRAME, src: can.db.current.link, height: can.ConfHeight(), width: can.ConfWidth()}])._target
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.db.current = msg.TableDetail()
// can.Conf("_width") && can.sup.onimport.size(can.sup, can.Conf("_height"), can.Conf("_width"), false)
can.page.style(can, can._output, "overflow-y", html.HIDDEN)
can.sup.onexport.link = function() { return can.db.current.link }
can.ui.target = can.page.Appends(can, can._output, [{type: html.IFRAME, src: can.db.current.link, height: can.ConfHeight(), width: can.ConfWidth()}])._target
can.sup.onexport.link = function() { return can.base.beginWith(can.db.current.link, "/")? location.origin+can.db.current.link: can.db.current.link }
},
layout: function(can) {
var item = can.db.current; can.sup.onexport.title(can, item.name||item.link.split(mdb.QS)[0])

View File

@ -1,91 +1,107 @@
fieldset.inner>div.output { justify-content:flex-start; }
fieldset.inner>div.output div.content { position:relative; }
fieldset.inner>div.output div.content td.text { height:var(--code-line-height); }
fieldset.inner>div.output div.content td.text span.keyword { color:var(--code-keyword); box-shadow:var(--keyword-box-shadow); }
fieldset.inner>div.output div.content td.text span.comment { color:var(--code-comment); }
fieldset.inner>div.output div.content td.text span.keyword { color:var(--code-keyword); box-shadow:var(--box-shadow); }
fieldset.inner>div.output div.content td.text span.function { color:var(--code-function); }
fieldset.inner>div.output div.content td.text span.constant { color:var(--code-constant); }
fieldset.inner>div.output div.content td.text span.string { color:var(--code-string); box-shadow:var(--box-shadow); }
fieldset.inner>div.output div.content td.text span.object { color:var(--code-object); }
fieldset.inner>div.output div.content td.text span.datatype { color:var(--code-datatype); }
fieldset.inner>div.output div.content td.text span.string { color:var(--code-string); box-shadow:var(--keyword-box-shadow); }
fieldset.inner>div.output div.content td.text span.package { color:var(--code-package); }
fieldset.inner>div.output>div.project div.zone div.action:not(.hide) { width:100%; }
fieldset.inner>div.output>div.project div.zone div.action>div.item { padding-right:0; width:100%; overflow:hidden; }
fieldset.inner>div.output>div.project div.zone div.action>div.item>input { padding-left:25px; width:100%; }
/* fieldset.inner>div.output>div.project div.zone.space>div.list div.output>div.item { margin:var(--input-margin) 0; width:calc(100% - 5px); } */
fieldset.inner>div.output>div.project div.zone.space>div.list div.output>div.item:hover { background-color:var(--hover-bg-color); }
fieldset.inner>div.output>div.project div.zone.repos>div.list div.output>div.item { margin:0; width:100% !important; }
fieldset.inner>div.output>div.project div.zone.repos>div.list div.output>div.item:hover { background-color:var(--hover-bg-color); }
fieldset.inner>div.output>div.layout>div.tabs { font-size:var(--code-font-size); display:none; }
fieldset.inner>div.output>div.layout>div.tabs>div:hover { background-color:unset; color:unset; box-shadow:unset; }
fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs { padding-right:0; margin-left:5px; }
fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); color:unset; border-top-left-radius:var(--plugin-radius); border-top-right-radius:var(--plugin-radius); box-shadow:var(--box-shadow); }
fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { background-color:var(--output-bg-color); color:unset; border-top-left-radius:var(--plugin-radius); border-top-right-radius:var(--plugin-radius); border-bottom:lightgray solid 2px; box-shadow:var(--box-shadow);}
fieldset.inner>div.output div.content td.text span.datatype { color:var(--code-datatype); }
fieldset.inner>div.output div.content td.text span.object { color:var(--code-object); }
fieldset.inner>div.output>div.project { font-family:var(--code-font-family); }
fieldset.inner>div.output>div.project div.list { border-left:none; }
fieldset.inner>div.output>div.project div.item.select:not(:hover) { background-color:unset; }
fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs { border-top:var(--box-border3); border-top-color:transparent; }
fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { box-shadow:var(--legend-box-shadow); background-color:var(--output-bg-color); border-top:var(--box-notice3); }
fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs:hover { box-shadow:var(--legend-box-shadow); background-color:var(--output-bg-color); }
fieldset.inner>div.output>div.layout>div.path { font-size:var(--code-font-size); display:none; }
fieldset.inner.float>div.output>div.layout>div.path { font-size:var(--code-font-size); display:flex; }
fieldset.Action.tabview fieldset.plugin.inner>div.output>div.layout>div.path { font-size:var(--code-font-size); display:flex; }
fieldset.inner>div.output>div.layout>div.path:not(.hide) { box-shadow:var(--legend-box-shadow); font-style:italic; cursor:pointer; justify-content:flex-start; align-items:center; }
fieldset.inner>div.output>div.layout>div.path>a { padding:var(--input-padding); }
fieldset.inner>div.output>div.layout>div.path>a:hover { background-color:var(--hover-bg-color); }
fieldset.inner>div.output>div.layout>div.path>span { padding:var(--input-padding); white-space:pre; }
fieldset.inner>div.output>div.layout>div.path>span:hover { background-color:var(--hover-bg-color); }
fieldset.inner>div.output>div.layout>div.path>span._space:hover { background-color:unset; }
fieldset.inner>div.output>div.layout>div.path>span.view { font-style:normal; font-size:22px; padding:0 var(--input-padding); }
body.windows fieldset.inner>div.output>div.layout>div.path>span.view { font-size:18px; }
fieldset.inner>div.output>div.layout>div.display h1 { border-bottom:var(--box-border); margin:var(--title-margin) 0; }
fieldset.inner>div.output>div.layout>div.display h2 { border-bottom:var(--box-border); margin:var(--title-margin) 0; }
fieldset.inner>div.output>div.layout>div.display pre>code { padding-left:var(--table-padding); border-left:var(--code-border-color) solid 5px; display:block; }
fieldset.inner>div.output>div.layout>div.display pre>code { padding-left:var(--table-padding); border-left:var(--box-notice3); display:block; }
fieldset.inner>div.output>div.layout>div.display div.code { white-space:unset; padding:var(--table-padding); }
fieldset.inner>div.output>div.layout>div.display div.status>div { padding:var(--input-padding); float:left; }
fieldset.inner>div.output>div.layout>div.display div.status { position:sticky; bottom:0; }
fieldset.inner>div.output>div.layout>div.display div.status>div { padding:var(--input-padding); float:left; }
fieldset.inner>div.output>div.layout>div.layout { justify-content:flex-start; }
fieldset.inner>div.output>div.layout>div.layout>div.profile h1 { border-bottom:var(--box-border); margin:var(--title-margin) 0; }
fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { border-bottom:var(--box-border); margin:var(--title-margin) 0; }
fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { padding-left:var(--table-padding); border-left:var(--code-border-color) solid 5px; display:block; }
fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { padding-left:var(--table-padding); border-left:var(--box-notice3); display:block; }
fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:var(--table-padding); }
fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { padding:var(--input-padding); float:left; }
fieldset.inner>div.output>div.layout>div.layout div.content div.tips { line-height:var(--code-line-height); color:var(--disable-fg-color); font-style:italic; position:absolute; top:0; right:10px; }
fieldset.inner>div.output>div.layout>div.layout>div.profile>div.status { background-color:var(--output-bg-color); height:var(--action-height); overflow:auto; position:sticky; bottom:0; }
fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset>form.option>div.item.text input { max-width:80px; }
fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset>div.action>div.item.text input { max-width:80px; }
fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { font-style:italic; font-size:var(--status-font-size); padding:var(--input-padding); float:left; }
fieldset.inner>div.output>div.layout>div.layout>div.content div.tips { color:var(--disable-fg-color); font-style:italic; line-height:var(--code-line-height); position:absolute; top:0; right:10px; }
fieldset.inner>div.output>div.layout>div.layout>fieldset.story { box-shadow:unset; }
fieldset.inner.cmd>div.output>div.layout>div.tabs:not(.hide) { background-color:var(--plugin-bg-color); height:var(--code-tabs-height); display:flex; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div { height:var(--code-tabs-height); }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon>div.icon { font-size:26px; line-height:32px; padding:2px 5px; position:sticky; top:0; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs { justify-content:flex-start; flex-grow:1; flex-wrap:wrap; overflow:auto; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:unset; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs { justify-content:flex-start; flex-grow:1; flex-wrap:wrap; overflow:auto; display:flex; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:unset; color:unset; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>div.tabs { padding:var(--input-padding) var(--button-padding); height:var(--code-tabs-height); display:flex; align-items:center; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div { white-space:pre; padding:10px; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head { display:flex; flex-direction:row-reverse; flex-shrink:0; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div { padding:0 var(--input-padding); display:flex; align-items:center; flex-shrink:0; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.online { margin-left:0 !important; margin-right:0 !important; flex-direction: row-reverse; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.online img { height:24px; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar { padding:0; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar>img { height:var(--code-tabs-height); clip-path:circle(40%); }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.qrcode i { margin-top:3px; }
fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar>img { height:32px; clip-path:circle(40%); }
fieldset.inner.cmd>div.output>div.layout>div.path:not(.hide) { display:flex; }
fieldset.inner>div.output>div.layout>div.path:not(.hide) { font-style:italic; box-shadow:var(--box-shadow); cursor:pointer; justify-content:flex-start; }
fieldset.inner>div.output>div.layout>div.path>a { padding:var(--input-padding) var(--button-padding); }
fieldset.inner>div.output>div.layout>div.path>a:hover { background-color:var(--hover-bg-color); }
fieldset.inner>div.output>div.layout>div.path>span { padding:var(--input-padding); }
fieldset.inner>div.output>div.layout>div.path>span:hover { background-color:var(--hover-bg-color); }
fieldset.inner>div.output>div.layout>div.path span.func { padding:var(--input-padding); margin-left:80px; }
fieldset.inner>div.output>div.layout>div.path span.mode { padding:var(--input-padding); margin-left:80px; }
body.width2 fieldset.inner>div.output>div.layout>div.path span.mode { display:none; }
/* body.width2 fieldset.inner>div.output>div.layout>div.path span.mode { display:none; } */
body.mobile fieldset.inner>div.output>div.layout>div.path span.func { display:none; }
body.mobile fieldset.inner>div.output>div.layout>div.path span.mode { display:none; }
body:not(.mobile) fieldset.inner>div.output>div.layout>fieldset.plug { bottom:var(--action-height); }
fieldset.inner>div.output>div.layout>div.path span.space { flex-grow:1; }
fieldset.inner>div.output>div.layout>div.path span.view { font-size:22px; padding:0 var(--input-padding); margin-top:-5px; float:right; }
fieldset.inner>div.output>div.layout>fieldset.plug.output { white-space:pre; }
/* fieldset.inner.cmd>div.output>div.layout>div.plug { height:var(--action-height); position:fixed; right:0; bottom:0; overflow:auto; } */
fieldset.inner.cmd>div.output>div.layout>div.plug { height:var(--action-height); overflow:auto; }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend { font-size:var(--legend-font-size); font-style:italic; float:right; padding:0 var(--input-padding); }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend:hover { color:unset; }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend>span.remove { padding:0 var(--input-padding); height:30px; }
fieldset.inner.cmd>div.output>div.layout>div.plug { box-shadow:var(--th-box-shadow); background-color:var(--plugin-bg-color); height:var(--action-height); overflow:auto; }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend { padding:0 var(--input-padding); padding-right:0; margin-right:0; float:right; }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend:hover { box-shadow:var(--notice-box-shadow); }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend>span.remove { padding:0 var(--input-padding); }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend>span.remove:hover { background-color:var(--hover-bg-color); }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend:not(:hover)>span.remove { visibility:hidden; }
fieldset.inner>div.output>div.layout>div.layout>div.profile fieldset.xterm.story>form.option>div.item.hash input { width:120px; }
div.path span.item { padding:var(--input-padding); }
div.carte.cmd.float { font-size:var(--code-font-size); } div.carte.cmd.float div.item { padding:var(--input-padding); }
div.carte.path.float { font-size:var(--code-font-size); }
div.carte.path.float div.item { padding:var(--input-padding); }
div.carte.path.float div.item.private { color:var(--disable-fg-color); }
div.vimer.open.float td:first-child { display:none; }
div.vimer.open.float td:nth-child(2) { display:none; }
div.vimer.plug.float div.item.text input { width:var(--river-width); }
div.layout.flex>input.current { clear:both; }
tr.line>td.line { user-select:none; border-right:var(--box-border); }
fieldset.inner fieldset.plug.can._plugin.search>form.option>div.item.value input { width:var(--project-width); }
fieldset.inner fieldset.plug.can._plugin.search>form.option>div.item.filter input { width:var(--project-width); }
fieldset.inner fieldset.plug.can._plugin.search>div.output>table.content tr td { cursor:pointer; }
fieldset.inner.float>div.output>div.layout>div.path { font-size:var(--code-font-size); display:flex; }
fieldset.Action.tabview fieldset.plugin.inner>div.output>div.layout>div.path:not(.hide) { font-size:var(--code-font-size); display:flex; }
fieldset.inner:not(.monaco)>div.output div.content>tr.line * { font-family:var(--code-font-family); font-size:var(--code-font-size); }
fieldset.inner.plugin>div.output>div.layout>div.layout div.content tr.line.select>td.line { background-color:var(--notice-bg-color); color:white; }
fieldset.vimer.plugin>div.output>div.layout>div.layout div.content tr.line.select>td.line { background-color:unset; color:unset; }
div.carte.inner.mode.float div.item { padding:var(--input-padding); }
div.carte.inner.path.float div.item { padding:var(--input-padding); }
div.carte.inner.path.float div.item.private { color:var(--disable-fg-color); }
div.input.inner.find.float div.action div.item { margin:var(--input-margin); }
div.input.inner.find.float div.action div.item.text input { width:var(--project-width); }
div.input.inner.find.float div.action div.item.close span { display:none; }
div.input.inner.find.float div.action div.item.replace input { border:var(--box-danger); }
div.input.inner.open.float td:first-child { display:none; }
div.input.inner.open.float div.item.text input[type=text] { width:100% !important; }
div.input.inner.open.float td:nth-child(2) { display:none; }
tr.line>td.line { border-right:var(--box-border); cursor:pointer; -webkit-user-select:none; }
tr.line>td.line { text-align:right; line-height:var(--code-line-height); padding:0 var(--button-padding); position:sticky; left:0; }
tr.line>td.text { white-space:pre; line-height:var(--code-line-height); padding-left:var(--input-padding); width:100%; }
tr.line:hover { background-color:var(--hover-bg-color); }
tr.line.insert { background-color:#283e2d; } tr.line.delete { background-color:#3c2626; }
body.light tr.line.insert { background-color:#ffeef0; } body.light tr.line.delete { background-color:#e6ffed; }
body.white tr.line.insert { background-color:#ffeef0; } body.white tr.line.delete { background-color:#e6ffed; }
fieldset.inner:not(.monaco)>div.output div.content>tr.line * { font-family:var(--code-font-family); font-size:var(--code-font-size); }
tr.line.delete { background-color:#3c2626; }
tr.line.insert { background-color:#283e2d; }
body div.input.inner.find.float div.action>div.item {
float:left;
}
body div.input.inner.find.float div.action>div.item>input {
min-width:unset;
}
body.light tr.line.delete { background-color:#ffeef0; }
body.light tr.line.insert { background-color:#e6ffed; }
body.white tr.line.delete { background-color:#e6ffed; }
body.white tr.line.insert { background-color:#ffeef0; }
body.width2 fieldset.inner>div.output>div.layout>div.path span.mode { display:none; }
body.mobile fieldset.inner>div.output>div.layout>div.path span.func { display:none; }
body.mobile fieldset.inner>div.output>div.layout>div.path span.mode { display:none; }
body.light fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>div.tabs { margin-right:var(--button-margin); }
body:not(.mobile) fieldset.inner>div.output>div.layout>fieldset.plug { bottom:var(--action-height); }
body:not(.windows) fieldset.inner>div.output>div.project * { font-family:var(--code-font-family); font-size:var(--code-font-size); }
body:not(.windows) fieldset.inner>div.output>div.layout>div.tabs { font-family:var(--code-font-family); font-size:var(--code-font-size); }
body:not(.windows) fieldset.inner>div.output>div.layout>div.path { font-family:var(--code-font-family); font-size:var(--code-font-size); }
body.windows fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon>div.icon { font-size:20px !important; padding-top:6px; }
body.windows fieldset.inner>div.output>div.layout>div.path span.view { margin-top:0; }
body.windows fieldset.inner>div.output>div.layout>div.path span.view { font-style:normal; }

View File

@ -1,104 +1,60 @@
(function() {
const RECOVER_TABS = "recover:tabs", RECOVER_TOOL = "recover:tool"
const PROJECT_HIDE = "project:hide", TABVIEW_HIDE = "tabview:hide"
const PROFILE_ARGS = "profile:args:", DISPLAY_ARGS = "display:args:"
const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "selectLine"
const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0])
can.core.List([nfs.PATH, nfs.FILE, nfs.LINE], function(key) { msg.Option(key) && can.Option(key, msg.Option(key)) })
can.Mode(msg.Option("mode")||can.Mode()), (msg.Option(nfs.FILE) == lex.SP || can.Option(nfs.FILE) == lex.SP) && can.Option(nfs.FILE, "")
if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE), can.sup.Mode(chat.SIMPLE) }
can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) {
if (can.base.beginWith(p, nfs.USR_LOCAL_WORK, "C:/") || can.base.endWith(p, "-dict/") || can.base.isIn(p,
nfs.USR_INTSHELL,
nfs.USR_WEBSOCKET, nfs.USR_GO_QRCODE, nfs.USR_GO_GIT, nfs.USR_ICONS, nfs.USR_GEOAREA, nfs.USR_PROGRAM, nfs.USR_NODE_MODULES,
)) { return }
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
}), can.onmotion.clear(can), can.onappend.style(can, code.INNER), can.sup.onimport._process = function(_can, msg) {
if (msg.OptionProcess() == ice.PROCESS_HOLD) { return true }
if (msg.OptionProcess() == ice.PROCESS_REWRITE) {
var args = {}, arg = msg._arg; for (var i = 0; i < arg.length; i += 2) { args[arg[i]] = arg[i+1] }
can.onimport.tabview(can, args.path, args.file, args.line)
}
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.onappend.style(can, code.INNER), can.Mode(msg.Option("mode")||can.Mode())
if (can.Mode() == ice.MSG_RESULT) {
can.Conf("_width", can.base.Max(can.ConfWidth(), window.innerWidth-12))
msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE), can.sup.Mode(chat.SIMPLE)
can.Option(nfs.FILE, can.Conf(nfs.FILE)||can.Option(nfs.FILE))
}
can.db = {paths: paths, tabview: {}, history: [], _history: [], toolkit: {}}, can.db.tabview[can.onexport.keys(can)] = msg
can.onmotion.clear(can, can._output), msg.result = msg.result||[""]
var paths = can.core.Split(can.Option(nfs.PATH)); can.Option(nfs.PATH, paths[0])
can.core.List([nfs.PATH, nfs.FILE, nfs.LINE], function(key) { msg.Option(key) && can.Option(key, msg.Option(key)) })
can.db = {tabview: {}, history: [], _history: [], toolkit: {}}, can.db.tabview[can.onexport.keys(can)] = msg
can.db.hash = can.isCmdMode()? can.misc.SearchHash(can): []
can.ui = can.onappend.layout(can, [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]])
can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display, can.onmotion.hidden(can, can.ui.plug)
can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
if (can.Conf(ctx.STYLE) == html.OUTPUT) { can.onmotion.hidden(can, can.ui.project), can.page.style(can, can.ui.content, html.HEIGHT, "") }
var args = can.misc.SearchHash(can), tabs = can.onexport.session(can, RECOVER_TABS), tool = can.onexport.session(can, RECOVER_TOOL)
can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display
can.onmotion.clear(can, can.ui.project), can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs), can.onmotion.hidden(can, can.ui.plug)
can.db.value = {}
var show = !can.user.isMobile
switch (can.Mode()) {
case chat.SIMPLE: // no break
case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break
case chat.FLOAT: break
case chat.CMD: can.onappend.style(can, html.OUTPUT)
can.onexport.session(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project)
if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) }
can.onengine.listen(can, chat.ONUNLOAD, function() { can.onexport.recover(can) })
tool = tool||(can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []).reverse()), msg.Option(ice.MSG_TOOLKIT, "[]")
if (can.onexport.session(can, PROJECT_HIDE) == html.HIDE) { show = false }
if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { show = false } else { can.onmotion.toggle(can, can.ui.tabs, true), can.onmotion.toggle(can, can.ui.plug, true) }
var tool = (can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []).reverse()); msg.Option(ice.MSG_TOOLKIT, "[]")
can.onimport._tabs(can), tool && tool.length > 0? can.core.Next(tool, function(item, next) { can.onimport.toolkit(can, item, next) }): can.onmotion.hidden(can, can.ui.plug)
case chat.FULL: // no break
default: can.user.isMobile && can.onmotion.hidden(can, can.ui.project), can.onimport.project(can, paths), can.onimport._tabs(can)
}
can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (!can.isCmdMode()) { return }
if (tabs) {
can.core.Next(tabs, function(item, next) { can.onimport.tabview(can, item[0], item[1], item[2], function() { can.onmotion.delay(can, next, 300) }) }, function() {
args.length > 0 && can.onimport.tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1])
})
} else {
args.length > 0 && can.onimport.tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1])
}
tool && can.core.Next(tool, function(item, next) { can.onimport.toolkit(can, item, next) })
}), can.onkeymap._build(can)
can.ui.profile.onclick = function(event) { if (can.page.tagis(event.target, html.A)) {
var link = can.misc.ParseURL(can, event.target.href); if (!link.cmd) { return } can.onkeymap.prevent(event)
link.cmd == web.CODE_VIMER? can.onimport.tabview(can, link.path, link.file, link.line): can.onimport.tabview(can, link.path, link.cmd, ctx.INDEX)
} }, can.base.isFunc(cb) && cb(msg)
default: can.onmotion.toggle(can, can.ui.project, show), can.onimport.project(can, can.db.paths = paths), can.onkeymap._build(can)
} can.onimport.layout(can), can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { cb && cb(msg) })
},
_tabs: function(can) { if (!can.isCmdMode()) { return can.ui._tabs = can._action }
var ui = can.page.Append(can, can.ui.tabs, ["icon", "tabs", "head"]); can.ui._tabs = ui.tabs
can.page.Append(can, ui.icon, can.core.List([
{name: can.page.unicode.menu, onclick: function() { can.user.carte(event, can, can.onaction, can.onaction.list) }},
{name: can.page.unicode.refresh, style: {"font-size": 26, "padding-top": 2}, onclick: function() { location.reload() }},
], function(item) { return can.base.Copy(item, {view: [[html.ITEM, html.ICON], "", item.name]}) }))
can.onappend.style(can, html.FLEX, ui.head)
can.onappend.style(can, html.FLEX, ui.tabs)
can.onappend.style(can, html.FLEX, ui.icon)
can.page.Append(can, ui.head, can.user.header(can).reverse())
var ui = can.page.Append(can, can.ui.tabs, ["tabs", "head"]); can.ui._tabs = ui.tabs, can.page.Append(can, ui.head, can.user.header(can))
},
__tabPath: function(can, cache) { var target = can.ui.path; can.onappend.style(can, html.FLEX, can.ui.path)
can.onimport._tabPath(can, nfs.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(p) {
var ls = can.onexport.split(can, p); can.onimport.tabview(can, ls[0], ls[1])
}, target), can.onimport._tabFunc(can, target, cache), can.onimport._tabMode(can)
can.page.Append(can, target, [{view: [["item", "space"], html.SPAN]}])
can.onimport._tabIcon(can)
target.ondblclick = function(event) { if (event.target != target) { return }
var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can)
can.isCmdMode() && can.onexport.session(can, TABVIEW_HIDE, show? "": html.HIDE)
}
_tabIcon: function(can) {
can.page.Append(can, can.ui.path, can.core.Item({
"\u271A": shy({transform: "translate(0 2px)"}, function(event) { can.onaction.open(event, can, "open") }),
"\u2756": shy({}, function(event) { can.onaction.plug(event, can, "plug") }),
"\u25E7": function(event) { var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can), can.isCmdMode() && can.onexport.session(can, PROJECT_HIDE, show? "": html.HIDE) },
"\u25E8": shy({transform: "rotate(90deg) translate"+(can.user.isWindows? "(-2px)": "(1px,-2px)")}, function(event) {
if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } can.onaction.exec(event, can) }),
"\u25E8 ": shy({width: 32}, function(event) { if (can.page.isDisplay(can.ui.profile)) {
can._msg._profile_hidden = true
return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } can.onaction.show(event, can) }),
}, function(text, cb) { return cb && {text: [text, html.SPAN, html.VIEW], style: cb.meta, onclick: cb} }))
},
_tabPath: function(can, ps, key, value, cb, target) { var args = value.split(mdb.FS); can.onmotion.clear(can, can.ui.path)
can.core.List(can.core.Split(args[0], ps), function(value, index, list) {
can.page.Append(can, target, [{text: [value+(index<list.length-1? ps: ""), "", html.ITEM], onclick: function(event) {
can.onimport.tabPath(event, can, ps, key, ps == nfs.PT? list.slice(0, index).join(ps): (list.slice(0, index).join(ps)||nfs.PT)+ps, cb)
}}])
}); var index = args[0]
can.core.List(args.slice(1), function(val) { can.page.Append(can, target, [{text: [val, "", html.ITEM], onclick: function(event) {
can.runAction(can.request(event, {index: index}), mdb.INPUTS, [ctx.ARGS], function(msg) {
debugger
can.user.carte(event, can, {}, msg[msg.append[0]], function(event, button) { can.onimport.tabview(can, "", [index, button].join(mdb.FS), ctx.INDEX) })
})
}}]) })
_tabMode: function(can) { var mode = can.db.mode||"", target = can.ui.current; if (target && mode != mdb.PLUGIN) { mode += lex.SP+target.selectionStart+nfs.PS+target.value.length }
can.page.Append(can, can.ui.path, [{text: [mode, "", [ice.MODE, can.db.mode||""]], onclick: function(event) {
var list = {}; can.core.Item(can.onkeymap._mode[can.db.mode], function(k, cb) { list[k+" "+cb.help] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } })
can.core.Item(can.onkeymap._mode[can.db.mode+"_ctrl"], function(k, cb) { list["C-"+k+" "+cb.help] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } })
list._style = "inner mode"
can.user.carte(event, can, list, [])
}}])
},
tabPath: function(event, can, ps, key, pre, cb, parent) { can.runAction(event, mdb.INPUTS, [key, pre, lex.SPLIT], function(msg) { var _trans = {}
var carte = can.user[parent? "carteRight": "carte"](event, can, {_style: key}, (msg.Length() > 10? [web.FILTER]: []).concat(msg.Table(function(value) {
var p = can.core.Split(value[key], ps).pop()+(can.base.endWith(value[key], ps)? ps: ""); return _trans[p] = value[key], p
})), function(event, button) {
if (can.base.endWith(button, ps)) { can.onimport.tabPath(event, can, ps, key, pre+button, cb, carte); return true } else { cb(_trans[button], pre) }
}, parent)._target, file = can.core.Split(event.target.innerHTML.trim(), nfs.PT)[0]
can.page.Select(can, carte, html.DIV_ITEM, function(target) {
target.innerHTML.trim() != event.target.innerHTML.trim() && can.base.beginWith(target.innerHTML, file+nfs.PT) && carte.insertBefore(target, carte.firstChild)
target.innerHTML.trim() == event.target.innerHTML.trim() && can.onappend.style(can, html.SELECT, target)
})
}) },
_tabFunc: function(can, target, cache) {
if (cache) { var func = can.db._func||{list: []} } else { var func = can.onexport.func(can); can.db._func = func }
if (func.list.length > 0) { can.db.tabFunc = can.db.tabFunc||{}
@ -106,91 +62,117 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
var carte, list = [web.FILTER]; can.core.Item(last, function(key) { list.push(key) }), list = list.concat(func.list)
}
can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+nfs.PS+can.ui.content._max+func.percent+lex.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) {
carte = can.user.carte(event, can, {_style: nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close()
can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, nfs.DF, nfs.DF).pop())
})
can.onmotion.delay(can, function() {
can.page.Select(can, carte._target, html.DIV_ITEM, function(target) {
if (can.base.beginWith(target.innerText, "- ")) {
can.onappend.style(can, "private", target)
} else {
can.onappend.style(can, "public", target)
}
})
carte = can.user.carte(event, can, {_style: "inner "+nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close()
var line = can.core.Split(button, nfs.DF, nfs.DF).pop()
can.onimport.tabview(can, "", can.Option(nfs.FILE), line, function() { can.onaction.selectLine(can, line, true) })
})
carte && can.onmotion.delay(can, function() { can.page.Select(can, carte._target, html.DIV_ITEM, function(target) {
can.onappend.style(can, can.base.beginWith(target.innerText, "- ")? aaa.PRIVATE: aaa.PUBLIC, target)
}) })
}}])
},
_tabMode: function(can) {
var mode = can.db.mode||"", target = can.ui.current; if (target && mode != mdb.PLUGIN) { mode += lex.SP+target.selectionStart+nfs.PS+target.value.length }
can.page.Append(can, can.ui.path, [{text: [mode, "", [ice.MODE, can.db.mode||""]], onclick: function(event) {
var list = {}; can.core.Item(can.onkeymap._mode[can.db.mode], function(k, cb) { list[cb.help+lex.TB+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } })
can.core.Item(can.onkeymap._mode[can.db.mode+"_ctrl"], function(k, cb) { list[cb.help+lex.TB+"C-"+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } })
can.user.carte(event, can, list, [])
}}])
__tabPath: function(can, cache) { var target = can.ui.path
function _space(grow) { can.page.Append(can, target, [{view: ["_space", html.SPAN], style: {"flex-grow": grow||"1"}}]) }
can.onimport._tabPath(can, nfs.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(p) {
var ls = can.onexport.split(can, p); can.onimport.tabview(can, ls[0], ls[1])
}, target), _space(), can.onimport._tabFunc(can, target, cache), _space(), can.onimport._tabMode(can), _space("4"), can.onimport._tabIcon(can)
target.ondblclick = function(event) { if (event.target != target && !can.page.tagis(event.target, "span._space")) { return }
var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.plug, show), can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can)
can.isCmdMode() && can.onexport.session(can, TABVIEW_HIDE, show? "": html.HIDE)
}
},
_tabIcon: function(can) {
can.user.isWindows || can.page.Append(can, can.ui.path, can.core.Item({
"\u271A": shy({translate: "0 2px"}, function(event) { can.onaction.open(event, can, "open") }),
"\u2756": shy({translate: "0 2px"}, function(event) { can.onaction.plug(event, can, "plug") }),
"\u25E7": function(event) { var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can), can.isCmdMode() && can.onexport.session(can, PROJECT_HIDE, show? "": html.HIDE) },
"\u25E8": shy({translate: "0 2px", rotate: "90deg"}, function(event) { if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } can.onaction.exec(event, can) }),
"\u25E8 ": function(event) { if (can.page.isDisplay(can.ui.profile)) { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } can.onaction.show(event, can) },
}, function(text, cb) { return cb && {text: [text, html.SPAN, html.VIEW], style: cb.meta, onclick: cb} }))
_tabPath: function(can, ps, key, value, cb, target) { var args = value.split(mdb.FS); can.onmotion.clear(can, can.ui.path)
can.core.List(can.core.Split(args[0], ps), function(value, index, list) {
can.page.Append(can, target, [{text: [value+(index<list.length-1? " "+ps: ""), "", html.ITEM], onclick: function(event) {
can.onimport.tabPath(event, can, ps, key, ps == nfs.PT? list.slice(0, index).join(ps): (list.slice(0, index).join(ps)||nfs.PT)+ps, cb)
}}])
})
},
tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file)
tabPath: function(event, can, ps, key, pre, cb, parent) { can.runAction(event, mdb.INPUTS, [key, pre, lex.SPLIT], function(msg) { var _trans = {}
var carte = (can.user[parent? "carteRight": "carte"](event, can, {_style: "inner "+key}, (msg.Length() > 10? [web.FILTER]: []).concat(msg.Table(function(value) {
var p = can.core.Split(value[key], ps).pop()+(can.base.endWith(value[key], ps)? ps: ""); return _trans[p] = value[key], p
})), function(event, button) {
if (can.base.endWith(button, ps)) { can.onimport.tabPath(event, can, ps, key, pre+button, cb, carte); return true } else { cb(_trans[button], pre) }
}, parent)||{})._target, file = can.core.Split(event.target.innerHTML.trim(), nfs.PT)[0]
carte && can.page.Select(can, carte, html.DIV_ITEM, function(target) {
target.innerHTML.trim() != event.target.innerHTML.trim() && can.base.beginWith(target.innerHTML, file+nfs.PT) && carte.insertBefore(target, carte.firstChild)
target.innerHTML.trim() == event.target.innerHTML.trim() && can.onappend.style(can, html.SELECT, target)
}), can.onmotion.delay(can, function() { carte.scrollTop = 0 })
}) },
openzone: function(can, path, file, line) {
if (line == web.SPACE) {
can.page.isDisplay(can.ui.zone.space._target) || can.ui.zone.space._legend.click()
} else if (line == ctx.INDEX) {
if (can.base.beginWith(file, "can.")) {
can.page.isDisplay(can.ui.zone.plugin._target) || can.ui.zone.plugin._legend.click()
} else {
can.page.isDisplay(can.ui.zone.command._target) || can.ui.zone.command._legend.click()
}
} else {
if (can.ui.zone && can.ui.zone.source) {
can.page.isDisplay(can.ui.zone.source._target) || can.ui.zone.source._legend.click()
}
return true
}
},
tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH), line && can.Option(nfs.LINE, line); var key = can.onexport.keys(can, path, file)
function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE }
function show(skip) { can._msg && can._msg.Option && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key]
can.Option(can.onimport.history(can, {path: path, file: file, line: line||can.onexport.session(can, SELECT_LINE+nfs.DF+path+file)||can._msg.Option(nfs.LINE)||1}))
function show() { can._msg && can._msg.Option && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key]
can.Option(can.onimport.history(can, {path: path, file: file, line: can._msg.Option(nfs.LINE)||can.onexport.session(can, SELECT_LINE+nfs.DF+path+file)||1}))
can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg; can.onexport.hash(can)
can.isCmdMode() && can.onexport.title(can, (isIndex()||isSpace()? "": path)+file), can.onmotion.select(can, can.ui._tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView()
if (isSpace()) {
can.ui.path.innerHTML = can.page.Format(html.A, can.base.trimPrefix(can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), location.origin))
} else if (isIndex()) {
can.onimport._tabPath(can, nfs.PT, ice.CMD, can.Option(nfs.FILE), function(p, pre) {
can.onimport.tabview(can, "", can.core.Keys(can.base.trimSuffix(pre, nfs.PT), p), ctx.INDEX)
}, can.ui.path)
can.onexport.title(can, isIndex()||isSpace()? file: file.split("/").slice(-2).join("/"))
can.onmotion.select(can, can.ui._tabs, html.DIV_TABS, msg._tab), can.onmotion.toggle(can, can.ui.path, true)
if (isSpace()) { can.base.contains(file, "/") || can.onmotion.hidden(can, can.ui.path)
can.ui.path.innerHTML = can.page.Format(html.A, can.base.trimPrefix(can.misc.MergePodCmd(can, {pod: file}), location.origin))
} else if (isIndex()) { can.onmotion.hidden(can, can.ui.path)
} else { can.onimport.__tabPath(can) }
can.page.SelectChild(can, can.ui._profile.parentNode, can.page.Keys(html.DIV_LAYOUT, html.DIV_CONTENT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) {
can.page.Select(can, can.ui.content.parentNode, "div.scrollbar", function(target) { can.page.style(can, target, "visibility", "hidden") })
can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, html.DIV_LAYOUT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) {
can.onmotion.toggle(can, target, target == content)
}), can.ui.content._plugin = msg._plugin, can.ui.profile._plugin = msg._profile
}), can.ui.content._plugin = msg._plugin
can.page.SelectChild(can, can.ui._profile.parentNode, can.page.Keys(html.DIV_PROFILE, [[[html.IFRAME, html.PROFILE]]]), function(target) {
if (can.onmotion.toggle(can, target, target == msg._profile)) { can.ui.profile = msg._profile }
})
can.onimport.layout(can), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isIndex() && !isSpace())
skip || can.onmotion.delay(can, function() { can.onaction.selectLine(can, can.Option(nfs.LINE), true) }), can.base.isFunc(cb) && cb(), cb = null
var ls = can.onexport.path(can).split(nfs.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(nfs.PS)+"/.../"+ls.slice(-2).join(nfs.PS)] }
can.Status(kit.Dict(nfs.FILE, ls.join(nfs.PS)))
if (target == msg._profile) { can.ui.profile = msg._profile, msg._profile_hidden || can.onmotion.toggle(can, target, true) }
}), can.ui.profile._plugin = msg._profile
can.page.ClassList.set(can, can._output, nfs.SOURCE, can.onimport.openzone(can, path, file, line)), can.onimport.layout(can)
can.onaction.selectLine(can, can.Option(nfs.LINE)), can.base.isFunc(cb) && cb(msg), cb = null
var ls = can.onexport.path(can).split(nfs.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(nfs.PS)+"/.../"+ls.slice(-2).join(nfs.PS)] } can.Status(kit.Dict(nfs.FILE, ls.join(nfs.PS)))
})
}
function load(msg) { var skip = false; can.db.tabview[key] = msg; var name = file
function load(msg) { can.db.tabview[key] = msg; var name = file
msg.result = msg.result||[""]
if (can.base.beginWith(file, web.HTTP)) { name = decodeURI(file.split(web.QS)[0])
var link = can.misc.ParseURL(can, name); if (link.pod) { name = link.pod }
name = can.base.trimPrefix(name, location.origin)
} else {
name = file.split(mdb.FS)[0].split(isIndex()? nfs.PT: nfs.PS).pop()
}
var tabs = can.onimport.tabs(can, [{name: name, text: file, _menu: shy([nfs.SAVE, nfs.TRASH, web.REFRESH], function(event, button, meta) {
can.request(event, msg)
can.onaction[button](event, can, button) })}], function(event, tabs) {
can._tab = msg._tab = tabs._target, show(skip), skip = true
}, function(tabs) { can.onengine.signal(can, VIEW_REMOVE, msg) // , can.ui.zone.source.refresh()
msg.__content || can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile)
can.ui._profile._cache && delete(can.ui._profile._cache[key]), can.ui._display._cache && delete(can.ui._display._cache[key])
delete(can.db.tabview[key]), can._cache_data && delete(can._cache_data[key])
can.onmotion.delay(can, function() { can.user.isWebview && can.onexport.recover(can) })
}, can.ui._tabs); tabs._list = [path, file, line], can.user.isWebview && can.onexport.recover(can)
line && msg.Option(nfs.LINE, line)
var tabs = can.onimport.tabs(can, [{name: name, text: (isIndex() || isSpace()? "": path)+file, _menu: shy(can.base.Obj(msg.Option(ice.MSG_ACTION), []), function(event, button, meta) {
can.request(event, msg), can.onaction[button]? can.onaction[button](event, can, button): can.onaction._runs(event, can, button)
})}], function(event, tabs) {
can._tab = msg._tab = tabs._target, show(), msg._item && (can.page.isSelect(msg._item) || msg._item.click(), can.onmotion.scrollIntoView(can, msg._item))
}, function(tabs) { can.onengine.signal(can, VIEW_REMOVE, msg), delete(can.db.tabview[key])
msg._content != can.ui._content && can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile)
can.onmotion.cacheClear(can, key, can.ui._content, can.ui._profile, can.ui._display)
}, can.ui._tabs)
}
if (can.db.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.db.tabview[key]): show() }
can._msg._tab && can.onmotion.scrollIntoView(can, can._msg._tab)
if (can.db.tabview[key]) { return can.isSimpleMode()? show(): can._msg._tab? (can._msg._tab.click(), show()): load(can.db.tabview[key]) }
isIndex()||isSpace()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true)
},
history: function(can, record) { can.base.Eq(record, can.db.history[can.db.history.length-1], mdb.TEXT) || can.db.history.push(record)
return can.Status(ice.BACK, can.db.history.length), record
},
project: function(can, path) { can.onmotion.clear(can, can.ui.project), can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) {
if (can.base.isFunc(cb)) { return {name: name, icon: cb.meta? cb.meta.icon: "", _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _toggle: function() { can.onimport.layout(can) }, _init: function(target, zone) { return cb(can, target, zone, path) }} }
}), can.ui.project) },
project: function(can) { can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { if (can.base.isFunc(cb)) {
return {name: name, _toggle: function(zone) { var target = can.page.isDisplay(zone._target)? zone._target: can.ui.zone.source._target
can.core.Item(can.ui.zone, function(key, zone) { key.indexOf(nfs.PS) > 0 || zone.toggle(zone._target == target) }), can.onimport.layout(can)
}, _init: function(target, zone) { var onclick = zone._legend.onclick
zone._legend.onclick = function(event) { if (can.page.isDisplay(zone._target)) { return } onclick(event) }
return cb(can, target, zone, can.db.hash)
}}
} }), can.ui.project) },
profile: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)]; _msg.Option(html.WIDTH, msg.Option(html.WIDTH)), border = 1
var height = (can.ui.content._root||can.ui.content).offsetHeight, width = can.onexport.size(can, _msg.Option(html.WIDTH)||0.5, can.ConfWidth()-can.ui.project.offsetWidth)+border
var height = can.ui.content.offsetHeight, width = can.onexport.size(can, _msg.Option(html.WIDTH)||0.5, can.ConfWidth()-can.ui.project.offsetWidth)+border
if (msg.Result().indexOf("<iframe src=") > -1) { if (_msg._profile != can.ui._profile) { can.page.Remove(can, _msg._profile) }
var src = can.page.Select(can, can.page.Create(can, html.DIV, msg.Result()), html.IFRAME, function(target) { return target.src })[0]
can.ui.profile = _msg._profile = can.page.Append(can, can.ui._profile.parentNode, [{view: [html.PROFILE, html.IFRAME], src: src, style: {height: height, width: width}}])._target
@ -202,38 +184,31 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
return can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can)
}
}
can.onimport.process(can, msg, can.ui.profile, height, width-border, function(sub) { can.page.style(can, sub._output, html.MAX_WIDTH, "")
can.ui.profile._plugin = sub
sub.Conf(ctx.ARGS) && can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS)))
sub.onaction.close = function() { can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can)
can.onimport.process(can, msg, can.ui.profile, height, width-border, function(sub) {
_msg._profile_plugin = sub
can.ui.profile._plugin = sub, can.page.style(can, sub._output, html.MAX_WIDTH, "")
sub.onaction.close = function() { can._msg._profile_hidden = true
can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), "")
can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can)
}
if (sub._index == web.WIKI_WORD) { can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can); return }
sub.Conf(ctx.ARGS) && can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS)))
can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can)
})
}
},
display: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)]; _msg.Option(html.HEIGHT, msg.Option(html.HEIGHT)), border = 1
var height = can.onexport.size(can, _msg.Option(html.HEIGHT)||0.5, can.ui.project.offsetHeight||can.ConfHeight())+border, width = can.ConfWidth()-can.ui.project.offsetWidth
can.page.style(can, can.ui.display, html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.ui.display = _msg._display = can.ui._display
if (can.ui.display._plugin && can.base.isIn(msg.Append(ctx.INDEX), web.CODE_XTERM)) {
if (can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))) {
return can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can)
}
}
can.onimport.process(can, msg, can.ui.display, height-border, width, function(sub) { can.page.style(can, sub._output, html.MAX_HEIGHT, ""), can.ui.display._plugin = _msg._display = sub
sub.Conf(ctx.ARGS) && can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS)))
sub.onaction.close = function() { can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can)
can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), "")
}
if (sub._index == web.WIKI_WORD) { can.page.style(can, can.ui.display, html.HEIGHT, height+border, html.MAX_HEIGHT, height+border), can.onimport.layout(can); return }
var _height = can.base.Max(sub._target.offsetHeight+border, height); _msg.Option(html.HEIGHT, _height), sub.onimport.size(sub, _height-border, width, true), can.onimport.layout(can)
display: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)], border = 1; can.ui.display = _msg._display = can.ui._display
var height = can.onexport.size(can, 0.5, can.ui.project.offsetHeight||can.ConfHeight()), width = can.ConfWidth()-can.ui.project.offsetWidth
can.onimport.process(can, msg, can.ui.display, height-border, width, function(sub) { can.ui.display._plugin = _msg._display = sub
sub.onaction.close = function() { can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) }
sub.onimport.size(sub, height-border, width, true), can.onimport.layout(can)
})
},
process: function(can, msg, target, height, width, cb) { can.onmotion.clear(can, target)
if (msg.Option(ice.MSG_PROCESS) == ice.PROCESS_FIELD) {
msg.Table(function(item) { item.type = chat.STORY, item.height = height, item.width = width, item.display = msg.Option(ice.MSG_DISPLAY)
if (can.base.isIn(item.index, web.CODE_XTERM, web.WIKI_WORD)) { item.style = html.OUTPUT }
msg.Table(function(item) { item.type = chat.STORY, item.height = height, item.width = width
item.display = msg.Option(ice.MSG_DISPLAY)
item.display_css = msg.Option(ice.MSG_DISPLAY_CSS)
if (can.base.isIn(item.index, web.WIKI_WORD)) { item.style = html.OUTPUT }
can.onimport.plug(can, item, function(sub) {
sub.onaction.close = function() { can.onmotion.hidden(can, target), can.onimport.layout(can) }
sub.onexport.output = function(_sub, _msg) { can.base.isFunc(cb) && cb(_sub.sup, _msg) }
@ -246,194 +221,146 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
can.page.Append(can, target, [{type: html.IFRAME, src: src, style: {height: height, width: width}}])
} else if (msg.Length() > 0 || msg.Result() != "") {
can.onappend.table(can, msg, function(value, key, index, item) { return {text: [value, html.TD], onclick: function(event) {
if (event.target.type == html.BUTTON) { return can.runAction(can.request(event, item), event.target.name, [], function() {
}) }
if (event.target.type == html.BUTTON) { return can.runAction(can.request(event, item), event.target.name, [], function() {}) }
item.file && can.onimport.tabview(can, item.path, item.file||can.Option(nfs.FILE), item.line)
}} }, target), can.onappend.board(can, msg, target), msg.Option(ice.MSG_STATUS) && can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.page.Append(can, target, [html.STATUS])._target)
can.onmotion.delay(can, function() {
can.page.Select(can, target, html.IMG, function(target) {
var src = can.base.trimPrefix(target.src, location.origin)
if (can.base.beginWith(src, "/require/", web.HTTP)) { return }
target.src = "/require/"+can.Option(nfs.PATH)+can.base.trimPrefix(src, location.pathname.slice(0, location.pathname.lastIndexOf("/")+1))
})
})
} else {
return can.onmotion.toggle(can, target, false), can.onimport.layout(can), can.user.toastFailure(can, "nothing to display")
} return can.onmotion.toggle(can, target, true), can.onmotion.delay(can, function() { can.onimport.layout(can), can.user.toastSuccess(can) }, 0)
} return can.onmotion.toggle(can, target, true), can.onimport.layout(can)
},
toolkit: function(can, meta, cb) { can.base.isString(meta) && (meta = {index: meta})
var key = [meta.index].concat(meta.args).join(","), sub = can.db.toolkit[key]; if (sub) { sub.select(); return }
can.onimport.tool(can, [meta], function(sub) { can.db.toolkit[key] = sub
sub.onimport.size(sub, can.base.Max(can.ConfHeight()/2, can.ConfHeight(), 420), can.base.Max(can.ConfWidth()/2, can.ui.content.offsetWidth, html.PLUG_WIDTH), false)
sub.onexport.output = function() {
sub.onimport.size(sub, can.base.Max(can.ConfHeight()/2, can.ConfHeight(), 420), can.base.Max(can.ConfWidth()/2, can.ui.content.offsetWidth, html.PLUG_WIDTH), false)
}
sub.onaction._close = function() { delete(can.db.toolkit[key]), can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend) }
sub.onexport.record = function(sub, value, key, data) { if (!data.file) { return }
if (data.file.indexOf("require/src") == 0) { data.path = nfs.SRC, data.file = line.file.slice(12) }
can.onimport.tabview(can, data.path, can.base.trimPrefix(data.file, nfs.PWD), parseInt(data.line)); return true
}, meta.index != ice.CAN_PLUGIN && (sub._legend._list = {index: meta.index, args: meta.args}), can.user.isWebview && can.onexport.recover(can), cb && cb(sub)
}, can.ui.plug.parentNode, can.ui.plug), can.page.isDisplay(can.ui.plug) || can.onmotion.toggle(can, can.ui.plug, true) && can.onimport.layout(can)
},
layout: function(can) {
if (can.isSimpleMode()) { can.page.style(can, can._output, html.MAX_HEIGHT, "") }
if (can.isSimpleMode() || can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } if (can.isCmdMode()) { can.ConfHeight(can.page.height()) }
var content = can.ui.content; if (!content) { return } if (content._root) { can.ui.content = content._root } can.ui.size = {profile: can._msg.Option(html.WIDTH), display: can._msg.Option(html.HEIGHT)}
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
can.ui._tabs.style.width = ""
can.ui.content = content, can.onlayout.layout(can, height, width)
var sub = can.ui.profile._plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profile.offsetWidth-1, true)
var sub = can.ui.content._plugin; if (!sub) { return } if (height == sub.ConfHeight()+sub.onexport.actionHeight(sub)+sub.onexport.statusHeight(sub) && width == sub.ConfWidth()) { return }
content._root || sub.onimport.size(sub, height, width, true), can.onlayout.layout(can, height, width)
can.page.style(can, sub._target, html.FLEX, "0 0 "+width+"px")
})
if (can.isCmdMode()) {
can.page.style(can, can.ui.tabs.parentNode, html.WIDTH, can.ui.path.offsetWidth)
can.page.style(can, can.ui.display, html.WIDTH, can.ui.path.offsetWidth)
can.page.style(can, can.ui.display.parentNode, html.WIDTH, can.ui.path.offsetWidth)
can.ui.zone.source._layout(), can.ui.zone[can.Option(nfs.PATH)] && can.ui.zone[can.Option(nfs.PATH)]._layout()
}
try { can.isCmdMode() && can._msg._tab.scrollIntoView() } catch (e) {}
}, meta.index != ice.CAN_PLUGIN && (sub._legend._list = {index: meta.index, args: meta.args}), cb && cb(sub)
}, can.ui.plug.parentNode, can.ui.plug)
},
exts: function(can, url, cb) { var sub = can.db.toolkit[url.split(web.QS)[0]]; if (sub) { return can.base.isFunc(cb)? cb(sub): sub.select() }
can.onimport.toolkit(can, {index: ice.CAN_PLUGIN, display: (url[0] == nfs.PS || url.indexOf(web.HTTP) == 0? "": can.base.Dir(can._path))+url,
style: url.split(nfs.PS).pop().split(nfs.PT)[0]}, function(sub) {
can.onimport.toolkit(can, {
icon: "bi bi-search",
index: ice.CAN_PLUGIN, style: url.split(nfs.PS).pop().split(nfs.PT)[0],
display: (url[0] == nfs.PS || url.indexOf(web.HTTP) == 0? "": can.base.Dir(can._path))+url,
}, function(sub) { can.db.toolkit[url.split(web.QS)[0]] = sub
sub.run = function(event, cmds, cb) {
if (cmds.length > 0 && cmds[0] == ctx.ACTION) {
can.run(can.request(event, can.Option()), cmds, cb||function(msg) { can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)) })
} else { can.onappend._output(sub, can.request(event), sub.Conf(ctx.DISPLAY)) }
}, can.db.toolkit[url.split(web.QS)[0]] = sub, can.base.isFunc(cb)? cb(sub): sub.select(), can.page.Modify(can, sub._legend, can.base.trimPrefix(url, "inner/"))
}, can.base.isFunc(cb)? cb(sub): sub.select(), can.page.Modify(can, sub._legend, can.base.trimPrefix(url, "inner/"))
})
},
grow: function(can, msg, arg) { can.onimport.exts(can, "inner/output.js", function(sub) { sub.Conf(ctx.INDEX, can.ConfIndex())
sub.select(true), can.onmotion.delay(can, function() {
can.page.Append(can, sub._output, [{text: arg}]), sub._output.scrollTop = sub._output.scrollHeight
can.misc.sessionStorage(can, [can.ConfIndex(), "output"], sub._output.innerHTML)
can.misc.sessionStorage(can, [can.ConfIndex(), html.OUTPUT], sub._output.innerHTML)
})
}) },
}, [""])
Volcanos(chat.ONFIGURE, {
source: function(can, target, zone, path) { var args = can.base.getValid(can.misc.SearchHash(can), [can.Option(nfs.PATH), can.Option(nfs.FILE)])
function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true, "_toast": "目录加载中..."}), [nfs.PWD], function(msg) { can.onmotion.clear(can, target)
can.onimport.tree(can, can.core.List(msg.Table(), function(item) {
if (path == args[0] && args[1].indexOf(item.path) == 0) { item.expand = true } return item
}), nfs.PATH, nfs.PS, function(event, item) { can.onimport.tabview(can, path, item.path) }, target), zone._total(msg.Length())
}, true) } if (path.length == 1) { return show(target, zone, path[0]) } can.page.Remove(can, zone._action)
can.onimport.zone(can, can.core.List(path, function(path) { return kit.Dict(mdb.NAME, path, path == args[0]? chat._INIT: chat._DELAY_INIT, function(target, zone) { show(target, zone, path) }) }), target)
},
module: function(can, target, zone) { zone._delay_init = function() { can.runAction({}, mdb.INPUTS, [ctx.INDEX], function(msg) {
can.onimport.tree(can, msg.Table(), ctx.INDEX, nfs.PT, function(event, item) { can.onimport.tabview(can, "", item.index, ctx.INDEX) }, target), zone._total(msg.Length())
}) }, zone.toggle(false) },
plugin: function(can, target, zone) { zone._delay_init = function() { var total = 0
can.onimport.tree(can, can.core.ItemKeys(can.onengine.plugin.meta, function(key) { if (key[0] != "_") { return total++, {index: key} } }), ctx.INDEX, nfs.PT, function(event, item) {
can.onimport.tabview(can, "", can.core.Keys(ice.CAN, item.index), ctx.INDEX)
}, target), zone._total(total)
}, zone.toggle(false) },
})
Volcanos(chat.ONLAYOUT, {
_split: function(can, type) { var target = can.ui.content, msg = target._msg, scroll = target.scrollTop
var style = type == html.FLOW? {height: target.offsetHeight/2, width: target.offsetWidth}: {height: target.offsetHeight, width: parseInt(target.offsetWidth/2)}
var layout = can.page.insertBefore(can, [{view: [[html.LAYOUT, type]]}], target); layout.appendChild(target), can.page.style(can, target, style)
var right = can.page.Append(can, layout, [{view: html.CONTENT, style: style}])._target; can.onmotion.cache(can, function() { return can.onexport.keys(can) }, right)
can.ui.content = right, right._max = 0
can.page.Appends(can, right, [{view: ["tips", "", msg.Option(nfs.FILE).split(nfs.PS).slice(-2).join(nfs.PS)]}])
can.page.SelectChild(can, target, "tr.line", function(target) { can.onaction.appendLine(can, can.page.SelectOne(can, target, "td.text").innerText, right) })
right.scrollTop = target.scrollTop = scroll, right._msg = msg, msg._content = layout._root = right._root = target._root = target._root||layout
},
split: function(can) { can.onlayout._split(can, html.FLOW) },
vsplit: function(can) { can.onlayout._split(can, html.FLEX) },
close: function(can) { var target = can.ui.content, close = target._msg._tab._close; if (!target._root) { return close() }
var list = can.core.Item(target._cache); if (list.length > 0) { var key = target._cache_key, msg = can.db.tabview[key]
return can.onmotion.cache(can, function() { return list[0] }, target), delete(target._cache[key]), msg._tab._close()
} var right = target.nextSibling||target.previousSibling; if (can.page.ClassList.has(can, target.parentNode, html.FLEX)) { can.page.style(can, right, html.WIDTH, right.offsetWidth+target.offsetWidth) } else { can.page.style(can, right, html.HEIGHT, right.offsetHeight+target.offsetHeight) }
if (target.parentNode.childElementCount == 2) { if (target.parentNode.parentNode == can.ui._profile.parentNode && right._msg) { right._msg._content = right }
can.page.insertBefore(can, right, target.parentNode), can.page.Remove(can, target.parentNode)
} else {
can.page.Remove(can, target)
} close(), can.ui.content = right, can.onimport.layout(can)
},
layout: function(can, height, width) { var target = can.ui.content._root||can.ui.content
function layout(target, height, width) { can.page.style(can, target, html.HEIGHT, height, html.WIDTH, width)
can.page.ClassList.has(can, target, html.LAYOUT) && can.page.SelectChild(can, target, "*", function(content, index, list) {
var h = height/list.length, w = width; if (can.page.ClassList.has(can, target, html.FLEX)) { h = height, w = parseInt(width/list.length) }
layout(content, h, w), content._msg && content._msg._plugin && can.onimport.size(content._msg._plugin, h, w, true)
layout: function(can) {
if (can.Conf(ctx.STYLE) == html.OUTPUT) { return can.page.style(can, can.ui.content, html.WIDTH, (can.Conf("__width")||can.ConfWidth())-(can.user.isMobile? 4: 2)) }
if (can.isSimpleMode() && !can.page.tagis(can._fields, html.FIELDSET_FLOAT)) { can.page.style(can, can._output, html.MAX_HEIGHT, "") }
if (can.isSimpleMode()) { can.ui.layout(can.ConfHeight(), can.ConfWidth()); return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) }
if (can.isCmdMode()) { can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(can.page.height())) }
can.ui.size = {profile: can._msg.Option(html.WIDTH), display: can._msg.Option(html.HEIGHT)}
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
var sub = can._msg._profile_plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profile.offsetWidth-1, false)
var sub = can.ui.content._plugin; if (!sub) { return } if (height == sub.ConfHeight()+sub.onexport.actionHeight(sub)+sub.onexport.statusHeight(sub) && width == sub.ConfWidth()) { return }
sub.onimport.size(sub, height, width, false), can.page.style(can, sub._target, html.HEIGHT, height)
})
can.page.SelectChild(can, can.ui.project, html.DIV_ZONE, function(target, index, list) {
can.page.SelectChild(can, target, html.DIV_ITEM, function(target) { var height = can.ui.project.offsetHeight - list.length*target.offsetHeight
if (can.page.tagis(target.nextSibling, html.DIV_ACTION)) { height -= target.nextSibling.offsetHeight }
can.page.SelectChild(can, target.parentNode, html.DIV_LIST, function(target) { can.page.style(can, target, html.HEIGHT, height) })
})
} layout(target, height||target.offsetHeight, width||target.offsetWidth)
},
})
Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { if (!msg) { return }
var key = can.onexport.keys(can), path = msg.Option(nfs.PATH, can.Option(nfs.PATH)), file = msg.Option(nfs.FILE, can.Option(nfs.FILE))
can.onmotion.cache(can, function(save, load) { save({profile: can.ui.profile.className, display: can.ui.display.className})
can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
return load(key, function(bak) { can.ui.profile.className = bak.profile, can.ui.display.className = bak.display })
}, can.ui.profile, can.ui.display)
if (msg._content) { var list = can.page.Select(can, msg._content, html.DIV_CONTENT, function(target) { if (target._cache_key == key) { return target } })
if (list.length > 0) { can.onmotion.select(can, msg._content, html.DIV_CONTENT, list[0]) } else {
var list = can.page.Select(can, msg._content, html.DIV_CONTENT, function(target) { if (target._cache && target._cache[key]) { return target } })
if (list.length > 0) { can.onmotion.cache(can, function() { return key }, list[0]) }
} return can.ui.content = list[0]||msg._content, cb(msg._content)
} var content = can.ui.content; if (content._root) { can.onmotion.cache(can, function() { return key }, content) }
if (can.onexport.parse(can) == nfs.SVG) { msg.Option(ctx.INDEX, web.WIKI_DRAW+mdb.FS+path+file) }
if (msg.Option(ctx.INDEX)) { return can.onsyntax._index(can, msg, function(target) { can.ui.content = target, cb(msg._content = content._root? (target._root = content._root): target) }, content._root? content: can.ui._profile.parentNode) }
if (can.base.beginWith(msg.Results(), "<img")) { return can.onsyntax._image(can, msg, content, cb, key) }
can.onsyntax._split(can, msg, content, cb, key)
},
_image: function(can, msg, content, cb, key) {
if (!content._root && can.db.history.length > 1) { content = can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._profile), content._cache_key = key }
content._max = 0, content._msg = msg, msg.__content = content, content.innerHTML = msg.Results()
can.onengine.signal(can, VIEW_CREATE, msg), can.base.isFunc(cb) && cb(msg._content = content._root? content._root: content)
},
_split: function(can, msg, content, cb, key) {
var path = msg.Option(nfs.PATH, can.Option(nfs.PATH)), file = msg.Option(nfs.FILE, can.Option(nfs.FILE))
function show(p) {
function include(list) { if (!list || list.length == 0) { return }
can.core.List(list, function(from) {
p.split = p.split|| can.onsyntax[from].split
include(can.onsyntax[from].include)
p.keyword = p.keyword||{}, can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key] || value })
can.core.Item(can.onsyntax[from], function(key, value) { p[key] = p[key] || value })
})
} p && include(p.include)
p && p.prepare && can.core.ItemForm(p.prepare, function(value, index, key) { p.keyword = p.keyword||{}, p.keyword[value] = key })
if (!content._root && can.db.history.length > 1) { content = can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._profile), content._cache_key = key }
content._max = 0, content._msg = msg, msg.__content = content, can.page.Appends(can, content, [{view: ["tips", "", msg.Option(nfs.FILE).split(nfs.PS).slice(-2).join(nfs.PS)]}])
if (msg.Length() > 0) { can.onsyntax._change(can, msg), can.onaction.rerankLine(can, "tr.line:not(.delete)>td.line")
can.page.Select(can, content, "tr.line.delete>td.line", function(target) { target.innerHTML = "" })
} else {
can.core.List(msg.Result().split(lex.NL), function(item) { can.onaction.appendLine(can, item) })
}
can.onmotion.delay(can, function() { can.onappend.scroll(can, can.ui.content) })
can.onengine.signal(can, VIEW_CREATE, msg), can.base.isFunc(cb) && cb(msg._content = content._root? content._root: content)
} can.require([chat.PLUGIN_LOCAL+"code/inner/syntax.js"], function() { var parse = can.onexport.parse(can); can.Conf(chat.PLUG) && (can.onsyntax[parse] = can.Conf(chat.PLUG))
var p = can.onsyntax[parse]; !p? can.runAction({}, mdb.PLUGIN, [parse, file, path], function(msg) {
p = can.base.Obj(msg.Result())
if (p && p.script) { can._msg.Option(lex.PARSE, msg.Option(lex.PARSE))
can.require([p.script], function() { show(can.onsyntax[msg.Option(lex.PARSE)||parse]) })
} else {
show(can.onsyntax[parse] = p)
}
}): show(p)
})
},
_space: function(can, msg, cb, parent) { if (can.Option(nfs.LINE) == web.SPACE) { can.ui.zone.space && can.onmotion.delay(can, function() { can.ui.zone.space.refresh() }, 1000)
}, [""])
Volcanos(chat.ONFIGURE, {
source: function(can, target, zone, hash) {
function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) {
can.onimport.tree(can, can.core.List(msg.Table(), function(item) { item._init = function(target) { can.ui.zone.source[path+item.path] = target }
if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } return item
}), function(event, item, target) { can.base.endWith(item.path, nfs.PS) || can.onimport.tabview(can, path, item.path, "", function(msg) {
msg._item = target
}) }, function() {}, target), zone._total(msg.Length())
can.isCmdMode() && hash.length > 1 && can.onimport.tabview(can, hash[0], hash[1], hash[2])
}, true) } show(target, zone, can.Option(nfs.PATH))
},
command: function(can, target, zone, hash) {
zone._delay_init = function() { can.runAction({}, mdb.INPUTS, [ctx.INDEX], function(msg) {
can.onimport.tree(can, msg.Table(function(value) {
value.expand = hash[2] == ctx.INDEX && hash[1] == value.index
return value
}), function(event, item, target) { can.onimport.tabview(can, "", item.index, ctx.INDEX, function(msg) {
msg._item = target
}) }, function() {}, target, null, ctx.INDEX, nfs.PT), zone._total(msg.Length())
}) }, zone.toggle(false)
},
plugin: function(can, target, zone, hash) { zone._delay_init = function() { var total = 0
can.onimport.tree(can, can.core.ItemKeys(can.onengine.plugin.meta, function(key) { if (key[0] != "_") {
return total++, {index: key, expand: hash[2] == ctx.INDEX && hash[1] == "can."+key}
} }), function(event, item, target) { can.onimport.tabview(can, "", can.core.Keys(ice.CAN, item.index), ctx.INDEX, function(msg) {
msg._item = target
}) }, function() {}, target, null, ctx.INDEX, nfs.PT), zone._total(total)
}, zone.toggle(false) },
})
Volcanos(chat.ONSYNTAX, {
_init: function(can, msg, cb) { var key = can.onexport.keys(can)
can.onmotion.cache(can, function() { return key }, can.ui.profile, can.ui.display), can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
if (msg._content) { return cb(can.ui.content = msg._content) }
if (msg.Option(ctx.INDEX)) { return can.onsyntax._index(can, msg, function(target) { cb(can.ui.content = msg._content = target) }, can.ui._content.parentNode) }
can.onsyntax._split(can, msg, cb, key)
},
_space: function(can, msg, cb, parent) { if (can.Option(nfs.LINE) == web.SPACE) {
// can.ui.zone.space && can.onmotion.delay(can, function() { can.ui.zone.space.refresh() }, 3000)
var target = can.page.Append(can, parent, [{view: [html.CONTENT, html.IFRAME], src: can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), height: can.ui.content.offsetHeight, width: can.ui.content.offsetWidth}])._target
return can.base.isFunc(cb) && cb(target), true
} },
_index: function(can, msg, cb, parent) { if (can.onsyntax._space(can, msg, cb, parent)) { return }
var index = msg.Option(ctx.INDEX).split(mdb.FS), item = {type: chat.STORY, index: index[0], args: index.slice(1)}
var index = can.core.Split(msg.Option(ctx.INDEX)), item = {type: chat.STORY, index: index[0], args: index.slice(1)}
if (item.index == web.CODE_XTERM && item.args.length > 0) { item.style = html.OUTPUT }
if (item.index == web.CHAT_MACOS_SESSION && item.args.length > 0) { item.style = html.OUTPUT }
if (item.index == web.CHAT_MACOS_DESKTOP) { item.style = html.OUTPUT }
can.onimport.plug(can, item, function(sub) { sub.onimport.size(sub, can.ui.content.offsetHeight, can.ui.content.offsetWidth, true)
can.onimport.layout(can)
sub.onimport._open = function(_, msg, arg) {
var link = can.misc.ParseURL(can, arg); if (link.pod && arg.indexOf(location.origin) == 0) { can.onimport.tabview(can, "", link.pod, web.SPACE), sub.Update(); return }
can.onimport.plug(can, item, function(sub) {
sub.onimport._open = function(_, msg, arg) { var link = can.misc.ParseURL(can, arg)
if (link.pod && arg.indexOf(location.origin) == 0) { can.onimport.tabview(can, "", link.pod, web.SPACE), sub.Update(); return }
can.onimport.tabview(can, "", arg, web.SPACE), sub.Update()
}
sub.onaction.close = function() { msg._tab._close() }
sub.onexport.title = function(_, title) { can.page.Modify(can, can.page.SelectOne(can, msg._tab, html.SPAN_NAME), title) }
sub.onexport.record = function(_, value, key, item) { item.file && can.onimport.tabview(can, item.path, item.file, item.line); return true }
sub.onexport.output = function() { can.onimport.layout(can) }
sub.onexport.record = function(_, value, key, item) { item.file && can.onimport.tabview(can, item.path, item.file, item.line); return true }
sub.onexport.title = function(_, title) { can.page.Modify(can, can.page.SelectOne(can, msg._tab, html.SPAN_NAME), title) }
sub.onimport.size(sub, can.ui.content.offsetHeight, can.ui.content.offsetWidth, false)
msg._plugin = sub, can.base.isFunc(cb) && cb(sub._target), sub.Focus()
}, parent)
},
_split: function(can, msg, cb, key) {
function show(p) {
function include(list) { if (!list || list.length == 0) { return }
can.core.List(list, function(from) { p.split = p.split||can.onsyntax[from].split
p.keyword = p.keyword||{}, can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key]||value })
can.core.Item(can.onsyntax[from], function(key, value) { p[key] = p[key]||value }), include(can.onsyntax[from].include)
})
} p && include(p.include), p && p.prepare && can.core.ItemForm(p.prepare, function(value, index, key) { p.keyword = p.keyword||{}, p.keyword[value] = key })
if (can.db.history.length > 1) { can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._content), can.ui.content._cache_key = key }
can.ui.content._max = 0, can.ui.content._msg = msg, can.page.Appends(can, can.ui.content, [{view: ["tips", "", msg.Option(nfs.FILE).split(nfs.PS).slice(-2).join(nfs.PS)]}])
if (msg.Length() > 0) { can.onsyntax._change(can, msg), can.onaction.rerankLine(can, "tr.line:not(.delete)>td.line")
can.page.Select(can, can.ui.content, "tr.line.delete>td.line", function(target) { target.innerHTML = "" })
} else {
can.core.List(msg.Result().split(lex.NL), function(item) { can.onaction.appendLine(can, item) })
}
can.onengine.signal(can, VIEW_CREATE, msg), can.base.isFunc(cb) && cb(msg._content = can.ui.content)
can.onmotion.delay(can, function() { can.onappend.scroll(can) })
}
can.require([chat.PLUGIN_LOCAL+"code/inner/syntax.js"], function() { var parse = can.onexport.parse(can); can.Conf(chat.PLUG) && (can.onsyntax[parse] = can.Conf(chat.PLUG))
var p = can.onsyntax[parse]; !p && msg.Option(nfs.FILE)? can.runAction({}, mdb.PLUGIN, [parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) { p = can.base.Obj(msg.Result())
p && p.script? can.require([p.script], function() { show(can.onsyntax[msg.Option(lex.PARSE)||parse]) }): show(can.onsyntax[parse] = p)
}): show(p)
})
},
_parse: function(can, line) { var parse = can.onexport.parse(can)
function wrap(text, type) { return can.page.Format(html.SPAN, can.page.trans(can, text), type) }
var p = can.onsyntax[parse]; if (!p) { return can.page.trans(can, line) } p = can.onsyntax[p.link]||p, p.split = p.split||{}, p.keyword = p.keyword||{}
@ -453,18 +380,17 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { if (!msg) { return }
case code.CONSTANT:
case code.OBJECT: return wrap(text, type)
default: var t = can.core.Item(p.regexp, function(reg, type) { var m = text.match(new RegExp(reg)); if (m && m.length > 0 && m[0] == text) { return type} })
return t && t.length > 0? wrap(text, t[0]): type? wrap(text, type): wrap(text, "_")
return t && t.length > 0? wrap(text, t[0]): type? wrap(text, type): wrap(text, "_")
}
}).join(""); return line
},
_change: function(can, msg) { var _delete = [], _insert = [], deletes = [], inserts = []
function scroll(item, type, length, index) {
var tr = can.onaction.appendLine(can, item); can.onappend.style(can, type, tr)
if (index > 0) { return }
var tr = can.onaction.appendLine(can, item); can.onappend.style(can, type, tr); if (index > 0) { return }
var line = can.onexport.line(can, tr)||can.onexport.line(can, tr.previousSibling)
can.onmotion.delay(can, function() {
var bar = can.onappend.scroll(can, can.ui.content, line/can.ui.content._max, length/can.ui.content._max); can.onappend.style(can, type, bar)
bar && (bar.onclick = function() { can.onimport.tabview(can, "", can.Option(nfs.FILE), line) })
// var bar = can.onappend.scroll(can, can.ui.content, line/can.ui.content._max, length/can.ui.content._max); can.onappend.style(can, type, bar)
// bar && (bar.onclick = function() { can.onimport.tabview(can, "", can.Option(nfs.FILE), line) })
})
}
function append() { var rest = []
@ -487,63 +413,62 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { if (!msg) { return }
} else { append(), can.onaction.appendLine(can, item) }
}) }), _delete.length > 0 && deletes.push(_delete.join("")), _insert.length > 0 && inserts.push(_insert.join("")), append()
var list = can.page.Select(can, can.ui.content, "tr.insert,tr.delete")
list && list[0] && can.onmotion.delay(can, function() {
can.onimport.tabview(can, "", can.Option(nfs.FILE), can.onexport.line(can, list[0].previousSibling))
})
list && list[0] && can.onmotion.delay(can, function() { can.onimport.tabview(can, "", can.Option(nfs.FILE), can.onexport.line(can, list[0].previousSibling)) })
},
})
Volcanos(chat.ONACTION, {
_trans: {show: "预览", exec: "展示"},
_getLine: function(can, line) { return can.page.Select(can, can.ui.content, "tr.line>td.line", function(td, index) { if (td.parentNode == line || index+1 == line) { return td.parentNode } })[0] },
_getContent: function(can, line) {
can.ui.content = line.parentNode, can._msg = can.ui.content._msg, can.Option(nfs.PATH, can._msg.Option(nfs.PATH)), can.Option(nfs.FILE, can._msg.Option(nfs.FILE))
can.onaction.selectContent(can, function(target) {
can.page.ClassList.set(can, target, html.SELECT, target == can.ui.content)
}), can.onimport.__tabPath(can)
},
selectContent: function(can, cb) {
function select(target) { target && can.core.List(target.children, function(target) {
cb(target), can.page.ClassList.has(can, target, html.LAYOUT) && select(target)
}) } select(can.ui.content._root)
},
_getContent: function(can, line) { can.onimport.__tabPath(can) },
appendLine: function(can, value, target) { var ui = can.page.Append(can, target||can.ui.content, [{view: [nfs.LINE, html.TR], list: [
{view: [nfs.LINE, html.TD, ++can.ui.content._max], onclick: function(event) {
can.onaction._getContent(can, ui._target), can.onaction.selectLine(can, ui.tr)
can.onaction.selectLine(can, ui.tr), can.onaction._getContent(can, ui._target)
}, ondblclick: function(event) { can.onaction.find(event, can) }},
{view: [mdb.TEXT, html.TD, can.onsyntax._parse(can, value)], onclick: function(event) {
can.onaction._getContent(can, ui._target), can.onaction.selectLine(can, ui.tr), can.onkeymap._insert && can.onkeymap._insert(event, can, 0, (event.offsetX)/8.5)
can.onaction.selectLine(can, ui.tr), can.onkeymap._insert && can.onkeymap._insert(event, can, 0, (event.offsetX)/8.5), can.onaction._getContent(can, ui._target)
}, ondblclick: function(event) { can.onaction.searchLine(event, can, can.onexport.selection(can, ui.text.innerText)) }}
]}]); return ui._target },
modifyLine: function(can, line, value) { can.page.Select(can, can.onaction._getLine(can, line), "td.text", function(td) { td.innerHTML = can.onsyntax._parse(can, value) }) },
rerankLine: function(can, which, target) { can.ui.content._max = can.page.Select(can, target||can.ui.content, which||"tr.line:not(.delete)>td.line", function(td, index) { return td.innerText = index+1 }).length },
modifyLine: function(can, line, value) { can.page.Select(can, can.onaction._getLine(can, line), "td.text", function(td) { td.innerHTML = can.onsyntax._parse(can, value) }) },
selectLine: function(can, line, scroll) { var content = can.ui.content; if (!line) { return can.onexport.line(can, can.page.SelectOne(can, content, "tr.select")) }
can.page.Select(can, content, "tr.line>td.line", function(target) { var n = parseInt(target.innerText); target = target.parentNode
if (!can.page.ClassList.set(can, target, html.SELECT, n == line || target == line)) { return }
line = target, can.Status(nfs.LINE, can.onexport.position(can, can.Option(nfs.LINE, n)))
}); if (!can.base.isObject(line)) { return 0 }
can.page.Select(can, line, "td.text", function(target) {
can.current = {line: line, next: function() { return line.nextSibling }, prev: function() { return line.previousSibling },
can.current = {line: line,
next: function() { return can.page.tagis(line.nextSibling, "tr.line")? line.nextSibling: undefined },
prev: function() { return can.page.tagis(line.previousSibling, "tr.line")? line.previousSibling: undefined },
text: function(text) { return text != undefined && can.onaction.modifyLine(can, line, text), target.innerText },
scroll: function(count) { if (count) { content.scrollTop += count*can.current.line.offsetHeight }
return parseFloat((can.current.line.offsetTop-content.scrollTop)/can.current.line.offsetHeight)
}, window: function() { return parseFloat(content.offsetHeight/can.current.line.offsetHeight) },
}, can.onimport.history(can, {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()})
can.isCmdMode() && can.onexport.session(can, SELECT_LINE+nfs.DF+can.Option(nfs.PATH)+can.Option(nfs.FILE), can.onexport.line(can, can.current.line))
can.onexport.hash(can), scroll && can.onaction.scrollIntoView(can), can.onengine.signal(can, LINE_SELECT, can._msg)
}); return can.onexport.line(can, line)
},
scrollIntoView: function(can, offset) { can.ui.content.scrollTo(0, (can.onexport.line(can, can.current.line)-can.current.window()/4)*can.current.line.offsetHeight) },
var _scroll = can.current.scroll(), _window = can.current.window()
if (scroll) {
can.onaction.scrollIntoView(can)
} else if (0 < _scroll && _scroll < 2) {
can.current.scroll(-1)
} else if (_window-3 < _scroll && _scroll < _window) {
can.current.scroll(1)
} else if (_scroll < 2 || _scroll > _window-3) {
can.onaction.scrollIntoView(can)
}
can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can.onexport.hash(can), can.onimport.__tabPath(can, false)
can.isCmdMode() && can.onexport.session(can, SELECT_LINE+nfs.DF+can.Option(nfs.PATH)+can.Option(nfs.FILE))
can.onengine.signal(can, LINE_SELECT, can._msg), can.onaction._selectLine(can)
}); return can.onexport.hash(can), can.onexport.line(can, line)
}, _selectLine: function(can) {},
scrollIntoView: function(can, offset) { can.ui.content.scrollTo(0, (can.onexport.line(can, can.current.line)-12)*can.current.line.offsetHeight) },
searchLine: function(event, can, value) { var offset = 0; can.page.Select(can, can.ui.content, "tr.line", function(tr) {
tr == can.current.line && can.page.Select(can, tr, "td.text>span", function(span) { offset += span.innerText.length;
(span == event.target || span.innerText == value) && can.runAction(can.request(event, {name: value, text: can.current.text(), offset: offset-1}, can.Option()), code.NAVIGATE, [], function(msg) {
msg.Append(nfs.FILE)? can.onimport.tabview(can, msg.Append(nfs.PATH), msg.Append(nfs.FILE), msg.Append(nfs.LINE)): can.user.toastFailure(can, "not found "+value)
})
}), can.page.Select(can, tr, "td.text", function(td) { offset += td.innerText.length+1 })
}) },
show: function(event, can) { can.runAction(can.request(event, {_toast: "渲染中...", args: can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) },
exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行中...", args: can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) },
msg.Append(nfs.FILE)? can.onimport.tabview(can, msg.Append(nfs.PATH), msg.Append(nfs.FILE), msg.Append(nfs.LINE)): can.user.toastFailure(can, "not found "+value)
})
}), can.page.Select(can, tr, "td.text", function(td) { offset += td.innerText.length+1 }) }) },
show: function(event, can) { can._msg._profile_hidden = false, can.runAction(can.request(event, {_toast: "渲染", args: can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) },
exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行", args: can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) },
plug: function(event, can, button) {
function show(index, args) { input.cancel(); can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { sub.select() }) }
function show(index, args) { input.cancel({}, can, "cancel"); can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { sub.select() }) }
var input = can.user.input(can.request(event, {type: button}), can, [{type: html.TEXT, name: ctx.INDEX, run: function(event, cmds, cb) { can.run(event, cmds, function(msg) {
if (cmds[0] == ctx.ACTION && cmds[1] == mdb.INPUTS && cmds[2] == ctx.INDEX) { var _msg = can.request({})
can.core.Item(can.db.toolkit, function(index) { _msg.Push(ctx.INDEX, index) }), _msg.Push(ctx.INDEX, ""), _msg.Copy(msg), cb(_msg)
@ -551,9 +476,9 @@ Volcanos(chat.ONACTION, {
}, true) }}, ctx.ARGS], function(list) { show(list[0], list[1]) })
},
open: function(event, can, button) {
var left = can.ui.project.offsetWidth+(can._output.offsetWidth)/4-34, width = (can._output.offsetWidth-can.ui.project.offsetWidth)/2
if (can.user.isMobile) { left = 0, width = can.page.width()-40 }
var input = can.user.input(can.request(event, {type: button}), can, [{name: nfs.FILE, style: {width: width}, select: function(item) { input.submit(event, can, web.SUBMIT) }, run: function(event, cmds, cb) {
console.log(new Error())
var left = can._output.offsetWidth/4, width = can._output.offsetWidth/2; if (can.user.isMobile) { left = 0, width = can.page.width()-40 }
var input = can.user.input(can.request(event, {type: button}), can, [{name: nfs.FILE, style: {width: width}, _force: true, select: function(item) { input.submit(event, can, web.SUBMIT) }, run: function(event, cmds, cb) {
can.run(can.request(event, {paths: can.db.paths.join(mdb.FS)}), cmds, function(msg) { function push(type, name) { _msg.Push(nfs.PATH, can.core.List(arguments).join(nfs.DF)) }
if (cmds[0] == ctx.ACTION && cmds[1] == mdb.INPUTS) { var _msg = can.onengine.signal(can, "tabview.open.inputs"), func = can.onexport.func(can)
can.core.Item(can.db.tabview, function(key) { var ls = can.core.Split(key, nfs.DF); push(ls[0]+ls[1]) }), _msg.Copy(msg)
@ -561,7 +486,7 @@ Volcanos(chat.ONACTION, {
can.core.Item(can.onengine.plugin.meta, function(key, value) { push(ctx.INDEX, "can."+key) }), cb(_msg)
} else { cb(msg) }
}, true)
}}], function(list, input) { input.cancel(); var ls = can.core.Split(list[0], nfs.DF, nfs.DF); switch (ls[0]) {
}}], function(list, input) { input.cancel({}, can, "cancel"); var ls = can.core.Split(list[0], nfs.DF, nfs.DF); switch (ls[0]) {
case web.HTTP: return can.onimport.tabview(can, "", list[0], web.SPACE)
case nfs.LINE: return can.onaction.selectLine(can, parseInt(ls[1]), true)
case web.SPACE: return can.onimport.tabview(can, "", ls[1].indexOf(web.HTTP) == 0? list[0].slice(6): ls[1], web.SPACE)
@ -569,12 +494,12 @@ Volcanos(chat.ONACTION, {
case ssh.SHELL: return can.onimport.tabview(can, "", [web.CODE_XTERM, list[0].slice(6)].join(mdb.FS), ctx.INDEX)
case cli.OPENS: return can.runAction(event, ls[0], ls[1], null, true)
default: var ls = can.onexport.split(can, list[0]); can.onimport.tabview(can, ls[0], ls[1])
} }); can.page.Modify(can, input._target, {className: "input vimer open float"})
} }); can.page.Modify(can, input._target, {className: "input inner open float"})
can.page.style(can, input._target, html.LEFT, left, html.TOP, can._output.offsetHeight/4, html.RIGHT, "")
},
find: function(event, can) { var last = can.onexport.line(can, can.current.line)
var ui = can.page.Append(can, can._output, [{view: "input vimer find float", list: [html.ACTION, html.OUTPUT],
style: {left: can.ui.project.offsetWidth+can._output.offsetWidth/4-34, top: can._output.offsetHeight/2-60}}]); can.onmotion.move(can, ui._target)
var ui = can.page.Append(can, can._output, [{view: "input inner find float", list: [html.ACTION, html.OUTPUT],
style: {left: can.ui.project.offsetWidth+can._output.offsetWidth/4-34, top: can._output.offsetHeight/2-60}}]); can.onmotion.move(can, ui._target)
function find(begin, text) { for (begin; begin <= can.ui.content._max; begin++) { if (can.onexport.text(can, can.onaction._getLine(can, begin)).indexOf(text) > -1) {
return last = begin, can.onaction.selectLine(can, begin, true)
} } last = 0, can.user.toast(can, "已经到最后一行") }
@ -593,12 +518,17 @@ Volcanos(chat.ONACTION, {
can.page.isDisplay(sub._target) || (sub._delay_init = false, sub.select()), sub.runAction(can.request({}, {value: value}), nfs.GREP, arg)
}) }
var from, to; var meta = can.onappend._action(can, [
{type: html.TEXT, name: nfs.FROM, style: {width: 200}, _init: function(target) { from = target, complete(target, nfs.FIND), can.onmotion.delay(can, function() { target.focus() }) }},
{type: html.BUTTON, name: nfs.FIND}, {type: html.BUTTON, name: nfs.GREP}, {type: html.TEXT, name: nfs.TO, _init: function(target) { to = target, complete(target, nfs.REPLACE) }},
{type: html.TEXT, name: nfs.FROM, _init: function(target) { from = target, complete(target, nfs.FIND), can.onmotion.delay(can, function() { target.focus() }) }},
{type: html.BUTTON, name: nfs.FIND}, {type: html.BUTTON, name: nfs.GREP}, {type: html.HR},
{type: html.TEXT, name: nfs.TO, _init: function(target) { to = target, complete(target, nfs.REPLACE) }},
{type: html.BUTTON, name: nfs.REPLACE}, {type: html.BUTTON, name: cli.CLOSE},
], ui.action, {_trans: {find: "查找", grep: "搜索", replace: "替换"},
find: function() { grep(from.value, can.Option(nfs.FILE), can.Option(nfs.PATH)), find(last+1, from.value) },
grep: function() { grep(from.value, nfs.PT, can.Option(nfs.PATH)) },
find: function() {
grep(from.value, can.Option(nfs.PATH)+can.Option(nfs.FILE))
find(last+1, from.value) },
grep: function() {
grep(from.value, can.Option(nfs.PATH), "src/", "usr/release/", "usr/icebergs/", "usr/toolkits/", "usr/volcanos/")
},
replace: function() { var text = can.current.text(), line = can.onexport.line(can, can.current.line)
can.db.undo.push(function() { can.onaction.selectLine(can, line), can.onaction.modifyLine(can, line, text) })
grep(from.value, can.Option(nfs.FILE), can.Option(nfs.PATH))
@ -612,29 +542,47 @@ Volcanos(chat.ONACTION, {
if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) }
if (can.page.isDisplay(can.ui.profile)) { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) }
},
onkeydown: function(event, can) {
if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return }
can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content)
},
})
Volcanos(chat.ONEXPORT, {
// list: [mdb.TIME, nfs.FILE, nfs.LINE, ice.BACK],
path: function(can) { return can.Option(nfs.PATH)+can.Option(nfs.FILE) },
line: function(can, line) { return parseInt(can.core.Value(can.page.SelectOne(can, line, "td.line"), "innerText")) },
text: function(can, line) { return can.core.Value(can.page.SelectOne(can, line, "td.text"), "innerText") },
content: function(can) { return can.page.Select(can, can.current&&can.current.content||can.ui.content, "td.text", function(item) { return item.innerText.trimEnd() }).join(lex.NL) },
position: function(can, index, total) { total = total||can.ui.content._max; return (parseInt(index))+nfs.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" },
size: function(can, size, full) { if (size > 1) { return size } if (size > 0) { return size*full } },
keys: function(can, path, file) { return [path||can.Option(nfs.PATH), file||can.Option(nfs.FILE)].join(nfs.DF) },
hash: function(can) { return can.misc.SearchHash(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) },
content: function(can) { var block = "()[]{}", deep = 0, parse = can.onexport.parse(can)
return can.page.Select(can, can.current&&can.current.content||can.ui.content, "td.text", function(item) { var text = item.innerText.trimEnd()
if (can.base.isIn(parse, nfs.JS, nfs.CSS, nfs.JSON) && !can.base.beginWith(text, block[0])) { var list = []
for (var i = 0; i < text.length; i++) {
for (var j = 0; j < block.length; j += 2) {
if (text[i] == block[j]) {
list.push(text[i])
break
} else if (text[i] == block[j+1]) {
if (list[list.length-1] == block[j]) {
list.pop()
} else {
list.push(text[i])
}
break
}
}
}
for (var j = 0; j < block.length; j += 2) { if (list.indexOf(block[j+1]) > -1) { deep--; break } }
if (deep < 0) { deep = 0 }
text = "\t".repeat(deep < 0? 0: deep)+text.trimStart()
can.base.beginWith(text, "+") && (text = "\t"+text)
for (var j = 0; j < block.length; j += 2) { if (list.indexOf(block[j]) > -1) { deep++; break } }
}
return text
}).join(lex.NL)
},
position: function(can, index, total) { total = total||can.ui.content._max; return (parseInt(index))+nfs.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" },
selection: function(can, str) { var s = document.getSelection().toString(), begin = str.indexOf(s), end = begin+s.length
for (var i = begin; i >= 0; i--) { if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } } return s
},
recover: function(can) {
can.onexport.session(can, RECOVER_TABS, can.page.SelectChild(can, can.ui.tabs, "", function(target) { return target._list }))
can.onexport.session(can, RECOVER_TOOL, can.page.SelectChild(can, can.ui.plug, "", function(target) { return target._list }))
parse: function(can) {
return can._msg.Option(lex.PARSE)||can.base.Ext(can.Option(nfs.FILE))
},
parse: function(can) { return can._msg.Option("parse")||can.base.Ext(can.Option(nfs.FILE)) },
split: function(can, file) { var ls = file.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] }
if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] }
return [ls.slice(0, 1).join(nfs.PS)+nfs.PS, ls.slice(1).join(nfs.PS)]

View File

@ -1,15 +0,0 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
can.core.List(can.misc._list, function(item) {
msg.Push(mdb.TIME, item[0])
msg.Push(nfs.FILE, item[1].split(nfs.DF)[0].split("?")[0])
msg.Push(nfs.LINE, item[1].split(nfs.DF)[1])
msg.Push(mdb.TYPE, item[2])
msg.Push(mdb.NAME, item[3])
msg.Push(mdb.TEXT, item.slice(4).join(lex.SP)||"")
}), msg.StatusTimeCount(), can.onmotion.clear(can), can.onappend.table(can, msg)
can.page.Select(can, can._option, "input[name=name]", function(target) {
target.onkeyup = function(event) { can.misc.Event(event, can, function(msg) {
can.onmotion.highlight(can, target.value)
}) }
})
}})

View File

@ -1,30 +0,0 @@
Volcanos(chat.ONIMPORT, {_init: function(can, cb) {
can.onimport.toolkit(can, {index: "web.code.favor"}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
code.INNER, function(cmds) {
can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE), msg.Option(nfs.LINE))
},
))) { return }
can.runAction(event, code.FAVOR, cmds, function(msg) {
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) {
if (key == mdb.VALUE) { key = line.key }
}
if (key != ctx.ACTION) { value = sub.page.replace(sub, value, nfs.PWD, "") }
return {text: ["", html.TD], list: [{text: [value, html.DIV]}], onclick: function(event) { var target = event.target
if ([mdb.ZONE, mdb.ID].indexOf(key) > -1) { return sub.onimport.change(event, sub, key, value) }
if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = sub.request(event, line, sub.Option())
return sub.runAction(event, target.name, [], function(msg) { sub.run() })
}
line.line && can.onimport.tabview(can, line.path, line.file.replace(nfs.PWD, ""), parseInt(line.line))
}}
}, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS))
})
}, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -1,6 +0,0 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { cb && cb(msg)
can._output.innerHTML = can.misc.sessionStorage(can, [can.ConfIndex(), "output"])||""
can.page.style(can, can._output, html.MIN_HEIGHT, 200, html.WIDTH, can.ConfWidth(), "white-space", "pre", "padding", "10px")
},
})

View File

@ -1,4 +1,6 @@
Volcanos(chat.ONIMPORT, {list: ["value", "filter", "run:button", "close"], _init: function(can, msg) {
can.onmotion.clear(can), can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.highlight(can, can.Option(mdb.VALUE, msg.Option(mdb.VALUE)))
can.page.Select(can, can._option, "input[name=filter]", function(target) { target.onkeyup = function(event) { can.onmotion.highlight(can, target.value) } })
}})
Volcanos(chat.ONIMPORT, {list: [mdb.VALUE, "close:button"],
_init: function(can, msg) { msg.Defer(function() { can.onappend.scroll(can) }), can.page.style(can, can._output, html.VISIBILITY, "")
can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.highlight(can, can.Option(mdb.VALUE, msg.Option(mdb.VALUE)))
can.page.Select(can, can._option, "input[name=value]", function(target) { can.onmotion.hidden(can, target) })
},
})

View File

@ -1,21 +0,0 @@
Volcanos(chat.ONIMPORT, {_init: function(can, args, cb) { var SESS = "web.code.sess"
can.onimport.toolkit(can, {index: SESS}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.SAVE, function(cmds) {
can.runActionCommand(event, SESS, [ctx.ACTION, mdb.CREATE,
"tool", JSON.stringify(can.onexport.tool(can)),
"tabs", JSON.stringify(can.onexport.tabs(can)),
], cb)
},
nfs.LOAD, function(cmds) {
can.onimport.sess(can, {
tool: JSON.parse(msg.Option("tool")),
tabs: JSON.parse(msg.Option("tabs")),
})
},
))) { return }
can.runActionCommand(event, SESS, cmds, cb)
}, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -16,7 +16,7 @@ Volcanos(chat.ONSYNTAX, {
"NAME": code.KEYWORD,
"SYNOPSIS": code.KEYWORD,
"DESCRIPTION": code.KEYWORD,
"AUTHOR": code.KEYWORD,
"COPYRIGHT": code.KEYWORD,
"LIBRARY": code.KEYWORD,
@ -48,7 +48,7 @@ Volcanos(chat.ONSYNTAX, {
"function": code.KEYWORD,
"return": code.KEYWORD,
"endfunction": code.KEYWORD,
"autocmd": code.KEYWORD,
"command": code.KEYWORD,
"execute": code.KEYWORD,
@ -58,7 +58,7 @@ Volcanos(chat.ONSYNTAX, {
"colorscheme": code.KEYWORD,
"highlight": code.KEYWORD,
"syntax": code.KEYWORD,
"has": code.FUNCTION,
"type": code.FUNCTION,
"empty": code.FUNCTION,
@ -84,16 +84,16 @@ Volcanos(chat.ONSYNTAX, {
"#include": code.KEYWORD, "#error": code.KEYWORD, "#line": code.KEYWORD,
"#define": code.KEYWORD, "#undef": code.KEYWORD, "#ifndef": code.KEYWORD, "#ifdef": code.KEYWORD,
"#if": code.KEYWORD, "#elif": code.KEYWORD, "#else": code.KEYWORD, "#endif": code.KEYWORD,
"if": code.KEYWORD, "else": code.KEYWORD,
"for": code.KEYWORD, "while": code.KEYWORD, "do": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD,
"switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD,
"return": code.KEYWORD, "goto": code.KEYWORD,
"void": code.DATATYPE, "char": code.DATATYPE, "int": code.DATATYPE, "float": code.DATATYPE, "double": code.DATATYPE,
"unsigned": code.DATATYPE, "signed": code.DATATYPE, "short": code.DATATYPE, "long": code.DATATYPE,
"struct": code.DATATYPE, "union": code.DATATYPE, "enum": code.DATATYPE,
"auto": code.DATATYPE, "register": code.DATATYPE, "volatile": code.DATATYPE, "const": code.DATATYPE,
"static": code.DATATYPE, "extern": code.DATATYPE, "typedef": code.DATATYPE,
"sizeof": code.FUNCTION, "defined": code.FUNCTION,
@ -108,12 +108,12 @@ Volcanos(chat.ONSYNTAX, {
"for": code.KEYWORD, "while": code.KEYWORD, "do": code.KEYWORD, "done": code.KEYWORD, "continue": code.KEYWORD, "break": code.KEYWORD,
"case": code.KEYWORD, "in": code.KEYWORD, "esac": code.KEYWORD,
"true": code.CONSTANT, "false": code.CONSTANT,
"history": code.FUNCTION, "alias": code.FUNCTION, "complete": code.FUNCTION, "compgen": code.FUNCTION, "bind": code.FUNCTION,
"printf": code.FUNCTION, "echo": code.FUNCTION, "eval": code.FUNCTION, "test": code.FUNCTION, "trap": code.FUNCTION, "shift": code.FUNCTION,
"set": code.FUNCTION, "xargs": code.FUNCTION,
"/dev/null": code.CONSTANT, "/dev/stdout": code.CONSTANT, "/dev/stderr": code.CONSTANT,
"mkdir": code.FUNCTION, "rmdir": code.FUNCTION, "mktemp": code.FUNCTION, "du": code.FUNCTION, "df": code.FUNCTION,
"cd": code.FUNCTION, "ls": code.FUNCTION, "ln": code.FUNCTION, "mv": code.FUNCTION, "rm": code.FUNCTION, "cp": code.FUNCTION,
"groupadd": code.FUNCTION, "useradd": code.FUNCTION, "chown": code.FUNCTION, "sudo": code.FUNCTION,
@ -123,28 +123,35 @@ Volcanos(chat.ONSYNTAX, {
"make": code.FUNCTION, "file": code.FUNCTION, "vim": code.FUNCTION, "gcc": code.FUNCTION, "git": code.FUNCTION, "go": code.FUNCTION,
"docker": code.FUNCTION,
},
func: function(can, push, text) { if (can.base.endWith(text, "() {")) { var ls = can.core.Split(text, "\t (){"); push(ls[0]) } },
func: function(can, push, text) { if (can.base.endWith(text, "() {")) { var ls = can.core.Split(text, "\t (){"); push(ls[0]) } },
}, configure: {link: "sh"},
shy: {prefix: {"#": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT},
keyword: {"source": code.KEYWORD,
shy: {
prefix: {
"#": code.COMMENT,
"~": code.COMMENT,
},
regexp: {"[A-Z_0-9]+": code.CONSTANT},
keyword: {
"source": code.KEYWORD, "return": code.KEYWORD,
"command": code.KEYWORD, "config": code.KEYWORD,
"create": code.FUNCTION, "modify": code.FUNCTION, "insert": code.FUNCTION,
"spide": code.DATATYPE, "serve": code.DATATYPE, "dream": code.DATATYPE,
"user": code.DATATYPE,
"title": code.KEYWORD, "navmenu": code.KEYWORD, "premenu": code.KEYWORD, "chapter": code.KEYWORD, "section": code.KEYWORD, "endmenu": code.KEYWORD,
"refer": code.KEYWORD, "brief": code.KEYWORD, "spark": code.KEYWORD, "shell": code.KEYWORD, "parse": code.KEYWORD,
"order": code.KEYWORD, "table": code.KEYWORD, "chart": code.KEYWORD, "label": code.KEYWORD, "chain": code.KEYWORD, "sequence": code.KEYWORD,
"field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD,
"style": code.KEYWORD,
"inner": code.KEYWORD,
"package": code.KEYWORD, "import": code.KEYWORD, "const": code.KEYWORD, "type": code.KEYWORD, "var": code.KEYWORD,
"if": code.KEYWORD, "else": code.KEYWORD,
"for": code.KEYWORD, "range": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD,
"switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD,
"func": code.KEYWORD, "defer": code.KEYWORD, "return": code.KEYWORD,
"init": code.FUNCTION, "main": code.FUNCTION, "list": code.FUNCTION, "info": code.FUNCTION,
"map": code.DATATYPE, "struct": code.DATATYPE, "interface": code.DATATYPE, "string": code.DATATYPE, "int": code.DATATYPE,
"true": code.CONSTANT, "false": code.CONSTANT,
"kit": code.PACKAGE, "ice": code.PACKAGE, "m": code.OBJECT, "arg": code.OBJECT,
"event": code.OBJECT, "can": code.OBJECT, "msg": code.OBJECT, "target": code.OBJECT,
"project": code.KEYWORD,
"product": code.KEYWORD,
"material": code.KEYWORD,
"publish": code.KEYWORD,
"username": code.FUNCTION, "usernick": code.FUNCTION,
"repos": code.FUNCTION, "binary": code.FUNCTION,
"language": code.FUNCTION, "avatar": code.FUNCTION,
},
func: function(can, push, text, indent, opts) { var ls = can.core.Split(text, "\t ")
opts.chapter = opts.chapter||0
@ -165,18 +172,18 @@ Volcanos(chat.ONSYNTAX, {
"for": code.KEYWORD, "range": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD,
"switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD, "fallthrough": code.KEYWORD,
"go": code.KEYWORD, "select": code.KEYWORD, "defer": code.KEYWORD, "return": code.KEYWORD,
"iota": code.CONSTANT, "true": code.CONSTANT, "false": code.CONSTANT, "nil": code.CONSTANT,
"int": code.DATATYPE, "int8": code.DATATYPE, "int16": code.DATATYPE, "int32": code.DATATYPE, "int64": code.DATATYPE,
"uint": code.DATATYPE, "uint8": code.DATATYPE, "uint16": code.DATATYPE, "uint32": code.DATATYPE, "uint64": code.DATATYPE,
"float32": code.DATATYPE, "float64": code.DATATYPE, "complex64": code.DATATYPE, "complex128": code.DATATYPE,
"rune": code.DATATYPE, "string": code.DATATYPE, "byte": code.DATATYPE, "uintptr": code.DATATYPE,
"bool": code.DATATYPE, "error": code.DATATYPE, "chan": code.DATATYPE, "map": code.DATATYPE,
"init": code.FUNCTION, "main": code.FUNCTION, "print": code.FUNCTION, "println": code.FUNCTION, "panic": code.FUNCTION, "recover": code.FUNCTION,
"new": code.FUNCTION, "make": code.FUNCTION, "len": code.FUNCTION, "cap": code.FUNCTION, "copy": code.FUNCTION, "append": code.FUNCTION, "delete": code.FUNCTION, "close": code.FUNCTION,
"complex": code.FUNCTION, "real": code.FUNCTION, "imag": code.FUNCTION,
"If": code.KEYWORD, "For": code.KEYWORD, "Switch": code.KEYWORD,
"kit": code.PACKAGE, "ice": code.PACKAGE, "m": code.OBJECT, "msg": code.OBJECT,
"Any": code.DATATYPE, "List": code.DATATYPE, "Map": code.DATATYPE, "Maps": code.DATATYPE, "Message": code.DATATYPE,
@ -186,14 +193,12 @@ Volcanos(chat.ONSYNTAX, {
function prefix(key, pre) { return key.slice(0, 1).toLowerCase() == key.slice(0, 1)? "- ": ("+ "+(pre? pre+nfs.PT: "")) }
if (indent == 0) { switch (ls[0]) {
case "package": opts.package = ls[1]; break
case "func": if (ls[1] == "(") { var p = ls.indexOf(")")
push(prefix(ls[p+1])+ls[2]+nfs.PT+ls[p+1]+"()"); break
}
case "func": if (ls[1] == "(") { var p = ls.indexOf(")"); push(prefix(ls[p+1])+ls[2]+nfs.PT+ls[p+1]+"()"); break }
case "const":
case "var": if (ls[1] == "(") { break }
case "type": push(prefix(ls[1])+ls[1]+(ls[0]=="type"? "{}": "")); break
case "var": if (ls[1] == "(") { break } // ")"
case "type": push(prefix(ls[1])+ls[1]+(ls[0]=="type"? "{}": ls[0]=="func"? "()": "")); break
} opts.stack = [ls[0]] } else if (indent == 4 && opts.stack[0] == "func") {
if (text.indexOf("MergeCommands(") > -1) { opts.block = "cmds" } else if (text.indexOf("}") == 0) { opts.block = "" }
if (text.indexOf("MergeCommands(") > -1) { opts.block = "cmds" } else if (text.indexOf("}") == 0) { opts.block = "" }
} else if (indent == 8) {
if (isKey()) { push(prefix(ls[0], opts.package)+ls[0]), opts.cmds = ls[0] }
// if (isKey()) { push(prefix(ls[0], opts.package)+ls[0]), opts.cmds = opts.package+nfs.PT+ls[0] }
@ -201,7 +206,10 @@ Volcanos(chat.ONSYNTAX, {
if (isKey()) { push("+ "+opts.cmds+lex.SP+ls[0]) }
}
},
}, mod: {prefix: {"//": code.COMMENT}, split: {operator: "(=>)"}, keyword: {"go": code.KEYWORD, "module": code.KEYWORD, "require": code.KEYWORD, "replace": code.KEYWORD}}, sum: {},
},
mod: {prefix: {"//": code.COMMENT}, split: {operator: "(=>)"}, keyword: {
"go": code.KEYWORD, "module": code.KEYWORD, "require": code.KEYWORD, "replace": code.KEYWORD,
}}, sum: {}, work: {keyword: {go: code.KEYWORD, use: code.KEYWORD}},
js: {prefix: {"// ": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT},
keyword: {
"let": code.KEYWORD, "const": code.KEYWORD, "var": code.KEYWORD,
@ -210,7 +218,7 @@ Volcanos(chat.ONSYNTAX, {
"for": code.KEYWORD, "in": code.KEYWORD, "while": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD,
"try": code.KEYWORD, "catch": code.KEYWORD, "debugger": code.KEYWORD,
"function": code.KEYWORD, "return": code.KEYWORD, "arguments": code.OBJECT, "callee": code.OBJECT, "this": code.OBJECT,
"true": code.CONSTANT, "false": code.CONSTANT, "null": code.CONSTANT, "undefined": code.CONSTANT,
"parseInt": code.FUNCTION, "parseFloat": code.FUNCTION, "encodeURIComponent": code.FUNCTION, "decodeURIComponent": code.FUNCTION,
"setTimeout": code.FUNCTION, "alert": code.FUNCTION, "confirm": code.FUNCTION, "prompt": code.FUNCTION,
@ -218,34 +226,33 @@ Volcanos(chat.ONSYNTAX, {
"location": code.OBJECT, "history": code.OBJECT,
"window": code.OBJECT, "navigator": code.OBJECT,
"localStorage": code.OBJECT, "sessionStorage": code.OBJECT,
"typeof": code.KEYWORD, "new": code.KEYWORD, "delete": code.KEYWORD,
"import": code.KEYWORD, "from": code.KEYWORD, "export": code.KEYWORD, "default": code.KEYWORD,
"class": code.KEYWORD, "static": code.KEYWORD,
"async": code.KEYWORD, "await": code.KEYWORD,
"Array": code.DATATYPE, "JSON": code.DATATYPE, "Date": code.DATATYPE, "Math": code.DATATYPE, "XMLHttpRequest": code.DATATYPE, "WebSocket": code.DATATYPE,
"hasOwnProperty": code.FUNCTION, "isArray": code.FUNCTION, "forEach": code.FUNCTION, "apply": code.FUNCTION, "call": code.FUNCTION,
"length": code.FUNCTION, "split": code.FUNCTION, "trim": code.FUNCTION, "toLowerCase": code.FUNCTION, "indexOf": code.FUNCTION, "lastIndexOf": code.FUNCTION,
"concat": code.FUNCTION, "reverse": code.FUNCTION, "slice": code.FUNCTION, "join": code.FUNCTION, "sort": code.FUNCTION, "push": code.FUNCTION, "pop": code.FUNCTION,
"stringify": code.FUNCTION, "parse": code.FUNCTION,
"require": code.FUNCTION,
"kit": code.CONSTANT, "ice": code.CONSTANT,
"ctx": code.CONSTANT, "mdb": code.CONSTANT, "web": code.CONSTANT, "aaa": code.CONSTANT,
"tcp": code.CONSTANT, "nfs": code.CONSTANT, "cli": code.CONSTANT, "log": code.CONSTANT,
"code": code.CONSTANT, "wiki": code.CONSTANT, "chat": code.CONSTANT, "team": code.CONSTANT, "mall": code.CONSTANT,
"http": code.CONSTANT, "html": code.CONSTANT, "icon": code.CONSTANT, "svg": code.CONSTANT,
"can": code.OBJECT, "msg": code.OBJECT, "cb": code.FUNCTION, "target": code.OBJECT, "event": code.OBJECT,
"Volcanos": code.FUNCTION, "shy": code.FUNCTION, "cbs": code.FUNCTION,
"res": code.OBJECT, "sub": code.OBJECT, "sup": code.OBJECT,
},
complete: function(event, can, msg, target, pre, key) {
return
var ls = can.core.Split(can.core.Split(pre, "\t {(:,)}").pop(), nfs.PT), list = {can: can, msg: msg, target: target, event: event, window: window}
var ls = can.core.Split(can.core.Split(pre, "\t {(:,)}").pop(), nfs.PT), list = {event: event, can: can, msg: msg, target: target, window: window}
can.core.ItemKeys(key == ""? list: can.core.Value(list, ls)||can.core.Value(window, ls)||window, function(k, v) {
msg.Push(mdb.NAME, k).Push(mdb.TEXT, (v+"").split(lex.NL)[0])
})
@ -272,10 +279,16 @@ Volcanos(chat.ONSYNTAX, {
keyword: {
"not": code.DATATYPE, "first-child": code.DATATYPE, "last-child": code.DATATYPE, "nth-child": code.DATATYPE,
"placeholder": code.DATATYPE, "hover": code.DATATYPE, "focus": code.DATATYPE,
"$body": code.KEYWORD, "$fieldset": code.KEYWORD,
"$option": code.KEYWORD, "$action": code.KEYWORD, "$output": code.KEYWORD, "$status": code.KEYWORD,
"$content": code.KEYWORD, "$profile": code.KEYWORD, "$display": code.KEYWORD, "$project": code.KEYWORD,
"output": code.KEYWORD,
"background-color": code.FUNCTION, "color": code.FUNCTION,
"font-family": code.FUNCTION, "font-weight": code.FUNCTION, "font-style": code.FUNCTION, "font-size": code.FUNCTION, "line-height": code.FUNCTION,
"text-align": code.FUNCTION, "white-space": code.FUNCTION, "word-break": code.FUNCTION, "letter-space": code.FUNCTION, "tab-size": code.FUNCTION,
"vertical-align": code.FUNCTION,
"padding": code.FUNCTION, "padding-left": code.FUNCTION, "padding-top": code.FUNCTION, "padding-right": code.FUNCTION, "padding-bottom": code.FUNCTION,
"border": code.FUNCTION, "border-left": code.FUNCTION, "border-top": code.FUNCTION, "border-right": code.FUNCTION, "border-bottom": code.FUNCTION,
"margin": code.FUNCTION, "margin-left": code.FUNCTION, "margin-top": code.FUNCTION, "margin-right": code.FUNCTION, "margin-bottom": code.FUNCTION,
@ -287,7 +300,7 @@ Volcanos(chat.ONSYNTAX, {
"position": code.FUNCTION, "z-index": code.FUNCTION, "cursor": code.FUNCTION, "transition": code.FUNCTION,
"transform": code.FUNCTION, "translate": code.FUNCTION, "rotate": code.FUNCTION,
"stroke-width": code.FUNCTION, "stroke": code.FUNCTION, "fill": code.FUNCTION,
"transparent": code.CONSTANT,
"monospace": code.CONSTANT, "bold": code.CONSTANT, "italic": code.CONSTANT, "normal": code.CONSTANT,
"center": code.CONSTANT,
@ -300,34 +313,34 @@ Volcanos(chat.ONSYNTAX, {
"relative": code.CONSTANT, "absolute": code.CONSTANT, "sticky": code.CONSTANT, "static": code.CONSTANT, "fixed": code.CONSTANT,
"left": code.FUNCTION, "top": code.FUNCTION, "right": code.FUNCTION, "bottom": code.FUNCTION,
"pointer": code.CONSTANT, "copy": code.CONSTANT,
"black": code.CONSTANT, "white": code.CONSTANT,
"silver": code.CONSTANT, "gray": code.CONSTANT,
"red": code.CONSTANT, "blue": code.CONSTANT,
"cyan": code.CONSTANT, "aliceblue": code.CONSTANT,
"--plugin-bg-color": code.CONSTANT, "--plugin-fg-color": code.CONSTANT,
"--input-bg-color": code.CONSTANT, "--output-bg-color": code.CONSTANT,
"--danger-bg-color": code.CONSTANT, "--notice-bg-color": code.CONSTANT,
"--hover-bg-color": code.CONSTANT, "--hover-fg-color": code.CONSTANT,
"--body-bg-color": code.CONSTANT, "--body-fg-color": code.CONSTANT,
/*
"text-shadow": code.FUNCTION,
"caret-color": code.FUNCTION,
"type": code.FUNCTION, "name": code.FUNCTION,
"background": code.FUNCTION, "background-position": code.FUNCTION, "background-size": code.FUNCTION,
"dark": code.CONSTANT, "light": code.CONSTANT,
"yellow": code.CONSTANT,
"green": code.CONSTANT,
"purple": code.CONSTANT,
"navy": code.CONSTANT,
"teal": code.CONSTANT,
"gold": code.CONSTANT,
"orange": code.CONSTANT,
"lavender": code.CONSTANT,
@ -335,7 +348,7 @@ Volcanos(chat.ONSYNTAX, {
"dimgray": code.CONSTANT,
"brown": code.CONSTANT,
"snow": code.CONSTANT,
"skyblue": code.CONSTANT,
"cadetblue": code.CONSTANT,
"cornflowerblue": code.CONSTANT,
@ -348,13 +361,13 @@ Volcanos(chat.ONSYNTAX, {
"lightblue": code.CONSTANT,
"lightgray": code.CONSTANT,
"lightgreen": code.CONSTANT,
"magenta": code.CONSTANT,
"vertical-align": code.FUNCTION,
"url": code.FUNCTION,
"contexts": code.CONSTANT,
*/
*/
}, include: ["html"],
func: function(can, push, text) { text.indexOf("/* ") == 0 && push(can.base.trimPrefix(can.base.trimSuffix(text, " */"), "/* ")) },
},
@ -362,21 +375,21 @@ Volcanos(chat.ONSYNTAX, {
"DOCTYPE": code.KEYWORD, "html": code.KEYWORD, "head": code.KEYWORD, "body": code.KEYWORD,
"meta": code.KEYWORD, "title": code.KEYWORD, "link": code.KEYWORD, "script": code.KEYWORD,
"src": code.FUNCTION, "href": code.FUNCTION, "rel": code.FUNCTION, "style": code.FUNCTION,
"h1": code.KEYWORD, "h2": code.KEYWORD, "h3": code.KEYWORD,
"p": code.KEYWORD, "em": code.KEYWORD, "strong": code.KEYWORD, "sub": code.KEYWORD, "sup": code.KEYWORD, "i": code.KEYWORD, "b": code.KEYWORD, "u": code.KEYWORD,
"pre": code.KEYWORD, "code": code.KEYWORD, "var": code.KEYWORD, "kbd": code.KEYWORD, "samp": code.KEYWORD,
"ul": code.KEYWORD, "ol": code.KEYWORD, "li": code.KEYWORD,
"table": code.KEYWORD, "thead": code.KEYWORD, "tbody": code.KEYWORD, "tfoot": code.KEYWORD,
"tr": code.KEYWORD, "th": code.KEYWORD, "td": code.KEYWORD,
"colgroup": code.KEYWORD, "col": code.KEYWORD, "colspan": code.FUNCTION, "rowspan": code.FUNCTION,
"header": code.KEYWORD, "nav": code.KEYWORD, "main": code.KEYWORD, "aside": code.KEYWORD, "footer": code.KEYWORD, "article": code.KEYWORD, "section": code.KEYWORD,
"a": code.KEYWORD, "div": code.KEYWORD, "span": code.KEYWORD, "br": code.KEYWORD, "hr": code.KEYWORD,
"img": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD, "canvas": code.KEYWORD, "iframe": code.KEYWORD,
"svg": code.KEYWORD, "rect": code.KEYWORD, "circle": code.KEYWORD,
"fieldset": code.KEYWORD, "legend": code.KEYWORD, "form": code.KEYWORD, "label": code.KEYWORD,
"select": code.KEYWORD, "option": code.KEYWORD, "input": code.KEYWORD, "textarea": code.KEYWORD, "button": code.KEYWORD,
"height": code.FUNCTION, "width": code.FUNCTION,

View File

@ -1,21 +0,0 @@
Volcanos(chat.ONIMPORT, {_init: function(can, args, cb) {
can.onimport.toolkit(can, {index: "web.code.template"}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option())
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.DEFS, function(cmds) {
can.user.input(event, can, can.base.Obj(msg.Option("args")||"[]"), function(data) {
var msg = can.request(event); can.core.Item(data, function(key, value) { msg.Option(key, value) })
can.runActionCommand(event, "web.code.template", [nfs.DEFS].concat(cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
can.onimport.project(can, can.Option(nfs.PATH))
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option("main"), "", function() {
can.onimport.tabview(can, can.Option(nfs.PATH), cmds[1], 1, function() {})
}, true)
})
})
}
))) { return }
can.runActionCommand(event, "web.code.template", cmds, cb)
}, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -1,17 +1,22 @@
fieldset.vimer>div.output>div.layout>div.layout>div.layout div.content { border-left:var(--box-border); border-top:var(--box-border); }
fieldset.vimer>div.output>div.layout>div.layout input.current { background-color:transparent; color:transparent; padding-left:var(--input-padding); height:var(--code-line-height); position:absolute; }
fieldset.vimer>div.output>div.layout>div.layout div.content div.complete { background-color:unset; padding-top:0; display:none; position:absolute; height:1px; overflow:visible; }
fieldset.vimer>div.output>div.layout>div.layout div.content div.complete div.prefix { color:transparent; white-space:pre; float:left; }
fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content thead { display:none; }
fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content td:first-child { padding-left:0; }
fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content { padding-left:var(--input-padding); width:unset; max-width:600px; display:block; box-shadow:var(--box-shadow); }
fieldset.vimer>div.output>div.layout>div.layout div.content.insert div.complete:not(.hide) { display:block; top:unset; }
fieldset.vimer>div.output>div.layout>div.layout div.content.normal input.current { caret-color:var(--notice-bg-color); border:var(--notice-bg-color) solid 1px; }
fieldset.vimer>div.output>div.layout>div.layout div.content.insert input.current { caret-color:var(--danger-bg-color); border:var(--danger-bg-color) solid 1px; }
fieldset.vimer>div.output>div.layout>div.layout div.content.normal tr.line.select>td.line { background-color:var(--notice-bg-color); color:white; }
fieldset.vimer>div.output>div.layout>div.layout div.content.insert tr.line.select>td.line { background-color:var(--danger-bg-color); color:white; }
fieldset.vimer>div.output.normal>div.layout>div.tabs>div.tabs>div.tabs.select { border-bottom:var(--notice-bg-color) solid 2px; }
fieldset.vimer>div.output.insert>div.layout>div.tabs>div.tabs>div.tabs.select { border-bottom:var(--danger-bg-color) solid 2px; }
fieldset.vimer>div.output.normal>div.layout>div.path span.mode.normal { color:var(--notice-bg-color); }
fieldset.vimer>div.output.insert>div.layout>div.path span.mode.insert { color:var(--danger-bg-color); }
div.input.vimer.open.float input[type=text] { width:100% !important; }
fieldset.vimer>div.output.source>div.project div.item.select { border-right:var(--box-border3); }
fieldset.vimer>div.output.source>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-border3); }
fieldset.vimer>div.output.source.normal>div.project div.expand.open { color:var(--notice-bg-color); }
fieldset.vimer>div.output.source.normal>div.project div.item.select { border-right:var(--box-notice3); }
fieldset.vimer>div.output.source.normal>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-notice3); }
fieldset.vimer>div.output.source.normal>div.layout>div.path span.mode.normal { color:var(--notice-bg-color); }
fieldset.vimer>div.output.source.normal>div.layout>div.layout>div.content tr.line.select>td.line { background-color:var(--notice-bg-color); color:white; }
fieldset.vimer>div.output.source.normal>div.layout>div.layout>div.content input.current { border:var(--box-notice); caret-color:var(--notice-bg-color); }
fieldset.vimer>div.output.source.insert>div.project div.expand.open { color:var(--danger-bg-color); }
fieldset.vimer>div.output.source.insert>div.project div.item.select { border-right:var(--box-danger3); }
fieldset.vimer>div.output.source.insert>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-danger3); }
fieldset.vimer>div.output.source.insert>div.layout>div.path span.mode.insert { color:var(--danger-bg-color); }
fieldset.vimer>div.output.source.insert>div.layout>div.layout>div.content tr.line.select>td.line { background-color:var(--danger-bg-color); color:white; }
fieldset.vimer>div.output.source.insert>div.layout>div.layout>div.content input.current { border:var(--box-danger); caret-color:var(--danger-bg-color); }
fieldset.vimer>div.output.source.insert>div.layout>div.layout>div.content div.complete:not(.hide) { display:block; top:unset; }
fieldset.vimer>div.output.source>div.layout>div.layout input.current { background-color:transparent; color:transparent; padding-left:var(--input-padding); height:var(--code-line-height); position:absolute; }
fieldset.vimer>div.output.source>div.layout>div.layout>div.content div.complete { background-color:unset; padding-top:0; height:1px; overflow:visible; display:none; position:absolute; }
fieldset.vimer>div.output.source>div.layout>div.layout>div.content div.complete div.prefix { color:transparent; white-space:pre; float:left; }
fieldset.vimer>div.output.source>div.layout>div.layout>div.content div.complete table.content { box-shadow:var(--plugin-box-shadow); padding-left:var(--input-padding); width:unset; max-width:600px; display:block; }
fieldset.vimer>div.output.source>div.layout>div.layout>div.content div.complete table.content thead { display:none; }
fieldset.vimer>div.output.source>div.layout>div.layout>div.content div.complete table.content td:first-child { padding-left:0; }
fieldset.vimer>div.output>div.layout>div.tabs>div.tabs>div.tabs.origin.select { border-top:var(--box-danger3); }

View File

@ -1,144 +1,172 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { if (can.user.mod.isPod) { delete(can.onfigure.space), delete(can.onfigure.repos) }
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.onappend.style(can, code.VIMER); if (can.user.mod.isPod) { delete(can.onfigure.space) }
can.require(["/plugin/local/code/inner.js"], function(can) { can.onimport._last_init(can, msg, function() {
can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) })
can.db.undo = [], can.db.redo = [], can.onimport._input(can), cb && cb(msg)
}) })
},
_input: function(can) { var ui = can.page.Append(can, can.ui.content.parentNode, [
{view: [code.CURRENT, html.INPUT], spellcheck: false, onkeydown: function(event) { can.onimport._value(can); if (event.metaKey) { return }
can.db._keylist = can.onkeymap._parse(event, can, can.db.mode+(event.ctrlKey? "_ctrl": ""), can.db._keylist, can.ui.current)
if (can.db.mode == mdb.NORMAL) { can.onkeymap.prevent(event) } if (can.db.mode == mdb.INSERT) { can.db._keylist = [] }
}, onkeyup: function(event) { can.onimport._value(can); if (event.metaKey) { return } can.onkeymap._complete(event, can)
}, onfocus: function(event) { can.current.line.appendChild(can.ui.complete)
{view: [code.CURRENT, html.INPUT], spellcheck: false, onkeydown: function(event) { if (event.metaKey) { return }
can.onimport._value(can), can.onkeymap._parse(event, can, can.db.mode+(event.ctrlKey? "_ctrl": ""), can.ui.current)
if (can.db.mode == mdb.INSERT) { can.ui.current._keylist = [] }
if (can.db.mode == mdb.NORMAL) { can.onkeymap.prevent(event) }
}, onkeyup: function(event) { if (event.metaKey) { return }
can.onimport._value(can); can.onkeymap._complete(event, can)
}, onclick: function(event) { can.onkeymap._insert(event, can)
if (event.metaKey) { var target = event.target, begin = target.selectionStart, end = begin, reg = /[a-zA-Z0-9]/
for (begin; begin > 0; begin--) { if (!reg.test(target.value.slice(begin, begin+1))) { begin++; break } }
for (end; end < target.value.length; end++) { if (!reg.test(target.value.slice(end, end+1))) { break } }
can.onaction.searchLine(event, can, target.value.slice(begin, end))
}
can.onmotion.delay(can, function() { can.page.SelectChild(can, can.ui.complete, html.DIV, function(target) {
target.innerText = can.ui.current.value.slice(0, can.ui.current.selectionStart)
}) })
}}, {view: [[code.COMPLETE]]},
]); can.ui.current = ui.current, can.ui.complete = ui.complete, can.onkeymap._plugin(can) },
_value: function(can) { can.onimport.__tabPath(can, true), can.db.mode == mdb.INSERT && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }) },
_value: function(can) { can.onimport.__tabPath(can, true)
can.db.mode == mdb.INSERT && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) })
},
}, [""])
Volcanos(chat.ONFIGURE, {
source: function(can, target, zone, path) {
var args = (can.isCmdMode() && can.base.getValid(can.misc.SearchHash(can))) || [can.Option(nfs.PATH), can.Option(nfs.FILE)]
function show(target, zone, path) { can.run(can.request({}, {_method: http.GET, dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) {
zone._icon(kit.Dict(
web.REFRESH, function(event) { show(target, zone, path) },
mdb.CREATE, function(event, button) { can.onaction.module(event, can, nfs.MODULE) },
)), zone._total(msg.Length()), can.onmotion.clear(can, target)
var cache, list = can.core.List(msg.Table(), function(item) { if (path == args[0] && args[1].indexOf(item.path) == 0) { item.expand = true }
item._init = function(target) { item._remove = function() { can.page.Remove(can, target.parentNode), delete(cache[item.path]) }
if (msg.result && msg.result.indexOf(item.path) > -1) { can.onmotion.delay(can, function() { can.onappend.style(can, mdb.MODIFY, target.parentNode)
for (var _target = target.parentNode; _target != zone._target; _target = _target.parentNode) { _target.previousSibling && can.onappend.style(can, mdb.MODIFY, _target.previousSibling) }
}) }
}, item._menu = {meta: kit.Dict(
mdb.CREATE, function(event, button) { can.onaction.script(can.request(event, {path: path, file: item.path}), can, nfs.SCRIPT) },
nfs.TRASH, function(event, button) { can.runAction(event, nfs.TRASH, [path+item.path], function(msg) { show(target, zone, path) }) },
)}; return item
}); cache = can.onimport.tree(can, list, nfs.PATH, nfs.PS, function(event, item) { can.onimport.tabview(can, path, item.path) }, target, cache)
}, true) } if (path.length == 1) { return show(target, zone, path[0]) } can.page.Remove(can, zone._action)
can.onimport.zone(can, can.core.List(path, function(path) { return kit.Dict(mdb.NAME, path, path == args[0]? chat._INIT: chat._DELAY_INIT, function(target, zone) {
show(target, zone, path), zone._toggle = function() { can.ui.zone.source && can.ui.zone.source._layout(), zone._layout() }
}) }), target)
},
space: function(can, target, zone) { can.onimport._zone(can, zone, web.DREAM, function(sub, msg) {
sub.onimport._open = function(_, msg, arg) { var link = can.misc.ParseURL(can, arg)
if (link.pod) { can.onimport.tabview(can, "", link.pod, web.SPACE), sub.Update(); return }
can.onimport.tabview(can, "", arg, web.SPACE)
}
sub.onexport.record = function(sub, value, key) {
can.onimport.tabview(can, "", value, web.SPACE) }
can.page.Select(can, sub._output, html.DIV_ITEM, function(target, index) { can.onappend.style(can, msg.status[index], target) })
}), zone.toggle(false) },
})
Volcanos(chat.ONACTION, {list: ["创建", "编译", "源码", "计划", "流程", "文档", "后台", "桌面", "官网"], _trans: {show: "预览", exec: "展示"},
_run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) {
if (msg.IsErr()) { return can.user.toastFailure(can, msg.Result()) }
can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)), can.user.toastSuccess(can, button), can.ui.zone.source.refresh()
}) },
_runs: function(event, can, button, cb) { var meta = can.Conf(); can.request(event, {action: button}), can.user.input(event, can, meta.feature[button], function(args) { can.onaction._run(event, can, button, args, cb) }) },
save: function(event, can, button) { can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can)})
function imports(str) { var block = "", count = 0; can.core.List(str.split(lex.NL), function(item) {
if (can.base.beginWith(item, "import (")) { block = can.core.Split(item)[0]; return }
if (can.base.beginWith(item, ")")) { block = ""; return }
if (can.base.beginWith(item, "import ")) { count++; return }
if (block == "import") { count++ }
}); return count }
can.onaction._run(event, can, button, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
if (can.onexport.parse(can) == nfs.GO) { var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content)
can.ui.content._max = 0, can.core.List(msg.Result().split(lex.NL), function(item) { can.onaction.appendLine(can, item) })
can.onaction.selectLine(can, line+imports(msg.Result())-imports(msg.Option(nfs.CONTENT)))
} can.user.toastSuccess(can, button, can.Option(nfs.PATH)+can.Option(nfs.FILE))
source: function(can, target, zone, hash) { var args = [can.Option(nfs.PATH), can.Option(nfs.FILE)]
can.run({}, [ctx.ACTION, nfs.REPOS], function(msg) { var paths = can.db.paths
can.core.List(paths.concat(msg.Table(function(value) { return value.path })), function(p) {
if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.isIn(p,
nfs.USR_ICONS,
"usr/material/",
nfs.USR_NODE_MODULES,
nfs.USR_WEBSOCKET,
nfs.USR_GO_QRCODE,
nfs.USR_GO_GIT,
nfs.USR_GEOAREA,
)) { return }
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
})
function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) {
var cache, list = can.core.List(msg.Table(), function(value) {
if (path == nfs.SRC && can.base.isIn(value.path,
"main.svg",
"main.ico",
"main.png",
"main.jpg",
"qrcode.jpg",
"version.go",
"binpack.go",
"binpack_usr.go",
)) { return }
if (path == nfs.USR_RELEASE && can.base.isIn(value.path, "conf.go", "binpack.go")) { return }
if (path == args[0] && args[1] == value.path) { value.expand = true }
return value
}); can.onmotion.clear(can, target), zone._total(msg.Length())
cache = can.onimport.tree(can, list, function(event, item, target) {
can.base.endWith(item.path, nfs.PS) || can.onimport.tabview(can, path, item.path, "", function(msg) { msg._item = target })
}, function(event, item, target) {
var msg = can.request(event); msg.Option(nfs.PATH, path), msg.Option(nfs.FILE, item.path)
}, target, cache)
can.onmotion.delay(can, function() { hash.length > 1 && can.onimport.openzone(can, hash[0], hash[1], hash[2]) && can.onimport.tabview(can, hash[0], hash[1], hash[2]), hash = [] })
can.onimport._zone_icon(can, msg, zone, function(event, button) { can.onaction._runs(event, can, button) })
}, true) } if (paths.length == 1) { return show(target, zone, paths[0]) } can.page.Remove(can, zone._action)
can.onimport.zone(can, can.core.List(paths, function(path) {
return kit.Dict(mdb.NAME, path, path == args[0]? chat._INIT: chat._DELAY_INIT, function(target, zone) { show(target, zone, path) })
}), target)
})
},
trash: function(event, can, button) { can.onaction._run(event, can, button, [can.Option(nfs.PATH)+can.Option(nfs.FILE)], function() { can._msg._tab._close() }) },
space: function(can, target, zone, hash) { can.onimport._zone(can, zone, web.DREAM, mdb.NAME, hash), zone.toggle(false) },
})
Volcanos(chat.ONACTION, {_trans: {input: {main: "程序", top: "顶域"}},
_run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) {
can.onmotion.delay(can, function() { can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)) }, 300)
can.ui.zone.source.refresh()
}) },
_runs: function(event, can, button, cb) { var meta = can.Conf(), msg = can.request(event); msg.Option(ctx.ACTION, button)
can.user.input(event, can, meta.feature[button], function(data, args) { msg.Option(data), can.onaction._run(event, can, button, args, cb) })
},
save: function(event, can, button) {
can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can), _toast: button})
can.onaction._run(event, can, button, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.onaction.reload(can, msg)
})
},
reload: function(can, msg) {
function imports(str) { var block = "", count = 0; can.core.List(str.split(lex.NL), function(text) {
if (can.base.beginWith(text, "import (")) { block = can.core.Split(text)[0]; return }
if (can.base.beginWith(text, ")")) { block = ""; return }
if (can.base.beginWith(text, "import ")) { count++; return }
if (block == "import") { count++ }
}); return count }
if (can.onexport.parse(can) == nfs.GO) {
var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0
can.core.List(msg.Result().split(lex.NL), function(text) { can.onaction.appendLine(can, text) })
can.onaction.selectLine(can, line+imports(msg.Result())-imports(msg.Option(nfs.CONTENT)))
}
if (can.base.isIn(can.onexport.parse(can), nfs.JS, nfs.JSON)) {
var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0
can.core.List(msg.Option("content").split(lex.NL), function(text) { can.onaction.appendLine(can, text) })
can.onaction.selectLine(can, line)
}
},
trash: function(event, can, button) { var msg = can.request(event), p = msg.Option(nfs.PATH)+msg.Option(nfs.FILE)
can.onaction._run(event, can, button, [p], function(msg) { can.ui.zone.source.refresh() })
},
script: function(event, can, button) { can.onaction._runs(event, can, button) },
module: function(event, can, button) { can.onaction._runs(can.request(event, {title: "创建模块"}), can, button) },
compile: function(event, can, button) { var msg = can.request(event); msg.Option(chat._TOAST, "")
create: function(event, can, button) { can.onaction._runs(event, can, button) },
module: function(event, can, button) { can.onaction._runs(can.request(event, {title: can.user.trans(can, button, "创建模块")}), can, button) },
compile: function(event, can, button) { var msg = can.request(event, {_toast: button})
can.runAction(event, button, [], function(msg) { can.ui.search && can.ui.search.hidden()
if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) { can.ui.search = sub, sub.select()
can.onmotion.delay(can, function() { can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)) })
}) } var toast = can.user.toastProcess(can, cli.RESTART); can.onmotion.delay(can, function() { toast.close(), can.user.toastSuccess(can, cli.RESTART) }, 3000)
})
},
"命令": function(event, can) { can.user.input(event, can, [{name: ctx.INDEX, need: "must"}, ctx.ARGS], function(list) { can.onimport.tabview(can, "", list[0]+(list[1]? mdb.FS+list[1]: ""), ctx.INDEX) }) },
"插件": function(event, can) { can.user.input(can.request(event, {type: "plug"}), can, [{name: ctx.INDEX, need: "must"}, ctx.ARGS], function(list, data) { var sub = can.db.toolkit[list.join(",")]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, {index: data.index, args: can.core.Split(data.args||"")}, function(sub) { can.db.toolkit[list.join(",")] = sub.select() })
"命令": function(event, can) { can.user.input(event, can, [{name: ctx.INDEX, need: "must"}, ctx.ARGS], function(data) {
can.onimport.tabview(can, "", data.index+(data.args? mdb.FS+data.args: ""), ctx.INDEX)
}) },
"扩展": function(event, can) { can.user.input(can.request(event, {action: "extension"}), can, ["url"], function(list) { var sub = can.db.toolkit[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0]) }) },
"创建": function(event, can) { can.onaction.module(event, can, nfs.MODULE) },
"编译": function(event, can) { can.onaction.compile(event, can, code.COMPILE) },
"源码": function(event, can) { can.onimport.tabview(can, "", web.CODE_GIT_STATUS, ctx.INDEX) },
"计划": function(event, can) { can.onimport.tabview(can, "", web.TEAM_PLAN, ctx.INDEX) },
"流程": function(event, can) { can.onimport.tabview(can, "", web.CHAT_FLOWS, ctx.INDEX) },
"文档": function(event, can) { can.onimport.tabview(can, "", web.WIKI_WORD, ctx.INDEX) },
"后台": function(event, can) { var pod = can.misc.Search(can, ice.POD); can.onimport.tabview(can, "", location.origin+"/c/admin"+(pod? "?pod="+pod: ""), web.SPACE) },
"桌面": function(event, can) { can.onimport.tabview(can, "", web.CHAT_MACOS_DESKTOP, ctx.INDEX) },
"官网": function(event, can) { can.onimport.tabview(can, "", can.misc.MergePodCmd(can, {cmd: web.WIKI_PORTAL}), web.SPACE) },
insertLine: function(can, value, before) { var line = can.onaction.appendLine(can, value); before && can.ui.content.insertBefore(line, can.onaction._getLine(can, before)); return can.onaction.rerankLine(can), can.onexport.line(can, line) },
deleteLine: function(can, line) { line = can.onaction._getLine(can, line); var next = line.nextSibling||line.previousSibling; return can.page.Remove(can, line), can.onaction.rerankLine(can), next },
_selectLine: function(can) { can.current && can.page.Select(can, can.current.line, "td.text", function(td) { var target = can.ui.current; target.value = td.innerText
"插件": function(event, can) { can.user.input(can.request(event, {type: "plug"}), can, [{name: ctx.INDEX, need: "must"}, ctx.ARGS], function(list, data) {
var key = list.join(","), sub = can.db.toolkit[key]; if (sub) { return sub.select() }
can.onimport.toolkit(can, {index: data.index, args: can.core.Split(data.args||"")}, function(sub) { can.db.toolkit[key] = sub.select() })
}) },
"扩展": function(event, can) { can.user.input(can.request(event, {action: "extension"}), can, ["url"], function(list) {
var sub = can.db.toolkit[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0])
}) },
insertLine: function(can, text, before) {
var line = can.onaction.appendLine(can, text)
before && can.ui.content.insertBefore(line, can.onaction._getLine(can, before))
return can.onaction.rerankLine(can), can.onexport.line(can, line)
},
deleteLine: function(can, line) {
line = can.onaction._getLine(can, line)
var next = line.nextSibling||line.previousSibling;
return can.page.Remove(can, line), can.onaction.rerankLine(can), next
},
_selectLine: function(can) { can.current && can.page.Select(can, can.current.line, "td.text", function(td) { var target = can.ui.current; if (!target) { return }
can.current.line.appendChild(target), can.page.style(can, target, html.LEFT, td.offsetLeft-1, html.TOP, td.offsetTop, html.WIDTH, can.base.Min(td.offsetWidth, can.ui.content.offsetWidth-can.page.Select(can, can.current.line, "td.line")[0].offsetWidth))
can.db.mode == mdb.NORMAL && can.onkeymap._normal(can)
if (can.ui.content._root) { can.onmotion.select(can, can.ui.content.parentNode, "", can.ui.content) }
target.value = td.innerText, can.db.mode == mdb.NORMAL && can.onkeymap._normal(can)
can.onmotion.delay(can, function() { can.page.SelectChild(can, can.ui.complete, html.DIV, function(target) {
target.innerText = can.ui.current.value.slice(0, can.ui.current.selectionStart)
}) })
}) },
onkeydown: function(event, can) {
if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return }
can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content)
},
})
Volcanos(chat.ONKEYMAP, {
scrollHold: function(can, count, begin) { var scroll = can.ui.content.scrollLeft; can.ui.current.focus(), count != undefined && can.onkeymap.cursorMove(can.ui.current, count, begin == undefined? count: begin), can.ui.content.scrollLeft = scroll },
cursorDown: function(can, target) { var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.next()), can.onkeymap.cursorMove(target, 0, p) },
cursorUp: function(can, target) { var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.prev()), can.onkeymap.cursorMove(target, 0, p) },
_model: function(can, value) {
can.db.mode = value, can.onimport.__tabPath(can, true),
can.core.List([mdb.PLUGIN, mdb.NORMAL, mdb.INSERT], function(item) { can.page.ClassList.del(can, can.ui.content, item) }), can.page.ClassList.add(can, can.ui.content, value)
can.core.List([mdb.PLUGIN, mdb.NORMAL, mdb.INSERT], function(item) { can.page.ClassList.del(can, can._output, item) }), can.page.ClassList.add(can, can._output, value)
scrollHold: function(can, count, begin) { var top = can.ui.content.scrollTop, left = can.ui.content.scrollLeft
can.ui.current.focus(), count != undefined && can.onkeymap.cursorMove(can.ui.current, count, begin == undefined? count: begin)
can.ui.content.scrollTop = top, can.ui.content.scrollLeft = left
},
cursorDown: function(can, target) { if (!can.current.next()) { return }
var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.next()), can.onkeymap.cursorMove(target, 0, p)
},
cursorUp: function(can, target) { if (!can.current.prev()) { return }
var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.prev()), can.onkeymap.cursorMove(target, 0, p)
},
_model: function(can, mode) { can.db.mode = mode, can.onimport.__tabPath(can, true), can.onmotion.toggle(can, can.ui.complete, false)
can.core.List([mdb.NORMAL, mdb.INSERT], function(mode) { can.page.ClassList.del(can, can._output, mode) }), can.page.ClassList.add(can, can._output, mode)
},
_plugin: function(can) { can.onkeymap._model(can, mdb.PLUGIN), can.ui.current.blur() },
_normal: function(can) { can.onkeymap._model(can, mdb.NORMAL), can.onkeymap.scrollHold(can) },
_insert: function(event, can, count, begin) { can.onkeymap._model(can, mdb.INSERT), can.onkeymap.scrollHold(can, count, begin), can.onkeymap.prevent(event) },
_complete: function(event, can, target) { if (event == undefined || event.type == "click") { return } target = target||can.ui.complete
var pre = can.ui.current.value.slice(0, can.ui.current.selectionStart), key = can.core.Split(pre, "\t .[]", lex.SP).pop()||"", end = can.ui.current.value.slice(can.ui.current.selectionStart)
function show() { can.current.line.appendChild(target), key && can.onmotion.toggle(can, target, true)
can.page.style(can, target, html.LEFT, can.ui.current.offsetLeft, html.MARGIN_TOP, can.user.isChrome? can.current.line.offsetHeight: 5)
} show()
function update() { target._pre = pre, target._end = end, target._index = -1
can.current.line.appendChild(target), can.page.style(can, target, html.LEFT, can.ui.current.offsetLeft, html.MARGIN_TOP, can.user.isChrome? can.current.line.offsetHeight: 5)
can.runAction(can.request(event, {text: pre}, can.Option()), code.COMPLETE, [], function(msg) { can.page.Appends(can, target, [{view: [lex.PREFIX, html.DIV, pre]}])
var parse = can.onsyntax[can.onexport.parse(can)]; can.core.CallFunc(can.core.Value(parse, code.COMPLETE), [event, can, msg, target, pre, key])
can.core.Item(can.core.Value(parse, code.KEYWORD), function(key, value) { msg.Push(mdb.NAME, key) })
var table = can.onappend.table(can, msg, function(value, key, index) { return {text: [value, html.TD], onclick: function(event) { change(value) }} }, target)
can.page.style(can, table, html.MAX_HEIGHT, can.ui.content.offsetHeight-(can.current.line.offsetTop-can.ui.content.scrollTop)-can.current.line.offsetHeight)
can.onmotion.toggle(can, target, true)
show()
})
}
function change(key) { can.current.text(can.ui.current.value = target._pre+key+target._end), can.onkeymap.cursorMove(can.ui.current, target._pre.length+key.length, 0) }
@ -159,9 +187,9 @@ Volcanos(chat.ONKEYMAP, {
case lex.TB:
case lex.SP:
case nfs.PT:
case "[":
case "(":
case "{": update(); break
case "[": // ]
case "(": // )
case "{": update(); break // }
case "":
default: filter()
}
@ -189,8 +217,8 @@ Volcanos(chat.ONKEYMAP, {
c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }),
v: shy("渲染界面", function(event, can) { can.onaction.show(event, can) }),
r: shy("执行命令", function(event, can) { can.onaction.exec(event, can) }),
Escape: shy("切换模式", function(event, can) { can.onkeymap._plugin(can) }),
Escape: shy("切换模式", function(can) { can.onkeymap._plugin(can) }),
ArrowLeft: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }),
ArrowRight: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }),
ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }),
@ -201,22 +229,22 @@ Volcanos(chat.ONKEYMAP, {
l: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }),
j: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }),
k: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }),
I: shy("插入行首", function(event, can) { can.onkeymap._insert(event, can, 0, 0) }),
A: shy("插入行尾", function(event, can) { can.onkeymap._insert(event, can, 0, -1) }),
i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }),
a: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }),
o: shy("插入下一行", function(event, can) { var text = can.current.text()
text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.endWith(text, "{")? lex.TB: "")
text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.endWith(text, "{")? lex.TB: "")
can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.next()))
can.onkeymap._insert(event, can, 0, -1)
}),
O: shy("插入上一行", function(event, can) { var text = can.current.text()
text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.beginWith(text, "}")? lex.TB: "")
text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.beginWith(text, "}")? lex.TB: "")
can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.line))
can.onkeymap._insert(event, can, 0, -1)
}),
yy: shy("复制当前行", function(event, can, target, count) { var list = [], line = can.current.line
for (var i = 0; i < count; i++) { list.push(can.onexport.text(can, line)), line = line.nextSibling } can.db._last_text = list; return true
}),
@ -238,30 +266,26 @@ Volcanos(chat.ONKEYMAP, {
}),
J: shy("合并两行", function(can) { var next = can.current.next(); if (!next) { return }
var line = can.onaction.selectLine(can), text = can.current.text(), rest = can.onexport.text(can, next)
can.ui.current.value = can.current.text(text.trimRight()+(can.base.endWith(text.trim(), "(", "[")||can.base.beginWith(rest.trim(), ",", "]", ")")? "": lex.SP)+rest.trimLeft())
can.ui.current.value = can.current.text(text.trimRight()+(can.base.endWith(text.trim(), "(", "[")||can.base.beginWith(rest.trim(), ",", "]", ")")? "": lex.SP)+rest.trimLeft())
can.onkeymap.cursorMove(can.ui.current, text.length, 0), can.onaction.deleteLine(can, next)
can.db.undo.push(function() { can.onaction.modifyLine(can, line, text), can.onaction.insertLine(can, rest, line+1) })
}),
".": shy("重复操作", function(can) { var cb = can.db.redo.pop(); cb && cb() }),
u: shy("撤销操作", function(can) { var cb = can.db.undo.pop(); cb && cb() }),
gg: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count), true }),
G: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count = count>1? count: can.db.max), true }),
zt: shy("屏幕最上", function(can, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }),
zz: shy("屏幕中间", function(can, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }),
zb: shy("屏幕最下", function(can, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }),
F5: shy("刷新网页", function(can, target) { can.user.reload(true) }),
},
normal_ctrl: {
e: shy("向滚屏", function(can) { can.current.scroll(1) }),
y: shy("向滚屏", function(can) { can.current.scroll(-1) }),
f: shy("向下翻页", function(can, count) { var line = can.onaction.selectLine(can)+can.current.window()-3-can.current.scroll(); return can.current.scroll(line), can.onaction.selectLine(can, line), true }),
b: shy("向上翻页", function(can, count) { var line = can.onaction.selectLine(can)-can.current.window()+3; return can.current.scroll(line), can.onaction.selectLine(can, line), true }),
e: shy("向滚屏", function(can) { can.current.scroll(1); if (can.current.scroll()<2) { can.onaction.selectLine(can, can.current.next()) } }),
y: shy("向滚屏", function(can) { can.current.scroll(-1); if (can.current.scroll()>can.current.window()-3) { can.onaction.selectLine(can, can.current.prev()) } }),
f: shy("向下翻页", function(can, count) { can.current.scroll(can.current.window()) }),
b: shy("向上翻页", function(can, count) { can.current.scroll(-can.current.window()) }),
r: shy("刷新页面", function(can) { can.user.reload(true) }),
v: shy("左右分屏", function(can) { can.onlayout.vsplit(can) }),
s: shy("上下分屏", function(can) { can.onlayout.split(can) }),
x: shy("关闭文件", function(can) { can.onlayout.close(can) }),
o: shy("关闭其它", function(can) { can.onlayout.only(can) }),
},
insert_ctrl: {
a: shy("光标行首", function(can, target) { for (var i = 0; i < target.value.length; i++) { if (target.value[i] != lex.TB) { break } } can.onkeymap.cursorMove(target, i, 0), can.onkeymap.prevent(event) }),
@ -271,7 +295,7 @@ Volcanos(chat.ONKEYMAP, {
d: shy("删除字符", function(can, target) { can.user.isWindows && can.onkeymap.deleteText(target, target.selectionStart, 1) }),
},
insert: {
Escape: shy("退出编辑", function(event, can) { can.onkeymap._normal(can) }),
Escape: shy("退出编辑", function(can) { can.onkeymap._normal(can), can.ui.current._keylist = [] }),
ArrowUp: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }),
ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }),
Backspace: shy("删除字符", function(event, can, target) { if (target.selectionStart > 0 || !can.current.prev()) { return } can.onkeymap.prevent(event)

View File

@ -1,182 +1,76 @@
(function() { const RECOVER_STORE = "recover:"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules(can, ["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() {
var item = can.base.Obj(msg.TableDetail()); item.hash = item.hash||can.Option(mdb.HASH)||"only", can.onmotion.clear(can)
if (item.type == html.LAYOUT) { can.onimport._layout(can, item) } else { can.onimport._connect(can, item, can._output) } can.onimport.layout(can)
can.sup.onexport.link = function() { return can.misc.MergePodCmd(can, {pod: can.ConfSpace(), cmd: web.CODE_XTERM, hash: item.hash}) }
can.sup.onexport.title(can, item.name||item.type), can.base.isFunc(cb) && cb(msg), can.onappend._status(can), can.onkeymap._build(can)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.page.requireModules(can, ["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() {
if (can.Option(mdb.HASH) || can.Option("args0") || can.ConfIndex() == "can._filter") { var item = can.base.Obj(msg.TableDetail()); item.hash = item.hash||can.Option(mdb.HASH)||can.Option("args0")||"current"
can.onimport._connect(can, item, can._output)
} else {
can.ui = can.onappend.layout(can), can.onimport._project(can, msg, can.db.hash)
} cb && cb(msg)
}) },
_layout: function(can, item) {
function connect(item, output, tabs) { can.run(can.request({}, item), [item.hash], function(msg) {
can.core.Item(msg.TableDetail(), function(key, value) { item[key] = value })
can.onappend._status(can), can.onimport._connect(can, item, output, tabs)
}, true); return output }
function show(list, target, root, tabs) { root = root||target, can.core.List(list, function(item) {
if (item.type.indexOf(html.LAYOUT) == 0) {
show(item.list, can.page.Append(can, target, [item.type])._target, root, tabs)._root = root
} else {
connect(item, can.page.Append(can, target, [html.OUTPUT])._target, tabs)._root = root
}
}); return target }
var main, output = can._output; can.core.List(can.base.Obj(item.text), function(item) {
if (item.type.indexOf(html.LAYOUT) == 0) { var tabs = can.onimport._tabs(can, item, {})
var target = show(item.list, can.page.insertBefore(can, [item.type], can._status), null, tabs); target._tabs = tabs, tabs._output = target
if (item.type.indexOf(html.HIDE) == -1) { main = target }
} else {
var target = connect(item, output||can.page.insertBefore(can, [html.OUTPUT], can._status)); output = null
main = main||target
}
}), main && can.onaction.select(can, main)
},
_tabs: function(can, item, output) { if (output != output._root && output._root) { return output._tabs = output._root._tabs }
var tabs = can.onimport.tabs(can, [{name: item.name||item.type||item.hash}], function() {
can.onmotion.delay(can, function() { var output = tabs._output; can.onaction.select(can, output._root||output) })
}, function() { can.onaction.delete(can, tabs._output) }); return tabs._output = output, output._tabs = tabs
},
_theme: function(can, item) { return can.base.Obj(item.theme)||(
can.getHeaderTheme() == html.LIGHT? {background: cli.WHITE, foreground: cli.BLACK, cursor: cli.BLUE}:
can.getHeaderTheme() == html.DARK? {foreground:"silver", cursor: "silver"}:
can.getHeaderTheme() == chat.BLACK? {background: "#061c3c9e", foreground:cli.WHITE, cursor: cli.WHITE}:
{background: "#d5cfcf3b", foreground: cli.BLACK, cursor: cli.BLUE}
) },
_connect: function(can, item, output, tabs, text) {
var term = new Terminal({
fontSize: html.CODE_FONT_SIZE, tabStopWidth: 4, cursorBlink: true, theme: can.onimport._theme(can, item),
_project: function(can, msg, hash) { msg.Table(function(value) {
value.nick = `${value.hash}(${value.name||value.type||"ish"})`, value._select = value.hash == hash[0]
can.onimport.item(can, value, function(event, item, show, target) {
can.onimport.tabsCache(can, value, target, function() { can.onappend._status(can)
value._term = can.onimport._connect(can, value, can.ui.content)
})
})
term._item = item, term._output = output, output._term = term, output._tabs || (tabs? (output._tabs = tabs): can.onimport._tabs(can, item, output))
var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon, can.onmotion.delay(can, function() { fitAddon.fit() })
term.onTitleChange(function(title) { can.onexport.title(can, term, title) }), can.onexport.title(can, term, item.name)
}) },
_connect: function(can, item, target, text) { can.onimport.layout(can)
var term = new Terminal({fontSize: html.CODE_FONT_SIZE, tabStopWidth: 4, cursorBlink: true, theme: can.onimport._theme(can, item)}); term._item = item
term.onTitleChange(function(title) { can.onexport.title(can, term, title) }), can.onexport.title(can, term, item.nick)
term.onResize(function(size) { can.onimport._resize(can, term, size) })
term.onData(function(data) { can.onimport._input(can, term, data) })
term.onCursorMove(function() { can.onexport.term(can, term) })
var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon, can.onmotion.delay(can, function() { fitAddon.fit() })
term.loadAddon(new WebLinksAddon.WebLinksAddon())
can.onmotion.clear(can, output), term.open(output), term.focus()
can.onengine.listen(can, chat.ONTHEMECHANGE, function() {
term.selectAll(), can.onimport._connect(can, item, output, tabs, can.base.trimSuffix(term.getSelection(), lex.NL))
})
can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK)
output.onclick = function() { output._tabs._current = output, term.focus(), can.onexport.term(can, term)
can.page.Select(can, can._fields, html.DIV_OUTPUT, function(target) { can.page.ClassList.set(can, target, html.SELECT, target == output) })
}; return can.db = can.db||{}, can.db[item.hash] = term
can.onmotion.clear(can, target), term.open(target), term.focus(), can.onmotion.delay(can, function() { term.focus() })
can.onengine.listen(can, chat.ONTHEMECHANGE, function() { term.selectAll(), can.onimport._connect(can, item, target, can.base.trimSuffix(term.getSelection(), lex.NL)) })
can.page.style(can, target, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK)
return can.db[item.hash] = term
},
_theme: function(can, item) { return can.base.Obj(item.theme)||(
can.getHeaderTheme() == html.LIGHT? {background: "#0000", foreground: cli.BLACK, cursor: cli.BLUE}:
can.getHeaderTheme() == html.DARK? {background: "#0000", foreground: cli.SILVER, cursor: cli.SILVER}:
can.getHeaderTheme() == chat.BLACK? {background: "#0000", foreground: cli.CYAN, cursor: cli.WHITE}:
{background: "#0000", foreground: cli.BLACK, cursor: cli.BLUE}
) },
_resize: function(can, term, size) {
can.runAction(can.request({}, size, term._item), web.RESIZE, [], function(msg) {})
},
_resize: function(can, term, size) { can.runAction(can.request({}, size, term._item), web.RESIZE, [], function(msg) {
if (msg.IsErr()) { can.misc.Warn(msg.Result()) }
can.onexport.term(can, term)
}) },
_input: function(can, term, data) {
can.runAction(can.request({}, {rows: term.rows, cols: term.cols}, term._item), html.INPUT, [btoa(data)], function(msg) {
if (msg.IsErr()) { can.misc.Warn(msg.Result()) }
}), can._output = term._output
can.runAction(can.request({}, {rows: term.rows, cols: term.cols}, term._item), html.INPUT, [btoa(data)], function(msg) {})
},
grow: function(can, msg, hash, text) { var arg = msg.detail.slice(1); arg = [hash||arg[0], text||arg[1]]
term = can.db[arg[0]]; arg[1] == "~~~end~~~"? can.onaction.delete(can, term._output): term.write(arg[1]); msg.Option(ice.LOG_DISABLE, ice.TRUE)
input: function(can, msg, hash, text) { var arg = msg.detail.slice(1); arg = [hash||arg[0], text||arg[1]]
term = can.db[arg[0]], can.onimport._input(can, term, arg[1])
},
grow: function(can, msg, hash, text) { var arg = msg.detail.slice(1); arg = [hash||arg[0], text||arg[1]], term = can.db[arg[0]]
if (arg[1] == "~~~end~~~") { arg[0] == "current"? can.sup.onmotion._close({}, can.sup): can.sup.onimport._back(can.sup) } else { term.write(arg[1]) }
},
layout: function(can) {
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight())
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function() {
can.core.Item(can.db, function(hash, term) { term._fit && term._fit.fit() })
can.db.value && can.db.value._term && can.onexport.term(can, can.db.value._term)
}), can.core.Item(can.db, function(hash, term) { term._fit && term._fit.fit() })
},
layout: function(can) { function show(target, height, width) { var list = can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT))
var h = height/list.length, w = width; if (can.page.ClassList.has(can, target, html.FLEX)) { h = height, w = width/list.length } if (target == can._fields) { h = height, w = width }
can.core.List(list, function(target) { can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), can.page.ClassList.has(can, target, html.LAYOUT)? show(target, h, w): target._term && target._term._fit.fit() })
} show(can._fields, can.ConfHeight(), can.ConfWidth()) },
})
Volcanos(chat.ONKEYMAP, {
_mode: {
normal: {
u: function(event, can) { can.onaction.split(event, can, html.FLOW) },
v: function(event, can) { can.onaction.split(event, can, html.FLEX) },
j: function(event, can) { can.onaction.selectSibling(can, html.FLOW) },
k: function(event, can) { can.onaction.selectSibling(can, html.FLOW, true) },
h: function(event, can) { can.onaction.selectSibling(can, html.FLEX, true) },
l: function(event, can) { can.onaction.selectSibling(can, html.FLEX) },
c: function(event, can) { can.onaction.tabnew(event, can) },
e: function(event, can) { can.user.input({target: can._output._tabs}, can, [mdb.NAME], function(list) { can.onexport.title(can, can._output._term, list[0]) }) },
n: function(event, can) { can._output._tabs.nextSibling && can._output._tabs.nextSibling.click() },
p: function(event, can) { can._output._tabs.previousSibling && can._output._tabs.previousSibling.click() },
s: function(event, can) { can.onaction.sess(event, can) },
t: function(event, can) { can.user.input({target: can._output._tabs}, can, [ctx.INDEX, ctx.ARGS], function(list, data) { can.onimport.tool(can, [data], function(sub) {
sub.select(), sub.onexport.record = function(_, value) { can.onimport._input(can, can._output._term, value+lex.NL) }
}, can._fields) }) },
f: function(event, can) {
var input = can.user.input({target: can._output._tabs}, can, [{type: mdb.TEXT, name: nfs.FILE, select: function(item) {
var ls = item.split(nfs.DF); switch (ls[0]) {
case "tabs": can.page.Select(can, can._action, [html.DIV_TABS, html.SPAN_NAME], function(target) { target.innerText == ls[1] && target.click() }); break
case web.LAYOUT: can.Option(mdb.HASH, ls[1]), can.Update(); break
case ctx.INDEX: can.onimport.tool(can, [ls[1]], function(sub) { sub.select() }); break
case ssh.SHELL: can.onaction.tabnew(can.request({}, {_handle: ice.TRUE, type: ls[1]}), can); break
default: can.onimport._input(can, can._output._term, item+lex.NL)
} input.cancel()
}, run: function(event, cmds, cb) { can.run(event, cmds, function(msg) { var _msg = can.request()
function push(type, name) { _msg.Push(nfs.FILE, can.core.List(arguments).join(nfs.DF)) }
can.page.Select(can, can._action, [html.DIV_TABS, html.SPAN_NAME], function(target) { push("tabs", target.innerText) })
_msg.Copy(msg), can.core.Item(can.onengine.plugin.meta, function(key, value) { push(ctx.INDEX, "can."+key) }), cb(_msg)
}) }}], function(list) {})
},
Escape: function(can) { can.onmotion.clearFloat(can), can._output.click() },
},
}, _engine: {},
})
Volcanos(chat.ONACTION, {
tabnew: function(event, can) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) {
can.onaction.select(can, can._output = can.page.insertBefore(can, [html.OUTPUT], can._status)), can.onimport._init(can, msg)
}) }) },
split: function(event, can, button) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) {
if (can.page.ClassList.has(can, can._output.parentNode, button)) { var layout = can._output.parentNode } else {
var layout = can.page.insertBefore(can, [{view: [[html.LAYOUT, button]]}], can._output); layout.appendChild(can._output)
} var root = can._output._root||layout, tabs = can._output._tabs; tabs._output = root, root._tabs = tabs
can._output._root = root, can._output = can.page.insertBefore(can, [html.OUTPUT], can._output.nextSibling, layout)
can._output._root = root, can._output._tabs = tabs, can.onimport._init(can, msg), can.onmotion.delay(can, function() { can._output.click() })
}) }) },
delete: function(can, output) {
if (can.page.Select(can, can._fields, html.DIV_OUTPUT).length == 1) { can.onmotion.delay(can, function() {
var args = can.Conf(ctx.ARGS)
if (args && args.length > 0) {
can.sup.onaction.close({}, can.sup)
} else {
can.sup.onimport._back(can.sup)
}
}) }
if (output == can.sup._output) { can.onmotion.clear(can, output) } else { while (output && output.parentNode.children.length == 1) { output = output.parentNode }
var next = output.parentNode; can.page.Remove(can, output), can.onmotion.delay(can, function() { can.page.Select(can, next, html.DIV_OUTPUT, function(target) { target.click() }) })
} can.onimport.layout(can)
},
select: function(can, output) { can.page.SelectChild(can, can._fields, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { can.onmotion.hidden(can, target, target == output || target == output._root)
can.onmotion.delay(can, function() {
output._tabs._current? output._tabs._current.click(): (target.click(), can.page.SelectOne(can, target, html.DIV_OUTPUT, function(target) { target.click() }))
can.page.Select(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { target._term && target._term._fit.fit() })
create: function(event, can) { can.user.input(event, can, [mdb.TYPE, mdb.NAME, mdb.TEXT], function(data) {
can.runAction(can.request({}, data), mdb.CREATE, [], function(msg) { var hash = msg.Result()
can.run(event, [hash], function(msg) { var _msg = can.request(); _msg.Push(msg.TableDetail())
can.onimport._project(can, _msg, [hash])
})
})
}) },
selectSibling: function(can, layout, prev) { var key = prev? "previousSibling": "nextSibling"
var output = can._output; while ((!output[key] || !can.page.ClassList.has(can, output.parentNode, layout)) && output != can._fields) { output = output.parentNode }
if (can.page.ClassList.has(can, output.parentNode, layout) && output[key]) {
can.page.SelectOne(can, output[key], html.DIV_OUTPUT, function(target) { target.click() })||output[key].click()
}
remove: function(event, can) { var item = event._msg.Option("_item")
can.runAction(event, mdb.REMOVE, [], function(msg) {
var value = item._item; value._tabs && value._tabs._close(), can.page.Remove(can, item)
})
},
sess: function(event, can) { can.user.input({target: can._legend}, can, [mdb.NAME], function(list) {
can.runAction({}, mdb.CREATE, [mdb.TYPE, html.LAYOUT, mdb.NAME, list[0], mdb.TEXT, can.base.Format(can.onexport.sess(can))], function(msg) {
can.user.toastSuccess(can, can.user.trans(can, nfs.SAVE)+lex.SP+msg.Result())
}, true)
}) },
onkeydown: function(event, can) {
if (can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS)) { return }
can._keylist = can.onkeymap._parse(event, can, mdb.NORMAL, can._keylist||[], can._output._term)
},
hidden: function(can) { can.page.Select(can, can._fields, "div.output,div.layout", function(target) {
target == can.sup._output? can.page.insertBefore(can, target, can._status): can.page.Remove(can, target)
}) },
})
Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"],
term: function(can, term) { item = term._item
can.core.List(can.onexport.list, function(key) {
if (key == mdb.TIME && !item[key]) { return }
can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], "")+"")
})
can.core.List([mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME], function(key) {
if (key == mdb.TIME && !item[key]) { return }
can.Status(key, item[key]||"")
})
term: function(can, term) { item = term._item, can.onexport.title(can, term, item.nick||item.name||item.type)
can.core.List(can.onexport.list, function(key) { if (key == mdb.TIME && !item[key]) { return } can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], "")+"") })
can.core.List([mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME], function(key) { if (key == mdb.TIME && !item[key]) { return } can.Status(key, item[key]||"") })
},
sess: function(can) { return can.page.Select(can, can._action, html.DIV_TABS, function(target) { function show(target) {
var name = can.page.SelectOne(can, target._tabs, html.SPAN_NAME).innerText
if (can.page.ClassList.has(can, target, html.LAYOUT)) {
return {type: target.className, name: name, list: can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { return show(target) })}
} else { var item = target._term._item; return {type: item.type, name: name, text: item.text, hash: item.hash} }
} return show(target._output) }) },
title: function(can, term, title) { can.page.Modify(can, can.page.SelectOne(can, term._output._tabs, html.SPAN_NAME), title), can.Status(mdb.NAME, title), can.sup.onexport.title(can.sup, title) },
title: function(can, term, title) { can.Status(mdb.NAME, title), can.sup.onexport.title(can.sup, title) },
})
})()

View File

@ -1,13 +1,12 @@
fieldset.goods>div.output>div.project { flex:0 0 90px; }
fieldset.goods>div.output>div.project>div.item { text-align:center; padding:20px 10px; border-right:var(--plugin-bg-color) solid 4px; }
fieldset.goods>div.output>div.project>div.item.select { border-right:var(--notice-bg-color) solid 4px; }
fieldset.goods>div.output>div.project>div.item { border-right:var(--box-border3); text-align:center; padding:20px 10px; }
fieldset.goods>div.output>div.project>div.item.select {
border-right:var(--box-notice3);
position:unset;
}
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item:not(.hide) {
background-color:var(--plugin-bg-color); border-radius:var(--plugin-radius); box-shadow:var(--box-shadow);
margin:10px; float:left;
}
body:not(.mobile) fieldset.goods>div.output>div.layout>div.layout>div.content>div.item:not(.hide) {
height:150px;
}
box-shadow:var(--th-box-shadow); border:var(--plugin-border); border-radius:var(--plugin-radius);
background-color:var(--plugin-bg-color); margin:10px; float:left; }
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div { padding:10px; float:left; clear:none; }
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.image { flex-grow:0; }
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.image>img { height:120px; width:120px; }
@ -17,3 +16,4 @@ fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.display { line-height:32px; }
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.display>div { float:left; margin-right:5px; }
fieldset.goods>div.output>div.layout>div.layout>div.content>div.item>div.content div.price { color:red; }
body:not(.mobile) fieldset.goods>div.output>div.layout>div.layout>div.content>div.item:not(.hide) { height:150px; }

View File

@ -1,7 +1,7 @@
fieldset.plan>div.output td.content { position:relative; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td { vertical-align:top; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.over { border:red solid 1px; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.select { background-color:var(--hover-bg-color); box-shadow:var(--box-shadow); }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.over { border:var(--box-danger); }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.select { background-color:var(--hover-bg-color); box-shadow:var(--th-box-shadow); }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td:hover { background-color:var(--hover-bg-color); }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.over { background-color:var(--hover-bg-color); }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div { color:white; padding:10px; margin:10px; }
@ -14,6 +14,9 @@ fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.cancel { background-color:#ff000070; text-decoration:line-through; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.finish { background-color:#8080809c; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content tr:first-child { height:30px; position:sticky; top:2px; z-index:2; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content th:first-child { width:40px; position:sticky; left:2px; z-index:2; }
fieldset.plan>div.output>div.layout>div.layout>div.profile>table.content tr:first-child { height:30px; position:sticky; top:2px; z-index:2; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content thead tr:first-child { z-index:2; }
fieldset.plan>div.output>div.layout>div.layout>div.content>table.content th:first-child { width:40px; position:sticky; left:2px; z-index:1; }
fieldset.plan>div.output>div.layout>div.layout>div.profile>table.content tr:first-child { height:30px; position:sticky; top:2px; }
fieldset.plan>div.output>fieldset.plug { position:absolute; }
fieldset.plan.story>form.option>div.item.scale { display:none; }

View File

@ -1,8 +1,11 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can, target), can._display_heights = {}, can.list = {}; var ls = can.misc.SearchHash(can)
can.onmotion.hidden(can, can._action)
can.ui = can.onappend.layout(can)
can.onmotion.hidden(can, can.ui.project)
can.onimport[can.Option("scale")||team.WEEK](can, msg), can.Status(mdb.COUNT, msg.Length()), can.ui.filter.placeholder = `search in ${ msg.Length() } items`, can.onimport.layout(can)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, target) {
can._display_heights = {}, can.list = {}; var ls = can.misc.SearchHash(can)
can.ui = can.onappend.layout(can), can.ui.toggle = can.onappend.toggle(can)
can.onmotion.hidden(can, can.ui.project), can.isCmdMode() || can.onmotion.hidden(can, can._action)
can.onimport[can.Option("scale")||team.WEEK](can, msg), can.Status(mdb.COUNT, msg.Length())
// can.ui.filter.placeholder = `search in ${ msg.Length() } items`
can.onimport.layout(can)
var item; if (can.isCmdMode() && ls.length > 0) { item = can.list[can.core.Keys(ls)] } else if (can.sup.task) { item = can.list[can.core.Keys(can.sup.task.space, can.sup.task.zone, can.sup.task.id)] } item && item.click()
},
_content: function(can, msg, head, list, key, get, set) { var begin_time = can.base.Date(can.Option(team.BEGIN_TIME)); can.sup.task && (can.sup.task._target = null)
@ -13,7 +16,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row))
})}
}) }] }])._target, can.onmotion.delay(can, function() { var target = can.sup.task && can.sup.task._target; target && target.click(), can.Status(mdb.COUNT, msg.Length()) })
can.ui.toggle = can.onappend.toggle(can, can.ui.content)
},
_task: function(can, msg, list, time) { return {type: html.TD, className: time == can.base.Time().slice(0, time.length)? html.SELECT: "",
ondblclick: function(event) { can.onaction.insertTask(event, can, time+can.base.Time().slice(time.length)) },
@ -23,18 +25,19 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
{text: [can.core.CallFunc([can.onexport, can.Action(html.VIEW)||mdb.TEXT], [can, task])||task.name, html.DIV, can.onexport.style(can, task)],
ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target)
can.onaction.modifyTask(event, can, task, team.BEGIN_TIME, time+task.begin_time.slice(time.length), task.begin_time)
} }, draggable: time != undefined, title: can.onexport.title(can, task), _init: function(target) {
} }, draggable: time != undefined, title: can.onexport.title(can, task.name), _init: function(target) {
var item = can.onimport.item(can, {nick: task.name+nfs.DF+task.text}, function() { can.onmotion.delay(can, function() {
can.onmotion.select(can, can.ui.content, html.TD, target.parentNode), can.onimport._profile(can, task), can.onimport._display(can, task), can.onimport.layout(can)
}) }, null, can.ui.project); task._target = target, target.onclick = function(event) { item.click() }, can.list[can.core.Keys(task.space, task.zone, task.id)] = target
}) }); task._target = target, target.onclick = function(event) { item.click() }, can.list[can.core.Keys(task.space, task.zone, task.id)] = target
}}
}),
} },
_profile: function(can, task) { can.onmotion.toggle(can, can.ui.profile, true), can.onexport.hash(can, task)
_profile: function(can, task) { can.onmotion.toggle(can, can.ui.profile, true), can.onexport.hash(can, task), can.onexport.title(can, task.name, task.text)
if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.space, task.zone, task.id].join(nfs.PT) }, can.ui.profile)) { return }
task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task[key] = value }), delete(task.extra)
var table = can.page.Appends(can, can.ui.profile, [{view: [[chat.CONTENT, mdb.DETAIL], html.TABLE], list: [{th: [can.user.trans(can, mdb.KEY, "字段"), can.user.trans(can, mdb.VALUE, "属性")]}]}])._target
can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{
className: key,
td: [can.user.trans(can, key, null, html.INPUT), key == web.SPACE && value != ""? can.page.Format(html.A, can.misc.MergeURL(can, {pod: value}), value): value],
onclick: function(event) { can.page.tagis(event.target, html.INPUT) && event.target.type == html.BUTTON && can.run(can.request(event, task), [ctx.ACTION, event.target.name]) },
ondblclick: function(event) { if ([web.SPACE, mdb.ZONE, mdb.ID].indexOf(key) > -1) { return }
@ -149,6 +152,5 @@ Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, team.BEGIN_TIME, mdb.ZONE, mdb.ID, md
text: function(can, task) { return task.name+": "+(task.text||"") },
level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") },
score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") },
title: function(can, task) { return task.zone+": "+(task.type||"") },
style: function(can, task) { return [html.ITEM, task.status, mdb.ID+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(lex.SP) },
})

View File

@ -1,13 +1,15 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.isCmdMode() || can.onmotion.hidden(can, can._action)
can.OptionPath = function(value) { return can.Option(nfs.PATH, value) }
can.OptionPid = function(value) { return can.Option(svg.PID, value) }
can.ActionGo = function(value) { return can.Action(svg.GO, value) }
can.ActionMode = function(value) { return can.Action(ice.MODE, value) }
can.ActionShape = function(value) { return can.Action(svg.SHAPE, value) }
can._temp = []
if (can.ConfIndex() == web.WIKI_DRAW) { can.ui = can.onappend.layout(can), can.onexport.title(can, can.OptionPath())
if (can.isCmdMode() && !can.user.isMobile) { can.onmotion.toggle(can, can.ui.profile, true) } else { can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can.ui.project) }
} else { can.ui = {content: can._output} } can.page.Modify(can, can.ui.content, msg.Results()||can.onexport.content(can))
} else { can.ui.content || (can.ui = {content: can._output}) } can.page.Modify(can, can.ui.content, msg.Results()||can.onexport.content(can))
can.page.Select(can, can.ui.content, html.SVG, function(target) { can.ui.svg = can.ui.group = can.onimport._block(can, target), can.onimport._project(can, target), can.ui.profile && can.core.ItemCB(can.onaction, target, can)
can.page.Select(can, target, "", function(target) { can.onimport._block(can, target), can.page.tagis(target, svg.G) && target.Value(html.CLASS) && can.onimport._project(can, target) })
}), can.ondetail._select(can, can.db.hash[1]||can.OptionPid()||can.ui.svg.Value(svg.PID)), can.ui.points = []
@ -31,7 +33,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
var item = can.onimport.item(can, {name: groups}, function(event) { can.ui.group = target
can.misc.SearchHash(can, groups, can.OptionPid()), can.Status(svg.GROUP, groups), can.onaction.show(event, can)
can.core.List([svg.FONT_SIZE, svg.STROKE_WIDTH, svg.STROKE, svg.FILL], function(key) { can.Action(key, target.Value(key)||key) })
}, function(event) { return {meta: can.onaction, list: can.onaction.menu_list} }, can.ui.project); target._item = item
}, function(event) { return {meta: can.onaction, list: can.onaction.menu_list} }); target._item = item
groups == can.db.hash[0] && can.onmotion.delay(can, function() { item.click() })
},
_profile: function(can, target) { if (!can.ui.profile) { return }
@ -64,19 +66,23 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
var target = document.createElementNS("http://www.w3.org/2000/svg", type)
return group.appendChild(can.onimport._block(can, target)), target.Value(value), target
},
group: function(can, name, value, group) { var target = can.onimport.block(can, svg.G, value, group||can.ui.svg)
return target.Value(html.CLASS, name), can.onimport._project(can, target), target
group: function(can, name, value, group) { var target = can.onimport.block(can, svg.G, {}, group||can.ui.svg)
return target.Value(html.CLASS, name), target.Value(value), can.onimport._project(can, target), target
},
draw: function(can, meta, group) { group = group||can.ui.svg
var figure = can.onfigure[meta.shape], data = figure.draw({}, can, meta.points, meta.style||{}); can.core.Item(meta.style, function(key, value) { data[key] = value })
var target = can.onimport.block(can, figure.data.name||meta.shape, data, group); can.core.ItemCB(meta, target, can)
return meta._init && meta._init(target), target
},
layout: function(can) { can.ui.layout && can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
can.page.style(can, can.ui.svg, html.MIN_HEIGHT, height, html.MIN_WIDTH, width)
}) },
layout: function(can) {
can.ui.svg && can.page.style(can, can.ui.svg, html.MIN_HEIGHT, can.ConfHeight()-1, html.MIN_WIDTH, can.ConfWidth())
can.ui.layout && can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
can.page.style(can, can.ui.svg, html.MIN_HEIGHT, height-1, html.MIN_WIDTH, width)
})
},
})
Volcanos(chat.ONACTION, {list: [
Volcanos(chat.ONACTION, {
list: [
[svg.GO, ctx.RUN, ice.AUTO, "manual"], [ice.MODE, web.DRAW, html.MOVE, html.RESIZE],
[svg.SHAPE, svg.RECT, svg.LINE, svg.TEXT, svg.BLOCK, svg.CIRCLE, svg.ELLIPSE],
[svg.STROKE_WIDTH, svg.STROKE_WIDTH, 1, 2, 3, 4, 5],
@ -93,7 +99,7 @@ Volcanos(chat.ONACTION, {list: [
fill: function(event, can, key, value) { can.onaction._change(can, key, value) },
"font-size": function(event, can, key, value) { can.onaction._change(can, key, value) },
save: function(event, can, button) { can.runAction(can.request(event, {text: can.onexport.content(can, can.ui.svg)}), button, [can.OptionPath()]) },
menu_list: [html.HIDE, html.SHOW, web.CLEAR, mdb.CREATE, mdb.REMOVE],
hide: function(event, can) { can.onmotion.hide(can, {interval: 50, length: 10}, null, can.ui.group) },
show: function(event, can) { can.onmotion.show(can, {interval: 50, length: 10}, null, can.ui.group) },
@ -103,7 +109,7 @@ Volcanos(chat.ONACTION, {list: [
if (can.ui.group == can.ui.svg) { return can.onmotion.clear(can, can.ui.svg) }
can.page.Remove(can, can.ui.group._item), can.page.Remove(can, can.ui.group)
},
_mode: {
draw: function(event, can, points) { var shape = can.ActionShape(), figure = can.onfigure[shape]
figure.grid && figure.grid(event, can, points); if (figure.data.points && points.length < figure.data.points) { return }
@ -181,7 +187,7 @@ Volcanos(chat.ONACTION, {list: [
oncontextmenu: function(event, can) { can.page.style(can, can.user.carte(event, can, can.ondetail)._target, {left: event.clientX, top: event.clientY}) },
})
Volcanos(chat.ONDETAIL, {list: [cli.START, nfs.COPY, html.LABEL, mdb.REMOVE], _trans: {copy: "复制", label: "标签"},
_select(can, name, cb) { if (!name) { return } var target = can.page.SelectOne(can, can.ui.svg, nfs.PT+name, cb); if (!target) { return }
_select: function(can, name, cb) { if (!name) { return } var target = can.page.SelectOne(can, can.ui.svg, nfs.PT+name, cb); if (!target) { return }
can.onimport._profile(can, target), can.onimport._display(can, target), can.onimport.layout(can); return target
},
_move: function(can, target, list) {
@ -248,7 +254,8 @@ Volcanos(chat.ONEXPORT, {list: [svg.GROUP, svg.FIGURE, ctx.INDEX, "pos"],
can.Status(svg.GROUP, target.Groups()||can.ui.group.Groups()||html.SVG)
can.Status(ctx.INDEX, target.Value(ctx.INDEX)||"")
},
content: function(can, target) { return ['<svg xmlns="https://www.w3.org/2000/svg" vertion="1.1" text-anchor="middle" dominant-baseline="middle"'].concat(
content: function(can, target) {
return ['<svg xmlns="https://www.w3.org/2000/svg" vertion="1.1" text-anchor="middle" dominant-baseline="middle"'].concat(
target? can.core.List([mdb.COUNT, svg.PID], function(item) { return target.Value(item)? can.base.joinKV([item, target.Value(item)], mdb.EQ): ""}).join(lex.SP): "").concat([">", target? target.innerHTML: "", "</svg>"]).join("")
},
grid: function(can) { var grid = can.Action(svg.GRID); return grid == svg.GRID || grid == ice.AUTO? 10: grid },
@ -358,18 +365,18 @@ Volcanos(chat.ONKEYMAP, {
gr: function(event, can) { can.ActionGo(ctx.RUN) },
ga: function(event, can) { can.ActionGo(ice.AUTO) },
gm: function(event, can) { can.ActionGo("manual") },
ad: function(event, can) { can.ActionMode(web.DRAW) },
am: function(event, can) { can.ActionMode(html.MOVE) },
ar: function(event, can) { can.ActionMode(html.RESIZE) },
st: function(event, can) { can.ActionShape(svg.TEXT) },
sr: function(event, can) { can.ActionShape(svg.RECT) },
sl: function(event, can) { can.ActionShape(svg.LINE) },
ss: function(event, can) { can.ActionShape(svg.LINE) },
sc: function(event, can) { can.ActionShape(svg.CIRCLE) },
se: function(event, can) { can.ActionShape(svg.ELLIPSE) },
cr: function(event, can) { can.onaction._change(can, svg.STROKE, cli.RED) },
cb: function(event, can) { can.onaction._change(can, svg.STROKE, cli.BLUE) },
cg: function(event, can) { can.onaction._change(can, svg.STROKE, cli.GREEN) },
@ -378,7 +385,7 @@ Volcanos(chat.ONKEYMAP, {
cc: function(event, can) { can.onaction._change(can, svg.STROKE, cli.CYAN) },
ch: function(event, can) { can.onaction._change(can, svg.STROKE, cli.BLACK) },
cw: function(event, can) { can.onaction._change(can, svg.STROKE, cli.WHITE) },
fr: function(event, can) { can.onaction._change(can, svg.FILL, cli.RED) },
fb: function(event, can) { can.onaction._change(can, svg.FILL, cli.BLUE) },
fg: function(event, can) { can.onaction._change(can, svg.FILL, cli.GREEN) },

View File

@ -60,7 +60,8 @@ Volcanos(chat.ONFIGURE, {
if (i < skip) {return}
switch (i) {
case 0: k = "M"; break
default: k = can._temp[i] || p.k || "L"; break
default: k = p.k || "L"; break
// default: k = can._temp[i] || p.k || "L"; break
}
if (end) {return}

View File

@ -1,15 +1,44 @@
fieldset.feel>div.output>div.layout>div.display { position:relative; overflow-y:hidden; }
fieldset.feel>form.option>div.item.file { display:none; }
body.mobile fieldset.feel>form.option>div.item.file { display:none; }
fieldset.feel.fullscreen>div.action>div.item:not(.fullscreen) { display:none; }
fieldset.feel>div.output>div.project>div.albums { display:flex; flex-wrap:wrap; }
fieldset.feel>div.output>div.project>div.albums>div.item.album { border-bottom:var(--box-notice3); border-color:transparent; width:33.3%; display:flex; flex-direction:column; }
fieldset.feel>div.output>div.project>div.albums>div.item.album.select { border-bottom:var(--box-notice3); border-right:none; }
fieldset.feel>div.output>div.project>div.albums>div.item.album.create { height:calc(var(--project-width)/3 - 10px); font-size:42px; display:flex; justify-content:center; align-items:center; }
fieldset.feel>div.output>div.project>div.albums>div.item.album img { height:calc(var(--project-width)/3 - 10px); width:100%; object-fit:cover; }
fieldset.feel>div.output>div.project>div.item.select { border-width:3px; }
fieldset.feel>div.output>div.project>div.item>img { padding:5px; }
fieldset.feel>div.output>div.project>div.item>span.name { flex-grow:1; overflow:hidden; }
fieldset.feel>div.output>div.project>div.item>span.progress { color:var(--notice-bg-color); margin-left:10px; }
fieldset.feel>div.output>div.project>div.item>span.size { color:var(--disable-fg-color); font-size:var(--status-font-size); margin-left:10px; }
fieldset.feel>div.output>div.project>div.item>span.time { color:var(--disable-fg-color); font-size:var(--status-font-size); margin-left:10px; }
fieldset.feel>div.output>div.layout>div.display { overflow:hidden; position:relative; }
fieldset.feel>div.output>div.layout>div.display:not(.hide) { height:100px; display:flex; justify-content:center; align-items:center; gap:10px; }
fieldset.feel>div.output>div.layout>div.display>.select { border:var(--box-notice); border-width:3px; }
fieldset.feel>div.output>div.layout>div.display>img { height:100px; width:100px; object-fit:contain; }
fieldset.feel>div.output>div.layout>div.display>video { height:100px; width:100px; object-fit:contain; }
fieldset.feel>div.output>div.layout>div.display>div.audio { word-break:break-all; height:100px; width:100px; display:flex; align-items:end; }
fieldset.feel>div.output>div.layout>div.display>div.audio:not(.select) { border:var(--box-border); }
fieldset.feel>div.output>div.layout>div.display>div.audio img.cover { height:98px; width:98px; position:absolute; }
fieldset.feel>div.output>div.layout>div.display>div.audio.select img.cover { height:94px; width:94px; position:absolute; }
fieldset.feel>div.output>div.layout>div.display>div.audio span.name { background-color:var(--hover-bg-color); color:white; z-index:5; }
fieldset.feel>div.output>div.layout>div.display>*.select { background-color:var(--hover-bg-color); }
fieldset.feel>div.output>div.layout>div.display>*:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.feel>div.output>div.layout>div.display>img:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.feel>div.output>div.layout>div.display:not(.hide) { height:100px; align-items:normal; gap:10px; }
fieldset.feel>div.output>div.layout>div.display:not(.hide) img { height:100px; }
fieldset.feel>div.output>div.layout>div.display:not(:hover)>div.toggle { display:none; }
fieldset.feel>div.output>div.layout>div.display>div.toggle { font-size:48px; padding:5px; position:absolute; height:100px; padding-top:20px; }
fieldset.feel>div.output>div.layout>div.display>video:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.feel>div.output>div.layout>div.display>div.audio:hover { background-color:var(--hover-bg-color); cursor:pointer; }
fieldset.feel>div.output>div.layout>div.display>div.toggle { font-size:32px; padding:5px; padding-top:32px; height:100px; position:absolute; }
fieldset.feel>div.output>div.layout>div.display>div.toggle.prev { left:0; }
fieldset.feel>div.output>div.layout>div.display>div.toggle.next { right:0; }
fieldset.feel>div.output>div.layout>div.layout>div.content { text-align:center; overflow-y:hidden; }
fieldset.feel>div.output>div.layout>div.layout>div.content>img { cursor:pointer; }
fieldset.feel>div.output>div.layout>div.layout>div.content>img:hover { background-color:var(--hover-bg-color); }
fieldset.feel>div.output>div.layout>div.layout>div.content:not(:hover)>div.toggle { display:none; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle { font-size:48px; padding:5px; padding-top:32px; top:40%; height:120px; }
fieldset.feel>div.output>div.layout>div.layout>div.content { padding:0; overflow:hidden; }
fieldset.feel>div.output>div.layout>div.layout>div.content>img { height:100%; width:100%; object-fit:scale-down; cursor:pointer; }
fieldset.feel>div.output>div.layout>div.layout>div.content>video { height:100%; width:100%; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.audio { height:100%; width: 100%; display:flex; flex-direction:column; justify-content:center; align-items:center; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.audio img.cover { height:calc(100% - 120px); }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.audio span.name { padding:10px; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.progress { background-color:var(--notice-bg-color); height:3px; position:absolute; bottom:2px; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle { font-size:32px; padding:5px; padding-top:32px; height:100px; top:40%; z-index:5; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle.next { right:0; }
body.mobile fieldset.feel>div.output>div.project { overflow-x:hidden; }
fieldset.feel>div.output>div.layout>div.layout>div.content>div.toggle.prev { left:0; }
div.toggle { -webkit-user-select:none; }
img { -webkit-user-select:none; }

View File

@ -1,163 +1,206 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.ui = can.onappend.layout(can), cb && cb(msg)
can.db.hash = can.isCmdMode()? can.misc.SearchHash(can): []
can.onappend.style(can, html.FLEX, can.ui.display)
can.onmotion.hidden(can, can._action), can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can)
can.onimport._project(can, msg), can.onimport.page(can, can.db.list, can.db.begin = parseInt(msg.Option(cli.BEGIN)||"0"))
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.onappend.style(can, wiki.FEEL)
can.run({}, [], function(_msg) { can.db.albums = _msg
can.ui = can.onappend.layout(can)
// can.user.isMobile && (can.onaction.list = [web.UPLOAD])
cb && cb(msg)
if (can.base.isIn(can.Action("sort")||"", mdb.TIME, "")) {
can.onimport._project(can, msg)
} else {
can.onaction.sort({}, can, "sort", can.Action("sort"))
} can.onimport.page(can, can.db.list, can.db.begin = 0)
can.onmotion.toggle(can, can.ui.display, can.page.isDisplay(can.ui.project)), can.onimport.layout(can)
})
can.onmotion.toggle(can, can._action, true)
},
_project: function(can, msg) { can.db.list = [], can.db.dir_root = msg.Option(nfs.DIR_ROOT)
can.ui.albums = can.page.Appends(can, can.ui.project, ["albums"])._target
can.db.albums.Table(function(value) {
can.page.Append(can, can.ui.albums, [{view: "item album "+(can.base.beginWith(can.Option(nfs.PATH), value.path)? "select": ""), background: value.cover, list: [
{img: can.misc.Resource(can, value.cover||"usr/icons/background.jpg")}, {text: value.name},
], onclick: function(event) {
can.Option(nfs.PATH, value.path), can.Update()
}, oncontextmenu: function(event) {
can.user.carteItem(event, can, value)
}}])
})
can.page.Append(can, can.ui.albums, [{view: ["item album create", "", "+"], onclick: function(event) {
can.Update(event, [ctx.ACTION, mdb.CREATE])
}}])
can.ui.filter = can.onappend.filter(can, can.ui.project)
msg.Table(function(item) { item.name = can.base.trimPrefix(item.path, can.Option(nfs.PATH))
can.base.endWith(item.path, "/") && (item.nick = [{img: can.misc.Resource(can, "usr/icons/dir.png")}, {text: [item.name, "", mdb.NAME]}])
can.base.endWith(item.path, nfs.PS)? can.onimport.item(can, item, function(event) { can.Option(nfs.PATH, item.path) && can.Update(event) }): can.db.list.push(item)
})
var rate = can.misc.localStorage(can, [can.ConfIndex(), "rate"]); rate && can.Action(html.SPEED, rate)
var _target; can.core.List(can.db.list, function(item, index) {
var last = can.misc.localStorage(can, [can.ConfIndex(), "p", can.onimport._file(can, item.path)])
item.nick = (last? last+lex.SP: "")+item.name
var target = can.onimport.item(can, item, function(_event) { var target = _event.target
can.ui.cb = function(event) { var next = _event.target.nextSibling
target.innerHTML = parseInt(event.target.currentTime*100/event.target.duration)+"% "+item.name
can.ui.video = event.target, can.Status(item), can.misc.localStorage(can, [can.ConfIndex(), "last"], item.path)
if (event.type == "ratechange") { can.misc.localStorage(can, [can.ConfIndex(), "rate"], event.target.playbackRate) }
if (event.type == "ended" && next) { can.onmotion.delay(can, function() { next.click() }, 3000), can.user.toast(can, "3s 后即将播放下一个", "", 3000) }
}
can.onimport.layout(can), can.onmotion.scrollIntoView(can, target), can.onmotion.clear(can, can.ui.content)
var _target = can.onimport.file(can, item.path, item, index, can.ui.content, can.ui.content.offsetHeight, true)
_target.focus(), _target.onclick = function() { can.ondetail._init(can, index) }
can.onimport.layout(can), can.isCmdMode() && can.misc.SearchHash(can, item.path)
can.onappend._toggle(can, can.ui.content, function() {
index == 0? can.user.toast(can, "已经是第一页了"): _event.target.previousSibling.click()
}, function() {
try { _event.target.nextSibling.click() } catch (e) { can.user.toast(can, "已经是最后一页了") }
})
var limit = parseInt(can.Action(mdb.LIMIT))
if (index < can.db.begin || index >= can.db.begin+limit) {
can.onimport.page(can, can.db.list, can.db.begin = index-index%limit)
}
}, function() {}, can.ui.project); item._target = target, _target = can.db.hash[0] == item.path? target: _target||target
if (can.isCmdMode() && item.path == can.misc.localStorage(can, [can.ConfIndex, "last"])) {
can.Action(html.HEIGHT, html.HIDE), can.onmotion.hidden(can, can.ui.display)
_target = target, can.onmotion.delay(can, function() { can.onaction.full({}, can) })
}
}), _target && _target.click()
},
_file: function(can, path) { var p = location.href.indexOf(ice.HTTP) == 0? "": "http://localhost:9020"
return path.indexOf(ice.HTTP) == 0? path: p+can.base.Path(web.SHARE_LOCAL, can.db.dir_root||"", path)
},
file: function(can, path, item, index, target, height, auto) { path = can.onimport._file(can, path)
var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE]; can.Status(nfs.FILE, path)
return cb && can.page.Append(can, target||can.ui.display, [cb(can, path, item, index, height, auto)])._target
},
page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display)
begin = parseInt(begin||can.db.begin), limit = parseInt(limit||can.Action(mdb.LIMIT))
for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, list[i], i) }
can.onappend._toggle(can, can.ui.display, function(event) { can.onaction.prev(event, can) }, function(event) { can.onaction.next(event, can) })
can.Status({begin: begin, limit: limit, total: list.length})
},
layout: function(can) { can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
can.page.Select(can, can.ui.content, can.page.Keys(html.IMG, html.VIDEO), function(target) {
can.user.isMobile && !can.user.isLandscape()? can.page.style(can, target, html.HEIGHT, "", html.MAX_HEIGHT, height, html.WIDTH, width):
can.page.style(can, target, html.HEIGHT, height, html.MAX_WIDTH, width)
can.onmotion.cacheClear(can, "", can.ui.content)
can.db.hash[0] && msg.path.indexOf(can.db.hash[0]) == -1 && (can.db.hash[0] = "")
can.core.List(can.db.list, function(item, index) { var last = can.onexport.progress(can, "p."+item.path);
(!can.db.hash[0] || can.db.hash[0] == can.Option(nfs.PATH) || can.db.hash[0].indexOf(can.Option(nfs.PATH)) == -1) && (can.db.hash[0] = item.path)
item.nick = [item.cover? {img: can.misc.Resource(can, item.cover)}:
can.misc.isImage(can, item.path)? {img: can.misc.Resource(can, item.path)}:
can.misc.isVideo(can, item.path)? {img: can.misc.Resource(can, "usr/icons/QuickTime Player.png")}:
can.misc.isAudio(can, item.path)? {img: can.misc.Resource(can, "usr/icons/Music.png")}: null,
{text: [item.name, "", mdb.NAME]}, {text: [last||"", "", "progress"]},
can.Option(nfs.PATH) != "usr/icons/" && can.base.isIn(can.Action("sort")||"", mdb.TIME, "")? {text: [can.base.TimeTrim(item.time), "", mdb.TIME]}: {text: [item.size, "", nfs.SIZE]},
]
item.title = [item.time, item.path, item.size].join("\n")
item._hash = item.path, item._title = item.path.split("/").pop()
item._target = can.onimport.item(can, item, function(event, item, show, target) { can.onimport._content(can, item, index, target) })
item.title = ""
})
}) },
},
_content: function(can, item, index, target) { can.Option(nfs.FILE, item.name), can.Status(item), can.ui.video = item._video, can.ui.current = item
if (can.onexport.progress(can, "p."+item.path) == "100%") { can.onexport.progress(can, "p."+item.path, ""), can.onexport.progress(can, item.path, "") }
if (can.misc.isImage(can, item.path)) { can.onmotion.delay(can, function() { can.onaction.playnext(can) }, 5000) }
if (!can.onmotion.cache(can, function() { return item.path }, can.ui.content)) { var progress
item._cb = function(event, video) { can.ui.video = item._video = video
var p = parseInt(video.currentTime*100/video.duration); can.page.Select(can, target, "span.progress", function(target) { target.innerText = p+"%" })
if (!progress) { progress = can.page.Append(can, can.ui.content, ["progress"])._target } can.page.style(can, progress, html.WIDTH, can.ui.content.offsetWidth*p/100)
}
var _target = can.onimport.file(can, item.path, item, index, can.ui.content, true); _target.focus()
can.onappend._toggle(can, can.ui.content, function() { can.onaction.prev({}, can) }, function() { can.onaction.next({}, can) })
}
if (index < can.db.begin || index >= can.db.begin+can.db.limit) {
can.onimport.page(can, can.db.list, can.db.begin = index-index%can.db.limit)
} can.onmotion.select(can, can.ui.display, "*", item._display)
},
_file: function(can, path) {
return can.misc.Resource(can, can.db.dir_root+path, can.ConfSpace())
},
file: function(can, path, item, index, target, auto) { item._path = path = can.onimport._file(can, path)
var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE]
return cb && can.page.Append(can, target||can.ui.display, [cb(can, item, auto)])._target
},
page: function(can, list, begin) { can.onmotion.clear(can, can.ui.display)
begin = parseInt(begin||can.db.begin||0), can.db.limit = can.base.Min((parseInt(can.ui.display.offsetWidth/110)||5)-1, 3)
for (var i = begin; i < begin+can.db.limit; i++) { if (list && list[i]) { list[i]._display = can.onimport.file(can, list[i].path, list[i], i) } }
can.onappend._toggle(can, can.ui.display, function(event) { can.onaction.prevpage(event, can) }, function(event) { can.onaction.nextpage(event, can) })
can.Status({begin: begin, limit: can.db.limit, total: list.length})
},
}, [""])
Volcanos(chat.ONFIGURE, {
png: function(can, path, item, index, height) { return can.onfigure.image(can, path, item, index, height) },
jpg: function(can, path, item, index, height) { return can.onfigure.image(can, path, item, index, height) },
jpeg: function(can, path, item, index, height) { return can.onfigure.image(can, path, item, index, height) },
image: function(can, path, item, index, height) { return {img: path,
onmouseover: function(event) { can.Status(nfs.FILE, path), can.Status(item) },
onclick: function(event) { item._target.click() },
} },
video: function(can, path, item, index, height, auto) { var total = 0, cb = can.ui.cb||function cb(event) { }
var init, last = can.misc.localStorage(can, can.onexport.key(can, path))||0
return {type: html.VIDEO, style: {height: height||can.onexport.height(can)},
data: {src: path, controls: "controls", autoplay: auto, playbackRate: parseFloat(can.Action(html.SPEED))},
oncanplay: cb, onplay: cb, onpause: cb, oncontextmenu: cb, onratechange: cb, onseeked: cb,
onmouseover: function(event) { can.Status(nfs.FILE, path), can.Status(item) },
onloadedmetadata: function(event) { total = event.timeStamp
event.target.currentTime = can._msg.currentTime || 0
}, onloadeddata: cb, ontimeupdate: function(event) { cb(event)
can.misc.localStorage(can, can.onexport.key(can, path), event.target.currentTime)
can.misc.localStorage(can, can.onexport.key(can, "p", path), parseInt(event.target.currentTime*100/event.target.duration)+"%")
png: function(can, item) { return can.onfigure.image(can, item) },
gif: function(can, item) { return can.onfigure.image(can, item) },
jpg: function(can, item) { return can.onfigure.image(can, item) },
jpeg: function(can, item) { return can.onfigure.image(can, item) },
image: function(can, item) { return {img: item._path, title: item.title, onclick: function(event) { item._target.click() }} },
video: function(can, item, auto) { var init, last = can.onexport.progress(can, item.path)||0
var meta = {type: html.VIDEO, title: item.title, data: {src: item._path, controls: auto, autoplay: auto},
onclick: function(event) { item._target.click() },
onratechange: function(event) { can.onexport.storage(can, "rate", event.target.playbackRate) },
onvolumechange: function(event) { can.onexport.storage(can, "volume", event.target.volume) },
onloadedmetadata: function(event) { item._cb && item._cb(event, event.target)
event.target.volume = can.onexport.storage(can, "volume")||0.5
event.target.playbackRate = can.onexport.storage(can, "rate")||1
},
ontimeupdate: function(event) { if (event.target.currentTime == 0) { return } item._cb && item._cb(event, event.target)
can.Status("position", can.onexport.position(can, event.target.currentTime-1, event.target.duration))
can.onexport.progress(can, "p."+item.path, parseInt(event.target.currentTime*100/event.target.duration)+"%")
can.onexport.progress(can, item.path, event.target.currentTime)
if (!init) { init = true, event.target.currentTime = last }
can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
}, onended: function(event) { cb(event), can.misc.localStorage(can, can.onexport.key(can, path), "") },
},
onended: function(event) { can.onaction.playnext(can) },
}
if (!auto && can.misc.isVideo(can, item.path) && !can.user.isChrome) {
return {view: html.AUDIO, list: [{img: can.misc.Resource(can, item.cover||"usr/icons/QuickTime Player.png", can.ConfSpace()), className: "cover"}, {text: [item.name, "", mdb.NAME]}], onclick: meta.onclick}
}
return meta
},
mp4: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
m4v: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
mov: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
webm: function(can, path, item, index, height, auto) { return can.onfigure.video(can, path, item, index, height, auto) },
audio: function(can, item, auto) { var meta = can.onfigure.video(can, item, auto); meta.type = html.AUDIO
return {view: html.AUDIO, list: [{img: can.misc.Resource(can, item.cover||"usr/icons/Music.png", can.ConfSpace()), className: "cover"}, {text: [item.name, "", mdb.NAME]}, meta], onclick: meta.onclick}
},
webm: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
mov: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
m4v: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
mp4: function(can, item, auto) { return can.onfigure.video(can, item, auto) },
mp3: function(can, item, auto) { return can.onfigure.audio(can, item, auto) },
})
Volcanos(chat.ONACTION, {list: ["full",
[html.HEIGHT, 100, 200, 400, 600, 800, "max", html.HIDE, ice.AUTO],
[mdb.LIMIT, 6, 1, 3, 6, 9, 12, 15, 20, 30, 50],
[html.SPEED, 1, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 5, 10],
Volcanos(chat.ONACTION, {
list: [
"mkdir", "upload", "record1", "record2",
["sort", mdb.TIME, nfs.PATH, nfs.SIZE],
["order", "repeat", "range", "loop", "random"],
],
height: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.db.list) },
limit: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.db.list) },
speed: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.db.list) },
prev: function(event, can) { if (can.db.begin > 0) { can.db.begin -= parseInt(can.Action(mdb.LIMIT)), can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是第一页了") } },
next: function(event, can) { if (can.db.begin + parseInt(can.Action(mdb.LIMIT)) < can.db.list.length) { can.db.begin += parseInt(can.Action(mdb.LIMIT)), can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是最后一页了") } },
full: function(event, can) {
var show = can.onmotion.toggle(can, can.ui.project); can.onmotion.toggle(can, can.ui.display), can.onimport.layout(can, can.ConfHeight(), can.ConfWidth())
can.page.ClassList.set(can, can.ui.content, html.FLOAT, !show), can.page.Select(can, can.ui.content, "*", function(target) { target.focus()
can.page.style(can, target, html.HEIGHT, can.ConfHeight()+(!show? 2*html.ACTION_HEIGHT: 0)-can.ui.display.offsetHeight)
})
},
onkeydown: function(event, can) { try {
if (event.target != can.ui.video) {
if (event.key == "ArrowLeft") { can.ui.video.currentTime -= 15 }
if (event.key == "ArrowRight") { can.ui.video.currentTime += 15 }
}
if (event.key == "Escape") { can.onaction.full(event, can) }
if (event.key == "ArrowUp") { can.user.toast(can, parseInt((can.ui.video.volume += 0.1)*100)) }
if (event.key == "ArrowDown") { can.user.toast(can, parseInt((can.ui.video.volume -= 0.1)*100)) }
} catch (e) {} },
record0: function(event, can, name, cb) { can.user.input(event, can, [{name: nfs.FILE, value: name}], function(list) { var height = window.innerHeight
navigator.mediaDevices.getDisplayMedia({video: {height: height}}).then(function(stream) {
can.core.Next([3, 2, 1], function(item, next) { can.user.toast(can, item + "s 后开始截图"), can.onmotion.delay(can, next, 1000) }, function() { can.user.toast(can, "现在开始截图")
cb(stream, function(blobs, ext) { var msg = can.request(event); msg._upload = new File(blobs, list[0]+nfs.PT+ext)
can.runAction(msg, html.UPLOAD, [], function() { can.user.toast(can, "上传成功"), can.Update() })
can.core.List(stream.getTracks(), function(item) { item.stop() })
})
record0: function(event, can, name, cb) { can.user.input(event, can, [{name: nfs.FILE, value: name}], function(list) {
var height = window.innerHeight, width = window.innerWidth
navigator.mediaDevices.getDisplayMedia({video: {height: height*8, width: width*8}}).then(function(stream) {
can.core.Next([3, 2, 1], function(item, next) { can.user.toast(can, item + "s 后开始截图"), can.onmotion.delay(can, next, 1000) }, function() { can.onmotion.clearFloat(can)
can.onmotion.delay(can, function() {
cb(stream, function(blobs, ext) { var msg = can.request(event); msg._upload = new File(blobs, list[0]+nfs.PT+ext)
can.runAction(msg, html.UPLOAD, [], function(msg) { can.user.toast(can, "上传成功")
can.db.hash = can.onexport.hash(can, encodeURIComponent(msg.Result())), can.Update()
}), can.core.List(stream.getTracks(), function(item) { item.stop() })
})
}, 300)
})
}).catch(function(err) { can.user.toast(can, err.name + ": " + err.message) })
}) },
record1: function(event, can) { can.onaction.record0(event, can, "shot", function(stream, cb) { var height = window.innerHeight
var video = can.page.Append(can, document.body, [{type: html.VIDEO, height: height}])._target; video.srcObject = stream, video.onloadedmetadata = function() { video.play(), width = video.offsetWidth
record1: function(event, can) { can.onaction.record0(event, can, "Screenshot "+can.base.Time(null), function(stream, cb) { var height = window.innerHeight
var video = can.page.Append(can, document.body, [{type: html.VIDEO, height: height}])._target; video.srcObject = stream, video.onloadedmetadata = function() {
video.play(), height = video.offsetHeight, width = video.offsetWidth
var canvas = can.page.Append(can, document.body, [{type: html.CANVAS, height: height, width: width}])._target; canvas.getContext("2d").drawImage(video, 0, 0, width, height)
canvas.toBlob((blob) => { cb([blob], nfs.PNG) })
canvas.toBlob(function(blob) { cb([blob], nfs.PNG) })
}
}) },
record2: function(event, can) { can.onaction.record0(event, can, "shot", function(stream, cb) {
var recorder = new MediaRecorder(stream, {mimeType: 'video/webm'}), blobs = []; recorder.ondataavailable = function(res) { blobs.push(res.data) }
recorder.onstop = function() { cb(blobs, nfs.WEBM) }, recorder.start(1)
}) },
})
Volcanos(chat.ONDETAIL, {list: ["关闭", "上一个", "下一个", "设置头像", "设置背景", "复制链接", "下载", "删除"],
_init: function(can, index) {
can.onappend._init(can, {type: "story feel play float"}, [], function(sub) { can.sub = sub, sub._legend.onclick = can._legend.onclick
can.onappend.style(can, html.FLEX, sub._output)
can.getActionSize(function(msg, left, top, width, height) { sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail), sub.onappend._status(sub, ["begin", nfs.FILE])
sub.page.style(sub, sub._target, {left: left||0, top: top||0}), sub.page.style(sub, sub._output, html.HEIGHT, height-2*html.ACTION_HEIGHT, html.WIDTH, width)
can.order = index, can.show = function(order) { path = can.onimport._file(can, can.db.list[order].path); var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE]
sub.page.Appends(sub, sub._output, [can.base.Copy(cb(can, path, index), {height: "", style: kit.Dict(html.MAX_WIDTH, width, html.MAX_HEIGHT, height-2*html.ACTION_HEIGHT)})])
sub.Status(cli.BEGIN, order+1+nfs.PS+can.db.list.length), sub.Status(nfs.FILE, path)
}, can.show(can.order)
}), sub.run = function(can, cmds, cb) { can.run(can, cmds, cb, true) }
}, can._root._target)
record2: function(event, can) { if (can.ui.recorder) { return can.ui.recorder.stop() }
can.onaction.record0(event, can, "Screenshot "+can.base.Time(null), function(stream, cb) {
if (can.user.isChrome) {
var recorder = new MediaRecorder(stream, {mimeType: "video/webm;codecs=vp8"})
recorder.onstop = function() { delete(can.ui.recorder), cb(blobs, "webm") }
// var recorder = new MediaRecorder(stream, {mimeType: 'video/mp4; codecs="avc1.4d002a"'})
// recorder.onstop = function() { delete(can.ui.recorder), cb(blobs, "mp4") }
} else {
var recorder = new MediaRecorder(stream, {mimeType: "video/mp4"})
recorder.onstop = function() { delete(can.ui.recorder), cb(blobs, "mp4") }
}
var blobs = []; recorder.ondataavailable = function(res) { blobs.push(res.data) }
can.ui.recorder = recorder, recorder.start(1)
})
},
"关闭": function(event, can) { can.page.Remove(can, can.sub._target) },
"上一个": function(event, can) { can.order > 0? can.show(--can.order): can.user.toast(can, "已经是第一张啦!") },
"下一个": function(event, can) { can.order < can.db.list.length-1? can.show(++can.order): can.user.toast(can, "已经是最后一张啦!") },
"设置头像": function(event, can) { can.setHeader(aaa.AVATAR, can.onimport._file(can, can.db.list[can.order].path)) },
"设置背景": function(event, can) { can.setHeader(aaa.BACKGROUND, can.onimport._file(can, can.db.list[can.order].path)) },
"复制链接": function(event, can) { can.onmotion.share(event, can, [], [web.LINK, can.user.copy(event, can, can.misc.MergeURL(can, {_path: can.onimport._file(can, can.db.list[can.order].path)}, true)) ]) },
"下载": function(event, can) { can.user.download(can, path = can.onimport._file(can, can.db.list[can.order].path)) },
"删除": function(event, can) { can.runAction(event, nfs.TRASH, [can.db.list[can.order].path], function(msg) { can.user.toastSuccess(can, "删除成功") }, true) },
fullscreen: function(event, can, button) { var show = can.onmotion.toggle(can, can.ui.project)
can.onmotion.toggle(can, can.ui.display, show), can.onmotion.toggle(can, can._status, show)
can.page.ClassList.set(can, can._fields, button, !show), can.page.ClassList.set(can, can.ui.content, html.FLOAT, !show)
can.sup.onimport.size(can.sup, can.sup.ConfHeight(), can.sup.ConfWidth())
},
sort: function(event, can, button, value) {
switch (value) {
case mdb.TIME: can._msg.Sort(value, "str_r"); break
case nfs.PATH: can._msg.Sort(value, "str"); break
case nfs.SIZE: can._msg.Sort(value, "int_r"); break
} can.onimport._project(can, can._msg)
},
playnext: function(can) {
if (can.Action("order") == "repeat") {
if (can.ui.video) { can.ui.video.currentTime = 0, can.ui.video.play() }
}
if (can.Action("order") == "range") { var next = can.ui.current._target.nextSibling
next && can.onmotion.delay(can, function() { next.click() }, 300)
}
if (can.Action("order") == "loop") { var next = can.ui.current._target.nextSibling
next? can.onmotion.delay(can, function() { next.click() }, 300): can.db.list[0]._target.click()
}
if (can.Action("order") == "random") {
can.db.list[parseInt(Math.random()*can.db.list.length)]._target.click()
}
},
prev: function(event, can) { var target = can.ui.current._target; target.previousSibling? target.previousSibling.click(): can.user.toast(can, "已经是第一页了") },
next: function(event, can) { var target = can.ui.current._target; target.nextSibling? target.nextSibling.click(): can.user.toast(can, "已经是最后一页了") },
prevpage: function(event, can) { if (can.db.begin > 0) { can.db.begin -= can.db.limit, can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是第一页了") } },
nextpage: function(event, can) { if (can.db.begin + can.db.limit < can.db.list.length) { can.db.begin += can.db.limit, can.onimport.page(can, can.db.list) } else { can.user.toast(can, "已经是最后一页了") } },
})
Volcanos(chat.ONEXPORT, {list: [cli.BEGIN, mdb.LIMIT, mdb.TOTAL, nfs.FILE, nfs.SIZE, "position"],
height: function(can) { var height = can.Action(html.HEIGHT); return parseInt(height == html.HIDE? 0: height == "max"? can.ConfHeight(): height == ice.AUTO? can.base.Min(can.ConfHeight()/4, 200): height) },
Volcanos(chat.ONEXPORT, {list: [cli.BEGIN, mdb.LIMIT, mdb.TOTAL, mdb.NAME, nfs.SIZE, mdb.TIME, "position"],
progress: function(can, path, time) { return can.onexport.storage(can, path.split("?")[0], time) },
position: function(can, index, total) { total = total || can.max; return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+nfs.PS+parseInt(total) },
key: function(can) { return [can.Conf(ctx.INDEX)].concat(can.core.List(arguments).slice(1)).join(":") },
})
Volcanos(chat.ONKEYMAP, {
_mode: {
plugin: {
Escape: function(event, can) { can.onaction.fullscreen(event, can) },
ArrowLeft: function(event, can) { if (can.ui.video) { can.ui.video.currentTime -= 15 } else { can.onaction.prev(event, can) } },
ArrowRight: function(event, can) { if (can.ui.video) { can.ui.video.currentTime += 15 } else { can.onaction.next(event, can) } },
ArrowDown: function(event, can) { try { can.user.toast(can, "volume: "+parseInt((can.ui.video.volume -= 0.1)*100)) } catch (e) {} },
ArrowUp: function(event, can) { try { can.user.toast(can, "volume: "+parseInt((can.ui.video.volume += 0.1)*100)) } catch (e) {} },
" ": function(event, can) { if (can.ui.video) { can.ui.video.paused? can.ui.video.play(): can.ui.video.pause() } },
},
},
})

View File

@ -1,16 +1,18 @@
fieldset.word>div.output { padding:var(--plugin-padding); }
/* fieldset.word>div.output div.story.flex>* { padding:var(--plugin-padding); } */
fieldset.word>div.output p { margin:var(--title-margin) auto; }
fieldset.word>div.output h3 { margin-top:var(--title-margin); }
fieldset.word>div.output h2.story[data-type=spark][data-name=title] { text-align:center; }
fieldset.word>div.output ul { margin:20px; margin-right:0; }
fieldset.word>div.output code { font-style: italic; }
fieldset.word>div.output ul { margin:20px; font-family:var(--code-font-family); word-break:break-all; }
fieldset.word>div.output ul>li:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; }
fieldset.word>div.output img { display:block; margin:auto; max-height:100%; max-width:100%; }
fieldset.word>div.output div.project img { margin:unset; }
fieldset.word>div.output table.content img { margin:unset; max-width:unset; }
fieldset.word>div.output table { width:100%; }
fieldset.word>div.output video { max-height:100%; width:100%; }
fieldset.word>div.output iframe { height:var(--iframe-height); width:100%; }
fieldset.word>div.output svg.story[data-index] text { cursor:pointer; }
fieldset.word>div.output input.story[type=button] { font-family:system-ui; font-weight:bold; padding:10px 40px; margin:var(--button-margin); height:var(--header-height); box-shadow:var(--box-shadow); }
fieldset.word>div.output input.story[type=button] { font-family:system-ui; font-weight:bold; padding:10px 40px; margin:var(--button-margin); height:var(--header-height); box-shadow:var(--input-box-shadow); }
body.mobile fieldset.word>div.output input.story[type=button] { padding:10px 20px; }
fieldset.word>div.output fieldset.web.code.inner.output div.output td.line { border-right:var(--box-border); }
fieldset.word>div.navmenu { background-color:inherit; overflow:auto; min-width:120px; clear:both; float:left; }
@ -18,10 +20,11 @@ fieldset.word>div.navmenu div.list { margin-left:var(--title-margin); }
fieldset.word>div.navmenu div.item { font-size:1.4em; font-weight:bold; font-family:cursive; padding:var(--input-padding) var(--title-margin); }
fieldset.word>div.navmenu>div.item { font-size:1.6em; }
div.story[data-type=spark] label { user-select:none; }
div.story[data-type=spark] label { padding:3px; -webkit-user-select:none; }
div.story[data-type=spark_tabs] { margin-top:var(--title-margin); }
div.story[data-type=spark_tabs]>div.tabs>div.item { font-style:italic; padding:var(--input-padding) var(--button-padding); height:var(--action-height); float:left; }
div.story[data-type=spark_tabs]>div.tabs>div.item.select { border-bottom:var(--code-border-color) solid 2px; }
div.story[data-type=spark_tabs]>div.tabs>div.item.select { border-top:var(--box-notice3); }
body.dark div.story[data-type=spark_tabs]>div.tabs>div.item.select { background-color:var(--code-bg-color); }
div.story[data-type=spark_tabs]>div.story:not(.select) { display:none; }
fieldset.word.play.float { top:0; }

View File

@ -1,17 +1,31 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDING, 10)
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, target) { can.Conf(html.PADDING, html.PLUGIN_PADDING)
can.page.Modify(can, target, msg.Results()), can.onimport._content(can, target)
can.onmotion.delay(can, function() { can.onappend.scroll(can, can._output) })
can.onmotion.delay(can, function() { can.onappend.scroll(can) })
can.onexport.title(can, can.Option(nfs.PATH))
},
_content: function(can, target, cb) { can.onappend.style(can, web.WIKI_WORD)
can.page.Select(can, target, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{}; cb && cb(target, meta)
can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target])
var _meta = can.base.Obj(meta.meta); _meta && _meta.style && can.page.style(can, target, can.base.Obj(_meta.style))
var _meta = can.base.Obj(meta.meta);
if (_meta && _meta.style) {
if (can.user.isMobile && _meta.style.width == "480px") { _meta.style.width = can.ConfWidth() - 2*can.Conf(html.PADDING) }
can.page.style(can, target, can.base.Obj(_meta.style))
}
meta.style && can.page.style(can, target, can.base.Obj(meta.style))
})
can.page.Select(can, target, html.A, function(target) {
target.innerText = target.innerText || target.href, target.href = target.href || target.innerText, target.target = target || "_blank"
})
},
list: function(can, root, cb, cbs, target) { target = target||can._output
can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [[html.ITEM, "open"]], list: [{text: item.meta.name}, item.list && {icon: icon.CHEVRON_DOWN}], onclick: function(event) {
can.page.ClassList.set(can, ui.item, "open", can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list))
can.onmotion.select(can, target, html.DIV_ITEM, event.currentTarget)
}, _init: function(target) { if (item.meta.name == "_") { target.innerHTML = "", can.onappend.style(can, html.SPACE, target) }
cbs && cbs(target, item)
}}, {view: html.LIST}]); can.onimport.list(can, item, cb, cbs, ui.list) })
},
navmenu: function(can, meta, target) { var nav = can.sup._navmenu
nav = can.onmotion.clear(can, nav||can.page.insertBefore(can, [wiki.NAVMENU], can._output)), can.sup._navmenu = nav
can.onimport.list(can, can.base.Obj(meta.data), function(event, item) {
@ -19,7 +33,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI
if (can.base.beginWith(link, nfs.PS, web.HTTP)) { return can.user.opens(link) }
if (can.onmotion.cache(can, function() { return can.onexport.title(can, item.meta.name), can.Option(nfs.PATH, link) })) { return }
return can.sup.Update(event, [link])
}, nav)
}, function() {}, nav)
can.onimport.layout(can)
},
premenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(html.H2, html.H3), function(_target) {
@ -29,7 +43,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI
endmenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(html.H2, html.H3), function(_target) {
can.onimport.item(can, {name: _target.innerHTML}, function() { can.onmotion.scrollIntoView(can, _target) }, function() {}, target)
}) },
title: function(can, meta, target) { can.page.tagis(target, html.H1) && can.onexport && can.onexport.title(can, meta.text) },
spark: function(can, meta, target) {
if (meta[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) }
can.page.Select(can, target, "kbd,samp", function(item) { can.onmotion.copy(can, item, function() {
@ -43,21 +56,15 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI
return tabs
}); select && select.click()
},
field: function(can, meta, target) { var item = can.base.Obj(meta.meta)
var padding = 2*can.Conf(html.PADDING); if (can.user.isMobile && !can.isCmdMode()) { padding *= 2 }
if (!item.width || parseInt(item.width) > can.ConfWidth()) { item.width = can.ConfWidth()-padding }
var width = item.width
can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
sub.onimport.size(sub, can.base.Max(html.STORY_HEIGHT, can.ConfHeight()), sub.Conf("_width", width), true)
var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode), can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden") }
can.core.Value(item, "auto.cmd") && can.onmotion.delay(function() { sub.runAction(sub.request({}, can.core.Value(item, "opts")), can.core.Value(item, "auto.cmd")) })
can.page.style(can, sub._target, html.WIDTH, width)
}, can._output, target)
},
table: function(can, meta, target) {
can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT)
can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) })
},
order: function(can, meta, target) {
target.onclick = function(event) {
can.user.copy(event, can, event.target.innerText)
}
},
chart: function(can, meta, target) {
if (!meta.fg && !meta.bg) { target.className.baseVal = "story auto" }
target.onclick = function(event) { can.misc.Event(event, can, function(msg) {
@ -69,20 +76,27 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI
})); can.page.style(can, ui._target, {left: event.clientX, top: event.clientY})
}) }
},
layout: function(can) { can.onmotion.delay(can, function() { padding = can.Conf(html.PADDING)
if (can.isCmdMode()) { can.ConfHeight(can.page.height()-html.ACTION_HEIGHT-1), can.ConfWidth(can.page.width()) }
if (can.sup._navmenu) {
can.ConfWidth(can.ConfWidth()-can.sup._navmenu.offsetWidth)
field: function(can, meta, target) { var item = can.base.Obj(meta.meta), padding = can.Conf(html.PADDING)
var height = can.base.Max(html.STORY_HEIGHT, can.ConfHeight()-4*html.ACTION_HEIGHT-2*padding), width = item.width||can.ConfWidth()-2*padding
can.core.Item(item, function(key, value) { if (can.base.beginWith(key, "meta.")) { can.core.Value(item, key, value), delete(item[key]) } })
can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
can.user.isMobile || sub.Conf("__width", item.width)
can.core.Value(item, "auto.cmd") && can.onmotion.delay(function() { sub.runAction(sub.request({}, can.core.Value(item, "opts")), can.core.Value(item, "auto.cmd")) })
var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode)
can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden")
sub.sub && sub.sub.ui.content && can.page.style(can, sub.sub.ui.content, html.HEIGHT, "", "overflow-y", "hidden")
}, sub.onimport.size(sub, height, width, true)
can.onimport.layout(can)
}, can._output, target)
},
layout: function(can) { padding = can.Conf(html.PADDING)
if (can.sup._navmenu) { can.ConfWidth(can.ConfWidth()-can.sup._navmenu.offsetWidth)
can.page.style(can, can.sup._navmenu, html.HEIGHT, can.ConfHeight())
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth(), "clear", "none", "float", "left")
} else {
can.isCmdMode() && can.page.styleHeight(can, can._output, "")
}
can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), sub.Conf("_width")||(can.ConfWidth()-2*padding), true) })
can.page.Select(can, can._output, html.IMG, function(target) {
can.page.style(can, target, html.MAX_HEIGHT, can.ConfHeight())
})
}, 0) },
can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), (can.ConfWidth()-2*padding), true) })
can.page.Select(can, can._output, html.IMG, function(target) { can.page.style(can, target, html.MAX_HEIGHT, can.base.Max(can.ConfHeight(), 420)) })
},
}, [""])
Volcanos(chat.ONACTION, {
play: function(event, can) { var list = [], current = []
@ -110,7 +124,7 @@ Volcanos(chat.ONACTION, {
}
return can.core.CallFunc([can.onimport, data.type], [sub, data, item, can.page.width()]), item
}), }])
}), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0)
}), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0)
sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time()), sub.Status(mdb.PAGE, list.length)
var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date(); sub.Status(cli.COST, can.base.Duration(now-from)) })
}, can._root._target)

View File

@ -1,30 +1,58 @@
Volcanos(chat.ONIMPORT, {
_process: function(can, msg) {
if (msg.IsErr()) { can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target) }
if (can.onimport[msg.OptionProcess()]) { return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can.sub, msg: msg, arg: msg.Option("_arg")}), true } },
if (can.onimport[msg.OptionProcess()]) { return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can.sub, msg: msg, arg: msg.Option("_arg")}), true }
},
_location: function(can, msg, arg) { can.user.jumps(arg) },
_replace: function(can, msg, arg) { location.replace(arg) },
_history: function(can, msg) { history.length == 1? can.user.close(): history.back() },
_confirm: function(can, msg, arg) { can.user.toastConfirm(can, arg, "", function() { can.runAction(can.request({}, msg), "confirm") }) },
_refresh: function(can, msg, arg) { can.core.Timer(parseInt(arg||"30"), function() { can.Update(can.request({}, {_count: parseInt(msg.Option("_count")||"3")-1})) }) },
_rewrite: function(can, msg) { var arg = msg._arg; for (var i = 0; i < arg.length; i += 2) { can.Option(arg[i], arg[i+1]), can.Action(arg[i], arg[i+1]) } can.Update() },
_rewrite: function(can, msg) { var arg = msg._arg; for (var i = 0; i < arg.length; i += 2) {
can.Option(arg[i], arg[i+1]), can.Action(arg[i], arg[i+1])
can.misc.sessionStorage(can, [can.ConfIndex(), ctx.ACTION, arg[i]], arg[i+1])
} can.Update() },
_display: function(can, msg) { can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)) },
_clear: function(can, msg) { can.onmotion.clear(can) },
_inner: function(can, sub, msg) { sub = sub||can, can.onmotion.scrollIntoView(can, can.onappend.table(sub, msg)), can.onmotion.scrollIntoView(can, can.onappend.board(sub, msg)), can.onmotion.story.auto(sub) },
_cookie: function(can, msg) { can.misc.Cookie(can, msg._arg[0], msg._arg[1]), can.Update() },
_cookie: function(can, msg) { can.misc.Cookie(can, msg._arg[0], msg._arg[1])
if (msg._arg[2]) {
history.go(msg._arg[2])
can.onmotion.delay(can, function() { history.back() }, 300)
} else {
can.Update()
}
},
_session: function(can, msg) { can.misc.sessionStorage(can, msg._arg[0], msg._arg[1]), can.Update() },
_field: function(can, msg, cb) { var height = can.base.Max(html.STORY_HEIGHT, can.ConfHeight()-2*html.ACTION_HEIGHT), width = can.ConfWidth()
msg.Table(function(item) { can.onappend._plugin(can, item, {space: can.ConfSpace(), index: item.index, args: can.base.Obj(item.args||item.arg, []), height: height, width: width}, function(sub) {
sub.run = function(event, cmds, cb) { var index = msg.Option(ice.MSG_INDEX); can.run(can.request(event, {pod: item.space}), (msg[ice.MSG_PREFIX]? msg[ice.MSG_PREFIX]: index? [ctx.RUN, index]: []).concat(cmds), cb, true) }
if (item.style != html.FLOAT && can.base.isIn(sub.ConfIndex(), wiki.PORTAL, chat.IFRAME, chat.DESKTOP, wiki.WORD, code.VIMER,)) { height = can.base.Max(can.onexport.outputHeight(can), can.ConfHeight(), 480) }
can.page.ClassList.has(can, sub._target, html.FLOAT)? can.onmotion.float(sub): sub.onimport.size(sub, height, width, true), cb && cb(sub)
if (item.style == html.FLOAT) { return } can.onmotion.delay(can, function() { can.onmotion.scrollIntoView(can, sub._target) }, 300)
if (can.base.isIn(sub.ConfIndex(), wiki.WORD)) { sub.onexport.output = function() { can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "") } }
}) })
_field: function(can, msg, cb) {
can.user.isMobile && can.onmotion.clear(can, can._output)
can.page.style(can, can._target, "visibility", ""), can.page.style(can, can._output, "visibility", "")
var height = can.ConfHeight()-can.onexport.actionHeight(can)-(can.onexport.statusHeight(can)||1), width = can.ConfWidth()
var tabs = false, tabHash = msg.Option("field.tabs"); if (tabHash) {
can.sub && can.sub.onimport.tabs(can.sub, [{name: tabHash.slice(0, 6)}], function() { can.onmotion.cache(can, function() { return tabHash }) }), tabs = true
} else {
if (msg.Length() > 1) {
height = height / msg.Length()
} else if (can._output.innerHTML && !can.page.tagis(can._target, html.FIELDSET_OUTPUT)) {
height = can.base.Max(html.STORY_HEIGHT, height)
}
}
var option = can.base.Obj(msg.Option("field.option"))
msg.Table(function(item) { tabs && can.onmotion.cache(can, function() { return tabHash })
var sup = item.space? can._root.Action: can; height = can.base.Max(item._height||height, can.ConfHeight()), width = can.base.Max(item._width||width, can.ConfWidth())
can.onappend._plugin(sup, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: height, width: width, icons: item._icon}, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
sub.run = function(event, cmds, cb) { var index = msg.Option(ice.MSG_INDEX)||item.index; sup.run(can.request(event, {pod: item.space}, option), (msg[ice.FIELD_PREFIX]? msg[ice.FIELD_PREFIX]: index? [ctx.RUN, index]: []).concat(cmds), cb, true) }
can.page.ClassList.has(can, sub._target, html.FLOAT)? can.onmotion.float(sub): sub.onimport.size(sub, height, width, !can.user.isMobile), cb && cb(sub)
if (item.style == html.FLOAT) { return } can.onmotion.delay(can, function() { can.onmotion.scrollIntoView(can, sub._target) }, 300)
sub.onexport.output = function() { if (tabs) { msg.Option(ice.MSG_ACTION) && can.onappend._action(can, msg.Option(ice.MSG_ACTION))
sub.sub.onimport.tabs(sub.sub, [{name: tabHash.slice(0, 6)}], function() { tabs || can.onmotion.cache(can, function() { return tabHash }) }), tabs = false
} }
}, item.style == html.FLOAT && can.page.tagis(can._target, "fieldset.story")? document.body: can._output)
})
},
_float: function(can, msg) { can.onimport._field(can, msg, function(sub) { can.onmotion.float(sub) }) },
_hold: function(can, msg, arg) { can.user.toast(can, arg||ice.SUCCESS) },
_back: function(can) { can.onimport.back({}, can) },
_back: function(can, msg, arg) { arg? (history.go(arg), can.onmotion.delay(can, function() { can.onimport.back({}, can) })): can.onimport.back({}, can) },
_rich: function(can, msg) { var sub = can.sub
function _rich() {
if (sub._rich_list.length == 0) { return } if (sub._rich_running) { return } sub._rich_running = true
@ -53,17 +81,19 @@ Volcanos(chat.ONIMPORT, {
}); return
},
_grow: function(can, msg, arg) {
var sub = can.sub; if (sub && sub.onimport && sub.onimport.grow) { return sub.onimport.grow(sub, msg, msg.detail[1], msg.detail[2]) }
var sub = can.sub
if (sub && sub.onimport && sub.onimport._grow) { return sub.onimport._grow(sub, msg, msg.detail[1], msg.detail[2]) }
if (sub && sub.onimport && sub.onimport.grow) { return sub.onimport.grow(sub, msg, msg.detail[1], msg.detail[2]) }
if (msg.Option(ctx.DISPLAY)) {
function _grow() { if (can.sub._grow_list.length == 0) { return } if (can.sub._grow_running) { return } can.sub._grow_running = true
var msg = can.sub._grow_list.shift(), text = msg.detail[1]; sub._grow.onappend._status(sub._grow, msg.Option(ice.MSG_STATUS), null, msg)
sub._grow._size = (sub._grow._size||0)+text.length, text && text.match(/\n/g) && (sub._grow._count = (sub._grow._count||0)+text.match(/\n/g).length)
if (msg.Option(cli.DELAY) && msg.Option(cli.DELAY) != "0") { var list = []; for (var i = 0; i < text.length; i++) { list.push(text[i]) }
can.core.Next(list, function(text, next) {
can.sub._grow.onimport.grow(can.sub._grow, msg, "only", text), can.core.Timer(msg.Option(cli.DELAY), next)
can.sub._grow.onimport.grow(can.sub._grow, msg, "current", text), can.core.Timer(msg.Option(cli.DELAY), next)
}, function() { can.sub._grow_running = false, _grow() })
} else {
can.sub._grow.onimport.grow(can.sub._grow, msg, "only", text), can.sub._grow_running = false, _grow()
can.sub._grow.onimport.grow(can.sub._grow, msg, "current", text), can.sub._grow_running = false, _grow()
} sub._grow.Status(mdb.COUNT, sub._grow._count), sub._grow.Status("msg", can.base.Size(sub._grow._size))
}
if (can.sub._grow) {
@ -72,13 +102,16 @@ Volcanos(chat.ONIMPORT, {
(can.sub._grow_list = can.sub._grow_list||[]).push(msg); if (can.sub._grow_list.length > 1) { return }
}
var height = can.onexport.outputHeight(can)
can.onappend.plugin(can, {title: can.core.Keys(msg.Option(ice.MSG_TITLE)||msg.Option(ctx.DISPLAY).split(nfs.PS).pop()), index: "can._filter", display: msg.Option(ctx.DISPLAY), height: height}, function(sub) {
can.onappend.plugin(can, {
index: "can._filter", display: msg.Option(ctx.DISPLAY), height: height,
title: can.core.Keys(msg.Option(ice.MSG_TITLE)||msg.Option(ctx.DISPLAY).split(nfs.PS).pop()),
}, function(sub) {
sub.onexport.output = function() { can.onmotion.scrollIntoView(can, sub._target), can.sub._grow = sub.sub, _grow() }
}); return
}
arg = can.page.Color(arg); if (!can.page.SelectOne(can, can._output, html.DIV_CODE, function(div) {
return can.page.style(can, div, html.MAX_HEIGHT, can.onexport.outputHeight(can)),
can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true
can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true
})) { can.onappend.board(can, arg) }
},
_open: function(can, msg, arg) { can.user.open(arg); msg._arg.length > 1 && can.Update() },
@ -88,12 +121,14 @@ Volcanos(chat.ONIMPORT, {
return input.value = value, can.Update(event, can.Input([], true, data), cb), input
})[0] },
_size: function(can, height, width, auto, mode) {},
size: function(can, height, width, auto, mode) {
can.Conf("_auto", auto), can.Mode(mode), can.ConfHeight(height), can.ConfWidth(width), height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can)
size: function(can, height, width, auto, mode) { typeof width == code.STRING && (width = can.base.ParseSize(width))
can.Conf("_auto", auto), can.Mode(mode), can.ConfHeight(height), can.ConfWidth(width), height -= can.onexport.actionHeight(can)+(can.onexport.statusHeight(can)||(can.sub? 0: 1))
var padding = can.Conf("padding")||0, margin = can.Conf("margin")||0; height -= 2*padding, width -= 2*padding+2*margin
auto || auto == undefined? (can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.page.style(can, can._target, html.HEIGHT, "", html.WIDTH, "")):
(can.page.style(can, can._output, html.HEIGHT, height, html.WIDTH, width, html.MAX_HEIGHT, "", html.MAX_WIDTH, ""), can.page.style(can, can._target, html.WIDTH, width))
if (can.misc.Search(can, log.DEBUG) == ice.TRUE) { can.Status(html.HEIGHT, can.base.Max(height, can._output.offsetHeight), html.WIDTH, width) }
can.page.style(can, can._status, html.MAX_WIDTH, width)
can.core.List(can._plugins, function(sub) { can.page.tagis(sub._target, "fieldset.float") || sub.onimport.size(sub, height, width, false) })
var sub = can.sub; if (!sub) { return auto } sub.Mode(mode), sub.ConfHeight(height), sub.ConfWidth(width), can.onimport._size(can)
mode? sub.onlayout[mode](sub, height, width): sub.onlayout._init(sub, height, width)
return auto
@ -103,12 +138,16 @@ Volcanos(chat.ONIMPORT, {
var _height = can.base.Max(sub._target.offsetHeight+border, can.ConfHeight()/2)
sub.onimport.size(sub, _height-border, can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0), true)
},
back: function(event, can) { can._history.pop(); for (var i = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue }
can.page.SelectArgs(can, can._option, "", function(target) { target.value = his[i++]||"", can.page.Select(can, target.parentNode, "span.value", function(target) { target.innerText = target.value||"" }) })
can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break
} can.Update(event) },
back: function(event, can) { can._history.pop()
for (var i = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue }
can.page.SelectArgs(can, can._option, "", function(target) { target.value = his[i++]||"", can.page.Select(can, target.parentNode, "span.value", function(target) { target.innerText = target.value||"" }) })
can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break
}
can.onexport.hash(can, ""), can.Update(event)
},
})
Volcanos(chat.ONACTION, {list: ["刷新数据",
Volcanos(chat.ONACTION, {
list: ["刷新数据",
function(can) { if (!can.user.isMobile) { return "刷新界面" } },
function(can) { if (!can.user.isMobile && !can.isCmdMode()) { return "切换浮动" } },
function(can) { if (!can.user.isMobile && !can.isCmdMode()) { return "切换全屏" } },
@ -123,36 +162,42 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
["视图", "参数", "插件",
function(can) { if (can._action.innerHTML) { return "操作" } },
function(can) { if (can._status.innerHTML) { return "状态" } },
function(can) { if (can.sub.ui.project) { return "专注" } },
function(can) { if (can.sub.ui.project) { return "项目" } },
function(can) { if (can.sub.ui.profile) { return "预览" } },
function(can) { if (can.sub.ui.display) { return "演示" } },
],
["调试",
function(can) { if (can.Conf("_help")) { return "查看文档" } },
"查看脚本", "查看源码", "查看镜像",
"查看通知", "查看视图", "查看数据", "会话存储", "本地存储",
"查看报文", "查看配置", "查看日志", "删除工具",
function(can) { if (can.sub && can.sub.ui.project) { return "专注" } },
function(can) { if (can.sub && can.sub.ui.project) { return "项目" } },
function(can) { if (can.sub && can.sub.ui.profile) { return "预览" } },
function(can) { if (can.sub && can.sub.ui.display) { return "演示" } },
],
function(can) { if (can.misc.Search(can, ice.MSG_DEBUG)) {
return ["调试",
function(can) { if (can.Conf("_help")) { return "查看文档" } },
"查看脚本", "查看源码", "查看镜像",
"查看通知", "查看视图", "查看数据", "会话存储", "本地存储",
"查看报文", "查看配置", "查看日志", "删除工具",
]
} },
],
_engine: function(event, can, button) { can.Update(event, [ctx.ACTION, button].concat(can.Input())) },
_switch: function(can, sub, mode, save, load) {
if (can.page.ClassList.neg(can, can._target, mode)) {
(can._mode_list = can._mode_list||[]).push(kit.Dict(
if (can.page.ClassList.neg(can, can._target, mode)) { can._mode_list = can._mode_list||[]
can._mode_list.push(kit.Dict(
html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth(), ice.MODE, can.Mode()||"",
html.ACTION, can.page.isDisplay(can._action), html.STATUS, can.page.isDisplay(can._status),
html.OUTPUT, can.base.Copy({}, can._output.style, html.HEIGHT, html.WIDTH, html.MAX_HEIGHT, html.MAX_WIDTH),
ctx.STYLE, can.base.Copy({}, can._target.style, html.LEFT, html.TOP, html.RIGHT, html.BOTTOM), save(),
ctx.STYLE, can.base.Copy({}, can._target.style, html.LEFT, html.TOP, html.RIGHT, html.BOTTOM), save()
)), can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), false, mode)
} else { var back = (can._mode_list = can._mode_list||[]).pop(); if (!back) { return }
} else {
var back = (can._mode_list = can._mode_list||[]).pop(); if (!back) { return }
can.onmotion.toggle(can, can._action, back.action), can.onmotion.toggle(can, can._status, back.status)
can.onimport.size(can, back.height, back.width, false, mode), can.page.style(can, can._target, back.style), load && load(back)
can.onimport.size(can, back.height, back.width, false, back.mode), can.page.style(can, can._target, back.style), load && load(back)
}
},
"刷新数据": function(event, can) { can.Update(event, can.Input()), can.user.toastSuccess(can) },
"刷新界面": function(event, can) { var sub = can.sub; sub.onlayout._init(sub, sub.ConfHeight(), sub.ConfWidth()), can.user.toastSuccess(can) },
"切换浮动": function(event, can, button, sub) { can.onaction._switch(can, sub, chat.FLOAT, function() { can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can._status), can.onmotion.float(can) }) },
"切换全屏": function(event, can, button, sub) { can.onaction._switch(can, sub, chat.FULL, function() { can.page.style(can, can._target, html.LEFT, "", html.TOP, can.onexport.marginTop(), html.BOTTOM, "")
"切换浮动": function(event, can, button, sub) {
can.onaction._switch(can, sub, chat.FLOAT, function() { can.onmotion.float(can) })
},
"切换全屏": function(event, can, button, sub) { can.onaction._switch(can, sub, chat.FULL, function() {
can.page.style(can, can._target, html.LEFT, "", html.TOP, can.onexport.marginTop(), html.BOTTOM, "")
can.ConfHeight(can.page.height()-can.onexport.marginTop()-can.onexport.marginBottom(can)), can.ConfWidth(can.page.width())
}) },
"远程控制": function(event, can) { can.onaction.keyboard(event, can) },
@ -161,12 +206,12 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
"打开空间": function(event, can) { can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD)})) },
"打开链接": function(event, can) { can.user.open(can.onexport.link(can)) },
"发送聊天": function(event, can) {
can.user.input(event, can, [{name: "message", display: "/require/usr/icebergs/core/chat/message.js", run: function(event, cmds, cb) {
can._root.Header.run(event, [ctx.ACTION, "message"].concat(cmds), function(msg) {
cb(msg)
})
}}], function(list) {
can._root.Header.run(event, [ctx.ACTION, "message", list[0], mdb.TYPE, "plug", web.SPACE, can.ConfSpace(), ctx.INDEX, can.ConfIndex(), ctx.ARGS, JSON.stringify(can.Option())])
can.user.input(event, can, [{name: chat.MESSAGE, display: "/require/usr/icebergs/core/chat/message.js", run: function(event, cmds, cb) {
can._root.Header.run(can.request(event, {pod: can.ConfSpace()}), [ctx.ACTION, chat.MESSAGE].concat(cmds), function(msg) { cb(msg) })
}}], function(list) { var args = can.core.Item(can.Option(), function(key, value) { return value })
can._root.Header.run(can.request(event, {pod: can.ConfSpace()}), [ctx.ACTION, chat.MESSAGE, list[0],
mdb.TYPE, "plug", ctx.INDEX, can.ConfIndex(), ctx.ARGS, args.length < 2? args[0]||"": JSON.stringify(args)])
can.onappend._float(can, chat.MESSAGE)
})
},
"生成链接": function(event, can) { can.onmotion.share(event, can, [], [web.LINK, can.user.copy(event, can, can.onexport.link(can))]) },
@ -175,7 +220,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
"ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source",
]; can.user.copy(event, can, list[0]) },
"生成图片": function(event, can) { can.user.toimage(can, can.name) },
_view: function(can, cb) { var sub = can.sub; cb(sub), sub.onimport.layout(sub) },
"参数": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._option) }) },
"操作": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._action) }) },
@ -193,7 +238,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
var sub = can.sub; sub.onimport.tool(sub, [data], function(sub) { sub.select() })
})
},
"保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) },
"清空参数": function(event, can) { can.page.SelectArgs(can, can._option, "", function(target) { return target.value = "" }) },
"复制数据": function(event, can) { var sub = can.sub; can.user.copy(event, can, sub.onexport.table(sub)||sub.onexport.board(sub)) },
@ -201,7 +246,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
can.user.downloads(can, sub.onexport.table(sub), list[0], nfs.CSV), can.user.downloads(can, sub.onexport.board(sub), list[0], nfs.TXT)
}) },
"清空数据": function(event, can) { can.onmotion.clear(can, can._output) },
"查看文档": function(event, can) { can.requests(event, {action: ice.HELP}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) },
"查看脚本": function(event, can) { can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, can.sub._path)) },
"查看源码": function(event, can) { can.requests(event, {action: nfs.SOURCE}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) },
@ -220,8 +265,13 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
"查看日志": function(event, can) { var logid = can.Status("log.id"); can.onappend._float(can, web.CODE_XTERM, ["sh", logid, "grep "+logid+" var/log/bench.log | grep -v grep | grep -v '"+logid+" $'"]) },
"打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) },
"删除工具": function(event, can) { can.onaction._close(event, can) },
refresh: function(event, can) { can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), true, can.Mode()) },
detail: function(event, can) { var msg = can.request(event)
can.core.Item(can.Option(), function(key, value) {
can.Option(key, msg.Option(key)||"")
}), can.Update()
},
close: function(event, can) {
if (can.isCmdMode()) {
can.user.close()
@ -232,7 +282,11 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
} else {
can.onaction._close(event, can), can.onexport.close(can)
}
}, _close: function(event, can) { can.page.Remove(can, can._target) },
},
_close: function(event, can) {
can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, can._target)}))
can.page.Remove(can, can._target)
},
clear: function(event, can) { can.onmotion.clear(can, can._output) },
actions: function(event, can) { can.onmotion.toggle(can, can._action) },
help: function(event, can) {
@ -249,11 +303,11 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
can.user.toast(can, {title: msg.Append(mdb.NAME), duration: -1, content: msg.Append(mdb.TEXT), action: [cli.CLOSE, cli.OPEN]})
})
},
getClipboardData: function(event, can, button) {
function add(text) { can.runAction(event, button, can.base.Simple(can.base.ParseJSON(text)), function() { can.Update() }) }
navigator.clipboard? navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) }):
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(list) { add(list[0]) })
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(list) { add(list[0]) })
},
getLocation: function(event, can, button) { can.user.agent.getLocation(can, function(data) {
can.user.input(can.request(event, data), can, [mdb.TYPE, mdb.NAME, mdb.TEXT, aaa.LATITUDE, aaa.LONGITUDE], function(args) {
@ -276,7 +330,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
record1: function(event, can) { can.onaction.record0(event, can, "shot", function(stream, cb) { var height = window.innerHeight
var video = can.page.Append(can, document.body, [{type: html.VIDEO, height: height}])._target; video.srcObject = stream, video.onloadedmetadata = function() { video.play(), width = video.offsetWidth
var canvas = can.page.Append(can, document.body, [{type: html.CANVAS, height: height, width: width}])._target; canvas.getContext("2d").drawImage(video, 0, 0, width, height)
canvas.toBlob((blob) => { cb([blob], nfs.PNG) })
canvas.toBlob(function(blob) { cb([blob], nfs.PNG) })
}
}) },
record2: function(event, can) { can.onaction.record0(event, can, "shot", function(stream, cb) {
@ -284,27 +338,46 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
recorder.onstop = function() { cb(blobs, nfs.WEBM) }, recorder.start(1)
}) },
})
Volcanos(chat.ONEXPORT, {_output: function(can, msg) {},
Volcanos(chat.ONEXPORT, {
_output: function(can, msg) {},
output: function(can, msg) {}, action: function(can, button, data) {}, record: function(can, value, key, data) {},
title: function(can, title) { can.isCmdMode() && can.user.title(title) },
marginTop: function() { return 0 }, marginBottom: function() { return 0 },
marginTop: function() { return 0 }, marginBottom: function() { return 0 }, outputMargin: function(can) { return 0 },
actionHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT)? 0: html.ACTION_HEIGHT },
outputHeight: function(can) { var height = can.ConfHeight() - can.onexport.actionHeight(can) - can.onexport.statusHeight(can)
if (can.user.isMobile) { return height } height -= can.onexport.outputMargin(can)
can.page.SelectChild(can, can._output, html.TABLE, function(target) { height -= target.offsetHeight })
return can.base.Max(can.base.Min(height, can.ConfHeight()/2), can.ConfHeight()-2*html.ACTION_HEIGHT, 320)
},
outputMargin: function(can) { return 0 },
statusHeight: function(can) {
return can.page.ClassList.has(can, can._target, html.OUTPUT) || !can.page.isDisplay(can._status) || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0) ||
can._status.innerHTML == "" && !can.page.ClassList.has(can, can._target, html.PLUG)? 0: html.STATUS_HEIGHT },
link: function(can) {
var args = can.Option();
args.pod = can.ConfSpace(), args.cmd = can.ConfIndex();
can.core.Item(args, function(key, value) {
if (!value) { delete(args[key]) }
})
return can.misc.MergePodCmd(can, args, true) },
can._status.innerHTML == "" && !can.page.ClassList.has(can, can._target, html.PLUG)? 0: html.STATUS_HEIGHT
},
session: function(can, key, value) { if (value) { value = JSON.stringify(value) }
return can.misc.sessionStorage(can, [can.ConfSpace()||can.misc.Search(can, ice.POD), can.ConfIndex(), key, location.pathname], value)
},
storage: function(can, key, value) { if (value) { value = JSON.stringify(value) }
return can.misc.localStorage(can, [can.ConfSpace()||can.misc.Search(can, ice.POD), can.ConfIndex(), key], value)
},
hash: function(can, hash) {
can.misc.SearchHash(can, hash), can.onexport.storage(can, "hash", hash)
return hash
},
title: function(can, title) { if (!can.isCmdMode()) { return }
var list = []; function push(p) { p && list.indexOf(p) == -1 && list.push(p) }
if (!can.user.isMobile) {
if (arguments.length == 2 && !can.base.isIn(can.ConfIndex(), web.PORTAL, code.VIMER, wiki.FEEL)) { push(can.user.trans(can, can.ConfIndex().split(".").pop(), can.ConfHelp())) }
}
can.core.List(arguments, function(title, index) { index > 0 && push(title) })
can.user.isMobile || push(can.user.mod.isPod? can.user.info.titles||can.ConfSpace()||can.misc.Search(can, ice.POD): location.host)
can.user.title(list.join(" "))
},
args: function(can) { return can.Option() },
link: function(can) {
// if (can.sub && can.sub.onexport.link) { return can.sub.onexport.link(can.sub) }
var args = can.Option(); args.pod = can.ConfSpace()||can.misc.Search(can, ice.POD), args.cmd = can.ConfIndex()
can.core.Item(args, function(key, value) { key != ice.POD && !value && delete(args[key]) })
var hash = can.onexport.storage(can, "hash")||""; can.base.isArray(hash) && (hash = hash.join(":")), hash && (hash = "#"+hash)
return can.base.replaceAll(can.misc.MergePodCmd(can, args, true), "%2F", "/")+hash
},
close: function(can, msg) {},
})

View File

@ -5,7 +5,13 @@ Volcanos(chat.ONIMPORT, {
return {view: [[html.ITEM, item.type]], list: [item.type != html.BUTTON && {text: [can.user.trans(can, item.name, item._trans, html.INPUT), "", mdb.NAME]}, item.need == "must" && {text: ["*", "", "need"]}], _init: function(target) {
item.type == html.BUTTON && (item.onclick = function(event) { var args = []
can.core.Item(can.page.SelectArgs(can, can._output)[0], function(key, value) { args.push(key, value) })
can.Update(can.request(event, {_handle: ice.TRUE}), [ctx.ACTION, item.name].concat(args))
can.Update(can.request(event, {_handle: ice.TRUE}), [ctx.ACTION, item.name].concat(args), function(msg) {
if (msg.IsErr()) {
can.user.toastFailure(can, msg.Result())
return
}
can.Update()
})
}), can.onappend.input(can, item, "", target)
}, onclick: function(event) {
can.page.Select(can, event.currentTarget, html.INPUT, function(target) { target.focus() })

View File

@ -1,7 +1,14 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can, target), can.onappend.table(can, msg)
can.onappend.style(can, nfs.JSON, can._output), can.onimport.show(can, can.base.Obj(msg.Result(), {}), target)
can.onappend.style(can, nfs.JSON, can._output), can.onimport.show(can, can.base.Obj(msg.Result(), {}), target, msg)
},
show: function(can, data, target) { var hidden = data.detail && data.option
show: function(can, data, target, msg) {
if (data.append && !can.page.tagis(can._fields, "fieldset.float")) {
var msg = can.request(); msg.Copy(data), can.onappend.table(can, msg)
msg._xhr = {responseText: msg.Result()}
can.onmotion.delay(can, function() { can.onappend._status(can, msg) })
return
}
var hidden = data.detail && data.option
function show(data, target, index, total) { var list
switch (typeof data) {
case code.OBJECT: if (data == null) { can.page.Append(can, target, [{text: "null"}]); break }

View File

@ -1,12 +1,44 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(can, function() { can.list = can.onimport._data(can, msg, can.Conf(mdb.FIELD)||mdb.VALUE)
can.core.List(can.list, function(item) { msg.Push(cli.COLOR, '<span style="background-color:'+item.color+'"> </span>').Push("weight", parseInt(item.span*100/360)+"%") })
can.onaction.list = [], can.ui.display = can.page.Append(can, can._output, [html.DISPLAY])._target
can.onappend.table(can, msg, null, can.ui.display), can.page.Select(can, can.ui.display, html.TR, function(tr, index) {
can.page.Modify(can, tr, {onmouseenter: function(event) { can._draw(index-1) }})
}), can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.append)
}) },
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.ui = can.onappend.layout(can)
can.page.requireDraw(can, function() { can.db.delay = 50, can.onappend.style(can, "pie"), can.onaction.list = []
can.list = can.onimport._data(can, msg, can.Conf(mdb.FIELD)||msg.append[1]||mdb.VALUE)
can.core.List(can.list, function(item) { msg.Push("weight", item.value.weight = parseInt(item.span*100/360)+"%").Push(cli.COLOR, '<span style="background-color:'+item.color+'"> </span>') })
can.onappend.table(can, msg, null, can.ui.profile), can.page.Select(can, can.ui.profile, html.TR, function(tr, index) { can.ui.table = tr.parentNode
can.page.Modify(can, tr, {onmouseenter: function(event) { can._draw(can.db.which = index-1) }})
}), can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.append)
})
},
_data: function(can, msg, field) { var list = []
var color = ["#3300FF", "#2196F3", "#4CAF50", "#CDDC39", "#FFEB3B", "#9C27B0", "#795548", "#607D8B", "#CC33FF"]
var color = [
"#8085e9",
"#95a2ff",
"#73abf5",
"#3cb9fc",
"#0082fc",
"#87e885",
"#90ed7d",
"#22ed7c",
"#05f8d6",
"#cb9bff",
"#bf19ff",
"#f47a75",
"#fa8080",
"#f7a35c",
"#ffc076",
"#f9e264",
"#fae768",
"#5f45ff",
"#02cdff",
"#0090ff",
"#854cff",
"#09b0d3",
"#1d27c9",
"#765005",
"#314976",
"#009db2",
"#024b51",
"#0780cf",
]
var total = 0; msg.Table(function(value) { total += can.onimport._parseInt(can, value[field]) })
var begin = 0; msg[cli.COLOR] = [], msg["weight"] = [], msg.Table(function(value, index) {
list.push({span: can.onimport._parseInt(can, value[field])/total*360, color: color[index%color.length], value: value})
@ -15,16 +47,19 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
_draw: function(can, x, y, r, margin, which) { if (which == can._last) { return } can._last = which
if (can.list.length == 1) { return can.onimport.draw(can, {shape: svg.CIRCLE, points: [{x: x, y: y}, {x: x, y: y+r}], style: {fill: cli.BLUE}}) }
function pos(x, y, r, angle) { angle -= 90; return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] }
function pie(x, y, r, begin, span, color, cb) { can.onimport.draw(can, {shape: svg.PATH, style: kit.Dict(
function pie(x, y, r, begin, span, color, title, cb) { can.onimport.draw(can, {shape: svg.PATH, style: kit.Dict(
svg.STROKE, color, svg.FILL, color, "d", can.base.joins([
["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"]
], lex.SP, mdb.FS),
), onmouseenter: function(event) { can.base.isFunc(cb) && cb(event) } }) }
can.onmotion.clear(can, can.ui.svg), can.ui.svg.Value(mdb.COUNT, 0)
var begin = 0; can.core.List(can.list, function(item, index) { var p = index==which? pos(x, y, margin, begin+item.span/2): [x, y]
pie(p[0], p[1], r, begin, item.span, item.color, function(event) { can.onimport._draw(can, x, y, r, margin, index) }), begin += item.span
index == which && can.Status(item.value)
}), can.onimport.layout(can)
var begin = 0; can.core.Next(can.list, function(item, next, index) { var p = index==which? pos(x, y, 1*margin, begin+item.span/2): [x, y]
pie(p[0], p[1], r, begin, item.span, item.color, item.name||item.command, function(event) { can.onimport._draw(can, x, y, r, margin, can.db.which = index) }), begin += item.span
index == which && (can.db.current = item.value)
can.onmotion.select(can, can.ui.table, html.TR, index), can.Status(item.value), can.onmotion.delay(can, next, can.db.delay)
}, function() {
can.onmotion.select(can, can.ui.table, html.TR, which), can.Status(can.db.current), can.db.delay = 0
})
},
_parseInt: function(can, value) { value = value.toLowerCase()
if (can.base.endWith(value, "m")) { return parseInt(value)*1000000 }
@ -33,9 +68,19 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
if (can.base.endWith(value, "mi")) { return parseInt(value)*1000000 }
return parseInt(value)
},
layout: function(can) {
var height = can.base.Max(can.ConfHeight(), can.ConfWidth()/2), margin = 20, r = height/2-margin; can.ui.svg.Val(html.WIDTH, height), can.ui.svg.Val(html.HEIGHT, height)
can.page.style(can, can.ui.display, html.HEIGHT, can.ConfHeight()-can.ui.svg.Val(html.HEIGHT))
can._draw = function(which) { can.onimport._draw(can, r+margin, r+margin, r, margin, which) }, can._draw(0)
layout: function(can) { if (!can.ui || !can.ui.svg) { return }
can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.display), can.onmotion.toggle(can, can.ui.profile, true)
var _width = can.base.Max(can.ConfWidth()-can.ConfHeight(), 600, 200)
can.page.style(can, can.ui.profile, html.HEIGHT, can.ConfHeight(), html.WIDTH, _width, html.FLEX, "0 0 "+(_width)+"px")
var width = can.ConfWidth()-_width, height = can.ConfHeight()-4, margin = 40, r = can.base.Max(height, width)/2-1*margin-margin
can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, width)
can.ui.svg.Val(html.WIDTH, width), can.ui.svg.Val(html.HEIGHT, height)
can._draw = function(which) { can.onimport._draw(can, width/2-margin/2, height/2-margin/2, r, margin, which) }, can._draw(can.db.which||0)
return
var height = can.base.Max(can.ConfHeight(), can.ConfWidth()/2), margin = 10, r = height/2-1*margin-margin
can.page.style(can, can.ui.display, html.WIDTH, can.ConfWidth()-height-1), can.ui.svg.Val(html.HEIGHT, height), can.ui.svg.Val(html.WIDTH, height)
can._draw = function(which) { can.onimport._draw(can, height/2-margin/2, can.ConfHeight()/2-margin/2, r, margin, which) }, can._draw(can.db.which||0)
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth())
},
})

View File

@ -1,12 +1,15 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(can, function() { msg.append && can.ConfDefault({field: msg.append[0], split: nfs.PS})
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.page.requireDraw(can, function() { msg.append && can.ConfDefault({field: msg.append[0], split: nfs.PS})
can.db.count = msg.Length()
can.onmotion.toggle(can, can._action, true)
can.dir_root = can.Conf(nfs.DIR_ROOT)||msg.Option(nfs.DIR_ROOT), can._tree = can.onimport._tree(can, msg.Table(), can.Conf(mdb.FIELD), can.Conf(lex.SPLIT))
can.onaction.list = [], can.base.isFunc(cb) && cb(msg), can.onimport.layout(can), can.onmotion.toggle(can, can._action, true)
can.onappend._status(can, msg.Option(ice.MSG_STATUS))
can.onaction.list = [], can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.Option(ice.MSG_STATUS)), can.onimport.layout(can)
can.onappend.style(can, "spides")
}) },
_tree: function(can, list, field, split) { var node = {}; can.core.List(list, function(item) { can.core.List(item[field].split(split), function(value, index, array) {
var last = array.slice(0, index).join(split)||can.dir_root, name = array.slice(0, index+1).join(split)
value && !node[name] && (node[last] = node[last]||{name: last, meta: {}, list: []}).list.push(node[name] = {
name: value+(index==array.length-1? "": split), file: item[field]||item.file, hide: true, meta: item, list: [], last: node[last],
name: value+(index==array.length-1? "": split), file: item.file||item[field]||item.file, hide: true, meta: item, list: [], last: node[last],
})
}) }); return node },
_height: function(can, tree) { tree.height = 0; if (tree.list.length == 0 || tree.hide) { return tree.height = 1 }
@ -15,7 +18,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
_width: function(can, tree) { tree.width = 0; if (tree.list.length == 0 || tree.hide) {
return tree.width = can.onimport.draw(can, {shape: html.TEXT, points: [{x: 0, y: 0}], style: {inner: tree.name}}).Val(svg.TEXT_LENGTH)+can.margin
} can.core.List(tree.list, function(item) { tree.width += can.onimport._width(can, item) }); return tree.width },
_color: function(can, tree) { return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) },
_color: function(can, tree) {
return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW)
},
layout: function(can) {
can.ui.svg && can.ui.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10)
can._tree && can._tree[can.dir_root] && can.core.CallFunc(can.onaction[can.Action(html.VIEW)||"横向"], [event, can, can.Action(html.VIEW)])
@ -59,8 +64,26 @@ Volcanos(chat.ONDETAIL, {
for (var node = tree; node; node = node.last) { can.request(event, node.meta) }
can.run(can.request(event, can.Option()), can.base.Obj(can.Conf(lex.PREFIX), []).concat(can.Conf(ctx.ACTION)||[], [tree.file||"", tree.name]), function(msg) {
if (msg.Length() == 0) { return can.onappend._float(can, web.CODE_INNER, [can._msg.Option(nfs.DIR_ROOT), tree.file, tree.line]) }
if (msg.Append(mdb.INDEX)) { return msg.Table(function(value) { can.onappend._float(can, value.index, value.args) }) }
if (msg.Append(mdb.INDEX)) {
return msg.Table(function(value) { value.style = html.FLOAT, can.onappend.plugin(can, value, function(sub) {}) })
}
can.Status(mdb.COUNT, can.db.count += msg.Length())
tree.list = can.onimport._tree(can, msg.Table(), can.Conf(mdb.FIELD), can.Conf(lex.SPLIT))[can.dir_root].list
tree.hide = false, can.onimport.layout(can)
}, true)
},
oncontextmenu: function(event, can, tree) {
can.user.carte(event, can, {}, [
wiki.PORTAL, chat.DESKTOP, chat.ADMIN, wiki.WORD, web.DREAM, web.STORE,
code.VIMER, code.STATUS, code.COMPILE, cli.RUNTIME, code.XTERM,
], function(event, button) {
if (button == web.ADMIN) {
can.onappend.plugin(can, {index: web.CHAT_IFRAME, args: [
can.misc.MergePodCmd(can, {pod: tree.file, cmd: web.ADMIN})
], title: tree.name+"."+web.ADMIN, style: html.FLOAT}, function(sub) {})
} else {
can.onappend.plugin(can, {space: tree.file, index: button, style: html.FLOAT}, function(sub) {})
}
})
},
})
Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.COUNT]})

View File

@ -1,9 +1,10 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.onappend.style(can, [web.STATS, html.FLEX], can._output)
var FIELD = can.Conf(mdb.FIELD)||mdb.NAME, VALUE = can.Conf(mdb.VALUE)||mdb.VALUE
var list = {}, stats = {}, units = {}, trans = {}, index = {}; msg.Table(function(value) {
stats[value.name] = parseFloat(stats[value.name]||"0") + parseFloat(value.value)
units[value.name] = value.units, trans[value.name] = value._trans
index[value.name] = value.index, list[value.name] = value
stats[value[FIELD]] = parseFloat(stats[value[FIELD]]||"0") + parseFloat(value[VALUE])
units[value[FIELD]] = value.units, trans[value[FIELD]] = value._trans
index[value[FIELD]] = value.index, list[value[FIELD]] = value
})
function fmts(value) { var ls = []
while (value > 0) { ls.push(value%1000)

View File

@ -1,33 +1,19 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) {
can.isCmdMode() && can.sup.onimport.size(can.sup, can.page.height(), can.page.width())
can.onmotion.clear(can), can.onmotion.hidden(can, can._status), cb && cb(msg)
can.onimport._tabs(can, msg)
can.onmotion.hidden(can, can._status), cb && cb(msg), can.onimport._tabs(can, msg)
},
_tabs: function(can, msg) {
can.onappend.style(can, web.STUDIO), can.onmotion.clear(can, can._action)
_tabs: function(can, msg) { can.onappend.style(can, web.STUDIO), can.onmotion.clear(can, can._action)
var margin = html.PLUGIN_MARGIN*2
msg.Table(function(value, index) { value.nick = can.user.trans(can, value.index.split(nfs.PT).pop(), value.help)
value._select = index == 0
var target = can.onimport.item(can, value, function() {
if (value._plugin) { return can.onmotion.select(can, can._output, html.FIELDSET, value._plugin._target) }
can.onappend.plugin(can, value, function(sub) { value._plugin = sub
can.onmotion.select(can, can._output, html.FIELDSET, value._plugin._target)
sub.onexport.output = function() { sub.onimport.size(sub, can.ConfHeight()-20, can.ConfWidth()-20) }
sub.onexport.output = function() { sub.onimport.size(sub, can.ConfHeight()-margin, can.ConfWidth()-margin, false) }
target.oncontextmenu = function(event) { sub._legend.onclick(event) }, can.onmotion.hidden(can, sub._legend)
}, can._output)
}, null, can._action); index == 0 && target.click(), can.onappend.style(can, "cmds", target)
})
can.onappend._action(can, null, null, null, true)
},
_full: function(can, msg) {
can.ui = can.onappend.layout(can), can.page.style(can, can.ui.content, html.PADDING, 10)
msg.Table(function(value, index) { value.nick = value.help||value.name.split(" ")[0]
var target = can.onimport.item(can, value, function(event) {
if (can.onmotion.cache(can, function() { return value.index }, can.ui.content)) { return }
can.onappend.plugin(can, value, function(sub) {
sub.onexport.output = function() { sub.onimport.size(sub, can.ConfHeight()-20, can.ConfWidth()-can.ui.project.offsetWidth-20) }
}, can.ui.content)
}, function() {}); index == 0 && target.click()
}, null, can._action); can.onappend.style(can, "cmds", target)
})
},
layout: function(can) { can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()) },
})

View File

@ -0,0 +1,9 @@
fieldset.studiolayout>div.output>div.layout>div.display>fieldset.story>form.option>div.item.delete { display:none; }
fieldset.studiolayout>div.output>div.layout>div.layout>div.content>fieldset.story>form.option>div.item.delete { display:none; }
fieldset.studiolayout>div.output>div.layout>div.layout>div.profile>fieldset.story>form.option>div.item.delete { display:none; }
fieldset.studiolayout>div.output>div.layout>div.layout>div.profile>fieldset.story>form.option>div.item.sess { display:none; }
fieldset.studiolayout>div.output>div.layout>div.layout>div.content>fieldset.story>form.option>div.item.sess { display:none; }
fieldset.studiolayout>div.output>div.layout>div.display>fieldset.story>form.option>div.item.sess { display:none; }
fieldset.studiolayout>div.output>div.layout>div.display>fieldset.story>div.action>div.item.full.state { display:none; }
fieldset.studiolayout>div.output>div.layout>div.layout>div.profile>fieldset.story>div.action>div.item.full.state { display:none; }
fieldset.studiolayout>div.output>div.layout>div.layout>div.content>fieldset.story>div.action>div.item.full.state { display:none; }

View File

@ -0,0 +1,19 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.project(can, msg, aaa.SESS, function(event, sess, value) { return {
profile: {index: "web.code.redis.configs", args: sess, style: html.OUTPUT},
display: {index: "web.code.redis.shells", args: sess, style: html.OUTPUT},
content: {index: "web.code.redis.keys", args: sess},
} })
},
project: function(can, msg, key, cb) { can.ui = can.onappend.layout(can), can.onappend.style(can, "studiolayout")
msg.Table(function(value) { var hash = value[key]; value._hash = hash, value._title = hash
can.onimport.item(can, value, function(event, value, show, target) { if (value._tabs) { return value._tabs.click() }
var msg = can.request(event), list = cb(event, hash, value)
can.core.List("content,display,profile".split(","), function(field) {
list[field] && can.core.List("index,args,style,_init".split(","), function(key) { msg.Push(key, list[field][key]||"") })
}), can.onimport.tabsCache(can, value, target, msg)
})
})
},
}, [""])

View File

@ -2,7 +2,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) {
can.page.requireDraw(can, function() { can.base.isFunc(cb) && cb(msg)
can.Conf(html.VIEW) && can.Action(html.VIEW, can.Conf(html.VIEW))
can.onmotion.toggle(can, can._option, !can.user.isMobile)
can.onmotion.toggle(can, can._action, false)
can.onmotion.toggle(can, can._action, can.page.tagis(document.body, "body.width6"))
can.db.data = msg.Table(), can.onimport.layout(can)
})
},

81
plugin/story/weight.js Normal file
View File

@ -0,0 +1,81 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, cb) { can.ui = can.onappend.layout(can)
can.page.requireDraw(can, function() { can.db.delay = 50, can.onappend.style(can, "pie"), can.onaction.list = []
can.list = can.onimport._data(can, msg, can.Conf(mdb.FIELD)||msg.append[1]||mdb.VALUE)
can.core.List(can.list, function(item) { msg.Push("weight", item.value.weight = parseInt(item.span*100/360)+"%").Push(cli.COLOR, '<span style="background-color:'+item.color+'"> </span>') })
can.onappend.table(can, msg, null, can.ui.profile), can.page.Select(can, can.ui.profile, html.TR, function(tr, index) { can.ui.table = tr.parentNode
can.page.Modify(can, tr, {onmouseenter: function(event) { can._draw(can.db.which = index-1) }})
}), can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.append)
})
},
_data: function(can, msg, field) { var list = []
var color = [
"#8085e9",
"#95a2ff",
"#73abf5",
"#3cb9fc",
"#0082fc",
"#87e885",
"#90ed7d",
"#22ed7c",
"#05f8d6",
"#cb9bff",
"#bf19ff",
"#f47a75",
"#fa8080",
"#f7a35c",
"#ffc076",
"#f9e264",
"#fae768",
"#5f45ff",
"#02cdff",
"#0090ff",
"#854cff",
"#09b0d3",
"#1d27c9",
"#765005",
"#314976",
"#009db2",
"#024b51",
"#0780cf",
]
var total = 0; msg.Table(function(value) { total += can.onimport._parseInt(can, value[field]) })
var begin = 0; msg[cli.COLOR] = [], msg["weight"] = [], msg.Table(function(value, index) {
list.push({span: can.onimport._parseInt(can, value[field])/total*360, color: color[index%color.length], value: value})
}); return list
},
_draw: function(can, x, y, r, margin, which) { if (which == can._last) { return } can._last = which
if (can.list.length == 1) { return can.onimport.draw(can, {shape: svg.CIRCLE, points: [{x: x, y: y}, {x: x, y: y+r}], style: {fill: cli.BLUE}}) }
function pos(x, y, r, angle) { angle -= 90; return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] }
function pie(x, y, r, begin, span, color, title, cb) { can.onimport.draw(can, {shape: svg.PATH, style: kit.Dict(
svg.STROKE, color, svg.FILL, color, "d", can.base.joins([
["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"]
], lex.SP, mdb.FS),
), onmouseenter: function(event) { can.base.isFunc(cb) && cb(event) } }) }
can.onmotion.clear(can, can.ui.svg), can.ui.svg.Value(mdb.COUNT, 0)
var begin = 0; can.core.Next(can.list, function(item, next, index) { var p = index==which? pos(x, y, 1*margin, begin+item.span/2): [x, y]
if (item.value.name == "rest") { return can.onmotion.delay(can, next, can.db.delay) }
pie(p[0], p[1], r, begin, item.span, item.color, item.name||item.command, function(event) { can.onimport._draw(can, x, y, r, margin, can.db.which = index) }), begin += item.span
index == which && (can.db.current = item.value)
can.onmotion.select(can, can.ui.table, html.TR, index), can.Status(item.value), can.onmotion.delay(can, next, can.db.delay)
}, function() {
can.onmotion.select(can, can.ui.table, html.TR, which), can.Status(can.db.current), can.db.delay = 0
})
},
_parseInt: function(can, value) { value = value.toLowerCase()
if (can.base.endWith(value, "m")) { return parseInt(value)*1000000 }
if (can.base.endWith(value, "g")) { return parseInt(value)*1000000000 }
if (can.base.endWith(value, "gi")) { return parseInt(value)*1000000000 }
if (can.base.endWith(value, "mi")) { return parseInt(value)*1000000 }
return parseInt(value)
},
layout: function(can) { if (!can.ui || !can.ui.svg) { return }
can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.display), can.onmotion.toggle(can, can.ui.profile, true)
var _width = can.base.Max(can.ConfWidth()-can.ConfHeight(), 600, 200)
can.page.style(can, can.ui.profile, html.HEIGHT, can.ConfHeight(), html.WIDTH, _width, html.FLEX, "0 0 "+(_width)+"px")
var width = can.ConfWidth()-_width, height = can.ConfHeight()-4, margin = 40, r = can.base.Max(height, width)/2-1*margin-margin
can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, width)
can.ui.svg.Val(html.WIDTH, width), can.ui.svg.Val(html.HEIGHT, height)
can._draw = function(which) { can.onimport._draw(can, width/2-margin/2, height/2-margin/2, r, margin, which) }, can._draw(can.db.which||-1)
},
})

View File

@ -1,50 +1,78 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
can.onmotion.clear(can, target), can.onappend.style(can, can.Conf(ctx.STYLE))
if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { can.onappend.style(can, html.OUTPUT) }
if (can.Mode() == html.ZONE) { return can.onimport._vimer_zone(can, msg, target) }
Volcanos(chat.ONIMPORT, {
_init: function(can, msg, target, cb) {
if (can.Mode() == html.ZONE) { return can.onimport._vimer_zone(can, msg, target), cb && cb(msg) }
if (msg.index && msg.meta && msg.list) { return cb && cb(msg), can.sup.onimport._field(can.sup, msg) }
can.page.ClassList.del(can, can._fields, html.FORM), can.page.ClassList.del(can, can._fields, html.OUTPUT)
if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { can.page.ClassList.add(can, can._fields, html.FORM), can.onappend.style(can, html.OUTPUT) }
var cbs = can.onimport[can.Conf(ctx.STYLE)||msg.Option(ctx.STYLE)]; if (can.base.isFunc(cbs)) {
can.onappend.style(can, can._args[ctx.STYLE], target), can.core.CallFunc(cbs, {can: can, msg: msg, target: target})
} else {
can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can, target)
} cb && cb(msg)
},
card: function(can, msg, target, filter) { target = target||can.ui.content||can._output
can.page.Append(can, target, msg.Table(function(value) { if (filter && filter(value)) { return }
var img = can.misc.ResourceIcons(can, value.icon = value.icons||value.icon||value.image)
return {view: [[html.ITEM, value.type, value.status, "s-"+value.name]], list: [
{view: [wiki.TITLE, html.DIV], list: [
img && {className: can.base.contains(img, ".jpg")? "jpg": "", img: img},
{view: wiki.TITLE, list: [{text: value.name}, value.exists == "true" && {text: ["●", "", "exists"]}, can.onappend.label(can, value)]},
]}, {view: [wiki.CONTENT, html.DIV, value.text]},
{view: html.ACTION, inner: value.action, _init: function(target) { can.onappend.mores(can, target, value, html.CARD_BUTTON)
can.page.Select(can, target, html.INPUT, function(target) { can.onappend.style(can, target.name, target) })
}},
]}
})), can.onimport.layout = can.onimport.layout||function() {
var height = can.onlayout.expand(can, target); can.sup.onexport.outputMargin = function() { return height }
can.onmotion.delay(can, function() { can.onlayout.expand(can, target) })
}
},
card: function(can, msg, target) { target = target||can.ui.content||can._output
var list = msg.Table(function(value) { value.icon = value.icons||value.icon||value.image
var img = can.misc.Resource(can, value.icon, value.type == web.MASTER? "": value.name)
if (img.indexOf("/require/") == 0 && value.origin) { img = value.origin + img }
return {view: [[html.ITEM, value.type, value.status]], list: [
{view: [wiki.TITLE, html.DIV], list: [
value.icon && {img: img}, {view: wiki.TITLE, list: [{text: value.name}, can.onappend.label(can, value)]},
]}, {view: [wiki.CONTENT, html.DIV, value.text]},
{view: html.ACTION, inner: value.action, _init: function(target) { can.onappend.mores(can, target, value, html.CARD_BUTTON) }},
]}
})
can.onimport.layout = can.onimport.layout||function() { var height = can.onlayout.expand(can, target); can.sup.onexport.outputMargin = function() { return height } }
can.page.Append(can, target, list), can.onmotion.orderShow(can, target)
},
_vimer_zone: function(can, msg, target) { msg.Table(function(value) { var action = can.page.parseAction(can, value)
can.onimport.item(can, {type: value.type, status: value.status, icon: can.misc.Resource(can, value.icon||value.icons||value.avatar_url), name: can.page.Color(value[can.Conf(mdb.FIELD)||mdb.VIEW]||value[mdb.NAME]||value[mdb.TEXT]||value[mdb.TYPE]), title: value[mdb.TEXT]||value.description}, function(event) {
can.sup.onexport.record(can, value.name, mdb.NAME, value, event)
}, function() { return shy(action, function(event, button, meta, carte) { can.misc.Event(event, can, function(msg) { carte.close()
can.sup.onexport.action(can, button, value) || can.run(event, [ctx.ACTION, button], function(msg) { can.sup.onimport._process(can.sup, msg) || can.Update() })
}, value) }) })
icon: function(can, msg, target, cb) { msg.Table(function(value) {
var icon = can.misc.Resource(can, value.icons||value.icon||can.page.drawText(can, value.name, 80), value.space||msg.Option(ice.MSG_USERPOD), msg.Option(ice.MSG_USERWEB))
return can.page.Append(can, target, [{view: [[html.ITEM, value.status]], list: [{view: html.ICON, list: [{img: icon}]}, {view: [mdb.NAME, "", value.name]}], _init: function(target) {
cb && cb(target, value)
}, onclick: function(event) { can.sup.onexport.record(can.sup, value.name, mdb.NAME, value) }}])._target
}) },
_zone: function(can, zone, index, cb, field) { zone._delay_init = function() { can.onimport.plug(can, can.base.isObject(index)? index: {index: index, style: html.OUTPUT, mode: mdb.ZONE, field: field}, function(sub) {
sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, {mode: mdb.ZONE}), index.index||index, cmds, cb) }
zone._icon(kit.Dict(
web.REFRESH, function(event) { sub.Update(event) },
mdb.CREATE, function(event) { sub.Update(event, [ctx.ACTION, mdb.CREATE]) },
"=", function() { can.onimport.tabview(can, "", [sub.ConfIndex()].concat(sub.Conf(ctx.ARGS)).join(","), ctx.INDEX) },
))
var action = can.core.List(sub.Conf(ctx.INPUTS), function(item) { if (item.type == html.BUTTON && [ice.LIST, ice.BACK].indexOf(item.name) == -1) { return item.name } })
sub.onexport.output = function(_sub, msg) {
zone._total(msg.Length()), cb(sub, msg)
zone._menu = shy({_trans: sub._trans}, action.concat(can.base.Obj(msg.Option(ice.MSG_ACTION), [])), function(event, button, meta, carte) {
sub.Update(event, [ctx.ACTION, button]), carte.close()
}), can.user.toastSuccess(can)
_icon: function(can, name, button, target) {
var _icon = can.page.icons(can, name) || (can.page.unicode[name] && {text: [can.page.unicode[name]||name, html.SPAN, [html.ICON, name]]})
if (!_icon) { return }
_icon.onclick = function(event) { can.base.isFunc(button)? button(event, button): can.onaction[button](event, can, button), can.onkeymap.prevent(event) }
can.page.Append(can, target, [_icon])
},
_vimer_zone: function(can, msg, target) { msg.Table(function(value) { value._select = value.name == can.Conf("_select")
can.onimport.item(can, value, function(event) { can.sup.onexport.record(can, value.name, mdb.NAME, value, event, event.currentTarget||event.target) })
}) },
_zone_icon: function(can, msg, zone, cb) {
var action = can.core.List(can.Conf(ctx.INPUTS), function(item) { if (item.type == html.BUTTON && [ice.LIST, ice.BACK].indexOf(item.name) == -1) { return item.name } })
var _menu = shy({}, action.concat(can.base.Obj(msg.Option(ice.MSG_ACTION), [])), function(event, button, meta, carte) {
cb? cb(event, button): can.Update(event, [ctx.ACTION, button]), carte.close() })
if (_menu.list.length == 0) {
zone._icon(kit.Dict(web.REFRESH, function(event) { zone.refresh() }))
return
}
zone._icon(kit.Dict(web.REFRESH, function(event) { zone.refresh() }, "menu", function() { can.user.carte(event, can, _menu.meta, _menu.list, _menu) }))
},
_zone: function(can, zone, index, field, hash) { zone._delay_init = function() { can.onimport.plug(can, can.base.isObject(index)? index: {
index: index, style: html.OUTPUT, mode: mdb.ZONE, field: field, _select: hash[2] == zone.name? hash[1]: "",
}, function(sub) { sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, {mode: mdb.ZONE}), index.index||index, cmds, cb) }
sub.onexport.output = function(_sub, msg) { can.onimport._zone_icon(sub, msg, zone), zone._total(msg.Length())
sub.onimport.size(sub, zone._target.offsetHeight, zone._target.offsetWidth, false), can.page.style(can, sub._output, html.MAX_HEIGHT, "", html.HEIGHT, "")
can.user.toastSuccess(can)
}, can.ui.zone[zone.name].refresh = function() { sub.Update() }
sub.onimport._field = function(msg) {
msg.Table(function(value) { var pod = msg.Option(ice.MSG_USERPOD), cmd = value._command||value.index, args = can.base.Obj(value.args, [])
can.onimport.tabview(can, "", cmd == chat.IFRAME && args.length > 0? args[0]: "/s/"+pod+"/c/"+cmd, web.SPACE, function(msg) {
can.page.SelectOne(can, msg._tab, html.SPAN, function(target) { can.page.Modify(can, target, value.title||can.core.Keys(pod, cmd)) })
})
})
}
sub.onimport._open = function(msg, arg) { can.onimport.tabview(can, "", arg, web.SPACE, function(msg) {}) }
sub.onexport.record = function(sub, value, key, item, event, target) { can.onimport.tabview(can, "", value, zone.name, function(msg) {
can.onappend.style(can, [item.type, item.status], msg._tab)
msg._item = target
}) }
}, zone._target) } },
zone: function(can, list, target) {
zone: function(can, list, target) { target = target||can.ui.project
return can.page.Append(can, target, can.core.List(list, function(zone) { can.base.isString(zone) && (zone = {name: zone}); if (!zone) { return }
zone._layout = function() { var height = target.offsetHeight, count = 0
can.page.SelectChild(can, target, "", function(target) {
@ -60,14 +88,14 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
}
return {view: [[html.ZONE, zone.name]], list: [
{view: html.ITEM, list: [{text: can.user.trans(can, zone.name)}], _init: function(target) { zone._legend = target }, onclick: function() {
if (zone._delay_init) { zone._delay_init(zone._target, zone), delete(zone._delay_init) } zone.toggle(), zone._toggle && zone._toggle()
if (zone._delay_init) { zone._delay_init(zone._target, zone), delete(zone._delay_init) } zone.toggle(), zone._toggle && zone._toggle(zone)
}, oncontextmenu: function(event) { var menu = zone._menu
menu? can.user.carteRight(event, can, menu.meta, menu.list||can.core.Item(menu.meta), can.base.isFunc(menu)? menu: function(event, button, meta, carte) {
can.runAction(event, button), carte.close()
}): can.onmotion.clearCarte(can)
}},
{view: html.ACTION, _init: function(target) { var value; zone._action = target
can.onappend._action(can, [{icon: icon.SEARCH, type: html.TEXT, name: mdb.SEARCH, _init: function(target) { zone._search = target }, onkeyup: function(event) { value = event.target.value
can.onappend._action(can, [{type: html.TEXT, name: mdb.SEARCH, icon: icon.SEARCH, _init: function(target) { zone._search = target }, onkeyup: function(event) { value = event.target.value
can.page.Select(can, zone._target, html.DIV_EXPAND, function(target) { can.page.ClassList.set(can, target, cli.OPEN, value != "") })
can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, value != "") })
can.onmotion.delayOnce(can, function() { value && can.onkeymap.selectItems(event, can, zone._target) }, value.length<3? 500: 150)
@ -85,122 +113,155 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
]}
}))
},
_icon: function(can, name, button, target) { can.page.Append(can, target, [{text: [can.page.unicode[name]||name, html.SPAN, [html.ICON, name]], onclick: function(event) {
can.base.isFunc(button)? button(event, button): can.onaction[button](event, can, button), can.onkeymap.prevent(event)
}}]) },
icon: function(can, msg, target, cb) {
msg.Table(function(value) {
var icon = can.misc.Resource(can, value.icon||can.page.drawText(can, value.name, 80), value.space||can.ConfSpace())
return can.page.Append(can, target, [{view: [[html.ITEM, value.status]], list: [{view: html.ICON, list: [{img: icon}]}, {view: [mdb.NAME, "", value.name]}], _init: function(target) {
cb && cb(target, value)
}, onclick: function(event) { can.sup.onexport.record(can.sup, value.name, mdb.NAME, value) }}])._target
})
can.onmotion.orderShow(can, target)
_icons: function(can, item) { var icon = item.icons||item.icon||item.image
return icon && (can.base.contains(icon, ice.HTTP, ".ico", ".png", ".jpg")? {img: can.misc.Resource(can, icon)}: {icon: icon})
},
tree: function(can, list, field, split, cb, target, node) { node = node||{"": target}
can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return }
_nick: function(can, item) {
if (can.base.isArray(item.nick)) { return item.nick }
if (can.base.isObject(item.nick)) { return item.nick }
return {text: [item.nick||item.name||item.zone||item.sess, "", html.NAME], className: html.NAME}
},
_menu: function(event, can, item, cbs, target) { target = target||event.currentTarget
if (can.base.isFunc(cbs)) { var menu = cbs(event, item, target); if (menu) { return can.user.carteRight(event, can, menu.meta, menu.list, menu) } }
can.user.carteItem(event, can, item)
},
_item: function(can, item, cb, cbs) {
item._hash = item._hash||item.sess||item.hash||item.zone||item.path||item.name
item._hash && item._hash.replaceAll && (item._hash = item._hash.replaceAll(":", "_"))
item._title = item._title||item.name||item.path||item.zone||item.hash
item._select == undefined && can.db.hash[0] && (item._select = can.db.hash[0] == item._hash)
if (typeof item._hash == code.OBJECT) { item._select = true
for (var i = 0; i < item._hash.length; i++) {
if (item._hash[i] != can.db.hash[i]) { item._select = false; break }
}
}
return {view: [[html.ITEM, item.type, item.role, item.status]], title: item.title||item.nick, list: [
can.onimport._icons(can, item),
].concat(can.onimport._nick(can, item), item._label||[], [
(item.action||cbs) && {icon: "bi bi-three-dots", onclick: function(event) { can.onimport._menu(event, can, item, cbs) }},
]), _init: function(target) { target._item = item, item._item = target, can.ui[item.path] = target
item._select && can.onmotion.delay(can, function() { target.click() })
}, onclick: function(event) {
if (cb(event)) { return }
can.db.value = item, can.onexport.hash(can, item._hash)
item.__title? can.user.title(item.__title): can.onexport.title(can, item._title)
}, oncontextmenu: function(event) {
can.onimport._menu(event, can, item, cbs)
}}
},
item: function(can, item, cb, cbs, _target) {
return can.page.Append(can, _target||can.ui.project||can._output, [can.onimport._item(can, item, function(event) { var target = event.currentTarget
can.onmotion.select(can, target.parentNode, html.DIV_ITEM, target)
can.onengine.signal(can, "onproject", can.request(event, {type: "item", query: can.page.getquery(can, can._fields)+","+item.path}))
var show = target._list && can.onmotion.toggle(can, target._list); if (show === false) { return true }
return cb(event, item, show, target)
}, cbs)])._target
},
_itemselect: function(can, target) {
can.page.Select(can, can.ui.project, html.DIV_ITEM, function(target) { can.page.ClassList.del(can, target, html.SELECT) })
for (var p = target; p; p = p.parentNode.previousElementSibling) { can.page.ClassList.add(can, p, html.SELECT), can.onmotion.toggle(can, p.nextSibling, true) }
},
itemlist: function(can, list, cb, cbs, target) { if (!list || list.length == 0) { return }
if (!target) { return can.core.List(list, function(value) { can.onimport.item(can, value, cb, cbs) }) }
if (!target._list) { target._list = can.page.insertBefore(can, [html.LIST], target.nextSibling, target.parentNode) }
return can.page.Append(can, target._list, can.core.List(list, function(item) {
return can.onimport._item(can, item, function(event) { var target = event.currentTarget
if (target._list && target._list.childElementCount > 0 && target._list && can.onmotion.toggle(can, target._list) == false) { return true }
if (cb && cb(event, item, target._list && true, target)) { return }
can.onimport._itemselect(can, target)
}, cbs)
})), target._list
},
tree: function(can, list, cb, cbs, target, node, field, split) { node = node||{"": target||can.ui.project||can._output}, field = field||nfs.PATH, split = split||nfs.PS
can.core.List(list, function(item) { var key = item[field]; key && can.core.List(key.split(split), function(value, index, array) { if (!value) { return }
var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split); if (node[name]) { return }
last && node[last] && can.page.Select(can, node[last].previousSibling, "div.expand", function(target) { target.innerHTML == "" && (target.innerHTML = can.page.unicode.closes) })
item.expand = item.expand||item._select||(can.db.hash && (can.db.hash[0] == key))
item._hash = item._hash||item.hash||item.zone||item.path||item.name
item._title = item._title||item.name||item.path||item.path||item.hash
var ui = can.page.Append(can, node[last], [{view: html.ITEM, list: [
{view: [[html.EXPAND, item.expand? cli.OPEN: ""], html.DIV, (index==array.length-1? "": can.page.unicode.closes)]},
{view: [mdb.NAME, html.DIV, value], _init: item._init},
], onclick: function(event) {
if (node[name].childElementCount == 2) { node[name].firstChild.click() }
index < array.length - 1? can.page.ClassList.set(can, ui[html.EXPAND], cli.OPEN, !can.page.ClassList.neg(can, node[name], html.HIDE)): can.base.isFunc(cb) && cb(event, item)
}, oncontextmenu: function(event) { if (!item._menu) { return }
var menu = item._menu; can.user.carteRight(event, can, menu.meta, menu.list, menu)
}}, {view: [[html.LIST, item.expand? "": html.HIDE]]}]); node[name] = ui.list
{view: [[html.EXPAND], html.DIV, (index==array.length-1? "": can.page.unicode.closes)]},
{view: [mdb.NAME], list: [{text: [value, "", html.NAME]}].concat(item._label||[])},
item.action && {view: [mdb.ICON], list: [{icon: "bi bi-three-dots", onclick: function(event) { can.onimport._menu(event, can, item, cbs) }}]},
], onclick: function(event) { var target = event.currentTarget
if (index < array.length-1 && !can.page.ClassList.set(can, ui[html.EXPAND], cli.OPEN, !can.page.ClassList.neg(can, node[name], html.HIDE))) { return }
can.db.value = item, can.onexport.hash(can, item._hash), can.onexport.title(can, item._title)
can.onimport._itemselect(can, target), can.base.isFunc(cb) && cb(event, item, ui.item)
node[key] && can.page.ClassList.add(can, node[key].previousSibling, html.SELECT)
if (node[name].childElementCount == 2) { can.onmotion.delay(can, function() { node[name].firstChild.click() }) }
}, oncontextmenu: function(event) {
can.onimport._menu(event, can, item, cbs)
}, _init: item._init}, {view: [[html.LIST, html.HIDE]]}]); node[name] = ui.list, item.expand && ui.item.click()
}) }); return node
},
filter: function(can, target) {
return can.onappend.input(can, {icon: icon.SEARCH, type: html.TEXT, name: web.FILTER, placeholder: "search in n items", onkeydown: function() {}, onkeyup: function(event) {
if (event.key == code.ENTER) {
can.page.Select(can, target, html.DIV_ITEM+":not(.hide)", function(target) { target.click() })
} else if (event.key == code.ESCAPE) { event.currentTarget.value = "", event.currentTarget.blur()
can.page.Select(can, target, html.DIV_ITEM, function(target) { can.onmotion.toggle(can, target, true) })
} else { if (can.onkeymap.selectCtrlN(event, can, target, html.DIV_ITEM+":not(.filter):not(.hide)")) { return }
can.page.Select(can, target, html.DIV_ITEM, function(target) {
can.onmotion.toggle(can, target, target.innerText.indexOf(event.currentTarget.value) > -1 || target == event.currentTarget.parentNode)
})
}
}}, "", target)
},
item: function(can, item, cb, cbs, target) { target = target||(can.ui && can.ui.project? can.ui.project: can._output)
function oncontextmenu(event) {
if (can.base.isFunc(cbs)) { var menu = cbs(event, ui._target); if (menu) { can.user.carteRight(event, can, menu.meta, menu.list, menu) } return }
can.user.carteItem(event, can, item)
}
var icon = item.icon||item.icons
var ui = can.page.Append(can, target, [{view: [[html.ITEM, item.type, item.status]], list: [
icon && (can.base.contains(icon, ice.HTTP, ".png", ".jpg")? {img: can.misc.Resource(can, icon)}: {icon: icon}),
{text: item.nick||item.name||item.zone}], title: item.title, onclick: function(event) {
can.onmotion.select(can, target, html.DIV_ITEM, event.currentTarget)
cb(event, event.currentTarget, event.currentTarget._list && can.onmotion.toggle(can, event.currentTarget._list))
// can.user.isMobile && oncontextmenu(event)
}, oncontextmenu: oncontextmenu,
}]); return ui._target
},
itemlist: function(can, list, cb, cbs, target) {
return target._list = can.page.insertBefore(can, [{view: html.LIST, list: can.core.List(list, function(item) {
return {view: [html.ITEM, html.DIV, item.nick||item.name], onclick: function(event) {
cb(event, item, event.target._list && can.page.ClassList.neg(can, event.target._list, html.HIDE))
}, oncontextmenu: function(event) { if (can.base.isFunc(cbs)) { var menu = cbs(event, ui._target); if (menu) { can.user.carteRight(event, can, menu.meta, menu.list, menu) } } }}
}) }], target.nextSibling, target.parentNode)
},
list: function(can, root, cb, target, cbs) { target = target||can._output
can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [[html.ITEM, "open"]], list: [{text: item.meta.name}, item.list && {icon: icon.CHEVRON_DOWN}], onclick: function(event) {
can.page.ClassList.set(can, ui.item, "open", can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list))
can.onmotion.select(can, target, html.DIV_ITEM, event.target)
}, _init: function(target) { if (item.meta.name == "_") { target.innerHTML = "", can.onappend.style(can, html.SPACE, target) }
cbs && cbs(target, item)
}}, {view: html.LIST}]); can.onimport.list(can, item, cb, ui.list, cbs) })
},
tabs: function(can, list, cb, cbs, action) { action = action||can._action; return can.page.Append(can, action, can.core.List(list, function(tabs) {
if (typeof tabs == code.STRING) { tabs = {name: tabs} }
tabs: function(can, list, cb, cbs, action) { action = action||can.ui.tabs||can._action; return can.page.Append(can, action, can.core.List(list, function(tabs) { if (typeof tabs == code.STRING) { tabs = {name: tabs} }
function close(target) {
if (can.page.ClassList.has(can, target, html.SELECT)) {
var next = target.nextSibling||target.previousSibling; if (!next) { return } next.click()
} cbs && cbs(tabs), can.page.Remove(can, target)
can.onexport.tabs(can)
var next = can.page.tagis(target.nextSibling, html.DIV_TABS)? target.nextSibling: can.page.tagis(target.previousSibling, html.DIV_TABS)? target.previousSibling: null
if (!next) { return true } next && next.click()
} can.page.Remove(can, target), can.onexport.tabs && can.onexport.tabs(can)
}
return {view: html.TABS, title: tabs.title||tabs.text, list: [{text: [tabs.nick||tabs.name, html.SPAN, mdb.NAME]}, {icon: mdb.DELETE, onclick: function(event) {
close(tabs._target), can.onkeymap.prevent(event)
}}], onclick: function(event) {
return {view: [[html.TABS, tabs.type, tabs.role, tabs.status]], title: tabs.title||tabs.text, list: [].concat(
can.onimport._icons(can, tabs), can.onimport._nick(can, tabs), {icon: mdb.DELETE, onclick: function(event) { tabs._target._close(), can.onkeymap.prevent(event) }}
), onclick: function(event) {
can.onmotion.delay(can, function() { can.onmotion.scrollIntoView(can, tabs._target) })
if (can.page.ClassList.has(can, tabs._target, html.SELECT)) { return }
can.onmotion.select(can, action, html.DIV_TABS, tabs._target), can.base.isFunc(cb) && cb(event, tabs)
}, _init: function(target) { var menu = tabs._menu||shy(function(event, button) { can.Update(event, [ctx.ACTION, button]) })
target._item = tabs, tabs._target = target, target._close = function() { close(target) }
var _action = can.page.parseAction(can, tabs)
can.page.Modify(can, target, {draggable: true, _close: function() { close(target) },
ondragstart: function(event) { action._drop = function(before) {
before.parentNode == action && action.insertBefore(target, before)
can.onexport.tabs(can)
} },
}, oncontextmenu: function(event) { var target = tabs._target, _action = can.page.parseAction(can, tabs)
var menu = tabs._menu||shy(function(event, button) { can.Update(event, [ctx.ACTION, button]) })
can.user.carte(event, can, kit.Dict(
"Close", function(event) { target._close() },
"Close Other", function(event) { target.click(), can.page.SelectChild(can, action, html.DIV_TABS, function(target) { target == tabs._target || target._close() }) },
"Rename Tabs", function(event) { can.user.input(event, can, [mdb.NAME], function(list) {
can.page.SelectOne(can, target, html.SPAN, function(target) { can.page.Modify(can, target, list[0]||tabs.name) })
}) }, menu.meta
), ["Close", "Close Other", "Rename Tabs", ""].concat(can.base.getValid(menu.list, can.core.Item(menu.meta)), _action), function(event, button, meta) {
(meta[button]||menu)(can.request(event, tabs), button, meta)
})
}, _init: function(target) {
action == can._action && can.page.Select(can, can._action, "div.item._space.state", function(space) { can.page.insertBefore(can, target, space) })
target._item = tabs, tabs._target = target, target._close = function() { close(target) || cbs && cbs(tabs) }, target.click()
can.page.Modify(can, target, {draggable: true,
ondragstart: function(event) { action._drop = function(before) { before.parentNode == action && action.insertBefore(target, before), can.onexport.tabs(can) } },
ondragover: function(event) { event.preventDefault(), action._drop(event.target) },
oncontextmenu: function(event) { can.user.carte(event, can, kit.Dict(
"Close", function(event) { close(target) },
"Close Other", function(event) { can.page.SelectChild(can, action, html.DIV_TABS, function(target) { target == tabs._target || close(target) }) },
"Rename Tabs", function(event) { can.user.input(event, can, [mdb.NAME], function(list) {
can.page.Select(can, target, html.SPAN_NAME, function(target) { can.page.Modify(can, target, list[0]||tabs.name) })
can.onexport.tabs(can)
}) }, menu.meta,
), ["Close", "Close Other", "Rename Tabs", ""].concat(can.base.getValid(menu.list, can.core.Item(menu.meta)), _action), function(event, button, meta) {
(meta[button]||menu)(can.request(event, tabs), button, meta)
}) },
}), target.click()
})
}}
}))._target },
tool: function(can, list, cb, target, status) { target = target||can._output, status = status||can._status
var height = can.base.Max(html.PLUG_HEIGHT, can.ConfHeight()-2*html.ACTION_HEIGHT, 240), width = can.base.Max(html.PLUG_WIDTH, can.ConfWidth()-(can.user.isMobile? 0: html.PROJECT_WIDTH))
tabsCache: function(can, value, target, cb) { if (value._tabs) { return value._tabs.click() }
value._tabs = can.onimport.tabs(can, [value], function() { can.page.isSelect(target) || can.onmotion.delay(can, function() { target.click() })
can.page.SelectOne(can, can._status, html.LEGEND) || can.onmotion.cache(can, function() { return value._hash }, can._status)
if (can.onmotion.cache(can, function() { return value._hash }, can.ui.content, can.ui.profile, can.ui.display)) { return can.onimport.layout(can) }
can.Status(value); if (can.base.isFunc(cb)) { return cb() } var msg = cb
if (msg.Append(ctx.INDEX)) { msg.Table(function(value, index) {
index == 0 && can.onappend.plugin(can, value, function(sub) { can.db.value._content_plugin = sub, can.onimport.layout(can) }, can.ui.content)
index == 1 && can.onappend.plugin(can, value, function(sub) {
can.onmotion.toggle(can, can.ui.display, true)
can.db.value._display_plugin = sub, can.onimport.layout(can)
}, can.ui.display)
index == 2 && can.onappend.plugin(can, value, function(sub) {
can.onmotion.toggle(can, can.ui.profile, true)
can.db.value._profile_plugin = sub, can.onimport.layout(can)
}, can.ui.profile)
can.onmotion.delay(can, function() { can.onimport.layout(can) })
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 100)
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 300)
}) } else { can.onappend.table(can, msg), can.onappend.board(can, msg) }
}, function() { delete(value._tabs), can.onmotion.cacheClear(can, value._hash, can.ui.content, can.ui.profile, can.ui.display) })
},
tool: function(can, list, cb, target, status) { target = target||can._status, status = status||can._status
var height = can.base.Max(html.PLUG_HEIGHT, can.ConfHeight()-3*html.ACTION_HEIGHT, 240), width = can.base.Max(html.PLUG_WIDTH, can.ConfWidth()-(can.user.isMobile? 0: html.PROJECT_WIDTH))
can.core.Next(list.reverse(), function(meta, next) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT
can.onimport.plug(can, meta, function(sub) {
sub.onexport.output = function() { can.page.style(can, sub._output, html.MAX_HEIGHT, "", html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, "")
sub.onexport.output = function() {
can.page.style(can, sub._output, html.MAX_HEIGHT, "", html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, "")
sub.onimport.size(sub, height, width, false), can.onmotion.delay(can, function() { sub.onimport.size(sub, height, width, false) })
}, sub.onimport.size(sub, height, width, false)
can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}
can.page.Append(can, sub._legend,[{text: [can.page.unicode.remove, "", mdb.REMOVE], onclick: function(event) {
can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend), can.onexport.tool(can), can.onkeymap.prevent(event)
}}])
}}]), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}
status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) {
if (can.page.SelectOne(can, status, nfs.PT+html.SELECT, function(target) { can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
if (can.page.SelectOne(can, status, "legend.select", function(target) {
can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true)
can.onmotion.select(can, target, html.FIELDSET_PLUG, sub._target)
sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
@ -208,7 +269,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
}) }, sub._delay_init = true, sub.select = function(show) {
if (show && can.page.ClassList.has(can, sub._legend, html.SELECT)) { return sub }
return sub._legend.click(), sub
}
}, can.onmotion.hidden(can, sub._target)
sub.hidden = function() { can.onmotion.hidden(can, sub._target), can.page.ClassList.del(can, sub._legend, html.SELECT) }
sub.onaction._close = function() { can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend), can.onexport.tool(can) }
sub.onaction.close = function() { sub.select() }, can.base.isFunc(cb) && cb(sub), can.onexport.tool(can)
@ -218,47 +279,264 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
},
plug: function(can, meta, cb, target, field) { if (!meta || !meta.index) { return }
meta.type = meta.type||html.PLUG, meta.name = meta.index, can.onappend.plugin(can, meta, function(sub) { sub.sup = can
sub.run = function(event, cmds, cb) {
if (can.page.Select(can, sub._option, "input[name=path]").length > 0 && sub.Option(nfs.PATH) == "") { sub.request(event, {path: nfs.PWD}) }
can.runActionCommand(can.request(event, can.Option(), {space: meta.space}), meta.index, cmds, cb)
}, sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub)
sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub)
}, target, field)
},
_float: function(can, index, args) { args = args||[]
can.user.isMobile? can.user.jumps(can.misc.MergePodCmd(can, {cmd: index+"/"+args.join("/")})): can.onappend._float(can, index, args)
},
myOption: function(can) { var sub = can.sub; if (!sub) { return } var plugin = sub._stacks_current[0]; current = plugin.current||{}
if (plugin == sub._stacks_root) { var PLACE_UID = can.core.Item(can.Option())[0]
if (sub._stacks_current.length == 1) {
plugin.sub.onexport.hash(plugin.sub, can.Option(PLACE_UID))
} else {
plugin.sub.onexport.hash(plugin.sub, can.Option(PLACE_UID), can.ConfIndex(), can.Option(UID))
}
}
sub._stacks_root.onexport.title(sub._stacks_root, current._name, can.ConfHelp(),
can._msg.Option("_share_title")||(can._msg && can._msg.IsDetail()? can._msg.Append(html.TITLE)||can._msg.Append(mdb.NAME)||(can._msg.Append(UID)||"").slice(0, 6): "")
// ||can.user.info.titles
)
can.user.agent.init(can,
can._msg.Option("_share_content")||(can._msg && can._msg.IsDetail()? can._msg.Append(html.CONTENT)||can._msg.Append(mdb.INFO)||"": "")||current.city_name+" "+current._street,
can._msg.Option("_share_icons")||(can.Conf(mdb.ICONS)? can.misc.Resource(can, can.Conf(mdb.ICONS)): can.user.info.nodetype == web.WORKER? can.misc.Resource(can, can.user.info.favicon, can.user.info.nodename): ""),
)
},
myField: function(can, sub) {
sub.onexport._output = function(_sub) {
_sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root
can.core.Item(can.onimport, function(key, value) { _sub.onimport[key] = _sub.onimport[key]||value })
can.core.Item(can.onaction, function(key, value) { _sub.onaction[key] = _sub.onaction[key]||value })
can.core.Item(can.onexport, function(key, value) { _sub.onexport[key] = _sub.onexport[key]||value })
}
},
myPluginSelect: function(can, sub, _output) {
can.page.SelectChild(can, _output, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sub._target) })
can.page.SelectChild(can, sub._output, "*", function(target) { can.onmotion.toggle(can, target, true) })
can.page.style(can, sub._action, html.DISPLAY, html.NONE)
can.user.isMobile? sub.onimport.size(sub, window.innerHeight, window.innerWidth, false): sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
can.onimport.myOption(sub)
},
myPlugin: function(can, value, cb) {
var key = [value.space||can.ConfSpace(), value.index||can.ConfIndex()].concat(value.args||"").join(",")
var sup = can._stacks_root; sup._stacks = sup._stacks||{}; var sub = (sup._stacks[key]||[])[0]; if (sub) { return sub._select() }
var _output = sup._target.parentNode; value.height = sup.ConfHeight(), value.width = sup.ConfWidth()
value.style = html.OUTPUT
sup.onappend.plugin(can._root.Action, value, function(sub) { can.onimport.myField(can, sub)
sub.misc.localStorage(sub, [sub.ConfSpace(), sub.ConfIndex(), mdb.HASH].join(","), "")
sub.onexport.output = function(_sub, msg) { _sub._stacks_current = sup._stacks[key] = [sub], _sub._stacks_root = sup, sub._select() }
sub._select = function() { can.onimport.myPluginSelect(can, sub, _output) }, sub._select(), cb && cb(sub)
}, _output)
},
myStory: function(can, value) { var ACTION_HEIGHT = 48
if (!can._stacks_current) { var sup = can.sup; can._stacks_root = sup, sup._stacks = {}
var key = [can.ConfSpace(), can.ConfIndex()].concat(can.base.trim(can.core.Item(can.Option(), function(key, value) { return value }))).join(",")
can._stacks_current = sup._stacks[key] = [can.sup]
sup._select = function() { can.onimport.myPluginSelect(can, sup, sup._target.parentNode) }
} var plugin = can._stacks_current[0], _action = plugin._action, _output = plugin._output; current = plugin.current||{}
value.index == "web.team.renzhengshouquan.profile" && (ACTION_HEIGHT = 0)
value.index.split(".").pop() == "credit" && (ACTION_HEIGHT = 0)
value.type = html.STORY, value.style = html.OUTPUT, value.height = (can.user.isMobile? window.innerHeight: can.ConfHeight())-ACTION_HEIGHT
can.onappend.plugin(can, value, function(sub) { can._stacks_current.push(sub)
can.core.List(["_trans", "_style", "_icons", "_trans.input", "_trans.value"], function(key) {
var value = sub.Conf(key); value && can.core.Item(can.Conf(key), function(k, v) { value[k] = value[k]||v })
})
var STREET_NAME = plugin.sub.Conf("_street_name"), PLACE_NAME = plugin.sub.Conf("_place_name")
var run = sub.run; sub.run = function(event, cmds, cb) {
run(sub.request(event, {
city_name: current[CITY_NAME], street_name: current[STREET_NAME], place_name: current[PLACE_NAME],
dashboard_uid: current["dashboard_uid"], storage_uid: current["storage_uid"],
command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(),
}, can.base.Obj(sub.Conf("field.option"))), cmds, cb)
}
can.onimport.myField(can, sub), can.onmotion.slideIn(sub)
sub.onexport.output = function(_sub, msg) {
sub._select(), msg.Option(ice.MSG_ACTION) && can.onappend._action(sub, msg.Option(ice.MSG_ACTION), _action, null, true)
sub.sub.onaction._goback = goback
}
sub.onimport._field = function(msg) { var sup = sub; can.onmotion.clear(can, sub._output)
msg.Table(function(value) { value.style = html.OUTPUT
can.onappend.plugin(can, value, function(sub) { can.onimport.myField(can, sub)
sub.onexport.output = function(_sub, msg) { can.onimport.myOption(sub)
can.user.isMobile && sub.onimport.size(sub, window.innerHeight-ACTION_HEIGHT, window.innerWidth, false)
}
var run = sub.run; sub.run = function(event, cmds, cb) {
run(sub.request(event, {
city_name: current[CITY_NAME], street_name: current[STREET_NAME], place_name: current[PLACE_NAME],
dashboard_uid: current["dashboard_uid"], storage_uid: current["storage_uid"],
command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(),
}, can.base.Obj(sub.Conf("field.option")), sup.Option()), cmds, cb)
}
}, sub._output)
})
}
function goback(event, cb) { if (can._stacks_current.length == 1) { return cb && cb()}
if (sub._history.length > 1) { sub.request(event, {_toast: "reload"}); return sub.onimport.back(event, sub), cb && cb() }
var _last = can._stacks_current.pop()
can.onmotion.slideOut(_last, function() { var last = can._stacks_current[can._stacks_current.length-1]; last._select()
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
last.request(event, {_toast: "reload"})
if (last.ConfIndex().split(".").pop() == "message") { last.Update(event) }
can._stacks_current.length == 1 && last._output.innerHTML == "" && last.Update(event)
cb && cb()
})
}
function reload(event) {
sub.Update(sub.request(event, {_toast: "reload"}))
}
sub._select = function() { can.onimport.myOption(sub)
can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, target == sub._target) })
var list = [can.page.button(can, can.user.trans(can, "goback", "返回"), function(event) { goback(event) }), can.page.button(can, can.user.trans(can, "reload", "刷新"), function(event) { reload(event) })]
can.page.Appends(can, _action, list), can.page.style(can, _action, html.DISPLAY, html.BLOCK)
can.user.isMobile && sub.onimport.size(sub, window.innerHeight-ACTION_HEIGHT, window.innerWidth, false)
}, sub._select()
}, _output)
},
myTabs: function(can, key, list, target) { var last = can.misc.Cookie(can, key)
if (!target && !can.ui.tabs) { can.ui = can.page.Append(can, can._output, [html.TABS, html.LIST]) } target = target||can.ui.tabs
can.page.Append(can, target, can.core.List(list, function(value) {
return {text: [can.user.trans(can, value, "", "value."+key), "", [value, value == "all" && last == "" || value == last? html.SELECT: ""]], onclick: function(event) {
can.onmotion.select(can, target, "*", event.target), can.misc.Cookie(can, key, value == "all"? "": value), can.Update()
}}
}))
},
myView: function(can, msg, cb, cbs, target) {
can.onimport.itemcards(can, msg, cb, cbs, target||can.ui.list)
},
itemcards: function(can, msg, cb, cbs, target) { target = target||can.ui.list||can._output
if (msg.IsDetail()) { var value = msg.TableDetail(); msg.Show(can)
can.page.Select(can, target, html.TR, function(target) {
target.className.indexOf("_uid") > -1 && can.page.ClassList.add(can, target, "hide")
})
} else {
can.page.Append(can, target, msg.Table(function(value) {
return can.onimport.itemcard(can, value, cb(value), cbs)
})), msg.Result() && can.onappend.board(can, msg), can.onappend.style(can, msg.Option(ctx.STYLE))
}
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
var style = can.Conf("_style."+target.name); style && can.page.ClassList.add(can, target, style)
})
can.onimport.shareTitle(can, msg)
},
itemcard: function(can, value, list, cb) { if (!list) { return }
can.core.List(list, function(item) { if (!item || !item.list) { return }
for (var i = 0; i < item.list.length; i++) { if (item.list[i] && typeof item.list[i] == code.STRING) { item.list[i] = {text: item.list[i]} } }
})
cb = cb|| function(event) { var done = false
if (can.onaction.carddetail && can.onaction.carddetail(event, can, value)) { return }
if (value.uid) { return can.Option(UID, value.uid), can.Update() }
can.core.Item(can.Option(), function(k, v) {
if (!done && !v) { done = true, can.Option(k, value[k]), can.Update() }
})
}
return {view: [[html.ITEM_CARD, value._uid? "uid-"+value._uid: ""].concat(value._style||[])], list: [
{view: html.ACTION, _init: function(target) { can.page.appendAction(can, value, target)
can.user.isMobile && can.page.Select(can, target, "input.notice", function(target) { can.page.Remove(can, target) })
}},
{view: html.OUTPUT, list: [
{img: can.misc.ResourceIcons(can, value.icons||value.icon||value.avatar||
value.auth_avatar||value.command_icon||value.service_icon||value.user_avatar||can.Conf(mdb.ICONS), value.nodename,
), onclick: function(event) { can.onkeymap.prevent(event)
can.onaction.updateAvatar && can.onaction.updateAvatar(event, can)
}},
{view: html.CONTAINER, list: list},
], _init: function(target) {
value.action && can.onmotion.slideAction(can, target)
}},
], onclick: function(event) { cb && cb(event, value)
can.onmotion.select(can, event.currentTarget.parentNode, html.DIV_ITEM, event.currentTarget)
}}
},
textView: function(can, value, key, type) {
key || can.core.Item(value, function(k, v) { if (k == "status" || can.base.endWith(k, "_status")) { key = k } }); if (!type) { type = key.split("_").pop() }
return value[key] && !can.base.isIn(value[key], "finish", "done") && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]}
},
authView: function(can, value) { return can.base.isIn(value.auth_status, "issued", "2") && {view: [aaa.AUTH, html.SPAN], list: [{icon: "bi bi-patch-check-fill", style: {color: "var(--notice-bg-color)"}}]} },
timeView: function(can, value, key) {
if (key) { return {text: [can.user.trans(can, key, null, html.INPUT)+": "+can.base.TimeTrim(value[key]), "", mdb.TIME]} }
return {text: [can.base.TimeTrim(value[key]||value.browse_time||value.updated_at||value.created_at||value.time), "", mdb.TIME]}
},
unitView: function(can, value, key, unit) { if (!value[key]) { return }
return {text: [[can.user.trans(can, key, null, html.INPUT)+":", value[key]].concat(unit? [unit]: []).join(" "), "", key]}
},
typeStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" },
roleStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" },
shareTitle: function(can, msg, title, content, icons) { if (msg.IsDetail()) { var value = msg.TableDetail()
msg.Option("_share_title", msg.Option("_share_title")||(value[title]||value.title||value.name||value.uid).slice(0, 6))
msg.Option("_share_content", msg.Option("_share_content")||value[content]||value.content||value.info)
msg.Option("_share_icons", msg.Option("_share_icons")||value[icons]||value.icons||value.avatar)
} },
titleAction: function(can, value, filter) { var filter = can.core.List(arguments).slice(2)
return {view: html.ACTION, _init: function(target) {
if (value.Option) { return can.onappend._action(can, value.Option(ice.MSG_ACTION), target) }
can.page.appendAction(can, value, target)
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
target.value = can.user.trans(can, target.name)
if (filter.length > 0) {
filter.indexOf(target.name) == -1 && can.page.Remove(can, target)
} else {
can.page.tagis(target, "input.notice") || can.page.Remove(can, target)
}
})
}}
},
})
Volcanos(chat.ONLAYOUT, {
_init: function(can, height, width) {
can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width})
can.page.SelectChild(can, can._output, html.TABLE, function(table) {
(can.isCmdMode() || table.offsetWidth > can.ConfWidth() / 2) && can.onappend.style(can, "full", table)
})
},
_init: function(can, height, width) { can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width}) },
zone: function(can, height, width) { can.onlayout._init(can, height, width) },
result: function(can, height, width) { can.onlayout._init(can, height, width) },
simple: function(can, height, width) { can.onlayout._init(can, height, width) },
output: function(can, height, width) { can.onlayout._init(can, height, width) },
float: function(can, height, width) { can.onlayout._init(can, height, width) },
full: function(can, height, width) { can.onlayout._init(can, height, width) },
cmd: function(can, height, width) { can.onlayout._init(can, height, width)
can.page.style(can, can._output, html.MAX_HEIGHT, height||can.ConfHeight()||window.innerHeight-2*html.ACTION_HEIGHT)
can.page.style(can, can._output, html.MAX_WIDTH, width||can.ConfWidth()||window.innerWidth)
},
cmd: function(can, height, width) { can.onlayout._init(can, height, width) },
})
Volcanos(chat.ONEXPORT, {
title: function(can, title) { can.sup.onexport.title(can, title) },
title: function(can, title) { can.sup.onexport.title.apply(can.sup.onexport, [can.sup].concat(can.core.List(arguments).slice(1))) },
action_value: function(can, key, def) { var value = can.Action(key); return can.base.isIn(value, ice.AUTO, key, undefined)? def: value },
tabs: function(can) {},
tool: function(can) { can.misc.sessionStorage(can, [can.ConfIndex(), "tool"], JSON.stringify(can.page.Select(can, can._status, html.LEGEND, function(target) { return target._meta }))) },
hash: function(can, hash) { hash = typeof hash == code.STRING? hash.split(":").concat(can.core.List(arguments).slice(2)||[]): hash || can.core.Item(can.Option(), function(key, value) { return value||"" })
return can.sup.onexport.hash(can.sup, hash)
},
session: function(can, key, value) { return can.sup.onexport.session(can.sup, key, value) },
storage: function(can, key, value) { return can.sup.onexport.storage(can.sup, key, value) },
table: function(can) { var msg = can._msg; if (msg.Length() == 0) { return } var res = [msg.append && msg.append.join(mdb.FS)]
msg.Table(function(line, index, array) { res.push(can.core.Item(line, function(key, value) { return value }).join(ice.FS)) })
return res.join(lex.NL)
},
board: function(can) { var msg = can._msg; return msg.Result() },
session: function(can, key, value) { return can.misc[can.user.isWebview? "localStorage": "sessionStorage"](can, [can.Conf(ctx.INDEX), key, location.pathname].join(":"), value == ""? "": JSON.stringify(value)) },
action_value: function(can, key, def) { var value = can.Action(key); return can.base.isIn(value, ice.AUTO, key, undefined)? def: value },
tool: function(can) { can.misc.sessionStorage(can, [can.ConfIndex(), "tool"], JSON.stringify(can.page.Select(can, can._status, html.LEGEND, function(target) { return target._meta }))) },
tabs: function(can) {},
})
Volcanos(chat.ONACTION, {
onkeydown: function(event, can) {
if (event.ctrlKey && "0" <= event.key && event.key <= "9") { return can.onkeymap.ctrln(event, can) }
can._keylist = can.onkeymap._parse(event, can, mdb.PLUGIN, can._keylist||[], can._output)
if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs||can._action, html.DIV_TABS)) { return }
can.onkeymap._parse(event, can)
},
onslidemove: function(event, can, data, direction) {
// can.user.toast(can, [direction, data.spanX, data.spanY].join(","))
},
onslideright: function(event, can, data, direction) {
can.onaction._goback && can.onaction._goback(event)
},
onslideleft: function(event, can, data, direction) {
return
var button = can.base.Obj(can._msg.Option("_action"), [])[0]; if (!button) { return }
can.run({}, [ctx.ACTION, button].concat(can.base.trim(can.core.Item(can.Option(), function(key, value) { return value }))))
},
onslidedown: function(event, can, data, direction) {
return
var target = can.ui.list||can.ui.output||can._output
if (target.scrollTop == 0) {
can.Update(can.request(event, {_toast: "reload"}))
}
},
onslideup: function(event, can, data, direction) {
return
var target = can.ui.list||can._output
if (target.offsetHeight+target.scrollTop == target.scrollHeight) {
can.Update(can.request(event, {_toast: "reload"}))
}
},
})
Volcanos(chat.ONKEYMAP, {
@ -288,3 +566,18 @@ Volcanos(chat.ONKEYMAP, {
},
}, _engine: {},
})
Volcanos(chat.ONINPUTS, {
_nameicon: function(event, can, msg, target, name, title) { name = name||mdb.NAME
can.page.Appends(can, can._output, msg.Table(function(value) {
var _title = can.user.trans(can.sup, value[title]||value[name]||value[mdb.NAME], null, "value."+name)
var icons = can.sup.Conf("_trans.value."+name+".icons."+value[name])||can.sup.Conf("_trans.value."+name+".icons."+value[title])||value.icons||"usr/icons/icebergs.png"
return {view: html.ITEM, list: [{img: can.misc.Resource(can, icons), },
{view: html.CONTAINER, list: [{view: [html.TITLE, "", _title]},
can.onappend.label(can, value, kit.Dict("version", icon.version, "time", icon.compile, name, icon.data)),
]},
], onclick: function(event) { can.showIcons(value[name]||value[mdb.NAME], icons, _title) }}
}))
},
dream: function(event, can, msg, target, name) { can.sup.sub.oninputs._nameicon(event, can, msg, target, name) },
})

View File

@ -1,8 +1,8 @@
function shy(help, meta, list, cb) { var arg = arguments, i = 0; function next(type) {
if (type == code.OBJECT) { if (typeof arg[i] == code.OBJECT && arg[i].length == undefined) { return arg[i++] }
} else if (type == code.ARRAY) { if (typeof arg[i] == code.OBJECT && arg[i].length != undefined) { return arg[i++] }
} else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] }
} return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb
if (type == code.OBJECT) { if (typeof arg[i] == code.OBJECT && arg[i].length == undefined) { return arg[i++] }
} else if (type == code.ARRAY) { if (typeof arg[i] == code.OBJECT && arg[i].length != undefined) { return arg[i++] }
} else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] }
} return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb
}; var _can_name = "", _can_path = ""
var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {}, cache: {}, pack: {}, args: {}}, function(name, can, libs, cb) {
var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == code.OBJECT) {
@ -13,7 +13,8 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
cb = can||function(can) { can.require([can.frame], function() { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) }, function(can, key, sub) { can[key] = sub }) }
can = Config, can._follow = name, can._target = Config.target||meta.target, can._height = Config.height||meta._height, can._width = Config.width||meta._width, _can_name = ""
}
can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name, _load: function(name, cbs) { var cache = meta.cache[name]||[]
can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name,
_load: function(name, cbs) { var cache = meta.cache[name]||[]
for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub), sub._path = sub._path||name } meta.cache[name] = cache
cache.forEach(function(sub) { var name = sub._name
if (typeof cbs == code.FUNCTION && cbs(can, name, sub)) { return }
@ -28,15 +29,20 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
}
if (libs[0] == undefined) { return can.require(libs.slice(1), cb, cbs) }
if (libs[0] == "") { libs[0] = can._path.replace(nfs._JS, nfs._CSS) }
if (libs[0].indexOf(nfs.SRC) == 0 || libs[0].indexOf(nfs.USR) == 0) { libs[0] = "/require/"+libs[0] }
if (libs[0].indexOf(nfs.SRC) == 0 || libs[0].indexOf(nfs.USR) == 0) { libs[0] = nfs.P+libs[0] }
if (libs[0][0] != nfs.PS && libs[0].indexOf(web.HTTP) != 0) { libs[0] = can._path.slice(0, can._path.lastIndexOf(ice.PS)+1)+libs[0] }
var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0].split(ice.QS)[0]).toLowerCase()
// var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0].split(ice.QS)[0]).toLowerCase()
// var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0]).toLowerCase()
var name = libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0]
if (name.indexOf("pod=") == -1) { name = name.toLowerCase() }
function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) }
if (name.indexOf("/lib/") == 0) { name = "/volcanos"+name }
if (name.indexOf("/panel/") == 0) { name = "/volcanos"+name }
if (name.indexOf("/plugin/") == 0) { name = "/volcanos"+name }
if (name.indexOf("/lib/") == 0) { name = "/v"+name }
if (name.indexOf("/panel/") == 0) { name = "/v"+name }
if (name.indexOf("/plugin/") == 0) { name = "/v"+name }
if (name.indexOf("/volcanos/") == 0 && meta.volcano) { name = meta.volcano+name }
if (name.indexOf("/require/") == 0 && meta.iceberg) { name = meta.iceberg+name }
if (name.indexOf("/p/") == 0 && meta.iceberg) { name = meta.iceberg+name }
if (name.indexOf("/v/") == 0 && meta.iceberg) { name = meta.iceberg+name }
meta.cache[name]? next(): meta._load(name, next)
},
request: function(event) { event = event||{}, event = event._event||event
@ -44,6 +50,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
function set(key, value) {
if (key == "_method") { return msg._method = value }
if (key == "action" && value.indexOf("<input") == 0) { return }
if (key == "extra") { return }
if (typeof value == code.FUNCTION) { return msg[key] = value }
value == "" || msg.Option(key) || msg.Option(key, value)
}
@ -58,19 +65,20 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
can.core.List(arguments, function(item, index) { if (!item || index == 0) { return } can.core.Item(item, set) }); return msg
},
requestPodCmd: function(event) { return can.request(event, {pod: can.ConfSpace(), index: can.ConfIndex()}) },
requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? button+lex.SP+ice.PROCESS: ""}) },
requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? can.user.trans(can, button): ""}) },
runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf()
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]})
if (can.base.isFunc(meta.feature[cmds[1]])) { return meta.feature[cmds[1]](can, msg, cmds.slice(2)) }
return can.user.input(event, can, meta.feature[cmds[1]], function(args) { can.Update(can.request(event, {_handle: ice.TRUE}, can.Option()), cmds.slice(0, 2).concat(args)) })
} can.runAction(event, cmds[1], cmds.slice(2), cb, true)
},
runActionCommand: function(event, index, args, cb) { can.request(event)._caller()
can.runAction(event, ctx.RUN, [index].concat(args), cb, true)
runActionCommand: function(event, index, args, cb) {
var msg = can.request(event, {_handle: ice.TRUE}); can.request(event)._caller()
can.run(event, [ctx.ACTION, ctx.RUN].concat(index, args||[]), cb, true)
},
runAction: function(event, action, args, cb, silent) {
can.request(event, {_handle: ice.TRUE}, can.Option())._caller()
can.run(event, [ctx.ACTION].concat(action, args), cb, silent)
var msg = can.request(event, {_handle: ice.TRUE}); can.request(event, can.Option())._caller()
can.run(event, [ctx.ACTION].concat(action, args||[]), cb, silent)
},
search: function(event, cmds, cb) {
if (cmds && typeof cmds == code.OBJECT && cmds.length > 0 && typeof cmds[0] == code.OBJECT && cmds[0].length > 0 ) { cmds[0] = cmds[0].join(nfs.PT) }
@ -106,10 +114,12 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
isAutoMode: function() { return can.Mode() == "" },
Mode: function(value) { return can.Conf(ice.MODE, value) },
ConfDefault: function(value) { can.core.Item(value, function(k, v) { can.Conf(k) || can.Conf(k, v) }) },
ConfSpace: function() { return can.Conf(web.SPACE)||can.Conf("_space")||"" },
ConfIndex: function() { return can.Conf("_command")||can.Conf(ctx.INDEX)||can.Conf("_index") },
ConfSpace: function(space) { if (space) { can.Conf(web.SPACE, space) } return can.Conf("_space")||can.Conf(web.SPACE)||can.Conf("pod")||"" },
ConfIndex: function(index) { if (index) { can.Conf(ctx.INDEX, index) } return can.Conf("_command")||can.Conf(ctx.INDEX)||can.Conf("_index")||"can" },
ConfIcons: function() { return can.Conf(mdb.ICONS) },
ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) },
ConfWidth: function(value) { return can.Conf(html.WIDTH, value) },
ConfWidth: function(value) { return can.Conf(html.WIDTH, value)||can._output.offsetWidth },
ConfHelp: function() { return can.Conf("help") },
Conf: function(key, value) { var res = can._conf
for (var i = 0; i < arguments.length; i += 2) {
if (typeof key == code.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue }
@ -127,7 +137,7 @@ try { if (typeof(window) == code.OBJECT) { var meta = Volcanos.meta
meta.version = window._version, window.outerWidth-window.innerWidth > 100 && (meta.version = "", debug = false)
}
meta._load = function(url, cb) {
if (meta.version) { url += (url.indexOf(web.QS) == -1? web.QS: "&")+meta.version.slice(1) }
if (meta.version && url.indexOf("/p/usr/icons/") == -1) { url += (url.indexOf(web.QS) == -1? web.QS: "&")+meta.version.slice(1) }
if (meta._cache[url]) { return meta._cache[url].push(cb) } else { meta._cache[url] = [cb] }
function _cb() { meta._cache[url].forEach(function(cb) { cb() }), delete(meta._cache[url]) }
switch (url.split(web.QS)[0].split(nfs.PT).pop().toLowerCase()) {

View File

@ -1,2 +1,4 @@
all:
@echo
@date +"%Y-%m-%d %H:%M:%S"
${CTX_ROOT}/bin/ice.bin web.admin web.chat.wx.ide make

View File

@ -8,7 +8,8 @@ const misc_wx = require("utils/lib/misc-wx.js")
const page_wx = require("utils/lib/page-wx.js")
const user_wx = require("utils/lib/user-wx.js")
App({conf: conf,
App({
conf: conf,
base: base, core: core,
misc: base.Copy(misc, misc_wx),
page: base.Copy(page, page_wx),
@ -16,12 +17,9 @@ App({conf: conf,
onLaunch: function() { const info = wx.getSystemInfoSync()
switch (info.language.toLowerCase().replaceAll("_", "-")) {
case "zh-cn": base.Copy(user, require("utils/lib/zh-cn.js")); break
default: base.Copy(user, require("utils/lib/en-us.js"))
user.trans = function(can, text, list, zone) { return text }
default: base.Copy(user, require("utils/lib/en-us.js")), user.trans = function(can, text, list, zone) { return text }
}
this.conf.platform = info.platform
this.conf.brand = info.brand
this.conf.model = info.model
this.conf.platform = info.platform, this.conf.brand = info.brand, this.conf.model = info.model
this.misc.Info("app load", this.conf, info)
},
})

View File

@ -1,19 +1,52 @@
{
"pages": [
"pages/river/river",
"pages/action/action",
"pages/insert/insert"
],
"window": {
"navigationBarBackgroundColor": "@navBgColor",
"navigationBarTextStyle": "@navTxtStyle",
"backgroundColor": "@bgColor",
"backgroundTextStyle": "@bgTxtStyle",
"backgroundColorTop": "@bgColorTop",
"backgroundColorBottom": "@bgColorBottom"
},
"style": "v2",
"darkmode": true,
"themeLocation": "theme.json",
"sitemapLocation": "sitemap.json"
}
"darkmode": true,
"pages": [
"pages/action/home",
"pages/action/dream",
"pages/action/desktop",
"pages/action/my",
"pages/action/grant",
"pages/action/action",
"pages/insert/insert",
"pages/web-chat/favor"
],
"style": "v2",
"tabBar": {
"backgroundColor": "@tabBgColor",
"borderStyle": "@tabBorderStyle",
"color": "@tabFontColor",
"list": [
{
"iconPath": "@homeIcon",
"pagePath": "pages/action/home",
"text": "首页"
},
{
"iconPath": "@dreamIcon",
"pagePath": "pages/action/dream",
"text": "空间"
},
{
"iconPath": "@desktopIcon",
"pagePath": "pages/action/desktop",
"text": "桌面"
},
{
"iconPath": "@myIcon",
"pagePath": "pages/action/my",
"text": "我的"
}
],
"selectedColor": "@tabSelectedColor"
},
"themeLocation": "theme.json",
"window": {
"backgroundColor": "@bgColor",
"backgroundColorBottom": "@bgColorBottom",
"backgroundColorTop": "@bgColorTop",
"backgroundTextStyle": "@bgTxtStyle",
"enablePullDownRefresh": true,
"navigationBarBackgroundColor": "@navBgColor",
"navigationBarTextStyle": "@navTxtStyle"
}
}

View File

@ -1,7 +1,7 @@
<template name="action">
<view class="action">
<template name="header">
<view class="header">
<view class="item button" wx:for="{{action}}" wx:key="index">
<button size="mini" bindtap="onaction" data-name="{{item}}">{{item}}</button>
<button size="mini" bindtap="onButton" data-name="{{item}}">{{item}}</button>
</view>
</view>
</template>
@ -32,7 +32,7 @@
<template name="field">
<view class="page action">
<template is="action" data="{{action}}"></template>
<template is="header" data="{{action}}"></template>
<template is="debug" data="{{conf}}"></template>
<view class="output">
<view class="field {{field.index}}" wx:for="{{list}}" wx:for-index="order" wx:for-item="field" wx:key="index">

View File

@ -1,42 +1,22 @@
page {
--box-border:lightblue solid 1px;
--box-shadow:var(--body-fg-color) 2px 2px 8px;
--disable-fg-color:gray; --notice-bg-color:blue; --danger-bg-color:red;
--box-border:var(--body-bg-color) solid 1px;
--item-bg-color:white; --body-bg-color:#f6f6f6;
--item-padding:10px; --item-icons-size:48px;
--action-height:32px; --action-margin:5px;
}
@media (prefers-color-scheme: light) {
@media (prefers-color-scheme: dark) {
page {
--box-border:lightgreen solid 1px;
--notice-bg-color:lightgreen; --danger-bg-color:red;
--item-bg-color:black; --body-bg-color:#191919;
}
}
page { padding:10px; }
page, view { box-sizing: border-box; }
view.output { width:100%; overflow-x:hidden; }
view.output textarea { text-align:left; padding:10px; width:100%; }
view.output view.item { font-size:18px; text-align:center; padding:10px; border:var(--box-border); }
view.output view.list view.item { margin-left:20px; }
view.field>view.output { overflow:auto; }
view.legend { font-size:20px; font-weight:bold; font-style:italic; margin:10px 0; }
view.action view.item { padding:0; border:0; margin-right:5px; float:left; }
view.option view.item { padding:0; border:0; margin-right:5px; float:left; }
view.option view.item.textarea { border:var(--box-border); width:calc(100% - 2px); clear:both; }
view.option view.item.select { border:var(--box-border); }
view.option view.item picker { border:var(--box-border); height:30px; width:80px; }
view.option view.item input { border:var(--box-border); height:30px; width:80px; }
view.option view.item button { height:32px; }
view.output view.code { white-space:pre; border-left:cyan solid 1px; }
view.status view.item { font-size:12px; font-style:italic; padding:5px; border:none; margin:0; float:left; }
view.status view.item text.name { font-size:10px; }
view.action.submit view.item { margin-right:0; }
view.field.cli.qrcode view.option view.item input { width:70px; }
table { display:table; border-collapse:collapse; width:100%; }
table.debug { font-family:monospace; font-style:italic; }
table.debug th { font-weight:bold; }
tr { display:table-row; }
th { display:table-cell; padding:5px; vertical-align:middle; }
td { display:table-cell; padding:5px; vertical-align:middle; }
td view.which { padding:0; order:0; }
table.content th { border:var(--box-border); text-align:center; }
table.content td { border:var(--box-border); min-width:60px; }
table.content.action th:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
table.content.action td:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
page { background-color:var(--body-bg-color); }
view.item { background-color:var(--item-bg-color); }
page, view { box-sizing:border-box; }
page { padding-top:var(--action-height); height:100%; width:100%; }
view.header { border-bottom:var(--box-border); background-color:var(--item-bg-color); }
view.header { width:100%; display:flex; position:fixed; top:0; }
view.header view.item { height:var(--action-height); margin-right:var(--action-margin); }
view.header view.item button { height:var(--action-height); }
view.output { width:100%; overflow:auto; }

View File

@ -1,5 +1,102 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "清屏"]})
Volcanos(chat.ONACTION, {
list: ["刷新", "扫码", "清屏"],
"清屏": function(event, can) { can.core.List(can.ui.data.list, function(item) { delete(item.msg) }), can.page.setData(can) },
refresh: function(event, can) { can.onaction._apis = "", can.onaction._cmds = []
if (can.db.index == "web.chat.grant") {
wx.reLaunch({url: can.base.MergeURL("grant", ctx.INDEX, "web.chat.grant", web.SPACE, can.db.space, web.SERVE, can.db.serve)})
return
}
if (can.db.share) { can.onaction._apis = "/share/"+can.db.share
can.run(event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onaction._reload(can, msg)
})
} else if (can.db.river && can.db.storm) {
can.onaction._cmds = [can.db.river, can.db.storm]
can.run(event, [], function(msg) { can.onaction._reload(can, msg) })
} else {
can.run(event, [ctx.ACTION, ctx.COMMAND, can.db.index], function(msg) {
can.onaction._reload(can, msg)
})
}
},
_refresh: function(event, can, order) { can.page.setData(can)
can.onaction.onAction({}, can, ice.LIST, {order: order, name: ice.LIST})
},
_reload: function(can, msg) {
can.ui.data.list = can.misc.ParseCmd(can, msg, function(field, order) {
can.onaction._refresh({}, can, order)
}, function(input, index, field, order) {
if (can.db.cmd||can.db.index) { input.value = input.value||can.db[input.name] }
}), can.page.setData(can), can.user.toast(can, "加载成功")
},
onInputs: function(event, can, button, data) { var order = data.order, index = data.index
var input = can.ui.data.list[order||0].inputs[index||0]
input.value = event.detail.value
},
onChange: function(event, can, button, data) { var order = data.order, index = data.index
var input = can.ui.data.list[order||0].inputs[index||0]
input.value = input.values[parseInt(event.detail.value)]
can.onaction._refresh(event, can, order)
},
onAction: function(event, can, button, data) { var order = data.order, name = data.name
var field = can.ui.data.list[order||0], msg = can.request(event)
if (field.feature[name]) { if (can.base.isIn(name, mdb.CREATE, mdb.INSERT)) { msg._method = http.PUT }
return can.data.insert = {field: field, name: name, list: field.feature[name], cb: function(res) {
can.run(event, can.base.Simple([field.id||field.index, ctx.ACTION, name], res), function(msg) {
can.onaction._refresh(event, can, order)
})
}}, can.user.jumps(chat.PAGES_INSERT)
} field._history = field._history||[]
switch (name) {
case ice.BACK: field._history.pop(); var ls = field._history.pop()||[], i = 0
can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { input.value = ls[i++]||"" } })
can.onaction._refresh(event, can, order); break
case ctx.RUN: break
case ice.LIST:
case web.REFRESH: msg._method = http.GET; break
default: msg.Option(ctx.ACTION, name)
}
var cmd = can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { return input.value } })
for (var i = cmd.length-1; i > 0; i--) { if (cmd[i] === "") { cmd.pop() } else { break } }
function eq(to, from) { if (!to) { return false } if (to.length != from.length) { return false }
for (var i = 0; i < to.length; i++) { if (to[i] != from[i]) { return false } } return true
} eq(field._history[field._history.length-1], cmd) || field._history.push(cmd)
can.run(event, [field.id||field.index].concat(cmd), function(msg) { can.onimport._init && can.onimport._init(can, msg)
msg._head = can.core.List(msg.append, function(item) { return can.user.trans(can, item, field, html.INPUT) })
can.core.Item(msg._view, function(key, value) { can.core.List(value, function(value) { can.core.List(value, function(input, i) {
if (input.type == html.BUTTON) { input.value = can.user.trans(can, input.value||input.name, field) }
if (input._type == html.TEXT) { input._text = can.user.trans(can, input._text, field, html.VALUE) }
}) }) })
msg._status = can.core.List(can.base.Obj(msg.Option(ice.MSG_STATUS)), function(item) { return item })
msg._action = can.core.List(can.base.Obj(msg.Option(ice.MSG_ACTION)), function(item) {
if (typeof item == code.STRING) { return {type: html.BUTTON, name: item, value: can.user.trans(can, item)} }
return item.value = can.user.trans(can, item.value||item.name), item
}), field.msg = msg, can.page.setData(can)
})
},
onDetail: function(event, can, button, data) { var order = data.order, name = data.name, value = data.value, input = data.input
var field = can.ui.data.list[order||0]
if (input && input.type == html.BUTTON) { var msg = can.request(event, field.msg.Table()[data.index])
if (can.base.isIn(name, mdb.REMOVE, mdb.DELETE)) { msg._method = http.DELETE }
var _input = {}; can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { _input[input.name] = input.value } }), can.request(event, _input)
if (field.feature[input.name]) {
can.onAction(event, can, input.name, {order: order, name: input.name})
} else {
can.run(event, [field.id||field.index, ctx.ACTION, input.name], function(msg) {
switch (msg.Option(ice.MSG_PROCESS)) {
case "_location":
can.user.parse(can, msg.Option("_arg"))
}
can.onaction._refresh(event, can, order)
})
} return
}
can.core.List(field.inputs, function(input) {
if (input.name == name) { input.value = value, can.onaction._refresh(event, can, order) }
})
},
})
Volcanos._init()

View File

@ -0,0 +1,30 @@
view.output textarea { text-align:left; padding:10px; width:100%; }
view.output view.item { font-size:18px; text-align:center; padding:10px; }
view.output view.list view.item { margin-left:20px; }
view.field>view.output { overflow:auto; }
view.legend { font-size:20px; font-weight:bold; font-style:italic; margin:10px 0; }
view.action view.item { padding:0; border:0; margin-right:5px; float:left; }
view.option view.item { padding:0; border:0; margin-right:5px; float:left; }
view.option view.item.textarea { border:var(--box-border); width:calc(100% - 2px); clear:both; }
view.option view.item.select { border:var(--box-border); }
view.option view.item picker { border:var(--box-border); height:30px; width:80px; }
view.option view.item input { border:var(--box-border); height:30px; width:80px; }
view.option view.item button { height:32px; }
view.output view.code { white-space:pre; border-left:cyan solid 1px; }
view.status view.item { font-size:12px; font-style:italic; padding:5px; border:none; margin:0; float:left; }
view.status view.item text.name { font-size:10px; }
view.action.submit view.item { margin-right:0; }
view.field.cli.qrcode view.option view.item input { width:70px; }
table { display:table; border-collapse:collapse; width:100%; }
table.debug { font-family:monospace; font-style:italic; }
table.debug th { font-weight:bold; }
tr { display:table-row; }
th { display:table-cell; padding:5px; vertical-align:middle; }
td { display:table-cell; padding:5px; vertical-align:middle; }
td view.which { padding:0; order:0; }
table.content th { border:var(--box-border); text-align:center; }
table.content td { border:var(--box-border); min-width:60px; }
table.content.action th:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }
table.content.action td:last-child { position:sticky; right:2px; text-align:center; min-width:60px; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,9 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONACTION, {
onSelect: function(event, can, button, data) {
can.user.jumps(can.base.MergeURL("action", ctx.INDEX, data.item.index, web.SPACE, data.item.space, web.SERVE, can.db.serve))
},
})
Volcanos._init()

View File

@ -0,0 +1,8 @@
<import src="../../app.wxml"/>
<template is="header" data="{{action}}"></template>
<view class="output">
<view class="item" wx:for="{{list}}" wx:key="name" bindtap="onSelect" data-name="{{item.name}}" data-item="{{item}}">
<image class="icon" src="{{item.icon}}"/>
<text class="name">{{item.name}}</text>
</view>
</view>

View File

@ -0,0 +1,3 @@
view.output>view.item { width:25%; padding:10px 0; display:flex; flex-direction:column; align-items:center; float:left; }
view.output>view.item image.icon { height:64px; width:64px; }
view.output>view.item text.name { white-space:pre; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -0,0 +1,9 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONACTION, {
onSelect: function(event, can, button, data) {
can.user.switchTab(can, "desktop")
},
})
Volcanos._init()

View File

@ -0,0 +1,17 @@
<import src="../../app.wxml"/>
<template is="header" data="{{action}}"></template>
<view class="output">
<view class="item {{item.type}}" wx:for="{{list}}" wx:key="name" bindtap="onSelect" data-name="{{item.name}}" data-item="{{item}}">
<image class="icons" src="{{item.icons}}"/>
<view class="info">
<view class="title">
<text class="name">{{item.name}}</text>
<text class="tags restart" wx:if="{{item.restart}}">{{item.restart}}</text>
<text class="tags access" wx:if="{{item.access}}">{{item.access}}</text>
<text class="tags {{item.type}}">{{item.type}}</text>
</view>
<view class="label">{{item.module}}</view>
<view class="label">{{item.time}} {{item.version}}</view>
</view>
</view>
</view>

View File

@ -0,0 +1,11 @@
view.output>view.item { border-bottom:var(--box-border); padding:var(--item-padding); display:flex; }
view.output>view.item image.icons { height:var(--item-icons-size); width:var(--item-icons-size); margin-right:var(--item-padding); }
view.output>view.item view.info { text-align:left; flex-grow:1; }
view.output>view.item view.info text.name { font-size:18px; }
view.output>view.item view.info text.tags { font-size:12px; padding:0 5px; margin-left:5px; }
view.output>view.item view.info text.tags.restart { border:var(--notice-bg-color) solid 1px; color:var(--notice-bg-color); }
view.output>view.item view.info text.tags.access { border:var(--danger-bg-color) solid 1px; color:var(--danger-bg-color); }
view.output>view.item view.info text.tags.worker { display:none; }
view.output>view.item view.info text.tags.server { border:var(--notice-bg-color) solid 1px; color:var(--notice-bg-color); }
view.output>view.item view.info text.tags.origin { border:var(--danger-bg-color) solid 1px; color:var(--danger-bg-color); }
view.output>view.item view.label { color:var(--disable-fg-color); font-size:12px; }

View File

@ -0,0 +1,21 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.page.setData(can, msg.TableDetail())
},
})
Volcanos(chat.ONACTION, {
refresh: function(event, can) {
can.run(event, [can.db.space], function(msg) {
can.onimport._init(can, msg)
})
},
onConfirm: function(event, can) {
can.run(can.request(event, {space: can.db.space}), [ctx.ACTION, "confirm"], function(msg) {
can.user.switchTab(can, web.DREAM)
})
},
})
Volcanos._init()

View File

@ -0,0 +1,7 @@
<view class="output">
<view class="info">
<view>ip: {{list.ip}}</view>
<view>ua: {{list.ua}}</view>
</view>
<button type="primary" bindtap="onConfirm">请授权登录</button>
</view>

View File

@ -0,0 +1,2 @@
view.output { display:flex; flex-direction:column; justify-content:center; align-items:center; }
view.output view.info { margin:40px 0; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,24 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONIMPORT, {
_init: function(can, list) { var _list = []
can.core.List(list, function(msg) { _list = _list.concat(can.misc.table(can, msg)) }), can.page.setData(can, _list)
},
})
Volcanos(chat.ONACTION, {list: ["刷新", "扫码"],
refresh: function(event, can) { can.onaction._cmds = []
var list = [], _list = can.misc.serveList(can)
can.core.Next(_list, function(serve, next) { var msg = can.request(); msg._serve = serve.serve, msg._sessid = serve.sessid; var done = false
can.run(msg._event, [ctx.ACTION, ctx.RUN, web.SPACE, ctx.ACTION, "info"], function(msg) {
msg.Push("title", serve.serve.split("://")[1]), msg.Push("sessid", serve.sessid)
msg.Push(ctx.STYLE, msg._serve == can.db.serve? "current": "")
msg.Push(web.SERVE, msg._serve), list.push(msg), can.onimport._init(can, list), done || next(), done = true
}), can.onmotion.delay(can, function() { done || next(), done = true }, 3000)
})
},
onSelect: function(event, can, button, data) {
can.user.switchTab(can, web.DREAM, data.item, true)
},
})
Volcanos._init()

View File

@ -0,0 +1,18 @@
<import src="../../app.wxml"/>
<template is="header" data="{{action}}"></template>
<view class="output">
<view class="serve">
<view class="item {{item.style}}" wx:for="{{list}}" wx:key="name" bindtap="onSelect" data-name="{{item.name}}" data-item="{{item}}">
<image class="icons" src="{{item.icons}}"></image>
<view class="info">
<view class="title">
<text class="name">{{item.title}}</text>
<text class="tags sessid" wx:if="{{item.sessid}}">已登录</text>
<text class="tags style" wx:if="{{item.style}}">当前</text>
</view>
<view class="label">{{item.module}}</view>
<view class="label">{{item.time}} {{item.version}}</view>
</view>
</view>
</view>
</view>

View File

@ -0,0 +1,11 @@
view.output>view.serve>view.item { border-bottom:var(--box-border); padding:var(--item-padding); display:flex; }
view.output>view.serve>view.item image.icons { height:var(--item-icons-size); width:var(--item-icons-size); margin-right:var(--item-padding); }
view.output>view.serve>view.item view.title { display:flex; align-items:center; }
view.output>view.serve>view.item view.info { text-align:left; flex-grow:1; }
view.output>view.serve>view.item view.info text.name { font-size:18px; }
view.output>view.serve>view.item view.info text.tags { font-size:12px; padding:0 5px; margin-left:5px; }
view.output>view.serve>view.item view.info text.tags.sessid { border:var(--notice-bg-color) solid 1px; color:var(--notice-bg-color); }
view.output>view.serve>view.item view.info text.tags.style { border:var(--danger-bg-color) solid 1px; color:var(--danger-bg-color); }
view.output>view.serve>view.item view.label { color:var(--disable-fg-color); font-size:12px; }
view.output>view.serve>view.item.current text.name { font-weight:bold; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -0,0 +1,51 @@
const {kit, ice, ctx, mdb, web, aaa, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONIMPORT, {
_init: function(can) {
can.ui.setData({info: can.user.info, action: can.onaction.list})
},
})
Volcanos(chat.ONACTION, {list: ["扫码", "登录", "清空"],
"登录": function(event, can) {
can.onaction.onLogin(event, can)
},
"清空": function(event, can) {
can.misc.serveList(can, "")
},
refresh: function(event, can) {
can.onaction.onLogin(event, can)
},
onLogin: function(event, can) {
can.user.login(can, function() {
can.misc.POST(can, can.request(), "/chat/header/", {}, function(msg) {
can.user.info.username = msg.Option(ice.MSG_USERNAME)
can.user.info.usernick = msg.Option(aaa.USERNICK)
can.user.info.avatar = msg.Option(aaa.AVATAR)
can.misc.serveList(can, {serve: can.db.serve, username: msg.Option(ice.MSG_USERNAME), usernick: msg.Option(aaa.USERNICK), avatar: msg.Option(aaa.AVATAR)})
wx.getUserInfo({success: function(res) { var userInfo = res.userInfo
can.user.info.avatar = can.user.info.avatar||userInfo.avatarUrl
can.user.info.gender = userInfo.gender
can.user.info.city = userInfo.city
can.user.info.country = userInfo.country
can.user.info.province = userInfo.province
can.onimport._init(can), wx.stopPullDownRefresh()
}})
})
})
},
onChooseAvatar(event, can, button, data) {
can.user.info.avatar = event.detail.avatarUrl
can.onimport._init(can), can.onexport.info(can)
},
onBlur: function(event, can) {
can.user.info.usernick = event.detail.value
can.onimport._init(can), can.onexport.info(can)
},
})
Volcanos(chat.ONEXPORT, {
info: function(can) {
can.misc.POST(can, can.request(), "/chat/wx/login/action/user", can.user.info, function(msg) {})
},
})
Volcanos._init()

View File

@ -0,0 +1,22 @@
<view class="output">
<view class="user">
<view class="item">
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
<image class="avatar" src="{{info.avatar}}"></image>
</button>
<view class="title">
<view wx:if="{{info.usernick}}">
<view class="name">{{info.usernick}}</view>
</view>
<view wx:else>
<input class="weui-input" type="nickname" placeholder="请输入昵称" onblur="onBlur"/>
</view>
</view>
</view>
</view>
<view class="conf">
<view class="item" wx:for="{{action}}" bindtap="onButton" data-name="{{item}}">
<text>{{item}}</text>
</view>
</view>
</view>

View File

@ -0,0 +1,9 @@
page { padding-top:0; }
view.output>view.user>view.item { padding:20px; display:flex; }
view.output>view.user>view.item button { height:var(--item-icons-size); width:var(--item-icons-size); padding:0; margin:0; margin-right:var(--item-padding); }
view.output>view.user>view.item image { height:var(--item-icons-size); width:var(--item-icons-size); }
view.output>view.user>view.item input { text-align:left; margin:0 var(--action-margin); }
view.output>view.user>view.item view.title { flex-grow:1; }
view.output>view.user>view.item view.name { text-align:left; margin-left:var(--action-margin); }
view.output>view.conf { margin-top:20px; }
view.output>view.conf>view.item { text-align:center; padding:10px; margin-top:var(--action-margin); display:flex; justify-content:center; }

View File

@ -1,5 +1,5 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONACTION, {list: ["刷新", "扫码"],
refresh: function(event, can) {

View File

@ -1,5 +1,5 @@
const {kit, ice, ctx, mdb, web, nfs, code, chat, http, html} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONACTION, {list: ["刷新", "扫码", "登录"], _apis: nfs.CHAT_RIVER,
refresh: function(event, can) { can.run(event, [], function(msg) { msg.Dump(can), can.user.toast(can, "加载成功") }) },

View File

@ -0,0 +1,19 @@
const {
kit, ice,
ctx, mdb, web, aaa,
lex, yac, ssh, gdb,
tcp, nfs, cli, log,
code, wiki, chat, team, mall,
http, html, icon, svg
} = require("../../utils/const.js")
const {shy, Volcanos} = require("../../utils/proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
msg.Echo("hello world")
},
})
Volcanos(chat.ONACTION, {
list: ["刷新", "扫码", "清屏", "登录"],
})
Volcanos._init()

View File

@ -0,0 +1,2 @@
<import src="../../app.wxml"/>
<template is="field" data="{{action, conf, list}}"></template>

View File

@ -1,27 +1,41 @@
{
"light": {
"navBgColor": "#f6f6f6",
"homeIcon": "pages/action/home-light.png",
"dreamIcon": "pages/action/dream-light.png",
"desktopIcon": "pages/action/desktop-light.png",
"myIcon": "pages/action/my-light.png",
"navBgColor": "#ffffff",
"navTxtStyle": "black",
"bgColor": "#f6f6f6",
"bgTxtStyle": "light",
"bgColorTop": "#f6f6f6",
"bgColorBottom": "#efefef",
"bgTxtStyle": "light",
"tabBorderStyle": "black",
"tabBgColor": "#ffffff",
"tabSelectedColor": "#3cc51f",
"tabFontColor": "#000000",
"tabBorderStyle": "black"
"tabSelectedColor": "#3cc51f"
},
"dark": {
"navBgColor": "#191919",
"homeIcon": "pages/action/home-dark.png",
"dreamIcon": "pages/action/dream-dark.png",
"desktopIcon": "pages/action/desktop-dark.png",
"myIcon": "pages/action/my-dark.png",
"navBgColor": "#000000",
"navTxtStyle": "white",
"bgColor": "#191919",
"bgTxtStyle": "dark",
"bgColorTop": "#191919",
"bgColorBottom": "#1f1f1f",
"tabBgColor": "#191919",
"tabSelectedColor": "#51a937",
"bgTxtStyle": "dark",
"tabBorderStyle": "white",
"tabBgColor": "#000000",
"tabFontColor": "#ffffff",
"tabBorderStyle": "white"
"tabSelectedColor": "#51a937"
}
}

View File

@ -3,107 +3,23 @@ const {kit, ice,
lex, yac, ssh, gdb,
tcp, nfs, cli, log,
code, wiki, chat, team, mall,
http, html, icon, svg
http, html,
} = require("const.js")
const {shy, Volcanos} = require("proto.js")
const {shy, Volcanos} = require("proto-wx.js")
Volcanos._page = {}
Volcanos(chat.ONIMPORT, {})
Volcanos(chat.ONACTION, {
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.page.setData(can, can.misc.table(can, msg))
},
})
Volcanos(chat.ONACTION, {list: ["刷新", "扫码"],
"刷新": function(event, can) { can.onaction.refresh(event, can) },
"扫码": function(event, can) { can.user.agent.scanQRCode(can) },
"清屏": function(event, can) { can.core.List(can.ui.data.list, function(item) { delete(item.msg) }), can.page.setData(can) },
_refresh: function(event, can, order) { can.page.setData(can)
can.onaction.onAction({}, can, ice.LIST, {order: order, name: ice.LIST})
refresh: function(event, can) {
can.run(event, [], function(msg) { can.onimport._init(can, msg) })
},
_reload: function(can, msg) {
can.ui.data.list = can.misc.ParseCmd(can, msg, function(field, order) {
can.onaction._refresh({}, can, order)
}, function(input, index, field, order) {
if (can.db.cmd||can.db.index) { input.value = input.value||can.db[input.name] }
}), can.page.setData(can), can.user.toast(can, "加载成功")
},
refresh: function(event, can) { can.onaction._apis = "", can.onaction._cmds = []
if (can.db.share) { can.onaction._apis = "/share/"+can.db.share
can.run(event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onaction._reload(can, msg)
})
} else if (can.db.river && can.db.storm) {
can.onaction._cmds = [can.db.river, can.db.storm]
can.run(event, [], function(msg) { can.onaction._reload(can, msg) })
} else {
can.run(event, [ctx.ACTION, ctx.COMMAND, can.db.cmd||can.db.index||"cli.qrcode"], function(msg) {
can.onaction._cmds = [ctx.ACTION, ctx.RUN], can.onaction._reload(can, msg)
})
}
},
onaction: function(event, can, button, data) { var name = data.name;
onButton: function(event, can, button, data) { var name = data.name;
(can.onaction[name]||function(event) { can.run(event, [ctx.ACTION, name]) })(event, can)
},
onInputs: function(event, can, button, data) { var order = data.order, index = data.index
var input = can.ui.data.list[order||0].inputs[index||0]
input.value = event.detail.value
},
onChange: function(event, can, button, data) { var order = data.order, index = data.index
var input = can.ui.data.list[order||0].inputs[index||0]
input.value = input.values[parseInt(event.detail.value)]
can.onaction._refresh(event, can, order)
},
onAction: function(event, can, button, data) { var order = data.order, name = data.name
var field = can.ui.data.list[order||0], msg = can.request(event)
if (field.feature[name]) { if (can.base.isIn(name, mdb.CREATE, mdb.INSERT)) { msg._method = http.PUT }
return can.data.insert = {field: field, name: name, list: field.feature[name], cb: function(res) {
can.run(event, can.base.Simple([field.id||field.index, ctx.ACTION, name], res), function(msg) {
can.onaction._refresh(event, can, order)
})
}}, can.user.jumps(chat.PAGES_INSERT)
} field._history = field._history||[]
switch (name) {
case ice.BACK: field._history.pop(); var ls = field._history.pop()||[], i = 0
can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { input.value = ls[i++]||"" } })
can.onaction._refresh(event, can, order); break
case ctx.RUN: break
case ice.LIST:
case web.REFRESH: msg._method = http.GET; break
default: msg.Option(ctx.ACTION, name)
}
var cmd = can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { return input.value } })
for (var i = cmd.length-1; i > 0; i--) { if (cmd[i] === "") { cmd.pop() } else { break } }
function eq(to, from) { if (!to) { return false } if (to.length != from.length) { return false }
for (var i = 0; i < to.length; i++) { if (to[i] != from[i]) { return false } } return true
} eq(field._history[field._history.length-1], cmd) || field._history.push(cmd)
can.run(event, [field.id||field.index].concat(cmd), function(msg) { can.onimport._init && can.onimport._init(can, msg)
msg._head = can.core.List(msg.append, function(item) { return can.user.trans(can, item, field, html.INPUT) })
can.core.Item(msg._view, function(key, value) { can.core.List(value, function(value) { can.core.List(value, function(input, i) {
if (input.type == html.BUTTON) { input.value = can.user.trans(can, input.value||input.name, field) }
if (input._type == html.TEXT) { input._text = can.user.trans(can, input._text, field, html.VALUE) }
}) }) })
msg._status = can.core.List(can.base.Obj(msg.Option(ice.MSG_STATUS)), function(item) { return item })
msg._action = can.core.List(can.base.Obj(msg.Option(ice.MSG_ACTION)), function(item) {
if (typeof item == code.STRING) { return {type: html.BUTTON, name: item, value: can.user.trans(can, item)} }
return item.value = can.user.trans(can, item.value||item.name), item
}), field.msg = msg, can.page.setData(can)
})
},
onDetail: function(event, can, button, data) { var order = data.order, name = data.name, value = data.value, input = data.input
var field = can.ui.data.list[order||0]
if (input && input.type == html.BUTTON) { var msg = can.request(event, field.msg.Table()[data.index])
if (can.base.isIn(name, mdb.REMOVE, mdb.DELETE)) { msg._method = http.DELETE }
var _input = {}; can.core.List(field.inputs, function(input) { if (input.type != html.BUTTON) { _input[input.name] = input.value } }), can.request(event, _input)
if (field.feature[input.name]) {
can.onAction(event, can, input.name, {order: order, name: input.name})
} else {
can.run(event, [field.id||field.index, ctx.ACTION, input.name], function(msg) {
switch (msg.Option(ice.MSG_PROCESS)) {
case "_location":
can.user.parse(can, msg.Option("_arg"))
}
can.onaction._refresh(event, can, order)
})
} return
}
can.core.List(field.inputs, function(input) {
if (input.name == name) { input.value = value, can.onaction._refresh(event, can, order) }
})
},
})
module.exports = Volcanos._page

View File

@ -3,18 +3,19 @@ const {kit, ice,
lex, yac, ssh, gdb,
tcp, nfs, cli, log,
code, wiki, chat, team, mall,
http, html, icon, svg
http, html,
} = require("../const.js")
const {shy, Volcanos} = require("../proto.js")
const {shy, Volcanos} = require("../proto-wx.js")
module.exports =
Volcanos("misc", {
POST: function(can, msg, cmd, data, cb) { data.sessid = can.conf.sessid, data.appid = data.appid||can.conf.appid
POST: function(can, msg, cmd, data, cb) {
var serve = msg._serve||can.db.serve||can.conf.serve, url = serve+cmd
data.sessid = msg._sessid||can.misc.serveList(can, {serve: can.db.serve}).sessid, data.appid = data.appid||can.conf.appid
can.core.List(msg.option, function(key) { data[key] = data[key]||[msg.Option(key)] }), data.option = data.option||msg.option
var url = (msg._serve||can.db.serve||can.conf.serve)+cmd
if (data && can.base.isIn(msg._method, http.GET, http.DELETE)) { url = can.base.MergeURL(url, data), data = {} }
wx.request({method: msg._method||http.POST, url: url, data: data, success: function(res) {
if (res.statusCode == 401) {
can.user.info = {}, can.misc.localStorage(can, ice.MSG_SESSID, can.conf.sessid = "")
can.misc.serveList(can, {serve: serve, sessid: "", userinfo: {}})
return can.user.login(can, function() { can.misc.POST(can, msg, cmd, data, cb) })
}
if (res.statusCode == 403) { msg.result = [res.data] }
@ -69,4 +70,40 @@ Volcanos("misc", {
}); return can._socket = socket
},
localStorage: function(can, key, value) { value != undefined && wx.setStorageSync(key, value); return wx.getStorageSync(key) },
serveList: function(can, data, current) { var serveList = can.base.Obj(can.misc.localStorage(can, "serveList"), [{serve: can.conf.serve}])
if (data === "") {
can.misc.localStorage(can, "serveList", "")
can.misc.localStorage(can, "serve", "")
can.user.switchTab(can, "home", {})
}
if (!data) { return serveList }
current && can.misc.localStorage(can, web.SERVE, data.serve)
for (var i = 0; i < serveList.length; i++) {
if (serveList[i].serve == data.serve) {
can.base.Copy(serveList[i], data), can.misc.localStorage(can, "serveList", JSON.stringify(serveList))
return serveList[i]
}
}
serveList.push(data), can.misc.localStorage(can, "serveList", JSON.stringify(serveList))
return data
},
table: function(can, msg) {
return msg.Table(function(value) {
if (value.icons) {
if (!can.base.beginWith(value.icons, web.HTTP)) {
if (!can.base.beginWith(value.icons, nfs.PS)) { value.icons = nfs.P + value.icons }
value.icons = can.misc.Resource(can, value.icons, value.space, can.db.serve)
}
}
if (value.icon) {
if (!can.base.beginWith(value.icon, web.HTTP)) {
if (!can.base.beginWith(value.icon, nfs.PS)) { value.icon = nfs.P + value.icon }
value.icon = can.misc.Resource(can, value.icon, value.space, can.db.serve)
}
}
value.time = can.base.trimPrefix(value.time, can.base.Time(null, "%y-"))
value.time = can.core.Split(value.time, ":").slice(0, -1).join(":")
return value
})
}
})

View File

@ -3,9 +3,9 @@ const {kit, ice,
lex, yac, ssh, gdb,
tcp, nfs, cli, log,
code, wiki, chat, team, mall,
http, html, icon, svg
http, html,
} = require("../const.js")
const {shy, Volcanos} = require("../proto.js")
const {shy, Volcanos} = require("../proto-wx.js")
module.exports =
Volcanos("page", {
setData: function(can, list) { can.ui.setData({list: list||can.ui.data.list}) },

Some files were not shown because too many files have changed in this diff Show More